From python-checkins at python.org Tue Oct 1 01:10:14 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 01:10:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi42KTogLSBJc3N1ZSAjMTYw?= =?utf-8?q?40=3A_CVE-2013-1752=3A_nntplib=3A_Limit_maximum_line_lengths_to?= =?utf-8?q?_2048_to?= Message-ID: <3cpfTf0Vvvz7Ll2@mail.python.org> http://hg.python.org/cpython/rev/731abf7834c4 changeset: 85897:731abf7834c4 branch: 2.6 parent: 85895:3f09756916ce user: Barry Warsaw date: Mon Sep 30 18:35:15 2013 -0400 summary: - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to prevent readline() calls from consuming too much memory. Patch by Jyrki Pulliainen. files: Lib/nntplib.py | 11 ++++- Lib/test/test_nntplib.py | 65 ++++++++++++++++++++++++++++ Misc/NEWS | 4 + 3 files changed, 79 insertions(+), 1 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -37,6 +37,13 @@ "error_reply","error_temp","error_perm","error_proto", "error_data",] +# maximal line length when calling readline(). This is to prevent +# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# 512 characters, including CRLF. We have selected 2048 just to be on +# the safe side. +_MAXLINE = 2048 + + # Exceptions raised when an error or invalid response is received class NNTPError(Exception): """Base class for all nntplib exceptions""" @@ -200,7 +207,9 @@ def getline(self): """Internal: return one line from the server, stripping CRLF. Raise EOFError if the connection is closed.""" - line = self.file.readline() + line = self.file.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise NNTPDataError('line too long') if self.debugging > 1: print '*get*', repr(line) if not line: raise EOFError diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_nntplib.py @@ -0,0 +1,65 @@ +import socket +import threading +import nntplib +import time + +from unittest import TestCase +from test import test_support + +HOST = test_support.HOST + + +def server(evt, serv, evil=False): + serv.listen(5) + try: + conn, addr = serv.accept() + except socket.timeout: + pass + else: + if evil: + conn.send("1 I'm too long response" * 3000 + "\n") + else: + conn.send("1 I'm OK response\n") + conn.close() + finally: + serv.close() + evt.set() + + +class BaseServerTest(TestCase): + def setUp(self): + self.evt = threading.Event() + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.settimeout(3) + self.port = test_support.bind_port(self.sock) + threading.Thread( + target=server, + args=(self.evt, self.sock, self.evil)).start() + time.sleep(.1) + + def tearDown(self): + self.evt.wait() + + +class ServerTests(BaseServerTest): + evil = False + + def test_basic_connect(self): + nntp = nntplib.NNTP('localhost', self.port) + nntp.sock.close() + + +class EvilServerTests(BaseServerTest): + evil = True + + def test_too_long_line(self): + self.assertRaises(nntplib.NNTPDataError, + nntplib.NNTP, 'localhost', self.port) + + +def test_main(verbose=None): + test_support.run_unittest(EvilServerTests) + test_support.run_unittest(ServerTests) + +if __name__ == '__main__': + test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -20,6 +20,10 @@ prevent readline() calls from consuming too much memory. Patch by Jyrki Pulliainen. +- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to + prevent readline() calls from consuming too much memory. Patch by Jyrki + Pulliainen. + - Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to limit line length. Patch by Emil Lind. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 01:10:15 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 01:10:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf-8?q?_-_Issue_=2316040=3A_CVE-2013-1752=3A_nntplib=3A_Limit_maximum_?= =?utf-8?q?line_lengths_to_2048_to?= Message-ID: <3cpfTg2YFLz7LlN@mail.python.org> http://hg.python.org/cpython/rev/36680a7c0e22 changeset: 85898:36680a7c0e22 branch: 2.7 parent: 85896:0f5611bca5a2 parent: 85897:731abf7834c4 user: Barry Warsaw date: Mon Sep 30 19:09:29 2013 -0400 summary: - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to prevent readline() calls from consuming too much memory. Patch by Jyrki Pulliainen. files: Lib/nntplib.py | 11 ++++- Lib/test/test_nntplib.py | 65 ++++++++++++++++++++++++++++ Misc/NEWS | 4 + 3 files changed, 79 insertions(+), 1 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -37,6 +37,13 @@ "error_reply","error_temp","error_perm","error_proto", "error_data",] +# maximal line length when calling readline(). This is to prevent +# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# 512 characters, including CRLF. We have selected 2048 just to be on +# the safe side. +_MAXLINE = 2048 + + # Exceptions raised when an error or invalid response is received class NNTPError(Exception): """Base class for all nntplib exceptions""" @@ -200,7 +207,9 @@ def getline(self): """Internal: return one line from the server, stripping CRLF. Raise EOFError if the connection is closed.""" - line = self.file.readline() + line = self.file.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise NNTPDataError('line too long') if self.debugging > 1: print '*get*', repr(line) if not line: raise EOFError diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_nntplib.py @@ -0,0 +1,65 @@ +import socket +import threading +import nntplib +import time + +from unittest import TestCase +from test import test_support + +HOST = test_support.HOST + + +def server(evt, serv, evil=False): + serv.listen(5) + try: + conn, addr = serv.accept() + except socket.timeout: + pass + else: + if evil: + conn.send("1 I'm too long response" * 3000 + "\n") + else: + conn.send("1 I'm OK response\n") + conn.close() + finally: + serv.close() + evt.set() + + +class BaseServerTest(TestCase): + def setUp(self): + self.evt = threading.Event() + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.settimeout(3) + self.port = test_support.bind_port(self.sock) + threading.Thread( + target=server, + args=(self.evt, self.sock, self.evil)).start() + time.sleep(.1) + + def tearDown(self): + self.evt.wait() + + +class ServerTests(BaseServerTest): + evil = False + + def test_basic_connect(self): + nntp = nntplib.NNTP('localhost', self.port) + nntp.sock.close() + + +class EvilServerTests(BaseServerTest): + evil = True + + def test_too_long_line(self): + self.assertRaises(nntplib.NNTPDataError, + nntplib.NNTP, 'localhost', self.port) + + +def test_main(verbose=None): + test_support.run_unittest(EvilServerTests) + test_support.run_unittest(ServerTests) + +if __name__ == '__main__': + test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,10 @@ Library ------- +- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to + prevent readline() calls from consuming too much memory. Patch by Jyrki + Pulliainen. + - Issue #12641: Avoid passing "-mno-cygwin" to the mingw32 compiler, except when necessary. Patch by Oscar Benjamin. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 01:15:28 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 1 Oct 2013 01:15:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Remove_pause/resume=5Fwriting?= =?utf-8?q?=28=29_and_discard=5Foutput=28=29=2E_Mention_asyncio_name=2E?= Message-ID: <3cpfbh6t2Dz7Ljc@mail.python.org> http://hg.python.org/peps/rev/914f0444ef6d changeset: 5157:914f0444ef6d user: Guido van Rossum date: Mon Sep 30 16:15:24 2013 -0700 summary: Remove pause/resume_writing() and discard_output(). Mention asyncio name. Clarify callback serialization. files: pep-3156.txt | 19 +++++++------------ 1 files changed, 7 insertions(+), 12 deletions(-) diff --git a/pep-3156.txt b/pep-3156.txt --- a/pep-3156.txt +++ b/pep-3156.txt @@ -1,5 +1,5 @@ PEP: 3156 -Title: Asynchronous IO Support Rebooted +Title: Asynchronous IO Support Rebooted: the "asyncio" Module Version: $Revision$ Last-Modified: $Date$ Author: Guido van Rossum @@ -21,6 +21,9 @@ implementation is in the works under the code name Tulip. The Tulip repo is linked from the References section at the end. +The proposed standard library module name is ``asyncio``, although the +rest of this PEP has not yet been updated to reflect this. + Introduction ============ @@ -363,7 +366,9 @@ called as soon as possible. Returns a Handle representing the callback, whose ``cancel()`` method can be used to cancel the callback. It guarantees that callbacks are called in the order in - which they were scheduled. + which they were scheduled. Callbacks associated with the same event + loop are strictly serialized -- one callback must exit before the + next one will be called. - ``call_later(delay, callback, *args)``. Arrange for ``callback(*args)`` to be called approximately ``delay`` seconds in @@ -1024,16 +1029,6 @@ - ``resume()``. Restart delivery of data to the protocol via ``data_received()``. -- ``pause_writing()``. Suspend sending data to the network until a - subsequent ``resume_writing()`` call. Between ``pause_writing()`` - and ``resume_writing()`` the transport's ``write()`` method will - just be accumulating data in an internal buffer. - -- ``resume_writing()``. Restart sending data to the network. - -- ``discard_output()``. Discard all data buffered by ``write()`` but - not yet sent to the network. - - ``close()``. Sever the connection with the entity at the other end. Any data buffered by ``write()`` will (eventually) be transferred before the connection is actually closed. The protocol's -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 1 02:46:50 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 02:46:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Regenerate_pyd?= =?utf-8?q?oc=5Ftopics=2Epy?= Message-ID: <3cphd6420lz7Lkr@mail.python.org> http://hg.python.org/cpython/rev/75d143bf325f changeset: 85899:75d143bf325f branch: 2.6 parent: 85897:731abf7834c4 user: Barry Warsaw date: Mon Sep 30 20:31:56 2013 -0400 summary: Regenerate pydoc_topics.py files: Lib/pydoc_topics.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/pydoc_topics.py b/Lib/pydoc_topics.py --- a/Lib/pydoc_topics.py +++ b/Lib/pydoc_topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue Apr 10 10:39:11 2012 +# Autogenerated by Sphinx on Mon Sep 30 20:24:25 2013 topics = {'assert': u'\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names. In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O). The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime. Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n', 'assignment': u'\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" target_list "]"\n | attributeref\n | subscription\n | slicing\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list is recursively defined as\nfollows.\n\n* If the target list is a single target: The object is assigned to\n that target.\n\n* If the target list is a comma-separated list of targets: The object\n must be an iterable with the same number of items as there are\n targets in the target list, and the items are assigned, from left to\n right, to the corresponding targets. (This rule is relaxed as of\n Python 1.5; in earlier versions, the object had to be a tuple.\n Since strings are sequences, an assignment like ``a, b = "xy"`` is\n now legal as long as the string has the right length.)\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a ``global`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n brackets: The object must be an iterable with the same number of\n items as there are targets in the target list, and its items are\n assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, ``TypeError`` is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily ``AttributeError``).\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n ``a.x`` can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target ``a.x`` is\n always set as an instance attribute, creating it if necessary.\n Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n same attribute: if the RHS expression refers to a class attribute,\n the LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n* If the target is a slicing: The primary expression in the reference\n is evaluated. It should yield a mutable sequence object (such as a\n list). The assigned object should be a sequence object of the same\n type. Next, the lower and upper bound expressions are evaluated,\n insofar they are present; defaults are zero and the sequence\'s\n length. The bounds should evaluate to (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the object\n allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe! For instance, the\nfollowing program prints ``[0, 2]``:\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2\n print x\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', 'atom-identifiers': u'\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name in front of the name, with leading underscores removed, and\na single underscore inserted in front of the class name. For example,\nthe identifier ``__spam`` occurring in a class named ``Ham`` will be\ntransformed to ``_Ham__spam``. This transformation is independent of\nthe syntactical context in which the identifier is used. If the\ntransformed name is extremely long (longer than 255 characters),\nimplementation defined truncation may happen. If the class name\nconsists only of underscores, no transformation is done.\n', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 02:46:51 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 02:46:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi42KTogQnVtcCB0byAyLjYu?= =?utf-8?q?9rc1?= Message-ID: <3cphd75vGXz7Lkr@mail.python.org> http://hg.python.org/cpython/rev/091f4fb44948 changeset: 85900:091f4fb44948 branch: 2.6 user: Barry Warsaw date: Mon Sep 30 20:34:29 2013 -0400 summary: Bump to 2.6.9rc1 files: Include/patchlevel.h | 8 ++++---- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 2 +- Misc/RPM/python-2.6.spec | 2 +- README | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -22,12 +22,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 2 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 8 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 9 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "2.6.8+" +#define PY_VERSION "2.6.9rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -22,5 +22,5 @@ # #--start constants-- -__version__ = "2.6.8" +__version__ = "2.6.9rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "2.6.8" +IDLE_VERSION = "2.6.9rc1" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -5,7 +5,7 @@ What's New in Python 2.6.9 rc 1? ================================ -*Release date: XXXX-XX-XX* +*Release date: 2013-09-30* Core and Builtins ----------------- diff --git a/Misc/RPM/python-2.6.spec b/Misc/RPM/python-2.6.spec --- a/Misc/RPM/python-2.6.spec +++ b/Misc/RPM/python-2.6.spec @@ -39,7 +39,7 @@ %define name python #--start constants-- -%define version 2.6.8 +%define version 2.6.9rc1 %define libvers 2.6 #--end constants-- %define release 1pydotorg diff --git a/README b/README --- a/README +++ b/README @@ -1,8 +1,8 @@ -This is Python version 2.6.8 +This is Python version 2.6.9 ============================ Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - 2011, 2012 + 2011, 2012, 2013 Python Software Foundation. All rights reserved. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 02:46:53 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 02:46:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Bump_copyright?= =?utf-8?q?_years=2E?= Message-ID: <3cphd90ZwCz7LlR@mail.python.org> http://hg.python.org/cpython/rev/a0025037f11a changeset: 85901:a0025037f11a branch: 2.6 tag: v2.6.9rc1 user: Barry Warsaw date: Mon Sep 30 20:37:45 2013 -0400 summary: Bump copyright years. files: Doc/README.txt | 2 +- Doc/copyright.rst | 2 +- Doc/license.rst | 2 ++ LICENSE | 1 + PC/python_nt.rc | 2 +- Python/getcopyright.c | 2 +- README | 4 ++-- 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Doc/README.txt b/Doc/README.txt --- a/Doc/README.txt +++ b/Doc/README.txt @@ -127,7 +127,7 @@ as long as you don't change or remove the copyright notice: ---------------------------------------------------------------------- -Copyright (c) 2000-2012 Python Software Foundation. +Copyright (c) 2000-2013 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. diff --git a/Doc/copyright.rst b/Doc/copyright.rst --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Python and this documentation is: -Copyright ?? 2001-2012 Python Software Foundation. All rights reserved. +Copyright ?? 2001-2013 Python Software Foundation. All rights reserved. Copyright ?? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst --- a/Doc/license.rst +++ b/Doc/license.rst @@ -110,6 +110,8 @@ +----------------+--------------+-----------+------------+-----------------+ | 2.6.8 | 2.6.7 | 2012 | PSF | yes | +----------------+--------------+-----------+------------+-----------------+ +| 2.6.9 | 2.6.8 | 2013 | PSF | yes | ++----------------+--------------+-----------+------------+-----------------+ .. note:: diff --git a/LICENSE b/LICENSE --- a/LICENSE +++ b/LICENSE @@ -66,6 +66,7 @@ 2.6.6 2.6.5 2010 PSF yes 2.6.7 2.6.6 2011 PSF yes 2.6.8 2.6.7 2012 PSF yes + 2.6.9 2.6.8 2013 PSF yes Footnotes: diff --git a/PC/python_nt.rc b/PC/python_nt.rc --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -61,7 +61,7 @@ VALUE "FileDescription", "Python Core\0" VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" - VALUE "LegalCopyright", "Copyright ? 2001-2012 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" + VALUE "LegalCopyright", "Copyright ? 2001-2013 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION diff --git a/Python/getcopyright.c b/Python/getcopyright.c --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static char cprt[] = "\ -Copyright (c) 2001-2012 Python Software Foundation.\n\ +Copyright (c) 2001-2013 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README b/README --- a/README +++ b/README @@ -1,5 +1,5 @@ -This is Python version 2.6.9 -============================ +This is Python version 2.6.9rc1 +=============================== Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 02:46:54 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 02:46:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Added_tag_v2?= =?utf-8?q?=2E6=2E9rc1_for_changeset_a0025037f11a?= Message-ID: <3cphdB2s94z7LlT@mail.python.org> http://hg.python.org/cpython/rev/ac15a58d3a4c changeset: 85902:ac15a58d3a4c branch: 2.6 user: Barry Warsaw date: Mon Sep 30 20:37:58 2013 -0400 summary: Added tag v2.6.9rc1 for changeset a0025037f11a files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -140,3 +140,4 @@ caab08cd2b3eb5a6f78479b2513b65d36c754f41 v2.6.8rc1 1d1b7b9fad48bd0dc60dc8a06cca4459ef273127 v2.6.8rc2 c9910fd022fc842e5578e1bf5a30ba55a37239fc v2.6.8 +a0025037f11a73df5a7dd03e5a4027adad4cb94e v2.6.9rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 02:46:55 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 02:46:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf-8?q?_2=2E6=2E9rc1_tag?= Message-ID: <3cphdC5Jlvz7Llv@mail.python.org> http://hg.python.org/cpython/rev/897941e38fe7 changeset: 85903:897941e38fe7 branch: 2.7 parent: 85898:36680a7c0e22 parent: 85902:ac15a58d3a4c user: Barry Warsaw date: Mon Sep 30 20:45:52 2013 -0400 summary: 2.6.9rc1 tag files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -159,3 +159,4 @@ a8d18780bc2bccf16bf580587e1e3c934a98f6a7 v2.7.4rc1 026ee0057e2d3305f90a9da41daf7c3f9eb1e814 v2.7.4 ab05e7dd27889b93f20d97bae86170aabfe45ace v2.7.5 +a0025037f11a73df5a7dd03e5a4027adad4cb94e v2.6.9rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 03:50:53 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 03:50:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_post_release_b?= =?utf-8?q?ump?= Message-ID: <3cpk315SnFz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/663ed8f2846b changeset: 85904:663ed8f2846b branch: 2.6 parent: 85902:ac15a58d3a4c user: Barry Warsaw date: Mon Sep 30 21:49:31 2013 -0400 summary: post release bump files: Include/patchlevel.h | 2 +- Misc/NEWS | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -27,7 +27,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "2.6.9rc1" +#define PY_VERSION "2.6.9rc1+" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,18 @@ Python News +++++++++++ +What's New in Python 2.6.9? +=========================== + +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +Library +------- + + What's New in Python 2.6.9 rc 1? ================================ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 03:50:55 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 03:50:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf-8?q?_null_merge?= Message-ID: <3cpk330DTKz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/94628dc3b05c changeset: 85905:94628dc3b05c branch: 2.7 parent: 85903:897941e38fe7 parent: 85904:663ed8f2846b user: Barry Warsaw date: Mon Sep 30 21:50:21 2013 -0400 summary: null merge files: -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 1 07:03:03 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 01 Oct 2013 07:03:03 +0200 Subject: [Python-checkins] Daily reference leaks (8e180b2067e4): sum=0 Message-ID: results for 8e180b2067e4 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogj7G68B', '-x'] From python-checkins at python.org Tue Oct 1 07:12:58 2013 From: python-checkins at python.org (senthil.kumaran) Date: Tue, 1 Oct 2013 07:12:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Minor_doc_fix_?= =?utf-8?q?in_urlparse=2Erst?= Message-ID: <3cppXB2l88z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/70850d6a16ee changeset: 85906:70850d6a16ee branch: 2.7 user: Senthil Kumaran date: Mon Sep 30 22:10:44 2013 -0700 summary: Minor doc fix in urlparse.rst files: Doc/library/urlparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/urlparse.rst b/Doc/library/urlparse.rst --- a/Doc/library/urlparse.rst +++ b/Doc/library/urlparse.rst @@ -72,7 +72,7 @@ ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') - ParseResult(scheme='', netloc='', path='www.cwi.nl:80/%7Eguido/Python.html', + ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 07:12:59 2013 From: python-checkins at python.org (senthil.kumaran) Date: Tue, 1 Oct 2013 07:12:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Minor_doc_fix_?= =?utf-8?q?in_urllib=2Eparse=2Erst?= Message-ID: <3cppXC4XDPz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/0e204fbb0b08 changeset: 85907:0e204fbb0b08 branch: 3.3 parent: 85893:6b89176f1be5 user: Senthil Kumaran date: Mon Sep 30 22:12:16 2013 -0700 summary: Minor doc fix in urllib.parse.rst files: Doc/library/urllib.parse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -70,7 +70,7 @@ ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') - ParseResult(scheme='', netloc='', path='www.cwi.nl:80/%7Eguido/Python.html', + ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 07:13:00 2013 From: python-checkins at python.org (senthil.kumaran) Date: Tue, 1 Oct 2013 07:13:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_from_3=2E3=2E_Minor_urllib=2Eparse=2Erst_docs_fix?= =?utf-8?q?=2E?= Message-ID: <3cppXD6KBLz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/7ccc64db4abe changeset: 85908:7ccc64db4abe parent: 85894:8e180b2067e4 parent: 85907:0e204fbb0b08 user: Senthil Kumaran date: Mon Sep 30 22:12:51 2013 -0700 summary: merge from 3.3. Minor urllib.parse.rst docs fix. files: Doc/library/urllib.parse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -70,7 +70,7 @@ ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') - ParseResult(scheme='', netloc='', path='www.cwi.nl:80/%7Eguido/Python.html', + ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 10:01:15 2013 From: python-checkins at python.org (raymond.hettinger) Date: Tue, 1 Oct 2013 10:01:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NTk0?= =?utf-8?q?=3A_Fix_the_fast_path_for_collections=2ECounter=28=29=2E?= Message-ID: <3cptGM0nddz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/6aef095fdb30 changeset: 85909:6aef095fdb30 branch: 3.3 parent: 85907:0e204fbb0b08 user: Raymond Hettinger date: Tue Oct 01 00:55:43 2013 -0700 summary: Issue #18594: Fix the fast path for collections.Counter(). The path wasn't being taken due to an over-restrictive type check. files: Include/object.h | 1 + Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 16 +++++++++++++++- Objects/typeobject.c | 5 +---- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -482,6 +482,7 @@ PyObject *, PyObject *); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); #endif diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,9 @@ - Issue #12641: Avoid passing "-mno-cygwin" to the mingw32 compiler, except when necessary. Patch by Oscar Benjamin. +- Issue #18594: The fast path for collections.Counter() was never taken + due to an over-restrictive type check. + - Properly initialize all fields of a SSL object after allocation. - Issue #4366: Fix building extensions on all platforms when --enable-shared diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1689,10 +1689,16 @@ static PyObject * _count_elements(PyObject *self, PyObject *args) { + _Py_IDENTIFIER(__getitem__); + _Py_IDENTIFIER(__setitem__); PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *one = NULL; + PyObject *mapping_getitem; + PyObject *mapping_setitem; + PyObject *dict_getitem; + PyObject *dict_setitem; if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) return NULL; @@ -1707,7 +1713,15 @@ return NULL; } - if (PyDict_CheckExact(mapping)) { + mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); + dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); + mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__); + dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__); + + if (mapping_getitem != NULL && + mapping_getitem == dict_getitem && + mapping_setitem != NULL && + mapping_setitem == dict_setitem) { while (1) { key = PyIter_Next(it); if (key == NULL) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -50,9 +50,6 @@ _Py_IDENTIFIER(__new__); static PyObject * -_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name); - -static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); unsigned int @@ -2589,7 +2586,7 @@ return res; } -static PyObject * +PyObject * _PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name) { PyObject *oname; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 10:01:16 2013 From: python-checkins at python.org (raymond.hettinger) Date: Tue, 1 Oct 2013 10:01:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cptGN2nkTz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/f1b4b518ad9e changeset: 85910:f1b4b518ad9e parent: 85908:7ccc64db4abe parent: 85909:6aef095fdb30 user: Raymond Hettinger date: Tue Oct 01 01:00:59 2013 -0700 summary: merge files: Include/object.h | 1 + Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 16 +++++++++++++++- Objects/typeobject.c | 5 +---- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -484,6 +484,7 @@ PyObject *, PyObject *); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); #endif diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -58,6 +58,9 @@ integer (as in Python 2). Au_read and Au_write now correctly works with file object if start file position is not a zero. +- Issue #18594: The fast path for collections.Counter() was never taken + due to an over-restrictive type check. + - Issue #19053: ZipExtFile.read1() with non-zero argument no more returns empty bytes until end of data. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1763,10 +1763,16 @@ static PyObject * _count_elements(PyObject *self, PyObject *args) { + _Py_IDENTIFIER(__getitem__); + _Py_IDENTIFIER(__setitem__); PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *one = NULL; + PyObject *mapping_getitem; + PyObject *mapping_setitem; + PyObject *dict_getitem; + PyObject *dict_setitem; if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) return NULL; @@ -1781,7 +1787,15 @@ return NULL; } - if (PyDict_CheckExact(mapping)) { + mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); + dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); + mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__); + dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__); + + if (mapping_getitem != NULL && + mapping_getitem == dict_getitem && + mapping_setitem != NULL && + mapping_setitem == dict_setitem) { while (1) { key = PyIter_Next(it); if (key == NULL) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -50,9 +50,6 @@ _Py_IDENTIFIER(__new__); static PyObject * -_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name); - -static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); unsigned int @@ -2620,7 +2617,7 @@ return res; } -static PyObject * +PyObject * _PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name) { PyObject *oname; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 15:13:56 2013 From: python-checkins at python.org (eli.bendersky) Date: Tue, 1 Oct 2013 15:13:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Mention_=27make_touch=27_?= =?utf-8?q?in_the_devguide=2E?= Message-ID: <3cq1C85CPkz7Lk8@mail.python.org> http://hg.python.org/devguide/rev/56ed149e597a changeset: 642:56ed149e597a user: Eli Bendersky date: Tue Oct 01 06:12:45 2013 -0700 summary: Mention 'make touch' in the devguide. Covers issue #19106 and #15964 files: setup.rst | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/setup.rst b/setup.rst --- a/setup.rst +++ b/setup.rst @@ -234,6 +234,35 @@ ``PCBuild\amd64\python_d.exe``. If you are compiling in release mode (which you shouldn't, in general), replace ``python_d.exe`` with ``python.exe``. +.. _build_troubleshooting: + +Troubleshooting the build +------------------------- + +This section lists some of the common problems that may arise during the +compilation of Python, with proposed solutions. + +Avoiding re-creating auto-generated files +''''''''''''''''''''''''''''''''''''''''' + +Under some circumstances you may encounter Python errors in scripts like +``Parser/asdl_c.py`` or ``Python/makeopcodetargets.py`` while running ``make``. +Python auto-generates some of its own code, and a full build from scratch needs +to run the auto-generation scripts. However, this makes the Python build require +an already installed Python interpreter; this can also cause version mismatches +when trying to build an old (2.x) Python with a new (3.x) Python installed, or +vice versa. + +To overcome this problem, auto-generated files are also checked into the +Mercurial repository. So if you don't touch the auto-generation scripts, there's +no real need to auto-generate anything. However, as Mercurial doesn't preserve +timestamps well, a special build target ``touch`` was added. Run:: + + make touch + +Before running the compilation ``make``. This will tweak the timestamps of the +auto-generated files in a way that makes it unnecessary to create them anew and +henceforth the compilation should not require an installed Python interpreter. Editors and Tools ================= -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Tue Oct 1 15:28:19 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 1 Oct 2013 15:28:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2UgIzE5MDky?= =?utf-8?q?=3A_ExitStack_now_reraises_exceptions_from_=5F=5Fexit=5F=5F?= Message-ID: <3cq1Wl0RKGz7LlW@mail.python.org> http://hg.python.org/cpython/rev/423736775f6b changeset: 85911:423736775f6b branch: 3.3 parent: 85909:6aef095fdb30 user: Nick Coghlan date: Tue Oct 01 23:24:56 2013 +1000 summary: Close #19092: ExitStack now reraises exceptions from __exit__ Report and patch by Hrvoje Nik?i? files: Lib/contextlib.py | 18 ++++++++++-- Lib/test/test_contextlib.py | 37 +++++++++++++++++++++++++ Misc/ACKS | 2 +- Misc/NEWS | 4 ++ 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -225,6 +225,8 @@ return self def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements frame_exc = sys.exc_info()[1] @@ -239,17 +241,27 @@ # Callbacks are invoked in LIFO order to match the behaviour of # nested context managers suppressed_exc = False + pending_raise = False while self._exit_callbacks: cb = self._exit_callbacks.pop() try: if cb(*exc_details): suppressed_exc = True + pending_raise = False exc_details = (None, None, None) except: new_exc_details = sys.exc_info() # simulate the stack of exceptions by setting the context _fix_exception_context(new_exc_details[1], exc_details[1]) - if not self._exit_callbacks: - raise + pending_raise = True exc_details = new_exc_details - return suppressed_exc + if pending_raise: + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise + return received_exc and suppressed_exc diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -573,6 +573,43 @@ self.assertIsInstance(inner_exc, ValueError) self.assertIsInstance(inner_exc.__context__, ZeroDivisionError) + def test_exit_exception_non_suppressing(self): + # http://bugs.python.org/issue19092 + def raise_exc(exc): + raise exc + + def suppress_exc(*exc_details): + return True + + try: + with ExitStack() as stack: + stack.callback(lambda: None) + stack.callback(raise_exc, IndexError) + except Exception as exc: + self.assertIsInstance(exc, IndexError) + else: + self.fail("Expected IndexError, but no exception was raised") + + try: + with ExitStack() as stack: + stack.callback(raise_exc, KeyError) + stack.push(suppress_exc) + stack.callback(raise_exc, IndexError) + except Exception as exc: + self.assertIsInstance(exc, KeyError) + else: + self.fail("Expected KeyError, but no exception was raised") + + def test_body_exception_suppress(self): + def suppress_exc(*exc_details): + return True + try: + with ExitStack() as stack: + stack.push(suppress_exc) + 1/0 + except IndexError as exc: + self.fail("Expected no exception, got IndexError") + def test_exit_exception_chaining_suppress(self): with ExitStack() as stack: stack.push(lambda *exc: True) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -882,7 +882,7 @@ Jonathan Niehof Gustavo Niemeyer Oscar Nierstrasz -Hrvoje Niksic +Hrvoje Nik?i? Gregory Nofi Jesse Noller Bill Noon diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,10 @@ Library ------- +- Issue #19092: contextlib.ExitStack now correctly reraises exceptions + from the __exit__ callbacks of inner context managers (Patch by Hrvoje + Nik?i?) + - Issue #12641: Avoid passing "-mno-cygwin" to the mingw32 compiler, except when necessary. Patch by Oscar Benjamin. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 15:28:20 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 1 Oct 2013 15:28:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Merge_=2319092_from_3=2E3?= Message-ID: <3cq1Wm3XXxz7Lm9@mail.python.org> http://hg.python.org/cpython/rev/451f5f6151f5 changeset: 85912:451f5f6151f5 parent: 85910:f1b4b518ad9e parent: 85911:423736775f6b user: Nick Coghlan date: Tue Oct 01 23:28:00 2013 +1000 summary: Merge #19092 from 3.3 files: Lib/contextlib.py | 18 ++++++++++-- Lib/test/test_contextlib.py | 37 +++++++++++++++++++++++++ Misc/ACKS | 2 +- Misc/NEWS | 4 ++ 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -237,6 +237,8 @@ return self def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements frame_exc = sys.exc_info()[1] @@ -251,17 +253,27 @@ # Callbacks are invoked in LIFO order to match the behaviour of # nested context managers suppressed_exc = False + pending_raise = False while self._exit_callbacks: cb = self._exit_callbacks.pop() try: if cb(*exc_details): suppressed_exc = True + pending_raise = False exc_details = (None, None, None) except: new_exc_details = sys.exc_info() # simulate the stack of exceptions by setting the context _fix_exception_context(new_exc_details[1], exc_details[1]) - if not self._exit_callbacks: - raise + pending_raise = True exc_details = new_exc_details - return suppressed_exc + if pending_raise: + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise + return received_exc and suppressed_exc diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -573,6 +573,43 @@ self.assertIsInstance(inner_exc, ValueError) self.assertIsInstance(inner_exc.__context__, ZeroDivisionError) + def test_exit_exception_non_suppressing(self): + # http://bugs.python.org/issue19092 + def raise_exc(exc): + raise exc + + def suppress_exc(*exc_details): + return True + + try: + with ExitStack() as stack: + stack.callback(lambda: None) + stack.callback(raise_exc, IndexError) + except Exception as exc: + self.assertIsInstance(exc, IndexError) + else: + self.fail("Expected IndexError, but no exception was raised") + + try: + with ExitStack() as stack: + stack.callback(raise_exc, KeyError) + stack.push(suppress_exc) + stack.callback(raise_exc, IndexError) + except Exception as exc: + self.assertIsInstance(exc, KeyError) + else: + self.fail("Expected KeyError, but no exception was raised") + + def test_body_exception_suppress(self): + def suppress_exc(*exc_details): + return True + try: + with ExitStack() as stack: + stack.push(suppress_exc) + 1/0 + except IndexError as exc: + self.fail("Expected no exception, got IndexError") + def test_exit_exception_chaining_suppress(self): with ExitStack() as stack: stack.push(lambda *exc: True) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -912,7 +912,7 @@ Jonathan Niehof Gustavo Niemeyer Oscar Nierstrasz -Hrvoje Niksic +Hrvoje Nik?i? Gregory Nofi Jesse Noller Bill Noon diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,10 @@ Library ------- +- Issue #19092: contextlib.ExitStack now correctly reraises exceptions + from the __exit__ callbacks of inner context managers (Patch by Hrvoje + Nik?i?) + - Issue #12641: Avoid passing "-mno-cygwin" to the mingw32 compiler, except when necessary. Patch by Oscar Benjamin. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 16:02:26 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 1 Oct 2013 16:02:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2310042=3A_functool?= =?utf-8?q?s=2Etotal=5Fordering_now_handles_NotImplemented?= Message-ID: <3cq2H62npvz7LmW@mail.python.org> http://hg.python.org/cpython/rev/ad9f207645ab changeset: 85913:ad9f207645ab user: Nick Coghlan date: Wed Oct 02 00:02:03 2013 +1000 summary: Close #10042: functools.total_ordering now handles NotImplemented (Patch by Katie Miller) files: Doc/library/functools.rst | 19 ++++ Lib/functools.py | 94 ++++++++++++++++++-- Lib/test/test_functools.py | 108 +++++++++++++++++++++++- Misc/ACKS | 1 + Misc/NEWS | 4 + 5 files changed, 207 insertions(+), 19 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -134,15 +134,34 @@ @total_ordering class Student: + def _is_valid_operand(self, other): + return (hasattr(other, "lastname") and + hasattr(other, "firstname")) def __eq__(self, other): + if not self._is_valid_operand(other): + return NotImplemented return ((self.lastname.lower(), self.firstname.lower()) == (other.lastname.lower(), other.firstname.lower())) def __lt__(self, other): + if not self._is_valid_operand(other): + return NotImplemented return ((self.lastname.lower(), self.firstname.lower()) < (other.lastname.lower(), other.firstname.lower())) + .. note:: + + While this decorator makes it easy to create well behaved totally + ordered types, it *does* come at the cost of slower execution and + more complex stack traces for the derived comparison methods. If + performance benchmarking indicates this is a bottleneck for a given + application, implementing all six rich comparison methods instead is + likely to provide an easy speed boost. + .. versionadded:: 3.2 + .. versionchanged:: 3.4 + Returning NotImplemented from the underlying comparison function for + unrecognised types is now supported. .. function:: partial(func, *args, **keywords) diff --git a/Lib/functools.py b/Lib/functools.py --- a/Lib/functools.py +++ b/Lib/functools.py @@ -89,21 +89,91 @@ ### total_ordering class decorator ################################################################################ +# The correct way to indicate that a comparison operation doesn't +# recognise the other type is to return NotImplemented and let the +# interpreter handle raising TypeError if both operands return +# NotImplemented from their respective comparison methods +# +# This makes the implementation of total_ordering more complicated, since +# we need to be careful not to trigger infinite recursion when two +# different types that both use this decorator encounter each other. +# +# For example, if a type implements __lt__, it's natural to define +# __gt__ as something like: +# +# lambda self, other: not self < other and not self == other +# +# However, using the operator syntax like that ends up invoking the full +# type checking machinery again and means we can end up bouncing back and +# forth between the two operands until we run out of stack space. +# +# The solution is to define helper functions that invoke the appropriate +# magic methods directly, ensuring we only try each operand once, and +# return NotImplemented immediately if it is returned from the +# underlying user provided method. Using this scheme, the __gt__ derived +# from a user provided __lt__ becomes: +# +# lambda self, other: _not_op_and_not_eq(self.__lt__, self, other)) + +def _not_op(op, other): + # "not a < b" handles "a >= b" + # "not a <= b" handles "a > b" + # "not a >= b" handles "a < b" + # "not a > b" handles "a <= b" + op_result = op(other) + if op_result is NotImplemented: + return NotImplemented + return not op_result + +def _op_or_eq(op, self, other): + # "a < b or a == b" handles "a <= b" + # "a > b or a == b" handles "a >= b" + op_result = op(other) + if op_result is NotImplemented: + return NotImplemented + return op_result or self == other + +def _not_op_and_not_eq(op, self, other): + # "not (a < b or a == b)" handles "a > b" + # "not a < b and a != b" is equivalent + # "not (a > b or a == b)" handles "a < b" + # "not a > b and a != b" is equivalent + op_result = op(other) + if op_result is NotImplemented: + return NotImplemented + return not op_result and self != other + +def _not_op_or_eq(op, self, other): + # "not a <= b or a == b" handles "a >= b" + # "not a >= b or a == b" handles "a <= b" + op_result = op(other) + if op_result is NotImplemented: + return NotImplemented + return not op_result or self == other + +def _op_and_not_eq(op, self, other): + # "a <= b and not a == b" handles "a < b" + # "a >= b and not a == b" handles "a > b" + op_result = op(other) + if op_result is NotImplemented: + return NotImplemented + return op_result and self != other + def total_ordering(cls): """Class decorator that fills in missing ordering methods""" convert = { - '__lt__': [('__gt__', lambda self, other: not (self < other or self == other)), - ('__le__', lambda self, other: self < other or self == other), - ('__ge__', lambda self, other: not self < other)], - '__le__': [('__ge__', lambda self, other: not self <= other or self == other), - ('__lt__', lambda self, other: self <= other and not self == other), - ('__gt__', lambda self, other: not self <= other)], - '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)), - ('__ge__', lambda self, other: self > other or self == other), - ('__le__', lambda self, other: not self > other)], - '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other), - ('__gt__', lambda self, other: self >= other and not self == other), - ('__lt__', lambda self, other: not self >= other)] + '__lt__': [('__gt__', lambda self, other: _not_op_and_not_eq(self.__lt__, self, other)), + ('__le__', lambda self, other: _op_or_eq(self.__lt__, self, other)), + ('__ge__', lambda self, other: _not_op(self.__lt__, other))], + '__le__': [('__ge__', lambda self, other: _not_op_or_eq(self.__le__, self, other)), + ('__lt__', lambda self, other: _op_and_not_eq(self.__le__, self, other)), + ('__gt__', lambda self, other: _not_op(self.__le__, other))], + '__gt__': [('__lt__', lambda self, other: _not_op_and_not_eq(self.__gt__, self, other)), + ('__ge__', lambda self, other: _op_or_eq(self.__gt__, self, other)), + ('__le__', lambda self, other: _not_op(self.__gt__, other))], + '__ge__': [('__le__', lambda self, other: _not_op_or_eq(self.__ge__, self, other)), + ('__gt__', lambda self, other: _op_and_not_eq(self.__ge__, self, other)), + ('__lt__', lambda self, other: _not_op(self.__ge__, other))] } # Find user-defined comparisons (not those inherited from object). roots = [op for op in convert if getattr(cls, op, None) is not getattr(object, op, None)] diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -584,6 +584,7 @@ self.assertTrue(A(2) >= A(1)) self.assertTrue(A(2) <= A(2)) self.assertTrue(A(2) >= A(2)) + self.assertFalse(A(1) > A(2)) def test_total_ordering_le(self): @functools.total_ordering @@ -600,6 +601,7 @@ self.assertTrue(A(2) >= A(1)) self.assertTrue(A(2) <= A(2)) self.assertTrue(A(2) >= A(2)) + self.assertFalse(A(1) >= A(2)) def test_total_ordering_gt(self): @functools.total_ordering @@ -616,6 +618,7 @@ self.assertTrue(A(2) >= A(1)) self.assertTrue(A(2) <= A(2)) self.assertTrue(A(2) >= A(2)) + self.assertFalse(A(2) < A(1)) def test_total_ordering_ge(self): @functools.total_ordering @@ -632,6 +635,7 @@ self.assertTrue(A(2) >= A(1)) self.assertTrue(A(2) <= A(2)) self.assertTrue(A(2) >= A(2)) + self.assertFalse(A(2) <= A(1)) def test_total_ordering_no_overwrite(self): # new methods should not overwrite existing @@ -651,22 +655,112 @@ class A: pass - def test_bug_10042(self): + def test_type_error_when_not_implemented(self): + # bug 10042; ensure stack overflow does not occur + # when decorated types return NotImplemented @functools.total_ordering - class TestTO: + class ImplementsLessThan: def __init__(self, value): self.value = value def __eq__(self, other): - if isinstance(other, TestTO): + if isinstance(other, ImplementsLessThan): return self.value == other.value return False def __lt__(self, other): - if isinstance(other, TestTO): + if isinstance(other, ImplementsLessThan): return self.value < other.value - raise TypeError - with self.assertRaises(TypeError): - TestTO(8) <= () + return NotImplemented + @functools.total_ordering + class ImplementsGreaterThan: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsGreaterThan): + return self.value == other.value + return False + def __gt__(self, other): + if isinstance(other, ImplementsGreaterThan): + return self.value > other.value + return NotImplemented + + @functools.total_ordering + class ImplementsLessThanEqualTo: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsLessThanEqualTo): + return self.value == other.value + return False + def __le__(self, other): + if isinstance(other, ImplementsLessThanEqualTo): + return self.value <= other.value + return NotImplemented + + @functools.total_ordering + class ImplementsGreaterThanEqualTo: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsGreaterThanEqualTo): + return self.value == other.value + return False + def __ge__(self, other): + if isinstance(other, ImplementsGreaterThanEqualTo): + return self.value >= other.value + return NotImplemented + + @functools.total_ordering + class ComparatorNotImplemented: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ComparatorNotImplemented): + return self.value == other.value + return False + def __lt__(self, other): + return NotImplemented + + with self.subTest("LT < 1"), self.assertRaises(TypeError): + ImplementsLessThan(-1) < 1 + + with self.subTest("LT < LE"), self.assertRaises(TypeError): + ImplementsLessThan(0) < ImplementsLessThanEqualTo(0) + + with self.subTest("LT < GT"), self.assertRaises(TypeError): + ImplementsLessThan(1) < ImplementsGreaterThan(1) + + with self.subTest("LE <= LT"), self.assertRaises(TypeError): + ImplementsLessThanEqualTo(2) <= ImplementsLessThan(2) + + with self.subTest("LE <= GE"), self.assertRaises(TypeError): + ImplementsLessThanEqualTo(3) <= ImplementsGreaterThanEqualTo(3) + + with self.subTest("GT > GE"), self.assertRaises(TypeError): + ImplementsGreaterThan(4) > ImplementsGreaterThanEqualTo(4) + + with self.subTest("GT > LT"), self.assertRaises(TypeError): + ImplementsGreaterThan(5) > ImplementsLessThan(5) + + with self.subTest("GE >= GT"), self.assertRaises(TypeError): + ImplementsGreaterThanEqualTo(6) >= ImplementsGreaterThan(6) + + with self.subTest("GE >= LE"), self.assertRaises(TypeError): + ImplementsGreaterThanEqualTo(7) >= ImplementsLessThanEqualTo(7) + + with self.subTest("GE when equal"): + a = ComparatorNotImplemented(8) + b = ComparatorNotImplemented(8) + self.assertEqual(a, b) + with self.assertRaises(TypeError): + a >= b + + with self.subTest("LE when equal"): + a = ComparatorNotImplemented(9) + b = ComparatorNotImplemented(9) + self.assertEqual(a, b) + with self.assertRaises(TypeError): + a <= b class TestLRU(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -862,6 +862,7 @@ Damien Miller Jason V. Miller Jay T. Miller +Katie Miller Roman Milner Julien Miotte Andrii V. Mishkovskyi diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,10 @@ Library ------- +- Issue #10042: functools.total_ordering now correctly handles + NotImplemented being returned by the underlying comparison function (Patch + by Katie Miller) + - Issue #19092: contextlib.ExitStack now correctly reraises exceptions from the __exit__ callbacks of inner context managers (Patch by Hrvoje Nik?i?) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 17:37:40 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 1 Oct 2013 17:37:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Clarify_motivation_for_serial?= =?utf-8?q?izing_callbacks=2E?= Message-ID: <3cq4P01Sb7z7LlF@mail.python.org> http://hg.python.org/peps/rev/d73d5861333b changeset: 5158:d73d5861333b user: Guido van Rossum date: Tue Oct 01 08:37:33 2013 -0700 summary: Clarify motivation for serializing callbacks. files: pep-3156.txt | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pep-3156.txt b/pep-3156.txt --- a/pep-3156.txt +++ b/pep-3156.txt @@ -362,13 +362,17 @@ Basic Callbacks ''''''''''''''' +Callbacks associated with the same event loop are strictly serialized: +one callback must finish before the next one will be called. This is +an important guarantee: when two or more callbacks use or modify +shared state, each callback is guaranteed that while is running, the +shared state isn't changed by another callback. + - ``call_soon(callback, *args)``. This schedules a callback to be called as soon as possible. Returns a Handle representing the callback, whose ``cancel()`` method can be used to cancel the callback. It guarantees that callbacks are called in the order in - which they were scheduled. Callbacks associated with the same event - loop are strictly serialized -- one callback must exit before the - next one will be called. + which they were scheduled. - ``call_later(delay, callback, *args)``. Arrange for ``callback(*args)`` to be called approximately ``delay`` seconds in @@ -842,12 +846,14 @@ becomes done (or is cancelled). If the Future is already done (or cancelled), schedules the callback to using ``call_soon()``. Difference with PEP 3148: The callback is never called immediately, - and always in the context of the caller. (Typically, a context is a - thread.) You can think of this as calling the callback through + and always in the context of the caller -- typically this is a + thread. You can think of this as calling the callback through ``call_soon()``. Note that in order to match PEP 3148, the callback (unlike all other callbacks defined in this PEP, and ignoring the convention from the section "Callback Style" below) is always called - with a single argument, the Future object. + with a single argument, the Future object. (The motivation for + strictly serializing callbacks scheduled with ``call_soon()`` + applies here too.) - ``remove_done_callback(fn)``. Remove the argument from the list of callbacks. This method is not defined by PEP 3148. The argument -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 1 17:39:34 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 17:39:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Typo_caught_by?= =?utf-8?q?_=3A_Arfrever_Frehtes_Taifersar_Arahesis=2E?= Message-ID: <3cq4RB1BrWzPsJ@mail.python.org> http://hg.python.org/cpython/rev/6d7ae764b4f2 changeset: 85914:6d7ae764b4f2 branch: 2.6 parent: 85904:663ed8f2846b user: Barry Warsaw date: Tue Oct 01 11:38:38 2013 -0400 summary: Typo caught by : Arfrever Frehtes Taifersar Arahesis. files: Lib/nntplib.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -38,7 +38,7 @@ "error_data",] # maximal line length when calling readline(). This is to prevent -# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# reading arbitrary length lines. RFC 3977 limits NNTP line length to # 512 characters, including CRLF. We have selected 2048 just to be on # the safe side. _MAXLINE = 2048 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 1 17:39:35 2013 From: python-checkins at python.org (barry.warsaw) Date: Tue, 1 Oct 2013 17:39:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf-8?q?_2=2E6_merge?= Message-ID: <3cq4RC338cz7Ll2@mail.python.org> http://hg.python.org/cpython/rev/32de3923bb94 changeset: 85915:32de3923bb94 branch: 2.7 parent: 85906:70850d6a16ee parent: 85914:6d7ae764b4f2 user: Barry Warsaw date: Tue Oct 01 11:39:08 2013 -0400 summary: 2.6 merge files: Lib/nntplib.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -38,7 +38,7 @@ "error_data",] # maximal line length when calling readline(). This is to prevent -# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# reading arbitrary length lines. RFC 3977 limits NNTP line length to # 512 characters, including CRLF. We have selected 2048 just to be on # the safe side. _MAXLINE = 2048 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 06:11:08 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 2 Oct 2013 06:11:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Minor_edits_in_?= =?utf-8?q?response_to_feedback=2E?= Message-ID: <3cqP6N1M2wz7LmQ@mail.python.org> http://hg.python.org/peps/rev/39b84a006067 changeset: 5159:39b84a006067 user: Eric Snow date: Tue Oct 01 22:07:46 2013 -0600 summary: [PEP 451] Minor edits in response to feedback. Also removed spec_from_module(), which isn't very useful outside the import system. files: pep-0451.txt | 43 ++++++++++++++------------------------- 1 files changed, 16 insertions(+), 27 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -9,7 +9,7 @@ Content-Type: text/x-rst Created: 8-Aug-2013 Python-Version: 3.4 -Post-History: 8-Aug-2013, 28-Aug-2013, 18-Sep-2013 +Post-History: 8-Aug-2013, 28-Aug-2013, 18-Sep-2013, 24-Sep-2013 Resolution: @@ -58,7 +58,7 @@ module. Right now loaders (via load_module()) are responsible for certain -boilerplate import-related operations. These are: +boilerplate, import-related operations. These are: 1. perform some (module-related) validation; 2. create the module object; @@ -76,7 +76,7 @@ This is a new term and concept. The idea of it exists subtly in the import system already, but this proposal makes the concept explicit. -"origin" is the import context means the system (or resource within a +"origin" in an import context means the system (or resource within a system) from which a module originates. For the purposes of this proposal, "origin" is also a string which identifies such a resource or system. "origin" is applicable to all modules. @@ -133,7 +133,8 @@ ``__cache__`` attribute of modules and the cache_from_source() function in importlib.util. Loaders are responsible for putting modules into the cache (and loading out of the cache). Currently the cache is only used -for compiled source modules. However, this proposal explicitly allows +for compiled source modules. However, loaders may take advantage of +the module cache for other kinds of modules. package ------- @@ -141,7 +142,7 @@ The concept does not change, nor does the term. However, the distinction between modules and packages is mostly superficial. Packages *are* modules. They simply have a ``__path__`` attribute and -import may add attributes bound to submodules. The typical perceived +import may add attributes bound to submodules. The typically perceived difference is a source of confusion. This proposal explicitly de-emphasizes the distinction between packages and modules where it makes sense to do so. @@ -273,12 +274,6 @@ * from_loader(name, loader, \*, origin=None, is_package=None) - build a spec with missing information filled in by using loader APIs. -This factory function is useful for some backward-compatibility -situations: - -* spec_from_module(module, loader=None) - build a spec based on the - import-related attributes of an existing module. - Other API Additions ------------------- @@ -332,10 +327,12 @@ * The import system implementation in importlib will be changed to make use of ModuleSpec. * importlib.reload() will make use of ModuleSpec. -* Import-related module attributes (other than ``__spec__``) will no - longer be used directly by the import system. +* A module's import-related attributes (other than ``__spec__``) will no + longer be used directly by the import system during that module's + import. However, this does not impact use of those attributes + (e.g. ``__path__``) when loading other modules (e.g. submodules). * Import-related attributes should no longer be added to modules - directly. + directly, except by the import system. * The module type's ``__repr__()`` will be a thin wrapper around a pure Python implementation which will leverage ModuleSpec. * The spec for the ``__main__`` module will reflect the appropriate @@ -459,8 +456,11 @@ sys.modues[spec.name] = module try: spec.loader.exec_module(module) - except Exception: - del sys.modules[spec.name] + except BaseException: + try: + del sys.modules[spec.name] + except KeyError: + pass raise return sys.modules[spec.name] @@ -599,17 +599,6 @@ Omitted Attributes and Methods ------------------------------ -The following ModuleSpec methods are not part of the public API since -it is easy to use them incorrectly and only the import system really -needs them (i.e. they would be an attractive nuisance). - -* _create() - provide a new module to use for loading. -* _exec(module) - execute the spec into a module namespace. -* _load() - prepare a module and execute it in a protected way. -* _reload(module) - re-execute a module in a protected way. - -Here are other omissions: - There is no "PathModuleSpec" subclass of ModuleSpec that separates out has_location, cached, and submodule_search_locations. While that might make the separation cleaner, module objects don't have that distinction. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 2 06:38:49 2013 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 2 Oct 2013 06:38:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NTk0?= =?utf-8?q?=3A__Fix_the_fallback_path_in_collections=2ECounter=28=29=2E?= Message-ID: <3cqPkK1LZfz7Lkf@mail.python.org> http://hg.python.org/cpython/rev/1ee6f8a96fb9 changeset: 85916:1ee6f8a96fb9 branch: 3.3 parent: 85911:423736775f6b user: Raymond Hettinger date: Tue Oct 01 21:36:09 2013 -0700 summary: Issue #18594: Fix the fallback path in collections.Counter(). files: Misc/NEWS | 3 +- Modules/_collectionsmodule.c | 41 +++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -79,7 +79,8 @@ when necessary. Patch by Oscar Benjamin. - Issue #18594: The fast path for collections.Counter() was never taken - due to an over-restrictive type check. + due to an over-restrictive type check. And the fallback path did + not implement the same algorithm as the pure python code. - Properly initialize all fields of a SSL object after allocation. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1694,7 +1694,9 @@ PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; + PyObject *zero = NULL; PyObject *one = NULL; + PyObject *mapping_get = NULL; PyObject *mapping_getitem; PyObject *mapping_setitem; PyObject *dict_getitem; @@ -1708,10 +1710,8 @@ return NULL; one = PyLong_FromLong(1); - if (one == NULL) { - Py_DECREF(it); - return NULL; - } + if (one == NULL) + goto done; mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); @@ -1741,23 +1741,25 @@ Py_DECREF(key); } } else { + mapping_get = PyObject_GetAttrString(mapping, "get"); + if (mapping_get == NULL) + goto done; + + zero = PyLong_FromLong(0); + if (zero == NULL) + goto done; + while (1) { key = PyIter_Next(it); if (key == NULL) break; - oldval = PyObject_GetItem(mapping, key); - if (oldval == NULL) { - if (!PyErr_Occurred() || !PyErr_ExceptionMatches(PyExc_KeyError)) - break; - PyErr_Clear(); - Py_INCREF(one); - newval = one; - } else { - newval = PyNumber_Add(oldval, one); - Py_DECREF(oldval); - if (newval == NULL) - break; - } + oldval = PyObject_CallFunctionObjArgs(mapping_get, key, zero, NULL); + if (oldval == NULL) + break; + newval = PyNumber_Add(oldval, one); + Py_DECREF(oldval); + if (newval == NULL) + break; if (PyObject_SetItem(mapping, key, newval) == -1) break; Py_CLEAR(newval); @@ -1765,10 +1767,13 @@ } } +done: Py_DECREF(it); Py_XDECREF(key); Py_XDECREF(newval); - Py_DECREF(one); + Py_XDECREF(mapping_get); + Py_XDECREF(zero); + Py_XDECREF(one); if (PyErr_Occurred()) return NULL; Py_RETURN_NONE; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 06:38:50 2013 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 2 Oct 2013 06:38:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cqPkL37w9z7LlW@mail.python.org> http://hg.python.org/cpython/rev/6cbc6d9ca4ce changeset: 85917:6cbc6d9ca4ce parent: 85913:ad9f207645ab parent: 85916:1ee6f8a96fb9 user: Raymond Hettinger date: Tue Oct 01 21:38:37 2013 -0700 summary: merge files: Modules/_collectionsmodule.c | 41 +++++++++++++---------- 1 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1768,7 +1768,9 @@ PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; + PyObject *zero = NULL; PyObject *one = NULL; + PyObject *mapping_get = NULL; PyObject *mapping_getitem; PyObject *mapping_setitem; PyObject *dict_getitem; @@ -1782,10 +1784,8 @@ return NULL; one = PyLong_FromLong(1); - if (one == NULL) { - Py_DECREF(it); - return NULL; - } + if (one == NULL) + goto done; mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); @@ -1815,23 +1815,25 @@ Py_DECREF(key); } } else { + mapping_get = PyObject_GetAttrString(mapping, "get"); + if (mapping_get == NULL) + goto done; + + zero = PyLong_FromLong(0); + if (zero == NULL) + goto done; + while (1) { key = PyIter_Next(it); if (key == NULL) break; - oldval = PyObject_GetItem(mapping, key); - if (oldval == NULL) { - if (!PyErr_Occurred() || !PyErr_ExceptionMatches(PyExc_KeyError)) - break; - PyErr_Clear(); - Py_INCREF(one); - newval = one; - } else { - newval = PyNumber_Add(oldval, one); - Py_DECREF(oldval); - if (newval == NULL) - break; - } + oldval = PyObject_CallFunctionObjArgs(mapping_get, key, zero, NULL); + if (oldval == NULL) + break; + newval = PyNumber_Add(oldval, one); + Py_DECREF(oldval); + if (newval == NULL) + break; if (PyObject_SetItem(mapping, key, newval) == -1) break; Py_CLEAR(newval); @@ -1839,10 +1841,13 @@ } } +done: Py_DECREF(it); Py_XDECREF(key); Py_XDECREF(newval); - Py_DECREF(one); + Py_XDECREF(mapping_get); + Py_XDECREF(zero); + Py_XDECREF(one); if (PyErr_Occurred()) return NULL; Py_RETURN_NONE; -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 2 07:06:06 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 02 Oct 2013 07:06:06 +0200 Subject: [Python-checkins] Daily reference leaks (ad9f207645ab): sum=4 Message-ID: results for ad9f207645ab on branch "default" -------------------------------------------- test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogmlSscU', '-x'] From python-checkins at python.org Wed Oct 2 10:45:48 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 10:45:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTM3?= =?utf-8?q?=3A_The_pprint_module_now_correctly_formats_empty_set_and_froze?= =?utf-8?q?nset?= Message-ID: <3cqWCJ5rKCz7Lnc@mail.python.org> http://hg.python.org/cpython/rev/fcd889046ee1 changeset: 85918:fcd889046ee1 branch: 2.7 parent: 85915:32de3923bb94 user: Serhiy Storchaka date: Wed Oct 02 11:40:26 2013 +0300 summary: Issue #19137: The pprint module now correctly formats empty set and frozenset and instances of set and frozenset subclasses. files: Lib/pprint.py | 27 ++---- Lib/test/test_pprint.py | 104 +++++++++++++++++++++------ Misc/NEWS | 3 + 3 files changed, 93 insertions(+), 41 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -185,25 +185,18 @@ if issubclass(typ, list): write('[') endchar = ']' - elif issubclass(typ, set): - if not length: - write('set()') - return - write('set([') - endchar = '])' - object = _sorted(object) - indent += 4 - elif issubclass(typ, frozenset): - if not length: - write('frozenset()') - return - write('frozenset([') - endchar = '])' - object = _sorted(object) - indent += 10 - else: + elif issubclass(typ, tuple): write('(') endchar = ')' + else: + if not length: + write(rep) + return + write(typ.__name__) + write('([') + endchar = '])' + indent += len(typ.__name__) + 1 + object = _sorted(object) if self._indent_per_level > 1 and sepLines: write((self._indent_per_level - 1) * ' ') if length: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -24,6 +24,20 @@ def __repr__(self): return tuple.__repr__(self) +class set2(set): + pass + +class set3(set): + def __repr__(self): + return set.__repr__(self) + +class frozenset2(frozenset): + pass + +class frozenset3(frozenset): + def __repr__(self): + return frozenset.__repr__(self) + class dict2(dict): pass @@ -114,22 +128,24 @@ for simple in (0, 0L, 0+0j, 0.0, "", uni(""), (), tuple2(), tuple3(), [], list2(), list3(), + set(), set2(), set3(), + frozenset(), frozenset2(), frozenset3(), {}, dict2(), dict3(), self.assertTrue, pprint, -6, -6L, -6-6j, -1.5, "x", uni("x"), (3,), [3], {3: 6}, (1,2), [3,4], {5: 6}, tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), [3,4], list2([3,4]), list3([3,4]), list3(range(100)), + set({7}), set2({7}), set3({7}), + frozenset({8}), frozenset2({8}), frozenset3({8}), dict2({5: 6}), dict3({5: 6}), range(10, -11, -1) ): native = repr(simple) - for function in "pformat", "saferepr": - f = getattr(pprint, function) - got = f(simple) - self.assertEqual(native, got, - "expected %s got %s from pprint.%s" % - (native, got, function)) + self.assertEqual(pprint.pformat(simple), native) + self.assertEqual(pprint.pformat(simple, width=1, indent=0) + .replace('\n', ' '), native) + self.assertEqual(pprint.saferepr(simple), native) def test_basic_line_wrap(self): # verify basic line-wrapping operation @@ -205,19 +221,59 @@ self.assertEqual(DottedPrettyPrinter().pformat(o), exp) def test_set_reprs(self): - self.assertEqual(pprint.pformat(set()), 'set()') + self.assertEqual(pprint.pformat(set()), 'set([])') self.assertEqual(pprint.pformat(set(range(3))), 'set([0, 1, 2])') - self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') - self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset([0, 1, 2])') + self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\ +set([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\ +set2([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(set3(range(7)), width=20), + 'set3([0, 1, 2, 3, 4, 5, 6])') + + self.assertEqual(pprint.pformat(frozenset()), 'frozenset([])') + self.assertEqual(pprint.pformat(frozenset(range(3))), + 'frozenset([0, 1, 2])') + self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\ +frozenset([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\ +frozenset2([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(frozenset3(range(7)), width=20), + 'frozenset3([0, 1, 2, 3, 4, 5, 6])') + + def test_set_of_sets_reprs(self): cube_repr_tgt = """\ {frozenset([]): frozenset([frozenset([2]), frozenset([0]), frozenset([1])]), - frozenset([0]): frozenset([frozenset(), + frozenset([0]): frozenset([frozenset([]), frozenset([0, 2]), frozenset([0, 1])]), - frozenset([1]): frozenset([frozenset(), + frozenset([1]): frozenset([frozenset([]), frozenset([1, 2]), frozenset([0, 1])]), - frozenset([2]): frozenset([frozenset(), + frozenset([2]): frozenset([frozenset([]), frozenset([1, 2]), frozenset([0, 2])]), frozenset([1, 2]): frozenset([frozenset([2]), @@ -243,7 +299,7 @@ frozenset([frozenset([0]), frozenset([0, 1])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([2]), frozenset([0, @@ -259,7 +315,7 @@ frozenset([frozenset([1]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])])]), frozenset([frozenset([1, 2]), frozenset([1])]): frozenset([frozenset([frozenset([1, 2]), @@ -269,7 +325,7 @@ frozenset([frozenset([2]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), frozenset([frozenset([1]), frozenset([0, @@ -285,7 +341,7 @@ frozenset([frozenset([2]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), frozenset([frozenset([]), frozenset([0])]): frozenset([frozenset([frozenset([0]), frozenset([0, @@ -293,16 +349,16 @@ frozenset([frozenset([0]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), - frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([1]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])]), frozenset([frozenset([1]), frozenset([0, @@ -310,9 +366,9 @@ frozenset([frozenset([2]), frozenset([])]): frozenset([frozenset([frozenset([2]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([0])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), frozenset([frozenset([2]), frozenset([0, @@ -333,7 +389,7 @@ frozenset([frozenset([1]), frozenset([0, 1])])]), - frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset(), + frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([0, 1]), @@ -357,7 +413,7 @@ frozenset([frozenset([0]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), frozenset([frozenset([0, 1, 2]), frozenset([0, 2])]): frozenset([frozenset([frozenset([1, 2]), diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Library ------- +- Issue #19137: The pprint module now correctly formats empty set and frozenset + and instances of set and frozenset subclasses. + - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to prevent readline() calls from consuming too much memory. Patch by Jyrki Pulliainen. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 10:45:51 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 10:45:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTM3?= =?utf-8?q?=3A_The_pprint_module_now_correctly_formats_instances_of_set_an?= =?utf-8?q?d?= Message-ID: <3cqWCM0VhWz7LnN@mail.python.org> http://hg.python.org/cpython/rev/65943dc15afc changeset: 85919:65943dc15afc branch: 3.3 parent: 85916:1ee6f8a96fb9 user: Serhiy Storchaka date: Wed Oct 02 11:40:49 2013 +0300 summary: Issue #19137: The pprint module now correctly formats instances of set and frozenset subclasses. files: Lib/pprint.py | 30 +++++----- Lib/test/test_pprint.py | 79 ++++++++++++++++++++++++---- Misc/NEWS | 3 + 3 files changed, 84 insertions(+), 28 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -205,24 +205,22 @@ if issubclass(typ, list): write('[') endchar = ']' - elif issubclass(typ, set): - if not length: - write('set()') - return - write('{') - endchar = '}' - object = sorted(object, key=_safe_key) - elif issubclass(typ, frozenset): - if not length: - write('frozenset()') - return - write('frozenset({') - endchar = '})' - object = sorted(object, key=_safe_key) - indent += 10 - else: + elif issubclass(typ, tuple): write('(') endchar = ')' + else: + if not length: + write(rep) + return + if typ is set: + write('{') + endchar = '}' + else: + write(typ.__name__) + write('({') + endchar = '})' + indent += len(typ.__name__) + 1 + object = sorted(object, key=_safe_key) if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') if length: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -21,6 +21,20 @@ def __repr__(self): return tuple.__repr__(self) +class set2(set): + pass + +class set3(set): + def __repr__(self): + return set.__repr__(self) + +class frozenset2(frozenset): + pass + +class frozenset3(frozenset): + def __repr__(self): + return frozenset.__repr__(self) + class dict2(dict): pass @@ -115,22 +129,24 @@ for simple in (0, 0, 0+0j, 0.0, "", b"", (), tuple2(), tuple3(), [], list2(), list3(), + set(), set2(), set3(), + frozenset(), frozenset2(), frozenset3(), {}, dict2(), dict3(), self.assertTrue, pprint, -6, -6, -6-6j, -1.5, "x", b"x", (3,), [3], {3: 6}, (1,2), [3,4], {5: 6}, tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), [3,4], list2([3,4]), list3([3,4]), list3(range(100)), + set({7}), set2({7}), set3({7}), + frozenset({8}), frozenset2({8}), frozenset3({8}), dict2({5: 6}), dict3({5: 6}), range(10, -11, -1) ): native = repr(simple) - for function in "pformat", "saferepr": - f = getattr(pprint, function) - got = f(simple) - self.assertEqual(native, got, - "expected %s got %s from pprint.%s" % - (native, got, function)) + self.assertEqual(pprint.pformat(simple), native) + self.assertEqual(pprint.pformat(simple, width=1, indent=0) + .replace('\n', ' '), native) + self.assertEqual(pprint.saferepr(simple), native) def test_basic_line_wrap(self): # verify basic line-wrapping operation @@ -219,10 +235,54 @@ others.should.not.be: like.this}""" self.assertEqual(DottedPrettyPrinter().pformat(o), exp) + def test_set_reprs(self): + self.assertEqual(pprint.pformat(set()), 'set()') + self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}') + self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\ +{0, + 1, + 2, + 3, + 4, + 5, + 6}''') + self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\ +set2({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(set3(range(7)), width=20), + 'set3({0, 1, 2, 3, 4, 5, 6})') + + self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') + self.assertEqual(pprint.pformat(frozenset(range(3))), + 'frozenset({0, 1, 2})') + self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\ +frozenset({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\ +frozenset2({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(frozenset3(range(7)), width=20), + 'frozenset3({0, 1, 2, 3, 4, 5, 6})') + @unittest.expectedFailure #See http://bugs.python.org/issue13907 @test.support.cpython_only - def test_set_reprs(self): + def test_set_of_sets_reprs(self): # This test creates a complex arrangement of frozensets and # compares the pretty-printed repr against a string hard-coded in # the test. The hard-coded repr depends on the sort order of @@ -245,11 +305,6 @@ # algorithm cause the test to fail when it should pass. # XXX Or changes to the dictionary implmentation... - self.assertEqual(pprint.pformat(set()), 'set()') - self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}') - self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') - - self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset({0, 1, 2})') cube_repr_tgt = """\ {frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}), frozenset({0}): frozenset({frozenset(), diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,9 @@ Library ------- +- Issue #19137: The pprint module now correctly formats instances of set and + frozenset subclasses. + - Issue #19092: contextlib.ExitStack now correctly reraises exceptions from the __exit__ callbacks of inner context managers (Patch by Hrvoje Nik?i?) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 10:45:52 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 10:45:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319137=3A_The_pprint_module_now_correctly_format?= =?utf-8?q?s_instances_of_set_and?= Message-ID: <3cqWCN4N3Tz7LnM@mail.python.org> http://hg.python.org/cpython/rev/2d21239a5205 changeset: 85920:2d21239a5205 parent: 85917:6cbc6d9ca4ce parent: 85919:65943dc15afc user: Serhiy Storchaka date: Wed Oct 02 11:43:30 2013 +0300 summary: Issue #19137: The pprint module now correctly formats instances of set and frozenset subclasses. files: Lib/pprint.py | 30 +++++----- Lib/test/test_pprint.py | 79 ++++++++++++++++++++++++---- Misc/NEWS | 3 + 3 files changed, 84 insertions(+), 28 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -203,24 +203,22 @@ if issubclass(typ, list): write('[') endchar = ']' - elif issubclass(typ, set): - if not length: - write('set()') - return - write('{') - endchar = '}' - object = sorted(object, key=_safe_key) - elif issubclass(typ, frozenset): - if not length: - write('frozenset()') - return - write('frozenset({') - endchar = '})' - object = sorted(object, key=_safe_key) - indent += 10 - else: + elif issubclass(typ, tuple): write('(') endchar = ')' + else: + if not length: + write(rep) + return + if typ is set: + write('{') + endchar = '}' + else: + write(typ.__name__) + write('({') + endchar = '})' + indent += len(typ.__name__) + 1 + object = sorted(object, key=_safe_key) if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') if length: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -23,6 +23,20 @@ def __repr__(self): return tuple.__repr__(self) +class set2(set): + pass + +class set3(set): + def __repr__(self): + return set.__repr__(self) + +class frozenset2(frozenset): + pass + +class frozenset3(frozenset): + def __repr__(self): + return frozenset.__repr__(self) + class dict2(dict): pass @@ -117,22 +131,24 @@ for simple in (0, 0, 0+0j, 0.0, "", b"", (), tuple2(), tuple3(), [], list2(), list3(), + set(), set2(), set3(), + frozenset(), frozenset2(), frozenset3(), {}, dict2(), dict3(), self.assertTrue, pprint, -6, -6, -6-6j, -1.5, "x", b"x", (3,), [3], {3: 6}, (1,2), [3,4], {5: 6}, tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), [3,4], list2([3,4]), list3([3,4]), list3(range(100)), + set({7}), set2({7}), set3({7}), + frozenset({8}), frozenset2({8}), frozenset3({8}), dict2({5: 6}), dict3({5: 6}), range(10, -11, -1) ): native = repr(simple) - for function in "pformat", "saferepr": - f = getattr(pprint, function) - got = f(simple) - self.assertEqual(native, got, - "expected %s got %s from pprint.%s" % - (native, got, function)) + self.assertEqual(pprint.pformat(simple), native) + self.assertEqual(pprint.pformat(simple, width=1, indent=0) + .replace('\n', ' '), native) + self.assertEqual(pprint.saferepr(simple), native) def test_basic_line_wrap(self): # verify basic line-wrapping operation @@ -221,10 +237,54 @@ others.should.not.be: like.this}""" self.assertEqual(DottedPrettyPrinter().pformat(o), exp) + def test_set_reprs(self): + self.assertEqual(pprint.pformat(set()), 'set()') + self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}') + self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\ +{0, + 1, + 2, + 3, + 4, + 5, + 6}''') + self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\ +set2({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(set3(range(7)), width=20), + 'set3({0, 1, 2, 3, 4, 5, 6})') + + self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') + self.assertEqual(pprint.pformat(frozenset(range(3))), + 'frozenset({0, 1, 2})') + self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\ +frozenset({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\ +frozenset2({0, + 1, + 2, + 3, + 4, + 5, + 6})''') + self.assertEqual(pprint.pformat(frozenset3(range(7)), width=20), + 'frozenset3({0, 1, 2, 3, 4, 5, 6})') + @unittest.expectedFailure #See http://bugs.python.org/issue13907 @test.support.cpython_only - def test_set_reprs(self): + def test_set_of_sets_reprs(self): # This test creates a complex arrangement of frozensets and # compares the pretty-printed repr against a string hard-coded in # the test. The hard-coded repr depends on the sort order of @@ -247,11 +307,6 @@ # algorithm cause the test to fail when it should pass. # XXX Or changes to the dictionary implmentation... - self.assertEqual(pprint.pformat(set()), 'set()') - self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}') - self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') - - self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset({0, 1, 2})') cube_repr_tgt = """\ {frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}), frozenset({0}): frozenset({frozenset(), diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #19137: The pprint module now correctly formats instances of set and + frozenset subclasses. + - Issue #10042: functools.total_ordering now correctly handles NotImplemented being returned by the underlying comparison function (Patch by Katie Miller) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 10:57:44 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 10:57:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319132=3A_The_ppri?= =?utf-8?q?nt_module_now_supports_compact_mode=2E?= Message-ID: <3cqWT43ml0z7Lm0@mail.python.org> http://hg.python.org/cpython/rev/ae0306c8f7a3 changeset: 85921:ae0306c8f7a3 user: Serhiy Storchaka date: Wed Oct 02 11:56:18 2013 +0300 summary: Issue #19132: The pprint module now supports compact mode. files: Doc/library/pprint.rst | 31 ++++++++++------ Doc/whatsnew/3.4.rst | 7 +++ Lib/pprint.py | 53 +++++++++++++++++++++------- Lib/test/test_pprint.py | 12 ++++++ Misc/NEWS | 2 + 5 files changed, 80 insertions(+), 25 deletions(-) diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -29,14 +29,14 @@ .. First the implementation class: -.. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None) +.. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ + compact=False) Construct a :class:`PrettyPrinter` instance. This constructor understands several keyword parameters. An output stream may be set using the *stream* keyword; the only method used on the stream object is the file protocol's :meth:`write` method. If not specified, the :class:`PrettyPrinter` adopts - ``sys.stdout``. Three additional parameters may be used to control the - formatted representation. The keywords are *indent*, *depth*, and *width*. The + ``sys.stdout``. The amount of indentation added for each recursive level is specified by *indent*; the default is one. Other values can cause output to look a little odd, but can make nesting easier to spot. The number of levels which may be printed is @@ -45,7 +45,9 @@ the depth of the objects being formatted. The desired output width is constrained using the *width* parameter; the default is 80 characters. If a structure cannot be formatted within the constrained width, a best effort will - be made. + be made. If *compact* is false (the default) each item of a long sequence + will be formatted on a separate line. If *compact* is true, as many items + as will fit within the *width* will be formatted on each output line. >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] @@ -58,6 +60,12 @@ 'lumberjack', 'knights', 'ni'] + >>> pp = pprint.PrettyPrinter(width=41, compact=True) + >>> pp.pprint(stuff) + [['spam', 'eggs', 'lumberjack', + 'knights', 'ni'], + 'spam', 'eggs', 'lumberjack', 'knights', + 'ni'] >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ... ('parrot', ('fresh fruit',)))))))) >>> pp = pprint.PrettyPrinter(depth=6) @@ -67,21 +75,22 @@ The :mod:`pprint` module also provides several shortcut functions: -.. function:: pformat(object, indent=1, width=80, depth=None) +.. function:: pformat(object, indent=1, width=80, depth=None, *, compact=False) - Return the formatted representation of *object* as a string. *indent*, *width* - and *depth* will be passed to the :class:`PrettyPrinter` constructor as - formatting parameters. + Return the formatted representation of *object* as a string. *indent*, + *width*, *depth* and *compact* will be passed to the :class:`PrettyPrinter` + constructor as formatting parameters. -.. function:: pprint(object, stream=None, indent=1, width=80, depth=None) +.. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ + compact=False) Prints the formatted representation of *object* on *stream*, followed by a newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used in the interactive interpreter instead of the :func:`print` function for inspecting values (you can even reassign ``print = pprint.pprint`` for use - within a scope). *indent*, *width* and *depth* will be passed to the - :class:`PrettyPrinter` constructor as formatting parameters. + within a scope). *indent*, *width*, *depth* and *compact* will be passed + to the :class:`PrettyPrinter` constructor as formatting parameters. >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -314,6 +314,13 @@ (Contributed by Lorenzo Catucci in :issue:`4473`.) +pprint +------ + +The :mod::`pprint` module now supports *compact* mode for formatting long +sequences (:issue:`19132`). + + smtplib ------- diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -49,15 +49,18 @@ _type = type -def pprint(object, stream=None, indent=1, width=80, depth=None): +def pprint(object, stream=None, indent=1, width=80, depth=None, *, + compact=False): """Pretty-print a Python object to a stream [default is sys.stdout].""" printer = PrettyPrinter( - stream=stream, indent=indent, width=width, depth=depth) + stream=stream, indent=indent, width=width, depth=depth, + compact=compact) printer.pprint(object) -def pformat(object, indent=1, width=80, depth=None): +def pformat(object, indent=1, width=80, depth=None, *, compact=False): """Format a Python object into a pretty-printed representation.""" - return PrettyPrinter(indent=indent, width=width, depth=depth).pformat(object) + return PrettyPrinter(indent=indent, width=width, depth=depth, + compact=compact).pformat(object) def saferepr(object): """Version of repr() which can handle recursive data structures.""" @@ -102,7 +105,8 @@ return _safe_key(t[0]), _safe_key(t[1]) class PrettyPrinter: - def __init__(self, indent=1, width=80, depth=None, stream=None): + def __init__(self, indent=1, width=80, depth=None, stream=None, *, + compact=False): """Handle pretty printing operations onto a stream using a set of configured parameters. @@ -119,6 +123,9 @@ The desired output stream. If omitted (or false), the standard output stream available at construction will be used. + compact + If true, several items will be combined in one line. + """ indent = int(indent) width = int(width) @@ -132,6 +139,7 @@ self._stream = stream else: self._stream = _sys.stdout + self._compact = bool(compact) def pprint(self, object): self._format(object, self._stream, 0, 0, {}, 0) @@ -223,15 +231,9 @@ write((self._indent_per_level - 1) * ' ') if length: context[objid] = 1 - indent = indent + self._indent_per_level - self._format(object[0], stream, indent, allowance + 1, - context, level) - if length > 1: - for ent in object[1:]: - write(',\n' + ' '*indent) - self._format(ent, stream, indent, - allowance + 1, context, level) - indent = indent - self._indent_per_level + self._format_items(object, stream, + indent + self._indent_per_level, + allowance + 1, context, level) del context[objid] if issubclass(typ, tuple) and length == 1: write(',') @@ -271,6 +273,29 @@ return write(rep) + def _format_items(self, items, stream, indent, allowance, context, level): + write = stream.write + delimnl = ',\n' + ' ' * indent + delim = '' + width = max_width = self._width - indent - allowance + 2 + for ent in items: + if self._compact: + rep = self._repr(ent, context, level) + w = _len(rep) + 2 + if width < w: + width = max_width + if delim: + delim = delimnl + if width >= w: + width -= w + write(delim) + delim = ', ' + write(rep) + continue + write(delim) + delim = delimnl + self._format(ent, stream, indent, allowance, context, level) + def _repr(self, object, context, level): repr, readable, recursive = self.format(object, context.copy(), self._depth, level) diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -568,6 +568,18 @@ formatted = pprint.pformat(special, width=width) self.assertEqual(eval("(" + formatted + ")"), special) + def test_compact(self): + o = ([list(range(i * i)) for i in range(5)] + + [list(range(i)) for i in range(6)]) + expected = """\ +[[], [0], [0, 1, 2, 3], + [0, 1, 2, 3, 4, 5, 6, 7, 8], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15], + [], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], + [0, 1, 2, 3, 4]]""" + self.assertEqual(pprint.pformat(o, width=48, compact=True), expected) + class DottedPrettyPrinter(pprint.PrettyPrinter): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,8 @@ Library ------- +- Issue #19132: The pprint module now supports compact mode. + - Issue #19137: The pprint module now correctly formats instances of set and frozenset subclasses. -- Repository URL: http://hg.python.org/cpython From root at python.org Wed Oct 2 11:15:02 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 11:15:02 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From root at python.org Wed Oct 2 11:20:01 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 11:20:01 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From root at python.org Wed Oct 2 11:44:24 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 11:44:24 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From root at python.org Wed Oct 2 11:45:03 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 11:45:03 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From root at python.org Wed Oct 2 11:59:44 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 11:59:44 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From root at python.org Wed Oct 2 12:10:02 2013 From: root at python.org (Cron Daemon) Date: Wed, 02 Oct 2013 12:10:02 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: HTTP Error 500: Internal Server Error From python-checkins at python.org Wed Oct 2 12:36:34 2013 From: python-checkins at python.org (vinay.sajip) Date: Wed, 2 Oct 2013 12:36:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2319139=3A_Changed?= =?utf-8?q?_usage_of_=5F=5FVENV=5FNAME=5F=5F_and_added_=5F=5FVENV=5FPROMPT?= =?utf-8?b?X18u?= Message-ID: <3cqYg657JYz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/7f913c6ada03 changeset: 85922:7f913c6ada03 user: Vinay Sajip date: Wed Oct 02 11:36:16 2013 +0100 summary: Closes #19139: Changed usage of __VENV_NAME__ and added __VENV_PROMPT__. files: Doc/library/venv.rst | 3 +++ Lib/venv/__init__.py | 3 ++- Lib/venv/scripts/nt/Activate.ps1 | 2 +- Lib/venv/scripts/nt/activate.bat | 2 +- Lib/venv/scripts/posix/activate | 4 ++-- Lib/venv/scripts/posix/activate.fish | 4 ++-- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -187,6 +187,9 @@ * ``__VENV_NAME__`` is replaced with the environment name (final path segment of environment directory). + * ``__VENV_PROMPT__`` is replaced with the prompt (the environment + name surrounded by parentheses and with a following space) + * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory (either ``bin`` or ``Scripts``). diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -261,7 +261,8 @@ being processed. """ text = text.replace('__VENV_DIR__', context.env_dir) - text = text.replace('__VENV_NAME__', context.prompt) + text = text.replace('__VENV_NAME__', context.env_name) + text = text.replace('__VENV_PROMPT__', context.prompt) text = text.replace('__VENV_BIN_NAME__', context.bin_name) text = text.replace('__VENV_PYTHON__', context.env_exe) return text diff --git a/Lib/venv/scripts/nt/Activate.ps1 b/Lib/venv/scripts/nt/Activate.ps1 --- a/Lib/venv/scripts/nt/Activate.ps1 +++ b/Lib/venv/scripts/nt/Activate.ps1 @@ -34,7 +34,7 @@ function global:_OLD_VIRTUAL_PROMPT {""} copy-item function:prompt function:_OLD_VIRTUAL_PROMPT function global:prompt { - Write-Host -NoNewline -ForegroundColor Green '__VENV_NAME__' + Write-Host -NoNewline -ForegroundColor Green '__VENV_PROMPT__' _OLD_VIRTUAL_PROMPT } diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat --- a/Lib/venv/scripts/nt/activate.bat +++ b/Lib/venv/scripts/nt/activate.bat @@ -14,7 +14,7 @@ ) set "_OLD_VIRTUAL_PROMPT=%PROMPT%" -set "PROMPT=__VENV_NAME__%PROMPT%" +set "PROMPT=__VENV_PROMPT__%PROMPT%" if defined PYTHONHOME ( set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" diff --git a/Lib/venv/scripts/posix/activate b/Lib/venv/scripts/posix/activate --- a/Lib/venv/scripts/posix/activate +++ b/Lib/venv/scripts/posix/activate @@ -54,8 +54,8 @@ if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then _OLD_VIRTUAL_PS1="$PS1" - if [ "x__VENV_NAME__" != x ] ; then - PS1="__VENV_NAME__$PS1" + if [ "x__VENV_PROMPT__" != x ] ; then + PS1="__VENV_PROMPT__$PS1" else if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then # special case for Aspen magic directories diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -55,8 +55,8 @@ # with the original prompt function renamed, we can override with our own. function fish_prompt # Prompt override? - if test -n "__VENV_NAME__" - printf "%s%s%s" "__VENV_NAME__" (set_color normal) (_old_fish_prompt) + if test -n "__VENV_PROMPT__" + printf "%s%s%s" "__VENV_PROMPT__" (set_color normal) (_old_fish_prompt) return end # ...Otherwise, prepend env -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 14:07:07 2013 From: python-checkins at python.org (nick.coghlan) Date: Wed, 2 Oct 2013 14:07:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319078=3A_memoryvi?= =?utf-8?q?ew_now_supports_reversed?= Message-ID: <3cqbgb4pFBz7LqZ@mail.python.org> http://hg.python.org/cpython/rev/0dc604d58949 changeset: 85923:0dc604d58949 user: Nick Coghlan date: Wed Oct 02 22:06:54 2013 +1000 summary: Close #19078: memoryview now supports reversed Patch by Claudiu Popa files: Lib/test/test_memoryview.py | 9 +++++++++ Misc/NEWS | 4 ++++ Objects/memoryobject.c | 2 +- 3 files changed, 14 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_memoryview.py b/Lib/test/test_memoryview.py --- a/Lib/test/test_memoryview.py +++ b/Lib/test/test_memoryview.py @@ -352,6 +352,15 @@ self.assertIs(wr(), None) self.assertIs(L[0], b) + def test_reversed(self): + for tp in self._types: + b = tp(self._source) + m = self._view(b) + aslist = list(reversed(m.tolist())) + self.assertEqual(list(reversed(m)), aslist) + self.assertEqual(list(reversed(m)), list(m[::-1])) + + # Variations on source objects for the buffer: bytes-like objects, then arrays # with itemsize > 1. # NOTE: support for multi-dimensional objects is unimplemented. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #19078: memoryview now correctly supports the reversed builtin + (Patch by Claudiu Popa) + + Library ------- diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -2402,7 +2402,7 @@ /* As sequence */ static PySequenceMethods memory_as_sequence = { - 0, /* sq_length */ + (lenfunc)memory_length, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ (ssizeargfunc)memory_item, /* sq_item */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 14:32:17 2013 From: python-checkins at python.org (nick.coghlan) Date: Wed, 2 Oct 2013 14:32:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2318690=3A_register?= =?utf-8?q?_memoryview_with_Sequence_ABC?= Message-ID: <3cqcDd1lJ9z7LqT@mail.python.org> http://hg.python.org/cpython/rev/95badf936353 changeset: 85924:95badf936353 user: Nick Coghlan date: Wed Oct 02 22:31:47 2013 +1000 summary: Close #18690: register memoryview with Sequence ABC files: Doc/library/stdtypes.rst | 4 ++++ Lib/collections/abc.py | 1 + Lib/test/test_collections.py | 2 ++ Misc/NEWS | 3 +++ 4 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2458,6 +2458,10 @@ .. versionchanged:: 3.3 One-dimensional memoryviews with formats 'B', 'b' or 'c' are now hashable. + .. versionchanged:: 3.4 + memoryview is now registered automatically with + :class:`collections.abc.Sequence` + :class:`memoryview` has several methods: .. method:: __eq__(exporter) diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py --- a/Lib/collections/abc.py +++ b/Lib/collections/abc.py @@ -643,6 +643,7 @@ Sequence.register(tuple) Sequence.register(str) Sequence.register(range) +Sequence.register(memoryview) class ByteString(Sequence): diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -782,6 +782,8 @@ self.assertTrue(issubclass(sample, Sequence)) self.assertIsInstance(range(10), Sequence) self.assertTrue(issubclass(range, Sequence)) + self.assertIsInstance(memoryview(b""), Sequence) + self.assertTrue(issubclass(memoryview, Sequence)) self.assertTrue(issubclass(str, Sequence)) self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__', '__getitem__') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #18690: memoryview is now automatically registered with + collections.abc.Sequence + - Issue #19078: memoryview now correctly supports the reversed builtin (Patch by Claudiu Popa) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 16:26:15 2013 From: python-checkins at python.org (brett.cannon) Date: Wed, 2 Oct 2013 16:26:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_to_fix_issue_=2319134_?= =?utf-8?q?again?= Message-ID: <3cqfm759xlz7Lnc@mail.python.org> http://hg.python.org/cpython/rev/2e54edaf60d4 changeset: 85925:2e54edaf60d4 user: Brett Cannon date: Wed Oct 02 10:25:42 2013 -0400 summary: Try to fix issue #19134 again files: Lib/test/test_inspect.py | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -11,9 +11,12 @@ import functools import importlib from os.path import normcase +try: + from concurrent.futures import ThreadPoolExecutor +except ImportError: + ThreadPoolExecutor = None from test.support import run_unittest, TESTFN, DirsOnSysPath -from test.support import multiprocessing as has_multiprocessing from test.script_helper import assert_python_ok, assert_python_failure from test import inspect_fodder as mod from test import inspect_fodder2 as mod2 @@ -2408,17 +2411,15 @@ self.assertEqual(lines[:-1], inspect.getsource(module).splitlines()) self.assertEqual(err, b'') - @unittest.skipIf(not has_multiprocessing, + @unittest.skipIf(ThreadPoolExecutor is None, 'multiprocessing required to test __qualname__ for source files') def test_qualname_source(self): - module = importlib.import_module('concurrent.futures') - member = getattr(module, 'ThreadPoolExecutor') rc, out, err = assert_python_ok('-m', 'inspect', 'concurrent.futures:ThreadPoolExecutor') lines = out.decode().splitlines() # ignore the final newline self.assertEqual(lines[:-1], - inspect.getsource(member).splitlines()) + inspect.getsource(ThreadPoolExecutor).splitlines()) self.assertEqual(err, b'') def test_builtins(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 16:59:05 2013 From: python-checkins at python.org (brett.cannon) Date: Wed, 2 Oct 2013 16:59:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Tweak_skipIf_message?= Message-ID: <3cqgV10w95z7Lp5@mail.python.org> http://hg.python.org/cpython/rev/0474813e9df9 changeset: 85926:0474813e9df9 user: Brett Cannon date: Wed Oct 02 10:58:58 2013 -0400 summary: Tweak skipIf message files: Lib/test/test_inspect.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2412,7 +2412,7 @@ self.assertEqual(err, b'') @unittest.skipIf(ThreadPoolExecutor is None, - 'multiprocessing required to test __qualname__ for source files') + 'threads required to test __qualname__ for source files') def test_qualname_source(self): rc, out, err = assert_python_ok('-m', 'inspect', 'concurrent.futures:ThreadPoolExecutor') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 17:01:32 2013 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 2 Oct 2013 17:01:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Drop_buildbott?= =?utf-8?q?ouch_again=3B_the_master_is_using_=22make_touch=22_now=2E?= Message-ID: <3cqgXr6HsRzQ41@mail.python.org> http://hg.python.org/cpython/rev/6237908470fb changeset: 85927:6237908470fb branch: 3.3 parent: 85919:65943dc15afc user: Martin v. L?wis date: Wed Oct 02 16:59:23 2013 +0200 summary: Drop buildbottouch again; the master is using "make touch" now. files: Makefile.pre.in | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -893,9 +893,6 @@ fi $(TESTRUNNER) -j 1 -u all -W --timeout=$(TESTTIMEOUT) $(TESTOPTS) -# Like touch, but also working on 2.7 (where the target is a no-op) -buildbottouch: touch - QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multibytecodec test_urllib2_localnet test_itertools \ test_multiprocessing test_mailbox test_socket test_poll \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 17:01:34 2013 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 2 Oct 2013 17:01:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy4z?= Message-ID: <3cqgXt27grz7Lpd@mail.python.org> http://hg.python.org/cpython/rev/d1f7fe885060 changeset: 85928:d1f7fe885060 parent: 85926:0474813e9df9 parent: 85927:6237908470fb user: Martin v. L?wis date: Wed Oct 02 16:59:41 2013 +0200 summary: Merge 3.3 files: Makefile.pre.in | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -941,9 +941,6 @@ fi $(TESTRUNNER) -j 1 -u all -W --timeout=$(TESTTIMEOUT) $(TESTOPTS) -# Like touch, but also working on 2.7 (where the target is a no-op) -buildbottouch: touch - QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multibytecodec test_urllib2_localnet test_itertools \ test_multiprocessing_fork test_multiprocessing_spawn \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 17:03:19 2013 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 2 Oct 2013 17:03:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Drop_buildbott?= =?utf-8?q?ouch_again=3B_the_master_is_using_=22make_touch=22_now=2E?= Message-ID: <3cqgZv2Js4zQ41@mail.python.org> http://hg.python.org/cpython/rev/3770c6135400 changeset: 85929:3770c6135400 branch: 2.7 parent: 85918:fcd889046ee1 user: Martin v. L?wis date: Wed Oct 02 17:03:05 2013 +0200 summary: Drop buildbottouch again; the master is using "make touch" now. files: Makefile.pre.in | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -796,9 +796,6 @@ fi $(TESTPYTHON) -R $(TESTPROG) -uall -rwW $(TESTOPTS) -# Fake target in 2.7, real in 3.x. -buildbottouch: - QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multibytecodec test_urllib2_localnet test_itertools \ test_multiprocessing test_mailbox test_socket test_poll \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 17:03:45 2013 From: python-checkins at python.org (nick.coghlan) Date: Wed, 2 Oct 2013 17:03:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2317839=3A_support_?= =?utf-8?q?bytes-like_objects_in_base64_module?= Message-ID: <3cqgbP6bKFzQ41@mail.python.org> http://hg.python.org/cpython/rev/d90f25e1a705 changeset: 85930:d90f25e1a705 parent: 85928:d1f7fe885060 user: Nick Coghlan date: Thu Oct 03 00:43:22 2013 +1000 summary: Close #17839: support bytes-like objects in base64 module This mostly affected the encodebytes and decodebytes function (which are used by base64_codec) Also added a test to ensure all bytes-bytes codecs can handle memoryview input and tests for handling of multidimensional and non-bytes format input in the modern base64 API. files: Doc/library/base64.rst | 4 + Doc/library/codecs.rst | 63 ++++++++------- Lib/base64.py | 40 ++++++---- Lib/test/test_base64.py | 110 ++++++++++++++++++++++----- Lib/test/test_codecs.py | 18 ++++ Misc/NEWS | 4 + 6 files changed, 171 insertions(+), 68 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -27,6 +27,10 @@ ASCII-only Unicode strings are now accepted by the decoding functions of the modern interface. +.. versionchanged:: 3.4 + Any :term:`bytes-like object`\ s are now accepted by all + encoding and decoding functions in this module. + The modern interface provides: .. function:: b64encode(s, altchars=None) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1208,36 +1208,41 @@ .. tabularcolumns:: |l|L|L| -+----------------------+---------------------------+------------------------------+ -| Codec | Purpose | Encoder/decoder | -+======================+===========================+==============================+ -| base64_codec [#b64]_ | Convert operand to MIME | :meth:`base64.b64encode`, | -| | base64 (the result always | :meth:`base64.b64decode` | -| | includes a trailing | | -| | ``'\n'``) | | -+----------------------+---------------------------+------------------------------+ -| bz2_codec | Compress the operand | :meth:`bz2.compress`, | -| | using bz2 | :meth:`bz2.decompress` | -+----------------------+---------------------------+------------------------------+ -| hex_codec | Convert operand to | :meth:`base64.b16encode`, | -| | hexadecimal | :meth:`base64.b16decode` | -| | representation, with two | | -| | digits per byte | | -+----------------------+---------------------------+------------------------------+ -| quopri_codec | Convert operand to MIME | :meth:`quopri.encodestring`, | -| | quoted printable | :meth:`quopri.decodestring` | -+----------------------+---------------------------+------------------------------+ -| uu_codec | Convert the operand using | :meth:`uu.encode`, | -| | uuencode | :meth:`uu.decode` | -+----------------------+---------------------------+------------------------------+ -| zlib_codec | Compress the operand | :meth:`zlib.compress`, | -| | using gzip | :meth:`zlib.decompress` | -+----------------------+---------------------------+------------------------------+ ++----------------------+------------------------------+------------------------------+ +| Codec | Purpose | Encoder / decoder | ++======================+==============================+==============================+ +| base64_codec [#b64]_ | Convert operand to MIME | :meth:`base64.b64encode` / | +| | base64 (the result always | :meth:`base64.b64decode` | +| | includes a trailing | | +| | ``'\n'``) | | +| | | | +| | .. versionchanged:: 3.4 | | +| | accepts any | | +| | :term:`bytes-like object` | | +| | as input for encoding and | | +| | decoding | | ++----------------------+------------------------------+------------------------------+ +| bz2_codec | Compress the operand | :meth:`bz2.compress` / | +| | using bz2 | :meth:`bz2.decompress` | ++----------------------+------------------------------+------------------------------+ +| hex_codec | Convert operand to | :meth:`base64.b16encode` / | +| | hexadecimal | :meth:`base64.b16decode` | +| | representation, with two | | +| | digits per byte | | ++----------------------+------------------------------+------------------------------+ +| quopri_codec | Convert operand to MIME | :meth:`quopri.encodestring` /| +| | quoted printable | :meth:`quopri.decodestring` | ++----------------------+------------------------------+------------------------------+ +| uu_codec | Convert the operand using | :meth:`uu.encode` / | +| | uuencode | :meth:`uu.decode` | ++----------------------+------------------------------+------------------------------+ +| zlib_codec | Compress the operand | :meth:`zlib.compress` / | +| | using gzip | :meth:`zlib.decompress` | ++----------------------+------------------------------+------------------------------+ -.. [#b64] Rather than accepting any :term:`bytes-like object`, - ``'base64_codec'`` accepts only :class:`bytes` and :class:`bytearray` for - encoding and only :class:`bytes`, :class:`bytearray`, and ASCII-only - instances of :class:`str` for decoding +.. [#b64] In addition to :term:`bytes-like objects `, + ``'base64_codec'`` also accepts ASCII-only instances of :class:`str` for + decoding The following codecs provide :class:`str` to :class:`str` mappings. diff --git a/Lib/base64.py b/Lib/base64.py --- a/Lib/base64.py +++ b/Lib/base64.py @@ -35,11 +35,13 @@ return s.encode('ascii') except UnicodeEncodeError: raise ValueError('string argument should contain only ASCII characters') - elif isinstance(s, bytes_types): + if isinstance(s, bytes_types): return s - else: - raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__) - + try: + return memoryview(s).tobytes() + except TypeError: + raise TypeError("argument should be a bytes-like object or ASCII " + "string, not %r" % s.__class__.__name__) from None # Base64 encoding/decoding uses binascii @@ -54,14 +56,9 @@ The encoded byte string is returned. """ - if not isinstance(s, bytes_types): - raise TypeError("expected bytes, not %s" % s.__class__.__name__) # Strip off the trailing newline encoded = binascii.b2a_base64(s)[:-1] if altchars is not None: - if not isinstance(altchars, bytes_types): - raise TypeError("expected bytes, not %s" - % altchars.__class__.__name__) assert len(altchars) == 2, repr(altchars) return encoded.translate(bytes.maketrans(b'+/', altchars)) return encoded @@ -149,7 +146,7 @@ s is the byte string to encode. The encoded byte string is returned. """ if not isinstance(s, bytes_types): - raise TypeError("expected bytes, not %s" % s.__class__.__name__) + s = memoryview(s).tobytes() leftover = len(s) % 5 # Pad the last quantum with zero bits if necessary if leftover: @@ -250,8 +247,6 @@ s is the byte string to encode. The encoded byte string is returned. """ - if not isinstance(s, bytes_types): - raise TypeError("expected bytes, not %s" % s.__class__.__name__) return binascii.hexlify(s).upper() @@ -306,12 +301,26 @@ s = binascii.a2b_base64(line) output.write(s) +def _input_type_check(s): + try: + m = memoryview(s) + except TypeError as err: + msg = "expected bytes-like object, not %s" % s.__class__.__name__ + raise TypeError(msg) from err + if m.format not in ('c', 'b', 'B'): + msg = ("expected single byte elements, not %r from %s" % + (m.format, s.__class__.__name__)) + raise TypeError(msg) + if m.ndim != 1: + msg = ("expected 1-D data, not %d-D data from %s" % + (m.ndim, s.__class__.__name__)) + raise TypeError(msg) + def encodebytes(s): """Encode a bytestring into a bytestring containing multiple lines of base-64 data.""" - if not isinstance(s, bytes_types): - raise TypeError("expected bytes, not %s" % s.__class__.__name__) + _input_type_check(s) pieces = [] for i in range(0, len(s), MAXBINSIZE): chunk = s[i : i + MAXBINSIZE] @@ -328,8 +337,7 @@ def decodebytes(s): """Decode a bytestring of base-64 data into a bytestring.""" - if not isinstance(s, bytes_types): - raise TypeError("expected bytes, not %s" % s.__class__.__name__) + _input_type_check(s) return binascii.a2b_base64(s) def decodestring(s): diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -5,10 +5,21 @@ import os import sys import subprocess - +import struct +from array import array class LegacyBase64TestCase(unittest.TestCase): + + # Legacy API is not as permissive as the modern API + def check_type_errors(self, f): + self.assertRaises(TypeError, f, "") + self.assertRaises(TypeError, f, []) + multidimensional = memoryview(b"1234").cast('B', (2, 2)) + self.assertRaises(TypeError, f, multidimensional) + int_data = memoryview(b"1234").cast('I') + self.assertRaises(TypeError, f, int_data) + def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") @@ -24,7 +35,9 @@ b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n") # Non-bytes eq(base64.encodebytes(bytearray(b'abc')), b'YWJj\n') - self.assertRaises(TypeError, base64.encodebytes, "") + eq(base64.encodebytes(memoryview(b'abc')), b'YWJj\n') + eq(base64.encodebytes(array('B', b'abc')), b'YWJj\n') + self.check_type_errors(base64.encodebytes) def test_decodebytes(self): eq = self.assertEqual @@ -41,7 +54,9 @@ eq(base64.decodebytes(b''), b'') # Non-bytes eq(base64.decodebytes(bytearray(b'YWJj\n')), b'abc') - self.assertRaises(TypeError, base64.decodebytes, "") + eq(base64.decodebytes(memoryview(b'YWJj\n')), b'abc') + eq(base64.decodebytes(array('B', b'YWJj\n')), b'abc') + self.check_type_errors(base64.decodebytes) def test_encode(self): eq = self.assertEqual @@ -73,6 +88,38 @@ class BaseXYTestCase(unittest.TestCase): + + # Modern API completely ignores exported dimension and format data and + # treats any buffer as a stream of bytes + def check_encode_type_errors(self, f): + self.assertRaises(TypeError, f, "") + self.assertRaises(TypeError, f, []) + + def check_decode_type_errors(self, f): + self.assertRaises(TypeError, f, []) + + def check_other_types(self, f, bytes_data, expected): + eq = self.assertEqual + eq(f(bytearray(bytes_data)), expected) + eq(f(memoryview(bytes_data)), expected) + eq(f(array('B', bytes_data)), expected) + self.check_nonbyte_element_format(base64.b64encode, bytes_data) + self.check_multidimensional(base64.b64encode, bytes_data) + + def check_multidimensional(self, f, data): + padding = b"\x00" if len(data) % 2 else b"" + bytes_data = data + padding # Make sure cast works + shape = (len(bytes_data) // 2, 2) + multidimensional = memoryview(bytes_data).cast('B', shape) + self.assertEqual(f(multidimensional), f(bytes_data)) + + def check_nonbyte_element_format(self, f, data): + padding = b"\x00" * ((4 - len(data)) % 4) + bytes_data = data + padding # Make sure cast works + int_data = memoryview(bytes_data).cast('I') + self.assertEqual(f(int_data), f(bytes_data)) + + def test_b64encode(self): eq = self.assertEqual # Test default alphabet @@ -90,13 +137,16 @@ b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==") # Test with arbitrary alternative characters eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd') - # Non-bytes - eq(base64.b64encode(bytearray(b'abcd')), b'YWJjZA==') eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=bytearray(b'*$')), b'01a*b$cd') - # Check if passing a str object raises an error - self.assertRaises(TypeError, base64.b64encode, "") - self.assertRaises(TypeError, base64.b64encode, b"", altchars="") + eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=memoryview(b'*$')), + b'01a*b$cd') + eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=array('B', b'*$')), + b'01a*b$cd') + # Non-bytes + self.check_other_types(base64.b64encode, b'abcd', b'YWJjZA==') + self.check_encode_type_errors(base64.b64encode) + self.assertRaises(TypeError, base64.b64encode, b"", altchars="*$") # Test standard alphabet eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=") eq(base64.standard_b64encode(b"a"), b"YQ==") @@ -110,15 +160,15 @@ b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT" b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==") # Non-bytes - eq(base64.standard_b64encode(bytearray(b'abcd')), b'YWJjZA==') - # Check if passing a str object raises an error - self.assertRaises(TypeError, base64.standard_b64encode, "") + self.check_other_types(base64.standard_b64encode, + b'abcd', b'YWJjZA==') + self.check_encode_type_errors(base64.standard_b64encode) # Test with 'URL safe' alternative characters eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd') # Non-bytes - eq(base64.urlsafe_b64encode(bytearray(b'\xd3V\xbeo\xf7\x1d')), b'01a-b_cd') - # Check if passing a str object raises an error - self.assertRaises(TypeError, base64.urlsafe_b64encode, "") + self.check_other_types(base64.urlsafe_b64encode, + b'\xd3V\xbeo\xf7\x1d', b'01a-b_cd') + self.check_encode_type_errors(base64.urlsafe_b64encode) def test_b64decode(self): eq = self.assertEqual @@ -141,7 +191,8 @@ eq(base64.b64decode(data), res) eq(base64.b64decode(data.decode('ascii')), res) # Non-bytes - eq(base64.b64decode(bytearray(b"YWJj")), b"abc") + self.check_other_types(base64.b64decode, b"YWJj", b"abc") + self.check_decode_type_errors(base64.b64decode) # Test with arbitrary alternative characters tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d', @@ -160,7 +211,8 @@ eq(base64.standard_b64decode(data), res) eq(base64.standard_b64decode(data.decode('ascii')), res) # Non-bytes - eq(base64.standard_b64decode(bytearray(b"YWJj")), b"abc") + self.check_other_types(base64.standard_b64decode, b"YWJj", b"abc") + self.check_decode_type_errors(base64.standard_b64decode) # Test with 'URL safe' alternative characters tests_urlsafe = {b'01a-b_cd': b'\xd3V\xbeo\xf7\x1d', @@ -170,7 +222,9 @@ eq(base64.urlsafe_b64decode(data), res) eq(base64.urlsafe_b64decode(data.decode('ascii')), res) # Non-bytes - eq(base64.urlsafe_b64decode(bytearray(b'01a-b_cd')), b'\xd3V\xbeo\xf7\x1d') + self.check_other_types(base64.urlsafe_b64decode, b'01a-b_cd', + b'\xd3V\xbeo\xf7\x1d') + self.check_decode_type_errors(base64.urlsafe_b64decode) def test_b64decode_padding_error(self): self.assertRaises(binascii.Error, base64.b64decode, b'abc') @@ -205,8 +259,8 @@ eq(base64.b32encode(b'abcd'), b'MFRGGZA=') eq(base64.b32encode(b'abcde'), b'MFRGGZDF') # Non-bytes - eq(base64.b32encode(bytearray(b'abcd')), b'MFRGGZA=') - self.assertRaises(TypeError, base64.b32encode, "") + self.check_other_types(base64.b32encode, b'abcd', b'MFRGGZA=') + self.check_encode_type_errors(base64.b32encode) def test_b32decode(self): eq = self.assertEqual @@ -222,7 +276,8 @@ eq(base64.b32decode(data), res) eq(base64.b32decode(data.decode('ascii')), res) # Non-bytes - eq(base64.b32decode(bytearray(b'MFRGG===')), b'abc') + self.check_other_types(base64.b32decode, b'MFRGG===', b"abc") + self.check_decode_type_errors(base64.b32decode) def test_b32decode_casefold(self): eq = self.assertEqual @@ -277,8 +332,9 @@ eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF') eq(base64.b16encode(b'\x00'), b'00') # Non-bytes - eq(base64.b16encode(bytearray(b'\x01\x02\xab\xcd\xef')), b'0102ABCDEF') - self.assertRaises(TypeError, base64.b16encode, "") + self.check_other_types(base64.b16encode, b'\x01\x02\xab\xcd\xef', + b'0102ABCDEF') + self.check_encode_type_errors(base64.b16encode) def test_b16decode(self): eq = self.assertEqual @@ -293,7 +349,15 @@ eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef') eq(base64.b16decode('0102abcdef', True), b'\x01\x02\xab\xcd\xef') # Non-bytes - eq(base64.b16decode(bytearray(b"0102ABCDEF")), b'\x01\x02\xab\xcd\xef') + self.check_other_types(base64.b16decode, b"0102ABCDEF", + b'\x01\x02\xab\xcd\xef') + self.check_decode_type_errors(base64.b16decode) + eq(base64.b16decode(bytearray(b"0102abcdef"), True), + b'\x01\x02\xab\xcd\xef') + eq(base64.b16decode(memoryview(b"0102abcdef"), True), + b'\x01\x02\xab\xcd\xef') + eq(base64.b16decode(array('B', b"0102abcdef"), True), + b'\x01\x02\xab\xcd\xef') def test_decode_nonascii_str(self): decode_funcs = (base64.b64decode, diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2285,6 +2285,24 @@ sout = reader.readline() self.assertEqual(sout, b"\x80") + def test_buffer_api_usage(self): + # We check all the transform codecs accept memoryview input + # for encoding and decoding + # and also that they roundtrip correctly + original = b"12345\x80" + for encoding in bytes_transform_encodings: + data = original + view = memoryview(data) + data = codecs.encode(data, encoding) + view_encoded = codecs.encode(view, encoding) + self.assertEqual(view_encoded, data) + view = memoryview(data) + data = codecs.decode(data, encoding) + self.assertEqual(data, original) + view_decoded = codecs.decode(view, encoding) + self.assertEqual(view_decoded, data) + + @unittest.skipUnless(sys.platform == 'win32', 'code pages are specific to Windows') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -20,6 +20,10 @@ Library ------- +- Issue #17839: base64.decodebytes and base64.encodebytes now accept any + object that exports a 1 dimensional array of bytes (this means the same + is now also true for base64_codec) + - Issue #19132: The pprint module now supports compact mode. - Issue #19137: The pprint module now correctly formats instances of set and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 18:16:48 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 18:16:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Use_cached_builtins=2E?= Message-ID: <3cqjCh0tnQz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/d48ac94e365f changeset: 85931:d48ac94e365f user: Serhiy Storchaka date: Wed Oct 02 19:15:54 2013 +0300 summary: Use cached builtins. files: Lib/pprint.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -96,8 +96,8 @@ rv = NotImplemented if rv is NotImplemented: - rv = (str(type(self.obj)), id(self.obj)) < \ - (str(type(other.obj)), id(other.obj)) + rv = (str(_type(self.obj)), _id(self.obj)) < \ + (str(_type(other.obj)), _id(other.obj)) return rv def _safe_tuple(t): @@ -225,7 +225,7 @@ write(typ.__name__) write('({') endchar = '})' - indent += len(typ.__name__) + 1 + indent += _len(typ.__name__) + 1 object = sorted(object, key=_safe_key) if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') @@ -240,7 +240,7 @@ write(endchar) return - if issubclass(typ, str) and len(object) > 0 and r is str.__repr__: + if issubclass(typ, str) and _len(object) > 0 and r is str.__repr__: def _str_parts(s): """ Return a list of string literals comprising the repr() @@ -255,10 +255,10 @@ # A list of alternating (non-space, space) strings parts = re.split(r'(\s+)', line) + [''] current = '' - for i in range(0, len(parts), 2): + for i in range(0, _len(parts), 2): part = parts[i] + parts[i+1] candidate = current + part - if len(repr(candidate)) > max_width: + if _len(repr(candidate)) > max_width: if current: yield repr(current) current = part -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 20:40:52 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 2 Oct 2013 20:40:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319132=3A_Add_vers?= =?utf-8?q?ionchanged_tags=2E?= Message-ID: <3cqmPw47Wyz7LjV@mail.python.org> http://hg.python.org/cpython/rev/6e7b1aadea2f changeset: 85932:6e7b1aadea2f user: Serhiy Storchaka date: Wed Oct 02 21:40:21 2013 +0300 summary: Issue #19132: Add versionchanged tags. files: Doc/library/pprint.rst | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -49,6 +49,9 @@ will be formatted on a separate line. If *compact* is true, as many items as will fit within the *width* will be formatted on each output line. + .. versionchanged:: 3.4 + Added the *compact* parameter. + >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff[:]) @@ -81,6 +84,9 @@ *width*, *depth* and *compact* will be passed to the :class:`PrettyPrinter` constructor as formatting parameters. + .. versionchanged:: 3.4 + Added the *compact* parameter. + .. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ compact=False) @@ -92,6 +98,9 @@ within a scope). *indent*, *width*, *depth* and *compact* will be passed to the :class:`PrettyPrinter` constructor as formatting parameters. + .. versionchanged:: 3.4 + Added the *compact* parameter. + >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 21:22:33 2013 From: python-checkins at python.org (ned.deily) Date: Wed, 2 Oct 2013 21:22:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTQ3?= =?utf-8?q?=3A_Fix_docstring_for_fcntl=2Eflock_to_refer_to_correct_man_sec?= =?utf-8?q?tion=2E?= Message-ID: <3cqnL11Gw6z7LjN@mail.python.org> http://hg.python.org/cpython/rev/43064ded64cb changeset: 85933:43064ded64cb branch: 2.7 parent: 85929:3770c6135400 user: Ned Deily date: Wed Oct 02 12:20:18 2013 -0700 summary: Issue #19147: Fix docstring for fcntl.flock to refer to correct man section. files: Modules/fcntlmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -299,7 +299,7 @@ "flock(fd, operation)\n\ \n\ Perform the lock operation op on file descriptor fd. See the Unix \n\ -manual page for flock(3) for details. (On some systems, this function is\n\ +manual page for flock(2) for details. (On some systems, this function is\n\ emulated using fcntl().)"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 21:22:34 2013 From: python-checkins at python.org (ned.deily) Date: Wed, 2 Oct 2013 21:22:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTQ3?= =?utf-8?q?=3A_Fix_docstring_for_fcntl=2Eflock_to_refer_to_correct_man_sec?= =?utf-8?q?tion=2E?= Message-ID: <3cqnL231lGz7Llp@mail.python.org> http://hg.python.org/cpython/rev/735d8b856928 changeset: 85934:735d8b856928 branch: 3.3 parent: 85927:6237908470fb user: Ned Deily date: Wed Oct 02 12:20:46 2013 -0700 summary: Issue #19147: Fix docstring for fcntl.flock to refer to correct man section. files: Modules/fcntlmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -309,7 +309,7 @@ "flock(fd, operation)\n\ \n\ Perform the lock operation op on file descriptor fd. See the Unix \n\ -manual page for flock(3) for details. (On some systems, this function is\n\ +manual page for flock(2) for details. (On some systems, this function is\n\ emulated using fcntl().)"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 2 21:22:35 2013 From: python-checkins at python.org (ned.deily) Date: Wed, 2 Oct 2013 21:22:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319147=3A_merge_from_3=2E3?= Message-ID: <3cqnL34hzRz7Lm8@mail.python.org> http://hg.python.org/cpython/rev/1cb0c05d71af changeset: 85935:1cb0c05d71af parent: 85932:6e7b1aadea2f parent: 85934:735d8b856928 user: Ned Deily date: Wed Oct 02 12:22:05 2013 -0700 summary: Issue #19147: merge from 3.3 files: Modules/fcntlmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -309,7 +309,7 @@ "flock(fd, operation)\n\ \n\ Perform the lock operation op on file descriptor fd. See the Unix \n\ -manual page for flock(3) for details. (On some systems, this function is\n\ +manual page for flock(2) for details. (On some systems, this function is\n\ emulated using fcntl().)"); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 3 07:06:51 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 03 Oct 2013 07:06:51 +0200 Subject: [Python-checkins] Daily reference leaks (1cb0c05d71af): sum=4 Message-ID: results for 1cb0c05d71af on branch "default" -------------------------------------------- test_site leaked [2, 0, 0] references, sum=2 test_site leaked [2, 0, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogw6N02S', '-x'] From python-checkins at python.org Thu Oct 3 11:13:03 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 3 Oct 2013 11:13:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4MDM3?= =?utf-8?q?=3A_2to3_now_escapes_=27=5Cu=27_and_=27=5CU=27_in_native_string?= =?utf-8?q?s=2E?= Message-ID: <3cr7mH2zzDz7Lkw@mail.python.org> http://hg.python.org/cpython/rev/5e8de100f708 changeset: 85936:5e8de100f708 branch: 2.7 parent: 85933:43064ded64cb user: Serhiy Storchaka date: Thu Oct 03 12:08:22 2013 +0300 summary: Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. files: Lib/lib2to3/fixes/fix_unicode.py | 32 +++++++++++++--- Lib/lib2to3/tests/test_fixers.py | 37 ++++++++++++++++++++ Misc/NEWS | 2 + 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -1,25 +1,43 @@ -"""Fixer that changes unicode to str, unichr to chr, and u"..." into "...". +r"""Fixer for unicode. + +* Changes unicode to str and unichr to chr. + +* If "...\u..." is not unicode literal change it into "...\\u...". + +* Change u"..." into "...". """ -import re from ..pgen2 import token from .. import fixer_base _mapping = {u"unichr" : u"chr", u"unicode" : u"str"} -_literal_re = re.compile(ur"[uU][rR]?[\'\"]") class FixUnicode(fixer_base.BaseFix): BM_compatible = True PATTERN = "STRING | 'unicode' | 'unichr'" + def start_tree(self, tree, filename): + super(FixUnicode, self).start_tree(tree, filename) + self.unicode_literals = 'unicode_literals' in tree.future_features + def transform(self, node, results): if node.type == token.NAME: new = node.clone() new.value = _mapping[node.value] return new elif node.type == token.STRING: - if _literal_re.match(node.value): - new = node.clone() - new.value = new.value[1:] - return new + val = node.value + if (not self.unicode_literals and val[0] in u'rR\'"' and + u'\\' in val): + val = ur'\\'.join([ + v.replace(u'\\u', ur'\\u').replace(u'\\U', ur'\\U') + for v in val.split(ur'\\') + ]) + if val[0] in u'uU': + val = val[1:] + if val == node.value: + return node + new = node.clone() + new.value = val + return new diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2824,6 +2824,43 @@ a = """R'''x''' """ self.check(b, a) + def test_native_literal_escape_u(self): + b = """'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """'\\\\\\\\u20ac\\\\U0001d121\\\\u20ac'""" + self.check(b, a) + + b = """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """r'\\\\\\\\u20ac\\\\U0001d121\\\\u20ac'""" + self.check(b, a) + + def test_bytes_literal_escape_u(self): + b = """b'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """b'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + + b = """br'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """br'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + + def test_unicode_literal_escape_u(self): + b = """u'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + + b = """ur'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + + def test_native_unicode_literal_escape_u(self): + f = 'from __future__ import unicode_literals\n' + b = f + """'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = f + """'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + + b = f + """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + a = f + """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" + self.check(b, a) + class Test_callable(FixerTestCase): fixer = "callable" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,8 @@ Library ------- +- Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. + - Issue #19137: The pprint module now correctly formats empty set and frozenset and instances of set and frozenset subclasses. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 11:13:04 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 3 Oct 2013 11:13:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4MDM3?= =?utf-8?q?=3A_2to3_now_escapes_=27=5Cu=27_and_=27=5CU=27_in_native_string?= =?utf-8?q?s=2E?= Message-ID: <3cr7mJ64qjz7Lkd@mail.python.org> http://hg.python.org/cpython/rev/5950dd4cd9ef changeset: 85937:5950dd4cd9ef branch: 3.3 parent: 85934:735d8b856928 user: Serhiy Storchaka date: Thu Oct 03 12:08:38 2013 +0300 summary: Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. files: Lib/lib2to3/fixes/fix_unicode.py | 32 +++++++++++++--- Lib/lib2to3/tests/test_fixers.py | 37 ++++++++++++++++++++ Misc/NEWS | 2 + 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -1,25 +1,43 @@ -"""Fixer that changes unicode to str, unichr to chr, and u"..." into "...". +r"""Fixer for unicode. + +* Changes unicode to str and unichr to chr. + +* If "...\u..." is not unicode literal change it into "...\\u...". + +* Change u"..." into "...". """ -import re from ..pgen2 import token from .. import fixer_base _mapping = {"unichr" : "chr", "unicode" : "str"} -_literal_re = re.compile(r"[uU][rR]?[\'\"]") class FixUnicode(fixer_base.BaseFix): BM_compatible = True PATTERN = "STRING | 'unicode' | 'unichr'" + def start_tree(self, tree, filename): + super(FixUnicode, self).start_tree(tree, filename) + self.unicode_literals = 'unicode_literals' in tree.future_features + def transform(self, node, results): if node.type == token.NAME: new = node.clone() new.value = _mapping[node.value] return new elif node.type == token.STRING: - if _literal_re.match(node.value): - new = node.clone() - new.value = new.value[1:] - return new + val = node.value + if (not self.unicode_literals and val[0] in 'rR\'"' and + '\\' in val): + val = r'\\'.join([ + v.replace('\\u', r'\\u').replace('\\U', r'\\U') + for v in val.split(r'\\') + ]) + if val[0] in 'uU': + val = val[1:] + if val == node.value: + return node + new = node.clone() + new.value = val + return new diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2824,6 +2824,43 @@ a = """R'''x''' """ self.check(b, a) + def test_native_literal_escape_u(self): + b = r"""'\\\u20ac\U0001d121\\u20ac'""" + a = r"""'\\\\u20ac\\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""r'\\\u20ac\U0001d121\\u20ac'""" + a = r"""r'\\\\u20ac\\U0001d121\\u20ac'""" + self.check(b, a) + + def test_bytes_literal_escape_u(self): + b = r"""b'\\\u20ac\U0001d121\\u20ac'""" + a = r"""b'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""br'\\\u20ac\U0001d121\\u20ac'""" + a = r"""br'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + def test_unicode_literal_escape_u(self): + b = r"""u'\\\u20ac\U0001d121\\u20ac'""" + a = r"""'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""ur'\\\u20ac\U0001d121\\u20ac'""" + a = r"""r'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + def test_native_unicode_literal_escape_u(self): + f = 'from __future__ import unicode_literals\n' + b = f + r"""'\\\u20ac\U0001d121\\u20ac'""" + a = f + r"""'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = f + r"""r'\\\u20ac\U0001d121\\u20ac'""" + a = f + r"""r'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + class Test_callable(FixerTestCase): fixer = "callable" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,8 @@ Library ------- +- Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. + - Issue #19137: The pprint module now correctly formats instances of set and frozenset subclasses. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 11:13:06 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 3 Oct 2013 11:13:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogSXNzdWUgIzE4MDM3OiAydG8zIG5vdyBlc2NhcGVzICdcdScgYW5kICdc?= =?utf-8?q?U=27_in_native_strings=2E?= Message-ID: <3cr7mL1rM0z7LkJ@mail.python.org> http://hg.python.org/cpython/rev/7d3695937362 changeset: 85938:7d3695937362 parent: 85935:1cb0c05d71af parent: 85937:5950dd4cd9ef user: Serhiy Storchaka date: Thu Oct 03 12:10:49 2013 +0300 summary: Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. files: Lib/lib2to3/fixes/fix_unicode.py | 32 +++++++++++++--- Lib/lib2to3/tests/test_fixers.py | 37 ++++++++++++++++++++ Misc/NEWS | 2 + 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -1,25 +1,43 @@ -"""Fixer that changes unicode to str, unichr to chr, and u"..." into "...". +r"""Fixer for unicode. + +* Changes unicode to str and unichr to chr. + +* If "...\u..." is not unicode literal change it into "...\\u...". + +* Change u"..." into "...". """ -import re from ..pgen2 import token from .. import fixer_base _mapping = {"unichr" : "chr", "unicode" : "str"} -_literal_re = re.compile(r"[uU][rR]?[\'\"]") class FixUnicode(fixer_base.BaseFix): BM_compatible = True PATTERN = "STRING | 'unicode' | 'unichr'" + def start_tree(self, tree, filename): + super(FixUnicode, self).start_tree(tree, filename) + self.unicode_literals = 'unicode_literals' in tree.future_features + def transform(self, node, results): if node.type == token.NAME: new = node.clone() new.value = _mapping[node.value] return new elif node.type == token.STRING: - if _literal_re.match(node.value): - new = node.clone() - new.value = new.value[1:] - return new + val = node.value + if (not self.unicode_literals and val[0] in 'rR\'"' and + '\\' in val): + val = r'\\'.join([ + v.replace('\\u', r'\\u').replace('\\U', r'\\U') + for v in val.split(r'\\') + ]) + if val[0] in 'uU': + val = val[1:] + if val == node.value: + return node + new = node.clone() + new.value = val + return new diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2883,6 +2883,43 @@ a = """R'''x''' """ self.check(b, a) + def test_native_literal_escape_u(self): + b = r"""'\\\u20ac\U0001d121\\u20ac'""" + a = r"""'\\\\u20ac\\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""r'\\\u20ac\U0001d121\\u20ac'""" + a = r"""r'\\\\u20ac\\U0001d121\\u20ac'""" + self.check(b, a) + + def test_bytes_literal_escape_u(self): + b = r"""b'\\\u20ac\U0001d121\\u20ac'""" + a = r"""b'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""br'\\\u20ac\U0001d121\\u20ac'""" + a = r"""br'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + def test_unicode_literal_escape_u(self): + b = r"""u'\\\u20ac\U0001d121\\u20ac'""" + a = r"""'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = r"""ur'\\\u20ac\U0001d121\\u20ac'""" + a = r"""r'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + def test_native_unicode_literal_escape_u(self): + f = 'from __future__ import unicode_literals\n' + b = f + r"""'\\\u20ac\U0001d121\\u20ac'""" + a = f + r"""'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + + b = f + r"""r'\\\u20ac\U0001d121\\u20ac'""" + a = f + r"""r'\\\u20ac\U0001d121\\u20ac'""" + self.check(b, a) + class Test_callable(FixerTestCase): fixer = "callable" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -20,6 +20,8 @@ Library ------- +- Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. + - Issue #17839: base64.decodebytes and base64.encodebytes now accept any object that exports a 1 dimensional array of bytes (this means the same is now also true for base64_codec) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 12:52:08 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 3 Oct 2013 12:52:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_results_from_first_tests_?= =?utf-8?q?with_Python_benchmark_suite?= Message-ID: <3cr9yc585Fz7Lk8@mail.python.org> http://hg.python.org/peps/rev/79871c11e6d5 changeset: 5160:79871c11e6d5 user: Christian Heimes date: Thu Oct 03 12:52:00 2013 +0200 summary: Add results from first tests with Python benchmark suite document requirement of 64bit data type explain hash algorithm requirements with RFC 2119 keywords files: pep-0456.txt | 93 +++++++++++++++++++++++++-------------- 1 files changed, 60 insertions(+), 33 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -39,7 +39,7 @@ Embedders may want to choose a more suitable hash function. Finally the current implementation code does not perform well. In the common -case it only processes one or two bytes per cycle. On a modern 64bit processor +case it only processes one or two bytes per cycle. On a modern 64-bit processor the code can easily be adjusted to deal with eight bytes at once. This PEP proposes three major changes to the hash code for strings and bytes: @@ -49,14 +49,42 @@ by well known security and crypto experts, it is safe to assume that its secure for the near future. +* The existing FNV code is kept for platforms without a 64-bit data type. The + algorithm is optimized to process larger chunks per cycle. + * Calculation of the hash of strings and bytes is moved into a single API function instead of multiple specialized implementations in ``Objects/object.c`` and ``Objects/unicodeobject.c``. The function takes a void pointer plus length and returns the hash for it. * The algorithm can be selected by the user with an environment variable, - command line argument or by an embedder with an API function. By default FNV - and SipHash are available for selection. + command line argument or with an API function (for embedders). FNV is + guaranteed to exist on all platforms. SipHash is available on the majority + of modern systems. + + +Requirements for a hash function +================================ + +* It MUST be able to hash arbitrarily large blocks of memory from 1 byte up + to the maximum ``ssize_t`` value. + +* It MUST produce at least 32 bits on 32-bit platforms and at least 64 bits + on 64-bit platforms. (Note: Larger outputs can be compressed with e.g. + ``v ^ (v >> 32)``.) + +* It MUST support hashing of unaligned memory in order to support + hash(memoryview). + +* It MUST NOT return ``-1``. The value is reserved for error cases and yet + uncached hash values. (Note: A special case can be added to map ``-1`` + to ``-2``.) + +* It is highly RECOMMENDED that the length of the input influences the + outcome, so that ``hash(b'\00') != hash(b'\x00\x00')``. + +* It MAY return ``0`` for zero length input in order to disguise the + randomization seed. (Note: This can be handled as special case, too.) Current implementation with modified FNV @@ -125,28 +153,6 @@ function makes it impossible to conceal the secrets. -Requirements for a hash function -================================ - - - -* It must be able to hash arbitrarily large blocks of memory from 1 bytes up - to the maximum ``ssize_t`` value. - -* It must produce at least 32bit values on 32bit platforms and at least 64bit - values on 64bit platforms. (Note: Larger outputs can be compressed with e.g. - ``v ^ (v >> 32)``.) - -* It must support hashing of unaligned memory in order to support - hash(memoryview). - -* It must not return ``-1``. It` either stands for error or missing hash value. - (Note: A special case can be added to map ``-1`` to ``-2``.) - -* It should return ``0`` for zero length input. (Note: This can be handled as - special case, too.) - - Examined hashing algorithms =========================== @@ -157,7 +163,7 @@ ------- SipHash [sip]_ is a cryptographic pseudo random function with a 128bit seed and -64bit output. It was designed by Jean-Philippe Aumasson and Daniel J. +64-bit output. It was designed by Jean-Philippe Aumasson and Daniel J. Bernstein as a fast and secure keyed hash algorithm. It's used by Ruby, Perl, OpenDNS, Rust, Redis, FreeBSD and more. The C reference implementation has been released under CC0 license (public domain). @@ -181,6 +187,9 @@ unsigned long src_sz, const char k[16]); +SipHash requires a 64-bit data type and is not compatible with pure C89 +platforms. + MurmurHash ---------- @@ -188,7 +197,7 @@ MurmurHash [murmur]_ is a family of non-cryptographic keyed hash function developed by Austin Appleby. Murmur3 is the latest and fast variant of MurmurHash. The C++ reference implementation has been released into public -domain. It features 32 or 128bit output with a 32bit seed. (Note: The out +domain. It features 32 or 128bit output with a 32-bit seed. (Note: The out parameter is a buffer with either 1 or 4 bytes.) Murmur3's function prototypes are:: @@ -208,6 +217,9 @@ uint32_t seed, void *out); +The 128bit variants requires a 64-bit data type and are not compatible with +pure C89 platforms. The 32-bit variant is fully C89-compatible. + Aumasson, Bernstein and Bo?let have shown [sip]_ [ocert-2012-001]_ that Murmur3 is not resilient against hash collision attacks. Therefore Murmur3 can no longer be considered as secure algorithm. It still may be an @@ -220,15 +232,18 @@ Geoff Pike and Jyrki Alakuijala for Google. The C++ reference implementation has been released under MIT license. The algorithm is partly based on MurmurHash and claims to be faster. It supports 64 and 128 bit output with a -128bit seed as well as 32bit output without seed. +128bit seed as well as 32-bit output without seed. -:: +The relevant function prototype for 64-bit CityHash with 128bit seed is:: uint64 CityHash64WithSeeds(const char *buf, size_t len, uint64 seed0, uint64 seed1) +CityHash also offers SSE 4.2 optimizations with CRC32 intrinsic for long +inputs. All variants except CityHash32 require 64-bit data types. CityHash32 +uses only 32-bit data types but it doesn't support seeding. Like MurmurHash Aumasson, Bernstein and Bo?let have shown [sip]_ a similar weakness in CityHash. @@ -265,9 +280,9 @@ ----------- The ``_Py_HashSecret_t`` type of Python 2.6 to 3.3 has two members with either -32 or 64bit length each. SipHash requires two 64bit unsigned integers as keys. +32 or 64-bit length each. SipHash requires two 64-bit unsigned integers as keys. The typedef will be changed to an union with a guaranteed size of 128bits on -all architectures. On platforms with a 64bit data type it will have two +all architectures. On platforms with a 64-bit data type it will have two ``uint64`` members. Because C89 compatible compilers may not have ``uint64`` the union also has an array of 16 chars. @@ -473,7 +488,7 @@ TBD -First tests suggest that SipHash performs a bit faster on 64bit CPUs when +First tests suggest that SipHash performs a bit faster on 64-bit CPUs when it is feed with medium size byte strings as well as ASCII and UCS2 Unicode strings. For very short strings the setup costs for SipHash dominates its speed but it is still in the same order of magnitude as the current FNV code. @@ -482,10 +497,22 @@ of common keys in dicts of Python classes. Serhiy Storchaka has shown in [issue16427]_ that a modified FNV -implementation with 64bits per cycle is able to process long strings several +implementation with 64-bits per cycle is able to process long strings several times faster than the current FNV implementation. +Grand Unified Python Benchmark Suite +------------------------------------ + +Initial tests with an experimental implementation and the Grand Unified Python +Benchmark Suite have shown minimal deviations. The summarized total runtime +of the benchmark is within 1% of the runtime of an unmodified Python 3.4 +binary. The tests were run on an Intel i7-2860QM machine with a 64-bit Linux +installation. The interpreter was compiled with GCC 4.7 for 64 and 32-bit. + +More benchmarks will be conducted. + + Backwards Compatibility ======================= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 15:15:59 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 3 Oct 2013 15:15:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_internal_size_and_seed_si?= =?utf-8?q?ze_of_hash_algo?= Message-ID: <3crF8b6zxbzSX1@mail.python.org> http://hg.python.org/peps/rev/cc863d6be5b2 changeset: 5161:cc863d6be5b2 user: Christian Heimes date: Thu Oct 03 15:15:51 2013 +0200 summary: Add internal size and seed size of hash algo files: pep-0456.txt | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -312,7 +312,7 @@ function prototype:: - typedef Py_hash_t (*PyHash_func_t)(void *, Py_ssize_t); + typedef Py_hash_t (*PyHash_Func)(const void *, Py_ssize_t); hash function table @@ -321,9 +321,11 @@ type definition:: typedef struct { - PyHash_func_t hashfunc; - char *name; - unsigned int precedence; + PyHash_Func hashfunc; /* function pointer */ + char *name; /* name of the hash algorithm and variant */ + int hash_bits; /* internal size of hash value */ + int seed_bits; /* size of seed input */ + int precedence; /* ranking for auto-selection */ } PyHash_FuncDef; PyAPI_DATA(PyHash_FuncDef *) PyHash_FuncTable; @@ -331,9 +333,9 @@ Implementation:: PyHash_FuncDef hash_func_table[] = { - {fnv, "fnv", 10}, + {fnv, "fnv", 64, 128, 10}, #ifdef PY_UINT64_T - {siphash24, "sip24", 20}, + {siphash24, "sip24", sizeof(Py_hash_t)*8, sizeof(Py_hash_t)*8, 20}, #endif {NULL, NULL}, }; @@ -376,7 +378,11 @@ :: - sys.hash_info(algorithm='siphash24', available=('siphash24', 'fnv')) + sys.hash_info(algorithm='siphash24', + available_algorithms=('siphash24', 'fnv'), + hash_bits=64, + hash_output=64, # sizeof(Py_hash_t)*8 + seed_bits=128) _testcapi -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 16:03:07 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Oct 2013 16:03:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_update_the_API_to_?= =?utf-8?q?its_implementation?= Message-ID: <3crGBz2vn2z7LjP@mail.python.org> http://hg.python.org/peps/rev/67ecc9e4a969 changeset: 5162:67ecc9e4a969 user: Victor Stinner date: Thu Oct 03 16:00:07 2013 +0200 summary: PEP 454: update the API to its implementation * remove Frame, Trace and TraceStats classes * add Metric class * replace start_timer()/stop_timer() with a new Task class * Task can now be scheduled using a threshold on the size of the traced memory, and only called repeat times * add DisplayTop.display() method * a lot of other (minor) changes files: pep-0454.txt | 1094 ++++++++++++++++++++++++------------- 1 files changed, 696 insertions(+), 398 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -71,150 +71,69 @@ API === -To trace most memory blocks allocated by Python, the module should be -enabled as early as possible by calling ``tracemalloc.enable()`` -function, by setting the ``PYTHONTRACEMALLOC`` environment variable to -``1``, or by using ``-X tracemalloc`` command line option. +To trace most memory blocks allocated by Python, the module should be enabled +as early as possible by setting the ``PYTHONTRACEMALLOC`` environment +variable to ``1``, or by using ``-X tracemalloc`` command line +option. The ``tracemalloc.enable`` function can also be called to start +tracing Python memory allocations. -By default, the ``Trace.traceback`` attribute only stores one ``Frame`` -instance per allocated memory block. Use ``set_traceback_limit()`` to -store more frames. +By default, a trace of an allocated memory block only stores one frame. Use the +``set_traceback_limit`` function to store more frames. +Python memory blocks allocated in the ``tracemalloc`` module are ignored by +default using a filter. Use the ``clear_filters`` function to see trace +also these memory allocations. -Functions ---------- +At fork, the module is automatically disabled in the child process. -``add_filter(filter)`` function: - Add a new filter on Python memory allocations, *filter* is a - ``Filter`` instance. +Main Functions +-------------- - All inclusive filters are applied at once, a memory allocation is - only ignored if no inclusive filter match its trace. A memory - allocation is ignored if at least one exclusive filter matchs its - trace. +``cancel_tasks()`` function: - The new filter is not applied on already collected traces. Use - ``clear_traces()`` to ensure that all traces match the new filter. + Cancel all scheduled tasks. - -``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - - Add an inclusive filter: helper for ``add_filter()`` creating a - ``Filter`` instance with ``include`` attribute set to ``True``. - - Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` - only includes memory blocks allocated by the ``tracemalloc`` module. - - -``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - - Add an exclusive filter: helper for ``add_filter()`` creating a - ``Filter`` instance with ``include`` attribute set to ``False``. - - Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` - ignores memory blocks allocated by the ``tracemalloc`` module. - - -``clear_filters()`` function: - - Reset the filter list. + See also the ``get_tasks`` function. ``clear_traces()`` function: - Clear all traces and statistics on Python memory allocations, and - reset the ``get_traced_memory()`` counter. + Clear all traces and statistics on Python memory allocations, and reset the + ``get_arena_size`` and ``get_traced_memory`` counters. ``disable()`` function: - Stop tracing Python memory allocations and stop the timer started by - ``start_timer()``. + Stop tracing Python memory allocations and cancel scheduled tasks. - See also ``enable()`` and ``is_enabled()`` functions. + See also ``enable`` and ``is_enabled`` functions. ``enable()`` function: - Start tracing Python memory allocations. + Start tracing Python memory allocations. - See also ``disable()`` and ``is_enabled()`` functions. + At fork, the module is automatically disabled in the child process. - -``get_filters()`` function: - - Get the filters on Python memory allocations as list of ``Filter`` - instances. - - -``get_traceback_limit()`` function: - - Get the maximum number of ``Frame`` instances stored in the - ``traceback`` attribute of a ``Trace`` instance. - - Use ``set_traceback_limit()`` to change the limit. - - -``get_object_address(obj)`` function: - - Get the address of the memory block of the specified Python object. - - -``get_object_trace(obj)`` function: - - Get the trace of a Python object *obj* as a ``Trace`` instance. - - The function only returns the trace of the memory block directly - holding to object. The ``size`` attribute of the trace is smaller - than the total size of the object if the object is composed of more - than one memory block. - - Return ``None`` if the ``tracemalloc`` module did not trace the - allocation of the object. - - See also ``gc.get_referrers()`` and ``sys.getsizeof()`` functions. - - -``get_process_memory()`` function: - - Get the memory usage of the current process as a meminfo namedtuple - with two attributes: - - * ``rss``: Resident Set Size in bytes - * ``vms``: size of the virtual memory in bytes - - Return ``None`` if the platform is not supported. + See also ``disable`` and ``is_enabled`` functions. ``get_stats()`` function: - Get statistics on traced Python memory blocks as a dictionary - ``{filename (str): {line_number (int): stats}}`` where *stats* in a - ``TraceStats`` instance, *filename* and *line_number* can be - ``None``. + Get statistics on traced Python memory blocks as a dictionary ``{filename + (str): {line_number (int): stats}}`` where *stats* in a + ``(size: int, count: int)`` tuple, *filename* and *line_number* can + be ``None``. - Return an empty dictionary if the ``tracemalloc`` module is - disabled. + Return an empty dictionary if the ``tracemalloc`` module is disabled. + See also the ``get_traces`` function. -``get_traced_memory()`` function: - Get the total size of all traced memory blocks allocated by Python. +``get_tasks()`` function: - -``get_tracemalloc_size()`` function: - - Get the memory usage in bytes of the ``tracemalloc`` module. - - -``get_traces(obj)`` function: - - Get all traces of Python memory allocations as a dictionary - ``{address (int): trace}`` where *trace* is a ``Trace`` instance. - - Return an empty dictionary if the ``tracemalloc`` module is - disabled. + Get the list of scheduled tasks, list of ``Task`` instances. ``is_enabled()`` function: @@ -222,485 +141,864 @@ ``True`` if the ``tracemalloc`` module is tracing Python memory allocations, ``False`` otherwise. - See also ``enable()`` and ``disable()`` functions. + See also ``enable`` and ``disable`` functions. -``start_timer(delay: int, func: callable, args: tuple=(), kwargs: dict={})`` function: +Trace Functions +--------------- - Start a timer calling ``func(*args, **kwargs)`` every *delay* - seconds. Enable the ``tracemalloc`` module if it is disabled. The - timer is based on the Python memory allocator, it is not real time. - *func* is called after at least *delay* seconds, it is not called - exactly after *delay* seconds if no Python memory allocation - occurred. The timer has a resolution of 1 second. +``get_traceback_limit()`` function: - If the ``start_timer()`` function is called twice, previous - parameters are replaced. Call the ``stop_timer()`` function to stop - the timer. + Get the maximum number of frames stored in the traceback of a trace of a + memory block. - The ``DisplayTopTask.start()`` and ``TakeSnapshot.start()`` methods - use the ``start_timer()`` function to run regulary a task. + Use the ``set_traceback_limit`` function to change the limit. -``set_traceback_limit(limit: int)`` function: +``get_object_address(obj)`` function: - Set the maximum number of ``Frame`` instances stored in the - ``traceback`` attribute of a ``Trace`` instance. Clear all traces - and statistics on Python memory allocations if the ``tracemalloc`` - module is enabled, + Get the address of the memory block of the specified Python object. - Storing the traceback of each memory allocation has an important - overhead on the memory usage. Example with the Python test suite: - tracing all memory allocations increases the memory usage by - ``+50%`` when storing only 1 frame and ``+150%`` when storing 10 - frames. Use ``get_tracemalloc_size()`` to measure the overhead and - ``add_filter()`` to select which memory allocations are traced. + A Python object can be composed by multiple memory blocks, the function only + returns the address of the main memory block. - Use ``get_traceback_limit()`` to get the current limit. + See also ``get_object_trace`` and ``gc.get_referrers`` functions. -``stop_timer()`` function: +``get_object_trace(obj)`` function: - Stop the timer started by ``start_timer()``. + Get the trace of a Python object *obj* as a ``(size: int, traceback)`` tuple + where *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples, + *filename* and *lineno* can be ``None``. + The function only returns the trace of the main memory block of the object. + The *size* of the trace is smaller than the total size of the object if the + object is composed by more than one memory block. -DisplayTop class + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the object. + + See also ``get_object_address``, ``get_trace``, ``get_traces``, + ``gc.get_referrers`` and ``sys.getsizeof`` functions. + + +``get_trace(address)`` function: + + Get the trace of a memory block as a ``(size: int, traceback)`` tuple where + *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples, + *filename* and *lineno* can be ``None``. + + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the memory block. + + See also ``get_object_trace``, ``get_stats`` and ``get_traces`` + functions. + + +``get_traces()`` function: + + Get all traces of Python memory allocations as a dictionary ``{address + (int): trace}`` where *trace* is a + ``(size: int, traceback)`` and *traceback* is a list of + ``(filename: str, lineno: int)``. + *traceback* can be empty, *filename* and *lineno* can be None. + + Return an empty dictionary if the ``tracemalloc`` module is disabled. + + See also ``get_object_trace``, ``get_stats`` and ``get_trace`` + functions. + + +``set_traceback_limit(nframe: int)`` function: + + Set the maximum number of frames stored in the traceback of a trace of a + memory block. + + Storing the traceback of each memory allocation has an important overhead on + the memory usage. Use the ``get_tracemalloc_memory`` function to measure + the overhead and the ``add_filter`` function to select which memory + allocations are traced. + + Use the ``get_traceback_limit`` function to get the current limit. + + +Filter Functions ---------------- +``add_filter(filter)`` function: + + Add a new filter on Python memory allocations, *filter* is a ``Filter`` + instance. + + All inclusive filters are applied at once, a memory allocation is only + ignored if no inclusive filter match its trace. A memory allocation is + ignored if at least one exclusive filter matchs its trace. + + The new filter is not applied on already collected traces. Use the + ``clear_traces`` function to ensure that all traces match the new + filter. + +``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: + + Add an inclusive filter: helper for the ``add_filter`` method creating a + ``Filter`` instance with the ``Filter.include`` attribute set to + ``True``. + + Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` only + includes memory blocks allocated by the ``tracemalloc`` module. + + +``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: + + Add an exclusive filter: helper for the ``add_filter`` method creating a + ``Filter`` instance with the ``Filter.include`` attribute set to + ``False``. + + Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores + memory blocks allocated by the ``tracemalloc`` module. + + +``clear_filters()`` function: + + Reset the filter list. + + See also the ``get_filters`` function. + + +``get_filters()`` function: + + Get the filters on Python memory allocations as list of ``Filter`` + instances. + + See also the ``clear_filters`` function. + + +Metric Functions +---------------- + +The following functions can be used to add metrics to a snapshot, see +the ``Snapshot.add_metric`` method. + +``get_allocated_blocks()`` function: + + Get the current number of allocated memory blocks. + + +``get_arena_size()`` function: + + Get the size in bytes of traced arenas. + + See also the ``get_pymalloc_stats`` function. + + +``get_process_memory()`` function: + + Get the memory usage of the current process as a ``(rss: int, vms: int)`` + tuple, *rss* is the "Resident Set Size" in bytes and *vms* is the size of + the virtual memory in bytes + + Return ``None`` if the platform is not supported. + + +``get_pymalloc_stats()`` function: + + Get statistics on the ``pymalloc`` allocator as a dictionary. + + +---------------------+-------------------------------------------------------+ + | Key | Description | + +=====================+=======================================================+ + | ``alignment`` | Alignment of addresses returned to the user. | + +---------------------+-------------------------------------------------------+ + | ``threshold`` | Small block threshold in bytes: pymalloc uses | + | | PyMem_RawMalloc() for allocation greater than | + | | threshold. | + +---------------------+-------------------------------------------------------+ + | ``nalloc`` | Number of times object malloc called | + +---------------------+-------------------------------------------------------+ + | ``arena_size`` | Arena size in bytes | + +---------------------+-------------------------------------------------------+ + | ``total_arenas`` | Number of calls to new_arena(): total number of | + | | allocated arenas, including released arenas | + +---------------------+-------------------------------------------------------+ + | ``max_arenas`` | Maximum number of arenas | + +---------------------+-------------------------------------------------------+ + | ``arenas`` | Number of arenas currently allocated | + +---------------------+-------------------------------------------------------+ + | ``allocated_bytes`` | Number of bytes in allocated blocks | + +---------------------+-------------------------------------------------------+ + | ``available_bytes`` | Number of bytes in available blocks in used pools | + +---------------------+-------------------------------------------------------+ + | ``pool_size`` | Pool size in bytes | + +---------------------+-------------------------------------------------------+ + | ``free_pools`` | Number of unused pools | + +---------------------+-------------------------------------------------------+ + | ``pool_headers`` | Number of bytes wasted in pool headers | + +---------------------+-------------------------------------------------------+ + | ``quantization`` | Number of bytes in used and full pools wasted due to | + | | quantization, i.e. the necessarily leftover space at | + | | the ends of used and full pools. | + +---------------------+-------------------------------------------------------+ + | ``arena_alignment`` | Number of bytes for arena alignment padding | + +---------------------+-------------------------------------------------------+ + + The function is not available if Python is compiled without ``pymalloc``. + + See also ``get_arena_size`` and ``sys._debugmallocstats`` functions. + + +``get_traced_memory()`` function: + + Get the current size and maximum size of memory blocks traced by the + ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. + + +``get_tracemalloc_memory()`` function: + + Get the memory usage in bytes of the ``tracemalloc`` module as a + tuple: ``(size: int, free: int)``. + + * *size*: total size of bytes allocated by the module, + including *free* bytes + * *free*: number of free bytes available to store data + + +``get_unicode_interned()`` function: + + Get the size in bytes and the length of the dictionary of Unicode interned + strings as a ``(size: int, length: int)`` tuple. + + +DisplayTop +---------- + ``DisplayTop()`` class: Display the top of allocated memory blocks. -``display_snapshot(snapshot, count=10, group_by="filename_lineno", cumulative=False, file=None)`` method: +``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method: - Display a snapshot of memory blocks allocated by Python, *snapshot* - is a ``Snapshot`` instance. + Take a snapshot and display the top *count* biggest allocated memory + blocks grouped by *group_by*. + + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the newly + created snapshot instance. Use the ``Snapshot.add_metric`` method to + add new metric. + + Return the snapshot, a ``Snapshot`` instance. + +``display_snapshot(snapshot, count=10, group_by="line", cumulative=False, file=None)`` method: + + Display a snapshot of memory blocks allocated by Python, *snapshot* is a + ``Snapshot`` instance. ``display_top_diff(top_diff, count=10, file=None)`` method: - Display differences between two ``GroupedStats`` instances, - *top_diff* is a ``StatsDiff`` instance. + Display differences between two ``GroupedStats`` instances, + *top_diff* is a ``StatsDiff`` instance. ``display_top_stats(top_stats, count=10, file=None)`` method: - Display the top of allocated memory blocks grouped by the - ``group_by`` attribute of *top_stats*, *top_stats* is a - ``GroupedStats`` instance. + Display the top of allocated memory blocks grouped by the + ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a + ``GroupedStats`` instance. + +``average`` attribute: + + If ``True`` (default value), display the average size of memory blocks. ``color`` attribute: - If ``True``, always use colors. If ``False``, never use colors. The - default value is ``None``: use colors if the *file* parameter is a - TTY device. + If ``True``, always use colors. If ``False``, never use colors. The + default value is ``None``: use colors if the *file* parameter is a TTY + device. -``compare_with_previous`` attribute: +``compare_to_previous`` attribute: - If ``True`` (default value), compare with the previous snapshot. If - ``False``, compare with the first snapshot. + If ``True`` (default value), compare to the previous snapshot. If + ``False``, compare to the first snapshot. + +``count`` attribute: + + If ``True`` (default value), display the number of allocated memory + blocks. ``filename_parts`` attribute: - Number of displayed filename parts (int, default: ``3``). Extra - parts are replaced with ``'...'``. + Number of displayed filename parts (int, default: ``3``). Extra parts + are replaced with ``'...'``. -``show_average`` attribute: +``metrics`` attribute: - If ``True`` (default value), display the average size of memory blocks. + If ``True`` (default value), display metrics: see + ``Snapshot.metrics``. -``show_count`` attribute: +``previous_top_stats`` attribute: - If ``True`` (default value), display the number of allocated memory - blocks. + Previous ``GroupedStats`` instance, or first ``GroupedStats`` + instance if ``compare_to_previous`` is ``False``, used to display the + differences between two snapshots. -``show_size`` attribute: +``size`` attribute: - If ``True`` (default value), display the size of memory blocks. + If ``True`` (default value), display the size of memory blocks. -DisplayTopTask class --------------------- +DisplayTopTask +-------------- -``DisplayTopTask(count=10, group_by="filename_lineno", cumulative=False, file=sys.stdout, user_data_callback=None)`` class: +``DisplayTopTask(count=10, group_by="line", cumulative=False, file=sys.stdout, callback=None)`` class: - Task taking temporary snapshots and displaying the top *count* - memory allocations grouped by *group_by*. + Task taking temporary snapshots and displaying the top *count* memory + allocations grouped by *group_by*. - Call the ``start()`` method to start the task. + ``DisplayTopTask`` is based on the ``Task`` class and so inherit + all attributes and methods, especially: + + * ``Task.cancel`` + * ``Task.schedule`` + * ``Task.set_delay`` + * ``Task.set_memory_threshold`` + + Modify the ``display_top`` attribute to customize the display. ``display()`` method: - Take a snapshot and display the top *count* biggest allocated memory - blocks grouped by *group_by* using the ``display_top`` attribute. + Take a snapshot and display the top ``count`` biggest allocated + memory blocks grouped by ``group_by`` using the ``display_top`` + attribute. - Return the snapshot, a ``Snapshot`` instance. + Return the snapshot, a ``Snapshot`` instance. -``start(delay: int)`` method: +``callback`` attribute: - Start a task using the ``start_timer()`` function calling the - ``display()`` method every *delay* seconds. - -``stop()`` method: - - Stop the task started by the ``start()`` method using the - ``stop_timer()`` function. + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the newly + created snapshot instance. Use the ``Snapshot.add_metric`` method to + add new metric. ``count`` attribute: - Maximum number of displayed memory blocks. + Maximum number of displayed memory blocks. ``cumulative`` attribute: - If ``True``, cumulate size and count of memory blocks of all frames - of each ``Trace`` instance, not only the most recent frame. The - default value is ``False``. + If ``True``, cumulate size and count of memory blocks of all frames of + each trace, not only the most recent frame. The default value is + ``False``. - The option is ignored if the traceback limit is ``1``, see the - ``get_traceback_limit()`` function. + The option is ignored if the traceback limit is less than ``2``, see + the ``get_traceback_limit`` function. ``display_top`` attribute: - Instance of ``DisplayTop``. + Instance of ``DisplayTop``. ``file`` attribute: - The top is written into *file*. + The top is written into *file*. ``group_by`` attribute: - Determine how memory allocations are grouped: see - ``Snapshot.top_by`` for the available values. + Determine how memory allocations are grouped: see ``Snapshot.top_by`` + for the available values. -``user_data_callback`` attribute: - Optional callback collecting user data (callable, default: - ``None``). See ``Snapshot.create()``. - - -Filter class ------------- +Filter +------ ``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class: - Filter to select which memory allocations are traced. Filters can be - used to reduce the memory usage of the ``tracemalloc`` module, which - can be read using ``get_tracemalloc_size()``. - -``match_trace(trace)`` method: - - Return ``True`` if the ``Trace`` instance must be kept according to - the filter, ``False`` otherwise. + Filter to select which memory allocations are traced. Filters can be used to + reduce the memory usage of the ``tracemalloc`` module, which can be read + using the ``get_tracemalloc_memory`` function. ``match(filename: str, lineno: int)`` method: - Return ``True`` if the filename and line number must be kept - according to the filter, ``False`` otherwise. + Return ``True`` if the filter matchs the filename and line number, + ``False`` otherwise. ``match_filename(filename: str)`` method: - Return ``True`` if the filename must be kept according to the - filter, ``False`` otherwise. + Return ``True`` if the filter matchs the filename, ``False`` otherwise. ``match_lineno(lineno: int)`` method: - Return ``True`` if the line number must be kept according to the - filter, ``False`` otherwise. + Return ``True`` if the filter matchs the line number, ``False`` + otherwise. + +``match_traceback(traceback)`` method: + + Return ``True`` if the filter matchs the *traceback*, ``False`` + otherwise. + + *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples. ``include`` attribute: - If *include* is ``True``, only trace memory blocks allocated in a - file with a name matching filename ``pattern`` at line number - ``lineno``. If *include* is ``False``, ignore memory blocks - allocated in a file with a name matching filename :attr`pattern` at - line number ``lineno``. + If *include* is ``True``, only trace memory blocks allocated in a file + with a name matching filename ``pattern`` at line number + ``lineno``. + + If *include* is ``False``, ignore memory blocks allocated in a file with + a name matching filename :attr`pattern` at line number ``lineno``. + +``lineno`` attribute: + + Line number (``int``). If is is ``None`` or less than ``1``, it matches + any line number. ``pattern`` attribute: - The filename *pattern* can contain one or many ``*`` joker - characters which match any substring, including an empty string. The - ``.pyc`` and ``.pyo`` suffixes are replaced with ``.py``. On - Windows, the comparison is case insensitive and the alternative - separator ``/`` is replaced with the standard separator ``\``. - -``lineno`` attribute: - - Line number (``int``). If is is ``None`` or lesser than ``1``, it - matches any line number. + The filename *pattern* can contain one or many ``*`` joker characters + which match any substring, including an empty string. The ``.pyc`` and + ``.pyo`` file extensions are replaced with ``.py``. On Windows, the + comparison is case insensitive and the alternative separator ``/`` is + replaced with the standard separator ``\``. ``traceback`` attribute: - If *traceback* is ``True``, all frames of the ``traceback`` - attribute of ``Trace`` instances are checked. If *traceback* is - ``False``, only the most recent frame is checked. + If *traceback* is ``True``, all frames of the traceback are checked. If + *traceback* is ``False``, only the most recent frame is checked. - This attribute only has an effect on the ``match_trace()`` method - and only if the traceback limit is greater than ``1``. See the - ``get_traceback_limit()`` function. + This attribute is ignored if the traceback limit is less than ``2``. + See the ``get_traceback_limit`` function. -Frame class ------------ +GroupedStats +------------ -``Frame`` class: +``GroupedStats(timestamp: datetime.datetime, stats: dict, group_by: str, cumulative=False, metrics: dict=None)`` class: - Trace of a Python frame, used by ``Trace.traceback`` attribute. + Top of allocated memory blocks grouped by *group_by* as a dictionary. -``filename`` attribute: - - Python filename, ``None`` if unknown. - -``lineno`` attribute: - - Python line number, ``None`` if unknown. - - -GroupedStats class ------------------- - -``GroupedStats(stats: dict, group_by: str, cumulative=False, timestamp=None, process_memory=None, tracemalloc_size=None)`` class: - - Top of allocated memory blocks grouped by on *group_by* as a - dictionary. - - The ``Snapshot.top_by()`` method creates a ``GroupedStats`` instance. + The ``Snapshot.top_by`` method creates a ``GroupedStats`` instance. ``compare_to(old_stats: GroupedStats=None)`` method: - Compare to an older ``GroupedStats`` instance. Return a - ``StatsDiff`` instance. + Compare to an older ``GroupedStats`` instance. + Return a ``StatsDiff`` instance. + + The ``StatsDiff.differences`` list is not sorted: call + the ``StatsDiff.sort`` method to sort the list. + + ``None`` values are replaced with an empty string for filenames or zero + for line numbers, because ``str`` and ``int`` cannot be + compared to ``None``. ``cumulative`` attribute: - If ``True``, cumulate size and count of memory blocks of all frames - of ``Trace``, not only the most recent frame. + If ``True``, cumulate size and count of memory blocks of all frames of + the traceback of a trace, not only the most recent frame. + +``metrics`` attribute: + + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``group_by`` attribute: - Determine how memory allocations were grouped. The type of ``stats`` - keys depends on *group_by*: - - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== - - See the *group_by* parameter of the ``Snapshot.top_by()`` method. + Determine how memory allocations were grouped: see + ``Snapshot.top_by`` for the available values. ``stats`` attribute: - Dictionary ``{key: stats}`` where the *key* type depends on the - ``group_by`` attribute and *stats* type is ``TraceStats``. + Dictionary ``{key: stats}`` where the *key* type depends on the + ``group_by`` attribute and *stats* is a ``(size: int, count: int)`` + tuple. -``process_memory`` attribute: - - Result of the ``get_process_memory()`` function, can be ``None``. + See the ``Snapshot.top_by`` method. ``timestamp`` attribute: - Creation date and time of the snapshot, ``datetime.datetime`` - instance. + Creation date and time of the snapshot, ``datetime.datetime`` + instance. -``tracemalloc_size`` attribute: - The memory usage in bytes of the ``tracemalloc`` module, result of - the ``get_tracemalloc_size()`` function. +Metric +------ +``Metric(name: str, value: int, format: str)`` class: -Snapshot class --------------- + Value of a metric when a snapshot is created. -``Snapshot`` class: +``name`` attribute: - Snapshot of memory blocks allocated by Python. + Name of the metric. - Use ``TakeSnapshot`` to take regulary snapshots. +``value`` attribute: + + Value of the metric. + +``format`` attribute: + + Format of the metric: + + * ``int``: a number + * ``percent``: percentage (1.0 means 100%) + * ``size``: a size in bytes + + +Snapshot +-------- + +``Snapshot(timestamp: datetime.datetime, pid: int, traces: dict=None, stats: dict=None, metrics: dict=None)`` class: + + Snapshot of traces and statistics on memory blocks allocated by Python. + + Use ``TakeSnapshotTask`` to take regulary snapshots. + +``add_gc_metrics()`` method: + + Add a metric on garbage collector: + + * ``gc.objects``: total number of Python objects + + See the ``gc`` module. + + +``add_metric(name: str, value: int, format: str)`` method: + + Helper to add a ``Metric`` instance to ``Snapshot.metrics``. + Return the newly created ``Metric`` instance. + + Raise an exception if the name is already present in + ``Snapshot.metrics``. + + +``add_process_memory_metrics()`` method: + + Add metrics on the process memory: + + * ``process_memory.rss``: Resident Set Size + * ``process_memory.vms``: Virtual Memory Size + + These metrics are only available if the ``get_process_memory`` + function is available on the platform. + + +``add_pymalloc_metrics()`` method: + + Add metrics on the Python memory allocator (``pymalloc``): + + * ``pymalloc.blocks``: number of allocated memory blocks + * ``pymalloc.size``: size of ``pymalloc`` arenas + * ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas + * ``pymalloc.allocated``: number of allocated bytes + * ``pymalloc.free``: number of free bytes + * ``pymalloc.fragmentation``: fragmentation percentage of the arenas + + These metrics are only available if Python is compiled in debug mode, + except ``pymalloc.blocks`` which is always available. + + +``add_tracemalloc_metrics()`` method: + + Add metrics on the ``tracemalloc`` module: + + * ``tracemalloc.traced.size``: size of memory blocks traced by the + ``tracemalloc`` module + * ``tracemalloc.traced.max_size``: maximum size of memory blocks traced + by the ``tracemalloc`` module + * ``tracemalloc.traces``: number of traces of Python memory blocks + * ``tracemalloc.module.size``: total size of bytes allocated by the + ``tracemalloc`` module, including free bytes + * ``tracemalloc.module.free``: number of free bytes available for + the ``tracemalloc`` module + * ``tracemalloc.module.fragmentation``: percentage of fragmentation of + the memory allocated by the ``tracemalloc`` module + * ``tracemalloc.arena_size``: size of traced arenas + + ``tracemalloc.traces`` metric is only present if the snapshot was created + with traces. + + +``add_unicode_metrics()`` method: + + Add metrics on the Unicode interned strings: + + * ``unicode_interned.size``: size of the dictionary, excluding size + of strings + * ``unicode_interned.len``: length of the dictionary + ``apply_filters(filters)`` method: - Apply a list filters on the ``traces`` and ``stats`` dictionaries, - *filters* is a list of ``Filter`` instances. + Apply filters on the ``traces`` and ``stats`` dictionaries, + *filters* is a list of ``Filter`` instances. -``create(\*, with_traces=False, with_stats=True, user_data_callback=None)`` classmethod: - Take a snapshot of traces and/or statistics of allocated memory - blocks. +``create(traces=False, metrics=True)`` classmethod: - If *with_traces* is ``True``, ``get_traces()`` is called and its - result is stored in the ``traces`` attribute. This attribute - contains more information than ``stats`` and uses more memory and - more disk space. If *with_traces* is ``False``, ``traces`` is set to - ``None``. + Take a snapshot of traces and/or statistics of allocated memory blocks. - If *with_stats* is ``True``, ``get_stats()`` is called and its - result is stored in the ``Snapshot.stats`` attribute. If - *with_stats* is ``False``, ``Snapshot.stats`` is set to ``None``. + If *traces* is ``True``, ``get_traces`` is called and its result + is stored in the ``Snapshot.traces`` attribute. This attribute + contains more information than ``Snapshot.stats`` and uses more + memory and more disk space. If *traces* is ``False``, + ``Snapshot.traces`` is set to ``None``. - *with_traces* and *with_stats* cannot be ``False`` at the same time. + If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics + using the following methods: - *user_data_callback* is an optional callable object. Its result - should be serializable by the ``pickle`` module, or - ``Snapshot.write()`` would fail. If *user_data_callback* is set, it - is called and the result is stored in the ``Snapshot.user_data`` - attribute. Otherwise, ``Snapshot.user_data`` is set to ``None``. + * ``add_gc_metrics`` + * ``add_process_memory_metrics`` + * ``add_pymalloc_metrics`` + * ``add_tracemalloc_metrics`` + * ``add_unicode_metrics`` - The ``tracemalloc`` module must be enabled to take a snapshot. See - the ``enable()`` function. + If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty + dictionary. -``load(filename)`` classmethod: + Tracebacks of traces are limited to ``traceback_limit`` frames. Call + ``set_traceback_limit`` before calling ``Snapshot.create`` to + store more frames. - Load a snapshot from a file. + The ``tracemalloc`` module must be enabled to take a snapshot. See the + the ``enable`` function. + +``get_metric(name, default=None)`` method: + + Get the value of the metric called *name*. Return *default* if the metric + does not exist. + + +``load(filename, traces=True)`` classmethod: + + Load a snapshot from a file. + + If *traces* is ``False``, don't load traces. + ``top_by(group_by: str, cumulative: bool=False)`` method: - Compute top statistics grouped by *group_by* as a ``GroupedStats`` - instance: + Compute top statistics grouped by *group_by* as a ``GroupedStats`` + instance: - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== + ===================== ======================== ============== + group_by description key type + ===================== ======================== ============== + ``'filename'`` filename ``str`` + ``'line'`` filename and line number ``(str, int)`` + ``'address'`` memory block address ``int`` + ===================== ======================== ============== - If *cumulative* is ``True``, cumulate size and count of memory - blocks of all frames of each ``Trace`` instance, not only the most - recent frame. The *cumulative* parameter is ignored if *group_by* is - ``'address'`` or if the traceback limit is ``1``. See the - ``traceback_limit`` attribute. + If *cumulative* is ``True``, cumulate size and count of memory blocks of + all frames of the traceback of a trace, not only the most recent frame. + The *cumulative* parameter is ignored if *group_by* is ``'address'`` or + if the traceback limit is less than ``2``. + ``write(filename)`` method: - Write the snapshot into a file. + Write the snapshot into a file. + + +``metrics`` attribute: + + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``pid`` attribute: - Identifier of the process which created the snapshot, result of - ``os.getpid()``. - -``process_memory`` attribute: - - Memory usage of the current process, result of the - ``get_process_memory()`` function. It can be ``None``. + Identifier of the process which created the snapshot, result of + ``os.getpid``. ``stats`` attribute: - Statistics on traced Python memory, result of the ``get_stats()`` - function, if ``create()`` was called with *with_stats* equals to - ``True``, ``None`` otherwise. - -``tracemalloc_size`` attribute: - - The memory usage in bytes of the ``tracemalloc`` module, result of - the ``get_tracemalloc_size()`` function. + Statistics on traced Python memory, result of the ``get_stats`` + function. ``traceback_limit`` attribute: - The maximum number of frames stored in the ``traceback`` attribute - of a ``Trace``, result of the ``get_traceback_limit()`` function. + Maximum number of frames stored in a trace of a memory block allocated by + Python. ``traces`` attribute: - Traces of Python memory allocations, result of the ``get_traces()`` - function, if ``create()`` was called with *with_traces* equals to - ``True``, ``None`` otherwise. - - The ``traceback`` attribute of each ``Trace`` instance is limited to - ``traceback_limit`` frames. + Traces of Python memory allocations, result of the ``get_traces`` + function, can be ``None``. ``timestamp`` attribute: - Creation date and time of the snapshot, ``datetime.datetime`` - instance. + Creation date and time of the snapshot, ``datetime.datetime`` + instance. -``user_data`` attribute: - Result of *user_data_callback* called in ``Snapshot.create()`` - (default: ``None``). - - -StatsDiff class ---------------- +StatsDiff +--------- ``StatsDiff(differences, old_stats, new_stats)`` class: - Differences between two ``GroupedStats`` instances. By default, the - ``differences`` list is unsorted: call ``sort()`` to sort it. + Differences between two ``GroupedStats`` instances. - The ``GroupedStats.compare_to()`` method creates a ``StatsDiff`` - instance. + The ``GroupedStats.compare_to`` method creates a ``StatsDiff`` + instance. ``sort()`` method: - Sort the ``differences`` list from the biggest allocation to the - smallest. Sort by *size_diff*, *size*, *count_diff*, *count* and - then by *key*. + Sort the ``differences`` list from the biggest difference to the + smallest difference. Sort by ``abs(size_diff)``, *size*, + ``abs(count_diff)``, *count* and then by *key*. ``differences`` attribute: - Differences between ``old_stats`` and ``new_stats`` as a list of - ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, - *size*, *count_diff* and *count* are ``int``. The key type depends - on the ``group_by`` attribute of ``new_stats``: - - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== - - See the ``group_by`` attribute of the ``GroupedStats`` class. + Differences between ``old_stats`` and ``new_stats`` as a list of + ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, + *size*, *count_diff* and *count* are ``int``. The key type depends on the + ``GroupedStats.group_by`` attribute of ``new_stats``: see the + ``Snapshot.top_by`` method. ``old_stats`` attribute: - Old ``GroupedStats`` instance, can be ``None``. + Old ``GroupedStats`` instance, can be ``None``. ``new_stats`` attribute: - New ``GroupedStats`` instance. + New ``GroupedStats`` instance. -Trace class ------------ +Task +---- -``Trace`` class: +``Task(func, \*args, \*\*kw)`` class: - Debug information of a memory block allocated by Python. + Task calling ``func(*args, **kw)``. When scheduled, the task is called when + the traced memory is increased or decreased by more than *threshold* bytes, + or after *delay* seconds. -``size`` attribute: +``call()`` method: - Size in bytes of the memory block. + Call ``func(*args, **kw)`` and return the result. -``traceback`` attribute: - Traceback where the memory block was allocated as a list of - ``Frame`` instances, most recent first. +``cancel()`` method: - The list can be empty or incomplete if the ``tracemalloc`` module - was unable to retrieve the full traceback. + Cancel the task. - The traceback is limited to ``get_traceback_limit()`` frames. Use - ``set_traceback_limit()`` to store more frames. + Do nothing if the task is not scheduled. -TraceStats class +``get_delay()`` method: + + Get the delay in seconds. If the delay is ``None``, the timer is + disabled. + + +``get_memory_threshold()`` method: + + Get the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. The memory threshold is disabled if *threshold* is + ``None``. + + See also the ``set_memory_threshold`` method and the + ``get_traced_memory`` function. + + +``schedule(repeat: int=None)`` method: + + Schedule the task *repeat* times. If *repeat* is ``None``, the task is + rescheduled after each call until it is cancelled. + + If the method is called twice, the task is rescheduled with the new + *repeat* parameter. + + The task must have a memory threshold or a delay: see ``set_delay`` + and ``set_memory_threshold`` methods. The ``tracemalloc`` must be + enabled to schedule a task: see the ``enable`` function. + + The task is cancelled if the ``call`` method raises an exception. + The task can be cancelled using the ``cancel`` method or the + ``cancel_tasks`` function. + + +``set_delay(seconds: int)`` method: + + Set the delay in seconds before the task will be called. Set the delay to + ``None`` to disable the timer. + + The timer is based on the Python memory allocator, it is not real time. + The task is called after at least *delay* seconds, it is not called + exactly after *delay* seconds if no Python memory allocation occurred. + The timer has a resolution of 1 second. + + The task is rescheduled if it was scheduled. + + +``set_memory_threshold(size: int)`` method: + + Set the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. Set the threshold to ``None`` to disable it. + + The task is rescheduled if it was scheduled. + + See also the ``get_memory_threshold`` method and the + ``get_traced_memory`` function. + + +``func`` attribute: + + Function, callable object. + +``func_args`` attribute: + + Function arguments, ``tuple``. + +``func_kwargs`` attribute: + + Function keyword arguments, ``dict``. It can be ``None``. + + +TakeSnapshotTask ---------------- -``TraceStats`` class: +``TakeSnapshotTask(filename_template: str="tracemalloc-$counter.pickle", traces: bool=False, metrics: bool=True, callback: callable=None)`` class: - Statistics on Python memory allocations. + Task taking snapshots of Python memory allocations and writing them into + files. -``size`` attribute: + ``TakeSnapshotTask`` is based on the ``Task`` class and so inherit + all attributes and methods, especially: - Total size in bytes of allocated memory blocks. + * ``Task.cancel`` + * ``Task.schedule`` + * ``Task.set_delay`` + * ``Task.set_memory_threshold`` -``count`` attribute: +``take_snapshot()`` method: - Number of allocated memory blocks. + Take a snapshot and write it into a file. + Return ``(snapshot, filename)`` where *snapshot* is a ``Snapshot`` + instance and filename type is ``str``. + +``callback`` attribute: + + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the newly + created snapshot instance. Use the ``Snapshot.add_metric`` method to + add new metric. + +``filename_template`` attribute: + + Template to create a filename. The template supports the following + variables: + + * ``$pid``: identifier of the current process + * ``$timestamp``: current date and time + * ``$counter``: counter starting at 1 and incremented at each snapshot, + formatted as 4 decimal digits + + The default template is ``tracemalloc-$counter.pickle``. + +``metrics`` attribute: + + Parameter passed to the ``Snapshot.create`` function. + +``traces`` attribute: + + Parameter passed to the ``Snapshot.create`` function. Links -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 16:49:45 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Oct 2013 16:49:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_reformat?= Message-ID: <3crHDn3HkWzRf1@mail.python.org> http://hg.python.org/peps/rev/3bfa25506ef9 changeset: 5163:3bfa25506ef9 user: Victor Stinner date: Thu Oct 03 16:45:04 2013 +0200 summary: PEP 454: reformat * limit of 72 columns * add () to functions and methods files: pep-0454.txt | 886 +++++++++++++++++++------------------- 1 files changed, 447 insertions(+), 439 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -21,17 +21,16 @@ ========= Common debug tools tracing memory allocations read the C filename and -number. Using such tool to analyze Python memory allocations does not -help because most memory block are allocated in the same C function, +line number. Using such tool to analyze Python memory allocations does +not help because most memory block are allocated in the same C function, in ``PyMem_Malloc()`` for example. There are debug tools dedicated to the Python language like ``Heapy`` -and ``PySizer``. These projects analyze objects type and/or content. -These tools are useful when most memory leaks are instances of the -same type and this type is only instancied in a few functions. The -problem is when the object type is very common like ``str`` or -``tuple``, and it is hard to identify where these objects are -instancied. +and ``PySizer``. These tools analyze objects type and/or content. They +are useful when most memory leaks are instances of the same type and +this type is only instantiated in a few functions. The problem is when +the object type is very common like ``str`` or ``tuple``, and it is hard +to identify where these objects are instantiated. Finding reference cycles is also a difficult problem. There are different tools to draw a diagram of all references. These tools cannot @@ -43,18 +42,17 @@ ======== Using the PEP 445, it becomes easy to setup an hook on Python memory -allocators. The hook can inspect the current Python frame to get the -Python filename and line number. +allocators. A hook can inspect Python internals to retrieve the Python +tracebacks. This PEP proposes to add a new ``tracemalloc`` module. It is a debug -tool to trace memory allocations made by Python. The module provides the +tool to trace memory blocks allocated by Python. The module provides the following information: * Compute the differences between two snapshots to detect memory leaks -* Statistics on allocated memory blocks per filename and per line number: - total size, number and average size of allocated memory blocks -* For each allocated memory block: its size and the traceback where the block - was allocated +* Statistics on allocated memory blocks per filename and per line + number: total size, number and average size of allocated memory blocks +* Traceback where a memory block was allocated The API of the tracemalloc module is similar to the API of the faulthandler module: ``enable()``, ``disable()`` and ``is_enabled()`` @@ -71,18 +69,18 @@ API === -To trace most memory blocks allocated by Python, the module should be enabled -as early as possible by setting the ``PYTHONTRACEMALLOC`` environment -variable to ``1``, or by using ``-X tracemalloc`` command line -option. The ``tracemalloc.enable`` function can also be called to start -tracing Python memory allocations. +To trace most memory blocks allocated by Python, the module should be +enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` +environment variable to ``1``, or by using ``-X tracemalloc`` command +line option. The ``tracemalloc.enable`` function can also be called to +start tracing Python memory allocations. -By default, a trace of an allocated memory block only stores one frame. Use the -``set_traceback_limit`` function to store more frames. +By default, a trace of an allocated memory block only stores one frame. +Use the ``set_traceback_limit()`` function to store more frames. -Python memory blocks allocated in the ``tracemalloc`` module are ignored by -default using a filter. Use the ``clear_filters`` function to see trace -also these memory allocations. +Python memory blocks allocated in the ``tracemalloc`` module are ignored +by default using a filter. Use the ``clear_filters()`` function to see +trace also these memory allocations. At fork, the module is automatically disabled in the child process. @@ -92,48 +90,49 @@ ``cancel_tasks()`` function: - Cancel all scheduled tasks. + Cancel all scheduled tasks. - See also the ``get_tasks`` function. + See also the ``get_tasks()`` function. ``clear_traces()`` function: - Clear all traces and statistics on Python memory allocations, and reset the - ``get_arena_size`` and ``get_traced_memory`` counters. + Clear all traces and statistics on Python memory allocations, and + reset the ``get_arena_size()`` and ``get_traced_memory()`` counters. ``disable()`` function: - Stop tracing Python memory allocations and cancel scheduled tasks. + Stop tracing Python memory allocations and cancel scheduled tasks. - See also ``enable`` and ``is_enabled`` functions. + See also ``enable()`` and ``is_enabled()`` functions. ``enable()`` function: - Start tracing Python memory allocations. + Start tracing Python memory allocations. - At fork, the module is automatically disabled in the child process. + At fork, the module is automatically disabled in the child process. - See also ``disable`` and ``is_enabled`` functions. + See also ``disable()`` and ``is_enabled()`` functions. ``get_stats()`` function: - Get statistics on traced Python memory blocks as a dictionary ``{filename - (str): {line_number (int): stats}}`` where *stats* in a - ``(size: int, count: int)`` tuple, *filename* and *line_number* can - be ``None``. + Get statistics on traced Python memory blocks as a dictionary + ``{filename (str): {line_number (int): stats}}`` where *stats* in a + ``(size: int, count: int)`` tuple, *filename* and *line_number* can + be ``None``. - Return an empty dictionary if the ``tracemalloc`` module is disabled. + Return an empty dictionary if the ``tracemalloc`` module is + disabled. - See also the ``get_traces`` function. + See also the ``get_traces()`` function. ``get_tasks()`` function: - Get the list of scheduled tasks, list of ``Task`` instances. + Get the list of scheduled tasks, list of ``Task`` instances. ``is_enabled()`` function: @@ -141,7 +140,7 @@ ``True`` if the ``tracemalloc`` module is tracing Python memory allocations, ``False`` otherwise. - See also ``enable`` and ``disable`` functions. + See also ``enable()`` and ``disable()`` functions. Trace Functions @@ -149,77 +148,79 @@ ``get_traceback_limit()`` function: - Get the maximum number of frames stored in the traceback of a trace of a - memory block. + Get the maximum number of frames stored in the traceback of a trace + of a memory block. - Use the ``set_traceback_limit`` function to change the limit. + Use the ``set_traceback_limit()`` function to change the limit. ``get_object_address(obj)`` function: - Get the address of the memory block of the specified Python object. + Get the address of the memory block of the specified Python object. - A Python object can be composed by multiple memory blocks, the function only - returns the address of the main memory block. + A Python object can be composed by multiple memory blocks, the + function only returns the address of the main memory block. - See also ``get_object_trace`` and ``gc.get_referrers`` functions. + See also ``get_object_trace()`` and ``gc.get_referrers()`` functions. ``get_object_trace(obj)`` function: - Get the trace of a Python object *obj* as a ``(size: int, traceback)`` tuple - where *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples, - *filename* and *lineno* can be ``None``. + Get the trace of a Python object *obj* as a ``(size: int, + traceback)`` tuple where *traceback* is a tuple of ``(filename: str, + lineno: int)`` tuples, *filename* and *lineno* can be ``None``. - The function only returns the trace of the main memory block of the object. - The *size* of the trace is smaller than the total size of the object if the - object is composed by more than one memory block. + The function only returns the trace of the main memory block of the + object. The *size* of the trace is smaller than the total size of + the object if the object is composed by more than one memory block. - Return ``None`` if the ``tracemalloc`` module did not trace the - allocation of the object. + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the object. - See also ``get_object_address``, ``get_trace``, ``get_traces``, - ``gc.get_referrers`` and ``sys.getsizeof`` functions. + See also ``get_object_address()``, ``get_trace()``, + ``get_traces()``, ``gc.get_referrers()`` and ``sys.getsizeof()`` + functions. ``get_trace(address)`` function: - Get the trace of a memory block as a ``(size: int, traceback)`` tuple where - *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples, - *filename* and *lineno* can be ``None``. + Get the trace of a memory block as a ``(size: int, traceback)`` + tuple where *traceback* is a tuple of ``(filename: str, lineno: + int)`` tuples, *filename* and *lineno* can be ``None``. - Return ``None`` if the ``tracemalloc`` module did not trace the - allocation of the memory block. + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the memory block. - See also ``get_object_trace``, ``get_stats`` and ``get_traces`` - functions. + See also ``get_object_trace()``, ``get_stats()`` and + ``get_traces()`` functions. ``get_traces()`` function: - Get all traces of Python memory allocations as a dictionary ``{address - (int): trace}`` where *trace* is a - ``(size: int, traceback)`` and *traceback* is a list of - ``(filename: str, lineno: int)``. - *traceback* can be empty, *filename* and *lineno* can be None. + Get all traces of Python memory allocations as a dictionary + ``{address (int): trace}`` where *trace* is a ``(size: int, + traceback)`` and *traceback* is a list of ``(filename: str, lineno: + int)``. *traceback* can be empty, *filename* and *lineno* can be + None. - Return an empty dictionary if the ``tracemalloc`` module is disabled. + Return an empty dictionary if the ``tracemalloc`` module is + disabled. - See also ``get_object_trace``, ``get_stats`` and ``get_trace`` - functions. + See also ``get_object_trace()``, ``get_stats()`` and ``get_trace()`` + functions. ``set_traceback_limit(nframe: int)`` function: - Set the maximum number of frames stored in the traceback of a trace of a - memory block. + Set the maximum number of frames stored in the traceback of a trace + of a memory block. - Storing the traceback of each memory allocation has an important overhead on - the memory usage. Use the ``get_tracemalloc_memory`` function to measure - the overhead and the ``add_filter`` function to select which memory - allocations are traced. + Storing the traceback of each memory allocation has an important + overhead on the memory usage. Use the ``get_tracemalloc_memory()`` + function to measure the overhead and the ``add_filter()`` function + to select which memory allocations are traced. - Use the ``get_traceback_limit`` function to get the current limit. + Use the ``get_traceback_limit()`` function to get the current limit. Filter Functions @@ -227,145 +228,146 @@ ``add_filter(filter)`` function: - Add a new filter on Python memory allocations, *filter* is a ``Filter`` - instance. + Add a new filter on Python memory allocations, *filter* is a + ``Filter`` instance. - All inclusive filters are applied at once, a memory allocation is only - ignored if no inclusive filter match its trace. A memory allocation is - ignored if at least one exclusive filter matchs its trace. + All inclusive filters are applied at once, a memory allocation is + only ignored if no inclusive filter match its trace. A memory + allocation is ignored if at least one exclusive filter matchs its + trace. - The new filter is not applied on already collected traces. Use the - ``clear_traces`` function to ensure that all traces match the new - filter. + The new filter is not applied on already collected traces. Use the + ``clear_traces()`` function to ensure that all traces match the new + filter. ``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - Add an inclusive filter: helper for the ``add_filter`` method creating a - ``Filter`` instance with the ``Filter.include`` attribute set to - ``True``. + Add an inclusive filter: helper for the ``add_filter()`` method + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``True``. - Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` only - includes memory blocks allocated by the ``tracemalloc`` module. + Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` + only includes memory blocks allocated by the ``tracemalloc`` module. ``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - Add an exclusive filter: helper for the ``add_filter`` method creating a - ``Filter`` instance with the ``Filter.include`` attribute set to - ``False``. + Add an exclusive filter: helper for the ``add_filter()`` method + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``False``. - Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores - memory blocks allocated by the ``tracemalloc`` module. + Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` + ignores memory blocks allocated by the ``tracemalloc`` module. ``clear_filters()`` function: - Reset the filter list. + Reset the filter list. - See also the ``get_filters`` function. + See also the ``get_filters()`` function. ``get_filters()`` function: - Get the filters on Python memory allocations as list of ``Filter`` - instances. + Get the filters on Python memory allocations as list of ``Filter`` + instances. - See also the ``clear_filters`` function. + See also the ``clear_filters()`` function. Metric Functions ---------------- The following functions can be used to add metrics to a snapshot, see -the ``Snapshot.add_metric`` method. +the ``Snapshot.add_metric()`` method. ``get_allocated_blocks()`` function: - Get the current number of allocated memory blocks. + Get the current number of allocated memory blocks. ``get_arena_size()`` function: - Get the size in bytes of traced arenas. + Get the size in bytes of traced arenas. - See also the ``get_pymalloc_stats`` function. + See also the ``get_pymalloc_stats()`` function. ``get_process_memory()`` function: - Get the memory usage of the current process as a ``(rss: int, vms: int)`` - tuple, *rss* is the "Resident Set Size" in bytes and *vms* is the size of - the virtual memory in bytes + Get the memory usage of the current process as a ``(rss: int, vms: + int)`` tuple, *rss* is the "Resident Set Size" in bytes and *vms* is + the size of the virtual memory in bytes - Return ``None`` if the platform is not supported. + Return ``None`` if the platform is not supported. ``get_pymalloc_stats()`` function: - Get statistics on the ``pymalloc`` allocator as a dictionary. + Get statistics on the ``pymalloc`` allocator as a dictionary. - +---------------------+-------------------------------------------------------+ - | Key | Description | - +=====================+=======================================================+ - | ``alignment`` | Alignment of addresses returned to the user. | - +---------------------+-------------------------------------------------------+ - | ``threshold`` | Small block threshold in bytes: pymalloc uses | - | | PyMem_RawMalloc() for allocation greater than | - | | threshold. | - +---------------------+-------------------------------------------------------+ - | ``nalloc`` | Number of times object malloc called | - +---------------------+-------------------------------------------------------+ - | ``arena_size`` | Arena size in bytes | - +---------------------+-------------------------------------------------------+ - | ``total_arenas`` | Number of calls to new_arena(): total number of | - | | allocated arenas, including released arenas | - +---------------------+-------------------------------------------------------+ - | ``max_arenas`` | Maximum number of arenas | - +---------------------+-------------------------------------------------------+ - | ``arenas`` | Number of arenas currently allocated | - +---------------------+-------------------------------------------------------+ - | ``allocated_bytes`` | Number of bytes in allocated blocks | - +---------------------+-------------------------------------------------------+ - | ``available_bytes`` | Number of bytes in available blocks in used pools | - +---------------------+-------------------------------------------------------+ - | ``pool_size`` | Pool size in bytes | - +---------------------+-------------------------------------------------------+ - | ``free_pools`` | Number of unused pools | - +---------------------+-------------------------------------------------------+ - | ``pool_headers`` | Number of bytes wasted in pool headers | - +---------------------+-------------------------------------------------------+ - | ``quantization`` | Number of bytes in used and full pools wasted due to | - | | quantization, i.e. the necessarily leftover space at | - | | the ends of used and full pools. | - +---------------------+-------------------------------------------------------+ - | ``arena_alignment`` | Number of bytes for arena alignment padding | - +---------------------+-------------------------------------------------------+ + +---------------------+-------------------------------------------------------+ + | Key | Description | + +=====================+=======================================================+ + | ``alignment`` | Alignment of addresses returned to the user. | + +---------------------+-------------------------------------------------------+ + | ``threshold`` | Small block threshold in bytes: pymalloc uses | + | | PyMem_RawMalloc() for allocation greater than | + | | threshold. | + +---------------------+-------------------------------------------------------+ + | ``nalloc`` | Number of times object malloc called | + +---------------------+-------------------------------------------------------+ + | ``arena_size`` | Arena size in bytes | + +---------------------+-------------------------------------------------------+ + | ``total_arenas`` | Number of calls to new_arena(): total number of | + | | allocated arenas, including released arenas | + +---------------------+-------------------------------------------------------+ + | ``max_arenas`` | Maximum number of arenas | + +---------------------+-------------------------------------------------------+ + | ``arenas`` | Number of arenas currently allocated | + +---------------------+-------------------------------------------------------+ + | ``allocated_bytes`` | Number of bytes in allocated blocks | + +---------------------+-------------------------------------------------------+ + | ``available_bytes`` | Number of bytes in available blocks in used pools | + +---------------------+-------------------------------------------------------+ + | ``pool_size`` | Pool size in bytes | + +---------------------+-------------------------------------------------------+ + | ``free_pools`` | Number of unused pools | + +---------------------+-------------------------------------------------------+ + | ``pool_headers`` | Number of bytes wasted in pool headers | + +---------------------+-------------------------------------------------------+ + | ``quantization`` | Number of bytes in used and full pools wasted due to | + | | quantization, i.e. the necessarily leftover space at | + | | the ends of used and full pools. | + +---------------------+-------------------------------------------------------+ + | ``arena_alignment`` | Number of bytes for arena alignment padding | + +---------------------+-------------------------------------------------------+ - The function is not available if Python is compiled without ``pymalloc``. + The function is not available if Python is compiled without ``pymalloc``. - See also ``get_arena_size`` and ``sys._debugmallocstats`` functions. + See also ``get_arena_size()`` and ``sys._debugmallocstats()`` functions. ``get_traced_memory()`` function: - Get the current size and maximum size of memory blocks traced by the - ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. + Get the current size and maximum size of memory blocks traced by the + ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. ``get_tracemalloc_memory()`` function: - Get the memory usage in bytes of the ``tracemalloc`` module as a - tuple: ``(size: int, free: int)``. + Get the memory usage in bytes of the ``tracemalloc`` module as a + tuple: ``(size: int, free: int)``. - * *size*: total size of bytes allocated by the module, - including *free* bytes - * *free*: number of free bytes available to store data + * *size*: total size of bytes allocated by the module, + including *free* bytes + * *free*: number of free bytes available to store data ``get_unicode_interned()`` function: - Get the size in bytes and the length of the dictionary of Unicode interned - strings as a ``(size: int, length: int)`` tuple. + Get the size in bytes and the length of the dictionary of Unicode + interned strings as a ``(size: int, length: int)`` tuple. DisplayTop @@ -373,75 +375,76 @@ ``DisplayTop()`` class: - Display the top of allocated memory blocks. + Display the top of allocated memory blocks. ``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method: - Take a snapshot and display the top *count* biggest allocated memory - blocks grouped by *group_by*. + Take a snapshot and display the top *count* biggest allocated memory + blocks grouped by *group_by*. - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the newly - created snapshot instance. Use the ``Snapshot.add_metric`` method to - add new metric. + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. - Return the snapshot, a ``Snapshot`` instance. + Return the snapshot, a ``Snapshot`` instance. ``display_snapshot(snapshot, count=10, group_by="line", cumulative=False, file=None)`` method: - Display a snapshot of memory blocks allocated by Python, *snapshot* is a - ``Snapshot`` instance. + Display a snapshot of memory blocks allocated by Python, *snapshot* + is a ``Snapshot`` instance. ``display_top_diff(top_diff, count=10, file=None)`` method: - Display differences between two ``GroupedStats`` instances, - *top_diff* is a ``StatsDiff`` instance. + Display differences between two ``GroupedStats`` instances, + *top_diff* is a ``StatsDiff`` instance. ``display_top_stats(top_stats, count=10, file=None)`` method: - Display the top of allocated memory blocks grouped by the - ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a - ``GroupedStats`` instance. + Display the top of allocated memory blocks grouped by the + ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a + ``GroupedStats`` instance. ``average`` attribute: - If ``True`` (default value), display the average size of memory blocks. + If ``True`` (default value), display the average size of memory + blocks. ``color`` attribute: - If ``True``, always use colors. If ``False``, never use colors. The - default value is ``None``: use colors if the *file* parameter is a TTY - device. + If ``True``, always use colors. If ``False``, never use colors. The + default value is ``None``: use colors if the *file* parameter is a + TTY device. ``compare_to_previous`` attribute: - If ``True`` (default value), compare to the previous snapshot. If - ``False``, compare to the first snapshot. + If ``True`` (default value), compare to the previous snapshot. If + ``False``, compare to the first snapshot. ``count`` attribute: - If ``True`` (default value), display the number of allocated memory - blocks. + If ``True`` (default value), display the number of allocated memory + blocks. ``filename_parts`` attribute: - Number of displayed filename parts (int, default: ``3``). Extra parts - are replaced with ``'...'``. + Number of displayed filename parts (int, default: ``3``). Extra + parts are replaced with ``'...'``. ``metrics`` attribute: - If ``True`` (default value), display metrics: see - ``Snapshot.metrics``. + If ``True`` (default value), display metrics: see + ``Snapshot.metrics``. ``previous_top_stats`` attribute: - Previous ``GroupedStats`` instance, or first ``GroupedStats`` - instance if ``compare_to_previous`` is ``False``, used to display the - differences between two snapshots. + Previous ``GroupedStats`` instance, or first ``GroupedStats`` + instance if ``compare_to_previous`` is ``False``, used to display + the differences between two snapshots. ``size`` attribute: - If ``True`` (default value), display the size of memory blocks. + If ``True`` (default value), display the size of memory blocks. DisplayTopTask @@ -455,53 +458,53 @@ ``DisplayTopTask`` is based on the ``Task`` class and so inherit all attributes and methods, especially: - * ``Task.cancel`` - * ``Task.schedule`` - * ``Task.set_delay`` - * ``Task.set_memory_threshold`` + * ``Task.cancel()`` + * ``Task.schedule()`` + * ``Task.set_delay()`` + * ``Task.set_memory_threshold()`` Modify the ``display_top`` attribute to customize the display. ``display()`` method: - Take a snapshot and display the top ``count`` biggest allocated - memory blocks grouped by ``group_by`` using the ``display_top`` - attribute. + Take a snapshot and display the top ``count`` biggest allocated + memory blocks grouped by ``group_by`` using the ``display_top`` + attribute. - Return the snapshot, a ``Snapshot`` instance. + Return the snapshot, a ``Snapshot`` instance. ``callback`` attribute: - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the newly - created snapshot instance. Use the ``Snapshot.add_metric`` method to - add new metric. + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. ``count`` attribute: - Maximum number of displayed memory blocks. + Maximum number of displayed memory blocks. ``cumulative`` attribute: - If ``True``, cumulate size and count of memory blocks of all frames of - each trace, not only the most recent frame. The default value is - ``False``. + If ``True``, cumulate size and count of memory blocks of all frames + of each trace, not only the most recent frame. The default value is + ``False``. - The option is ignored if the traceback limit is less than ``2``, see - the ``get_traceback_limit`` function. + The option is ignored if the traceback limit is less than ``2``, see + the ``get_traceback_limit()`` function. ``display_top`` attribute: - Instance of ``DisplayTop``. + Instance of ``DisplayTop``. ``file`` attribute: - The top is written into *file*. + The top is written into *file*. ``group_by`` attribute: - Determine how memory allocations are grouped: see ``Snapshot.top_by`` - for the available values. + Determine how memory allocations are grouped: see + ``Snapshot.top_by()`` for the available values. Filter @@ -509,60 +512,62 @@ ``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class: - Filter to select which memory allocations are traced. Filters can be used to - reduce the memory usage of the ``tracemalloc`` module, which can be read - using the ``get_tracemalloc_memory`` function. + Filter to select which memory allocations are traced. Filters can be + used to reduce the memory usage of the ``tracemalloc`` module, which + can be read using the ``get_tracemalloc_memory()`` function. ``match(filename: str, lineno: int)`` method: - Return ``True`` if the filter matchs the filename and line number, - ``False`` otherwise. + Return ``True`` if the filter matchs the filename and line number, + ``False`` otherwise. ``match_filename(filename: str)`` method: - Return ``True`` if the filter matchs the filename, ``False`` otherwise. + Return ``True`` if the filter matchs the filename, ``False`` + otherwise. ``match_lineno(lineno: int)`` method: - Return ``True`` if the filter matchs the line number, ``False`` - otherwise. + Return ``True`` if the filter matchs the line number, ``False`` + otherwise. ``match_traceback(traceback)`` method: - Return ``True`` if the filter matchs the *traceback*, ``False`` - otherwise. + Return ``True`` if the filter matchs the *traceback*, ``False`` + otherwise. - *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples. + *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples. ``include`` attribute: - If *include* is ``True``, only trace memory blocks allocated in a file - with a name matching filename ``pattern`` at line number - ``lineno``. + If *include* is ``True``, only trace memory blocks allocated in a + file with a name matching filename ``pattern`` at line number + ``lineno``. - If *include* is ``False``, ignore memory blocks allocated in a file with - a name matching filename :attr`pattern` at line number ``lineno``. + If *include* is ``False``, ignore memory blocks allocated in a file + with a name matching filename :attr`pattern` at line number + ``lineno``. ``lineno`` attribute: - Line number (``int``). If is is ``None`` or less than ``1``, it matches - any line number. + Line number (``int``). If is is ``None`` or less than ``1``, it + matches any line number. ``pattern`` attribute: - The filename *pattern* can contain one or many ``*`` joker characters - which match any substring, including an empty string. The ``.pyc`` and - ``.pyo`` file extensions are replaced with ``.py``. On Windows, the - comparison is case insensitive and the alternative separator ``/`` is - replaced with the standard separator ``\``. + The filename *pattern* can contain one or many ``*`` joker + characters which match any substring, including an empty string. The + ``.pyc`` and ``.pyo`` file extensions are replaced with ``.py``. On + Windows, the comparison is case insensitive and the alternative + separator ``/`` is replaced with the standard separator ``\``. ``traceback`` attribute: - If *traceback* is ``True``, all frames of the traceback are checked. If - *traceback* is ``False``, only the most recent frame is checked. + If *traceback* is ``True``, all frames of the traceback are checked. + If *traceback* is ``False``, only the most recent frame is checked. - This attribute is ignored if the traceback limit is less than ``2``. - See the ``get_traceback_limit`` function. + This attribute is ignored if the traceback limit is less than ``2``. + See the ``get_traceback_limit()`` function. GroupedStats @@ -572,47 +577,47 @@ Top of allocated memory blocks grouped by *group_by* as a dictionary. - The ``Snapshot.top_by`` method creates a ``GroupedStats`` instance. + The ``Snapshot.top_by()`` method creates a ``GroupedStats`` instance. ``compare_to(old_stats: GroupedStats=None)`` method: - Compare to an older ``GroupedStats`` instance. - Return a ``StatsDiff`` instance. + Compare to an older ``GroupedStats`` instance. Return a + ``StatsDiff`` instance. - The ``StatsDiff.differences`` list is not sorted: call - the ``StatsDiff.sort`` method to sort the list. + The ``StatsDiff.differences`` list is not sorted: call the + ``StatsDiff.sort`` method to sort the list. - ``None`` values are replaced with an empty string for filenames or zero - for line numbers, because ``str`` and ``int`` cannot be - compared to ``None``. + ``None`` values are replaced with an empty string for filenames or + zero for line numbers, because ``str`` and ``int`` cannot be + compared to ``None``. ``cumulative`` attribute: - If ``True``, cumulate size and count of memory blocks of all frames of - the traceback of a trace, not only the most recent frame. + If ``True``, cumulate size and count of memory blocks of all frames + of the traceback of a trace, not only the most recent frame. ``metrics`` attribute: - Dictionary storing metrics read when the snapshot was created: - ``{name (str): metric}`` where *metric* type is ``Metric``. + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``group_by`` attribute: - Determine how memory allocations were grouped: see - ``Snapshot.top_by`` for the available values. + Determine how memory allocations were grouped: see + ``Snapshot.top_by()`` for the available values. ``stats`` attribute: - Dictionary ``{key: stats}`` where the *key* type depends on the - ``group_by`` attribute and *stats* is a ``(size: int, count: int)`` - tuple. + Dictionary ``{key: stats}`` where the *key* type depends on the + ``group_by`` attribute and *stats* is a ``(size: int, count: int)`` + tuple. - See the ``Snapshot.top_by`` method. + See the ``Snapshot.top_by()`` method. ``timestamp`` attribute: - Creation date and time of the snapshot, ``datetime.datetime`` - instance. + Creation date and time of the snapshot, ``datetime.datetime`` + instance. Metric @@ -620,23 +625,23 @@ ``Metric(name: str, value: int, format: str)`` class: - Value of a metric when a snapshot is created. + Value of a metric when a snapshot is created. ``name`` attribute: - Name of the metric. + Name of the metric. ``value`` attribute: - Value of the metric. + Value of the metric. ``format`` attribute: - Format of the metric: + Format of the metric: - * ``int``: a number - * ``percent``: percentage (1.0 means 100%) - * ``size``: a size in bytes + * ``int``: a number + * ``percent``: percentage (1.0 means 100%) + * ``size``: a size in bytes Snapshot @@ -644,149 +649,151 @@ ``Snapshot(timestamp: datetime.datetime, pid: int, traces: dict=None, stats: dict=None, metrics: dict=None)`` class: - Snapshot of traces and statistics on memory blocks allocated by Python. + Snapshot of traces and statistics on memory blocks allocated by + Python. - Use ``TakeSnapshotTask`` to take regulary snapshots. + Use ``TakeSnapshotTask`` to take regulary snapshots. ``add_gc_metrics()`` method: - Add a metric on garbage collector: + Add a metric on garbage collector: - * ``gc.objects``: total number of Python objects + * ``gc.objects``: total number of Python objects - See the ``gc`` module. + See the ``gc`` module. ``add_metric(name: str, value: int, format: str)`` method: - Helper to add a ``Metric`` instance to ``Snapshot.metrics``. - Return the newly created ``Metric`` instance. + Helper to add a ``Metric`` instance to ``Snapshot.metrics``. Return + the newly created ``Metric`` instance. - Raise an exception if the name is already present in - ``Snapshot.metrics``. + Raise an exception if the name is already present in + ``Snapshot.metrics``. ``add_process_memory_metrics()`` method: - Add metrics on the process memory: + Add metrics on the process memory: - * ``process_memory.rss``: Resident Set Size - * ``process_memory.vms``: Virtual Memory Size + * ``process_memory.rss``: Resident Set Size + * ``process_memory.vms``: Virtual Memory Size - These metrics are only available if the ``get_process_memory`` - function is available on the platform. + These metrics are only available if the ``get_process_memory()`` + function is available on the platform. ``add_pymalloc_metrics()`` method: - Add metrics on the Python memory allocator (``pymalloc``): + Add metrics on the Python memory allocator (``pymalloc``): - * ``pymalloc.blocks``: number of allocated memory blocks - * ``pymalloc.size``: size of ``pymalloc`` arenas - * ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas - * ``pymalloc.allocated``: number of allocated bytes - * ``pymalloc.free``: number of free bytes - * ``pymalloc.fragmentation``: fragmentation percentage of the arenas + * ``pymalloc.blocks``: number of allocated memory blocks + * ``pymalloc.size``: size of ``pymalloc`` arenas + * ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas + * ``pymalloc.allocated``: number of allocated bytes + * ``pymalloc.free``: number of free bytes + * ``pymalloc.fragmentation``: fragmentation percentage of the arenas - These metrics are only available if Python is compiled in debug mode, - except ``pymalloc.blocks`` which is always available. + These metrics are only available if Python is compiled in debug + mode, except ``pymalloc.blocks`` which is always available. ``add_tracemalloc_metrics()`` method: - Add metrics on the ``tracemalloc`` module: + Add metrics on the ``tracemalloc`` module: - * ``tracemalloc.traced.size``: size of memory blocks traced by the - ``tracemalloc`` module - * ``tracemalloc.traced.max_size``: maximum size of memory blocks traced - by the ``tracemalloc`` module - * ``tracemalloc.traces``: number of traces of Python memory blocks - * ``tracemalloc.module.size``: total size of bytes allocated by the - ``tracemalloc`` module, including free bytes - * ``tracemalloc.module.free``: number of free bytes available for - the ``tracemalloc`` module - * ``tracemalloc.module.fragmentation``: percentage of fragmentation of - the memory allocated by the ``tracemalloc`` module - * ``tracemalloc.arena_size``: size of traced arenas + * ``tracemalloc.traced.size``: size of memory blocks traced by the + ``tracemalloc`` module + * ``tracemalloc.traced.max_size``: maximum size of memory blocks + traced by the ``tracemalloc`` module + * ``tracemalloc.traces``: number of traces of Python memory blocks + * ``tracemalloc.module.size``: total size of bytes allocated by the + ``tracemalloc`` module, including free bytes + * ``tracemalloc.module.free``: number of free bytes available for + the ``tracemalloc`` module + * ``tracemalloc.module.fragmentation``: percentage of fragmentation + of the memory allocated by the ``tracemalloc`` module + * ``tracemalloc.arena_size``: size of traced arenas - ``tracemalloc.traces`` metric is only present if the snapshot was created - with traces. + ``tracemalloc.traces`` metric is only present if the snapshot was + created with traces. ``add_unicode_metrics()`` method: - Add metrics on the Unicode interned strings: + Add metrics on the Unicode interned strings: - * ``unicode_interned.size``: size of the dictionary, excluding size - of strings - * ``unicode_interned.len``: length of the dictionary + * ``unicode_interned.size``: size of the dictionary, excluding size + of strings + * ``unicode_interned.len``: length of the dictionary ``apply_filters(filters)`` method: - Apply filters on the ``traces`` and ``stats`` dictionaries, - *filters* is a list of ``Filter`` instances. + Apply filters on the ``traces`` and ``stats`` dictionaries, + *filters* is a list of ``Filter`` instances. ``create(traces=False, metrics=True)`` classmethod: - Take a snapshot of traces and/or statistics of allocated memory blocks. + Take a snapshot of traces and/or statistics of allocated memory + blocks. - If *traces* is ``True``, ``get_traces`` is called and its result - is stored in the ``Snapshot.traces`` attribute. This attribute - contains more information than ``Snapshot.stats`` and uses more - memory and more disk space. If *traces* is ``False``, - ``Snapshot.traces`` is set to ``None``. + If *traces* is ``True``, ``get_traces`` is called and its result is + stored in the ``Snapshot.traces`` attribute. This attribute contains + more information than ``Snapshot.stats`` and uses more memory and + more disk space. If *traces* is ``False``, ``Snapshot.traces`` is + set to ``None``. - If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics - using the following methods: + If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics + using the following methods: - * ``add_gc_metrics`` - * ``add_process_memory_metrics`` - * ``add_pymalloc_metrics`` - * ``add_tracemalloc_metrics`` - * ``add_unicode_metrics`` + * ``add_gc_metrics`` + * ``add_process_memory_metrics`` + * ``add_pymalloc_metrics`` + * ``add_tracemalloc_metrics`` + * ``add_unicode_metrics`` - If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty - dictionary. + If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty + dictionary. - Tracebacks of traces are limited to ``traceback_limit`` frames. Call - ``set_traceback_limit`` before calling ``Snapshot.create`` to - store more frames. + Tracebacks of traces are limited to ``traceback_limit`` frames. Call + ``set_traceback_limit()`` before calling ``Snapshot.create()`` to + store more frames. - The ``tracemalloc`` module must be enabled to take a snapshot. See the - the ``enable`` function. + The ``tracemalloc`` module must be enabled to take a snapshot. See + the the ``enable`` function. ``get_metric(name, default=None)`` method: - Get the value of the metric called *name*. Return *default* if the metric - does not exist. + Get the value of the metric called *name*. Return *default* if the + metric does not exist. ``load(filename, traces=True)`` classmethod: - Load a snapshot from a file. + Load a snapshot from a file. - If *traces* is ``False``, don't load traces. + If *traces* is ``False``, don't load traces. ``top_by(group_by: str, cumulative: bool=False)`` method: - Compute top statistics grouped by *group_by* as a ``GroupedStats`` - instance: + Compute top statistics grouped by *group_by* as a ``GroupedStats`` + instance: - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'line'`` filename and line number ``(str, int)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== + ===================== ======================== ============== + group_by description key type + ===================== ======================== ============== + ``'filename'`` filename ``str`` + ``'line'`` filename and line number ``(str, int)`` + ``'address'`` memory block address ``int`` + ===================== ======================== ============== - If *cumulative* is ``True``, cumulate size and count of memory blocks of - all frames of the traceback of a trace, not only the most recent frame. - The *cumulative* parameter is ignored if *group_by* is ``'address'`` or - if the traceback limit is less than ``2``. + If *cumulative* is ``True``, cumulate size and count of memory + blocks of all frames of the traceback of a trace, not only the most + recent frame. The *cumulative* parameter is ignored if *group_by* + is ``'address'`` or if the traceback limit is less than ``2``. ``write(filename)`` method: @@ -796,33 +803,33 @@ ``metrics`` attribute: - Dictionary storing metrics read when the snapshot was created: - ``{name (str): metric}`` where *metric* type is ``Metric``. + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``pid`` attribute: - Identifier of the process which created the snapshot, result of - ``os.getpid``. + Identifier of the process which created the snapshot, result of + ``os.getpid()``. ``stats`` attribute: - Statistics on traced Python memory, result of the ``get_stats`` - function. + Statistics on traced Python memory, result of the ``get_stats()`` + function. ``traceback_limit`` attribute: - Maximum number of frames stored in a trace of a memory block allocated by - Python. + Maximum number of frames stored in a trace of a memory block + allocated by Python. ``traces`` attribute: - Traces of Python memory allocations, result of the ``get_traces`` - function, can be ``None``. + Traces of Python memory allocations, result of the ``get_traces()`` + function, can be ``None``. ``timestamp`` attribute: - Creation date and time of the snapshot, ``datetime.datetime`` - instance. + Creation date and time of the snapshot, ``datetime.datetime`` + instance. StatsDiff @@ -830,32 +837,32 @@ ``StatsDiff(differences, old_stats, new_stats)`` class: - Differences between two ``GroupedStats`` instances. + Differences between two ``GroupedStats`` instances. - The ``GroupedStats.compare_to`` method creates a ``StatsDiff`` - instance. + The ``GroupedStats.compare_to`` method creates a ``StatsDiff`` + instance. ``sort()`` method: - Sort the ``differences`` list from the biggest difference to the - smallest difference. Sort by ``abs(size_diff)``, *size*, - ``abs(count_diff)``, *count* and then by *key*. + Sort the ``differences`` list from the biggest difference to the + smallest difference. Sort by ``abs(size_diff)``, *size*, + ``abs(count_diff)``, *count* and then by *key*. ``differences`` attribute: - Differences between ``old_stats`` and ``new_stats`` as a list of - ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, - *size*, *count_diff* and *count* are ``int``. The key type depends on the - ``GroupedStats.group_by`` attribute of ``new_stats``: see the - ``Snapshot.top_by`` method. + Differences between ``old_stats`` and ``new_stats`` as a list of + ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, + *size*, *count_diff* and *count* are ``int``. The key type depends + on the ``GroupedStats.group_by`` attribute of ``new_stats``: see the + ``Snapshot.top_by()`` method. ``old_stats`` attribute: - Old ``GroupedStats`` instance, can be ``None``. + Old ``GroupedStats`` instance, can be ``None``. ``new_stats`` attribute: - New ``GroupedStats`` instance. + New ``GroupedStats`` instance. Task @@ -863,92 +870,93 @@ ``Task(func, \*args, \*\*kw)`` class: - Task calling ``func(*args, **kw)``. When scheduled, the task is called when - the traced memory is increased or decreased by more than *threshold* bytes, - or after *delay* seconds. + Task calling ``func(*args, **kw)``. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes, or after *delay* seconds. ``call()`` method: - Call ``func(*args, **kw)`` and return the result. + Call ``func(*args, **kw)`` and return the result. ``cancel()`` method: - Cancel the task. + Cancel the task. - Do nothing if the task is not scheduled. + Do nothing if the task is not scheduled. ``get_delay()`` method: - Get the delay in seconds. If the delay is ``None``, the timer is - disabled. + Get the delay in seconds. If the delay is ``None``, the timer is + disabled. ``get_memory_threshold()`` method: - Get the threshold of the traced memory. When scheduled, the task is - called when the traced memory is increased or decreased by more than - *threshold* bytes. The memory threshold is disabled if *threshold* is - ``None``. + Get the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. The memory threshold is disabled if *threshold* + is ``None``. - See also the ``set_memory_threshold`` method and the - ``get_traced_memory`` function. + See also the ``set_memory_threshold()`` method and the + ``get_traced_memory()`` function. ``schedule(repeat: int=None)`` method: - Schedule the task *repeat* times. If *repeat* is ``None``, the task is - rescheduled after each call until it is cancelled. + Schedule the task *repeat* times. If *repeat* is ``None``, the task + is rescheduled after each call until it is cancelled. - If the method is called twice, the task is rescheduled with the new - *repeat* parameter. + If the method is called twice, the task is rescheduled with the new + *repeat* parameter. - The task must have a memory threshold or a delay: see ``set_delay`` - and ``set_memory_threshold`` methods. The ``tracemalloc`` must be - enabled to schedule a task: see the ``enable`` function. + The task must have a memory threshold or a delay: see + ``set_delay()`` and ``set_memory_threshold()`` methods. The + ``tracemalloc`` must be enabled to schedule a task: see the + ``enable`` function. - The task is cancelled if the ``call`` method raises an exception. - The task can be cancelled using the ``cancel`` method or the - ``cancel_tasks`` function. + The task is cancelled if the ``call()`` method raises an exception. + The task can be cancelled using the ``cancel()`` method or the + ``cancel_tasks()`` function. ``set_delay(seconds: int)`` method: - Set the delay in seconds before the task will be called. Set the delay to - ``None`` to disable the timer. + Set the delay in seconds before the task will be called. Set the + delay to ``None`` to disable the timer. - The timer is based on the Python memory allocator, it is not real time. - The task is called after at least *delay* seconds, it is not called - exactly after *delay* seconds if no Python memory allocation occurred. - The timer has a resolution of 1 second. + The timer is based on the Python memory allocator, it is not real + time. The task is called after at least *delay* seconds, it is not + called exactly after *delay* seconds if no Python memory allocation + occurred. The timer has a resolution of 1 second. - The task is rescheduled if it was scheduled. + The task is rescheduled if it was scheduled. ``set_memory_threshold(size: int)`` method: - Set the threshold of the traced memory. When scheduled, the task is - called when the traced memory is increased or decreased by more than - *threshold* bytes. Set the threshold to ``None`` to disable it. + Set the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. Set the threshold to ``None`` to disable it. - The task is rescheduled if it was scheduled. + The task is rescheduled if it was scheduled. - See also the ``get_memory_threshold`` method and the - ``get_traced_memory`` function. + See also the ``get_memory_threshold()`` method and the + ``get_traced_memory()`` function. ``func`` attribute: - Function, callable object. + Function, callable object. ``func_args`` attribute: - Function arguments, ``tuple``. + Function arguments, ``tuple``. ``func_kwargs`` attribute: - Function keyword arguments, ``dict``. It can be ``None``. + Function keyword arguments, ``dict``. It can be ``None``. TakeSnapshotTask @@ -956,49 +964,49 @@ ``TakeSnapshotTask(filename_template: str="tracemalloc-$counter.pickle", traces: bool=False, metrics: bool=True, callback: callable=None)`` class: - Task taking snapshots of Python memory allocations and writing them into - files. + Task taking snapshots of Python memory allocations and writing them + into files. - ``TakeSnapshotTask`` is based on the ``Task`` class and so inherit - all attributes and methods, especially: + ``TakeSnapshotTask`` is based on the ``Task`` class and so inherit + all attributes and methods, especially: - * ``Task.cancel`` - * ``Task.schedule`` - * ``Task.set_delay`` - * ``Task.set_memory_threshold`` + * ``Task.cancel()`` + * ``Task.schedule()`` + * ``Task.set_delay()`` + * ``Task.set_memory_threshold()`` ``take_snapshot()`` method: - Take a snapshot and write it into a file. - Return ``(snapshot, filename)`` where *snapshot* is a ``Snapshot`` - instance and filename type is ``str``. + Take a snapshot and write it into a file. Return ``(snapshot, + filename)`` where *snapshot* is a ``Snapshot`` instance and filename + type is ``str``. ``callback`` attribute: - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the newly - created snapshot instance. Use the ``Snapshot.add_metric`` method to - add new metric. + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. ``filename_template`` attribute: - Template to create a filename. The template supports the following - variables: + Template to create a filename. The template supports the following + variables: - * ``$pid``: identifier of the current process - * ``$timestamp``: current date and time - * ``$counter``: counter starting at 1 and incremented at each snapshot, - formatted as 4 decimal digits + * ``$pid``: identifier of the current process + * ``$timestamp``: current date and time + * ``$counter``: counter starting at 1 and incremented at each snapshot, + formatted as 4 decimal digits - The default template is ``tracemalloc-$counter.pickle``. + The default template is ``tracemalloc-$counter.pickle``. ``metrics`` attribute: - Parameter passed to the ``Snapshot.create`` function. + Parameter passed to the ``Snapshot.create()`` function. ``traces`` attribute: - Parameter passed to the ``Snapshot.create`` function. + Parameter passed to the ``Snapshot.create()`` function. Links @@ -1020,8 +1028,8 @@ * `PySizer `_: developed for Python 2.4 * `memory_profiler `_ * `pympler `_ -* `Dozer `_: WSGI Middleware version of - the CherryPy memory leak debugger +* `Dozer `_: WSGI Middleware version + of the CherryPy memory leak debugger * `objgraph `_ * `caulk `_ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 16:49:46 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Oct 2013 16:49:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_tracemalloc_is_not?= =?utf-8?q?_ignored_by_default?= Message-ID: <3crHDp5F13zRf1@mail.python.org> http://hg.python.org/peps/rev/8fc916912cd2 changeset: 5164:8fc916912cd2 user: Victor Stinner date: Thu Oct 03 16:49:21 2013 +0200 summary: PEP 454: tracemalloc is not ignored by default files: pep-0454.txt | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -72,15 +72,15 @@ To trace most memory blocks allocated by Python, the module should be enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` environment variable to ``1``, or by using ``-X tracemalloc`` command -line option. The ``tracemalloc.enable`` function can also be called to +line option. The ``tracemalloc.enable()`` function can also be called to start tracing Python memory allocations. By default, a trace of an allocated memory block only stores one frame. Use the ``set_traceback_limit()`` function to store more frames. -Python memory blocks allocated in the ``tracemalloc`` module are ignored -by default using a filter. Use the ``clear_filters()`` function to see -trace also these memory allocations. +Python memory blocks allocated in the ``tracemalloc`` module are also +traced by default. Use ``add_exclude_filter(tracemalloc.__file__)`` to +ignore these these memory allocations. At fork, the module is automatically disabled in the child process. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 17:47:13 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Oct 2013 17:47:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_cleanup?= Message-ID: <3crJW55yj7zSX1@mail.python.org> http://hg.python.org/peps/rev/6af6b504c635 changeset: 5165:6af6b504c635 user: Victor Stinner date: Thu Oct 03 17:47:02 2013 +0200 summary: PEP 454: cleanup files: pep-0454.txt | 20 +++++++++----------- 1 files changed, 9 insertions(+), 11 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -369,6 +369,9 @@ Get the size in bytes and the length of the dictionary of Unicode interned strings as a ``(size: int, length: int)`` tuple. + The size is the size of the dictionary, excluding the size of + strings. + DisplayTop ---------- @@ -421,11 +424,6 @@ If ``True`` (default value), compare to the previous snapshot. If ``False``, compare to the first snapshot. -``count`` attribute: - - If ``True`` (default value), display the number of allocated memory - blocks. - ``filename_parts`` attribute: Number of displayed filename parts (int, default: ``3``). Extra @@ -639,9 +637,9 @@ Format of the metric: - * ``int``: a number - * ``percent``: percentage (1.0 means 100%) - * ``size``: a size in bytes + * ``'int'``: a number + * ``'percent'``: percentage, ``1.0`` means ``100%`` + * ``'size'``: a size in bytes Snapshot @@ -762,7 +760,7 @@ store more frames. The ``tracemalloc`` module must be enabled to take a snapshot. See - the the ``enable`` function. + the the ``enable()`` function. ``get_metric(name, default=None)`` method: @@ -868,7 +866,7 @@ Task ---- -``Task(func, \*args, \*\*kw)`` class: +``Task(func, *args, **kw)`` class: Task calling ``func(*args, **kw)``. When scheduled, the task is called when the traced memory is increased or decreased by more than @@ -998,7 +996,7 @@ * ``$counter``: counter starting at 1 and incremented at each snapshot, formatted as 4 decimal digits - The default template is ``tracemalloc-$counter.pickle``. + The default template is ``'tracemalloc-$counter.pickle'``. ``metrics`` attribute: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 19:59:02 2013 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 3 Oct 2013 19:59:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MDE0?= =?utf-8?q?=3A_memoryview=2Ecast=28=29_is_now_allowed_on_zero-length_views?= =?utf-8?q?=2E?= Message-ID: <3crMRB5f5pz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/b08e092df155 changeset: 85939:b08e092df155 branch: 3.3 parent: 85937:5950dd4cd9ef user: Antoine Pitrou date: Thu Oct 03 19:55:41 2013 +0200 summary: Issue #19014: memoryview.cast() is now allowed on zero-length views. files: Lib/test/test_buffer.py | 13 ++++++++++--- Misc/NEWS | 2 ++ Objects/memoryobject.c | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -2432,15 +2432,22 @@ self.assertRaises(ValueError, get_contiguous, nd[::-1], PyBUF_READ, 'C') def test_memoryview_cast_zero_shape(self): - # Casts are undefined if shape contains zeros. These arrays are - # regarded as C-contiguous by Numpy and PyBuffer_GetContiguous(), - # so they are not caught by the test for C-contiguity in memory_cast(). + # Casts are undefined if buffer is multidimensional and shape + # contains zeros. These arrays are regarded as C-contiguous by + # Numpy and PyBuffer_GetContiguous(), so they are not caught by + # the test for C-contiguity in memory_cast(). items = [1,2,3] for shape in ([0,3,3], [3,0,3], [0,3,3]): ex = ndarray(items, shape=shape) self.assertTrue(ex.c_contiguous) msrc = memoryview(ex) self.assertRaises(TypeError, msrc.cast, 'c') + # Monodimensional empty view can be cast (issue #19014). + for fmt, _, _ in iter_format(1, 'memoryview'): + msrc = memoryview(b'') + m = msrc.cast(fmt) + self.assertEqual(m.tobytes(), b'') + self.assertEqual(m.tolist(), []) def test_memoryview_struct_module(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ Core and Builtins ----------------- +- Issue #19014: memoryview.cast() is now allowed on zero-length views. + - Issue #19098: Prevent overflow in the compiler when the recursion limit is set absurdly high. diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1330,7 +1330,7 @@ "memoryview: casts are restricted to C-contiguous views"); return NULL; } - if (zero_in_shape(self)) { + if ((shape || self->view.ndim != 1) && zero_in_shape(self)) { PyErr_SetString(PyExc_TypeError, "memoryview: cannot cast view with zeros in shape or strides"); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 19:59:04 2013 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 3 Oct 2013 19:59:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319014=3A_memoryview=2Ecast=28=29_is_now_allowed?= =?utf-8?q?_on_zero-length_views=2E?= Message-ID: <3crMRD1R2bz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/1e13a58c1b92 changeset: 85940:1e13a58c1b92 parent: 85938:7d3695937362 parent: 85939:b08e092df155 user: Antoine Pitrou date: Thu Oct 03 19:56:54 2013 +0200 summary: Issue #19014: memoryview.cast() is now allowed on zero-length views. files: Lib/test/test_buffer.py | 13 ++++++++++--- Misc/NEWS | 3 ++- Objects/memoryobject.c | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -2432,15 +2432,22 @@ self.assertRaises(ValueError, get_contiguous, nd[::-1], PyBUF_READ, 'C') def test_memoryview_cast_zero_shape(self): - # Casts are undefined if shape contains zeros. These arrays are - # regarded as C-contiguous by Numpy and PyBuffer_GetContiguous(), - # so they are not caught by the test for C-contiguity in memory_cast(). + # Casts are undefined if buffer is multidimensional and shape + # contains zeros. These arrays are regarded as C-contiguous by + # Numpy and PyBuffer_GetContiguous(), so they are not caught by + # the test for C-contiguity in memory_cast(). items = [1,2,3] for shape in ([0,3,3], [3,0,3], [0,3,3]): ex = ndarray(items, shape=shape) self.assertTrue(ex.c_contiguous) msrc = memoryview(ex) self.assertRaises(TypeError, msrc.cast, 'c') + # Monodimensional empty view can be cast (issue #19014). + for fmt, _, _ in iter_format(1, 'memoryview'): + msrc = memoryview(b'') + m = msrc.cast(fmt) + self.assertEqual(m.tobytes(), b'') + self.assertEqual(m.tolist(), []) def test_memoryview_struct_module(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,13 +10,14 @@ Core and Builtins ----------------- +- Issue #19014: memoryview.cast() is now allowed on zero-length views. + - Issue #18690: memoryview is now automatically registered with collections.abc.Sequence - Issue #19078: memoryview now correctly supports the reversed builtin (Patch by Claudiu Popa) - Library ------- diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1330,7 +1330,7 @@ "memoryview: casts are restricted to C-contiguous views"); return NULL; } - if (zero_in_shape(self)) { + if ((shape || self->view.ndim != 1) && zero_in_shape(self)) { PyErr_SetString(PyExc_TypeError, "memoryview: cannot cast view with zeros in shape or strides"); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 20:29:22 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 20:29:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=5Bissue19951=5D_Fix_docst?= =?utf-8?q?ring_and_use_of_=5Fget=5Fsuppported=5Ffile=5Floaders=28=29_to_r?= =?utf-8?q?eflect?= Message-ID: <3crN6B501nz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/152f72356670 changeset: 85941:152f72356670 user: Eric Snow date: Thu Oct 03 12:08:55 2013 -0600 summary: [issue19951] Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples. files: Lib/importlib/_bootstrap.py | 4 +- Misc/NEWS | 3 + Python/importlib.h | 3862 +++++++++++----------- 3 files changed, 1935 insertions(+), 1934 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -881,7 +881,7 @@ _os.stat(filepath) except OSError: return None - for loader, suffixes, _ in _get_supported_file_loaders(): + for loader, suffixes in _get_supported_file_loaders(): if filepath.endswith(tuple(suffixes)): return loader(fullname, filepath) @@ -1670,7 +1670,7 @@ def _get_supported_file_loaders(): """Returns a list of file-based module loaders. - Each item is a tuple (loader, suffixes, allow_packages). + Each item is a tuple (loader, suffixes). """ extensions = ExtensionFileLoader, _imp.extension_suffixes() source = SourceFileLoader, SOURCE_SUFFIXES diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -358,6 +358,9 @@ - Issue #18598: Tweak exception message for importlib.import_module() to include the module name when a key argument is missing. +- Issue #19951: Fix docstring and use of _get_suppported_file_loaders() to + reflect 2-tuples. + - Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get docstrings and ValueError messages. Patch by Zhongyue Luo diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 20:29:23 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 20:29:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=5Bissue19152=5D_Add_Exten?= =?utf-8?q?sionFileLoader=2Eget=5Ffilename=28=29=2E?= Message-ID: <3crN6C731Xz7Lkb@mail.python.org> http://hg.python.org/cpython/rev/0d079c66dc23 changeset: 85942:0d079c66dc23 user: Eric Snow date: Thu Oct 03 12:08:55 2013 -0600 summary: [issue19152] Add ExtensionFileLoader.get_filename(). files: Doc/library/importlib.rst | 6 +- Lib/importlib/_bootstrap.py | 5 + Lib/importlib/abc.py | 2 + Misc/NEWS | 2 + Python/importlib.h | 2726 +++++++++++----------- 5 files changed, 1384 insertions(+), 1357 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -836,7 +836,7 @@ .. class:: ExtensionFileLoader(fullname, path) - A concrete implementation of :class:`importlib.abc.InspectLoader` for + A concrete implementation of :class:`importlib.abc.ExecutionLoader` for extension modules. The *fullname* argument specifies the name of the module the loader is to @@ -870,6 +870,10 @@ Returns ``None`` as extension modules do not have source code. + .. method:: get_filename(fullname) + + Returns :attr:`path`. + :mod:`importlib.util` -- Utility code for importers --------------------------------------------------- diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1171,6 +1171,11 @@ """Return None as extension modules have no source code.""" return None + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + class _NamespacePath: """Represents a namespace package's path. It uses the module name diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -237,6 +237,8 @@ super().init_module_attrs(module) _bootstrap._init_file_attrs(self, module) +_register(machinery.ExtensionFileLoader) + class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -361,6 +361,8 @@ - Issue #19951: Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples. +- Issue #19152: Add ExtensionFileLoader.get_filename(). + - Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get docstrings and ValueError messages. Patch by Zhongyue Luo diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 20:48:47 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 20:48:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=5Bissue19151=5D_Fix_issue?= =?utf-8?q?_number_in_Misc/NEWS_entry=2E?= Message-ID: <3crNXb2Yrhz7LjS@mail.python.org> http://hg.python.org/cpython/rev/a329474cfe0c changeset: 85943:a329474cfe0c user: Eric Snow date: Thu Oct 03 12:45:04 2013 -0600 summary: [issue19151] Fix issue number in Misc/NEWS entry. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -358,7 +358,7 @@ - Issue #18598: Tweak exception message for importlib.import_module() to include the module name when a key argument is missing. -- Issue #19951: Fix docstring and use of _get_suppported_file_loaders() to +- Issue #19151: Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples. - Issue #19152: Add ExtensionFileLoader.get_filename(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 21:30:33 2013 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 3 Oct 2013 21:30:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_builtin_=22caching?= =?utf-8?q?=22_in_pprint?= Message-ID: <3crPSn4MgCzSp0@mail.python.org> http://hg.python.org/cpython/rev/d926f78cd055 changeset: 85944:d926f78cd055 user: Antoine Pitrou date: Thu Oct 03 21:29:36 2013 +0200 summary: Remove builtin "caching" in pprint files: Lib/pprint.py | 50 +++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 28 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -42,12 +42,6 @@ __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", "PrettyPrinter"] -# cache these for faster access: -_commajoin = ", ".join -_id = id -_len = len -_type = type - def pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False): @@ -96,8 +90,8 @@ rv = NotImplemented if rv is NotImplemented: - rv = (str(_type(self.obj)), _id(self.obj)) < \ - (str(_type(other.obj)), _id(other.obj)) + rv = (str(type(self.obj)), id(self.obj)) < \ + (str(type(other.obj)), id(other.obj)) return rv def _safe_tuple(t): @@ -159,16 +153,16 @@ def _format(self, object, stream, indent, allowance, context, level): level = level + 1 - objid = _id(object) + objid = id(object) if objid in context: stream.write(_recursion(object)) self._recursive = True self._readable = False return rep = self._repr(object, context, level - 1) - typ = _type(object) + typ = type(object) max_width = self._width - 1 - indent - allowance - sepLines = _len(rep) > max_width + sepLines = len(rep) > max_width write = stream.write if sepLines: @@ -177,7 +171,7 @@ write('{') if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') - length = _len(object) + length = len(object) if length: context[objid] = 1 indent = indent + self._indent_per_level @@ -189,13 +183,13 @@ rep = self._repr(key, context, level) write(rep) write(': ') - self._format(ent, stream, indent + _len(rep) + 2, + self._format(ent, stream, indent + len(rep) + 2, allowance + 1, context, level) if length > 1: for key, ent in items[1:]: rep = self._repr(key, context, level) write(',\n%s%s: ' % (' '*indent, rep)) - self._format(ent, stream, indent + _len(rep) + 2, + self._format(ent, stream, indent + len(rep) + 2, allowance + 1, context, level) indent = indent - self._indent_per_level del context[objid] @@ -207,7 +201,7 @@ (issubclass(typ, set) and r is set.__repr__) or (issubclass(typ, frozenset) and r is frozenset.__repr__) ): - length = _len(object) + length = len(object) if issubclass(typ, list): write('[') endchar = ']' @@ -225,7 +219,7 @@ write(typ.__name__) write('({') endchar = '})' - indent += _len(typ.__name__) + 1 + indent += len(typ.__name__) + 1 object = sorted(object, key=_safe_key) if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') @@ -240,7 +234,7 @@ write(endchar) return - if issubclass(typ, str) and _len(object) > 0 and r is str.__repr__: + if issubclass(typ, str) and len(object) > 0 and r is str.__repr__: def _str_parts(s): """ Return a list of string literals comprising the repr() @@ -249,16 +243,16 @@ lines = s.splitlines(True) for i, line in enumerate(lines): rep = repr(line) - if _len(rep) <= max_width: + if len(rep) <= max_width: yield rep else: # A list of alternating (non-space, space) strings parts = re.split(r'(\s+)', line) + [''] current = '' - for i in range(0, _len(parts), 2): + for i in range(0, len(parts), 2): part = parts[i] + parts[i+1] candidate = current + part - if _len(repr(candidate)) > max_width: + if len(repr(candidate)) > max_width: if current: yield repr(current) current = part @@ -281,7 +275,7 @@ for ent in items: if self._compact: rep = self._repr(ent, context, level) - w = _len(rep) + 2 + w = len(rep) + 2 if width < w: width = max_width if delim: @@ -316,7 +310,7 @@ # Return triple (repr_string, isreadable, isrecursive). def _safe_repr(object, context, maxlevels, level): - typ = _type(object) + typ = type(object) if typ is str: if 'locale' not in _sys.modules: return repr(object), True, False @@ -340,7 +334,7 @@ if issubclass(typ, dict) and r is dict.__repr__: if not object: return "{}", True, False - objid = _id(object) + objid = id(object) if maxlevels and level >= maxlevels: return "{...}", False, objid in context if objid in context: @@ -361,7 +355,7 @@ if krecur or vrecur: recursive = True del context[objid] - return "{%s}" % _commajoin(components), readable, recursive + return "{%s}" % ", ".join(components), readable, recursive if (issubclass(typ, list) and r is list.__repr__) or \ (issubclass(typ, tuple) and r is tuple.__repr__): @@ -369,13 +363,13 @@ if not object: return "[]", True, False format = "[%s]" - elif _len(object) == 1: + elif len(object) == 1: format = "(%s,)" else: if not object: return "()", True, False format = "(%s)" - objid = _id(object) + objid = id(object) if maxlevels and level >= maxlevels: return format % "...", False, objid in context if objid in context: @@ -394,7 +388,7 @@ if orecur: recursive = True del context[objid] - return format % _commajoin(components), readable, recursive + return format % ", ".join(components), readable, recursive rep = repr(object) return rep, (rep and not rep.startswith('<')), False @@ -402,7 +396,7 @@ def _recursion(object): return ("" - % (_type(object).__name__, _id(object))) + % (type(object).__name__, id(object))) def _perfcheck(object=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 21:53:20 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 21:53:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogW2lzc3VlMTkxNTFd?= =?utf-8?q?_Fix_docstring_and_use_of_=5Fget=5Fsuppported=5Ffile=5Floaders?= =?utf-8?q?=28=29_to_reflect?= Message-ID: <3crPz44LJ9z7Ljn@mail.python.org> http://hg.python.org/cpython/rev/32b18998a560 changeset: 85945:32b18998a560 branch: 3.3 parent: 85939:b08e092df155 user: Eric Snow date: Thu Oct 03 12:08:55 2013 -0600 summary: [issue19151] Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples. files: Lib/importlib/_bootstrap.py | 4 +- Misc/NEWS | 3 + Python/importlib.h | 5262 +++++++++++----------- 3 files changed, 2635 insertions(+), 2634 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -781,7 +781,7 @@ _os.stat(filepath) except OSError: return None - for loader, suffixes, _ in _get_supported_file_loaders(): + for loader, suffixes in _get_supported_file_loaders(): if filepath.endswith(tuple(suffixes)): return loader(fullname, filepath) @@ -1643,7 +1643,7 @@ def _get_supported_file_loaders(): """Returns a list of file-based module loaders. - Each item is a tuple (loader, suffixes, allow_packages). + Each item is a tuple (loader, suffixes). """ extensions = ExtensionFileLoader, _imp.extension_suffixes() source = SourceFileLoader, SOURCE_SUFFIXES diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -203,6 +203,9 @@ - Issue #18405: Improve the entropy of crypt.mksalt(). +- Issue #19151: Fix docstring and use of _get_suppported_file_loaders() to + reflect 2-tuples. + - Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get docstrings and ValueError messages. Patch by Zhongyue Luo diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 21:53:21 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 21:53:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogW2lzc3VlMTkxNTJd?= =?utf-8?q?_Add_ExtensionFileLoader=2Eget=5Ffilename=28=29=2E?= Message-ID: <3crPz56J86z7Lk4@mail.python.org> http://hg.python.org/cpython/rev/832579dbafd6 changeset: 85946:832579dbafd6 branch: 3.3 user: Eric Snow date: Thu Oct 03 12:08:55 2013 -0600 summary: [issue19152] Add ExtensionFileLoader.get_filename(). files: Doc/library/importlib.rst | 6 +- Lib/importlib/_bootstrap.py | 5 + Lib/importlib/abc.py | 2 + Misc/NEWS | 2 + Python/importlib.h | 402 ++++++++++++----------- 5 files changed, 224 insertions(+), 193 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -800,7 +800,7 @@ .. class:: ExtensionFileLoader(fullname, path) - A concrete implementation of :class:`importlib.abc.InspectLoader` for + A concrete implementation of :class:`importlib.abc.ExecutionLoader` for extension modules. The *fullname* argument specifies the name of the module the loader is to @@ -834,6 +834,10 @@ Returns ``None`` as extension modules do not have source code. + .. method:: get_filename(fullname) + + Returns :attr:`path`. + :mod:`importlib.util` -- Utility code for importers --------------------------------------------------- diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1153,6 +1153,11 @@ """Return None as extension modules have no source code.""" return None + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + class _NamespacePath: """Represents a namespace package's path. It uses the module name diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -168,6 +168,8 @@ set to.""" raise NotImplementedError +_register(machinery.ExtensionFileLoader) + class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -206,6 +206,8 @@ - Issue #19151: Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples. +- Issue #19152: Add ExtensionFileLoader.get_filename(). + - Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get docstrings and ValueError messages. Patch by Zhongyue Luo diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 21:53:23 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 21:53:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge_with_3=2E3=2E?= Message-ID: <3crPz7128yz7LkK@mail.python.org> http://hg.python.org/cpython/rev/f739d1ab5af0 changeset: 85947:f739d1ab5af0 parent: 85943:a329474cfe0c parent: 85946:832579dbafd6 user: Eric Snow date: Thu Oct 03 13:34:40 2013 -0600 summary: Null merge with 3.3. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 21:53:24 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 21:53:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge?= Message-ID: <3crPz83sFMz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/4ce25f33bc84 changeset: 85948:4ce25f33bc84 parent: 85947:f739d1ab5af0 parent: 85944:d926f78cd055 user: Eric Snow date: Thu Oct 03 13:49:12 2013 -0600 summary: Merge files: Lib/pprint.py | 50 +++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 28 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -42,12 +42,6 @@ __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", "PrettyPrinter"] -# cache these for faster access: -_commajoin = ", ".join -_id = id -_len = len -_type = type - def pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False): @@ -96,8 +90,8 @@ rv = NotImplemented if rv is NotImplemented: - rv = (str(_type(self.obj)), _id(self.obj)) < \ - (str(_type(other.obj)), _id(other.obj)) + rv = (str(type(self.obj)), id(self.obj)) < \ + (str(type(other.obj)), id(other.obj)) return rv def _safe_tuple(t): @@ -159,16 +153,16 @@ def _format(self, object, stream, indent, allowance, context, level): level = level + 1 - objid = _id(object) + objid = id(object) if objid in context: stream.write(_recursion(object)) self._recursive = True self._readable = False return rep = self._repr(object, context, level - 1) - typ = _type(object) + typ = type(object) max_width = self._width - 1 - indent - allowance - sepLines = _len(rep) > max_width + sepLines = len(rep) > max_width write = stream.write if sepLines: @@ -177,7 +171,7 @@ write('{') if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') - length = _len(object) + length = len(object) if length: context[objid] = 1 indent = indent + self._indent_per_level @@ -189,13 +183,13 @@ rep = self._repr(key, context, level) write(rep) write(': ') - self._format(ent, stream, indent + _len(rep) + 2, + self._format(ent, stream, indent + len(rep) + 2, allowance + 1, context, level) if length > 1: for key, ent in items[1:]: rep = self._repr(key, context, level) write(',\n%s%s: ' % (' '*indent, rep)) - self._format(ent, stream, indent + _len(rep) + 2, + self._format(ent, stream, indent + len(rep) + 2, allowance + 1, context, level) indent = indent - self._indent_per_level del context[objid] @@ -207,7 +201,7 @@ (issubclass(typ, set) and r is set.__repr__) or (issubclass(typ, frozenset) and r is frozenset.__repr__) ): - length = _len(object) + length = len(object) if issubclass(typ, list): write('[') endchar = ']' @@ -225,7 +219,7 @@ write(typ.__name__) write('({') endchar = '})' - indent += _len(typ.__name__) + 1 + indent += len(typ.__name__) + 1 object = sorted(object, key=_safe_key) if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') @@ -240,7 +234,7 @@ write(endchar) return - if issubclass(typ, str) and _len(object) > 0 and r is str.__repr__: + if issubclass(typ, str) and len(object) > 0 and r is str.__repr__: def _str_parts(s): """ Return a list of string literals comprising the repr() @@ -249,16 +243,16 @@ lines = s.splitlines(True) for i, line in enumerate(lines): rep = repr(line) - if _len(rep) <= max_width: + if len(rep) <= max_width: yield rep else: # A list of alternating (non-space, space) strings parts = re.split(r'(\s+)', line) + [''] current = '' - for i in range(0, _len(parts), 2): + for i in range(0, len(parts), 2): part = parts[i] + parts[i+1] candidate = current + part - if _len(repr(candidate)) > max_width: + if len(repr(candidate)) > max_width: if current: yield repr(current) current = part @@ -281,7 +275,7 @@ for ent in items: if self._compact: rep = self._repr(ent, context, level) - w = _len(rep) + 2 + w = len(rep) + 2 if width < w: width = max_width if delim: @@ -316,7 +310,7 @@ # Return triple (repr_string, isreadable, isrecursive). def _safe_repr(object, context, maxlevels, level): - typ = _type(object) + typ = type(object) if typ is str: if 'locale' not in _sys.modules: return repr(object), True, False @@ -340,7 +334,7 @@ if issubclass(typ, dict) and r is dict.__repr__: if not object: return "{}", True, False - objid = _id(object) + objid = id(object) if maxlevels and level >= maxlevels: return "{...}", False, objid in context if objid in context: @@ -361,7 +355,7 @@ if krecur or vrecur: recursive = True del context[objid] - return "{%s}" % _commajoin(components), readable, recursive + return "{%s}" % ", ".join(components), readable, recursive if (issubclass(typ, list) and r is list.__repr__) or \ (issubclass(typ, tuple) and r is tuple.__repr__): @@ -369,13 +363,13 @@ if not object: return "[]", True, False format = "[%s]" - elif _len(object) == 1: + elif len(object) == 1: format = "(%s,)" else: if not object: return "()", True, False format = "(%s)" - objid = _id(object) + objid = id(object) if maxlevels and level >= maxlevels: return format % "...", False, objid in context if objid in context: @@ -394,7 +388,7 @@ if orecur: recursive = True del context[objid] - return format % _commajoin(components), readable, recursive + return format % ", ".join(components), readable, recursive rep = repr(object) return rep, (rep and not rep.startswith('<')), False @@ -402,7 +396,7 @@ def _recursion(object): return ("" - % (_type(object).__name__, _id(object))) + % (type(object).__name__, id(object))) def _perfcheck(object=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 22:29:29 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 3 Oct 2013 22:29:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Fix_typos?= Message-ID: <3crQmn2pz3zSpD@mail.python.org> http://hg.python.org/peps/rev/3269132cacf3 changeset: 5166:3269132cacf3 parent: 5161:cc863d6be5b2 user: Christian Heimes date: Thu Oct 03 22:07:30 2013 +0200 summary: Fix typos unify use of hyphens in '32-bit', '64-bit' and '128-bit files: pep-0456.txt | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -93,7 +93,7 @@ CPython currently uses uses a variant of the Fowler-Noll-Vo hash function [fnv]_. The variant is has been modified to reduce the amount and cost of hash collisions for common strings. The first character of the string is added -twice, the first time time with a bit shift of 7. The length of the input +twice, the first time with a bit shift of 7. The length of the input string is XOR-ed to the final value. Both deviations from the original FNV algorithm reduce the amount of hash collisions for short strings. @@ -162,8 +162,8 @@ SipHash ------- -SipHash [sip]_ is a cryptographic pseudo random function with a 128bit seed and -64-bit output. It was designed by Jean-Philippe Aumasson and Daniel J. +SipHash [sip]_ is a cryptographic pseudo random function with a 128-bit seed +and 64-bit output. It was designed by Jean-Philippe Aumasson and Daniel J. Bernstein as a fast and secure keyed hash algorithm. It's used by Ruby, Perl, OpenDNS, Rust, Redis, FreeBSD and more. The C reference implementation has been released under CC0 license (public domain). @@ -197,7 +197,7 @@ MurmurHash [murmur]_ is a family of non-cryptographic keyed hash function developed by Austin Appleby. Murmur3 is the latest and fast variant of MurmurHash. The C++ reference implementation has been released into public -domain. It features 32 or 128bit output with a 32-bit seed. (Note: The out +domain. It features 32- or 128-bit output with a 32-bit seed. (Note: The out parameter is a buffer with either 1 or 4 bytes.) Murmur3's function prototypes are:: @@ -217,7 +217,7 @@ uint32_t seed, void *out); -The 128bit variants requires a 64-bit data type and are not compatible with +The 128-bit variants requires a 64-bit data type and are not compatible with pure C89 platforms. The 32-bit variant is fully C89-compatible. Aumasson, Bernstein and Bo?let have shown [sip]_ [ocert-2012-001]_ that @@ -231,10 +231,10 @@ CityHash [city]_ is a family of non-cryptographic hash function developed by Geoff Pike and Jyrki Alakuijala for Google. The C++ reference implementation has been released under MIT license. The algorithm is partly based on -MurmurHash and claims to be faster. It supports 64 and 128 bit output with a -128bit seed as well as 32-bit output without seed. +MurmurHash and claims to be faster. It supports 64- and 128-bit output with a +128-bit seed as well as 32-bit output without seed. -The relevant function prototype for 64-bit CityHash with 128bit seed is:: +The relevant function prototype for 64-bit CityHash with 128-bit seed is:: uint64 CityHash64WithSeeds(const char *buf, size_t len, @@ -274,14 +274,14 @@ C API additions =============== -All C API extension modifications are no part of the stable API. +All C API extension modifications are not part of the stable API. hash secret ----------- The ``_Py_HashSecret_t`` type of Python 2.6 to 3.3 has two members with either -32 or 64-bit length each. SipHash requires two 64-bit unsigned integers as keys. -The typedef will be changed to an union with a guaranteed size of 128bits on +32- or 64-bit length each. SipHash requires two 64-bit unsigned integers as keys. +The typedef will be changed to an union with a guaranteed size of 128 bits on all architectures. On platforms with a 64-bit data type it will have two ``uint64`` members. Because C89 compatible compilers may not have ``uint64`` the union also has an array of 16 chars. @@ -503,7 +503,7 @@ of common keys in dicts of Python classes. Serhiy Storchaka has shown in [issue16427]_ that a modified FNV -implementation with 64-bits per cycle is able to process long strings several +implementation with 64 bits per cycle is able to process long strings several times faster than the current FNV implementation. @@ -514,7 +514,7 @@ Benchmark Suite have shown minimal deviations. The summarized total runtime of the benchmark is within 1% of the runtime of an unmodified Python 3.4 binary. The tests were run on an Intel i7-2860QM machine with a 64-bit Linux -installation. The interpreter was compiled with GCC 4.7 for 64 and 32-bit. +installation. The interpreter was compiled with GCC 4.7 for 64- and 32-bit. More benchmarks will be conducted. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 22:29:30 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 3 Oct 2013 22:29:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Simplify_code_for_PyUnicode_?= =?utf-8?q?=28thx_Serhiy=29?= Message-ID: <3crQmp4VXmz7LjT@mail.python.org> http://hg.python.org/peps/rev/f7da0866e6dc changeset: 5167:f7da0866e6dc user: Christian Heimes date: Thu Oct 03 22:26:22 2013 +0200 summary: Simplify code for PyUnicode (thx Serhiy) files: pep-0456.txt | 27 +++++---------------------- 1 files changed, 5 insertions(+), 22 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -430,34 +430,17 @@ unicode_hash (Objects/unicodeobject.c) -------------------------------------- -``bytes_hash`` provides the tp_hash slot function for unicode. Right now it +``unicode_hash`` provides the tp_hash slot function for unicode. Right now it implements the FNV algorithm three times for ``unsigned char*``, ``Py_UCS2`` and ``Py_UCS4``. A reimplementation of the function must take care to use the correct length. Since the macro ``PyUnicode_GET_LENGTH`` returns the length of the unicode string and not its size in octets, the length must be multiplied with the size of the internal unicode kind:: - Py_ssize_t len; - Py_uhash_t x; - - len = PyUnicode_GET_LENGTH(self); - switch (PyUnicode_KIND(self)) { - case PyUnicode_1BYTE_KIND: { - const Py_UCS1 *c = PyUnicode_1BYTE_DATA(self); - x = _PyHash_Func->hashfunc(c, len * sizeof(Py_UCS1)); - break; - } - case PyUnicode_2BYTE_KIND: { - const Py_UCS2 *s = PyUnicode_2BYTE_DATA(self); - x = _PyHash_Func->hashfunc(s, len * sizeof(Py_UCS2)); - break; - } - case PyUnicode_4BYTE_KIND: { - const Py_UCS4 *l = PyUnicode_4BYTE_DATA(self); - x = _PyHash_Func->hashfunc(l, len * sizeof(Py_UCS4)); - break; - } - } + if (PyUnicode_READY(u) == -1) + return -1; + x = _PyHash_Func->hashfunc(PyUnicode_DATA(u), + PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); generic_hash (Modules/_datetimemodule.c) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 22:29:32 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 3 Oct 2013 22:29:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps_=28merge_default_-=3E_default=29?= =?utf-8?q?=3A_merge?= Message-ID: <3crQmr2TVDz7Lk4@mail.python.org> http://hg.python.org/peps/rev/b44fe7b71a00 changeset: 5168:b44fe7b71a00 parent: 5167:f7da0866e6dc parent: 5165:6af6b504c635 user: Christian Heimes date: Thu Oct 03 22:29:22 2013 +0200 summary: merge files: pep-0454.txt | 986 +++++++++++++++++++++++++------------- 1 files changed, 645 insertions(+), 341 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -21,17 +21,16 @@ ========= Common debug tools tracing memory allocations read the C filename and -number. Using such tool to analyze Python memory allocations does not -help because most memory block are allocated in the same C function, +line number. Using such tool to analyze Python memory allocations does +not help because most memory block are allocated in the same C function, in ``PyMem_Malloc()`` for example. There are debug tools dedicated to the Python language like ``Heapy`` -and ``PySizer``. These projects analyze objects type and/or content. -These tools are useful when most memory leaks are instances of the -same type and this type is only instancied in a few functions. The -problem is when the object type is very common like ``str`` or -``tuple``, and it is hard to identify where these objects are -instancied. +and ``PySizer``. These tools analyze objects type and/or content. They +are useful when most memory leaks are instances of the same type and +this type is only instantiated in a few functions. The problem is when +the object type is very common like ``str`` or ``tuple``, and it is hard +to identify where these objects are instantiated. Finding reference cycles is also a difficult problem. There are different tools to draw a diagram of all references. These tools cannot @@ -43,18 +42,17 @@ ======== Using the PEP 445, it becomes easy to setup an hook on Python memory -allocators. The hook can inspect the current Python frame to get the -Python filename and line number. +allocators. A hook can inspect Python internals to retrieve the Python +tracebacks. This PEP proposes to add a new ``tracemalloc`` module. It is a debug -tool to trace memory allocations made by Python. The module provides the +tool to trace memory blocks allocated by Python. The module provides the following information: * Compute the differences between two snapshots to detect memory leaks -* Statistics on allocated memory blocks per filename and per line number: - total size, number and average size of allocated memory blocks -* For each allocated memory block: its size and the traceback where the block - was allocated +* Statistics on allocated memory blocks per filename and per line + number: total size, number and average size of allocated memory blocks +* Traceback where a memory block was allocated The API of the tracemalloc module is similar to the API of the faulthandler module: ``enable()``, ``disable()`` and ``is_enabled()`` @@ -72,17 +70,161 @@ === To trace most memory blocks allocated by Python, the module should be -enabled as early as possible by calling ``tracemalloc.enable()`` -function, by setting the ``PYTHONTRACEMALLOC`` environment variable to -``1``, or by using ``-X tracemalloc`` command line option. +enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` +environment variable to ``1``, or by using ``-X tracemalloc`` command +line option. The ``tracemalloc.enable()`` function can also be called to +start tracing Python memory allocations. -By default, the ``Trace.traceback`` attribute only stores one ``Frame`` -instance per allocated memory block. Use ``set_traceback_limit()`` to -store more frames. +By default, a trace of an allocated memory block only stores one frame. +Use the ``set_traceback_limit()`` function to store more frames. +Python memory blocks allocated in the ``tracemalloc`` module are also +traced by default. Use ``add_exclude_filter(tracemalloc.__file__)`` to +ignore these these memory allocations. -Functions ---------- +At fork, the module is automatically disabled in the child process. + + +Main Functions +-------------- + +``cancel_tasks()`` function: + + Cancel all scheduled tasks. + + See also the ``get_tasks()`` function. + + +``clear_traces()`` function: + + Clear all traces and statistics on Python memory allocations, and + reset the ``get_arena_size()`` and ``get_traced_memory()`` counters. + + +``disable()`` function: + + Stop tracing Python memory allocations and cancel scheduled tasks. + + See also ``enable()`` and ``is_enabled()`` functions. + + +``enable()`` function: + + Start tracing Python memory allocations. + + At fork, the module is automatically disabled in the child process. + + See also ``disable()`` and ``is_enabled()`` functions. + + +``get_stats()`` function: + + Get statistics on traced Python memory blocks as a dictionary + ``{filename (str): {line_number (int): stats}}`` where *stats* in a + ``(size: int, count: int)`` tuple, *filename* and *line_number* can + be ``None``. + + Return an empty dictionary if the ``tracemalloc`` module is + disabled. + + See also the ``get_traces()`` function. + + +``get_tasks()`` function: + + Get the list of scheduled tasks, list of ``Task`` instances. + + +``is_enabled()`` function: + + ``True`` if the ``tracemalloc`` module is tracing Python memory + allocations, ``False`` otherwise. + + See also ``enable()`` and ``disable()`` functions. + + +Trace Functions +--------------- + +``get_traceback_limit()`` function: + + Get the maximum number of frames stored in the traceback of a trace + of a memory block. + + Use the ``set_traceback_limit()`` function to change the limit. + + +``get_object_address(obj)`` function: + + Get the address of the memory block of the specified Python object. + + A Python object can be composed by multiple memory blocks, the + function only returns the address of the main memory block. + + See also ``get_object_trace()`` and ``gc.get_referrers()`` functions. + + +``get_object_trace(obj)`` function: + + Get the trace of a Python object *obj* as a ``(size: int, + traceback)`` tuple where *traceback* is a tuple of ``(filename: str, + lineno: int)`` tuples, *filename* and *lineno* can be ``None``. + + The function only returns the trace of the main memory block of the + object. The *size* of the trace is smaller than the total size of + the object if the object is composed by more than one memory block. + + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the object. + + See also ``get_object_address()``, ``get_trace()``, + ``get_traces()``, ``gc.get_referrers()`` and ``sys.getsizeof()`` + functions. + + +``get_trace(address)`` function: + + Get the trace of a memory block as a ``(size: int, traceback)`` + tuple where *traceback* is a tuple of ``(filename: str, lineno: + int)`` tuples, *filename* and *lineno* can be ``None``. + + Return ``None`` if the ``tracemalloc`` module did not trace the + allocation of the memory block. + + See also ``get_object_trace()``, ``get_stats()`` and + ``get_traces()`` functions. + + +``get_traces()`` function: + + Get all traces of Python memory allocations as a dictionary + ``{address (int): trace}`` where *trace* is a ``(size: int, + traceback)`` and *traceback* is a list of ``(filename: str, lineno: + int)``. *traceback* can be empty, *filename* and *lineno* can be + None. + + Return an empty dictionary if the ``tracemalloc`` module is + disabled. + + See also ``get_object_trace()``, ``get_stats()`` and ``get_trace()`` + functions. + + +``set_traceback_limit(nframe: int)`` function: + + Set the maximum number of frames stored in the traceback of a trace + of a memory block. + + Storing the traceback of each memory allocation has an important + overhead on the memory usage. Use the ``get_tracemalloc_memory()`` + function to measure the overhead and the ``add_filter()`` function + to select which memory allocations are traced. + + Use the ``get_traceback_limit()`` function to get the current limit. + + +Filter Functions +---------------- ``add_filter(filter)`` function: @@ -94,14 +236,15 @@ allocation is ignored if at least one exclusive filter matchs its trace. - The new filter is not applied on already collected traces. Use - ``clear_traces()`` to ensure that all traces match the new filter. - + The new filter is not applied on already collected traces. Use the + ``clear_traces()`` function to ensure that all traces match the new + filter. ``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - Add an inclusive filter: helper for ``add_filter()`` creating a - ``Filter`` instance with ``include`` attribute set to ``True``. + Add an inclusive filter: helper for the ``add_filter()`` method + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``True``. Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` only includes memory blocks allocated by the ``tracemalloc`` module. @@ -109,8 +252,9 @@ ``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - Add an exclusive filter: helper for ``add_filter()`` creating a - ``Filter`` instance with ``include`` attribute set to ``False``. + Add an exclusive filter: helper for the ``add_filter()`` method + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``False``. Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores memory blocks allocated by the ``tracemalloc`` module. @@ -120,26 +264,7 @@ Reset the filter list. - -``clear_traces()`` function: - - Clear all traces and statistics on Python memory allocations, and - reset the ``get_traced_memory()`` counter. - - -``disable()`` function: - - Stop tracing Python memory allocations and stop the timer started by - ``start_timer()``. - - See also ``enable()`` and ``is_enabled()`` functions. - - -``enable()`` function: - - Start tracing Python memory allocations. - - See also ``disable()`` and ``is_enabled()`` functions. + See also the ``get_filters()`` function. ``get_filters()`` function: @@ -147,131 +272,127 @@ Get the filters on Python memory allocations as list of ``Filter`` instances. + See also the ``clear_filters()`` function. -``get_traceback_limit()`` function: - Get the maximum number of ``Frame`` instances stored in the - ``traceback`` attribute of a ``Trace`` instance. +Metric Functions +---------------- - Use ``set_traceback_limit()`` to change the limit. +The following functions can be used to add metrics to a snapshot, see +the ``Snapshot.add_metric()`` method. +``get_allocated_blocks()`` function: -``get_object_address(obj)`` function: + Get the current number of allocated memory blocks. - Get the address of the memory block of the specified Python object. +``get_arena_size()`` function: -``get_object_trace(obj)`` function: + Get the size in bytes of traced arenas. - Get the trace of a Python object *obj* as a ``Trace`` instance. - - The function only returns the trace of the memory block directly - holding to object. The ``size`` attribute of the trace is smaller - than the total size of the object if the object is composed of more - than one memory block. - - Return ``None`` if the ``tracemalloc`` module did not trace the - allocation of the object. - - See also ``gc.get_referrers()`` and ``sys.getsizeof()`` functions. + See also the ``get_pymalloc_stats()`` function. ``get_process_memory()`` function: - Get the memory usage of the current process as a meminfo namedtuple - with two attributes: - - * ``rss``: Resident Set Size in bytes - * ``vms``: size of the virtual memory in bytes + Get the memory usage of the current process as a ``(rss: int, vms: + int)`` tuple, *rss* is the "Resident Set Size" in bytes and *vms* is + the size of the virtual memory in bytes Return ``None`` if the platform is not supported. -``get_stats()`` function: +``get_pymalloc_stats()`` function: - Get statistics on traced Python memory blocks as a dictionary - ``{filename (str): {line_number (int): stats}}`` where *stats* in a - ``TraceStats`` instance, *filename* and *line_number* can be - ``None``. + Get statistics on the ``pymalloc`` allocator as a dictionary. - Return an empty dictionary if the ``tracemalloc`` module is - disabled. + +---------------------+-------------------------------------------------------+ + | Key | Description | + +=====================+=======================================================+ + | ``alignment`` | Alignment of addresses returned to the user. | + +---------------------+-------------------------------------------------------+ + | ``threshold`` | Small block threshold in bytes: pymalloc uses | + | | PyMem_RawMalloc() for allocation greater than | + | | threshold. | + +---------------------+-------------------------------------------------------+ + | ``nalloc`` | Number of times object malloc called | + +---------------------+-------------------------------------------------------+ + | ``arena_size`` | Arena size in bytes | + +---------------------+-------------------------------------------------------+ + | ``total_arenas`` | Number of calls to new_arena(): total number of | + | | allocated arenas, including released arenas | + +---------------------+-------------------------------------------------------+ + | ``max_arenas`` | Maximum number of arenas | + +---------------------+-------------------------------------------------------+ + | ``arenas`` | Number of arenas currently allocated | + +---------------------+-------------------------------------------------------+ + | ``allocated_bytes`` | Number of bytes in allocated blocks | + +---------------------+-------------------------------------------------------+ + | ``available_bytes`` | Number of bytes in available blocks in used pools | + +---------------------+-------------------------------------------------------+ + | ``pool_size`` | Pool size in bytes | + +---------------------+-------------------------------------------------------+ + | ``free_pools`` | Number of unused pools | + +---------------------+-------------------------------------------------------+ + | ``pool_headers`` | Number of bytes wasted in pool headers | + +---------------------+-------------------------------------------------------+ + | ``quantization`` | Number of bytes in used and full pools wasted due to | + | | quantization, i.e. the necessarily leftover space at | + | | the ends of used and full pools. | + +---------------------+-------------------------------------------------------+ + | ``arena_alignment`` | Number of bytes for arena alignment padding | + +---------------------+-------------------------------------------------------+ + + The function is not available if Python is compiled without ``pymalloc``. + + See also ``get_arena_size()`` and ``sys._debugmallocstats()`` functions. ``get_traced_memory()`` function: - Get the total size of all traced memory blocks allocated by Python. + Get the current size and maximum size of memory blocks traced by the + ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. -``get_tracemalloc_size()`` function: +``get_tracemalloc_memory()`` function: - Get the memory usage in bytes of the ``tracemalloc`` module. + Get the memory usage in bytes of the ``tracemalloc`` module as a + tuple: ``(size: int, free: int)``. + * *size*: total size of bytes allocated by the module, + including *free* bytes + * *free*: number of free bytes available to store data -``get_traces(obj)`` function: - Get all traces of Python memory allocations as a dictionary - ``{address (int): trace}`` where *trace* is a ``Trace`` instance. +``get_unicode_interned()`` function: - Return an empty dictionary if the ``tracemalloc`` module is - disabled. + Get the size in bytes and the length of the dictionary of Unicode + interned strings as a ``(size: int, length: int)`` tuple. + The size is the size of the dictionary, excluding the size of + strings. -``is_enabled()`` function: - ``True`` if the ``tracemalloc`` module is tracing Python memory - allocations, ``False`` otherwise. - - See also ``enable()`` and ``disable()`` functions. - - -``start_timer(delay: int, func: callable, args: tuple=(), kwargs: dict={})`` function: - - Start a timer calling ``func(*args, **kwargs)`` every *delay* - seconds. Enable the ``tracemalloc`` module if it is disabled. The - timer is based on the Python memory allocator, it is not real time. - *func* is called after at least *delay* seconds, it is not called - exactly after *delay* seconds if no Python memory allocation - occurred. The timer has a resolution of 1 second. - - If the ``start_timer()`` function is called twice, previous - parameters are replaced. Call the ``stop_timer()`` function to stop - the timer. - - The ``DisplayTopTask.start()`` and ``TakeSnapshot.start()`` methods - use the ``start_timer()`` function to run regulary a task. - - -``set_traceback_limit(limit: int)`` function: - - Set the maximum number of ``Frame`` instances stored in the - ``traceback`` attribute of a ``Trace`` instance. Clear all traces - and statistics on Python memory allocations if the ``tracemalloc`` - module is enabled, - - Storing the traceback of each memory allocation has an important - overhead on the memory usage. Example with the Python test suite: - tracing all memory allocations increases the memory usage by - ``+50%`` when storing only 1 frame and ``+150%`` when storing 10 - frames. Use ``get_tracemalloc_size()`` to measure the overhead and - ``add_filter()`` to select which memory allocations are traced. - - Use ``get_traceback_limit()`` to get the current limit. - - -``stop_timer()`` function: - - Stop the timer started by ``start_timer()``. - - -DisplayTop class ----------------- +DisplayTop +---------- ``DisplayTop()`` class: - Display the top of allocated memory blocks. + Display the top of allocated memory blocks. -``display_snapshot(snapshot, count=10, group_by="filename_lineno", cumulative=False, file=None)`` method: +``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method: + + Take a snapshot and display the top *count* biggest allocated memory + blocks grouped by *group_by*. + + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. + + Return the snapshot, a ``Snapshot`` instance. + +``display_snapshot(snapshot, count=10, group_by="line", cumulative=False, file=None)`` method: Display a snapshot of memory blocks allocated by Python, *snapshot* is a ``Snapshot`` instance. @@ -284,65 +405,78 @@ ``display_top_stats(top_stats, count=10, file=None)`` method: Display the top of allocated memory blocks grouped by the - ``group_by`` attribute of *top_stats*, *top_stats* is a + ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a ``GroupedStats`` instance. +``average`` attribute: + + If ``True`` (default value), display the average size of memory + blocks. + ``color`` attribute: If ``True``, always use colors. If ``False``, never use colors. The default value is ``None``: use colors if the *file* parameter is a TTY device. -``compare_with_previous`` attribute: +``compare_to_previous`` attribute: - If ``True`` (default value), compare with the previous snapshot. If - ``False``, compare with the first snapshot. + If ``True`` (default value), compare to the previous snapshot. If + ``False``, compare to the first snapshot. ``filename_parts`` attribute: Number of displayed filename parts (int, default: ``3``). Extra parts are replaced with ``'...'``. -``show_average`` attribute: +``metrics`` attribute: - If ``True`` (default value), display the average size of memory blocks. + If ``True`` (default value), display metrics: see + ``Snapshot.metrics``. -``show_count`` attribute: +``previous_top_stats`` attribute: - If ``True`` (default value), display the number of allocated memory - blocks. + Previous ``GroupedStats`` instance, or first ``GroupedStats`` + instance if ``compare_to_previous`` is ``False``, used to display + the differences between two snapshots. -``show_size`` attribute: +``size`` attribute: If ``True`` (default value), display the size of memory blocks. -DisplayTopTask class --------------------- +DisplayTopTask +-------------- -``DisplayTopTask(count=10, group_by="filename_lineno", cumulative=False, file=sys.stdout, user_data_callback=None)`` class: +``DisplayTopTask(count=10, group_by="line", cumulative=False, file=sys.stdout, callback=None)`` class: - Task taking temporary snapshots and displaying the top *count* - memory allocations grouped by *group_by*. + Task taking temporary snapshots and displaying the top *count* memory + allocations grouped by *group_by*. - Call the ``start()`` method to start the task. + ``DisplayTopTask`` is based on the ``Task`` class and so inherit + all attributes and methods, especially: + + * ``Task.cancel()`` + * ``Task.schedule()`` + * ``Task.set_delay()`` + * ``Task.set_memory_threshold()`` + + Modify the ``display_top`` attribute to customize the display. ``display()`` method: - Take a snapshot and display the top *count* biggest allocated memory - blocks grouped by *group_by* using the ``display_top`` attribute. + Take a snapshot and display the top ``count`` biggest allocated + memory blocks grouped by ``group_by`` using the ``display_top`` + attribute. Return the snapshot, a ``Snapshot`` instance. -``start(delay: int)`` method: +``callback`` attribute: - Start a task using the ``start_timer()`` function calling the - ``display()`` method every *delay* seconds. - -``stop()`` method: - - Stop the task started by the ``start()`` method using the - ``stop_timer()`` function. + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. ``count`` attribute: @@ -351,11 +485,11 @@ ``cumulative`` attribute: If ``True``, cumulate size and count of memory blocks of all frames - of each ``Trace`` instance, not only the most recent frame. The - default value is ``False``. + of each trace, not only the most recent frame. The default value is + ``False``. - The option is ignored if the traceback limit is ``1``, see the - ``get_traceback_limit()`` function. + The option is ignored if the traceback limit is less than ``2``, see + the ``get_traceback_limit()`` function. ``display_top`` attribute: @@ -368,190 +502,279 @@ ``group_by`` attribute: Determine how memory allocations are grouped: see - ``Snapshot.top_by`` for the available values. + ``Snapshot.top_by()`` for the available values. -``user_data_callback`` attribute: - Optional callback collecting user data (callable, default: - ``None``). See ``Snapshot.create()``. - - -Filter class ------------- +Filter +------ ``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class: - Filter to select which memory allocations are traced. Filters can be - used to reduce the memory usage of the ``tracemalloc`` module, which - can be read using ``get_tracemalloc_size()``. - -``match_trace(trace)`` method: - - Return ``True`` if the ``Trace`` instance must be kept according to - the filter, ``False`` otherwise. + Filter to select which memory allocations are traced. Filters can be + used to reduce the memory usage of the ``tracemalloc`` module, which + can be read using the ``get_tracemalloc_memory()`` function. ``match(filename: str, lineno: int)`` method: - Return ``True`` if the filename and line number must be kept - according to the filter, ``False`` otherwise. + Return ``True`` if the filter matchs the filename and line number, + ``False`` otherwise. ``match_filename(filename: str)`` method: - Return ``True`` if the filename must be kept according to the - filter, ``False`` otherwise. + Return ``True`` if the filter matchs the filename, ``False`` + otherwise. ``match_lineno(lineno: int)`` method: - Return ``True`` if the line number must be kept according to the - filter, ``False`` otherwise. + Return ``True`` if the filter matchs the line number, ``False`` + otherwise. + +``match_traceback(traceback)`` method: + + Return ``True`` if the filter matchs the *traceback*, ``False`` + otherwise. + + *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples. ``include`` attribute: If *include* is ``True``, only trace memory blocks allocated in a file with a name matching filename ``pattern`` at line number - ``lineno``. If *include* is ``False``, ignore memory blocks - allocated in a file with a name matching filename :attr`pattern` at - line number ``lineno``. + ``lineno``. + + If *include* is ``False``, ignore memory blocks allocated in a file + with a name matching filename :attr`pattern` at line number + ``lineno``. + +``lineno`` attribute: + + Line number (``int``). If is is ``None`` or less than ``1``, it + matches any line number. ``pattern`` attribute: The filename *pattern* can contain one or many ``*`` joker characters which match any substring, including an empty string. The - ``.pyc`` and ``.pyo`` suffixes are replaced with ``.py``. On + ``.pyc`` and ``.pyo`` file extensions are replaced with ``.py``. On Windows, the comparison is case insensitive and the alternative separator ``/`` is replaced with the standard separator ``\``. -``lineno`` attribute: - - Line number (``int``). If is is ``None`` or lesser than ``1``, it - matches any line number. - ``traceback`` attribute: - If *traceback* is ``True``, all frames of the ``traceback`` - attribute of ``Trace`` instances are checked. If *traceback* is - ``False``, only the most recent frame is checked. + If *traceback* is ``True``, all frames of the traceback are checked. + If *traceback* is ``False``, only the most recent frame is checked. - This attribute only has an effect on the ``match_trace()`` method - and only if the traceback limit is greater than ``1``. See the - ``get_traceback_limit()`` function. + This attribute is ignored if the traceback limit is less than ``2``. + See the ``get_traceback_limit()`` function. -Frame class ------------ +GroupedStats +------------ -``Frame`` class: +``GroupedStats(timestamp: datetime.datetime, stats: dict, group_by: str, cumulative=False, metrics: dict=None)`` class: - Trace of a Python frame, used by ``Trace.traceback`` attribute. + Top of allocated memory blocks grouped by *group_by* as a dictionary. -``filename`` attribute: - - Python filename, ``None`` if unknown. - -``lineno`` attribute: - - Python line number, ``None`` if unknown. - - -GroupedStats class ------------------- - -``GroupedStats(stats: dict, group_by: str, cumulative=False, timestamp=None, process_memory=None, tracemalloc_size=None)`` class: - - Top of allocated memory blocks grouped by on *group_by* as a - dictionary. - - The ``Snapshot.top_by()`` method creates a ``GroupedStats`` instance. + The ``Snapshot.top_by()`` method creates a ``GroupedStats`` instance. ``compare_to(old_stats: GroupedStats=None)`` method: Compare to an older ``GroupedStats`` instance. Return a ``StatsDiff`` instance. + The ``StatsDiff.differences`` list is not sorted: call the + ``StatsDiff.sort`` method to sort the list. + + ``None`` values are replaced with an empty string for filenames or + zero for line numbers, because ``str`` and ``int`` cannot be + compared to ``None``. + ``cumulative`` attribute: If ``True``, cumulate size and count of memory blocks of all frames - of ``Trace``, not only the most recent frame. + of the traceback of a trace, not only the most recent frame. + +``metrics`` attribute: + + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``group_by`` attribute: - Determine how memory allocations were grouped. The type of ``stats`` - keys depends on *group_by*: - - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== - - See the *group_by* parameter of the ``Snapshot.top_by()`` method. + Determine how memory allocations were grouped: see + ``Snapshot.top_by()`` for the available values. ``stats`` attribute: Dictionary ``{key: stats}`` where the *key* type depends on the - ``group_by`` attribute and *stats* type is ``TraceStats``. + ``group_by`` attribute and *stats* is a ``(size: int, count: int)`` + tuple. -``process_memory`` attribute: - - Result of the ``get_process_memory()`` function, can be ``None``. + See the ``Snapshot.top_by()`` method. ``timestamp`` attribute: Creation date and time of the snapshot, ``datetime.datetime`` instance. -``tracemalloc_size`` attribute: - The memory usage in bytes of the ``tracemalloc`` module, result of - the ``get_tracemalloc_size()`` function. +Metric +------ +``Metric(name: str, value: int, format: str)`` class: -Snapshot class --------------- + Value of a metric when a snapshot is created. -``Snapshot`` class: +``name`` attribute: - Snapshot of memory blocks allocated by Python. + Name of the metric. - Use ``TakeSnapshot`` to take regulary snapshots. +``value`` attribute: + + Value of the metric. + +``format`` attribute: + + Format of the metric: + + * ``'int'``: a number + * ``'percent'``: percentage, ``1.0`` means ``100%`` + * ``'size'``: a size in bytes + + +Snapshot +-------- + +``Snapshot(timestamp: datetime.datetime, pid: int, traces: dict=None, stats: dict=None, metrics: dict=None)`` class: + + Snapshot of traces and statistics on memory blocks allocated by + Python. + + Use ``TakeSnapshotTask`` to take regulary snapshots. + +``add_gc_metrics()`` method: + + Add a metric on garbage collector: + + * ``gc.objects``: total number of Python objects + + See the ``gc`` module. + + +``add_metric(name: str, value: int, format: str)`` method: + + Helper to add a ``Metric`` instance to ``Snapshot.metrics``. Return + the newly created ``Metric`` instance. + + Raise an exception if the name is already present in + ``Snapshot.metrics``. + + +``add_process_memory_metrics()`` method: + + Add metrics on the process memory: + + * ``process_memory.rss``: Resident Set Size + * ``process_memory.vms``: Virtual Memory Size + + These metrics are only available if the ``get_process_memory()`` + function is available on the platform. + + +``add_pymalloc_metrics()`` method: + + Add metrics on the Python memory allocator (``pymalloc``): + + * ``pymalloc.blocks``: number of allocated memory blocks + * ``pymalloc.size``: size of ``pymalloc`` arenas + * ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas + * ``pymalloc.allocated``: number of allocated bytes + * ``pymalloc.free``: number of free bytes + * ``pymalloc.fragmentation``: fragmentation percentage of the arenas + + These metrics are only available if Python is compiled in debug + mode, except ``pymalloc.blocks`` which is always available. + + +``add_tracemalloc_metrics()`` method: + + Add metrics on the ``tracemalloc`` module: + + * ``tracemalloc.traced.size``: size of memory blocks traced by the + ``tracemalloc`` module + * ``tracemalloc.traced.max_size``: maximum size of memory blocks + traced by the ``tracemalloc`` module + * ``tracemalloc.traces``: number of traces of Python memory blocks + * ``tracemalloc.module.size``: total size of bytes allocated by the + ``tracemalloc`` module, including free bytes + * ``tracemalloc.module.free``: number of free bytes available for + the ``tracemalloc`` module + * ``tracemalloc.module.fragmentation``: percentage of fragmentation + of the memory allocated by the ``tracemalloc`` module + * ``tracemalloc.arena_size``: size of traced arenas + + ``tracemalloc.traces`` metric is only present if the snapshot was + created with traces. + + +``add_unicode_metrics()`` method: + + Add metrics on the Unicode interned strings: + + * ``unicode_interned.size``: size of the dictionary, excluding size + of strings + * ``unicode_interned.len``: length of the dictionary + ``apply_filters(filters)`` method: - Apply a list filters on the ``traces`` and ``stats`` dictionaries, + Apply filters on the ``traces`` and ``stats`` dictionaries, *filters* is a list of ``Filter`` instances. -``create(\*, with_traces=False, with_stats=True, user_data_callback=None)`` classmethod: + +``create(traces=False, metrics=True)`` classmethod: Take a snapshot of traces and/or statistics of allocated memory blocks. - If *with_traces* is ``True``, ``get_traces()`` is called and its - result is stored in the ``traces`` attribute. This attribute - contains more information than ``stats`` and uses more memory and - more disk space. If *with_traces* is ``False``, ``traces`` is set to - ``None``. + If *traces* is ``True``, ``get_traces`` is called and its result is + stored in the ``Snapshot.traces`` attribute. This attribute contains + more information than ``Snapshot.stats`` and uses more memory and + more disk space. If *traces* is ``False``, ``Snapshot.traces`` is + set to ``None``. - If *with_stats* is ``True``, ``get_stats()`` is called and its - result is stored in the ``Snapshot.stats`` attribute. If - *with_stats* is ``False``, ``Snapshot.stats`` is set to ``None``. + If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics + using the following methods: - *with_traces* and *with_stats* cannot be ``False`` at the same time. + * ``add_gc_metrics`` + * ``add_process_memory_metrics`` + * ``add_pymalloc_metrics`` + * ``add_tracemalloc_metrics`` + * ``add_unicode_metrics`` - *user_data_callback* is an optional callable object. Its result - should be serializable by the ``pickle`` module, or - ``Snapshot.write()`` would fail. If *user_data_callback* is set, it - is called and the result is stored in the ``Snapshot.user_data`` - attribute. Otherwise, ``Snapshot.user_data`` is set to ``None``. + If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty + dictionary. + + Tracebacks of traces are limited to ``traceback_limit`` frames. Call + ``set_traceback_limit()`` before calling ``Snapshot.create()`` to + store more frames. The ``tracemalloc`` module must be enabled to take a snapshot. See - the ``enable()`` function. + the the ``enable()`` function. -``load(filename)`` classmethod: +``get_metric(name, default=None)`` method: + + Get the value of the metric called *name*. Return *default* if the + metric does not exist. + + +``load(filename, traces=True)`` classmethod: Load a snapshot from a file. + If *traces* is ``False``, don't load traces. + + ``top_by(group_by: str, cumulative: bool=False)`` method: Compute top statistics grouped by *group_by* as a ``GroupedStats`` @@ -561,99 +784,75 @@ group_by description key type ===================== ======================== ============== ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` + ``'line'`` filename and line number ``(str, int)`` ``'address'`` memory block address ``int`` ===================== ======================== ============== If *cumulative* is ``True``, cumulate size and count of memory - blocks of all frames of each ``Trace`` instance, not only the most - recent frame. The *cumulative* parameter is ignored if *group_by* is - ``'address'`` or if the traceback limit is ``1``. See the - ``traceback_limit`` attribute. + blocks of all frames of the traceback of a trace, not only the most + recent frame. The *cumulative* parameter is ignored if *group_by* + is ``'address'`` or if the traceback limit is less than ``2``. + ``write(filename)`` method: - Write the snapshot into a file. + Write the snapshot into a file. + + +``metrics`` attribute: + + Dictionary storing metrics read when the snapshot was created: + ``{name (str): metric}`` where *metric* type is ``Metric``. ``pid`` attribute: Identifier of the process which created the snapshot, result of ``os.getpid()``. -``process_memory`` attribute: - - Memory usage of the current process, result of the - ``get_process_memory()`` function. It can be ``None``. - ``stats`` attribute: Statistics on traced Python memory, result of the ``get_stats()`` - function, if ``create()`` was called with *with_stats* equals to - ``True``, ``None`` otherwise. - -``tracemalloc_size`` attribute: - - The memory usage in bytes of the ``tracemalloc`` module, result of - the ``get_tracemalloc_size()`` function. + function. ``traceback_limit`` attribute: - The maximum number of frames stored in the ``traceback`` attribute - of a ``Trace``, result of the ``get_traceback_limit()`` function. + Maximum number of frames stored in a trace of a memory block + allocated by Python. ``traces`` attribute: Traces of Python memory allocations, result of the ``get_traces()`` - function, if ``create()`` was called with *with_traces* equals to - ``True``, ``None`` otherwise. - - The ``traceback`` attribute of each ``Trace`` instance is limited to - ``traceback_limit`` frames. + function, can be ``None``. ``timestamp`` attribute: Creation date and time of the snapshot, ``datetime.datetime`` instance. -``user_data`` attribute: - Result of *user_data_callback* called in ``Snapshot.create()`` - (default: ``None``). - - -StatsDiff class ---------------- +StatsDiff +--------- ``StatsDiff(differences, old_stats, new_stats)`` class: - Differences between two ``GroupedStats`` instances. By default, the - ``differences`` list is unsorted: call ``sort()`` to sort it. + Differences between two ``GroupedStats`` instances. - The ``GroupedStats.compare_to()`` method creates a ``StatsDiff`` + The ``GroupedStats.compare_to`` method creates a ``StatsDiff`` instance. ``sort()`` method: - Sort the ``differences`` list from the biggest allocation to the - smallest. Sort by *size_diff*, *size*, *count_diff*, *count* and - then by *key*. + Sort the ``differences`` list from the biggest difference to the + smallest difference. Sort by ``abs(size_diff)``, *size*, + ``abs(count_diff)``, *count* and then by *key*. ``differences`` attribute: Differences between ``old_stats`` and ``new_stats`` as a list of ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, *size*, *count_diff* and *count* are ``int``. The key type depends - on the ``group_by`` attribute of ``new_stats``: - - ===================== ======================== ============== - group_by description key type - ===================== ======================== ============== - ``'filename'`` filename ``str`` - ``'filename_lineno'`` filename and line number ``(str, str)`` - ``'address'`` memory block address ``int`` - ===================== ======================== ============== - - See the ``group_by`` attribute of the ``GroupedStats`` class. + on the ``GroupedStats.group_by`` attribute of ``new_stats``: see the + ``Snapshot.top_by()`` method. ``old_stats`` attribute: @@ -664,43 +863,148 @@ New ``GroupedStats`` instance. -Trace class ------------ +Task +---- -``Trace`` class: +``Task(func, *args, **kw)`` class: - Debug information of a memory block allocated by Python. + Task calling ``func(*args, **kw)``. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes, or after *delay* seconds. -``size`` attribute: +``call()`` method: - Size in bytes of the memory block. + Call ``func(*args, **kw)`` and return the result. -``traceback`` attribute: - Traceback where the memory block was allocated as a list of - ``Frame`` instances, most recent first. +``cancel()`` method: - The list can be empty or incomplete if the ``tracemalloc`` module - was unable to retrieve the full traceback. + Cancel the task. - The traceback is limited to ``get_traceback_limit()`` frames. Use - ``set_traceback_limit()`` to store more frames. + Do nothing if the task is not scheduled. -TraceStats class +``get_delay()`` method: + + Get the delay in seconds. If the delay is ``None``, the timer is + disabled. + + +``get_memory_threshold()`` method: + + Get the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. The memory threshold is disabled if *threshold* + is ``None``. + + See also the ``set_memory_threshold()`` method and the + ``get_traced_memory()`` function. + + +``schedule(repeat: int=None)`` method: + + Schedule the task *repeat* times. If *repeat* is ``None``, the task + is rescheduled after each call until it is cancelled. + + If the method is called twice, the task is rescheduled with the new + *repeat* parameter. + + The task must have a memory threshold or a delay: see + ``set_delay()`` and ``set_memory_threshold()`` methods. The + ``tracemalloc`` must be enabled to schedule a task: see the + ``enable`` function. + + The task is cancelled if the ``call()`` method raises an exception. + The task can be cancelled using the ``cancel()`` method or the + ``cancel_tasks()`` function. + + +``set_delay(seconds: int)`` method: + + Set the delay in seconds before the task will be called. Set the + delay to ``None`` to disable the timer. + + The timer is based on the Python memory allocator, it is not real + time. The task is called after at least *delay* seconds, it is not + called exactly after *delay* seconds if no Python memory allocation + occurred. The timer has a resolution of 1 second. + + The task is rescheduled if it was scheduled. + + +``set_memory_threshold(size: int)`` method: + + Set the threshold of the traced memory. When scheduled, the task is + called when the traced memory is increased or decreased by more than + *threshold* bytes. Set the threshold to ``None`` to disable it. + + The task is rescheduled if it was scheduled. + + See also the ``get_memory_threshold()`` method and the + ``get_traced_memory()`` function. + + +``func`` attribute: + + Function, callable object. + +``func_args`` attribute: + + Function arguments, ``tuple``. + +``func_kwargs`` attribute: + + Function keyword arguments, ``dict``. It can be ``None``. + + +TakeSnapshotTask ---------------- -``TraceStats`` class: +``TakeSnapshotTask(filename_template: str="tracemalloc-$counter.pickle", traces: bool=False, metrics: bool=True, callback: callable=None)`` class: - Statistics on Python memory allocations. + Task taking snapshots of Python memory allocations and writing them + into files. -``size`` attribute: + ``TakeSnapshotTask`` is based on the ``Task`` class and so inherit + all attributes and methods, especially: - Total size in bytes of allocated memory blocks. + * ``Task.cancel()`` + * ``Task.schedule()`` + * ``Task.set_delay()`` + * ``Task.set_memory_threshold()`` -``count`` attribute: +``take_snapshot()`` method: - Number of allocated memory blocks. + Take a snapshot and write it into a file. Return ``(snapshot, + filename)`` where *snapshot* is a ``Snapshot`` instance and filename + type is ``str``. + +``callback`` attribute: + + *callback* is an optional callable object which can be used to add + metrics to a snapshot. It is called with only one parameter: the + newly created snapshot instance. Use the ``Snapshot.add_metric()`` + method to add new metric. + +``filename_template`` attribute: + + Template to create a filename. The template supports the following + variables: + + * ``$pid``: identifier of the current process + * ``$timestamp``: current date and time + * ``$counter``: counter starting at 1 and incremented at each snapshot, + formatted as 4 decimal digits + + The default template is ``'tracemalloc-$counter.pickle'``. + +``metrics`` attribute: + + Parameter passed to the ``Snapshot.create()`` function. + +``traces`` attribute: + + Parameter passed to the ``Snapshot.create()`` function. Links @@ -722,8 +1026,8 @@ * `PySizer `_: developed for Python 2.4 * `memory_profiler `_ * `pympler `_ -* `Dozer `_: WSGI Middleware version of - the CherryPy memory leak debugger +* `Dozer `_: WSGI Middleware version + of the CherryPy memory leak debugger * `objgraph `_ * `caulk `_ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 3 22:46:03 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 22:46:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4IHR5cG8u?= Message-ID: <3crR7v5D5zz7LjM@mail.python.org> http://hg.python.org/cpython/rev/f027b55c81bb changeset: 85949:f027b55c81bb branch: 3.3 parent: 85946:832579dbafd6 user: Eric Snow date: Thu Oct 03 14:37:55 2013 -0600 summary: Fix typo. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -203,7 +203,7 @@ - Issue #18405: Improve the entropy of crypt.mksalt(). -- Issue #19151: Fix docstring and use of _get_suppported_file_loaders() to +- Issue #19151: Fix docstring and use of _get_supported_file_loaders() to reflect 2-tuples. - Issue #19152: Add ExtensionFileLoader.get_filename(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 22:46:05 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 22:46:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogRml4IHR5cG8u?= Message-ID: <3crR7x05Kwz7LjT@mail.python.org> http://hg.python.org/cpython/rev/9d4e0445cdce changeset: 85950:9d4e0445cdce parent: 85948:4ce25f33bc84 parent: 85949:f027b55c81bb user: Eric Snow date: Thu Oct 03 14:39:39 2013 -0600 summary: Fix typo. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -358,7 +358,7 @@ - Issue #18598: Tweak exception message for importlib.import_module() to include the module name when a key argument is missing. -- Issue #19151: Fix docstring and use of _get_suppported_file_loaders() to +- Issue #19151: Fix docstring and use of _get_supported_file_loaders() to reflect 2-tuples. - Issue #19152: Add ExtensionFileLoader.get_filename(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 23:21:07 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 23:21:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogW2lzc3VlMTkxNTJd?= =?utf-8?q?_Revert_832579dbafd6=2E?= Message-ID: <3crRwM4Nlbz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/7ed717bd5faa changeset: 85951:7ed717bd5faa branch: 3.3 parent: 85949:f027b55c81bb user: Eric Snow date: Thu Oct 03 15:03:29 2013 -0600 summary: [issue19152] Revert 832579dbafd6. files: Doc/library/importlib.rst | 6 +- Lib/importlib/_bootstrap.py | 5 - Lib/importlib/abc.py | 2 - Misc/NEWS | 2 - Python/importlib.h | 408 +++++++++++------------ 5 files changed, 196 insertions(+), 227 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -800,7 +800,7 @@ .. class:: ExtensionFileLoader(fullname, path) - A concrete implementation of :class:`importlib.abc.ExecutionLoader` for + A concrete implementation of :class:`importlib.abc.InspectLoader` for extension modules. The *fullname* argument specifies the name of the module the loader is to @@ -834,10 +834,6 @@ Returns ``None`` as extension modules do not have source code. - .. method:: get_filename(fullname) - - Returns :attr:`path`. - :mod:`importlib.util` -- Utility code for importers --------------------------------------------------- diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1153,11 +1153,6 @@ """Return None as extension modules have no source code.""" return None - @_check_name - def get_filename(self, fullname): - """Return the path to the source file as found by the finder.""" - return self.path - class _NamespacePath: """Represents a namespace package's path. It uses the module name diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -168,8 +168,6 @@ set to.""" raise NotImplementedError -_register(machinery.ExtensionFileLoader) - class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -206,8 +206,6 @@ - Issue #19151: Fix docstring and use of _get_supported_file_loaders() to reflect 2-tuples. -- Issue #19152: Add ExtensionFileLoader.get_filename(). - - Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get docstrings and ValueError messages. Patch by Zhongyue Luo diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 3 23:21:08 2013 From: python-checkins at python.org (eric.snow) Date: Thu, 3 Oct 2013 23:21:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge_with_3=2E3=2E?= Message-ID: <3crRwN6MG2zQGr@mail.python.org> http://hg.python.org/cpython/rev/9354df85afd7 changeset: 85952:9354df85afd7 parent: 85950:9d4e0445cdce parent: 85951:7ed717bd5faa user: Eric Snow date: Thu Oct 03 15:16:03 2013 -0600 summary: Null merge with 3.3. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 04:16:07 2013 From: python-checkins at python.org (jesus.cea) Date: Fri, 4 Oct 2013 04:16:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2UgIzE5MTYw?= =?utf-8?q?=3A_Inconsistent_size_for_GIL_release_in_hashlib?= Message-ID: <3crZSl3JfSz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/310c26df3234 changeset: 85953:310c26df3234 branch: 3.3 parent: 85951:7ed717bd5faa user: Jesus Cea date: Fri Oct 04 04:15:06 2013 +0200 summary: Close #19160: Inconsistent size for GIL release in hashlib files: Doc/library/hashlib.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -41,7 +41,7 @@ .. note:: For better multithreading performance, the Python :term:`GIL` is released for - strings of more than 2047 bytes at object creation or on update. + data larger than 2048 bytes at object creation or on update. .. note:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 04:16:08 2013 From: python-checkins at python.org (jesus.cea) Date: Fri, 4 Oct 2013 04:16:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_MERGE=3A_Close_=2319160=3A_Inconsistent_size_for_GIL_rel?= =?utf-8?q?ease_in_hashlib?= Message-ID: <3crZSm4yjcz7LkL@mail.python.org> http://hg.python.org/cpython/rev/9503097ce1b7 changeset: 85954:9503097ce1b7 parent: 85952:9354df85afd7 parent: 85953:310c26df3234 user: Jesus Cea date: Fri Oct 04 04:15:48 2013 +0200 summary: MERGE: Close #19160: Inconsistent size for GIL release in hashlib files: Doc/library/hashlib.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -41,7 +41,7 @@ .. note:: For better multithreading performance, the Python :term:`GIL` is released for - strings of more than 2047 bytes at object creation or on update. + data larger than 2048 bytes at object creation or on update. .. note:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 04:21:23 2013 From: python-checkins at python.org (jesus.cea) Date: Fri, 4 Oct 2013 04:21:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2UgIzE5MTYw?= =?utf-8?q?=3A_Inconsistent_size_for_GIL_release_in_hashlib?= Message-ID: <3crZZq5497z7LjS@mail.python.org> http://hg.python.org/cpython/rev/bfebfadfc4aa changeset: 85955:bfebfadfc4aa branch: 3.3 parent: 85953:310c26df3234 user: Jesus Cea date: Fri Oct 04 04:20:37 2013 +0200 summary: Close #19160: Inconsistent size for GIL release in hashlib files: Doc/library/hashlib.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -41,7 +41,7 @@ .. note:: For better multithreading performance, the Python :term:`GIL` is released for - data larger than 2048 bytes at object creation or on update. + data larger than 2047 bytes at object creation or on update. .. note:: @@ -132,7 +132,7 @@ .. versionchanged:: 3.1 The Python GIL is released to allow other threads to run while hash - updates on data larger than 2048 bytes is taking place when using hash + updates on data larger than 2047 bytes is taking place when using hash algorithms supplied by OpenSSL. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 04:21:24 2013 From: python-checkins at python.org (jesus.cea) Date: Fri, 4 Oct 2013 04:21:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_MERGE=3A_Close_=2319160=3A_Inconsistent_size_for_GIL_rel?= =?utf-8?q?ease_in_hashlib?= Message-ID: <3crZZr6tsRz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/989ea05b2500 changeset: 85956:989ea05b2500 parent: 85954:9503097ce1b7 parent: 85955:bfebfadfc4aa user: Jesus Cea date: Fri Oct 04 04:21:02 2013 +0200 summary: MERGE: Close #19160: Inconsistent size for GIL release in hashlib files: Doc/library/hashlib.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -41,7 +41,7 @@ .. note:: For better multithreading performance, the Python :term:`GIL` is released for - data larger than 2048 bytes at object creation or on update. + data larger than 2047 bytes at object creation or on update. .. note:: @@ -148,7 +148,7 @@ .. versionchanged:: 3.1 The Python GIL is released to allow other threads to run while hash - updates on data larger than 2048 bytes is taking place when using hash + updates on data larger than 2047 bytes is taking place when using hash algorithms supplied by OpenSSL. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 4 07:06:13 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 04 Oct 2013 07:06:13 +0200 Subject: [Python-checkins] Daily reference leaks (9354df85afd7): sum=4 Message-ID: results for 9354df85afd7 on branch "default" -------------------------------------------- test_imp leaked [1, -1, 0] references, sum=0 test_site leaked [2, 0, 0] references, sum=2 test_site leaked [2, 0, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogDLbCXD', '-x'] From python-checkins at python.org Fri Oct 4 16:55:27 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 4 Oct 2013 16:55:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_dict_is_also_a?= =?utf-8?q?llowed_=28closes_=2319163=29?= Message-ID: <3crvJv728Gz7Lkk@mail.python.org> http://hg.python.org/cpython/rev/405245885569 changeset: 85957:405245885569 branch: 2.7 parent: 85936:5e8de100f708 user: Benjamin Peterson date: Fri Oct 04 10:55:15 2013 -0400 summary: dict is also allowed (closes #19163) files: Doc/c-api/string.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/c-api/string.rst b/Doc/c-api/string.rst --- a/Doc/c-api/string.rst +++ b/Doc/c-api/string.rst @@ -241,7 +241,7 @@ .. c:function:: PyObject* PyString_Format(PyObject *format, PyObject *args) Return a new string object from *format* and *args*. Analogous to ``format % - args``. The *args* argument must be a tuple. + args``. The *args* argument must be a tuple or dict. .. c:function:: void PyString_InternInPlace(PyObject **string) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 17:39:10 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 4 Oct 2013 17:39:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318716=3A_Deprecat?= =?utf-8?q?e_the_formatter_module?= Message-ID: <3crwHL6xw4z7Lkf@mail.python.org> http://hg.python.org/cpython/rev/04ff1cc40d62 changeset: 85958:04ff1cc40d62 parent: 85956:989ea05b2500 user: Brett Cannon date: Fri Oct 04 11:38:59 2013 -0400 summary: Issue #18716: Deprecate the formatter module files: Doc/library/formatter.rst | 4 ++++ Doc/whatsnew/3.4.rst | 9 ++++++--- Lib/formatter.py | 3 +++ Lib/pydoc.py | 9 ++++----- Misc/NEWS | 2 ++ 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Doc/library/formatter.rst b/Doc/library/formatter.rst --- a/Doc/library/formatter.rst +++ b/Doc/library/formatter.rst @@ -4,6 +4,10 @@ .. module:: formatter :synopsis: Generic output formatter and device interface. +.. deprecated:: 3.4 + Due to lack of usage, the formatter module has been deprecated and is slated + for removal in Python 3.6. + This module supports two interface definitions, each with multiple implementations: The *formatter* interface, and the *writer* interface which is diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -516,6 +516,9 @@ * The :mod:`imp` module is pending deprecation. To keep compatibility with Python 2/3 code bases, the module's removal is currently not scheduled. +* The :mod:`formatter` module is pending deprecation and is slated for removal + in Python 3.6. + Deprecated functions and types of the C API ------------------------------------------- @@ -554,9 +557,9 @@ * Import now resets relevant attributes (e.g. ``__name__``, ``__loader__``, ``__package__``, ``__file__``, ``__cached__``) unconditionally when reloading. -* Frozen packages no longer set ``__path__`` to a list containg the package name - but an empty list instead. Determing if a module is a package should be done - using ``hasattr(module, '__path__')``. +* Frozen packages no longer set ``__path__`` to a list containing the package + name but an empty list instead. Determing if a module is a package should be + done using ``hasattr(module, '__path__')``. * :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg** argument is not set. Previously only ``NULL`` was returned with no exception diff --git a/Lib/formatter.py b/Lib/formatter.py --- a/Lib/formatter.py +++ b/Lib/formatter.py @@ -19,6 +19,9 @@ """ import sys +import warnings +warnings.warn('the formatter module is deprecated and will be removed in ' + 'Python 3.6', PendingDeprecationWarning) AS_IS = None diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -1915,11 +1915,10 @@ if more_xrefs: xrefs = (xrefs or '') + ' ' + more_xrefs if xrefs: - import formatter - buffer = io.StringIO() - formatter.DumbWriter(buffer).send_flowing_data( - 'Related help topics: ' + ', '.join(xrefs.split()) + '\n') - self.output.write('\n%s\n' % buffer.getvalue()) + import textwrap + text = 'Related help topics: ' + ', '.join(xrefs.split()) + '\n' + wrapped_text = textwrap.wrap(text, 72) + self.output.write('\n%s\n' % ''.join(wrapped_text)) def _gettopic(self, topic, more_xrefs=''): """Return unbuffered tuple of (topic, xrefs). diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,8 @@ Library ------- +- Issue #18716: Deprecate the formatter module. + - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. - Issue #17839: base64.decodebytes and base64.encodebytes now accept any -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 4 20:47:28 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 4 Oct 2013 20:47:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Run_test?= =?utf-8?q?=2Etest=5Fimportlib=2Etest=5Fabc_under_both?= Message-ID: <3cs0Sc6HpSz7LjS@mail.python.org> http://hg.python.org/cpython/rev/f0416b2b5654 changeset: 85959:f0416b2b5654 user: Brett Cannon date: Fri Oct 04 14:47:14 2013 -0400 summary: Issue #16803: Run test.test_importlib.test_abc under both _frozen_importlib and source. files: Lib/test/test_importlib/test_abc.py | 419 +++++++++++---- Lib/test/test_importlib/util.py | 9 + 2 files changed, 308 insertions(+), 120 deletions(-) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -1,8 +1,3 @@ -import importlib -import importlib.util -from importlib import abc -from importlib import machinery - import contextlib import inspect import io @@ -16,6 +11,10 @@ from . import util +frozen_init, source_init = util.import_importlib('importlib') +frozen_abc, source_abc = util.import_importlib('importlib.abc') +frozen_util, source_util = util.import_importlib('importlib.util') + ##### Inheritance ############################################################## class InheritanceTests: @@ -27,8 +26,19 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.superclasses = [getattr(self.abc, class_name) + for class_name in self.superclass_names] + if hasattr(self, 'subclass_names'): + # Because test.support.import_fresh_module() creates a new + # importlib._bootstrap per module, inheritance checks fail when + # checking across module boundaries (i.e. the _bootstrap in abc is + # not the same as the one in machinery). That means stealing one of + # the modules from the other to make sure the same instance is used. + self.subclasses = [getattr(self.abc.machinery, class_name) + for class_name in self.subclass_names] assert self.subclasses or self.superclasses, self.__class__ - self.__test = getattr(abc, self.__class__.__name__) + testing = self.__class__.__name__.partition('_')[2] + self.__test = getattr(self.abc, testing) def test_subclasses(self): # Test that the expected subclasses inherit. @@ -42,59 +52,104 @@ self.assertTrue(issubclass(self.__test, superclass), "{0} is not a superclass of {1}".format(superclass, self.__test)) +def create_inheritance_tests(base_class): + def set_frozen(ns): + ns['abc'] = frozen_abc + def set_source(ns): + ns['abc'] = source_abc -class MetaPathFinder(InheritanceTests, unittest.TestCase): + classes = [] + for prefix, ns_set in [('Frozen', set_frozen), ('Source', set_source)]: + classes.append(types.new_class('_'.join([prefix, base_class.__name__]), + (base_class, unittest.TestCase), + exec_body=ns_set)) + return classes - superclasses = [abc.Finder] - subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter, - machinery.PathFinder, machinery.WindowsRegistryFinder] +class MetaPathFinder(InheritanceTests): + superclass_names = ['Finder'] + subclass_names = ['BuiltinImporter', 'FrozenImporter', 'PathFinder', + 'WindowsRegistryFinder'] -class PathEntryFinder(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(MetaPathFinder) +Frozen_MetaPathFinderInheritanceTests, Source_MetaPathFinderInheritanceTests = tests - superclasses = [abc.Finder] - subclasses = [machinery.FileFinder] +class PathEntryFinder(InheritanceTests): + superclass_names = ['Finder'] + subclass_names = ['FileFinder'] -class ResourceLoader(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(PathEntryFinder) +Frozen_PathEntryFinderInheritanceTests, Source_PathEntryFinderInheritanceTests = tests - superclasses = [abc.Loader] +class ResourceLoader(InheritanceTests): + superclass_names = ['Loader'] -class InspectLoader(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(ResourceLoader) +Frozen_ResourceLoaderInheritanceTests, Source_ResourceLoaderInheritanceTests = tests - superclasses = [abc.Loader] - subclasses = [machinery.BuiltinImporter, - machinery.FrozenImporter, machinery.ExtensionFileLoader] +class InspectLoader(InheritanceTests): + superclass_names = ['Loader'] + subclass_names = ['BuiltinImporter', 'FrozenImporter', 'ExtensionFileLoader'] -class ExecutionLoader(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(InspectLoader) +Frozen_InspectLoaderInheritanceTests, Source_InspectLoaderInheritanceTests = tests - superclasses = [abc.InspectLoader] +class ExecutionLoader(InheritanceTests): + superclass_names = ['InspectLoader'] -class FileLoader(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(ExecutionLoader) +Frozen_ExecutionLoaderInheritanceTests, Source_ExecutionLoaderInheritanceTests = tests - superclasses = [abc.ResourceLoader, abc.ExecutionLoader] - subclasses = [machinery.SourceFileLoader, machinery.SourcelessFileLoader] +class FileLoader(InheritanceTests): + superclass_names = ['ResourceLoader', 'ExecutionLoader'] + subclass_names = ['SourceFileLoader', 'SourcelessFileLoader'] -class SourceLoader(InheritanceTests, unittest.TestCase): +tests = create_inheritance_tests(FileLoader) +Frozen_FileLoaderInheritanceTests, Source_FileLoaderInheritanceTests = tests - superclasses = [abc.ResourceLoader, abc.ExecutionLoader] - subclasses = [machinery.SourceFileLoader] +class SourceLoader(InheritanceTests): + superclass_names = ['ResourceLoader', 'ExecutionLoader'] + subclass_names = ['SourceFileLoader'] + +tests = create_inheritance_tests(SourceLoader) +Frozen_SourceLoaderInheritanceTests, Source_SourceLoaderInheritanceTests = tests ##### Default return values #################################################### -class MetaPathFinderSubclass(abc.MetaPathFinder): +def make_abc_subclasses(base_class): + classes = [] + for kind, abc in [('Frozen', frozen_abc), ('Source', source_abc)]: + name = '_'.join([kind, base_class.__name__]) + base_classes = base_class, getattr(abc, base_class.__name__) + classes.append(types.new_class(name, base_classes)) + return classes + +def make_return_value_tests(base_class, test_class): + frozen_class, source_class = make_abc_subclasses(base_class) + tests = [] + for prefix, class_in_test in [('Frozen', frozen_class), ('Source', source_class)]: + def set_ns(ns): + ns['ins'] = class_in_test() + tests.append(types.new_class('_'.join([prefix, test_class.__name__]), + (test_class, unittest.TestCase), + exec_body=set_ns)) + return tests + + +class MetaPathFinder: def find_module(self, fullname, path): return super().find_module(fullname, path) +Frozen_MPF, Source_MPF = make_abc_subclasses(MetaPathFinder) -class MetaPathFinderDefaultsTests(unittest.TestCase): - ins = MetaPathFinderSubclass() +class MetaPathFinderDefaultsTests: def test_find_module(self): # Default should return None. @@ -105,15 +160,19 @@ self.ins.invalidate_caches() -class PathEntryFinderSubclass(abc.PathEntryFinder): +tests = make_return_value_tests(MetaPathFinder, MetaPathFinderDefaultsTests) +Frozen_MPFDefaultTests, Source_MPFDefaultTests = tests + + +class PathEntryFinder: def find_loader(self, fullname): return super().find_loader(fullname) +Frozen_PEF, Source_PEF = make_abc_subclasses(PathEntryFinder) -class PathEntryFinderDefaultsTests(unittest.TestCase): - ins = PathEntryFinderSubclass() +class PathEntryFinderDefaultsTests: def test_find_loader(self): self.assertEqual((None, []), self.ins.find_loader('something')) @@ -126,15 +185,20 @@ self.ins.invalidate_caches() -class LoaderSubclass(abc.Loader): +tests = make_return_value_tests(PathEntryFinder, PathEntryFinderDefaultsTests) +Frozen_PEFDefaultTests, Source_PEFDefaultTests = tests + + +class Loader: def load_module(self, fullname): return super().load_module(fullname) -class LoaderDefaultsTests(unittest.TestCase): +Frozen_L, Source_L = make_abc_subclasses(Loader) - ins = LoaderSubclass() + +class LoaderDefaultsTests: def test_load_module(self): with self.assertRaises(ImportError): @@ -150,22 +214,31 @@ self.assertTrue(repr(mod)) -class ResourceLoaderSubclass(LoaderSubclass, abc.ResourceLoader): +tests = make_return_value_tests(Loader, LoaderDefaultsTests) +Frozen_LDefaultTests, SourceLDefaultTests = tests + + +class ResourceLoader(Loader): def get_data(self, path): return super().get_data(path) -class ResourceLoaderDefaultsTests(unittest.TestCase): +Frozen_RL, Source_RL = make_abc_subclasses(ResourceLoader) - ins = ResourceLoaderSubclass() + +class ResourceLoaderDefaultsTests: def test_get_data(self): with self.assertRaises(IOError): self.ins.get_data('/some/path') -class InspectLoaderSubclass(LoaderSubclass, abc.InspectLoader): +tests = make_return_value_tests(ResourceLoader, ResourceLoaderDefaultsTests) +Frozen_RLDefaultTests, Source_RLDefaultTests = tests + + +class InspectLoader(Loader): def is_package(self, fullname): return super().is_package(fullname) @@ -174,9 +247,10 @@ return super().get_source(fullname) -class InspectLoaderDefaultsTests(unittest.TestCase): +Frozen_IL, Source_IL = make_abc_subclasses(InspectLoader) - ins = InspectLoaderSubclass() + +class InspectLoaderDefaultsTests: def test_is_package(self): with self.assertRaises(ImportError): @@ -187,37 +261,52 @@ self.ins.get_source('blah') -class ExecutionLoaderSubclass(InspectLoaderSubclass, abc.ExecutionLoader): +tests = make_return_value_tests(InspectLoader, InspectLoaderDefaultsTests) +Frozen_ILDefaultTests, Source_ILDefaultTests = tests + + +class ExecutionLoader(InspectLoader): def get_filename(self, fullname): return super().get_filename(fullname) +Frozen_EL, Source_EL = make_abc_subclasses(ExecutionLoader) -class ExecutionLoaderDefaultsTests(unittest.TestCase): - ins = ExecutionLoaderSubclass() +class ExecutionLoaderDefaultsTests: def test_get_filename(self): with self.assertRaises(ImportError): self.ins.get_filename('blah') + +tests = make_return_value_tests(ExecutionLoader, InspectLoaderDefaultsTests) +Frozen_ELDefaultTests, Source_ELDefaultsTests = tests + ##### Loader concrete methods ################################################## -class LoaderConcreteMethodTests(unittest.TestCase): +class LoaderConcreteMethodTests: def test_init_module_attrs(self): - loader = LoaderSubclass() + loader = self.LoaderSubclass() module = types.ModuleType('blah') loader.init_module_attrs(module) self.assertEqual(module.__loader__, loader) +class Frozen_LoaderConcreateMethodTests(LoaderConcreteMethodTests, unittest.TestCase): + LoaderSubclass = Frozen_L + +class Source_LoaderConcreateMethodTests(LoaderConcreteMethodTests, unittest.TestCase): + LoaderSubclass = Source_L + + ##### InspectLoader concrete methods ########################################### -class InspectLoaderSourceToCodeTests(unittest.TestCase): +class InspectLoaderSourceToCodeTests: def source_to_module(self, data, path=None): """Help with source_to_code() tests.""" module = types.ModuleType('blah') - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() if path is None: code = loader.source_to_code(data) else: @@ -242,54 +331,67 @@ def test_source_to_code_path(self): # Specifying a path should set it for the code object. path = 'path/to/somewhere' - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() code = loader.source_to_code('', path) self.assertEqual(code.co_filename, path) def test_source_to_code_no_path(self): # Not setting a path should still work and be set to since that # is a pre-existing practice as a default to compile(). - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() code = loader.source_to_code('') self.assertEqual(code.co_filename, '') -class InspectLoaderGetCodeTests(unittest.TestCase): +class Frozen_ILSourceToCodeTests(InspectLoaderSourceToCodeTests, unittest.TestCase): + InspectLoaderSubclass = Frozen_IL + +class Source_ILSourceToCodeTests(InspectLoaderSourceToCodeTests, unittest.TestCase): + InspectLoaderSubclass = Source_IL + + +class InspectLoaderGetCodeTests: def test_get_code(self): # Test success. module = types.ModuleType('blah') - with mock.patch.object(InspectLoaderSubclass, 'get_source') as mocked: + with mock.patch.object(self.InspectLoaderSubclass, 'get_source') as mocked: mocked.return_value = 'attr = 42' - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() code = loader.get_code('blah') exec(code, module.__dict__) self.assertEqual(module.attr, 42) def test_get_code_source_is_None(self): # If get_source() is None then this should be None. - with mock.patch.object(InspectLoaderSubclass, 'get_source') as mocked: + with mock.patch.object(self.InspectLoaderSubclass, 'get_source') as mocked: mocked.return_value = None - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() code = loader.get_code('blah') self.assertIsNone(code) def test_get_code_source_not_found(self): # If there is no source then there is no code object. - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() with self.assertRaises(ImportError): loader.get_code('blah') -class InspectLoaderInitModuleTests(unittest.TestCase): +class Frozen_ILGetCodeTests(InspectLoaderGetCodeTests, unittest.TestCase): + InspectLoaderSubclass = Frozen_IL - @staticmethod - def mock_is_package(return_value): - return mock.patch.object(InspectLoaderSubclass, 'is_package', +class Source_ILGetCodeTests(InspectLoaderGetCodeTests, unittest.TestCase): + InspectLoaderSubclass = Source_IL + + +class InspectLoaderInitModuleTests: + + def mock_is_package(self, return_value): + return mock.patch.object(self.InspectLoaderSubclass, 'is_package', return_value=return_value) def init_module_attrs(self, name): - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() module = types.ModuleType(name) loader.init_module_attrs(module) self.assertEqual(module.__loader__, loader) @@ -329,7 +431,14 @@ self.assertFalse(hasattr(module, '__path__')) -class InspectLoaderLoadModuleTests(unittest.TestCase): +class Frozen_ILInitModuleTests(InspectLoaderInitModuleTests, unittest.TestCase): + InspectLoaderSubclass = Frozen_IL + +class Source_ILInitModuleTests(InspectLoaderInitModuleTests, unittest.TestCase): + InspectLoaderSubclass = Source_IL + + +class InspectLoaderLoadModuleTests: """Test InspectLoader.load_module().""" @@ -340,14 +449,14 @@ self.addCleanup(support.unload, self.module_name) def mock_get_code(self): - return mock.patch.object(InspectLoaderSubclass, 'get_code') + return mock.patch.object(self.InspectLoaderSubclass, 'get_code') def test_get_code_ImportError(self): # If get_code() raises ImportError, it should propagate. with self.mock_get_code() as mocked_get_code: mocked_get_code.side_effect = ImportError with self.assertRaises(ImportError): - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() loader.load_module(self.module_name) def test_get_code_None(self): @@ -355,7 +464,7 @@ with self.mock_get_code() as mocked_get_code: mocked_get_code.return_value = None with self.assertRaises(ImportError): - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() loader.load_module(self.module_name) def test_module_returned(self): @@ -363,21 +472,28 @@ code = compile('attr = 42', '', 'exec') with self.mock_get_code() as mocked_get_code: mocked_get_code.return_value = code - loader = InspectLoaderSubclass() + loader = self.InspectLoaderSubclass() module = loader.load_module(self.module_name) self.assertEqual(module, sys.modules[self.module_name]) +class Frozen_ILLoadModuleTests(InspectLoaderLoadModuleTests, unittest.TestCase): + InspectLoaderSubclass = Frozen_IL + +class Source_ILLoadModuleTests(InspectLoaderLoadModuleTests, unittest.TestCase): + InspectLoaderSubclass = Source_IL + + ##### ExecutionLoader concrete methods ######################################### -class ExecutionLoaderGetCodeTests(unittest.TestCase): +class ExecutionLoaderGetCodeTests: def mock_methods(self, *, get_source=False, get_filename=False): source_mock_context, filename_mock_context = None, None if get_source: - source_mock_context = mock.patch.object(ExecutionLoaderSubclass, + source_mock_context = mock.patch.object(self.ExecutionLoaderSubclass, 'get_source') if get_filename: - filename_mock_context = mock.patch.object(ExecutionLoaderSubclass, + filename_mock_context = mock.patch.object(self.ExecutionLoaderSubclass, 'get_filename') return source_mock_context, filename_mock_context @@ -388,7 +504,7 @@ with source_mock_context as source_mock, filename_mock_context as name_mock: source_mock.return_value = 'attr = 42' name_mock.return_value = path - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() code = loader.get_code('blah') self.assertEqual(code.co_filename, path) module = types.ModuleType('blah') @@ -400,13 +516,13 @@ source_mock_context, _ = self.mock_methods(get_source=True) with source_mock_context as mocked: mocked.return_value = None - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() code = loader.get_code('blah') self.assertIsNone(code) def test_get_code_source_not_found(self): # If there is no source then there is no code object. - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() with self.assertRaises(ImportError): loader.get_code('blah') @@ -418,7 +534,7 @@ with source_mock_context as source_mock, filename_mock_context as name_mock: source_mock.return_value = 'attr = 42' name_mock.side_effect = ImportError - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() code = loader.get_code('blah') self.assertEqual(code.co_filename, '') module = types.ModuleType('blah') @@ -426,13 +542,23 @@ self.assertEqual(module.attr, 42) -class ExecutionLoaderInitModuleTests(unittest.TestCase): +class Frozen_ELGetCodeTests(ExecutionLoaderGetCodeTests, unittest.TestCase): + ExecutionLoaderSubclass = Frozen_EL - @staticmethod +class Source_ELGetCodeTests(ExecutionLoaderGetCodeTests, unittest.TestCase): + ExecutionLoaderSubclass = Source_EL + + +class ExecutionLoaderInitModuleTests: + + def mock_is_package(self, return_value): + return mock.patch.object(self.ExecutionLoaderSubclass, 'is_package', + return_value=return_value) + @contextlib.contextmanager - def mock_methods(is_package, filename): - is_package_manager = InspectLoaderInitModuleTests.mock_is_package(is_package) - get_filename_manager = mock.patch.object(ExecutionLoaderSubclass, + def mock_methods(self, is_package, filename): + is_package_manager = self.mock_is_package(is_package) + get_filename_manager = mock.patch.object(self.ExecutionLoaderSubclass, 'get_filename', return_value=filename) with is_package_manager as mock_is_package: with get_filename_manager as mock_get_filename: @@ -444,7 +570,7 @@ name = 'blah' path = os.path.join('some', 'path', '{}.py'.format(name)) with self.mock_methods(False, path): - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() module = types.ModuleType(name) loader.init_module_attrs(module) self.assertIs(module.__loader__, loader) @@ -457,7 +583,7 @@ name = 'pkg' path = os.path.join('some', 'pkg', '__init__.py') with self.mock_methods(True, path): - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() module = types.ModuleType(name) loader.init_module_attrs(module) self.assertIs(module.__loader__, loader) @@ -471,7 +597,7 @@ name = 'pkg.submodule' path = os.path.join('some', 'pkg', 'submodule.py') with self.mock_methods(False, path): - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() module = types.ModuleType(name) loader.init_module_attrs(module) self.assertEqual(module.__package__, 'pkg') @@ -484,14 +610,21 @@ path = 'blah.py' with self.mock_methods(False, path) as mocked_methods: mocked_methods['get_filename'].side_effect = ImportError - loader = ExecutionLoaderSubclass() + loader = self.ExecutionLoaderSubclass() module = types.ModuleType(name) loader.init_module_attrs(module) self.assertFalse(hasattr(module, '__file__')) +class Frozen_ELInitModuleTests(ExecutionLoaderInitModuleTests, unittest.TestCase): + ExecutionLoaderSubclass = Frozen_EL + +class Source_ELInitModuleTests(ExecutionLoaderInitModuleTests, unittest.TestCase): + ExecutionLoaderSubclass = Source_EL + + ##### SourceLoader concrete methods ############################################ -class SourceOnlyLoaderMock(abc.SourceLoader): +class SourceLoader: # Globals that should be defined for all modules. source = (b"_ = '::'.join([__name__, __file__, __cached__, __package__, " @@ -512,17 +645,22 @@ return '' -class SourceLoaderMock(SourceOnlyLoaderMock): +Frozen_SourceOnlyL, Source_SourceOnlyL = make_abc_subclasses(SourceLoader) + + +class SourceLoader(SourceLoader): source_mtime = 1 - def __init__(self, path, magic=importlib.util.MAGIC_NUMBER): + def __init__(self, path, magic=None): super().__init__(path) - self.bytecode_path = importlib.util.cache_from_source(self.path) + self.bytecode_path = self.util.cache_from_source(self.path) self.source_size = len(self.source) + if magic is None: + magic = self.util.MAGIC_NUMBER data = bytearray(magic) - data.extend(importlib._w_long(self.source_mtime)) - data.extend(importlib._w_long(self.source_size)) + data.extend(self.init._w_long(self.source_mtime)) + data.extend(self.init._w_long(self.source_size)) code_object = compile(self.source, self.path, 'exec', dont_inherit=True) data.extend(marshal.dumps(code_object)) @@ -547,7 +685,14 @@ return path == self.bytecode_path -class SourceLoaderTestHarness(unittest.TestCase): +Frozen_SL, Source_SL = make_abc_subclasses(SourceLoader) +Frozen_SL.util = frozen_util +Source_SL.util = source_util +Frozen_SL.init = frozen_init +Source_SL.init = source_init + + +class SourceLoaderTestHarness: def setUp(self, *, is_package=True, **kwargs): self.package = 'pkg' @@ -558,7 +703,7 @@ module_name = 'mod' self.path = os.path.join(self.package, '.'.join(['mod', 'py'])) self.name = '.'.join([self.package, module_name]) - self.cached = importlib.util.cache_from_source(self.path) + self.cached = self.util.cache_from_source(self.path) self.loader = self.loader_mock(self.path, **kwargs) def verify_module(self, module): @@ -594,8 +739,6 @@ """ - loader_mock = SourceOnlyLoaderMock - def test_get_source(self): # Verify the source code is returned as a string. # If an OSError is raised by get_data then raise ImportError. @@ -659,6 +802,15 @@ self.assertEqual(returned_source, source) +class Frozen_SourceOnlyLTests(SourceOnlyLoaderTests, unittest.TestCase): + loader_mock = Frozen_SourceOnlyL + util = frozen_util + +class Source_SourceOnlyLTests(SourceOnlyLoaderTests, unittest.TestCase): + loader_mock = Source_SourceOnlyL + util = source_util + + @unittest.skipIf(sys.dont_write_bytecode, "sys.dont_write_bytecode is true") class SourceLoaderBytecodeTests(SourceLoaderTestHarness): @@ -668,15 +820,13 @@ """ - loader_mock = SourceLoaderMock - def verify_code(self, code_object, *, bytecode_written=False): super().verify_code(code_object) if bytecode_written: self.assertIn(self.cached, self.loader.written) - data = bytearray(importlib.util.MAGIC_NUMBER) - data.extend(importlib._w_long(self.loader.source_mtime)) - data.extend(importlib._w_long(self.loader.source_size)) + data = bytearray(self.util.MAGIC_NUMBER) + data.extend(self.init._w_long(self.loader.source_mtime)) + data.extend(self.init._w_long(self.loader.source_size)) data.extend(marshal.dumps(code_object)) self.assertEqual(self.loader.written[self.cached], bytes(data)) @@ -690,7 +840,7 @@ self.loader.bytecode_path = "" # Sanity check with self.assertRaises(OSError): - bytecode_path = importlib.util.cache_from_source(self.path) + bytecode_path = self.util.cache_from_source(self.path) self.loader.get_data(bytecode_path) code_object = self.loader.get_code(self.name) self.verify_code(code_object, bytecode_written=True) @@ -729,13 +879,13 @@ def test_no_set_data(self): # If set_data is not defined, one can still read bytecode. self.setUp(magic=b'0000') - original_set_data = self.loader.__class__.set_data + original_set_data = self.loader.__class__.mro()[1].set_data try: - del self.loader.__class__.set_data + del self.loader.__class__.mro()[1].set_data code_object = self.loader.get_code(self.name) self.verify_code(code_object) finally: - self.loader.__class__.set_data = original_set_data + self.loader.__class__.mro()[1].set_data = original_set_data def test_set_data_raises_exceptions(self): # Raising NotImplementedError or OSError is okay for set_data. @@ -750,14 +900,25 @@ self.verify_code(code_object) -class SourceLoaderGetSourceTests(unittest.TestCase): +class Frozen_SLBytecodeTests(SourceLoaderBytecodeTests, unittest.TestCase): + loader_mock = Frozen_SL + init = frozen_init + util = frozen_util + +class SourceSLBytecodeTests(SourceLoaderBytecodeTests, unittest.TestCase): + loader_mock = Source_SL + init = source_init + util = source_util + + +class SourceLoaderGetSourceTests: """Tests for importlib.abc.SourceLoader.get_source().""" def test_default_encoding(self): # Should have no problems with UTF-8 text. name = 'mod' - mock = SourceOnlyLoaderMock('mod.file') + mock = self.SourceOnlyLoaderMock('mod.file') source = 'x = "?"' mock.source = source.encode('utf-8') returned_source = mock.get_source(name) @@ -766,7 +927,7 @@ def test_decoded_source(self): # Decoding should work. name = 'mod' - mock = SourceOnlyLoaderMock("mod.file") + mock = self.SourceOnlyLoaderMock("mod.file") source = "# coding: Latin-1\nx='?'" assert source.encode('latin-1') != source.encode('utf-8') mock.source = source.encode('latin-1') @@ -776,14 +937,21 @@ def test_universal_newlines(self): # PEP 302 says universal newlines should be used. name = 'mod' - mock = SourceOnlyLoaderMock('mod.file') + mock = self.SourceOnlyLoaderMock('mod.file') source = "x = 42\r\ny = -13\r\n" mock.source = source.encode('utf-8') expect = io.IncrementalNewlineDecoder(None, True).decode(source) self.assertEqual(mock.get_source(name), expect) -class SourceLoaderInitModuleAttrTests(unittest.TestCase): +class Frozen_SourceOnlyLGetSourceTests(SourceLoaderGetSourceTests, unittest.TestCase): + SourceOnlyLoaderMock = Frozen_SourceOnlyL + +class Source_SourceOnlyLGetSourceTests(SourceLoaderGetSourceTests, unittest.TestCase): + SourceOnlyLoaderMock = Source_SourceOnlyL + + +class SourceLoaderInitModuleAttrTests: """Tests for importlib.abc.SourceLoader.init_module_attrs().""" @@ -791,14 +959,31 @@ # If __file__ set, __cached__ == importlib.util.cached_from_source(__file__). name = 'blah' path = 'blah.py' - loader = SourceOnlyLoaderMock(path) + loader = self.SourceOnlyLoaderMock(path) module = types.ModuleType(name) loader.init_module_attrs(module) self.assertEqual(module.__loader__, loader) self.assertEqual(module.__package__, '') self.assertEqual(module.__file__, path) - self.assertEqual(module.__cached__, importlib.util.cache_from_source(path)) + self.assertEqual(module.__cached__, self.util.cache_from_source(path)) + def test_no_get_filename(self): + # No __file__, no __cached__. + with mock.patch.object(self.SourceOnlyLoaderMock, 'get_filename') as mocked: + mocked.side_effect = ImportError + name = 'blah' + loader = self.SourceOnlyLoaderMock('blah.py') + module = types.ModuleType(name) + loader.init_module_attrs(module) + self.assertFalse(hasattr(module, '__file__')) + self.assertFalse(hasattr(module, '__cached__')) + + +class Frozen_SLInitModuleAttrTests(SourceLoaderInitModuleAttrTests, unittest.TestCase): + SourceOnlyLoaderMock = Frozen_SourceOnlyL + util = frozen_util + + # Difficult to test under source thanks to cross-module mocking needs. @mock.patch('importlib._bootstrap.cache_from_source') def test_cache_from_source_NotImplementedError(self, mock_cache_from_source): # If importlib.util.cache_from_source() raises NotImplementedError don't set @@ -806,22 +991,16 @@ mock_cache_from_source.side_effect = NotImplementedError name = 'blah' path = 'blah.py' - loader = SourceOnlyLoaderMock(path) + loader = self.SourceOnlyLoaderMock(path) module = types.ModuleType(name) loader.init_module_attrs(module) self.assertEqual(module.__file__, path) self.assertFalse(hasattr(module, '__cached__')) - def test_no_get_filename(self): - # No __file__, no __cached__. - with mock.patch.object(SourceOnlyLoaderMock, 'get_filename') as mocked: - mocked.side_effect = ImportError - name = 'blah' - loader = SourceOnlyLoaderMock('blah.py') - module = types.ModuleType(name) - loader.init_module_attrs(module) - self.assertFalse(hasattr(module, '__file__')) - self.assertFalse(hasattr(module, '__cached__')) + +class Source_SLInitModuleAttrTests(SourceLoaderInitModuleAttrTests, unittest.TestCase): + SourceOnlyLoaderMock = Source_SourceOnlyL + util = source_util diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -6,6 +6,15 @@ import types +def import_importlib(module_name): + """Import a module from importlib both w/ and w/o _frozen_importlib.""" + fresh = ('importlib',) if '.' in module_name else () + frozen = support.import_fresh_module(module_name) + source = support.import_fresh_module(module_name, fresh=fresh, + blocked=('_frozen_importlib',)) + return frozen, source + + CASE_INSENSITIVE_FS = True # Windows is the only OS that is *always* case-insensitive # (OS X *can* be case-sensitive). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 01:53:36 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sat, 5 Oct 2013 01:53:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NTk0?= =?utf-8?q?=3A__Make_the_C_code_more_closely_match_the_pure_python_code=2E?= Message-ID: <3cs7Fr6snxzRmw@mail.python.org> http://hg.python.org/cpython/rev/e4cec1116e5c changeset: 85960:e4cec1116e5c branch: 3.3 parent: 85955:bfebfadfc4aa user: Raymond Hettinger date: Fri Oct 04 16:51:02 2013 -0700 summary: Issue #18594: Make the C code more closely match the pure python code. files: Lib/test/test_collections.py | 24 +++++++++++++++++++ Modules/_collectionsmodule.c | 29 ++++++++++++----------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -818,6 +818,24 @@ ### Counter ################################################################################ +class CounterSubclassWithSetItem(Counter): + # Test a counter subclass that overrides __setitem__ + def __init__(self, *args, **kwds): + self.called = False + Counter.__init__(self, *args, **kwds) + def __setitem__(self, key, value): + self.called = True + Counter.__setitem__(self, key, value) + +class CounterSubclassWithGet(Counter): + # Test a counter subclass that overrides get() + def __init__(self, *args, **kwds): + self.called = False + Counter.__init__(self, *args, **kwds) + def get(self, key, default): + self.called = True + return Counter.get(self, key, default) + class TestCounter(unittest.TestCase): def test_basics(self): @@ -1022,6 +1040,12 @@ self.assertEqual(m, OrderedDict([('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)])) + # test fidelity to the pure python version + c = CounterSubclassWithSetItem('abracadabra') + self.assertTrue(c.called) + c = CounterSubclassWithGet('abracadabra') + self.assertTrue(c.called) + ################################################################################ ### OrderedDict diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1689,17 +1689,17 @@ static PyObject * _count_elements(PyObject *self, PyObject *args) { - _Py_IDENTIFIER(__getitem__); + _Py_IDENTIFIER(get); _Py_IDENTIFIER(__setitem__); PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *zero = NULL; PyObject *one = NULL; - PyObject *mapping_get = NULL; - PyObject *mapping_getitem; + PyObject *bound_get = NULL; + PyObject *mapping_get; + PyObject *dict_get; PyObject *mapping_setitem; - PyObject *dict_getitem; PyObject *dict_setitem; if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) @@ -1713,15 +1713,16 @@ if (one == NULL) goto done; - mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); - dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); + /* Only take the fast path when get() and __setitem__() + * have not been overridden. + */ + mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get); + dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get); mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__); dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__); - if (mapping_getitem != NULL && - mapping_getitem == dict_getitem && - mapping_setitem != NULL && - mapping_setitem == dict_setitem) { + if (mapping_get != NULL && mapping_get == dict_get && + mapping_setitem != NULL && mapping_setitem == dict_setitem) { while (1) { key = PyIter_Next(it); if (key == NULL) @@ -1741,8 +1742,8 @@ Py_DECREF(key); } } else { - mapping_get = PyObject_GetAttrString(mapping, "get"); - if (mapping_get == NULL) + bound_get = PyObject_GetAttrString(mapping, "get"); + if (bound_get == NULL) goto done; zero = PyLong_FromLong(0); @@ -1753,7 +1754,7 @@ key = PyIter_Next(it); if (key == NULL) break; - oldval = PyObject_CallFunctionObjArgs(mapping_get, key, zero, NULL); + oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL); if (oldval == NULL) break; newval = PyNumber_Add(oldval, one); @@ -1771,7 +1772,7 @@ Py_DECREF(it); Py_XDECREF(key); Py_XDECREF(newval); - Py_XDECREF(mapping_get); + Py_XDECREF(bound_get); Py_XDECREF(zero); Py_XDECREF(one); if (PyErr_Occurred()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 01:53:38 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sat, 5 Oct 2013 01:53:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cs7Ft2ZBWzRmw@mail.python.org> http://hg.python.org/cpython/rev/50e0ed353c7f changeset: 85961:50e0ed353c7f parent: 85959:f0416b2b5654 parent: 85960:e4cec1116e5c user: Raymond Hettinger date: Fri Oct 04 16:52:39 2013 -0700 summary: merge files: Lib/test/test_collections.py | 24 +++++++++++++++++++ Modules/_collectionsmodule.c | 29 ++++++++++++----------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -852,6 +852,24 @@ ### Counter ################################################################################ +class CounterSubclassWithSetItem(Counter): + # Test a counter subclass that overrides __setitem__ + def __init__(self, *args, **kwds): + self.called = False + Counter.__init__(self, *args, **kwds) + def __setitem__(self, key, value): + self.called = True + Counter.__setitem__(self, key, value) + +class CounterSubclassWithGet(Counter): + # Test a counter subclass that overrides get() + def __init__(self, *args, **kwds): + self.called = False + Counter.__init__(self, *args, **kwds) + def get(self, key, default): + self.called = True + return Counter.get(self, key, default) + class TestCounter(unittest.TestCase): def test_basics(self): @@ -1059,6 +1077,12 @@ self.assertEqual(m, OrderedDict([('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)])) + # test fidelity to the pure python version + c = CounterSubclassWithSetItem('abracadabra') + self.assertTrue(c.called) + c = CounterSubclassWithGet('abracadabra') + self.assertTrue(c.called) + ################################################################################ ### OrderedDict diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1763,17 +1763,17 @@ static PyObject * _count_elements(PyObject *self, PyObject *args) { - _Py_IDENTIFIER(__getitem__); + _Py_IDENTIFIER(get); _Py_IDENTIFIER(__setitem__); PyObject *it, *iterable, *mapping, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *zero = NULL; PyObject *one = NULL; - PyObject *mapping_get = NULL; - PyObject *mapping_getitem; + PyObject *bound_get = NULL; + PyObject *mapping_get; + PyObject *dict_get; PyObject *mapping_setitem; - PyObject *dict_getitem; PyObject *dict_setitem; if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) @@ -1787,15 +1787,16 @@ if (one == NULL) goto done; - mapping_getitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___getitem__); - dict_getitem = _PyType_LookupId(&PyDict_Type, &PyId___getitem__); + /* Only take the fast path when get() and __setitem__() + * have not been overridden. + */ + mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get); + dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get); mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__); dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__); - if (mapping_getitem != NULL && - mapping_getitem == dict_getitem && - mapping_setitem != NULL && - mapping_setitem == dict_setitem) { + if (mapping_get != NULL && mapping_get == dict_get && + mapping_setitem != NULL && mapping_setitem == dict_setitem) { while (1) { key = PyIter_Next(it); if (key == NULL) @@ -1815,8 +1816,8 @@ Py_DECREF(key); } } else { - mapping_get = PyObject_GetAttrString(mapping, "get"); - if (mapping_get == NULL) + bound_get = PyObject_GetAttrString(mapping, "get"); + if (bound_get == NULL) goto done; zero = PyLong_FromLong(0); @@ -1827,7 +1828,7 @@ key = PyIter_Next(it); if (key == NULL) break; - oldval = PyObject_CallFunctionObjArgs(mapping_get, key, zero, NULL); + oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL); if (oldval == NULL) break; newval = PyNumber_Add(oldval, one); @@ -1845,7 +1846,7 @@ Py_DECREF(it); Py_XDECREF(key); Py_XDECREF(newval); - Py_XDECREF(mapping_get); + Py_XDECREF(bound_get); Py_XDECREF(zero); Py_XDECREF(one); if (PyErr_Occurred()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 02:14:32 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 02:14:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MTY2OiB1c2Ug?= =?utf-8?q?an_unused_var_in_a_test=2E__Patch_by_Vajrasky_Kok=2E?= Message-ID: <3cs7k05wVCz7LjR@mail.python.org> http://hg.python.org/cpython/rev/92c2e76ca595 changeset: 85962:92c2e76ca595 branch: 2.7 parent: 85957:405245885569 user: Ezio Melotti date: Sat Oct 05 03:01:37 2013 +0300 summary: #19166: use an unused var in a test. Patch by Vajrasky Kok. files: Lib/test/test_dict.py | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -33,9 +33,11 @@ self.assertEqual(d.keys(), []) d = {'a': 1, 'b': 2} k = d.keys() + self.assertEqual(set(k), {'a', 'b'}) + self.assertIn('a', k) + self.assertIn('b', k) self.assertTrue(d.has_key('a')) self.assertTrue(d.has_key('b')) - self.assertRaises(TypeError, d.keys, None) def test_values(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 02:14:34 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 02:14:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MTY2OiB1c2Ug?= =?utf-8?q?an_unused_var_in_a_test=2E__Patch_by_Vajrasky_Kok=2E?= Message-ID: <3cs7k20Z3bz7LjV@mail.python.org> http://hg.python.org/cpython/rev/33bbc60705e8 changeset: 85963:33bbc60705e8 branch: 3.3 parent: 85960:e4cec1116e5c user: Ezio Melotti date: Sat Oct 05 03:07:03 2013 +0300 summary: #19166: use an unused var in a test. Patch by Vajrasky Kok. files: Lib/test/test_dict.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -45,6 +45,9 @@ self.assertEqual(set(d.keys()), set()) d = {'a': 1, 'b': 2} k = d.keys() + self.assertEqual(set(k), {'a', 'b'}) + self.assertIn('a', k) + self.assertIn('b', k) self.assertIn('a', d) self.assertIn('b', d) self.assertRaises(TypeError, d.keys, None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 02:14:35 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 02:14:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MTY2OiBtZXJnZSB3aXRoIDMuMy4=?= Message-ID: <3cs7k32N2nz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/16a88d026571 changeset: 85964:16a88d026571 parent: 85961:50e0ed353c7f parent: 85963:33bbc60705e8 user: Ezio Melotti date: Sat Oct 05 03:14:13 2013 +0300 summary: #19166: merge with 3.3. files: Lib/test/test_dict.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -45,6 +45,9 @@ self.assertEqual(set(d.keys()), set()) d = {'a': 1, 'b': 2} k = d.keys() + self.assertEqual(set(k), {'a', 'b'}) + self.assertIn('a', k) + self.assertIn('b', k) self.assertIn('a', d) self.assertIn('b', d) self.assertRaises(TypeError, d.keys, None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 03:13:45 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 03:13:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2319148=3A_fix_markup_err?= =?utf-8?q?ors_and_wording_in_enum_docs=2E__Patch_by_Esa_Peuha=2E?= Message-ID: <3cs92K617NzRMx@mail.python.org> http://hg.python.org/cpython/rev/db94fc7218fa changeset: 85965:db94fc7218fa user: Ezio Melotti date: Sat Oct 05 04:13:18 2013 +0300 summary: #19148: fix markup errors and wording in enum docs. Patch by Esa Peuha. files: Doc/library/enum.rst | 14 +++++++------- Misc/ACKS | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -250,7 +250,7 @@ True Comparisons against non-enumeration values will always compare not equal -(again, class:`IntEnum` was explicitly designed to behave differently, see +(again, :class:`IntEnum` was explicitly designed to behave differently, see below):: >>> Color.blue == 2 @@ -594,8 +594,8 @@ .. note:: This is a useful example for subclassing Enum to add or change other - behaviors as well as disallowing aliases. If the only change desired is - no aliases allowed the :func:`unique` decorator can be used instead. + behaviors as well as disallowing aliases. If the only desired change is + disallowing aliases the :func:`unique` decorator can be used instead. Planet @@ -671,11 +671,11 @@ ... AttributeError: 'Color' object has no attribute 'blue' - Likewise, the :attr:`__members__` is only available on the class. +Likewise, the :attr:`__members__` is only available on the class. - If you give your :class:`Enum` subclass extra methods, like the `Planet`_ - class above, those methods will show up in a :func:`dir` of the member, - but not of the class:: +If you give your :class:`Enum` subclass extra methods, like the `Planet`_ +class above, those methods will show up in a :func:`dir` of the member, +but not of the class:: >>> dir(Planet) ['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__'] diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -988,6 +988,7 @@ Roumen Petrov Bjorn Pettersen Justin D. Pettit +Esa Peuha Ronny Pfannschmidt Geoff Philbrick Gavrie Philipson -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 03:26:30 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 03:26:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_missing_comma=2E?= Message-ID: <3cs9K24Vtrz7LkS@mail.python.org> http://hg.python.org/cpython/rev/1bbe94419042 changeset: 85966:1bbe94419042 user: Ezio Melotti date: Sat Oct 05 04:26:06 2013 +0300 summary: Add missing comma. files: Doc/library/enum.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -595,7 +595,7 @@ This is a useful example for subclassing Enum to add or change other behaviors as well as disallowing aliases. If the only desired change is - disallowing aliases the :func:`unique` decorator can be used instead. + disallowing aliases, the :func:`unique` decorator can be used instead. Planet -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 04:40:05 2013 From: python-checkins at python.org (eric.snow) Date: Sat, 5 Oct 2013 04:40:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=5Bissue_19152=5D_Ensure_w?= =?utf-8?q?e_have_actually_registered_ExtensionFileLoader_as_an?= Message-ID: <3csBxx6hPLz7LjT@mail.python.org> http://hg.python.org/cpython/rev/62d045a873bb changeset: 85967:62d045a873bb user: Eric Snow date: Fri Oct 04 20:28:52 2013 -0600 summary: [issue 19152] Ensure we have actually registered ExtensionFileLoader as an ExecutionLoader. files: Lib/importlib/abc.py | 4 ++-- Lib/test/test_importlib/test_abc.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -188,7 +188,7 @@ load_module = _bootstrap._LoaderBasics.load_module _register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, - machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader) + _bootstrap.NamespaceLoader) class ExecutionLoader(InspectLoader): @@ -237,7 +237,7 @@ super().init_module_attrs(module) _bootstrap._init_file_attrs(self, module) -_register(machinery.ExtensionFileLoader) +_register(ExecutionLoader, machinery.ExtensionFileLoader) class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -100,6 +100,7 @@ class ExecutionLoader(InheritanceTests): superclass_names = ['InspectLoader'] + subclass_names = ['ExtensionFileLoader'] tests = create_inheritance_tests(ExecutionLoader) Frozen_ExecutionLoaderInheritanceTests, Source_ExecutionLoaderInheritanceTests = tests -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 04:40:07 2013 From: python-checkins at python.org (eric.snow) Date: Sat, 5 Oct 2013 04:40:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=5Bissue_19152=5D_Add_vers?= =?utf-8?q?ionadded_for_ExtensionFileLoader=2Eget=5Ffilename=28=29=2E?= Message-ID: <3csBxz1GJqz7LjX@mail.python.org> http://hg.python.org/cpython/rev/e9554199620f changeset: 85968:e9554199620f user: Eric Snow date: Fri Oct 04 20:35:34 2013 -0600 summary: [issue 19152] Add versionadded for ExtensionFileLoader.get_filename(). files: Doc/library/importlib.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -874,6 +874,8 @@ Returns :attr:`path`. + .. versionadded:: 3.4 + :mod:`importlib.util` -- Utility code for importers --------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 5 07:05:43 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 05 Oct 2013 07:05:43 +0200 Subject: [Python-checkins] Daily reference leaks (1bbe94419042): sum=4 Message-ID: results for 1bbe94419042 on branch "default" -------------------------------------------- test_imp leaked [1, -1, 0] references, sum=0 test_site leaked [0, 2, 0] references, sum=2 test_site leaked [0, 2, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogFkBvNI', '-x'] From python-checkins at python.org Sat Oct 5 07:24:47 2013 From: python-checkins at python.org (eric.snow) Date: Sat, 5 Oct 2013 07:24:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Record_posting_?= =?utf-8?q?to_python-dev=2E?= Message-ID: <3csGbz2WGMzPDQ@mail.python.org> http://hg.python.org/peps/rev/7aba5103834d changeset: 5169:7aba5103834d user: Eric Snow date: Fri Oct 04 23:21:29 2013 -0600 summary: [PEP 451] Record posting to python-dev. files: pep-0451.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -9,7 +9,7 @@ Content-Type: text/x-rst Created: 8-Aug-2013 Python-Version: 3.4 -Post-History: 8-Aug-2013, 28-Aug-2013, 18-Sep-2013, 24-Sep-2013 +Post-History: 8-Aug-2013, 28-Aug-2013, 18-Sep-2013, 24-Sep-2013, 4-Oct-2013 Resolution: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Oct 5 21:12:25 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 5 Oct 2013 21:12:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319087=3A_Improve_?= =?utf-8?q?bytearray_allocation_in_order_to_allow_cheap_popping_of?= Message-ID: <3cscyx3pLXz7LjP@mail.python.org> http://hg.python.org/cpython/rev/499a96611baa changeset: 85969:499a96611baa user: Antoine Pitrou date: Sat Oct 05 21:12:18 2013 +0200 summary: Issue #19087: Improve bytearray allocation in order to allow cheap popping of data at the front (slice deletion). files: Include/bytearrayobject.h | 11 +- Lib/test/test_bytes.py | 9 + Lib/test/test_sys.py | 2 +- Misc/NEWS | 3 + Objects/bytearrayobject.c | 310 +++++++++++++------------ 5 files changed, 183 insertions(+), 152 deletions(-) diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -22,10 +22,11 @@ #ifndef Py_LIMITED_API typedef struct { PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_buffer */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ - int ob_exports; /* how many buffer exports */ - Py_ssize_t ob_alloc; /* How many bytes allocated */ - char *ob_bytes; + int ob_exports; /* How many buffer exports */ } PyByteArrayObject; #endif @@ -49,8 +50,8 @@ #ifndef Py_LIMITED_API #define PyByteArray_AS_STRING(self) \ (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_bytes : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)),Py_SIZE(self)) + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) PyAPI_DATA(char) _PyByteArray_empty_string[]; #endif diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -909,6 +909,15 @@ with self.assertRaises(ValueError): b[3:4] = elem + def test_setslice_extend(self): + # Exercise the resizing logic (see issue #19087) + b = bytearray(range(100)) + self.assertEqual(list(b), list(range(100))) + del b[:10] + self.assertEqual(list(b), list(range(10, 100))) + b.extend(range(100, 110)) + self.assertEqual(list(b), list(range(10, 110))) + def test_extended_set_del_slice(self): indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) for start in indices: diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -721,7 +721,7 @@ samples = [b'', b'u'*100000] for sample in samples: x = bytearray(sample) - check(x, vsize('inP') + x.__alloc__()) + check(x, vsize('n2Pi') + x.__alloc__()) # bytearray_iterator check(iter(bytearray()), size('nP')) # cell diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #19087: Improve bytearray allocation in order to allow cheap popping + of data at the front (slice deletion). + - Issue #19014: memoryview.cast() is now allowed on zero-length views. - Issue #18690: memoryview is now automatically registered with diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -150,6 +150,7 @@ } Py_SIZE(new) = size; new->ob_alloc = alloc; + new->ob_start = new->ob_bytes; new->ob_exports = 0; return (PyObject *)new; @@ -177,48 +178,70 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t size) { void *sval; - Py_ssize_t alloc = ((PyByteArrayObject *)self)->ob_alloc; + PyByteArrayObject *obj = ((PyByteArrayObject *)self); + Py_ssize_t alloc = obj->ob_alloc; + Py_ssize_t logical_offset = obj->ob_start - obj->ob_bytes; assert(self != NULL); assert(PyByteArray_Check(self)); assert(size >= 0); + assert(logical_offset >= 0); + assert(logical_offset <= alloc); if (size == Py_SIZE(self)) { return 0; } - if (!_canresize((PyByteArrayObject *)self)) { + if (!_canresize(obj)) { return -1; } - if (size < alloc / 2) { - /* Major downsize; resize down to exact size */ - alloc = size + 1; - } - else if (size < alloc) { - /* Within allocated size; quick exit */ - Py_SIZE(self) = size; - ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null */ - return 0; - } - else if (size <= alloc * 1.125) { - /* Moderate upsize; overallocate similar to list_resize() */ - alloc = size + (size >> 3) + (size < 9 ? 3 : 6); + if (size + logical_offset + 1 < alloc) { + /* Current buffer is large enough to host the requested size, + decide on a strategy. */ + if (size < alloc / 2) { + /* Major downsize; resize down to exact size */ + alloc = size + 1; + } + else { + /* Minor downsize; quick exit */ + Py_SIZE(self) = size; + PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */ + return 0; + } } else { - /* Major upsize; resize up to exact size */ - alloc = size + 1; + /* Need growing, decide on a strategy */ + if (size <= alloc * 1.125) { + /* Moderate upsize; overallocate similar to list_resize() */ + alloc = size + (size >> 3) + (size < 9 ? 3 : 6); + } + else { + /* Major upsize; resize up to exact size */ + alloc = size + 1; + } } - sval = PyObject_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc); - if (sval == NULL) { - PyErr_NoMemory(); - return -1; + if (logical_offset > 0) { + sval = PyObject_Malloc(alloc); + if (sval == NULL) { + PyErr_NoMemory(); + return -1; + } + memcpy(sval, PyByteArray_AS_STRING(self), Py_MIN(size, Py_SIZE(self))); + PyObject_Free(obj->ob_bytes); } - - ((PyByteArrayObject *)self)->ob_bytes = sval; + else { + sval = PyObject_Realloc(obj->ob_bytes, alloc); + if (sval == NULL) { + PyErr_NoMemory(); + return -1; + } + } + + obj->ob_bytes = obj->ob_start = sval; Py_SIZE(self) = size; - ((PyByteArrayObject *)self)->ob_alloc = alloc; - ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */ + obj->ob_alloc = alloc; + obj->ob_bytes[size] = '\0'; /* Trailing null byte */ return 0; } @@ -288,13 +311,13 @@ } if (size < self->ob_alloc) { Py_SIZE(self) = size; - self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */ + PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; /* Trailing null byte */ } else if (PyByteArray_Resize((PyObject *)self, size) < 0) { PyBuffer_Release(&vo); return NULL; } - memcpy(self->ob_bytes + mysize, vo.buf, vo.len); + memcpy(PyByteArray_AS_STRING(self) + mysize, vo.buf, vo.len); PyBuffer_Release(&vo); Py_INCREF(self); return (PyObject *)self; @@ -331,6 +354,7 @@ { Py_ssize_t mysize; Py_ssize_t size; + char *buf; if (count < 0) count = 0; @@ -338,19 +362,16 @@ if (count > 0 && mysize > PY_SSIZE_T_MAX / count) return PyErr_NoMemory(); size = mysize * count; - if (size < self->ob_alloc) { - Py_SIZE(self) = size; - self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */ - } - else if (PyByteArray_Resize((PyObject *)self, size) < 0) + if (PyByteArray_Resize((PyObject *)self, size) < 0) return NULL; + buf = PyByteArray_AS_STRING(self); if (mysize == 1) - memset(self->ob_bytes, self->ob_bytes[0], size); + memset(buf, buf[0], size); else { Py_ssize_t i; for (i = 1; i < count; i++) - memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize); + memcpy(buf + i*mysize, buf, mysize); } Py_INCREF(self); @@ -366,7 +387,7 @@ PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; } - return PyLong_FromLong((unsigned char)(self->ob_bytes[i])); + return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } static PyObject * @@ -385,7 +406,7 @@ PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; } - return PyLong_FromLong((unsigned char)(self->ob_bytes[i])); + return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; @@ -398,8 +419,8 @@ if (slicelength <= 0) return PyByteArray_FromStringAndSize("", 0); else if (step == 1) { - return PyByteArray_FromStringAndSize(self->ob_bytes + start, - slicelength); + return PyByteArray_FromStringAndSize( + PyByteArray_AS_STRING(self) + start, slicelength); } else { char *source_buf = PyByteArray_AS_STRING(self); @@ -425,10 +446,68 @@ } static int +bytearray_setslice_linear(PyByteArrayObject *self, + Py_ssize_t lo, Py_ssize_t hi, + char *bytes, Py_ssize_t bytes_len) +{ + Py_ssize_t avail = hi - lo; + char *buf = PyByteArray_AS_STRING(self); + Py_ssize_t growth = bytes_len - avail; + assert(avail >= 0); + + if (growth != 0) { + if (growth < 0) { + if (!_canresize(self)) + return -1; + if (lo == 0) { + /* Shrink the buffer by advancing its logical start */ + self->ob_start -= growth; + /* + 0 lo hi old_size + | |<----avail----->|<-----tail------>| + | |<-bytes_len->|<-----tail------>| + 0 new_lo new_hi new_size + */ + } + else { + /* + 0 lo hi old_size + | |<----avail----->|<-----tomove------>| + | |<-bytes_len->|<-----tomove------>| + 0 lo new_hi new_size + */ + memmove(buf + lo + bytes_len, buf + hi, + Py_SIZE(self) - hi); + } + } + /* XXX(nnorwitz): need to verify this can't overflow! */ + if (PyByteArray_Resize( + (PyObject *)self, Py_SIZE(self) + growth) < 0) + return -1; + buf = PyByteArray_AS_STRING(self); + if (growth > 0) { + /* Make the place for the additional bytes */ + /* + 0 lo hi old_size + | |<-avail->|<-----tomove------>| + | |<---bytes_len-->|<-----tomove------>| + 0 lo new_hi new_size + */ + memmove(buf + lo + bytes_len, buf + hi, + Py_SIZE(self) - lo - bytes_len); + } + } + + if (bytes_len > 0) + memcpy(buf + lo, bytes, bytes_len); + return 0; +} + +static int bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *values) { - Py_ssize_t avail, needed; + Py_ssize_t needed; void *bytes; Py_buffer vbytes; int res = 0; @@ -467,50 +546,9 @@ if (hi > Py_SIZE(self)) hi = Py_SIZE(self); - avail = hi - lo; - if (avail < 0) - lo = hi = avail = 0; - - if (avail != needed) { - if (avail > needed) { - if (!_canresize(self)) { - res = -1; - goto finish; - } - /* - 0 lo hi old_size - | |<----avail----->|<-----tomove------>| - | |<-needed->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi, - Py_SIZE(self) - hi); - } - /* XXX(nnorwitz): need to verify this can't overflow! */ - if (PyByteArray_Resize((PyObject *)self, - Py_SIZE(self) + needed - avail) < 0) { - res = -1; - goto finish; - } - if (avail < needed) { - /* - 0 lo hi old_size - | |<-avail->|<-----tomove------>| - | |<----needed---->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi, - Py_SIZE(self) - lo - needed); - } - } - - if (needed > 0) - memcpy(self->ob_bytes + lo, bytes, needed); - - - finish: + res = bytearray_setslice_linear(self, lo, hi, bytes, needed); if (vbytes.len != -1) - PyBuffer_Release(&vbytes); + PyBuffer_Release(&vbytes); return res; } @@ -533,7 +571,7 @@ if (!_getbytevalue(value, &ival)) return -1; - self->ob_bytes[i] = ival; + PyByteArray_AS_STRING(self)[i] = ival; return 0; } @@ -541,7 +579,8 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values) { Py_ssize_t start, stop, step, slicelen, needed; - char *bytes; + char *buf, *bytes; + buf = PyByteArray_AS_STRING(self); if (PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); @@ -568,7 +607,7 @@ int ival; if (!_getbytevalue(values, &ival)) return -1; - self->ob_bytes[i] = (char)ival; + buf[i] = (char)ival; return 0; } } @@ -606,7 +645,7 @@ } else { assert(PyByteArray_Check(values)); - bytes = ((PyByteArrayObject *)values)->ob_bytes; + bytes = PyByteArray_AS_STRING(values); needed = Py_SIZE(values); } /* Make sure b[5:2] = ... inserts before 5, not before 2. */ @@ -614,38 +653,7 @@ (step > 0 && start > stop)) stop = start; if (step == 1) { - if (slicelen != needed) { - if (!_canresize(self)) - return -1; - if (slicelen > needed) { - /* - 0 start stop old_size - | |<---slicelen--->|<-----tomove------>| - | |<-needed->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + start + needed, self->ob_bytes + stop, - Py_SIZE(self) - stop); - } - if (PyByteArray_Resize((PyObject *)self, - Py_SIZE(self) + needed - slicelen) < 0) - return -1; - if (slicelen < needed) { - /* - 0 lo hi old_size - | |<-avail->|<-----tomove------>| - | |<----needed---->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + start + needed, self->ob_bytes + stop, - Py_SIZE(self) - start - needed); - } - } - - if (needed > 0) - memcpy(self->ob_bytes + start, bytes, needed); - - return 0; + return bytearray_setslice_linear(self, start, stop, bytes, needed); } else { if (needed == 0) { @@ -672,14 +680,14 @@ if (cur + step >= (size_t)PyByteArray_GET_SIZE(self)) lim = PyByteArray_GET_SIZE(self) - cur - 1; - memmove(self->ob_bytes + cur - i, - self->ob_bytes + cur + 1, lim); + memmove(buf + cur - i, + buf + cur + 1, lim); } /* Move the tail of the bytes, in one chunk */ cur = start + (size_t)slicelen*step; if (cur < (size_t)PyByteArray_GET_SIZE(self)) { - memmove(self->ob_bytes + cur - slicelen, - self->ob_bytes + cur, + memmove(buf + cur - slicelen, + buf + cur, PyByteArray_GET_SIZE(self) - cur); } if (PyByteArray_Resize((PyObject *)self, @@ -701,7 +709,7 @@ return -1; } for (cur = start, i = 0; i < slicelen; cur += step, i++) - self->ob_bytes[cur] = bytes[i]; + buf[cur] = bytes[i]; return 0; } } @@ -781,7 +789,7 @@ if (count > 0) { if (PyByteArray_Resize((PyObject *)self, count)) return -1; - memset(self->ob_bytes, 0, count); + memset(PyByteArray_AS_STRING(self), 0, count); } return 0; } @@ -794,7 +802,8 @@ return -1; size = view.len; if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail; - if (PyBuffer_ToContiguous(self->ob_bytes, &view, size, 'C') < 0) + if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self), + &view, size, 'C') < 0) goto fail; PyBuffer_Release(&view); return 0; @@ -838,7 +847,7 @@ Py_SIZE(self)++; else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) goto error; - self->ob_bytes[Py_SIZE(self)-1] = value; + PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value; } /* Clean up and return success */ @@ -863,6 +872,7 @@ size_t newsize; PyObject *v; Py_ssize_t i; + char *bytes; char c; char *p; int quote; @@ -899,11 +909,12 @@ *p++ = *quote_prefix++; *p++ = quote; + bytes = PyByteArray_AS_STRING(self); for (i = 0; i < length; i++) { /* There's at least enough room for a hex escape and a closing quote. */ assert(newsize - (p - buffer) >= 5); - c = self->ob_bytes[i]; + c = bytes[i]; if (c == '\'' || c == '\\') *p++ = '\\', *p++ = c; else if (c == '\t') @@ -2194,7 +2205,7 @@ Py_ssize_t i, j, n = Py_SIZE(self); j = n / 2; - head = self->ob_bytes; + head = PyByteArray_AS_STRING(self); tail = head + n - 1; for (i = 0; i < j; i++) { swap = *head; @@ -2215,6 +2226,7 @@ PyObject *value; int ival; Py_ssize_t where, n = Py_SIZE(self); + char *buf; if (!PyArg_ParseTuple(args, "nO:insert", &where, &value)) return NULL; @@ -2228,6 +2240,7 @@ return NULL; if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; + buf = PyByteArray_AS_STRING(self); if (where < 0) { where += n; @@ -2236,8 +2249,8 @@ } if (where > n) where = n; - memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where); - self->ob_bytes[where] = ival; + memmove(buf + where + 1, buf + where, n - where); + buf[where] = ival; Py_RETURN_NONE; } @@ -2262,7 +2275,7 @@ if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; - self->ob_bytes[n] = value; + PyByteArray_AS_STRING(self)[n] = value; Py_RETURN_NONE; } @@ -2355,6 +2368,7 @@ { int value; Py_ssize_t where = -1, n = Py_SIZE(self); + char *buf; if (!PyArg_ParseTuple(args, "|n:pop", &where)) return NULL; @@ -2373,8 +2387,9 @@ if (!_canresize(self)) return NULL; - value = self->ob_bytes[where]; - memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where); + buf = PyByteArray_AS_STRING(self); + value = buf[where]; + memmove(buf + where, buf + where + 1, n - where); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL; @@ -2390,12 +2405,13 @@ { int value; Py_ssize_t where, n = Py_SIZE(self); + char *buf = PyByteArray_AS_STRING(self); if (! _getbytevalue(arg, &value)) return NULL; for (where = 0; where < n; where++) { - if (self->ob_bytes[where] == value) + if (buf[where] == value) break; } if (where == n) { @@ -2405,7 +2421,7 @@ if (!_canresize(self)) return NULL; - memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where); + memmove(buf + where, buf + where + 1, n - where); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL; @@ -2459,7 +2475,7 @@ argptr = varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); left = lstrip_helper(myptr, mysize, argptr, argsize); if (left == mysize) @@ -2468,7 +2484,7 @@ right = rstrip_helper(myptr, mysize, argptr, argsize); if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left); + return PyByteArray_FromStringAndSize(myptr + left, right - left); } PyDoc_STRVAR(lstrip__doc__, @@ -2496,13 +2512,13 @@ argptr = varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); left = lstrip_helper(myptr, mysize, argptr, argsize); right = mysize; if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left); + return PyByteArray_FromStringAndSize(myptr + left, right - left); } PyDoc_STRVAR(rstrip__doc__, @@ -2530,12 +2546,12 @@ argptr = varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); right = rstrip_helper(myptr, mysize, argptr, argsize); if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes, right); + return PyByteArray_FromStringAndSize(myptr, right); } PyDoc_STRVAR(decode_doc, @@ -2686,6 +2702,7 @@ { PyObject *dict; _Py_IDENTIFIER(__dict__); + char *buf; dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__); if (dict == NULL) { @@ -2694,19 +2711,20 @@ Py_INCREF(dict); } + buf = PyByteArray_AS_STRING(self); if (proto < 3) { /* use str based reduction for backwards compatibility with Python 2.x */ PyObject *latin1; - if (self->ob_bytes) - latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, Py_SIZE(self), NULL); + if (Py_SIZE(self)) + latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL); else latin1 = PyUnicode_FromString(""); return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict); } else { /* use more efficient byte based reduction */ - if (self->ob_bytes) { - return Py_BuildValue("(O(y#)N)", Py_TYPE(self), self->ob_bytes, Py_SIZE(self), dict); + if (Py_SIZE(self)) { + return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict); } else { return Py_BuildValue("(O()N)", Py_TYPE(self), dict); @@ -2938,7 +2956,7 @@ if (it->it_index < PyByteArray_GET_SIZE(seq)) { item = PyLong_FromLong( - (unsigned char)seq->ob_bytes[it->it_index]); + (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]); if (item != NULL) ++it->it_index; return item; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 21:24:19 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 5 Oct 2013 21:24:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Hopefully_fix_Windows_comp?= =?utf-8?q?ilation_error_following_499a96611baa?= Message-ID: <3csdDg3JJNzRNL@mail.python.org> http://hg.python.org/cpython/rev/4e40a0537507 changeset: 85970:4e40a0537507 user: Antoine Pitrou date: Sat Oct 05 21:24:10 2013 +0200 summary: Hopefully fix Windows compilation error following 499a96611baa files: Objects/bytearrayobject.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2431,21 +2431,21 @@ /* XXX These two helpers could be optimized if argsize == 1 */ static Py_ssize_t -lstrip_helper(unsigned char *myptr, Py_ssize_t mysize, +lstrip_helper(char *myptr, Py_ssize_t mysize, void *argptr, Py_ssize_t argsize) { Py_ssize_t i = 0; - while (i < mysize && memchr(argptr, myptr[i], argsize)) + while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize)) i++; return i; } static Py_ssize_t -rstrip_helper(unsigned char *myptr, Py_ssize_t mysize, +rstrip_helper(char *myptr, Py_ssize_t mysize, void *argptr, Py_ssize_t argsize) { Py_ssize_t i = mysize - 1; - while (i >= 0 && memchr(argptr, myptr[i], argsize)) + while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize)) i--; return i + 1; } @@ -2460,7 +2460,7 @@ bytearray_strip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t left, right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:strip", &arg)) @@ -2472,7 +2472,7 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } myptr = PyByteArray_AS_STRING(self); @@ -2497,7 +2497,7 @@ bytearray_lstrip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t left, right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:lstrip", &arg)) @@ -2509,7 +2509,7 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } myptr = PyByteArray_AS_STRING(self); @@ -2531,7 +2531,7 @@ bytearray_rstrip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:rstrip", &arg)) @@ -2543,7 +2543,7 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } myptr = PyByteArray_AS_STRING(self); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 22:34:23 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 5 Oct 2013 22:34:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_fix_comment?= Message-ID: <3csfnW44h5zQFR@mail.python.org> http://hg.python.org/cpython/rev/5edb907db30a changeset: 85971:5edb907db30a user: Benjamin Peterson date: Sat Oct 05 16:28:04 2013 -0400 summary: fix comment files: Include/bytearrayobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -22,7 +22,7 @@ #ifndef Py_LIMITED_API typedef struct { PyObject_VAR_HEAD - Py_ssize_t ob_alloc; /* How many bytes allocated in ob_buffer */ + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ char *ob_bytes; /* Physical backing buffer */ char *ob_start; /* Logical start inside ob_bytes */ /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:40:31 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:40:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MDY3OiB1c2Ug?= =?utf-8?q?imperative_mood_in_range_object_docstrings=2E__Patch_by_Marco_B?= =?utf-8?q?uttu=2E?= Message-ID: <3cshFq1WLYz7LkC@mail.python.org> http://hg.python.org/cpython/rev/5135a431f7b3 changeset: 85972:5135a431f7b3 branch: 3.3 parent: 85963:33bbc60705e8 user: Ezio Melotti date: Sun Oct 06 00:36:45 2013 +0300 summary: #19067: use imperative mood in range object docstrings. Patch by Marco Buttu. files: Objects/rangeobject.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -139,7 +139,7 @@ "range(stop) -> range object\n\ range(start, stop[, step]) -> range object\n\ \n\ -Returns a virtual sequence of numbers from start to stop by step."); +Return a virtual sequence of numbers from start to stop by step."); static void range_dealloc(rangeobject *r) @@ -865,14 +865,14 @@ static PyObject * range_reverse(PyObject *seq); PyDoc_STRVAR(reverse_doc, -"Returns a reverse iterator."); +"Return a reverse iterator."); PyDoc_STRVAR(count_doc, "rangeobject.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(index_doc, "rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" -"Raises ValueError if the value is not present."); +"Raise ValueError if the value is not present."); static PyMethodDef range_methods[] = { {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:40:32 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:40:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MDY3OiBtZXJnZSB3aXRoIDMuMy4=?= Message-ID: <3cshFr3X25z7Ljy@mail.python.org> http://hg.python.org/cpython/rev/b2c752eff474 changeset: 85973:b2c752eff474 parent: 85971:5edb907db30a parent: 85972:5135a431f7b3 user: Ezio Melotti date: Sun Oct 06 00:38:19 2013 +0300 summary: #19067: merge with 3.3. files: Objects/rangeobject.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -139,7 +139,7 @@ "range(stop) -> range object\n\ range(start, stop[, step]) -> range object\n\ \n\ -Returns a virtual sequence of numbers from start to stop by step."); +Return a virtual sequence of numbers from start to stop by step."); static void range_dealloc(rangeobject *r) @@ -672,14 +672,14 @@ static PyObject * range_reverse(PyObject *seq); PyDoc_STRVAR(reverse_doc, -"Returns a reverse iterator."); +"Return a reverse iterator."); PyDoc_STRVAR(count_doc, "rangeobject.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(index_doc, "rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" -"Raises ValueError if the value is not present."); +"Raise ValueError if the value is not present."); static PyMethodDef range_methods[] = { {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:40:33 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:40:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MDY4OiB1c2Ug?= =?utf-8?q?imperative_mood_in_complex_object_docstrings=2E__Patch_by_Marco?= =?utf-8?q?_Buttu=2E?= Message-ID: <3cshFs5JbJz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/54213ef5bb19 changeset: 85974:54213ef5bb19 branch: 3.3 parent: 85972:5135a431f7b3 user: Ezio Melotti date: Sun Oct 06 00:39:18 2013 +0300 summary: #19068: use imperative mood in complex object docstrings. Patch by Marco Buttu. files: Objects/complexobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/complexobject.c b/Objects/complexobject.c --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -681,7 +681,7 @@ PyDoc_STRVAR(complex_conjugate_doc, "complex.conjugate() -> complex\n" "\n" -"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); +"Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); static PyObject * complex_getnewargs(PyComplexObject *v) @@ -693,7 +693,7 @@ PyDoc_STRVAR(complex__format__doc, "complex.__format__() -> str\n" "\n" -"Converts to a string according to format_spec."); +"Convert to a string according to format_spec."); static PyObject * complex__format__(PyObject* self, PyObject* args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:40:34 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:40:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MDY4OiBtZXJnZSB3aXRoIDMuMy4=?= Message-ID: <3cshFt6zslz7LkW@mail.python.org> http://hg.python.org/cpython/rev/c1abbeae5c8a changeset: 85975:c1abbeae5c8a parent: 85973:b2c752eff474 parent: 85974:54213ef5bb19 user: Ezio Melotti date: Sun Oct 06 00:39:44 2013 +0300 summary: #19068: merge with 3.3. files: Objects/complexobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/complexobject.c b/Objects/complexobject.c --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -681,7 +681,7 @@ PyDoc_STRVAR(complex_conjugate_doc, "complex.conjugate() -> complex\n" "\n" -"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); +"Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); static PyObject * complex_getnewargs(PyComplexObject *v) @@ -693,7 +693,7 @@ PyDoc_STRVAR(complex__format__doc, "complex.__format__() -> str\n" "\n" -"Converts to a string according to format_spec."); +"Convert to a string according to format_spec."); static PyObject * complex__format__(PyObject* self, PyObject* args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:40:36 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:40:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MDY4OiB1c2Ug?= =?utf-8?q?imperative_mood_in_complex_object_docstrings=2E__Patch_by_Marco?= =?utf-8?q?_Buttu=2E?= Message-ID: <3cshFw1gvKz7LkV@mail.python.org> http://hg.python.org/cpython/rev/3ef157674abc changeset: 85976:3ef157674abc branch: 2.7 parent: 85962:92c2e76ca595 user: Ezio Melotti date: Sun Oct 06 00:39:18 2013 +0300 summary: #19068: use imperative mood in complex object docstrings. Patch by Marco Buttu. files: Objects/complexobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/complexobject.c b/Objects/complexobject.c --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -885,7 +885,7 @@ PyDoc_STRVAR(complex_conjugate_doc, "complex.conjugate() -> complex\n" "\n" -"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); +"Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); static PyObject * complex_getnewargs(PyComplexObject *v) @@ -897,7 +897,7 @@ PyDoc_STRVAR(complex__format__doc, "complex.__format__() -> str\n" "\n" -"Converts to a string according to format_spec."); +"Convert to a string according to format_spec."); static PyObject * complex__format__(PyObject* self, PyObject* args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:47:26 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:47:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MDY5OiB1c2Ug?= =?utf-8?q?imperative_mood_in_float_object_docstrings=2E__Patch_by_Marco_B?= =?utf-8?q?uttu=2E?= Message-ID: <3cshPp5VRGz7LjM@mail.python.org> http://hg.python.org/cpython/rev/ca8e75190402 changeset: 85977:ca8e75190402 branch: 2.7 user: Ezio Melotti date: Sun Oct 06 00:44:32 2013 +0300 summary: #19069: use imperative mood in float object docstrings. Patch by Marco Buttu. files: Objects/floatobject.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1783,9 +1783,9 @@ PyDoc_STRVAR(float_as_integer_ratio_doc, "float.as_integer_ratio() -> (int, int)\n" "\n" -"Returns a pair of integers, whose ratio is exactly equal to the original\n" +"Return a pair of integers, whose ratio is exactly equal to the original\n" "float and with a positive denominator.\n" -"Raises OverflowError on infinities and a ValueError on NaNs.\n" +"Raise OverflowError on infinities and a ValueError on NaNs.\n" "\n" ">>> (10.0).as_integer_ratio()\n" "(10, 1)\n" @@ -1970,7 +1970,7 @@ "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" "one of the latter two if it appears to match the underlying C reality.\n" "\n" -"Overrides the automatic determination of C-level floating point type.\n" +"Override the automatic determination of C-level floating point type.\n" "This affects how floats are converted to and from binary strings."); static PyObject * @@ -2017,9 +2017,9 @@ static PyMethodDef float_methods[] = { {"conjugate", (PyCFunction)float_float, METH_NOARGS, - "Returns self, the complex conjugate of any float."}, + "Return self, the complex conjugate of any float."}, {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, - "Returns the Integral closest to x between 0 and x."}, + "Return the Integral closest to x between 0 and x."}, {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS, float_as_integer_ratio_doc}, {"fromhex", (PyCFunction)float_fromhex, @@ -2027,14 +2027,14 @@ {"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."}, + "Return True if the float is an integer."}, #if 0 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Returns True if the float is positive or negative infinite."}, + "Return True if the float is positive or negative infinite."}, {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Returns True if the float is finite, neither infinite nor NaN."}, + "Return True if the float is finite, neither infinite nor NaN."}, {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Returns True if the float is not a number (NaN)."}, + "Return True if the float is not a number (NaN)."}, #endif {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, {"__getformat__", (PyCFunction)float_getformat, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:47:28 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:47:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MDY5OiB1c2Ug?= =?utf-8?q?imperative_mood_in_float_object_docstrings=2E__Patch_by_Marco_B?= =?utf-8?q?uttu=2E?= Message-ID: <3cshPr09dNz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/563074ace473 changeset: 85978:563074ace473 branch: 3.3 parent: 85974:54213ef5bb19 user: Ezio Melotti date: Sun Oct 06 00:45:11 2013 +0300 summary: #19069: use imperative mood in float object docstrings. Patch by Marco Buttu. files: Objects/floatobject.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1503,9 +1503,9 @@ PyDoc_STRVAR(float_as_integer_ratio_doc, "float.as_integer_ratio() -> (int, int)\n" "\n" -"Returns a pair of integers, whose ratio is exactly equal to the original\n" +"Return a pair of integers, whose ratio is exactly equal to the original\n" "float and with a positive denominator.\n" -"Raises OverflowError on infinities and a ValueError on NaNs.\n" +"Raise OverflowError on infinities and a ValueError on NaNs.\n" "\n" ">>> (10.0).as_integer_ratio()\n" "(10, 1)\n" @@ -1692,7 +1692,7 @@ "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" "one of the latter two if it appears to match the underlying C reality.\n" "\n" -"Overrides the automatic determination of C-level floating point type.\n" +"Override the automatic determination of C-level floating point type.\n" "This affects how floats are converted to and from binary strings."); static PyObject * @@ -1731,12 +1731,12 @@ static PyMethodDef float_methods[] = { {"conjugate", (PyCFunction)float_float, METH_NOARGS, - "Returns self, the complex conjugate of any float."}, + "Return self, the complex conjugate of any float."}, {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, - "Returns the Integral closest to x between 0 and x."}, + "Return the Integral closest to x between 0 and x."}, {"__round__", (PyCFunction)float_round, METH_VARARGS, - "Returns the Integral closest to x, rounding half toward even.\n" - "When an argument is passed, works like built-in round(x, ndigits)."}, + "Return the Integral closest to x, rounding half toward even.\n" + "When an argument is passed, work 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, @@ -1744,14 +1744,14 @@ {"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."}, + "Return True if the float is an integer."}, #if 0 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Returns True if the float is positive or negative infinite."}, + "Return True if the float is positive or negative infinite."}, {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Returns True if the float is finite, neither infinite nor NaN."}, + "Return True if the float is finite, neither infinite nor NaN."}, {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Returns True if the float is not a number (NaN)."}, + "Return True if the float is not a number (NaN)."}, #endif {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, {"__getformat__", (PyCFunction)float_getformat, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 5 23:47:29 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 5 Oct 2013 23:47:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MDY5OiBtZXJnZSB3aXRoIDMuMy4=?= Message-ID: <3cshPs1z4Fz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/63a10c942b50 changeset: 85979:63a10c942b50 parent: 85975:c1abbeae5c8a parent: 85978:563074ace473 user: Ezio Melotti date: Sun Oct 06 00:46:58 2013 +0300 summary: #19069: merge with 3.3. files: Objects/floatobject.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1498,9 +1498,9 @@ PyDoc_STRVAR(float_as_integer_ratio_doc, "float.as_integer_ratio() -> (int, int)\n" "\n" -"Returns a pair of integers, whose ratio is exactly equal to the original\n" +"Return a pair of integers, whose ratio is exactly equal to the original\n" "float and with a positive denominator.\n" -"Raises OverflowError on infinities and a ValueError on NaNs.\n" +"Raise OverflowError on infinities and a ValueError on NaNs.\n" "\n" ">>> (10.0).as_integer_ratio()\n" "(10, 1)\n" @@ -1687,7 +1687,7 @@ "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" "one of the latter two if it appears to match the underlying C reality.\n" "\n" -"Overrides the automatic determination of C-level floating point type.\n" +"Override the automatic determination of C-level floating point type.\n" "This affects how floats are converted to and from binary strings."); static PyObject * @@ -1726,12 +1726,12 @@ static PyMethodDef float_methods[] = { {"conjugate", (PyCFunction)float_float, METH_NOARGS, - "Returns self, the complex conjugate of any float."}, + "Return self, the complex conjugate of any float."}, {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, - "Returns the Integral closest to x between 0 and x."}, + "Return the Integral closest to x between 0 and x."}, {"__round__", (PyCFunction)float_round, METH_VARARGS, - "Returns the Integral closest to x, rounding half toward even.\n" - "When an argument is passed, works like built-in round(x, ndigits)."}, + "Return the Integral closest to x, rounding half toward even.\n" + "When an argument is passed, work 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, @@ -1739,14 +1739,14 @@ {"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."}, + "Return True if the float is an integer."}, #if 0 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Returns True if the float is positive or negative infinite."}, + "Return True if the float is positive or negative infinite."}, {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Returns True if the float is finite, neither infinite nor NaN."}, + "Return True if the float is finite, neither infinite nor NaN."}, {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Returns True if the float is not a number (NaN)."}, + "Return True if the float is not a number (NaN)."}, #endif {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, {"__getformat__", (PyCFunction)float_getformat, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 00:02:33 2013 From: python-checkins at python.org (ezio.melotti) Date: Sun, 6 Oct 2013 00:02:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MDc0OiBtZW50?= =?utf-8?q?ion_PySide_in_the_GUI_FAQs=2E?= Message-ID: <3cshlF5KNvz7LjR@mail.python.org> http://hg.python.org/cpython/rev/eddd46b5691a changeset: 85980:eddd46b5691a branch: 2.7 parent: 85977:ca8e75190402 user: Ezio Melotti date: Sun Oct 06 01:02:09 2013 +0300 summary: #19074: mention PySide in the GUI FAQs. files: Doc/faq/gui.rst | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Doc/faq/gui.rst b/Doc/faq/gui.rst --- a/Doc/faq/gui.rst +++ b/Doc/faq/gui.rst @@ -47,13 +47,15 @@ Qt --- -There are bindings available for the Qt toolkit (`PyQt -`_) and for KDE (`PyKDE `__). If -you're writing open source software, you don't need to pay for PyQt, but if you -want to write proprietary applications, you must buy a PyQt license from -`Riverbank Computing `_ and (up to Qt 4.4; -Qt 4.5 upwards is licensed under the LGPL license) a Qt license from `Trolltech -`_. +There are bindings available for the Qt toolkit (using either `PyQt +`_ or `PySide +`_) and for KDE (`PyKDE http://www.riverbankcomputing.co.uk/software/pykde/intro>`__). +PyQt is currently more mature than PySide, but you must buy a PyQt license from +`Riverbank Computing `_ +if you want to write proprietary applications. PySide is free for all applications. + +Qt 4.5 upwards is licensed under the LGPL license; also, commercial licenses +are available from `Nokia `_. Gtk+ ---- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 00:14:44 2013 From: python-checkins at python.org (tim.peters) Date: Sun, 6 Oct 2013 00:14:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTcx?= =?utf-8?q?=3A__speed_some_cases_of_3-argument_long_pow=28=29=2E?= Message-ID: <3csj1J2V7Bz7LjM@mail.python.org> http://hg.python.org/cpython/rev/f34c59494420 changeset: 85981:f34c59494420 branch: 3.3 parent: 85978:563074ace473 user: Tim Peters date: Sat Oct 05 16:53:52 2013 -0500 summary: Issue #19171: speed some cases of 3-argument long pow(). Reduce the base by the modulus when the base is larger than the modulus. This can unboundedly speed the "startup costs" of doing modular exponentiation, particularly in cases where the base is much larger than the modulus. Original patch by Armin Rigo, inspired by https://github.com/pyca/ed25519. files: Objects/longobject.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3868,10 +3868,16 @@ goto Done; } - /* if base < 0: - base = base % modulus - Having the base positive just makes things easier. */ - if (Py_SIZE(a) < 0) { + /* Reduce base by modulus in some cases: + 1. If base < 0. Forcing the base non-negative makes things easier. + 2. If base is obviously larger than the modulus. The "small + exponent" case later can multiply directly by base repeatedly, + while the "large exponent" case multiplies directly by base 31 + times. It can be unboundedly faster to multiply by + base % modulus instead. + We could _always_ do this reduction, but l_divmod() isn't cheap, + so we only do it when it buys something. */ + if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) { if (l_divmod(a, c, NULL, &temp) < 0) goto Error; Py_DECREF(a); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 00:14:45 2013 From: python-checkins at python.org (tim.peters) Date: Sun, 6 Oct 2013 00:14:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319171=3A__speed_some_cases_of_3-argument_long_p?= =?utf-8?b?b3coKS4=?= Message-ID: <3csj1K4CXbz7LjV@mail.python.org> http://hg.python.org/cpython/rev/6fcdd1657ee3 changeset: 85982:6fcdd1657ee3 parent: 85979:63a10c942b50 parent: 85981:f34c59494420 user: Tim Peters date: Sat Oct 05 16:55:38 2013 -0500 summary: Issue #19171: speed some cases of 3-argument long pow(). Reduce the base by the modulus when the base is larger than the modulus. This can unboundedly speed the "startup costs" of doing modular exponentiation, particularly in cases where the base is much larger than the modulus. Original patch by Armin Rigo, inspired by https://github.com/pyca/ed25519. Merged from 3.3. files: Objects/longobject.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3878,10 +3878,16 @@ goto Done; } - /* if base < 0: - base = base % modulus - Having the base positive just makes things easier. */ - if (Py_SIZE(a) < 0) { + /* Reduce base by modulus in some cases: + 1. If base < 0. Forcing the base non-negative makes things easier. + 2. If base is obviously larger than the modulus. The "small + exponent" case later can multiply directly by base repeatedly, + while the "large exponent" case multiplies directly by base 31 + times. It can be unboundedly faster to multiply by + base % modulus instead. + We could _always_ do this reduction, but l_divmod() isn't cheap, + so we only do it when it buys something. */ + if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) { if (l_divmod(a, c, NULL, &temp) < 0) goto Error; Py_DECREF(a); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 00:14:46 2013 From: python-checkins at python.org (tim.peters) Date: Sun, 6 Oct 2013 00:14:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTcx?= =?utf-8?q?=3A__speed_some_cases_of_3-argument_long_pow=28=29=2E?= Message-ID: <3csj1L5ybBz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/101bf827611a changeset: 85983:101bf827611a branch: 2.7 parent: 85980:eddd46b5691a user: Tim Peters date: Sat Oct 05 16:53:52 2013 -0500 summary: Issue #19171: speed some cases of 3-argument long pow(). Reduce the base by the modulus when the base is larger than the modulus. This can unboundedly speed the "startup costs" of doing modular exponentiation, particularly in cases where the base is much larger than the modulus. Original patch by Armin Rigo, inspired by https://github.com/pyca/ed25519. (grafted from f34c59494420765b013136ca93f63b716d9f1d30) files: Objects/longobject.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3474,10 +3474,16 @@ goto Done; } - /* if base < 0: - base = base % modulus - Having the base positive just makes things easier. */ - if (Py_SIZE(a) < 0) { + /* Reduce base by modulus in some cases: + 1. If base < 0. Forcing the base non-negative makes things easier. + 2. If base is obviously larger than the modulus. The "small + exponent" case later can multiply directly by base repeatedly, + while the "large exponent" case multiplies directly by base 31 + times. It can be unboundedly faster to multiply by + base % modulus instead. + We could _always_ do this reduction, but l_divmod() isn't cheap, + so we only do it when it buys something. */ + if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) { if (l_divmod(a, c, NULL, &temp) < 0) goto Error; Py_DECREF(a); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 02:20:28 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 02:20:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Strengthen_one_of_the_coll?= =?utf-8?q?ections=2ECounter=28=29_tests?= Message-ID: <3cslpN1FsFz7LjS@mail.python.org> http://hg.python.org/cpython/rev/43e94e77329e changeset: 85984:43e94e77329e parent: 85961:50e0ed353c7f user: Raymond Hettinger date: Sat Oct 05 17:14:51 2013 -0700 summary: Strengthen one of the collections.Counter() tests files: Lib/test/test_collections.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1080,8 +1080,10 @@ # test fidelity to the pure python version c = CounterSubclassWithSetItem('abracadabra') self.assertTrue(c.called) + self.assertEqual(dict(c), {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r':2 }) c = CounterSubclassWithGet('abracadabra') self.assertTrue(c.called) + self.assertEqual(dict(c), {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r':2 }) ################################################################################ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 02:20:29 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 02:20:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319169=3A__Micro_r?= =?utf-8?q?efactoring_with_a_micro_benefit_for_brevity_and_speed=2E?= Message-ID: <3cslpP2x8sz7LjS@mail.python.org> http://hg.python.org/cpython/rev/1f51867fe50e changeset: 85985:1f51867fe50e user: Raymond Hettinger date: Sat Oct 05 17:18:36 2013 -0700 summary: Issue #19169: Micro refactoring with a micro benefit for brevity and speed. files: Lib/random.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -220,10 +220,11 @@ Method=_MethodType, BuiltinMethod=_BuiltinMethodType): "Return a random int in the range [0,n). Raises ValueError if n==0." + random = self.random getrandbits = self.getrandbits # Only call self.getrandbits if the original random() builtin method # has not been overridden or if a new getrandbits() was supplied. - if type(self.random) is BuiltinMethod or type(getrandbits) is Method: + if type(random) is BuiltinMethod or type(getrandbits) is Method: k = n.bit_length() # don't use (n-1) here because n can be 1 r = getrandbits(k) # 0 <= r < 2**k while r >= n: @@ -231,7 +232,6 @@ return r # There's an overriden random() method but no new getrandbits() method, # so we can only use random() from here. - random = self.random if n >= maxsize: _warn("Underlying random() generator does not supply \n" "enough bits to choose from a population range this large.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 02:20:31 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 02:20:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cslpR1VM2z7LkB@mail.python.org> http://hg.python.org/cpython/rev/94246efe2275 changeset: 85986:94246efe2275 parent: 85985:1f51867fe50e parent: 85982:6fcdd1657ee3 user: Raymond Hettinger date: Sat Oct 05 17:20:18 2013 -0700 summary: merge files: Doc/library/enum.rst | 14 +- Doc/library/importlib.rst | 2 + Include/bytearrayobject.h | 11 +- Lib/importlib/abc.py | 4 +- Lib/test/test_bytes.py | 9 + Lib/test/test_dict.py | 3 + Lib/test/test_importlib/test_abc.py | 1 + Lib/test/test_sys.py | 2 +- Misc/ACKS | 1 + Misc/NEWS | 3 + Objects/bytearrayobject.c | 330 ++++++++------- Objects/complexobject.c | 4 +- Objects/floatobject.c | 22 +- Objects/longobject.c | 14 +- Objects/rangeobject.c | 6 +- 15 files changed, 235 insertions(+), 191 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -250,7 +250,7 @@ True Comparisons against non-enumeration values will always compare not equal -(again, class:`IntEnum` was explicitly designed to behave differently, see +(again, :class:`IntEnum` was explicitly designed to behave differently, see below):: >>> Color.blue == 2 @@ -594,8 +594,8 @@ .. note:: This is a useful example for subclassing Enum to add or change other - behaviors as well as disallowing aliases. If the only change desired is - no aliases allowed the :func:`unique` decorator can be used instead. + behaviors as well as disallowing aliases. If the only desired change is + disallowing aliases, the :func:`unique` decorator can be used instead. Planet @@ -671,11 +671,11 @@ ... AttributeError: 'Color' object has no attribute 'blue' - Likewise, the :attr:`__members__` is only available on the class. +Likewise, the :attr:`__members__` is only available on the class. - If you give your :class:`Enum` subclass extra methods, like the `Planet`_ - class above, those methods will show up in a :func:`dir` of the member, - but not of the class:: +If you give your :class:`Enum` subclass extra methods, like the `Planet`_ +class above, those methods will show up in a :func:`dir` of the member, +but not of the class:: >>> dir(Planet) ['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__'] diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -874,6 +874,8 @@ Returns :attr:`path`. + .. versionadded:: 3.4 + :mod:`importlib.util` -- Utility code for importers --------------------------------------------------- diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -22,10 +22,11 @@ #ifndef Py_LIMITED_API typedef struct { PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ - int ob_exports; /* how many buffer exports */ - Py_ssize_t ob_alloc; /* How many bytes allocated */ - char *ob_bytes; + int ob_exports; /* How many buffer exports */ } PyByteArrayObject; #endif @@ -49,8 +50,8 @@ #ifndef Py_LIMITED_API #define PyByteArray_AS_STRING(self) \ (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_bytes : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)),Py_SIZE(self)) + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) PyAPI_DATA(char) _PyByteArray_empty_string[]; #endif diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -188,7 +188,7 @@ load_module = _bootstrap._LoaderBasics.load_module _register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, - machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader) + _bootstrap.NamespaceLoader) class ExecutionLoader(InspectLoader): @@ -237,7 +237,7 @@ super().init_module_attrs(module) _bootstrap._init_file_attrs(self, module) -_register(machinery.ExtensionFileLoader) +_register(ExecutionLoader, machinery.ExtensionFileLoader) class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -909,6 +909,15 @@ with self.assertRaises(ValueError): b[3:4] = elem + def test_setslice_extend(self): + # Exercise the resizing logic (see issue #19087) + b = bytearray(range(100)) + self.assertEqual(list(b), list(range(100))) + del b[:10] + self.assertEqual(list(b), list(range(10, 100))) + b.extend(range(100, 110)) + self.assertEqual(list(b), list(range(10, 110))) + def test_extended_set_del_slice(self): indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) for start in indices: diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -45,6 +45,9 @@ self.assertEqual(set(d.keys()), set()) d = {'a': 1, 'b': 2} k = d.keys() + self.assertEqual(set(k), {'a', 'b'}) + self.assertIn('a', k) + self.assertIn('b', k) self.assertIn('a', d) self.assertIn('b', d) self.assertRaises(TypeError, d.keys, None) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -100,6 +100,7 @@ class ExecutionLoader(InheritanceTests): superclass_names = ['InspectLoader'] + subclass_names = ['ExtensionFileLoader'] tests = create_inheritance_tests(ExecutionLoader) Frozen_ExecutionLoaderInheritanceTests, Source_ExecutionLoaderInheritanceTests = tests diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -721,7 +721,7 @@ samples = [b'', b'u'*100000] for sample in samples: x = bytearray(sample) - check(x, vsize('inP') + x.__alloc__()) + check(x, vsize('n2Pi') + x.__alloc__()) # bytearray_iterator check(iter(bytearray()), size('nP')) # cell diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -988,6 +988,7 @@ Roumen Petrov Bjorn Pettersen Justin D. Pettit +Esa Peuha Ronny Pfannschmidt Geoff Philbrick Gavrie Philipson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #19087: Improve bytearray allocation in order to allow cheap popping + of data at the front (slice deletion). + - Issue #19014: memoryview.cast() is now allowed on zero-length views. - Issue #18690: memoryview is now automatically registered with diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -150,6 +150,7 @@ } Py_SIZE(new) = size; new->ob_alloc = alloc; + new->ob_start = new->ob_bytes; new->ob_exports = 0; return (PyObject *)new; @@ -177,48 +178,70 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t size) { void *sval; - Py_ssize_t alloc = ((PyByteArrayObject *)self)->ob_alloc; + PyByteArrayObject *obj = ((PyByteArrayObject *)self); + Py_ssize_t alloc = obj->ob_alloc; + Py_ssize_t logical_offset = obj->ob_start - obj->ob_bytes; assert(self != NULL); assert(PyByteArray_Check(self)); assert(size >= 0); + assert(logical_offset >= 0); + assert(logical_offset <= alloc); if (size == Py_SIZE(self)) { return 0; } - if (!_canresize((PyByteArrayObject *)self)) { + if (!_canresize(obj)) { return -1; } - if (size < alloc / 2) { - /* Major downsize; resize down to exact size */ - alloc = size + 1; - } - else if (size < alloc) { - /* Within allocated size; quick exit */ - Py_SIZE(self) = size; - ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null */ - return 0; - } - else if (size <= alloc * 1.125) { - /* Moderate upsize; overallocate similar to list_resize() */ - alloc = size + (size >> 3) + (size < 9 ? 3 : 6); + if (size + logical_offset + 1 < alloc) { + /* Current buffer is large enough to host the requested size, + decide on a strategy. */ + if (size < alloc / 2) { + /* Major downsize; resize down to exact size */ + alloc = size + 1; + } + else { + /* Minor downsize; quick exit */ + Py_SIZE(self) = size; + PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */ + return 0; + } } else { - /* Major upsize; resize up to exact size */ - alloc = size + 1; + /* Need growing, decide on a strategy */ + if (size <= alloc * 1.125) { + /* Moderate upsize; overallocate similar to list_resize() */ + alloc = size + (size >> 3) + (size < 9 ? 3 : 6); + } + else { + /* Major upsize; resize up to exact size */ + alloc = size + 1; + } } - sval = PyObject_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc); - if (sval == NULL) { - PyErr_NoMemory(); - return -1; + if (logical_offset > 0) { + sval = PyObject_Malloc(alloc); + if (sval == NULL) { + PyErr_NoMemory(); + return -1; + } + memcpy(sval, PyByteArray_AS_STRING(self), Py_MIN(size, Py_SIZE(self))); + PyObject_Free(obj->ob_bytes); } - - ((PyByteArrayObject *)self)->ob_bytes = sval; + else { + sval = PyObject_Realloc(obj->ob_bytes, alloc); + if (sval == NULL) { + PyErr_NoMemory(); + return -1; + } + } + + obj->ob_bytes = obj->ob_start = sval; Py_SIZE(self) = size; - ((PyByteArrayObject *)self)->ob_alloc = alloc; - ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */ + obj->ob_alloc = alloc; + obj->ob_bytes[size] = '\0'; /* Trailing null byte */ return 0; } @@ -288,13 +311,13 @@ } if (size < self->ob_alloc) { Py_SIZE(self) = size; - self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */ + PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; /* Trailing null byte */ } else if (PyByteArray_Resize((PyObject *)self, size) < 0) { PyBuffer_Release(&vo); return NULL; } - memcpy(self->ob_bytes + mysize, vo.buf, vo.len); + memcpy(PyByteArray_AS_STRING(self) + mysize, vo.buf, vo.len); PyBuffer_Release(&vo); Py_INCREF(self); return (PyObject *)self; @@ -331,6 +354,7 @@ { Py_ssize_t mysize; Py_ssize_t size; + char *buf; if (count < 0) count = 0; @@ -338,19 +362,16 @@ if (count > 0 && mysize > PY_SSIZE_T_MAX / count) return PyErr_NoMemory(); size = mysize * count; - if (size < self->ob_alloc) { - Py_SIZE(self) = size; - self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */ - } - else if (PyByteArray_Resize((PyObject *)self, size) < 0) + if (PyByteArray_Resize((PyObject *)self, size) < 0) return NULL; + buf = PyByteArray_AS_STRING(self); if (mysize == 1) - memset(self->ob_bytes, self->ob_bytes[0], size); + memset(buf, buf[0], size); else { Py_ssize_t i; for (i = 1; i < count; i++) - memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize); + memcpy(buf + i*mysize, buf, mysize); } Py_INCREF(self); @@ -366,7 +387,7 @@ PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; } - return PyLong_FromLong((unsigned char)(self->ob_bytes[i])); + return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } static PyObject * @@ -385,7 +406,7 @@ PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; } - return PyLong_FromLong((unsigned char)(self->ob_bytes[i])); + return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; @@ -398,8 +419,8 @@ if (slicelength <= 0) return PyByteArray_FromStringAndSize("", 0); else if (step == 1) { - return PyByteArray_FromStringAndSize(self->ob_bytes + start, - slicelength); + return PyByteArray_FromStringAndSize( + PyByteArray_AS_STRING(self) + start, slicelength); } else { char *source_buf = PyByteArray_AS_STRING(self); @@ -425,10 +446,68 @@ } static int +bytearray_setslice_linear(PyByteArrayObject *self, + Py_ssize_t lo, Py_ssize_t hi, + char *bytes, Py_ssize_t bytes_len) +{ + Py_ssize_t avail = hi - lo; + char *buf = PyByteArray_AS_STRING(self); + Py_ssize_t growth = bytes_len - avail; + assert(avail >= 0); + + if (growth != 0) { + if (growth < 0) { + if (!_canresize(self)) + return -1; + if (lo == 0) { + /* Shrink the buffer by advancing its logical start */ + self->ob_start -= growth; + /* + 0 lo hi old_size + | |<----avail----->|<-----tail------>| + | |<-bytes_len->|<-----tail------>| + 0 new_lo new_hi new_size + */ + } + else { + /* + 0 lo hi old_size + | |<----avail----->|<-----tomove------>| + | |<-bytes_len->|<-----tomove------>| + 0 lo new_hi new_size + */ + memmove(buf + lo + bytes_len, buf + hi, + Py_SIZE(self) - hi); + } + } + /* XXX(nnorwitz): need to verify this can't overflow! */ + if (PyByteArray_Resize( + (PyObject *)self, Py_SIZE(self) + growth) < 0) + return -1; + buf = PyByteArray_AS_STRING(self); + if (growth > 0) { + /* Make the place for the additional bytes */ + /* + 0 lo hi old_size + | |<-avail->|<-----tomove------>| + | |<---bytes_len-->|<-----tomove------>| + 0 lo new_hi new_size + */ + memmove(buf + lo + bytes_len, buf + hi, + Py_SIZE(self) - lo - bytes_len); + } + } + + if (bytes_len > 0) + memcpy(buf + lo, bytes, bytes_len); + return 0; +} + +static int bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *values) { - Py_ssize_t avail, needed; + Py_ssize_t needed; void *bytes; Py_buffer vbytes; int res = 0; @@ -467,50 +546,9 @@ if (hi > Py_SIZE(self)) hi = Py_SIZE(self); - avail = hi - lo; - if (avail < 0) - lo = hi = avail = 0; - - if (avail != needed) { - if (avail > needed) { - if (!_canresize(self)) { - res = -1; - goto finish; - } - /* - 0 lo hi old_size - | |<----avail----->|<-----tomove------>| - | |<-needed->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi, - Py_SIZE(self) - hi); - } - /* XXX(nnorwitz): need to verify this can't overflow! */ - if (PyByteArray_Resize((PyObject *)self, - Py_SIZE(self) + needed - avail) < 0) { - res = -1; - goto finish; - } - if (avail < needed) { - /* - 0 lo hi old_size - | |<-avail->|<-----tomove------>| - | |<----needed---->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi, - Py_SIZE(self) - lo - needed); - } - } - - if (needed > 0) - memcpy(self->ob_bytes + lo, bytes, needed); - - - finish: + res = bytearray_setslice_linear(self, lo, hi, bytes, needed); if (vbytes.len != -1) - PyBuffer_Release(&vbytes); + PyBuffer_Release(&vbytes); return res; } @@ -533,7 +571,7 @@ if (!_getbytevalue(value, &ival)) return -1; - self->ob_bytes[i] = ival; + PyByteArray_AS_STRING(self)[i] = ival; return 0; } @@ -541,7 +579,8 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values) { Py_ssize_t start, stop, step, slicelen, needed; - char *bytes; + char *buf, *bytes; + buf = PyByteArray_AS_STRING(self); if (PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); @@ -568,7 +607,7 @@ int ival; if (!_getbytevalue(values, &ival)) return -1; - self->ob_bytes[i] = (char)ival; + buf[i] = (char)ival; return 0; } } @@ -606,7 +645,7 @@ } else { assert(PyByteArray_Check(values)); - bytes = ((PyByteArrayObject *)values)->ob_bytes; + bytes = PyByteArray_AS_STRING(values); needed = Py_SIZE(values); } /* Make sure b[5:2] = ... inserts before 5, not before 2. */ @@ -614,38 +653,7 @@ (step > 0 && start > stop)) stop = start; if (step == 1) { - if (slicelen != needed) { - if (!_canresize(self)) - return -1; - if (slicelen > needed) { - /* - 0 start stop old_size - | |<---slicelen--->|<-----tomove------>| - | |<-needed->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + start + needed, self->ob_bytes + stop, - Py_SIZE(self) - stop); - } - if (PyByteArray_Resize((PyObject *)self, - Py_SIZE(self) + needed - slicelen) < 0) - return -1; - if (slicelen < needed) { - /* - 0 lo hi old_size - | |<-avail->|<-----tomove------>| - | |<----needed---->|<-----tomove------>| - 0 lo new_hi new_size - */ - memmove(self->ob_bytes + start + needed, self->ob_bytes + stop, - Py_SIZE(self) - start - needed); - } - } - - if (needed > 0) - memcpy(self->ob_bytes + start, bytes, needed); - - return 0; + return bytearray_setslice_linear(self, start, stop, bytes, needed); } else { if (needed == 0) { @@ -672,14 +680,14 @@ if (cur + step >= (size_t)PyByteArray_GET_SIZE(self)) lim = PyByteArray_GET_SIZE(self) - cur - 1; - memmove(self->ob_bytes + cur - i, - self->ob_bytes + cur + 1, lim); + memmove(buf + cur - i, + buf + cur + 1, lim); } /* Move the tail of the bytes, in one chunk */ cur = start + (size_t)slicelen*step; if (cur < (size_t)PyByteArray_GET_SIZE(self)) { - memmove(self->ob_bytes + cur - slicelen, - self->ob_bytes + cur, + memmove(buf + cur - slicelen, + buf + cur, PyByteArray_GET_SIZE(self) - cur); } if (PyByteArray_Resize((PyObject *)self, @@ -701,7 +709,7 @@ return -1; } for (cur = start, i = 0; i < slicelen; cur += step, i++) - self->ob_bytes[cur] = bytes[i]; + buf[cur] = bytes[i]; return 0; } } @@ -781,7 +789,7 @@ if (count > 0) { if (PyByteArray_Resize((PyObject *)self, count)) return -1; - memset(self->ob_bytes, 0, count); + memset(PyByteArray_AS_STRING(self), 0, count); } return 0; } @@ -794,7 +802,8 @@ return -1; size = view.len; if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail; - if (PyBuffer_ToContiguous(self->ob_bytes, &view, size, 'C') < 0) + if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self), + &view, size, 'C') < 0) goto fail; PyBuffer_Release(&view); return 0; @@ -838,7 +847,7 @@ Py_SIZE(self)++; else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) goto error; - self->ob_bytes[Py_SIZE(self)-1] = value; + PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value; } /* Clean up and return success */ @@ -863,6 +872,7 @@ size_t newsize; PyObject *v; Py_ssize_t i; + char *bytes; char c; char *p; int quote; @@ -899,11 +909,12 @@ *p++ = *quote_prefix++; *p++ = quote; + bytes = PyByteArray_AS_STRING(self); for (i = 0; i < length; i++) { /* There's at least enough room for a hex escape and a closing quote. */ assert(newsize - (p - buffer) >= 5); - c = self->ob_bytes[i]; + c = bytes[i]; if (c == '\'' || c == '\\') *p++ = '\\', *p++ = c; else if (c == '\t') @@ -2194,7 +2205,7 @@ Py_ssize_t i, j, n = Py_SIZE(self); j = n / 2; - head = self->ob_bytes; + head = PyByteArray_AS_STRING(self); tail = head + n - 1; for (i = 0; i < j; i++) { swap = *head; @@ -2215,6 +2226,7 @@ PyObject *value; int ival; Py_ssize_t where, n = Py_SIZE(self); + char *buf; if (!PyArg_ParseTuple(args, "nO:insert", &where, &value)) return NULL; @@ -2228,6 +2240,7 @@ return NULL; if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; + buf = PyByteArray_AS_STRING(self); if (where < 0) { where += n; @@ -2236,8 +2249,8 @@ } if (where > n) where = n; - memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where); - self->ob_bytes[where] = ival; + memmove(buf + where + 1, buf + where, n - where); + buf[where] = ival; Py_RETURN_NONE; } @@ -2262,7 +2275,7 @@ if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; - self->ob_bytes[n] = value; + PyByteArray_AS_STRING(self)[n] = value; Py_RETURN_NONE; } @@ -2355,6 +2368,7 @@ { int value; Py_ssize_t where = -1, n = Py_SIZE(self); + char *buf; if (!PyArg_ParseTuple(args, "|n:pop", &where)) return NULL; @@ -2373,8 +2387,9 @@ if (!_canresize(self)) return NULL; - value = self->ob_bytes[where]; - memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where); + buf = PyByteArray_AS_STRING(self); + value = buf[where]; + memmove(buf + where, buf + where + 1, n - where); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL; @@ -2390,12 +2405,13 @@ { int value; Py_ssize_t where, n = Py_SIZE(self); + char *buf = PyByteArray_AS_STRING(self); if (! _getbytevalue(arg, &value)) return NULL; for (where = 0; where < n; where++) { - if (self->ob_bytes[where] == value) + if (buf[where] == value) break; } if (where == n) { @@ -2405,7 +2421,7 @@ if (!_canresize(self)) return NULL; - memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where); + memmove(buf + where, buf + where + 1, n - where); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL; @@ -2415,21 +2431,21 @@ /* XXX These two helpers could be optimized if argsize == 1 */ static Py_ssize_t -lstrip_helper(unsigned char *myptr, Py_ssize_t mysize, +lstrip_helper(char *myptr, Py_ssize_t mysize, void *argptr, Py_ssize_t argsize) { Py_ssize_t i = 0; - while (i < mysize && memchr(argptr, myptr[i], argsize)) + while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize)) i++; return i; } static Py_ssize_t -rstrip_helper(unsigned char *myptr, Py_ssize_t mysize, +rstrip_helper(char *myptr, Py_ssize_t mysize, void *argptr, Py_ssize_t argsize) { Py_ssize_t i = mysize - 1; - while (i >= 0 && memchr(argptr, myptr[i], argsize)) + while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize)) i--; return i + 1; } @@ -2444,7 +2460,7 @@ bytearray_strip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t left, right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:strip", &arg)) @@ -2456,10 +2472,10 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); left = lstrip_helper(myptr, mysize, argptr, argsize); if (left == mysize) @@ -2468,7 +2484,7 @@ right = rstrip_helper(myptr, mysize, argptr, argsize); if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left); + return PyByteArray_FromStringAndSize(myptr + left, right - left); } PyDoc_STRVAR(lstrip__doc__, @@ -2481,7 +2497,7 @@ bytearray_lstrip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t left, right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:lstrip", &arg)) @@ -2493,16 +2509,16 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); left = lstrip_helper(myptr, mysize, argptr, argsize); right = mysize; if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left); + return PyByteArray_FromStringAndSize(myptr + left, right - left); } PyDoc_STRVAR(rstrip__doc__, @@ -2515,7 +2531,7 @@ bytearray_rstrip(PyByteArrayObject *self, PyObject *args) { Py_ssize_t right, mysize, argsize; - void *myptr, *argptr; + char *myptr, *argptr; PyObject *arg = Py_None; Py_buffer varg; if (!PyArg_ParseTuple(args, "|O:rstrip", &arg)) @@ -2527,15 +2543,15 @@ else { if (_getbuffer(arg, &varg) < 0) return NULL; - argptr = varg.buf; + argptr = (char *) varg.buf; argsize = varg.len; } - myptr = self->ob_bytes; + myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); right = rstrip_helper(myptr, mysize, argptr, argsize); if (arg != Py_None) PyBuffer_Release(&varg); - return PyByteArray_FromStringAndSize(self->ob_bytes, right); + return PyByteArray_FromStringAndSize(myptr, right); } PyDoc_STRVAR(decode_doc, @@ -2686,6 +2702,7 @@ { PyObject *dict; _Py_IDENTIFIER(__dict__); + char *buf; dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__); if (dict == NULL) { @@ -2694,19 +2711,20 @@ Py_INCREF(dict); } + buf = PyByteArray_AS_STRING(self); if (proto < 3) { /* use str based reduction for backwards compatibility with Python 2.x */ PyObject *latin1; - if (self->ob_bytes) - latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, Py_SIZE(self), NULL); + if (Py_SIZE(self)) + latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL); else latin1 = PyUnicode_FromString(""); return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict); } else { /* use more efficient byte based reduction */ - if (self->ob_bytes) { - return Py_BuildValue("(O(y#)N)", Py_TYPE(self), self->ob_bytes, Py_SIZE(self), dict); + if (Py_SIZE(self)) { + return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict); } else { return Py_BuildValue("(O()N)", Py_TYPE(self), dict); @@ -2938,7 +2956,7 @@ if (it->it_index < PyByteArray_GET_SIZE(seq)) { item = PyLong_FromLong( - (unsigned char)seq->ob_bytes[it->it_index]); + (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]); if (item != NULL) ++it->it_index; return item; diff --git a/Objects/complexobject.c b/Objects/complexobject.c --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -681,7 +681,7 @@ PyDoc_STRVAR(complex_conjugate_doc, "complex.conjugate() -> complex\n" "\n" -"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); +"Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); static PyObject * complex_getnewargs(PyComplexObject *v) @@ -693,7 +693,7 @@ PyDoc_STRVAR(complex__format__doc, "complex.__format__() -> str\n" "\n" -"Converts to a string according to format_spec."); +"Convert to a string according to format_spec."); static PyObject * complex__format__(PyObject* self, PyObject* args) diff --git a/Objects/floatobject.c b/Objects/floatobject.c --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1498,9 +1498,9 @@ PyDoc_STRVAR(float_as_integer_ratio_doc, "float.as_integer_ratio() -> (int, int)\n" "\n" -"Returns a pair of integers, whose ratio is exactly equal to the original\n" +"Return a pair of integers, whose ratio is exactly equal to the original\n" "float and with a positive denominator.\n" -"Raises OverflowError on infinities and a ValueError on NaNs.\n" +"Raise OverflowError on infinities and a ValueError on NaNs.\n" "\n" ">>> (10.0).as_integer_ratio()\n" "(10, 1)\n" @@ -1687,7 +1687,7 @@ "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" "one of the latter two if it appears to match the underlying C reality.\n" "\n" -"Overrides the automatic determination of C-level floating point type.\n" +"Override the automatic determination of C-level floating point type.\n" "This affects how floats are converted to and from binary strings."); static PyObject * @@ -1726,12 +1726,12 @@ static PyMethodDef float_methods[] = { {"conjugate", (PyCFunction)float_float, METH_NOARGS, - "Returns self, the complex conjugate of any float."}, + "Return self, the complex conjugate of any float."}, {"__trunc__", (PyCFunction)float_trunc, METH_NOARGS, - "Returns the Integral closest to x between 0 and x."}, + "Return the Integral closest to x between 0 and x."}, {"__round__", (PyCFunction)float_round, METH_VARARGS, - "Returns the Integral closest to x, rounding half toward even.\n" - "When an argument is passed, works like built-in round(x, ndigits)."}, + "Return the Integral closest to x, rounding half toward even.\n" + "When an argument is passed, work 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, @@ -1739,14 +1739,14 @@ {"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."}, + "Return True if the float is an integer."}, #if 0 {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Returns True if the float is positive or negative infinite."}, + "Return True if the float is positive or negative infinite."}, {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Returns True if the float is finite, neither infinite nor NaN."}, + "Return True if the float is finite, neither infinite nor NaN."}, {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Returns True if the float is not a number (NaN)."}, + "Return True if the float is not a number (NaN)."}, #endif {"__getnewargs__", (PyCFunction)float_getnewargs, METH_NOARGS}, {"__getformat__", (PyCFunction)float_getformat, diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3878,10 +3878,16 @@ goto Done; } - /* if base < 0: - base = base % modulus - Having the base positive just makes things easier. */ - if (Py_SIZE(a) < 0) { + /* Reduce base by modulus in some cases: + 1. If base < 0. Forcing the base non-negative makes things easier. + 2. If base is obviously larger than the modulus. The "small + exponent" case later can multiply directly by base repeatedly, + while the "large exponent" case multiplies directly by base 31 + times. It can be unboundedly faster to multiply by + base % modulus instead. + We could _always_ do this reduction, but l_divmod() isn't cheap, + so we only do it when it buys something. */ + if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) { if (l_divmod(a, c, NULL, &temp) < 0) goto Error; Py_DECREF(a); diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -139,7 +139,7 @@ "range(stop) -> range object\n\ range(start, stop[, step]) -> range object\n\ \n\ -Returns a virtual sequence of numbers from start to stop by step."); +Return a virtual sequence of numbers from start to stop by step."); static void range_dealloc(rangeobject *r) @@ -672,14 +672,14 @@ static PyObject * range_reverse(PyObject *seq); PyDoc_STRVAR(reverse_doc, -"Returns a reverse iterator."); +"Return a reverse iterator."); PyDoc_STRVAR(count_doc, "rangeobject.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(index_doc, "rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" -"Raises ValueError if the value is not present."); +"Raise ValueError if the value is not present."); static PyMethodDef range_methods[] = { {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 06:35:03 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 06:35:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMTQ5Mjc6?= =?utf-8?q?_Minor_clean-up_of_function_parameters_in_random=28=29=2E?= Message-ID: <3cssS76cxXz7LjR@mail.python.org> http://hg.python.org/cpython/rev/b1e94e332ec8 changeset: 85987:b1e94e332ec8 branch: 2.7 parent: 85983:101bf827611a user: Raymond Hettinger date: Sat Oct 05 21:34:48 2013 -0700 summary: Issue 14927: Minor clean-up of function parameters in random(). files: Lib/random.py | 39 +++++++++++++++++++-------------------- 1 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -170,29 +170,28 @@ ## -------------------- integer methods ------------------- - def randrange(self, start, stop=None, step=1, int=int, default=None, - maxwidth=1L< 0: - if istart >= maxwidth: + if istart >= _maxwidth: return self._randbelow(istart) - return int(self.random() * istart) + return _int(self.random() * istart) raise ValueError, "empty range for randrange()" # stop argument supplied. - istop = int(stop) + istop = _int(stop) if istop != stop: raise ValueError, "non-integer stop for randrange()" width = istop - istart @@ -210,14 +209,14 @@ # a long, but we're supposed to return an int (for backward # compatibility). - if width >= maxwidth: - return int(istart + self._randbelow(width)) - return int(istart + int(self.random()*width)) + if width >= _maxwidth: + return _int(istart + self._randbelow(width)) + return _int(istart + _int(self.random()*width)) if step == 1: raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width) # Non-unit step argument supplied. - istep = int(step) + istep = _int(step) if istep != step: raise ValueError, "non-integer step for randrange()" if istep > 0: @@ -230,9 +229,9 @@ if n <= 0: raise ValueError, "empty range for randrange()" - if n >= maxwidth: + if n >= _maxwidth: return istart + istep*self._randbelow(n) - return istart + istep*int(self.random() * n) + return istart + istep*_int(self.random() * n) def randint(self, a, b): """Return random integer in range [a, b], including both end points. @@ -240,7 +239,7 @@ return self.randrange(a, b+1) - def _randbelow(self, n, _log=_log, int=int, _maxwidth=1L< n-1 > 2**(k-2) + k = _int(1.00001 + _log(n-1, 2.0)) # 2**k > n-1 > 2**(k-2) r = getrandbits(k) while r >= n: r = getrandbits(k) @@ -265,7 +264,7 @@ if n >= _maxwidth: _warn("Underlying random() generator does not supply \n" "enough bits to choose from a population range this large") - return int(self.random() * n) + return _int(self.random() * n) ## -------------------- sequence methods ------------------- @@ -273,20 +272,20 @@ """Choose a random element from a non-empty sequence.""" return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty - def shuffle(self, x, random=None, int=int): + def shuffle(self, x, random=None): """x, random=random.random -> shuffle list x in place; return None. Optional arg random is a 0-argument function returning a random float in [0.0, 1.0); by default, the standard random.random. - Do not supply the 'int' argument. """ if random is None: random = self.random + _int = int for i in reversed(xrange(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] - j = int(random() * (i+1)) + j = _int(random() * (i+1)) x[i], x[j] = x[j], x[i] def sample(self, population, k): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 06:52:18 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 06:52:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Minor_clean-up?= =?utf-8?q?_of_function_parameters_in_random=28=29=2E?= Message-ID: <3cssr20YRXz7LjP@mail.python.org> http://hg.python.org/cpython/rev/0899960835f5 changeset: 85988:0899960835f5 branch: 3.3 parent: 85981:f34c59494420 user: Raymond Hettinger date: Sat Oct 05 21:48:21 2013 -0700 summary: Minor clean-up of function parameters in random(). files: Lib/random.py | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -162,18 +162,17 @@ ## -------------------- integer methods ------------------- - def randrange(self, start, stop=None, step=1, int=int): + def randrange(self, start, stop=None, step=1, _int=int): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the endpoint; in Python this is usually not what you want. - Do not supply the 'int' argument. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - istart = int(start) + istart = _int(start) if istart != start: raise ValueError("non-integer arg 1 for randrange()") if stop is None: @@ -182,7 +181,7 @@ raise ValueError("empty range for randrange()") # stop argument supplied. - istop = int(stop) + istop = _int(stop) if istop != stop: raise ValueError("non-integer stop for randrange()") width = istop - istart @@ -192,7 +191,7 @@ raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) # Non-unit step argument supplied. - istep = int(step) + istep = _int(step) if istep != step: raise ValueError("non-integer step for randrange()") if istep > 0: @@ -251,7 +250,7 @@ raise IndexError('Cannot choose from an empty sequence') return seq[i] - def shuffle(self, x, random=None, int=int): + def shuffle(self, x, random=None): """x, random=random.random -> shuffle list x in place; return None. Optional arg random is a 0-argument function returning a random @@ -260,11 +259,18 @@ Do not supply the 'int' argument. """ - randbelow = self._randbelow - for i in reversed(range(1, len(x))): - # pick an element in x[:i+1] with which to exchange x[i] - j = randbelow(i+1) if random is None else int(random() * (i+1)) - x[i], x[j] = x[j], x[i] + if random is None: + randbelow = self._randbelow + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = randbelow(i+1) + x[i], x[j] = x[j], x[i] + else: + _int = int + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = _int(random() * (i+1)) + x[i], x[j] = x[j], x[i] def sample(self, population, k): """Chooses k unique random elements from a population sequence or set. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 06:52:19 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 06:52:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Minor_clean-up_of_function_parameters_in_random=28=29=2E?= Message-ID: <3cssr32PBKz7LjP@mail.python.org> http://hg.python.org/cpython/rev/8494d2c8ef54 changeset: 85989:8494d2c8ef54 parent: 85986:94246efe2275 parent: 85988:0899960835f5 user: Raymond Hettinger date: Sat Oct 05 21:52:06 2013 -0700 summary: Minor clean-up of function parameters in random(). files: Lib/random.py | 29 +++++++++++++++++------------ 1 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -165,18 +165,17 @@ ## -------------------- integer methods ------------------- - def randrange(self, start, stop=None, step=1, int=int): + def randrange(self, start, stop=None, step=1, _int=int): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the endpoint; in Python this is usually not what you want. - Do not supply the 'int' argument. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - istart = int(start) + istart = _int(start) if istart != start: raise ValueError("non-integer arg 1 for randrange()") if stop is None: @@ -185,7 +184,7 @@ raise ValueError("empty range for randrange()") # stop argument supplied. - istop = int(stop) + istop = _int(stop) if istop != stop: raise ValueError("non-integer stop for randrange()") width = istop - istart @@ -195,7 +194,7 @@ raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) # Non-unit step argument supplied. - istep = int(step) + istep = _int(step) if istep != step: raise ValueError("non-integer step for randrange()") if istep > 0: @@ -254,21 +253,27 @@ raise IndexError('Cannot choose from an empty sequence') return seq[i] - def shuffle(self, x, random=None, int=int): + def shuffle(self, x, random=None): """Shuffle list x in place, and return None. Optional argument random is a 0-argument function returning a random float in [0.0, 1.0); if it is the default None, the standard random.random will be used. - Do not supply the 'int' argument. """ - randbelow = self._randbelow - for i in reversed(range(1, len(x))): - # pick an element in x[:i+1] with which to exchange x[i] - j = randbelow(i+1) if random is None else int(random() * (i+1)) - x[i], x[j] = x[j], x[i] + if random is None: + randbelow = self._randbelow + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = randbelow(i+1) + x[i], x[j] = x[j], x[i] + else: + _int = int + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = _int(random() * (i+1)) + x[i], x[j] = x[j], x[i] def sample(self, population, k): """Chooses k unique random elements from a population sequence or set. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Oct 6 07:05:17 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 06 Oct 2013 07:05:17 +0200 Subject: [Python-checkins] Daily reference leaks (94246efe2275): sum=4 Message-ID: results for 94246efe2275 on branch "default" -------------------------------------------- test_imp leaked [0, 1, -1] references, sum=0 test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7Trxh2', '-x'] From python-checkins at python.org Sun Oct 6 07:12:02 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 07:12:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgMTQ5Mjc6?= =?utf-8?q?_Remove_a_docstring_line_that_is_no_longer_applicable=2E?= Message-ID: <3cstGp4j8Wz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/50ea4dccb03e changeset: 85990:50ea4dccb03e branch: 3.3 parent: 85988:0899960835f5 user: Raymond Hettinger date: Sat Oct 05 22:11:16 2013 -0700 summary: Issue 14927: Remove a docstring line that is no longer applicable. files: Lib/random.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -256,7 +256,6 @@ Optional arg random is a 0-argument function returning a random float in [0.0, 1.0); by default, the standard random.random. - Do not supply the 'int' argument. """ if random is None: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 07:12:03 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 6 Oct 2013 07:12:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cstGq6Ttwz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/732abffd7433 changeset: 85991:732abffd7433 parent: 85989:8494d2c8ef54 parent: 85990:50ea4dccb03e user: Raymond Hettinger date: Sat Oct 05 22:11:43 2013 -0700 summary: merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:16:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:16:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_ZeroDivisi?= =?utf-8?q?onError_message_=28reported_by_Pavel_Fedotov_on_docs=40=29?= Message-ID: <3csx2G60vdz7LjR@mail.python.org> http://hg.python.org/cpython/rev/32689671a881 changeset: 85992:32689671a881 branch: 3.3 parent: 85990:50ea4dccb03e user: Georg Brandl date: Sun Oct 06 09:11:14 2013 +0200 summary: Fix ZeroDivisionError message (reported by Pavel Fedotov on docs@) files: Doc/tutorial/errors.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -45,7 +45,7 @@ >>> 10 * (1/0) Traceback (most recent call last): File "", line 1, in ? - ZeroDivisionError: int division or modulo by zero + ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "", line 1, in ? -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:16:24 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:16:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csx2J0k1lz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/56ddb9f6c51f changeset: 85993:56ddb9f6c51f parent: 85991:732abffd7433 parent: 85992:32689671a881 user: Georg Brandl date: Sun Oct 06 09:17:07 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/errors.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -45,7 +45,7 @@ >>> 10 * (1/0) Traceback (most recent call last): File "", line 1, in ? - ZeroDivisionError: int division or modulo by zero + ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "", line 1, in ? -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:17:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:17:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4ICJjdXN0b21l?= =?utf-8?q?r_timer=22_-=3E_=22custom_timer=22_=28reported_by_Kirk_Strauser?= =?utf-8?q?_on_docs=40=29?= Message-ID: <3csx38141dz7LjR@mail.python.org> http://hg.python.org/cpython/rev/b79f68d075c3 changeset: 85994:b79f68d075c3 branch: 3.3 parent: 85992:32689671a881 user: Georg Brandl date: Sun Oct 06 09:17:43 2013 +0200 summary: Fix "customer timer" -> "custom timer" (reported by Kirk Strauser on docs@) files: Doc/library/profile.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -600,8 +600,8 @@ .. _profile-timers: -Using a customer timer -====================== +Using a custom timer +==================== If you want to change how current time is determined (for example, to force use of wall-clock time or elapsed process time), pass the timing function you want -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:17:09 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:17:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csx392tgfz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/417903cb287e changeset: 85995:417903cb287e parent: 85993:56ddb9f6c51f parent: 85994:b79f68d075c3 user: Georg Brandl date: Sun Oct 06 09:17:52 2013 +0200 summary: merge with 3.3 files: Doc/library/profile.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -600,8 +600,8 @@ .. _profile-timers: -Using a customer timer -====================== +Using a custom timer +==================== If you want to change how current time is determined (for example, to force use of wall-clock time or elapsed process time), pass the timing function you want -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:17:50 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:17:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4ICJjdXN0b21l?= =?utf-8?q?r_timer=22_-=3E_=22custom_timer=22_=28reported_by_Kirk_Strauser?= =?utf-8?q?_on_docs=40=29?= Message-ID: <3csx3y65Krz7LjR@mail.python.org> http://hg.python.org/cpython/rev/736071957c1d changeset: 85996:736071957c1d branch: 2.7 parent: 85987:b1e94e332ec8 user: Georg Brandl date: Sun Oct 06 09:17:43 2013 +0200 summary: Fix "customer timer" -> "custom timer" (reported by Kirk Strauser on docs@) files: Doc/library/profile.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -625,8 +625,8 @@ .. _profile-timers: -Using a customer timer -====================== +Using a custom timer +==================== If you want to change how current time is determined (for example, to force use of wall-clock time or elapsed process time), pass the timing function you want -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:22:36 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:22:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4OiBFbGVtZW50?= =?utf-8?q?=2Etext_is_an_attribute=2C_not_a_method_=28report_by_Cameron_La?= =?utf-8?q?ird_on?= Message-ID: <3csx9S3xxzz7LjR@mail.python.org> http://hg.python.org/cpython/rev/67a61526fc84 changeset: 85997:67a61526fc84 branch: 2.7 user: Georg Brandl date: Sun Oct 06 09:23:03 2013 +0200 summary: Fix: Element.text is an attribute, not a method (report by Cameron Laird on docs@) files: Doc/library/xml.etree.elementtree.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -158,7 +158,7 @@ :meth:`Element.findall` finds only elements with a tag which are direct children of the current element. :meth:`Element.find` finds the *first* child -with a particular tag, and :meth:`Element.text` accesses the element's text +with a particular tag, and :attr:`Element.text` accesses the element's text content. :meth:`Element.get` accesses the element's attributes:: >>> for country in root.findall('country'): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:23:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:23:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4OiBFbGVtZW50?= =?utf-8?q?=2Etext_is_an_attribute=2C_not_a_method_=28report_by_Cameron_La?= =?utf-8?q?ird_on?= Message-ID: <3csx9x2Bctz7LjR@mail.python.org> http://hg.python.org/cpython/rev/e09d5fe1b1a9 changeset: 85998:e09d5fe1b1a9 branch: 3.3 parent: 85994:b79f68d075c3 user: Georg Brandl date: Sun Oct 06 09:23:03 2013 +0200 summary: Fix: Element.text is an attribute, not a method (report by Cameron Laird on docs@) files: Doc/library/xml.etree.elementtree.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -123,7 +123,7 @@ :meth:`Element.findall` finds only elements with a tag which are direct children of the current element. :meth:`Element.find` finds the *first* child -with a particular tag, and :meth:`Element.text` accesses the element's text +with a particular tag, and :attr:`Element.text` accesses the element's text content. :meth:`Element.get` accesses the element's attributes:: >>> for country in root.findall('country'): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:23:02 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:23:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csx9y4Znyz7Lkq@mail.python.org> http://hg.python.org/cpython/rev/97f3bfd6be25 changeset: 85999:97f3bfd6be25 parent: 85995:417903cb287e parent: 85998:e09d5fe1b1a9 user: Georg Brandl date: Sun Oct 06 09:23:19 2013 +0200 summary: merge with 3.3 files: Doc/library/xml.etree.elementtree.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -160,7 +160,7 @@ :meth:`Element.findall` finds only elements with a tag which are direct children of the current element. :meth:`Element.find` finds the *first* child -with a particular tag, and :meth:`Element.text` accesses the element's text +with a particular tag, and :attr:`Element.text` accesses the element's text content. :meth:`Element.get` accesses the element's attributes:: >>> for country in root.findall('country'): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:31:30 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:31:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Remove_dead_li?= =?utf-8?q?nk_to_effbot_Tkinter_introduction_material_=28reported_by_Ralf?= Message-ID: <3csxMk70j3z7LjR@mail.python.org> http://hg.python.org/cpython/rev/8b77febfb2fb changeset: 86000:8b77febfb2fb branch: 3.3 parent: 85998:e09d5fe1b1a9 user: Georg Brandl date: Sun Oct 06 09:32:03 2013 +0200 summary: Remove dead link to effbot Tkinter introduction material (reported by Ralf Ganswindt from docs@) files: Doc/library/tkinter.rst | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -37,9 +37,6 @@ `Modern Tkinter for Busy Python Developers `_ Book by Mark Rozerman about building attractive and modern graphical user interfaces with Python and Tkinter. - `An Introduction to Tkinter `_ - Fredrik Lundh's on-line reference material. - `Python and Tkinter Programming `_ The book by John Grayson (ISBN 1-884777-81-3). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:31:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:31:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csxMm1dByz7LjR@mail.python.org> http://hg.python.org/cpython/rev/8eec8bc8e963 changeset: 86001:8eec8bc8e963 parent: 85999:97f3bfd6be25 parent: 86000:8b77febfb2fb user: Georg Brandl date: Sun Oct 06 09:32:15 2013 +0200 summary: merge with 3.3 files: Doc/library/tkinter.rst | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -37,9 +37,6 @@ `Modern Tkinter for Busy Python Developers `_ Book by Mark Rozerman about building attractive and modern graphical user interfaces with Python and Tkinter. - `An Introduction to Tkinter `_ - Fredrik Lundh's on-line reference material. - `Python and Tkinter Programming `_ The book by John Grayson (ISBN 1-884777-81-3). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:33:17 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:33:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Remove_dead_li?= =?utf-8?q?nk_to_effbot_Tkinter_introduction_material_=28reported_by_Ralf?= Message-ID: <3csxPn4FLZz7LjR@mail.python.org> http://hg.python.org/cpython/rev/deee160938f7 changeset: 86002:deee160938f7 branch: 2.7 parent: 85997:67a61526fc84 user: Georg Brandl date: Sun Oct 06 09:32:03 2013 +0200 summary: Remove dead link to effbot Tkinter introduction material (reported by Ralf Ganswindt from docs@) files: Doc/library/tkinter.rst | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -41,9 +41,6 @@ `Modern Tkinter for Busy Python Developers `_ Book by Mark Rozerman about building attractive and modern graphical user interfaces with Python and Tkinter. - `An Introduction to Tkinter `_ - Fredrik Lundh's on-line reference material. - `Python and Tkinter Programming `_ The book by John Grayson (ISBN 1-884777-81-3). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:42:07 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:42:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Remove_newline?= =?utf-8?q?_in_method_that_makes_it_possible_to_copy_example_to_the?= Message-ID: <3csxbz3Pd6zS9B@mail.python.org> http://hg.python.org/cpython/rev/65a3ba21c679 changeset: 86003:65a3ba21c679 branch: 3.3 parent: 86000:8b77febfb2fb user: Georg Brandl date: Sun Oct 06 09:42:46 2013 +0200 summary: Remove newline in method that makes it possible to copy example to the interactive interpreter. files: Doc/tutorial/classes.rst | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -168,7 +168,6 @@ def do_global(): global spam spam = "global spam" - spam = "test spam" do_local() print("After local assignment:", spam) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:42:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:42:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csxc05D4HzS9B@mail.python.org> http://hg.python.org/cpython/rev/d974de6ec9a6 changeset: 86004:d974de6ec9a6 parent: 86001:8eec8bc8e963 parent: 86003:65a3ba21c679 user: Georg Brandl date: Sun Oct 06 09:42:52 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/classes.rst | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -168,7 +168,6 @@ def do_global(): global spam spam = "global spam" - spam = "test spam" do_local() print("After local assignment:", spam) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:48:33 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:48:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_markup_to_?= =?utf-8?q?not_add_parens_to_the_=22hashlib=2Emd5=22_constructor_when_the_?= =?utf-8?q?object?= Message-ID: <3csxlP4bQJzSmf@mail.python.org> http://hg.python.org/cpython/rev/4ffa1623730f changeset: 86005:4ffa1623730f branch: 3.3 parent: 86003:65a3ba21c679 user: Georg Brandl date: Sun Oct 06 09:48:47 2013 +0200 summary: Fix markup to not add parens to the "hashlib.md5" constructor when the object is meant, not the call. files: Doc/library/hmac.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -19,7 +19,7 @@ Return a new hmac object. *key* is a bytes object giving the secret key. If *msg* is present, the method call ``update(msg)`` is made. *digestmod* is the digest constructor or module for the HMAC object to use. It defaults to - the :func:`hashlib.md5` constructor. + the :data:`hashlib.md5` constructor. An HMAC object has the following methods: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:48:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:48:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csxlQ6FJyzSsl@mail.python.org> http://hg.python.org/cpython/rev/e0ef10716fed changeset: 86006:e0ef10716fed parent: 86004:d974de6ec9a6 parent: 86005:4ffa1623730f user: Georg Brandl date: Sun Oct 06 09:49:18 2013 +0200 summary: merge with 3.3 files: Doc/library/hmac.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -19,7 +19,7 @@ Return a new hmac object. *key* is a bytes or bytearray object giving the secret key. If *msg* is present, the method call ``update(msg)`` is made. *digestmod* is the digest constructor or module for the HMAC object to use. - It defaults to the :func:`hashlib.md5` constructor. + It defaults to the :data:`hashlib.md5` constructor. .. versionchanged:: 3.4 Parameter *key* can be a bytes or bytearray object. Parameter *msg* can -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:48:57 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:48:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_markup=2E?= Message-ID: <3csxls0DsQzSsl@mail.python.org> http://hg.python.org/cpython/rev/d9618312783e changeset: 86007:d9618312783e branch: 2.7 parent: 86002:deee160938f7 user: Georg Brandl date: Sun Oct 06 09:47:45 2013 +0200 summary: Fix markup. files: Doc/faq/gui.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/faq/gui.rst b/Doc/faq/gui.rst --- a/Doc/faq/gui.rst +++ b/Doc/faq/gui.rst @@ -49,7 +49,7 @@ There are bindings available for the Qt toolkit (using either `PyQt `_ or `PySide -`_) and for KDE (`PyKDE http://www.riverbankcomputing.co.uk/software/pykde/intro>`__). +`_) and for KDE (`PyKDE `_). PyQt is currently more mature than PySide, but you must buy a PyQt license from `Riverbank Computing `_ if you want to write proprietary applications. PySide is free for all applications. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:48:58 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:48:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_markup_to_?= =?utf-8?q?not_add_parens_to_the_=22hashlib=2Emd5=22_constructor_when_the_?= =?utf-8?q?object?= Message-ID: <3csxlt1xDKzSsl@mail.python.org> http://hg.python.org/cpython/rev/a1b10232f1b5 changeset: 86008:a1b10232f1b5 branch: 2.7 user: Georg Brandl date: Sun Oct 06 09:48:26 2013 +0200 summary: Fix markup to not add parens to the "hashlib.md5" constructor when the object is meant, not the call. files: Doc/library/hmac.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -20,7 +20,7 @@ Return a new hmac object. If *msg* is present, the method call ``update(msg)`` is made. *digestmod* is the digest constructor or module for the HMAC object to - use. It defaults to the :func:`hashlib.md5` constructor. + use. It defaults to the :data:`hashlib.md5` constructor. An HMAC object has the following methods: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:50:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:50:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4IHByZWZpeF9j?= =?utf-8?q?hars_not_being_applied_in_help_text_example_=28reported_by_John?= Message-ID: <3csxn83zkZzSmf@mail.python.org> http://hg.python.org/cpython/rev/ee394a61dade changeset: 86009:ee394a61dade branch: 3.3 parent: 86005:4ffa1623730f user: Georg Brandl date: Sun Oct 06 09:50:36 2013 +0200 summary: Fix prefix_chars not being applied in help text example (reported by John Kooker on docs@) files: Doc/library/argparse.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -598,10 +598,10 @@ >>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/') >>> parser.print_help() - usage: PROG [-h] + usage: PROG [+h] optional arguments: - -h, --help show this help message and exit + +h, ++help show this help message and exit The add_argument() method -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:50:05 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:50:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csxn95lwRzSwZ@mail.python.org> http://hg.python.org/cpython/rev/e2456381fa14 changeset: 86010:e2456381fa14 parent: 86006:e0ef10716fed parent: 86009:ee394a61dade user: Georg Brandl date: Sun Oct 06 09:50:49 2013 +0200 summary: merge with 3.3 files: Doc/library/argparse.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -598,10 +598,10 @@ >>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/') >>> parser.print_help() - usage: PROG [-h] + usage: PROG [+h] optional arguments: - -h, --help show this help message and exit + +h, ++help show this help message and exit The add_argument() method -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:52:28 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:52:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4IHByZWZpeF9j?= =?utf-8?q?hars_not_being_applied_in_help_text_example_=28reported_by_John?= Message-ID: <3csxqw6xxZzSVp@mail.python.org> http://hg.python.org/cpython/rev/c5f57a7fd4d8 changeset: 86011:c5f57a7fd4d8 branch: 2.7 parent: 86008:a1b10232f1b5 user: Georg Brandl date: Sun Oct 06 09:50:36 2013 +0200 summary: Fix prefix_chars not being applied in help text example (reported by John Kooker on docs@) files: Doc/library/argparse.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -579,10 +579,10 @@ >>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/') >>> parser.print_help() - usage: PROG [-h] + usage: PROG [+h] optional arguments: - -h, --help show this help message and exit + +h, ++help show this help message and exit The add_argument() method -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:52:30 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:52:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Clarify_docs_f?= =?utf-8?q?or_os=2Epath=2Egetctime_on_Unix=3A_it_is_the_inode_=28metadata?= =?utf-8?q?=29_change?= Message-ID: <3csxqy1bKNzSwZ@mail.python.org> http://hg.python.org/cpython/rev/94c64a2cb09e changeset: 86012:94c64a2cb09e branch: 2.7 user: Georg Brandl date: Sun Oct 06 09:52:55 2013 +0200 summary: Clarify docs for os.path.getctime on Unix: it is the inode (metadata) change time files: Doc/library/os.path.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -147,7 +147,7 @@ .. function:: getctime(path) Return the system's ctime which, on some systems (like Unix) is the time of the - last change, and, on others (like Windows), is the creation time for *path*. + last metadata change, and, on others (like Windows), is the creation time for *path*. The return value is a number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`os.error` if the file does not exist or is inaccessible. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:53:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:53:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Clarify_docs_f?= =?utf-8?q?or_os=2Epath=2Egetctime_on_Unix=3A_it_is_the_inode_=28metadata?= =?utf-8?q?=29_change?= Message-ID: <3csxrb3Qb4zSVp@mail.python.org> http://hg.python.org/cpython/rev/941d18e605f6 changeset: 86013:941d18e605f6 branch: 3.3 parent: 86009:ee394a61dade user: Georg Brandl date: Sun Oct 06 09:52:55 2013 +0200 summary: Clarify docs for os.path.getctime on Unix: it is the inode (metadata) change time files: Doc/library/os.path.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -150,7 +150,7 @@ .. function:: getctime(path) Return the system's ctime which, on some systems (like Unix) is the time of the - last change, and, on others (like Windows), is the creation time for *path*. + last metadata change, and, on others (like Windows), is the creation time for *path*. The return value is a number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 09:53:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 09:53:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csxrc5JYhzSVp@mail.python.org> http://hg.python.org/cpython/rev/befedd5c64c5 changeset: 86014:befedd5c64c5 parent: 86010:e2456381fa14 parent: 86013:941d18e605f6 user: Georg Brandl date: Sun Oct 06 09:53:11 2013 +0200 summary: merge with 3.3 files: Doc/library/os.path.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -149,7 +149,7 @@ .. function:: getctime(path) Return the system's ctime which, on some systems (like Unix) is the time of the - last change, and, on others (like Windows), is the creation time for *path*. + last metadata change, and, on others (like Windows), is the creation time for *path*. The return value is a number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:03:06 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:03:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_some_PEP8_?= =?utf-8?q?in_curses_HOWTO=2E?= Message-ID: <3csy4B55n0zRLv@mail.python.org> http://hg.python.org/cpython/rev/7544dc630dc5 changeset: 86015:7544dc630dc5 branch: 2.7 parent: 86012:94c64a2cb09e user: Georg Brandl date: Sun Oct 06 10:02:07 2013 +0200 summary: Fix some PEP8 in curses HOWTO. files: Doc/howto/curses.rst | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -144,8 +144,8 @@ to redraw or clear them separately. The :func:`newwin` function creates a new window of a given size, returning the new window object. :: - begin_x = 20 ; begin_y = 7 - height = 5 ; width = 40 + begin_x = 20; begin_y = 7 + height = 5; width = 40 win = curses.newwin(height, width, begin_y, begin_x) A word about the coordinate system used in curses: coordinates are always passed @@ -184,11 +184,13 @@ # explained in the next section for y in range(0, 100): for x in range(0, 100): - try: pad.addch(y,x, ord('a') + (x*x+y*y) % 26 ) - except curses.error: pass + try: + pad.addch(y,x, ord('a') + (x*x+y*y) % 26) + except curses.error: + pass # Displays a section of the pad in the middle of the screen - pad.refresh( 0,0, 5,5, 20,75) + pad.refresh(0,0, 5,5, 20,75) The :func:`refresh` call displays a section of the pad in the rectangle extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper @@ -321,7 +323,7 @@ An example, which displays a line of text using color pair 1:: - stdscr.addstr( "Pretty text", curses.color_pair(1) ) + stdscr.addstr("Pretty text", curses.color_pair(1)) stdscr.refresh() As I said before, a color pair consists of a foreground and background color. @@ -343,7 +345,7 @@ will change to the new colors. You can also display new text in this color with:: - stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1) ) + stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1)) Very fancy terminals can change the definitions of the actual colors to a given RGB value. This lets you change color 1, which is usually red, to purple or @@ -381,9 +383,12 @@ while 1: c = stdscr.getch() - if c == ord('p'): PrintDocument() - elif c == ord('q'): break # Exit the while() - elif c == curses.KEY_HOME: x = y = 0 + if c == ord('p'): + PrintDocument() + elif c == ord('q'): + break # Exit the while() + elif c == curses.KEY_HOME: + x = y = 0 The :mod:`curses.ascii` module supplies ASCII class membership functions that take either integer or 1-character-string arguments; these may be useful in @@ -433,4 +438,3 @@ another demo. We can always use more of them! The ncurses FAQ: http://invisible-island.net/ncurses/ncurses.faq.html - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:04:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:04:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_curses_HOWTO?= =?utf-8?q?=3A_fix_some_PEP8_and_a_code_example_to_actually_raise_the_exce?= =?utf-8?q?ption?= Message-ID: <3csy5J0lK9zRLv@mail.python.org> http://hg.python.org/cpython/rev/6c38580488e2 changeset: 86016:6c38580488e2 branch: 3.3 parent: 86013:941d18e605f6 user: Georg Brandl date: Sun Oct 06 10:04:21 2013 +0200 summary: curses HOWTO: fix some PEP8 and a code example to actually raise the exception it promises. files: Doc/howto/curses.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -143,7 +143,7 @@ stdscr.clear() # This raises ZeroDivisionError when i == 10. - for i in range(0, 10): + for i in range(0, 11): v = i-10 stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v)) @@ -177,8 +177,8 @@ :func:`~curses.newwin` function creates a new window of a given size, returning the new window object. :: - begin_x = 20 ; begin_y = 7 - height = 5 ; width = 40 + begin_x = 20; begin_y = 7 + height = 5; width = 40 win = curses.newwin(height, width, begin_y, begin_x) Note that the coordinate system used in curses is unusual. @@ -227,7 +227,7 @@ # explained in the next section for y in range(0, 99): for x in range(0, 99): - pad.addch(y,x, ord('a') + (x*x+y*y) % 26 ) + pad.addch(y,x, ord('a') + (x*x+y*y) % 26) # Displays a section of the pad in the middle of the screen. # (0,0) : coordinate of upper-left corner of pad area to display. @@ -389,7 +389,7 @@ An example, which displays a line of text using color pair 1:: - stdscr.addstr( "Pretty text", curses.color_pair(1) ) + stdscr.addstr("Pretty text", curses.color_pair(1)) stdscr.refresh() As I said before, a color pair consists of a foreground and background color. @@ -412,7 +412,7 @@ will change to the new colors. You can also display new text in this color with:: - stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1) ) + stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1)) Very fancy terminals can change the definitions of the actual colors to a given RGB value. This lets you change color 1, which is usually red, to purple or -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:04:05 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:04:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csy5K2Wd9zSVp@mail.python.org> http://hg.python.org/cpython/rev/399e46611fce changeset: 86017:399e46611fce parent: 86014:befedd5c64c5 parent: 86016:6c38580488e2 user: Georg Brandl date: Sun Oct 06 10:04:49 2013 +0200 summary: merge with 3.3 files: Doc/howto/curses.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -143,7 +143,7 @@ stdscr.clear() # This raises ZeroDivisionError when i == 10. - for i in range(0, 10): + for i in range(0, 11): v = i-10 stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v)) @@ -177,8 +177,8 @@ :func:`~curses.newwin` function creates a new window of a given size, returning the new window object. :: - begin_x = 20 ; begin_y = 7 - height = 5 ; width = 40 + begin_x = 20; begin_y = 7 + height = 5; width = 40 win = curses.newwin(height, width, begin_y, begin_x) Note that the coordinate system used in curses is unusual. @@ -227,7 +227,7 @@ # explained in the next section for y in range(0, 99): for x in range(0, 99): - pad.addch(y,x, ord('a') + (x*x+y*y) % 26 ) + pad.addch(y,x, ord('a') + (x*x+y*y) % 26) # Displays a section of the pad in the middle of the screen. # (0,0) : coordinate of upper-left corner of pad area to display. @@ -389,7 +389,7 @@ An example, which displays a line of text using color pair 1:: - stdscr.addstr( "Pretty text", curses.color_pair(1) ) + stdscr.addstr("Pretty text", curses.color_pair(1)) stdscr.refresh() As I said before, a color pair consists of a foreground and background color. @@ -412,7 +412,7 @@ will change to the new colors. You can also display new text in this color with:: - stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1) ) + stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1)) Very fancy terminals can change the definitions of the actual colors to a given RGB value. This lets you change color 1, which is usually red, to purple or -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:11:02 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:11:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_small_copy?= =?utf-8?q?-paste_typo_in_ossaudiodev_setparameters=28=29_example_=28found?= =?utf-8?q?_by_Ken?= Message-ID: <3csyFL4pmCzSmf@mail.python.org> http://hg.python.org/cpython/rev/9cd4d650d08b changeset: 86018:9cd4d650d08b branch: 3.3 parent: 86016:6c38580488e2 user: Georg Brandl date: Sun Oct 06 10:11:12 2013 +0200 summary: Fix small copy-paste typo in ossaudiodev setparameters() example (found by Ken Housley on docs@). files: Doc/library/ossaudiodev.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -302,7 +302,7 @@ fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) - rate = dsp.rate(channels) + rate = dsp.rate(rate) .. method:: oss_audio_device.bufsize() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:11:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:11:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csyFM6ZRdz7LjM@mail.python.org> http://hg.python.org/cpython/rev/ff09a02ce029 changeset: 86019:ff09a02ce029 parent: 86017:399e46611fce parent: 86018:9cd4d650d08b user: Georg Brandl date: Sun Oct 06 10:11:48 2013 +0200 summary: merge with 3.3 files: Doc/library/ossaudiodev.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -302,7 +302,7 @@ fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) - rate = dsp.rate(channels) + rate = dsp.rate(rate) .. method:: oss_audio_device.bufsize() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:11:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:11:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_small_copy?= =?utf-8?q?-paste_typo_in_ossaudiodev_setparameters=28=29_example_=28found?= =?utf-8?q?_by_Ken?= Message-ID: <3csyFk2sFfzSsl@mail.python.org> http://hg.python.org/cpython/rev/ba99e6b0b4ba changeset: 86020:ba99e6b0b4ba branch: 2.7 parent: 86015:7544dc630dc5 user: Georg Brandl date: Sun Oct 06 10:11:12 2013 +0200 summary: Fix small copy-paste typo in ossaudiodev setparameters() example (found by Ken Housley on docs@). files: Doc/library/ossaudiodev.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -296,7 +296,7 @@ fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) - rate = dsp.rate(channels) + rate = dsp.rate(rate) .. method:: oss_audio_device.bufsize() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:22:11 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:22:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxODY0?= =?utf-8?q?6=3A_improve_lambda_docs_in_tutorial=2E__Original_patch_by_Terr?= =?utf-8?q?y_Reedy=2E?= Message-ID: <3csyVC5NdXzSwZ@mail.python.org> http://hg.python.org/cpython/rev/d4eb47c3d681 changeset: 86021:d4eb47c3d681 branch: 2.7 user: Georg Brandl date: Sun Oct 06 10:22:45 2013 +0200 summary: Closes #18646: improve lambda docs in tutorial. Original patch by Terry Reedy. files: Doc/tutorial/controlflow.rst | 27 +++++++++++++++-------- 1 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -541,17 +541,16 @@ .. _tut-lambda: -Lambda Forms ------------- +Lambda Expressions +------------------ -By popular demand, a few features commonly found in functional programming -languages like Lisp have been added to Python. With the :keyword:`lambda` -keyword, small anonymous functions can be created. Here's a function that -returns the sum of its two arguments: ``lambda a, b: a+b``. Lambda forms can be -used wherever function objects are required. They are syntactically restricted -to a single expression. Semantically, they are just syntactic sugar for a -normal function definition. Like nested function definitions, lambda forms can -reference variables from the containing scope:: +Small anonymous functions can be created with the :keyword:`lambda` keyword. +This function returns the sum of its two arguments: ``lambda a, b: a+b``. +Lambda forms can be used wherever function objects are required. They are +syntactically restricted to a single expression. Semantically, they are just +syntactic sugar for a normal function definition. Like nested function +definitions, lambda functions can reference variables from the containing +scope:: >>> def make_incrementor(n): ... return lambda x: x + n @@ -562,6 +561,14 @@ >>> f(1) 43 +The above example uses a lambda expression to return a function. Another use +is to pass a small function as an argument:: + + >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] + >>> pairs.sort(key=lambda pair: pair[1]) + >>> pairs + [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')] + .. _tut-docstrings: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:22:26 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:22:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxODY0?= =?utf-8?q?6=3A_improve_lambda_docs_in_tutorial=2E__Original_patch_by_Terr?= =?utf-8?q?y_Reedy=2E?= Message-ID: <3csyVV0qwzz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/ef1a17d5e263 changeset: 86022:ef1a17d5e263 branch: 3.3 parent: 86018:9cd4d650d08b user: Georg Brandl date: Sun Oct 06 10:22:45 2013 +0200 summary: Closes #18646: improve lambda docs in tutorial. Original patch by Terry Reedy. files: Doc/tutorial/controlflow.rst | 27 +++++++++++++++-------- 1 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -583,17 +583,16 @@ .. _tut-lambda: -Lambda Forms ------------- +Lambda Expressions +------------------ -By popular demand, a few features commonly found in functional programming -languages like Lisp have been added to Python. With the :keyword:`lambda` -keyword, small anonymous functions can be created. Here's a function that -returns the sum of its two arguments: ``lambda a, b: a+b``. Lambda forms can be -used wherever function objects are required. They are syntactically restricted -to a single expression. Semantically, they are just syntactic sugar for a -normal function definition. Like nested function definitions, lambda forms can -reference variables from the containing scope:: +Small anonymous functions can be created with the :keyword:`lambda` keyword. +This function returns the sum of its two arguments: ``lambda a, b: a+b``. +Lambda forms can be used wherever function objects are required. They are +syntactically restricted to a single expression. Semantically, they are just +syntactic sugar for a normal function definition. Like nested function +definitions, lambda functions can reference variables from the containing +scope:: >>> def make_incrementor(n): ... return lambda x: x + n @@ -604,6 +603,14 @@ >>> f(1) 43 +The above example uses a lambda expression to return a function. Another use +is to pass a small function as an argument:: + + >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] + >>> pairs.sort(key=lambda pair: pair[1]) + >>> pairs + [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')] + .. _tut-docstrings: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:22:27 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:22:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csyVW2Xlcz7LjT@mail.python.org> http://hg.python.org/cpython/rev/ab7b5ba360e9 changeset: 86023:ab7b5ba360e9 parent: 86019:ff09a02ce029 parent: 86022:ef1a17d5e263 user: Georg Brandl date: Sun Oct 06 10:22:54 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/controlflow.rst | 27 +++++++++++++++-------- 1 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -583,17 +583,16 @@ .. _tut-lambda: -Lambda Forms ------------- +Lambda Expressions +------------------ -By popular demand, a few features commonly found in functional programming -languages like Lisp have been added to Python. With the :keyword:`lambda` -keyword, small anonymous functions can be created. Here's a function that -returns the sum of its two arguments: ``lambda a, b: a+b``. Lambda forms can be -used wherever function objects are required. They are syntactically restricted -to a single expression. Semantically, they are just syntactic sugar for a -normal function definition. Like nested function definitions, lambda forms can -reference variables from the containing scope:: +Small anonymous functions can be created with the :keyword:`lambda` keyword. +This function returns the sum of its two arguments: ``lambda a, b: a+b``. +Lambda forms can be used wherever function objects are required. They are +syntactically restricted to a single expression. Semantically, they are just +syntactic sugar for a normal function definition. Like nested function +definitions, lambda functions can reference variables from the containing +scope:: >>> def make_incrementor(n): ... return lambda x: x + n @@ -604,6 +603,14 @@ >>> f(1) 43 +The above example uses a lambda expression to return a function. Another use +is to pass a small function as an argument:: + + >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] + >>> pairs.sort(key=lambda pair: pair[1]) + >>> pairs + [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')] + .. _tut-docstrings: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:28:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:28:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogVXNlICJsYW1iZGEg?= =?utf-8?q?expression=22_as_preferred_to_=22lambda_form=22=2E?= Message-ID: <3csyd04ZYbzSmf@mail.python.org> http://hg.python.org/cpython/rev/17a41be2bd13 changeset: 86024:17a41be2bd13 branch: 2.7 parent: 86021:d4eb47c3d681 user: Georg Brandl date: Sun Oct 06 10:26:58 2013 +0200 summary: Use "lambda expression" as preferred to "lambda form". files: Doc/faq/design.rst | 10 +++++----- Doc/reference/compound_stmts.rst | 8 ++++---- Doc/reference/expressions.rst | 13 ++++++------- Doc/tutorial/controlflow.rst | 2 +- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -372,20 +372,20 @@ which has a completely redesigned interpreter loop that avoids the C stack. -Why can't lambda forms contain statements? ------------------------------------------- +Why can't lambda expressions contain statements? +------------------------------------------------ -Python lambda forms cannot contain statements because Python's syntactic +Python lambda expressions cannot contain statements because Python's syntactic framework can't handle statements nested inside expressions. However, in Python, this is not a serious problem. Unlike lambda forms in other languages, where they add functionality, Python lambdas are only a shorthand notation if you're too lazy to define a function. Functions are already first class objects in Python, and can be declared in a -local scope. Therefore the only advantage of using a lambda form instead of a +local scope. Therefore the only advantage of using a lambda instead of a locally-defined function is that you don't need to invent a name for the function -- but that's just a local variable to which the function object (which -is exactly the same type of object that a lambda form yields) is assigned! +is exactly the same type of object that a lambda expression yields) is assigned! Can Python be compiled to machine code, C or some other language? diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -509,14 +509,14 @@ the form "``**identifier``" is present, it is initialized to a new dictionary receiving any excess keyword arguments, defaulting to a new empty dictionary. -.. index:: pair: lambda; form +.. index:: pair: lambda; expression It is also possible to create anonymous functions (functions not bound to a -name), for immediate use in expressions. This uses lambda forms, described in -section :ref:`lambda`. Note that the lambda form is merely a shorthand for a +name), for immediate use in expressions. This uses lambda expressions, described in +section :ref:`lambda`. Note that the lambda expression is merely a shorthand for a simplified function definition; a function defined in a ":keyword:`def`" statement can be passed around or assigned to another name just like a function -defined by a lambda form. The ":keyword:`def`" form is actually more powerful +defined by a lambda expression. The ":keyword:`def`" form is actually more powerful since it allows the execution of multiple statements. **Programmer's note:** Functions are first-class objects. A "``def``" form diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -184,7 +184,7 @@ list_comprehension: `expression` `list_for` list_for: "for" `target_list` "in" `old_expression_list` [`list_iter`] old_expression_list: `old_expression` [("," `old_expression`)+ [","]] - old_expression: `or_test` | `old_lambda_form` + old_expression: `or_test` | `old_lambda_expr` list_iter: `list_for` | `list_if` list_if: "if" `old_expression` [`list_iter`] @@ -1255,7 +1255,7 @@ .. productionlist:: conditional_expression: `or_test` ["if" `or_test` "else" `expression`] - expression: `conditional_expression` | `lambda_form` + expression: `conditional_expression` | `lambda_expr` Conditional expressions (sometimes called a "ternary operator") have the lowest priority of all Python operations. @@ -1275,14 +1275,13 @@ .. index:: pair: lambda; expression - pair: lambda; form pair: anonymous; function .. productionlist:: - lambda_form: "lambda" [`parameter_list`]: `expression` - old_lambda_form: "lambda" [`parameter_list`]: `old_expression` + lambda_expr: "lambda" [`parameter_list`]: `expression` + old_lambda_expr: "lambda" [`parameter_list`]: `old_expression` -Lambda forms (lambda expressions) have the same syntactic position as +Lambda expressions (sometimes called lambda forms) have the same syntactic position as expressions. They are a shorthand to create anonymous functions; the expression ``lambda arguments: expression`` yields a function object. The unnamed object behaves like a function object defined with :: @@ -1291,7 +1290,7 @@ return expression See section :ref:`function` for the syntax of parameter lists. Note that -functions created with lambda forms cannot contain statements. +functions created with lambda expressions cannot contain statements. .. _exprlists: diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -546,7 +546,7 @@ Small anonymous functions can be created with the :keyword:`lambda` keyword. This function returns the sum of its two arguments: ``lambda a, b: a+b``. -Lambda forms can be used wherever function objects are required. They are +Lambda functions can be used wherever function objects are required. They are syntactically restricted to a single expression. Semantically, they are just syntactic sugar for a normal function definition. Like nested function definitions, lambda functions can reference variables from the containing -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:45:50 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 6 Oct 2013 10:45:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318972=3A_Moderniz?= =?utf-8?q?e_email_examples_and_use_the_argparse_module_in_them=2E?= Message-ID: <3csz1V3bnxzQX4@mail.python.org> http://hg.python.org/cpython/rev/1b1b1d4b28e8 changeset: 86025:1b1b1d4b28e8 parent: 86023:ab7b5ba360e9 user: Serhiy Storchaka date: Sun Oct 06 11:45:25 2013 +0300 summary: Issue #18972: Modernize email examples and use the argparse module in them. files: Doc/includes/email-dir.py | 86 ++++++++++------------- Doc/includes/email-unpack.py | 47 ++++-------- Misc/NEWS | 5 + 3 files changed, 57 insertions(+), 81 deletions(-) diff --git a/Doc/includes/email-dir.py b/Doc/includes/email-dir.py --- a/Doc/includes/email-dir.py +++ b/Doc/includes/email-dir.py @@ -8,7 +8,7 @@ # For guessing MIME type based on file name extension import mimetypes -from optparse import OptionParser +from argparse import ArgumentParser from email import encoders from email.message import Message @@ -22,44 +22,36 @@ def main(): - parser = OptionParser(usage="""\ + parser = ArgumentParser(description="""\ Send the contents of a directory as a MIME message. - -Usage: %prog [options] - Unless the -o option is given, the email is sent by forwarding to your local SMTP server, which then does the normal delivery process. Your local machine must be running an SMTP server. """) - parser.add_option('-d', '--directory', - type='string', action='store', - help="""Mail the contents of the specified directory, - otherwise use the current directory. Only the regular - files in the directory are sent, and we don't recurse to - subdirectories.""") - parser.add_option('-o', '--output', - type='string', action='store', metavar='FILE', - help="""Print the composed message to FILE instead of - sending the message to the SMTP server.""") - parser.add_option('-s', '--sender', - type='string', action='store', metavar='SENDER', - help='The value of the From: header (required)') - parser.add_option('-r', '--recipient', - type='string', action='append', metavar='RECIPIENT', - default=[], dest='recipients', - help='A To: header value (at least one required)') - opts, args = parser.parse_args() - if not opts.sender or not opts.recipients: - parser.print_help() - sys.exit(1) - directory = opts.directory + parser.add_argument('-d', '--directory', + help="""Mail the contents of the specified directory, + otherwise use the current directory. Only the regular + files in the directory are sent, and we don't recurse to + subdirectories.""") + parser.add_argument('-o', '--output', + metavar='FILE', + help="""Print the composed message to FILE instead of + sending the message to the SMTP server.""") + parser.add_argument('-s', '--sender', required=True, + help='The value of the From: header (required)') + parser.add_argument('-r', '--recipient', required=True, + action='append', metavar='RECIPIENT', + default=[], dest='recipients', + help='A To: header value (at least one required)') + args = parser.parse_args() + directory = args.directory if not directory: directory = '.' # Create the enclosing (outer) message outer = MIMEMultipart() outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory) - outer['To'] = COMMASPACE.join(opts.recipients) - outer['From'] = opts.sender + outer['To'] = COMMASPACE.join(args.recipients) + outer['From'] = args.sender outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' for filename in os.listdir(directory): @@ -76,23 +68,19 @@ ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) if maintype == 'text': - fp = open(path) - # Note: we should handle calculating the charset - msg = MIMEText(fp.read(), _subtype=subtype) - fp.close() + with open(path) as fp: + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) elif maintype == 'image': - fp = open(path, 'rb') - msg = MIMEImage(fp.read(), _subtype=subtype) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEImage(fp.read(), _subtype=subtype) elif maintype == 'audio': - fp = open(path, 'rb') - msg = MIMEAudio(fp.read(), _subtype=subtype) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEAudio(fp.read(), _subtype=subtype) else: - fp = open(path, 'rb') - msg = MIMEBase(maintype, subtype) - msg.set_payload(fp.read()) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) # Encode the payload using Base64 encoders.encode_base64(msg) # Set the filename parameter @@ -100,14 +88,12 @@ outer.attach(msg) # Now send or store the message composed = outer.as_string() - if opts.output: - fp = open(opts.output, 'w') - fp.write(composed) - fp.close() + if args.output: + with open(args.output, 'w') as fp: + fp.write(composed) else: - s = smtplib.SMTP('localhost') - s.sendmail(opts.sender, opts.recipients, composed) - s.quit() + with smtplib.SMTP('localhost') as s: + s.sendmail(args.sender, args.recipients, composed) if __name__ == '__main__': diff --git a/Doc/includes/email-unpack.py b/Doc/includes/email-unpack.py --- a/Doc/includes/email-unpack.py +++ b/Doc/includes/email-unpack.py @@ -8,41 +8,27 @@ import errno import mimetypes -from optparse import OptionParser +from argparse import ArgumentParser def main(): - parser = OptionParser(usage="""\ + parser = ArgumentParser(description="""\ Unpack a MIME message into a directory of files. +""") + parser.add_argument('-d', '--directory', required=True, + help="""Unpack the MIME message into the named + directory, which will be created if it doesn't already + exist.""") + parser.add_argument('msgfile') + args = parser.parse_args() -Usage: %prog [options] msgfile -""") - parser.add_option('-d', '--directory', - type='string', action='store', - help="""Unpack the MIME message into the named - directory, which will be created if it doesn't already - exist.""") - opts, args = parser.parse_args() - if not opts.directory: - parser.print_help() - sys.exit(1) + with open(args.msgfile) as fp: + msg = email.message_from_file(fp) try: - msgfile = args[0] - except IndexError: - parser.print_help() - sys.exit(1) - - try: - os.mkdir(opts.directory) - except OSError as e: - # Ignore directory exists error - if e.errno != errno.EEXIST: - raise - - fp = open(msgfile) - msg = email.message_from_file(fp) - fp.close() + os.mkdir(args.directory) + except FileExistsError: + pass counter = 1 for part in msg.walk(): @@ -59,9 +45,8 @@ ext = '.bin' filename = 'part-%03d%s' % (counter, ext) counter += 1 - fp = open(os.path.join(opts.directory, filename), 'wb') - fp.write(part.get_payload(decode=True)) - fp.close() + with open(os.path.join(args.directory, filename), 'wb') as fp: + fp.write(part.get_payload(decode=True)) if __name__ == '__main__': diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,6 +60,11 @@ - Issue #4366: Fix building extensions on all platforms when --enable-shared is used. +Documentation +------------- + +- Issue #18972: Modernize email examples and use the argparse module in them. + Build ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:47:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:47:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogVXNlICJsYW1iZGEg?= =?utf-8?q?expression=22_as_preferred_to_=22lambda_form=22=2E?= Message-ID: <3csz3f0VbzzSby@mail.python.org> http://hg.python.org/cpython/rev/b370cd67a677 changeset: 86026:b370cd67a677 branch: 3.3 parent: 86022:ef1a17d5e263 user: Georg Brandl date: Sun Oct 06 10:28:39 2013 +0200 summary: Use "lambda expression" as preferred to "lambda form". files: Doc/faq/design.rst | 10 +++++----- Doc/reference/compound_stmts.rst | 10 +++++----- Doc/reference/expressions.rst | 13 +++++++------ Doc/tutorial/controlflow.rst | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -347,20 +347,20 @@ which has a completely redesigned interpreter loop that avoids the C stack. -Why can't lambda forms contain statements? ------------------------------------------- +Why can't lambda expressions contain statements? +------------------------------------------------ -Python lambda forms cannot contain statements because Python's syntactic +Python lambda expressions cannot contain statements because Python's syntactic framework can't handle statements nested inside expressions. However, in Python, this is not a serious problem. Unlike lambda forms in other languages, where they add functionality, Python lambdas are only a shorthand notation if you're too lazy to define a function. Functions are already first class objects in Python, and can be declared in a -local scope. Therefore the only advantage of using a lambda form instead of a +local scope. Therefore the only advantage of using a lambda instead of a locally-defined function is that you don't need to invent a name for the function -- but that's just a local variable to which the function object (which -is exactly the same type of object that a lambda form yields) is assigned! +is exactly the same type of object that a lambda expression yields) is assigned! Can Python be compiled to machine code, C or some other language? diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -535,17 +535,17 @@ by the parameters' names in the :attr:`__annotations__` attribute of the function object. -.. index:: pair: lambda; form +.. index:: pair: lambda; expression It is also possible to create anonymous functions (functions not bound to a -name), for immediate use in expressions. This uses lambda forms, described in -section :ref:`lambda`. Note that the lambda form is merely a shorthand for a +name), for immediate use in expressions. This uses lambda expressions, described in +section :ref:`lambda`. Note that the lambda expression is merely a shorthand for a simplified function definition; a function defined in a ":keyword:`def`" statement can be passed around or assigned to another name just like a function -defined by a lambda form. The ":keyword:`def`" form is actually more powerful +defined by a lambda expression. The ":keyword:`def`" form is actually more powerful since it allows the execution of multiple statements and annotations. -**Programmer's note:** Functions are first-class objects. A "``def``" form +**Programmer's note:** Functions are first-class objects. A "``def``" statement executed inside a function definition defines a local function that can be returned or passed around. Free variables used in the nested function can access the local variables of the function containing the def. See section diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1218,8 +1218,8 @@ .. productionlist:: conditional_expression: `or_test` ["if" `or_test` "else" `expression`] - expression: `conditional_expression` | `lambda_form` - expression_nocond: `or_test` | `lambda_form_nocond` + expression: `conditional_expression` | `lambda_expr` + expression_nocond: `or_test` | `lambda_expr_nocond` Conditional expressions (sometimes called a "ternary operator") have the lowest priority of all Python operations. @@ -1243,10 +1243,10 @@ pair: anonymous; function .. productionlist:: - lambda_form: "lambda" [`parameter_list`]: `expression` - lambda_form_nocond: "lambda" [`parameter_list`]: `expression_nocond` + lambda_expr: "lambda" [`parameter_list`]: `expression` + lambda_expr_nocond: "lambda" [`parameter_list`]: `expression_nocond` -Lambda forms (lambda expressions) have the same syntactic position as +Lambda expressions (sometimes called lambda forms) have the same syntactic position as expressions. They are a shorthand to create anonymous functions; the expression ``lambda arguments: expression`` yields a function object. The unnamed object behaves like a function object defined with :: @@ -1255,7 +1255,8 @@ return expression See section :ref:`function` for the syntax of parameter lists. Note that -functions created with lambda forms cannot contain statements or annotations. +functions created with lambda expressions cannot contain statements or +annotations. .. _exprlists: diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -588,7 +588,7 @@ Small anonymous functions can be created with the :keyword:`lambda` keyword. This function returns the sum of its two arguments: ``lambda a, b: a+b``. -Lambda forms can be used wherever function objects are required. They are +Lambda functions can be used wherever function objects are required. They are syntactically restricted to a single expression. Semantically, they are just syntactic sugar for a normal function definition. Like nested function definitions, lambda functions can reference variables from the containing -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:47:43 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:47:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csz3g3V3Mz7LjS@mail.python.org> http://hg.python.org/cpython/rev/ae4ef03b0133 changeset: 86027:ae4ef03b0133 parent: 86023:ab7b5ba360e9 parent: 86026:b370cd67a677 user: Georg Brandl date: Sun Oct 06 10:28:48 2013 +0200 summary: merge with 3.3 files: Doc/faq/design.rst | 10 +++++----- Doc/reference/compound_stmts.rst | 10 +++++----- Doc/reference/expressions.rst | 13 +++++++------ Doc/tutorial/controlflow.rst | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -347,20 +347,20 @@ which has a completely redesigned interpreter loop that avoids the C stack. -Why can't lambda forms contain statements? ------------------------------------------- +Why can't lambda expressions contain statements? +------------------------------------------------ -Python lambda forms cannot contain statements because Python's syntactic +Python lambda expressions cannot contain statements because Python's syntactic framework can't handle statements nested inside expressions. However, in Python, this is not a serious problem. Unlike lambda forms in other languages, where they add functionality, Python lambdas are only a shorthand notation if you're too lazy to define a function. Functions are already first class objects in Python, and can be declared in a -local scope. Therefore the only advantage of using a lambda form instead of a +local scope. Therefore the only advantage of using a lambda instead of a locally-defined function is that you don't need to invent a name for the function -- but that's just a local variable to which the function object (which -is exactly the same type of object that a lambda form yields) is assigned! +is exactly the same type of object that a lambda expression yields) is assigned! Can Python be compiled to machine code, C or some other language? diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -536,17 +536,17 @@ by the parameters' names in the :attr:`__annotations__` attribute of the function object. -.. index:: pair: lambda; form +.. index:: pair: lambda; expression It is also possible to create anonymous functions (functions not bound to a -name), for immediate use in expressions. This uses lambda forms, described in -section :ref:`lambda`. Note that the lambda form is merely a shorthand for a +name), for immediate use in expressions. This uses lambda expressions, described in +section :ref:`lambda`. Note that the lambda expression is merely a shorthand for a simplified function definition; a function defined in a ":keyword:`def`" statement can be passed around or assigned to another name just like a function -defined by a lambda form. The ":keyword:`def`" form is actually more powerful +defined by a lambda expression. The ":keyword:`def`" form is actually more powerful since it allows the execution of multiple statements and annotations. -**Programmer's note:** Functions are first-class objects. A "``def``" form +**Programmer's note:** Functions are first-class objects. A "``def``" statement executed inside a function definition defines a local function that can be returned or passed around. Free variables used in the nested function can access the local variables of the function containing the def. See section diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1218,8 +1218,8 @@ .. productionlist:: conditional_expression: `or_test` ["if" `or_test` "else" `expression`] - expression: `conditional_expression` | `lambda_form` - expression_nocond: `or_test` | `lambda_form_nocond` + expression: `conditional_expression` | `lambda_expr` + expression_nocond: `or_test` | `lambda_expr_nocond` Conditional expressions (sometimes called a "ternary operator") have the lowest priority of all Python operations. @@ -1243,10 +1243,10 @@ pair: anonymous; function .. productionlist:: - lambda_form: "lambda" [`parameter_list`]: `expression` - lambda_form_nocond: "lambda" [`parameter_list`]: `expression_nocond` + lambda_expr: "lambda" [`parameter_list`]: `expression` + lambda_expr_nocond: "lambda" [`parameter_list`]: `expression_nocond` -Lambda forms (lambda expressions) have the same syntactic position as +Lambda expressions (sometimes called lambda forms) have the same syntactic position as expressions. They are a shorthand to create anonymous functions; the expression ``lambda arguments: expression`` yields a function object. The unnamed object behaves like a function object defined with :: @@ -1255,7 +1255,8 @@ return expression See section :ref:`function` for the syntax of parameter lists. Note that -functions created with lambda forms cannot contain statements or annotations. +functions created with lambda expressions cannot contain statements or +annotations. .. _exprlists: diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -588,7 +588,7 @@ Small anonymous functions can be created with the :keyword:`lambda` keyword. This function returns the sum of its two arguments: ``lambda a, b: a+b``. -Lambda forms can be used wherever function objects are required. They are +Lambda functions can be used wherever function objects are required. They are syntactically restricted to a single expression. Semantically, they are just syntactic sugar for a normal function definition. Like nested function definitions, lambda functions can reference variables from the containing -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:47:44 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:47:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge_heads?= Message-ID: <3csz3h6Nhbz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/73c5e432a311 changeset: 86028:73c5e432a311 parent: 86027:ae4ef03b0133 parent: 86025:1b1b1d4b28e8 user: Georg Brandl date: Sun Oct 06 10:48:28 2013 +0200 summary: merge heads files: Doc/includes/email-dir.py | 86 ++++++++++------------- Doc/includes/email-unpack.py | 47 ++++-------- Misc/NEWS | 5 + 3 files changed, 57 insertions(+), 81 deletions(-) diff --git a/Doc/includes/email-dir.py b/Doc/includes/email-dir.py --- a/Doc/includes/email-dir.py +++ b/Doc/includes/email-dir.py @@ -8,7 +8,7 @@ # For guessing MIME type based on file name extension import mimetypes -from optparse import OptionParser +from argparse import ArgumentParser from email import encoders from email.message import Message @@ -22,44 +22,36 @@ def main(): - parser = OptionParser(usage="""\ + parser = ArgumentParser(description="""\ Send the contents of a directory as a MIME message. - -Usage: %prog [options] - Unless the -o option is given, the email is sent by forwarding to your local SMTP server, which then does the normal delivery process. Your local machine must be running an SMTP server. """) - parser.add_option('-d', '--directory', - type='string', action='store', - help="""Mail the contents of the specified directory, - otherwise use the current directory. Only the regular - files in the directory are sent, and we don't recurse to - subdirectories.""") - parser.add_option('-o', '--output', - type='string', action='store', metavar='FILE', - help="""Print the composed message to FILE instead of - sending the message to the SMTP server.""") - parser.add_option('-s', '--sender', - type='string', action='store', metavar='SENDER', - help='The value of the From: header (required)') - parser.add_option('-r', '--recipient', - type='string', action='append', metavar='RECIPIENT', - default=[], dest='recipients', - help='A To: header value (at least one required)') - opts, args = parser.parse_args() - if not opts.sender or not opts.recipients: - parser.print_help() - sys.exit(1) - directory = opts.directory + parser.add_argument('-d', '--directory', + help="""Mail the contents of the specified directory, + otherwise use the current directory. Only the regular + files in the directory are sent, and we don't recurse to + subdirectories.""") + parser.add_argument('-o', '--output', + metavar='FILE', + help="""Print the composed message to FILE instead of + sending the message to the SMTP server.""") + parser.add_argument('-s', '--sender', required=True, + help='The value of the From: header (required)') + parser.add_argument('-r', '--recipient', required=True, + action='append', metavar='RECIPIENT', + default=[], dest='recipients', + help='A To: header value (at least one required)') + args = parser.parse_args() + directory = args.directory if not directory: directory = '.' # Create the enclosing (outer) message outer = MIMEMultipart() outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory) - outer['To'] = COMMASPACE.join(opts.recipients) - outer['From'] = opts.sender + outer['To'] = COMMASPACE.join(args.recipients) + outer['From'] = args.sender outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' for filename in os.listdir(directory): @@ -76,23 +68,19 @@ ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) if maintype == 'text': - fp = open(path) - # Note: we should handle calculating the charset - msg = MIMEText(fp.read(), _subtype=subtype) - fp.close() + with open(path) as fp: + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) elif maintype == 'image': - fp = open(path, 'rb') - msg = MIMEImage(fp.read(), _subtype=subtype) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEImage(fp.read(), _subtype=subtype) elif maintype == 'audio': - fp = open(path, 'rb') - msg = MIMEAudio(fp.read(), _subtype=subtype) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEAudio(fp.read(), _subtype=subtype) else: - fp = open(path, 'rb') - msg = MIMEBase(maintype, subtype) - msg.set_payload(fp.read()) - fp.close() + with open(path, 'rb') as fp: + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) # Encode the payload using Base64 encoders.encode_base64(msg) # Set the filename parameter @@ -100,14 +88,12 @@ outer.attach(msg) # Now send or store the message composed = outer.as_string() - if opts.output: - fp = open(opts.output, 'w') - fp.write(composed) - fp.close() + if args.output: + with open(args.output, 'w') as fp: + fp.write(composed) else: - s = smtplib.SMTP('localhost') - s.sendmail(opts.sender, opts.recipients, composed) - s.quit() + with smtplib.SMTP('localhost') as s: + s.sendmail(args.sender, args.recipients, composed) if __name__ == '__main__': diff --git a/Doc/includes/email-unpack.py b/Doc/includes/email-unpack.py --- a/Doc/includes/email-unpack.py +++ b/Doc/includes/email-unpack.py @@ -8,41 +8,27 @@ import errno import mimetypes -from optparse import OptionParser +from argparse import ArgumentParser def main(): - parser = OptionParser(usage="""\ + parser = ArgumentParser(description="""\ Unpack a MIME message into a directory of files. +""") + parser.add_argument('-d', '--directory', required=True, + help="""Unpack the MIME message into the named + directory, which will be created if it doesn't already + exist.""") + parser.add_argument('msgfile') + args = parser.parse_args() -Usage: %prog [options] msgfile -""") - parser.add_option('-d', '--directory', - type='string', action='store', - help="""Unpack the MIME message into the named - directory, which will be created if it doesn't already - exist.""") - opts, args = parser.parse_args() - if not opts.directory: - parser.print_help() - sys.exit(1) + with open(args.msgfile) as fp: + msg = email.message_from_file(fp) try: - msgfile = args[0] - except IndexError: - parser.print_help() - sys.exit(1) - - try: - os.mkdir(opts.directory) - except OSError as e: - # Ignore directory exists error - if e.errno != errno.EEXIST: - raise - - fp = open(msgfile) - msg = email.message_from_file(fp) - fp.close() + os.mkdir(args.directory) + except FileExistsError: + pass counter = 1 for part in msg.walk(): @@ -59,9 +45,8 @@ ext = '.bin' filename = 'part-%03d%s' % (counter, ext) counter += 1 - fp = open(os.path.join(opts.directory, filename), 'wb') - fp.write(part.get_payload(decode=True)) - fp.close() + with open(os.path.join(args.directory, filename), 'wb') as fp: + fp.write(part.get_payload(decode=True)) if __name__ == '__main__': diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,6 +60,11 @@ - Issue #4366: Fix building extensions on all platforms when --enable-shared is used. +Documentation +------------- + +- Issue #18972: Modernize email examples and use the argparse module in them. + Build ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:48:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:48:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxODky?= =?utf-8?q?7=3A_Lock=2Eacquire_only_accepts_-1_or_positive_values_for_time?= =?utf-8?q?out=2E?= Message-ID: <3csz435QCBz7LjS@mail.python.org> http://hg.python.org/cpython/rev/ff5fb419967f changeset: 86029:ff5fb419967f branch: 3.3 parent: 86026:b370cd67a677 user: Georg Brandl date: Sun Oct 06 10:48:08 2013 +0200 summary: Closes #18927: Lock.acquire only accepts -1 or positive values for timeout. files: Doc/library/threading.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -378,7 +378,7 @@ When invoked with the floating-point *timeout* argument set to a positive value, block for at most the number of seconds specified by *timeout* - and as long as the lock cannot be acquired. A negative *timeout* argument + and as long as the lock cannot be acquired. A *timeout* argument of ``-1`` specifies an unbounded wait. It is forbidden to specify a *timeout* when *blocking* is false. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:48:05 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:48:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csz45041Cz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/34a75e23a0d2 changeset: 86030:34a75e23a0d2 parent: 86028:73c5e432a311 parent: 86029:ff5fb419967f user: Georg Brandl date: Sun Oct 06 10:48:48 2013 +0200 summary: merge with 3.3 files: Doc/library/threading.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -387,7 +387,7 @@ When invoked with the floating-point *timeout* argument set to a positive value, block for at most the number of seconds specified by *timeout* - and as long as the lock cannot be acquired. A negative *timeout* argument + and as long as the lock cannot be acquired. A *timeout* argument of ``-1`` specifies an unbounded wait. It is forbidden to specify a *timeout* when *blocking* is false. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:50:23 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:50:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzk1?= =?utf-8?q?1=3A_Add_a_=22faulthandler=22_reference_in_the_ctypes_docs_talk?= =?utf-8?q?ing_about?= Message-ID: <3csz6l2N8dz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/1e163fdf8cf3 changeset: 86031:1e163fdf8cf3 branch: 3.3 parent: 86029:ff5fb419967f user: Georg Brandl date: Sun Oct 06 10:51:01 2013 +0200 summary: Closes #13951: Add a "faulthandler" reference in the ctypes docs talking about crashes. files: Doc/library/ctypes.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -198,7 +198,9 @@ >>> There are, however, enough ways to crash Python with :mod:`ctypes`, so you -should be careful anyway. +should be careful anyway. The :mod:`faulthandler` module can be helpful in +debugging crashes (e.g. from segmentation faults produced by erroneous C library +calls). ``None``, integers, bytes objects and (unicode) strings are the only native Python objects that can directly be used as parameters in these function calls. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 10:50:24 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 10:50:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3csz6m45hlz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/7d94034e1ddc changeset: 86032:7d94034e1ddc parent: 86030:34a75e23a0d2 parent: 86031:1e163fdf8cf3 user: Georg Brandl date: Sun Oct 06 10:51:07 2013 +0200 summary: merge with 3.3 files: Doc/library/ctypes.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -198,7 +198,9 @@ >>> There are, however, enough ways to crash Python with :mod:`ctypes`, so you -should be careful anyway. +should be careful anyway. The :mod:`faulthandler` module can be helpful in +debugging crashes (e.g. from segmentation faults produced by erroneous C library +calls). ``None``, integers, bytes objects and (unicode) strings are the only native Python objects that can directly be used as parameters in these function calls. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:02:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:02:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Small_clarific?= =?utf-8?q?ation_in_extending_docs=2E?= Message-ID: <3cszN9438bzSTV@mail.python.org> http://hg.python.org/cpython/rev/185f08083b80 changeset: 86033:185f08083b80 branch: 3.3 parent: 86031:1e163fdf8cf3 user: Georg Brandl date: Sun Oct 06 11:02:38 2013 +0200 summary: Small clarification in extending docs. files: Doc/extending/extending.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -515,7 +515,7 @@ value of the Python function. :c:func:`PyObject_CallObject` is "reference-count-neutral" with respect to its arguments. In the example a new tuple was created to serve as the argument list, which is :c:func:`Py_DECREF`\ --ed immediately after the call. +-ed immediately after the :c:func:`PyObject_CallObject` call. The return value of :c:func:`PyObject_CallObject` is "new": either it is a brand new object, or it is an existing object whose reference count has been -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:02:02 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:02:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cszNB5wpfzSTV@mail.python.org> http://hg.python.org/cpython/rev/a9564e4acf97 changeset: 86034:a9564e4acf97 parent: 86032:7d94034e1ddc parent: 86033:185f08083b80 user: Georg Brandl date: Sun Oct 06 11:02:46 2013 +0200 summary: merge with 3.3 files: Doc/extending/extending.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -515,7 +515,7 @@ value of the Python function. :c:func:`PyObject_CallObject` is "reference-count-neutral" with respect to its arguments. In the example a new tuple was created to serve as the argument list, which is :c:func:`Py_DECREF`\ --ed immediately after the call. +-ed immediately after the :c:func:`PyObject_CallObject` call. The return value of :c:func:`PyObject_CallObject` is "new": either it is a brand new object, or it is an existing object whose reference count has been -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:02:15 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:02:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Small_clarific?= =?utf-8?q?ation_in_extending_docs=2E?= Message-ID: <3cszNR5dfNzSVJ@mail.python.org> http://hg.python.org/cpython/rev/c2e535ee2733 changeset: 86035:c2e535ee2733 branch: 2.7 parent: 86024:17a41be2bd13 user: Georg Brandl date: Sun Oct 06 11:02:38 2013 +0200 summary: Small clarification in extending docs. files: Doc/extending/extending.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -510,7 +510,7 @@ value of the Python function. :c:func:`PyObject_CallObject` is "reference-count-neutral" with respect to its arguments. In the example a new tuple was created to serve as the argument list, which is :c:func:`Py_DECREF`\ --ed immediately after the call. +-ed immediately after the :c:func:`PyObject_CallObject` call. The return value of :c:func:`PyObject_CallObject` is "new": either it is a brand new object, or it is an existing object whose reference count has been -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:08:11 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:08:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_wrong_Pyth?= =?utf-8?q?on_highlighting_in_directory_hierarchy_code_block=2E?= Message-ID: <3cszWH70gZzSTV@mail.python.org> http://hg.python.org/cpython/rev/2e1c39456219 changeset: 86036:2e1c39456219 branch: 2.7 user: Georg Brandl date: Sun Oct 06 11:08:24 2013 +0200 summary: Fix wrong Python highlighting in directory hierarchy code block. files: Doc/tutorial/modules.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -368,7 +368,9 @@ (such as mixing, adding echo, applying an equalizer function, creating an artificial stereo effect), so in addition you will be writing a never-ending stream of modules to perform these operations. Here's a possible structure for -your package (expressed in terms of a hierarchical filesystem):: +your package (expressed in terms of a hierarchical filesystem): + +.. code-block:: text sound/ Top-level package __init__.py Initialize the sound package -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:08:13 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:08:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_merging_mi?= =?utf-8?q?stake=3A_wrong_Python_version=2E?= Message-ID: <3cszWK1WPrzSTV@mail.python.org> http://hg.python.org/cpython/rev/9225325e8e1d changeset: 86037:9225325e8e1d branch: 2.7 user: Georg Brandl date: Sun Oct 06 11:08:57 2013 +0200 summary: Fix merging mistake: wrong Python version. files: Doc/tutorial/interpreter.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -252,7 +252,7 @@ >>> import site >>> site.getusersitepackages() - '/home/user/.local/lib/python3.2/site-packages' + '/home/user/.local/lib/python2.7/site-packages' Now you can create a file named :file:`usercustomize.py` in that directory and put anything you want in it. It will affect every invocation of Python, unless -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:08:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:08:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_wrong_Pyth?= =?utf-8?q?on_highlighting_in_directory_hierarchy_code_block=2E?= Message-ID: <3cszWV5ZqczSVJ@mail.python.org> http://hg.python.org/cpython/rev/6684cf7a9aaf changeset: 86038:6684cf7a9aaf branch: 3.3 parent: 86033:185f08083b80 user: Georg Brandl date: Sun Oct 06 11:08:24 2013 +0200 summary: Fix wrong Python highlighting in directory hierarchy code block. files: Doc/tutorial/modules.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -379,7 +379,9 @@ (such as mixing, adding echo, applying an equalizer function, creating an artificial stereo effect), so in addition you will be writing a never-ending stream of modules to perform these operations. Here's a possible structure for -your package (expressed in terms of a hierarchical filesystem):: +your package (expressed in terms of a hierarchical filesystem): + +.. code-block:: text sound/ Top-level package __init__.py Initialize the sound package -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:08:24 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:08:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cszWX0G5lzSsl@mail.python.org> http://hg.python.org/cpython/rev/d2db02bc8ea5 changeset: 86039:d2db02bc8ea5 parent: 86034:a9564e4acf97 parent: 86038:6684cf7a9aaf user: Georg Brandl date: Sun Oct 06 11:09:02 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/modules.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -378,7 +378,9 @@ (such as mixing, adding echo, applying an equalizer function, creating an artificial stereo effect), so in addition you will be writing a never-ending stream of modules to perform these operations. Here's a possible structure for -your package (expressed in terms of a hierarchical filesystem):: +your package (expressed in terms of a hierarchical filesystem): + +.. code-block:: text sound/ Top-level package __init__.py Initialize the sound package -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:10:50 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:10:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_deprecated?= =?utf-8?q?_link_to_Python_Testing_Tools_Taxonomy=2E__Reported_by_Daniel?= Message-ID: <3cszZL1Xz3zSTV@mail.python.org> http://hg.python.org/cpython/rev/9f3bc3346652 changeset: 86040:9f3bc3346652 branch: 2.7 parent: 86037:9225325e8e1d user: Georg Brandl date: Sun Oct 06 11:10:49 2013 +0200 summary: Fix deprecated link to Python Testing Tools Taxonomy. Reported by Daniel Greenfeld on docs at . files: Doc/library/unittest.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -91,7 +91,7 @@ Third-party unittest frameworks with a lighter-weight syntax for writing tests. For example, ``assert func(10) == 42``. - `The Python Testing Tools Taxonomy `_ + `The Python Testing Tools Taxonomy `_ An extensive list of Python testing tools including functional testing frameworks and mock object libraries. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:11:55 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:11:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_missing_pe?= =?utf-8?q?riod=2E?= Message-ID: <3cszbb34s3z7Ljr@mail.python.org> http://hg.python.org/cpython/rev/6c8a5d5d63b0 changeset: 86041:6c8a5d5d63b0 branch: 2.7 user: Georg Brandl date: Sun Oct 06 11:12:29 2013 +0200 summary: Fix missing period. files: Doc/distutils/apiref.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -729,7 +729,7 @@ .. method:: CCompiler.execute(func, args[, msg=None, level=1]) - Invokes :func:`distutils.util.execute` This method invokes a Python function + Invokes :func:`distutils.util.execute`. This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account the *dry_run* flag. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:12:17 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:12:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_missing_pe?= =?utf-8?q?riod=2E?= Message-ID: <3cszc1644lz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/28e765249686 changeset: 86042:28e765249686 branch: 3.3 parent: 86038:6684cf7a9aaf user: Georg Brandl date: Sun Oct 06 11:12:29 2013 +0200 summary: Fix missing period. files: Doc/distutils/apiref.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -734,7 +734,7 @@ .. method:: CCompiler.execute(func, args[, msg=None, level=1]) - Invokes :func:`distutils.util.execute` This method invokes a Python function + Invokes :func:`distutils.util.execute`. This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account the *dry_run* flag. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:12:19 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:12:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cszc30hdCz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/8f8bdd6166cd changeset: 86043:8f8bdd6166cd parent: 86039:d2db02bc8ea5 parent: 86042:28e765249686 user: Georg Brandl date: Sun Oct 06 11:12:39 2013 +0200 summary: merge with 3.3 files: Doc/distutils/apiref.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -734,7 +734,7 @@ .. method:: CCompiler.execute(func, args[, msg=None, level=1]) - Invokes :func:`distutils.util.execute` This method invokes a Python function + Invokes :func:`distutils.util.execute`. This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account the *dry_run* flag. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:24:07 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:24:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Clarify_sectio?= =?utf-8?q?n_about_source_code_encoding=2E?= Message-ID: <3cszsg4plMzSVJ@mail.python.org> http://hg.python.org/cpython/rev/2dca60117aa2 changeset: 86044:2dca60117aa2 branch: 2.7 parent: 86041:6c8a5d5d63b0 user: Georg Brandl date: Sun Oct 06 11:24:48 2013 +0200 summary: Clarify section about source code encoding. files: Doc/tutorial/interpreter.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -185,8 +185,8 @@ For example, to write Unicode literals including the Euro currency symbol, the ISO-8859-15 encoding can be used, with the Euro symbol having the ordinal value -164. This script will print the value 8364 (the Unicode codepoint corresponding -to the Euro symbol) and then exit:: +164. This script, when saved in the ISO-8859-15 encoding, will print the value +8364 (the Unicode codepoint corresponding to the Euro symbol) and then exit:: # -*- coding: iso-8859-15 -*- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:41:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:41:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Small_logical_?= =?utf-8?q?fix_in_filter=28=29_example_description=2E?= Message-ID: <3ct0FD2bxSz7LjM@mail.python.org> http://hg.python.org/cpython/rev/c2e4ab7ed26e changeset: 86045:c2e4ab7ed26e branch: 2.7 user: Georg Brandl date: Sun Oct 06 11:41:36 2013 +0200 summary: Small logical fix in filter() example description. files: Doc/tutorial/datastructures.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -171,7 +171,7 @@ the sequence for which ``function(item)`` is true. If *sequence* is a :class:`string` or :class:`tuple`, the result will be of the same type; otherwise, it is always a :class:`list`. For example, to compute a sequence of -numbers not divisible by 2 and 3:: +numbers not divisible by 2 or 3:: >>> def f(x): return x % 2 != 0 and x % 3 != 0 ... -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:56:39 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:56:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_small_gram?= =?utf-8?q?mar_mistake=2E?= Message-ID: <3ct0bC3MSkzRfZ@mail.python.org> http://hg.python.org/cpython/rev/19e116f9eb9b changeset: 86046:19e116f9eb9b branch: 2.7 user: Georg Brandl date: Sun Oct 06 11:57:13 2013 +0200 summary: Fix small grammar mistake. files: Doc/glossary.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -664,7 +664,7 @@ statement A statement is part of a suite (a "block" of code). A statement is either - an :term:`expression` or a one of several constructs with a keyword, such + an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. struct sequence -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:57:41 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:57:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_small_gram?= =?utf-8?q?mar_mistake=2E?= Message-ID: <3ct0cP5BDmzRfZ@mail.python.org> http://hg.python.org/cpython/rev/f19e9f110523 changeset: 86047:f19e9f110523 branch: 3.3 parent: 86042:28e765249686 user: Georg Brandl date: Sun Oct 06 11:57:13 2013 +0200 summary: Fix small grammar mistake. files: Doc/glossary.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -759,7 +759,7 @@ statement A statement is part of a suite (a "block" of code). A statement is either - an :term:`expression` or a one of several constructs with a keyword, such + an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. struct sequence -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 11:57:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 11:57:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct0cQ6xdJz7LjR@mail.python.org> http://hg.python.org/cpython/rev/e8616dd3be64 changeset: 86048:e8616dd3be64 parent: 86043:8f8bdd6166cd parent: 86047:f19e9f110523 user: Georg Brandl date: Sun Oct 06 11:57:23 2013 +0200 summary: merge with 3.3 files: Doc/glossary.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -772,7 +772,7 @@ statement A statement is part of a suite (a "block" of code). A statement is either - an :term:`expression` or a one of several constructs with a keyword, such + an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. struct sequence -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:08:15 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:08:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNTk1?= =?utf-8?q?6=3A_improve_documentation_of_named_groups_and_how_to_reference?= =?utf-8?q?_them=2E?= Message-ID: <3ct0rb75XDzRNt@mail.python.org> http://hg.python.org/cpython/rev/bee2736296c5 changeset: 86049:bee2736296c5 branch: 2.7 parent: 86046:19e116f9eb9b user: Georg Brandl date: Sun Oct 06 12:08:14 2013 +0200 summary: Closes #15956: improve documentation of named groups and how to reference them. files: Doc/library/re.rst | 41 ++++++++++++++++++++++----------- 1 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -237,21 +237,32 @@ ``(?P...)`` Similar to regular parentheses, but the substring matched by the group is - accessible within the rest of the regular expression via the symbolic group - name *name*. Group names must be valid Python identifiers, and each group - name must be defined only once within a regular expression. A symbolic group - is also a numbered group, just as if the group were not named. So the group - named ``id`` in the example below can also be referenced as the numbered group - ``1``. + accessible via the symbolic group name *name*. Group names must be valid + Python identifiers, and each group name must be defined only once within a + regular expression. A symbolic group is also a numbered group, just as if + the group were not named. - For example, if the pattern is ``(?P[a-zA-Z_]\w*)``, the group can be - referenced by its name in arguments to methods of match objects, such as - ``m.group('id')`` or ``m.end('id')``, and also by name in the regular - expression itself (using ``(?P=id)``) and replacement text given to - ``.sub()`` (using ``\g``). + Named groups can be referenced in three contexts. If the pattern is + ``(?P['"]).*?(?P=quote)`` (i.e. matching a string quoted with either + single or double quotes): + + +---------------------------------------+----------------------------------+ + | Context of reference to group "quote" | Ways to reference it | + +=======================================+==================================+ + | in the same pattern itself | * ``(?P=quote)`` (as shown) | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ + | when processing match object ``m`` | * ``m.group('quote')`` | + | | * ``m.end('quote')`` (etc.) | + +---------------------------------------+----------------------------------+ + | in a string passed to the ``repl`` | * ``\g`` | + | argument of ``re.sub()`` | * ``\g<1>`` | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ ``(?P=name)`` - Matches whatever text was matched by the earlier group named *name*. + A backreference to a named group; it matches whatever text was matched by the + earlier group named *name*. ``(?#...)`` A comment; the contents of the parentheses are simply ignored. @@ -331,7 +342,8 @@ depends on the values of the ``UNICODE`` and ``LOCALE`` flags. For example, ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. - Inside a character range, ``\b`` represents the backspace character, for compatibility with Python's string literals. + Inside a character range, ``\b`` represents the backspace character, for + compatibility with Python's string literals. ``\B`` Matches the empty string, but only when it is *not* at the beginning or end of a @@ -642,7 +654,8 @@ when not adjacent to a previous match, so ``sub('x*', '-', 'abc')`` returns ``'-a-b-c-'``. - In addition to character escapes and backreferences as described above, + In string-type *repl* arguments, in addition to the character escapes and + backreferences described above, ``\g`` will use the substring matched by the group named ``name``, as defined by the ``(?P...)`` syntax. ``\g`` uses the corresponding group number; ``\g<2>`` is therefore equivalent to ``\2``, but isn't ambiguous -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:08:27 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:08:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNTk1?= =?utf-8?q?6=3A_improve_documentation_of_named_groups_and_how_to_reference?= =?utf-8?q?_them=2E?= Message-ID: <3ct0rq0NFqz7LjR@mail.python.org> http://hg.python.org/cpython/rev/f765a29309d1 changeset: 86050:f765a29309d1 branch: 3.3 parent: 86047:f19e9f110523 user: Georg Brandl date: Sun Oct 06 12:08:14 2013 +0200 summary: Closes #15956: improve documentation of named groups and how to reference them. files: Doc/library/re.rst | 38 ++++++++++++++++++++++----------- 1 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -242,21 +242,32 @@ ``(?P...)`` Similar to regular parentheses, but the substring matched by the group is - accessible within the rest of the regular expression via the symbolic group - name *name*. Group names must be valid Python identifiers, and each group - name must be defined only once within a regular expression. A symbolic group - is also a numbered group, just as if the group were not named. So the group - named ``id`` in the example below can also be referenced as the numbered group - ``1``. + accessible via the symbolic group name *name*. Group names must be valid + Python identifiers, and each group name must be defined only once within a + regular expression. A symbolic group is also a numbered group, just as if + the group were not named. - For example, if the pattern is ``(?P[a-zA-Z_]\w*)``, the group can be - referenced by its name in arguments to methods of match objects, such as - ``m.group('id')`` or ``m.end('id')``, and also by name in the regular - expression itself (using ``(?P=id)``) and replacement text given to - ``.sub()`` (using ``\g``). + Named groups can be referenced in three contexts. If the pattern is + ``(?P['"]).*?(?P=quote)`` (i.e. matching a string quoted with either + single or double quotes): + + +---------------------------------------+----------------------------------+ + | Context of reference to group "quote" | Ways to reference it | + +=======================================+==================================+ + | in the same pattern itself | * ``(?P=quote)`` (as shown) | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ + | when processing match object ``m`` | * ``m.group('quote')`` | + | | * ``m.end('quote')`` (etc.) | + +---------------------------------------+----------------------------------+ + | in a string passed to the ``repl`` | * ``\g`` | + | argument of ``re.sub()`` | * ``\g<1>`` | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ ``(?P=name)`` - Matches whatever text was matched by the earlier group named *name*. + A backreference to a named group; it matches whatever text was matched by the + earlier group named *name*. ``(?#...)`` A comment; the contents of the parentheses are simply ignored. @@ -667,7 +678,8 @@ when not adjacent to a previous match, so ``sub('x*', '-', 'abc')`` returns ``'-a-b-c-'``. - In addition to character escapes and backreferences as described above, + In string-type *repl* arguments, in addition to the character escapes and + backreferences described above, ``\g`` will use the substring matched by the group named ``name``, as defined by the ``(?P...)`` syntax. ``\g`` uses the corresponding group number; ``\g<2>`` is therefore equivalent to ``\2``, but isn't ambiguous -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:08:28 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:08:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct0rr28CVz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/d8c5413d725b changeset: 86051:d8c5413d725b parent: 86048:e8616dd3be64 parent: 86050:f765a29309d1 user: Georg Brandl date: Sun Oct 06 12:08:58 2013 +0200 summary: merge with 3.3 files: Doc/library/re.rst | 38 ++++++++++++++++++++++----------- 1 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -242,21 +242,32 @@ ``(?P...)`` Similar to regular parentheses, but the substring matched by the group is - accessible within the rest of the regular expression via the symbolic group - name *name*. Group names must be valid Python identifiers, and each group - name must be defined only once within a regular expression. A symbolic group - is also a numbered group, just as if the group were not named. So the group - named ``id`` in the example below can also be referenced as the numbered group - ``1``. + accessible via the symbolic group name *name*. Group names must be valid + Python identifiers, and each group name must be defined only once within a + regular expression. A symbolic group is also a numbered group, just as if + the group were not named. - For example, if the pattern is ``(?P[a-zA-Z_]\w*)``, the group can be - referenced by its name in arguments to methods of match objects, such as - ``m.group('id')`` or ``m.end('id')``, and also by name in the regular - expression itself (using ``(?P=id)``) and replacement text given to - ``.sub()`` (using ``\g``). + Named groups can be referenced in three contexts. If the pattern is + ``(?P['"]).*?(?P=quote)`` (i.e. matching a string quoted with either + single or double quotes): + + +---------------------------------------+----------------------------------+ + | Context of reference to group "quote" | Ways to reference it | + +=======================================+==================================+ + | in the same pattern itself | * ``(?P=quote)`` (as shown) | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ + | when processing match object ``m`` | * ``m.group('quote')`` | + | | * ``m.end('quote')`` (etc.) | + +---------------------------------------+----------------------------------+ + | in a string passed to the ``repl`` | * ``\g`` | + | argument of ``re.sub()`` | * ``\g<1>`` | + | | * ``\1`` | + +---------------------------------------+----------------------------------+ ``(?P=name)`` - Matches whatever text was matched by the earlier group named *name*. + A backreference to a named group; it matches whatever text was matched by the + earlier group named *name*. ``(?#...)`` A comment; the contents of the parentheses are simply ignored. @@ -667,7 +678,8 @@ when not adjacent to a previous match, so ``sub('x*', '-', 'abc')`` returns ``'-a-b-c-'``. - In addition to character escapes and backreferences as described above, + In string-type *repl* arguments, in addition to the character escapes and + backreferences described above, ``\g`` will use the substring matched by the group named ``name``, as defined by the ``(?P...)`` syntax. ``\g`` uses the corresponding group number; ``\g<2>`` is therefore equivalent to ``\2``, but isn't ambiguous -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:21:21 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:21:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Fix-up_grammar_and_remove?= =?utf-8?q?_last_reference_to_the_Apple_style_guide=2E?= Message-ID: <3ct17j3nXxzS9B@mail.python.org> http://hg.python.org/devguide/rev/937e3d3eb043 changeset: 643:937e3d3eb043 user: Georg Brandl date: Sun Oct 06 12:22:09 2013 +0200 summary: Fix-up grammar and remove last reference to the Apple style guide. files: documenting.rst | 13 ++++--------- 1 files changed, 4 insertions(+), 9 deletions(-) diff --git a/documenting.rst b/documenting.rst --- a/documenting.rst +++ b/documenting.rst @@ -101,19 +101,14 @@ sentences: the first word is always capitalized and other words are only capitalized if there is a specific rule requiring it. -Apple style guide recommends the use of title case in section titles. -However, rules for which words should be capitalized in title case -vary greatly between publications. - -In Python documentation, use of sentence case in section titles is +In the Python documentation, the use of sentence case in section titles is preferable, but consistency within a unit is more important than -following this rule. If you add a section to the chapter where most -sections are in title case you can either convert all titles to +following this rule. If you add a section to a chapter where most +sections are in title case, you can either convert all titles to sentence case or use the dominant style in the new section title. Sentences that start with a word for which specific rules require -starting it with a lower case letter should be avoided in titles and -elsewhere. +starting it with a lower case letter should be avoided. .. note:: -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sun Oct 6 12:30:28 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:30:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_strange_de?= =?utf-8?q?precation_version=2E?= Message-ID: <3ct1LD4xdjzSTV@mail.python.org> http://hg.python.org/cpython/rev/66411d53b8ae changeset: 86052:66411d53b8ae branch: 2.7 parent: 86049:bee2736296c5 user: Georg Brandl date: Sun Oct 06 12:31:06 2013 +0200 summary: Fix strange deprecation version. files: Doc/library/pipes.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -35,7 +35,7 @@ .. function:: quote(s) - .. deprecated:: 1.6 + .. deprecated:: 2.7 Prior to Python 2.7, this function was not publicly documented. It is finally exposed publicly in Python 3.3 as the :func:`quote ` function in the :mod:`shlex` module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:32:46 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:32:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4IHR5cG8u?= Message-ID: <3ct1Nt3M1lzSrm@mail.python.org> http://hg.python.org/cpython/rev/a2df78cba708 changeset: 86053:a2df78cba708 branch: 3.3 parent: 86050:f765a29309d1 user: Georg Brandl date: Sun Oct 06 12:33:20 2013 +0200 summary: Fix typo. files: Doc/library/gzip.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -67,7 +67,7 @@ object. When *fileobj* is not ``None``, the *filename* argument is only used to be - included in the :program:`gzip` file header, which may includes the original + included in the :program:`gzip` file header, which may include the original filename of the uncompressed file. It defaults to the filename of *fileobj*, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:32:47 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:32:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1Nv55MWzSrm@mail.python.org> http://hg.python.org/cpython/rev/2b0a2f5ccafe changeset: 86054:2b0a2f5ccafe parent: 86051:d8c5413d725b parent: 86053:a2df78cba708 user: Georg Brandl date: Sun Oct 06 12:33:31 2013 +0200 summary: merge with 3.3 files: Doc/library/gzip.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -67,7 +67,7 @@ object. When *fileobj* is not ``None``, the *filename* argument is only used to be - included in the :program:`gzip` file header, which may includes the original + included in the :program:`gzip` file header, which may include the original filename of the uncompressed file. It defaults to the filename of *fileobj*, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:33:24 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:33:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4IHR5cG8u?= Message-ID: <3ct1Pc58QrzSrm@mail.python.org> http://hg.python.org/cpython/rev/76da5dbfca53 changeset: 86055:76da5dbfca53 branch: 2.7 parent: 86052:66411d53b8ae user: Georg Brandl date: Sun Oct 06 12:33:20 2013 +0200 summary: Fix typo. files: Doc/library/gzip.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -38,7 +38,7 @@ object. When *fileobj* is not ``None``, the *filename* argument is only used to be - included in the :program:`gzip` file header, which may includes the original + included in the :program:`gzip` file header, which may include the original filename of the uncompressed file. It defaults to the filename of *fileobj*, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:36:36 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:36:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ291bnRlcjogZml4?= =?utf-8?q?_recipe_for_=22n_least_common_elements=22=2E_Found_by_Mikhail_G?= =?utf-8?q?olubev_on?= Message-ID: <3ct1TJ4twjz7LjM@mail.python.org> http://hg.python.org/cpython/rev/7add9ea59507 changeset: 86056:7add9ea59507 branch: 2.7 user: Georg Brandl date: Sun Oct 06 12:36:39 2013 +0200 summary: Counter: fix recipe for "n least common elements". Found by Mikhail Golubev on docs at . files: Doc/library/collections.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -146,7 +146,7 @@ dict(c) # convert to a regular dictionary c.items() # convert to a list of (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs - c.most_common()[:-n:-1] # n least common elements + c.most_common()[:-n-1:-1] # n least common elements c += Counter() # remove zero and negative counts Several mathematical operations are provided for combining :class:`Counter` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:37:18 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:37:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ291bnRlcjogZml4?= =?utf-8?q?_recipe_for_=22n_least_common_elements=22=2E_Found_by_Mikhail_G?= =?utf-8?q?olubev_on?= Message-ID: <3ct1V65k6hz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/b7941783b6cc changeset: 86057:b7941783b6cc branch: 3.3 parent: 86053:a2df78cba708 user: Georg Brandl date: Sun Oct 06 12:36:39 2013 +0200 summary: Counter: fix recipe for "n least common elements". Found by Mikhail Golubev on docs at . files: Doc/library/collections.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -307,7 +307,7 @@ dict(c) # convert to a regular dictionary c.items() # convert to a list of (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs - c.most_common()[:-n:-1] # n least common elements + c.most_common()[:-n-1:-1] # n least common elements +c # remove zero and negative counts Several mathematical operations are provided for combining :class:`Counter` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:37:20 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:37:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1V80SlSz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/0a51e097ad6d changeset: 86058:0a51e097ad6d parent: 86054:2b0a2f5ccafe parent: 86057:b7941783b6cc user: Georg Brandl date: Sun Oct 06 12:37:21 2013 +0200 summary: merge with 3.3 files: Doc/library/collections.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -312,7 +312,7 @@ dict(c) # convert to a regular dictionary c.items() # convert to a list of (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs - c.most_common()[:-n:-1] # n least common elements + c.most_common()[:-n-1:-1] # n least common elements +c # remove zero and negative counts Several mathematical operations are provided for combining :class:`Counter` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:38:12 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:38:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_SQLite_dat?= =?utf-8?q?atype_name=3A_it_is_REAL=2C_not_FLOAT=2E_Found_by_Richard_Kelsa?= =?utf-8?q?ll_on?= Message-ID: <3ct1W85qFYz7LkH@mail.python.org> http://hg.python.org/cpython/rev/3bc02a63596c changeset: 86059:3bc02a63596c branch: 3.3 parent: 86057:b7941783b6cc user: Georg Brandl date: Sun Oct 06 12:38:44 2013 +0200 summary: Fix SQLite datatype name: it is REAL, not FLOAT. Found by Richard Kelsall on docs at . files: Doc/library/sqlite3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -174,7 +174,7 @@ For the *isolation_level* parameter, please see the :attr:`Connection.isolation_level` property of :class:`Connection` objects. - SQLite natively supports only the types TEXT, INTEGER, FLOAT, BLOB and NULL. If + SQLite natively supports only the types TEXT, INTEGER, REAL, BLOB and NULL. If you want to use other types you must add support for them yourself. The *detect_types* parameter and the using custom **converters** registered with the module-level :func:`register_converter` function allow you to easily do that. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:38:14 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:38:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1WB0N3sz7LkT@mail.python.org> http://hg.python.org/cpython/rev/ddd1bb6ac071 changeset: 86060:ddd1bb6ac071 parent: 86058:0a51e097ad6d parent: 86059:3bc02a63596c user: Georg Brandl date: Sun Oct 06 12:38:57 2013 +0200 summary: merge with 3.3 files: Doc/library/sqlite3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -174,7 +174,7 @@ For the *isolation_level* parameter, please see the :attr:`Connection.isolation_level` property of :class:`Connection` objects. - SQLite natively supports only the types TEXT, INTEGER, FLOAT, BLOB and NULL. If + SQLite natively supports only the types TEXT, INTEGER, REAL, BLOB and NULL. If you want to use other types you must add support for them yourself. The *detect_types* parameter and the using custom **converters** registered with the module-level :func:`register_converter` function allow you to easily do that. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:38:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:38:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_SQLite_dat?= =?utf-8?q?atype_name=3A_it_is_REAL=2C_not_FLOAT=2E_Found_by_Richard_Kelsa?= =?utf-8?q?ll_on?= Message-ID: <3ct1WL0YGZz7LkT@mail.python.org> http://hg.python.org/cpython/rev/9b1a81aed523 changeset: 86061:9b1a81aed523 branch: 2.7 parent: 86056:7add9ea59507 user: Georg Brandl date: Sun Oct 06 12:38:44 2013 +0200 summary: Fix SQLite datatype name: it is REAL, not FLOAT. Found by Richard Kelsall on docs at . files: Doc/library/sqlite3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -179,7 +179,7 @@ For the *isolation_level* parameter, please see the :attr:`Connection.isolation_level` property of :class:`Connection` objects. - SQLite natively supports only the types TEXT, INTEGER, FLOAT, BLOB and NULL. If + SQLite natively supports only the types TEXT, INTEGER, REAL, BLOB and NULL. If you want to use other types you must add support for them yourself. The *detect_types* parameter and the using custom **converters** registered with the module-level :func:`register_converter` function allow you to easily do that. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:42:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:42:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_minor_bug_?= =?utf-8?q?in_httplib_example=2E_Found_by_Alex_MacAulay_on_docs=40=2E?= Message-ID: <3ct1bY0cp6z7LjM@mail.python.org> http://hg.python.org/cpython/rev/6ced4fb4f711 changeset: 86062:6ced4fb4f711 branch: 3.3 parent: 86059:3bc02a63596c user: Georg Brandl date: Sun Oct 06 12:42:18 2013 +0200 summary: Fix minor bug in httplib example. Found by Alex MacAulay on docs at . files: Doc/library/http.client.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -649,7 +649,7 @@ >>> conn = http.client.HTTPConnection("localhost", 8080) >>> conn.request("PUT", "/file", BODY) >>> response = conn.getresponse() - >>> print(resp.status, response.reason) + >>> print(response.status, response.reason) 200, OK .. _httpmessage-objects: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:42:02 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:42:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1bZ2WG2z7LjR@mail.python.org> http://hg.python.org/cpython/rev/69bfcccfde5c changeset: 86063:69bfcccfde5c parent: 86060:ddd1bb6ac071 parent: 86062:6ced4fb4f711 user: Georg Brandl date: Sun Oct 06 12:42:40 2013 +0200 summary: merge with 3.3 files: Doc/library/http.client.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -649,7 +649,7 @@ >>> conn = http.client.HTTPConnection("localhost", 8080) >>> conn.request("PUT", "/file", BODY) >>> response = conn.getresponse() - >>> print(resp.status, response.reason) + >>> print(response.status, response.reason) 200, OK .. _httpmessage-objects: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:42:06 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:42:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_minor_bug_?= =?utf-8?q?in_httplib_example=2E_Found_by_Alex_MacAulay_on_docs=40=2E?= Message-ID: <3ct1bf296Xz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/0c680936036c changeset: 86064:0c680936036c branch: 2.7 parent: 86061:9b1a81aed523 user: Georg Brandl date: Sun Oct 06 12:42:18 2013 +0200 summary: Fix minor bug in httplib example. Found by Alex MacAulay on docs at . files: Doc/library/httplib.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/httplib.rst b/Doc/library/httplib.rst --- a/Doc/library/httplib.rst +++ b/Doc/library/httplib.rst @@ -626,6 +626,6 @@ >>> conn = httplib.HTTPConnection("localhost", 8080) >>> conn.request("PUT", "/file", BODY) >>> response = conn.getresponse() - >>> print resp.status, response.reason + >>> print response.status, response.reason 200, OK -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:45:51 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:45:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_PythonCAD_is_n?= =?utf-8?q?ow_on_PyQt=2C_use_Wing_as_a_prominent_PyGtk_example=2E?= Message-ID: <3ct1gz21sHz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/942b9420e7e9 changeset: 86065:942b9420e7e9 branch: 3.3 parent: 86062:6ced4fb4f711 user: Georg Brandl date: Sun Oct 06 12:46:13 2013 +0200 summary: PythonCAD is now on PyQt, use Wing as a prominent PyGtk example. Found by Helge Stenstr?m on docs at . files: Doc/library/othergui.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -20,7 +20,7 @@ of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to `GNOME `_. One well known PyGTK application is - `PythonCAD `_. An online `tutorial + `WingIDE `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:45:52 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:45:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1h03kvLz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/3d7805a578b9 changeset: 86066:3d7805a578b9 parent: 86063:69bfcccfde5c parent: 86065:942b9420e7e9 user: Georg Brandl date: Sun Oct 06 12:46:35 2013 +0200 summary: merge with 3.3 files: Doc/library/othergui.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -20,7 +20,7 @@ of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to `GNOME `_. One well known PyGTK application is - `PythonCAD `_. An online `tutorial + `WingIDE `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:46:00 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:46:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_PythonCAD_is_n?= =?utf-8?q?ow_on_PyQt=2C_use_Wing_as_a_prominent_PyGtk_example=2E?= Message-ID: <3ct1h847vGz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/c5d1b25d43a5 changeset: 86067:c5d1b25d43a5 branch: 2.7 parent: 86064:0c680936036c user: Georg Brandl date: Sun Oct 06 12:46:13 2013 +0200 summary: PythonCAD is now on PyQt, use Wing as a prominent PyGtk example. Found by Helge Stenstr?m on docs at . files: Doc/library/othergui.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -14,7 +14,7 @@ the C one. It comes with many more widgets than Tkinter provides, and has good Python-specific reference documentation. There are also bindings to `GNOME `_. One well known PyGTK application is - `PythonCAD `_. An online `tutorial + `WingIDE `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:52:12 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:52:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_method_nam?= =?utf-8?q?e=3A_ensure=5Fdirectories=2C_not_create=5Fdirectories=2E_Found_?= =?utf-8?q?by_Michael?= Message-ID: <3ct1qJ0kCfzRN3@mail.python.org> http://hg.python.org/cpython/rev/ef0b7d9a1bbf changeset: 86068:ef0b7d9a1bbf branch: 3.3 parent: 86065:942b9420e7e9 user: Georg Brandl date: Sun Oct 06 12:52:49 2013 +0200 summary: Fix method name: ensure_directories, not create_directories. Found by Michael Rand on docs at . files: Doc/library/venv.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -129,13 +129,13 @@ env_dir is the target directory to create an environment in. """ env_dir = os.path.abspath(env_dir) - context = self.create_directories(env_dir) + context = self.ensure_directories(env_dir) self.create_configuration(context) self.setup_python(context) self.setup_scripts(context) self.post_setup(context) - Each of the methods :meth:`create_directories`, + Each of the methods :meth:`ensure_directories`, :meth:`create_configuration`, :meth:`setup_python`, :meth:`setup_scripts` and :meth:`post_setup` can be overridden. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:52:13 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:52:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1qK2TKQz7LjP@mail.python.org> http://hg.python.org/cpython/rev/0617971403f6 changeset: 86069:0617971403f6 parent: 86066:3d7805a578b9 parent: 86068:ef0b7d9a1bbf user: Georg Brandl date: Sun Oct 06 12:52:53 2013 +0200 summary: merge with 3.3 files: Doc/library/venv.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -128,13 +128,13 @@ env_dir is the target directory to create an environment in. """ env_dir = os.path.abspath(env_dir) - context = self.create_directories(env_dir) + context = self.ensure_directories(env_dir) self.create_configuration(context) self.setup_python(context) self.setup_scripts(context) self.post_setup(context) - Each of the methods :meth:`create_directories`, + Each of the methods :meth:`ensure_directories`, :meth:`create_configuration`, :meth:`setup_python`, :meth:`setup_scripts` and :meth:`post_setup` can be overridden. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:57:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:57:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_example_in?= =?utf-8?q?_backreference_description=2E__Found_by_Alexander_Heger_on_docs?= =?utf-8?b?QC4=?= Message-ID: <3ct1xf1lNQzRN3@mail.python.org> http://hg.python.org/cpython/rev/bcc837f8b640 changeset: 86070:bcc837f8b640 branch: 3.3 parent: 86068:ef0b7d9a1bbf user: Georg Brandl date: Sun Oct 06 12:58:20 2013 +0200 summary: Fix example in backreference description. Found by Alexander Heger on docs at . files: Doc/library/re.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -327,7 +327,7 @@ ``\number`` Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, ``(.+) \1`` matches ``'the the'`` or ``'55 55'``, - but not ``'the end'`` (note the space after the group). This special sequence + but not ``'thethe'`` (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of *number* is 0, or *number* is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value *number*. Inside the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:57:43 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:57:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct1xg3mBVz7LjR@mail.python.org> http://hg.python.org/cpython/rev/4777ac61aa42 changeset: 86071:4777ac61aa42 parent: 86069:0617971403f6 parent: 86070:bcc837f8b640 user: Georg Brandl date: Sun Oct 06 12:58:26 2013 +0200 summary: merge with 3.3 files: Doc/library/re.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -327,7 +327,7 @@ ``\number`` Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, ``(.+) \1`` matches ``'the the'`` or ``'55 55'``, - but not ``'the end'`` (note the space after the group). This special sequence + but not ``'thethe'`` (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of *number* is 0, or *number* is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value *number*. Inside the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 12:57:52 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 12:57:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_example_in?= =?utf-8?q?_backreference_description=2E__Found_by_Alexander_Heger_on_docs?= =?utf-8?b?QC4=?= Message-ID: <3ct1xr4pryz7LjX@mail.python.org> http://hg.python.org/cpython/rev/2b0401e50fc3 changeset: 86072:2b0401e50fc3 branch: 2.7 parent: 86067:c5d1b25d43a5 user: Georg Brandl date: Sun Oct 06 12:58:20 2013 +0200 summary: Fix example in backreference description. Found by Alexander Heger on docs at . files: Doc/library/re.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -322,7 +322,7 @@ ``\number`` Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, ``(.+) \1`` matches ``'the the'`` or ``'55 55'``, - but not ``'the end'`` (note the space after the group). This special sequence + but not ``'thethe'`` (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of *number* is 0, or *number* is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value *number*. Inside the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:00:39 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:00:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Add_missing_li?= =?utf-8?q?st_methods=2E_Found_by_Leonardo_Pereira_on_docs=40=2E?= Message-ID: <3ct2134ssMzRN3@mail.python.org> http://hg.python.org/cpython/rev/d9b58229aabe changeset: 86073:d9b58229aabe branch: 3.3 parent: 86070:bcc837f8b640 user: Georg Brandl date: Sun Oct 06 13:01:19 2013 +0200 summary: Add missing list methods. Found by Leonardo Pereira on docs at . files: Doc/tutorial/datastructures.rst | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -54,6 +54,12 @@ will see this notation frequently in the Python Library Reference.) +.. method:: list.clear() + :noindex: + + Remove all items from the list. Equivalent to ``del a[:]``. + + .. method:: list.index(x) :noindex: @@ -79,6 +85,12 @@ Reverse the elements of the list in place. +.. method:: list.copy() + :noindex: + + Return a shallow copy of the list. Equivalent to ``a[:]``. + + An example that uses most of the list methods:: >>> a = [66.25, 333, 333, 1, 1234.5] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:00:40 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:00:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2146hHnzRN3@mail.python.org> http://hg.python.org/cpython/rev/ebf2b999c9b0 changeset: 86074:ebf2b999c9b0 parent: 86071:4777ac61aa42 parent: 86073:d9b58229aabe user: Georg Brandl date: Sun Oct 06 13:01:23 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/datastructures.rst | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -54,6 +54,12 @@ will see this notation frequently in the Python Library Reference.) +.. method:: list.clear() + :noindex: + + Remove all items from the list. Equivalent to ``del a[:]``. + + .. method:: list.index(x) :noindex: @@ -79,6 +85,12 @@ Reverse the elements of the list in place. +.. method:: list.copy() + :noindex: + + Return a shallow copy of the list. Equivalent to ``a[:]``. + + An example that uses most of the list methods:: >>> a = [66.25, 333, 333, 1, 1234.5] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:06:33 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:06:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Unicode_howto?= =?utf-8?q?=3A_use_=2Etxt_as_a_more_universally_understood_extension_for_t?= =?utf-8?q?ext?= Message-ID: <3ct27s3xH0zRLv@mail.python.org> http://hg.python.org/cpython/rev/8eff897b296b changeset: 86075:8eff897b296b branch: 3.3 parent: 86073:d9b58229aabe user: Georg Brandl date: Sun Oct 06 13:07:10 2013 +0200 summary: Unicode howto: use .txt as a more universally understood extension for text files. files: Doc/howto/unicode.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -537,7 +537,7 @@ Reading Unicode from a file is therefore simple:: - with open('unicode.rst', encoding='utf-8') as f: + with open('unicode.txt', encoding='utf-8') as f: for line in f: print(repr(line)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:06:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:06:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct27t5lpbzRLv@mail.python.org> http://hg.python.org/cpython/rev/91cf263b711b changeset: 86076:91cf263b711b parent: 86074:ebf2b999c9b0 parent: 86075:8eff897b296b user: Georg Brandl date: Sun Oct 06 13:07:14 2013 +0200 summary: merge with 3.3 files: Doc/howto/unicode.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -537,7 +537,7 @@ Reading Unicode from a file is therefore simple:: - with open('unicode.rst', encoding='utf-8') as f: + with open('unicode.txt', encoding='utf-8') as f: for line in f: print(repr(line)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:09:21 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:09:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_missing_cl?= =?utf-8?q?ass_name_in_markup=2E_Found_by_Tanky_Woo_on_docs=40=2E?= Message-ID: <3ct2C53PTzzRd2@mail.python.org> http://hg.python.org/cpython/rev/5e0411596314 changeset: 86077:5e0411596314 branch: 3.3 parent: 86075:8eff897b296b user: Georg Brandl date: Sun Oct 06 13:09:59 2013 +0200 summary: Fix missing class name in markup. Found by Tanky Woo on docs at . files: Doc/library/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1696,7 +1696,7 @@ Mutual exclusion ^^^^^^^^^^^^^^^^ -.. method:: add_mutually_exclusive_group(required=False) +.. method:: ArgumentParser.add_mutually_exclusive_group(required=False) Create a mutually exclusive group. :mod:`argparse` will make sure that only one of the arguments in the mutually exclusive group was present on the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:09:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:09:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2C65662z7LjR@mail.python.org> http://hg.python.org/cpython/rev/660f9c8300e9 changeset: 86078:660f9c8300e9 parent: 86076:91cf263b711b parent: 86077:5e0411596314 user: Georg Brandl date: Sun Oct 06 13:10:06 2013 +0200 summary: merge with 3.3 files: Doc/library/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1698,7 +1698,7 @@ Mutual exclusion ^^^^^^^^^^^^^^^^ -.. method:: add_mutually_exclusive_group(required=False) +.. method:: ArgumentParser.add_mutually_exclusive_group(required=False) Create a mutually exclusive group. :mod:`argparse` will make sure that only one of the arguments in the mutually exclusive group was present on the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:09:29 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:09:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_missing_cl?= =?utf-8?q?ass_name_in_markup=2E_Found_by_Tanky_Woo_on_docs=40=2E?= Message-ID: <3ct2CF3Ppyz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/a423379bfb1a changeset: 86079:a423379bfb1a branch: 2.7 parent: 86072:2b0401e50fc3 user: Georg Brandl date: Sun Oct 06 13:09:59 2013 +0200 summary: Fix missing class name in markup. Found by Tanky Woo on docs at . files: Doc/library/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1666,7 +1666,7 @@ Mutual exclusion ^^^^^^^^^^^^^^^^ -.. method:: add_mutually_exclusive_group(required=False) +.. method:: ArgumentParser.add_mutually_exclusive_group(required=False) Create a mutually exclusive group. :mod:`argparse` will make sure that only one of the arguments in the mutually exclusive group was present on the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:14:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:14:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Minor_improvem?= =?utf-8?q?ent=3A_add_indication_that_the_main_function_goes_on=2E?= Message-ID: <3ct2K46Zz5z7Ljd@mail.python.org> http://hg.python.org/cpython/rev/4c691f3180b3 changeset: 86080:4c691f3180b3 branch: 3.3 parent: 86077:5e0411596314 user: Georg Brandl date: Sun Oct 06 13:14:10 2013 +0200 summary: Minor improvement: add indication that the main function goes on. files: Doc/extending/extending.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -384,6 +384,8 @@ imports it. */ PyImport_ImportModule("spam"); + ... + .. note:: Removing entries from ``sys.modules`` or importing compiled modules into -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:14:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:14:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2K619wLz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/c57f5bde5c2d changeset: 86081:c57f5bde5c2d parent: 86078:660f9c8300e9 parent: 86080:4c691f3180b3 user: Georg Brandl date: Sun Oct 06 13:15:16 2013 +0200 summary: merge with 3.3 files: Doc/extending/extending.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -384,6 +384,8 @@ imports it. */ PyImport_ImportModule("spam"); + ... + .. note:: Removing entries from ``sys.modules`` or importing compiled modules into -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:14:50 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:14:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Minor_improvem?= =?utf-8?q?ent=3A_add_indication_that_the_main_function_goes_on=2E?= Message-ID: <3ct2KQ12g6z7Ljs@mail.python.org> http://hg.python.org/cpython/rev/2319f6e1980c changeset: 86082:2319f6e1980c branch: 2.7 parent: 86079:a423379bfb1a user: Georg Brandl date: Sun Oct 06 13:14:10 2013 +0200 summary: Minor improvement: add indication that the main function goes on. files: Doc/extending/extending.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -372,6 +372,8 @@ /* Add a static module */ initspam(); + ... + An example may be found in the file :file:`Demo/embed/demo.c` in the Python source distribution. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:16:30 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:16:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_order_of_r?= =?utf-8?q?equired_StreamReader/StreamWriter_base_classes=2E__Spotted_by?= Message-ID: <3ct2ML2SVtz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/a5d645505298 changeset: 86083:a5d645505298 branch: 3.3 parent: 86080:4c691f3180b3 user: Georg Brandl date: Sun Oct 06 13:17:04 2013 +0200 summary: Fix order of required StreamReader/StreamWriter base classes. Spotted by Edward Welbourne on docs at . files: Doc/library/codecs.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -65,7 +65,7 @@ ``factory(stream, errors='strict')`` The factory functions must return objects providing the interfaces defined by - the base classes :class:`StreamWriter` and :class:`StreamReader`, respectively. + the base classes :class:`StreamReader` and :class:`StreamWriter`, respectively. Stream codecs can maintain state. Possible values for errors are -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:16:31 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:16:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2MM4KxPz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/4e5fdc3131dc changeset: 86084:4e5fdc3131dc parent: 86081:c57f5bde5c2d parent: 86083:a5d645505298 user: Georg Brandl date: Sun Oct 06 13:17:14 2013 +0200 summary: merge with 3.3 files: Doc/library/codecs.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -65,7 +65,7 @@ ``factory(stream, errors='strict')`` The factory functions must return objects providing the interfaces defined by - the base classes :class:`StreamWriter` and :class:`StreamReader`, respectively. + the base classes :class:`StreamReader` and :class:`StreamWriter`, respectively. Stream codecs can maintain state. Possible values for errors are -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:16:38 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:16:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_order_of_r?= =?utf-8?q?equired_StreamReader/StreamWriter_base_classes=2E__Spotted_by?= Message-ID: <3ct2MV3Fscz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/8b6dd8e6c4fc changeset: 86085:8b6dd8e6c4fc branch: 2.7 parent: 86082:2319f6e1980c user: Georg Brandl date: Sun Oct 06 13:17:04 2013 +0200 summary: Fix order of required StreamReader/StreamWriter base classes. Spotted by Edward Welbourne on docs at . files: Doc/library/codecs.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -66,7 +66,7 @@ ``factory(stream, errors='strict')`` The factory functions must return objects providing the interfaces defined by - the base classes :class:`StreamWriter` and :class:`StreamReader`, respectively. + the base classes :class:`StreamReader` and :class:`StreamWriter`, respectively. Stream codecs can maintain state. Possible values for errors are -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:20:11 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:20:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_link_to_th?= =?utf-8?q?e_=22pexports=22_tool=2E_Found_by_Joe_Aikkaravelil_on_docs=40?= =?utf-8?q?=2E?= Message-ID: <3ct2Rb3RqNzQN7@mail.python.org> http://hg.python.org/cpython/rev/05749f49c8ed changeset: 86086:05749f49c8ed branch: 3.3 parent: 86083:a5d645505298 user: Georg Brandl date: Sun Oct 06 13:20:49 2013 +0200 summary: Fix link to the "pexports" tool. Found by Joe Aikkaravelil on docs at . files: Doc/install/index.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/install/index.rst b/Doc/install/index.rst --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1046,7 +1046,7 @@ for Borland's C++, because there is no program to convert the library. First you have to create a list of symbols which the Python DLL exports. (You can find a good program for this task at -http://www.emmestech.com/software/pexports-0.43/download_pexports.html). +http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/). .. I don't understand what the next line means. --amk .. (inclusive the references on data structures.) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:20:12 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:20:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2Rc5RKGzQr9@mail.python.org> http://hg.python.org/cpython/rev/3771924e77d2 changeset: 86087:3771924e77d2 parent: 86084:4e5fdc3131dc parent: 86086:05749f49c8ed user: Georg Brandl date: Sun Oct 06 13:20:55 2013 +0200 summary: merge with 3.3 files: Doc/install/index.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/install/index.rst b/Doc/install/index.rst --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1046,7 +1046,7 @@ for Borland's C++, because there is no program to convert the library. First you have to create a list of symbols which the Python DLL exports. (You can find a good program for this task at -http://www.emmestech.com/software/pexports-0.43/download_pexports.html). +http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/). .. I don't understand what the next line means. --amk .. (inclusive the references on data structures.) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:20:19 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:20:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_link_to_th?= =?utf-8?q?e_=22pexports=22_tool=2E_Found_by_Joe_Aikkaravelil_on_docs=40?= =?utf-8?q?=2E?= Message-ID: <3ct2Rl4hh6z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/5e7d6b3065d1 changeset: 86088:5e7d6b3065d1 branch: 2.7 parent: 86085:8b6dd8e6c4fc user: Georg Brandl date: Sun Oct 06 13:20:49 2013 +0200 summary: Fix link to the "pexports" tool. Found by Joe Aikkaravelil on docs at . files: Doc/install/index.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/install/index.rst b/Doc/install/index.rst --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1042,7 +1042,7 @@ for Borland's C++, because there is no program to convert the library. First you have to create a list of symbols which the Python DLL exports. (You can find a good program for this task at -http://www.emmestech.com/software/pexports-0.43/download_pexports.html). +http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/). .. I don't understand what the next line means. --amk .. (inclusive the references on data structures.) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:24:07 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:24:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4IHR5cG8uIFNw?= =?utf-8?q?otted_by_Bo_Bayles_on_docs=40=2E?= Message-ID: <3ct2X72fDmzQr9@mail.python.org> http://hg.python.org/cpython/rev/b3844e98e92e changeset: 86089:b3844e98e92e branch: 3.3 parent: 86086:05749f49c8ed user: Georg Brandl date: Sun Oct 06 13:24:49 2013 +0200 summary: Fix typo. Spotted by Bo Bayles on docs at . files: Doc/library/distutils.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst --- a/Doc/library/distutils.rst +++ b/Doc/library/distutils.rst @@ -20,6 +20,6 @@ :ref:`distutils-index` The manual for developers and packagers of Python modules. This describes how to prepare :mod:`distutils`\ -based packages so that they may be - easily installed into an existing Python installation. If also contains + easily installed into an existing Python installation. It also contains instructions for end-users wanting to install a distutils-based package, :ref:`install-index`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 13:24:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 13:24:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct2X84TTjzQr9@mail.python.org> http://hg.python.org/cpython/rev/50e4d0c62c2b changeset: 86090:50e4d0c62c2b parent: 86087:3771924e77d2 parent: 86089:b3844e98e92e user: Georg Brandl date: Sun Oct 06 13:24:52 2013 +0200 summary: merge with 3.3 files: Doc/library/distutils.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst --- a/Doc/library/distutils.rst +++ b/Doc/library/distutils.rst @@ -20,6 +20,6 @@ :ref:`distutils-index` The manual for developers and packagers of Python modules. This describes how to prepare :mod:`distutils`\ -based packages so that they may be - easily installed into an existing Python installation. If also contains + easily installed into an existing Python installation. It also contains instructions for end-users wanting to install a distutils-based package, :ref:`install-index`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 14:28:47 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 6 Oct 2013 14:28:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_456=3A_drop_pluggable_and?= =?utf-8?q?_go_for_compile_time_configuration_of_the_hash?= Message-ID: <3ct3yl5xRxz7LjN@mail.python.org> http://hg.python.org/peps/rev/1d56df07dfe9 changeset: 5170:1d56df07dfe9 user: Christian Heimes date: Sun Oct 06 14:28:39 2013 +0200 summary: PEP 456: drop pluggable and go for compile time configuration of the hash algorithm. files: pep-0456.txt | 81 ++++++++++++++++----------------------- 1 files changed, 34 insertions(+), 47 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -1,5 +1,5 @@ PEP: 456 -Title: Pluggable and secure hash algorithm +Title: Secure and interchangeable hash algorithm Version: $Revision$ Last-Modified: $Date$ Author: Christian Heimes @@ -8,16 +8,16 @@ Content-Type: text/x-rst Created: 27-Sep-2013 Python-Version: 3.4 -Post-History: +Post-History: 06-Oct-2013 Abstract ======== This PEP proposes SipHash as default string and bytes hash algorithm to properly -fix hash randomization once and for all. It also proposes an addition to -Python's C API in order to make the hash code pluggable. The new API allows to -select the algorithm on startup as well as the addition of more hash algorithms. +fix hash randomization once and for all. It also proposes modifications to +Python's C code in order to unify the hash code and to make it easily +interchangeable. Rationale @@ -57,10 +57,8 @@ ``Objects/object.c`` and ``Objects/unicodeobject.c``. The function takes a void pointer plus length and returns the hash for it. -* The algorithm can be selected by the user with an environment variable, - command line argument or with an API function (for embedders). FNV is - guaranteed to exist on all platforms. SipHash is available on the majority - of modern systems. +* The algorithm can be selected at compile time. FNV is guaranteed to exist + on all platforms. SipHash is available on the majority of modern systems. Requirements for a hash function @@ -321,50 +319,25 @@ type definition:: typedef struct { - PyHash_Func hashfunc; /* function pointer */ + PyHash_Func hash; /* function pointer */ char *name; /* name of the hash algorithm and variant */ int hash_bits; /* internal size of hash value */ int seed_bits; /* size of seed input */ - int precedence; /* ranking for auto-selection */ - } PyHash_FuncDef; + } _PyHash_FuncDef; - PyAPI_DATA(PyHash_FuncDef *) PyHash_FuncTable; + PyAPI_DATA(_PyHash_FuncDef *) _PyHash_Func; Implementation:: - PyHash_FuncDef hash_func_table[] = { - {fnv, "fnv", 64, 128, 10}, + #ifndef PY_HASH_FUNC #ifdef PY_UINT64_T - {siphash24, "sip24", sizeof(Py_hash_t)*8, sizeof(Py_hash_t)*8, 20}, + _PyHash_Func = {siphash24, "sip24", 64, 128} + #else + _PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t), 16 * sizeof(Py_hash_t)} #endif - {NULL, NULL}, - }; + #endif - PyHash_FuncDef *PyHash_FuncTable = hash_func_table; - - -hash function API ------------------ - -function proto types:: - - PyAPI_FUNC(int) PyHash_SetHashAlgorithm(char *name); - - PyAPI_FUNC(PyHash_FuncDef *) PyHash_GetHashAlgorithm(void); - - PyAPI_DATA(PyHash_FuncDef *) _PyHash_Func; - -``PyHash_SetHashAlgorithm(NULL)`` selects the hash algorithm with the highest -precedence. ``PyHash_SetHashAlgorithm("sip24")`` selects siphash24 as hash -algorithm. The function returns ``0`` on success. In case the algorithm is -not supported or a hash algorithm is already set it returns ``-1``. -(XXX use enum?) - -``PyHash_GetHashAlgorithm()`` returns a pointer to current hash function -definition or `NULL`. - -``_PyHash_Func`` holds the set hash function definition. It can't be modified -or reset once a hash algorithm is set. +TODO: select hash algorithm with autoconf variable Python API addition @@ -379,9 +352,8 @@ :: sys.hash_info(algorithm='siphash24', - available_algorithms=('siphash24', 'fnv'), hash_bits=64, - hash_output=64, # sizeof(Py_hash_t)*8 + hash_output=64, # 8 * sizeof(Py_hash_t) seed_bits=128) @@ -439,8 +411,8 @@ if (PyUnicode_READY(u) == -1) return -1; - x = _PyHash_Func->hashfunc(PyUnicode_DATA(u), - PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); + x = _PyHash_Func->hash(PyUnicode_DATA(u), + PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); generic_hash (Modules/_datetimemodule.c) @@ -534,6 +506,19 @@ prefixes are stored within the tree structure. +Discussion +========== + +Pluggable +--------- + +The first draft of this PEP made the hash algorithm pluggable at runtime. It +supported multiple hash algorithms in one binary to give the user the +possibility to select a hash algorithm at startup. The approach was considered +an unnecessary complication by several core committers [pluggable]_. Subsequent +versions of the PEP aim for compile time configuration. + + Reference ========= @@ -567,6 +552,8 @@ .. [aes-ni] http://en.wikipedia.org/wiki/AES_instruction_set +.. [pluggable] https://mail.python.org/pipermail/python-dev/2013-October/129138.html + Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 6 15:56:10 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 6 Oct 2013 15:56:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Get_the_C_API_straight?= Message-ID: <3ct5vZ0F5Gz7LjP@mail.python.org> http://hg.python.org/peps/rev/9c0744c9e394 changeset: 5171:9c0744c9e394 user: Christian Heimes date: Sun Oct 06 15:56:00 2013 +0200 summary: Get the C API straight Python already has sys.hash_info files: pep-0456.txt | 51 ++++++++++++++++++++++++++------------- 1 files changed, 34 insertions(+), 17 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -310,31 +310,43 @@ function prototype:: - typedef Py_hash_t (*PyHash_Func)(const void *, Py_ssize_t); + typedef Py_hash_t (*PyHash_Func_t)(const void *, Py_ssize_t); -hash function table -------------------- +hash function selection +----------------------- type definition:: + #define PY_HASH_SIPHASH24 0x53495024 + #define PY_HASH_FNV 0x464E56 + + #ifndef PY_HASH_ALGORITHM + #if defined(PY_UINT64_T) && defined(PY_UINT32_T) + #define PY_HASH_ALGORITHM PY_HASH_SIPHASH24 + #else + #define PY_HASH_ALGORITHM PY_HASH_FNV + #endif /* uint64_t && uint32_t */ + #endif /* PY_HASH_ALGORITHM */ + typedef struct { - PyHash_Func hash; /* function pointer */ + PyHash_Func_t hash; /* function pointer */ char *name; /* name of the hash algorithm and variant */ int hash_bits; /* internal size of hash value */ int seed_bits; /* size of seed input */ - } _PyHash_FuncDef; + } PyHash_FuncDef; - PyAPI_DATA(_PyHash_FuncDef *) _PyHash_Func; + PyAPI_DATA(PyHash_FuncDef) PyHash_Func; Implementation:: - #ifndef PY_HASH_FUNC - #ifdef PY_UINT64_T - _PyHash_Func = {siphash24, "sip24", 64, 128} - #else - _PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t), 16 * sizeof(Py_hash_t)} + #if PY_HASH_ALGORITHM == PY_HASH_FNV + PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t), + 16 * sizeof(Py_hash_t)}; #endif + + #if PY_HASH_ALGORITHM == PY_HASH_SIPHASH24 + PyHash_FuncDef PyHash_Func = {siphash24, "siphash24", 64, 128}; #endif TODO: select hash algorithm with autoconf variable @@ -346,14 +358,19 @@ sys module ---------- -The sys module grows a new struct member with information about the select -algorithm as well as all available algorithms. +The sys module already has a hash_info struct sequence. More fields are added +to the object to reflect the active hash algorithm and its properties. :: - sys.hash_info(algorithm='siphash24', + sys.hash_info(width=64, + modulus=2305843009213693951, + inf=314159, + nan=0, + imag=1000003, + # new fields: + algorithm='siphash24', hash_bits=64, - hash_output=64, # 8 * sizeof(Py_hash_t) seed_bits=128) @@ -411,8 +428,8 @@ if (PyUnicode_READY(u) == -1) return -1; - x = _PyHash_Func->hash(PyUnicode_DATA(u), - PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); + x = PyHash_Func.hash(PyUnicode_DATA(u), + PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); generic_hash (Modules/_datetimemodule.c) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 6 15:56:38 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 6 Oct 2013 15:56:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_drop_testcapi_addition?= Message-ID: <3ct5w65Zgnz7LjP@mail.python.org> http://hg.python.org/peps/rev/2781d7bad1d6 changeset: 5172:2781d7bad1d6 user: Christian Heimes date: Sun Oct 06 15:56:31 2013 +0200 summary: drop testcapi addition files: pep-0456.txt | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -374,19 +374,6 @@ seed_bits=128) -_testcapi ---------- - -The `_testcapi` C module gets a function to hash a buffer or string object -with any supported hash algorithm. The function neither uses nor sets the -cached hash value of the object. The feature is soley intended for benchmarks -and testing. - -:: - - _testcapi.get_hash(name: str, str_or_buffer) -> int - - Necessary modifications to C code ================================= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 6 18:11:33 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:11:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMjM1?= =?utf-8?q?0=3A_clarify_blocks/block_size_members_of_stat_result=2E?= Message-ID: <3ct8vn2jTfz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/ef5aa8d7e932 changeset: 86091:ef5aa8d7e932 branch: 3.3 parent: 86089:b3844e98e92e user: Georg Brandl date: Sun Oct 06 18:11:32 2013 +0200 summary: Closes #12350: clarify blocks/block size members of stat result. files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1813,8 +1813,8 @@ On some Unix systems (such as Linux), the following attributes may also be available: - * :attr:`st_blocks` - number of blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize + * :attr:`st_blocks` - number of 512-byte blocks allocated for file + * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O * :attr:`st_rdev` - type of device if an inode device * :attr:`st_flags` - user defined flags for file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:11:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:11:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct8vp4cmzz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/b3846ba353a1 changeset: 86092:b3846ba353a1 parent: 86090:50e4d0c62c2b parent: 86091:ef5aa8d7e932 user: Georg Brandl date: Sun Oct 06 18:12:13 2013 +0200 summary: merge with 3.3 files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1868,8 +1868,8 @@ On some Unix systems (such as Linux), the following attributes may also be available: - * :attr:`st_blocks` - number of blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize + * :attr:`st_blocks` - number of 512-byte blocks allocated for file + * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O * :attr:`st_rdev` - type of device if an inode device * :attr:`st_flags` - user defined flags for file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:11:40 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:11:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMjM1?= =?utf-8?q?0=3A_clarify_blocks/block_size_members_of_stat_result=2E?= Message-ID: <3ct8vw3fhFz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/c32657e278f6 changeset: 86093:c32657e278f6 branch: 2.7 parent: 86088:5e7d6b3065d1 user: Georg Brandl date: Sun Oct 06 18:11:32 2013 +0200 summary: Closes #12350: clarify blocks/block size members of stat result. files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1386,8 +1386,8 @@ On some Unix systems (such as Linux), the following attributes may also be available: - * :attr:`st_blocks` - number of blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize + * :attr:`st_blocks` - number of 512-byte blocks allocated for file + * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O * :attr:`st_rdev` - type of device if an inode device * :attr:`st_flags` - user defined flags for file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:17:35 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:17:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTE4?= =?utf-8?q?1=3A_replace_non-existing_host_ftp=2Ecwi=2Enl_with_ftp=2Edebian?= =?utf-8?q?=2Eorg_in?= Message-ID: <3ct92l3ZCxz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/d41aab121366 changeset: 86094:d41aab121366 branch: 3.3 parent: 86091:ef5aa8d7e932 user: Georg Brandl date: Sun Oct 06 18:17:56 2013 +0200 summary: Closes #19181: replace non-existing host ftp.cwi.nl with ftp.debian.org in ftplib example. files: Doc/library/ftplib.rst | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -23,16 +23,17 @@ Here's a sample session using the :mod:`ftplib` module:: >>> from ftplib import FTP - >>> ftp = FTP('ftp.cwi.nl') # connect to host, default port - >>> ftp.login() # user anonymous, passwd anonymous@ - >>> ftp.retrlines('LIST') # list directory contents - total 24418 - drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 . - dr-xr-srwt 105 ftp-usr pdmaint 1536 Mar 21 14:32 .. - -rw-r--r-- 1 ftp-usr pdmaint 5305 Mar 20 09:48 INDEX - . - . - . + >>> ftp = FTP('ftp.debian.org') # connect to host, default port + >>> ftp.login() # user anonymous, passwd anonymous@ + '230 Login successful.' + >>> ftp.cwd('debian') # change into "debian" directory + >>> ftp.retrlines('LIST') # list directory contents + -rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README + ... + drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool + drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project + drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools + '226 Directory send OK.' >>> ftp.retrbinary('RETR README', open('README', 'wb').write) '226 Transfer complete.' >>> ftp.quit() @@ -423,7 +424,8 @@ .. method:: FTP_TLS.auth() - Set up secure control connection by using TLS or SSL, depending on what specified in :meth:`ssl_version` attribute. + Set up secure control connection by using TLS or SSL, depending on what + specified in :meth:`ssl_version` attribute. .. method:: FTP_TLS.ccc() @@ -440,5 +442,3 @@ .. method:: FTP_TLS.prot_c() Set up clear text data connection. - - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:17:36 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:17:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct92m5P14z7LkF@mail.python.org> http://hg.python.org/cpython/rev/bb027bd31bb7 changeset: 86095:bb027bd31bb7 parent: 86092:b3846ba353a1 parent: 86094:d41aab121366 user: Georg Brandl date: Sun Oct 06 18:18:16 2013 +0200 summary: merge with 3.3 files: Doc/library/ftplib.rst | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -23,16 +23,17 @@ Here's a sample session using the :mod:`ftplib` module:: >>> from ftplib import FTP - >>> ftp = FTP('ftp.cwi.nl') # connect to host, default port - >>> ftp.login() # user anonymous, passwd anonymous@ - >>> ftp.retrlines('LIST') # list directory contents - total 24418 - drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 . - dr-xr-srwt 105 ftp-usr pdmaint 1536 Mar 21 14:32 .. - -rw-r--r-- 1 ftp-usr pdmaint 5305 Mar 20 09:48 INDEX - . - . - . + >>> ftp = FTP('ftp.debian.org') # connect to host, default port + >>> ftp.login() # user anonymous, passwd anonymous@ + '230 Login successful.' + >>> ftp.cwd('debian') # change into "debian" directory + >>> ftp.retrlines('LIST') # list directory contents + -rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README + ... + drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool + drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project + drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools + '226 Directory send OK.' >>> ftp.retrbinary('RETR README', open('README', 'wb').write) '226 Transfer complete.' >>> ftp.quit() @@ -423,7 +424,8 @@ .. method:: FTP_TLS.auth() - Set up secure control connection by using TLS or SSL, depending on what specified in :meth:`ssl_version` attribute. + Set up secure control connection by using TLS or SSL, depending on what + specified in :meth:`ssl_version` attribute. .. method:: FTP_TLS.ccc() @@ -440,5 +442,3 @@ .. method:: FTP_TLS.prot_c() Set up clear text data connection. - - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:17:43 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:17:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTE4?= =?utf-8?q?1=3A_replace_non-existing_host_ftp=2Ecwi=2Enl_with_ftp=2Edebian?= =?utf-8?q?=2Eorg_in?= Message-ID: <3ct92v51Qhz7LkY@mail.python.org> http://hg.python.org/cpython/rev/635e6239aa8e changeset: 86096:635e6239aa8e branch: 2.7 parent: 86093:c32657e278f6 user: Georg Brandl date: Sun Oct 06 18:17:56 2013 +0200 summary: Closes #19181: replace non-existing host ftp.cwi.nl with ftp.debian.org in ftplib example. files: Doc/library/ftplib.rst | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -23,16 +23,17 @@ Here's a sample session using the :mod:`ftplib` module:: >>> from ftplib import FTP - >>> ftp = FTP('ftp.cwi.nl') # connect to host, default port - >>> ftp.login() # user anonymous, passwd anonymous@ - >>> ftp.retrlines('LIST') # list directory contents - total 24418 - drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 . - dr-xr-srwt 105 ftp-usr pdmaint 1536 Mar 21 14:32 .. - -rw-r--r-- 1 ftp-usr pdmaint 5305 Mar 20 09:48 INDEX - . - . - . + >>> ftp = FTP('ftp.debian.org') # connect to host, default port + >>> ftp.login() # user anonymous, passwd anonymous@ + '230 Login successful.' + >>> ftp.cwd('debian') # change into "debian" directory + >>> ftp.retrlines('LIST') # list directory contents + -rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README + ... + drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool + drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project + drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools + '226 Directory send OK.' >>> ftp.retrbinary('RETR README', open('README', 'wb').write) '226 Transfer complete.' >>> ftp.quit() @@ -387,7 +388,8 @@ .. method:: FTP_TLS.auth() - Set up secure control connection by using TLS or SSL, depending on what specified in :meth:`ssl_version` attribute. + Set up secure control connection by using TLS or SSL, depending on what + specified in :meth:`ssl_version` attribute. .. method:: FTP_TLS.prot_p() @@ -396,5 +398,3 @@ .. method:: FTP_TLS.prot_c() Set up clear text data connection. - - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:19:58 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:19:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTE3?= =?utf-8?q?7=3A_replace_dead_link_to_SSL/TLS_introduction_with_the_version?= =?utf-8?q?_from?= Message-ID: <3ct95V5Hlmz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/03e8ba26fb80 changeset: 86097:03e8ba26fb80 branch: 2.7 user: Georg Brandl date: Sun Oct 06 18:20:31 2013 +0200 summary: Closes #19177: replace dead link to SSL/TLS introduction with the version from Apache. files: Doc/library/ssl.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -641,10 +641,10 @@ .. seealso:: Class :class:`socket.socket` - Documentation of underlying :mod:`socket` class + Documentation of underlying :mod:`socket` class - `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ - Debby Koren + `SSL/TLS Strong Encryption: An Introduction `_ + Intro from the Apache webserver documentation `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:20:20 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:20:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTE3?= =?utf-8?q?7=3A_replace_dead_link_to_SSL/TLS_introduction_with_the_version?= =?utf-8?q?_from?= Message-ID: <3ct95w297zz7LkT@mail.python.org> http://hg.python.org/cpython/rev/9f3da04a0045 changeset: 86098:9f3da04a0045 branch: 3.3 parent: 86094:d41aab121366 user: Georg Brandl date: Sun Oct 06 18:20:31 2013 +0200 summary: Closes #19177: replace dead link to SSL/TLS introduction with the version from Apache. files: Doc/library/ssl.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1303,10 +1303,10 @@ .. seealso:: Class :class:`socket.socket` - Documentation of underlying :mod:`socket` class + Documentation of underlying :mod:`socket` class - `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ - Debby Koren + `SSL/TLS Strong Encryption: An Introduction `_ + Intro from the Apache webserver documentation `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:20:21 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:20:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct95x3vGpz7Lkb@mail.python.org> http://hg.python.org/cpython/rev/3b5150dea580 changeset: 86099:3b5150dea580 parent: 86095:bb027bd31bb7 parent: 86098:9f3da04a0045 user: Georg Brandl date: Sun Oct 06 18:20:39 2013 +0200 summary: merge with 3.3 files: Doc/library/ssl.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1469,10 +1469,10 @@ .. seealso:: Class :class:`socket.socket` - Documentation of underlying :mod:`socket` class + Documentation of underlying :mod:`socket` class - `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ - Debby Koren + `SSL/TLS Strong Encryption: An Introduction `_ + Intro from the Apache webserver documentation `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:26:00 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:26:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogVGhlICJGQVEiIGxp?= =?utf-8?q?nk_at_the_end_was_changed_to_a_Wikipedia_link=3B_reflect_that?= =?utf-8?q?=2E?= Message-ID: <3ct9DS07QfzQqb@mail.python.org> http://hg.python.org/cpython/rev/1f1e556fe06e changeset: 86100:1f1e556fe06e branch: 3.3 parent: 86098:9f3da04a0045 user: Georg Brandl date: Sun Oct 06 18:26:36 2013 +0200 summary: The "FAQ" link at the end was changed to a Wikipedia link; reflect that. files: Doc/library/hashlib.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -23,12 +23,14 @@ digests. The modern term is secure hash. .. note:: - If you want the adler32 or crc32 hash functions they are available in + + If you want the adler32 or crc32 hash functions, they are available in the :mod:`zlib` module. .. warning:: - Some algorithms have known hash collision weaknesses, see the FAQ at the end. + Some algorithms have known hash collision weaknesses, refer to the "See + also" section at the end. There is one constructor method named for each type of :dfn:`hash`. All return a hash object with the same simple interface. For example: use :func:`sha1` to -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:26:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:26:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct9DT20NLzRSK@mail.python.org> http://hg.python.org/cpython/rev/5822cc9671ed changeset: 86101:5822cc9671ed parent: 86099:3b5150dea580 parent: 86100:1f1e556fe06e user: Georg Brandl date: Sun Oct 06 18:26:43 2013 +0200 summary: merge with 3.3 files: Doc/library/hashlib.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -23,12 +23,14 @@ digests. The modern term is secure hash. .. note:: - If you want the adler32 or crc32 hash functions they are available in + + If you want the adler32 or crc32 hash functions, they are available in the :mod:`zlib` module. .. warning:: - Some algorithms have known hash collision weaknesses, see the FAQ at the end. + Some algorithms have known hash collision weaknesses, refer to the "See + also" section at the end. There is one constructor method named for each type of :dfn:`hash`. All return a hash object with the same simple interface. For example: use :func:`sha1` to -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:26:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:26:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogVGhlICJGQVEiIGxp?= =?utf-8?q?nk_at_the_end_was_changed_to_a_Wikipedia_link=3B_reflect_that?= =?utf-8?q?=2E?= Message-ID: <3ct9Dc6xmrz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/ae7485b87802 changeset: 86102:ae7485b87802 branch: 2.7 parent: 86097:03e8ba26fb80 user: Georg Brandl date: Sun Oct 06 18:26:36 2013 +0200 summary: The "FAQ" link at the end was changed to a Wikipedia link; reflect that. files: Doc/library/hashlib.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -25,12 +25,14 @@ modern term is secure hash. .. note:: - If you want the adler32 or crc32 hash functions they are available in + + If you want the adler32 or crc32 hash functions, they are available in the :mod:`zlib` module. .. warning:: - Some algorithms have known hash collision weaknesses, see the FAQ at the end. + Some algorithms have known hash collision weaknesses, refer to the "See + also" section at the end. There is one constructor method named for each type of :dfn:`hash`. All return a hash object with the same simple interface. For example: use :func:`sha1` to -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:36:48 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:36:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNzcy?= =?utf-8?q?5=3A_small_grammar_fix=2E?= Message-ID: <3ct9Sw1p3QzQLd@mail.python.org> http://hg.python.org/cpython/rev/8ce8eae6abfa changeset: 86103:8ce8eae6abfa branch: 3.3 parent: 86100:1f1e556fe06e user: Georg Brandl date: Sun Oct 06 18:36:34 2013 +0200 summary: Closes #17725: small grammar fix. files: Doc/extending/index.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/extending/index.rst b/Doc/extending/index.rst --- a/Doc/extending/index.rst +++ b/Doc/extending/index.rst @@ -5,12 +5,12 @@ ################################################## This document describes how to write modules in C or C++ to extend the Python -interpreter with new modules. Those modules can define new functions but also -new object types and their methods. The document also describes how to embed -the Python interpreter in another application, for use as an extension language. -Finally, it shows how to compile and link extension modules so that they can be -loaded dynamically (at run time) into the interpreter, if the underlying -operating system supports this feature. +interpreter with new modules. Those modules can not only define new functions +but also new object types and their methods. The document also describes how +to embed the Python interpreter in another application, for use as an extension +language. Finally, it shows how to compile and link extension modules so that +they can be loaded dynamically (at run time) into the interpreter, if the +underlying operating system supports this feature. This document assumes basic knowledge about Python. For an informal introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:36:49 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:36:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct9Sx3ksLz7LjT@mail.python.org> http://hg.python.org/cpython/rev/ec3b9977590a changeset: 86104:ec3b9977590a parent: 86101:5822cc9671ed parent: 86103:8ce8eae6abfa user: Georg Brandl date: Sun Oct 06 18:37:30 2013 +0200 summary: merge with 3.3 files: Doc/extending/index.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/extending/index.rst b/Doc/extending/index.rst --- a/Doc/extending/index.rst +++ b/Doc/extending/index.rst @@ -5,12 +5,12 @@ ################################################## This document describes how to write modules in C or C++ to extend the Python -interpreter with new modules. Those modules can define new functions but also -new object types and their methods. The document also describes how to embed -the Python interpreter in another application, for use as an extension language. -Finally, it shows how to compile and link extension modules so that they can be -loaded dynamically (at run time) into the interpreter, if the underlying -operating system supports this feature. +interpreter with new modules. Those modules can not only define new functions +but also new object types and their methods. The document also describes how +to embed the Python interpreter in another application, for use as an extension +language. Finally, it shows how to compile and link extension modules so that +they can be loaded dynamically (at run time) into the interpreter, if the +underlying operating system supports this feature. This document assumes basic knowledge about Python. For an informal introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:37:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:37:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNzcy?= =?utf-8?q?5=3A_small_grammar_fix=2E?= Message-ID: <3ct9TZ23wgzQLd@mail.python.org> http://hg.python.org/cpython/rev/27f1a3b0b340 changeset: 86105:27f1a3b0b340 branch: 2.7 parent: 86102:ae7485b87802 user: Georg Brandl date: Sun Oct 06 18:36:34 2013 +0200 summary: Closes #17725: small grammar fix. files: Doc/extending/index.rst | 12 ++++++------ Misc/ACKS | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Doc/extending/index.rst b/Doc/extending/index.rst --- a/Doc/extending/index.rst +++ b/Doc/extending/index.rst @@ -5,12 +5,12 @@ ################################################## This document describes how to write modules in C or C++ to extend the Python -interpreter with new modules. Those modules can define new functions but also -new object types and their methods. The document also describes how to embed -the Python interpreter in another application, for use as an extension language. -Finally, it shows how to compile and link extension modules so that they can be -loaded dynamically (at run time) into the interpreter, if the underlying -operating system supports this feature. +interpreter with new modules. Those modules can not only define new functions +but also new object types and their methods. The document also describes how +to embed the Python interpreter in another application, for use as an extension +language. Finally, it shows how to compile and link extension modules so that +they can be loaded dynamically (at run time) into the interpreter, if the +underlying operating system supports this feature. This document assumes basic knowledge about Python. For an informal introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index` diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -959,6 +959,7 @@ Kirill Simonov Nathan Paul Simons Guilherme Sim?es +Kyle Simpson Ravi Sinha Janne Sinkkonen Ng Pheng Siong -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:47:52 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:47:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNTIx?= =?utf-8?q?3=3A_update_comment_for_=5FPyOS=5FURandom?= Message-ID: <3ct9jh3clgzQsm@mail.python.org> http://hg.python.org/cpython/rev/3e5078c3784e changeset: 86106:3e5078c3784e branch: 2.7 user: Georg Brandl date: Sun Oct 06 18:43:19 2013 +0200 summary: Closes #15213: update comment for _PyOS_URandom files: Doc/library/os.rst | 5 +++-- Python/random.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2501,8 +2501,9 @@ This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation. On a UNIX-like - system this will query /dev/urandom, and on Windows it will use CryptGenRandom. - If a randomness source is not found, :exc:`NotImplementedError` will be raised. + system this will query ``/dev/urandom``, and on Windows it will use + ``CryptGenRandom()``. If a randomness source is not found, + :exc:`NotImplementedError` will be raised. For an easy-to-use interface to the random number generator provided by your platform, please see :class:`random.SystemRandom`. diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -224,8 +224,9 @@ } } -/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic - use, from the operating random number generator (RNG). +/* Fill buffer with size pseudo-random bytes from the operating system random + number generator (RNG). It is suitable for for most cryptographic purposes + except long living private keys for asymmetric encryption. Return 0 on success, raise an exception and return -1 on error. */ int -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:56:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:56:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNTIx?= =?utf-8?q?3=3A_update_comment_for_=5FPyOS=5FURandom?= Message-ID: <3ct9vV4gVfz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/176bb5a98463 changeset: 86107:176bb5a98463 branch: 3.3 parent: 86103:8ce8eae6abfa user: Georg Brandl date: Sun Oct 06 18:43:19 2013 +0200 summary: Closes #15213: update comment for _PyOS_URandom files: Doc/library/os.rst | 5 +++-- Python/random.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3306,8 +3306,9 @@ This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation. On a Unix-like - system this will query /dev/urandom, and on Windows it will use CryptGenRandom. - If a randomness source is not found, :exc:`NotImplementedError` will be raised. + system this will query ``/dev/urandom``, and on Windows it will use + ``CryptGenRandom()``. If a randomness source is not found, + :exc:`NotImplementedError` will be raised. For an easy-to-use interface to the random number generator provided by your platform, please see :class:`random.SystemRandom`. diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -224,8 +224,9 @@ } } -/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic - use, from the operating random number generator (RNG). +/* Fill buffer with size pseudo-random bytes from the operating system random + number generator (RNG). It is suitable for for most cryptographic purposes + except long living private keys for asymmetric encryption. Return 0 on success, raise an exception and return -1 on error. */ int -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:56:23 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:56:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct9vW6VNvzSdF@mail.python.org> http://hg.python.org/cpython/rev/b0295cc736d8 changeset: 86108:b0295cc736d8 parent: 86104:ec3b9977590a parent: 86107:176bb5a98463 user: Georg Brandl date: Sun Oct 06 18:48:30 2013 +0200 summary: merge with 3.3 files: Doc/library/os.rst | 5 +++-- Python/random.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3377,8 +3377,9 @@ This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation. On a Unix-like - system this will query /dev/urandom, and on Windows it will use CryptGenRandom. - If a randomness source is not found, :exc:`NotImplementedError` will be raised. + system this will query ``/dev/urandom``, and on Windows it will use + ``CryptGenRandom()``. If a randomness source is not found, + :exc:`NotImplementedError` will be raised. For an easy-to-use interface to the random number generator provided by your platform, please see :class:`random.SystemRandom`. diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -218,8 +218,9 @@ } } -/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic - use, from the operating random number generator (RNG). +/* Fill buffer with size pseudo-random bytes from the operating system random + number generator (RNG). It is suitable for for most cryptographic purposes + except long living private keys for asymmetric encryption. Return 0 on success, raise an exception and return -1 on error. */ int -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:56:25 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:56:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMTgw?= =?utf-8?q?7=3A_document_argparse_add=5Fsubparsers_method_better=2E?= Message-ID: <3ct9vY1C4pz7LjY@mail.python.org> http://hg.python.org/cpython/rev/b930b4e67c8a changeset: 86109:b930b4e67c8a branch: 3.3 parent: 86107:176bb5a98463 user: Georg Brandl date: Sun Oct 06 18:51:39 2013 +0200 summary: Closes #11807: document argparse add_subparsers method better. Patch by Filip Gruszczy?ski. files: Doc/library/argparse.rst | 29 +++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1452,7 +1452,10 @@ Sub-commands ^^^^^^^^^^^^ -.. method:: ArgumentParser.add_subparsers() +.. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ + [parser_class], [action], \ + [option_string], [dest], [help], \ + [metavar]) Many programs split up their functionality into a number of sub-commands, for example, the ``svn`` program can invoke sub-commands like ``svn @@ -1466,6 +1469,30 @@ command name and any :class:`ArgumentParser` constructor arguments, and returns an :class:`ArgumentParser` object that can be modified as usual. + Description of parameters: + + * title - title for the sub-parser group in help output; by default + "subcommands" if description is provided, otherwise uses title for + positional arguments + + * description - description for the sub-parser group in help output, by + default None + + * prog - usage information that will be displayed with sub-command help, + by default the name of the program and any positional arguments before the + subparser argument + + * parser_class - class which will be used to create sub-parser instances, by + default the class of the current parser (e.g. ArgumentParser) + + * dest - name of the attribute under which sub-command name will be + stored; by default None and no value is stored + + * help - help for sub-parser group in help output, by default None + + * metavar - string presenting available sub-commands in help; by default it + is None and presents sub-commands in form {cmd1, cmd2, ..} + Some example usage:: >>> # create the top-level parser -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:56:26 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:56:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct9vZ2z77z7Ljh@mail.python.org> http://hg.python.org/cpython/rev/ad8a5cf3a213 changeset: 86110:ad8a5cf3a213 parent: 86108:b0295cc736d8 parent: 86109:b930b4e67c8a user: Georg Brandl date: Sun Oct 06 18:57:02 2013 +0200 summary: merge with 3.3 files: Doc/library/argparse.rst | 29 +++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1452,7 +1452,10 @@ Sub-commands ^^^^^^^^^^^^ -.. method:: ArgumentParser.add_subparsers() +.. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ + [parser_class], [action], \ + [option_string], [dest], [help], \ + [metavar]) Many programs split up their functionality into a number of sub-commands, for example, the ``svn`` program can invoke sub-commands like ``svn @@ -1466,6 +1469,30 @@ command name and any :class:`ArgumentParser` constructor arguments, and returns an :class:`ArgumentParser` object that can be modified as usual. + Description of parameters: + + * title - title for the sub-parser group in help output; by default + "subcommands" if description is provided, otherwise uses title for + positional arguments + + * description - description for the sub-parser group in help output, by + default None + + * prog - usage information that will be displayed with sub-command help, + by default the name of the program and any positional arguments before the + subparser argument + + * parser_class - class which will be used to create sub-parser instances, by + default the class of the current parser (e.g. ArgumentParser) + + * dest - name of the attribute under which sub-command name will be + stored; by default None and no value is stored + + * help - help for sub-parser group in help output, by default None + + * metavar - string presenting available sub-commands in help; by default it + is None and presents sub-commands in form {cmd1, cmd2, ..} + Some example usage:: >>> # create the top-level parser -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:56:28 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:56:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMTgw?= =?utf-8?q?7=3A_document_argparse_add=5Fsubparsers_method_better=2E?= Message-ID: <3ct9vc6JLrzNyd@mail.python.org> http://hg.python.org/cpython/rev/d5027e489c25 changeset: 86111:d5027e489c25 branch: 2.7 parent: 86106:3e5078c3784e user: Georg Brandl date: Sun Oct 06 18:51:39 2013 +0200 summary: Closes #11807: document argparse add_subparsers method better. Patch by Filip Gruszczy?ski. files: Doc/library/argparse.rst | 29 +++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1432,7 +1432,10 @@ Sub-commands ^^^^^^^^^^^^ -.. method:: ArgumentParser.add_subparsers() +.. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ + [parser_class], [action], \ + [option_string], [dest], [help], \ + [metavar]) Many programs split up their functionality into a number of sub-commands, for example, the ``svn`` program can invoke sub-commands like ``svn @@ -1446,6 +1449,30 @@ command name and any :class:`ArgumentParser` constructor arguments, and returns an :class:`ArgumentParser` object that can be modified as usual. + Description of parameters: + + * title - title for the sub-parser group in help output; by default + "subcommands" if description is provided, otherwise uses title for + positional arguments + + * description - description for the sub-parser group in help output, by + default None + + * prog - usage information that will be displayed with sub-command help, + by default the name of the program and any positional arguments before the + subparser argument + + * parser_class - class which will be used to create sub-parser instances, by + default the class of the current parser (e.g. ArgumentParser) + + * dest - name of the attribute under which sub-command name will be + stored; by default None and no value is stored + + * help - help for sub-parser group in help output, by default None + + * metavar - string presenting available sub-commands in help; by default it + is None and presents sub-commands in form {cmd1, cmd2, ..} + Some example usage:: >>> # create the top-level parser -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:57:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:57:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNTIy?= =?utf-8?q?8=3A_remove_reference_to_Unix_=22touch=22=3B_it_is_confusing_si?= =?utf-8?q?nce_the_path?= Message-ID: <3ct9wf4GqFz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/62321359c35b changeset: 86112:62321359c35b branch: 3.3 parent: 86109:b930b4e67c8a user: Georg Brandl date: Sun Oct 06 18:57:49 2013 +0200 summary: Closes #15228: remove reference to Unix "touch"; it is confusing since the path needs to exist for os.utime() to succeed files: Doc/library/os.rst | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2104,8 +2104,6 @@ - If *times* and *ns* are both ``None``, this is equivalent to specifying ``ns=(atime_ns, mtime_ns)`` where both times are the current time. - (The effect is similar to running the Unix program - :program:`touch` on *path*.) It is an error to specify tuples for both *times* and *ns*. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 18:57:23 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 18:57:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ct9wg6622z7Ljg@mail.python.org> http://hg.python.org/cpython/rev/3dcc03489802 changeset: 86113:3dcc03489802 parent: 86110:ad8a5cf3a213 parent: 86112:62321359c35b user: Georg Brandl date: Sun Oct 06 18:58:03 2013 +0200 summary: merge with 3.3 files: Doc/library/os.rst | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2159,8 +2159,6 @@ - If *times* and *ns* are both ``None``, this is equivalent to specifying ``ns=(atime_ns, mtime_ns)`` where both times are the current time. - (The effect is similar to running the Unix program - :program:`touch` on *path*.) It is an error to specify tuples for both *times* and *ns*. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:01:19 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:01:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNTQz?= =?utf-8?q?2=3A_GzipFile_mtime_argument_was_added_in_2=2E7=2E?= Message-ID: <3ctB1C0gSXz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/74ae6064d3e8 changeset: 86114:74ae6064d3e8 branch: 2.7 parent: 86111:d5027e489c25 user: Georg Brandl date: Sun Oct 06 19:01:21 2013 +0200 summary: Closes #15432: GzipFile mtime argument was added in 2.7. files: Doc/library/gzip.rst | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -77,6 +77,9 @@ .. versionchanged:: 2.7 Support for zero-padded files was added. + .. versionadded:: 2.7 + The *mtime* argument. + .. function:: open(filename[, mode[, compresslevel]]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:01:30 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:01:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNTQz?= =?utf-8?q?2=3A_GzipFile_mtime_argument_is_new_in_3=2E1=2E?= Message-ID: <3ctB1Q5nBbz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/ad19a9982b03 changeset: 86115:ad19a9982b03 branch: 3.3 parent: 86112:62321359c35b user: Georg Brandl date: Sun Oct 06 19:02:08 2013 +0200 summary: Closes #15432: GzipFile mtime argument is new in 3.1. files: Doc/library/gzip.rst | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -116,13 +116,11 @@ .. versionadded:: 3.2 .. versionchanged:: 3.1 - Support for the :keyword:`with` statement was added. + Support for the :keyword:`with` statement was added, along with the + *mtime* argument. .. versionchanged:: 3.2 - Support for zero-padded files was added. - - .. versionchanged:: 3.2 - Support for unseekable files was added. + Support for zero-padded and unseekable files was added. .. versionchanged:: 3.3 The :meth:`io.BufferedIOBase.read1` method is now implemented. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:01:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:01:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctB1S0STWz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/49e9ae4df749 changeset: 86116:49e9ae4df749 parent: 86113:3dcc03489802 parent: 86115:ad19a9982b03 user: Georg Brandl date: Sun Oct 06 19:02:13 2013 +0200 summary: merge with 3.3 files: Doc/library/gzip.rst | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -116,13 +116,11 @@ .. versionadded:: 3.2 .. versionchanged:: 3.1 - Support for the :keyword:`with` statement was added. + Support for the :keyword:`with` statement was added, along with the + *mtime* argument. .. versionchanged:: 3.2 - Support for zero-padded files was added. - - .. versionchanged:: 3.2 - Support for unseekable files was added. + Support for zero-padded and unseekable files was added. .. versionchanged:: 3.3 The :meth:`io.BufferedIOBase.read1` method is now implemented. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:14:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:14:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_typo_in_fu?= =?utf-8?q?nction_name=2E?= Message-ID: <3ctBHv0hmcz7LjN@mail.python.org> http://hg.python.org/cpython/rev/ea9fe37518d8 changeset: 86117:ea9fe37518d8 branch: 3.3 parent: 86115:ad19a9982b03 user: Georg Brandl date: Sun Oct 06 19:14:35 2013 +0200 summary: Fix typo in function name. files: Doc/library/operator.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -267,7 +267,7 @@ return resolve_attr(obj, attr) else: def g(obj): - return tuple(resolve_att(obj, attr) for attr in items) + return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:14:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:14:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBHw2fH2z7LjY@mail.python.org> http://hg.python.org/cpython/rev/77e5df9c1899 changeset: 86118:77e5df9c1899 parent: 86116:49e9ae4df749 parent: 86117:ea9fe37518d8 user: Georg Brandl date: Sun Oct 06 19:14:46 2013 +0200 summary: merge with 3.3 files: Doc/library/operator.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -278,7 +278,7 @@ return resolve_attr(obj, attr) else: def g(obj): - return tuple(resolve_att(obj, attr) for attr in items) + return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:14:11 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:14:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_typo_in_fu?= =?utf-8?q?nction_name=2E?= Message-ID: <3ctBJ364HQz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/6b1319ee1bca changeset: 86119:6b1319ee1bca branch: 2.7 parent: 86114:74ae6064d3e8 user: Georg Brandl date: Sun Oct 06 19:14:35 2013 +0200 summary: Fix typo in function name. files: Doc/library/operator.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -514,7 +514,7 @@ return resolve_attr(obj, attr) else: def g(obj): - return tuple(resolve_att(obj, attr) for attr in items) + return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:18:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:18:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4OiB3aW4zMl92?= =?utf-8?q?er_returns_a_4-tuple=2E_Found_by_Andrew_Berg_on_docs=40=2E?= Message-ID: <3ctBPG5RRzz7LjN@mail.python.org> http://hg.python.org/cpython/rev/93595ab19262 changeset: 86120:93595ab19262 branch: 2.7 user: Georg Brandl date: Sun Oct 06 19:19:18 2013 +0200 summary: Fix: win32_ver returns a 4-tuple. Found by Andrew Berg on docs at . files: Doc/library/platform.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -197,8 +197,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level - (service pack) and OS type (multi/single processor). + ``(release, version, csd, ptype)`` referring to OS release, version number, + CSD level (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:19:10 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:19:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4OiB3aW4zMl92?= =?utf-8?q?er_returns_a_4-tuple=2E_Found_by_Andrew_Berg_on_docs=40=2E?= Message-ID: <3ctBPp2GD4z7LjN@mail.python.org> http://hg.python.org/cpython/rev/4ef84ad5ca74 changeset: 86121:4ef84ad5ca74 branch: 3.3 parent: 86117:ea9fe37518d8 user: Georg Brandl date: Sun Oct 06 19:19:18 2013 +0200 summary: Fix: win32_ver returns a 4-tuple. Found by Andrew Berg on docs at . files: Doc/library/platform.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -194,8 +194,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level - (service pack) and OS type (multi/single processor). + ``(release, version, csd, ptype)`` referring to OS release, version number, + CSD level (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:19:11 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:19:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBPq41Dlz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/30c7467ee5c8 changeset: 86122:30c7467ee5c8 parent: 86118:77e5df9c1899 parent: 86121:4ef84ad5ca74 user: Georg Brandl date: Sun Oct 06 19:19:26 2013 +0200 summary: merge with 3.3 files: Doc/library/platform.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -194,8 +194,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level - (service pack) and OS type (multi/single processor). + ``(release, version, csd, ptype)`` referring to OS release, version number, + CSD level (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:20:38 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:20:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_typo_in_ex?= =?utf-8?q?ample_file_name=2E_Found_by_John_Bokma_on_docs=40=2E?= Message-ID: <3ctBRV2KzQz7LjN@mail.python.org> http://hg.python.org/cpython/rev/bc12d18c6aa3 changeset: 86123:bc12d18c6aa3 branch: 2.7 parent: 86120:93595ab19262 user: Georg Brandl date: Sun Oct 06 19:21:14 2013 +0200 summary: Fix typo in example file name. Found by John Bokma on docs at . files: Doc/tutorial/modules.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -467,7 +467,7 @@ encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. Package authors may also decide not to support it, if they don't see a use for importing \* from their package. For -example, the file :file:`sounds/effects/__init__.py` could contain the following +example, the file :file:`sound/effects/__init__.py` could contain the following code:: __all__ = ["echo", "surround", "reverse"] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:21:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:21:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_typo_in_ex?= =?utf-8?q?ample_file_name=2E_Found_by_John_Bokma_on_docs=40=2E?= Message-ID: <3ctBS02XKXz7LjN@mail.python.org> http://hg.python.org/cpython/rev/b8f6a0357fc3 changeset: 86124:b8f6a0357fc3 branch: 3.3 parent: 86121:4ef84ad5ca74 user: Georg Brandl date: Sun Oct 06 19:21:14 2013 +0200 summary: Fix typo in example file name. Found by John Bokma on docs at . files: Doc/tutorial/modules.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -478,7 +478,7 @@ encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. Package authors may also decide not to support it, if they don't see a use for importing \* from their package. For -example, the file :file:`sounds/effects/__init__.py` could contain the following +example, the file :file:`sound/effects/__init__.py` could contain the following code:: __all__ = ["echo", "surround", "reverse"] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:21:05 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:21:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBS14NzTz7LjT@mail.python.org> http://hg.python.org/cpython/rev/c1070d71f323 changeset: 86125:c1070d71f323 parent: 86122:30c7467ee5c8 parent: 86124:b8f6a0357fc3 user: Georg Brandl date: Sun Oct 06 19:21:20 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/modules.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -477,7 +477,7 @@ encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. Package authors may also decide not to support it, if they don't see a use for importing \* from their package. For -example, the file :file:`sounds/effects/__init__.py` could contain the following +example, the file :file:`sound/effects/__init__.py` could contain the following code:: __all__ = ["echo", "surround", "reverse"] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:23:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:23:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4OiA+PSBhbmQg?= =?utf-8?q?so_on_are_usually_called_=22comparison_operators=22=2C_not_=22l?= =?utf-8?q?ogical?= Message-ID: <3ctBVr20d7z7LjN@mail.python.org> http://hg.python.org/cpython/rev/66ef63a77e9d changeset: 86126:66ef63a77e9d branch: 3.3 parent: 86124:b8f6a0357fc3 user: Georg Brandl date: Sun Oct 06 19:23:57 2013 +0200 summary: Fix: >= and so on are usually called "comparison operators", not "logical operators". Found by Tom Kalt on docs at . files: Doc/library/ipaddress.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -282,10 +282,10 @@ IPv6). -Logical operators -""""""""""""""""" +Comparison operators +"""""""""""""""""""" -Address objects can be compared with the usual set of logical operators. Some +Address objects can be compared with the usual set of comparison operators. Some examples:: >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:23:33 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:23:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBVs3plqz7LjY@mail.python.org> http://hg.python.org/cpython/rev/a3d09c19bb93 changeset: 86127:a3d09c19bb93 parent: 86125:c1070d71f323 parent: 86126:66ef63a77e9d user: Georg Brandl date: Sun Oct 06 19:24:00 2013 +0200 summary: merge with 3.3 files: Doc/library/ipaddress.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -282,10 +282,10 @@ IPv6). -Logical operators -""""""""""""""""" +Comparison operators +"""""""""""""""""""" -Address objects can be compared with the usual set of logical operators. Some +Address objects can be compared with the usual set of comparison operators. Some examples:: >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:26:35 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:26:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_name_of_th?= =?utf-8?q?e_=22exist=5Fok=22_argument=2E_Found_by_Neil_Bushong_on_docs=40?= =?utf-8?q?=2E?= Message-ID: <3ctBZM07Xvz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/7caae256dff6 changeset: 86128:7caae256dff6 branch: 3.3 parent: 86126:66ef63a77e9d user: Georg Brandl date: Sun Oct 06 19:27:13 2013 +0200 summary: Fix name of the "exist_ok" argument. Found by Neil Bushong on docs at . files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1557,8 +1557,8 @@ The default *mode* is ``0o777`` (octal). On some systems, *mode* is ignored. Where it is used, the current umask value is first masked out. - If *exists_ok* is ``False`` (the default), an :exc:`OSError` is raised if - the target directory already exists. If *exists_ok* is ``True`` an + If *exist_ok* is ``False`` (the default), an :exc:`OSError` is raised if + the target directory already exists. If *exist_ok* is ``True`` an :exc:`OSError` is still raised if the umask-masked *mode* is different from the existing mode, on systems where the mode is used. :exc:`OSError` will also be raised if the directory creation fails. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:26:36 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:26:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBZN1qdNz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/aac01a983952 changeset: 86129:aac01a983952 parent: 86127:a3d09c19bb93 parent: 86128:7caae256dff6 user: Georg Brandl date: Sun Oct 06 19:27:17 2013 +0200 summary: merge with 3.3 files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1612,8 +1612,8 @@ The default *mode* is ``0o777`` (octal). On some systems, *mode* is ignored. Where it is used, the current umask value is first masked out. - If *exists_ok* is ``False`` (the default), an :exc:`OSError` is raised if - the target directory already exists. If *exists_ok* is ``True`` an + If *exist_ok* is ``False`` (the default), an :exc:`OSError` is raised if + the target directory already exists. If *exist_ok* is ``True`` an :exc:`OSError` is still raised if the umask-masked *mode* is different from the existing mode, on systems where the mode is used. :exc:`OSError` will also be raised if the directory creation fails. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:33:35 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:33:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Use_the_platfo?= =?utf-8?q?rm-independent_way_of_calling_a_script_from_the_shell=3A_=22pyt?= =?utf-8?q?hon?= Message-ID: <3ctBkR2Wtbz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/2b8056647477 changeset: 86130:2b8056647477 branch: 3.3 parent: 86128:7caae256dff6 user: Georg Brandl date: Sun Oct 06 19:33:56 2013 +0200 summary: Use the platform-independent way of calling a script from the shell: "python prog.py", not "prog.py" Found by Micheal Wells on docs at . files: Doc/library/argparse.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -46,7 +46,7 @@ Assuming the Python code above is saved into a file called ``prog.py``, it can be run at the command line and provides useful help messages:: - $ prog.py -h + $ python prog.py -h usage: prog.py [-h] [--sum] N [N ...] Process some integers. @@ -61,15 +61,15 @@ When run with the appropriate arguments, it prints either the sum or the max of the command-line integers:: - $ prog.py 1 2 3 4 + $ python prog.py 1 2 3 4 4 - $ prog.py 1 2 3 4 --sum + $ python prog.py 1 2 3 4 --sum 10 If invalid arguments are passed in, it will issue an error:: - $ prog.py a b c + $ python prog.py a b c usage: prog.py [-h] [--sum] N [N ...] prog.py: error: argument N: invalid int value: 'a' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:33:36 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:33:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctBkS4KQ3z7LjZ@mail.python.org> http://hg.python.org/cpython/rev/aeb7a5b3e617 changeset: 86131:aeb7a5b3e617 parent: 86129:aac01a983952 parent: 86130:2b8056647477 user: Georg Brandl date: Sun Oct 06 19:34:19 2013 +0200 summary: merge with 3.3 files: Doc/library/argparse.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -46,7 +46,7 @@ Assuming the Python code above is saved into a file called ``prog.py``, it can be run at the command line and provides useful help messages:: - $ prog.py -h + $ python prog.py -h usage: prog.py [-h] [--sum] N [N ...] Process some integers. @@ -61,15 +61,15 @@ When run with the appropriate arguments, it prints either the sum or the max of the command-line integers:: - $ prog.py 1 2 3 4 + $ python prog.py 1 2 3 4 4 - $ prog.py 1 2 3 4 --sum + $ python prog.py 1 2 3 4 --sum 10 If invalid arguments are passed in, it will issue an error:: - $ prog.py a b c + $ python prog.py a b c usage: prog.py [-h] [--sum] N [N ...] prog.py: error: argument N: invalid int value: 'a' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:33:43 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 19:33:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Use_the_platfo?= =?utf-8?q?rm-independent_way_of_calling_a_script_from_the_shell=3A_=22pyt?= =?utf-8?q?hon?= Message-ID: <3ctBkb4vfXz7LkC@mail.python.org> http://hg.python.org/cpython/rev/9524e1468913 changeset: 86132:9524e1468913 branch: 2.7 parent: 86123:bc12d18c6aa3 user: Georg Brandl date: Sun Oct 06 19:33:56 2013 +0200 summary: Use the platform-independent way of calling a script from the shell: "python prog.py", not "prog.py" Found by Micheal Wells on docs at . files: Doc/library/argparse.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -46,7 +46,7 @@ Assuming the Python code above is saved into a file called ``prog.py``, it can be run at the command line and provides useful help messages:: - $ prog.py -h + $ python prog.py -h usage: prog.py [-h] [--sum] N [N ...] Process some integers. @@ -61,15 +61,15 @@ When run with the appropriate arguments, it prints either the sum or the max of the command-line integers:: - $ prog.py 1 2 3 4 + $ python prog.py 1 2 3 4 4 - $ prog.py 1 2 3 4 --sum + $ python prog.py 1 2 3 4 --sum 10 If invalid arguments are passed in, it will issue an error:: - $ prog.py a b c + $ python prog.py a b c usage: prog.py [-h] [--sum] N [N ...] prog.py: error: argument N: invalid int value: 'a' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 19:36:11 2013 From: python-checkins at python.org (vinay.sajip) Date: Sun, 6 Oct 2013 19:36:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319182=3A_Fixed_so?= =?utf-8?q?cket_leak_on_exception_when_connecting=2E?= Message-ID: <3ctBnR5xqFzS9B@mail.python.org> http://hg.python.org/cpython/rev/bd314db5532d changeset: 86133:bd314db5532d parent: 86131:aeb7a5b3e617 user: Vinay Sajip date: Sun Oct 06 18:36:00 2013 +0100 summary: Issue #19182: Fixed socket leak on exception when connecting. files: Lib/logging/handlers.py | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -518,7 +518,11 @@ else: result = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) result.settimeout(timeout) - result.connect(self.address) + try: + result.connect(self.address) + except OSError: + result.close() # Issue 19182 + raise return result def createSocket(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 20:45:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 20:45:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Extending_exam?= =?utf-8?q?ple=3A_use_Py=5FRETURN=5FNONE?= Message-ID: <3ctDKS2bS4zSdF@mail.python.org> http://hg.python.org/cpython/rev/8410d2441e0f changeset: 86134:8410d2441e0f branch: 3.3 parent: 86130:2b8056647477 user: Georg Brandl date: Sun Oct 06 20:46:08 2013 +0200 summary: Extending example: use Py_RETURN_NONE files: Doc/extending/extending.rst | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -719,9 +719,7 @@ action, voltage); printf("-- Lovely plumage, the %s -- It's %s!\n", type, state); - Py_INCREF(Py_None); - - return Py_None; + Py_RETURN_NONE; } static PyMethodDef keywdarg_methods[] = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 20:45:33 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 20:45:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctDKT4Rt1zSrn@mail.python.org> http://hg.python.org/cpython/rev/65cdd8f90df6 changeset: 86135:65cdd8f90df6 parent: 86133:bd314db5532d parent: 86134:8410d2441e0f user: Georg Brandl date: Sun Oct 06 20:46:15 2013 +0200 summary: merge with 3.3 files: Doc/extending/extending.rst | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -719,9 +719,7 @@ action, voltage); printf("-- Lovely plumage, the %s -- It's %s!\n", type, state); - Py_INCREF(Py_None); - - return Py_None; + Py_RETURN_NONE; } static PyMethodDef keywdarg_methods[] = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 21:22:43 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 21:22:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMjE1?= =?utf-8?q?=3A_document_better_why_it_is_not_a_good_idea_to_catch_e=2Eg=2E?= =?utf-8?q?_SIGSEGV?= Message-ID: <3ctF8M5ldXz7LjR@mail.python.org> http://hg.python.org/cpython/rev/b4444d16e333 changeset: 86136:b4444d16e333 branch: 3.3 parent: 86134:8410d2441e0f user: Georg Brandl date: Sun Oct 06 21:22:42 2013 +0200 summary: Closes #1215: document better why it is not a good idea to catch e.g. SIGSEGV and refer to faulthandler. Patch by Martin Pool. files: Doc/library/signal.rst | 6 +++++- Misc/ACKS | 1 + 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -36,7 +36,11 @@ This has consequences: * It makes little sense to catch synchronous errors like :const:`SIGFPE` or - :const:`SIGSEGV`. + :const:`SIGSEGV` that are caused by an invalid operation in C code. Python + will return from the signal handler to the C code, which is likely to raise + the same signal again, causing Python to apparently hang. From Python 3.3 + onwards, you can use the :mod:`faulthandler` module to report on synchronous + errors. * A long-running calculation implemented purely in C (such as regular expression matching on a large body of text) may run uninterrupted for an diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -974,6 +974,7 @@ Remi Pointel Guilherme Polo Michael Pomraning +Martin Pool Iustin Pop Claudiu Popa John Popplewell -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 21:22:45 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 6 Oct 2013 21:22:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3ctF8P0LhWz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/195929d3e5ba changeset: 86137:195929d3e5ba parent: 86135:65cdd8f90df6 parent: 86136:b4444d16e333 user: Georg Brandl date: Sun Oct 06 21:23:26 2013 +0200 summary: merge with 3.3 files: Doc/library/signal.rst | 6 +++++- Misc/ACKS | 1 + 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -36,7 +36,11 @@ This has consequences: * It makes little sense to catch synchronous errors like :const:`SIGFPE` or - :const:`SIGSEGV`. + :const:`SIGSEGV` that are caused by an invalid operation in C code. Python + will return from the signal handler to the C code, which is likely to raise + the same signal again, causing Python to apparently hang. From Python 3.3 + onwards, you can use the :mod:`faulthandler` module to report on synchronous + errors. * A long-running calculation implemented purely in C (such as regular expression matching on a large body of text) may run uninterrupted for an diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1011,6 +1011,7 @@ Guilherme Polo Illia Polosukhin Michael Pomraning +Martin Pool Iustin Pop Claudiu Popa John Popplewell -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 22:52:50 2013 From: python-checkins at python.org (victor.stinner) Date: Sun, 6 Oct 2013 22:52:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_test=5Fimport=2Etest=5Fmod?= =?utf-8?q?ule=5Fwith=5Flarge=5Fstack=28=29=3A_unload_the_test_module?= Message-ID: <3ctH8L5rhRzSdF@mail.python.org> http://hg.python.org/cpython/rev/a008c3c8d41a changeset: 86138:a008c3c8d41a user: Victor Stinner date: Sun Oct 06 22:52:37 2013 +0200 summary: test_import.test_module_with_large_stack(): unload the test module Ensure that the module is unloaded to be able to run the test more than once, and to not leak memory. files: Lib/test/test_import.py | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -149,16 +149,24 @@ sys.path.append('') importlib.invalidate_caches() + namespace = {} try: make_legacy_pyc(filename) # This used to crash. - exec('import ' + module) + exec('import ' + module, None, namespace) finally: # Cleanup. del sys.path[-1] unlink(filename + 'c') unlink(filename + 'o') + # Remove references to the module (unload the module) + namespace.clear() + try: + del sys.modules[module] + except KeyError: + pass + def test_failing_import_sticks(self): source = TESTFN + ".py" with open(source, "w") as f: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 6 23:20:36 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 6 Oct 2013 23:20:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_references_to_other_langu?= =?utf-8?q?ages?= Message-ID: <3ctHmN5vLdzSrn@mail.python.org> http://hg.python.org/peps/rev/6c5fdafff09e changeset: 5173:6c5fdafff09e user: Antoine Pitrou date: Sun Oct 06 23:20:32 2013 +0200 summary: Add references to other languages files: pep-0455.txt | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/pep-0455.txt b/pep-0455.txt --- a/pep-0455.txt +++ b/pep-0455.txt @@ -228,6 +228,34 @@ memoization, for example ``pickle``, ``json``, ``copy``, ``cProfile``, ``doctest`` and ``_threading_local``. +Other languages +--------------- + +C# / .Net +^^^^^^^^^ + +.Net has a generic ``Dictionary`` class where you can specify a custom +``IEqualityComparer``: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx + +Using it is the recommended way to write case-insensitive dictionaries: +http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dictionary + +Java +^^^^ + +Java has a specialized ``CaseInsensitiveMap``: +http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/CaseInsensitiveMap.html + +It also has a separate ``IdentityHashMap``: +http://docs.oracle.com/javase/6/docs/api/java/util/IdentityHashMap.html + +C++ +^^^ + +The C++ Standard Template Library features an ``unordered_map`` +with customizable hash and equality functions: +http://www.cplusplus.com/reference/unordered_map/unordered_map/ + Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Oct 7 02:20:07 2013 From: python-checkins at python.org (ethan.furman) Date: Mon, 7 Oct 2013 02:20:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319156=3A_add_test?= =?utf-8?q?s_and_fix_for_Enum_helper_edge_cases=2E__Patch_from_CliffM=2E?= Message-ID: <3ctMlW5QCJz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/516576f5f9dc changeset: 86139:516576f5f9dc user: Ethan Furman date: Sun Oct 06 17:19:54 2013 -0700 summary: Close #19156: add tests and fix for Enum helper edge cases. Patch from CliffM. files: Lib/enum.py | 6 ++++-- Lib/test/test_enum.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py --- a/Lib/enum.py +++ b/Lib/enum.py @@ -17,14 +17,16 @@ """Returns True if a __dunder__ name, False otherwise.""" return (name[:2] == name[-2:] == '__' and name[2:3] != '_' and - name[-3:-2] != '_') + name[-3:-2] != '_' and + len(name) > 4) def _is_sunder(name): """Returns True if a _sunder_ name, False otherwise.""" return (name[0] == name[-1] == '_' and name[1:2] != '_' and - name[-2:-1] != '_') + name[-2:-1] != '_' and + len(name) > 2) def _make_class_unpicklable(cls): diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -58,6 +58,35 @@ except Exception: pass + +class TestHelpers(unittest.TestCase): + # _is_descriptor, _is_sunder, _is_dunder + + def test_is_descriptor(self): + class foo: + pass + for attr in ('__get__','__set__','__delete__'): + obj = foo() + self.assertFalse(enum._is_descriptor(obj)) + setattr(obj, attr, 1) + self.assertTrue(enum._is_descriptor(obj)) + + def test_is_sunder(self): + for s in ('_a_', '_aa_'): + self.assertTrue(enum._is_sunder(s)) + + for s in ('a', 'a_', '_a', '__a', 'a__', '__a__', '_a__', '__a_', '_', + '__', '___', '____', '_____',): + self.assertFalse(enum._is_sunder(s)) + + def test_is_dunder(self): + for s in ('__a__', '__aa__'): + self.assertTrue(enum._is_dunder(s)) + for s in ('a', 'a_', '_a', '__a', 'a__', '_a_', '_a__', '__a_', '_', + '__', '___', '____', '_____',): + self.assertFalse(enum._is_dunder(s)) + + class TestEnum(unittest.TestCase): def setUp(self): class Season(Enum): -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 7 07:04:45 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 07 Oct 2013 07:04:45 +0200 Subject: [Python-checkins] Daily reference leaks (516576f5f9dc): sum=-4 Message-ID: results for 516576f5f9dc on branch "default" -------------------------------------------- test_imp leaked [-1, 0, 1] references, sum=0 test_site leaked [0, -2, 0] references, sum=-2 test_site leaked [0, -2, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogffKn2G', '-x'] From python-checkins at python.org Mon Oct 7 15:20:54 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 7 Oct 2013 15:20:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Make_Nick_BDFG_delegate?= Message-ID: <3ctj4Q3qx2z7LjY@mail.python.org> http://hg.python.org/peps/rev/c960bed22bf6 changeset: 5174:c960bed22bf6 parent: 5172:2781d7bad1d6 user: Christian Heimes date: Mon Oct 07 15:20:25 2013 +0200 summary: Make Nick BDFG delegate add string length distribution add http://bugs.python.org/issue19183 files: pep-0456.txt | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -3,6 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Christian Heimes +BDFL-Delegate: Nick Coghlan Status: Draft Type: Standards Track Content-Type: text/x-rst @@ -461,10 +462,17 @@ It's yet unknown how the new distribution of hash values affects collisions of common keys in dicts of Python classes. +Typical length +-------------- + Serhiy Storchaka has shown in [issue16427]_ that a modified FNV implementation with 64 bits per cycle is able to process long strings several times faster than the current FNV implementation. +However according to statistics [issue19183]_ a typical Python program as +well as the Python test suite have a hash ratio of about 50% small strings +between 1 and 6 bytes. Only 5% of the strings are larger than 16 bytes. + Grand Unified Python Benchmark Suite ------------------------------------ @@ -526,6 +534,8 @@ Reference ========= +* Issue 19183 [issue19183]_ contains a reference implementation. + .. [29c3] http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html .. [fnv] http://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function @@ -544,6 +554,8 @@ .. [issue16427] http://bugs.python.org/issue16427 +.. [issue19183] http://bugs.python.org/issue19183 + .. [trie] http://en.wikipedia.org/wiki/Trie .. [city] http://code.google.com/p/cityhash/ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Oct 7 15:20:55 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 7 Oct 2013 15:20:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps_=28merge_default_-=3E_default=29?= =?utf-8?q?=3A_merge?= Message-ID: <3ctj4R6LNTz7Ljr@mail.python.org> http://hg.python.org/peps/rev/0939b63616e5 changeset: 5175:0939b63616e5 parent: 5174:c960bed22bf6 parent: 5173:6c5fdafff09e user: Christian Heimes date: Mon Oct 07 15:20:46 2013 +0200 summary: merge files: pep-0455.txt | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/pep-0455.txt b/pep-0455.txt --- a/pep-0455.txt +++ b/pep-0455.txt @@ -228,6 +228,34 @@ memoization, for example ``pickle``, ``json``, ``copy``, ``cProfile``, ``doctest`` and ``_threading_local``. +Other languages +--------------- + +C# / .Net +^^^^^^^^^ + +.Net has a generic ``Dictionary`` class where you can specify a custom +``IEqualityComparer``: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx + +Using it is the recommended way to write case-insensitive dictionaries: +http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dictionary + +Java +^^^^ + +Java has a specialized ``CaseInsensitiveMap``: +http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/CaseInsensitiveMap.html + +It also has a separate ``IdentityHashMap``: +http://docs.oracle.com/javase/6/docs/api/java/util/IdentityHashMap.html + +C++ +^^^ + +The C++ Standard Template Library features an ``unordered_map`` +with customizable hash and equality functions: +http://www.cplusplus.com/reference/unordered_map/unordered_map/ + Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Oct 7 19:06:32 2013 From: python-checkins at python.org (eric.snow) Date: Mon, 7 Oct 2013 19:06:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Clarify_the_meaning_of_=22nam?= =?utf-8?b?ZSIu?= Message-ID: <3ctp4m1NMHz7LjQ@mail.python.org> http://hg.python.org/peps/rev/ea7bbfa3b2a6 changeset: 5176:ea7bbfa3b2a6 user: Eric Snow date: Mon Oct 07 11:01:48 2013 -0600 summary: Clarify the meaning of "name". files: pep-0451.txt | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -37,6 +37,13 @@ detailed explanation of the import system is found at [import_system_docs]_. +name +---- + +In this proposal, a module's "name" refers to its fully-qualified name, +meaning the fully-qualified name of the module's parent (if any) joined +to the simple name of the module by a period. + finder ------ @@ -240,7 +247,7 @@ Attributes: -* name - a string for the name of the module. +* name - a string for the fully-qualified name of the module. * loader - the loader to use for loading. * origin - the name of the place from which the module is loaded, e.g. "builtin" for built-in modules and the filename for modules @@ -251,8 +258,8 @@ during loading. * cached (property) - a string for where the compiled module should be stored. -* parent (RO-property) - the name of the package to which the module - belongs as a submodule (or None). +* parent (RO-property) - the fully-qualified name of the package to + which the module belongs as a submodule (or None). * has_location (RO-property) - a flag indicating whether or not the module's "origin" attribute refers to a location. @@ -547,7 +554,7 @@ The name of the corresponding module attribute, ``__path__``, is relatively ambiguous. Instead of mirroring it, we use a more explicit -name that makes the purpose clear. +attribute name that makes the purpose clear. **loader_state** -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Oct 7 20:41:31 2013 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 7 Oct 2013 20:41:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_macro_expa?= =?utf-8?q?nsion_of_=5FPyErr=5FOCCURRED=28=29=2C_and_make_sure_to_use_it_i?= =?utf-8?q?n_at_least?= Message-ID: <3ctrBM3gCZz7LjT@mail.python.org> http://hg.python.org/cpython/rev/2aee9c41bb79 changeset: 86140:2aee9c41bb79 branch: 3.3 parent: 86136:b4444d16e333 user: Antoine Pitrou date: Mon Oct 07 20:38:51 2013 +0200 summary: Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. files: Include/pyerrors.h | 2 +- Misc/NEWS | 3 +++ Python/ceval.c | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Include/pyerrors.h b/Include/pyerrors.h --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -100,7 +100,7 @@ #if defined(Py_DEBUG) || defined(Py_LIMITED_API) #define _PyErr_OCCURRED() PyErr_Occurred() #else -#define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) +#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) #endif /* Error testing and normalization */ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at + least one place so as to avoid regressions. + - Issue #19014: memoryview.cast() is now allowed on zero-length views. - Issue #19098: Prevent overflow in the compiler when the recursion limit is set diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2083,7 +2083,7 @@ } else { x = PyObject_GetItem(v, w); - if (x == NULL && PyErr_Occurred()) { + if (x == NULL && _PyErr_OCCURRED()) { if (!PyErr_ExceptionMatches( PyExc_KeyError)) break; @@ -2127,7 +2127,7 @@ (PyDictObject *)f->f_builtins, w); if (x == NULL) { - if (!PyErr_Occurred()) + if (!_PyErr_OCCURRED()) format_exc_check_arg(PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w); break; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 7 20:41:32 2013 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 7 Oct 2013 20:41:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Fix_macro_expansion_of_=5FPyErr=5FOCCURRED=28=29=2C_and_?= =?utf-8?q?make_sure_to_use_it_in_at_least?= Message-ID: <3ctrBN5m0Jz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/19954e5dbef5 changeset: 86141:19954e5dbef5 parent: 86139:516576f5f9dc parent: 86140:2aee9c41bb79 user: Antoine Pitrou date: Mon Oct 07 20:40:59 2013 +0200 summary: Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. files: Include/pyerrors.h | 2 +- Misc/NEWS | 3 +++ Python/ceval.c | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Include/pyerrors.h b/Include/pyerrors.h --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -101,7 +101,7 @@ #if defined(Py_DEBUG) || defined(Py_LIMITED_API) #define _PyErr_OCCURRED() PyErr_Occurred() #else -#define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) +#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) #endif /* Error testing and normalization */ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at + least one place so as to avoid regressions. + - Issue #19087: Improve bytearray allocation in order to allow cheap popping of data at the front (slice deletion). diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2162,7 +2162,7 @@ } else { v = PyObject_GetItem(locals, name); - if (v == NULL && PyErr_Occurred()) { + if (v == NULL && _PyErr_OCCURRED()) { if (!PyErr_ExceptionMatches(PyExc_KeyError)) goto error; PyErr_Clear(); @@ -2207,7 +2207,7 @@ (PyDictObject *)f->f_builtins, name); if (v == NULL) { - if (!PyErr_Occurred()) + if (!_PyErr_OCCURRED()) format_exc_check_arg(PyExc_NameError, NAME_ERROR_MSG, name); goto error; -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 8 07:06:18 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 08 Oct 2013 07:06:18 +0200 Subject: [Python-checkins] Daily reference leaks (19954e5dbef5): sum=0 Message-ID: results for 19954e5dbef5 on branch "default" -------------------------------------------- test_imp leaked [-1, 0, 1] references, sum=0 test_site leaked [2, 0, -2] references, sum=0 test_site leaked [2, 0, -2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogfkKTA0', '-x'] From python-checkins at python.org Tue Oct 8 08:05:44 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 08:05:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTE3?= =?utf-8?q?8=3A_backport_entries_for_=22module=22_and_=22package=22_from_3?= =?utf-8?q?=2Ex_glossary=2E?= Message-ID: <3cv7Mr3wKVz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/5e1f359d54c4 changeset: 86142:5e1f359d54c4 branch: 2.7 parent: 86132:9524e1468913 user: Georg Brandl date: Tue Oct 08 08:05:33 2013 +0200 summary: Closes #19178: backport entries for "module" and "package" from 3.x glossary. Patch by Berker Peksag. files: Doc/glossary.rst | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -365,6 +365,10 @@ fraction. Integer division can be forced by using the ``//`` operator instead of the ``/`` operator. See also :term:`__future__`. + importing + The process by which Python code in one module is made available to + Python code in another module. + importer An object that both finds and loads a module; both a :term:`finder` and :term:`loader` object. @@ -509,6 +513,13 @@ for a member during lookup. See `The Python 2.3 Method Resolution Order `_. + module + An object that serves as an organizational unit of Python code. Modules + have a namespace containing arbitrary Python objects. Modules are loaded + into Python by the process of :term:`importing`. + + See also :term:`package`. + MRO See :term:`method resolution order`. @@ -562,6 +573,11 @@ (methods). Also the ultimate base class of any :term:`new-style class`. + package + A Python :term:`module` which can contain submodules or recursively, + subpackages. Technically, a package is a Python module with an + ``__path__`` attribute. + parameter A named entity in a :term:`function` (or method) definition that specifies an :term:`argument` (or in some cases, arguments) that the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 08:05:45 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 08:05:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTE3?= =?utf-8?q?8=3A_some_more_cross-references_about_packages_in_glossary=2E_P?= =?utf-8?q?atch_by?= Message-ID: <3cv7Ms5kJ8z7Lk9@mail.python.org> http://hg.python.org/cpython/rev/b6205505e1e4 changeset: 86143:b6205505e1e4 branch: 3.3 parent: 86140:2aee9c41bb79 user: Georg Brandl date: Tue Oct 08 08:06:18 2013 +0200 summary: Closes #19178: some more cross-references about packages in glossary. Patch by Berker Peksag. files: Doc/glossary.rst | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -520,6 +520,8 @@ have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of :term:`importing`. + See also :term:`package`. + MRO See :term:`method resolution order`. @@ -558,6 +560,8 @@ and specifically are not like a :term:`regular package` because they have no ``__init__.py`` file. + See also :term:`module`. + nested scope The ability to refer to a variable in an enclosing definition. For instance, a function defined inside another function can refer to @@ -579,10 +583,12 @@ class`. package - A Python module which can contain submodules or recursively, + A Python :term:`module` which can contain submodules or recursively, subpackages. Technically, a package is a Python module with an ``__path__`` attribute. + See also :term:`regular package` and :term:`namespace package`. + parameter A named entity in a :term:`function` (or method) definition that specifies an :term:`argument` (or in some cases, arguments) that the @@ -728,6 +734,8 @@ A traditional :term:`package`, such as a directory containing an ``__init__.py`` file. + See also :term:`namespace package`. + __slots__ A declaration inside a class that saves memory by pre-declaring space for instance attributes and eliminating instance dictionaries. Though -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 08:05:47 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 08:05:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cv7Mv0hhHz7Lkf@mail.python.org> http://hg.python.org/cpython/rev/0f6133498def changeset: 86144:0f6133498def parent: 86141:19954e5dbef5 parent: 86143:b6205505e1e4 user: Georg Brandl date: Tue Oct 08 08:06:27 2013 +0200 summary: merge with 3.3 files: Doc/glossary.rst | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -529,6 +529,8 @@ have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of :term:`importing`. + See also :term:`package`. + MRO See :term:`method resolution order`. @@ -567,6 +569,8 @@ and specifically are not like a :term:`regular package` because they have no ``__init__.py`` file. + See also :term:`module`. + nested scope The ability to refer to a variable in an enclosing definition. For instance, a function defined inside another function can refer to @@ -588,10 +592,12 @@ class`. package - A Python module which can contain submodules or recursively, + A Python :term:`module` which can contain submodules or recursively, subpackages. Technically, a package is a Python module with an ``__path__`` attribute. + See also :term:`regular package` and :term:`namespace package`. + parameter A named entity in a :term:`function` (or method) definition that specifies an :term:`argument` (or in some cases, arguments) that the @@ -737,6 +743,8 @@ A traditional :term:`package`, such as a directory containing an ``__init__.py`` file. + See also :term:`namespace package`. + __slots__ A declaration inside a class that saves memory by pre-declaring space for instance attributes and eliminating instance dictionaries. Though -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 15:32:59 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 15:32:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_456=3A_typo_and_grammar_f?= =?utf-8?q?ixes=2E?= Message-ID: <3cvKHv0llTz7LjS@mail.python.org> http://hg.python.org/peps/rev/784562675896 changeset: 5177:784562675896 user: gbrandl date: Tue Oct 08 15:32:43 2013 +0200 summary: PEP 456: typo and grammar fixes. files: pep-0456.txt | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pep-0456.txt b/pep-0456.txt --- a/pep-0456.txt +++ b/pep-0456.txt @@ -426,7 +426,7 @@ ``generic_hash`` acts as a wrapper around ``_Py_HashBytes`` for the tp_hash slots of date, time and datetime types. timedelta objects are hashed by their state (days, seconds, microseconds) and tzinfo objects are not hashable. The -data members of date, time and datetime types' struct are not void* aligned. +data members of date, time and datetime types' struct are not ``void*`` aligned. This can easily by fixed with memcpy()ing four to ten bytes to an aligned buffer. @@ -444,7 +444,7 @@ for ASCII string and ASCII bytes. Equal hash values result in a hash collision and therefore cause a minor speed penalty for dicts and sets with mixed keys. -The cause of the collision could be removed by e.g. subtraction ``-2`` from +The cause of the collision could be removed by e.g. subtracting ``2`` from the hash value of bytes. (``-2`` because ``hash(b"") == 0`` and ``-1`` is reserved.) @@ -455,8 +455,8 @@ TBD First tests suggest that SipHash performs a bit faster on 64-bit CPUs when -it is feed with medium size byte strings as well as ASCII and UCS2 Unicode -strings. For very short strings the setup costs for SipHash dominates its +it is fed with medium size byte strings as well as ASCII and UCS2 Unicode +strings. For very short strings the setup cost for SipHash dominates its speed but it is still in the same order of magnitude as the current FNV code. It's yet unknown how the new distribution of hash values affects collisions @@ -491,26 +491,26 @@ The modifications don't alter any existing API. -The output of `hash()` for strings and bytes are going to be different. The +The output of ``hash()`` for strings and bytes are going to be different. The hash values for ASCII Unicode and ASCII bytes will stay equal. Alternative counter measures against hash collision DoS ======================================================= -Three alternative counter measures against hash collisions were discussed in +Three alternative countermeasures against hash collisions were discussed in the past, but are not subject of this PEP. -1. Marc-Andre Lemburg has suggested that dicts shall count hash collision. In +1. Marc-Andre Lemburg has suggested that dicts shall count hash collisions. In case an insert operation causes too many collisions an exception shall be raised. -2. Some application (e.g. PHP) have limit the amount of keys for GET and POST - HTTP request. The approach effectively leverages the impact of a hash +2. Some applications (e.g. PHP) limit the amount of keys for GET and POST + HTTP requests. The approach effectively leverages the impact of a hash collision attack. (XXX citation needed) 3. Hash maps have a worst case of O(n) for insertion and lookup of keys. This - results in an quadratic runtime during a hash collision attack. The + results in a quadratic runtime during a hash collision attack. The introduction of a new and additional data structure with with O(log n) worst case behavior would eliminate the root cause. A data structures like red-black-tree or prefix trees (trie [trie]_) would have other benefits, @@ -531,8 +531,8 @@ versions of the PEP aim for compile time configuration. -Reference -========= +References +========== * Issue 19183 [issue19183]_ contains a reference implementation. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 8 15:41:01 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 15:41:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_455=3A_add_BDFL-Delegate_?= =?utf-8?q?and_fix_some_minor_typos=2E?= Message-ID: <3cvKT903mrzLrB@mail.python.org> http://hg.python.org/peps/rev/95652a7f9bc1 changeset: 5178:95652a7f9bc1 user: gbrandl date: Tue Oct 08 15:40:45 2013 +0200 summary: PEP 455: add BDFL-Delegate and fix some minor typos. files: pep-0455.txt | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pep-0455.txt b/pep-0455.txt --- a/pep-0455.txt +++ b/pep-0455.txt @@ -3,6 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Antoine Pitrou +BDFL-Delegate: Raymond Hettinger Status: Draft Type: Standards Track Content-Type: text/x-rst @@ -40,15 +41,15 @@ ``str.lower`` or ``str.casefold`` in the former example and the built-in ``id`` function in the latter. -(it could be said that the pattern *projects* keys from the user-visible -set onto the internal lookup set) +(It could be said that the pattern *projects* keys from the user-visible +set onto the internal lookup set.) Semantics ========= TransformDict is a ``MutableMapping`` implementation: it faithfully -implements the well-known API of mutable mappings, as ``dict`` itself +implements the well-known API of mutable mappings, like ``dict`` itself and other dict-like classes in the standard library. Therefore, this PEP won't rehash the semantics of most TransformDict methods. @@ -83,7 +84,7 @@ Constructor ----------- -As shown in the example aboves, creating a TransformDict requires passing +As shown in the examples above, creating a TransformDict requires passing the key transformation function as the first argument (much like creating a ``defaultdict`` requires passing the factory function as first argument). @@ -110,7 +111,7 @@ File "", line 1, in KeyError: 'bar' -The method name ``getitem()`` mirrors the standard ``popitem()`` method +The method name ``getitem()`` follows the standard ``popitem()`` method on mutable mappings. Getting the transformation function @@ -263,6 +264,7 @@ This document has been placed in the public domain. + .. Local Variables: mode: indented-text -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 8 15:54:29 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 15:54:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_add_missing_footer?= =?utf-8?q?=2C_formatting_and_typo_fixes=2E?= Message-ID: <3cvKmj3jb0zR5R@mail.python.org> http://hg.python.org/peps/rev/d65ed5cf08fd changeset: 5179:d65ed5cf08fd user: gbrandl date: Tue Oct 08 15:54:15 2013 +0200 summary: PEP 454: add missing footer, formatting and typo fixes. files: pep-0454.txt | 200 +++++++++++++++++++++----------------- 1 files changed, 111 insertions(+), 89 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -13,43 +13,44 @@ Abstract ======== -Add a new ``tracemalloc`` module to trace memory blocks allocated by Python. - +This PEP proposes to add a new ``tracemalloc`` module to trace memory +blocks allocated by Python. Rationale ========= -Common debug tools tracing memory allocations read the C filename and -line number. Using such tool to analyze Python memory allocations does -not help because most memory block are allocated in the same C function, -in ``PyMem_Malloc()`` for example. +Common debug tools tracing memory allocations record the C filename +and line number where the allocation occurs. Using such a tool to +analyze Python memory allocations does not help because most memory +blocks are allocated in the same C function, in ``PyMem_Malloc()`` for +example. There are debug tools dedicated to the Python language like ``Heapy`` -and ``PySizer``. These tools analyze objects type and/or content. They -are useful when most memory leaks are instances of the same type and -this type is only instantiated in a few functions. The problem is when -the object type is very common like ``str`` or ``tuple``, and it is hard -to identify where these objects are instantiated. +and ``PySizer``. These tools analyze objects type and/or content. +They are useful when most memory leaks are instances of the same type +and this type is only instantiated in a few functions. Problems arise +when the object type is very common like ``str`` or ``tuple``, and it +is hard to identify where these objects are instantiated. -Finding reference cycles is also a difficult problem. There are -different tools to draw a diagram of all references. These tools cannot -be used on large applications with thousands of objects because the -diagram is too huge to be analyzed manually. +Finding reference cycles is also a difficult problem. There are +different tools to draw a diagram of all references. These tools +cannot be used on large applications with thousands of objects because +the diagram is too huge to be analyzed manually. Proposal ======== -Using the PEP 445, it becomes easy to setup an hook on Python memory -allocators. A hook can inspect Python internals to retrieve the Python -tracebacks. +Using the customized allocation API from PEP 445, it becomes easy to +set up a hook on Python memory allocators. A hook can inspect Python +internals to retrieve Python tracebacks. -This PEP proposes to add a new ``tracemalloc`` module. It is a debug +This PEP proposes to add a new ``tracemalloc`` module, as a debug tool to trace memory blocks allocated by Python. The module provides the following information: -* Compute the differences between two snapshots to detect memory leaks +* Computed differences between two snapshots to detect memory leaks * Statistics on allocated memory blocks per filename and per line number: total size, number and average size of allocated memory blocks * Traceback where a memory block was allocated @@ -57,13 +58,13 @@ The API of the tracemalloc module is similar to the API of the faulthandler module: ``enable()``, ``disable()`` and ``is_enabled()`` functions, an environment variable (``PYTHONFAULTHANDLER`` and -``PYTHONTRACEMALLOC``), a ``-X`` command line option (``-X +``PYTHONTRACEMALLOC``), and a ``-X`` command line option (``-X faulthandler`` and ``-X tracemalloc``). See the `documentation of the faulthandler module -`_. +`_. The tracemalloc module has been written for CPython. Other -implementations of Python may not provide it. +implementations of Python may not be able to provide it. API @@ -72,15 +73,16 @@ To trace most memory blocks allocated by Python, the module should be enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` environment variable to ``1``, or by using ``-X tracemalloc`` command -line option. The ``tracemalloc.enable()`` function can also be called to -start tracing Python memory allocations. +line option. The ``tracemalloc.enable()`` function can also be called +to start tracing Python memory allocations. -By default, a trace of an allocated memory block only stores one frame. -Use the ``set_traceback_limit()`` function to store more frames. +By default, a trace of an allocated memory block only stores one +frame. Use the ``set_traceback_limit()`` function to store additional +frames. -Python memory blocks allocated in the ``tracemalloc`` module are also -traced by default. Use ``add_exclude_filter(tracemalloc.__file__)`` to -ignore these these memory allocations. +Python memory blocks allocated in the ``tracemalloc`` module itself are +also traced by default. Use ``add_exclude_filter(tracemalloc.__file__)`` +to ignore these these memory allocations. At fork, the module is automatically disabled in the child process. @@ -98,7 +100,8 @@ ``clear_traces()`` function: Clear all traces and statistics on Python memory allocations, and - reset the ``get_arena_size()`` and ``get_traced_memory()`` counters. + reset the ``get_arena_size()`` and ``get_traced_memory()`` + counters. ``disable()`` function: @@ -148,31 +151,35 @@ ``get_traceback_limit()`` function: - Get the maximum number of frames stored in the traceback of a trace - of a memory block. + Get the maximum number of frames stored in the traceback of a + trace of a memory block. Use the ``set_traceback_limit()`` function to change the limit. ``get_object_address(obj)`` function: - Get the address of the memory block of the specified Python object. + Get the address of the memory block of the specified Python + object. A Python object can be composed by multiple memory blocks, the function only returns the address of the main memory block. - See also ``get_object_trace()`` and ``gc.get_referrers()`` functions. + See also ``get_object_trace()`` and ``gc.get_referrers()`` + functions. ``get_object_trace(obj)`` function: Get the trace of a Python object *obj* as a ``(size: int, - traceback)`` tuple where *traceback* is a tuple of ``(filename: str, - lineno: int)`` tuples, *filename* and *lineno* can be ``None``. + traceback)`` tuple where *traceback* is a tuple of ``(filename: + str, lineno: int)`` tuples, *filename* and *lineno* can be + ``None``. - The function only returns the trace of the main memory block of the - object. The *size* of the trace is smaller than the total size of - the object if the object is composed by more than one memory block. + The function only returns the trace of the main memory block of + the object. The *size* of the trace is smaller than the total + size of the object if the object is composed by more than one + memory block. Return ``None`` if the ``tracemalloc`` module did not trace the allocation of the object. @@ -199,21 +206,21 @@ Get all traces of Python memory allocations as a dictionary ``{address (int): trace}`` where *trace* is a ``(size: int, - traceback)`` and *traceback* is a list of ``(filename: str, lineno: - int)``. *traceback* can be empty, *filename* and *lineno* can be - None. + traceback)`` and *traceback* is a list of ``(filename: str, + lineno: int)``. *traceback* can be empty, *filename* and *lineno* + can be ``None``. Return an empty dictionary if the ``tracemalloc`` module is disabled. - See also ``get_object_trace()``, ``get_stats()`` and ``get_trace()`` - functions. + See also ``get_object_trace()``, ``get_stats()`` and + ``get_trace()`` functions. ``set_traceback_limit(nframe: int)`` function: - Set the maximum number of frames stored in the traceback of a trace - of a memory block. + Set the maximum number of frames stored in the traceback of a + trace of a memory block. Storing the traceback of each memory allocation has an important overhead on the memory usage. Use the ``get_tracemalloc_memory()`` @@ -237,24 +244,25 @@ trace. The new filter is not applied on already collected traces. Use the - ``clear_traces()`` function to ensure that all traces match the new - filter. + ``clear_traces()`` function to ensure that all traces match the + new filter. ``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: Add an inclusive filter: helper for the ``add_filter()`` method - creating a ``Filter`` instance with the ``Filter.include`` attribute - set to ``True``. + creating a ``Filter`` instance with the ``Filter.include`` + attribute set to ``True``. Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` - only includes memory blocks allocated by the ``tracemalloc`` module. + only includes memory blocks allocated by the ``tracemalloc`` + module. ``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: Add an exclusive filter: helper for the ``add_filter()`` method - creating a ``Filter`` instance with the ``Filter.include`` attribute - set to ``False``. + creating a ``Filter`` instance with the ``Filter.include`` + attribute set to ``False``. Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores memory blocks allocated by the ``tracemalloc`` module. @@ -343,15 +351,18 @@ | ``arena_alignment`` | Number of bytes for arena alignment padding | +---------------------+-------------------------------------------------------+ - The function is not available if Python is compiled without ``pymalloc``. + The function is not available if Python is compiled without + ``pymalloc``. - See also ``get_arena_size()`` and ``sys._debugmallocstats()`` functions. + See also the ``get_arena_size()`` and ``sys._debugmallocstats()`` + functions. ``get_traced_memory()`` function: - Get the current size and maximum size of memory blocks traced by the - ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. + Get the current size and maximum size of memory blocks traced by + the ``tracemalloc`` module as a tuple: ``(size: int, max_size: + int)``. ``get_tracemalloc_memory()`` function: @@ -378,12 +389,12 @@ ``DisplayTop()`` class: - Display the top of allocated memory blocks. + Display the "top-n" biggest allocated memory blocks. ``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method: - Take a snapshot and display the top *count* biggest allocated memory - blocks grouped by *group_by*. + Take a snapshot and display the top *count* biggest allocated + memory blocks grouped by *group_by*. *callback* is an optional callable object which can be used to add metrics to a snapshot. It is called with only one parameter: the @@ -405,8 +416,8 @@ ``display_top_stats(top_stats, count=10, file=None)`` method: Display the top of allocated memory blocks grouped by the - ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is a - ``GroupedStats`` instance. + ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is + a ``GroupedStats`` instance. ``average`` attribute: @@ -851,8 +862,8 @@ Differences between ``old_stats`` and ``new_stats`` as a list of ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, *size*, *count_diff* and *count* are ``int``. The key type depends - on the ``GroupedStats.group_by`` attribute of ``new_stats``: see the - ``Snapshot.top_by()`` method. + on the ``GroupedStats.group_by`` attribute of ``new_stats``: see + the ``Snapshot.top_by()`` method. ``old_stats`` attribute: @@ -869,8 +880,8 @@ ``Task(func, *args, **kw)`` class: Task calling ``func(*args, **kw)``. When scheduled, the task is - called when the traced memory is increased or decreased by more than - *threshold* bytes, or after *delay* seconds. + called when the traced memory is increased or decreased by more + than *threshold* bytes, or after *delay* seconds. ``call()`` method: @@ -892,10 +903,10 @@ ``get_memory_threshold()`` method: - Get the threshold of the traced memory. When scheduled, the task is - called when the traced memory is increased or decreased by more than - *threshold* bytes. The memory threshold is disabled if *threshold* - is ``None``. + Get the threshold of the traced memory. When scheduled, the task + is called when the traced memory is increased or decreased by more + than *threshold* bytes. The memory threshold is disabled if + *threshold* is ``None``. See also the ``set_memory_threshold()`` method and the ``get_traced_memory()`` function. @@ -903,20 +914,20 @@ ``schedule(repeat: int=None)`` method: - Schedule the task *repeat* times. If *repeat* is ``None``, the task - is rescheduled after each call until it is cancelled. + Schedule the task *repeat* times. If *repeat* is ``None``, the + task is rescheduled after each call until it is cancelled. - If the method is called twice, the task is rescheduled with the new - *repeat* parameter. + If the method is called twice, the task is rescheduled with the + new *repeat* parameter. The task must have a memory threshold or a delay: see ``set_delay()`` and ``set_memory_threshold()`` methods. The ``tracemalloc`` must be enabled to schedule a task: see the ``enable`` function. - The task is cancelled if the ``call()`` method raises an exception. - The task can be cancelled using the ``cancel()`` method or the - ``cancel_tasks()`` function. + The task is cancelled if the ``call()`` method raises an + exception. The task can be cancelled using the ``cancel()`` + method or the ``cancel_tasks()`` function. ``set_delay(seconds: int)`` method: @@ -925,18 +936,19 @@ delay to ``None`` to disable the timer. The timer is based on the Python memory allocator, it is not real - time. The task is called after at least *delay* seconds, it is not - called exactly after *delay* seconds if no Python memory allocation - occurred. The timer has a resolution of 1 second. + time. The task is called after at least *delay* seconds, it is + not called exactly after *delay* seconds if no Python memory + allocation occurred. The timer has a resolution of 1 second. The task is rescheduled if it was scheduled. ``set_memory_threshold(size: int)`` method: - Set the threshold of the traced memory. When scheduled, the task is - called when the traced memory is increased or decreased by more than - *threshold* bytes. Set the threshold to ``None`` to disable it. + Set the threshold of the traced memory. When scheduled, the task + is called when the traced memory is increased or decreased by more + than *threshold* bytes. Set the threshold to ``None`` to disable + it. The task is rescheduled if it was scheduled. @@ -976,8 +988,8 @@ ``take_snapshot()`` method: Take a snapshot and write it into a file. Return ``(snapshot, - filename)`` where *snapshot* is a ``Snapshot`` instance and filename - type is ``str``. + filename)`` where *snapshot* is a ``Snapshot`` instance and + filename type is ``str``. ``callback`` attribute: @@ -993,8 +1005,8 @@ * ``$pid``: identifier of the current process * ``$timestamp``: current date and time - * ``$counter``: counter starting at 1 and incremented at each snapshot, - formatted as 4 decimal digits + * ``$counter``: counter starting at 1 and incremented at each + snapshot, formatted as 4 decimal digits The default template is ``'tracemalloc-$counter.pickle'``. @@ -1034,5 +1046,15 @@ Copyright ========= -This document has been placed into the public domain. +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 8 16:09:27 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 16:09:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_436=3A_fix_markup_and_mak?= =?utf-8?q?e_it_consistent=2E?= Message-ID: <3cvL5z5Xjkz7Llb@mail.python.org> http://hg.python.org/peps/rev/9b157de338b8 changeset: 5180:9b157de338b8 user: gbrandl date: Tue Oct 08 16:09:05 2013 +0200 summary: PEP 436: fix markup and make it consistent. files: pep-0436.txt | 356 ++++++++++++++++++-------------------- 1 files changed, 170 insertions(+), 186 deletions(-) diff --git a/pep-0436.txt b/pep-0436.txt --- a/pep-0436.txt +++ b/pep-0436.txt @@ -49,62 +49,62 @@ in numerous ways. The modern API is complex, to the point that it is somewhat painful to use. Consider: - * There are now forty different "format units"; a few are even three - characters long. This makes it difficult for the programmer to - understand what the format string says--or even perhaps to parse - it--without constantly cross-indexing it with the documentation. - * There are also six meta-format units that may be buried in the - format string. (They are: ``"()|$:;"``.) - * The more format units are added, the less likely it is the - implementer can pick an easy-to-use mnemonic for the format unit, - because the character of choice is probably already in use. In - other words, the more format units we have, the more obtuse the - format units become. - * Several format units are nearly identical to others, having only - subtle differences. This makes understanding the exact semantics - of the format string even harder, and can make it difficult to - figure out exactly which format unit you want. - * The docstring is specified as a static C string, making it mildly - bothersome to read and edit since it must obey C string quoting rules. - * When adding a new parameter to a function using - ``PyArg_ParseTupleAndKeywords()``, it's necessary to touch six - different places in the code: [4]_ +* There are now forty different "format units"; a few are even three + characters long. This makes it difficult for the programmer to + understand what the format string says--or even perhaps to parse + it--without constantly cross-indexing it with the documentation. +* There are also six meta-format units that may be buried in the + format string. (They are: ``"()|$:;"``.) +* The more format units are added, the less likely it is the + implementer can pick an easy-to-use mnemonic for the format unit, + because the character of choice is probably already in use. In + other words, the more format units we have, the more obtuse the + format units become. +* Several format units are nearly identical to others, having only + subtle differences. This makes understanding the exact semantics + of the format string even harder, and can make it difficult to + figure out exactly which format unit you want. +* The docstring is specified as a static C string, making it mildly + bothersome to read and edit since it must obey C string quoting rules. +* When adding a new parameter to a function using + ``PyArg_ParseTupleAndKeywords()``, it's necessary to touch six + different places in the code: [4]_ - * Declaring the variable to store the argument. - * Passing in a pointer to that variable in the correct spot in - ``PyArg_ParseTupleAndKeywords()``, also passing in any - "length" or "converter" arguments in the correct order. - * Adding the name of the argument in the correct spot of the - "keywords" array passed in to - ``PyArg_ParseTupleAndKeywords()``. - * Adding the format unit to the correct spot in the format - string. - * Adding the parameter to the prototype in the docstring. - * Documenting the parameter in the docstring. + * Declaring the variable to store the argument. + * Passing in a pointer to that variable in the correct spot in + ``PyArg_ParseTupleAndKeywords()``, also passing in any + "length" or "converter" arguments in the correct order. + * Adding the name of the argument in the correct spot of the + "keywords" array passed in to + ``PyArg_ParseTupleAndKeywords()``. + * Adding the format unit to the correct spot in the format + string. + * Adding the parameter to the prototype in the docstring. + * Documenting the parameter in the docstring. - * There is currently no mechanism for builtin functions to provide - their "signature" information (see ``inspect.getfullargspec`` and - ``inspect.Signature``). Adding this information using a mechanism - similar to the existing ``PyArg_Parse`` functions would require - repeating ourselves yet again. +* There is currently no mechanism for builtin functions to provide + their "signature" information (see ``inspect.getfullargspec`` and + ``inspect.Signature``). Adding this information using a mechanism + similar to the existing ``PyArg_Parse`` functions would require + repeating ourselves yet again. The goal of Argument Clinic is to replace this API with a mechanism inheriting none of these downsides: - * You need specify each parameter only once. - * All information about a parameter is kept together in one place. - * For each parameter, you specify a conversion function; Argument - Clinic handles the translation from Python value into C value for - you. - * Argument Clinic also allows for fine-tuning of argument processing - behavior with parameterized conversion functions. - * Docstrings are written in plain text. Function docstrings are - required; per-parameter docstrings are encouraged. - * From this, Argument Clinic generates for you all the mundane, - repetitious code and data structures CPython needs internally. - Once you've specified the interface, the next step is simply to - write your implementation using native C types. Every detail of - argument parsing is handled for you. +* You need specify each parameter only once. +* All information about a parameter is kept together in one place. +* For each parameter, you specify a conversion function; Argument + Clinic handles the translation from Python value into C value for + you. +* Argument Clinic also allows for fine-tuning of argument processing + behavior with parameterized conversion functions. +* Docstrings are written in plain text. Function docstrings are + required; per-parameter docstrings are encouraged. +* From this, Argument Clinic generates for you all the mundane, + repetitious code and data structures CPython needs internally. + Once you've specified the interface, the next step is simply to + write your implementation using native C types. Every detail of + argument parsing is handled for you. Argument Clinic is implemented as a preprocessor. It draws inspiration for its workflow directly from [Cog]_ by Ned Batchelder. To use Clinic, @@ -121,11 +121,11 @@ Future goals of Argument Clinic include: - * providing signature information for builtins, - * enabling alternative implementations of Python to create - automated library compatibility tests, and - * speeding up argument parsing with improvements to the - generated code. +* providing signature information for builtins, +* enabling alternative implementations of Python to create + automated library compatibility tests, and +* speeding up argument parsing with improvements to the + generated code. DSL Syntax Summary @@ -141,117 +141,115 @@ :: - +-----------------------+-----------------------------------------------------------------+ - | Section | Example | - +-----------------------+-----------------------------------------------------------------+ - | Clinic DSL start | /*[clinic] | - | Module declaration | module module_name | - | Class declaration | class module_name.class_name | - | Function declaration | module_name.function_name -> return_annotation | - | Parameter declaration | name : converter(param=value) | - | Parameter docstring | Lorem ipsum dolor sit amet, consectetur | - | | adipisicing elit, sed do eiusmod tempor | - | Function docstring | Lorem ipsum dolor sit amet, consectetur adipisicing | - | | elit, sed do eiusmod tempor incididunt ut labore et | - | Clinic DSL end | [clinic]*/ | - | Clinic output | ... | - | Clinic output end | /*[clinic end output:]*/ | - +-----------------------+-----------------------------------------------------------------+ + +-----------------------+-----------------------------------------------------------------+ + | Section | Example | + +-----------------------+-----------------------------------------------------------------+ + | Clinic DSL start | /*[clinic] | + | Module declaration | module module_name | + | Class declaration | class module_name.class_name | + | Function declaration | module_name.function_name -> return_annotation | + | Parameter declaration | name : converter(param=value) | + | Parameter docstring | Lorem ipsum dolor sit amet, consectetur | + | | adipisicing elit, sed do eiusmod tempor | + | Function docstring | Lorem ipsum dolor sit amet, consectetur adipisicing | + | | elit, sed do eiusmod tempor incididunt ut labore et | + | Clinic DSL end | [clinic]*/ | + | Clinic output | ... | + | Clinic output end | /*[clinic end output:]*/ | + +-----------------------+-----------------------------------------------------------------+ To give some flavor of the proposed DSL syntax, here are some sample Clinic code blocks. This first block reflects the normally preferred style, including blank lines between parameters and per-argument docstrings. It also includes a user-defined converter (``path_t``) created -locally +locally:: -:: + /*[clinic] + os.stat as os_stat_fn -> stat result - /*[clinic] - os.stat as os_stat_fn -> stat result + path: path_t(allow_fd=1) + Path to be examined; can be string, bytes, or open-file-descriptor int. - path: path_t(allow_fd=1) - Path to be examined; can be string, bytes, or open-file-descriptor int. + * - * + dir_fd: OS_STAT_DIR_FD_CONVERTER = DEFAULT_DIR_FD + If not None, it should be a file descriptor open to a directory, + and path should be a relative string; path will then be relative to + that directory. - dir_fd: OS_STAT_DIR_FD_CONVERTER = DEFAULT_DIR_FD - If not None, it should be a file descriptor open to a directory, - and path should be a relative string; path will then be relative to - that directory. + follow_symlinks: bool = True + If False, and the last element of the path is a symbolic link, + stat will examine the symbolic link itself instead of the file + the link points to. - follow_symlinks: bool = True - If False, and the last element of the path is a symbolic link, - stat will examine the symbolic link itself instead of the file - the link points to. + Perform a stat system call on the given path. - Perform a stat system call on the given path. + {parameters} - {parameters} + dir_fd and follow_symlinks may not be implemented + on your platform. If they are unavailable, using them will raise a + NotImplementedError. - dir_fd and follow_symlinks may not be implemented - on your platform. If they are unavailable, using them will raise a - NotImplementedError. + It's an error to use dir_fd or follow_symlinks when specifying path as + an open file descriptor. - It's an error to use dir_fd or follow_symlinks when specifying path as - an open file descriptor. - - [clinic]*/ + [clinic]*/ This second example shows a minimal Clinic code block, omitting all parameter docstrings and non-significant blank lines:: - /*[clinic] - os.access - path: path - mode: int - * - dir_fd: OS_ACCESS_DIR_FD_CONVERTER = 1 - effective_ids: bool = False - follow_symlinks: bool = True - Use the real uid/gid to test for access to a path. - Returns True if granted, False otherwise. + /*[clinic] + os.access + path: path + mode: int + * + dir_fd: OS_ACCESS_DIR_FD_CONVERTER = 1 + effective_ids: bool = False + follow_symlinks: bool = True + Use the real uid/gid to test for access to a path. + Returns True if granted, False otherwise. - {parameters} + {parameters} - dir_fd, effective_ids, and follow_symlinks may not be implemented - on your platform. If they are unavailable, using them will raise a - NotImplementedError. + dir_fd, effective_ids, and follow_symlinks may not be implemented + on your platform. If they are unavailable, using them will raise a + NotImplementedError. - Note that most operations will use the effective uid/gid, therefore this - routine can be used in a suid/sgid environment to test if the invoking user - has the specified access to the path. + Note that most operations will use the effective uid/gid, therefore this + routine can be used in a suid/sgid environment to test if the invoking user + has the specified access to the path. - [clinic]*/ + [clinic]*/ This final example shows a Clinic code block handling groups of optional parameters, including parameters on the left:: - /*[clinic] - curses.window.addch + /*[clinic] + curses.window.addch - [ - y: int - Y-coordinate. + [ + y: int + Y-coordinate. - x: int - X-coordinate. - ] + x: int + X-coordinate. + ] - ch: char - Character to add. + ch: char + Character to add. - [ - attr: long - Attributes for the character. - ] + [ + attr: long + Attributes for the character. + ] - / + / - Paint character ch at (y, x) with attributes attr, - overwriting any character previously painter at that location. - By default, the character position and attributes are the - current settings for the window object. - [clinic]*/ + Paint character ch at (y, x) with attributes attr, + overwriting any character previously painter at that location. + By default, the character position and attributes are the + current settings for the window object. + [clinic]*/ General Behavior Of the Argument Clinic DSL @@ -275,17 +273,13 @@ ----------------------------- When a C file implements a module or class, this should be declared to -Clinic. The syntax is simple: +Clinic. The syntax is simple:: -:: + module module_name - module module_name +or :: -or - -:: - - class module_name.class_name + class module_name.class_name (Note that these are not actually special syntax; they are implemented as `Directives`_.) @@ -297,11 +291,9 @@ Function Declaration -------------------- -The full form of the function declaration is as follows: +The full form of the function declaration is as follows:: -:: - - dotted.name [ as legal_c_id ] [ -> return_annotation ] + dotted.name [ as legal_c_id ] [ -> return_annotation ] The dotted name should be the full name of the function, starting with the highest-level package (e.g. "os.stat" or "curses.window.addch"). @@ -323,11 +315,9 @@ Parameter Declaration --------------------- -The full form of the parameter declaration line as as follows: +The full form of the parameter declaration line as as follows:: -:: - - name: converter [ (parameter=value [, parameter2=value2]) ] [ = default] + name: converter [ (parameter=value [, parameter2=value2]) ] [ = default] The "name" must be a legal C identifier. Whitespace is permitted between the name and the colon (though this is not the preferred style). Whitespace @@ -377,11 +367,9 @@ Clinic provides a set of legacy converters that match ``PyArg_ParseTuple`` format units. They are specified as a C string containing the format unit. For example, to specify a parameter "foo" as taking a Python -"int" and emitting a C int, you could specify: +"int" and emitting a C int, you could specify:: -:: - - foo : "i" + foo : "i" (To more closely resemble a C string, these must always use double quotes.) @@ -554,11 +542,9 @@ Directives are similar to *pragmas* in C; they are statements that modify Argument Clinic's behavior. -The format of a directive is as follows: +The format of a directive is as follows:: -:: - - directive_name [argument [second_argument [ ... ]]] + directive_name [argument [second_argument [ ... ]]] Directives only take positional arguments. @@ -566,7 +552,7 @@ or a function declaration. It may contain both, in which case all directives must come before the function declaration. -Internally directives map directly to Python callables. +Internally directives map directly to Python callables. The directive's arguments are passed directly to the callable as positional arguments of type ``str()``. @@ -581,18 +567,16 @@ Argument Clinic also permits embedding Python code inside C files, which is executed in-place when Argument Clinic processes the file. -Embedded code looks like this: +Embedded code looks like this:: -:: + /*[python] - /*[python] + # this is python code! + print("/" + "* Hello world! *" + "/") - # this is python code! - print("/" + "* Hello world! *" + "/") - - [python]*/ - /* Hello world! */ - /*[python end:da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ + [python]*/ + /* Hello world! */ + /*[python end:da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ The ``"/* Hello world! */"`` line above was generated by running the Python code in the preceding comment. @@ -610,14 +594,14 @@ is everything printed using ``builtins.print``. For "clinic" sections, the output is valid C code, including: - * a ``#define`` providing the correct ``methoddef`` structure for the - function - * a prototype for the "impl" function -- this is what you'll write - to implement this function - * a function that handles all argument processing, which calls your - "impl" function - * the definition line of the "impl" function - * and a comment indicating the end of output. +* a ``#define`` providing the correct ``methoddef`` structure for the + function +* a prototype for the "impl" function -- this is what you'll write + to implement this function +* a function that handles all argument processing, which calls your + "impl" function +* the definition line of the "impl" function +* and a comment indicating the end of output. The intention is that you write the body of your impl function immediately after the output -- as in, you write a left-curly-brace immediately after @@ -738,15 +722,15 @@ :: - /*[clinic] - ... prototype and parameters (including parameter docstrings) go here - [clinic]*/ - ... some output ... - /*[clinic docstring start]*/ - ... hand-edited function docstring goes here <-- you edit this by hand! - /*[clinic docstring end]*/ - ... more output - /*[clinic output end]*/ + /*[clinic] + ... prototype and parameters (including parameter docstrings) go here + [clinic]*/ + ... some output ... + /*[clinic docstring start]*/ + ... hand-edited function docstring goes here <-- you edit this by hand! + /*[clinic docstring end]*/ + ... more output + /*[clinic output end]*/ I tried it this way and don't like it -- I think it's clumsy. I prefer that everything you write goes in one place, rather than @@ -756,7 +740,7 @@ * Argument Clinic does not support automatic tuple unpacking (the "``(OOO)``" style format string for ``PyArg_ParseTuple()``.) -* Argument Clinic removes some dynamism / flexibility. With +* Argument Clinic removes some dynamism / flexibility. With ``PyArg_ParseTuple()`` one could theoretically pass in different encodings at runtime for the "``es``"/"``et``" format units. AFAICT CPython doesn't do this itself, however it's possible @@ -773,7 +757,7 @@ that I've never gotten to use". Thanks also to everyone who provided feedback on the [bugtracker issue] and on python-dev. Special thanks to Nick Coglan and Guido van Rossum for a rousing two-hour in-person -deep dive on the topic at PyCon US 2013. +deep dive on the topic at PyCon US 2013. References -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 8 20:09:28 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 8 Oct 2013 20:09:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4MDM3?= =?utf-8?b?OiBEbyBub3QgZXNjYXBlICdcdScgYW5kICdcVScgaW4gcmF3IHN0cmluZ3Mu?= Message-ID: <3cvRQw4H2Fz7LkH@mail.python.org> http://hg.python.org/cpython/rev/c498d1090970 changeset: 86145:c498d1090970 branch: 2.7 parent: 86142:5e1f359d54c4 user: Serhiy Storchaka date: Tue Oct 08 21:07:21 2013 +0300 summary: Issue #18037: Do not escape '\u' and '\U' in raw strings. files: Lib/lib2to3/fixes/fix_unicode.py | 3 +-- Lib/lib2to3/tests/test_fixers.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -28,8 +28,7 @@ return new elif node.type == token.STRING: val = node.value - if (not self.unicode_literals and val[0] in u'rR\'"' and - u'\\' in val): + if not self.unicode_literals and val[0] in u'\'"' and u'\\' in val: val = ur'\\'.join([ v.replace(u'\\u', ur'\\u').replace(u'\\U', ur'\\U') for v in val.split(ur'\\') diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2830,7 +2830,7 @@ self.check(b, a) b = """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" - a = """r'\\\\\\\\u20ac\\\\U0001d121\\\\u20ac'""" + a = """r'\\\\\\u20ac\\U0001d121\\\\u20ac'""" self.check(b, a) def test_bytes_literal_escape_u(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:09:29 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 8 Oct 2013 20:09:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4MDM3?= =?utf-8?b?OiBEbyBub3QgZXNjYXBlICdcdScgYW5kICdcVScgaW4gcmF3IHN0cmluZ3Mu?= Message-ID: <3cvRQx64C3z7LkW@mail.python.org> http://hg.python.org/cpython/rev/acb2dacd0d24 changeset: 86146:acb2dacd0d24 branch: 3.3 parent: 86143:b6205505e1e4 user: Serhiy Storchaka date: Tue Oct 08 21:07:46 2013 +0300 summary: Issue #18037: Do not escape '\u' and '\U' in raw strings. files: Lib/lib2to3/fixes/fix_unicode.py | 3 +-- Lib/lib2to3/tests/test_fixers.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -28,8 +28,7 @@ return new elif node.type == token.STRING: val = node.value - if (not self.unicode_literals and val[0] in 'rR\'"' and - '\\' in val): + if not self.unicode_literals and val[0] in '\'"' and '\\' in val: val = r'\\'.join([ v.replace('\\u', r'\\u').replace('\\U', r'\\U') for v in val.split(r'\\') diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2830,7 +2830,7 @@ self.check(b, a) b = r"""r'\\\u20ac\U0001d121\\u20ac'""" - a = r"""r'\\\\u20ac\\U0001d121\\u20ac'""" + a = r"""r'\\\u20ac\U0001d121\\u20ac'""" self.check(b, a) def test_bytes_literal_escape_u(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:09:31 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 8 Oct 2013 20:09:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogSXNzdWUgIzE4MDM3OiBEbyBub3QgZXNjYXBlICdcdScgYW5kICdcVScg?= =?utf-8?q?in_raw_strings=2E?= Message-ID: <3cvRQz0z4lz7Lkb@mail.python.org> http://hg.python.org/cpython/rev/a49d313a28ae changeset: 86147:a49d313a28ae parent: 86144:0f6133498def parent: 86146:acb2dacd0d24 user: Serhiy Storchaka date: Tue Oct 08 21:08:48 2013 +0300 summary: Issue #18037: Do not escape '\u' and '\U' in raw strings. files: Lib/lib2to3/fixes/fix_unicode.py | 3 +-- Lib/lib2to3/tests/test_fixers.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -28,8 +28,7 @@ return new elif node.type == token.STRING: val = node.value - if (not self.unicode_literals and val[0] in 'rR\'"' and - '\\' in val): + if not self.unicode_literals and val[0] in '\'"' and '\\' in val: val = r'\\'.join([ v.replace('\\u', r'\\u').replace('\\U', r'\\U') for v in val.split(r'\\') diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2889,7 +2889,7 @@ self.check(b, a) b = r"""r'\\\u20ac\U0001d121\\u20ac'""" - a = r"""r'\\\\u20ac\\U0001d121\\u20ac'""" + a = r"""r'\\\u20ac\U0001d121\\u20ac'""" self.check(b, a) def test_bytes_literal_escape_u(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:26:55 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:26:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2313867=3A_remove_?= =?utf-8?q?untrue_comment_about_PyWeakref=5FCheck=28=29=2E?= Message-ID: <3cvRq353Fyz7Lkl@mail.python.org> http://hg.python.org/cpython/rev/1800107873c0 changeset: 86148:1800107873c0 parent: 86144:0f6133498def user: Georg Brandl date: Tue Oct 08 19:50:26 2013 +0200 summary: Closes #13867: remove untrue comment about PyWeakref_Check(). files: Include/weakrefobject.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -51,9 +51,6 @@ ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) -/* This macro calls PyWeakref_CheckRef() last since that can involve a - function call; this makes it more likely that the function call - will be avoided. */ #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:26:57 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:26:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge_heads?= Message-ID: <3cvRq51pJXz7LkK@mail.python.org> http://hg.python.org/cpython/rev/9619c22b2c97 changeset: 86149:9619c22b2c97 parent: 86148:1800107873c0 parent: 86147:a49d313a28ae user: Georg Brandl date: Tue Oct 08 20:27:35 2013 +0200 summary: merge heads files: Lib/lib2to3/fixes/fix_unicode.py | 3 +-- Lib/lib2to3/tests/test_fixers.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py --- a/Lib/lib2to3/fixes/fix_unicode.py +++ b/Lib/lib2to3/fixes/fix_unicode.py @@ -28,8 +28,7 @@ return new elif node.type == token.STRING: val = node.value - if (not self.unicode_literals and val[0] in 'rR\'"' and - '\\' in val): + if not self.unicode_literals and val[0] in '\'"' and '\\' in val: val = r'\\'.join([ v.replace('\\u', r'\\u').replace('\\U', r'\\U') for v in val.split(r'\\') diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2889,7 +2889,7 @@ self.check(b, a) b = r"""r'\\\u20ac\U0001d121\\u20ac'""" - a = r"""r'\\\\u20ac\\U0001d121\\u20ac'""" + a = r"""r'\\\u20ac\U0001d121\\u20ac'""" self.check(b, a) def test_bytes_literal_escape_u(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:32:08 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:32:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzg2?= =?utf-8?q?7=3A_remove_untrue_comment_about_PyWeakref=5FCheck=28=29=2E?= Message-ID: <3cvRx45hntz7LjT@mail.python.org> http://hg.python.org/cpython/rev/1cd2fca12abf changeset: 86150:1cd2fca12abf branch: 3.3 parent: 86136:b4444d16e333 user: Georg Brandl date: Tue Oct 08 19:50:26 2013 +0200 summary: Closes #13867: remove untrue comment about PyWeakref_Check(). files: Include/weakrefobject.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -51,9 +51,6 @@ ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) -/* This macro calls PyWeakref_CheckRef() last since that can involve a - function call; this makes it more likely that the function call - will be avoided. */ #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:32:10 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:32:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuMyk6?= =?utf-8?q?_merge_heads?= Message-ID: <3cvRx60SfBz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/e53313b48a35 changeset: 86151:e53313b48a35 branch: 3.3 parent: 86146:acb2dacd0d24 parent: 86150:1cd2fca12abf user: Georg Brandl date: Tue Oct 08 20:29:47 2013 +0200 summary: merge heads files: Include/weakrefobject.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -51,9 +51,6 @@ ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) -/* This macro calls PyWeakref_CheckRef() last since that can involve a - function call; this makes it more likely that the function call - will be avoided. */ #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:32:11 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:32:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cvRx72DGfz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/422e639f546f changeset: 86152:422e639f546f parent: 86149:9619c22b2c97 parent: 86151:e53313b48a35 user: Georg Brandl date: Tue Oct 08 20:32:52 2013 +0200 summary: merge with 3.3 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 20:33:02 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 20:33:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMzg2?= =?utf-8?q?7=3A_remove_untrue_comment_about_PyWeakref=5FCheck=28=29=2E?= Message-ID: <3cvRy61kxKz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/39e5ab118602 changeset: 86153:39e5ab118602 branch: 2.7 parent: 86145:c498d1090970 user: Georg Brandl date: Tue Oct 08 19:50:26 2013 +0200 summary: Closes #13867: remove untrue comment about PyWeakref_Check(). files: Include/weakrefobject.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -49,9 +49,6 @@ ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) -/* This macro calls PyWeakref_CheckRef() last since that can involve a - function call; this makes it more likely that the function call - will be avoided. */ #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:27:56 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:27:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQWRkICItPiIgYXMg?= =?utf-8?q?a_delimiter_token=2E__Found_by_James_Harding_on_docs=40=2E?= Message-ID: <3cvT9S3CtRz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/f7b4f0459dc6 changeset: 86154:f7b4f0459dc6 branch: 3.3 parent: 86151:e53313b48a35 user: Georg Brandl date: Tue Oct 08 21:28:22 2013 +0200 summary: Add "->" as a delimiter token. Found by James Harding on docs at . files: Doc/reference/lexical_analysis.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -704,7 +704,7 @@ The following tokens serve as delimiters in the grammar:: ( ) [ ] { } - , : . ; @ = + , : . ; @ = -> += -= *= /= //= %= &= |= ^= >>= <<= **= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:27:57 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:27:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cvT9T55j9z7Ljd@mail.python.org> http://hg.python.org/cpython/rev/21f1b8fb9cbc changeset: 86155:21f1b8fb9cbc parent: 86152:422e639f546f parent: 86154:f7b4f0459dc6 user: Georg Brandl date: Tue Oct 08 21:28:42 2013 +0200 summary: merge with 3.3 files: Doc/reference/lexical_analysis.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -704,7 +704,7 @@ The following tokens serve as delimiters in the grammar:: ( ) [ ] { } - , : . ; @ = + , : . ; @ = -> += -= *= /= //= %= &= |= ^= >>= <<= **= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:43:02 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:43:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_wrong_link?= =?utf-8?q?=2E?= Message-ID: <3cvTVt2d7hz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/9e976570a779 changeset: 86156:9e976570a779 branch: 3.3 parent: 86154:f7b4f0459dc6 user: Georg Brandl date: Tue Oct 08 21:43:39 2013 +0200 summary: Fix wrong link. files: Doc/library/exceptions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -350,7 +350,7 @@ if it has another type (such as a string), the object's value is printed and the exit status is one. - Instances have an attribute :attr:`code` which is set to the proposed exit + Instances have an attribute :attr:`!code` which is set to the proposed exit status or error message (defaulting to ``None``). Also, this exception derives directly from :exc:`BaseException` and not :exc:`Exception`, since it is not technically an error. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:43:03 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:43:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cvTVv5GGZz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/a376ce037b60 changeset: 86157:a376ce037b60 parent: 86155:21f1b8fb9cbc parent: 86156:9e976570a779 user: Georg Brandl date: Tue Oct 08 21:43:46 2013 +0200 summary: merge with 3.3 files: Doc/library/exceptions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -356,7 +356,7 @@ if it has another type (such as a string), the object's value is printed and the exit status is one. - Instances have an attribute :attr:`code` which is set to the proposed exit + Instances have an attribute :attr:`!code` which is set to the proposed exit status or error message (defaulting to ``None``). Also, this exception derives directly from :exc:`BaseException` and not :exc:`Exception`, since it is not technically an error. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:43:38 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:43:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_wrong_link?= =?utf-8?q?=2E?= Message-ID: <3cvTWZ3mXTz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/ac066d5e45e1 changeset: 86158:ac066d5e45e1 branch: 2.7 parent: 86153:39e5ab118602 user: Georg Brandl date: Tue Oct 08 21:43:39 2013 +0200 summary: Fix wrong link. files: Doc/library/exceptions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -346,7 +346,7 @@ it has another type (such as a string), the object's value is printed and the exit status is one. - Instances have an attribute :attr:`code` which is set to the proposed exit + Instances have an attribute :attr:`!code` which is set to the proposed exit status or error message (defaulting to ``None``). Also, this exception derives directly from :exc:`BaseException` and not :exc:`StandardError`, since it is not technically an error. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:46:53 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:46:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Clarify_two_po?= =?utf-8?q?ints_about_division_and_shifting=2E_Suggested_by_Albert_Hofkamp?= =?utf-8?q?_on?= Message-ID: <3cvTbK6SgtzMnM@mail.python.org> http://hg.python.org/cpython/rev/c4d74ec932a1 changeset: 86159:c4d74ec932a1 branch: 3.3 parent: 86156:9e976570a779 user: Georg Brandl date: Tue Oct 08 21:47:18 2013 +0200 summary: Clarify two points about division and shifting. Suggested by Albert Hofkamp on docs at . files: Doc/reference/expressions.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -912,7 +912,7 @@ The ``/`` (division) and ``//`` (floor division) operators yield the quotient of their arguments. The numeric arguments are first converted to a common type. -Integer division yields a float, while floor division of integers results in an +Division of integers yields a float, while floor division of integers results in an integer; the result is that of mathematical division with the 'floor' function applied to the result. Division by zero raises the :exc:`ZeroDivisionError` exception. @@ -972,8 +972,8 @@ .. index:: exception: ValueError -A right shift by *n* bits is defined as division by ``pow(2,n)``. A left shift -by *n* bits is defined as multiplication with ``pow(2,n)``. +A right shift by *n* bits is defined as floor division by ``pow(2,n)``. A left +shift by *n* bits is defined as multiplication with ``pow(2,n)``. .. note:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:46:55 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:46:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cvTbM1tsdz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/64ad86875446 changeset: 86160:64ad86875446 parent: 86157:a376ce037b60 parent: 86159:c4d74ec932a1 user: Georg Brandl date: Tue Oct 08 21:47:35 2013 +0200 summary: merge with 3.3 files: Doc/reference/expressions.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -912,7 +912,7 @@ The ``/`` (division) and ``//`` (floor division) operators yield the quotient of their arguments. The numeric arguments are first converted to a common type. -Integer division yields a float, while floor division of integers results in an +Division of integers yields a float, while floor division of integers results in an integer; the result is that of mathematical division with the 'floor' function applied to the result. Division by zero raises the :exc:`ZeroDivisionError` exception. @@ -972,8 +972,8 @@ .. index:: exception: ValueError -A right shift by *n* bits is defined as division by ``pow(2,n)``. A left shift -by *n* bits is defined as multiplication with ``pow(2,n)``. +A right shift by *n* bits is defined as floor division by ``pow(2,n)``. A left +shift by *n* bits is defined as multiplication with ``pow(2,n)``. .. note:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:53:58 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:53:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Minor_grammar_?= =?utf-8?q?fix=2E?= Message-ID: <3cvTlV42vszQV5@mail.python.org> http://hg.python.org/cpython/rev/0bde9bf22c0a changeset: 86161:0bde9bf22c0a branch: 2.7 parent: 86158:ac066d5e45e1 user: Georg Brandl date: Tue Oct 08 21:54:37 2013 +0200 summary: Minor grammar fix. files: Doc/howto/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -63,7 +63,7 @@ * That's a snippet of the help text. It's very useful in that you can come across a program you have never used before, and can figure out - how it works simply by reading it's help text. + how it works simply by reading its help text. The basics -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:54:31 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:54:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Minor_grammar_?= =?utf-8?q?fix=2E?= Message-ID: <3cvTm70HhVzQV5@mail.python.org> http://hg.python.org/cpython/rev/263001204b96 changeset: 86162:263001204b96 branch: 3.3 parent: 86159:c4d74ec932a1 user: Georg Brandl date: Tue Oct 08 21:54:37 2013 +0200 summary: Minor grammar fix. files: Doc/howto/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -63,7 +63,7 @@ * That's a snippet of the help text. It's very useful in that you can come across a program you have never used before, and can figure out - how it works simply by reading it's help text. + how it works simply by reading its help text. The basics -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 21:54:32 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 8 Oct 2013 21:54:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cvTm85LkHzQV5@mail.python.org> http://hg.python.org/cpython/rev/198263340de6 changeset: 86163:198263340de6 parent: 86160:64ad86875446 parent: 86162:263001204b96 user: Georg Brandl date: Tue Oct 08 21:54:47 2013 +0200 summary: merge with 3.3 files: Doc/howto/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -63,7 +63,7 @@ * That's a snippet of the help text. It's very useful in that you can come across a program you have never used before, and can figure out - how it works simply by reading it's help text. + how it works simply by reading its help text. The basics -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 8 22:00:49 2013 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Oct 2013 22:00:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_remove_tracemalloc?= =?utf-8?b?LmdldF9hbGxvY2F0ZWRfYmxvY2tzKCk=?= Message-ID: <3cvTvP2vcPz7Ljh@mail.python.org> http://hg.python.org/peps/rev/0357a6b86162 changeset: 5181:0357a6b86162 user: Victor Stinner date: Tue Oct 08 22:00:38 2013 +0200 summary: PEP 454: remove tracemalloc.get_allocated_blocks() sys.getallocatedblocks() already exists files: pep-0454.txt | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -289,11 +289,6 @@ The following functions can be used to add metrics to a snapshot, see the ``Snapshot.add_metric()`` method. -``get_allocated_blocks()`` function: - - Get the current number of allocated memory blocks. - - ``get_arena_size()`` function: Get the size in bytes of traced arenas. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 8 23:05:24 2013 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 8 Oct 2013 23:05:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318948=3A_improve_?= =?utf-8?q?SuppressCoreFiles_to_include_Windows_crash_popup?= Message-ID: <3cvWKw6wMmz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/1cbd3d9f7d61 changeset: 86164:1cbd3d9f7d61 user: Antoine Pitrou date: Tue Oct 08 23:04:32 2013 +0200 summary: Issue #18948: improve SuppressCoreFiles to include Windows crash popup suppression, and use it in more tests. Patch by Valerie Lambert and Zachary Ware. files: Doc/library/test.rst | 22 ++- Lib/test/support/__init__.py | 124 +++++++++++----------- Lib/test/test_capi.py | 2 +- Lib/test/test_faulthandler.py | 24 +--- Lib/test/test_subprocess.py | 2 +- Lib/test/test_support.py | 2 +- Lib/test/test_sys.py | 2 +- Lib/test/test_threading.py | 3 +- 8 files changed, 87 insertions(+), 94 deletions(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -442,13 +442,6 @@ A decorator for running tests that require support for symbolic links. -.. function:: suppress_crash_popup() - - A context manager that disables Windows Error Reporting dialogs using - `SetErrorMode `_. - On other platforms it's a no-op. - - .. decorator:: anticipate_failure(condition) A decorator to conditionally mark tests with @@ -593,6 +586,21 @@ Temporarily unset the environment variable ``envvar``. +.. class:: SuppressCrashReport() + + A context manager used to try to prevent crash dialog popups on tests that + are expected to crash a subprocess. + + On Windows, it disables Windows Error Reporting dialogs using + `SetErrorMode `_. + + On UNIX, :func:`resource.setrlimit` is used to set + :attr:`resource.RLIMIT_CORE`'s soft limit to 0 to prevent coredump file + creation. + + On both platforms, the old value is restored by :meth:`__exit__`. + + .. class:: WarningsRecorder() Class used to record warnings for unit tests. See documentation of diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -81,8 +81,7 @@ "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", "skip_unless_xattr", "import_fresh_module", "requires_zlib", "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz", - "requires_gzip", "requires_bz2", "requires_lzma", "suppress_crash_popup", - "SuppressCoreFiles", + "requires_gzip", "requires_bz2", "requires_lzma", "SuppressCrashReport" ] class Error(Exception): @@ -2013,27 +2012,67 @@ return test if ok else unittest.skip(msg)(test) -if sys.platform.startswith('win'): - @contextlib.contextmanager - def suppress_crash_popup(): - """Disable Windows Error Reporting dialogs using SetErrorMode.""" - # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx - # GetErrorMode is not available on Windows XP and Windows Server 2003, - # but SetErrorMode returns the previous value, so we can use that - import ctypes - k32 = ctypes.windll.kernel32 - SEM_NOGPFAULTERRORBOX = 0x02 - old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX) - k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX) - try: - yield - finally: - k32.SetErrorMode(old_error_mode) -else: - # this is a no-op for other platforms - @contextlib.contextmanager - def suppress_crash_popup(): - yield +class SuppressCrashReport: + """Try to prevent a crash report from popping up. + + On Windows, don't display the Windows Error Reporting dialog. On UNIX, + disable the creation of coredump file. + """ + old_value = None + + def __enter__(self): + """On Windows, disable Windows Error Reporting dialogs using + SetErrorMode. + + On UNIX, try to save the previous core file size limit, then set + soft limit to 0. + """ + if sys.platform.startswith('win'): + # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx + # GetErrorMode is not available on Windows XP and Windows Server 2003, + # but SetErrorMode returns the previous value, so we can use that + import ctypes + self._k32 = ctypes.windll.kernel32 + SEM_NOGPFAULTERRORBOX = 0x02 + self.old_value = self._k32.SetErrorMode(SEM_NOGPFAULTERRORBOX) + self._k32.SetErrorMode(self.old_value | SEM_NOGPFAULTERRORBOX) + else: + if resource is not None: + try: + self.old_value = resource.getrlimit(resource.RLIMIT_CORE) + resource.setrlimit(resource.RLIMIT_CORE, + (0, self.old_value[1])) + except (ValueError, OSError): + pass + if sys.platform == 'darwin': + # Check if the 'Crash Reporter' on OSX was configured + # in 'Developer' mode and warn that it will get triggered + # when it is. + # + # This assumes that this context manager is used in tests + # that might trigger the next manager. + value = subprocess.Popen(['/usr/bin/defaults', 'read', + 'com.apple.CrashReporter', 'DialogType'], + stdout=subprocess.PIPE).communicate()[0] + if value.strip() == b'developer': + print("this test triggers the Crash Reporter, " + "that is intentional", end='', flush=True) + + return self + + def __exit__(self, *ignore_exc): + """Restore Windows ErrorMode or core file behavior to initial value.""" + if self.old_value is None: + return + + if sys.platform.startswith('win'): + self._k32.SetErrorMode(self.old_value) + else: + if resource is not None: + try: + resource.setrlimit(resource.RLIMIT_CORE, self.old_value) + except (ValueError, OSError): + pass def patch(test_instance, object_to_patch, attr_name, new_value): @@ -2068,42 +2107,3 @@ # actually override the attribute setattr(object_to_patch, attr_name, new_value) - - -class SuppressCoreFiles: - - """Try to prevent core files from being created.""" - old_limit = None - - def __enter__(self): - """Try to save previous ulimit, then set the soft limit to 0.""" - if resource is not None: - try: - self.old_limit = resource.getrlimit(resource.RLIMIT_CORE) - resource.setrlimit(resource.RLIMIT_CORE, (0, self.old_limit[1])) - except (ValueError, OSError): - pass - if sys.platform == 'darwin': - # Check if the 'Crash Reporter' on OSX was configured - # in 'Developer' mode and warn that it will get triggered - # when it is. - # - # This assumes that this context manager is used in tests - # that might trigger the next manager. - value = subprocess.Popen(['/usr/bin/defaults', 'read', - 'com.apple.CrashReporter', 'DialogType'], - stdout=subprocess.PIPE).communicate()[0] - if value.strip() == b'developer': - print("this test triggers the Crash Reporter, " - "that is intentional", end='') - sys.stdout.flush() - - def __exit__(self, *ignore_exc): - """Return core file behavior to default.""" - if self.old_limit is None: - return - if resource is not None: - try: - resource.setrlimit(resource.RLIMIT_CORE, self.old_limit) - except (ValueError, OSError): - pass diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -44,7 +44,7 @@ @unittest.skipUnless(threading, 'Threading required for this test.') def test_no_FatalError_infinite_loop(self): - with support.suppress_crash_popup(): + with support.SuppressCrashReport(): p = subprocess.Popen([sys.executable, "-c", 'import _testcapi;' '_testcapi.crash_no_current_thread()'], diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -19,18 +19,6 @@ TIMEOUT = 0.5 -try: - from resource import setrlimit, RLIMIT_CORE, error as resource_error -except ImportError: - prepare_subprocess = None -else: - def prepare_subprocess(): - # don't create core file - try: - setrlimit(RLIMIT_CORE, (0, 0)) - except (ValueError, resource_error): - pass - def expected_traceback(lineno1, lineno2, header, min_count=1): regex = header regex += ' File "", line %s in func\n' % lineno1 @@ -59,10 +47,8 @@ build, and replace "Current thread 0x00007f8d8fbd9700" by "Current thread XXX". """ - options = {} - if prepare_subprocess: - options['preexec_fn'] = prepare_subprocess - process = script_helper.spawn_python('-c', code, **options) + with support.SuppressCrashReport(): + process = script_helper.spawn_python('-c', code) stdout, stderr = process.communicate() exitcode = process.wait() output = support.strip_python_stderr(stdout) @@ -101,8 +87,7 @@ header=re.escape(header)) if other_regex: regex += '|' + other_regex - with support.suppress_crash_popup(): - output, exitcode = self.get_output(code, filename) + output, exitcode = self.get_output(code, filename) output = '\n'.join(output) self.assertRegex(output, regex) self.assertNotEqual(exitcode, 0) @@ -232,8 +217,7 @@ faulthandler._sigsegv() """.strip() not_expected = 'Fatal Python error' - with support.suppress_crash_popup(): - stderr, exitcode = self.get_output(code) + stderr, exitcode = self.get_output(code) stder = '\n'.join(stderr) self.assertTrue(not_expected not in stderr, "%r is present in %r" % (not_expected, stderr)) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1231,7 +1231,7 @@ def test_run_abort(self): # returncode handles signal termination - with support.SuppressCoreFiles(): + with support.SuppressCrashReport(): p = subprocess.Popen([sys.executable, "-c", 'import os; os.abort()']) p.wait() diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -306,7 +306,7 @@ # args_from_interpreter_flags # can_symlink # skip_unless_symlink - # SuppressCoreFiles + # SuppressCrashReport def test_main(): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -250,7 +250,7 @@ sys.setrecursionlimit(%d) f()""") - with test.support.suppress_crash_popup(): + with test.support.SuppressCrashReport(): for i in (50, 1000): sub = subprocess.Popen([sys.executable, '-c', code % i], stderr=subprocess.PIPE) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -839,7 +839,8 @@ _testcapi.run_in_subinterp(%r) """ % (subinterp_code,) - rc, out, err = assert_python_failure("-c", script) + with test.support.SuppressCrashReport(): + rc, out, err = assert_python_failure("-c", script) self.assertIn("Fatal Python error: Py_EndInterpreter: " "not the last thread", err.decode()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 01:24:09 2013 From: python-checkins at python.org (larry.hastings) Date: Wed, 9 Oct 2013 01:24:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Added_PEP_457=2C_Syntax_For_P?= =?utf-8?q?ositional-Only_Parameters=2E?= Message-ID: <3cvZQ10bM6z7LjS@mail.python.org> http://hg.python.org/peps/rev/52b7feaa098b changeset: 5182:52b7feaa098b user: Larry Hastings date: Wed Oct 09 01:23:55 2013 +0200 summary: Added PEP 457, Syntax For Positional-Only Parameters. files: pep-0457.txt | 334 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 334 insertions(+), 0 deletions(-) diff --git a/pep-0457.txt b/pep-0457.txt new file mode 100644 --- /dev/null +++ b/pep-0457.txt @@ -0,0 +1,334 @@ +PEP: 457 +Title: Syntax For Positional-Only Parameters +Version: $Revision$ +Last-Modified: $Date$ +Author: Larry Hastings +Discussions-To: Python-Dev +Status: Draft +Type: Informational +Content-Type: text/x-rst +Created: 08-Oct-2013 + + +======== +Overview +======== + +This PEP proposes a syntax for positional-only parameters in Python. +Positional-only parameters are parameters without an externally-usable +name; when a function accepting positional-only parameters is called, +positional arguments are mapped to these parameters based solely on +their position. + +========= +Rationale +========= + +Python has always supported positional-only parameters. +Early versions of Python lacked the concept of specifying +parameters by name, so naturally all parameters were +positional-only. This changed around Python 1.0, when +all parameters suddenly became positional-or-keyword. +But, even in current versions of Python, many CPython +"builtin" functions still only accept positional-only +arguments. + +Functions implemented in modern Python can accept +an arbitrary number of positional-only arguments, via the +variadic ``*args`` parameter. However, there is no Python +syntax to specify accepting a specific number of +positional-only parameters. Put another way, there are +many builtin functions whose signatures are simply not +expressable with Python syntax. + +This PEP proposes a backwards-compatible syntax that should +permit implementing any builtin in pure Python code. + +----------------------------------------------------- +Positional-Only Parameter Semantics In Current Python +----------------------------------------------------- + +There are many, many examples of builtins that only +accept positional-only parameters. The resulting +semantics are easily experienced by the Python +programmer--just try calling one, specifying its +arguments by name:: + + >>> pow(x=5, y=3) + Traceback (most recent call last): + File "", line 1, in + TypeError: pow() takes no keyword arguments + +In addition, there are some functions with particularly +interesting semantics: + + * ``range()``, which accepts an optional parameter + to the *left* of its required parameter. [#RANGE]_ + + * ``dict()``, whose mapping/iterator parameter is optional and + semantically must be positional-only. Any externally + visible name for this parameter would occlude + that name going into the ``**kwarg`` keyword variadic + parameter dict! [#DICT]_ + +Obviously one can simulate any of these in pure Python code +by accepting ``(*args, **kwargs)`` and parsing the arguments +by hand. But this results in a disconnect between the +Python function's signature and what it actually accepts, +not to mention the work of implementing said argument parsing. + +========== +Motivation +========== + +This PEP does not propose we implement positional-only +parameters in Python. The goal of this PEP is simply +to define the syntax, so that: + + * Documentation can clearly, unambiguously, and + consistently express exactly how the arguments + for a function will be interpreted. + + * The syntax is reserved for future use, in case + the community decides someday to add positional-only + parameters to the language. + + * Argument Clinic can use a variant of the syntax + as part of its input when defining + the arguments for built-in functions. + +================================================================= +The Current State Of Documentation For Positional-Only Parameters +================================================================= + +The documentation for positional-only parameters is incomplete +and inconsistent: + +* Some functions denote optional groups of positional-only arguments + by enclosing them in nested square brackets. [#BORDER]_ + +* Some functions denote optional groups of positional-only arguments + by presenting multiple prototypes with varying numbers of + arguments. [#SENDFILE]_ + +* Some functions use *both* of the above approaches. [#RANGE]_ [#ADDCH]_ + +One more important idea to consider: currently in the documentation +there's no way to tell whether a function takes positional-only +parameters. ``open()`` accepts keyword arguments, ``ord()`` does +not, but there is no way of telling just by reading the +documentation that this is true. + +==================== +Syntax And Semantics +==================== + +From the "ten-thousand foot view", and ignoring ``*args`` and ``**kwargs`` +for now, the grammar for a function definition currently looks like this:: + + def name(positional_or_keyword_parameters, *, keyword_only_parameters): + +Building on that perspective, the new syntax for functions would look +like this:: + + def name(positional_only_parameters, /, positional_or_keyword_parameters, + *, keyword_only_parameters): + +All parameters before the ``/`` are positional-only. If ``/`` is +not specified in a function signature, that function does not +accept any positional-only parameters. + +Positional-only parameters can be optional, but the mechanism is +significantly different from positional-or-keyword or keyword-only +parameters. Positional-only parameters don't accept default +values. Instead, positional-only parameters can be specified +in optional "groups". Groups of parameters are surrounded by +square brackets, like so:: + + def addch([y, x,] ch, [attr], /): + +Positional-only parameters that are not in an option group are +"required" positional-only parameters. All "required" positional-only +parameters must be contiguous. + +Parameters in an optional group accept arguments in a group; you +must provide arguments either for all of the them or for none of them. +Using the example of ``addch()`` above, you could not call ``addch()`` +in such a way that ``x`` was specified but ``y`` was not (and vice versa). +The mapping of positional parameters to optional groups is done +based on fitting the number of parameters to groups. Based on the +above definition, ``addch()`` would assign arguments to parameters +in the following way: + + +-------------------+------------------------------+ + |Number of arguments|Parameter assignment | + +-------------------+------------------------------+ + |0 |*raises an exception* | + +-------------------+------------------------------+ + |1 |``ch`` | + +-------------------+------------------------------+ + |2 |``ch``, ``attr`` | + +-------------------+------------------------------+ + |3 |``y``, ``x``, ``ch`` | + +-------------------+------------------------------+ + |4 |``y``, ``x``, ``ch``, ``attr``| + +-------------------+------------------------------+ + |5 or more |*raises an exception* | + +-------------------+------------------------------+ + + +More semantics of positional-only parameters: + + * Although positional-only parameter technically have names, + these names are internal-only; positional-only parameters + are *never* externally addressable by name. (Similarly + to ``*args`` and ``**kwargs``.) + + * It's possible to nest option groups. + + * If there are no required parameters, all option groups behave + as if they're to the right of the required parameter group. + + * For clarity and consistency, the comma for a parameter always + comes immediately after the parameter name. It's a syntax error + to specify a square bracket between the name of a parameter and + the following comma. (This is far more readable than putting + the comma outside the square bracket, particularly for nested + groups.) + + * If there are arguments after the ``/``, then you must specify + a comma after the ``/``, just as there is a comma + after the ``*`` denoting the shift to keyword-only parameters. + + * This syntax has no effect on ``*args`` or ``**kwargs``. + +It's possible to specify a function prototype where the mapping +of arguments to parameters is ambiguous. Consider:: + + def range([start,] stop, [range], /): + +Python disambiguates these situations by preferring optional groups +to the *left* of the required group. + +====================== +Additional Limitations +====================== + +Argument Clinic uses a form of this syntax for specifying +builtins. It imposes further limitations that are +theoretically unnecessary but make the implementation +easier. Specifically: + +* A function that has positional-only parameters currently + cannot have any other kind of parameter. (This will + probably be relaxed slightly in the near future.) + +* Multiple option groups on either side of the required + positional-only parameters must be nested, with the + nesting getting deeper the further away the group is + from the required positional-parameter group. + + Put another way: + all the left-brackets for option groups to the + left of the required group must be specified contiguously, + and + all the right-brackets for option groups to the + right of the required group must be specified contiguously. + + +============================== +Notes For A Future Implementor +============================== + +If we decide to implement positional-only parameters in a future +version of Python, we'd have to do some additional work to preserve +their semantics. The problem: how do we inform a parameter that +no value was passed in for it when the function was called? + +The obvious solution: add a new singleton constant to Python +that is passed in when a parameter is not mapped to an argument. +I propose that the value be called called ``undefined``, +and be a singleton of a special class called ``Undefined``. +If a positional-only parameter did not receive an argument +when called, its value would be set to ``undefined``. + +But this raises a further problem. How do can we tell the +difference between "this positional-only parameter did not +receive an argument" and "the caller passed in ``undefined`` +for this parameter"? + +It'd be nice to make it illegal to pass ``undefined`` in +as an argument to a function--to, say, raise an exception. +But that would slow Python down, and the "consenting adults" +rule appears applicable here. So making it illegal should +probably be strongly discouraged but not outright prevented. + +However, it should be allowed (and encouraged) for user +functions to specify ``undefined`` as a default value for +parameters. + +==================== +Unresolved Questions +==================== + +There are three types of parameters in Python: + + 1. positional-only parameters, + 2. positional-or-keyword parameters, and + 3. keyword-only parameters. + +Python allows functions to have both 2 and 3. And some +builtins (e.g. range) have both 1 and 3. Does it make +sense to have functions that have both 1 and 2? Or +all of the above? + + +====== +Thanks +====== + +Credit for the use of '/' as the separator between positional-only and positional-or-keyword +parameters goes to Guido van Rossum, in a proposal from 2012. [#GUIDO]_ + +Credit for making left option groups higher precedence goes to +Nick Coghlan. (Conversation in person at PyCon US 2013.) + +.. [#DICT] + http://docs.python.org/3/library/stdtypes.html#dict + +.. [#RANGE] + http://docs.python.org/3/library/functions.html#func-range + +.. [#BORDER] + http://docs.python.org/3/library/curses.html#curses.window.border + +.. [#SENDFILE] + http://docs.python.org/3/library/os.html#os.sendfile + +.. [#ADDCH] + http://docs.python.org/3/library/curses.html#curses.window.addch + +.. [#GUIDO] + Guido van Rossum, posting to python-ideas, March 2012: + http://mail.python.org/pipermail/python-ideas/2012-March/014364.html + and + http://mail.python.org/pipermail/python-ideas/2012-March/014378.html + and + http://mail.python.org/pipermail/python-ideas/2012-March/014417.html + +========= +Copyright +========= + +This document has been placed in the public domain. + + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 02:21:14 2013 From: python-checkins at python.org (larry.hastings) Date: Wed, 9 Oct 2013 02:21:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Fixed_two_syntax_errors_in_PE?= =?utf-8?q?P_457=2E?= Message-ID: <3cvbgt3ysXz7LjP@mail.python.org> http://hg.python.org/peps/rev/4e8ada3a9f74 changeset: 5183:4e8ada3a9f74 user: Larry Hastings date: Wed Oct 09 02:20:56 2013 +0200 summary: Fixed two syntax errors in PEP 457. files: pep-0457.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0457.txt b/pep-0457.txt --- a/pep-0457.txt +++ b/pep-0457.txt @@ -145,7 +145,7 @@ in optional "groups". Groups of parameters are surrounded by square brackets, like so:: - def addch([y, x,] ch, [attr], /): + def addch([y, x,] ch, [attr,] /): Positional-only parameters that are not in an option group are "required" positional-only parameters. All "required" positional-only @@ -205,7 +205,7 @@ It's possible to specify a function prototype where the mapping of arguments to parameters is ambiguous. Consider:: - def range([start,] stop, [range], /): + def range([start,] stop, [range,] /): Python disambiguates these situations by preferring optional groups to the *left* of the required group. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 02:22:29 2013 From: python-checkins at python.org (barry.warsaw) Date: Wed, 9 Oct 2013 02:22:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Support_RESERVED_PEP_numbers?= =?utf-8?q?=2E?= Message-ID: <3cvbjK3QD7z7LjS@mail.python.org> http://hg.python.org/peps/rev/a0bf18e234f3 changeset: 5184:a0bf18e234f3 parent: 5182:52b7feaa098b user: Barry Warsaw date: Tue Oct 08 20:21:56 2013 -0400 summary: Support RESERVED PEP numbers. files: pep0/output.py | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) diff --git a/pep0/output.py b/pep0/output.py --- a/pep0/output.py +++ b/pep0/output.py @@ -8,6 +8,19 @@ from . import constants from .pep import PEP, PEPError +# This is a list of reserved PEP numbers. Reservations are not to be used for +# the normal PEP number allocation process - just give out the next available +# PEP number. These are for "special" numbers that may be used for semantic, +# humorous, or other such reasons, e.g. 401, 666, 754. +# +# PEP numbers may only be reserved with the approval of a PEP editor. Fields +# here are the PEP number being reserved and the claimants for the PEP. +# Although the output is sorted when PEP 0 is generated, please keep this list +# sorted as well. +RESERVED = [ + (801, 'Warsaw'), + ] + indent = u' ' @@ -180,6 +193,17 @@ prev_pep = pep.number print>>output print>>output + print>>output, u'Reserved PEP Numbers' + print>>output + write_column_headers(output) + for number, claimants in sorted(RESERVED): + print>>output, constants.column_format % { + 'type': '', + 'status': '', + 'number': number, + 'title': 'RESERVED', + 'authors': claimants, + } print>>output, u"Key" print>>output for type_ in PEP.type_values: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 02:22:30 2013 From: python-checkins at python.org (barry.warsaw) Date: Wed, 9 Oct 2013 02:22:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps_=28merge_default_-=3E_default=29?= =?utf-8?q?=3A_Head_merge=2E?= Message-ID: <3cvbjL53snz7Lkl@mail.python.org> http://hg.python.org/peps/rev/72edb2870f8b changeset: 5185:72edb2870f8b parent: 5184:a0bf18e234f3 parent: 5183:4e8ada3a9f74 user: Barry Warsaw date: Tue Oct 08 20:22:24 2013 -0400 summary: Head merge. files: pep-0457.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0457.txt b/pep-0457.txt --- a/pep-0457.txt +++ b/pep-0457.txt @@ -145,7 +145,7 @@ in optional "groups". Groups of parameters are surrounded by square brackets, like so:: - def addch([y, x,] ch, [attr], /): + def addch([y, x,] ch, [attr,] /): Positional-only parameters that are not in an option group are "required" positional-only parameters. All "required" positional-only @@ -205,7 +205,7 @@ It's possible to specify a function prototype where the mapping of arguments to parameters is ambiguous. Consider:: - def range([start,] stop, [range], /): + def range([start,] stop, [range,] /): Python disambiguates these situations by preferring optional groups to the *left* of the required group. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 02:37:49 2013 From: python-checkins at python.org (barry.warsaw) Date: Wed, 9 Oct 2013 02:37:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_More_space?= Message-ID: <3cvc313HLkz7Ll1@mail.python.org> http://hg.python.org/peps/rev/ab871721d316 changeset: 5186:ab871721d316 user: Barry Warsaw date: Tue Oct 08 20:37:44 2013 -0400 summary: More space files: pep0/output.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/pep0/output.py b/pep0/output.py --- a/pep0/output.py +++ b/pep0/output.py @@ -204,6 +204,8 @@ 'title': 'RESERVED', 'authors': claimants, } + print>>output + print>>output print>>output, u"Key" print>>output for type_ in PEP.type_values: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 02:56:45 2013 From: python-checkins at python.org (larry.hastings) Date: Wed, 9 Oct 2013 02:56:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Fixed_fixed_a_a_doubled_doubl?= =?utf-8?q?ed_word_word_in_in_PEP_PEP_457_457=2E?= Message-ID: <3cvcSs2rf3z7LjQ@mail.python.org> http://hg.python.org/peps/rev/1b5ccbf217af changeset: 5187:1b5ccbf217af user: Larry Hastings date: Wed Oct 09 02:56:36 2013 +0200 summary: Fixed fixed a a doubled doubled word word in in PEP PEP 457 457. files: pep-0457.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0457.txt b/pep-0457.txt --- a/pep-0457.txt +++ b/pep-0457.txt @@ -247,7 +247,7 @@ The obvious solution: add a new singleton constant to Python that is passed in when a parameter is not mapped to an argument. -I propose that the value be called called ``undefined``, +I propose that the value be called ``undefined``, and be a singleton of a special class called ``Undefined``. If a positional-only parameter did not receive an argument when called, its value would be set to ``undefined``. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 9 04:30:14 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 04:30:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgMTkxNTg6?= =?utf-8?q?__a_rare_race_in_BoundedSemaphore_could_allow_=2Erelease=28=29_?= =?utf-8?q?too_often=2E?= Message-ID: <3cvfXk75DDz7LjP@mail.python.org> http://hg.python.org/cpython/rev/e06edc0c7a49 changeset: 86165:e06edc0c7a49 branch: 3.3 parent: 86162:263001204b96 user: Tim Peters date: Tue Oct 08 20:55:51 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. files: Lib/test/test_threading.py | 18 ++++++++++++++++++ Lib/threading.py | 8 +++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -468,6 +468,24 @@ self.assertEqual(0, status) + def test_BoundedSemaphore_limit(self): + # BoundedSemaphore should raise ValueError if released too often. + for limit in range(1, 10): + bs = threading.BoundedSemaphore(limit) + threads = [threading.Thread(target=bs.acquire) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + threads = [threading.Thread(target=bs.release) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + self.assertRaises(ValueError, bs.release) + class ThreadJoinOnShutdown(BaseTestCase): # Between fork() and exec(), only async-safe functions are allowed (issues diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -283,9 +283,11 @@ self._initial_value = value def release(self): - if self._value >= self._initial_value: - raise ValueError("Semaphore released too many times") - return Semaphore.release(self) + with self._cond: + if self._value >= self._initial_value: + raise ValueError("Semaphore released too many times") + self._value += 1 + self._cond.notify() class Event: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 04:30:16 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 04:30:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_19158=3A__a_rare_race_in_BoundedSemaphore_could_al?= =?utf-8?q?low_=2Erelease=28=29_too_often=2E?= Message-ID: <3cvfXm1p5zz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/7c56bf5afee6 changeset: 86166:7c56bf5afee6 parent: 86164:1cbd3d9f7d61 parent: 86165:e06edc0c7a49 user: Tim Peters date: Tue Oct 08 21:12:58 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. files: Lib/test/test_threading.py | 18 ++++++++++++++++++ Lib/threading.py | 8 +++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -599,6 +599,24 @@ time.sleep(0.01) self.assertIn(LOOKING_FOR, repr(t)) # we waited at least 5 seconds + def test_BoundedSemaphore_limit(self): + # BoundedSemaphore should raise ValueError if released too often. + for limit in range(1, 10): + bs = threading.BoundedSemaphore(limit) + threads = [threading.Thread(target=bs.acquire) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + threads = [threading.Thread(target=bs.release) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + self.assertRaises(ValueError, bs.release) + class ThreadJoinOnShutdown(BaseTestCase): def _run_and_join(self, script): diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -289,9 +289,11 @@ self._initial_value = value def release(self): - if self._value >= self._initial_value: - raise ValueError("Semaphore released too many times") - return Semaphore.release(self) + with self._cond: + if self._value >= self._initial_value: + raise ValueError("Semaphore released too many times") + self._value += 1 + self._cond.notify() class Event: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 04:30:17 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 04:30:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMTkxNTg6?= =?utf-8?q?__a_rare_race_in_BoundedSemaphore_could_allow_=2Erelease=28=29_?= =?utf-8?q?too_often=2E?= Message-ID: <3cvfXn3jNgz7LjY@mail.python.org> http://hg.python.org/cpython/rev/cb4fd7515cb4 changeset: 86167:cb4fd7515cb4 branch: 2.7 parent: 86161:0bde9bf22c0a user: Tim Peters date: Tue Oct 08 20:55:51 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. (grafted from e06edc0c7a4951327f0c95ebeebccba6879a6063) files: Lib/test/test_threading.py | 17 +++++++++++++++++ Lib/threading.py | 8 +++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -466,6 +466,23 @@ finally: sys.setcheckinterval(old_interval) + def test_BoundedSemaphore_limit(self): + # BoundedSemaphore should raise ValueError if released too often. + for limit in range(1, 10): + bs = threading.BoundedSemaphore(limit) + threads = [threading.Thread(target=bs.acquire) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + threads = [threading.Thread(target=bs.release) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + self.assertRaises(ValueError, bs.release) class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -531,9 +531,11 @@ raise a ValueError. """ - if self._Semaphore__value >= self._initial_value: - raise ValueError("Semaphore released too many times") - return _Semaphore.release(self) + with self._cond: + if self._value >= self._initial_value: + raise ValueError("Semaphore released too many times") + self._value += 1 + self._cond.notify() def Event(*args, **kwargs): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 04:30:18 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 04:30:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Whitespace_normalization?= =?utf-8?q?=2E?= Message-ID: <3cvfXp5Q0Qz7LkG@mail.python.org> http://hg.python.org/cpython/rev/4f9753139203 changeset: 86168:4f9753139203 parent: 86166:7c56bf5afee6 user: Tim Peters date: Tue Oct 08 21:29:27 2013 -0500 summary: Whitespace normalization. files: Lib/test/test_threading.py | 32 +++++++++++++------------- 1 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -600,22 +600,22 @@ self.assertIn(LOOKING_FOR, repr(t)) # we waited at least 5 seconds def test_BoundedSemaphore_limit(self): - # BoundedSemaphore should raise ValueError if released too often. - for limit in range(1, 10): - bs = threading.BoundedSemaphore(limit) - threads = [threading.Thread(target=bs.acquire) - for _ in range(limit)] - for t in threads: - t.start() - for t in threads: - t.join() - threads = [threading.Thread(target=bs.release) - for _ in range(limit)] - for t in threads: - t.start() - for t in threads: - t.join() - self.assertRaises(ValueError, bs.release) + # BoundedSemaphore should raise ValueError if released too often. + for limit in range(1, 10): + bs = threading.BoundedSemaphore(limit) + threads = [threading.Thread(target=bs.acquire) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + threads = [threading.Thread(target=bs.release) + for _ in range(limit)] + for t in threads: + t.start() + for t in threads: + t.join() + self.assertRaises(ValueError, bs.release) class ThreadJoinOnShutdown(BaseTestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 04:53:26 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 04:53:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogTE9MIC0gMi43IHJl?= =?utf-8?q?quires_very_different_code=2E__Annoying_=3B-=29?= Message-ID: <3cvg3V4ptZz7LjS@mail.python.org> http://hg.python.org/cpython/rev/3f7a2a3cf5c9 changeset: 86169:3f7a2a3cf5c9 branch: 2.7 parent: 86167:cb4fd7515cb4 user: Tim Peters date: Tue Oct 08 21:51:06 2013 -0500 summary: LOL - 2.7 requires very different code. Annoying ;-) files: Lib/threading.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -531,11 +531,11 @@ raise a ValueError. """ - with self._cond: - if self._value >= self._initial_value: + with self._Semaphore__cond: + if self._Semaphore__value >= self._initial_value: raise ValueError("Semaphore released too many times") - self._value += 1 - self._cond.notify() + self._Semaphore__value += 1 + self._Semaphore__cond.notify() def Event(*args, **kwargs): -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 9 07:06:05 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 09 Oct 2013 07:06:05 +0200 Subject: [Python-checkins] Daily reference leaks (1cbd3d9f7d61): sum=1 Message-ID: results for 1cbd3d9f7d61 on branch "default" -------------------------------------------- test_imp leaked [0, 0, 1] references, sum=1 test_site leaked [-2, 0, 2] references, sum=0 test_site leaked [-2, 0, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog2guCpD', '-x'] From python-checkins at python.org Wed Oct 9 08:57:00 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 08:57:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTkz?= =?utf-8?q?=3A_Improved_cross-references_in_the_tutorial=2E?= Message-ID: <3cvmSX24ptz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/ac826284fdd1 changeset: 86170:ac826284fdd1 branch: 2.7 user: Serhiy Storchaka date: Wed Oct 09 09:54:32 2013 +0300 summary: Issue #19193: Improved cross-references in the tutorial. files: Doc/tutorial/classes.rst | 9 ++- Doc/tutorial/stdlib2.rst | 62 ++++++++++++++------------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -609,7 +609,7 @@ A piece of Python code that expects a particular abstract data type can often be passed a class that emulates the methods of that data type instead. For instance, if you have a function that formats some data from a file object, you -can define a class with methods :meth:`read` and :meth:`readline` that get the +can define a class with methods :meth:`read` and :meth:`!readline` that get the data from a string buffer instead, and pass it as an argument. .. (Unfortunately, this technique has its limitations: a class can't define @@ -693,9 +693,10 @@ This style of access is clear, concise, and convenient. The use of iterators pervades and unifies Python. Behind the scenes, the :keyword:`for` statement calls :func:`iter` on the container object. The function returns an iterator -object that defines the method :meth:`next` which accesses elements in the -container one at a time. When there are no more elements, :meth:`next` raises a -:exc:`StopIteration` exception which tells the :keyword:`for` loop to terminate. +object that defines the method :meth:`~iterator.next` which accesses elements +in the container one at a time. When there are no more elements, +:meth:`~iterator.next` raises a :exc:`StopIteration` exception which tells the +:keyword:`for` loop to terminate. This example shows how it all works:: >>> s = 'abc' diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -71,9 +71,9 @@ Templating ========== -The :mod:`string` module includes a versatile :class:`Template` class with a -simplified syntax suitable for editing by end-users. This allows users to -customize their applications without having to alter the application. +The :mod:`string` module includes a versatile :class:`~string.Template` class +with a simplified syntax suitable for editing by end-users. This allows users +to customize their applications without having to alter the application. The format uses placeholder names formed by ``$`` with valid Python identifiers (alphanumeric characters and underscores). Surrounding the placeholder with @@ -85,11 +85,11 @@ >>> t.substitute(village='Nottingham', cause='the ditch fund') 'Nottinghamfolk send $10 to the ditch fund.' -The :meth:`substitute` method raises a :exc:`KeyError` when a placeholder is not -supplied in a dictionary or a keyword argument. For mail-merge style -applications, user supplied data may be incomplete and the -:meth:`safe_substitute` method may be more appropriate --- it will leave -placeholders unchanged if data is missing:: +The :meth:`~string.Template.substitute` method raises a :exc:`KeyError` when a +placeholder is not supplied in a dictionary or a keyword argument. For +mail-merge style applications, user supplied data may be incomplete and the +:meth:`~string.Template.safe_substitute` method may be more appropriate --- +it will leave placeholders unchanged if data is missing:: >>> t = Template('Return the $item to $owner.') >>> d = dict(item='unladen swallow') @@ -132,8 +132,9 @@ Working with Binary Data Record Layouts ======================================= -The :mod:`struct` module provides :func:`pack` and :func:`unpack` functions for -working with variable length binary record formats. The following example shows +The :mod:`struct` module provides :func:`~struct.pack` and +:func:`~struct.unpack` functions for working with variable length binary +record formats. The following example shows how to loop through header information in a ZIP file without using the :mod:`zipfile` module. Pack codes ``"H"`` and ``"I"`` represent two and four byte unsigned numbers respectively. The ``"<"`` indicates that they are @@ -229,8 +230,9 @@ By default, informational and debugging messages are suppressed and the output is sent to standard error. Other output options include routing messages through email, datagrams, sockets, or to an HTTP Server. New filters can select -different routing based on message priority: :const:`DEBUG`, :const:`INFO`, -:const:`WARNING`, :const:`ERROR`, and :const:`CRITICAL`. +different routing based on message priority: :const:`~logging.DEBUG`, +:const:`~logging.INFO`, :const:`~logging.WARNING`, :const:`~logging.ERROR`, +and :const:`~logging.CRITICAL`. The logging system can be configured directly from Python or can be loaded from a user editable configuration file for customized logging without altering the @@ -287,11 +289,11 @@ sometimes there is a need for alternative implementations with different performance trade-offs. -The :mod:`array` module provides an :class:`array()` object that is like a list -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:: +The :mod:`array` module provides an :class:`~array.array()` object that is like +a list 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:: >>> from array import array >>> a = array('H', [4000, 10, 700, 22222]) @@ -300,10 +302,10 @@ >>> a[1:3] array('H', [10, 700]) -The :mod:`collections` module provides a :class:`deque()` object that is like a -list with faster appends and pops from the left side but slower lookups in the -middle. These objects are well suited for implementing queues and breadth first -tree searches:: +The :mod:`collections` module provides a :class:`~collections.deque()` object +that is like a list with faster appends and pops from the left side but slower +lookups in the middle. These objects are well suited for implementing queues +and breadth first tree searches:: >>> from collections import deque >>> d = deque(["task1", "task2", "task3"]) @@ -349,8 +351,8 @@ Decimal Floating Point Arithmetic ================================= -The :mod:`decimal` module offers a :class:`Decimal` datatype for decimal -floating point arithmetic. Compared to the built-in :class:`float` +The :mod:`decimal` module offers a :class:`~decimal.Decimal` datatype for +decimal floating point arithmetic. Compared to the built-in :class:`float` implementation of binary floating point, the class is especially helpful for * financial applications and other uses which require exact decimal @@ -374,13 +376,15 @@ >>> round(.70 * 1.05, 2) # same calculation with floats 0.73 -The :class:`Decimal` result keeps a trailing zero, automatically inferring four -place significance from multiplicands with two place significance. Decimal -reproduces mathematics as done by hand and avoids issues that can arise when -binary floating point cannot exactly represent decimal quantities. +The :class:`~decimal.Decimal` result keeps a trailing zero, automatically +inferring four place significance from multiplicands with two place +significance. Decimal reproduces mathematics as done by hand and avoids +issues that can arise when binary floating point cannot exactly represent +decimal quantities. -Exact representation enables the :class:`Decimal` class to perform modulo -calculations and equality tests that are unsuitable for binary floating point:: +Exact representation enables the :class:`~decimal.Decimal` class to perform +modulo calculations and equality tests that are unsuitable for binary floating +point:: >>> Decimal('1.00') % Decimal('.10') Decimal('0.00') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 08:57:01 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 08:57:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTkz?= =?utf-8?q?=3A_Improved_cross-references_in_the_tutorial=2E?= Message-ID: <3cvmSY53Qdz7Lkg@mail.python.org> http://hg.python.org/cpython/rev/012380d57e44 changeset: 86171:012380d57e44 branch: 3.3 parent: 86165:e06edc0c7a49 user: Serhiy Storchaka date: Wed Oct 09 09:54:46 2013 +0300 summary: Issue #19193: Improved cross-references in the tutorial. files: Doc/tutorial/classes.rst | 6 +- Doc/tutorial/stdlib2.rst | 64 ++++++++++++++------------- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -652,7 +652,7 @@ A piece of Python code that expects a particular abstract data type can often be passed a class that emulates the methods of that data type instead. For instance, if you have a function that formats some data from a file object, you -can define a class with methods :meth:`read` and :meth:`readline` that get the +can define a class with methods :meth:`read` and :meth:`!readline` that get the data from a string buffer instead, and pass it as an argument. .. (Unfortunately, this technique has its limitations: a class can't define @@ -738,8 +738,8 @@ calls :func:`iter` on the container object. The function returns an iterator object that defines the method :meth:`~iterator.__next__` which accesses elements in the container one at a time. When there are no more elements, -:meth:`__next__` raises a :exc:`StopIteration` exception which tells the -:keyword:`for` loop to terminate. You can call the :meth:`__next__` method +:meth:`~iterator.__next__` raises a :exc:`StopIteration` exception which tells the +:keyword:`for` loop to terminate. You can call the :meth:`~iterator.__next__` method using the :func:`next` built-in function; this example shows how it all works:: >>> s = 'abc' diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -71,9 +71,9 @@ Templating ========== -The :mod:`string` module includes a versatile :class:`Template` class with a -simplified syntax suitable for editing by end-users. This allows users to -customize their applications without having to alter the application. +The :mod:`string` module includes a versatile :class:`~string.Template` class +with a simplified syntax suitable for editing by end-users. This allows users +to customize their applications without having to alter the application. The format uses placeholder names formed by ``$`` with valid Python identifiers (alphanumeric characters and underscores). Surrounding the placeholder with @@ -85,11 +85,11 @@ >>> t.substitute(village='Nottingham', cause='the ditch fund') 'Nottinghamfolk send $10 to the ditch fund.' -The :meth:`substitute` method raises a :exc:`KeyError` when a placeholder is not -supplied in a dictionary or a keyword argument. For mail-merge style -applications, user supplied data may be incomplete and the -:meth:`safe_substitute` method may be more appropriate --- it will leave -placeholders unchanged if data is missing:: +The :meth:`~string.Template.substitute` method raises a :exc:`KeyError` when a +placeholder is not supplied in a dictionary or a keyword argument. For +mail-merge style applications, user supplied data may be incomplete and the +:meth:`~string.Template.safe_substitute` method may be more appropriate --- +it will leave placeholders unchanged if data is missing:: >>> t = Template('Return the $item to $owner.') >>> d = dict(item='unladen swallow') @@ -132,8 +132,9 @@ Working with Binary Data Record Layouts ======================================= -The :mod:`struct` module provides :func:`pack` and :func:`unpack` functions for -working with variable length binary record formats. The following example shows +The :mod:`struct` module provides :func:`~struct.pack` and +:func:`~struct.unpack` functions for working with variable length binary +record formats. The following example shows how to loop through header information in a ZIP file without using the :mod:`zipfile` module. Pack codes ``"H"`` and ``"I"`` represent two and four byte unsigned numbers respectively. The ``"<"`` indicates that they are @@ -201,7 +202,7 @@ are difficult to reproduce. So, the preferred approach to task coordination is to concentrate all access to a resource in a single thread and then use the :mod:`queue` module to feed that thread with requests from other threads. -Applications using :class:`Queue` objects for inter-thread communication and +Applications using :class:`~queue.Queue` objects for inter-thread communication and coordination are easier to design, more readable, and more reliable. @@ -231,8 +232,9 @@ By default, informational and debugging messages are suppressed and the output is sent to standard error. Other output options include routing messages through email, datagrams, sockets, or to an HTTP Server. New filters can select -different routing based on message priority: :const:`DEBUG`, :const:`INFO`, -:const:`WARNING`, :const:`ERROR`, and :const:`CRITICAL`. +different routing based on message priority: :const:`~logging.DEBUG`, +:const:`~logging.INFO`, :const:`~logging.WARNING`, :const:`~logging.ERROR`, +and :const:`~logging.CRITICAL`. The logging system can be configured directly from Python or can be loaded from a user editable configuration file for customized logging without altering the @@ -289,11 +291,11 @@ sometimes there is a need for alternative implementations with different performance trade-offs. -The :mod:`array` module provides an :class:`array()` object that is like a list -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:: +The :mod:`array` module provides an :class:`~array.array()` object that is like +a list 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:: >>> from array import array >>> a = array('H', [4000, 10, 700, 22222]) @@ -302,10 +304,10 @@ >>> a[1:3] array('H', [10, 700]) -The :mod:`collections` module provides a :class:`deque()` object that is like a -list with faster appends and pops from the left side but slower lookups in the -middle. These objects are well suited for implementing queues and breadth first -tree searches:: +The :mod:`collections` module provides a :class:`~collections.deque()` object +that is like a list with faster appends and pops from the left side but slower +lookups in the middle. These objects are well suited for implementing queues +and breadth first tree searches:: >>> from collections import deque >>> d = deque(["task1", "task2", "task3"]) @@ -351,8 +353,8 @@ Decimal Floating Point Arithmetic ================================= -The :mod:`decimal` module offers a :class:`Decimal` datatype for decimal -floating point arithmetic. Compared to the built-in :class:`float` +The :mod:`decimal` module offers a :class:`~decimal.Decimal` datatype for +decimal floating point arithmetic. Compared to the built-in :class:`float` implementation of binary floating point, the class is especially helpful for * financial applications and other uses which require exact decimal @@ -373,13 +375,15 @@ >>> round(.70 * 1.05, 2) 0.73 -The :class:`Decimal` result keeps a trailing zero, automatically inferring four -place significance from multiplicands with two place significance. Decimal -reproduces mathematics as done by hand and avoids issues that can arise when -binary floating point cannot exactly represent decimal quantities. +The :class:`~decimal.Decimal` result keeps a trailing zero, automatically +inferring four place significance from multiplicands with two place +significance. Decimal reproduces mathematics as done by hand and avoids +issues that can arise when binary floating point cannot exactly represent +decimal quantities. -Exact representation enables the :class:`Decimal` class to perform modulo -calculations and equality tests that are unsuitable for binary floating point:: +Exact representation enables the :class:`~decimal.Decimal` class to perform +modulo calculations and equality tests that are unsuitable for binary floating +point:: >>> Decimal('1.00') % Decimal('.10') Decimal('0.00') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 08:57:03 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 08:57:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319193=3A_Improved_cross-references_in_the_tutor?= =?utf-8?q?ial=2E?= Message-ID: <3cvmSb0dyxz7Lkc@mail.python.org> http://hg.python.org/cpython/rev/e338a5c8fcfa changeset: 86172:e338a5c8fcfa parent: 86168:4f9753139203 parent: 86171:012380d57e44 user: Serhiy Storchaka date: Wed Oct 09 09:55:21 2013 +0300 summary: Issue #19193: Improved cross-references in the tutorial. files: Doc/tutorial/classes.rst | 6 +- Doc/tutorial/stdlib2.rst | 64 ++++++++++++++------------- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -652,7 +652,7 @@ A piece of Python code that expects a particular abstract data type can often be passed a class that emulates the methods of that data type instead. For instance, if you have a function that formats some data from a file object, you -can define a class with methods :meth:`read` and :meth:`readline` that get the +can define a class with methods :meth:`read` and :meth:`!readline` that get the data from a string buffer instead, and pass it as an argument. .. (Unfortunately, this technique has its limitations: a class can't define @@ -738,8 +738,8 @@ calls :func:`iter` on the container object. The function returns an iterator object that defines the method :meth:`~iterator.__next__` which accesses elements in the container one at a time. When there are no more elements, -:meth:`__next__` raises a :exc:`StopIteration` exception which tells the -:keyword:`for` loop to terminate. You can call the :meth:`__next__` method +:meth:`~iterator.__next__` raises a :exc:`StopIteration` exception which tells the +:keyword:`for` loop to terminate. You can call the :meth:`~iterator.__next__` method using the :func:`next` built-in function; this example shows how it all works:: >>> s = 'abc' diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -71,9 +71,9 @@ Templating ========== -The :mod:`string` module includes a versatile :class:`Template` class with a -simplified syntax suitable for editing by end-users. This allows users to -customize their applications without having to alter the application. +The :mod:`string` module includes a versatile :class:`~string.Template` class +with a simplified syntax suitable for editing by end-users. This allows users +to customize their applications without having to alter the application. The format uses placeholder names formed by ``$`` with valid Python identifiers (alphanumeric characters and underscores). Surrounding the placeholder with @@ -85,11 +85,11 @@ >>> t.substitute(village='Nottingham', cause='the ditch fund') 'Nottinghamfolk send $10 to the ditch fund.' -The :meth:`substitute` method raises a :exc:`KeyError` when a placeholder is not -supplied in a dictionary or a keyword argument. For mail-merge style -applications, user supplied data may be incomplete and the -:meth:`safe_substitute` method may be more appropriate --- it will leave -placeholders unchanged if data is missing:: +The :meth:`~string.Template.substitute` method raises a :exc:`KeyError` when a +placeholder is not supplied in a dictionary or a keyword argument. For +mail-merge style applications, user supplied data may be incomplete and the +:meth:`~string.Template.safe_substitute` method may be more appropriate --- +it will leave placeholders unchanged if data is missing:: >>> t = Template('Return the $item to $owner.') >>> d = dict(item='unladen swallow') @@ -132,8 +132,9 @@ Working with Binary Data Record Layouts ======================================= -The :mod:`struct` module provides :func:`pack` and :func:`unpack` functions for -working with variable length binary record formats. The following example shows +The :mod:`struct` module provides :func:`~struct.pack` and +:func:`~struct.unpack` functions for working with variable length binary +record formats. The following example shows how to loop through header information in a ZIP file without using the :mod:`zipfile` module. Pack codes ``"H"`` and ``"I"`` represent two and four byte unsigned numbers respectively. The ``"<"`` indicates that they are @@ -201,7 +202,7 @@ are difficult to reproduce. So, the preferred approach to task coordination is to concentrate all access to a resource in a single thread and then use the :mod:`queue` module to feed that thread with requests from other threads. -Applications using :class:`Queue` objects for inter-thread communication and +Applications using :class:`~queue.Queue` objects for inter-thread communication and coordination are easier to design, more readable, and more reliable. @@ -231,8 +232,9 @@ By default, informational and debugging messages are suppressed and the output is sent to standard error. Other output options include routing messages through email, datagrams, sockets, or to an HTTP Server. New filters can select -different routing based on message priority: :const:`DEBUG`, :const:`INFO`, -:const:`WARNING`, :const:`ERROR`, and :const:`CRITICAL`. +different routing based on message priority: :const:`~logging.DEBUG`, +:const:`~logging.INFO`, :const:`~logging.WARNING`, :const:`~logging.ERROR`, +and :const:`~logging.CRITICAL`. The logging system can be configured directly from Python or can be loaded from a user editable configuration file for customized logging without altering the @@ -289,11 +291,11 @@ sometimes there is a need for alternative implementations with different performance trade-offs. -The :mod:`array` module provides an :class:`array()` object that is like a list -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:: +The :mod:`array` module provides an :class:`~array.array()` object that is like +a list 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:: >>> from array import array >>> a = array('H', [4000, 10, 700, 22222]) @@ -302,10 +304,10 @@ >>> a[1:3] array('H', [10, 700]) -The :mod:`collections` module provides a :class:`deque()` object that is like a -list with faster appends and pops from the left side but slower lookups in the -middle. These objects are well suited for implementing queues and breadth first -tree searches:: +The :mod:`collections` module provides a :class:`~collections.deque()` object +that is like a list with faster appends and pops from the left side but slower +lookups in the middle. These objects are well suited for implementing queues +and breadth first tree searches:: >>> from collections import deque >>> d = deque(["task1", "task2", "task3"]) @@ -351,8 +353,8 @@ Decimal Floating Point Arithmetic ================================= -The :mod:`decimal` module offers a :class:`Decimal` datatype for decimal -floating point arithmetic. Compared to the built-in :class:`float` +The :mod:`decimal` module offers a :class:`~decimal.Decimal` datatype for +decimal floating point arithmetic. Compared to the built-in :class:`float` implementation of binary floating point, the class is especially helpful for * financial applications and other uses which require exact decimal @@ -373,13 +375,15 @@ >>> round(.70 * 1.05, 2) 0.73 -The :class:`Decimal` result keeps a trailing zero, automatically inferring four -place significance from multiplicands with two place significance. Decimal -reproduces mathematics as done by hand and avoids issues that can arise when -binary floating point cannot exactly represent decimal quantities. +The :class:`~decimal.Decimal` result keeps a trailing zero, automatically +inferring four place significance from multiplicands with two place +significance. Decimal reproduces mathematics as done by hand and avoids +issues that can arise when binary floating point cannot exactly represent +decimal quantities. -Exact representation enables the :class:`Decimal` class to perform modulo -calculations and equality tests that are unsuitable for binary floating point:: +Exact representation enables the :class:`~decimal.Decimal` class to perform +modulo calculations and equality tests that are unsuitable for binary floating +point:: >>> Decimal('1.00') % Decimal('.10') Decimal('0.00') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:00:31 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:00:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMTkxOTU6?= =?utf-8?q?_Improved_cross-references_in_C_API_documentation=2E?= Message-ID: <3cvssW03FYz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/9b855a701e28 changeset: 86173:9b855a701e28 branch: 2.7 parent: 86170:ac826284fdd1 user: Serhiy Storchaka date: Wed Oct 09 13:25:21 2013 +0300 summary: Issue 19195: Improved cross-references in C API documentation. files: Doc/c-api/codec.rst | 8 ++++---- Doc/c-api/file.rst | 3 ++- Doc/c-api/object.rst | 20 ++++++++++---------- Doc/c-api/set.rst | 2 +- Doc/c-api/typeobj.rst | 8 ++++---- Doc/c-api/unicode.rst | 6 +++--- Doc/c-api/veryhigh.rst | 2 +- Doc/extending/building.rst | 5 +++-- Doc/extending/extending.rst | 6 +++--- Doc/extending/newtypes.rst | 2 +- 10 files changed, 32 insertions(+), 30 deletions(-) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -52,19 +52,19 @@ .. c:function:: PyObject* PyCodec_IncrementalEncoder(const char *encoding, const char *errors) - Get an :class:`IncrementalEncoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalEncoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_IncrementalDecoder(const char *encoding, const char *errors) - Get an :class:`IncrementalDecoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalDecoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamReader` factory function for the given *encoding*. + Get a :class:`~codecs.StreamReader` factory function for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamWriter` factory function for the given *encoding*. + Get a :class:`~codecs.StreamWriter` factory function for the given *encoding*. Registry API for Unicode encoding error handlers diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -111,7 +111,8 @@ .. index:: single: EOFError (built-in exception) Equivalent to ``p.readline([n])``, this function reads one line from the - object *p*. *p* may be a file object or any object with a :meth:`readline` + object *p*. *p* may be a file object or any object with a + :meth:`~io.IOBase.readline` method. If *n* is ``0``, exactly one line is read, regardless of the length of the line. If *n* is greater than ``0``, no more than *n* bytes will be read from the file; a partial line can be returned. In both cases, an empty string diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -47,8 +47,8 @@ Generic attribute getter function that is meant to be put into a type object's ``tp_getattro`` slot. It looks for a descriptor in the dictionary of classes in the object's MRO as well as an attribute in the object's - :attr:`__dict__` (if present). As outlined in :ref:`descriptors`, data - descriptors take preference over instance attributes, while non-data + :attr:`~object.__dict__` (if present). As outlined in :ref:`descriptors`, + data descriptors take preference over instance attributes, while non-data descriptors don't. Otherwise, an :exc:`AttributeError` is raised. @@ -72,8 +72,8 @@ object's ``tp_setattro`` slot. It looks for a data descriptor in the dictionary of classes in the object's MRO, and if found it takes preference over setting the attribute in the instance dictionary. Otherwise, the - attribute is set in the object's :attr:`__dict__` (if present). Otherwise, - an :exc:`AttributeError` is raised and ``-1`` is returned. + attribute is set in the object's :attr:`~object.__dict__` (if present). + Otherwise, an :exc:`AttributeError` is raised and ``-1`` is returned. .. c:function:: int PyObject_DelAttr(PyObject *o, PyObject *attr_name) @@ -180,9 +180,9 @@ be done against every entry in *cls*. The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. If *inst* is not a class instance and *cls* is neither a type object, nor a class object, nor a - tuple, *inst* must have a :attr:`__class__` attribute --- the class relationship - of the value of that attribute with *cls* will be used to determine the result - of this function. + tuple, *inst* must have a :attr:`~instance.__class__` attribute --- the + class relationship of the value of that attribute with *cls* will be used + to determine the result of this function. .. versionadded:: 2.1 @@ -196,9 +196,9 @@ either is not a class object, a more general mechanism is used to determine the class relationship of the two objects. When testing if *B* is a subclass of *A*, if *A* is *B*, :c:func:`PyObject_IsSubclass` returns true. If *A* and *B* -are different objects, *B*'s :attr:`__bases__` attribute is searched in a -depth-first fashion for *A* --- the presence of the :attr:`__bases__` attribute -is considered sufficient for this determination. +are different objects, *B*'s :attr:`~class.__bases__` attribute is searched in +a depth-first fashion for *A* --- the presence of the :attr:`~class.__bases__` +attribute is considered sufficient for this determination. .. c:function:: int PyObject_IsSubclass(PyObject *derived, PyObject *cls) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -156,7 +156,7 @@ Return 1 if found and removed, 0 if not found (no action taken), and -1 if an error is encountered. Does not raise :exc:`KeyError` for missing keys. Raise a - :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`discard` + :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.discard` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise :exc:`PyExc_SystemError` if *set* is an not an instance of :class:`set` or its subtype. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -603,7 +603,7 @@ On the other hand, even if you know a member can never be part of a cycle, as a debugging aid you may want to visit it anyway just so the :mod:`gc` module's - :func:`get_referents` function will include it. + :func:`~gc.get_referents` function will include it. Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to :c:func:`local_traverse` to have these specific names; don't name them just @@ -733,7 +733,7 @@ reference list head than the base type. Since the list head is always found via :c:member:`~PyTypeObject.tp_weaklistoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types are weakly referenceable, the type is made weakly referenceable by adding a weak reference list head slot to the instance layout and setting the :c:member:`~PyTypeObject.tp_weaklistoffset` of that slot's offset. @@ -927,7 +927,7 @@ dictionary at a difference offset than the base type. Since the dictionary is always found via :c:member:`~PyTypeObject.tp_dictoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types has an instance variable dictionary, a dictionary slot is added to the instance layout and the :c:member:`~PyTypeObject.tp_dictoffset` is set to that slot's offset. @@ -935,7 +935,7 @@ When a type defined by a class statement has a :attr:`__slots__` declaration, the type inherits its :c:member:`~PyTypeObject.tp_dictoffset` from its base type. - (Adding a slot named :attr:`__dict__` to the :attr:`__slots__` declaration does + (Adding a slot named :attr:`~object.__dict__` to the :attr:`__slots__` declaration does not have the expected effect, it just causes confusion. Maybe this should be added as a feature just like :attr:`__weakref__` though.) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -455,9 +455,9 @@ Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python string object. *encoding* and *errors* have the same meaning as the parameters - of the same name in the Unicode :meth:`encode` method. The codec to be used is - looked up using the Python codec registry. Return *NULL* if an exception was - raised by the codec. + of the same name in the Unicode :meth:`~unicode.encode` method. The codec + to be used is looked up using the Python codec registry. Return *NULL* if + an exception was raised by the codec. .. versionchanged:: 2.5 This function used an :c:type:`int` type for *size*. This might require diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -265,7 +265,7 @@ frame *f* is executed, interpreting bytecode and executing calls as needed. The additional *throwflag* parameter can mostly be ignored - if true, then it causes an exception to immediately be thrown; this is used for the - :meth:`throw` methods of generator objects. + :meth:`~generator.throw` methods of generator objects. .. c:function:: int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst --- a/Doc/extending/building.rst +++ b/Doc/extending/building.rst @@ -58,8 +58,9 @@ It is common to pre-compute arguments to :func:`setup`, to better structure the driver script. In the example above, the\ ``ext_modules`` argument to :func:`setup` is a list of extension modules, each of which is an instance of -the :class:`Extension`. In the example, the instance defines an extension named -``demo`` which is build by compiling a single source file, :file:`demo.c`. +the :class:`~distutils.extension.Extension`. In the example, the instance +defines an extension named ``demo`` which is build by compiling a single source +file, :file:`demo.c`. In many cases, building an extension is more complex, since additional preprocessor defines and libraries may be needed. This is demonstrated in the diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -845,9 +845,9 @@ The cycle detector is able to detect garbage cycles and can reclaim them so long as there are no finalizers implemented in Python (:meth:`__del__` methods). When there are such finalizers, the detector exposes the cycles through the -:mod:`gc` module (specifically, the -``garbage`` variable in that module). The :mod:`gc` module also exposes a way -to run the detector (the :func:`collect` function), as well as configuration +:mod:`gc` module (specifically, the :attr:`~gc.garbage` variable in that module). +The :mod:`gc` module also exposes a way to run the detector (the +:func:`~gc.collect` function), as well as configuration interfaces and the ability to disable the detector at runtime. The cycle detector is considered an optional component; though it is included by default, it can be disabled at build time using the :option:`--without-cycle-gc` option diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -152,7 +152,7 @@ If you want your type to be subclassable from Python, and your type has the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple inheritance. A Python subclass of your type will have to list your type first - in its :attr:`__bases__`, or else it will not be able to call your type's + in its :attr:`~class.__bases__`, or else it will not be able to call your type's :meth:`__new__` method without getting an error. You can avoid this problem by ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of the time, this will be true anyway, because either your -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:00:32 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:00:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgMTkxOTU6?= =?utf-8?q?_Improved_cross-references_in_C_API_documentation=2E?= Message-ID: <3cvssX3TVSz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/f0491617b098 changeset: 86174:f0491617b098 branch: 3.3 parent: 86171:012380d57e44 user: Serhiy Storchaka date: Wed Oct 09 13:26:17 2013 +0300 summary: Issue 19195: Improved cross-references in C API documentation. files: Doc/c-api/codec.rst | 8 ++++---- Doc/c-api/file.rst | 9 +++++---- Doc/c-api/object.rst | 20 ++++++++++---------- Doc/c-api/set.rst | 2 +- Doc/c-api/typeobj.rst | 8 ++++---- Doc/c-api/unicode.rst | 6 +++--- Doc/c-api/veryhigh.rst | 2 +- Doc/extending/building.rst | 5 +++-- Doc/extending/extending.rst | 6 +++--- Doc/extending/newtypes.rst | 2 +- 10 files changed, 35 insertions(+), 33 deletions(-) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -52,19 +52,19 @@ .. c:function:: PyObject* PyCodec_IncrementalEncoder(const char *encoding, const char *errors) - Get an :class:`IncrementalEncoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalEncoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_IncrementalDecoder(const char *encoding, const char *errors) - Get an :class:`IncrementalDecoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalDecoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamReader` factory function for the given *encoding*. + Get a :class:`~codecs.StreamReader` factory function for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamWriter` factory function for the given *encoding*. + Get a :class:`~codecs.StreamWriter` factory function for the given *encoding*. Registry API for Unicode encoding error handlers diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -40,9 +40,9 @@ Return the file descriptor associated with *p* as an :c:type:`int`. If the object is an integer, its value is returned. If not, the - object's :meth:`fileno` method is called if it exists; the method must return - an integer, which is returned as the file descriptor value. Sets an - exception and returns ``-1`` on failure. + object's :meth:`~io.IOBase.fileno` method is called if it exists; the + method must return an integer, which is returned as the file descriptor + value. Sets an exception and returns ``-1`` on failure. .. c:function:: PyObject* PyFile_GetLine(PyObject *p, int n) @@ -50,7 +50,8 @@ .. index:: single: EOFError (built-in exception) Equivalent to ``p.readline([n])``, this function reads one line from the - object *p*. *p* may be a file object or any object with a :meth:`readline` + object *p*. *p* may be a file object or any object with a + :meth:`~io.IOBase.readline` method. If *n* is ``0``, exactly one line is read, regardless of the length of the line. If *n* is greater than ``0``, no more than *n* bytes will be read from the file; a partial line can be returned. In both cases, an empty string diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -60,8 +60,8 @@ Generic attribute getter function that is meant to be put into a type object's ``tp_getattro`` slot. It looks for a descriptor in the dictionary of classes in the object's MRO as well as an attribute in the object's - :attr:`__dict__` (if present). As outlined in :ref:`descriptors`, data - descriptors take preference over instance attributes, while non-data + :attr:`~object.__dict__` (if present). As outlined in :ref:`descriptors`, + data descriptors take preference over instance attributes, while non-data descriptors don't. Otherwise, an :exc:`AttributeError` is raised. @@ -85,8 +85,8 @@ object's ``tp_setattro`` slot. It looks for a data descriptor in the dictionary of classes in the object's MRO, and if found it takes preference over setting the attribute in the instance dictionary. Otherwise, the - attribute is set in the object's :attr:`__dict__` (if present). Otherwise, - an :exc:`AttributeError` is raised and ``-1`` is returned. + attribute is set in the object's :attr:`~object.__dict__` (if present). + Otherwise, an :exc:`AttributeError` is raised and ``-1`` is returned. .. c:function:: int PyObject_DelAttr(PyObject *o, PyObject *attr_name) @@ -189,9 +189,9 @@ be done against every entry in *cls*. The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. If *inst* is not a class instance and *cls* is neither a type object, nor a class object, nor a - tuple, *inst* must have a :attr:`__class__` attribute --- the class relationship - of the value of that attribute with *cls* will be used to determine the result - of this function. + tuple, *inst* must have a :attr:`~instance.__class__` attribute --- the + class relationship of the value of that attribute with *cls* will be used + to determine the result of this function. Subclass determination is done in a fairly straightforward way, but includes a @@ -201,9 +201,9 @@ either is not a class object, a more general mechanism is used to determine the class relationship of the two objects. When testing if *B* is a subclass of *A*, if *A* is *B*, :c:func:`PyObject_IsSubclass` returns true. If *A* and *B* -are different objects, *B*'s :attr:`__bases__` attribute is searched in a -depth-first fashion for *A* --- the presence of the :attr:`__bases__` attribute -is considered sufficient for this determination. +are different objects, *B*'s :attr:`~class.__bases__` attribute is searched in +a depth-first fashion for *A* --- the presence of the :attr:`~class.__bases__` +attribute is considered sufficient for this determination. .. c:function:: int PyObject_IsSubclass(PyObject *derived, PyObject *cls) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -140,7 +140,7 @@ Return 1 if found and removed, 0 if not found (no action taken), and -1 if an error is encountered. Does not raise :exc:`KeyError` for missing keys. Raise a - :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`discard` + :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.discard` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise :exc:`PyExc_SystemError` if *set* is an not an instance of :class:`set` or its subtype. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -502,7 +502,7 @@ On the other hand, even if you know a member can never be part of a cycle, as a debugging aid you may want to visit it anyway just so the :mod:`gc` module's - :func:`get_referents` function will include it. + :func:`~gc.get_referents` function will include it. Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to :c:func:`local_traverse` to have these specific names; don't name them just @@ -627,7 +627,7 @@ reference list head than the base type. Since the list head is always found via :c:member:`~PyTypeObject.tp_weaklistoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types are weakly referenceable, the type is made weakly referenceable by adding a weak reference list head slot to the instance layout and setting the :c:member:`~PyTypeObject.tp_weaklistoffset` of that slot's offset. @@ -817,7 +817,7 @@ dictionary at a difference offset than the base type. Since the dictionary is always found via :c:member:`~PyTypeObject.tp_dictoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types has an instance variable dictionary, a dictionary slot is added to the instance layout and the :c:member:`~PyTypeObject.tp_dictoffset` is set to that slot's offset. @@ -825,7 +825,7 @@ When a type defined by a class statement has a :attr:`__slots__` declaration, the type inherits its :c:member:`~PyTypeObject.tp_dictoffset` from its base type. - (Adding a slot named :attr:`__dict__` to the :attr:`__slots__` declaration does + (Adding a slot named :attr:`~object.__dict__` to the :attr:`__slots__` declaration does not have the expected effect, it just causes confusion. Maybe this should be added as a feature just like :attr:`__weakref__` though.) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -967,7 +967,7 @@ Create a Unicode object by decoding *size* bytes of the encoded string *s*. *encoding* and *errors* have the same meaning as the parameters of the same name - in the :func:`unicode` built-in function. The codec to be used is looked up + in the :func:`str` built-in function. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. @@ -977,7 +977,7 @@ Encode a Unicode object and return the result as Python bytes object. *encoding* and *errors* have the same meaning as the parameters of the same - name in the Unicode :meth:`encode` method. The codec to be used is looked up + name in the Unicode :meth:`~str.encode` method. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. @@ -987,7 +987,7 @@ Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python bytes object. *encoding* and *errors* have the same meaning as the - parameters of the same name in the Unicode :meth:`encode` method. The codec + parameters of the same name in the Unicode :meth:`~str.encode` method. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -283,7 +283,7 @@ frame *f* is executed, interpreting bytecode and executing calls as needed. The additional *throwflag* parameter can mostly be ignored - if true, then it causes an exception to immediately be thrown; this is used for the - :meth:`throw` methods of generator objects. + :meth:`~generator.throw` methods of generator objects. .. c:function:: int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst --- a/Doc/extending/building.rst +++ b/Doc/extending/building.rst @@ -58,8 +58,9 @@ It is common to pre-compute arguments to :func:`setup`, to better structure the driver script. In the example above, the\ ``ext_modules`` argument to :func:`setup` is a list of extension modules, each of which is an instance of -the :class:`Extension`. In the example, the instance defines an extension named -``demo`` which is build by compiling a single source file, :file:`demo.c`. +the :class:`~distutils.extension.Extension`. In the example, the instance +defines an extension named ``demo`` which is build by compiling a single source +file, :file:`demo.c`. In many cases, building an extension is more complex, since additional preprocessor defines and libraries may be needed. This is demonstrated in the diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -860,9 +860,9 @@ The cycle detector is able to detect garbage cycles and can reclaim them so long as there are no finalizers implemented in Python (:meth:`__del__` methods). When there are such finalizers, the detector exposes the cycles through the -:mod:`gc` module (specifically, the -``garbage`` variable in that module). The :mod:`gc` module also exposes a way -to run the detector (the :func:`collect` function), as well as configuration +:mod:`gc` module (specifically, the :attr:`~gc.garbage` variable in that module). +The :mod:`gc` module also exposes a way to run the detector (the +:func:`~gc.collect` function), as well as configuration interfaces and the ability to disable the detector at runtime. The cycle detector is considered an optional component; though it is included by default, it can be disabled at build time using the :option:`--without-cycle-gc` option diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -137,7 +137,7 @@ If you want your type to be subclassable from Python, and your type has the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple inheritance. A Python subclass of your type will have to list your type first - in its :attr:`__bases__`, or else it will not be able to call your type's + in its :attr:`~class.__bases__`, or else it will not be able to call your type's :meth:`__new__` method without getting an error. You can avoid this problem by ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of the time, this will be true anyway, because either your -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:00:34 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:00:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_19195=3A_Improved_cross-references_in_C_API_docume?= =?utf-8?q?ntation=2E?= Message-ID: <3cvssZ09Zqz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/e30b27927e49 changeset: 86175:e30b27927e49 parent: 86172:e338a5c8fcfa parent: 86174:f0491617b098 user: Serhiy Storchaka date: Wed Oct 09 13:26:57 2013 +0300 summary: Issue 19195: Improved cross-references in C API documentation. files: Doc/c-api/codec.rst | 8 ++++---- Doc/c-api/file.rst | 9 +++++---- Doc/c-api/object.rst | 20 ++++++++++---------- Doc/c-api/set.rst | 2 +- Doc/c-api/typeobj.rst | 8 ++++---- Doc/c-api/unicode.rst | 6 +++--- Doc/c-api/veryhigh.rst | 2 +- Doc/extending/building.rst | 5 +++-- Doc/extending/extending.rst | 6 +++--- Doc/extending/newtypes.rst | 2 +- 10 files changed, 35 insertions(+), 33 deletions(-) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -52,19 +52,19 @@ .. c:function:: PyObject* PyCodec_IncrementalEncoder(const char *encoding, const char *errors) - Get an :class:`IncrementalEncoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalEncoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_IncrementalDecoder(const char *encoding, const char *errors) - Get an :class:`IncrementalDecoder` object for the given *encoding*. + Get an :class:`~codecs.IncrementalDecoder` object for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamReader` factory function for the given *encoding*. + Get a :class:`~codecs.StreamReader` factory function for the given *encoding*. .. c:function:: PyObject* PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors) - Get a :class:`StreamWriter` factory function for the given *encoding*. + Get a :class:`~codecs.StreamWriter` factory function for the given *encoding*. Registry API for Unicode encoding error handlers diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -40,9 +40,9 @@ Return the file descriptor associated with *p* as an :c:type:`int`. If the object is an integer, its value is returned. If not, the - object's :meth:`fileno` method is called if it exists; the method must return - an integer, which is returned as the file descriptor value. Sets an - exception and returns ``-1`` on failure. + object's :meth:`~io.IOBase.fileno` method is called if it exists; the + method must return an integer, which is returned as the file descriptor + value. Sets an exception and returns ``-1`` on failure. .. c:function:: PyObject* PyFile_GetLine(PyObject *p, int n) @@ -50,7 +50,8 @@ .. index:: single: EOFError (built-in exception) Equivalent to ``p.readline([n])``, this function reads one line from the - object *p*. *p* may be a file object or any object with a :meth:`readline` + object *p*. *p* may be a file object or any object with a + :meth:`~io.IOBase.readline` method. If *n* is ``0``, exactly one line is read, regardless of the length of the line. If *n* is greater than ``0``, no more than *n* bytes will be read from the file; a partial line can be returned. In both cases, an empty string diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -60,8 +60,8 @@ Generic attribute getter function that is meant to be put into a type object's ``tp_getattro`` slot. It looks for a descriptor in the dictionary of classes in the object's MRO as well as an attribute in the object's - :attr:`__dict__` (if present). As outlined in :ref:`descriptors`, data - descriptors take preference over instance attributes, while non-data + :attr:`~object.__dict__` (if present). As outlined in :ref:`descriptors`, + data descriptors take preference over instance attributes, while non-data descriptors don't. Otherwise, an :exc:`AttributeError` is raised. @@ -85,8 +85,8 @@ object's ``tp_setattro`` slot. It looks for a data descriptor in the dictionary of classes in the object's MRO, and if found it takes preference over setting the attribute in the instance dictionary. Otherwise, the - attribute is set in the object's :attr:`__dict__` (if present). Otherwise, - an :exc:`AttributeError` is raised and ``-1`` is returned. + attribute is set in the object's :attr:`~object.__dict__` (if present). + Otherwise, an :exc:`AttributeError` is raised and ``-1`` is returned. .. c:function:: int PyObject_DelAttr(PyObject *o, PyObject *attr_name) @@ -189,9 +189,9 @@ be done against every entry in *cls*. The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. If *inst* is not a class instance and *cls* is neither a type object, nor a class object, nor a - tuple, *inst* must have a :attr:`__class__` attribute --- the class relationship - of the value of that attribute with *cls* will be used to determine the result - of this function. + tuple, *inst* must have a :attr:`~instance.__class__` attribute --- the + class relationship of the value of that attribute with *cls* will be used + to determine the result of this function. Subclass determination is done in a fairly straightforward way, but includes a @@ -201,9 +201,9 @@ either is not a class object, a more general mechanism is used to determine the class relationship of the two objects. When testing if *B* is a subclass of *A*, if *A* is *B*, :c:func:`PyObject_IsSubclass` returns true. If *A* and *B* -are different objects, *B*'s :attr:`__bases__` attribute is searched in a -depth-first fashion for *A* --- the presence of the :attr:`__bases__` attribute -is considered sufficient for this determination. +are different objects, *B*'s :attr:`~class.__bases__` attribute is searched in +a depth-first fashion for *A* --- the presence of the :attr:`~class.__bases__` +attribute is considered sufficient for this determination. .. c:function:: int PyObject_IsSubclass(PyObject *derived, PyObject *cls) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -140,7 +140,7 @@ Return 1 if found and removed, 0 if not found (no action taken), and -1 if an error is encountered. Does not raise :exc:`KeyError` for missing keys. Raise a - :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`discard` + :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.discard` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise :exc:`PyExc_SystemError` if *set* is an not an instance of :class:`set` or its subtype. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -510,7 +510,7 @@ On the other hand, even if you know a member can never be part of a cycle, as a debugging aid you may want to visit it anyway just so the :mod:`gc` module's - :func:`get_referents` function will include it. + :func:`~gc.get_referents` function will include it. Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to :c:func:`local_traverse` to have these specific names; don't name them just @@ -635,7 +635,7 @@ reference list head than the base type. Since the list head is always found via :c:member:`~PyTypeObject.tp_weaklistoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types are weakly referenceable, the type is made weakly referenceable by adding a weak reference list head slot to the instance layout and setting the :c:member:`~PyTypeObject.tp_weaklistoffset` of that slot's offset. @@ -825,7 +825,7 @@ dictionary at a difference offset than the base type. Since the dictionary is always found via :c:member:`~PyTypeObject.tp_dictoffset`, this should not be a problem. - When a type defined by a class statement has no :attr:`__slots__` declaration, + When a type defined by a class statement has no :attr:`~object.__slots__` declaration, and none of its base types has an instance variable dictionary, a dictionary slot is added to the instance layout and the :c:member:`~PyTypeObject.tp_dictoffset` is set to that slot's offset. @@ -833,7 +833,7 @@ When a type defined by a class statement has a :attr:`__slots__` declaration, the type inherits its :c:member:`~PyTypeObject.tp_dictoffset` from its base type. - (Adding a slot named :attr:`__dict__` to the :attr:`__slots__` declaration does + (Adding a slot named :attr:`~object.__dict__` to the :attr:`__slots__` declaration does not have the expected effect, it just causes confusion. Maybe this should be added as a feature just like :attr:`__weakref__` though.) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -978,7 +978,7 @@ Create a Unicode object by decoding *size* bytes of the encoded string *s*. *encoding* and *errors* have the same meaning as the parameters of the same name - in the :func:`unicode` built-in function. The codec to be used is looked up + in the :func:`str` built-in function. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. @@ -988,7 +988,7 @@ Encode a Unicode object and return the result as Python bytes object. *encoding* and *errors* have the same meaning as the parameters of the same - name in the Unicode :meth:`encode` method. The codec to be used is looked up + name in the Unicode :meth:`~str.encode` method. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. @@ -998,7 +998,7 @@ Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python bytes object. *encoding* and *errors* have the same meaning as the - parameters of the same name in the Unicode :meth:`encode` method. The codec + parameters of the same name in the Unicode :meth:`~str.encode` method. The codec to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -312,7 +312,7 @@ frame *f* is executed, interpreting bytecode and executing calls as needed. The additional *throwflag* parameter can mostly be ignored - if true, then it causes an exception to immediately be thrown; this is used for the - :meth:`throw` methods of generator objects. + :meth:`~generator.throw` methods of generator objects. .. c:function:: int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst --- a/Doc/extending/building.rst +++ b/Doc/extending/building.rst @@ -58,8 +58,9 @@ It is common to pre-compute arguments to :func:`setup`, to better structure the driver script. In the example above, the\ ``ext_modules`` argument to :func:`setup` is a list of extension modules, each of which is an instance of -the :class:`Extension`. In the example, the instance defines an extension named -``demo`` which is build by compiling a single source file, :file:`demo.c`. +the :class:`~distutils.extension.Extension`. In the example, the instance +defines an extension named ``demo`` which is build by compiling a single source +file, :file:`demo.c`. In many cases, building an extension is more complex, since additional preprocessor defines and libraries may be needed. This is demonstrated in the diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -860,9 +860,9 @@ The cycle detector is able to detect garbage cycles and can reclaim them so long as there are no finalizers implemented in Python (:meth:`__del__` methods). When there are such finalizers, the detector exposes the cycles through the -:mod:`gc` module (specifically, the -``garbage`` variable in that module). The :mod:`gc` module also exposes a way -to run the detector (the :func:`collect` function), as well as configuration +:mod:`gc` module (specifically, the :attr:`~gc.garbage` variable in that module). +The :mod:`gc` module also exposes a way to run the detector (the +:func:`~gc.collect` function), as well as configuration interfaces and the ability to disable the detector at runtime. The cycle detector is considered an optional component; though it is included by default, it can be disabled at build time using the :option:`--without-cycle-gc` option diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -137,7 +137,7 @@ If you want your type to be subclassable from Python, and your type has the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple inheritance. A Python subclass of your type will have to list your type first - in its :attr:`__bases__`, or else it will not be able to call your type's + in its :attr:`~class.__bases__`, or else it will not be able to call your type's :meth:`__new__` method without getting an error. You can avoid this problem by ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of the time, this will be true anyway, because either your -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:04:14 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:04:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTkw?= =?utf-8?q?=3A_Improve_cross-references_in_builtin_types_and_functions?= Message-ID: <3cvsxp3X04z7Ljs@mail.python.org> http://hg.python.org/cpython/rev/7565df5939de changeset: 86176:7565df5939de branch: 2.7 parent: 86173:9b855a701e28 user: Serhiy Storchaka date: Wed Oct 09 14:02:14 2013 +0300 summary: Issue #19190: Improve cross-references in builtin types and functions documentation. files: Doc/glossary.rst | 5 +- Doc/library/functions.rst | 43 +++++++++++----------- Doc/library/stdtypes.rst | 24 ++++++------ Doc/reference/datamodel.rst | 36 ++++++++++--------- Doc/reference/expressions.rst | 10 +++-- 5 files changed, 62 insertions(+), 56 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -563,7 +563,7 @@ new-style class Any class which inherits from :class:`object`. This includes all built-in types like :class:`list` and :class:`dict`. Only new-style classes can - use Python's newer, versatile features like :attr:`__slots__`, + use Python's newer, versatile features like :attr:`~object.__slots__`, descriptors, properties, and :meth:`__getattribute__`. More information can be found in :ref:`newstyle`. @@ -703,7 +703,8 @@ type The type of a Python object determines what kind of object it is; every object has a type. An object's type is accessible as its - :attr:`__class__` attribute or can be retrieved with ``type(obj)``. + :attr:`~instance.__class__` attribute or can be retrieved with + ``type(obj)``. universal newlines A manner of interpreting text streams in which all of the following are diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -226,8 +226,8 @@ Future statements are specified by bits which can be bitwise ORed together to specify multiple statements. The bitfield required to specify a given feature - can be found as the :attr:`compiler_flag` attribute on the :class:`_Feature` - instance in the :mod:`__future__` module. + can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on + the :class:`~__future__._Feature` instance in the :mod:`__future__` module. This function raises :exc:`SyntaxError` if the compiled source is invalid, and :exc:`TypeError` if the source contains null bytes. @@ -701,7 +701,7 @@ One useful application of the second form of :func:`iter` is to read lines of a file until a certain line is reached. The following example reads a file - until the :meth:`readline` method returns an empty string:: + until the :meth:`~io.TextIOBase.readline` method returns an empty string:: with open('mydata.txt') as fp: for line in iter(fp.readline, ''): @@ -1013,10 +1013,10 @@ turns the :meth:`voltage` method into a "getter" for a read-only attribute with the same name. - A property object has :attr:`getter`, :attr:`setter`, and :attr:`deleter` - methods usable as decorators that create a copy of the property with the - corresponding accessor function set to the decorated function. This is - best explained with an example:: + A property object has :attr:`~property.getter`, :attr:`~property.setter`, + and :attr:`~property.deleter` methods usable as decorators that create a + copy of the property with the corresponding accessor function set to the + decorated function. This is best explained with an example:: class C(object): def __init__(self): @@ -1259,13 +1259,13 @@ Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to - ``None``. Slice objects have read-only data attributes :attr:`start`, - :attr:`stop` and :attr:`step` which merely return the argument values (or their - default). They have no other explicit functionality; however they are used by - Numerical Python and other third party extensions. Slice objects are also - generated when extended indexing syntax is used. For example: - ``a[start:stop:step]`` or ``a[start:stop, i]``. See :func:`itertools.islice` - for an alternate version that returns an iterator. + ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, + :attr:`~slice.stop` and :attr:`~slice.step` which merely return the argument + values (or their default). They have no other explicit functionality; + however they are used by Numerical Python and other third party extensions. + Slice objects are also generated when extended indexing syntax is used. For + example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See + :func:`itertools.islice` for an alternate version that returns an iterator. .. function:: sorted(iterable[, cmp[, key[, reverse]]]) @@ -1370,9 +1370,10 @@ been overridden in a class. The search order is same as that used by :func:`getattr` except that the *type* itself is skipped. - The :attr:`__mro__` attribute of the *type* lists the method resolution - search order used by both :func:`getattr` and :func:`super`. The attribute - is dynamic and can change whenever the inheritance hierarchy is updated. + The :attr:`~class.__mro__` attribute of the *type* lists the method + resolution search order used by both :func:`getattr` and :func:`super`. The + attribute is dynamic and can change whenever the inheritance hierarchy is + updated. If the second argument is omitted, the super object returned is unbound. If the second argument is an object, ``isinstance(obj, type)`` must be true. If @@ -1446,10 +1447,10 @@ With three arguments, return a new type object. This is essentially a dynamic form of the :keyword:`class` statement. The *name* string is the - class name and becomes the :attr:`__name__` attribute; the *bases* tuple - itemizes the base classes and becomes the :attr:`__bases__` attribute; + class name and becomes the :attr:`~class.__name__` attribute; the *bases* tuple + itemizes the base classes and becomes the :attr:`~class.__bases__` attribute; and the *dict* dictionary is the namespace containing definitions for class - body and becomes the :attr:`__dict__` attribute. For example, the + body and becomes the :attr:`~object.__dict__` attribute. For example, the following two statements create identical :class:`type` objects: >>> class X(object): @@ -1513,7 +1514,7 @@ .. function:: vars([object]) - Return the :attr:`__dict__` attribute for a module, class, instance, + Return the :attr:`~object.__dict__` attribute for a module, class, instance, or any other object with a :attr:`__dict__` attribute. Objects such as modules and instances have an updateable :attr:`__dict__` diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1734,11 +1734,11 @@ There are currently two built-in set types, :class:`set` and :class:`frozenset`. The :class:`set` type is mutable --- the contents can be changed using methods -like :meth:`add` and :meth:`remove`. Since it is mutable, it has no hash value -and cannot be used as either a dictionary key or as an element of another set. -The :class:`frozenset` type is immutable and :term:`hashable` --- its contents -cannot be altered after it is created; it can therefore be used as a dictionary -key or as an element of another set. +like :meth:`~set.add` and :meth:`~set.remove`. Since it is mutable, it has no +hash value and cannot be used as either a dictionary key or as an element of +another set. The :class:`frozenset` type is immutable and :term:`hashable` --- +its contents cannot be altered after it is created; it can therefore be used as +a dictionary key or as an element of another set. As of Python 2.7, non-empty sets (not frozensets) can be created by placing a comma-separated list of elements within braces, for example: ``{'jack', @@ -2828,12 +2828,12 @@ foo`` does not require a module object named *foo* to exist, rather it requires an (external) *definition* for a module named *foo* somewhere.) -A special attribute of every module is :attr:`__dict__`. This is the dictionary -containing the module's symbol table. Modifying this dictionary will actually -change the module's symbol table, but direct assignment to the :attr:`__dict__` -attribute is not possible (you can write ``m.__dict__['a'] = 1``, which defines -``m.a`` to be ``1``, but you can't write ``m.__dict__ = {}``). Modifying -:attr:`__dict__` directly is not recommended. +A special attribute of every module is :attr:`~object.__dict__`. This is the +dictionary containing the module's symbol table. Modifying this dictionary will +actually change the module's symbol table, but direct assignment to the +:attr:`__dict__` attribute is not possible (you can write +``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but you can't write +``m.__dict__ = {}``). Modifying :attr:`__dict__` directly is not recommended. Modules built into the interpreter are written like this: ````. If loaded from a file, they are written as `` http://hg.python.org/cpython/rev/207e1e1cb17a changeset: 86177:207e1e1cb17a branch: 3.3 parent: 86174:f0491617b098 user: Serhiy Storchaka date: Wed Oct 09 14:02:31 2013 +0300 summary: Issue #19190: Improve cross-references in builtin types and functions documentation. files: Doc/glossary.rst | 13 ++-- Doc/library/functions.rst | 60 +++++++++++----------- Doc/library/stdtypes.rst | 43 ++++++++-------- Doc/reference/datamodel.rst | 46 +++++++++-------- Doc/reference/expressions.rst | 29 ++++++---- 5 files changed, 100 insertions(+), 91 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -547,9 +547,9 @@ dictionaries. There are the local, global and built-in namespaces as well as nested namespaces in objects (in methods). Namespaces support modularity by preventing naming conflicts. For instance, the functions - :func:`builtins.open` and :func:`os.open` are distinguished by their - namespaces. Namespaces also aid readability and maintainability by making - it clear which module implements a function. For instance, writing + :func:`builtins.open <.open>` and :func:`os.open` are distinguished by + their namespaces. Namespaces also aid readability and maintainability by + making it clear which module implements a function. For instance, writing :func:`random.seed` or :func:`itertools.islice` makes it clear that those functions are implemented by the :mod:`random` and :mod:`itertools` modules, respectively. @@ -574,8 +574,8 @@ new-style class Old name for the flavor of classes now used for all class objects. In earlier Python versions, only new-style classes could use Python's newer, - versatile features like :attr:`__slots__`, descriptors, properties, - :meth:`__getattribute__`, class methods, and static methods. + versatile features like :attr:`~object.__slots__`, descriptors, + properties, :meth:`__getattribute__`, class methods, and static methods. object Any data with state (attributes or value) and defined behavior @@ -790,7 +790,8 @@ type The type of a Python object determines what kind of object it is; every object has a type. An object's type is accessible as its - :attr:`__class__` attribute or can be retrieved with ``type(obj)``. + :attr:`~instance.__class__` attribute or can be retrieved with + ``type(obj)``. universal newlines A manner of interpreting text streams in which all of the following are diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -219,8 +219,8 @@ Future statements are specified by bits which can be bitwise ORed together to specify multiple statements. The bitfield required to specify a given feature - can be found as the :attr:`compiler_flag` attribute on the :class:`_Feature` - instance in the :mod:`__future__` module. + can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on + the :class:`~__future__._Feature` instance in the :mod:`__future__` module. The argument *optimize* specifies the optimization level of the compiler; the default value of ``-1`` selects the optimization level of the interpreter as @@ -707,7 +707,7 @@ One useful application of the second form of :func:`iter` is to read lines of a file until a certain line is reached. The following example reads a file - until the :meth:`readline` method returns an empty string:: + until the :meth:`~io.TextIOBase.readline` method returns an empty string:: with open('mydata.txt') as fp: for line in iter(fp.readline, ''): @@ -810,8 +810,8 @@ .. note:: - :class:`object` does *not* have a :attr:`__dict__`, so you can't assign - arbitrary attributes to an instance of the :class:`object` class. + :class:`object` does *not* have a :attr:`~object.__dict__`, so you can't + assign arbitrary attributes to an instance of the :class:`object` class. .. function:: oct(x) @@ -889,9 +889,9 @@ size" and falling back on :attr:`io.DEFAULT_BUFFER_SIZE`. On many systems, the buffer will typically be 4096 or 8192 bytes long. - * "Interactive" text files (files for which :meth:`isatty` returns True) use - line buffering. Other text files use the policy described above for binary - files. + * "Interactive" text files (files for which :meth:`~io.IOBase.isatty` + returns True) use line buffering. Other text files use the policy + described above for binary files. *encoding* is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform @@ -1096,10 +1096,10 @@ turns the :meth:`voltage` method into a "getter" for a read-only attribute with the same name. - A property object has :attr:`getter`, :attr:`setter`, and :attr:`deleter` - methods usable as decorators that create a copy of the property with the - corresponding accessor function set to the decorated function. This is - best explained with an example:: + A property object has :attr:`~property.getter`, :attr:`~property.setter`, + and :attr:`~property.deleter` methods usable as decorators that create a + copy of the property with the corresponding accessor function set to the + decorated function. This is best explained with an example:: class C: def __init__(self): @@ -1205,13 +1205,13 @@ Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to - ``None``. Slice objects have read-only data attributes :attr:`start`, - :attr:`stop` and :attr:`step` which merely return the argument values (or their - default). They have no other explicit functionality; however they are used by - Numerical Python and other third party extensions. Slice objects are also - generated when extended indexing syntax is used. For example: - ``a[start:stop:step]`` or ``a[start:stop, i]``. See :func:`itertools.islice` - for an alternate version that returns an iterator. + ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, + :attr:`~slice.stop` and :attr:`~slice.step` which merely return the argument + values (or their default). They have no other explicit functionality; + however they are used by Numerical Python and other third party extensions. + Slice objects are also generated when extended indexing syntax is used. For + example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See + :func:`itertools.islice` for an alternate version that returns an iterator. .. function:: sorted(iterable[, key][, reverse]) @@ -1291,9 +1291,10 @@ been overridden in a class. The search order is same as that used by :func:`getattr` except that the *type* itself is skipped. - The :attr:`__mro__` attribute of the *type* lists the method resolution - search order used by both :func:`getattr` and :func:`super`. The attribute - is dynamic and can change whenever the inheritance hierarchy is updated. + The :attr:`~class.__mro__` attribute of the *type* lists the method + resolution search order used by both :func:`getattr` and :func:`super`. The + attribute is dynamic and can change whenever the inheritance hierarchy is + updated. If the second argument is omitted, the super object returned is unbound. If the second argument is an object, ``isinstance(obj, type)`` must be true. If @@ -1356,7 +1357,8 @@ With one argument, return the type of an *object*. The return value is a - type object and generally the same object as returned by ``object.__class__``. + type object and generally the same object as returned by + :attr:`object.__class__ `. The :func:`isinstance` built-in function is recommended for testing the type of an object, because it takes subclasses into account. @@ -1364,11 +1366,11 @@ With three arguments, return a new type object. This is essentially a dynamic form of the :keyword:`class` statement. The *name* string is the - class name and becomes the :attr:`__name__` attribute; the *bases* tuple - itemizes the base classes and becomes the :attr:`__bases__` attribute; - and the *dict* dictionary is the namespace containing definitions for class - body and becomes the :attr:`__dict__` attribute. For example, the - following two statements create identical :class:`type` objects: + class name and becomes the :attr:`~class.__name__` attribute; the *bases* + tuple itemizes the base classes and becomes the :attr:`~class.__bases__` + attribute; and the *dict* dictionary is the namespace containing definitions + for class body and becomes the :attr:`~object.__dict__` attribute. For + example, the following two statements create identical :class:`type` objects: >>> class X: ... a = 1 @@ -1380,7 +1382,7 @@ .. function:: vars([object]) - Return the :attr:`__dict__` attribute for a module, class, instance, + Return the :attr:`~object.__dict__` attribute for a module, class, instance, or any other object with a :attr:`__dict__` attribute. Objects such as modules and instances have an updateable :attr:`__dict__` diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -339,8 +339,8 @@ pair: C; language Conversion from floating point to integer may round or truncate - as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module - for well-defined conversions. + as in C; see functions :func:`math.floor` and :func:`math.ceil` for + well-defined conversions. (4) float also accepts the strings "nan" and "inf" with an optional prefix "+" @@ -631,7 +631,7 @@ :class:`float`, :class:`decimal.Decimal` and :class:`fractions.Fraction`) Python's hash for numeric types is based on a single mathematical function that's defined for any rational number, and hence applies to all instances of -:class:`int` and :class:`fraction.Fraction`, and all finite instances of +:class:`int` and :class:`fractions.Fraction`, and all finite instances of :class:`float` and :class:`decimal.Decimal`. Essentially, this function is given by reduction modulo ``P`` for a fixed prime ``P``. The value of ``P`` is made available to Python as the :attr:`modulus` attribute of @@ -1303,7 +1303,7 @@ only stores the ``start``, ``stop`` and ``step`` values, calculating individual items and subranges as needed). -Range objects implement the :class:`collections.Sequence` ABC, and provide +Range objects implement the :class:`collections.abc.Sequence` ABC, and provide features such as containment tests, element index lookup, slicing and support for negative indices (see :ref:`typesseq`): @@ -1326,9 +1326,9 @@ Testing range objects for equality with ``==`` and ``!=`` compares them as sequences. That is, two range objects are considered equal if they represent the same sequence of values. (Note that two range -objects that compare equal might have different :attr:`start`, -:attr:`stop` and :attr:`step` attributes, for example ``range(0) == -range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.) +objects that compare equal might have different :attr:`~range.start`, +:attr:`~range.stop` and :attr:`~range.step` attributes, for example +``range(0) == range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.) .. versionchanged:: 3.2 Implement the Sequence ABC. @@ -1342,7 +1342,8 @@ object identity). .. versionadded:: 3.3 - The :attr:`start`, :attr:`stop` and :attr:`step` attributes. + The :attr:`~range.start`, :attr:`~range.stop` and :attr:`~range.step` + attributes. .. index:: @@ -2298,7 +2299,7 @@ (inclusive) as their first argument. -Each bytes and bytearray instance provides a :meth:`decode` convenience +Each bytes and bytearray instance provides a :meth:`~bytes.decode` convenience method that is the inverse of :meth:`str.encode`: .. method:: bytes.decode(encoding="utf-8", errors="strict") @@ -2805,11 +2806,11 @@ There are currently two built-in set types, :class:`set` and :class:`frozenset`. The :class:`set` type is mutable --- the contents can be changed using methods -like :meth:`add` and :meth:`remove`. Since it is mutable, it has no hash value -and cannot be used as either a dictionary key or as an element of another set. -The :class:`frozenset` type is immutable and :term:`hashable` --- its contents cannot be -altered after it is created; it can therefore be used as a dictionary key or as -an element of another set. +like :meth:`~set.add` and :meth:`~set.remove`. Since it is mutable, it has no +hash value and cannot be used as either a dictionary key or as an element of +another set. The :class:`frozenset` type is immutable and :term:`hashable` --- +its contents cannot be altered after it is created; it can therefore be used as +a dictionary key or as an element of another set. Non-empty sets (not frozensets) can be created by placing a comma-separated list of elements within braces, for example: ``{'jack', 'sjoerd'}``, in addition to the @@ -3350,12 +3351,12 @@ foo`` does not require a module object named *foo* to exist, rather it requires an (external) *definition* for a module named *foo* somewhere.) -A special attribute of every module is :attr:`__dict__`. This is the dictionary -containing the module's symbol table. Modifying this dictionary will actually -change the module's symbol table, but direct assignment to the :attr:`__dict__` -attribute is not possible (you can write ``m.__dict__['a'] = 1``, which defines -``m.a`` to be ``1``, but you can't write ``m.__dict__ = {}``). Modifying -:attr:`__dict__` directly is not recommended. +A special attribute of every module is :attr:`~object.__dict__`. This is the +dictionary containing the module's symbol table. Modifying this dictionary will +actually change the module's symbol table, but direct assignment to the +:attr:`__dict__` attribute is not possible (you can write +``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but you can't write +``m.__dict__ = {}``). Modifying :attr:`__dict__` directly is not recommended. Modules built into the interpreter are written like this: ````. If loaded from a file, they are written as ```` is used, it treats the supplied expression as a subiterator. All values produced by that subiterator are passed directly to the caller of the current generator's methods. Any values passed in with -:meth:`send` and any exceptions passed in with :meth:`throw` are passed to -the underlying iterator if it has the appropriate methods. If this is not the -case, then :meth:`send` will raise :exc:`AttributeError` or :exc:`TypeError`, -while :meth:`throw` will just raise the passed in exception immediately. +:meth:`~generator.send` and any exceptions passed in with +:meth:`~generator.throw` are passed to the underlying iterator if it has the +appropriate methods. If this is not the case, then :meth:`~generator.send` +will raise :exc:`AttributeError` or :exc:`TypeError`, while +:meth:`~generator.throw` will just raise the passed in exception immediately. When the underlying iterator is complete, the :attr:`~StopIteration.value` attribute of the raised :exc:`StopIteration` instance becomes the value of @@ -388,6 +389,7 @@ is already executing raises a :exc:`ValueError` exception. .. index:: exception: StopIteration +.. class:: generator .. method:: generator.__next__() @@ -438,6 +440,7 @@ other exception, it is propagated to the caller. :meth:`close` does nothing if the generator has already exited due to an exception or normal exit. +.. class:: . .. index:: single: yield; examples @@ -630,10 +633,10 @@ containing the conversion of the slice items; otherwise, the conversion of the lone slice item is the key. The conversion of a slice item that is an expression is that expression. The conversion of a proper slice is a slice -object (see section :ref:`types`) whose :attr:`start`, :attr:`stop` and -:attr:`step` attributes are the values of the expressions given as lower bound, -upper bound and stride, respectively, substituting ``None`` for missing -expressions. +object (see section :ref:`types`) whose :attr:`~slice.start`, +:attr:`~slice.stop` and :attr:`~slice.step` attributes are the values of the +expressions given as lower bound, upper bound and stride, respectively, +substituting ``None`` for missing expressions. .. index:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:04:17 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:04:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319190=3A_Improve_cross-references_in_builtin_ty?= =?utf-8?q?pes_and_functions?= Message-ID: <3cvsxs4fjhz7LkD@mail.python.org> http://hg.python.org/cpython/rev/a3f6e5920881 changeset: 86178:a3f6e5920881 parent: 86175:e30b27927e49 parent: 86177:207e1e1cb17a user: Serhiy Storchaka date: Wed Oct 09 14:03:24 2013 +0300 summary: Issue #19190: Improve cross-references in builtin types and functions documentation. files: Doc/glossary.rst | 13 ++-- Doc/library/functions.rst | 60 +++++++++++----------- Doc/library/stdtypes.rst | 43 ++++++++-------- Doc/reference/datamodel.rst | 46 +++++++++-------- Doc/reference/expressions.rst | 29 ++++++---- 5 files changed, 100 insertions(+), 91 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -556,9 +556,9 @@ dictionaries. There are the local, global and built-in namespaces as well as nested namespaces in objects (in methods). Namespaces support modularity by preventing naming conflicts. For instance, the functions - :func:`builtins.open` and :func:`os.open` are distinguished by their - namespaces. Namespaces also aid readability and maintainability by making - it clear which module implements a function. For instance, writing + :func:`builtins.open <.open>` and :func:`os.open` are distinguished by + their namespaces. Namespaces also aid readability and maintainability by + making it clear which module implements a function. For instance, writing :func:`random.seed` or :func:`itertools.islice` makes it clear that those functions are implemented by the :mod:`random` and :mod:`itertools` modules, respectively. @@ -583,8 +583,8 @@ new-style class Old name for the flavor of classes now used for all class objects. In earlier Python versions, only new-style classes could use Python's newer, - versatile features like :attr:`__slots__`, descriptors, properties, - :meth:`__getattribute__`, class methods, and static methods. + versatile features like :attr:`~object.__slots__`, descriptors, + properties, :meth:`__getattribute__`, class methods, and static methods. object Any data with state (attributes or value) and defined behavior @@ -803,7 +803,8 @@ type The type of a Python object determines what kind of object it is; every object has a type. An object's type is accessible as its - :attr:`__class__` attribute or can be retrieved with ``type(obj)``. + :attr:`~instance.__class__` attribute or can be retrieved with + ``type(obj)``. universal newlines A manner of interpreting text streams in which all of the following are diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -219,8 +219,8 @@ Future statements are specified by bits which can be bitwise ORed together to specify multiple statements. The bitfield required to specify a given feature - can be found as the :attr:`compiler_flag` attribute on the :class:`_Feature` - instance in the :mod:`__future__` module. + can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on + the :class:`~__future__._Feature` instance in the :mod:`__future__` module. The argument *optimize* specifies the optimization level of the compiler; the default value of ``-1`` selects the optimization level of the interpreter as @@ -717,7 +717,7 @@ One useful application of the second form of :func:`iter` is to read lines of a file until a certain line is reached. The following example reads a file - until the :meth:`readline` method returns an empty string:: + until the :meth:`~io.TextIOBase.readline` method returns an empty string:: with open('mydata.txt') as fp: for line in iter(fp.readline, ''): @@ -826,8 +826,8 @@ .. note:: - :class:`object` does *not* have a :attr:`__dict__`, so you can't assign - arbitrary attributes to an instance of the :class:`object` class. + :class:`object` does *not* have a :attr:`~object.__dict__`, so you can't + assign arbitrary attributes to an instance of the :class:`object` class. .. function:: oct(x) @@ -905,9 +905,9 @@ size" and falling back on :attr:`io.DEFAULT_BUFFER_SIZE`. On many systems, the buffer will typically be 4096 or 8192 bytes long. - * "Interactive" text files (files for which :meth:`isatty` returns True) use - line buffering. Other text files use the policy described above for binary - files. + * "Interactive" text files (files for which :meth:`~io.IOBase.isatty` + returns True) use line buffering. Other text files use the policy + described above for binary files. *encoding* is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform @@ -1115,10 +1115,10 @@ turns the :meth:`voltage` method into a "getter" for a read-only attribute with the same name. - A property object has :attr:`getter`, :attr:`setter`, and :attr:`deleter` - methods usable as decorators that create a copy of the property with the - corresponding accessor function set to the decorated function. This is - best explained with an example:: + A property object has :attr:`~property.getter`, :attr:`~property.setter`, + and :attr:`~property.deleter` methods usable as decorators that create a + copy of the property with the corresponding accessor function set to the + decorated function. This is best explained with an example:: class C: def __init__(self): @@ -1224,13 +1224,13 @@ Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to - ``None``. Slice objects have read-only data attributes :attr:`start`, - :attr:`stop` and :attr:`step` which merely return the argument values (or their - default). They have no other explicit functionality; however they are used by - Numerical Python and other third party extensions. Slice objects are also - generated when extended indexing syntax is used. For example: - ``a[start:stop:step]`` or ``a[start:stop, i]``. See :func:`itertools.islice` - for an alternate version that returns an iterator. + ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, + :attr:`~slice.stop` and :attr:`~slice.step` which merely return the argument + values (or their default). They have no other explicit functionality; + however they are used by Numerical Python and other third party extensions. + Slice objects are also generated when extended indexing syntax is used. For + example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See + :func:`itertools.islice` for an alternate version that returns an iterator. .. function:: sorted(iterable[, key][, reverse]) @@ -1310,9 +1310,10 @@ been overridden in a class. The search order is same as that used by :func:`getattr` except that the *type* itself is skipped. - The :attr:`__mro__` attribute of the *type* lists the method resolution - search order used by both :func:`getattr` and :func:`super`. The attribute - is dynamic and can change whenever the inheritance hierarchy is updated. + The :attr:`~class.__mro__` attribute of the *type* lists the method + resolution search order used by both :func:`getattr` and :func:`super`. The + attribute is dynamic and can change whenever the inheritance hierarchy is + updated. If the second argument is omitted, the super object returned is unbound. If the second argument is an object, ``isinstance(obj, type)`` must be true. If @@ -1375,7 +1376,8 @@ With one argument, return the type of an *object*. The return value is a - type object and generally the same object as returned by ``object.__class__``. + type object and generally the same object as returned by + :attr:`object.__class__ `. The :func:`isinstance` built-in function is recommended for testing the type of an object, because it takes subclasses into account. @@ -1383,11 +1385,11 @@ With three arguments, return a new type object. This is essentially a dynamic form of the :keyword:`class` statement. The *name* string is the - class name and becomes the :attr:`__name__` attribute; the *bases* tuple - itemizes the base classes and becomes the :attr:`__bases__` attribute; - and the *dict* dictionary is the namespace containing definitions for class - body and becomes the :attr:`__dict__` attribute. For example, the - following two statements create identical :class:`type` objects: + class name and becomes the :attr:`~class.__name__` attribute; the *bases* + tuple itemizes the base classes and becomes the :attr:`~class.__bases__` + attribute; and the *dict* dictionary is the namespace containing definitions + for class body and becomes the :attr:`~object.__dict__` attribute. For + example, the following two statements create identical :class:`type` objects: >>> class X: ... a = 1 @@ -1399,7 +1401,7 @@ .. function:: vars([object]) - Return the :attr:`__dict__` attribute for a module, class, instance, + Return the :attr:`~object.__dict__` attribute for a module, class, instance, or any other object with a :attr:`__dict__` attribute. Objects such as modules and instances have an updateable :attr:`__dict__` diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -339,8 +339,8 @@ pair: C; language Conversion from floating point to integer may round or truncate - as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module - for well-defined conversions. + as in C; see functions :func:`math.floor` and :func:`math.ceil` for + well-defined conversions. (4) float also accepts the strings "nan" and "inf" with an optional prefix "+" @@ -631,7 +631,7 @@ :class:`float`, :class:`decimal.Decimal` and :class:`fractions.Fraction`) Python's hash for numeric types is based on a single mathematical function that's defined for any rational number, and hence applies to all instances of -:class:`int` and :class:`fraction.Fraction`, and all finite instances of +:class:`int` and :class:`fractions.Fraction`, and all finite instances of :class:`float` and :class:`decimal.Decimal`. Essentially, this function is given by reduction modulo ``P`` for a fixed prime ``P``. The value of ``P`` is made available to Python as the :attr:`modulus` attribute of @@ -1303,7 +1303,7 @@ only stores the ``start``, ``stop`` and ``step`` values, calculating individual items and subranges as needed). -Range objects implement the :class:`collections.Sequence` ABC, and provide +Range objects implement the :class:`collections.abc.Sequence` ABC, and provide features such as containment tests, element index lookup, slicing and support for negative indices (see :ref:`typesseq`): @@ -1326,9 +1326,9 @@ Testing range objects for equality with ``==`` and ``!=`` compares them as sequences. That is, two range objects are considered equal if they represent the same sequence of values. (Note that two range -objects that compare equal might have different :attr:`start`, -:attr:`stop` and :attr:`step` attributes, for example ``range(0) == -range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.) +objects that compare equal might have different :attr:`~range.start`, +:attr:`~range.stop` and :attr:`~range.step` attributes, for example +``range(0) == range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.) .. versionchanged:: 3.2 Implement the Sequence ABC. @@ -1342,7 +1342,8 @@ object identity). .. versionadded:: 3.3 - The :attr:`start`, :attr:`stop` and :attr:`step` attributes. + The :attr:`~range.start`, :attr:`~range.stop` and :attr:`~range.step` + attributes. .. index:: @@ -2298,7 +2299,7 @@ (inclusive) as their first argument. -Each bytes and bytearray instance provides a :meth:`decode` convenience +Each bytes and bytearray instance provides a :meth:`~bytes.decode` convenience method that is the inverse of :meth:`str.encode`: .. method:: bytes.decode(encoding="utf-8", errors="strict") @@ -2809,11 +2810,11 @@ There are currently two built-in set types, :class:`set` and :class:`frozenset`. The :class:`set` type is mutable --- the contents can be changed using methods -like :meth:`add` and :meth:`remove`. Since it is mutable, it has no hash value -and cannot be used as either a dictionary key or as an element of another set. -The :class:`frozenset` type is immutable and :term:`hashable` --- its contents cannot be -altered after it is created; it can therefore be used as a dictionary key or as -an element of another set. +like :meth:`~set.add` and :meth:`~set.remove`. Since it is mutable, it has no +hash value and cannot be used as either a dictionary key or as an element of +another set. The :class:`frozenset` type is immutable and :term:`hashable` --- +its contents cannot be altered after it is created; it can therefore be used as +a dictionary key or as an element of another set. Non-empty sets (not frozensets) can be created by placing a comma-separated list of elements within braces, for example: ``{'jack', 'sjoerd'}``, in addition to the @@ -3354,12 +3355,12 @@ foo`` does not require a module object named *foo* to exist, rather it requires an (external) *definition* for a module named *foo* somewhere.) -A special attribute of every module is :attr:`__dict__`. This is the dictionary -containing the module's symbol table. Modifying this dictionary will actually -change the module's symbol table, but direct assignment to the :attr:`__dict__` -attribute is not possible (you can write ``m.__dict__['a'] = 1``, which defines -``m.a`` to be ``1``, but you can't write ``m.__dict__ = {}``). Modifying -:attr:`__dict__` directly is not recommended. +A special attribute of every module is :attr:`~object.__dict__`. This is the +dictionary containing the module's symbol table. Modifying this dictionary will +actually change the module's symbol table, but direct assignment to the +:attr:`__dict__` attribute is not possible (you can write +``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but you can't write +``m.__dict__ = {}``). Modifying :attr:`__dict__` directly is not recommended. Modules built into the interpreter are written like this: ````. If loaded from a file, they are written as ```` is used, it treats the supplied expression as a subiterator. All values produced by that subiterator are passed directly to the caller of the current generator's methods. Any values passed in with -:meth:`send` and any exceptions passed in with :meth:`throw` are passed to -the underlying iterator if it has the appropriate methods. If this is not the -case, then :meth:`send` will raise :exc:`AttributeError` or :exc:`TypeError`, -while :meth:`throw` will just raise the passed in exception immediately. +:meth:`~generator.send` and any exceptions passed in with +:meth:`~generator.throw` are passed to the underlying iterator if it has the +appropriate methods. If this is not the case, then :meth:`~generator.send` +will raise :exc:`AttributeError` or :exc:`TypeError`, while +:meth:`~generator.throw` will just raise the passed in exception immediately. When the underlying iterator is complete, the :attr:`~StopIteration.value` attribute of the raised :exc:`StopIteration` instance becomes the value of @@ -388,6 +389,7 @@ is already executing raises a :exc:`ValueError` exception. .. index:: exception: StopIteration +.. class:: generator .. method:: generator.__next__() @@ -438,6 +440,7 @@ other exception, it is propagated to the caller. :meth:`close` does nothing if the generator has already exited due to an exception or normal exit. +.. class:: . .. index:: single: yield; examples @@ -630,10 +633,10 @@ containing the conversion of the slice items; otherwise, the conversion of the lone slice item is the key. The conversion of a slice item that is an expression is that expression. The conversion of a proper slice is a slice -object (see section :ref:`types`) whose :attr:`start`, :attr:`stop` and -:attr:`step` attributes are the values of the expressions given as lower bound, -upper bound and stride, respectively, substituting ``None`` for missing -expressions. +object (see section :ref:`types`) whose :attr:`~slice.start`, +:attr:`~slice.stop` and :attr:`~slice.step` attributes are the values of the +expressions given as lower bound, upper bound and stride, respectively, +substituting ``None`` for missing expressions. .. index:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:10:08 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:10:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MTk2OiBJbXBy?= =?utf-8?q?oved_cross-references_in_distutils_documentation=2E?= Message-ID: <3cvt4c36vwz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/e0b9e0ed561a changeset: 86179:e0b9e0ed561a branch: 2.7 parent: 86176:7565df5939de user: Serhiy Storchaka date: Wed Oct 09 14:09:02 2013 +0300 summary: #19196: Improved cross-references in distutils documentation. files: Doc/distutils/apiref.rst | 17 +++++++++-------- Doc/distutils/setupscript.rst | 16 +++++++++------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -989,8 +989,9 @@ simply the list of all files under *src*, with the names changed to be under *dst*. - *preserve_mode* and *preserve_times* are the same as for :func:`copy_file` in - :mod:`distutils.file_util`; note that they only apply to regular files, not to + *preserve_mode* and *preserve_times* are the same as for + :func:`distutils.file_util.copy_file`; note that they only apply to + regular files, not to directories. If *preserve_symlinks* is true, symlinks will be copied as symlinks (on platforms that support them!); otherwise (the default), the destination of the symlink will be copied. *update* and *verbose* are the same @@ -1172,8 +1173,8 @@ or :exc:`OSError`) exception object. Handles Python 1.5.1 and later styles, and does what it can to deal with exception objects that don't have a filename (which happens when the error is due to a two-file operation, such as - :func:`rename` or :func:`link`). Returns the error message as a string - prefixed with *prefix*. + :func:`~os.rename` or :func:`~os.link`). Returns the error message as a + string prefixed with *prefix*. .. function:: split_quoted(s) @@ -1257,8 +1258,8 @@ built/installed/distributed -This module provides the :class:`Distribution` class, which represents the -module distribution being built/installed/distributed. +This module provides the :class:`~distutils.core.Distribution` class, which +represents the module distribution being built/installed/distributed. :mod:`distutils.extension` --- The Extension class @@ -1706,8 +1707,8 @@ options, is the :meth:`run` method, which must also be implemented by every command class. - The class constructor takes a single argument *dist*, a :class:`Distribution` - instance. + The class constructor takes a single argument *dist*, a + :class:`~distutils.core.Distribution` instance. Creating a new Distutils command diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -139,7 +139,8 @@ All of this is done through another keyword argument to :func:`setup`, the :option:`ext_modules` option. :option:`ext_modules` is just a list of -:class:`Extension` instances, each of which describes a single extension module. +:class:`~distutils.core.Extension` instances, each of which describes a +single extension module. Suppose your distribution includes a single extension, called :mod:`foo` and implemented by :file:`foo.c`. If no additional instructions to the compiler/linker are needed, describing this extension is quite simple:: @@ -165,8 +166,8 @@ Extension names and packages ---------------------------- -The first argument to the :class:`Extension` constructor is always the name of -the extension, including any package names. For example, :: +The first argument to the :class:`~distutils.core.Extension` constructor is +always the name of the extension, including any package names. For example, :: Extension('foo', ['src/foo1.c', 'src/foo2.c']) @@ -196,7 +197,8 @@ Extension source files ---------------------- -The second argument to the :class:`Extension` constructor is a list of source +The second argument to the :class:`~distutils.core.Extension` constructor is +a list of source files. Since the Distutils currently only support C, C++, and Objective-C extensions, these are normally C/C++/Objective-C source files. (Be sure to use appropriate extensions to distinguish C++\ source files: :file:`.cc` and @@ -232,9 +234,9 @@ Preprocessor options -------------------- -Three optional arguments to :class:`Extension` will help if you need to specify -include directories to search or preprocessor macros to define/undefine: -``include_dirs``, ``define_macros``, and ``undef_macros``. +Three optional arguments to :class:`~distutils.core.Extension` will help if +you need to specify include directories to search or preprocessor macros to +define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``. For example, if your extension requires header files in the :file:`include` directory under your distribution root, use the ``include_dirs`` option:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:10:09 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:10:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MTk2OiBJbXBy?= =?utf-8?q?oved_cross-references_in_distutils_documentation=2E?= Message-ID: <3cvt4d65WPz7LkK@mail.python.org> http://hg.python.org/cpython/rev/0879b60de41f changeset: 86180:0879b60de41f branch: 3.3 parent: 86177:207e1e1cb17a user: Serhiy Storchaka date: Wed Oct 09 14:09:16 2013 +0300 summary: #19196: Improved cross-references in distutils documentation. files: Doc/distutils/apiref.rst | 15 ++++++++------- Doc/distutils/setupscript.rst | 16 +++++++++------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -994,8 +994,9 @@ simply the list of all files under *src*, with the names changed to be under *dst*. - *preserve_mode* and *preserve_times* are the same as for :func:`copy_file` in - :mod:`distutils.file_util`; note that they only apply to regular files, not to + *preserve_mode* and *preserve_times* are the same as for + :func:`distutils.file_util.copy_file`; note that they only apply to + regular files, not to directories. If *preserve_symlinks* is true, symlinks will be copied as symlinks (on platforms that support them!); otherwise (the default), the destination of the symlink will be copied. *update* and *verbose* are the same @@ -1175,7 +1176,7 @@ Generate a useful error message from an :exc:`OSError` exception object. Handles Python 1.5.1 and later styles, and does what it can to deal with exception objects that don't have a filename (which happens when the error - is due to a two-file operation, such as :func:`rename` or :func:`link`). + is due to a two-file operation, such as :func:`~os.rename` or :func:`~os.link`). Returns the error message as a string prefixed with *prefix*. @@ -1265,8 +1266,8 @@ built/installed/distributed -This module provides the :class:`Distribution` class, which represents the -module distribution being built/installed/distributed. +This module provides the :class:`~distutils.core.Distribution` class, which +represents the module distribution being built/installed/distributed. :mod:`distutils.extension` --- The Extension class @@ -1712,8 +1713,8 @@ options, is the :meth:`run` method, which must also be implemented by every command class. - The class constructor takes a single argument *dist*, a :class:`Distribution` - instance. + The class constructor takes a single argument *dist*, a + :class:`~distutils.core.Distribution` instance. Creating a new Distutils command diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -139,7 +139,8 @@ All of this is done through another keyword argument to :func:`setup`, the :option:`ext_modules` option. :option:`ext_modules` is just a list of -:class:`Extension` instances, each of which describes a single extension module. +:class:`~distutils.core.Extension` instances, each of which describes a +single extension module. Suppose your distribution includes a single extension, called :mod:`foo` and implemented by :file:`foo.c`. If no additional instructions to the compiler/linker are needed, describing this extension is quite simple:: @@ -165,8 +166,8 @@ Extension names and packages ---------------------------- -The first argument to the :class:`Extension` constructor is always the name of -the extension, including any package names. For example, :: +The first argument to the :class:`~distutils.core.Extension` constructor is +always the name of the extension, including any package names. For example, :: Extension('foo', ['src/foo1.c', 'src/foo2.c']) @@ -196,7 +197,8 @@ Extension source files ---------------------- -The second argument to the :class:`Extension` constructor is a list of source +The second argument to the :class:`~distutils.core.Extension` constructor is +a list of source files. Since the Distutils currently only support C, C++, and Objective-C extensions, these are normally C/C++/Objective-C source files. (Be sure to use appropriate extensions to distinguish C++\ source files: :file:`.cc` and @@ -232,9 +234,9 @@ Preprocessor options -------------------- -Three optional arguments to :class:`Extension` will help if you need to specify -include directories to search or preprocessor macros to define/undefine: -``include_dirs``, ``define_macros``, and ``undef_macros``. +Three optional arguments to :class:`~distutils.core.Extension` will help if +you need to specify include directories to search or preprocessor macros to +define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``. For example, if your extension requires header files in the :file:`include` directory under your distribution root, use the ``include_dirs`` option:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:10:11 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:10:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_=2319196=3A_Improved_cross-references_in_distutils_docum?= =?utf-8?q?entation=2E?= Message-ID: <3cvt4g2CYdz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/d70799f69d25 changeset: 86181:d70799f69d25 parent: 86178:a3f6e5920881 parent: 86180:0879b60de41f user: Serhiy Storchaka date: Wed Oct 09 14:09:35 2013 +0300 summary: #19196: Improved cross-references in distutils documentation. files: Doc/distutils/apiref.rst | 15 ++++++++------- Doc/distutils/setupscript.rst | 16 +++++++++------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -994,8 +994,9 @@ simply the list of all files under *src*, with the names changed to be under *dst*. - *preserve_mode* and *preserve_times* are the same as for :func:`copy_file` in - :mod:`distutils.file_util`; note that they only apply to regular files, not to + *preserve_mode* and *preserve_times* are the same as for + :func:`distutils.file_util.copy_file`; note that they only apply to + regular files, not to directories. If *preserve_symlinks* is true, symlinks will be copied as symlinks (on platforms that support them!); otherwise (the default), the destination of the symlink will be copied. *update* and *verbose* are the same @@ -1175,7 +1176,7 @@ Generate a useful error message from an :exc:`OSError` exception object. Handles Python 1.5.1 and later styles, and does what it can to deal with exception objects that don't have a filename (which happens when the error - is due to a two-file operation, such as :func:`rename` or :func:`link`). + is due to a two-file operation, such as :func:`~os.rename` or :func:`~os.link`). Returns the error message as a string prefixed with *prefix*. @@ -1265,8 +1266,8 @@ built/installed/distributed -This module provides the :class:`Distribution` class, which represents the -module distribution being built/installed/distributed. +This module provides the :class:`~distutils.core.Distribution` class, which +represents the module distribution being built/installed/distributed. :mod:`distutils.extension` --- The Extension class @@ -1712,8 +1713,8 @@ options, is the :meth:`run` method, which must also be implemented by every command class. - The class constructor takes a single argument *dist*, a :class:`Distribution` - instance. + The class constructor takes a single argument *dist*, a + :class:`~distutils.core.Distribution` instance. Creating a new Distutils command diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -139,7 +139,8 @@ All of this is done through another keyword argument to :func:`setup`, the :option:`ext_modules` option. :option:`ext_modules` is just a list of -:class:`Extension` instances, each of which describes a single extension module. +:class:`~distutils.core.Extension` instances, each of which describes a +single extension module. Suppose your distribution includes a single extension, called :mod:`foo` and implemented by :file:`foo.c`. If no additional instructions to the compiler/linker are needed, describing this extension is quite simple:: @@ -165,8 +166,8 @@ Extension names and packages ---------------------------- -The first argument to the :class:`Extension` constructor is always the name of -the extension, including any package names. For example, :: +The first argument to the :class:`~distutils.core.Extension` constructor is +always the name of the extension, including any package names. For example, :: Extension('foo', ['src/foo1.c', 'src/foo2.c']) @@ -196,7 +197,8 @@ Extension source files ---------------------- -The second argument to the :class:`Extension` constructor is a list of source +The second argument to the :class:`~distutils.core.Extension` constructor is +a list of source files. Since the Distutils currently only support C, C++, and Objective-C extensions, these are normally C/C++/Objective-C source files. (Be sure to use appropriate extensions to distinguish C++\ source files: :file:`.cc` and @@ -232,9 +234,9 @@ Preprocessor options -------------------- -Three optional arguments to :class:`Extension` will help if you need to specify -include directories to search or preprocessor macros to define/undefine: -``include_dirs``, ``define_macros``, and ``undef_macros``. +Three optional arguments to :class:`~distutils.core.Extension` will help if +you need to specify include directories to search or preprocessor macros to +define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``. For example, if your extension requires header files in the :file:`include` directory under your distribution root, use the ``include_dirs`` option:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:23:16 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:23:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MTk0OiBJbXBy?= =?utf-8?q?oved_cross-references_in_the_fcntl_module_documentation=2E?= Message-ID: <3cvtMm507nz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/372abcca25fc changeset: 86182:372abcca25fc branch: 2.7 parent: 86179:e0b9e0ed561a user: Serhiy Storchaka date: Wed Oct 09 14:20:06 2013 +0300 summary: #19194: Improved cross-references in the fcntl module documentation. files: Doc/library/fcntl.rst | 42 ++++++++++++++++-------------- 1 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -1,6 +1,5 @@ - -:mod:`fcntl` --- The :func:`fcntl` and :func:`ioctl` system calls -================================================================= +:mod:`fcntl` --- The ``fcntl`` and ``ioctl`` system calls +========================================================= .. module:: fcntl :platform: Unix @@ -18,7 +17,7 @@ All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by ``sys.stdin.fileno()``, or a file object, such as ``sys.stdin`` itself, which -provides a :meth:`fileno` which returns a genuine file descriptor. +provides a :meth:`~io.IOBase.fileno` which returns a genuine file descriptor. The module defines the following functions: @@ -26,7 +25,8 @@ .. function:: fcntl(fd, op[, arg]) Perform the requested operation on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). The operation is defined by *op* + a :meth:`~io.IOBase.fileno` method are accepted as well). The operation is + defined by *op* and is operating system dependent. These codes are also found in the :mod:`fcntl` module. The argument *arg* is optional, and defaults to the integer value ``0``. When present, it can either be an integer value, or a string. @@ -46,7 +46,7 @@ .. function:: ioctl(fd, op[, arg[, mutate_flag]]) - This function is identical to the :func:`fcntl` function, except that the + This function is identical to the :func:`~fcntl.fcntl` function, except that the operations are typically defined in the library module :mod:`termios` and the argument handling is even more complicated. @@ -56,7 +56,8 @@ integer ``0``), an object supporting the read-only buffer interface (most likely a plain Python string) or an object supporting the read-write buffer interface. - In all but the last case, behaviour is as for the :func:`fcntl` function. + In all but the last case, behaviour is as for the :func:`~fcntl.fcntl` + function. If a mutable buffer is passed, then the behaviour is determined by the value of the *mutate_flag* parameter. @@ -95,16 +96,16 @@ .. function:: flock(fd, op) Perform the lock operation *op* on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). See the Unix manual + a :meth:`~io.IOBase.fileno` method are accepted as well). See the Unix manual :manpage:`flock(2)` for details. (On some systems, this function is emulated using :c:func:`fcntl`.) .. function:: lockf(fd, operation, [length, [start, [whence]]]) - This is essentially a wrapper around the :func:`fcntl` locking calls. *fd* is - the file descriptor of the file to lock or unlock, and *operation* is one of the - following values: + This is essentially a wrapper around the :func:`~fcntl.fcntl` locking calls. + *fd* is the file descriptor of the file to lock or unlock, and *operation* + is one of the following values: * :const:`LOCK_UN` -- unlock * :const:`LOCK_SH` -- acquire a shared lock @@ -119,13 +120,13 @@ systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a file opened for writing. - *length* is the number of bytes to lock, *start* is the byte offset at which the - lock starts, relative to *whence*, and *whence* is as with :func:`fileobj.seek`, - specifically: + *length* is the number of bytes to lock, *start* is the byte offset at + which the lock starts, relative to *whence*, and *whence* is as with + :func:`io.IOBase.seek`, specifically: - * :const:`0` -- relative to the start of the file (:const:`SEEK_SET`) - * :const:`1` -- relative to the current buffer position (:const:`SEEK_CUR`) - * :const:`2` -- relative to the end of the file (:const:`SEEK_END`) + * :const:`0` -- relative to the start of the file (:data:`os.SEEK_SET`) + * :const:`1` -- relative to the current buffer position (:data:`os.SEEK_CUR`) + * :const:`2` -- relative to the end of the file (:data:`os.SEEK_END`) The default for *start* is 0, which means to start at the beginning of the file. The default for *length* is 0 which means to lock to the end of the file. The @@ -150,7 +151,8 @@ .. seealso:: Module :mod:`os` - If the locking flags :const:`O_SHLOCK` and :const:`O_EXLOCK` are present - in the :mod:`os` module (on BSD only), the :func:`os.open` function - provides an alternative to the :func:`lockf` and :func:`flock` functions. + If the locking flags :data:`~os.O_SHLOCK` and :data:`~os.O_EXLOCK` are + present in the :mod:`os` module (on BSD only), the :func:`os.open` + function provides an alternative to the :func:`lockf` and :func:`flock` + functions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:23:18 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:23:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MTk0OiBJbXBy?= =?utf-8?q?oved_cross-references_in_the_fcntl_module_documentation=2E?= Message-ID: <3cvtMp0lkQz7LkC@mail.python.org> http://hg.python.org/cpython/rev/9015a84d694e changeset: 86183:9015a84d694e branch: 3.3 parent: 86180:0879b60de41f user: Serhiy Storchaka date: Wed Oct 09 14:20:22 2013 +0300 summary: #19194: Improved cross-references in the fcntl module documentation. files: Doc/library/fcntl.rst | 44 ++++++++++++++++-------------- 1 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -1,5 +1,5 @@ -:mod:`fcntl` --- The :func:`fcntl` and :func:`ioctl` system calls -================================================================= +:mod:`fcntl` --- The ``fcntl`` and ``ioctl`` system calls +========================================================= .. module:: fcntl :platform: Unix @@ -17,7 +17,8 @@ All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by ``sys.stdin.fileno()``, or a :class:`io.IOBase` object, such as ``sys.stdin`` -itself, which provides a :meth:`fileno` that returns a genuine file descriptor. +itself, which provides a :meth:`~io.IOBase.fileno` that returns a genuine file +descriptor. .. versionchanged:: 3.3 Operations in this module used to raise a :exc:`IOError` where they now @@ -30,7 +31,8 @@ .. function:: fcntl(fd, op[, arg]) Perform the requested operation on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). The operation is defined by *op* + a :meth:`~io.IOBase.fileno` method are accepted as well). The operation is + defined by *op* and is operating system dependent. These codes are also found in the :mod:`fcntl` module. The argument *arg* is optional, and defaults to the integer value ``0``. When present, it can either be an integer value, or a string. @@ -50,8 +52,8 @@ .. function:: ioctl(fd, op[, arg[, mutate_flag]]) - This function is identical to the :func:`fcntl` function, except that the - argument handling is even more complicated. + This function is identical to the :func:`~fcntl.fcntl` function, except + that the argument handling is even more complicated. The op parameter is limited to values that can fit in 32-bits. @@ -59,7 +61,8 @@ integer ``0``), an object supporting the read-only buffer interface (most likely a plain Python string) or an object supporting the read-write buffer interface. - In all but the last case, behaviour is as for the :func:`fcntl` function. + In all but the last case, behaviour is as for the :func:`~fcntl.fcntl` + function. If a mutable buffer is passed, then the behaviour is determined by the value of the *mutate_flag* parameter. @@ -94,16 +97,16 @@ .. function:: flock(fd, op) Perform the lock operation *op* on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). See the Unix manual + a :meth:`~io.IOBase.fileno` method are accepted as well). See the Unix manual :manpage:`flock(2)` for details. (On some systems, this function is emulated using :c:func:`fcntl`.) .. function:: lockf(fd, operation, [length, [start, [whence]]]) - This is essentially a wrapper around the :func:`fcntl` locking calls. *fd* is - the file descriptor of the file to lock or unlock, and *operation* is one of the - following values: + This is essentially a wrapper around the :func:`~fcntl.fcntl` locking calls. + *fd* is the file descriptor of the file to lock or unlock, and *operation* + is one of the following values: * :const:`LOCK_UN` -- unlock * :const:`LOCK_SH` -- acquire a shared lock @@ -118,13 +121,13 @@ systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a file opened for writing. - *length* is the number of bytes to lock, *start* is the byte offset at which the - lock starts, relative to *whence*, and *whence* is as with :func:`fileobj.seek`, - specifically: + *length* is the number of bytes to lock, *start* is the byte offset at + which the lock starts, relative to *whence*, and *whence* is as with + :func:`io.IOBase.seek`, specifically: - * :const:`0` -- relative to the start of the file (:const:`SEEK_SET`) - * :const:`1` -- relative to the current buffer position (:const:`SEEK_CUR`) - * :const:`2` -- relative to the end of the file (:const:`SEEK_END`) + * :const:`0` -- relative to the start of the file (:data:`os.SEEK_SET`) + * :const:`1` -- relative to the current buffer position (:data:`os.SEEK_CUR`) + * :const:`2` -- relative to the end of the file (:data:`os.SEEK_END`) The default for *start* is 0, which means to start at the beginning of the file. The default for *length* is 0 which means to lock to the end of the file. The @@ -149,7 +152,8 @@ .. seealso:: Module :mod:`os` - If the locking flags :const:`O_SHLOCK` and :const:`O_EXLOCK` are present - in the :mod:`os` module (on BSD only), the :func:`os.open` function - provides an alternative to the :func:`lockf` and :func:`flock` functions. + If the locking flags :data:`~os.O_SHLOCK` and :data:`~os.O_EXLOCK` are + present in the :mod:`os` module (on BSD only), the :func:`os.open` + function provides an alternative to the :func:`lockf` and :func:`flock` + functions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 13:23:19 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 9 Oct 2013 13:23:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_=2319194=3A_Improved_cross-references_in_the_fcntl_modul?= =?utf-8?q?e_documentation=2E?= Message-ID: <3cvtMq3hCvz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/d76e91a29f64 changeset: 86184:d76e91a29f64 parent: 86181:d70799f69d25 parent: 86183:9015a84d694e user: Serhiy Storchaka date: Wed Oct 09 14:20:37 2013 +0300 summary: #19194: Improved cross-references in the fcntl module documentation. files: Doc/library/fcntl.rst | 44 ++++++++++++++++-------------- 1 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -1,5 +1,5 @@ -:mod:`fcntl` --- The :func:`fcntl` and :func:`ioctl` system calls -================================================================= +:mod:`fcntl` --- The ``fcntl`` and ``ioctl`` system calls +========================================================= .. module:: fcntl :platform: Unix @@ -17,7 +17,8 @@ All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by ``sys.stdin.fileno()``, or a :class:`io.IOBase` object, such as ``sys.stdin`` -itself, which provides a :meth:`fileno` that returns a genuine file descriptor. +itself, which provides a :meth:`~io.IOBase.fileno` that returns a genuine file +descriptor. .. versionchanged:: 3.3 Operations in this module used to raise a :exc:`IOError` where they now @@ -30,7 +31,8 @@ .. function:: fcntl(fd, op[, arg]) Perform the requested operation on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). The operation is defined by *op* + a :meth:`~io.IOBase.fileno` method are accepted as well). The operation is + defined by *op* and is operating system dependent. These codes are also found in the :mod:`fcntl` module. The argument *arg* is optional, and defaults to the integer value ``0``. When present, it can either be an integer value, or a string. @@ -50,8 +52,8 @@ .. function:: ioctl(fd, op[, arg[, mutate_flag]]) - This function is identical to the :func:`fcntl` function, except that the - argument handling is even more complicated. + This function is identical to the :func:`~fcntl.fcntl` function, except + that the argument handling is even more complicated. The op parameter is limited to values that can fit in 32-bits. @@ -59,7 +61,8 @@ integer ``0``), an object supporting the read-only buffer interface (most likely a plain Python string) or an object supporting the read-write buffer interface. - In all but the last case, behaviour is as for the :func:`fcntl` function. + In all but the last case, behaviour is as for the :func:`~fcntl.fcntl` + function. If a mutable buffer is passed, then the behaviour is determined by the value of the *mutate_flag* parameter. @@ -94,16 +97,16 @@ .. function:: flock(fd, op) Perform the lock operation *op* on file descriptor *fd* (file objects providing - a :meth:`fileno` method are accepted as well). See the Unix manual + a :meth:`~io.IOBase.fileno` method are accepted as well). See the Unix manual :manpage:`flock(2)` for details. (On some systems, this function is emulated using :c:func:`fcntl`.) .. function:: lockf(fd, operation, [length, [start, [whence]]]) - This is essentially a wrapper around the :func:`fcntl` locking calls. *fd* is - the file descriptor of the file to lock or unlock, and *operation* is one of the - following values: + This is essentially a wrapper around the :func:`~fcntl.fcntl` locking calls. + *fd* is the file descriptor of the file to lock or unlock, and *operation* + is one of the following values: * :const:`LOCK_UN` -- unlock * :const:`LOCK_SH` -- acquire a shared lock @@ -118,13 +121,13 @@ systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a file opened for writing. - *length* is the number of bytes to lock, *start* is the byte offset at which the - lock starts, relative to *whence*, and *whence* is as with :func:`fileobj.seek`, - specifically: + *length* is the number of bytes to lock, *start* is the byte offset at + which the lock starts, relative to *whence*, and *whence* is as with + :func:`io.IOBase.seek`, specifically: - * :const:`0` -- relative to the start of the file (:const:`SEEK_SET`) - * :const:`1` -- relative to the current buffer position (:const:`SEEK_CUR`) - * :const:`2` -- relative to the end of the file (:const:`SEEK_END`) + * :const:`0` -- relative to the start of the file (:data:`os.SEEK_SET`) + * :const:`1` -- relative to the current buffer position (:data:`os.SEEK_CUR`) + * :const:`2` -- relative to the end of the file (:data:`os.SEEK_END`) The default for *start* is 0, which means to start at the beginning of the file. The default for *length* is 0 which means to lock to the end of the file. The @@ -149,7 +152,8 @@ .. seealso:: Module :mod:`os` - If the locking flags :const:`O_SHLOCK` and :const:`O_EXLOCK` are present - in the :mod:`os` module (on BSD only), the :func:`os.open` function - provides an alternative to the :func:`lockf` and :func:`flock` functions. + If the locking flags :data:`~os.O_SHLOCK` and :data:`~os.O_EXLOCK` are + present in the :mod:`os` module (on BSD only), the :func:`os.open` + function provides an alternative to the :func:`lockf` and :func:`flock` + functions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 14:53:18 2013 From: python-checkins at python.org (victor.stinner) Date: Wed, 9 Oct 2013 14:53:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319199=3A_Remove_?= =?utf-8?q?=60=60PyThreadState=2Etick=5Fcounter=60=60_field?= Message-ID: <3cvwMf72Kgz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/3ce0102e4c1f changeset: 86185:3ce0102e4c1f user: Victor Stinner date: Wed Oct 09 14:53:01 2013 +0200 summary: Close #19199: Remove ``PyThreadState.tick_counter`` field files: Doc/whatsnew/3.4.rst | 3 ++- Include/pystate.h | 10 ---------- Misc/NEWS | 2 ++ Python/ceval.c | 1 - Python/pystate.c | 1 - 5 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -523,7 +523,8 @@ Deprecated functions and types of the C API ------------------------------------------- -* None yet. +* The ``PyThreadState.tick_counter`` field has been value: its value was meaningless + since Python 3.2 ("new GIL"). Deprecated features diff --git a/Include/pystate.h b/Include/pystate.h --- a/Include/pystate.h +++ b/Include/pystate.h @@ -100,16 +100,6 @@ PyObject *dict; /* Stores per-thread state */ - /* XXX doesn't mean anything anymore (the comment below is obsolete) - => deprecate or remove? */ - /* tick_counter is incremented whenever the check_interval ticker - * reaches zero. The purpose is to give a useful measure of the number - * of interpreted bytecode instructions in a given thread. This - * extremely lightweight statistic collector may be of interest to - * profilers (like psyco.jit()), although nothing in the core uses it. - */ - int tick_counter; - int gilstate_counter; PyObject *async_exc; /* Asynchronous exception to raise */ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #19199: Remove ``PyThreadState.tick_counter`` field + - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1247,7 +1247,6 @@ a try: finally: block uninterruptible. */ goto fast_next_opcode; } - tstate->tick_counter++; #ifdef WITH_TSC ticked = 1; #endif diff --git a/Python/pystate.c b/Python/pystate.c --- a/Python/pystate.c +++ b/Python/pystate.c @@ -182,7 +182,6 @@ tstate->recursion_critical = 0; tstate->tracing = 0; tstate->use_tracing = 0; - tstate->tick_counter = 0; tstate->gilstate_counter = 0; tstate->async_exc = NULL; #ifdef WITH_THREAD -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 15:51:11 2013 From: python-checkins at python.org (georg.brandl) Date: Wed, 9 Oct 2013 15:51:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2319200=3A_small_g?= =?utf-8?q?rammar_fix_in_multiprocessing_docs=2E_Thanks_to_Elazar?= Message-ID: <3cvxfR6sSKz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/c0f3d18d79fd changeset: 86186:c0f3d18d79fd user: Georg Brandl date: Wed Oct 09 15:51:57 2013 +0200 summary: Closes #19200: small grammar fix in multiprocessing docs. Thanks to Elazar Gershuni. files: Doc/library/multiprocessing.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -126,7 +126,7 @@ *forkserver* When the program starts and selects the *forkserver* start method, a server process is started. From then on, whenever a new process - is need the parent process connects to the server and requests + is needed, the parent process connects to the server and requests that it fork a new process. The fork server process is single threaded so it is safe for it to use :func:`os.fork`. No unnecessary resources are inherited. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 20:30:25 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 20:30:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgMTkxNTg6?= =?utf-8?q?__a_rare_race_in_BoundedSemaphore_could_allow_=2Erelease=28=29_?= =?utf-8?q?too_often=2E?= Message-ID: <3cw3rd19g6z7LlF@mail.python.org> http://hg.python.org/cpython/rev/369fabf9b2ba changeset: 86187:369fabf9b2ba branch: 3.3 parent: 86183:9015a84d694e user: Tim Peters date: Wed Oct 09 13:19:21 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. files: Misc/NEWS | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,8 @@ Library ------- +- Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. + - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. - Issue #19137: The pprint module now correctly formats instances of set and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 20:30:26 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 20:30:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_19158=3A__a_rare_race_in_BoundedSemaphore_could_al?= =?utf-8?q?low_=2Erelease=28=29_too_often=2E?= Message-ID: <3cw3rf5gS3z7LlN@mail.python.org> http://hg.python.org/cpython/rev/9ddc33174ddf changeset: 86188:9ddc33174ddf parent: 86186:c0f3d18d79fd parent: 86187:369fabf9b2ba user: Tim Peters date: Wed Oct 09 13:21:46 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. files: Misc/NEWS | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,8 @@ Library ------- +- Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. + - Issue #18716: Deprecate the formatter module. - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 20:30:28 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 20:30:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMTkxNTg6?= =?utf-8?q?__a_rare_race_in_BoundedSemaphore_could_allow_=2Erelease=28=29_?= =?utf-8?q?too_often=2E?= Message-ID: <3cw3rh0g2Zz7LlN@mail.python.org> http://hg.python.org/cpython/rev/2ce77d9ed4b0 changeset: 86189:2ce77d9ed4b0 branch: 2.7 parent: 86182:372abcca25fc user: Tim Peters date: Wed Oct 09 13:25:11 2013 -0500 summary: Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Library ------- +- Issue #19158: a rare race in BoundedSemaphore could allow .release() too + often. + - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. - Issue #19137: The pprint module now correctly formats empty set and frozenset -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 20:30:29 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 20:30:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Repair_format_?= =?utf-8?q?of_NEWS_entry=2E?= Message-ID: <3cw3rj4NZ9z7LlN@mail.python.org> http://hg.python.org/cpython/rev/f917b25f4786 changeset: 86190:f917b25f4786 branch: 3.3 parent: 86187:369fabf9b2ba user: Tim Peters date: Wed Oct 09 13:27:36 2013 -0500 summary: Repair format of NEWS entry. files: Misc/NEWS | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,7 +76,8 @@ Library ------- -- Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. +- Issue #19158: a rare race in BoundedSemaphore could allow .release() too + often. - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 9 20:30:31 2013 From: python-checkins at python.org (tim.peters) Date: Wed, 9 Oct 2013 20:30:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Repair_format_of_NEWS_entry=2E?= Message-ID: <3cw3rl2Z4Hz7LlF@mail.python.org> http://hg.python.org/cpython/rev/54be46e5110b changeset: 86191:54be46e5110b parent: 86188:9ddc33174ddf parent: 86190:f917b25f4786 user: Tim Peters date: Wed Oct 09 13:29:42 2013 -0500 summary: Repair format of NEWS entry. files: Misc/NEWS | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,7 +29,8 @@ Library ------- -- Issue 19158: a rare race in BoundedSemaphore could allow .release() too often. +- Issue #19158: a rare race in BoundedSemaphore could allow .release() too + often. - Issue #18716: Deprecate the formatter module. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 10 07:04:58 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 10 Oct 2013 07:04:58 +0200 Subject: [Python-checkins] Daily reference leaks (54be46e5110b): sum=-4 Message-ID: results for 54be46e5110b on branch "default" -------------------------------------------- test_imp leaked [0, 1, -1] references, sum=0 test_site leaked [-2, 0, 0] references, sum=-2 test_site leaked [-2, 0, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogGe33bR', '-x'] From python-checkins at python.org Thu Oct 10 07:39:25 2013 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 10 Oct 2013 07:39:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MDA1?= =?utf-8?q?=3A__Fix_documentation_for_PyIter=5FNext=28=29=2E?= Message-ID: <3cwLhY6KkGz7LlN@mail.python.org> http://hg.python.org/cpython/rev/0820e8394d96 changeset: 86192:0820e8394d96 branch: 2.7 parent: 86189:2ce77d9ed4b0 user: Raymond Hettinger date: Wed Oct 09 22:39:11 2013 -0700 summary: Issue #19005: Fix documentation for PyIter_Next(). files: Doc/c-api/iter.rst | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -7,7 +7,7 @@ .. versionadded:: 2.2 -There are only a couple of functions specifically for working with iterators. +There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) @@ -17,11 +17,10 @@ .. c:function:: PyObject* PyIter_Next(PyObject *o) - Return the next value from the iteration *o*. If the object is an iterator, - this retrieves the next value from the iteration, and returns *NULL* with no - exception set if there are no remaining items. If the object is not an - iterator, :exc:`TypeError` is raised, or if there is an error in retrieving the - item, returns *NULL* and passes along the exception. + Return the next value from the iteration *o*. The object must be an iterator + (it is up to the caller to check this). If there are no remaining values, + returns *NULL* with no exception set. If an error occurs while retrieving + the item, returns *NULL* and passes along the exception. To write a loop which iterates over an iterator, the C code should look something like this:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 07:43:41 2013 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 10 Oct 2013 07:43:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MDA1?= =?utf-8?q?=3A__Fix_documentation_for_PyIter=5FNext=28=29=2E?= Message-ID: <3cwLnT0mtVzRCq@mail.python.org> http://hg.python.org/cpython/rev/249ba942a6d4 changeset: 86193:249ba942a6d4 branch: 3.3 parent: 86190:f917b25f4786 user: Raymond Hettinger date: Wed Oct 09 22:42:46 2013 -0700 summary: Issue #19005: Fix documentation for PyIter_Next(). files: Doc/c-api/iter.rst | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -5,7 +5,7 @@ Iterator Protocol ================= -There are only a couple of functions specifically for working with iterators. +There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) @@ -14,11 +14,10 @@ .. c:function:: PyObject* PyIter_Next(PyObject *o) - Return the next value from the iteration *o*. If the object is an iterator, - this retrieves the next value from the iteration, and returns *NULL* with no - exception set if there are no remaining items. If the object is not an - iterator, :exc:`TypeError` is raised, or if there is an error in retrieving the - item, returns *NULL* and passes along the exception. + Return the next value from the iteration *o*. The object must be an iterator + (it is up to the caller to check this). If there are no remaining values, + returns *NULL* with no exception set. If an error occurs while retrieving + the item, returns *NULL* and passes along the exception. To write a loop which iterates over an iterator, the C code should look something like this:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 07:43:42 2013 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 10 Oct 2013 07:43:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cwLnV2cm2z7Ll4@mail.python.org> http://hg.python.org/cpython/rev/98d8551276b4 changeset: 86194:98d8551276b4 parent: 86191:54be46e5110b parent: 86193:249ba942a6d4 user: Raymond Hettinger date: Wed Oct 09 22:43:30 2013 -0700 summary: merge files: Doc/c-api/iter.rst | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -5,7 +5,7 @@ Iterator Protocol ================= -There are only a couple of functions specifically for working with iterators. +There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) @@ -14,11 +14,10 @@ .. c:function:: PyObject* PyIter_Next(PyObject *o) - Return the next value from the iteration *o*. If the object is an iterator, - this retrieves the next value from the iteration, and returns *NULL* with no - exception set if there are no remaining items. If the object is not an - iterator, :exc:`TypeError` is raised, or if there is an error in retrieving the - item, returns *NULL* and passes along the exception. + Return the next value from the iteration *o*. The object must be an iterator + (it is up to the caller to check this). If there are no remaining values, + returns *NULL* with no exception set. If an error occurs while retrieving + the item, returns *NULL* and passes along the exception. To write a loop which iterates over an iterator, the C code should look something like this:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 09:47:06 2013 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 10 Oct 2013 09:47:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2315805=3A_Add_cont?= =?utf-8?q?extlib=2Eredirect=5Fstdout=28=29?= Message-ID: <3cwPWt2CWwz7LjY@mail.python.org> http://hg.python.org/cpython/rev/63a1ee94b3ed changeset: 86195:63a1ee94b3ed user: Raymond Hettinger date: Thu Oct 10 00:46:57 2013 -0700 summary: Issue #15805: Add contextlib.redirect_stdout() files: Doc/library/contextlib.rst | 31 +++++++++++++++++++ Lib/contextlib.py | 40 ++++++++++++++++++++++++- Lib/test/test_contextlib.py | 9 +++++ Misc/NEWS | 2 + 4 files changed, 81 insertions(+), 1 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -115,6 +115,37 @@ .. versionadded:: 3.4 +.. function:: redirect_stdout(new_target) + + Context manager for temporarily redirecting :data:`sys.stdout` to + another file or file-like object. + + This tool adds flexibility to existing functions or classes whose output + is hardwired to stdout. + + For example, the output of :func:`help` normally is sent to *sys.stdout*. + You can capture that output in a string by redirecting the output to a + :class:`io.StringIO` object:: + + f = io.StringIO() + with redirect_stdout(f): + help(pow) + s = f.getvalue() + + To send the output of :func:`help` to a file on disk, redirect the output + to a regular file:: + + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + + To send the output of :func:`help` to *sys.stderr*:: + + with redirect_stdout(sys.stderr): + help(pow) + + .. versionadded:: 3.4 + .. class:: ContextDecorator() A base class that enables a context manager to also be used as a decorator. diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -4,7 +4,8 @@ from collections import deque from functools import wraps -__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", "ignored"] +__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", + "ignored", "redirect_stdout"] class ContextDecorator(object): @@ -140,6 +141,43 @@ def __exit__(self, *exc_info): self.thing.close() +class redirect_stdout: + """Context manager for temporarily redirecting stdout to another file + + # How to send help() to stderr + + with redirect_stdout(sys.stderr): + help(dir) + + # How to write help() to a file + + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + + # How to capture disassembly to a string + + import dis + import io + + f = io.StringIO() + with redirect_stdout(f): + dis.dis('x**2 - y**2') + s = f.getvalue() + + """ + + def __init__(self, new_target): + self.new_target = new_target + + def __enter__(self): + self.old_target = sys.stdout + sys.stdout = self.new_target + return self.new_target + + def __exit__(self, exctype, excinst, exctb): + sys.stdout = self.old_target + @contextmanager def ignored(*exceptions): """Context manager to ignore specified exceptions diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -1,5 +1,6 @@ """Unit tests for contextlib.py, and other context managers.""" +import io import sys import tempfile import unittest @@ -653,6 +654,14 @@ with ignored(LookupError): 'Hello'[50] +class TestRedirectStdout(unittest.TestCase): + + def test_redirect_to_string_io(self): + f = io.StringIO() + with redirect_stdout(f): + help(pow) + s = f.getvalue() + self.assertIn('pow', s) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,8 @@ - Issue #19158: a rare race in BoundedSemaphore could allow .release() too often. +- Issue #15805: Add contextlib.redirect_stdout(). + - Issue #18716: Deprecate the formatter module. - Issue #18037: 2to3 now escapes '\u' and '\U' in native strings. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 16:02:08 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 10 Oct 2013 16:02:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318874=3A_PyCode?= =?utf-8?q?=5FNew=28=29_now_ensures_that_the_filename_is_a_ready_Unicode?= Message-ID: <3cwYrc2Mljz7LjN@mail.python.org> http://hg.python.org/cpython/rev/bea4447c22bf changeset: 86196:bea4447c22bf user: Victor Stinner date: Thu Oct 10 15:55:14 2013 +0200 summary: Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode string. This change does nothing is most cases, but it is useful on Windows in some cases. files: Objects/codeobject.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -74,6 +74,11 @@ PyErr_BadInternalCall(); return NULL; } + + /* Ensure that the filename is a ready Unicode string */ + if (PyUnicode_READY(filename) < 0) + return NULL; + n_cellvars = PyTuple_GET_SIZE(cellvars); intern_strings(names); intern_strings(varnames); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 16:02:09 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 10 Oct 2013 16:02:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318874=3A_=5FPyObj?= =?utf-8?q?ect=5FMalloc/Realloc/Free=28=29_now_falls_back_on?= Message-ID: <3cwYrd5M8Fz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/ba27cba3ae20 changeset: 86197:ba27cba3ae20 user: Victor Stinner date: Thu Oct 10 15:58:42 2013 +0200 summary: Issue #18874: _PyObject_Malloc/Realloc/Free() now falls back on _PyMem_RawMalloc/Realloc/Free, instead of _PyMem_Malloc/Realloc/Free. So it becomes possible to use the fast pymalloc allocator for the PYMEM_DOMAIN_MEM domain (PyMem_Malloc/Realloc/Free functions). files: Doc/c-api/memory.rst | 4 +- Objects/obmalloc.c | 36 ++++++++++++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -288,8 +288,8 @@ Python has a *pymalloc* allocator for allocations smaller than 512 bytes. This allocator is optimized for small objects with a short lifetime. It uses memory mappings called "arenas" with a fixed size of 256 KB. It falls back to -:c:func:`PyMem_Malloc` and :c:func:`PyMem_Realloc` for allocations larger than -512 bytes. *pymalloc* is the default allocator used by +:c:func:`PyMem_RawMalloc` and :c:func:`PyMem_RawRealloc` for allocations larger +than 512 bytes. *pymalloc* is the default allocator used by :c:func:`PyObject_Malloc`. The default arena allocator uses the following functions: diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -125,10 +125,11 @@ #define PYRAW_FUNCS _PyMem_RawMalloc, _PyMem_RawRealloc, _PyMem_RawFree #ifdef WITH_PYMALLOC -#define PYOBJECT_FUNCS _PyObject_Malloc, _PyObject_Realloc, _PyObject_Free +# define PYOBJ_FUNCS _PyObject_Malloc, _PyObject_Realloc, _PyObject_Free #else -#define PYOBJECT_FUNCS PYRAW_FUNCS +# define PYOBJ_FUNCS PYRAW_FUNCS #endif +#define PYMEM_FUNCS PYRAW_FUNCS #ifdef PYMALLOC_DEBUG typedef struct { @@ -142,16 +143,16 @@ debug_alloc_api_t obj; } _PyMem_Debug = { {'r', {NULL, PYRAW_FUNCS}}, - {'m', {NULL, PYRAW_FUNCS}}, - {'o', {NULL, PYOBJECT_FUNCS}} + {'m', {NULL, PYMEM_FUNCS}}, + {'o', {NULL, PYOBJ_FUNCS}} }; -#define PYDEBUG_FUNCS _PyMem_DebugMalloc, _PyMem_DebugRealloc, _PyMem_DebugFree +#define PYDBG_FUNCS _PyMem_DebugMalloc, _PyMem_DebugRealloc, _PyMem_DebugFree #endif static PyMemAllocator _PyMem_Raw = { #ifdef PYMALLOC_DEBUG - &_PyMem_Debug.raw, PYDEBUG_FUNCS + &_PyMem_Debug.raw, PYDBG_FUNCS #else NULL, PYRAW_FUNCS #endif @@ -159,23 +160,24 @@ static PyMemAllocator _PyMem = { #ifdef PYMALLOC_DEBUG - &_PyMem_Debug.mem, PYDEBUG_FUNCS + &_PyMem_Debug.mem, PYDBG_FUNCS #else - NULL, PYRAW_FUNCS + NULL, PYMEM_FUNCS #endif }; static PyMemAllocator _PyObject = { #ifdef PYMALLOC_DEBUG - &_PyMem_Debug.obj, PYDEBUG_FUNCS + &_PyMem_Debug.obj, PYDBG_FUNCS #else - NULL, PYOBJECT_FUNCS + NULL, PYOBJ_FUNCS #endif }; #undef PYRAW_FUNCS -#undef PYOBJECT_FUNCS -#undef PYDEBUG_FUNCS +#undef PYMEM_FUNCS +#undef PYOBJ_FUNCS +#undef PYDBG_FUNCS static PyObjectArenaAllocator _PyObject_Arena = {NULL, #ifdef MS_WINDOWS @@ -924,7 +926,7 @@ return NULL; /* overflow */ #endif nbytes = numarenas * sizeof(*arenas); - arenaobj = (struct arena_object *)PyMem_Realloc(arenas, nbytes); + arenaobj = (struct arena_object *)PyMem_RawRealloc(arenas, nbytes); if (arenaobj == NULL) return NULL; arenas = arenaobj; @@ -1309,7 +1311,7 @@ * has been reached. */ { - void *result = PyMem_Malloc(nbytes); + void *result = PyMem_RawMalloc(nbytes); if (!result) _Py_AllocatedBlocks--; return result; @@ -1539,7 +1541,7 @@ redirect: #endif /* We didn't allocate this address. */ - PyMem_Free(p); + PyMem_RawFree(p); } /* realloc. If p is NULL, this acts like malloc(nbytes). Else if nbytes==0, @@ -1608,14 +1610,14 @@ * at p. Instead we punt: let C continue to manage this block. */ if (nbytes) - return PyMem_Realloc(p, nbytes); + return PyMem_RawRealloc(p, nbytes); /* C doesn't define the result of realloc(p, 0) (it may or may not * return NULL then), but Python's docs promise that nbytes==0 never * returns NULL. We don't pass 0 to realloc(), to avoid that endcase * to begin with. Even then, we can't be sure that realloc() won't * return NULL. */ - bp = PyMem_Realloc(p, 1); + bp = PyMem_RawRealloc(p, 1); return bp ? bp : p; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 16:19:39 2013 From: python-checkins at python.org (victor.stinner) Date: Thu, 10 Oct 2013 16:19:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2316742=3A_Fix_misu?= =?utf-8?q?se_of_memory_allocations_in_PyOS=5FReadline=28=29?= Message-ID: <3cwZDq5ly7zRCZ@mail.python.org> http://hg.python.org/cpython/rev/98dbe677dfe7 changeset: 86198:98dbe677dfe7 user: Victor Stinner date: Thu Oct 10 16:18:20 2013 +0200 summary: Close #16742: Fix misuse of memory allocations in PyOS_Readline() The GIL must be held to call PyMem_Malloc(), whereas PyOS_Readline() releases the GIL to read input. The result of the C callback PyOS_ReadlineFunctionPointer must now be a string allocated by PyMem_RawMalloc() or PyMem_RawRealloc() (or NULL if an error occurred), instead of a string allocated by PyMem_Malloc() or PyMem_Realloc(). Fixing this issue was required to setup a hook on PyMem_Malloc(), for example using the tracemalloc module. PyOS_Readline() copies the result of PyOS_ReadlineFunctionPointer() into a new buffer allocated by PyMem_Malloc(). So the public API of PyOS_Readline() does not change. files: Doc/c-api/veryhigh.rst | 8 ++++++++ Doc/whatsnew/3.4.rst | 6 ++++++ Misc/NEWS | 5 +++++ Modules/readline.c | 4 ++-- Parser/myreadline.c | 26 ++++++++++++++++++++------ 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -166,6 +166,14 @@ resulting string. For example, The :mod:`readline` module sets this hook to provide line-editing and tab-completion features. + The result must be a string allocated by :c:func:`PyMem_RawMalloc` or + :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred. + + .. versionchanged:: 3.4 + The result must be allocated by :c:func:`PyMem_RawMalloc` or + :c:func:`PyMem_RawRealloc`, instead of being allocated by + :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. + .. c:function:: struct _node* PyParser_SimpleParseString(const char *str, int start) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -587,3 +587,9 @@ attribute in the chain referring to the innermost function. Introspection libraries that assumed the previous behaviour was intentional can use :func:`inspect.unwrap` to gain equivalent behaviour. + +* (C API) The result of the :c:var:`PyOS_ReadlineFunctionPointer` callback must + now be a string allocated by :c:func:`PyMem_RawMalloc` or + :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred, instead of a + string allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. + diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,11 @@ Core and Builtins ----------------- +- Issue #16742: The result of the C callback PyOS_ReadlineFunctionPointer must + now be a string allocated by PyMem_RawMalloc() or PyMem_RawRealloc() (or NULL + if an error occurred), instead of a string allocated by PyMem_Malloc() or + PyMem_Realloc(). + - Issue #19199: Remove ``PyThreadState.tick_counter`` field - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1176,7 +1176,7 @@ /* We got an EOF, return a empty string. */ if (p == NULL) { - p = PyMem_Malloc(1); + p = PyMem_RawMalloc(1); if (p != NULL) *p = '\0'; RESTORE_LOCALE(saved_locale) @@ -1204,7 +1204,7 @@ /* Copy the malloc'ed buffer into a PyMem_Malloc'ed one and release the original. */ q = p; - p = PyMem_Malloc(n+2); + p = PyMem_RawMalloc(n+2); if (p != NULL) { strncpy(p, q, n); p[n] = '\n'; diff --git a/Parser/myreadline.c b/Parser/myreadline.c --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -113,18 +113,22 @@ { size_t n; char *p, *pr; + n = 100; - if ((p = (char *)PyMem_MALLOC(n)) == NULL) + p = (char *)PyMem_RawMalloc(n); + if (p == NULL) return NULL; + fflush(sys_stdout); if (prompt) fprintf(stderr, "%s", prompt); fflush(stderr); + switch (my_fgets(p, (int)n, sys_stdin)) { case 0: /* Normal case */ break; case 1: /* Interrupt */ - PyMem_FREE(p); + PyMem_RawFree(p); return NULL; case -1: /* EOF */ case -2: /* Error */ @@ -140,7 +144,7 @@ PyErr_SetString(PyExc_OverflowError, "input line too long"); return NULL; } - pr = (char *)PyMem_REALLOC(p, n + incr); + pr = (char *)PyMem_RawRealloc(p, n + incr); if (pr == NULL) { PyMem_FREE(p); PyErr_NoMemory(); @@ -151,7 +155,7 @@ break; n += strlen(p+n); } - pr = (char *)PyMem_REALLOC(p, n+1); + pr = (char *)PyMem_RawRealloc(p, n+1); if (pr == NULL) { PyMem_FREE(p); PyErr_NoMemory(); @@ -174,7 +178,8 @@ char * PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) { - char *rv; + char *rv, *res; + size_t len; if (_PyOS_ReadlineTState == PyThreadState_GET()) { PyErr_SetString(PyExc_RuntimeError, @@ -221,5 +226,14 @@ _PyOS_ReadlineTState = NULL; - return rv; + if (rv == NULL) + return NULL; + + len = strlen(rv) + 1; + res = PyMem_Malloc(len); + if (res != NULL) + memcpy(res, rv, len); + PyMem_RawFree(rv); + + return res; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 16:48:06 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 10 Oct 2013 16:48:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Revise_PEP_453_to_be_docs-onl?= =?utf-8?b?eSBmb3IgMi43ICYgMy4z?= Message-ID: <3cwZsf27c8z7LjN@mail.python.org> http://hg.python.org/peps/rev/405b80d54b7d changeset: 5188:405b80d54b7d user: Nick Coghlan date: Fri Oct 11 00:47:47 2013 +1000 summary: Revise PEP 453 to be docs-only for 2.7 & 3.3 - all functional changes are now 3.4 only - still proposes docs changes for 2.7 & 3.3 - notes current effort to create a Windows installer for pip - notes possibility of a future PEP to provide a combined CPython 2.7, pip and Python Launcher installer from python.org files: pep-0453.txt | 407 ++++++++------------------------------ 1 files changed, 89 insertions(+), 318 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -17,11 +17,11 @@ ======== This PEP proposes that the -`Installing Python Modules `__ guide be -updated to officially recommend the use of ``pip`` as the default -installer for Python packages, and that appropriate technical changes be -made in Python 2.7, 3.3 and 3.4 to provide ``pip`` by default in support -of that recommendation. +`Installing Python Modules `__ guide in +Python 2.7, 3.3 and 3.4 be updated to officially recommend the use of ``pip`` +as the default installer for Python packages, and that appropriate technical +changes be made in Python 3.4 to provide ``pip`` by default in support of +that recommendation. Rationale @@ -88,14 +88,11 @@ reference `pip's own bootstrapping instructions `__ rather than duplicating them. However the user experience created by this approach -still isn't good (especially on Windows, where downloading and running -the ``get-pip.py`` bootstrap script with the default OS configuration is -significantly more painful than downloading and running a binary executable -or installer). The situation becomes even more complicated when multiple -Python versions are involved (for example, parallel installations of -Python 2 and Python 3), since that makes it harder to create and maintain -good platform specific ``pip`` installers independently of the CPython -installers. +still isn't particularly good (although there is an effort under way to +create a combined Windows installer for ``pip`` and its dependencies that +should improve matters on that platform, and Mac OS X and *nix platforms +generally have ``wget`` and hence the ability to easily download and run the +bootstrap scripts from the command line). The projects that have decided to forgo dependencies altogether are forced to either duplicate the efforts of other projects by inventing their own @@ -233,13 +230,14 @@ of automated testing is weak (or nonexistent), making it difficult to effectively use the available migration utilities. -It is quite likely that it is this difference in perspective regarding what -it means for a version of Python to be "supported" which lies at the heart -of the long history of conflicts between the developers of Python packaging -tools and the core development team for CPython. A key goal of this PEP is -thus to better enable the two groups to collaborate more effectively, by -using the ``ensurepip`` module as the technical bridge between the two -distinct software lifecycles and deployment models. +While this PEP only proposes documentation changes for Python 2.7, once +``pip`` has a Windows installer available, a separate PEP will be created +and submitted proposing the creation and distribution of aggregate installers +for future CPython 2.7 maintenance releases that combine the CPython, +``pip`` and Python Launcher for Windows installers into a single download +(the separate downloads would still remain available - the aggregate +installers would be provided as a convenience, and as a clear indication +of the recommended operating environment for Python in Windows systems). Why pip? @@ -274,15 +272,14 @@ However, to avoid recommending a tool that CPython does not provide, it is further proposed that the `pip`_ package manager be made available by -default when installing CPython and when creating virtual environments -using the standard library's ``venv`` module via the ``pyvenv`` command line -utility). +default when installing CPython 3.4 or later and when creating virtual +environments using the standard library's ``venv`` module via the +``pyvenv`` command line utility. To support that end, this PEP proposes the inclusion of an ``ensurepip`` -bootstrapping module in Python 3.4 (along with the upcoming maintenance -releases of Python 2.7 and 3.3), as well as automatic invocation of that -module from ``pyvenv`` (for Python 3.4 only), and changes to the way Python -installed scripts are handled on Windows (also for Python 3.4 only). +bootstrapping module in Python 3.4, as well as automatic invocation of that +module from ``pyvenv`` and changes to the way Python installed scripts are +handled on Windows. To clearly demarcate development responsibilities, and to avoid inadvertently downgrading ``pip`` when updating CPython, the proposed @@ -290,11 +287,12 @@ mechanism in the standard library that is invoked automatically by the CPython installers provided on python.org. -To ensure the smoothest possible experience for new users of Python, this -PEP also proposes that the ``ensurepip`` module and the option to install -``pip`` when installing CPython be backported to Python 2.7 and 3.3. It -does *not* propose backporting any changes to ``pyvenv`` (in Python 3.3) -or to Windows script handling (in either version). +To provide clear guidance for new users of Python that may not be +starting with the latest release, this PEP also proposes that the +"Installing Python Modules" guides in Python 2.7 and 3.3 be updated to +recommend installing and using ``pip``, rather than invoking ``distutils`` +directly. It does *not* propose backporting any of the code changes that +are being proposed for Python 3.4. Finally, the PEP also strongly recommends that CPython redistributors and other Python implementations ensure that ``pip`` is available by default, or @@ -387,19 +385,22 @@ options passed to the bootstrap command). It is proposed that the implementation be carried out in five separate -steps (all steps after the first are independent of each other and can be -carried out in any order): +steps (all steps after the first two are independent of each other and +can be carried out in any order): -* the first step would add the ``ensurepip`` module and the private copies - of the most recently released versions of pip and setuptools, and update - the "Installing Python Modules" documentation. This change - would be applied to Python 2.7, 3.3, and 3.4. -* the Windows installer would be updated to offer the new ``pip`` - installation option for Python 2.7.6, 3.3.3 and 3.4.0. -* the Mac OS X installer would be updated to offer the new ``pip`` - installation option for Python 2.7.6, 3.3.3 and 3.4.0. +* the first step would update the "Installing Python Modules" documentation + to recommend the use of ``pip`` and reference the ``pip`` team's + instructions for downloading and installing it. This change would be + applied to Python 2.7, 3.3, and 3.4. +* the ``ensurepip`` module and the private copies of the most recently + released versions of pip and setuptools would be added to Python 3.4 + and the 3.4 "Installing Python Modules" documentation updated accordingly. +* the CPython Windows installer would be updated to offer the new ``pip`` + installation option for Python 3.4. +* the CPython Mac OS X installer would be updated to offer the new ``pip`` + installation option for Python 3.4. * the ``venv`` module and ``pyvenv`` command would be updated to make use - of ``ensurepip`` in Python 3.4+ + of ``ensurepip`` in Python 3.4 * the PATH handling and ``sysconfig`` directory layout on Windows would be updated for Python 3.4+ @@ -432,7 +433,6 @@ * Windows and Mac OS X installations where the "Install pip" option was *not* chosen during installation * any installation where the user previously ran "pip uninstall pip" -* virtual environments created with ``pyvenv`` in Python 3.3 Users that want to retrieve the latest version from PyPI, or otherwise need more flexibility, can then invoke the extracted ``pip`` appropriately. @@ -480,21 +480,20 @@ Installing from source ---------------------- -While the prebuilt binary installers will be updated to run -``python -m ensurepip`` by default, no such change will be made to the +Just as the prebuilt binary installers will be updated to run +``python -m ensurepip`` by default, a similar change will be made to the ``make install`` and ``make altinstall`` commands of the source -distribution. +distribution. The ``--root`` option passed to the command will be set +appropriate based on the supplied configuration options. ``ensurepip`` itself (including the private copy of ``pip`` and its -dependencies) will still be installed normally (as it is a regular -part of the standard library), only the implicit installation of pip and -its dependencies will be skipped. +dependencies) will always be installed normally (as it is a regular +part of the standard library), but an option will be provided to skip +the invocation of ``ensurepip``. -Keeping the pip bootstrapping as a separate step for ``make``-based -installations should minimize the changes CPython redistributors need to -make to their build processes. Avoiding the layer of indirection through -``make`` for the ``ensurepip`` invocation avoids any challenges -associated with determining where to install the extracted ``pip``. +This means that even installing from source will provide ``pip`` by default, +but redistributors provide ``pip`` by other means (or not providing it at +all) will still be able to opt out of installing it using ``ensurepip``. Changes to virtual environments @@ -529,8 +528,8 @@ is available in most virtual environments without additional action on the part of the end user. -This particular change will be made only for Python 3.4 and later versions. -The third-party ``virtualenv`` project will still be needed to obtain a +As this change will only benefit Python 3.4 and later versions, the +third-party ``virtualenv`` project will still be needed to obtain a consistent cross-version experience in Python 3.3 and 2.7. @@ -539,36 +538,14 @@ The "Installing Python Modules" section of the standard library documentation in Python 2.7, 3.3 and 3.4 will be updated to recommend -the use of the bootstrapped ``pip`` installer. It will give a brief -description of the most common commands and options, but delegate +the use of the ``pip`` installer, either provided by default in Python 3.4 +or retrieved and installed by the user in Python 2.7 or 3.3. It will give +a brief description of the most common commands and options, but delegate to the externally maintained ``pip`` documentation for the full details. In Python 3.4, the ``pyvenv`` and ``venv`` documentation will also be updated to reference the revised module installation guide. -In Python 2.7 and 3.3, the documentation will make clear that the feature -was added in a maintenance release and users may need to upgrade in order -to take advantage of it. Specifically, it is proposed to include the -following warning as a note in the documentation for the ``ensurepip`` -module in these versions (adjust version numbers for 3.3 as appropriate): - - This is an optional module, which may not be available in all - installations of Python 2.7. It is provided solely to simplify the - process of bootstrapping ``pip`` onto end user's systems. If it is - not available, please investigate the following alternatives: - - * This module was first added in Python 2.7.6. If using an earlier - maintenance release, it will not be available. If upgrading to - a more recent maintenance release is not an option, consider - the alternative bootstrapping mechanisms below. - * Some platforms provide alternative mechanisms to obtain ``pip``. - In such cases, the platform documentation should provide - appropriate details. - * If upgrading to the latest maintenance release is not feasible, and - no platform specific instructions are provided, then refer to the - upstream `pip bootstrapping instructions - `__. - The existing content of the module installation guide will be retained in all versions, but under a new "Invoking distutils directly" subsection. @@ -645,168 +622,6 @@ releases. -Feature addition in maintenance releases -======================================== - -Adding a new module to the standard library in Python 2.7, and 3.3 -maintenance releases breaks the usual policy of "no new features in -maintenance releases". The rationale for doing so in this case is slightly -different for each of the two versions. - - -Rationale for this policy on maintenance releases -------------------------------------------------- - -Python's strict "no new features in maintenance releases" was instituted -following the introduction of a number of new features over the course of -the Python 2.2.x series. - -Firstly, the ``True`` and ``False`` builtins were added in Python 2.2.1 (at -the time, they were merely aliases for the values ``1`` and ``0``, -in Python 2.3 they became instances of the new ``bool`` type and in Python -3.0 they became true constants recognised by the compiler). - -Python 2.2.2 then made the situation worse by adding a new ``chars`` -parameter to the ``lstrip`` and ``rstrip`` string methods, along with an -entirely new ``zfill`` method. The corresponding changes in the -``string`` module were not incorporated until Python 2.2.3. - -The reason introducing new features in maintenance releases like this is -problematic is that, except in the cases where code fails due to a bug in -CPython, developers expect to be able to identify the supported Python -versions for a library or application solely through the first two -components of the version number. - -The introduction of new builtins and string methods in Python 2.2.1 and -2.2.2 resulted in many developers claiming Python 2.2 compatibility for -code that did not in fact run on the original Python 2.2. In effect, -Python 2.2.2 became the minimum usable version, since there was a -relatively high chance of code breaking when run on 2.2 (or even 2.2.1). - - -Scope of this proposal ----------------------- - -By contrast with the changes that caused such problems during the 2.2.x -series, this PEP is merely proposing the addition of a new standard -library module, rather than adding new builtins or changing the interface -of a builtin type. - -The categorical difference between these kinds of changes has already been -recognised in the Python 3.3 Language Moratorium (PEP 3003), where the -addition of new builtins was disallowed outright and changes to builtin -types required an explicit exemption. By contrast, adding new modules was -explicitly permitted, even while the moratorium was in place. - -Furthermore, the proposed ``ensurepip`` module is only a means to the end of -getting ``pip`` installed on the system. While "upgrade to the latest -CPython maintenance release" will become the *recommended* approach to -obtaining ``pip`` for users of Python 2.7 and 3.3 on Windows and Mac OS X -systems, all of the existing ``pip`` bootstrapping mechanisms will still -work in cases where upgrading Python isn't a practical alternative. - -As described in the documentation update proposal, the ``ensurepip`` -documentation in older releases will include the text explaining how to -obtain ``pip`` if updating to the latest maintenance release isn't an -option, or if the module has been removed by a redistributor. This contrasts -significantly with the changes made during the Python 2.2 series, where they -were normal additions with no alternatives except to update to a sufficiently -recent version of Python if a library or application depended on them. - - -Potential consequences of permitting this exemption ---------------------------------------------------- - -The concern has been expressed that approving an exemption to the "no new -features in maintenance releases" policy in this case will open the -flood gates to requests for more such exemptions in the future. It is the -perspective of the PEP authors that the specific nature of this proposal -should itself serve to allay those fears. - -Firstly, as a proposal to add a new module to the standard library, granting -an exemption in this case sets no precedent for the more restricted -categories identified in the PEP 3003 language moratorium. - -Secondly, this exemption is requested for a new module that *makes it easy -to download other modules from PyPI*. If this PEP is accepted, then it can -be reasonably assumed that modules on PyPI are only a ``pip install`` away -for most users, with only those users that depend on standard library -inclusion to make it through corporate compliance reviews still affected -(and, for many such reviews, inclusion in a future version of the standard -library will be enough for a backported version to be considered -acceptable for use). - -Making ``pip`` readily available in all versions still under normal -maintenance thus means that accepting this PEP should have the effect of -*weakening* the case for any further exemptions to the policy, rather -than strengthening it. - - -Rationale for permitting the exemption in Python 2.7 ----------------------------------------------------- - -While Python 3 adoption is proceeding nicely, it remains the case that many -new users of Python are introduced to Python 2.7 first. This may be -because their instructors have yet to migrate their courses to Python 3, or -because they work in an environment where Python 2 is still the preferred -version, or simply because the frequently adopted approach of writing -libraries in the common Python 2/3 subset means there are (as of -September 2013) still more Python 2 only libraries than there are Python 3 -only libraries. - -Since one of the primary aims of this PEP is to aid new Python users, it is -contrary to its spirit to target *only* Python 3.4, when so many users in -at least the next 12-18 months (where Python 2.7 is still fully supported -by the core development team) are still going to be introduced to Python -2 before being introduced to Python 3. - -Users first installing Python 2.7 on Windows and Mac OS X following -acceptance and release of this PEP won't even need to look up how to -bootstrap ``pip``, since it will already be provided with the CPython -installer. For those that already have Python installed, but are just -beginning to explore the PyPI ecosystem, the bootstrapping instructions -can be simplified to "just install the latest maintenance release of -CPython". - -Making ``pip`` readily available also serves to ease the migration path -from Python 2 to Python 3, as a number of the standard library additions -in Python 3 are also available from PyPI for Python 2. Lowering the barrier -to adoption for these backports makes it easier for current Python 2 users -to selectively adopt backported Python 3 versions, reducing the number of -updates needed in any eventual Python 3 migration. - -Finally, this PEP solves a serious problem for the ``distutils-sig`` -community, as it means we will finally have a standard mechanism decoupled -from the standard library's development lifecycle that we can reasonably -assume to be present on end user's systems (or at least readily -available) that allows us to support new packaging standards in older -versions of Python. A tentative, half-hearted endorsement from the -CPython core development team that tries to hide the existence of the -pip boostrapping support from end users is unlikely to provide quite the -same benefits. - - -Rationale for permitting the exemption in Python 3.3 ----------------------------------------------------- - -The rationale for permitting the exemption in Python 3.3 is admittedly -not as strong as it is for Python 2.7, as instructors currently using -Python 3.3 are quite likely to upgrade to Python 3.4 shortly after it is -released. - -In the case of Python 3.3, the rationale is primarily a consistency -argument, as it permits the recommended ``pip`` bootstrapping instructions -for both 2.7 and 3.3 to be to upgrade to the latest maintenance version of -CPython. While existing bootstrapping mechanisms will still be supported, -the cases where they are needed should be reduced significantly. - -Adding the ``ensurepip`` module in Python 3.3 also makes the Python 3.3 -version of the ``pyvenv`` utility far more useful (even without the -integration proposed for Python 3.4), as it allows users to execute -``python -m ensurepip`` to bootstrap ``pip`` after activating an -existing or newly created virtual environment. - - Uninstallation ============== @@ -842,19 +657,20 @@ - add PythonXY\bin to the Windows PATH (in addition to PythonXY) when the PATH modification option is enabled during installation -For Python 2.7 and 3.3, it is proposed that the only change be the one to -bootstrap ``pip`` by default. +Note that these changes will only be available in Python 3.4 and later. -This means that, for Python 3.3, the most reliable way to invoke pip -globally on Windows (without tinkering manually with PATH) will actually be +This means that, for Python 3.3, the most reliable way to invoke pip globally +on Windows (without tinkering manually with PATH) will still remain ``py -m pip`` (or ``py -3 -m pip`` to select the Python 3 version if both -Python 2 and 3 are installed) rather than simply calling ``pip``. +Python 2 and 3 are installed) rather than simply calling ``pip``. This +works because Python 3.3 provides the Python Launcher for +Windows (and the associated ``py`` command) by default. For Python 2.7 and 3.2, the most reliable mechanism will be to install the -standalone Python launcher for Windows and then use ``py -m pip`` as noted -above. +Python Launcher for Windows using the standalone installer and then use +``py -m pip`` as noted above. -Adding the scripts directory to the system PATH would mean that ``pip`` +Adding the scripts directory to the system PATH will mean that ``pip`` works reliably in the "only one Python installation on the system PATH" case, with ``py -m pip``, ``pipX``, or ``pipX.Y`` needed only to select a non-default version in the parallel installation case (and outside a virtual @@ -900,13 +716,10 @@ installing ``pip`` globally. * Even if pip is made available globally by other means, do not remove the - ``ensurepip`` module in Python 3.3 or later. + ``ensurepip`` module in Python 3.4 or later. - * In Python 3.3, ``ensurepip`` will be the recommended way of bootstrapping - pip in virtual environments created through the ``venv`` module and the - associated ``pyvenv`` command line tool. - * Starting with Python 3.4, ``ensurepip`` will be required for automatic - installation of pip into virtual environments by the ``venv`` module. + * ``ensurepip`` will be required for automatic installation of pip into + virtual environments by the ``venv`` module. * This is similar to the existing ``virtualenv`` package for which many downstream distributors have already made exception to the common "debundling" policy. @@ -915,14 +728,6 @@ * However, altering the private copy of pip to remove the embedded CA certificate bundle and rely on the system CA bundle instead is a reasonable change. - * If ``pip`` is made available globally by other means in Python 2.7, then - it is acceptable (although not desirable) to disable the ``ensurepip`` - module (as the third party ``virtualenv`` distribution is needed to - create virtual environments in Python 2.7 and ``virtualenv`` already - ensures ``pip`` is installed into the virtual environments it creates). - Redistributors that take this course should ensure an appropriate error - message is displayed if users attempt to import ``ensurepip``, rather - than simply removing it entirely. * Ensure that all features of this PEP continue to work with any modifications made to the redistributed version of Python. @@ -1018,61 +823,24 @@ Appendix: Rejected Proposals ============================ +Including ensurepip in Python 2.7, and 3.3 +------------------------------------------ -Include pip *only* inside the installers in Python 2.7, and 3.3 ---------------------------------------------------------------- +Earlier versions of this PEP made the case that the challenges of getting +``pip`` bootstrapped for new users posed a significant enough barrier to +Python's future growth that it justified adding ``ensurepip`` as a new +feature in the upcoming Python 2.7 and 3.3 maintenance releases. -An alternative to making an exception to the "no new features" policy in -Python 2.7 and 3.3 would be to simply bundle pip with the installer and not -modify the source tree at all. The motivation behind this modification is -that adding a new feature in a maintenance release is a risky proposition -and that doing it in this way doesn't violate that policy. +While the proposal to provide ``pip`` with Python 3.4 was universally +popular, this part of the proposal was highly controversial and ultimately +`rejected by MvL as BDFL-Delegate +`__. -This has been rejected because: - -* It's dubious to declare the binary installers beyond the scope of the - "no new features in maintenance releases" policy. If the rationale for - adding this feature to the standard library in a maintenance release isn't - considered adequate, then it isn't clear why moving that complexity to the - binary installers should change the verdict. -* Attempting to hide the existence of the bootstrap module from end users - makes it more difficult to write updated package installation documentation - for Python 2.7 and 3.3 -* For 3.3 users that choose to use ``pyvenv`` rather than ``virtualenv``, - an explicit ``python -m ensurepip`` will be needed to bootstrap ``pip`` - into virtual environments. This can only be documented clearly if the - module is public -* Making the bootstrap an installer only feature in Python 2.7 and 3.3 - guarantees the introduction of cross-platform inconsistencies, whereas - the proposal in this PEP more strongly encourages redistributors to - offer a more consistent user experience. -* Making the bootstrap an installer only feature in Python 2.7 and 3.3 - would make it difficult to re-use the bootstrap implementation from 3.4. -* Making the bootstrap an installer only feature prevents the buildbots - from being able to run automatic tests against it, which would make - ensuring that this feature remains working a much more difficult task. - - -Use a different module name in Python 2.7, and 3.3 --------------------------------------------------- - -Naming the module ``_ensurepip`` in Python 2.7 and 3.3 was considered as -another means of skirting the "no new features in maintenance releases" -policy. However, similar to the proposal to only include the new -feature in the installers rather than the standard library, this feels like -relying on a technicality to nominally "comply" with the policy, while still -breaking it in spirit. - -It is the considered opinion of the PEP authors that attempting to hide -the addition of the ``ensurepip`` module in earlier versions will only -serve to increase confusion rather than to reduce it, so the proposal -remains to be up front about the fact that the policy is being broken in -this case, and clearly documenting the rationale for doing so in this PEP. - -As noted in the section describing the proposed documentation updates, -having ``ensurepip`` as a public module in these earlier versions also -provides a convenient home for the fallback bootstrapping instructions in -those cases where it *isn't* available. +Accordingly, the proposal to backport ``ensurepip`` to Python 2.7 and 3.3 +has been removed from this PEP in favour of creating and Windows installer +for ``pip`` and a possible future PEP suggesting creation of an aggregate +installer for Python 2.7 that combines CPython 2.7, ``pip`` and the Python +Launcher for Windows. Automatically contacting PyPI when bootstrapping pip @@ -1094,6 +862,9 @@ is now always an explicit separate step, with direct access to the full pip interface. +Removing the implicit attempt to access PyPI also made it feasible to +invoke ``ensurepip`` by default when installing from a custom source build. + Implicit bootstrap ------------------ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 10 17:15:51 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 10 Oct 2013 17:15:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Additional_PEP_453_fixes?= Message-ID: <3cwbTg42tHzRSf@mail.python.org> http://hg.python.org/peps/rev/d5fa526a9c63 changeset: 5189:d5fa526a9c63 user: Nick Coghlan date: Fri Oct 11 01:15:34 2013 +1000 summary: Additional PEP 453 fixes files: pep-0453.txt | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -90,7 +90,7 @@ duplicating them. However the user experience created by this approach still isn't particularly good (although there is an effort under way to create a combined Windows installer for ``pip`` and its dependencies that -should improve matters on that platform, and Mac OS X and *nix platforms +should improve matters on that platform, and Mac OS X and \*nix platforms generally have ``wget`` and hence the ability to easily download and run the bootstrap scripts from the command line). @@ -483,8 +483,9 @@ Just as the prebuilt binary installers will be updated to run ``python -m ensurepip`` by default, a similar change will be made to the ``make install`` and ``make altinstall`` commands of the source -distribution. The ``--root`` option passed to the command will be set -appropriate based on the supplied configuration options. +distribution. The directory settings in the ``sysconfig`` module should +ensure the ``pip`` components are automatically installed to the expected +locations. ``ensurepip`` itself (including the private copy of ``pip`` and its dependencies) will always be installed normally (as it is a regular -- Repository URL: http://hg.python.org/peps From tjreedy at udel.edu Thu Oct 10 21:04:30 2013 From: tjreedy at udel.edu (Terry Reedy) Date: Thu, 10 Oct 2013 15:04:30 -0400 Subject: [Python-checkins] peps: Revise PEP 453 to be docs-only for 2.7 & 3.3 In-Reply-To: <3cwZsf27c8z7LjN@mail.python.org> References: <3cwZsf27c8z7LjN@mail.python.org> Message-ID: <5256FA3E.20907@udel.edu> On 10/10/2013 10:48 AM, nick.coghlan wrote: > http://hg.python.org/peps/rev/405b80d54b7d > changeset: 5188:405b80d54b7d > user: Nick Coghlan > date: Fri Oct 11 00:47:47 2013 +1000 > summary: > Revise PEP 453 to be docs-only for 2.7 & 3.3 > > - all functional changes are now 3.4 only > - still proposes docs changes for 2.7 & 3.3 > - notes current effort to create a Windows installer for pip > - notes possibility of a future PEP to provide a combined > CPython 2.7, pip and Python Launcher installer from python.org > +`Installing Python Modules `__ guide in > +Python 2.7, 3.3 and 3.4 be updated to officially recommend the use of ``pip`` > +as the default installer for Python packages, and that appropriate technical > +changes be made in Python 3.4 to provide ``pip`` by default in support of > +that recommendation. Does one need a separate installation of pip for each Python version or is pip 'separate' enough that one installation works for all Python versions? Is the answer to this the same on all systems? If the answer is 'one' and 'yes', the 2.7 and 3.3 docs should say that installing 3.4 also installs pip and that this is all one needs to do. > +While this PEP only proposes documentation changes for Python 2.7, once > +``pip`` has a Windows installer available, a separate PEP will be created > +and submitted proposing the creation and distribution of aggregate installers > +for future CPython 2.7 maintenance releases that combine the CPython, > +``pip`` and Python Launcher for Windows installers into a single download > +(the separate downloads would still remain available - the aggregate > +installers would be provided as a convenience, and as a clear indication > +of the recommended operating environment for Python in Windows systems). If the combined installer is an optional convenience, I would not think a PEP necessary. I am assuming that the combined installer would not add a module to /lib any more than two separate installers would, and hence would not be adding a feature to 2.7 itself. -- Terry Jan Reedy From python-checkins at python.org Thu Oct 10 23:24:06 2013 From: python-checkins at python.org (r.david.murray) Date: Thu, 10 Oct 2013 23:24:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_18764=3A_remove_the_proble?= =?utf-8?q?matic_=27print=27_alias_for_the_PDB_=27p=27_command=2E?= Message-ID: <3cwlfZ6Q0hzNyd@mail.python.org> http://hg.python.org/cpython/rev/d4d886620a00 changeset: 86199:d4d886620a00 user: R David Murray date: Thu Oct 10 17:23:26 2013 -0400 summary: 18764: remove the problematic 'print' alias for the PDB 'p' command. So that it no longer shadows the print function. Patch by Connor Osborn, doc and test changes by R. David Murray. files: Doc/library/pdb.rst | 6 +++--- Doc/whatsnew/3.4.rst | 16 ++++++++++++++++ Lib/pdb.py | 8 +++----- Lib/test/test_pdb.py | 9 ++++++--- Misc/NEWS | 3 +++ 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -41,7 +41,7 @@ .. versionchanged:: 3.3 Tab-completion via the :mod:`readline` module is available for commands and command arguments, e.g. the current global and local names are offered as - arguments of the ``print`` command. + arguments of the ``p`` command. :file:`pdb.py` can also be invoked as a script to debug other scripts. For example:: @@ -309,7 +309,7 @@ ``end`` to terminate the commands. An example:: (Pdb) commands 1 - (com) print some_variable + (com) p some_variable (com) end (Pdb) @@ -409,7 +409,7 @@ .. pdbcommand:: pp expression - Like the :pdbcmd:`print` command, except the value of the expression is + Like the :pdbcmd:`p` command, except the value of the expression is pretty-printed using the :mod:`pprint` module. .. pdbcommand:: whatis expression diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -302,6 +302,22 @@ * :func:`os.get_handle_inheritable`, :func:`os.set_handle_inheritable` +pdb +--- + +The ``print`` command has been removed from :mod:`pdb`, restoring access to the +``print`` function. + +Rationale: Python2's ``pdb`` did not have a ``print`` command; instead, +entering ``print`` executed the ``print`` statement. In Python3 ``print`` was +mistakenly made an alias for the pdb :pdbcmd:`p` command. ``p``, however, +prints the ``repr`` of its argument, not the ``str`` like the Python2 ``print`` +command did. Worse, the Python3 ``pdb print`` command shadowed the Python3 +``print`` function, making it inaccessible at the ``pdb`` prompt. + +(Contributed by Connor Osborn in :issue:`18764`.) + + poplib ------ diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1159,15 +1159,13 @@ return _rstr('** raised %s **' % err) def do_p(self, arg): - """p(rint) expression + """p expression Print the value of the expression. """ try: self.message(repr(self._getval(arg))) except: pass - # make "print" an alias of "p" since print isn't a Python statement anymore - do_print = do_p def do_pp(self, arg): """pp expression @@ -1388,7 +1386,7 @@ placed in the .pdbrc file): # Print instance variables (usage "pi classInst") - alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] + alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k]) # Print instance variables in self alias ps pi self """ @@ -1546,7 +1544,7 @@ 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable', 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until', 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist', - 'args', 'print', 'pp', 'whatis', 'source', 'display', 'undisplay', + 'args', 'p', 'pp', 'whatis', 'source', 'display', 'undisplay', 'interact', 'alias', 'unalias', 'debug', 'quit', ] diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -205,7 +205,8 @@ ... 'enable 1', ... 'clear 1', ... 'commands 2', - ... 'print 42', + ... 'p "42"', + ... 'print("42", 7*6)', # Issue 18764 (not about breakpoints) ... 'end', ... 'continue', # will stop at breakpoint 2 (line 4) ... 'clear', # clear all! @@ -252,11 +253,13 @@ (Pdb) clear 1 Deleted breakpoint 1 at :3 (Pdb) commands 2 - (com) print 42 + (com) p "42" + (com) print("42", 7*6) (com) end (Pdb) continue 1 - 42 + '42' + 42 42 > (4)test_function() -> print(2) (Pdb) clear diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -34,6 +34,9 @@ Library ------- +- Issue #18764: remove the 'print' alias for the PDB 'p' command so that it no + longer shadows the print function. + - Issue #19158: a rare race in BoundedSemaphore could allow .release() too often. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 23:25:41 2013 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 10 Oct 2013 23:25:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_upgrade_unicode_db_to_6=2E?= =?utf-8?q?3=2E0_=28closes_=2319221=29?= Message-ID: <3cwlhP6Zr8z7LjP@mail.python.org> http://hg.python.org/cpython/rev/97df7404f39c changeset: 86200:97df7404f39c user: Benjamin Peterson date: Thu Oct 10 17:24:45 2013 -0400 summary: upgrade unicode db to 6.3.0 (closes #19221) files: Doc/library/unicodedata.rst | 8 +- Lib/test/test_unicodedata.py | 2 +- Misc/NEWS | 2 + Modules/unicodedata.c | 4 +- Modules/unicodedata_db.h | 2444 +- Modules/unicodename_db.h | 32896 ++++++++-------- Objects/unicodetype_db.h | 14 +- Tools/unicode/makeunicodedata.py | 4 +- 8 files changed, 17708 insertions(+), 17666 deletions(-) diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -15,8 +15,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 6.2.0 -`_. +this database is compiled from the `UCD version 6.3.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -166,6 +166,6 @@ .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/6.2.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/6.3.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/6.2.0/ucd/NamedSequences.txt +.. [#] http://www.unicode.org/Public/6.3.0/ucd/NamedSequences.txt diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -21,7 +21,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = 'bf7a78f1a532421b5033600102e23a92044dbba9' + expectedchecksum = 'e74e878de71b6e780ffac271785c3cb58f6251f3' def test_method_checksum(self): h = hashlib.sha1() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #19221: Upgrade Unicode database to version 6.3.0. + - Issue #16742: The result of the C callback PyOS_ReadlineFunctionPointer must now be a string allocated by PyMem_RawMalloc() or PyMem_RawRealloc() (or NULL if an error occurred), instead of a string allocated by PyMem_Malloc() or diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1322,10 +1322,10 @@ "This module provides access to the Unicode Character Database which\n\ defines character properties for all Unicode characters. The data in\n\ this database is based on the UnicodeData.txt file version\n\ -6.0.0 which is publically available from ftp://ftp.unicode.org/.\n\ +6.3.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 6.0.0 (see\n\ +UnicodeData File Format 6.3.0 (see\n\ http://www.unicode.org/reports/tr44/tr44-6.html)."); diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ /* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ -#define UNIDATA_VERSION "6.2.0" +#define UNIDATA_VERSION "6.3.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -120,6 +120,7 @@ {4, 30, 14, 0, 5, 0}, {4, 31, 14, 0, 5, 0}, {4, 32, 14, 0, 5, 0}, + {14, 0, 5, 0, 5, 0}, {19, 0, 5, 0, 5, 0}, {19, 0, 5, 0, 5, 10}, {18, 0, 5, 0, 5, 0}, @@ -136,7 +137,6 @@ {19, 0, 5, 0, 5, 136}, {7, 0, 9, 0, 5, 0}, {30, 0, 5, 0, 5, 0}, - {14, 0, 5, 0, 5, 0}, {4, 36, 14, 0, 5, 0}, {4, 0, 14, 0, 5, 0}, {7, 0, 4, 0, 5, 0}, @@ -177,6 +177,7 @@ {19, 0, 1, 0, 5, 80}, {10, 0, 18, 0, 5, 0}, {8, 0, 1, 0, 5, 0}, + {14, 0, 15, 0, 5, 0}, {5, 9, 1, 0, 5, 0}, {4, 1, 14, 0, 5, 0}, {4, 234, 14, 0, 5, 0}, @@ -190,7 +191,6 @@ {29, 0, 19, 0, 5, 170}, {10, 0, 18, 0, 5, 170}, {10, 0, 18, 0, 5, 136}, - {14, 0, 15, 0, 5, 0}, {14, 0, 1, 0, 5, 0}, {14, 0, 4, 0, 5, 0}, {21, 0, 19, 0, 4, 0}, @@ -213,6 +213,10 @@ {26, 0, 11, 0, 5, 136}, {20, 0, 19, 0, 5, 0}, {27, 0, 13, 0, 5, 0}, + {14, 0, 20, 0, 5, 0}, + {14, 0, 21, 0, 5, 0}, + {14, 0, 22, 0, 5, 0}, + {14, 0, 23, 0, 5, 0}, {9, 0, 9, 0, 5, 136}, {27, 0, 10, 0, 5, 136}, {27, 0, 19, 0, 5, 136}, @@ -638,6 +642,10 @@ "S", "WS", "ON", + "LRI", + "RLI", + "FSI", + "PDI", NULL }; const char *_PyUnicode_EastAsianWidthNames[] = { @@ -1273,35 +1281,35 @@ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 107, 107, 107, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 0, 78, 78, 109, 110, 110, 111, 112, 113, 26, 26, 81, 81, - 81, 81, 81, 81, 81, 81, 114, 115, 116, 113, 0, 0, 113, 113, 117, 117, - 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 119, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 120, - 121, 122, 114, 115, 116, 123, 124, 125, 125, 126, 86, 81, 81, 81, 81, 81, - 86, 81, 81, 86, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 110, - 128, 128, 113, 117, 117, 129, 117, 117, 117, 117, 130, 130, 130, 130, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 118, 117, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 118, 113, 117, 81, 81, 81, 81, 81, 81, 81, - 108, 26, 81, 81, 81, 81, 86, 81, 119, 119, 81, 81, 26, 86, 81, 81, 86, - 117, 117, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 117, 117, - 117, 132, 132, 117, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 0, 133, 117, 134, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 81, 86, 81, 81, 86, 81, 81, + 81, 81, 81, 81, 81, 81, 114, 115, 116, 113, 117, 0, 113, 113, 118, 118, + 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 120, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 121, + 122, 123, 114, 115, 116, 124, 125, 126, 126, 127, 86, 81, 81, 81, 81, 81, + 86, 81, 81, 86, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 110, + 129, 129, 113, 118, 118, 130, 118, 118, 118, 118, 131, 131, 131, 131, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 119, 118, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 119, 113, 118, 81, 81, 81, 81, 81, 81, 81, + 108, 26, 81, 81, 81, 81, 86, 81, 120, 120, 81, 81, 26, 86, 81, 81, 86, + 118, 118, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 118, 118, + 118, 133, 133, 118, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 0, 117, 118, 134, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 81, 86, 81, 81, 86, 81, 81, 86, 86, 86, 81, 86, 86, 81, 86, 81, 81, 81, 86, 81, 86, 81, 86, 81, 86, - 81, 81, 0, 0, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, + 81, 81, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, @@ -1314,11 +1322,11 @@ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 86, 86, 86, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 81, 86, 81, 81, 86, 81, 81, 81, 86, 86, 86, 120, 121, 122, 81, 81, 81, + 81, 86, 81, 81, 86, 81, 81, 81, 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, 81, 86, 86, 81, 81, 81, 81, 0, 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, @@ -1521,7 +1529,7 @@ 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 84, 138, 138, - 138, 138, 135, 135, 135, 172, 0, 144, 144, 144, 144, 144, 144, 144, 144, + 138, 138, 135, 135, 135, 174, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1550,7 +1558,7 @@ 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 81, 86, 139, 139, 139, 0, 0, 83, 83, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 81, 86, 139, 139, 135, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 139, 135, @@ -1566,17 +1574,17 @@ 140, 48, 140, 48, 140, 48, 140, 48, 48, 48, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 146, 135, 135, 135, 135, 135, - 147, 135, 147, 139, 139, 147, 147, 135, 147, 174, 48, 48, 48, 48, 48, 48, + 147, 135, 147, 139, 139, 147, 147, 135, 147, 175, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 135, - 135, 135, 139, 139, 135, 135, 174, 142, 139, 139, 48, 48, 144, 144, 144, + 135, 135, 139, 139, 135, 135, 175, 142, 139, 139, 48, 48, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, - 139, 135, 135, 139, 139, 139, 135, 139, 135, 135, 135, 174, 174, 0, 0, 0, + 139, 135, 135, 139, 139, 139, 135, 139, 135, 135, 135, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 139, 139, 139, 139, 139, @@ -1588,8 +1596,8 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, - 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 175, 86, 86, 86, 86, 86, - 81, 81, 86, 86, 86, 86, 81, 139, 175, 175, 175, 175, 175, 175, 175, 48, + 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 176, 86, 86, 86, 86, 86, + 81, 81, 86, 86, 86, 86, 81, 139, 176, 176, 176, 176, 176, 176, 176, 48, 48, 48, 48, 86, 48, 48, 48, 48, 139, 139, 81, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -1602,9 +1610,9 @@ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 81, 81, 86, 81, - 81, 81, 81, 81, 81, 81, 86, 81, 81, 176, 177, 86, 178, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 86, 81, 81, 177, 178, 86, 179, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 86, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 86, 81, 86, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, @@ -1613,7 +1621,7 @@ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 180, 47, 47, 44, 47, + 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 181, 47, 47, 44, 47, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, @@ -1625,65 +1633,65 @@ 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, - 38, 38, 38, 38, 38, 38, 38, 43, 181, 43, 181, 43, 181, 43, 181, 43, 181, - 43, 181, 43, 181, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182, - 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182, - 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182, - 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 183, - 182, 58, 181, 58, 58, 76, 43, 43, 43, 0, 43, 43, 38, 183, 38, 183, 182, - 76, 76, 76, 43, 43, 43, 181, 0, 0, 43, 43, 38, 38, 38, 183, 0, 76, 76, - 76, 43, 43, 43, 181, 43, 43, 43, 43, 38, 38, 38, 183, 38, 76, 184, 184, - 0, 0, 43, 43, 43, 0, 43, 43, 38, 183, 38, 183, 182, 184, 58, 0, 185, 185, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 188, 189, + 38, 38, 38, 38, 38, 38, 38, 43, 182, 43, 182, 43, 182, 43, 182, 43, 182, + 43, 182, 43, 182, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, + 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, + 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, + 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 184, + 183, 58, 182, 58, 58, 76, 43, 43, 43, 0, 43, 43, 38, 184, 38, 184, 183, + 76, 76, 76, 43, 43, 43, 182, 0, 0, 43, 43, 38, 38, 38, 184, 0, 76, 76, + 76, 43, 43, 43, 182, 43, 43, 43, 43, 38, 38, 38, 184, 38, 76, 185, 185, + 0, 0, 43, 43, 43, 0, 43, 43, 38, 184, 38, 184, 183, 185, 58, 0, 186, 186, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 174, 174, 174, 188, 189, 190, 191, 84, 190, 190, 190, 22, 192, 193, 194, 195, 196, 193, 194, 195, 196, 22, 22, 22, 138, 197, 197, 197, 22, 198, 199, 200, 201, 202, 203, 204, 21, 205, 110, 205, 206, 207, 22, 192, 192, 138, 28, 36, 22, 192, 138, 197, 208, 208, 138, 138, 138, 209, 163, 164, 192, 192, 192, 138, 138, 138, 138, 138, 138, 138, 138, 78, 138, 208, 138, 138, 192, 138, 138, - 138, 138, 138, 138, 138, 186, 187, 187, 187, 187, 187, 0, 0, 0, 0, 0, - 187, 187, 187, 187, 187, 187, 210, 51, 0, 0, 34, 210, 210, 210, 210, 210, - 211, 211, 212, 213, 214, 215, 210, 34, 34, 34, 34, 210, 210, 210, 210, - 210, 211, 211, 212, 213, 214, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 216, 217, 85, 85, - 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 175, 175, 81, - 81, 81, 81, 175, 175, 175, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, 175, - 175, 81, 86, 81, 175, 175, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 218, 218, 49, 219, 26, 219, 218, 49, 26, 219, 35, 49, - 49, 49, 35, 35, 49, 49, 49, 46, 26, 49, 219, 26, 78, 49, 49, 49, 49, 49, - 26, 26, 218, 219, 219, 26, 49, 26, 220, 26, 49, 26, 183, 220, 49, 49, - 221, 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 218, 35, 35, 49, - 49, 222, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 223, - 223, 223, 37, 37, 223, 223, 223, 223, 223, 223, 37, 37, 37, 37, 223, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, - 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, - 225, 225, 225, 173, 173, 173, 44, 47, 173, 173, 173, 173, 37, 0, 0, 0, 0, - 0, 0, 40, 40, 40, 40, 40, 30, 30, 30, 30, 30, 226, 226, 26, 26, 26, 26, - 78, 26, 26, 78, 26, 26, 78, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, + 138, 138, 138, 138, 138, 187, 174, 174, 174, 174, 174, 0, 210, 211, 212, + 213, 174, 174, 174, 174, 174, 174, 214, 51, 0, 0, 34, 214, 214, 214, 214, + 214, 215, 215, 216, 217, 218, 219, 214, 34, 34, 34, 34, 214, 214, 214, + 214, 214, 215, 215, 216, 217, 218, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 220, 221, 85, + 85, 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 176, 176, + 81, 81, 81, 81, 176, 176, 176, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, + 176, 176, 81, 86, 81, 176, 176, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 49, 223, 26, 223, 222, 49, 26, 223, 35, + 49, 49, 49, 35, 35, 49, 49, 49, 46, 26, 49, 223, 26, 78, 49, 49, 49, 49, + 49, 26, 26, 222, 223, 223, 26, 49, 26, 224, 26, 49, 26, 184, 224, 49, 49, + 225, 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 222, 35, 35, 49, + 49, 226, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 227, + 227, 227, 37, 37, 227, 227, 227, 227, 227, 227, 37, 37, 37, 37, 227, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, + 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, + 229, 229, 229, 173, 173, 173, 44, 47, 173, 173, 173, 173, 37, 0, 0, 0, 0, + 0, 0, 40, 40, 40, 40, 40, 30, 30, 30, 30, 30, 230, 230, 26, 26, 26, 26, + 78, 26, 26, 78, 26, 26, 78, 26, 26, 26, 26, 26, 26, 26, 230, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 226, 226, 26, 26, 40, 26, 40, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 231, 230, 230, 26, 26, 40, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 40, 228, 229, 229, 230, 78, 78, 40, 229, 230, - 228, 229, 230, 228, 78, 40, 78, 229, 231, 232, 78, 229, 228, 78, 78, 78, - 229, 228, 228, 229, 40, 229, 229, 228, 228, 40, 230, 40, 230, 40, 40, 40, - 40, 229, 233, 222, 229, 222, 222, 228, 228, 228, 40, 40, 40, 40, 78, 228, - 78, 228, 229, 229, 228, 228, 228, 230, 228, 228, 230, 228, 228, 230, 229, - 230, 228, 228, 229, 78, 78, 78, 78, 78, 229, 228, 228, 228, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 228, 234, 40, 230, 78, 229, 229, 229, 229, 228, - 228, 229, 229, 78, 226, 234, 234, 230, 230, 228, 228, 230, 230, 228, 228, - 230, 230, 228, 228, 228, 228, 228, 228, 230, 230, 229, 229, 230, 230, - 229, 229, 230, 230, 228, 228, 228, 78, 78, 228, 228, 228, 228, 78, 78, - 40, 78, 78, 228, 40, 78, 78, 78, 78, 78, 78, 78, 78, 228, 228, 78, 40, - 228, 228, 228, 228, 228, 228, 230, 230, 230, 230, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 78, 78, 78, 78, 78, 228, 229, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 228, 228, 228, 228, 228, 78, 78, 228, 228, 78, 78, - 78, 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 230, 230, 230, - 230, 228, 228, 228, 228, 228, 228, 230, 230, 230, 230, 78, 78, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 26, - 26, 26, 26, 26, 26, 26, 26, 228, 228, 228, 228, 26, 26, 26, 26, 26, 26, - 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 228, 228, 26, 26, - 26, 26, 26, 26, 26, 235, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 78, 78, 78, 78, 78, 78, 78, 40, 232, 233, 233, 234, 78, 78, 40, 233, 234, + 232, 233, 234, 232, 78, 40, 78, 233, 235, 236, 78, 233, 232, 78, 78, 78, + 233, 232, 232, 233, 40, 233, 233, 232, 232, 40, 234, 40, 234, 40, 40, 40, + 40, 233, 237, 226, 233, 226, 226, 232, 232, 232, 40, 40, 40, 40, 78, 232, + 78, 232, 233, 233, 232, 232, 232, 234, 232, 232, 234, 232, 232, 234, 233, + 234, 232, 232, 233, 78, 78, 78, 78, 78, 233, 232, 232, 232, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 232, 238, 40, 234, 78, 233, 233, 233, 233, 232, + 232, 233, 233, 78, 230, 238, 238, 234, 234, 232, 232, 234, 234, 232, 232, + 234, 234, 232, 232, 232, 232, 232, 232, 234, 234, 233, 233, 234, 234, + 233, 233, 234, 234, 232, 232, 232, 78, 78, 232, 232, 232, 232, 78, 78, + 40, 78, 78, 232, 40, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 78, 40, + 232, 232, 232, 232, 232, 232, 234, 234, 234, 234, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, 233, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 232, 232, 232, 232, 232, 78, 78, 232, 232, 78, 78, + 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 234, 234, 234, + 234, 232, 232, 232, 232, 232, 232, 234, 234, 234, 234, 78, 78, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 26, + 26, 26, 26, 26, 26, 26, 26, 163, 164, 163, 164, 26, 26, 26, 26, 26, 26, + 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 232, 232, 26, 26, + 26, 26, 26, 26, 26, 239, 240, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, @@ -1703,14 +1711,14 @@ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 223, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 34, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 227, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, @@ -1745,14 +1753,14 @@ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, - 163, 164, 163, 164, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 163, 164, 163, 164, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 228, 78, 78, - 228, 228, 163, 164, 78, 228, 228, 78, 228, 228, 228, 78, 78, 78, 78, 78, - 228, 228, 228, 228, 78, 78, 78, 78, 78, 228, 228, 228, 78, 78, 78, 228, - 228, 228, 228, 9, 10, 9, 10, 9, 10, 9, 10, 163, 164, 78, 78, 78, 78, 78, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 232, 78, 78, + 232, 232, 163, 164, 78, 232, 232, 78, 232, 232, 232, 78, 78, 78, 78, 78, + 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, 78, 232, + 232, 232, 232, 9, 10, 9, 10, 9, 10, 9, 10, 163, 164, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, @@ -1769,30 +1777,30 @@ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 163, 164, 9, 10, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, - 164, 163, 164, 163, 164, 163, 164, 78, 78, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 78, 78, 78, 78, 78, 78, 78, 78, 228, 78, 78, 78, 78, 78, 78, 78, - 228, 228, 228, 228, 228, 228, 78, 78, 78, 228, 78, 78, 78, 78, 228, 228, - 228, 228, 228, 78, 228, 228, 78, 78, 163, 164, 163, 164, 228, 78, 78, 78, - 78, 228, 78, 228, 228, 228, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 228, 228, 228, 228, 228, 228, 78, 78, 163, 164, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 228, 228, 222, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 78, 228, 228, - 228, 228, 78, 78, 228, 78, 228, 78, 78, 228, 78, 228, 228, 228, 228, 78, - 78, 78, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 228, 228, 228, 78, 78, + 164, 163, 164, 163, 164, 163, 164, 78, 78, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 78, 78, 78, 78, 78, 78, 78, 78, 232, 78, 78, 78, 78, 78, 78, 78, + 232, 232, 232, 232, 232, 232, 78, 78, 78, 232, 78, 78, 78, 78, 232, 232, + 232, 232, 232, 78, 232, 232, 78, 78, 163, 164, 163, 164, 232, 78, 78, 78, + 78, 232, 78, 232, 232, 232, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 232, 232, 232, 232, 232, 232, 78, 78, 163, 164, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 226, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 232, 232, + 232, 232, 78, 78, 232, 78, 232, 78, 78, 232, 78, 232, 232, 232, 232, 78, + 78, 78, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 228, 228, 78, 78, 78, 78, 228, 228, 228, 228, 78, 228, 228, 78, 78, 228, - 222, 212, 212, 78, 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 78, 78, 228, 228, 228, 228, 228, 228, 228, 228, - 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 78, 78, 78, - 78, 78, 239, 78, 228, 78, 78, 78, 228, 228, 228, 228, 228, 78, 78, 78, - 78, 78, 228, 228, 228, 78, 78, 78, 78, 228, 78, 78, 78, 228, 228, 228, - 228, 228, 78, 228, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 78, 78, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 232, 232, 78, 78, 78, 78, 232, 232, 232, 232, 78, 232, 232, 78, 78, 232, + 226, 216, 216, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, + 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 78, 78, + 78, 78, 243, 78, 232, 78, 78, 78, 232, 232, 232, 232, 232, 78, 78, 78, + 78, 78, 232, 232, 232, 78, 78, 78, 78, 232, 78, 78, 78, 232, 232, 232, + 232, 232, 78, 232, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -1838,105 +1846,105 @@ 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 0, 240, 240, 240, 240, 241, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 0, 0, 0, 0, 242, 243, 243, 243, - 240, 244, 170, 245, 246, 247, 246, 247, 246, 247, 246, 247, 246, 247, - 240, 240, 246, 247, 246, 247, 246, 247, 246, 247, 248, 249, 250, 250, - 240, 245, 245, 245, 245, 245, 245, 245, 245, 245, 251, 252, 253, 254, - 255, 255, 248, 244, 244, 244, 244, 244, 241, 240, 256, 256, 256, 244, - 170, 243, 240, 26, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, - 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 170, 257, 170, - 257, 170, 257, 170, 170, 170, 170, 170, 170, 257, 257, 170, 257, 257, - 170, 257, 257, 170, 257, 257, 170, 257, 257, 170, 170, 170, 170, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 0, 244, 244, 244, 244, 245, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 246, 247, 247, 247, + 244, 248, 170, 249, 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, + 244, 244, 250, 251, 250, 251, 250, 251, 250, 251, 252, 253, 254, 254, + 244, 249, 249, 249, 249, 249, 249, 249, 249, 249, 255, 256, 257, 258, + 259, 259, 252, 248, 248, 248, 248, 248, 245, 244, 260, 260, 260, 248, + 170, 247, 244, 26, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, + 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 170, 261, 170, + 261, 170, 261, 170, 170, 170, 170, 170, 170, 261, 261, 170, 261, 261, + 170, 261, 261, 170, 261, 261, 170, 261, 261, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 257, 170, 170, 0, 0, 258, 258, 259, 259, 244, 260, 261, - 248, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 257, 170, - 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, - 257, 170, 257, 170, 257, 170, 257, 170, 170, 257, 170, 257, 170, 257, - 170, 170, 170, 170, 170, 170, 257, 257, 170, 257, 257, 170, 257, 257, - 170, 257, 257, 170, 257, 257, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 261, 170, 170, 0, 0, 262, 262, 263, 263, 248, 264, 265, + 252, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 261, 170, + 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, + 261, 170, 261, 170, 261, 170, 261, 170, 170, 261, 170, 261, 170, 261, + 170, 170, 170, 170, 170, 170, 261, 261, 170, 261, 261, 170, 261, 261, + 170, 261, 261, 170, 261, 261, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 257, 170, 170, 257, 257, 257, 257, 243, 244, 244, 260, 261, 0, 0, 0, 0, + 261, 170, 170, 261, 261, 261, 261, 247, 248, 248, 264, 265, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 262, 262, 263, 263, - 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 170, 170, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 266, 266, 267, 267, + 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 241, 241, 0, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265, 241, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 241, - 241, 241, 262, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 241, 241, 241, 241, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 241, 241, 241, - 241, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 241, 241, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 241, 170, 170, 170, 170, 170, 170, + 170, 170, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 245, 245, 0, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, 245, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, + 245, 245, 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 245, 245, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 245, + 245, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 245, 245, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 245, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, @@ -1962,7 +1970,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 244, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 248, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, @@ -1971,11 +1979,11 @@ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 0, 0, 0, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 170, 170, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 138, 138, @@ -1999,7 +2007,7 @@ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, - 47, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 52, 267, 267, 44, 47, 44, + 47, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 52, 271, 271, 44, 47, 44, 47, 0, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2008,7 +2016,7 @@ 48, 48, 48, 135, 48, 48, 48, 142, 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 135, 135, 139, 26, 26, 26, 26, 0, 0, 0, 0, 148, 148, 148, - 148, 148, 148, 80, 80, 85, 221, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 148, 148, 148, 80, 80, 85, 225, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 138, 138, 138, 138, 0, 0, 0, 0, @@ -2024,13 +2032,13 @@ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 86, 86, 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 139, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 170, + 135, 135, 135, 135, 139, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, - 139, 139, 135, 135, 135, 135, 139, 139, 135, 139, 139, 139, 174, 83, 83, + 139, 139, 135, 135, 135, 135, 139, 139, 135, 139, 139, 139, 175, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 53, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2060,144 +2068,144 @@ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 135, 139, 139, 135, 139, 139, 83, 139, 142, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, - 0, 0, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 0, 0, 0, 0, 0, 0, + 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 170, 170, 270, 170, 270, 170, 170, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 170, 270, 170, 270, 170, 170, 270, 270, 170, 170, 170, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 170, 170, 274, 170, 274, 170, 170, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 170, 274, 170, 274, 170, 170, 274, 274, 170, 170, 170, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 35, 35, 35, 35, 0, 0, 0, 0, 0, 271, 272, 271, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 211, 271, 271, 271, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 0, 271, 271, 271, 271, 271, 0, 271, 0, 271, 271, 0, - 271, 271, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 273, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 195, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 276, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 277, 277, 277, 277, 277, 277, 277, 278, 279, 277, 0, 0, - 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, - 280, 280, 281, 281, 278, 279, 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 243, 243, 278, 279, 277, 277, 277, 277, - 281, 281, 281, 282, 277, 282, 0, 277, 282, 277, 277, 280, 283, 284, 283, - 284, 283, 284, 285, 277, 277, 286, 287, 288, 288, 289, 0, 277, 290, 285, - 277, 0, 0, 0, 0, 130, 130, 130, 117, 130, 0, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 0, 0, 187, 0, 291, 291, 292, 293, 292, 291, 291, 294, - 295, 291, 296, 297, 298, 297, 297, 299, 299, 299, 299, 299, 299, 299, - 299, 299, 299, 297, 291, 300, 301, 300, 291, 291, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 302, 302, 302, 294, 291, 295, 303, 304, 303, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 294, 301, - 295, 301, 294, 295, 306, 307, 308, 306, 306, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 310, 309, 309, 309, 309, 309, 309, 309, 309, + 35, 35, 35, 35, 0, 0, 0, 0, 0, 275, 276, 275, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 215, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 0, 275, 275, 275, 275, 275, 0, 275, 0, 275, 275, 0, + 275, 275, 0, 275, 275, 275, 275, 275, 275, 275, 275, 275, 277, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 195, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 280, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 281, 281, 281, 281, 281, 281, 281, 282, 283, 281, 0, 0, + 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, + 284, 284, 285, 285, 282, 283, 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 247, 247, 282, 283, 281, 281, 281, 281, + 285, 285, 285, 286, 281, 286, 0, 281, 286, 281, 281, 284, 287, 288, 287, + 288, 287, 288, 289, 281, 281, 290, 291, 292, 292, 293, 0, 281, 294, 289, + 281, 0, 0, 0, 0, 131, 131, 131, 118, 131, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 0, 0, 174, 0, 295, 295, 296, 297, 296, 295, 295, 298, + 299, 295, 300, 301, 302, 301, 301, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 301, 295, 304, 305, 304, 295, 295, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 298, 295, 299, 307, 308, 307, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, 310, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 0, - 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309, 309, 309, 309, - 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309, 0, 0, 0, 293, - 293, 301, 303, 311, 293, 293, 0, 312, 313, 313, 313, 313, 312, 312, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 314, 314, 314, 26, 30, 0, 0, 48, 48, 48, 48, 48, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 298, 305, + 299, 305, 298, 299, 310, 311, 312, 310, 310, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 314, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 314, 314, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 0, + 0, 0, 313, 313, 313, 313, 313, 313, 0, 0, 313, 313, 313, 313, 313, 313, + 0, 0, 313, 313, 313, 313, 313, 313, 0, 0, 313, 313, 313, 0, 0, 0, 297, + 297, 305, 307, 315, 297, 297, 0, 316, 317, 317, 317, 317, 316, 316, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 318, 318, 318, 26, 30, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -2215,11 +2223,11 @@ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 80, 80, 80, 80, 80, 80, 80, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 153, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2264,11 +2272,11 @@ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 0, 104, 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0, 0, + 107, 107, 0, 104, 320, 320, 320, 320, 320, 320, 320, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 316, 316, 316, 316, 316, - 316, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 320, 320, 320, 320, 320, + 320, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2283,20 +2291,20 @@ 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0, 135, 86, 135, 81, 107, 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 175, 86, 0, 0, 0, 0, 142, - 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0, 0, 0, 0, 0, 104, 104, + 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 176, 86, 0, 0, 0, 0, 142, + 320, 320, 320, 320, 320, 320, 320, 320, 0, 0, 0, 0, 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 316, 316, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 320, 320, 104, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316, 107, 107, 107, 107, + 107, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 0, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316, 107, 107, + 107, 0, 0, 0, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, @@ -2308,9 +2316,9 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 0, 139, 135, 139, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 0, 139, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, @@ -2335,13 +2343,13 @@ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 139, 174, 48, 48, 48, 48, 83, 83, 83, 83, + 135, 135, 135, 135, 135, 135, 139, 175, 48, 48, 48, 48, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 139, 135, 139, 139, 135, 135, 135, 135, 135, 135, 174, 145, 0, 0, 0, 0, + 139, 135, 139, 139, 135, 135, 135, 135, 135, 135, 175, 145, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2403,12 +2411,12 @@ 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 318, 318, 318, 318, 318, 318, 318, 319, 319, 175, 175, 175, 80, 80, 80, - 320, 319, 319, 319, 319, 319, 187, 187, 187, 187, 187, 187, 187, 187, 86, + 322, 322, 322, 322, 322, 322, 322, 323, 323, 176, 176, 176, 80, 80, 80, + 324, 323, 323, 323, 323, 323, 174, 174, 174, 174, 174, 174, 174, 174, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 318, 318, 318, 318, 318, 318, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 322, 322, 322, 322, 322, 322, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, @@ -2463,38 +2471,38 @@ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, + 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, + 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 130, 130, 130, 130, 0, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 130, 0, 0, - 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130, 130, - 130, 130, 0, 130, 0, 130, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 130, 0, 130, - 0, 130, 0, 130, 130, 130, 0, 130, 130, 0, 130, 0, 0, 130, 0, 130, 0, 130, - 0, 130, 0, 130, 0, 130, 130, 0, 130, 0, 0, 130, 130, 130, 130, 0, 130, - 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 130, 130, - 130, 0, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 0, 0, 0, 0, 0, 130, 130, 130, 0, 130, 130, 130, 130, 130, 0, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 131, 131, 131, 131, 0, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, + 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, + 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 131, 0, 131, + 0, 131, 0, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 0, 131, + 0, 131, 0, 131, 0, 131, 131, 0, 131, 0, 0, 131, 131, 131, 131, 0, 131, + 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 131, 131, + 131, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, 131, 131, 131, 131, 131, 0, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, @@ -2511,26 +2519,26 @@ 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 0, 0, 0, 0, 0, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 323, 0, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 218, 218, 0, 0, 0, 0, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 237, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 0, + 34, 34, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 327, 0, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 222, 222, 0, 0, 0, 0, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 241, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 0, 0, 0, 0, 0, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 0, 0, 0, 0, 0, 0, 0, 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 268, 268, 268, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 0, 0, 0, 0, 0, 0, 0, 268, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, @@ -2614,21 +2622,21 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 0, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -2642,16 +2650,16 @@ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 0, 0, }; /* decomposition data */ @@ -5176,7 +5184,6 @@ { 255, 7, 8, 255, 0 }, { 255, 7, 9, 255, 0 }, { 1, 5, 255, 255, 0 }, - { 15, 14, 255, 255, 0 }, { 255, 10, 255, 255, 0 }, { 18, 255, 255, 255, 0 }, { 19, 255, 255, 255, 0 }, @@ -5189,6 +5196,7 @@ { 255, 255, 9, 255, 0 }, { 19, 30, 255, 255, 0 }, { 255, 8, 255, 255, 0 }, + { 255, 27, 255, 255, 0 }, { 255, 22, 255, 255, 0 }, { 255, 23, 255, 255, 0 }, { 9, 255, 255, 255, 0 }, @@ -5203,8 +5211,8 @@ static unsigned char changes_3_2_0_index[] = { 0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 2, 2, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 2, 2, 2, 37, 38, 2, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 2, 52, 2, 2, 53, 54, 55, 56, 57, 2, 2, 58, 59, 60, 2, 2, 61, 62, 63, + 36, 2, 2, 2, 37, 38, 2, 39, 2, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 2, 51, 2, 2, 52, 53, 54, 55, 56, 2, 57, 58, 59, 60, 2, 2, 61, 62, 63, 64, 65, 65, 2, 2, 2, 2, 66, 2, 67, 68, 69, 70, 71, 2, 2, 2, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 2, 2, 2, 2, 2, 2, 82, 2, 2, 2, 2, 2, 83, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5215,8 +5223,8 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 96, 50, 50, - 97, 98, 50, 99, 100, 101, 102, 103, 104, 105, 106, 107, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 96, 49, 49, + 97, 98, 49, 99, 100, 101, 102, 103, 104, 105, 106, 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5227,13 +5235,13 @@ 119, 120, 121, 122, 2, 123, 124, 125, 126, 127, 2, 2, 2, 2, 2, 2, 128, 2, 129, 130, 131, 2, 132, 2, 133, 2, 2, 2, 134, 2, 2, 2, 135, 136, 137, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, 140, 2, 141, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, 50, - 50, 142, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 143, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 49, 49, 49, 49, 49, 49, 140, 2, 141, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, 49, 49, 49, 49, + 49, 142, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, 49, 143, 2, 2, 2, 2, 2, 2, 2, 2, 2, 144, 145, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5260,9 +5268,9 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 178, 50, 179, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 178, 49, 179, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5503,7 +5511,7 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5625,7 +5633,7 @@ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5785,761 +5793,761 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 35, 4, 0, 0, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, + 4, 35, 8, 6, 7, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 46, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, + 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, + 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 0, 0, 37, 38, 39, 40, - 41, 42, 1, 1, 0, 0, 0, 4, 36, 8, 6, 7, 37, 38, 39, 40, 41, 42, 1, 1, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 46, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, - 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, - 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, }; static const change_record* get_change_3_2_0(Py_UCS4 n) diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -6,7 +6,7 @@ static unsigned char lexicon[] = { 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 89, 76, 76, 65, 66, 76, 197, 83, 77, 65, 76, 204, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204, - 76, 65, 84, 73, 206, 89, 201, 67, 74, 203, 65, 82, 65, 66, 73, 195, 77, + 76, 65, 84, 73, 206, 89, 201, 65, 82, 65, 66, 73, 195, 67, 74, 203, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 69, 71, 89, 80, 84, 73, 65, 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89, 77, @@ -27,24 +27,24 @@ 75, 65, 78, 193, 194, 77, 79, 68, 73, 70, 73, 69, 210, 68, 79, 212, 75, 65, 78, 71, 88, 201, 65, 128, 76, 73, 78, 69, 65, 210, 84, 73, 66, 69, 84, 65, 206, 79, 198, 73, 78, 73, 84, 73, 65, 204, 77, 69, 69, 205, 86, - 69, 82, 84, 73, 67, 65, 204, 77, 89, 65, 78, 77, 65, 210, 75, 72, 77, 69, - 210, 85, 128, 87, 72, 73, 84, 197, 67, 65, 82, 82, 73, 69, 210, 73, 128, - 65, 82, 82, 79, 87, 128, 79, 128, 65, 66, 79, 86, 197, 77, 65, 82, 75, - 128, 89, 69, 200, 65, 82, 82, 79, 215, 67, 79, 80, 84, 73, 195, 80, 72, - 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 68, 69, 86, 65, - 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, 203, 84, 73, 76, 197, 83, 89, - 77, 66, 79, 76, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, - 84, 72, 65, 205, 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, - 69, 128, 83, 81, 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, 82, 69, - 215, 77, 73, 65, 207, 80, 76, 85, 211, 82, 73, 71, 72, 84, 87, 65, 82, - 68, 211, 71, 69, 79, 82, 71, 73, 65, 206, 68, 82, 65, 87, 73, 78, 71, - 211, 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, + 69, 82, 84, 73, 67, 65, 204, 77, 89, 65, 78, 77, 65, 210, 85, 128, 75, + 72, 77, 69, 210, 87, 72, 73, 84, 197, 65, 66, 79, 86, 197, 67, 65, 82, + 82, 73, 69, 210, 73, 128, 65, 82, 82, 79, 87, 128, 89, 69, 200, 79, 128, + 77, 65, 82, 75, 128, 65, 82, 82, 79, 215, 67, 79, 80, 84, 73, 195, 80, + 72, 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 68, 69, 86, + 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, 203, 84, 73, 76, 197, 83, + 89, 77, 66, 79, 76, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, + 196, 84, 72, 65, 205, 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, + 79, 75, 69, 128, 83, 81, 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, + 82, 69, 215, 77, 73, 65, 207, 80, 76, 85, 211, 82, 73, 71, 72, 84, 87, + 65, 82, 68, 211, 71, 69, 79, 82, 71, 73, 65, 206, 68, 82, 65, 87, 73, 78, + 71, 211, 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, 65, 76, 73, 78, 69, 83, 197, 72, 79, 79, 75, 128, 213, 84, 87, 79, 128, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, - 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 73, 195, 79, 78, 69, 128, 84, 79, 128, 65, 76, 69, 198, 84, 87, 207, - 72, 69, 65, 86, 217, 67, 79, 78, 83, 79, 78, 65, 78, 212, 79, 86, 69, - 210, 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79, + 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 65, 76, 69, 198, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 73, 195, 79, 78, 69, 128, 84, 79, 128, 84, 87, 207, + 72, 69, 65, 86, 217, 79, 86, 69, 210, 67, 79, 78, 83, 79, 78, 65, 78, + 212, 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79, 215, 72, 65, 200, 79, 78, 197, 68, 79, 87, 206, 72, 73, 71, 200, 70, 85, 76, 76, 87, 73, 68, 84, 200, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 84, 65, 199, 66, 65, 82, 128, 68, 79, 77, 73, 78, 207, 78, 85, @@ -65,49 +65,49 @@ 76, 85, 197, 83, 72, 65, 82, 65, 68, 193, 83, 73, 78, 72, 65, 76, 193, 75, 65, 128, 82, 85, 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 84, 69, 84, 82, 65, 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, 212, - 83, 89, 82, 73, 65, 195, 84, 73, 76, 68, 69, 128, 71, 85, 82, 77, 85, 75, - 72, 201, 77, 65, 128, 77, 65, 89, 69, 203, 77, 69, 69, 84, 69, 201, 78, - 79, 84, 65, 84, 73, 79, 206, 70, 73, 86, 69, 128, 80, 65, 128, 89, 65, - 128, 76, 73, 71, 72, 212, 83, 73, 88, 128, 69, 73, 71, 72, 84, 128, 76, - 69, 80, 67, 72, 193, 78, 65, 128, 83, 69, 86, 69, 78, 128, 76, 79, 78, - 199, 78, 73, 78, 69, 128, 84, 85, 82, 75, 73, 195, 72, 65, 77, 90, 193, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 79, 80, 69, 206, 82, 65, 128, - 83, 65, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 86, 73, 69, 212, 76, - 65, 207, 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, 65, 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, 83, 89, 65, 128, - 90, 90, 83, 65, 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, 83, 80, 128, 90, 87, 78, 74, - 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 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, 85, 77, 128, 90, 85, 66, 85, - 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 83, 72, 65, 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, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, 82, - 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, - 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, - 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, 69, - 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, 79, 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, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, - 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90, - 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, + 72, 65, 77, 90, 193, 83, 89, 82, 73, 65, 195, 84, 73, 76, 68, 69, 128, + 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 128, 77, 65, 89, 69, 203, 77, + 69, 69, 84, 69, 201, 78, 79, 84, 65, 84, 73, 79, 206, 70, 73, 86, 69, + 128, 80, 65, 128, 89, 65, 128, 76, 73, 71, 72, 212, 83, 73, 88, 128, 69, + 73, 71, 72, 84, 128, 76, 69, 80, 67, 72, 193, 78, 65, 128, 83, 69, 86, + 69, 78, 128, 76, 79, 78, 199, 78, 73, 78, 69, 128, 84, 85, 82, 75, 73, + 195, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 79, 80, 69, 206, 82, 65, + 128, 83, 65, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 86, 73, 69, 212, + 76, 65, 207, 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, 65, 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, 83, 89, 65, + 128, 90, 90, 83, 65, 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, 83, 80, 128, 90, 87, 78, + 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 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, 85, 77, 128, 90, 85, 66, + 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 83, 72, 65, 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, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, + 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, + 128, 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, + 201, 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, + 69, 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, 79, 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, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, + 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 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, 77, 88, 128, 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48, @@ -796,409 +796,410 @@ 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 128, 83, 213, 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89, 128, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, 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, 80, 69, - 128, 83, 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 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, 69, - 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, - 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84, - 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73, - 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 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, - 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, - 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, - 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, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, 69, 65, - 205, 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, 85, 197, 83, 84, 65, 84, 73, 79, 78, 128, 83, 84, 65, 84, 69, 82, 83, - 128, 83, 84, 65, 84, 69, 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 83, - 128, 83, 84, 65, 82, 82, 69, 196, 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, 84, 50, 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, - 85, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, 88, 128, - 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 79, 128, 83, 83, - 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, 80, 128, - 83, 83, 73, 73, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, 80, 128, - 83, 83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 72, 69, 128, 83, 83, 69, - 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, 83, 83, 65, 88, 128, - 83, 83, 65, 85, 128, 83, 83, 65, 84, 128, 83, 83, 65, 80, 128, 83, 83, - 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83, 83, 65, - 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, - 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72, 73, 69, - 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73, 75, 69, - 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, - 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, - 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, 73, 69, - 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 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, 77, 73, 69, 85, 77, - 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, 45, 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, 73, 128, 83, 83, 65, 65, 128, 83, 83, 51, 128, 83, - 83, 50, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, - 82, 69, 204, 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, 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, 73, 78, - 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, 83, 80, 79, 85, - 84, 73, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, 80, - 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, 65, 83, 72, 73, 78, 199, 83, 80, - 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, 128, 83, 80, 73, 82, 73, - 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 82, 65, 76, 128, 83, - 80, 73, 82, 65, 204, 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, 83, 77, 73, 76, - 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, 83, 80, 69, 69, 67, 72, - 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, - 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, 128, 83, 80, 69, 65, 75, 69, - 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, 73, 204, 83, 80, 65, 84, - 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76, - 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76, - 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83, - 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67, - 197, 83, 80, 65, 128, 83, 79, 89, 128, 83, 79, 87, 73, 76, 207, 83, 79, - 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 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, 78, 65, 80, 128, - 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 82, 193, 83, 79, 81, 128, 83, - 79, 79, 206, 83, 79, 78, 74, 65, 77, 128, 83, 79, 78, 71, 128, 83, 79, - 78, 128, 83, 79, 77, 80, 69, 78, 199, 83, 79, 77, 128, 83, 79, 76, 73, - 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 72, 128, 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, 84, 78, 69, 83, 83, 128, 83, 79, 70, 212, - 83, 79, 198, 83, 79, 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, - 83, 79, 65, 80, 128, 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, 65, - 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, - 128, 83, 78, 79, 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, - 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, 65, 73, 76, 128, 83, - 78, 193, 83, 77, 79, 75, 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, - 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, - 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, - 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68, - 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, - 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78, - 73, 195, 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, 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, - 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, - 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, 128, 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, 211, 83, 73, 88, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, - 128, 83, 73, 88, 84, 69, 69, 78, 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, 84, 72, 73, 82, 84, 89, 128, 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, 84, 69, 128, 83, 73, 83, 65, 128, 83, - 73, 82, 73, 78, 71, 85, 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, 72, 73, - 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 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, 72, 73, 69, 85, 75, 72, 128, 83, - 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 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, 83, 72, 73, 70, 84, 45, 51, - 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 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, 71, 65, 65, 84, 128, 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, 76, 85, 78, 71, 85, 206, 83, - 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, 83, - 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, - 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, - 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, - 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, - 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, - 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, 201, 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, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, - 128, 83, 72, 87, 79, 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, 85, 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, 77, 128, 83, 72, 85, 70, - 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, 85, 69, - 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 50, 128, 83, 72, 85, - 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, 80, 73, 67, 128, 83, - 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, - 128, 83, 72, 82, 73, 73, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, - 83, 72, 79, 87, 69, 82, 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, 67, 65, 75, - 69, 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, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128, - 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, - 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, - 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, - 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, - 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, - 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78, - 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, - 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, - 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, - 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, - 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, - 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, - 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, - 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, - 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, - 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, - 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, - 128, 83, 72, 69, 78, 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, 71, 57, 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, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, 128, - 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65, - 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, 83, 72, - 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65, - 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65, - 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, - 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, - 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 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, 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, 66, 54, - 128, 83, 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 51, 128, 83, - 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71, - 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83, - 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 211, 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, 72, 128, 83, 69, 86, 69, 78, 84, 69, - 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, - 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, 69, 206, 83, 69, 85, 88, 128, - 83, 69, 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69, 81, 128, 83, 69, 84, - 70, 79, 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, - 85, 73, 81, 85, 65, 68, 82, 65, 84, 69, 128, 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, 81, 85, 69, 78, 67, 197, 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, - 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, - 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, - 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 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, 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, - 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, - 76, 69, 67, 84, 69, 196, 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, + 79, 78, 199, 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, 80, 69, 128, 83, 84, 82, 73, 78, 71, 128, 83, 84, + 82, 73, 78, 199, 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, 69, 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, + 69, 82, 82, 89, 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, + 65, 84, 85, 77, 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, + 65, 206, 83, 84, 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, + 84, 78, 69, 83, 83, 128, 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, 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, + 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, + 69, 128, 83, 84, 79, 80, 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, 65, 77, 73, 78, 199, 83, 84, 69, + 65, 77, 128, 83, 84, 69, 65, 205, 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, 85, 197, 83, 84, 65, 84, 73, 79, 78, + 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 84, 69, 128, 83, 84, + 65, 82, 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 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, 84, 50, 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, 85, 128, 83, 83, 85, 84, 128, 83, 83, + 85, 80, 128, 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, 80, + 128, 83, 83, 79, 79, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, + 73, 84, 128, 83, 83, 73, 80, 128, 83, 83, 73, 73, 128, 83, 83, 73, 69, + 88, 128, 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 73, 128, + 83, 83, 72, 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, + 69, 69, 128, 83, 83, 65, 88, 128, 83, 83, 65, 85, 128, 83, 83, 65, 84, + 128, 83, 83, 65, 80, 128, 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, + 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, + 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, + 83, 65, 78, 71, 84, 72, 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, + 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, + 79, 83, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, + 45, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, + 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, + 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, 77, 73, 69, 85, 77, 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, 45, + 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, 73, 128, 83, 83, 65, + 65, 128, 83, 83, 51, 128, 83, 83, 50, 128, 83, 82, 128, 83, 81, 85, 73, + 83, 200, 83, 81, 85, 73, 82, 82, 69, 204, 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, 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, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, + 83, 65, 78, 199, 83, 80, 79, 85, 84, 73, 78, 199, 83, 80, 79, 84, 128, + 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, + 65, 83, 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, + 73, 84, 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, + 83, 80, 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 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, 83, 77, 73, 76, 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, + 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, + 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, 128, + 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, + 73, 204, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, + 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, + 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, + 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, + 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 65, 128, 83, 79, 89, 128, 83, + 79, 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, + 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, 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, + 82, 193, 83, 79, 81, 128, 83, 79, 79, 206, 83, 79, 78, 74, 65, 77, 128, + 83, 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, 80, 69, 78, 199, 83, + 79, 77, 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, + 211, 83, 79, 72, 128, 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, 84, 78, 69, + 83, 83, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 73, 69, 84, 89, + 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, 83, 79, 65, 128, 83, + 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, + 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, 87, 66, 79, 65, 82, 68, + 69, 82, 128, 83, 78, 79, 87, 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, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, 73, 78, 199, 83, + 77, 73, 82, 75, 73, 78, 199, 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, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, + 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, + 78, 71, 128, 83, 76, 73, 68, 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, + 83, 76, 73, 67, 197, 83, 76, 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, + 199, 83, 76, 65, 86, 79, 78, 73, 195, 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, 76, 128, 83, 75, 85, + 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, + 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, + 128, 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, 211, 83, 73, 88, 84, 72, 128, 83, + 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, 78, 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, 84, 72, 73, 82, 84, 89, + 128, 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, 84, + 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 73, 78, 71, 85, 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, 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, + 45, 80, 65, 78, 83, 73, 79, 83, 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, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, + 79, 85, 78, 80, 73, 69, 85, 80, 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, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, + 83, 72, 73, 70, 84, 45, 50, 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, + 71, 65, 65, 84, 128, 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, 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, + 69, 82, 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, + 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, + 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, + 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, + 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, + 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, 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, 201, 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, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, 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, 85, 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, 77, 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, + 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, 85, 69, 84, 128, 83, 72, 85, 66, + 85, 82, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, + 72, 213, 83, 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, + 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, 73, + 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, + 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, 67, 65, 75, 69, 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, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, + 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, 83, 72, 79, + 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, 72, + 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, + 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 212, + 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, + 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78, 84, 207, 83, 72, + 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, 78, 128, 83, + 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, + 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, + 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, + 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, + 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, + 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, 69, 85, 65, + 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, 128, 83, 72, + 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, 83, 72, 73, 71, + 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, 128, 83, 72, + 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, 83, 72, + 69, 78, 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, 71, 57, 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, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, 128, 83, 72, + 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65, 86, 73, + 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, 83, 72, 65, 84, + 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, + 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, + 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, + 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, + 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 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, 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, 66, 54, 128, 83, + 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, + 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71, 65, 215, + 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, + 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 211, 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, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, + 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, + 73, 82, 84, 89, 128, 83, 69, 86, 69, 206, 83, 69, 85, 88, 128, 83, 69, + 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69, 81, 128, 83, 69, 84, 70, 79, + 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, + 81, 85, 65, 68, 82, 65, 84, 69, 128, 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, 81, 85, 69, 78, 67, 197, 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, 85, + 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, 128, + 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83, + 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 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, 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, 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, 76, 69, + 67, 84, 69, 196, 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, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 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, @@ -1292,2731 +1293,2733 @@ 67, 203, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 77, - 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, 82, 76, 69, 128, 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, 211, 82, 73, 78, 70, 79, 82, 90, 65, 78, - 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 75, 82, - 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 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, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, - 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, - 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, - 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, - 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 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, 84, 73, 75, 69, - 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, - 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, - 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, - 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, - 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 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, 80, 72, 73, 69, 85, 80, 72, 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, 45, 72, 73, 69, 85, 72, 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, 45, - 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, - 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, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, - 128, 82, 73, 69, 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, - 82, 73, 67, 197, 82, 73, 66, 66, 79, 78, 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, 86, 73, 78, 199, 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, 69, 196, 82, 69, 86, 69, 82, - 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, 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, 84, 79, 82, 84, 128, 82, 69, 83, 85, - 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, 77, 128, 82, 69, 83, - 84, 82, 73, 67, 84, 69, 196, 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, 200, 82, 69, 82, 69, 78, 71, - 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, 128, 82, 69, 80, 82, 69, 83, - 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 82, 69, 80, - 72, 128, 82, 69, 80, 69, 84, 73, 84, 73, 79, 206, 82, 69, 80, 69, 65, 84, - 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, - 80, 65, 89, 65, 128, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, 69, 78, - 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 206, 82, 69, 77, 85, - 128, 82, 69, 77, 69, 68, 89, 128, 82, 69, 76, 73, 71, 73, 79, 78, 128, - 82, 69, 76, 73, 69, 86, 69, 196, 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, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, 69, - 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128, - 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128, - 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, - 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71, - 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, 70, 69, 82, 69, 78, - 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 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, 82, 69, 65, 84, 73, 79, 78, 65, 204, 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, 67, 69, 73, 86, 69, - 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, - 82, 128, 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, 72, 65, - 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, - 83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, - 128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, - 197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, - 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, - 65, 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, - 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, 65, 89, - 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, 128, 82, 65, 73, 68, - 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, - 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, 69, 77, 128, 82, 65, - 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, 128, 82, 65, 68, - 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, 67, 81, - 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 66, 66, 73, 84, 128, - 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, 65, - 51, 128, 82, 65, 50, 128, 82, 65, 45, 50, 128, 82, 48, 50, 57, 128, 82, - 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82, 48, 50, - 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50, 50, 128, - 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128, 82, 48, - 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82, 48, 49, - 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49, 51, 128, - 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65, 128, 82, - 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82, 48, 48, - 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48, 52, 128, - 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48, 51, 128, - 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49, 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, 84, 69, 83, 83, 69, 78, - 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, - 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, - 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, 85, 70, 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, 69, - 206, 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, 78, 84, 73, 84, 217, 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, 72, 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, 78, 128, 81, 73, 88, - 128, 81, 73, 84, 83, 65, 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, 71, 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, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, - 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, - 128, 80, 90, 128, 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, 89, 128, 80, - 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 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, 85, 84, 128, 80, 85, - 85, 128, 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, - 128, 80, 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, - 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, - 85, 82, 83, 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, - 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, - 82, 128, 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, - 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, - 78, 71, 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, 77, 80, 128, 80, 85, 77, 128, - 80, 85, 69, 128, 80, 85, 66, 76, 73, 195, 80, 85, 65, 81, 128, 80, 85, - 65, 69, 128, 80, 85, 50, 128, 80, 85, 49, 128, 80, 85, 128, 80, 84, 72, - 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 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, 84, - 69, 67, 84, 69, 196, 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, 71, 82, 65, 205, 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, 86, 65, 84, - 197, 80, 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, - 84, 82, 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 128, 80, - 82, 73, 78, 212, 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 77, 69, - 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, - 83, 69, 84, 128, 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, 78, 75, 72, 65, 128, 80, 82, 69, 70, - 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, - 67, 69, 68, 73, 78, 199, 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, 86, 128, 80, 80, 77, 128, 80, 80, 65, 128, - 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, 79, 87, - 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, 82, - 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67, - 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, - 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, - 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, - 83, 212, 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, 80, - 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, 128, - 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 77, 77, - 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 73, 83, 72, 128, 80, - 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 76, - 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, 75, 79, 74, 73, 128, - 80, 79, 73, 78, 84, 211, 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, 82, 65, 76, - 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, - 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79, - 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, 68, 128, - 80, 76, 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, - 65, 78, 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, - 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, - 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, - 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 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, 84, 79, 76, 128, 80, 73, - 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, - 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, - 73, 78, 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, - 80, 65, 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, - 204, 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, - 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76, - 197, 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, 199, 80, 73, 69, 88, 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, 84, 72, 73, 69, 85, 84, 72, 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, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82, - 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80, - 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75, - 72, 73, 69, 85, 75, 72, 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, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84, - 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, - 80, 73, 67, 75, 69, 84, 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, 82, 65, 83, 69, 128, 80, 72, 79, - 78, 69, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 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, 79, 83, 79, 80, 72, 69, 82, 211, 80, - 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, - 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, - 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, - 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 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, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, - 89, 78, 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, - 72, 65, 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, - 80, 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, - 72, 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, - 84, 65, 69, 128, 80, 69, 85, 84, 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, 72, 50, 128, 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, 65, 204, 80, 69, 82, 83, 79, 78, - 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, - 83, 69, 86, 69, 82, 73, 78, 199, 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, 73, 84, 84, 69, 196, 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, 79, 82, 77, 73, 78, 199, 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, 80, 69, 84, 128, 80, 69, 80, 69, 212, 80, 69, - 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, 128, 80, 69, 78, 84, 65, 83, 69, - 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, 78, 84, 65, - 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, 197, - 80, 69, 78, 78, 217, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, - 78, 128, 80, 69, 78, 71, 75, 65, 76, 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, 83, 72, 73, 128, 80, 69, 69, 80, - 128, 80, 69, 69, 77, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, - 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 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, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, - 67, 197, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82, - 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128, - 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 215, 80, - 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 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, 80, 79, 82, 212, 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, 72, 65, 69, - 128, 80, 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, - 82, 85, 77, 128, 80, 65, 82, 84, 217, 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, 84, 72, 73, 65, 206, - 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, 82, 69, 78, 128, 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, 89, 82, 85, 83, - 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, - 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, - 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, - 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, - 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, - 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, - 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, - 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, - 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, - 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, 128, 80, 65, 78, 71, 76, 65, - 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, 65, - 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, 80, - 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193, 80, 65, 78, - 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, 85, 78, 71, - 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 77, 83, 72, - 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, 80, 65, 77, 73, 78, - 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, 80, 65, 77, 69, 78, - 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, 77, 65, 65, 69, 72, - 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, 72, 75, 65, 128, - 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, - 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 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, 75, 80, - 65, 203, 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, 73, 128, 80, 65, 72, 76, - 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, - 80, 65, 68, 77, 193, 80, 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80, - 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, - 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, - 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80, - 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, 80, - 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, 48, - 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, 128, - 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, 80, - 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, 89, - 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, 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, 79, 78, 199, 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, 65, 204, 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, 84, 66, 79, 216, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, - 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193, - 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, - 79, 83, 77, 65, 78, 89, 193, 79, 83, 67, 128, 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, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, - 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, - 68, 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79, - 80, 84, 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 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, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, - 67, 72, 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, - 65, 84, 79, 210, 79, 80, 69, 82, 65, 84, 73, 78, 199, 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, 79, - 90, 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, - 77, 85, 128, 79, 79, 69, 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, 87, 65, 217, - 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, - 197, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 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, 69, 71, 193, 79, 77, 65, 76, - 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, - 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, - 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, - 79, 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, - 75, 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, - 67, 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, - 79, 70, 70, 128, 79, 69, 89, 128, 79, 69, 75, 128, 79, 68, 69, 78, 128, - 79, 68, 196, 79, 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, - 128, 79, 67, 84, 69, 212, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79, - 67, 67, 76, 85, 83, 73, 79, 78, 128, 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, 66, 128, 79, - 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, - 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, - 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, - 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, - 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, - 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, - 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, - 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, - 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, - 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, - 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, - 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, - 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, - 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, - 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, - 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, - 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, - 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, - 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, - 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, - 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, - 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, - 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, - 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, - 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, - 79, 45, 73, 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, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, - 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 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, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, - 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, - 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 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, 69, 128, 78, 89, 85, - 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, - 89, 79, 79, 128, 78, 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, - 128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, - 73, 211, 78, 89, 73, 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, - 79, 128, 78, 89, 73, 73, 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, 72, 65, 128, 78, 89, 69, 84, 128, 78, 89, 69, 212, - 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, 85, 128, 78, 89, 65, - 73, 128, 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, - 65, 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, - 78, 87, 73, 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, - 85, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, - 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, 85, 90, 128, 78, - 85, 78, 85, 218, 78, 85, 78, 71, 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, 69, 82, 65, - 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, - 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, - 85, 75, 84, 65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, - 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48, - 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, - 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, - 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, - 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, - 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, - 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, - 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, - 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, - 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, - 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 213, - 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, 69, 197, 78, 84, 69, 85, 78, - 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, - 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, - 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, - 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, - 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, - 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, - 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, - 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, - 65, 128, 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, 89, 128, 78, - 79, 88, 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, 66, 79, 79, 75, 128, 78, 79, - 84, 69, 66, 79, 79, 203, 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, - 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, - 82, 84, 72, 69, 82, 206, 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, 80, 79, 84, - 65, 66, 76, 197, 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, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, 79, - 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, 128, - 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, 128, - 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, 78, - 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, 128, - 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 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, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, - 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, - 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, - 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, - 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, - 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, - 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, - 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, - 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, 75, 79, 77, 128, 78, 75, - 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, 65, 82, 65, 69, 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, 81, 65, 128, - 78, 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, - 74, 85, 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, - 79, 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, - 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, 69, 128, 78, 74, 73, 69, 128, 78, 74, - 73, 128, 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, - 78, 74, 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, - 74, 69, 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, - 69, 128, 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, - 76, 73, 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, - 128, 78, 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, - 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 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, 69, 45, 84, 72, 73, 82, - 84, 89, 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, - 68, 65, 178, 78, 73, 77, 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, - 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, - 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, - 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, - 71, 72, 212, 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, 82, 73, 69, 85, 76, 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, 78, 45, 67, 72, 73, 69, 85, 67, - 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, - 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, - 72, 74, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, - 78, 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, - 78, 71, 85, 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, - 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, - 79, 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, - 128, 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, - 78, 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, - 128, 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, - 77, 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, - 197, 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, - 75, 69, 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, - 65, 69, 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, - 128, 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, - 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, - 73, 69, 128, 78, 71, 72, 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, - 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, - 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, - 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, - 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, - 206, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, - 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, - 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, - 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, - 69, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, - 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, - 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, - 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, - 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, - 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, - 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, - 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, - 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65, - 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 87, 128, 78, - 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 128, - 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 81, 85, 68, 65, 65, 128, - 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, 76, 128, - 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, - 65, 84, 69, 196, 78, 69, 67, 75, 84, 73, 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, 78, 128, 78, 68, 213, 78, 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, - 68, 79, 80, 128, 78, 68, 79, 79, 128, 78, 68, 79, 78, 128, 78, 68, 79, - 77, 66, 85, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, - 84, 128, 78, 68, 73, 81, 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, - 128, 78, 68, 73, 69, 128, 78, 68, 73, 68, 65, 128, 78, 68, 73, 65, 81, - 128, 78, 68, 69, 88, 128, 78, 68, 69, 85, 88, 128, 78, 68, 69, 85, 84, - 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, 128, 78, 68, 69, 80, 128, 78, - 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, - 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, 128, 78, 68, 65, 65, 78, 71, - 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, 128, 78, 68, 65, 193, 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, 72, 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, 89, 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, 83, 65, 76, - 73, 90, 65, 84, 73, 79, 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, - 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, - 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 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, 77, 50, 128, 78, 65, 77, 128, 78, - 65, 75, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201, - 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65, - 71, 128, 78, 65, 199, 78, 65, 69, 128, 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, 193, 78, 65, 50, 128, 78, 65, - 45, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, 52, 48, - 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, 65, 128, - 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, 128, 78, - 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, 78, 48, - 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, 48, 51, - 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, 56, 128, - 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, 128, 78, - 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, 48, 50, - 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, 57, 128, - 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, 56, 128, - 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, 78, 48, - 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, 49, 49, - 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, 128, 78, - 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, 48, 48, - 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128, - 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, 193, 77, 89, 128, 77, 217, 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, 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, - 69, 78, 71, 65, 77, 128, 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, 85, 128, 77, 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, - 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, - 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, - 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, - 82, 68, 65, 128, 77, 85, 82, 68, 193, 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, 77, 65, 69, 128, 77, 85, 79, 128, 77, - 85, 78, 83, 85, 66, 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, 79, - 67, 85, 76, 65, 210, 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, 71, 83, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, 128, 77, 85, - 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, - 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, - 77, 213, 77, 83, 128, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, - 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, - 128, 77, 79, 85, 84, 200, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, - 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, - 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 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, 85, 85, 77, 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, 77, 80, 85, 81, 128, - 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, - 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78, - 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, - 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, - 79, 71, 82, 65, 80, 200, 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, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 75, 69, 89, 128, 77, 79, - 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, - 81, 128, 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 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, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, - 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 83, 80, 128, 77, - 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, 82, 65, - 209, 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, 78, 73, 68, 73, 83, 67, - 128, 77, 73, 78, 73, 66, 85, 83, 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, 75, 217, 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, 84, 73, 75, 69, 85, 84, 128, 77, 73, 69, - 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, - 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, - 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 45, - 83, 73, 79, 83, 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, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, 85, 67, - 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, 69, 128, 77, 73, 69, 128, 77, - 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, - 77, 73, 68, 68, 76, 197, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, - 69, 128, 77, 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, - 207, 77, 73, 67, 210, 77, 72, 90, 128, 77, 72, 65, 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, 66, 85, 128, 77, 71, 66, 79, - 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, 128, 77, 71, - 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, 78, 128, 77, - 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, 83, 65, 81, - 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, 71, 65, 84, - 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, 70, 79, 78, - 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, 81, 128, 77, - 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, 85, 81, 128, - 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, 90, 90, 79, - 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, 77, 69, 85, - 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, 77, 69, 84, - 82, 79, 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, 75, 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, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, 197, 77, 69, 83, 79, - 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, 79, 73, 84, - 73, 195, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, - 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, 128, 77, 69, 82, 71, 69, - 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, 82, 217, 77, - 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 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, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, - 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, - 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, - 72, 79, 78, 69, 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, 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, 68, 73, 67, 65, - 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 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, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, - 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, 77, 66, - 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, 128, 77, - 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, 82, 73, - 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, 66, 69, - 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, 128, - 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, 69, 69, - 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, 73, 128, - 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, 128, 77, 66, - 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, 77, 66, 51, - 128, 77, 66, 50, 128, 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, 85, 128, 77, 65, 84, 84, 79, 67, 75, 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, 83, 65, 71, 69, - 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 72, 70, - 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, 78, - 197, 77, 65, 82, 89, 128, 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, 67, 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85, - 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, - 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, 197, 77, 65, 80, 73, 81, - 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, 83, 89, 79, 78, 128, 77, - 65, 78, 83, 85, 65, 69, 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, 68, 65, 73, 76, 73, - 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, - 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, - 69, 82, 73, 128, 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, 75, 83, 85, 82, - 193, 77, 65, 73, 90, 69, 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, 76, - 66, 79, 216, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, - 128, 77, 65, 73, 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, - 128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, - 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, - 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 69, 83, 73, 128, 77, 65, - 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, - 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, - 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, - 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128, - 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, - 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, - 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, - 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, - 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, 206, - 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, 77, 65, - 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, 52, 52, 128, 77, - 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, 128, 77, 48, 52, - 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, 77, 48, 51, 56, - 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, 51, 53, 128, 77, - 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, - 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, 65, 128, 77, 48, - 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, 77, 48, 50, 56, - 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, 48, 50, 54, 128, - 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, - 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, - 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, 77, 48, 49, 56, - 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, 54, 65, - 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, - 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, 50, 72, 128, 77, - 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, - 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, - 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 49, 128, - 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 48, 57, 128, 77, - 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, 128, 77, 48, 48, - 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, - 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, - 128, 77, 48, 48, 49, 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, - 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 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, - 85, 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, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76, - 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72, - 128, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85, - 71, 65, 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, - 76, 85, 50, 128, 76, 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, - 69, 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, - 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76, - 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, - 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, - 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, - 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, - 128, 76, 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76, - 79, 79, 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, - 77, 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, 77, 77, 65, 69, 128, 76, 79, 77, 128, 76, 79, 205, 76, 79, 76, 76, - 73, 80, 79, 80, 128, 76, 79, 76, 76, 128, 76, 79, 71, 210, 76, 79, 71, - 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, 76, 79, 71, 128, - 76, 79, 68, 69, 83, 84, 79, 78, 69, 128, 76, 79, 67, 79, 77, 79, 84, 73, - 86, 69, 128, 76, 79, 67, 75, 73, 78, 71, 45, 83, 72, 73, 70, 212, 76, 79, - 67, 203, 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, 76, 85, 85, 128, 76, 76, 79, 79, - 128, 76, 76, 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, 79, - 128, 76, 76, 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, 128, - 76, 76, 76, 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, 128, - 76, 76, 76, 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, 128, - 76, 76, 76, 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, 86, 82, 197, 76, - 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76, - 73, 84, 128, 76, 73, 83, 213, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196, - 76, 73, 81, 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, - 78, 199, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, - 83, 128, 76, 73, 78, 69, 211, 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, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73, - 77, 77, 85, 128, 76, 73, 77, 77, 213, 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, - 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 76, 89, 128, 76, 73, 76, 73, - 84, 72, 128, 76, 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, - 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 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, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, - 66, 82, 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, 73, 65, 66, 73, 76, - 73, 84, 217, 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, 85, 77, 128, 76, 69, - 85, 65, 69, 80, 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, - 69, 213, 76, 69, 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, 128, - 76, 69, 212, 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, 80, 128, 76, 69, 79, - 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, - 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, - 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71, - 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69, - 84, 128, 76, 69, 76, 69, 212, 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, 45, 72, 65, 78, 68, 69, 196, 76, - 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, - 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69, - 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, 76, - 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, 198, 76, - 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, 196, - 76, 68, 65, 78, 128, 76, 68, 50, 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, 87, - 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, 73, 75, 128, 76, 65, 84, 69, 82, - 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, - 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, 82, - 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 80, 128, 76, - 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78, - 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 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, 68, 128, 76, 65, 77, 66, 68, 193, 76, 65, 77, 65, - 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, 75, 72, 65, 78, - 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, 78, 128, 76, 65, - 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 72, 128, 76, 65, 71, 85, 83, - 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, - 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, - 69, 128, 76, 65, 68, 217, 76, 65, 67, 75, 128, 76, 65, 67, 65, 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, 66, 73, 65, 204, 76, 65, - 66, 65, 84, 128, 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, - 65, 65, 77, 85, 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, - 48, 54, 65, 128, 76, 48, 48, 50, 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, 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, 85, 51, 49, 56, 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, 89, 128, 75, 87, 65, - 69, 84, 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, 83, 72, 85, 50, 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, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, - 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, - 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, - 76, 128, 75, 85, 204, 75, 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52, - 128, 75, 85, 180, 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, - 85, 85, 128, 75, 83, 83, 85, 128, 75, 83, 83, 79, 79, 128, 75, 83, 83, - 79, 128, 75, 83, 83, 73, 73, 128, 75, 83, 83, 73, 128, 75, 83, 83, 69, - 69, 128, 75, 83, 83, 69, 128, 75, 83, 83, 65, 85, 128, 75, 83, 83, 65, - 73, 128, 75, 83, 83, 65, 65, 128, 75, 83, 83, 65, 128, 75, 83, 83, 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, 80, 85, 128, 75, 80, 79, 81, 128, - 75, 80, 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, - 88, 128, 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, - 128, 75, 80, 65, 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, - 85, 85, 128, 75, 79, 84, 79, 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, 81, 78, 68, 79, 78, 128, 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, 75, 79, 128, 75, 79, 75, - 128, 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, - 71, 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, - 79, 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 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, 65, 128, 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, 84, 73, 75, 69, 85, - 84, 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, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, - 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, - 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, - 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, - 83, 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, - 77, 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, - 65, 76, 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, 81, 128, 75, - 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, - 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, - 73, 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, - 75, 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, - 75, 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, - 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, 77, - 128, 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, - 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 128, 75, 72, - 207, 75, 72, 77, 213, 75, 72, 73, 84, 128, 75, 72, 73, 78, 89, 65, 128, - 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75, - 72, 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, - 69, 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, - 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, 77, 84, 201, 75, - 72, 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, - 128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, - 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, - 128, 75, 69, 88, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, - 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, - 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, - 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, - 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, - 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, - 79, 87, 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, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, - 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, - 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 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, 69, 69, 78, 71, 128, 75, 67, 65, 76, 128, - 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, - 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, 65, 86, - 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 85, - 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, - 84, 72, 65, 75, 193, 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, 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, 83, 75, 65, - 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, - 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, - 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, - 82, 65, 78, 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, 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193, - 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, - 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, - 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, - 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65, - 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, - 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, - 68, 179, 75, 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, - 66, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70, - 128, 75, 65, 50, 128, 75, 65, 178, 75, 48, 48, 56, 128, 75, 48, 48, 55, - 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75, - 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65, - 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67, - 65, 84, 73, 79, 78, 128, 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, - 128, 74, 85, 79, 80, 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74, - 85, 76, 89, 128, 74, 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 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, 86, 69, 128, 74, 79, - 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 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, 73, 128, 74, 73, 72, 86, 65, 77, 85, - 76, 73, 89, 65, 128, 74, 73, 65, 128, 74, 72, 79, 128, 74, 72, 69, 72, - 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, 74, - 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, 128, - 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, 72, - 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, 128, - 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, - 89, 65, 78, 73, 128, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, - 78, 69, 83, 197, 74, 65, 80, 65, 78, 128, 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, 73, 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, 45, - 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, 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, 90, 65, 75, 65, 89, - 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, - 128, 73, 85, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, - 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 78, 128, 73, - 83, 79, 206, 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 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, 82, 79, 78, 45, 67, 79, - 80, 80, 69, 210, 73, 82, 79, 78, 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, 68, 128, 73, 78, 86, 69, 82, 84, 69, - 196, 73, 78, 86, 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82, - 128, 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, - 76, 65, 67, 69, 196, 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, 83, 67, 82, 73, 80, 84, 73, 79, - 78, 65, 204, 73, 78, 80, 85, 212, 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, 73, - 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 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, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, - 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, - 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 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, 78, 128, 73, 77, 73, 83, 69, - 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, - 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, - 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, - 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, - 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, - 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 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, 82, 73, 69, 85, 76, 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, 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, 73, 77, 128, 73, 68, - 73, 205, 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, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 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, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 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, - 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, 55, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 54, 68, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 51, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 69, 56, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 50, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 57, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 52, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 49, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 67, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 68, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 65, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 56, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 52, 69, 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, 48, 49, 53, - 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, 49, 50, 128, 73, - 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, 48, 65, 128, 73, - 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, 57, 128, 73, 48, - 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, 73, 48, 48, 53, - 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, 48, 48, 51, 128, - 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, 85, 128, 73, 45, - 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, 128, 73, 45, 89, - 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, 65, 128, 73, 45, - 79, 45, 73, 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, 71, 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, 87, 71, 128, 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, 83, 72, 69, 196, 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, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, 77, - 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, 66, - 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, 68, - 79, 128, 72, 84, 83, 128, 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193, - 72, 80, 87, 71, 128, 72, 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197, - 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, - 211, 72, 79, 85, 82, 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, - 79, 84, 65, 128, 72, 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, - 128, 72, 79, 82, 83, 197, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, - 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, - 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, - 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, - 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, - 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, - 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, - 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, - 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, 193, 72, 79, 79, - 82, 85, 128, 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, - 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, 69, 217, 72, - 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, 69, 84, - 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, - 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 73, 128, - 72, 79, 67, 72, 79, 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, 69, 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, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81, - 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, 71, 72, 45, 82, 69, - 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, - 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 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, 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, - 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, - 73, 83, 67, 85, 83, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, - 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, 128, 72, - 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, - 205, 72, 69, 88, 65, 71, 79, 78, 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, 69, 128, - 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, 78, 71, 128, - 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, 72, - 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73, 67, 79, 80, 84, 69, - 82, 128, 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, 83, - 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, - 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73, - 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84, - 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 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, 72, 73, 128, 72, 65, 84, - 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65, - 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, - 128, 72, 65, 82, 80, 79, 79, 206, 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, 80, 80, 217, 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, 211, - 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78, - 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84, - 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, - 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, - 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, - 45, 67, 73, 82, 67, 76, 197, 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, 67, 85, 84, 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, 65, 82, 85, 128, 72, 65, - 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 48, 48, 56, 128, - 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, - 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, - 50, 128, 72, 48, 48, 49, 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, 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, - 65, 128, 71, 89, 128, 71, 87, 85, 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, 85, 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77, - 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, - 78, 213, 71, 85, 205, 71, 85, 76, 128, 71, 85, 73, 84, 65, 82, 128, 71, - 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, - 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, - 78, 69, 83, 83, 128, 71, 85, 65, 82, 68, 69, 196, 71, 85, 65, 82, 68, - 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, - 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, - 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, - 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, 73, 77, 65, - 67, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69, - 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, 69, 89, - 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, - 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, - 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, - 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, 65, 80, 69, 83, - 128, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, - 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, 197, - 71, 80, 65, 128, 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, 82, 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, - 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 66, 76, - 73, 78, 128, 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, - 87, 73, 78, 199, 71, 76, 79, 84, 84, 65, 204, 71, 76, 79, 66, 197, 71, - 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, 200, 71, 76, 65, 71, - 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, 71, 73, 88, 128, 71, - 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, 71, 73, 83, 65, 76, - 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, 128, 71, 73, 82, - 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 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, 68, 73, 77, 128, 71, 73, 66, 66, 79, 85, 211, 71, 73, 66, 65, 128, - 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, 128, 71, 72, 87, 65, 128, 71, - 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, 78, 193, 71, 72, 85, 128, 71, - 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, 71, 72, 79, 128, 71, 72, 73, - 128, 71, 72, 72, 65, 128, 71, 72, 69, 85, 88, 128, 71, 72, 69, 85, 78, - 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, 69, 85, 71, - 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, 72, 69, 85, - 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, 72, 69, 69, - 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, 71, 72, 65, - 82, 65, 69, 128, 71, 72, 65, 80, 128, 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, 65, 77, 65, 69, - 128, 71, 72, 65, 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, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, - 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, - 84, 128, 71, 71, 79, 80, 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, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, - 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, 84, 193, - 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, 69, 83, 72, - 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, 128, - 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, 205, 71, 69, 68, 79, 76, 65, - 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, - 82, 128, 71, 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, - 67, 65, 206, 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, 66, 69, 85, - 88, 128, 71, 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, 66, 65, 75, - 85, 82, 85, 78, 69, 78, 128, 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, 85, 78, 84, 76, 69, 84, 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, 83, 72, - 65, 78, 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, 68, 69, 78, 128, 71, - 65, 82, 51, 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, 78, 77, - 65, 128, 71, 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, 65, 78, - 50, 128, 71, 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, 76, 65, - 128, 71, 65, 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, 71, 65, - 77, 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 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, 68, 128, 71, 65, - 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71, - 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128, - 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48, - 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53, - 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65, - 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71, - 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51, - 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51, - 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128, - 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48, - 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54, - 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128, - 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48, - 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49, - 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128, - 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48, - 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48, - 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55, - 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54, - 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71, - 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128, - 70, 89, 80, 128, 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, - 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 86, 83, 51, - 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 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, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, - 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, 85, 74, 73, 128, 70, 85, 69, 84, 128, 70, - 85, 69, 204, 70, 85, 69, 128, 70, 84, 72, 79, 82, 193, 70, 82, 79, 87, - 78, 73, 78, 71, 128, 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, 78, 84, - 45, 70, 65, 67, 73, 78, 199, 70, 82, 79, 205, 70, 82, 79, 71, 128, 70, - 82, 79, 199, 70, 82, 73, 84, 85, 128, 70, 82, 73, 69, 83, 128, 70, 82, - 73, 69, 196, 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, 69, 128, 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, 84, 72, 73, 82, - 84, 89, 128, 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, 85, 78, 84, 65, 73, 78, 128, 70, 79, 83, 84, 69, 82, 73, - 78, 71, 128, 70, 79, 82, 87, 65, 82, 68, 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, 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, 80, 82, 73, 78, 84, 83, - 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, - 128, 70, 79, 79, 84, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, - 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, - 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, - 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 207, 70, 77, 128, 70, 76, - 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, - 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, - 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, - 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, 80, 217, 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, 88, 69, 196, 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, 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, - 70, 76, 65, 71, 83, 128, 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, 65, 199, 70, 76, - 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, - 88, 128, 70, 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 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, 84, 69, 196, 70, 73, 83, 84, 128, 70, 73, 83, 72, 73, - 78, 199, 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, 73, 128, 70, 73, 82, 69, 87, 79, - 82, 75, 83, 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 128, - 70, 73, 82, 197, 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, - 85, 88, 128, 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, 70, 69, 83, 84, 73, - 86, 65, 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 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, 78, 71, 128, 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, 69, 65, 82, 70, 85, 204, 70, 69, 65, 82, 128, - 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, 128, 70, 65, 88, 128, 70, - 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, 65, 84, 72, 69, 82, 128, - 70, 65, 84, 72, 69, 210, 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, 81, 128, 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, 76, 76, - 69, 206, 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, 82, 89, 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, 77, 65, 69, 128, 70, 65, 65, 73, 128, - 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, - 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, - 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, - 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, - 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, - 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, - 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, - 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, - 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, - 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, - 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, - 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, - 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, - 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, - 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, - 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, - 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, - 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, - 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, - 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, - 48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, - 128, 69, 89, 69, 83, 128, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, - 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, - 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 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, - 80, 82, 69, 83, 83, 73, 79, 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, - 78, 212, 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, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, - 73, 79, 206, 69, 88, 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, 83, - 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, - 69, 82, 71, 82, 69, 69, 206, 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, - 79, 80, 69, 65, 206, 69, 85, 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, - 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, 79, 128, 69, - 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, - 85, 45, 65, 128, 69, 84, 88, 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, 84, 66, 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, - 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, 178, 69, 83, 72, - 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65, - 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, - 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 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, 79, 67, 72, 128, - 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, - 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, - 77, 65, 128, 69, 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128, - 69, 79, 76, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, - 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, - 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, - 45, 49, 128, 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 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, 81, 128, 69, 78, - 79, 211, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, - 128, 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, - 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, - 65, 86, 79, 85, 82, 128, 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, 67, 128, 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, 84, 73, 195, 69, - 77, 80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, - 69, 77, 66, 76, 69, 77, 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, 84, 128, - 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, - 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 69, 86, 69, - 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, 69, 76, - 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69, - 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 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, 75, 65, 82, 65, 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, - 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, 69, 128, 69, 72, 87, - 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, 65, 204, 69, 71, 73, - 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, 65, 128, 69, 69, 75, - 65, 65, 128, 69, 69, 72, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128, - 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, 68, - 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206, 69, - 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, 69, - 65, 82, 84, 200, 69, 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65, 77, - 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, 68, - 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, 48, - 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, 52, - 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, 128, - 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, 48, - 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, 50, - 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, 128, - 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, 69, - 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, 49, - 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, 49, - 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, 128, - 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, 48, - 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, 48, - 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53, - 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69, - 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68, 90, - 90, 65, 128, 68, 90, 87, 69, 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, 65, 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, 68, 128, 68, 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 83, 75, - 128, 68, 85, 83, 72, 69, 78, 78, 65, 128, 68, 85, 82, 65, 84, 73, 79, 78, - 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, - 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, - 68, 85, 78, 179, 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85, - 71, 85, 68, 128, 68, 85, 66, 50, 128, 68, 85, 66, 128, 68, 85, 194, 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, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83, - 72, 65, 68, 79, 87, 69, 196, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82, - 73, 86, 69, 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82, - 73, 204, 68, 82, 69, 83, 83, 128, 68, 82, 65, 85, 71, 72, 84, 211, 68, - 82, 65, 77, 128, 68, 82, 65, 205, 68, 82, 65, 71, 79, 78, 128, 68, 82, - 65, 71, 79, 206, 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, 86, 69, 128, 68, 79, 85, 71, 72, 78, 85, 84, 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, 79, 78, 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, - 73, 206, 68, 79, 76, 80, 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, - 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, - 128, 68, 79, 73, 84, 128, 68, 79, 71, 128, 68, 79, 199, 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, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, - 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, 72, 89, 65, 128, - 68, 76, 72, 65, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, - 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, 68, - 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 73, 90, 90, - 217, 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, - 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, 84, 73, 76, 76, 128, 68, 73, 83, 83, - 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73, - 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, 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, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, - 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 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, 206, 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, 73, 68, - 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, 77, 69, 78, - 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 76, 128, 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, 66, 128, 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, 83, 128, 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, 83, 128, 68, 73, 65, 69, - 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72, - 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128, - 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68, - 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65, - 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, 84, - 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, 65, - 65, 76, 85, 128, 68, 72, 65, 65, 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, 85, 78, 71, 128, 68, 69, 83, 203, 68, 69, 83, - 73, 71, 78, 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, 77, 69, 78, 212, 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, 78, 78, 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, - 78, 65, 82, 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, - 68, 69, 76, 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, - 82, 217, 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, - 73, 67, 73, 79, 85, 211, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, + 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, + 128, 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, 211, 82, 73, 78, 70, + 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, + 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 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, 71, 72, 84, 45, 72, 65, + 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, + 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 69, 85, + 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, + 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 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, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, + 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, + 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, + 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, + 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 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, 80, 72, 73, 69, 85, 80, 72, + 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, 45, 72, 73, 69, 85, 72, 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, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, + 75, 73, 89, 69, 79, 75, 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, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, + 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 69, 77, + 128, 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73, 66, 66, 79, 78, 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, 86, 73, 78, 199, 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, 69, + 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, + 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, 84, 79, 82, 84, + 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, + 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 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, + 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, + 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, + 77, 69, 78, 212, 82, 69, 80, 72, 128, 82, 69, 80, 69, 84, 73, 84, 73, 79, + 206, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, + 69, 80, 69, 65, 212, 82, 69, 80, 65, 89, 65, 128, 82, 69, 80, 65, 128, + 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, + 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, 69, 68, 89, 128, 82, 69, + 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 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, 76, 65, 65, 128, 82, 69, 74, 65, 78, + 199, 82, 69, 73, 196, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, + 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, + 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, + 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, + 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, + 196, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, + 65, 84, 73, 79, 78, 128, 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, 82, 69, 65, 84, 73, + 79, 78, 65, 204, 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, 67, 69, 73, 86, 69, 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, + 50, 128, 82, 69, 65, 76, 71, 65, 82, 128, 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, 72, 65, 128, 82, 65, 84, 72, 193, 82, 65, + 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, 82, 65, + 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, 82, 65, 81, 128, 82, 65, 80, + 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, 65, 128, 82, 65, + 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, 82, 65, 75, 72, + 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, 65, 128, + 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, + 79, 87, 128, 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, + 217, 82, 65, 73, 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, + 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, + 69, 128, 82, 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, + 197, 82, 65, 68, 73, 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, + 65, 68, 128, 82, 65, 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, + 78, 71, 128, 82, 65, 66, 66, 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, + 65, 66, 128, 82, 65, 65, 73, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, + 65, 45, 50, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, + 55, 128, 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, + 82, 48, 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, + 50, 48, 128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, + 128, 82, 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, + 82, 48, 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, + 49, 49, 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, + 57, 128, 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, + 82, 48, 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, + 48, 48, 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, + 48, 48, 50, 128, 82, 48, 48, 49, 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, 84, 69, 83, 83, 69, 78, 67, 69, 128, 81, 85, 73, + 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, 78, 88, 128, + 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 76, 128, 81, 85, 73, + 67, 203, 81, 85, 73, 128, 81, 85, 70, 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, 69, 206, 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, 78, 84, + 73, 84, 217, 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, 72, 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, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 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, 71, 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, 48, 48, 55, 128, 81, 48, + 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, + 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 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, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, + 128, 80, 87, 207, 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, 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, 82, 69, + 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, 212, 80, 85, + 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, + 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, 69, 128, 80, 85, + 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, 84, 89, + 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, + 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, + 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 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, 77, 80, 128, 80, 85, 77, 128, 80, 85, 69, 128, 80, 85, 66, 76, + 73, 195, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, + 85, 49, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, + 83, 73, 76, 201, 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, 84, 69, 67, 84, 69, 196, 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, 71, 82, 65, 205, 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, 86, 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, + 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, + 83, 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 78, + 67, 69, 83, 83, 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, + 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, 84, 128, 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, 78, 75, 72, 65, 128, 80, 82, 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, + 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, 68, 73, 78, 199, 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, 86, + 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, + 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 68, 69, 82, + 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, + 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, + 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, + 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, + 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 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, 80, 69, 82, 128, 80, 79, 80, 128, 80, + 79, 208, 80, 79, 79, 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, + 79, 128, 80, 79, 206, 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, + 197, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, + 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, + 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 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, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, + 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 85, + 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, + 72, 82, 79, 78, 128, 80, 76, 68, 128, 80, 76, 65, 89, 73, 78, 199, 80, + 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, 78, + 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, + 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 210, 80, 76, 65, 67, + 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, 80, 73, + 90, 90, 65, 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, 84, 79, 76, 128, 80, 73, 83, 69, 76, 69, 72, 128, 80, + 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, 128, 80, 73, 82, 73, 199, + 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, + 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, 77, 66, 65, 128, + 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 78, 69, 65, 80, + 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, + 128, 80, 73, 76, 76, 128, 80, 73, 76, 197, 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, 199, 80, 73, 69, 88, 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, 84, 72, 73, 69, 85, 84, + 72, 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, 45, 80, 72, 73, 69, 85, 80, + 72, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, + 80, 45, 78, 73, 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, + 77, 128, 80, 73, 69, 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 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, 84, 128, 80, + 73, 69, 80, 128, 80, 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, + 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73, 67, 75, 69, 84, 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, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, 128, 80, 72, 79, 69, 78, + 73, 67, 73, 65, 206, 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, + 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, + 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 72, + 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, 69, 85, 80, 72, + 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, 45, 72, 73, 69, + 85, 72, 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, 83, 69, 45, 198, 80, + 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, 72, + 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, 73, + 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 65, 82, 75, + 65, 65, 128, 80, 72, 65, 65, 128, 80, 72, 65, 128, 80, 71, 128, 80, 70, + 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, 69, 85, 84, + 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, + 72, 50, 128, 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, 65, 204, 80, 69, 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, + 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, 86, 69, 82, 73, 78, 199, 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, 73, 84, 84, 69, 196, 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, 79, + 82, 77, 73, 78, 199, 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, 80, 69, 84, + 128, 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, + 69, 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, + 82, 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, + 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 73, + 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, 76, + 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, + 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, + 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, + 84, 82, 73, 65, 78, 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, 72, 128, 80, + 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 73, 128, 80, 68, 70, + 128, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82, 128, 80, 65, 89, 69, + 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128, 80, 65, 89, 128, 80, + 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 215, 80, 65, 86, 73, 89, 65, + 78, 73, 128, 80, 65, 85, 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, 80, 79, 82, 212, 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, 72, 65, 69, 128, 80, 65, 83, 69, + 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, 82, 85, 77, 128, 80, + 65, 82, 84, 217, 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, 84, 72, 73, 65, 206, 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, 82, 69, 78, 128, 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, 89, 82, 85, 83, 128, 80, 65, 80, 69, + 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, + 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, + 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, + 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, + 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, + 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, + 128, 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, + 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, + 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, + 78, 71, 76, 79, 78, 71, 128, 80, 65, 78, 71, 76, 65, 89, 65, 82, 128, 80, + 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, 65, 84, 128, 80, 65, 78, + 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, 80, 65, 78, 69, 85, 76, 69, + 85, 78, 71, 128, 80, 65, 78, 68, 193, 80, 65, 78, 65, 69, 76, 65, 69, 78, + 71, 128, 80, 65, 78, 128, 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, + 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, + 77, 80, 72, 89, 76, 73, 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, + 80, 65, 77, 69, 80, 69, 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, + 65, 77, 65, 68, 65, 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, + 84, 65, 128, 80, 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 205, 80, + 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 69, + 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 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, 75, 80, 65, 203, 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, 73, 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, + 72, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, + 80, 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, + 67, 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, + 85, 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 69, + 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80, 65, 65, 45, 80, 73, + 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, 80, 48, 49, 49, 128, 80, + 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, 48, 56, 128, 80, 48, 48, + 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, 128, 80, 48, 48, 52, 128, + 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, 80, 48, 48, 50, 128, 80, + 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, + 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, 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, 79, 78, 199, 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, 65, 204, 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, 84, 66, 79, + 216, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, + 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, + 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, + 193, 79, 83, 67, 128, 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, 75, 72, 79, 206, + 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, 78, 128, 79, 82, 69, + 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 68, 69, 210, 79, 82, + 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, + 79, 80, 84, 73, 67, 65, 204, 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, 73, 78, + 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, 85, 83, + 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, 79, + 210, 79, 80, 69, 82, 65, 84, 73, 78, 199, 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, 79, 90, 69, + 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, + 128, 79, 79, 69, 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, 87, 65, 217, 79, 78, 69, + 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, + 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 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, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, + 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, + 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, + 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, 77, + 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, + 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, + 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, + 128, 79, 69, 89, 128, 79, 69, 75, 128, 79, 68, 69, 78, 128, 79, 68, 196, + 79, 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, + 84, 69, 212, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, + 85, 83, 73, 79, 78, 128, 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, 66, 128, 79, 65, 89, 128, 79, + 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, 79, 193, 79, 48, + 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, 65, 128, 79, 48, + 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, 79, 48, 52, 55, + 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, 52, 52, 128, 79, + 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, 128, 79, 48, 52, + 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, 48, 51, 55, 128, + 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, 48, 51, 54, 66, + 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, 48, 51, 53, 128, + 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, 51, 51, 128, 79, + 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, 65, 128, 79, 48, + 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, 128, 79, 48, 50, + 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, 48, 50, 53, 65, + 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, 48, 50, 52, 128, + 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, 49, 128, 79, 48, + 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, 65, 128, 79, 48, + 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, 79, 48, 49, 54, + 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, 49, 51, 128, 79, + 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, 67, 128, 79, 48, + 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, 48, 128, 79, 48, + 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, 79, 48, 48, 54, + 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, 128, 79, 48, 48, + 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, 65, 128, 79, 48, + 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, 128, 79, 48, 48, + 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, 48, 48, 49, 65, + 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, 79, 45, 73, 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, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, 88, 128, 78, 90, + 85, 79, 128, 78, 90, 85, 206, 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, 85, 77, 128, + 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, 90, 65, + 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, 193, 78, 89, 87, + 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 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, 69, 128, 78, 89, 85, 128, 78, 89, 79, + 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, 89, 79, 79, 128, + 78, 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, + 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, + 73, 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, + 73, 73, 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, 72, 65, 128, 78, 89, 69, 84, 128, 78, 89, 69, 212, 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, 85, 128, 78, 89, 65, 73, 128, 78, 89, + 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, 128, 78, + 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, 73, 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, 85, 128, 78, 85, + 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, 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, 85, 90, 128, 78, 85, 78, 85, 218, + 78, 85, 78, 71, 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, 69, 82, 65, 204, 78, 85, 77, 66, 69, + 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, 85, 77, 128, 78, 85, 76, + 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, 85, 75, 84, 65, 128, 78, + 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, 66, 73, 65, 206, 78, 85, + 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 49, 177, 78, 85, 48, 50, 50, + 65, 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, + 50, 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, + 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, + 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, + 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, + 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, + 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, + 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, + 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, + 49, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 213, 78, 84, + 79, 81, 80, 69, 78, 128, 78, 84, 73, 69, 197, 78, 84, 69, 85, 78, 71, 66, + 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, + 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 83, + 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, 79, 77, + 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, 78, 83, + 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, 78, 83, + 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, 69, + 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, 65, + 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, 65, + 128, 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, 89, 128, 78, 79, + 88, 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, 66, 79, 79, 75, 128, 78, 79, 84, 69, + 66, 79, 79, 203, 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, 212, 78, + 79, 83, 69, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, + 69, 82, 206, 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, 80, 79, 84, 65, 66, 76, + 197, 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, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, 79, 79, 128, 78, + 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, 128, 78, 78, 78, + 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, 128, 78, 78, 78, + 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, 78, 78, 78, 65, + 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, 128, 78, 78, 78, + 65, 128, 78, 78, 78, 128, 78, 78, 72, 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, 78, 66, + 83, 80, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, + 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, + 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, + 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, + 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, + 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, + 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, + 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, + 48, 48, 49, 128, 78, 76, 128, 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, + 73, 78, 68, 73, 128, 78, 75, 65, 65, 82, 65, 69, 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, 81, 65, 128, 78, 74, 85, + 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 69, + 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, 128, + 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 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, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, + 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, 69, + 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, 69, + 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, 78, + 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, 128, + 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, 78, 73, + 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, 128, + 78, 73, 80, 128, 78, 73, 78, 84, 72, 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, 69, 45, 84, 72, 73, 82, 84, 89, 128, 78, + 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, + 73, 77, 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, + 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 72, 83, 72, 86, 65, + 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, 73, 71, 73, 68, + 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, 72, 212, 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, 82, 73, 69, 85, 76, 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, 78, 45, 67, 72, 73, 69, 85, 67, 72, 128, 78, 73, 69, + 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66, 128, 78, 73, + 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, + 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, 78, 71, 85, 85, 128, + 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 128, + 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, + 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, + 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, + 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, + 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, + 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, + 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, + 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, + 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, + 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, + 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, + 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, + 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, + 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, + 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, + 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, + 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, + 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, + 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, + 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, + 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, + 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, + 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 128, + 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, + 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, 68, 65, + 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, 84, 128, + 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, 71, 65, + 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, 71, 65, + 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, + 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, + 87, 76, 73, 78, 69, 128, 78, 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, + 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, + 84, 69, 196, 78, 69, 81, 85, 68, 65, 65, 128, 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, 76, 128, 78, 69, 73, 84, 72, 69, 210, + 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, 69, 196, 78, 69, 67, + 75, 84, 73, 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, 78, 128, 78, 68, 213, 78, + 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, + 79, 128, 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, + 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, + 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, + 68, 73, 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, + 68, 69, 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, + 69, 69, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, + 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, + 65, 77, 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, + 65, 65, 128, 78, 68, 65, 193, 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, 72, 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, 89, 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, 83, 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, 78, 65, + 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, + 82, 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, + 81, 128, 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, + 77, 50, 128, 78, 65, 77, 128, 78, 65, 75, 128, 78, 65, 73, 82, 193, 78, + 65, 73, 204, 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, + 65, 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, + 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, + 193, 78, 65, 50, 128, 78, 65, 45, 50, 128, 78, 48, 52, 50, 128, 78, 48, + 52, 49, 128, 78, 48, 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, + 128, 78, 48, 51, 55, 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, + 78, 48, 51, 53, 65, 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, + 78, 48, 51, 52, 128, 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, + 48, 51, 50, 128, 78, 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, + 57, 128, 78, 48, 50, 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, + 78, 48, 50, 53, 65, 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, + 48, 50, 51, 128, 78, 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, + 48, 128, 78, 48, 49, 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, + 65, 128, 78, 48, 49, 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, + 78, 48, 49, 53, 128, 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, + 49, 50, 128, 78, 48, 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, + 128, 78, 48, 48, 56, 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, + 48, 48, 53, 128, 78, 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, + 50, 128, 78, 48, 48, 49, 128, 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, 193, 77, 89, 128, 77, 217, 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, 83, 128, 77, 86, 79, 80, 128, 77, 86, + 73, 128, 77, 86, 69, 85, 65, 69, 78, 71, 65, 77, 128, 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, 85, 128, 77, 85, 84, 128, + 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, + 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, + 128, 77, 85, 83, 200, 77, 85, 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, + 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, 82, 68, 193, 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, 77, 65, + 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 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, 79, 67, 85, 76, 65, 210, 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, 71, 83, 128, 77, 85, 71, 128, 77, 85, + 199, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, + 65, 65, 68, 128, 77, 85, 65, 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, + 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, 80, 65, 128, 77, + 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, + 69, 196, 77, 79, 85, 84, 72, 128, 77, 79, 85, 84, 200, 77, 79, 85, 83, + 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, + 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, + 79, 85, 78, 212, 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, 85, 85, 77, 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, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, + 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, + 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, + 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, + 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 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, 78, 79, 67, 85, 76, 65, 210, 77, 79, + 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, + 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 217, 77, 79, 78, + 128, 77, 79, 206, 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, 68, 69, 128, 77, 79, 66, 73, + 76, 197, 77, 79, 65, 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, + 128, 77, 77, 83, 80, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, + 128, 77, 75, 80, 65, 82, 65, 209, 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, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, 83, 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, 75, 217, 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, 84, + 73, 75, 69, 85, 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, + 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, + 85, 78, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, + 85, 77, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 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, 78, 73, 69, 85, 78, 128, 77, 73, + 69, 85, 77, 45, 67, 73, 69, 85, 67, 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, 69, 128, 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, + 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 197, 77, 73, + 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, 67, 82, 79, 80, + 72, 79, 78, 69, 128, 77, 73, 67, 82, 207, 77, 73, 67, 210, 77, 72, 90, + 128, 77, 72, 65, 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, 66, 85, 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, + 128, 77, 71, 66, 79, 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, + 128, 77, 71, 66, 69, 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, + 128, 77, 71, 66, 65, 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, + 71, 65, 88, 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, + 128, 77, 71, 128, 77, 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, + 77, 70, 73, 89, 65, 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, + 128, 77, 70, 69, 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, + 65, 128, 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, + 69, 85, 81, 128, 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, + 69, 85, 78, 128, 77, 69, 84, 82, 79, 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, 75, 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, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, + 71, 197, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, + 77, 69, 82, 79, 73, 84, 73, 195, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, + 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, + 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, + 82, 67, 85, 82, 217, 77, 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, + 69, 77, 79, 128, 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, 45, 81, 79, 80, 72, + 128, 77, 69, 77, 128, 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, + 76, 73, 75, 128, 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, + 128, 77, 69, 71, 65, 80, 72, 79, 78, 69, 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, 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, 68, 73, 67, 65, 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, + 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, 196, 77, 67, 72, 213, 77, 67, + 72, 65, 206, 77, 195, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, + 66, 85, 69, 128, 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, + 77, 66, 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, + 212, 77, 66, 73, 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, + 85, 88, 128, 77, 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, + 66, 69, 82, 65, 69, 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, + 84, 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, + 66, 65, 78, 89, 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, + 75, 69, 84, 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, + 66, 52, 128, 77, 66, 51, 128, 77, 66, 50, 128, 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, 85, 128, 77, 65, 84, 84, 79, 67, 75, 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, 83, 65, 71, 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, + 77, 65, 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, + 67, 85, 76, 73, 78, 197, 77, 65, 82, 89, 128, 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, 67, 65, 83, 73, 84, 69, + 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, + 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, + 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, + 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 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, 68, 65, 73, 76, 73, 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, + 78, 67, 72, 213, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, + 83, 197, 77, 65, 76, 69, 69, 82, 73, 128, 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, 75, 83, 85, 82, 193, 77, 65, 73, 90, 69, 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, 76, 66, 79, 216, 77, 65, 73, 75, 85, 82, 79, 128, 77, + 65, 73, 68, 69, 78, 128, 77, 65, 73, 128, 77, 65, 72, 74, 79, 78, 199, + 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, + 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, + 77, 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 69, 83, + 73, 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, + 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, + 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, + 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, + 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, + 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, + 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, + 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, + 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, + 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, + 65, 128, 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, + 52, 52, 128, 77, 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, + 128, 77, 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, + 77, 48, 51, 56, 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, + 51, 53, 128, 77, 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, + 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, + 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, + 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, + 48, 50, 54, 128, 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, + 50, 52, 128, 77, 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, + 50, 128, 77, 48, 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, + 77, 48, 49, 56, 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, + 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, + 48, 49, 53, 128, 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, + 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, + 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, + 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, + 48, 49, 49, 128, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, + 48, 57, 128, 77, 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, + 128, 77, 48, 48, 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, + 77, 48, 48, 51, 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, + 48, 48, 49, 65, 128, 77, 48, 48, 49, 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, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 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, 85, 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, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, + 76, 85, 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, + 128, 76, 85, 72, 128, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, + 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, + 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, 178, 76, 82, 79, 128, 76, 82, + 77, 128, 76, 82, 73, 128, 76, 82, 69, 128, 76, 79, 90, 69, 78, 71, 69, + 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, 128, 76, 79, 87, 69, 82, + 69, 196, 76, 79, 87, 69, 210, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, + 79, 85, 82, 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, + 79, 85, 68, 76, 217, 76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, + 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, + 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, 79, 79, 80, 69, 196, 76, 79, + 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, 78, 128, 76, 79, 79, 203, 76, + 79, 79, 128, 76, 79, 78, 83, 85, 77, 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, 77, 77, 65, 69, 128, 76, 79, 77, + 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, + 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, + 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, + 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, + 71, 45, 83, 72, 73, 70, 212, 76, 79, 67, 203, 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, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, 76, 85, 85, 128, 76, + 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, 76, 79, 128, 76, 76, + 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, 69, 69, 128, 76, 76, + 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, 65, 73, 128, 76, 76, + 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, 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, 86, 82, 197, 76, 73, 84, 84, 76, 197, 76, 73, 84, + 84, 69, 210, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76, + 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, + 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, + 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, + 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, 77, 85, 52, 128, + 76, 73, 77, 77, 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, + 213, 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, 77, 69, 128, 76, 73, 77, 66, 213, + 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, + 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 72, 79, 85, 83, + 69, 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, 69, 128, 76, + 73, 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, + 82, 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 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, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, + 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, 84, 84, 69, + 82, 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 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, 80, 128, 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, + 79, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, + 128, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, + 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71, 193, 76, 69, 77, 79, 78, + 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69, 84, 128, 76, 69, 76, 69, + 212, 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, 45, 72, 65, 78, 68, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, + 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, + 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69, 69, 75, 128, 76, 69, 69, 69, + 69, 128, 76, 69, 68, 71, 69, 82, 128, 76, 69, 65, 84, 72, 69, 82, 128, + 76, 69, 65, 70, 128, 76, 69, 65, 198, 76, 69, 65, 68, 73, 78, 199, 76, + 69, 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, 65, 78, 128, 76, 68, + 50, 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, 87, 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, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, + 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, 71, 69, + 210, 76, 65, 82, 71, 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, 76, + 65, 80, 65, 81, 128, 76, 65, 80, 128, 76, 65, 78, 84, 69, 82, 78, 128, + 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, + 68, 72, 128, 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, 68, 128, + 76, 65, 77, 66, 68, 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, + 76, 65, 204, 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, + 65, 78, 89, 65, 76, 65, 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, + 128, 76, 65, 72, 128, 76, 65, 71, 85, 83, 128, 76, 65, 71, 213, 76, 65, + 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, 65, 71, 65, 66, 128, 76, 65, + 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, 69, 128, 76, 65, 68, 217, 76, + 65, 67, 75, 128, 76, 65, 67, 65, 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, 66, 73, 65, 204, 76, 65, 66, 65, 84, 128, 76, 65, 65, + 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, 76, 65, + 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, 65, 128, 76, 48, 48, + 50, 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, 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, 85, 51, 49, 56, 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, 89, 128, 75, 87, 65, 69, 84, 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, 83, 72, 85, 50, 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, 210, + 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, 128, 75, 85, 79, + 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, + 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, + 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, 75, 85, + 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, 85, 85, 128, 75, 83, 83, + 85, 128, 75, 83, 83, 79, 79, 128, 75, 83, 83, 79, 128, 75, 83, 83, 73, + 73, 128, 75, 83, 83, 73, 128, 75, 83, 83, 69, 69, 128, 75, 83, 83, 69, + 128, 75, 83, 83, 65, 85, 128, 75, 83, 83, 65, 73, 128, 75, 83, 83, 65, + 65, 128, 75, 83, 83, 65, 128, 75, 83, 83, 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, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80, 79, 79, 128, 75, + 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128, 75, 80, 69, 69, + 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75, 80, 65, 78, 128, + 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, 79, 84, + 79, 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, 81, 78, 68, + 79, 78, 128, 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, 75, 79, 128, 75, 79, 75, 128, 75, 79, 203, 75, + 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71, 72, 79, 77, 128, + 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, 79, 65, 128, 75, 78, + 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 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, 65, 128, + 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, 84, 73, 75, 69, 85, 84, 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, 75, 45, + 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, 78, + 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, 73, + 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, 79, + 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, 75, + 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, 73, + 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 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, 81, 128, 75, 73, 80, 128, 75, + 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 68, 69, 82, 71, 65, + 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, 73, 128, 75, + 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, 73, 69, 69, + 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, 67, 75, + 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, + 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, 77, 128, 75, 72, + 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, + 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, + 77, 213, 75, 72, 73, 84, 128, 75, 72, 73, 78, 89, 65, 128, 75, 72, 73, + 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75, 72, 72, 65, + 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, + 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 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, 77, 84, 201, 75, 72, 65, 75, 65, + 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, + 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, 65, 80, 128, + 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 88, + 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, 72, 69, 85, 65, 69, + 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, 80, 85, 81, 128, + 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, 75, 69, 85, 84, 78, + 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, 65, 69, 84, 77, 69, + 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, 84, 84, 201, 75, + 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 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, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, + 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, + 69, 78, 71, 128, 75, 69, 77, 66, 65, 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, 69, 69, 78, 71, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, + 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, + 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, 65, 86, 89, 75, 65, 128, 75, + 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 85, 128, 75, 65, 84, 79, + 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, + 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, 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, 83, 75, 65, 76, 128, 75, 65, 83, + 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, + 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 207, 75, 65, 82, + 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78, 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, 76, 128, + 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, 71, 128, + 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52, 128, 75, + 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65, 75, 65, + 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 84, 72, 201, + 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, + 128, 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, + 75, 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, + 50, 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, + 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 50, 128, + 75, 65, 178, 75, 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, + 128, 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, + 48, 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, + 74, 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, + 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, + 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, + 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 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, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, + 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 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, 73, 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, + 74, 73, 65, 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, + 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, 74, 72, 65, 128, 74, 69, + 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, 128, 74, 69, 82, 65, 206, + 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, 72, 128, 74, 69, 200, 74, + 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, 128, 74, 69, 65, 78, 83, + 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, 89, 65, 78, 73, + 128, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, + 74, 65, 80, 65, 78, 128, 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, 73, 128, 74, 65, + 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, + 69, 82, 78, 128, 74, 65, 67, 203, 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, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, + 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, + 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, + 83, 83, 72, 65, 82, 128, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, + 79, 76, 65, 84, 69, 128, 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 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, 82, 79, 78, + 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, 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, 68, 128, 73, 78, 86, 69, + 82, 84, 69, 196, 73, 78, 86, 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, + 67, 69, 82, 128, 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, 76, 65, 67, 69, 196, 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, 83, 67, 82, 73, 80, 84, + 73, 79, 78, 65, 204, 73, 78, 80, 85, 212, 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, + 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, + 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, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, + 199, 73, 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, + 78, 45, 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 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, 78, 128, 73, 77, + 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, + 77, 73, 206, 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, 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, + 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, + 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, + 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, + 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, 82, 73, 69, 85, 76, 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, 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, 73, 77, + 128, 73, 68, 73, 205, 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, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 66, 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, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 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, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 51, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 50, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 68, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 56, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 52, 69, 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, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, + 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, + 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, + 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, + 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, + 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, + 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, + 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, + 65, 128, 73, 45, 79, 45, 73, 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, 71, 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, 87, 71, 128, 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, 83, 72, 69, 196, 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, 78, 128, 72, 85, 77, 65, 78, 128, + 72, 85, 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, + 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, + 65, 68, 68, 79, 128, 72, 84, 83, 128, 72, 84, 74, 128, 72, 82, 89, 86, + 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, 128, 72, 80, 128, 72, 79, + 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, 85, 82, 71, + 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, 79, 85, 210, 72, 79, 84, 69, + 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, 80, 73, 84, 65, 76, 128, 72, + 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, 72, 79, 82, 78, 83, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 54, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 54, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 54, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 54, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, + 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, + 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, + 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 52, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 51, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 51, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 51, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, + 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, + 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, + 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 49, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 49, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 49, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 49, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, + 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, + 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, + 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, + 193, 72, 79, 79, 82, 85, 128, 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, + 72, 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, + 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, + 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, + 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, + 79, 73, 128, 72, 79, 67, 72, 79, 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, 69, 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, 83, 84, 79, 82, 73, 195, 72, + 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, 71, + 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, 72, + 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, + 79, 83, 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, 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, + 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, + 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72, 72, 87, 65, 128, 72, 72, + 85, 128, 72, 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, + 65, 65, 128, 72, 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, + 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, 78, 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, 69, 128, 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, + 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, + 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73, 67, + 79, 80, 84, 69, 82, 128, 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, 83, 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, + 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, 69, + 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, + 83, 84, 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 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, 72, 73, 128, 72, + 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, + 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, + 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 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, 80, 80, 217, 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, + 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, + 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78, 45, 65, 75, + 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69, 210, 72, + 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, + 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, + 76, 70, 45, 67, 73, 82, 67, 76, 197, 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, 67, 85, 84, 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, 65, 82, 85, 128, + 72, 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 48, 48, + 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, + 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, + 48, 48, 50, 128, 72, 48, 48, 49, 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, 65, 83, 128, 71, 89, 65, 65, 128, + 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 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, 85, 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, + 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, + 128, 71, 85, 78, 213, 71, 85, 205, 71, 85, 76, 128, 71, 85, 73, 84, 65, + 82, 128, 71, 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, 85, 68, + 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, 128, 71, 85, 65, + 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, 65, 82, 68, 69, 196, 71, 85, + 65, 82, 68, 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, + 71, 84, 69, 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, + 82, 79, 87, 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, + 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, + 73, 77, 65, 67, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65, 206, 71, 82, + 69, 69, 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, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, + 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, + 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, + 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, + 65, 80, 69, 83, 128, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, + 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69, 128, 71, 82, + 65, 67, 197, 71, 80, 65, 128, 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, 82, 65, 128, 71, 79, 79, 196, 71, 79, + 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, + 71, 79, 66, 76, 73, 78, 128, 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, 87, 73, 78, 199, 71, 76, 79, 84, 84, 65, 204, 71, 76, + 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, + 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, + 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, + 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, + 128, 71, 73, 82, 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, + 82, 178, 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, 68, 73, 77, 128, 71, 73, 66, 66, 79, 85, 211, 71, + 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, 128, 71, 72, + 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, 78, 193, 71, + 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, 71, 72, 79, + 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72, 69, 85, 88, 128, 71, + 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, + 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, + 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, + 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, + 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 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, + 65, 77, 65, 69, 128, 71, 72, 65, 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, 79, 88, 128, 71, 71, 85, 79, + 84, 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, + 128, 71, 71, 79, 84, 128, 71, 71, 79, 80, 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, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, + 80, 128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 65, 128, + 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, + 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, + 69, 83, 72, 50, 128, 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, 205, + 71, 69, 68, 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, + 69, 66, 193, 71, 69, 65, 82, 128, 71, 69, 65, 210, 71, 68, 65, 78, 128, + 71, 67, 73, 71, 128, 71, 67, 65, 206, 71, 66, 79, 78, 128, 71, 66, 73, + 69, 197, 71, 66, 69, 85, 88, 128, 71, 66, 69, 84, 128, 71, 66, 65, 89, + 73, 128, 71, 66, 65, 75, 85, 82, 85, 78, 69, 78, 128, 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, 85, 78, 84, 76, 69, 84, 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, 83, 72, 65, 78, 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, 68, 69, 78, 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, 69, 196, 71, + 65, 208, 71, 65, 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, 128, 71, 65, + 78, 68, 193, 71, 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, 77, 77, 65, + 128, 71, 65, 77, 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, 77, 69, 128, + 71, 65, 77, 197, 71, 65, 77, 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, + 65, 77, 65, 204, 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, 68, 128, 71, 65, 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, + 65, 70, 85, 128, 71, 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, + 71, 48, 53, 50, 128, 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, + 52, 57, 128, 71, 48, 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, + 128, 71, 48, 52, 53, 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, + 71, 48, 52, 51, 65, 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, + 48, 52, 49, 128, 71, 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, + 56, 128, 71, 48, 51, 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, + 65, 128, 71, 48, 51, 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, + 71, 48, 51, 51, 128, 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, + 51, 48, 128, 71, 48, 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, + 128, 71, 48, 50, 54, 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, + 71, 48, 50, 52, 128, 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, + 50, 49, 128, 71, 48, 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, + 57, 128, 71, 48, 49, 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, + 71, 48, 49, 53, 128, 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, + 49, 50, 128, 71, 48, 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, + 48, 128, 71, 48, 48, 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, + 128, 71, 48, 48, 55, 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, + 128, 71, 48, 48, 54, 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, + 48, 48, 51, 128, 71, 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, + 128, 70, 89, 84, 128, 70, 89, 80, 128, 70, 89, 65, 128, 70, 87, 73, 128, + 70, 87, 69, 69, 128, 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, + 128, 70, 86, 83, 51, 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 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, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, + 78, 67, 84, 73, 79, 78, 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, 85, 74, 73, 128, + 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, 85, 69, 128, 70, 84, 72, 79, + 82, 193, 70, 83, 73, 128, 70, 82, 79, 87, 78, 73, 78, 71, 128, 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, 78, 84, 45, 70, 65, 67, 73, 78, 199, + 70, 82, 79, 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, 73, 84, + 85, 128, 70, 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 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, 69, 128, 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, 84, 72, 73, 82, 84, 89, 128, 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, 85, 78, 84, 65, + 73, 78, 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 87, 65, + 82, 68, 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, 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, 80, 82, 73, 78, 84, 83, 128, 70, 79, 79, 84, 78, 79, 84, + 197, 70, 79, 79, 84, 66, 65, 76, 76, 128, 70, 79, 79, 84, 128, 70, 79, + 79, 68, 128, 70, 79, 79, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, + 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, + 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, 68, 69, 196, 70, 79, 71, + 71, 89, 128, 70, 207, 70, 77, 128, 70, 76, 89, 128, 70, 76, 85, 84, 84, + 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, 85, 83, 72, 69, + 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, 210, 70, 76, 79, + 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, + 82, 65, 204, 70, 76, 79, 80, 80, 217, 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, 88, 69, 196, 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, 78, 69, 83, 83, + 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, 71, 83, 128, 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, 65, 199, 70, 76, 65, 128, 70, 76, 128, 70, 73, + 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, 45, 84, + 72, 73, 82, 84, 89, 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, 84, 69, 196, 70, + 73, 83, 84, 128, 70, 73, 83, 72, 73, 78, 199, 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, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, 128, 70, 73, 82, 69, 87, + 79, 82, 203, 70, 73, 82, 69, 128, 70, 73, 82, 197, 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, 85, 88, 128, 70, 69, 85, 70, 69, 85, + 65, 69, 84, 128, 70, 69, 83, 84, 73, 86, 65, 76, 128, 70, 69, 82, 82, 89, + 128, 70, 69, 82, 82, 73, 211, 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, + 78, 71, 128, 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, 69, 65, 82, 70, 85, + 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, + 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, + 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 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, 81, + 128, 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, 76, 76, 69, 206, 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, 82, 89, 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, 77, 65, 69, + 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, + 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, + 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, + 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, + 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, + 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, + 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, + 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, + 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, + 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, + 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, + 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, + 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, + 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, + 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, + 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, + 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, + 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, + 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, + 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, + 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, + 69, 90, 69, 206, 69, 90, 128, 69, 89, 69, 83, 128, 69, 89, 69, 71, 76, + 65, 83, 83, 69, 83, 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, + 65, 78, 78, 65, 128, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, + 73, 65, 204, 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, 80, 82, 69, 83, 83, 73, 79, 78, 76, 69, 83, 211, + 69, 88, 80, 79, 78, 69, 78, 212, 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, 78, 128, 69, 88, + 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 72, 65, 78, 71, 69, 128, + 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, + 87, 69, 128, 69, 86, 69, 82, 71, 82, 69, 69, 206, 69, 86, 69, 78, 73, 78, + 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, 82, 79, 80, 69, 45, 65, + 70, 82, 73, 67, 65, 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, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, + 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, 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, 84, 66, 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, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, + 178, 69, 83, 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, + 128, 69, 83, 65, 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, + 66, 65, 82, 82, 69, 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 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, 79, 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, + 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, + 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 79, 84, 128, 69, 79, + 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, 69, 79, 72, 128, 69, + 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, + 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, + 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, 69, 78, 84, 82, 89, 128, + 69, 78, 84, 82, 217, 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, 81, 128, 69, 78, 79, 211, 69, 78, 78, 128, 69, 78, 76, 65, + 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, + 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, + 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, 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, 67, 128, 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, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, + 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, 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, 84, 128, 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, + 73, 83, 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, + 69, 76, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, + 69, 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, + 128, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, + 204, 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, 75, 65, 82, 65, 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, 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, + 128, 69, 73, 69, 128, 69, 72, 87, 65, 218, 69, 71, 89, 80, 84, 79, 76, + 79, 71, 73, 67, 65, 204, 69, 71, 73, 82, 128, 69, 71, 71, 128, 69, 69, + 89, 65, 78, 78, 65, 128, 69, 69, 75, 65, 65, 128, 69, 69, 72, 128, 69, + 69, 66, 69, 69, 70, 73, 76, 73, 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, + 69, 68, 73, 78, 128, 69, 68, 68, 128, 69, 66, 69, 70, 73, 76, 73, 128, + 69, 65, 83, 84, 69, 82, 206, 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, + 217, 69, 65, 82, 84, 72, 128, 69, 65, 82, 84, 200, 69, 65, 82, 83, 128, + 69, 65, 82, 76, 217, 69, 65, 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, + 65, 71, 76, 69, 128, 69, 65, 68, 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, + 68, 72, 128, 69, 178, 69, 48, 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, + 51, 54, 128, 69, 48, 51, 52, 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, + 51, 128, 69, 48, 51, 50, 128, 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, + 69, 48, 50, 57, 128, 69, 48, 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, + 48, 50, 55, 128, 69, 48, 50, 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, + 52, 128, 69, 48, 50, 51, 128, 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, + 69, 48, 50, 48, 65, 128, 69, 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, + 48, 49, 56, 128, 69, 48, 49, 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, + 49, 54, 65, 128, 69, 48, 49, 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, + 52, 128, 69, 48, 49, 51, 128, 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, + 69, 48, 49, 48, 128, 69, 48, 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, + 48, 48, 56, 65, 128, 69, 48, 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, + 48, 54, 128, 69, 48, 48, 53, 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, + 128, 69, 48, 48, 50, 128, 69, 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, + 68, 90, 90, 69, 128, 68, 90, 90, 65, 128, 68, 90, 87, 69, 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, 65, 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, 68, 128, 68, 86, 128, 68, 85, 84, 73, + 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83, 72, 69, 78, 78, 65, 128, + 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, + 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, + 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179, 68, 85, 77, 128, 68, 85, + 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, 68, 85, 66, 50, 128, 68, + 85, 66, 128, 68, 85, 194, 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, 76, 69, + 84, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 79, + 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, 69, 128, 68, 82, 73, 86, 197, + 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, 68, 82, 69, 83, 83, 128, 68, + 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77, 128, 68, 82, 65, 205, 68, + 82, 65, 71, 79, 78, 128, 68, 82, 65, 71, 79, 206, 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, 86, 69, 128, 68, 79, + 85, 71, 72, 78, 85, 84, 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, 79, 78, + 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 80, + 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, 79, 76, 76, 65, 210, 68, + 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, + 128, 68, 79, 71, 128, 68, 79, 199, 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, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, + 79, 128, 68, 76, 73, 128, 68, 76, 72, 89, 65, 128, 68, 76, 72, 65, 128, + 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, 128, + 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, 128, + 68, 74, 69, 128, 68, 74, 65, 128, 68, 73, 90, 90, 217, 68, 73, 86, 79, + 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 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, 84, 73, 76, 76, 128, 68, 73, 83, 83, 79, 76, 86, 69, 45, 50, + 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73, 83, 80, 69, 82, 83, 73, + 79, 78, 128, 68, 73, 83, 75, 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, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, 68, 73, 83, + 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 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, 206, 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, 73, 68, 73, 193, 68, 73, + 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, 77, 69, 78, 83, 73, 79, 206, + 68, 73, 77, 50, 128, 68, 73, 76, 128, 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, 66, 128, 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, 83, 128, 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, 83, 128, 68, 73, 65, 69, 82, 69, 83, + 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72, 79, 128, 68, + 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128, 68, 72, 72, + 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68, 72, 72, 69, + 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65, 82, 77, 65, + 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, 84, 72, 128, + 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, 65, 65, 76, 85, + 128, 68, 72, 65, 65, 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, 85, 78, 71, 128, 68, 69, 83, 203, 68, 69, 83, 73, 71, 78, + 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, + 77, 69, 78, 212, 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, 78, + 78, 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, + 82, 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, + 76, 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, + 217, 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, 73, + 67, 73, 79, 85, 211, 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, @@ -4547,96 +4550,96 @@ 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, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 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, 75, 65, - 76, 73, 45, 50, 128, 65, 76, 75, 65, 76, 73, 128, 65, 76, 73, 71, 78, 69, - 196, 65, 76, 73, 70, 85, 128, 65, 76, 73, 69, 78, 128, 65, 76, 73, 69, - 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, 85, 212, 65, - 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 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, 82, 205, 65, 76, 65, 80, 72, 128, 65, 76, 45, 76, - 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, 76, 83, 75, 65, 66, - 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, - 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65, - 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, 79, 206, 65, - 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 213, 65, 73, 78, 78, 128, - 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, - 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 78, 199, - 65, 72, 65, 71, 71, 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, - 128, 65, 71, 79, 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, - 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, - 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 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, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69, - 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80, - 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, 65, 69, 82, 73, - 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, - 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, - 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, - 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, - 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65, - 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, - 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, - 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, - 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, - 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, - 82, 79, 80, 72, 79, 78, 73, 195, 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, 80, 84, 128, 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, 66, 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, - 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, - 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, - 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, - 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, - 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, - 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, - 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, - 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, - 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, - 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, - 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, - 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, - 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, - 50, 128, 65, 65, 48, 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, - 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65, - 48, 54, 53, 128, 65, 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, - 50, 128, 65, 48, 54, 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, - 65, 48, 53, 56, 128, 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, - 53, 53, 128, 65, 48, 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, - 128, 65, 48, 53, 49, 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, - 48, 52, 56, 128, 65, 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52, - 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51, - 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50, - 128, 65, 48, 52, 49, 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, - 65, 48, 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, - 51, 54, 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, - 128, 65, 48, 51, 50, 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, - 65, 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, - 53, 65, 128, 65, 45, 69, 85, 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, + 128, 65, 76, 77, 79, 83, 212, 65, 76, 77, 128, 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, 75, 65, 76, 73, 45, 50, 128, 65, 76, 75, 65, 76, 73, 128, 65, 76, + 73, 71, 78, 69, 196, 65, 76, 73, 70, 85, 128, 65, 76, 73, 69, 78, 128, + 65, 76, 73, 69, 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, + 69, 85, 212, 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 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, 82, 205, 65, 76, 65, 80, 72, + 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, + 76, 83, 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, + 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, + 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, + 79, 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 213, 65, 73, + 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, + 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, + 72, 65, 78, 199, 65, 72, 65, 71, 71, 65, 210, 65, 72, 65, 68, 128, 65, + 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, + 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, + 78, 128, 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 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, 70, 70, 82, 73, 67, 65, 84, 73, 79, + 206, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, + 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, + 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, + 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, + 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, + 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, + 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, + 128, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, 83, + 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, 68, + 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, + 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, + 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, + 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 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, 80, 84, 128, 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, 66, 178, 65, 65, 89, 65, 78, 78, 65, + 128, 65, 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, + 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, + 48, 51, 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, + 65, 48, 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, + 65, 65, 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, + 128, 65, 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, + 48, 128, 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, + 49, 55, 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, + 48, 49, 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, + 65, 48, 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, + 65, 65, 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, + 65, 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, + 48, 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, + 48, 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, + 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, + 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, + 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, + 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, + 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, + 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, + 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, + 48, 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, + 52, 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, + 52, 50, 128, 65, 48, 52, 49, 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, + 48, 128, 65, 48, 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, + 65, 48, 51, 54, 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, + 51, 51, 128, 65, 48, 51, 50, 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, + 49, 52, 65, 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, + 48, 48, 53, 65, 128, 65, 45, 69, 85, 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 int lexicon_offset[] = { - 0, 0, 6, 10, 18, 23, 27, 34, 39, 41, 44, 50, 62, 70, 80, 93, 102, 108, + 0, 0, 6, 10, 18, 23, 27, 34, 39, 41, 47, 50, 62, 70, 80, 93, 102, 108, 113, 121, 130, 135, 140, 143, 147, 153, 158, 163, 171, 178, 186, 191, 194, 200, 208, 215, 225, 230, 237, 246, 249, 254, 257, 263, 267, 272, 281, 288, 295, 301, 310, 315, 321, 327, 335, 144, 341, 349, 350, 358, - 361, 367, 369, 375, 382, 384, 391, 395, 403, 410, 415, 417, 422, 429, - 431, 299, 437, 439, 444, 449, 452, 457, 463, 470, 479, 489, 494, 498, + 361, 367, 369, 375, 382, 384, 391, 395, 403, 410, 412, 417, 422, 427, + 434, 436, 299, 442, 445, 447, 452, 457, 463, 470, 479, 489, 494, 498, 505, 518, 522, 531, 538, 545, 548, 554, 558, 562, 572, 580, 588, 596, - 605, 613, 618, 619, 623, 631, 638, 648, 659, 663, 666, 670, 673, 348, - 678, 687, 691, 697, 703, 705, 708, 711, 714, 718, 722, 731, 739, 744, + 605, 613, 618, 619, 623, 631, 638, 648, 652, 663, 667, 670, 673, 678, + 348, 682, 691, 697, 703, 705, 708, 711, 714, 718, 722, 731, 739, 744, 747, 751, 757, 764, 771, 776, 785, 794, 801, 805, 818, 827, 835, 841, 557, 850, 860, 867, 873, 879, 886, 894, 898, 749, 906, 915, 503, 923, 928, 934, 17, 943, 948, 951, 955, 959, 966, 969, 976, 980, 988, 992, - 1000, 1004, 1007, 1014, 1021, 192, 1024, 1029, 1039, 1048, 1055, 1061, - 1067, 1075, 1078, 1083, 1089, 1097, 1102, 1105, 1108, 111, 1113, 1117, - 1123, 1129, 1132, 1138, 1142, 1147, 1153, 1158, 1168, 1172, 1175, 1178, + 1000, 1004, 1007, 1014, 1021, 192, 1024, 1029, 1039, 1048, 1055, 1060, + 1066, 1072, 1080, 1083, 1088, 1094, 1102, 1107, 1110, 1113, 111, 1118, + 1122, 1128, 1134, 1137, 1143, 1147, 1152, 1158, 1168, 1172, 1175, 1178, 1187, 1191, 1194, 1199, 1204, 1210, 1215, 1220, 1225, 1229, 1234, 1240, 1245, 1250, 1254, 1260, 1265, 1270, 1275, 1279, 1284, 1289, 1294, 1300, 1306, 1312, 1317, 1321, 1326, 1331, 1336, 1340, 1345, 1350, 1355, 1360, @@ -4650,7 +4653,7 @@ 1665, 1670, 1675, 1679, 1682, 1687, 1692, 1697, 1702, 1708, 1713, 1717, 1322, 1720, 1725, 1730, 1327, 1734, 1738, 1745, 1332, 1752, 1337, 1756, 1758, 1763, 1769, 1341, 1774, 1783, 1346, 1788, 1794, 1351, 1799, 1804, - 1807, 1812, 1816, 1820, 1824, 1827, 1831, 1356, 1361, 1156, 1836, 1842, + 1807, 1812, 1816, 1820, 1824, 1827, 1831, 1356, 1361, 1058, 1836, 1842, 1848, 1854, 1860, 1866, 1872, 1878, 1884, 1889, 1895, 1901, 1907, 1913, 1919, 1925, 1931, 1937, 1943, 1948, 1953, 1958, 1963, 1968, 1973, 1978, 1983, 1988, 1993, 1999, 2004, 2010, 2015, 2021, 2027, 2032, 2038, 2044, @@ -4677,7 +4680,7 @@ 3241, 3245, 3248, 3261, 3265, 3269, 3273, 3277, 3281, 3284, 3288, 3292, 3297, 3301, 3306, 3311, 3316, 3320, 3323, 3326, 3332, 3336, 3340, 3343, 3347, 3351, 3354, 3360, 3365, 3370, 3376, 3381, 3386, 3392, 3398, 3403, - 3408, 3413, 1115, 547, 3418, 3421, 3426, 3430, 3433, 3437, 3442, 3447, + 3408, 3413, 1120, 547, 3418, 3421, 3426, 3430, 3433, 3437, 3442, 3447, 3451, 3456, 3460, 3465, 3469, 3473, 3479, 3485, 3488, 3491, 3497, 3504, 3511, 3517, 3524, 3529, 3533, 3540, 3547, 3552, 3556, 3566, 3570, 3574, 3579, 3584, 3594, 2107, 3599, 3603, 3606, 3612, 3617, 3623, 3629, 3634, @@ -4726,7 +4729,7 @@ 6683, 6698, 6713, 6728, 6743, 6758, 6773, 6788, 6803, 6818, 6833, 6848, 6863, 6878, 6893, 6908, 6923, 6938, 6953, 6968, 6983, 6998, 7013, 7028, 7037, 7046, 7051, 7057, 7067, 7071, 7076, 7081, 7089, 7093, 7096, 7100, - 2975, 7103, 7108, 298, 442, 7114, 7122, 7126, 7130, 7133, 7137, 7143, + 2975, 7103, 7108, 298, 425, 7114, 7122, 7126, 7130, 7133, 7137, 7143, 7147, 7155, 7161, 7166, 7173, 7180, 7186, 7191, 7198, 7204, 7212, 7216, 7221, 7233, 7244, 7251, 7255, 7259, 7265, 3233, 7269, 7275, 7280, 7285, 7290, 7296, 7301, 7306, 7311, 7316, 7322, 7327, 7332, 7338, 7343, 7349, @@ -4828,5058 +4831,5056 @@ 13435, 13443, 13451, 13458, 13466, 13478, 13489, 13499, 13506, 13512, 13521, 13532, 13541, 13553, 13565, 13577, 13587, 13596, 13605, 13613, 13620, 13629, 13637, 13641, 13647, 13653, 13658, 7753, 13662, 13664, - 13668, 13673, 13679, 13688, 13692, 13700, 13707, 13716, 13725, 13734, - 13743, 13752, 13761, 13770, 13779, 13789, 13799, 13808, 13814, 13821, - 13828, 13834, 13848, 13855, 13863, 13872, 13878, 13887, 13896, 13907, - 13917, 13925, 13932, 13940, 13949, 13962, 13970, 13977, 13990, 13996, - 14002, 14012, 14021, 14030, 14035, 14039, 14045, 14051, 14058, 8966, - 14063, 14068, 14075, 14080, 12376, 14085, 14093, 14099, 14104, 14112, - 14120, 14127, 14135, 14141, 14149, 14157, 14163, 14168, 14174, 14181, - 14187, 14192, 14196, 14207, 14215, 14221, 14226, 14235, 14241, 14246, - 14255, 14269, 3853, 14273, 14278, 14283, 14289, 14294, 14299, 14303, - 14308, 14313, 14318, 7752, 14323, 14328, 14333, 14338, 14343, 14347, - 14352, 14357, 14362, 14367, 14373, 14379, 14384, 14388, 14393, 14398, - 14403, 9301, 14408, 14413, 14418, 14423, 14428, 14445, 14463, 14475, - 14488, 14505, 14521, 14538, 14548, 14567, 14578, 14589, 14600, 14611, - 14623, 14634, 14645, 14662, 14673, 14684, 14689, 9306, 14694, 14698, - 2381, 14702, 14705, 14711, 14719, 14727, 14732, 14740, 14748, 14755, - 14760, 14766, 14773, 14781, 14788, 14800, 14808, 14813, 11597, 14819, - 14828, 14837, 14845, 14852, 14858, 14866, 14873, 14879, 14886, 14892, - 14901, 14909, 14919, 14926, 14932, 14940, 14946, 14954, 14961, 14974, - 14981, 14990, 14999, 15008, 15016, 15026, 15033, 15038, 3560, 15045, - 15050, 1372, 15054, 14324, 15058, 15064, 15068, 15076, 15088, 15093, - 15100, 15106, 15111, 15118, 14329, 15122, 15126, 15130, 14334, 15134, - 14339, 15138, 15145, 15150, 15154, 15161, 15165, 15173, 15180, 15184, - 15191, 15208, 15217, 15221, 15224, 15232, 15238, 15243, 3638, 15247, - 15249, 15257, 15264, 15274, 15286, 15291, 15297, 15302, 15306, 15312, - 15317, 15323, 15326, 15333, 15341, 15348, 15354, 15360, 15365, 15372, - 15378, 15383, 15390, 15394, 15400, 15404, 15411, 15417, 15423, 15431, - 15437, 15442, 15448, 15456, 15464, 15470, 15476, 15481, 15488, 15493, - 15497, 15503, 15508, 15515, 15520, 15526, 15529, 15535, 15541, 15544, - 15548, 15560, 15566, 15571, 15578, 15584, 15590, 15601, 15611, 15620, - 15628, 15635, 15646, 15656, 15666, 15674, 15677, 14353, 15682, 15687, - 14358, 14493, 15695, 15708, 15723, 15734, 14510, 15752, 15765, 15778, - 15789, 10492, 15800, 15813, 15832, 15843, 15854, 15865, 2649, 15878, - 15882, 15890, 15905, 15920, 15931, 15938, 15944, 15952, 15956, 15962, - 15965, 15975, 15983, 15990, 15998, 16008, 16013, 16020, 16025, 16032, - 16043, 16053, 16059, 16064, 16069, 14363, 16073, 16079, 16085, 16090, - 16095, 16100, 16104, 14368, 14374, 16108, 14380, 16113, 16121, 16130, - 16137, 9150, 16141, 16143, 16148, 16153, 16159, 16164, 16169, 16174, - 16179, 16183, 16189, 16195, 16200, 16206, 16211, 16216, 16222, 16227, - 16232, 16237, 16242, 16248, 16253, 16258, 16264, 16270, 16275, 16280, - 16287, 16293, 16304, 16311, 16316, 16320, 16324, 16327, 16335, 16340, - 16347, 16354, 16360, 16365, 16370, 16377, 16387, 16392, 16399, 16405, - 16415, 16425, 16439, 16453, 16467, 16481, 16496, 16511, 16528, 16546, - 16559, 16565, 16570, 16575, 16579, 16584, 16592, 16598, 16603, 16608, - 16612, 16617, 16621, 16626, 16630, 16641, 16647, 16652, 16657, 16664, - 16669, 16673, 16678, 16683, 16689, 16696, 16702, 16707, 16711, 16717, - 16722, 16727, 16731, 16737, 16742, 16747, 16754, 16759, 13111, 16763, - 16768, 16772, 16777, 16783, 16789, 16796, 16806, 16814, 16821, 16826, - 16830, 16839, 16847, 16854, 16861, 16867, 16873, 16878, 16883, 16889, - 16894, 16900, 16905, 16911, 16917, 16924, 16930, 16935, 16940, 9348, - 16949, 16952, 16958, 16963, 16968, 16978, 16985, 16991, 16996, 17001, - 17007, 17012, 17018, 17023, 17029, 17035, 17040, 17048, 17055, 17060, - 17065, 17071, 17076, 17080, 17089, 17100, 17107, 17112, 17120, 17126, - 17133, 17139, 17144, 17148, 17154, 17159, 17164, 17169, 1440, 7777, 2877, - 17173, 17177, 17181, 17185, 17189, 17193, 17196, 17203, 17211, 14394, - 17218, 17228, 17236, 17243, 17251, 17261, 17270, 17283, 17288, 17293, - 17301, 17308, 13207, 13216, 17315, 17325, 17340, 17346, 17353, 17360, - 17366, 17374, 17384, 17394, 14399, 17403, 17409, 17415, 17423, 17431, - 17436, 17445, 17453, 17465, 17475, 17485, 17495, 17504, 17516, 17526, - 17536, 17547, 17552, 17564, 17576, 17588, 17600, 17612, 17624, 17636, - 17648, 17660, 17672, 17683, 17695, 17707, 17719, 17731, 17743, 17755, - 17767, 17779, 17791, 17803, 17814, 17826, 17838, 17850, 17862, 17874, - 17886, 17898, 17910, 17922, 17934, 17945, 17957, 17969, 17981, 17993, - 18005, 18017, 18029, 18041, 18053, 18065, 18076, 18088, 18100, 18112, - 18124, 18136, 18148, 18160, 18172, 18184, 18196, 18207, 18219, 18231, - 18243, 18255, 18267, 18279, 18291, 18303, 18315, 18327, 18338, 18350, - 18362, 18374, 18386, 18398, 18410, 18422, 18434, 18446, 18458, 18469, - 18481, 18493, 18505, 18517, 18530, 18543, 18556, 18569, 18582, 18595, - 18608, 18620, 18633, 18646, 18659, 18672, 18685, 18698, 18711, 18724, - 18737, 18750, 18762, 18775, 18788, 18801, 18814, 18827, 18840, 18853, - 18866, 18879, 18892, 18904, 18917, 18930, 18943, 18956, 18969, 18982, - 18995, 19008, 19021, 19034, 19046, 19059, 19072, 19085, 19098, 19111, - 19124, 19137, 19150, 19163, 19176, 19188, 19201, 19214, 19227, 19240, - 19253, 19266, 19279, 19292, 19305, 19318, 19330, 19341, 19354, 19367, - 19380, 19393, 19406, 19419, 19432, 19445, 19458, 19471, 19483, 19496, - 19509, 19522, 19535, 19548, 19561, 19574, 19587, 19600, 19613, 19625, - 19638, 19651, 19664, 19677, 19690, 19703, 19716, 19729, 19742, 19755, - 19767, 19780, 19793, 19806, 19819, 19832, 19845, 19858, 19871, 19884, - 19897, 19909, 19922, 19935, 19948, 19961, 19974, 19987, 20000, 20013, - 20026, 20039, 20051, 20064, 20077, 20090, 20103, 20116, 20129, 20142, - 20155, 20168, 20181, 20193, 20206, 20219, 20232, 20245, 20258, 20271, - 20284, 20297, 20310, 20323, 20335, 20348, 20361, 20374, 20387, 20400, - 20413, 20426, 20439, 20452, 20465, 20477, 20490, 20503, 20516, 20529, - 20542, 20555, 20568, 20581, 20594, 20607, 20619, 20632, 20645, 20658, - 20671, 20684, 20697, 20710, 20723, 20736, 20749, 20761, 20772, 20780, - 20788, 20795, 20801, 20805, 20811, 20817, 20825, 20831, 20836, 20840, - 20849, 9155, 20860, 20867, 20875, 20882, 20889, 10948, 20896, 20905, - 20910, 20915, 7805, 20922, 20927, 20930, 20935, 20943, 20950, 20957, - 20964, 20970, 20979, 20988, 20994, 21003, 21007, 21013, 21018, 21028, - 21035, 21041, 21049, 21055, 21062, 21072, 21081, 21085, 21092, 21096, - 21101, 21107, 21115, 21119, 21129, 14409, 21138, 21144, 21148, 21157, - 14414, 21163, 21170, 21181, 21189, 21198, 21206, 8931, 21214, 21219, - 21225, 21230, 21234, 21238, 21242, 9639, 21247, 21255, 21262, 21271, - 21278, 21285, 10878, 21292, 21298, 21302, 21308, 21315, 21321, 21329, - 21335, 21342, 21348, 21354, 21363, 21367, 21375, 21384, 21391, 21396, - 21400, 21411, 21416, 21421, 21426, 21439, 7995, 21443, 21449, 21457, - 21461, 21468, 21477, 21482, 14685, 21490, 21494, 21506, 21511, 21515, - 21518, 21524, 21530, 21535, 21539, 21542, 21553, 21558, 9383, 21565, - 21570, 9388, 21575, 21580, 21585, 21590, 21595, 21600, 21605, 21610, - 21615, 21620, 21625, 21630, 21636, 21641, 21646, 21651, 21656, 21661, - 21666, 21671, 21676, 21681, 21687, 21693, 21698, 21703, 21708, 21713, - 21718, 21723, 21728, 21733, 21738, 21744, 21749, 21754, 21759, 21765, - 21771, 21776, 21781, 21786, 21791, 21796, 21801, 21806, 21811, 21817, - 21822, 21827, 21832, 21837, 21843, 21848, 21853, 21857, 1368, 129, 21865, - 21869, 21873, 21877, 21882, 21886, 13117, 12476, 21890, 21895, 21899, - 21904, 21908, 21913, 21917, 21923, 21928, 21932, 21936, 21944, 21948, - 21952, 21957, 21962, 21966, 21972, 21977, 21981, 21986, 21991, 21995, - 22002, 22009, 22016, 22020, 22024, 22029, 22033, 22036, 22042, 22055, - 22060, 22069, 22074, 9428, 22079, 22082, 2712, 2717, 22086, 22092, 22098, - 7209, 22103, 22108, 22113, 22119, 22124, 13903, 22129, 22134, 22139, - 22144, 22150, 22155, 22160, 22166, 22171, 22175, 22180, 22185, 22190, - 22195, 22199, 22204, 22208, 22213, 22218, 22223, 22228, 22232, 22237, - 22241, 22246, 22251, 22256, 22261, 2886, 22176, 22265, 22273, 22280, - 9733, 22292, 22300, 22181, 22307, 22312, 22320, 22186, 22325, 22330, - 22338, 22343, 22191, 22348, 22353, 22357, 22363, 22371, 22374, 22381, - 22385, 22389, 22395, 22402, 22407, 8958, 1727, 1732, 22411, 22417, 22423, - 22428, 22432, 22436, 22440, 22444, 22448, 22452, 22456, 22459, 22465, - 22472, 22480, 22486, 22492, 22497, 22502, 22506, 13823, 13830, 22511, - 22523, 22526, 22533, 16356, 22540, 22548, 22559, 22568, 22581, 22591, - 22605, 22617, 22631, 22643, 22653, 22665, 22671, 22686, 22710, 22728, - 22747, 22760, 22774, 22792, 22808, 22825, 22843, 22854, 22873, 22890, - 22910, 22928, 22940, 22954, 22968, 22980, 22997, 23016, 23034, 23046, - 23064, 23083, 14553, 23096, 23116, 23128, 10523, 23140, 23145, 23150, - 23155, 23161, 23166, 23170, 23177, 2398, 23181, 23187, 23191, 23194, - 23198, 23206, 23212, 22209, 23216, 23225, 23236, 23242, 23248, 23257, - 23265, 23272, 23277, 23281, 23288, 23294, 23303, 23311, 23318, 23328, - 23337, 23347, 23352, 23361, 23370, 23381, 23392, 3963, 23402, 23406, - 23416, 23424, 23434, 23445, 23450, 23460, 23468, 23475, 23481, 23488, - 23493, 22219, 23497, 23506, 23510, 23513, 23518, 23525, 23534, 23542, - 23550, 23560, 23569, 23575, 23581, 22224, 22229, 23585, 23595, 23605, - 23615, 23623, 23630, 23640, 23648, 23656, 23662, 23670, 930, 23679, - 14744, 542, 23693, 23702, 23710, 23721, 23732, 23742, 23751, 23763, - 23772, 23781, 23787, 23796, 23805, 23815, 23823, 23831, 9360, 23837, - 23840, 23844, 23849, 23854, 9848, 22242, 22247, 23862, 23868, 23874, - 23879, 23884, 23888, 23896, 23902, 23908, 23912, 3525, 23920, 23925, - 23930, 23934, 23938, 9928, 23945, 23953, 23967, 23974, 23980, 9937, 9943, - 23988, 23996, 24003, 24008, 24013, 22252, 24019, 24030, 24034, 24039, - 2601, 24044, 24055, 24061, 24066, 24070, 24074, 24077, 24084, 24091, - 24098, 24104, 24108, 22257, 24113, 24117, 24121, 1037, 24126, 24131, - 24136, 24141, 24146, 24151, 24156, 24161, 24166, 24171, 24176, 24181, - 24186, 24191, 24197, 24202, 24207, 24212, 24217, 24222, 24227, 24233, - 24238, 24243, 24248, 24253, 24258, 24263, 24268, 24274, 24280, 24285, - 24291, 24296, 24301, 5, 24307, 24311, 24315, 24319, 24324, 24328, 24332, - 24336, 24340, 24345, 24349, 24354, 24358, 24361, 24365, 24370, 24374, - 24379, 24383, 24387, 24391, 24396, 24400, 24404, 24414, 24419, 24423, - 24427, 24432, 24437, 24446, 24451, 24456, 24460, 24464, 24477, 24489, - 24498, 24507, 24513, 24518, 24522, 24526, 24536, 24545, 24553, 24559, - 24564, 24568, 24575, 24585, 24594, 24602, 24610, 24617, 24625, 24634, - 24643, 24651, 24656, 24660, 24664, 24667, 24669, 24673, 24677, 24682, - 24687, 24691, 24695, 24698, 24702, 24705, 24709, 24712, 24715, 24719, - 24725, 24729, 24733, 24737, 24742, 24747, 24752, 24756, 24759, 24764, - 24770, 24775, 24781, 24786, 24790, 24794, 24798, 24803, 24807, 24812, - 24816, 24820, 24827, 24831, 24834, 24838, 24844, 24850, 24854, 24858, - 24863, 24870, 24876, 24880, 24889, 24893, 24897, 24900, 24906, 24911, - 24917, 1489, 1791, 24922, 24927, 24932, 24937, 24942, 24947, 24952, 2148, - 2194, 24957, 24960, 24964, 24968, 24973, 24977, 24981, 24984, 24989, - 24994, 24998, 25001, 25006, 25010, 25015, 25019, 14756, 25024, 25027, - 25030, 25034, 25039, 25043, 25056, 25060, 25063, 25071, 25080, 25087, - 25092, 25098, 25104, 25112, 25119, 25126, 25130, 25134, 25138, 25143, - 25148, 25152, 25160, 25165, 25177, 25188, 25193, 25197, 25201, 25207, - 25212, 25217, 25221, 25225, 25228, 25234, 7915, 2316, 25238, 25243, - 25259, 9475, 25279, 25288, 25304, 25308, 25311, 25317, 25327, 25333, - 25342, 25357, 25369, 25380, 25388, 25397, 25403, 25412, 25422, 25433, - 25444, 25453, 25460, 25469, 25477, 25484, 25492, 25499, 25506, 25519, - 25526, 25532, 25537, 25546, 25552, 25557, 25565, 25572, 23426, 25584, - 25596, 25610, 25618, 25625, 25637, 25646, 25655, 25663, 25671, 25679, - 25686, 25695, 25703, 25713, 25722, 25732, 25741, 25750, 25758, 25763, - 25767, 25770, 25774, 25778, 25782, 25786, 25790, 25796, 25802, 25810, - 14801, 25817, 25822, 25829, 25835, 25842, 14809, 25849, 25852, 25864, - 25872, 25878, 25883, 25887, 9878, 25898, 25908, 25917, 25924, 25928, - 14814, 25931, 25938, 25942, 25948, 25951, 25958, 25964, 25971, 25977, - 25981, 25986, 25990, 25999, 26006, 26012, 7956, 26019, 26027, 26034, - 26040, 26045, 26051, 26057, 26065, 26069, 26072, 26074, 25775, 26083, - 26089, 26099, 26104, 26111, 26117, 26122, 26127, 26132, 26136, 26141, - 26148, 26157, 26161, 26168, 26177, 26183, 26188, 26194, 26199, 26206, - 26217, 26222, 26226, 26236, 26242, 26246, 26251, 26261, 26270, 26274, - 26281, 26289, 26296, 26302, 26307, 26315, 26322, 26334, 26343, 26347, - 13053, 26355, 26365, 26369, 25067, 26380, 26385, 26389, 26396, 26403, - 21968, 25700, 26408, 26412, 26415, 22860, 26420, 26434, 26450, 26468, - 26487, 26504, 26522, 22879, 26539, 26559, 22896, 26571, 26583, 15739, - 26595, 22916, 26609, 26621, 10536, 26635, 26640, 26645, 26650, 26656, - 26662, 26668, 26672, 26679, 26684, 26694, 26700, 10183, 26706, 26708, - 26713, 26721, 26725, 26144, 26731, 26738, 11524, 11534, 26745, 26755, - 26760, 26764, 26767, 26773, 26781, 26793, 26803, 26819, 26832, 26846, - 15757, 26860, 26867, 26871, 26874, 26879, 26883, 26890, 26897, 26907, - 26912, 26917, 26922, 26930, 26938, 26947, 26952, 9572, 26956, 26959, - 26962, 26967, 26974, 26979, 26995, 27003, 27011, 9423, 27019, 27024, - 27028, 27034, 27040, 27043, 27049, 27061, 27069, 27076, 27082, 27089, - 27100, 27114, 27127, 27136, 27145, 27157, 27168, 27178, 27187, 27196, - 27204, 27215, 7938, 27222, 27228, 27233, 27239, 27246, 27256, 27266, - 27275, 27281, 27288, 27293, 27300, 27308, 27316, 27328, 6246, 27335, - 27344, 27352, 27358, 27364, 27369, 27373, 27376, 27382, 27389, 27394, - 27399, 27403, 27415, 27426, 27435, 27443, 14941, 27448, 27454, 27460, - 11517, 8635, 27465, 27469, 27472, 27475, 27481, 27489, 27497, 27501, - 27505, 27510, 27513, 27522, 27526, 27534, 27545, 27549, 27555, 27561, - 27565, 27571, 27579, 27601, 27625, 27632, 27639, 27645, 27653, 27659, - 27664, 27675, 27693, 27700, 27708, 27712, 27721, 27734, 27742, 27754, - 27765, 27775, 27789, 27798, 27806, 27818, 9492, 27829, 27840, 27852, - 27862, 27871, 27876, 27880, 27888, 27898, 27903, 27907, 27910, 27913, - 27921, 27929, 27938, 27948, 27957, 27963, 27977, 2663, 27999, 28010, - 28019, 28029, 28041, 28050, 28059, 28069, 28077, 28085, 28094, 28099, - 28110, 28115, 28126, 28130, 28140, 28149, 28157, 28167, 28177, 28185, - 28194, 28201, 28209, 28216, 28225, 28229, 28237, 28244, 28252, 28259, - 28270, 28285, 28292, 28298, 28308, 28317, 28323, 28327, 28334, 28338, - 14025, 28344, 28348, 28353, 28360, 28364, 28368, 28376, 28384, 28390, - 28399, 28406, 28411, 28416, 28426, 23495, 28430, 28433, 28438, 28443, - 28448, 28453, 28458, 28463, 28468, 28473, 28479, 28484, 28489, 28495, - 1218, 704, 28500, 28509, 2364, 28516, 28521, 28525, 28531, 1267, 546, - 318, 28536, 28545, 28553, 28562, 28570, 28581, 28590, 28598, 28602, - 28605, 28613, 28621, 28626, 14769, 28632, 28638, 28644, 5872, 28649, - 28653, 28659, 28663, 28670, 1455, 28676, 28683, 9579, 28687, 28697, - 28705, 28711, 28720, 28728, 28734, 28742, 28749, 11110, 28755, 28762, - 28767, 28774, 1496, 2147, 28780, 28786, 28793, 28804, 28815, 28823, - 28830, 28840, 28849, 28857, 28866, 28873, 28880, 28893, 28904, 1272, - 28923, 28928, 28936, 3575, 28940, 28945, 28949, 1459, 24696, 28959, - 28963, 28968, 28972, 3493, 28978, 28986, 28993, 29004, 29012, 29020, - 3576, 279, 29025, 29033, 29041, 29048, 29054, 29059, 2216, 29066, 29072, - 25982, 26212, 29078, 106, 29082, 29086, 29092, 615, 9328, 29097, 29104, - 29110, 2327, 29114, 29118, 15181, 29121, 29126, 29133, 29139, 29144, - 29152, 29159, 29165, 22345, 29169, 29173, 3646, 16619, 29177, 29182, - 29185, 29193, 29201, 29206, 29209, 29216, 29226, 29238, 29243, 29247, - 29255, 29262, 29268, 29275, 29282, 29285, 29289, 29293, 1463, 29303, - 29305, 29310, 29316, 29322, 29327, 29332, 29337, 29342, 29347, 29352, - 29357, 29362, 29367, 29372, 29377, 29382, 29387, 29392, 29398, 29404, - 29410, 29416, 29421, 29426, 29431, 29437, 29442, 29447, 29452, 29458, - 29463, 29469, 29474, 29479, 29484, 29489, 29495, 29500, 29506, 29511, - 29516, 29521, 29526, 29532, 29537, 29543, 29548, 29553, 29558, 29563, - 29568, 29573, 29578, 29583, 29588, 29594, 29600, 29606, 29611, 29616, - 29621, 29626, 29632, 29638, 29644, 29650, 29656, 29662, 29667, 29673, - 29678, 29683, 29688, 29693, 29699, 2443, 29704, 2450, 2457, 2754, 29709, - 2463, 2473, 29715, 29719, 29724, 29729, 29735, 29740, 29745, 29749, - 29754, 29760, 29765, 29770, 29775, 29781, 29786, 29790, 29794, 29799, - 29804, 29809, 29814, 29819, 29825, 29831, 29836, 29840, 29845, 29851, - 29855, 29860, 29865, 29870, 29875, 29879, 29882, 29887, 29892, 29897, - 29902, 29907, 29913, 29919, 29924, 29929, 29933, 29938, 29943, 29948, - 29953, 29958, 29962, 29967, 29972, 29977, 29981, 29985, 29989, 29994, - 30002, 30007, 30013, 30019, 30025, 30030, 30034, 30037, 30042, 30047, - 30051, 30056, 30060, 30065, 30069, 30072, 30077, 17296, 30082, 30087, - 30092, 30100, 21274, 28680, 9026, 30105, 30110, 30114, 30119, 30123, - 30127, 30132, 30136, 30139, 30142, 30146, 30151, 30155, 30163, 30167, - 30170, 30175, 30179, 30183, 30188, 30193, 30197, 30203, 30208, 30213, - 30220, 30227, 30231, 30234, 30240, 30249, 30256, 30264, 30271, 30275, - 30280, 30284, 30288, 30294, 30300, 30304, 30310, 30315, 30320, 30327, - 30333, 30339, 30345, 30351, 30358, 30364, 30370, 30376, 30382, 30388, - 30394, 30400, 30407, 30413, 30420, 30426, 30432, 30438, 30444, 30450, - 30456, 30462, 30468, 30474, 11418, 30480, 30485, 30490, 30493, 30501, - 30506, 30515, 30521, 30526, 30531, 30536, 30540, 30545, 30550, 30555, - 30560, 30565, 30572, 30579, 30585, 30591, 30596, 16297, 30603, 30609, - 30616, 30622, 30628, 30633, 30641, 30646, 16076, 30650, 30655, 30660, - 30666, 30671, 30676, 30680, 30685, 30690, 30696, 30701, 30706, 30710, - 30715, 30720, 30724, 30729, 30734, 30739, 30743, 30748, 30753, 30758, - 30762, 30766, 15287, 30770, 30779, 30785, 30791, 30800, 30808, 30817, - 30825, 30830, 30834, 30841, 30847, 30851, 30854, 30859, 30868, 30876, - 30881, 1495, 30887, 30890, 30894, 22418, 22424, 30900, 30904, 30915, - 30926, 30937, 30949, 30956, 30963, 30968, 30972, 5909, 755, 21273, 30980, - 30985, 30989, 30994, 30998, 31004, 31009, 31015, 31020, 31026, 31031, - 31037, 31042, 31048, 31054, 31060, 31065, 31021, 31027, 31069, 31074, - 31080, 31085, 31091, 31096, 31102, 31107, 31032, 10421, 31111, 31043, - 31049, 31055, 2831, 3423, 31117, 31120, 31126, 31132, 31138, 31145, - 31151, 31157, 31163, 31169, 31175, 31181, 31187, 31193, 31199, 31205, - 31211, 31217, 31224, 31230, 31236, 31242, 31248, 31254, 31257, 31262, - 31265, 31272, 31280, 31285, 31290, 31296, 31301, 31306, 31310, 31315, - 31321, 31326, 31332, 31337, 31343, 31348, 31354, 31360, 31364, 31369, - 31374, 31379, 31384, 31388, 31393, 31398, 31403, 31409, 31415, 31421, - 31427, 31432, 31436, 31439, 31445, 31451, 31460, 31468, 31475, 31480, - 31484, 31488, 31493, 15140, 31498, 31506, 31512, 3683, 1377, 31517, - 31521, 8005, 31527, 31533, 31540, 8014, 31544, 31550, 31557, 31563, - 31572, 31580, 31592, 31596, 31603, 31609, 31613, 31616, 31625, 31633, - 31022, 31638, 31648, 31658, 31668, 31674, 31679, 31689, 31694, 31707, - 31721, 31732, 31744, 31756, 31770, 31783, 31795, 31807, 14594, 31821, - 31826, 31831, 31835, 31839, 31843, 1780, 27166, 31847, 31852, 31070, - 31857, 31860, 31865, 31870, 31875, 31881, 31887, 10098, 31892, 31899, - 15691, 31905, 31910, 31915, 31919, 31924, 31929, 31075, 31934, 31939, - 31944, 31950, 31081, 31955, 31958, 31965, 31973, 31979, 31985, 31991, - 32002, 32007, 32014, 32021, 32028, 32036, 32045, 32054, 32060, 32066, - 32074, 31086, 32079, 32085, 32091, 31092, 32096, 32101, 32109, 32117, - 32123, 32130, 32136, 32143, 32150, 32156, 32164, 32174, 32181, 32186, - 32192, 32197, 32202, 32209, 32218, 32226, 32231, 32237, 32244, 32252, - 32258, 32263, 32269, 32278, 27943, 32285, 32289, 32294, 32303, 32308, - 32313, 32318, 12405, 32326, 32331, 32336, 32341, 32345, 32350, 32355, - 32362, 32367, 32372, 32377, 31097, 21210, 32383, 2519, 244, 32386, 32389, - 32393, 32397, 32407, 32415, 32419, 32426, 32433, 32437, 32440, 32446, - 32454, 32462, 32466, 32470, 32473, 32480, 32484, 32488, 32495, 32503, - 31033, 32510, 32518, 10158, 660, 308, 32530, 32535, 32540, 32546, 32551, - 32556, 3704, 32561, 32564, 32569, 32574, 32579, 32584, 32589, 32596, - 22519, 32601, 32606, 32611, 32616, 32621, 32627, 32632, 32638, 31268, - 32644, 32649, 32655, 32661, 32671, 32676, 32681, 32685, 32690, 32695, - 32700, 32705, 32718, 32723, 22296, 16699, 3710, 32727, 32732, 32737, - 32743, 32748, 32753, 32757, 32762, 32767, 32773, 32778, 32783, 1382, - 32787, 32792, 32797, 32802, 32806, 32811, 32816, 32821, 32827, 32833, - 32838, 32842, 32846, 32851, 32856, 32861, 32865, 32873, 32877, 32883, - 32887, 32894, 16492, 31044, 32900, 32907, 32915, 32922, 32928, 32941, - 32953, 32959, 32963, 2773, 32967, 32971, 32475, 32980, 32991, 32996, - 33001, 33006, 33010, 33015, 22429, 33019, 33023, 33028, 31050, 21294, - 33032, 33037, 33043, 33048, 33052, 33056, 33059, 33063, 33069, 33080, - 33092, 31056, 33097, 33100, 33104, 347, 33109, 33114, 33119, 33124, - 33129, 33134, 33140, 33145, 33150, 33156, 33161, 33167, 33172, 33178, - 33183, 33188, 33193, 33198, 33203, 33208, 33213, 33218, 33224, 33229, - 33234, 33239, 33244, 33249, 33254, 33259, 33265, 33271, 33276, 33281, - 33286, 33291, 33296, 33301, 33306, 33311, 33316, 33321, 33326, 33331, - 33336, 33341, 33346, 33351, 33356, 33361, 33367, 313, 26, 33372, 33376, - 33380, 33388, 33392, 33396, 33399, 33402, 33404, 33409, 33413, 33418, - 33422, 33427, 33431, 33436, 33440, 33443, 33445, 33449, 33454, 33458, - 33469, 33472, 33474, 33478, 33490, 33499, 33503, 33507, 33513, 33518, - 33527, 33533, 33538, 33543, 33547, 33552, 33559, 33564, 33570, 33575, - 33579, 33586, 25708, 25718, 33590, 33595, 33600, 33605, 33612, 33616, - 33623, 8113, 33629, 33638, 33646, 33661, 33675, 33683, 33694, 33703, - 33708, 7227, 33718, 33723, 33728, 33732, 33735, 33739, 33744, 33748, - 33755, 33760, 33765, 8912, 33775, 33777, 33780, 33784, 33790, 33794, - 33799, 33804, 33810, 33815, 33821, 33826, 33836, 33845, 33853, 33858, - 33864, 33869, 33876, 33880, 33888, 33895, 33908, 33916, 33920, 33930, - 33935, 33939, 33947, 33955, 33959, 33968, 33974, 33979, 33987, 33997, - 34006, 34015, 34024, 34035, 34043, 34054, 34063, 34070, 34076, 34081, - 34092, 34097, 34101, 34104, 34108, 34116, 34122, 34130, 34137, 34143, - 34148, 34154, 2418, 34158, 34160, 34165, 34170, 34175, 34178, 34180, - 34184, 34187, 34194, 34198, 9891, 34202, 34208, 34218, 34223, 34229, - 34233, 34238, 34251, 26094, 34257, 34266, 17469, 34273, 34282, 31654, - 34290, 34295, 34299, 34307, 34314, 34319, 34323, 34328, 34332, 34340, - 34346, 34352, 34357, 34361, 34364, 34369, 34382, 34398, 22986, 34415, - 34427, 34444, 34456, 34470, 23003, 23022, 34482, 34494, 2680, 34508, - 34513, 34518, 34523, 34527, 34534, 34546, 34552, 34555, 34566, 34577, - 34582, 32071, 695, 34586, 34590, 34594, 34597, 34602, 34607, 34613, - 34618, 34623, 34629, 34635, 34640, 34644, 34649, 34654, 34659, 34663, - 34666, 34672, 34677, 34682, 34687, 34691, 34696, 34702, 34710, 26327, - 34715, 34720, 34727, 34733, 34739, 34744, 34752, 22528, 34759, 34764, - 34769, 34774, 34778, 34781, 34786, 34790, 34794, 34801, 34807, 34813, - 34819, 34826, 34831, 34837, 33950, 34841, 34845, 34850, 34863, 34868, - 34874, 34882, 34889, 34897, 34907, 34913, 34919, 34925, 34929, 34938, - 34946, 34953, 34958, 34963, 10444, 34968, 34976, 34983, 34989, 34999, - 35004, 35010, 35018, 3608, 35025, 35032, 3614, 35036, 35041, 35052, - 35059, 35065, 35074, 35078, 4015, 35081, 35088, 35094, 35100, 35108, - 35118, 29049, 35125, 35133, 35138, 35144, 35149, 25954, 35155, 35162, - 35168, 35177, 23667, 35184, 35189, 35193, 35201, 35209, 9607, 5895, - 35216, 35220, 35222, 35226, 35231, 35233, 35239, 35244, 35249, 35256, - 32592, 35262, 35267, 35271, 35276, 35280, 35289, 35293, 35299, 35306, - 35312, 35319, 35324, 35333, 35338, 35342, 35347, 35354, 35362, 35370, - 35375, 21350, 35379, 35382, 35386, 35390, 35394, 35397, 35399, 35407, - 35411, 35418, 35422, 35426, 35434, 35441, 35451, 35455, 35459, 35467, - 35475, 35481, 35486, 35495, 13357, 35501, 35510, 35515, 35522, 35530, - 35538, 35546, 35553, 35560, 35567, 35574, 35581, 35586, 35592, 35609, - 35617, 35627, 35635, 35642, 407, 35646, 35652, 35656, 35661, 33699, - 35667, 35670, 35674, 35682, 3619, 35690, 35696, 35702, 35711, 35721, - 35728, 35734, 3625, 3631, 35743, 35750, 35758, 35763, 35767, 35774, - 35782, 35789, 35795, 35804, 35814, 35820, 35828, 35837, 35844, 35852, - 35859, 22026, 35863, 35870, 35876, 35886, 35895, 35906, 35910, 35920, - 35926, 35933, 35941, 35950, 35959, 35969, 35980, 35987, 35992, 35999, - 3029, 36007, 36013, 36018, 36024, 36030, 36035, 36048, 36061, 36074, - 36081, 36087, 36095, 36103, 36108, 36112, 1469, 36116, 36121, 36126, - 36131, 36136, 36142, 36147, 36152, 36157, 36162, 36167, 36172, 36177, - 36183, 36189, 36194, 36199, 36205, 36210, 36215, 36220, 36226, 36231, - 36236, 36241, 36246, 36252, 36257, 36262, 36268, 36273, 36278, 36283, - 36288, 36293, 36299, 36304, 36310, 36315, 36321, 36326, 36331, 36336, - 36342, 36348, 36354, 36360, 36366, 36372, 36378, 36384, 36389, 36394, - 36400, 36405, 36410, 36415, 36420, 36425, 36430, 36435, 36441, 36446, - 36451, 36457, 36463, 101, 36468, 36470, 36474, 36478, 36482, 36487, - 36491, 9528, 36495, 36501, 1741, 6280, 36507, 36510, 36515, 36519, 36524, - 36528, 36532, 36537, 10245, 36541, 36545, 36549, 36553, 15379, 36558, - 36562, 36567, 36572, 36577, 36581, 36588, 26118, 36594, 36597, 36601, - 36606, 36612, 36616, 36624, 36630, 36635, 36639, 36645, 36649, 36653, - 3462, 3467, 29241, 36656, 36660, 36664, 36668, 36676, 36683, 36687, - 36694, 36699, 317, 36704, 36708, 36714, 36726, 36732, 36738, 36742, - 36748, 36757, 36761, 36765, 36770, 36776, 36781, 36785, 36790, 36794, - 36798, 36805, 36811, 36816, 36831, 36846, 36861, 36877, 36895, 10195, - 36909, 36916, 36920, 36923, 36932, 36937, 36941, 36949, 33901, 36957, - 36961, 36971, 36982, 29211, 36995, 36999, 37008, 37016, 9785, 14907, - 37020, 22441, 37023, 30159, 37028, 9784, 37033, 37039, 37044, 37050, - 37055, 37061, 37066, 37072, 37077, 37083, 37089, 37095, 37100, 37056, - 37062, 37067, 37073, 37078, 37084, 37090, 8126, 3874, 37104, 37112, - 37116, 37119, 37123, 37128, 37133, 37139, 37145, 37150, 37154, 25966, - 37158, 37162, 37168, 37172, 9049, 37181, 37188, 37192, 11875, 37199, - 37205, 37210, 37217, 37224, 37231, 28557, 8049, 37238, 37245, 37252, - 37258, 37263, 37270, 37281, 37287, 37292, 37297, 37302, 37309, 37057, - 37313, 37323, 37334, 37340, 37345, 37350, 37355, 37360, 37365, 37369, - 37373, 37379, 37387, 2319, 865, 10261, 10273, 10278, 10284, 37396, 10289, - 10294, 10300, 37401, 37411, 37415, 10305, 37420, 16897, 37423, 37428, - 37432, 37437, 37442, 37449, 37456, 37460, 37463, 37471, 10208, 37478, - 37481, 37487, 37497, 5929, 37506, 37510, 37518, 37522, 37532, 37538, - 37549, 37555, 37561, 37566, 37572, 37578, 37584, 37589, 37592, 37599, - 37605, 37610, 37617, 37624, 37628, 37638, 37651, 37660, 37669, 37680, - 37693, 37704, 37713, 37724, 37729, 37738, 37743, 10310, 37749, 37756, - 37764, 37769, 37773, 37780, 37787, 3829, 16, 37791, 37796, 16751, 37800, - 37803, 37806, 28063, 37810, 28566, 37818, 37822, 37826, 37829, 37835, - 37079, 37841, 37849, 37855, 37862, 28046, 37866, 28240, 37870, 37879, - 37885, 37891, 37896, 37900, 37906, 37910, 37918, 37926, 26184, 37932, - 37939, 37945, 37950, 37955, 37959, 37965, 37970, 37976, 4056, 791, 37983, - 37987, 37990, 15269, 38002, 35833, 38013, 38016, 38023, 38027, 38033, - 38037, 38043, 38048, 38054, 38059, 38064, 38068, 38072, 38077, 38082, - 38092, 38098, 38111, 38117, 38123, 38130, 38135, 38141, 38146, 16637, - 1472, 1019, 31200, 31206, 38151, 31212, 31225, 31231, 31237, 38157, - 31243, 31249, 38163, 38169, 22, 38177, 38184, 38188, 38192, 38200, 31960, - 38204, 38208, 38215, 38220, 38224, 38229, 38235, 38240, 38246, 38251, - 38255, 38259, 38263, 38268, 38272, 38277, 38281, 38288, 38293, 38297, - 38302, 38306, 38311, 38315, 38320, 38326, 15489, 15494, 38331, 38335, - 38338, 38342, 21177, 38347, 38351, 38357, 38364, 38369, 38379, 38384, - 38392, 38396, 38399, 31975, 38403, 4109, 38408, 38413, 38417, 38422, - 38426, 38431, 13375, 38442, 38446, 38449, 38454, 38458, 38462, 38465, - 38469, 8145, 13391, 38472, 38475, 38481, 38486, 38492, 38497, 38503, - 38508, 38514, 38519, 38525, 38531, 38537, 38542, 38546, 38550, 38559, - 38575, 38591, 38601, 27953, 38608, 38612, 38617, 38622, 38626, 38630, - 35954, 38636, 38641, 38645, 38652, 38657, 38661, 38665, 26986, 38671, - 21445, 38676, 38683, 38691, 38697, 38704, 38712, 38718, 38722, 38728, - 38736, 38740, 38749, 9509, 38757, 38761, 38769, 38776, 38781, 38786, - 38790, 38793, 38797, 38800, 38804, 38811, 38816, 38822, 26405, 31263, - 38826, 38833, 38839, 38845, 38850, 38853, 38855, 38862, 38869, 38875, - 38879, 38882, 38886, 38890, 38894, 38899, 38903, 38907, 38910, 38914, - 38928, 23052, 38947, 38960, 38973, 38986, 23070, 39001, 10497, 39016, - 39022, 39026, 39030, 39037, 39042, 39046, 39053, 39059, 39064, 39070, - 39080, 39092, 39103, 39108, 39115, 39119, 39123, 39126, 15885, 3677, - 39134, 15516, 39147, 39154, 39158, 39162, 39167, 39172, 39178, 39182, - 39186, 39189, 7742, 15527, 39194, 39198, 39204, 39213, 39218, 39225, - 35810, 39231, 39236, 39240, 39245, 39252, 39256, 39259, 39263, 39268, - 14559, 39275, 39282, 1072, 39286, 39291, 39296, 39302, 39307, 39312, - 39316, 39326, 39331, 39337, 39342, 39348, 39353, 39359, 39369, 39374, - 39379, 39383, 7229, 7241, 39388, 39391, 39398, 39404, 34066, 34073, - 39413, 39417, 32023, 39425, 39436, 39444, 36002, 39451, 39456, 39461, - 39472, 39479, 39490, 32047, 21451, 39498, 735, 39503, 39509, 28037, - 39515, 39520, 39530, 39539, 39546, 39552, 39556, 39559, 39566, 39572, - 39579, 39585, 39595, 39603, 39609, 39615, 39620, 39624, 39631, 39637, - 39644, 38895, 535, 13812, 39650, 39655, 39658, 39664, 39672, 1396, 39677, - 39681, 39686, 39693, 39699, 39703, 39707, 39712, 39721, 39728, 39738, - 39744, 28081, 39761, 39770, 39778, 39784, 39789, 39796, 39802, 39810, - 39819, 39827, 39831, 39836, 39844, 32056, 39850, 39869, 15818, 39883, - 39899, 39913, 39919, 39924, 39929, 39934, 39940, 32062, 39945, 39952, - 39957, 39961, 345, 2936, 39968, 39973, 39978, 27312, 39799, 39982, 39987, - 39995, 39999, 40002, 40008, 40014, 40018, 28136, 40021, 40026, 40030, - 40033, 40038, 40042, 40047, 40052, 40056, 40061, 40065, 40069, 21173, - 21184, 40073, 40078, 40084, 26943, 40089, 40093, 21260, 16066, 40096, - 40101, 40106, 40111, 40116, 40121, 40126, 40131, 447, 43, 31281, 31286, - 31291, 31297, 31302, 31307, 40136, 31311, 40140, 40144, 40148, 31316, - 31322, 40162, 31333, 31338, 40170, 40175, 31344, 40180, 40185, 40190, - 40195, 40201, 40207, 40213, 31361, 40226, 40232, 31365, 40236, 31370, - 40241, 31375, 31380, 40244, 40249, 40253, 30930, 40259, 13599, 40266, - 40271, 31385, 40275, 40280, 40285, 40290, 40294, 40299, 40304, 40310, - 40315, 40320, 40326, 40332, 40337, 40341, 40346, 40351, 40356, 40360, - 40365, 40370, 40375, 40381, 40387, 40393, 40398, 40402, 40407, 40411, - 31389, 31394, 31399, 40415, 40419, 40423, 31404, 31410, 31416, 31428, - 40435, 26003, 40439, 40443, 40448, 40453, 40458, 40463, 40467, 40471, - 40481, 40486, 40491, 40495, 40499, 40502, 40510, 31476, 40515, 1479, - 40521, 40529, 40538, 40542, 40546, 40554, 40560, 40568, 40584, 40588, - 40592, 40597, 40612, 31513, 1749, 12055, 40616, 1378, 40628, 40629, - 40637, 40644, 40649, 40656, 40661, 9379, 1114, 10332, 40668, 40673, - 40676, 40679, 40688, 1286, 40693, 39043, 40700, 40705, 22493, 2557, - 40709, 10741, 40719, 40725, 2337, 2347, 40734, 40743, 40753, 40764, 3293, - 34219, 10384, 3807, 16675, 1291, 40769, 40777, 40784, 40789, 40793, - 40797, 23865, 10411, 40805, 40814, 40823, 40831, 40838, 40849, 40854, - 40867, 40880, 40892, 40904, 40916, 40929, 40940, 40951, 40961, 40969, - 40977, 40989, 41001, 41012, 41021, 41029, 41036, 41048, 41055, 41064, - 41071, 41084, 41089, 41099, 41104, 41110, 41115, 37189, 41119, 41126, - 41130, 41137, 41145, 2518, 41152, 41163, 41173, 41182, 41190, 41200, - 41208, 41218, 41227, 41232, 41238, 41244, 3709, 41255, 41265, 41274, - 41283, 41293, 41301, 41310, 41315, 41320, 41325, 1705, 37, 41333, 41341, - 41352, 41363, 16350, 41373, 41377, 41384, 41390, 41395, 41399, 41410, - 41420, 41429, 41440, 16724, 16729, 41445, 41454, 41459, 41469, 41474, - 41482, 41490, 41497, 41503, 7078, 228, 41507, 41513, 41518, 41521, 2117, - 39159, 41529, 41533, 41536, 1512, 41542, 13974, 1296, 41547, 41560, - 41574, 2643, 41592, 41604, 41616, 2657, 2674, 41630, 41643, 2689, 41657, - 41669, 2704, 41683, 1302, 1308, 1314, 10659, 41688, 41693, 41698, 41702, - 41717, 41732, 41747, 41762, 41777, 41792, 41807, 41822, 41837, 41852, - 41867, 41882, 41897, 41912, 41927, 41942, 41957, 41972, 41987, 42002, - 42017, 42032, 42047, 42062, 42077, 42092, 42107, 42122, 42137, 42152, - 42167, 42182, 42197, 42212, 42227, 42242, 42257, 42272, 42287, 42302, - 42317, 42332, 42347, 42362, 42377, 42392, 42407, 42422, 42437, 42452, - 42467, 42482, 42497, 42512, 42527, 42542, 42557, 42572, 42587, 42602, - 42617, 42632, 42647, 42662, 42677, 42692, 42707, 42722, 42737, 42752, - 42767, 42782, 42797, 42812, 42827, 42842, 42857, 42872, 42887, 42902, - 42917, 42932, 42947, 42962, 42977, 42992, 43007, 43022, 43037, 43052, - 43067, 43082, 43097, 43112, 43127, 43142, 43157, 43172, 43187, 43202, - 43217, 43232, 43247, 43262, 43277, 43292, 43307, 43322, 43337, 43352, - 43367, 43382, 43397, 43412, 43427, 43442, 43457, 43472, 43487, 43502, - 43517, 43532, 43547, 43562, 43577, 43592, 43607, 43622, 43637, 43652, - 43667, 43682, 43697, 43712, 43727, 43742, 43757, 43772, 43787, 43802, - 43817, 43832, 43847, 43862, 43877, 43892, 43907, 43922, 43937, 43952, - 43967, 43982, 43997, 44012, 44027, 44042, 44057, 44072, 44087, 44102, - 44117, 44132, 44147, 44162, 44177, 44192, 44207, 44222, 44237, 44252, - 44267, 44282, 44297, 44312, 44327, 44342, 44357, 44372, 44387, 44402, - 44417, 44432, 44447, 44462, 44477, 44492, 44507, 44522, 44537, 44552, - 44567, 44582, 44597, 44612, 44627, 44642, 44657, 44672, 44687, 44702, - 44717, 44732, 44747, 44762, 44777, 44792, 44807, 44822, 44837, 44852, - 44867, 44882, 44897, 44912, 44927, 44942, 44957, 44972, 44987, 45002, - 45017, 45032, 45047, 45062, 45077, 45092, 45107, 45122, 45137, 45152, - 45167, 45182, 45197, 45212, 45227, 45242, 45257, 45272, 45287, 45302, - 45317, 45332, 45347, 45362, 45377, 45392, 45407, 45422, 45437, 45452, - 45467, 45482, 45497, 45512, 45527, 45542, 45557, 45572, 45587, 45602, - 45617, 45632, 45647, 45662, 45677, 45692, 45707, 45722, 45737, 45752, - 45767, 45782, 45797, 45812, 45827, 45842, 45857, 45872, 45887, 45902, - 45917, 45932, 45947, 45962, 45977, 45992, 46007, 46022, 46037, 46052, - 46067, 46082, 46097, 46112, 46127, 46142, 46157, 46172, 46187, 46202, - 46217, 46232, 46247, 46262, 46277, 46292, 46307, 46322, 46337, 46352, - 46367, 46382, 46397, 46412, 46427, 46442, 46457, 46472, 46487, 46502, - 46517, 46532, 46547, 46562, 46577, 46592, 46607, 46622, 46637, 46652, - 46667, 46682, 46697, 46712, 46727, 46742, 46757, 46772, 46787, 46802, - 46817, 46832, 46847, 46862, 46877, 46892, 46907, 46922, 46937, 46952, - 46967, 46982, 46997, 47012, 47027, 47042, 47057, 47072, 47087, 47102, - 47117, 47132, 47147, 47162, 47177, 47192, 47207, 47222, 47237, 47252, - 47267, 47282, 47297, 47312, 47327, 47342, 47357, 47372, 47387, 47402, - 47417, 47432, 47447, 47462, 47477, 47492, 47507, 47522, 47537, 47552, - 47567, 47582, 47597, 47612, 47627, 47642, 47657, 47672, 47687, 47702, - 47717, 47732, 47747, 47762, 47777, 47792, 47807, 47822, 47837, 47852, - 47867, 47882, 47897, 47912, 47927, 47942, 47957, 47972, 47987, 48002, - 48017, 48032, 48047, 48062, 48077, 48092, 48107, 48122, 48137, 48152, - 48167, 48182, 48197, 48212, 48227, 48242, 48257, 48272, 48287, 48302, - 48317, 48332, 48347, 48362, 48377, 48392, 48407, 48422, 48437, 48452, - 48467, 48482, 48497, 48512, 48527, 48542, 48557, 48572, 48587, 48602, - 48617, 48632, 48647, 48662, 48677, 48692, 48707, 48722, 48737, 48752, - 48767, 48782, 48797, 48812, 48827, 48842, 48857, 48872, 48887, 48902, - 48917, 48932, 48947, 48962, 48977, 48992, 49007, 49022, 49037, 49052, - 49067, 49082, 49097, 49112, 49127, 49142, 49157, 49172, 49187, 49202, - 49217, 49232, 49247, 49262, 49277, 49292, 49307, 49322, 49337, 49352, - 49367, 49382, 49397, 49412, 49427, 49442, 49457, 49472, 49487, 49502, - 49518, 49534, 49550, 49566, 49582, 49598, 49614, 49630, 49646, 49662, - 49678, 49694, 49710, 49726, 49742, 49758, 49774, 49790, 49806, 49822, - 49838, 49854, 49870, 49886, 49902, 49918, 49934, 49950, 49966, 49982, - 49998, 50014, 50030, 50046, 50062, 50078, 50094, 50110, 50126, 50142, - 50158, 50174, 50190, 50206, 50222, 50238, 50254, 50270, 50286, 50302, - 50318, 50334, 50350, 50366, 50382, 50398, 50414, 50430, 50446, 50462, - 50478, 50494, 50510, 50526, 50542, 50558, 50574, 50590, 50606, 50622, - 50638, 50654, 50670, 50686, 50702, 50718, 50734, 50750, 50766, 50782, - 50798, 50814, 50830, 50846, 50862, 50878, 50894, 50910, 50926, 50942, - 50958, 50974, 50990, 51006, 51022, 51038, 51054, 51070, 51086, 51102, - 51118, 51134, 51150, 51166, 51182, 51198, 51214, 51230, 51246, 51262, - 51278, 51294, 51310, 51326, 51342, 51358, 51374, 51390, 51406, 51422, - 51438, 51454, 51470, 51486, 51502, 51518, 51534, 51550, 51566, 51582, - 51598, 51614, 51630, 51646, 51662, 51678, 51694, 51710, 51726, 51742, - 51758, 51774, 51790, 51806, 51822, 51838, 51854, 51870, 51886, 51902, - 51918, 51934, 51950, 51966, 51982, 51998, 52014, 52030, 52046, 52062, - 52078, 52094, 52110, 52126, 52142, 52158, 52174, 52190, 52206, 52222, - 52238, 52254, 52270, 52286, 52302, 52318, 52334, 52350, 52366, 52382, - 52398, 52414, 52430, 52446, 52462, 52478, 52494, 52510, 52526, 52542, - 52558, 52574, 52590, 52606, 52622, 52638, 52654, 52670, 52686, 52702, - 52718, 52734, 52750, 52766, 52782, 52798, 52814, 52830, 52846, 52862, - 52878, 52894, 52910, 52926, 52942, 52958, 52974, 52990, 53006, 53022, - 53038, 53054, 53070, 53086, 53102, 53118, 53134, 53150, 53166, 53182, - 53198, 53214, 53230, 53246, 53262, 53278, 53294, 53310, 53326, 53342, - 53358, 53374, 53390, 53406, 53422, 53438, 53454, 53470, 53486, 53502, - 53518, 53534, 53550, 53566, 53582, 53598, 53614, 53630, 53646, 53662, - 53678, 53694, 53710, 53726, 53742, 53758, 53774, 53790, 53806, 53822, - 53838, 53854, 53870, 53886, 53902, 53918, 53934, 53950, 53966, 53982, - 53998, 54014, 54030, 54046, 54062, 54078, 54094, 54110, 54126, 54142, - 54158, 54174, 54190, 54206, 54222, 54238, 54254, 54270, 54286, 54302, - 54318, 54334, 54350, 54366, 54382, 54398, 54414, 54430, 54446, 54462, - 54478, 54494, 54510, 54526, 54542, 54558, 54574, 54590, 54606, 54622, - 54638, 54654, 54670, 54686, 54702, 54718, 54734, 54750, 54766, 54782, - 54798, 54814, 54830, 54846, 54862, 54878, 54894, 54910, 54926, 54942, - 54958, 54974, 54990, 55006, 55022, 55038, 55054, 55070, 55086, 55102, - 55118, 55134, 55150, 55166, 55182, 55198, 55214, 55230, 55246, 55262, - 55278, 55294, 55310, 55326, 55342, 55358, 55374, 55390, 55406, 55422, - 55438, 55454, 55470, 55486, 55502, 55518, 55534, 55550, 55566, 55582, - 55598, 55614, 55630, 55646, 55662, 55678, 55694, 55710, 55726, 55742, - 55758, 55774, 55790, 55806, 55822, 55838, 55854, 55870, 55886, 55902, - 55918, 55934, 55950, 55966, 55982, 55998, 56014, 56030, 56046, 56062, - 56078, 56094, 56110, 56126, 56142, 56158, 56174, 56190, 56206, 56222, - 56238, 56254, 56270, 56286, 56302, 56318, 56334, 56350, 56366, 56382, - 56398, 56414, 56430, 56446, 56462, 56478, 56494, 56510, 56526, 56542, - 56558, 56574, 56590, 56606, 56622, 56638, 56654, 56670, 56686, 56702, - 56718, 56734, 56750, 56766, 56782, 56798, 56814, 56830, 56846, 56862, - 56878, 56894, 56910, 56926, 56942, 56958, 56974, 56990, 57006, 57022, - 57038, 57054, 57070, 57086, 57102, 57118, 57134, 57150, 57166, 57182, - 57198, 57214, 57230, 57246, 57262, 57278, 57294, 57310, 57326, 57342, - 57358, 57374, 57390, 57406, 57422, 57438, 57454, 57470, 57486, 57502, - 57518, 57534, 57550, 57566, 57582, 57598, 57614, 57630, 57646, 57662, - 57678, 57694, 57710, 57726, 57742, 57758, 57774, 57790, 57806, 57822, - 57838, 57854, 57870, 57886, 57902, 57918, 57934, 57950, 57966, 57982, - 57998, 58014, 58030, 58046, 58062, 58078, 58094, 58110, 58126, 58142, - 58158, 58174, 58189, 16756, 58198, 58204, 58210, 58220, 58228, 14888, - 15439, 9960, 58241, 1520, 58249, 3761, 27422, 7183, 58255, 58260, 58265, - 58270, 58275, 58281, 58286, 58292, 58297, 58303, 58308, 58313, 58318, - 58323, 58329, 58334, 58339, 58344, 58349, 58354, 58359, 58364, 58370, - 58375, 58381, 58388, 2561, 58393, 58399, 8526, 58403, 58408, 58415, - 58423, 40, 58427, 58433, 58438, 58443, 58447, 58452, 58456, 58460, 10684, - 58464, 58474, 58487, 58498, 58511, 58518, 58524, 58529, 58535, 58541, - 58547, 58552, 58557, 58562, 58567, 58571, 58576, 58581, 58586, 58592, - 58598, 58604, 58609, 58613, 58618, 58623, 58627, 58632, 58637, 58642, - 58646, 10700, 10711, 10716, 1563, 58650, 1568, 58656, 16233, 58659, - 58665, 1599, 58671, 1605, 1611, 10746, 58676, 58684, 58691, 58695, 58701, - 58706, 30959, 58711, 58718, 58723, 58727, 58731, 1616, 16325, 58740, - 58744, 16336, 1120, 58748, 58755, 58760, 58764, 16361, 1620, 37328, - 58767, 58772, 58782, 58791, 58796, 58800, 58806, 1625, 39237, 58811, - 58820, 58826, 58831, 10904, 10910, 58837, 58849, 58866, 58883, 58900, - 58917, 58934, 58951, 58968, 58985, 59002, 59019, 59036, 59053, 59070, - 59087, 59104, 59121, 59138, 59155, 59172, 59189, 59206, 59223, 59240, - 59257, 59274, 59291, 59308, 59325, 59342, 59359, 59376, 59393, 59410, - 59427, 59444, 59461, 59478, 59495, 59512, 59529, 59546, 59563, 59580, - 59597, 59614, 59631, 59648, 59665, 59682, 59693, 59698, 1630, 59702, - 59708, 59713, 59718, 9326, 1635, 59724, 59733, 27717, 59738, 59749, - 59759, 59764, 59771, 59777, 59782, 59787, 16613, 59791, 10921, 1640, - 10926, 59797, 59802, 59808, 59813, 59818, 59823, 59828, 59833, 59838, - 59843, 59849, 59855, 59861, 59866, 59870, 59875, 59880, 59884, 59889, - 59894, 59899, 59903, 59908, 59914, 59919, 59924, 59928, 59933, 59938, - 59944, 59949, 59954, 59960, 59966, 59971, 59975, 59980, 59985, 59990, - 59994, 59999, 60004, 60009, 60015, 60021, 60026, 60030, 60034, 60039, - 60044, 60049, 29115, 60053, 60058, 60063, 60069, 60074, 60079, 60083, - 60088, 60093, 60099, 60104, 60109, 60115, 60121, 60126, 60130, 60135, - 60140, 60144, 60149, 60154, 60159, 60165, 60171, 60176, 60180, 60185, - 60190, 60194, 60199, 60204, 60209, 60213, 60216, 31621, 60221, 60229, - 16679, 3663, 11017, 60235, 60245, 60260, 11022, 60271, 60276, 60287, - 60299, 60311, 60323, 2695, 60335, 60340, 60352, 60356, 60362, 60368, - 60373, 1652, 1073, 60382, 60387, 39287, 60391, 60395, 60400, 60404, - 16764, 60409, 60412, 60420, 60428, 1656, 11047, 11053, 1661, 60436, - 60443, 60448, 60457, 60467, 60474, 60479, 60484, 1666, 60491, 60496, - 16879, 60500, 60505, 60512, 60518, 60522, 60533, 60543, 16901, 9234, - 9241, 1671, 60550, 60556, 60564, 60571, 60577, 60584, 60596, 60602, - 60607, 60619, 60630, 60639, 60649, 3740, 30795, 30804, 16941, 1676, 1680, - 60657, 60668, 60673, 1683, 60681, 60686, 16992, 60698, 60704, 60709, - 60717, 1688, 60722, 60727, 60735, 60743, 60750, 60759, 60767, 60776, - 1693, 60780, 1698, 60785, 60792, 17066, 60800, 60806, 60811, 60819, - 60826, 60834, 22564, 60839, 11182, 60848, 60854, 60861, 60868, 60874, - 60884, 60890, 60895, 60906, 60911, 60919, 11191, 11196, 60927, 60933, - 60941, 3805, 17108, 39375, 60946, 60952, 60957, 60965, 60972, 12036, - 60977, 60983, 1709, 60988, 60991, 1127, 60997, 61002, 61007, 61013, - 61018, 61023, 61028, 61033, 61038, 61043, 1718, 9, 61049, 61053, 61058, - 61062, 61066, 61070, 31861, 61075, 61080, 61085, 61089, 61092, 61096, - 61100, 61105, 61109, 61114, 61118, 34598, 34603, 34608, 61121, 61128, - 61134, 39096, 61144, 34614, 32119, 31876, 31882, 34630, 31888, 61149, - 61154, 32152, 61158, 61161, 61165, 61172, 61175, 61180, 61184, 61188, - 61191, 61201, 61213, 61220, 61226, 61233, 33555, 61236, 8543, 877, 61239, - 61243, 61248, 3690, 61252, 61255, 13632, 61262, 61269, 61282, 61290, - 61299, 61308, 61313, 61323, 61336, 61348, 61355, 61360, 61369, 61382, - 36042, 61400, 61405, 61412, 61418, 652, 61423, 61431, 61438, 27261, 627, - 61444, 61450, 61460, 61466, 61471, 31906, 6003, 31920, 61475, 61485, - 61490, 61500, 61515, 61521, 61527, 31930, 61532, 31076, 61536, 61541, - 61546, 61550, 61555, 16944, 61562, 61567, 61571, 6044, 31956, 61575, - 61581, 312, 61591, 61598, 61605, 61610, 61619, 58776, 61625, 61633, - 61637, 61641, 61645, 61649, 61654, 61658, 61664, 61672, 61677, 61682, - 61686, 61691, 61695, 61699, 61705, 61711, 61716, 61720, 32080, 61725, - 32086, 32092, 61730, 61736, 61743, 61748, 61752, 31093, 16606, 61755, - 61759, 61764, 61771, 61777, 61781, 61786, 38806, 61792, 61796, 61800, - 61805, 61811, 61817, 61829, 61838, 61848, 61854, 61861, 61866, 61871, - 61875, 61878, 61884, 61891, 61896, 61901, 61908, 61915, 61921, 61926, - 61931, 61939, 32097, 2423, 61944, 61949, 61955, 61960, 61966, 61971, - 61976, 61981, 61987, 32118, 61992, 61998, 62004, 62010, 32182, 62015, - 62020, 62025, 32193, 62030, 62035, 62040, 62046, 62052, 32198, 62057, - 62062, 62067, 32253, 32259, 62072, 62077, 32264, 62082, 27944, 32286, - 32290, 62087, 62063, 62091, 62099, 62105, 62113, 62120, 62126, 62136, - 62142, 62149, 10631, 32304, 62155, 62168, 62177, 62183, 62192, 62198, - 23502, 62205, 62212, 62222, 32254, 62225, 62232, 62237, 62241, 62245, - 62250, 6120, 62254, 62259, 62264, 34692, 34697, 62268, 34711, 62273, - 34716, 62278, 62284, 34728, 34734, 34740, 62289, 62295, 22529, 62306, - 62309, 62321, 62329, 32327, 62333, 62342, 62352, 62361, 32337, 62366, - 62373, 62382, 62388, 62396, 62403, 6095, 4397, 62408, 32265, 62414, - 62417, 62423, 62430, 62435, 62440, 23412, 62444, 62450, 62456, 62461, - 62466, 62470, 62476, 62482, 33465, 863, 35705, 36626, 36632, 32373, - 62487, 62491, 62495, 62498, 62511, 62517, 62521, 62524, 62529, 33768, - 62533, 31098, 21281, 62539, 6024, 6032, 9075, 62542, 62547, 62552, 62557, - 62562, 62567, 62572, 62577, 62582, 62587, 62593, 62598, 62603, 62609, - 62614, 62619, 62624, 62629, 62634, 62639, 62645, 62650, 62656, 62661, - 62666, 62671, 62676, 62681, 62686, 62691, 62696, 62701, 62706, 62712, - 62717, 62722, 62727, 62732, 62737, 62742, 62748, 62753, 62758, 62763, - 62768, 62773, 62778, 62783, 62788, 62793, 62799, 62804, 62809, 62814, - 62819, 62825, 62831, 62836, 62842, 62847, 62852, 62857, 62862, 62867, - 1513, 245, 62872, 62876, 62880, 62884, 25123, 62888, 62892, 62897, 62901, - 62906, 62910, 62915, 62920, 62925, 62929, 62933, 62938, 62942, 13369, - 62947, 62951, 62958, 62968, 15200, 62977, 62986, 62990, 62995, 63000, - 63004, 24914, 3019, 63008, 17357, 63014, 63023, 63031, 63037, 63049, - 63061, 63065, 63070, 63074, 63080, 63086, 63091, 63101, 63111, 63117, - 63122, 63126, 63131, 63137, 63146, 63155, 63163, 15554, 63167, 63176, - 63184, 63196, 63207, 63218, 63227, 63231, 63240, 63250, 63258, 63264, - 63269, 63275, 63280, 98, 30907, 63291, 26256, 26266, 63297, 63304, 63310, - 63314, 63324, 63335, 63343, 63352, 63357, 63362, 63366, 17311, 63374, - 63378, 63384, 63394, 63401, 63407, 34791, 63413, 63415, 63418, 63422, - 63432, 63438, 63445, 13315, 63452, 63458, 63467, 63476, 63482, 63488, - 63494, 63499, 63506, 63513, 63519, 63532, 63541, 63550, 63555, 63559, - 63565, 63572, 63579, 63586, 63593, 63600, 63605, 63609, 63613, 63616, - 63626, 63630, 63642, 63651, 63655, 63660, 63664, 63670, 63675, 63682, - 63691, 63699, 63707, 63712, 63716, 63721, 63726, 63736, 63744, 63749, - 63753, 63757, 63763, 63775, 63783, 63793, 63800, 63806, 63811, 63815, - 63819, 63823, 63832, 63841, 63850, 63856, 63862, 63868, 63873, 63880, - 63886, 63894, 63901, 12463, 63907, 63913, 63917, 14238, 63921, 63926, - 63936, 63945, 63951, 63957, 63965, 63972, 63976, 63980, 63986, 63994, - 64001, 64007, 64018, 64022, 64026, 64030, 64033, 64039, 64044, 64048, - 64052, 64061, 64069, 64076, 64082, 64089, 24036, 38848, 64094, 64102, - 64106, 64110, 64113, 64121, 64128, 64134, 64143, 64151, 64157, 64162, - 64166, 64171, 64175, 64179, 64184, 64193, 64197, 64204, 64211, 64217, - 64225, 64231, 64242, 64250, 64256, 22659, 64265, 64272, 64279, 64286, - 64293, 64300, 41877, 13153, 64307, 64314, 64319, 34827, 6217, 64325, - 64330, 64335, 64341, 64347, 64353, 64358, 64363, 64368, 64373, 64379, - 64384, 64390, 64395, 64401, 64406, 64411, 64416, 64421, 64426, 64431, - 64436, 64442, 64447, 64453, 64458, 64463, 64468, 64473, 64478, 64483, - 64489, 64494, 64499, 64504, 64509, 64514, 64519, 64524, 64529, 64534, - 64539, 64545, 64550, 64555, 64560, 64565, 64570, 64575, 64580, 64585, - 64591, 64596, 64601, 64606, 64611, 64616, 64621, 64626, 64631, 64636, - 64641, 64646, 64651, 64657, 1834, 224, 37424, 64662, 64665, 64670, 64674, - 64677, 64682, 63703, 64693, 64703, 64710, 64726, 64735, 64745, 64755, - 64763, 64777, 64785, 64789, 64792, 64799, 64805, 64816, 64828, 64839, - 64848, 64855, 1297, 23301, 64865, 2590, 64869, 64878, 1133, 17284, 38061, - 64886, 64894, 64908, 64921, 64925, 64930, 64935, 64940, 64946, 64952, - 64957, 8535, 64962, 64966, 64974, 11048, 64979, 64985, 64994, 1721, - 11060, 736, 64998, 65007, 65017, 27020, 65026, 65032, 16856, 65038, - 65042, 3964, 11391, 65048, 65055, 60663, 65059, 65063, 3988, 189, 14153, - 65069, 65081, 65085, 65091, 27737, 65095, 11379, 2730, 4, 65100, 65110, - 65116, 65127, 65134, 65140, 65146, 65154, 65161, 65167, 65177, 65187, - 65197, 23489, 1309, 65206, 65210, 65214, 65220, 65224, 2753, 2759, 8532, - 2264, 65228, 65232, 65241, 65249, 65260, 65268, 65276, 65282, 65287, - 65298, 65309, 65317, 65323, 9694, 65328, 65336, 65340, 65344, 65348, - 65360, 28122, 65367, 65377, 65383, 65389, 9796, 65399, 65410, 65420, - 65429, 65433, 65440, 1135, 1170, 65450, 65455, 65463, 65471, 65482, - 65489, 65503, 14082, 393, 65513, 65517, 65525, 65534, 65542, 65548, - 65562, 65569, 65575, 65584, 65591, 65601, 65609, 3812, 156, 65617, 65628, - 65632, 65644, 27935, 161, 65650, 65655, 65659, 65666, 65672, 65680, - 65687, 8818, 65694, 65703, 65711, 3878, 65724, 8199, 65728, 2798, 450, - 65733, 65746, 65751, 1833, 668, 65755, 3895, 65763, 65769, 65773, 931, - 65783, 65792, 65797, 14922, 14929, 45239, 65801, 3822, 13041, 65809, - 65816, 23545, 65820, 65827, 65833, 65838, 65843, 14942, 372, 65848, - 65860, 65866, 65874, 2810, 1753, 65882, 65884, 65889, 65894, 65899, - 65905, 65910, 65915, 65920, 65925, 65930, 65935, 65941, 65946, 65951, - 65956, 65961, 65966, 65971, 65976, 65981, 65987, 65992, 65997, 66002, - 66008, 66013, 66019, 66024, 66029, 66034, 66039, 66044, 66049, 66054, - 66060, 66065, 66071, 66076, 66081, 66086, 66091, 66096, 66101, 66106, - 66111, 66117, 66122, 66127, 66132, 66136, 66140, 66145, 66149, 66154, - 66159, 66165, 66170, 66174, 66179, 66183, 66186, 66188, 66192, 66195, - 66200, 66204, 66208, 66212, 66216, 66225, 66229, 32531, 66232, 32536, - 66239, 66244, 32541, 66253, 66262, 32547, 66267, 32552, 66276, 66281, - 11578, 66285, 66290, 66295, 32557, 66299, 40203, 66303, 66306, 66310, - 8211, 66316, 66321, 66325, 3705, 32562, 66328, 66332, 66335, 66340, - 66344, 66350, 66358, 66371, 66380, 66386, 66391, 66397, 66401, 66407, - 66415, 66420, 66424, 66431, 66437, 66445, 66454, 66462, 32565, 66469, - 66479, 66488, 66501, 66506, 66511, 66520, 66526, 66533, 66544, 66556, - 66563, 66572, 66581, 66590, 66597, 66603, 66610, 66618, 66625, 66633, - 66642, 66650, 66657, 66665, 66674, 66682, 66691, 66701, 66710, 66718, - 66725, 66733, 66742, 66750, 66759, 66769, 66778, 66786, 66795, 66805, - 66814, 66824, 66835, 66845, 66854, 66862, 66869, 66877, 66886, 66894, - 66903, 66913, 66922, 66930, 66939, 66949, 66958, 66968, 66979, 66989, - 66998, 67006, 67015, 67025, 67034, 67044, 67055, 67065, 67074, 67084, - 67095, 67105, 67116, 67128, 67139, 67149, 67158, 67166, 67173, 67181, - 67190, 67198, 67207, 67217, 67226, 67234, 67243, 67253, 67262, 67272, - 67283, 67293, 67302, 67310, 67319, 67329, 67338, 67348, 67359, 67369, - 67378, 67388, 67399, 67409, 67420, 67432, 67443, 67453, 67462, 67470, - 67479, 67489, 67498, 67508, 67519, 67529, 67538, 67548, 67559, 67569, - 67580, 67592, 67603, 67613, 67622, 67632, 67643, 67653, 67664, 67676, - 67687, 67697, 67708, 67720, 67731, 67743, 67756, 67768, 67779, 67789, - 67798, 67806, 67813, 67821, 67830, 67838, 67847, 67857, 67866, 67874, - 67883, 67893, 67902, 67912, 67923, 67933, 67942, 67950, 67959, 67969, - 67978, 67988, 67999, 68009, 68018, 68028, 68039, 68049, 68060, 68072, - 68083, 68093, 68102, 68110, 68119, 68129, 68138, 68148, 68159, 68169, - 68178, 68188, 68199, 68209, 68220, 68232, 68243, 68253, 68262, 68272, - 68283, 68293, 68304, 68316, 68327, 68337, 68348, 68360, 68371, 68383, - 68396, 68408, 68419, 68429, 68438, 68446, 68455, 68465, 68474, 68484, - 68495, 68505, 68514, 68524, 68535, 68545, 68556, 68568, 68579, 68589, - 68598, 68608, 68619, 68629, 68640, 68652, 68663, 68673, 68684, 68696, - 68707, 68719, 68732, 68744, 68755, 68765, 68774, 68784, 68795, 68805, - 68816, 68828, 68839, 68849, 68860, 68872, 68883, 68895, 68908, 68920, - 68931, 68941, 68952, 68964, 68975, 68987, 69000, 69012, 69023, 69035, - 69048, 69060, 69073, 69087, 69100, 69112, 69123, 69133, 69142, 69150, - 69157, 69162, 8058, 69169, 32575, 69174, 69179, 32580, 69185, 20923, - 32585, 69190, 69196, 69204, 69210, 69216, 69223, 69230, 69235, 69239, - 69242, 69246, 69255, 69261, 69273, 69284, 69288, 3081, 8033, 69293, - 69296, 69298, 69302, 69306, 69310, 69316, 69321, 25934, 69326, 69330, - 69333, 69338, 69342, 69349, 69355, 69359, 6170, 69363, 32602, 69368, - 69375, 69384, 69392, 69403, 69411, 69419, 69426, 69433, 69439, 69450, - 32607, 69455, 69466, 69478, 69486, 69497, 69506, 69517, 69522, 69530, - 2556, 69535, 34277, 69548, 69552, 69564, 69572, 69577, 69585, 17479, - 69596, 69602, 69609, 69617, 69623, 32617, 69628, 3914, 58224, 69635, - 69638, 69646, 69659, 69672, 69685, 69698, 69705, 69716, 69725, 41694, - 41699, 69730, 69734, 69742, 69749, 69758, 69766, 69772, 69781, 69789, - 69797, 69801, 69810, 69819, 69829, 69842, 69855, 69865, 32622, 69871, - 69878, 69884, 32628, 69889, 69892, 69896, 69904, 69913, 41432, 69921, - 69930, 69938, 69945, 69953, 69963, 69972, 69981, 69990, 69998, 70009, - 70019, 9366, 21561, 70028, 70033, 70038, 70042, 70046, 70051, 70057, - 70062, 70067, 70073, 70078, 70083, 21526, 70088, 70095, 70103, 70111, - 70116, 70123, 70130, 70135, 70139, 70143, 70151, 70159, 32645, 70165, - 70171, 70183, 70189, 70193, 70200, 70205, 70216, 70226, 70236, 70248, - 70254, 70264, 70274, 32672, 70283, 70292, 70298, 70310, 70321, 70328, - 70333, 70337, 70345, 70351, 70356, 70361, 70368, 70376, 70388, 70398, - 70407, 70416, 70423, 34139, 23841, 70429, 70434, 70438, 70442, 70447, - 70453, 70464, 70477, 70482, 70489, 32677, 70494, 70506, 70515, 70525, - 70536, 70549, 70556, 70565, 70574, 70582, 70587, 70593, 1064, 70598, - 70603, 70608, 70613, 70619, 70624, 70629, 70635, 70641, 70646, 70650, - 70655, 70660, 70665, 58736, 70670, 70675, 70680, 70685, 70691, 70697, - 70702, 70706, 70711, 70716, 70721, 70727, 70732, 70738, 70743, 70748, - 70753, 70758, 70762, 70768, 70773, 70782, 70787, 70792, 70797, 70802, - 70806, 70813, 70819, 17129, 17136, 70824, 70828, 70832, 70836, 70840, - 45494, 70844, 70774, 70846, 70856, 32686, 70859, 70868, 70874, 6143, - 32691, 70878, 70884, 70889, 70895, 70900, 70904, 70911, 70916, 70926, - 70935, 70939, 70945, 70951, 70957, 70961, 70969, 70976, 70984, 70992, - 32696, 70999, 71002, 71009, 71015, 71020, 71024, 71030, 71037, 71042, - 71046, 71055, 71063, 71069, 71074, 32701, 71081, 71088, 71094, 71099, - 71105, 71112, 71118, 21288, 27445, 71124, 71129, 71135, 71147, 70807, - 70814, 21464, 71157, 71162, 71169, 71175, 71182, 71188, 71199, 71204, - 9110, 71212, 71215, 71221, 71225, 71229, 71232, 71238, 32450, 6194, 964, - 13419, 71245, 71251, 71257, 71263, 71269, 71275, 71281, 71287, 71293, - 71298, 71303, 71308, 71313, 71318, 71323, 71328, 71333, 71338, 71343, - 71348, 71353, 71358, 71364, 71369, 71374, 71380, 71385, 71390, 71396, - 71402, 71408, 71414, 71420, 71426, 71432, 71438, 71444, 71449, 71454, - 71460, 71465, 71470, 71476, 71481, 71486, 71491, 71496, 71501, 71506, - 71511, 71516, 71521, 71526, 71531, 71536, 71542, 71547, 71552, 71557, - 71563, 71568, 71573, 71578, 71583, 71589, 71594, 71599, 71604, 71609, - 71614, 71619, 71624, 71629, 71634, 71639, 71644, 71649, 71654, 71659, - 71664, 71669, 71674, 71679, 71684, 71690, 71695, 71700, 71705, 71710, - 71715, 71720, 71725, 1864, 142, 71730, 71734, 71738, 71743, 71751, 71755, - 71762, 71770, 71774, 71787, 71795, 71799, 71802, 71807, 71811, 71816, - 71820, 71828, 71832, 20931, 71837, 71841, 60937, 71845, 71848, 71856, - 71864, 71872, 71877, 71884, 71890, 71896, 71901, 71908, 71913, 71921, - 64913, 71928, 71933, 71938, 71942, 11645, 71946, 71951, 71956, 71960, - 71963, 71969, 71973, 71983, 71992, 71995, 71999, 72006, 72019, 72025, - 72033, 72044, 72055, 72066, 72077, 72086, 72092, 72101, 72109, 72119, - 72132, 72139, 72150, 72156, 72161, 72166, 72172, 72178, 72188, 72197, - 70496, 72205, 72211, 72219, 72225, 72233, 72236, 72240, 72244, 72247, - 72253, 72259, 72267, 72279, 72291, 72298, 72302, 72313, 72321, 72328, - 72340, 72348, 72356, 72363, 72369, 72379, 72388, 72393, 72403, 72412, - 40758, 72419, 72423, 72428, 72436, 72443, 72449, 72453, 72463, 72474, - 72482, 72489, 72501, 72513, 72522, 69538, 72529, 72540, 72554, 72562, - 72572, 72579, 72587, 72599, 72608, 72616, 72626, 72637, 72649, 72658, - 72668, 72675, 72684, 72699, 72707, 72717, 72726, 72734, 72747, 72762, - 72766, 72775, 72787, 72798, 72809, 72820, 72830, 72841, 72849, 72855, - 72865, 72873, 72879, 29014, 72884, 72890, 72895, 72902, 9708, 17499, - 72908, 72917, 72922, 72926, 72933, 72939, 72944, 72949, 72957, 72965, - 72969, 72972, 72975, 72977, 72984, 72990, 73001, 73006, 73010, 73017, - 73023, 73028, 73036, 65412, 65422, 73042, 73049, 73059, 10618, 73066, - 73071, 29210, 73080, 73085, 73092, 73102, 73110, 73118, 73127, 73133, - 73139, 73146, 73153, 73158, 73162, 73170, 73175, 73180, 73188, 73195, - 73200, 73206, 73209, 73213, 73222, 71782, 73231, 73235, 73241, 73252, - 73262, 17508, 73273, 73281, 17520, 73288, 73292, 73301, 27331, 73308, - 73312, 73317, 73334, 73346, 10576, 73358, 73363, 73368, 73373, 21004, - 73377, 73382, 73387, 73393, 73398, 5846, 21008, 73403, 73408, 73414, - 73421, 73426, 73431, 73437, 73443, 73449, 73454, 73460, 73464, 73478, - 73486, 73494, 73500, 73505, 73512, 73522, 73531, 73536, 73541, 73549, - 73554, 73560, 73565, 73574, 59793, 73579, 73582, 73600, 73619, 73632, - 73646, 73662, 73669, 73676, 73682, 73689, 73694, 73700, 73706, 73714, - 73720, 73725, 73730, 73746, 10589, 73760, 73767, 73775, 73781, 73785, - 73788, 73793, 73798, 73805, 73810, 73819, 73824, 73830, 73839, 73848, - 73853, 73857, 73865, 73874, 11674, 73883, 73891, 73896, 73902, 11685, - 73907, 73910, 73915, 73925, 73934, 73939, 73945, 73950, 73958, 73965, - 73976, 73986, 73991, 64841, 73996, 74002, 74007, 74014, 74023, 74031, - 74037, 74043, 74050, 74056, 74060, 16954, 3055, 74065, 74069, 74073, - 74079, 74088, 74094, 74101, 74105, 74126, 74148, 74164, 74181, 74200, - 74209, 74219, 74226, 74233, 27218, 74239, 74243, 74251, 74263, 74269, - 74277, 74281, 74289, 74296, 74300, 74306, 74312, 74317, 3563, 41894, - 74323, 74327, 74331, 74335, 74340, 74345, 74350, 74356, 74362, 74368, - 74375, 74381, 74388, 74394, 74400, 74405, 74411, 74416, 74420, 74425, - 74429, 74434, 41909, 74438, 74443, 74451, 74455, 74460, 74467, 74476, - 74482, 74486, 74493, 74497, 74500, 74507, 74516, 74521, 74525, 74533, - 74542, 74546, 74554, 74560, 74565, 74570, 74576, 74582, 74587, 74591, - 74597, 74602, 74606, 74610, 74613, 74618, 74626, 74636, 74641, 39394, - 74649, 74661, 74665, 74671, 74683, 74694, 74701, 74707, 74714, 74726, - 74733, 74739, 21082, 74743, 74749, 74756, 74762, 74768, 74773, 74778, - 74783, 74792, 7033, 74797, 16420, 74803, 74807, 74811, 74815, 74823, - 74832, 74836, 74843, 74852, 74865, 74871, 74430, 30074, 74876, 74878, - 74883, 74888, 74893, 74898, 74903, 74908, 74913, 74918, 74923, 74928, - 74933, 74938, 74943, 74948, 74954, 74959, 74964, 74969, 74974, 74979, - 74984, 74989, 74994, 75000, 75006, 75012, 75017, 75022, 75034, 75039, - 1870, 49, 75044, 75049, 32728, 75053, 32733, 32738, 32744, 32749, 75057, - 32754, 22077, 75079, 75083, 75087, 75092, 75096, 32758, 75100, 75108, - 32763, 75115, 75118, 75123, 75127, 9543, 75136, 32768, 21939, 75139, - 75143, 1428, 75148, 32779, 75151, 75156, 25727, 25737, 35240, 75161, - 75166, 75171, 75176, 75182, 75187, 75196, 75201, 75208, 75214, 75219, - 75224, 75229, 75239, 75248, 75253, 75261, 75265, 75273, 32593, 37295, - 75280, 75286, 75291, 75296, 12016, 75301, 75307, 75312, 75319, 75325, - 75330, 75338, 75348, 75358, 75364, 75369, 75375, 17530, 75382, 36055, - 75395, 75400, 75406, 30975, 75419, 75425, 75429, 75438, 75445, 75451, - 75459, 75468, 75475, 75481, 75484, 75488, 25868, 75492, 75499, 75505, - 75513, 75518, 23984, 75524, 75527, 75535, 75543, 75557, 75564, 75570, - 75577, 75583, 32793, 75587, 75594, 75602, 75610, 75616, 32798, 75624, - 75630, 75635, 75645, 75651, 75660, 30812, 34698, 75668, 75673, 75678, - 75682, 75687, 75691, 75699, 14914, 39407, 75704, 75709, 32803, 62239, - 75713, 75718, 75722, 75731, 75739, 75745, 75750, 75756, 75763, 75769, - 75774, 75779, 75788, 75800, 75815, 33065, 75821, 16539, 32807, 75825, - 75832, 24094, 75838, 75845, 75854, 75861, 75870, 75876, 75881, 75889, - 75895, 32817, 75900, 75909, 74689, 75918, 75925, 75931, 75937, 75947, - 75955, 75962, 75966, 32822, 75969, 32828, 32834, 75974, 75982, 75990, - 76000, 76009, 76017, 76024, 76034, 32839, 76038, 76040, 76044, 76049, - 76053, 76057, 76063, 76068, 76072, 76083, 76088, 76093, 3060, 76097, - 76104, 76108, 76117, 76125, 76132, 76137, 76142, 62285, 76146, 76149, - 76155, 76163, 76169, 76173, 76178, 76185, 76190, 76196, 34729, 76201, - 76204, 76209, 76213, 76218, 76223, 76227, 76235, 76239, 25746, 25755, - 76245, 76251, 76257, 76262, 76266, 76269, 76279, 76288, 76293, 76299, - 76306, 76312, 76316, 76324, 76329, 34735, 76333, 76341, 76347, 76354, - 76359, 76363, 76368, 58410, 34741, 76374, 76379, 76383, 76388, 76393, - 76398, 76402, 76407, 76412, 76418, 76423, 76428, 76434, 76440, 76445, - 76449, 76454, 76459, 76464, 76468, 24093, 76473, 76478, 76484, 76490, - 76496, 76501, 76505, 76510, 76515, 76520, 76524, 76529, 76534, 76539, - 76544, 76548, 32847, 76556, 76560, 76568, 76576, 76587, 76592, 76596, - 22391, 76601, 76607, 76617, 76624, 76629, 76638, 76643, 76647, 76652, - 76660, 76668, 76675, 65075, 76681, 76689, 76696, 76707, 76713, 76717, - 76723, 32857, 76726, 76733, 76741, 76746, 39598, 76750, 76755, 76762, - 76767, 8992, 76771, 76779, 76786, 76793, 76799, 76813, 63347, 76821, - 76827, 76831, 76834, 76842, 76849, 76854, 76867, 76874, 76878, 76885, - 76890, 60830, 76895, 76898, 76905, 76911, 76915, 76923, 76932, 76942, - 76952, 76961, 76969, 76980, 76985, 76989, 76994, 76998, 35371, 77006, - 21351, 35380, 77011, 77016, 77021, 77026, 77031, 77036, 77041, 77045, - 77050, 77055, 77060, 77065, 77070, 77075, 77079, 77084, 77089, 77093, - 77097, 77101, 77105, 77110, 77115, 77119, 77124, 77128, 77132, 77137, - 77142, 77147, 77152, 77156, 77161, 77166, 77170, 77175, 77180, 77185, - 77190, 77195, 77200, 77205, 77210, 77215, 77220, 77225, 77230, 77235, - 77240, 77245, 77250, 77255, 77260, 77265, 77270, 77274, 77279, 77284, - 77289, 77294, 77299, 77304, 77309, 77314, 77319, 77324, 77329, 77333, - 77338, 77342, 77347, 77352, 77357, 77362, 77367, 77372, 77377, 77382, - 77387, 77391, 77395, 77400, 77405, 77409, 77414, 77419, 77423, 77428, - 77433, 77438, 77443, 77447, 77452, 77457, 77461, 77466, 77470, 77474, - 77478, 77482, 77487, 77491, 77495, 77499, 77503, 77507, 77511, 77515, - 77519, 77523, 77528, 77533, 77538, 77543, 77548, 77553, 77558, 77563, - 77568, 77573, 77577, 77581, 77585, 77589, 77593, 77597, 77602, 77606, - 77611, 77615, 77620, 77625, 77629, 77633, 77638, 77642, 77646, 77650, - 77654, 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686, 77690, - 77694, 77699, 77704, 77708, 77712, 77716, 77720, 77724, 77728, 77733, - 77737, 77741, 77745, 77749, 77753, 77757, 77762, 77766, 77771, 77775, - 77779, 77783, 77787, 77791, 77795, 77799, 77803, 77807, 77811, 77815, - 77820, 77824, 77828, 77832, 77836, 77840, 77844, 77848, 77852, 77856, - 77860, 77864, 77869, 77873, 77877, 77882, 77887, 77891, 77895, 77899, - 77903, 77907, 77911, 77915, 77919, 77924, 77928, 77933, 77937, 77942, - 77946, 77951, 77955, 77961, 77966, 77970, 77975, 77979, 77984, 77988, - 77993, 77997, 78002, 1521, 78006, 2824, 1759, 1764, 78010, 78014, 2828, - 78018, 1397, 78023, 1342, 78027, 2840, 78031, 78038, 78045, 78059, 2844, - 7131, 78068, 78076, 78083, 78094, 78103, 78110, 78122, 78135, 78148, - 78159, 78164, 78171, 78183, 78187, 2848, 11747, 78197, 78202, 78211, - 78221, 2852, 78226, 78230, 78235, 78242, 78248, 78256, 78268, 1347, - 13042, 78278, 78282, 78288, 78302, 78314, 78326, 78336, 78345, 78354, - 78363, 78371, 78382, 78390, 4051, 78400, 78411, 78420, 78426, 78441, - 78448, 78454, 35496, 78459, 2876, 13046, 78463, 78470, 8930, 78479, 2881, - 32343, 78485, 60579, 78492, 78498, 78509, 78515, 78522, 78528, 78536, - 78543, 78549, 78559, 78568, 78579, 78586, 78592, 78602, 78610, 78616, - 78631, 78637, 78642, 78649, 78652, 78658, 78665, 78671, 78679, 78688, - 78696, 78702, 78711, 41434, 78725, 78730, 78736, 14751, 78741, 78754, - 78763, 78771, 78778, 78782, 78786, 78789, 78796, 78803, 78811, 78819, - 78828, 78836, 14678, 78844, 78849, 78853, 78865, 78872, 78881, 748, - 78891, 78900, 78911, 2897, 78915, 78919, 78925, 78938, 78950, 78960, - 78969, 78981, 26359, 78992, 79000, 79009, 79020, 79031, 79041, 79051, - 79060, 79068, 11312, 79075, 79079, 79082, 79087, 79092, 79096, 79102, - 1352, 11818, 79109, 79120, 79129, 79137, 79146, 79154, 79170, 79181, - 79190, 79198, 79210, 79221, 79237, 79247, 79268, 79281, 79289, 79296, - 14862, 79309, 79314, 79320, 5908, 79326, 79329, 79336, 79346, 8176, - 79353, 79358, 79363, 79368, 79376, 79385, 79393, 9756, 9765, 79398, - 79409, 79414, 79420, 2913, 2918, 79426, 10879, 79432, 79439, 79446, - 79459, 2251, 68, 79464, 79469, 79479, 79485, 79494, 79502, 79512, 79516, - 79521, 79525, 79537, 2941, 79545, 79553, 79558, 79569, 79580, 79589, - 79594, 79600, 79605, 79615, 79625, 79630, 79636, 79641, 79650, 21404, - 79654, 4128, 20, 79659, 79668, 79675, 79682, 79688, 79694, 864, 79699, - 79704, 60907, 79709, 79714, 79720, 79726, 79734, 79739, 79746, 79752, - 79757, 38008, 41328, 79763, 2945, 32, 79773, 79786, 79791, 79799, 79804, - 79810, 2967, 28296, 79815, 79823, 79830, 79835, 58652, 61910, 79844, - 79848, 1704, 1813, 79853, 79858, 79865, 1817, 247, 79872, 79878, 2989, - 79883, 79888, 79895, 1821, 79900, 79906, 79911, 79923, 6119, 79933, 1828, - 79939, 79944, 79951, 79958, 79973, 79980, 79991, 79999, 2618, 80003, - 80015, 80020, 80024, 80030, 28121, 2256, 80034, 80045, 80049, 80053, - 80059, 80063, 80072, 80076, 80087, 80091, 2302, 32172, 80095, 80105, - 3080, 9371, 80113, 80118, 80122, 80131, 80138, 80144, 3050, 17146, 80148, - 80161, 80179, 80184, 80192, 80200, 80210, 9985, 13154, 80222, 80235, - 80242, 80249, 80265, 80272, 80278, 1059, 80285, 80292, 80302, 80311, - 80323, 42298, 80331, 3064, 12030, 80334, 80342, 80346, 78238, 3068, - 80350, 21185, 12046, 3756, 80354, 3074, 80358, 80368, 80374, 80380, - 80386, 80392, 80398, 80404, 80410, 80416, 80422, 80428, 80434, 80440, - 80446, 80452, 80458, 80464, 80470, 80476, 80482, 80488, 80494, 80500, - 80506, 80512, 80518, 80525, 80532, 80538, 80544, 80550, 80556, 80562, - 80568, 1357, 16056, 12068, 80574, 80579, 80584, 80589, 80594, 80599, - 80604, 80609, 80614, 80619, 80624, 80629, 80634, 80639, 80644, 80649, - 80654, 80659, 80664, 80669, 80674, 80679, 80684, 80689, 80694, 80699, - 80705, 80710, 80715, 80721, 80726, 80732, 80737, 80742, 80748, 80753, - 80758, 80763, 80768, 80773, 80778, 80783, 80788, 80369, 80375, 80381, - 80387, 80393, 80399, 80405, 80411, 80417, 80423, 80429, 80435, 80441, - 80447, 80453, 80794, 80459, 80465, 80471, 80800, 80477, 80483, 80489, - 80495, 80501, 80507, 80513, 80533, 80806, 80812, 80539, 80818, 80545, - 80551, 80557, 80563, 80569, 3091, 3096, 80824, 80829, 80832, 80838, - 80844, 80851, 80856, 80861, 2307, + 13668, 13673, 13679, 13688, 13692, 13698, 13706, 13713, 13722, 13731, + 13740, 13749, 13758, 13767, 13776, 13785, 13795, 13805, 13814, 13820, + 13827, 13834, 13840, 13854, 13861, 13869, 13878, 13884, 13893, 13902, + 13913, 13923, 13931, 13938, 13946, 13955, 13968, 13976, 13983, 13996, + 14002, 14008, 14018, 14027, 14036, 14041, 14045, 14051, 14057, 14064, + 8966, 14069, 14074, 14081, 14086, 12376, 14091, 14099, 14105, 14110, + 14118, 14126, 14133, 14141, 14147, 14155, 14163, 14169, 14174, 14180, + 14187, 14193, 14198, 14202, 14213, 14221, 14227, 14232, 14241, 14247, + 14252, 14261, 14275, 3853, 14279, 14284, 14289, 14295, 14300, 14305, + 14309, 14314, 14319, 14324, 7752, 14329, 14334, 14339, 14344, 14349, + 14353, 14358, 14363, 14368, 14373, 14379, 14385, 14390, 14394, 14399, + 14404, 14409, 9301, 14414, 14419, 14424, 14429, 14434, 14451, 14469, + 14481, 14494, 14511, 14527, 14544, 14554, 14573, 14584, 14595, 14606, + 14617, 14629, 14640, 14651, 14668, 14679, 14690, 14695, 9306, 14700, + 14704, 2381, 14708, 14711, 14717, 14725, 14733, 14738, 14746, 14754, + 14761, 14766, 14772, 14779, 14787, 14794, 14806, 14814, 14819, 11597, + 14825, 14834, 14843, 14851, 14858, 14864, 14872, 14879, 14885, 14892, + 14898, 14907, 14915, 14925, 14932, 14938, 14946, 14952, 14960, 14967, + 14980, 14987, 14996, 15005, 15014, 15022, 15032, 15039, 15044, 3560, + 15051, 15056, 1372, 15060, 14330, 15064, 15070, 15074, 15082, 15094, + 15099, 15106, 15112, 15117, 15124, 14335, 15128, 15132, 15136, 14340, + 15140, 14345, 15144, 15151, 15156, 15160, 15167, 15171, 15179, 15186, + 15190, 15197, 15214, 15223, 15227, 15230, 15238, 15244, 15249, 3638, + 15253, 15255, 15263, 15270, 15280, 15292, 15297, 15303, 15308, 15312, + 15318, 15323, 15329, 15332, 15339, 15347, 15354, 15360, 15366, 15371, + 15378, 15384, 15389, 15396, 15400, 15406, 15410, 15417, 15423, 15429, + 15437, 15443, 15448, 15454, 15462, 15470, 15476, 15482, 15487, 15494, + 15499, 15503, 15509, 15514, 15521, 15526, 15532, 15535, 15541, 15547, + 15550, 15554, 15566, 15572, 15577, 15584, 15590, 15596, 15607, 15617, + 15626, 15634, 15641, 15652, 15662, 15672, 15680, 15683, 14359, 15688, + 15693, 14364, 14499, 15701, 15714, 15729, 15740, 14516, 15758, 15771, + 15784, 15795, 10492, 15806, 15819, 15838, 15849, 15860, 15871, 2649, + 15884, 15888, 15896, 15911, 15926, 15937, 15944, 15950, 15958, 15962, + 15968, 15971, 15981, 15989, 15996, 16004, 16014, 16019, 16026, 16031, + 16038, 16049, 16059, 16065, 16070, 16075, 14369, 16079, 16085, 16091, + 16096, 16101, 16106, 16110, 14374, 14380, 16114, 14386, 16119, 16127, + 16136, 16143, 9150, 16147, 16149, 16154, 16159, 16165, 16170, 16175, + 16180, 16185, 16189, 16195, 16201, 16206, 16212, 16217, 16222, 16228, + 16233, 16238, 16243, 16248, 16254, 16259, 16264, 16270, 16276, 16281, + 16286, 16293, 16299, 16310, 16317, 16322, 16326, 16330, 16333, 16341, + 16346, 16353, 16360, 16366, 16371, 16376, 16383, 16393, 16398, 16405, + 16411, 16421, 16431, 16445, 16459, 16473, 16487, 16502, 16517, 16534, + 16552, 16565, 16571, 16576, 16581, 16585, 16590, 16598, 16604, 16609, + 16614, 16618, 16623, 16627, 16632, 16636, 16647, 16653, 16658, 16663, + 16670, 16675, 16679, 16684, 16689, 16695, 16702, 16708, 16713, 16717, + 16723, 16728, 16733, 16737, 16743, 16748, 16753, 16760, 16765, 13111, + 16769, 16774, 16778, 16783, 16789, 16795, 16802, 16812, 16820, 16827, + 16832, 16836, 16845, 16853, 16860, 16867, 16873, 16879, 16884, 16889, + 16895, 16900, 16906, 16911, 16917, 16923, 16930, 16936, 16941, 16946, + 9348, 16955, 16958, 16964, 16969, 16974, 16984, 16991, 16997, 17002, + 17007, 17013, 17018, 17024, 17029, 17035, 17041, 17046, 17054, 17061, + 17066, 17071, 17077, 17082, 17086, 17095, 17106, 17113, 17118, 17126, + 17132, 17139, 17145, 17150, 17154, 17160, 17165, 17170, 17175, 1440, + 7777, 2877, 17179, 17183, 17187, 17191, 17195, 17199, 17202, 17209, + 17217, 14400, 17224, 17234, 17242, 17249, 17257, 17267, 17276, 17289, + 17294, 17299, 17307, 17314, 13207, 13216, 17321, 17331, 17346, 17352, + 17359, 17366, 17372, 17380, 17390, 17400, 14405, 17409, 17415, 17421, + 17429, 17437, 17442, 17451, 17459, 17471, 17481, 17491, 17501, 17510, + 17522, 17532, 17542, 17553, 17558, 17570, 17582, 17594, 17606, 17618, + 17630, 17642, 17654, 17666, 17678, 17689, 17701, 17713, 17725, 17737, + 17749, 17761, 17773, 17785, 17797, 17809, 17820, 17832, 17844, 17856, + 17868, 17880, 17892, 17904, 17916, 17928, 17940, 17951, 17963, 17975, + 17987, 17999, 18011, 18023, 18035, 18047, 18059, 18071, 18082, 18094, + 18106, 18118, 18130, 18142, 18154, 18166, 18178, 18190, 18202, 18213, + 18225, 18237, 18249, 18261, 18273, 18285, 18297, 18309, 18321, 18333, + 18344, 18356, 18368, 18380, 18392, 18404, 18416, 18428, 18440, 18452, + 18464, 18475, 18487, 18499, 18511, 18523, 18536, 18549, 18562, 18575, + 18588, 18601, 18614, 18626, 18639, 18652, 18665, 18678, 18691, 18704, + 18717, 18730, 18743, 18756, 18768, 18781, 18794, 18807, 18820, 18833, + 18846, 18859, 18872, 18885, 18898, 18910, 18923, 18936, 18949, 18962, + 18975, 18988, 19001, 19014, 19027, 19040, 19052, 19065, 19078, 19091, + 19104, 19117, 19130, 19143, 19156, 19169, 19182, 19194, 19207, 19220, + 19233, 19246, 19259, 19272, 19285, 19298, 19311, 19324, 19336, 19347, + 19360, 19373, 19386, 19399, 19412, 19425, 19438, 19451, 19464, 19477, + 19489, 19502, 19515, 19528, 19541, 19554, 19567, 19580, 19593, 19606, + 19619, 19631, 19644, 19657, 19670, 19683, 19696, 19709, 19722, 19735, + 19748, 19761, 19773, 19786, 19799, 19812, 19825, 19838, 19851, 19864, + 19877, 19890, 19903, 19915, 19928, 19941, 19954, 19967, 19980, 19993, + 20006, 20019, 20032, 20045, 20057, 20070, 20083, 20096, 20109, 20122, + 20135, 20148, 20161, 20174, 20187, 20199, 20212, 20225, 20238, 20251, + 20264, 20277, 20290, 20303, 20316, 20329, 20341, 20354, 20367, 20380, + 20393, 20406, 20419, 20432, 20445, 20458, 20471, 20483, 20496, 20509, + 20522, 20535, 20548, 20561, 20574, 20587, 20600, 20613, 20625, 20638, + 20651, 20664, 20677, 20690, 20703, 20716, 20729, 20742, 20755, 20767, + 20778, 20786, 20794, 20801, 20807, 20811, 20817, 20823, 20831, 20837, + 20842, 20846, 20855, 9155, 20866, 20873, 20881, 20888, 20895, 10948, + 20902, 20911, 20916, 20921, 7805, 20928, 20933, 20936, 20941, 20949, + 20956, 20963, 20970, 20976, 20985, 20994, 21000, 21009, 21013, 21019, + 21024, 21034, 21041, 21047, 21055, 21061, 21068, 21078, 21087, 21091, + 21098, 21102, 21107, 21113, 21121, 21125, 21135, 14415, 21144, 21150, + 21154, 21163, 14420, 21169, 21176, 21187, 21195, 21204, 21212, 8931, + 21220, 21225, 21231, 21236, 21240, 21244, 21248, 9639, 21253, 21261, + 21268, 21277, 21284, 21291, 10878, 21298, 21304, 21308, 21314, 21321, + 21327, 21335, 21341, 21348, 21354, 21360, 21369, 21373, 21381, 21390, + 21397, 21402, 21406, 21417, 21422, 21427, 21432, 21445, 7995, 21449, + 21455, 21463, 21467, 21474, 21483, 21488, 14691, 21496, 21500, 21512, + 21517, 21521, 21524, 21530, 21536, 21541, 21545, 21548, 21559, 21564, + 9383, 21571, 21576, 9388, 21581, 21586, 21591, 21596, 21601, 21606, + 21611, 21616, 21621, 21626, 21631, 21636, 21642, 21647, 21652, 21657, + 21662, 21667, 21672, 21677, 21682, 21687, 21693, 21699, 21704, 21709, + 21714, 21719, 21724, 21729, 21734, 21739, 21744, 21750, 21755, 21760, + 21765, 21771, 21777, 21782, 21787, 21792, 21797, 21802, 21807, 21812, + 21817, 21823, 21828, 21833, 21838, 21843, 21849, 21854, 21859, 21863, + 1368, 129, 21871, 21875, 21879, 21883, 21888, 21892, 13117, 12476, 21896, + 21901, 21905, 21910, 21914, 21919, 21923, 21929, 21934, 21938, 21942, + 21950, 21954, 21958, 21963, 21968, 21972, 21978, 21983, 21987, 21992, + 21997, 22001, 22008, 22015, 22022, 22026, 22030, 22035, 22039, 22042, + 22048, 22061, 22066, 22075, 22080, 9428, 22085, 22088, 2712, 2717, 22092, + 22098, 22104, 7209, 22109, 22114, 22119, 22125, 22130, 13909, 22135, + 22140, 22145, 22150, 22156, 22161, 22166, 22172, 22177, 22181, 22186, + 22191, 22196, 22201, 22205, 22210, 22214, 22219, 22224, 22229, 22234, + 22238, 22243, 22247, 22252, 22257, 22262, 22267, 2886, 22182, 22271, + 22279, 22286, 9733, 22298, 22306, 22187, 22313, 22318, 22326, 22192, + 22331, 22336, 22344, 22349, 22197, 22354, 22359, 22363, 22369, 22377, + 22380, 22387, 22391, 22395, 22401, 22408, 22413, 8958, 1727, 1732, 22417, + 22423, 22429, 22434, 22438, 22442, 22446, 22450, 22454, 22458, 22462, + 22466, 22469, 22475, 22482, 22490, 22496, 22502, 22507, 22512, 22516, + 13829, 13836, 22521, 22533, 22536, 22543, 16362, 22550, 22558, 22569, + 22578, 22591, 22601, 22615, 22627, 22641, 22653, 22663, 22675, 22681, + 22696, 22720, 22738, 22757, 22770, 22784, 22802, 22818, 22835, 22853, + 22864, 22883, 22900, 22920, 22938, 22950, 22964, 22978, 22990, 23007, + 23026, 23044, 23056, 23074, 23093, 14559, 23106, 23126, 23138, 10523, + 23150, 23155, 23160, 23165, 23171, 23176, 23180, 23187, 2398, 23191, + 23197, 23201, 23204, 23208, 23216, 23222, 22215, 23226, 23235, 23246, + 23252, 23258, 23267, 23275, 23282, 23287, 23291, 23298, 23304, 23313, + 23321, 23328, 23338, 23347, 23357, 23362, 23371, 23380, 23391, 23402, + 3963, 23412, 23416, 23426, 23434, 23444, 23455, 23460, 23470, 23478, + 23485, 23491, 23498, 23503, 22225, 23507, 23516, 23520, 23523, 23528, + 23535, 23544, 23552, 23560, 23570, 23579, 23585, 23591, 22230, 22235, + 23595, 23605, 23615, 23625, 23633, 23640, 23650, 23658, 23666, 23672, + 23680, 930, 23689, 14750, 542, 23703, 23712, 23720, 23731, 23742, 23752, + 23761, 23773, 23782, 23791, 23797, 23806, 23815, 23825, 23833, 23841, + 9360, 23847, 23850, 23854, 23859, 23864, 9848, 22248, 22253, 23872, + 23878, 23884, 23889, 23894, 23898, 23906, 23912, 23918, 23922, 3525, + 23930, 23935, 23940, 23944, 23948, 9928, 23955, 23963, 23977, 23984, + 23990, 9937, 9943, 23998, 24006, 24013, 24018, 24023, 22258, 24029, + 24040, 24044, 24049, 2601, 24054, 24065, 24071, 24076, 24080, 24084, + 24087, 24094, 24101, 24108, 24114, 24118, 22263, 24123, 24127, 24131, + 1037, 24136, 24141, 24146, 24151, 24156, 24161, 24166, 24171, 24176, + 24181, 24186, 24191, 24196, 24201, 24207, 24212, 24217, 24222, 24227, + 24232, 24237, 24243, 24248, 24253, 24258, 24263, 24268, 24273, 24278, + 24284, 24290, 24295, 24301, 24306, 24311, 5, 24317, 24321, 24325, 24329, + 24334, 24338, 24342, 24346, 24350, 24355, 24359, 24364, 24368, 24371, + 24375, 24380, 24384, 24389, 24393, 24397, 24401, 24406, 24410, 24414, + 24424, 24429, 24433, 24437, 24442, 24447, 24456, 24461, 24466, 24470, + 24474, 24487, 24499, 24508, 24517, 24523, 24528, 24532, 24536, 24546, + 24555, 24563, 24569, 24574, 24578, 24585, 24595, 24604, 24612, 24620, + 24627, 24635, 24644, 24653, 24661, 24666, 24670, 24674, 24677, 24679, + 24683, 24687, 24692, 24697, 24701, 24705, 24708, 24712, 24715, 24719, + 24722, 24725, 24729, 24735, 24739, 24743, 24747, 24752, 24757, 24762, + 24766, 24769, 24774, 24780, 24785, 24791, 24796, 24800, 24804, 24808, + 24813, 24817, 24822, 24826, 24830, 24837, 24841, 24844, 24848, 24854, + 24860, 24864, 24868, 24873, 24880, 24886, 24890, 24899, 24903, 24907, + 24910, 24916, 24921, 24927, 1489, 1791, 24932, 24937, 24942, 24947, + 24952, 24957, 24962, 2148, 2194, 24967, 24970, 24974, 24978, 24983, + 24987, 24991, 24994, 24999, 25004, 25008, 25011, 25016, 25020, 25025, + 25029, 14762, 25034, 25037, 25040, 25044, 25049, 25053, 25066, 25070, + 25073, 25081, 25090, 25097, 25102, 25108, 25114, 25122, 25129, 25136, + 25140, 25144, 25148, 25153, 25158, 25162, 25170, 25175, 25187, 25198, + 25203, 25207, 25211, 25217, 25222, 25227, 25231, 25235, 25238, 25244, + 7915, 2316, 25248, 25253, 25269, 9475, 25289, 25298, 25314, 25318, 25321, + 25327, 25337, 25343, 25352, 25367, 25379, 25390, 25398, 25407, 25413, + 25422, 25432, 25443, 25454, 25463, 25470, 25479, 25487, 25494, 25502, + 25509, 25516, 25529, 25536, 25542, 25547, 25556, 25562, 25567, 25575, + 25582, 23436, 25594, 25606, 25620, 25628, 25635, 25647, 25656, 25665, + 25673, 25681, 25689, 25696, 25705, 25713, 25723, 25732, 25742, 25751, + 25760, 25768, 25773, 25777, 25780, 25784, 25788, 25792, 25796, 25800, + 25806, 25812, 25820, 14807, 25827, 25832, 25839, 25845, 25852, 14815, + 25859, 25862, 25874, 25882, 25888, 25893, 25897, 9878, 25908, 25918, + 25927, 25934, 25938, 14820, 25941, 25948, 25952, 25958, 25961, 25968, + 25974, 25981, 25987, 25991, 25996, 26000, 26009, 26016, 26022, 7956, + 26029, 26037, 26044, 26050, 26055, 26061, 26067, 26075, 26079, 26082, + 26084, 25785, 26093, 26099, 26109, 26114, 26121, 26127, 26132, 26137, + 26142, 26146, 26151, 26158, 26167, 26171, 26178, 26187, 26193, 26198, + 26204, 26209, 26216, 26227, 26232, 26236, 26246, 26252, 26256, 26261, + 26271, 26280, 26284, 26291, 26299, 26306, 26312, 26317, 26325, 26332, + 26344, 26353, 26357, 13053, 26365, 26375, 26379, 25077, 26390, 26395, + 26399, 26406, 26413, 21974, 25710, 26418, 26422, 26425, 22870, 26430, + 26444, 26460, 26478, 26497, 26514, 26532, 22889, 26549, 26569, 22906, + 26581, 26593, 15745, 26605, 22926, 26619, 26631, 10536, 26645, 26650, + 26655, 26660, 26666, 26672, 26678, 26682, 26689, 26694, 26704, 26710, + 10183, 26716, 26718, 26723, 26731, 26735, 26154, 26741, 26748, 11524, + 11534, 26755, 26765, 26770, 26774, 26777, 26783, 26791, 26803, 26813, + 26829, 26842, 26856, 15763, 26870, 26877, 26881, 26884, 26889, 26893, + 26900, 26907, 26917, 26922, 26927, 26932, 26940, 26948, 26957, 26962, + 9572, 26966, 26969, 26972, 26977, 26984, 26989, 27005, 27013, 27021, + 9423, 27029, 27034, 27038, 27044, 27050, 27053, 27059, 27071, 27079, + 27086, 27092, 27099, 27110, 27124, 27137, 27146, 27155, 27167, 27178, + 27188, 27197, 27206, 27214, 27225, 7938, 27232, 27238, 27243, 27249, + 27256, 27266, 27276, 27285, 27291, 27298, 27303, 27310, 27318, 27326, + 27338, 6246, 27345, 27354, 27362, 27368, 27374, 27379, 27383, 27386, + 27392, 27399, 27404, 27409, 27413, 27425, 27436, 27445, 27453, 14947, + 27458, 27464, 27470, 11517, 8635, 27475, 27479, 27483, 27486, 27489, + 27495, 27503, 27511, 27515, 27519, 27524, 27527, 27536, 27540, 27548, + 27559, 27563, 27569, 27575, 27579, 27585, 27593, 27615, 27639, 27646, + 27653, 27659, 27667, 27673, 27678, 27689, 27707, 27714, 27722, 27726, + 27735, 27748, 27756, 27768, 27779, 27789, 27803, 27812, 27820, 27832, + 9492, 27843, 27854, 27866, 27876, 27885, 27890, 27894, 27902, 27912, + 27917, 27921, 27924, 27927, 27935, 27943, 27952, 27962, 27971, 27977, + 27991, 2663, 28013, 28024, 28033, 28043, 28055, 28064, 28073, 28083, + 28091, 28099, 28108, 28113, 28124, 28129, 28140, 28144, 28154, 28163, + 28171, 28181, 28191, 28199, 28208, 28215, 28223, 28230, 28239, 28243, + 28251, 28258, 28266, 28273, 28284, 28299, 28306, 28312, 28322, 28331, + 28337, 28341, 28348, 28352, 14031, 28358, 28362, 28367, 28374, 28378, + 28382, 28390, 28398, 28404, 28413, 28420, 28425, 28430, 28440, 23505, + 28444, 28447, 28452, 28457, 28462, 28467, 28472, 28477, 28482, 28487, + 28493, 28498, 28503, 28509, 1218, 704, 28514, 28523, 2364, 28530, 28535, + 28539, 28545, 1267, 546, 318, 28550, 28559, 28567, 28576, 28584, 28595, + 28604, 28612, 28616, 28619, 28627, 28635, 28640, 14775, 28646, 28652, + 28658, 5872, 28663, 28667, 28673, 28677, 28684, 1455, 28690, 28697, 9579, + 28701, 28711, 28719, 28725, 28734, 28742, 28748, 28756, 28763, 11110, + 28769, 28776, 28781, 28788, 1496, 2147, 28794, 28800, 28807, 28818, + 28829, 28837, 28844, 28854, 28863, 28871, 28880, 28887, 28894, 28907, + 28918, 1272, 28937, 28942, 28950, 3575, 28954, 28959, 28963, 1459, 24706, + 28973, 28977, 28982, 28986, 3493, 28992, 29000, 29007, 29018, 29026, + 29034, 3576, 279, 29039, 29047, 29055, 29062, 29068, 29073, 2216, 29080, + 29086, 25992, 26222, 29092, 106, 29096, 29100, 29106, 615, 9328, 29111, + 29118, 29124, 2327, 29128, 29132, 15187, 29135, 29140, 29147, 29153, + 29158, 29166, 29173, 29179, 22351, 29183, 29187, 3646, 16625, 29191, + 29196, 29199, 29207, 29215, 29220, 29223, 29230, 29240, 29252, 29257, + 29261, 29269, 29276, 29282, 29289, 29296, 29299, 29303, 29307, 1463, + 29317, 29319, 29324, 29330, 29336, 29341, 29346, 29351, 29356, 29361, + 29366, 29371, 29376, 29381, 29386, 29391, 29396, 29401, 29406, 29412, + 29418, 29424, 29430, 29435, 29440, 29445, 29451, 29456, 29461, 29466, + 29472, 29477, 29483, 29488, 29493, 29498, 29503, 29509, 29514, 29520, + 29525, 29530, 29535, 29540, 29546, 29551, 29557, 29562, 29567, 29572, + 29577, 29582, 29587, 29592, 29597, 29602, 29608, 29614, 29620, 29625, + 29630, 29635, 29640, 29646, 29652, 29658, 29664, 29670, 29676, 29681, + 29687, 29692, 29697, 29702, 29707, 29713, 2443, 29718, 2450, 2457, 2754, + 29723, 2463, 2473, 29729, 29733, 29738, 29743, 29749, 29754, 29759, + 29763, 29768, 29774, 29779, 29784, 29789, 29795, 29800, 29804, 29808, + 29813, 29818, 29823, 29828, 29833, 29839, 29845, 29850, 29854, 29859, + 29865, 29869, 29874, 29879, 29884, 29889, 29893, 29896, 29901, 29906, + 29911, 29916, 29921, 29927, 29933, 29938, 29943, 29947, 29952, 29957, + 29962, 29967, 29972, 29976, 29981, 29986, 29991, 29995, 29999, 30003, + 30008, 30016, 30021, 30027, 30033, 30039, 30044, 30048, 30051, 30056, + 30061, 30065, 30070, 30074, 30079, 30083, 30086, 30091, 17302, 30096, + 30101, 30106, 30114, 21280, 28694, 9026, 30119, 30124, 30128, 30133, + 30137, 30141, 30146, 30150, 30153, 30156, 30160, 30165, 30169, 30177, + 30181, 30184, 30189, 30193, 30197, 30202, 30207, 30211, 30217, 30222, + 30227, 30234, 30241, 30245, 30248, 30254, 30263, 30270, 30278, 30285, + 30289, 30294, 30298, 30302, 30308, 30314, 30318, 30324, 30329, 30334, + 30338, 30345, 30351, 30357, 30363, 30369, 30376, 30382, 30388, 30394, + 30400, 30406, 30412, 30418, 30425, 30431, 30438, 30444, 30450, 30456, + 30462, 30468, 30474, 30480, 30486, 30492, 11418, 30498, 30503, 30508, + 30511, 30519, 30524, 30533, 30539, 30544, 30549, 30554, 30558, 30563, + 30568, 30573, 30578, 30583, 30590, 30597, 30603, 30609, 30614, 16303, + 30621, 30627, 30634, 30640, 30646, 30651, 30659, 30664, 16082, 30668, + 30673, 30678, 30684, 30689, 30694, 30698, 30703, 30708, 30714, 30719, + 30724, 30728, 30733, 30738, 30742, 30747, 30752, 30757, 30761, 30766, + 30771, 30776, 30780, 30784, 15293, 30788, 30797, 30803, 30809, 30818, + 30826, 30835, 30843, 30848, 30852, 30859, 30865, 30869, 30872, 30877, + 30886, 30894, 30899, 1495, 30905, 30908, 30912, 22424, 22430, 30918, + 30922, 30933, 30944, 30955, 30967, 30974, 30981, 30986, 30990, 5909, 755, + 21279, 30998, 31003, 31007, 31012, 31016, 31022, 31027, 31033, 31038, + 31044, 31049, 31055, 31060, 31066, 31072, 31078, 31083, 31039, 31045, + 31087, 31092, 31098, 31103, 31109, 31114, 31120, 31125, 31050, 10421, + 31129, 31061, 31067, 31073, 2831, 3423, 31135, 31138, 31144, 31150, + 31156, 31163, 31169, 31175, 31181, 31187, 31193, 31199, 31205, 31211, + 31217, 31223, 31229, 31235, 31242, 31248, 31254, 31260, 31266, 31272, + 31275, 31280, 31283, 31290, 31298, 31303, 31308, 31314, 31319, 31324, + 31328, 31333, 31339, 31344, 31350, 31355, 31361, 31366, 31372, 31378, + 31382, 31387, 31392, 31397, 31402, 31406, 31411, 31416, 31421, 31427, + 31433, 31439, 31445, 31450, 31454, 31457, 31463, 31469, 31478, 31486, + 31493, 31498, 31502, 31506, 31511, 15146, 31516, 31524, 31530, 3683, + 1377, 31535, 31539, 8005, 31545, 31551, 31558, 8014, 31562, 31568, 31575, + 31581, 31590, 31598, 31610, 31614, 31621, 31627, 31631, 31634, 31643, + 31651, 31040, 31656, 31666, 31676, 31686, 31692, 31697, 31707, 31712, + 31725, 31739, 31750, 31762, 31774, 31788, 31801, 31813, 31825, 14600, + 31839, 31844, 31849, 31853, 31857, 31861, 1780, 27176, 31865, 31870, + 31088, 31875, 31878, 31883, 31888, 31893, 31899, 31905, 10098, 31910, + 31917, 15697, 31923, 31928, 31933, 31937, 31942, 31947, 31093, 31952, + 31957, 31962, 31968, 31099, 31973, 31976, 31983, 31991, 31997, 32003, + 32009, 32020, 32025, 32032, 32039, 32046, 32054, 32063, 32072, 32078, + 32084, 32092, 31104, 32097, 32103, 32109, 31110, 32114, 32119, 32127, + 32135, 32141, 32148, 32154, 32161, 32168, 32174, 32182, 32192, 32199, + 32204, 32210, 32215, 32220, 32227, 32236, 32244, 32249, 32255, 32262, + 32270, 32276, 32281, 32287, 32296, 27957, 32303, 32307, 32312, 32321, + 32326, 32331, 32336, 12405, 32344, 32349, 32354, 32359, 32363, 32368, + 32373, 32380, 32385, 32390, 32395, 31115, 21216, 32401, 2519, 244, 32404, + 32407, 32411, 32415, 32425, 32433, 32437, 32444, 32451, 32455, 32458, + 32464, 32472, 32480, 32484, 32488, 32491, 32498, 32502, 32506, 32513, + 32521, 31051, 32528, 32536, 10158, 664, 308, 32548, 32553, 32558, 32564, + 32569, 32574, 3704, 32579, 32582, 32587, 32592, 32597, 32602, 32607, + 32614, 22529, 32619, 32624, 32629, 32634, 32639, 32645, 32650, 32656, + 31286, 32662, 32667, 32673, 32679, 32689, 32694, 32699, 32703, 32708, + 32713, 32718, 32723, 32736, 32741, 22302, 16705, 3710, 32745, 32750, + 32755, 32761, 32766, 32771, 32775, 32780, 32785, 32791, 32796, 32801, + 1382, 32805, 32810, 32815, 32820, 32824, 32829, 32834, 32839, 32845, + 32851, 32856, 32860, 32864, 32869, 32874, 32879, 32883, 32891, 32895, + 32901, 32905, 32912, 16498, 31062, 32918, 32925, 32933, 32940, 32946, + 32959, 32971, 32977, 32981, 2773, 32985, 32989, 32493, 32998, 33009, + 33014, 33019, 33024, 33028, 33033, 22435, 33037, 33041, 33046, 31068, + 21300, 33050, 33055, 33061, 33066, 33070, 33074, 33077, 33081, 33087, + 33098, 33110, 31074, 33115, 33118, 33122, 347, 33127, 33132, 33137, + 33142, 33147, 33152, 33158, 33163, 33168, 33174, 33179, 33185, 33190, + 33196, 33201, 33206, 33211, 33216, 33221, 33226, 33231, 33236, 33242, + 33247, 33252, 33257, 33262, 33267, 33272, 33277, 33283, 33289, 33294, + 33299, 33304, 33309, 33314, 33319, 33324, 33329, 33334, 33339, 33344, + 33349, 33354, 33359, 33364, 33369, 33374, 33379, 33385, 313, 26, 33390, + 33394, 33398, 33406, 33410, 33414, 33417, 33420, 33422, 33427, 33431, + 33436, 33440, 33445, 33449, 33454, 33458, 33461, 33463, 33467, 33472, + 33476, 33487, 33490, 33492, 33496, 33508, 33517, 33521, 33525, 33531, + 33536, 33545, 33551, 33556, 33561, 33565, 33570, 33577, 33582, 33588, + 33593, 33597, 33604, 25718, 25728, 33608, 33613, 33618, 33623, 33630, + 33634, 33641, 8113, 33647, 33656, 33664, 33679, 33693, 33701, 33712, + 33721, 33726, 7227, 33736, 33741, 33746, 33750, 33753, 33757, 33762, + 33766, 33773, 33778, 33783, 8912, 33793, 33795, 33798, 33802, 33808, + 33812, 33817, 33822, 33828, 33833, 33839, 33844, 33854, 33863, 33871, + 33876, 33882, 33887, 33894, 33898, 33906, 33913, 33926, 33934, 33938, + 33948, 33953, 33957, 33965, 33973, 33977, 33986, 33992, 33997, 34005, + 34015, 34024, 34033, 34042, 34053, 34061, 34072, 34081, 34088, 34094, + 34099, 34110, 34115, 34119, 34122, 34126, 34134, 34140, 34148, 34155, + 34161, 34166, 34172, 2418, 34176, 34178, 34183, 34188, 34193, 34196, + 34198, 34202, 34205, 34212, 34216, 9891, 34220, 34226, 34236, 34241, + 34247, 34251, 34256, 34269, 26104, 34275, 34284, 17475, 34291, 34300, + 31672, 34308, 34313, 34317, 34325, 34332, 34337, 34341, 34346, 34350, + 34358, 34364, 34370, 34375, 34379, 34382, 34387, 34400, 34416, 22996, + 34433, 34445, 34462, 34474, 34488, 23013, 23032, 34500, 34512, 2680, + 34526, 34531, 34536, 34541, 34545, 34552, 34564, 34570, 34573, 34584, + 34595, 34600, 32089, 695, 34604, 34608, 34612, 34615, 34620, 34625, + 34631, 34636, 34641, 34647, 34653, 34658, 34662, 34667, 34672, 34677, + 34681, 34684, 34690, 34695, 34700, 34705, 34709, 34714, 34720, 34728, + 26337, 34733, 34738, 34745, 34751, 34757, 34762, 34770, 22538, 34777, + 34782, 34787, 34792, 34796, 34799, 34804, 34808, 34812, 34819, 34825, + 34831, 34837, 34844, 34849, 34855, 33968, 34859, 34863, 34868, 34881, + 34886, 34892, 34900, 34907, 34915, 34925, 34931, 34937, 34943, 34947, + 34956, 34964, 34971, 34976, 34981, 10444, 34986, 34994, 35001, 35007, + 35017, 35022, 35028, 35036, 3608, 35043, 35050, 3614, 35054, 35059, + 35070, 35077, 35083, 35092, 35096, 4015, 35099, 35106, 35112, 35118, + 35126, 35136, 29063, 35143, 35151, 35156, 35162, 35167, 25964, 35173, + 35180, 35186, 35195, 23677, 35202, 35207, 35211, 35219, 35227, 9607, + 5895, 35234, 35238, 35240, 35244, 35249, 35251, 35257, 35262, 35267, + 35274, 32610, 35280, 35285, 35289, 35294, 35298, 35307, 35311, 35317, + 35324, 35330, 35337, 35342, 35351, 35356, 35360, 35365, 35372, 35380, + 35388, 35393, 21356, 35397, 35400, 35404, 35408, 35412, 35415, 35417, + 35425, 35429, 35436, 35440, 35444, 35452, 35459, 35469, 35473, 35477, + 35485, 35493, 35499, 35504, 35513, 13357, 35519, 35528, 35533, 35540, + 35548, 35556, 35564, 35571, 35578, 35585, 35592, 35599, 35604, 35610, + 35627, 35635, 35645, 35653, 35660, 407, 35664, 35670, 35674, 35679, + 33717, 35685, 35688, 35692, 35700, 3619, 35708, 35714, 35720, 35729, + 35739, 35746, 35752, 3625, 3631, 35761, 35768, 35776, 35781, 35785, + 35792, 35800, 35807, 35813, 35822, 35832, 35838, 35846, 35855, 35862, + 35870, 35877, 22032, 35881, 35888, 35894, 35904, 35913, 35924, 35928, + 35938, 35944, 35951, 35959, 35968, 35977, 35987, 35998, 36005, 36010, + 36017, 3029, 36025, 36031, 36036, 36042, 36048, 36053, 36066, 36079, + 36092, 36099, 36105, 36113, 36121, 36126, 36130, 1469, 36134, 36139, + 36144, 36149, 36154, 36160, 36165, 36170, 36175, 36180, 36185, 36190, + 36195, 36201, 36207, 36212, 36217, 36223, 36228, 36233, 36238, 36244, + 36249, 36254, 36259, 36264, 36270, 36275, 36280, 36286, 36291, 36296, + 36301, 36306, 36311, 36317, 36322, 36328, 36333, 36339, 36344, 36349, + 36354, 36360, 36366, 36372, 36378, 36384, 36390, 36396, 36402, 36407, + 36412, 36418, 36423, 36428, 36433, 36438, 36443, 36448, 36453, 36459, + 36464, 36469, 36475, 36481, 101, 36486, 36488, 36492, 36496, 36500, + 36505, 36509, 9528, 36513, 36519, 1741, 6280, 36525, 36528, 36533, 36537, + 36542, 36546, 36550, 36555, 10245, 36559, 36563, 36567, 36571, 15385, + 36576, 36580, 36585, 36590, 36595, 36599, 36606, 26128, 36612, 36615, + 36619, 36624, 36630, 36634, 36642, 36648, 36653, 36657, 36663, 36667, + 36671, 3462, 3467, 29255, 36674, 36678, 36682, 36686, 36690, 36698, + 36705, 36709, 36716, 36721, 317, 36726, 36730, 36736, 36748, 36754, + 36760, 36764, 36770, 36779, 36783, 36787, 36792, 36798, 36803, 36807, + 36812, 36816, 36820, 36827, 36833, 36838, 36853, 36868, 36883, 36899, + 36917, 10195, 36931, 36938, 36942, 36945, 36954, 36959, 36963, 36971, + 33919, 36979, 36983, 36993, 37004, 29225, 37017, 37021, 37030, 37038, + 9785, 14913, 37042, 22447, 37045, 30173, 37050, 9784, 37055, 37061, + 37066, 37072, 37077, 37083, 37088, 37094, 37099, 37105, 37111, 37117, + 37122, 37078, 37084, 37089, 37095, 37100, 37106, 37112, 8126, 3874, + 37126, 37134, 37138, 37141, 37145, 37150, 37155, 37161, 37167, 37172, + 37176, 25976, 37180, 37184, 37190, 37194, 9049, 37203, 37210, 37214, + 11875, 37221, 37227, 37232, 37239, 37246, 37253, 28571, 8049, 37260, + 37267, 37274, 37280, 37285, 37292, 37303, 37309, 37314, 37319, 37324, + 37331, 37079, 37335, 37345, 37356, 37362, 37367, 37372, 37377, 37382, + 37387, 37391, 37395, 37401, 37409, 2319, 865, 10261, 10273, 10278, 10284, + 37418, 10289, 10294, 10300, 37423, 37433, 37437, 10305, 37442, 16903, + 37445, 37450, 37454, 37459, 37464, 37471, 37478, 37482, 37485, 37493, + 10208, 37500, 37503, 37509, 37519, 5929, 37528, 37532, 37540, 37544, + 37554, 37560, 37571, 37577, 37583, 37588, 37594, 37600, 37606, 37611, + 37614, 37621, 37627, 37632, 37639, 37646, 37650, 37660, 37673, 37682, + 37691, 37702, 37715, 37726, 37735, 37746, 37751, 37760, 37765, 10310, + 37771, 37778, 37786, 37791, 37795, 37802, 37809, 3829, 16, 37813, 37818, + 16757, 37822, 37825, 37828, 28077, 37832, 28580, 37840, 37844, 37848, + 37851, 37857, 37101, 37863, 37871, 37877, 37884, 28060, 37888, 28254, + 37892, 37901, 37907, 37913, 37918, 37922, 37928, 37932, 37940, 37948, + 26194, 37954, 37961, 37967, 37972, 37977, 37981, 37987, 37992, 37998, + 4056, 791, 38005, 38009, 38012, 15275, 38024, 35851, 38035, 38038, 38045, + 38049, 38055, 38059, 38065, 38070, 38076, 38081, 38086, 38090, 38094, + 38099, 38104, 38114, 38120, 38133, 38139, 38145, 38152, 38157, 38163, + 38168, 16643, 1472, 1019, 31218, 31224, 38173, 31230, 31243, 31249, + 31255, 38179, 31261, 31267, 38185, 38191, 22, 38199, 38206, 38210, 38214, + 38222, 31978, 38226, 38230, 38237, 38242, 38246, 38251, 38257, 38262, + 38268, 38273, 38277, 38281, 38285, 38290, 38294, 38299, 38303, 38310, + 38315, 38319, 38324, 38328, 38333, 38337, 38342, 38348, 15495, 15500, + 38353, 38357, 38360, 38364, 21183, 38369, 38373, 38379, 38386, 38391, + 38401, 38406, 38414, 38418, 38421, 31993, 38425, 4109, 38430, 38435, + 38439, 38444, 38448, 38453, 13375, 38464, 38468, 38471, 38476, 38480, + 38484, 38487, 38491, 8145, 13391, 38494, 38497, 38503, 38508, 38514, + 38519, 38525, 38530, 38536, 38541, 38547, 38553, 38559, 38564, 38568, + 38572, 38581, 38597, 38613, 38623, 27967, 38630, 38634, 38639, 38644, + 38648, 38652, 35972, 38658, 38663, 38667, 38674, 38679, 38683, 38687, + 26996, 38693, 21451, 38698, 38705, 38713, 38719, 38726, 38734, 38740, + 38744, 38750, 38758, 38762, 38771, 9509, 38779, 38783, 38791, 38798, + 38803, 38808, 38812, 38815, 38819, 38822, 38826, 38833, 38838, 38844, + 26415, 31281, 38848, 38855, 38861, 38867, 38872, 38875, 38877, 38884, + 38891, 38897, 38901, 38904, 38908, 38912, 38916, 38921, 38925, 38929, + 38932, 38936, 38950, 23062, 38969, 38982, 38995, 39008, 23080, 39023, + 10497, 39038, 39044, 39048, 39052, 39059, 39064, 39068, 39075, 39081, + 39086, 39092, 39102, 39114, 39125, 39130, 39137, 39141, 39145, 39148, + 15891, 3677, 39156, 15522, 39169, 39176, 39180, 39184, 39189, 39194, + 39200, 39204, 39208, 39211, 7742, 15533, 39216, 39220, 39226, 39235, + 39240, 39247, 35828, 39253, 39258, 39262, 39267, 39274, 39278, 39281, + 39285, 39290, 14565, 39297, 39304, 1077, 39308, 39313, 39318, 39324, + 39329, 39334, 39338, 39348, 39353, 39359, 39364, 39370, 39375, 39381, + 39391, 39396, 39401, 39405, 7229, 7241, 39410, 39413, 39420, 39426, + 34084, 34091, 39435, 39439, 32041, 39447, 39458, 39466, 36020, 39473, + 39478, 39483, 39494, 39501, 39512, 32065, 21457, 39520, 735, 39525, + 39531, 28051, 39537, 39542, 39552, 39561, 39568, 39574, 39578, 39581, + 39588, 39594, 39601, 39607, 39617, 39625, 39631, 39637, 39642, 39646, + 39653, 39659, 39666, 38917, 535, 13818, 39672, 39677, 39680, 39686, + 39694, 1396, 39699, 39703, 39708, 39715, 39721, 39725, 39729, 39734, + 39743, 39750, 39760, 39766, 28095, 39783, 39792, 39800, 39806, 39811, + 39818, 39824, 39832, 39841, 39849, 39853, 39858, 39866, 32074, 39872, + 39891, 15824, 39905, 39921, 39935, 39941, 39946, 39951, 39956, 39962, + 32080, 39967, 39974, 39979, 39983, 345, 2936, 39990, 39995, 40000, 27322, + 39821, 40004, 40009, 40017, 40021, 40024, 40030, 40036, 40040, 28150, + 40043, 40048, 40052, 40055, 40060, 40064, 40069, 40074, 40078, 40083, + 40087, 40091, 21179, 21190, 40095, 40100, 40106, 26953, 40111, 40115, + 21266, 16072, 40118, 40123, 40128, 40133, 40138, 40143, 40148, 40153, + 450, 49, 31299, 31304, 31309, 31315, 31320, 31325, 40158, 31329, 40162, + 40166, 40170, 31334, 31340, 40184, 31351, 31356, 40192, 40197, 31362, + 40202, 40207, 40212, 40217, 40223, 40229, 40235, 31379, 40248, 40254, + 31383, 40258, 31388, 40263, 31393, 31398, 40266, 40271, 40275, 30948, + 40281, 13599, 40288, 40293, 31403, 40297, 40302, 40307, 40312, 40316, + 40321, 40326, 40332, 40337, 40342, 40348, 40354, 40359, 40363, 40368, + 40373, 40378, 40382, 40387, 40392, 40397, 40403, 40409, 40415, 40420, + 40424, 40429, 40433, 31407, 31412, 31417, 40437, 40441, 40445, 31422, + 31428, 31434, 31446, 40457, 26013, 40461, 40465, 40470, 40475, 40480, + 40485, 40489, 40493, 40503, 40508, 40513, 40517, 40521, 40524, 40532, + 31494, 40537, 1479, 40543, 40551, 40560, 40564, 40568, 40576, 40582, + 40590, 40606, 40610, 40614, 40619, 40634, 31531, 1749, 12055, 40638, + 1378, 40650, 40651, 40659, 40666, 40671, 40678, 40683, 9379, 1119, 10332, + 40690, 40695, 40698, 40701, 40710, 1286, 40715, 39065, 40722, 40727, + 40731, 22503, 2557, 40739, 10741, 40749, 40755, 2337, 2347, 40764, 40773, + 40783, 40794, 3293, 34237, 10384, 3807, 16681, 1291, 40799, 40807, 40814, + 40819, 40823, 40827, 23875, 10411, 40835, 40844, 40853, 40861, 40868, + 40879, 40884, 40897, 40910, 40922, 40934, 40946, 40959, 40970, 40981, + 40991, 40999, 41007, 41019, 41031, 41042, 41051, 41059, 41066, 41078, + 41085, 41094, 41101, 41114, 41119, 41129, 41134, 41140, 41145, 37211, + 41149, 41156, 41160, 41167, 41175, 2518, 41182, 41193, 41203, 41212, + 41220, 41230, 41238, 41248, 41257, 41262, 41268, 41274, 3709, 41285, + 41295, 41304, 41313, 41323, 41331, 41340, 41345, 41350, 41355, 1705, 37, + 41363, 41371, 41382, 41393, 16356, 41403, 41407, 41414, 41420, 41425, + 41429, 41440, 41450, 41459, 41470, 16730, 16735, 41475, 41484, 41489, + 41499, 41504, 41512, 41520, 41527, 41533, 7078, 228, 41537, 41543, 41548, + 41551, 2117, 39181, 41559, 41563, 41566, 1512, 41572, 13980, 1296, 41577, + 41590, 41604, 2643, 41622, 41634, 41646, 2657, 2674, 41660, 41673, 2689, + 41687, 41699, 2704, 41713, 1302, 1308, 1314, 10659, 41718, 41723, 41728, + 41732, 41747, 41762, 41777, 41792, 41807, 41822, 41837, 41852, 41867, + 41882, 41897, 41912, 41927, 41942, 41957, 41972, 41987, 42002, 42017, + 42032, 42047, 42062, 42077, 42092, 42107, 42122, 42137, 42152, 42167, + 42182, 42197, 42212, 42227, 42242, 42257, 42272, 42287, 42302, 42317, + 42332, 42347, 42362, 42377, 42392, 42407, 42422, 42437, 42452, 42467, + 42482, 42497, 42512, 42527, 42542, 42557, 42572, 42587, 42602, 42617, + 42632, 42647, 42662, 42677, 42692, 42707, 42722, 42737, 42752, 42767, + 42782, 42797, 42812, 42827, 42842, 42857, 42872, 42887, 42902, 42917, + 42932, 42947, 42962, 42977, 42992, 43007, 43022, 43037, 43052, 43067, + 43082, 43097, 43112, 43127, 43142, 43157, 43172, 43187, 43202, 43217, + 43232, 43247, 43262, 43277, 43292, 43307, 43322, 43337, 43352, 43367, + 43382, 43397, 43412, 43427, 43442, 43457, 43472, 43487, 43502, 43517, + 43532, 43547, 43562, 43577, 43592, 43607, 43622, 43637, 43652, 43667, + 43682, 43697, 43712, 43727, 43742, 43757, 43772, 43787, 43802, 43817, + 43832, 43847, 43862, 43877, 43892, 43907, 43922, 43937, 43952, 43967, + 43982, 43997, 44012, 44027, 44042, 44057, 44072, 44087, 44102, 44117, + 44132, 44147, 44162, 44177, 44192, 44207, 44222, 44237, 44252, 44267, + 44282, 44297, 44312, 44327, 44342, 44357, 44372, 44387, 44402, 44417, + 44432, 44447, 44462, 44477, 44492, 44507, 44522, 44537, 44552, 44567, + 44582, 44597, 44612, 44627, 44642, 44657, 44672, 44687, 44702, 44717, + 44732, 44747, 44762, 44777, 44792, 44807, 44822, 44837, 44852, 44867, + 44882, 44897, 44912, 44927, 44942, 44957, 44972, 44987, 45002, 45017, + 45032, 45047, 45062, 45077, 45092, 45107, 45122, 45137, 45152, 45167, + 45182, 45197, 45212, 45227, 45242, 45257, 45272, 45287, 45302, 45317, + 45332, 45347, 45362, 45377, 45392, 45407, 45422, 45437, 45452, 45467, + 45482, 45497, 45512, 45527, 45542, 45557, 45572, 45587, 45602, 45617, + 45632, 45647, 45662, 45677, 45692, 45707, 45722, 45737, 45752, 45767, + 45782, 45797, 45812, 45827, 45842, 45857, 45872, 45887, 45902, 45917, + 45932, 45947, 45962, 45977, 45992, 46007, 46022, 46037, 46052, 46067, + 46082, 46097, 46112, 46127, 46142, 46157, 46172, 46187, 46202, 46217, + 46232, 46247, 46262, 46277, 46292, 46307, 46322, 46337, 46352, 46367, + 46382, 46397, 46412, 46427, 46442, 46457, 46472, 46487, 46502, 46517, + 46532, 46547, 46562, 46577, 46592, 46607, 46622, 46637, 46652, 46667, + 46682, 46697, 46712, 46727, 46742, 46757, 46772, 46787, 46802, 46817, + 46832, 46847, 46862, 46877, 46892, 46907, 46922, 46937, 46952, 46967, + 46982, 46997, 47012, 47027, 47042, 47057, 47072, 47087, 47102, 47117, + 47132, 47147, 47162, 47177, 47192, 47207, 47222, 47237, 47252, 47267, + 47282, 47297, 47312, 47327, 47342, 47357, 47372, 47387, 47402, 47417, + 47432, 47447, 47462, 47477, 47492, 47507, 47522, 47537, 47552, 47567, + 47582, 47597, 47612, 47627, 47642, 47657, 47672, 47687, 47702, 47717, + 47732, 47747, 47762, 47777, 47792, 47807, 47822, 47837, 47852, 47867, + 47882, 47897, 47912, 47927, 47942, 47957, 47972, 47987, 48002, 48017, + 48032, 48047, 48062, 48077, 48092, 48107, 48122, 48137, 48152, 48167, + 48182, 48197, 48212, 48227, 48242, 48257, 48272, 48287, 48302, 48317, + 48332, 48347, 48362, 48377, 48392, 48407, 48422, 48437, 48452, 48467, + 48482, 48497, 48512, 48527, 48542, 48557, 48572, 48587, 48602, 48617, + 48632, 48647, 48662, 48677, 48692, 48707, 48722, 48737, 48752, 48767, + 48782, 48797, 48812, 48827, 48842, 48857, 48872, 48887, 48902, 48917, + 48932, 48947, 48962, 48977, 48992, 49007, 49022, 49037, 49052, 49067, + 49082, 49097, 49112, 49127, 49142, 49157, 49172, 49187, 49202, 49217, + 49232, 49247, 49262, 49277, 49292, 49307, 49322, 49337, 49352, 49367, + 49382, 49397, 49412, 49427, 49442, 49457, 49472, 49487, 49502, 49517, + 49532, 49548, 49564, 49580, 49596, 49612, 49628, 49644, 49660, 49676, + 49692, 49708, 49724, 49740, 49756, 49772, 49788, 49804, 49820, 49836, + 49852, 49868, 49884, 49900, 49916, 49932, 49948, 49964, 49980, 49996, + 50012, 50028, 50044, 50060, 50076, 50092, 50108, 50124, 50140, 50156, + 50172, 50188, 50204, 50220, 50236, 50252, 50268, 50284, 50300, 50316, + 50332, 50348, 50364, 50380, 50396, 50412, 50428, 50444, 50460, 50476, + 50492, 50508, 50524, 50540, 50556, 50572, 50588, 50604, 50620, 50636, + 50652, 50668, 50684, 50700, 50716, 50732, 50748, 50764, 50780, 50796, + 50812, 50828, 50844, 50860, 50876, 50892, 50908, 50924, 50940, 50956, + 50972, 50988, 51004, 51020, 51036, 51052, 51068, 51084, 51100, 51116, + 51132, 51148, 51164, 51180, 51196, 51212, 51228, 51244, 51260, 51276, + 51292, 51308, 51324, 51340, 51356, 51372, 51388, 51404, 51420, 51436, + 51452, 51468, 51484, 51500, 51516, 51532, 51548, 51564, 51580, 51596, + 51612, 51628, 51644, 51660, 51676, 51692, 51708, 51724, 51740, 51756, + 51772, 51788, 51804, 51820, 51836, 51852, 51868, 51884, 51900, 51916, + 51932, 51948, 51964, 51980, 51996, 52012, 52028, 52044, 52060, 52076, + 52092, 52108, 52124, 52140, 52156, 52172, 52188, 52204, 52220, 52236, + 52252, 52268, 52284, 52300, 52316, 52332, 52348, 52364, 52380, 52396, + 52412, 52428, 52444, 52460, 52476, 52492, 52508, 52524, 52540, 52556, + 52572, 52588, 52604, 52620, 52636, 52652, 52668, 52684, 52700, 52716, + 52732, 52748, 52764, 52780, 52796, 52812, 52828, 52844, 52860, 52876, + 52892, 52908, 52924, 52940, 52956, 52972, 52988, 53004, 53020, 53036, + 53052, 53068, 53084, 53100, 53116, 53132, 53148, 53164, 53180, 53196, + 53212, 53228, 53244, 53260, 53276, 53292, 53308, 53324, 53340, 53356, + 53372, 53388, 53404, 53420, 53436, 53452, 53468, 53484, 53500, 53516, + 53532, 53548, 53564, 53580, 53596, 53612, 53628, 53644, 53660, 53676, + 53692, 53708, 53724, 53740, 53756, 53772, 53788, 53804, 53820, 53836, + 53852, 53868, 53884, 53900, 53916, 53932, 53948, 53964, 53980, 53996, + 54012, 54028, 54044, 54060, 54076, 54092, 54108, 54124, 54140, 54156, + 54172, 54188, 54204, 54220, 54236, 54252, 54268, 54284, 54300, 54316, + 54332, 54348, 54364, 54380, 54396, 54412, 54428, 54444, 54460, 54476, + 54492, 54508, 54524, 54540, 54556, 54572, 54588, 54604, 54620, 54636, + 54652, 54668, 54684, 54700, 54716, 54732, 54748, 54764, 54780, 54796, + 54812, 54828, 54844, 54860, 54876, 54892, 54908, 54924, 54940, 54956, + 54972, 54988, 55004, 55020, 55036, 55052, 55068, 55084, 55100, 55116, + 55132, 55148, 55164, 55180, 55196, 55212, 55228, 55244, 55260, 55276, + 55292, 55308, 55324, 55340, 55356, 55372, 55388, 55404, 55420, 55436, + 55452, 55468, 55484, 55500, 55516, 55532, 55548, 55564, 55580, 55596, + 55612, 55628, 55644, 55660, 55676, 55692, 55708, 55724, 55740, 55756, + 55772, 55788, 55804, 55820, 55836, 55852, 55868, 55884, 55900, 55916, + 55932, 55948, 55964, 55980, 55996, 56012, 56028, 56044, 56060, 56076, + 56092, 56108, 56124, 56140, 56156, 56172, 56188, 56204, 56220, 56236, + 56252, 56268, 56284, 56300, 56316, 56332, 56348, 56364, 56380, 56396, + 56412, 56428, 56444, 56460, 56476, 56492, 56508, 56524, 56540, 56556, + 56572, 56588, 56604, 56620, 56636, 56652, 56668, 56684, 56700, 56716, + 56732, 56748, 56764, 56780, 56796, 56812, 56828, 56844, 56860, 56876, + 56892, 56908, 56924, 56940, 56956, 56972, 56988, 57004, 57020, 57036, + 57052, 57068, 57084, 57100, 57116, 57132, 57148, 57164, 57180, 57196, + 57212, 57228, 57244, 57260, 57276, 57292, 57308, 57324, 57340, 57356, + 57372, 57388, 57404, 57420, 57436, 57452, 57468, 57484, 57500, 57516, + 57532, 57548, 57564, 57580, 57596, 57612, 57628, 57644, 57660, 57676, + 57692, 57708, 57724, 57740, 57756, 57772, 57788, 57804, 57820, 57836, + 57852, 57868, 57884, 57900, 57916, 57932, 57948, 57964, 57980, 57996, + 58012, 58028, 58044, 58060, 58076, 58092, 58108, 58124, 58140, 58156, + 58172, 58188, 58204, 58219, 16762, 58228, 58234, 58240, 58250, 58258, + 14894, 15445, 9960, 58271, 1520, 58279, 3761, 27432, 7183, 58285, 58290, + 58295, 58300, 58305, 58311, 58316, 58322, 58327, 58333, 58338, 58343, + 58348, 58353, 58359, 58364, 58369, 58374, 58379, 58384, 58389, 58394, + 58400, 58405, 58411, 58418, 2561, 58423, 58429, 8526, 58433, 58438, + 58445, 58453, 40, 58457, 58463, 58468, 58473, 58477, 58482, 58486, 58490, + 10684, 58494, 58504, 58517, 58528, 58541, 58548, 58554, 58559, 58565, + 58571, 58577, 58582, 58587, 58592, 58597, 58601, 58606, 58611, 58616, + 58622, 58628, 58634, 58639, 58643, 58648, 58653, 58657, 58662, 58667, + 58672, 58676, 10700, 10711, 10716, 1563, 58680, 1568, 58686, 16239, + 58689, 58695, 1599, 58701, 1605, 1611, 10746, 58706, 58714, 58721, 58725, + 58731, 58736, 30977, 58741, 58748, 58753, 58757, 58761, 1616, 16331, + 58770, 58774, 16342, 1125, 58778, 58785, 58790, 58794, 16367, 1620, + 37350, 58797, 58802, 58812, 58821, 58826, 58830, 58836, 1625, 39259, + 58841, 58850, 58856, 58861, 10904, 10910, 58867, 58879, 58896, 58913, + 58930, 58947, 58964, 58981, 58998, 59015, 59032, 59049, 59066, 59083, + 59100, 59117, 59134, 59151, 59168, 59185, 59202, 59219, 59236, 59253, + 59270, 59287, 59304, 59321, 59338, 59355, 59372, 59389, 59406, 59423, + 59440, 59457, 59474, 59491, 59508, 59525, 59542, 59559, 59576, 59593, + 59610, 59627, 59644, 59661, 59678, 59695, 59712, 59723, 59728, 1630, + 59732, 59738, 59743, 59748, 9326, 1635, 59754, 59763, 27731, 59768, + 59779, 59789, 59794, 59801, 59807, 59812, 59817, 16619, 59821, 10921, + 1640, 10926, 59827, 59832, 59838, 59843, 59848, 59853, 59858, 59863, + 59868, 59873, 59879, 59885, 59891, 59896, 59900, 59905, 59910, 59914, + 59919, 59924, 59929, 59933, 59938, 59944, 59949, 59954, 59958, 59963, + 59968, 59974, 59979, 59984, 59990, 59996, 60001, 60005, 60010, 60015, + 60020, 60024, 60029, 60034, 60039, 60045, 60051, 60056, 60060, 60064, + 60069, 60074, 60079, 29129, 60083, 60088, 60093, 60099, 60104, 60109, + 60113, 60118, 60123, 60129, 60134, 60139, 60145, 60151, 60156, 60160, + 60165, 60170, 60174, 60179, 60184, 60189, 60195, 60201, 60206, 60210, + 60215, 60220, 60224, 60229, 60234, 60239, 60243, 60246, 31639, 60251, + 60259, 16685, 3663, 11017, 60265, 60275, 60290, 11022, 60301, 60306, + 60317, 60329, 60341, 60353, 2695, 60365, 60370, 60382, 60386, 60392, + 60398, 60403, 1652, 1078, 60412, 60417, 39309, 60421, 60425, 60430, + 60434, 16770, 60439, 60442, 60450, 60458, 1656, 11047, 11053, 1661, + 60466, 60473, 60478, 60487, 60497, 60504, 60509, 60514, 1666, 60521, + 60526, 16885, 60530, 60535, 60542, 60548, 60552, 60563, 60573, 16907, + 9234, 9241, 1671, 60580, 60586, 60594, 60601, 60607, 60614, 60626, 60632, + 60637, 60649, 60660, 60669, 60679, 3740, 30813, 30822, 16947, 1676, 1680, + 60687, 60698, 60703, 1683, 60711, 60716, 16998, 60728, 60734, 60739, + 60747, 1688, 60752, 60757, 60765, 60773, 60780, 60789, 60797, 60806, + 1693, 60810, 1698, 60815, 60822, 17072, 60830, 60836, 60841, 60849, + 60856, 60864, 22574, 60869, 11182, 60878, 60884, 60891, 60898, 60904, + 60914, 60920, 60925, 60936, 60941, 60949, 11191, 11196, 60957, 60963, + 60971, 3805, 17114, 39397, 60976, 60982, 60987, 60995, 61002, 12036, + 61007, 61013, 1709, 61018, 61021, 1132, 61027, 61032, 61037, 61043, + 61048, 61053, 61058, 61063, 61068, 61073, 1718, 9, 61079, 61083, 61088, + 61092, 61096, 61100, 31879, 61105, 61110, 61115, 61119, 61122, 61126, + 61130, 61135, 61139, 61144, 61148, 34616, 34621, 34626, 61151, 61158, + 61164, 39118, 61174, 34632, 32137, 31894, 31900, 34648, 31906, 61179, + 61184, 32170, 61188, 61191, 61195, 61202, 61205, 61210, 61214, 61218, + 61221, 61231, 61243, 61250, 61256, 61263, 33573, 61266, 8543, 877, 61269, + 61273, 61278, 3690, 61282, 61285, 13632, 61292, 61299, 61312, 61320, + 61329, 61338, 61343, 61353, 61366, 61378, 61385, 61390, 61399, 61412, + 36060, 61430, 61435, 61442, 61448, 656, 61453, 61461, 61468, 27271, 627, + 61474, 61480, 61490, 61496, 61501, 31924, 6003, 31938, 61505, 61515, + 61520, 61530, 61545, 61551, 61557, 31948, 61562, 31094, 61566, 61571, + 61576, 61580, 61585, 16950, 61592, 61597, 61601, 6044, 31974, 61605, + 61611, 312, 61621, 61628, 61635, 61640, 61649, 58806, 61655, 61663, + 61667, 61671, 61675, 61679, 61684, 61688, 61694, 61702, 61707, 61712, + 61716, 61721, 61725, 61729, 61735, 61741, 61746, 61750, 32098, 61755, + 32104, 32110, 61760, 61766, 61773, 61778, 61782, 31111, 16612, 61785, + 61789, 61794, 61801, 61807, 61811, 61816, 38828, 61822, 61826, 61830, + 61835, 61841, 61847, 61859, 61868, 61878, 61884, 61891, 61896, 61901, + 61905, 61908, 61914, 61921, 61926, 61931, 61938, 61945, 61951, 61956, + 61961, 61969, 32115, 2423, 61974, 61979, 61985, 61990, 61996, 62001, + 62006, 62011, 62017, 32136, 62022, 62028, 62034, 62040, 32200, 62045, + 62050, 62055, 32211, 62060, 62065, 62070, 62076, 62082, 32216, 62087, + 62092, 62097, 32271, 32277, 62102, 62107, 32282, 62112, 27958, 32304, + 32308, 62117, 62093, 62121, 62129, 62135, 62143, 62150, 62156, 62166, + 62172, 62179, 10631, 32322, 62185, 62198, 62207, 62213, 62222, 62228, + 23512, 62235, 62242, 62252, 32272, 62255, 62262, 62267, 62271, 62275, + 62280, 6120, 62284, 62289, 62294, 34710, 34715, 62298, 34729, 62303, + 34734, 62308, 62314, 34746, 34752, 34758, 62319, 62325, 22539, 62336, + 62339, 62351, 62359, 32345, 62363, 62372, 62382, 62391, 32355, 62396, + 62403, 62412, 62418, 62426, 62433, 6095, 4397, 62438, 32283, 62444, + 62447, 62453, 62460, 62465, 62470, 23422, 62474, 62480, 62486, 62491, + 62496, 62500, 62506, 62512, 33483, 863, 35723, 36644, 36650, 32391, + 62517, 62521, 62525, 62528, 62541, 62547, 62551, 62554, 62559, 33786, + 62563, 31116, 21287, 62569, 6024, 6032, 9075, 62572, 62577, 62582, 62587, + 62592, 62597, 62602, 62607, 62612, 62617, 62623, 62628, 62633, 62639, + 62644, 62649, 62654, 62659, 62664, 62669, 62675, 62680, 62686, 62691, + 62696, 62701, 62706, 62711, 62716, 62721, 62726, 62731, 62736, 62742, + 62747, 62752, 62757, 62762, 62767, 62772, 62778, 62783, 62788, 62793, + 62798, 62803, 62808, 62813, 62818, 62823, 62829, 62834, 62839, 62844, + 62849, 62855, 62861, 62866, 62872, 62877, 62882, 62887, 62892, 62897, + 1513, 245, 62902, 62906, 62910, 62914, 25133, 62918, 62922, 62927, 62931, + 62936, 62940, 62945, 62950, 62955, 62959, 62963, 62968, 62972, 13369, + 62977, 62981, 62988, 62998, 15206, 63007, 63016, 63020, 63025, 63030, + 63034, 24924, 3019, 63038, 63044, 17363, 63048, 63057, 63065, 63071, + 63083, 63095, 63099, 63104, 63108, 63114, 63120, 63125, 63135, 63145, + 63151, 63156, 63160, 63165, 63171, 63180, 63189, 63197, 15560, 63201, + 63210, 63218, 63230, 63241, 63252, 63261, 63265, 63274, 63284, 63292, + 63298, 63303, 63309, 63314, 98, 30925, 63325, 26266, 26276, 63331, 63338, + 63344, 63348, 63358, 63369, 63377, 63386, 63391, 63396, 63400, 17317, + 63408, 63412, 63418, 63428, 63435, 63441, 34809, 63447, 63449, 63452, + 63456, 63466, 63472, 63479, 13315, 63486, 63492, 63501, 63510, 63516, + 63522, 63528, 63533, 63540, 63547, 63553, 63566, 63575, 63584, 63589, + 63593, 63599, 63606, 63613, 63620, 63627, 63634, 63639, 63643, 63647, + 63650, 63660, 63664, 63676, 63685, 63689, 63694, 63698, 63704, 63709, + 63716, 63725, 63733, 63741, 63746, 63750, 63755, 63760, 63770, 63778, + 63783, 63787, 63791, 63797, 63809, 63817, 63827, 63834, 63840, 63845, + 63849, 63853, 63857, 63866, 63875, 63884, 63890, 63896, 63902, 63907, + 63914, 63920, 63928, 63935, 12463, 63941, 63947, 63951, 14244, 63955, + 63960, 63970, 63979, 63985, 63991, 63999, 64006, 64010, 64014, 64020, + 64028, 64035, 64041, 64052, 64056, 64060, 64064, 64067, 64073, 64078, + 64082, 64086, 64095, 64103, 64110, 64116, 64123, 24046, 38870, 64128, + 64136, 64140, 64144, 64147, 64155, 64162, 64168, 64177, 64185, 64191, + 64196, 64200, 64205, 64209, 64213, 64218, 64227, 64231, 64238, 64245, + 64251, 64259, 64265, 64276, 64284, 64290, 22669, 64299, 64306, 64313, + 64320, 64327, 64334, 41907, 13153, 64341, 64348, 64353, 34845, 6217, + 64359, 64364, 64369, 64375, 64381, 64387, 64392, 64397, 64402, 64407, + 64413, 64418, 64424, 64429, 64435, 64440, 64445, 64450, 64455, 64460, + 64465, 64470, 64476, 64481, 64487, 64492, 64497, 64502, 64507, 64512, + 64517, 64523, 64528, 64533, 64538, 64543, 64548, 64553, 64558, 64563, + 64568, 64573, 64579, 64584, 64589, 64594, 64599, 64604, 64609, 64614, + 64619, 64625, 64630, 64635, 64640, 64645, 64650, 64655, 64660, 64665, + 64670, 64675, 64680, 64685, 64691, 1834, 224, 37446, 64696, 64699, 64704, + 64708, 64711, 64716, 63737, 64727, 64737, 64744, 64760, 64769, 64779, + 64789, 64797, 64811, 64819, 64823, 64826, 64833, 64839, 64850, 64862, + 64873, 64882, 64889, 1297, 23311, 64899, 2590, 64903, 64912, 1138, 17290, + 38083, 64920, 64928, 64942, 64955, 64959, 64964, 64969, 64974, 64980, + 64986, 64991, 8535, 64996, 65000, 65008, 11048, 65013, 65019, 65028, + 1721, 11060, 736, 65032, 65041, 65051, 27030, 65060, 65066, 16862, 65072, + 65076, 3964, 11391, 65082, 65089, 60693, 65093, 65097, 3988, 189, 14159, + 65103, 65115, 65119, 65125, 27751, 65129, 11379, 2730, 4, 65134, 65144, + 65150, 65161, 65168, 65174, 65180, 65188, 65195, 65201, 65211, 65221, + 65231, 23499, 1309, 65240, 65244, 65248, 65254, 65258, 2753, 2759, 8532, + 2264, 65262, 65266, 65275, 65283, 65294, 65302, 65310, 65316, 65321, + 65332, 65343, 65351, 65357, 9694, 65362, 65370, 65374, 65378, 65382, + 65394, 28136, 65401, 65411, 65417, 65423, 9796, 65433, 65444, 65454, + 65463, 65467, 65474, 1140, 1170, 65484, 65489, 65497, 65505, 65516, + 65523, 65537, 14088, 393, 65547, 65551, 65559, 65568, 65576, 65582, + 65596, 65603, 65609, 65618, 65625, 65635, 65643, 3812, 156, 65651, 65662, + 65666, 65678, 27949, 161, 65684, 65689, 65693, 65700, 65706, 65714, + 65721, 8818, 65728, 65737, 65745, 3878, 65758, 8199, 65762, 2798, 443, + 65767, 65780, 65785, 1833, 650, 65789, 3895, 65797, 65803, 65807, 931, + 65817, 65826, 65831, 14928, 14935, 45269, 65835, 3822, 13041, 65843, + 65850, 23555, 65854, 65861, 65867, 65872, 65877, 14948, 372, 65882, + 65894, 65900, 65908, 2810, 1753, 65916, 65918, 65923, 65928, 65933, + 65939, 65944, 65949, 65954, 65959, 65964, 65969, 65975, 65980, 65985, + 65990, 65995, 66000, 66005, 66010, 66015, 66021, 66026, 66031, 66036, + 66042, 66047, 66053, 66058, 66063, 66068, 66073, 66078, 66083, 66088, + 66094, 66099, 66105, 66110, 66115, 66120, 66125, 66130, 66135, 66140, + 66145, 66151, 66156, 66161, 66166, 66170, 66174, 66179, 66183, 66188, + 66193, 66199, 66204, 66208, 66213, 66217, 66220, 66222, 66226, 66229, + 66234, 66238, 66242, 66246, 66250, 66259, 66263, 32549, 66266, 32554, + 66273, 66278, 32559, 66287, 66296, 32565, 66301, 32570, 66310, 66315, + 11578, 66319, 66324, 66329, 32575, 66333, 40225, 66337, 66340, 66344, + 8211, 66350, 66355, 66359, 3705, 32580, 66362, 66366, 66369, 66374, + 66378, 66384, 66392, 66405, 66414, 66420, 66425, 66431, 66435, 66441, + 66449, 66454, 66458, 66465, 66471, 66479, 66488, 66496, 32583, 66503, + 66513, 66522, 66535, 66540, 66545, 66554, 66560, 66567, 66578, 66590, + 66597, 66606, 66615, 66624, 66631, 66637, 66644, 66652, 66659, 66667, + 66676, 66684, 66691, 66699, 66708, 66716, 66725, 66735, 66744, 66752, + 66759, 66767, 66776, 66784, 66793, 66803, 66812, 66820, 66829, 66839, + 66848, 66858, 66869, 66879, 66888, 66896, 66903, 66911, 66920, 66928, + 66937, 66947, 66956, 66964, 66973, 66983, 66992, 67002, 67013, 67023, + 67032, 67040, 67049, 67059, 67068, 67078, 67089, 67099, 67108, 67118, + 67129, 67139, 67150, 67162, 67173, 67183, 67192, 67200, 67207, 67215, + 67224, 67232, 67241, 67251, 67260, 67268, 67277, 67287, 67296, 67306, + 67317, 67327, 67336, 67344, 67353, 67363, 67372, 67382, 67393, 67403, + 67412, 67422, 67433, 67443, 67454, 67466, 67477, 67487, 67496, 67504, + 67513, 67523, 67532, 67542, 67553, 67563, 67572, 67582, 67593, 67603, + 67614, 67626, 67637, 67647, 67656, 67666, 67677, 67687, 67698, 67710, + 67721, 67731, 67742, 67754, 67765, 67777, 67790, 67802, 67813, 67823, + 67832, 67840, 67847, 67855, 67864, 67872, 67881, 67891, 67900, 67908, + 67917, 67927, 67936, 67946, 67957, 67967, 67976, 67984, 67993, 68003, + 68012, 68022, 68033, 68043, 68052, 68062, 68073, 68083, 68094, 68106, + 68117, 68127, 68136, 68144, 68153, 68163, 68172, 68182, 68193, 68203, + 68212, 68222, 68233, 68243, 68254, 68266, 68277, 68287, 68296, 68306, + 68317, 68327, 68338, 68350, 68361, 68371, 68382, 68394, 68405, 68417, + 68430, 68442, 68453, 68463, 68472, 68480, 68489, 68499, 68508, 68518, + 68529, 68539, 68548, 68558, 68569, 68579, 68590, 68602, 68613, 68623, + 68632, 68642, 68653, 68663, 68674, 68686, 68697, 68707, 68718, 68730, + 68741, 68753, 68766, 68778, 68789, 68799, 68808, 68818, 68829, 68839, + 68850, 68862, 68873, 68883, 68894, 68906, 68917, 68929, 68942, 68954, + 68965, 68975, 68986, 68998, 69009, 69021, 69034, 69046, 69057, 69069, + 69082, 69094, 69107, 69121, 69134, 69146, 69157, 69167, 69176, 69184, + 69191, 69196, 8058, 69203, 32593, 69208, 69213, 32598, 69219, 20929, + 32603, 69224, 69230, 69238, 69244, 69250, 69257, 69264, 69269, 69273, + 69276, 69280, 69289, 69295, 69307, 69318, 69322, 3081, 8033, 69327, + 69330, 69332, 69336, 69340, 69344, 69350, 69355, 25944, 69360, 69364, + 69367, 69372, 69376, 69383, 69389, 69393, 6170, 69397, 32620, 69402, + 69409, 69418, 69426, 69437, 69445, 69453, 69460, 69467, 69473, 69484, + 32625, 69489, 69500, 69512, 69520, 69531, 69540, 69551, 69556, 69564, + 2556, 69569, 34295, 69582, 69586, 69598, 69606, 69611, 69619, 17485, + 69630, 69636, 69643, 69651, 69657, 32635, 69662, 3914, 58254, 69669, + 69672, 69680, 69693, 69706, 69719, 69732, 69739, 69750, 69759, 41724, + 41729, 69764, 69768, 69776, 69783, 69792, 69800, 69806, 69815, 69823, + 69831, 69835, 69844, 69853, 69863, 69876, 69889, 69899, 32640, 69905, + 69912, 69918, 32646, 69923, 69926, 69930, 69938, 69947, 41462, 69955, + 69964, 69972, 69979, 69987, 69997, 70006, 70015, 70024, 70032, 70043, + 70053, 9366, 21567, 70062, 70067, 70072, 70076, 70080, 70085, 70091, + 70096, 70101, 70107, 70112, 70117, 21532, 70122, 70129, 70137, 70145, + 70150, 70157, 70164, 70169, 70173, 70177, 70185, 70193, 32663, 70199, + 70205, 70217, 70223, 70227, 70234, 70239, 70250, 70260, 70270, 70282, + 70288, 70298, 70308, 32690, 70317, 70326, 70332, 70344, 70355, 70362, + 70367, 70371, 70379, 70385, 70390, 70395, 70402, 70410, 70422, 70432, + 70441, 70450, 70457, 34157, 23851, 70463, 70468, 70472, 70476, 70481, + 70487, 70498, 70511, 70516, 70523, 32695, 70528, 70540, 70549, 70559, + 70570, 70583, 70590, 70599, 70608, 70616, 70621, 70627, 1069, 70632, + 70637, 70642, 70647, 70653, 70658, 70663, 70669, 70675, 70680, 70684, + 70689, 70694, 70699, 58766, 70704, 70709, 70714, 70719, 70725, 70731, + 70736, 70740, 70745, 70750, 70755, 70761, 70766, 70772, 70777, 70782, + 70787, 70792, 70796, 70802, 70807, 70816, 70821, 70826, 70831, 70836, + 70840, 70847, 70853, 17135, 17142, 70858, 70862, 70866, 70870, 70874, + 45524, 70878, 70808, 70880, 70890, 32704, 70893, 70902, 70908, 6143, + 32709, 70912, 70918, 70923, 70929, 70934, 70938, 70945, 70950, 70960, + 70969, 70973, 70979, 70985, 70991, 70995, 71003, 71010, 71018, 71026, + 32714, 71033, 71036, 71043, 71049, 71054, 71058, 71064, 71071, 71076, + 71080, 71089, 71097, 71103, 71108, 32719, 71115, 71122, 71128, 71133, + 71139, 71146, 71152, 21294, 27455, 71158, 71163, 71169, 71181, 70841, + 70848, 21470, 71191, 71196, 71203, 71209, 71216, 71222, 71233, 71238, + 9110, 71246, 71249, 71255, 71259, 71263, 71266, 71272, 32468, 6194, 964, + 13419, 71279, 71285, 71291, 71297, 71303, 71309, 71315, 71321, 71327, + 71332, 71337, 71342, 71347, 71352, 71357, 71362, 71367, 71372, 71377, + 71382, 71387, 71392, 71398, 71403, 71408, 71414, 71419, 71424, 71430, + 71436, 71442, 71448, 71454, 71460, 71466, 71472, 71478, 71483, 71488, + 71494, 71499, 71504, 71510, 71515, 71520, 71525, 71530, 71535, 71540, + 71545, 71550, 71555, 71560, 71565, 71570, 71576, 71581, 71586, 71591, + 71597, 71602, 71607, 71612, 71617, 71623, 71628, 71633, 71638, 71643, + 71648, 71653, 71658, 71663, 71668, 71673, 71678, 71683, 71688, 71693, + 71698, 71703, 71708, 71713, 71718, 71724, 71729, 71734, 71739, 71744, + 71749, 71754, 71759, 1864, 142, 71764, 71768, 71772, 71777, 71785, 71789, + 71796, 71804, 71808, 71821, 71829, 71833, 71836, 71841, 71845, 71850, + 71854, 71862, 71866, 20937, 71871, 71875, 60967, 71879, 71882, 71890, + 71898, 71906, 71911, 71918, 71924, 71930, 71935, 71942, 71947, 71955, + 64947, 71962, 71967, 71972, 71976, 11645, 71980, 71985, 71990, 71994, + 71997, 72003, 72007, 72017, 72026, 72029, 72033, 72040, 72053, 72059, + 72067, 72078, 72089, 72100, 72111, 72120, 72126, 72135, 72143, 72153, + 72166, 72173, 72184, 72190, 72195, 72200, 72206, 72212, 72222, 72231, + 70530, 72239, 72245, 72253, 72259, 72267, 72270, 72274, 72278, 72281, + 72287, 72293, 72301, 72313, 72325, 72332, 72336, 72347, 72355, 72362, + 72374, 72382, 72390, 72397, 72403, 72413, 72422, 72427, 72437, 72446, + 40788, 72453, 72457, 72462, 72470, 72477, 72483, 72487, 72497, 72508, + 72516, 72523, 72535, 72547, 72556, 69572, 72563, 72574, 72588, 72596, + 72606, 72613, 72621, 72633, 72642, 72650, 72660, 72671, 72683, 72692, + 72702, 72709, 72718, 72733, 72741, 72751, 72760, 72768, 72781, 72796, + 72800, 72809, 72821, 72832, 72843, 72854, 72864, 72875, 72883, 72889, + 72899, 72907, 72913, 29028, 72918, 72924, 72929, 72936, 9708, 17505, + 72942, 72951, 72956, 72960, 72967, 72973, 72978, 72983, 72991, 72999, + 73003, 73006, 73009, 73011, 73018, 73024, 73035, 73040, 73044, 73051, + 73057, 73062, 73070, 65446, 65456, 73076, 73083, 73093, 10618, 73100, + 73105, 29224, 73114, 73119, 73126, 73136, 73144, 73152, 73161, 73167, + 73173, 73180, 73187, 73192, 73196, 73204, 73209, 73214, 73222, 73229, + 73234, 73240, 73243, 73247, 73256, 71816, 73265, 73269, 73275, 73286, + 73296, 17514, 73307, 73315, 17526, 73322, 73326, 73335, 27341, 73342, + 73346, 73351, 73368, 73380, 10576, 73392, 73397, 73402, 73407, 21010, + 73411, 73416, 73421, 73427, 73432, 5846, 21014, 73437, 73442, 73448, + 73455, 73460, 73465, 73471, 73477, 73483, 73488, 73494, 73498, 73512, + 73520, 73528, 73534, 73539, 73546, 73556, 73565, 73570, 73575, 73583, + 73588, 73594, 73599, 73608, 59823, 73613, 73616, 73634, 73653, 73666, + 73680, 73696, 73703, 73710, 73716, 73723, 73728, 73734, 73740, 73748, + 73754, 73759, 73764, 73780, 10589, 73794, 73801, 73809, 73815, 73819, + 73822, 73827, 73832, 73839, 73844, 73853, 73858, 73864, 73873, 73882, + 73887, 73891, 73899, 73908, 11674, 73917, 73925, 73930, 73936, 11685, + 73941, 73944, 73949, 73959, 73968, 73973, 73979, 73984, 73992, 73999, + 74010, 74020, 74025, 64875, 74030, 74036, 74041, 74048, 74057, 74065, + 74071, 74077, 74084, 74090, 74094, 16960, 3055, 74099, 74103, 74107, + 74113, 74122, 74128, 74135, 74139, 74160, 74182, 74198, 74215, 74234, + 74243, 74253, 74260, 74267, 27228, 74273, 74277, 74285, 74297, 74303, + 74311, 74315, 74323, 74330, 74334, 74340, 74346, 74351, 3563, 41924, + 74357, 74361, 74365, 74369, 74374, 74379, 74384, 74390, 74396, 74402, + 74409, 74415, 74422, 74428, 74434, 74439, 74445, 74450, 74454, 74459, + 74463, 74468, 41939, 74472, 74477, 74485, 74489, 74494, 74501, 74510, + 74516, 74520, 74527, 74531, 74534, 74541, 74550, 74555, 74559, 74567, + 74576, 74580, 74588, 74594, 74599, 74604, 74610, 74616, 74621, 74625, + 74631, 74636, 74640, 74644, 74647, 74652, 74660, 74670, 74675, 39416, + 74683, 74695, 74699, 74705, 74717, 74728, 74735, 74741, 74748, 74760, + 74767, 74773, 21088, 74777, 74783, 74790, 74796, 74802, 74807, 74812, + 74817, 74826, 7033, 74831, 16426, 74837, 74841, 74845, 74849, 74857, + 74866, 74870, 74877, 74886, 74899, 74905, 74464, 30088, 74910, 74912, + 74917, 74922, 74927, 74932, 74937, 74942, 74947, 74952, 74957, 74962, + 74967, 74972, 74977, 74982, 74988, 74993, 74998, 75003, 75008, 75013, + 75018, 75023, 75028, 75034, 75040, 75046, 75051, 75056, 75068, 75073, + 1870, 46, 75078, 75083, 32746, 75087, 32751, 32756, 32762, 32767, 75091, + 32772, 22083, 75113, 75117, 75121, 75126, 75130, 32776, 75134, 75142, + 32781, 75149, 75152, 75157, 75161, 9543, 75170, 32786, 21945, 75173, + 75177, 1428, 75182, 32797, 75185, 75190, 25737, 25747, 35258, 75195, + 75200, 75205, 75210, 75216, 75221, 75230, 75235, 75242, 75248, 75253, + 75258, 75263, 75273, 75282, 75287, 75295, 75299, 75307, 32611, 37317, + 75314, 75320, 75325, 75330, 12016, 75335, 75341, 75346, 75353, 75359, + 75364, 75372, 75382, 75392, 75398, 75403, 75409, 17536, 75416, 36073, + 75429, 75434, 75440, 30993, 75453, 75459, 75463, 75472, 75479, 75485, + 75493, 75502, 75509, 75515, 75518, 75522, 25878, 75526, 75533, 75539, + 75547, 75552, 23994, 75558, 75561, 75569, 75577, 75591, 75598, 75604, + 75611, 75617, 32811, 75621, 75628, 75636, 75644, 75650, 32816, 75658, + 75664, 75669, 75679, 75685, 75694, 30830, 34716, 75702, 75707, 75712, + 75716, 75721, 75725, 75733, 14920, 39429, 75738, 75743, 32821, 62269, + 75747, 75752, 75756, 75765, 75773, 75779, 75784, 75790, 75797, 75803, + 75808, 75813, 75822, 75834, 75849, 33083, 75855, 16545, 32825, 75859, + 75866, 24104, 75872, 75879, 75888, 75895, 75904, 75910, 75915, 75923, + 75929, 32835, 75934, 75943, 74723, 75952, 75959, 75965, 75971, 75981, + 75989, 75996, 76000, 32840, 76003, 32846, 32852, 76008, 76016, 76024, + 76034, 76043, 76051, 76058, 76068, 32857, 76072, 76074, 76078, 76083, + 76087, 76091, 76097, 76102, 76106, 76117, 76122, 76127, 3060, 76131, + 76138, 76142, 76151, 76159, 76166, 76171, 76176, 62315, 76180, 76183, + 76189, 76197, 76203, 76207, 76212, 76219, 76224, 76230, 34747, 76235, + 76238, 76243, 76247, 76252, 76257, 76261, 76269, 76273, 25756, 25765, + 76279, 76285, 76291, 76296, 76300, 76303, 76313, 76322, 76327, 76333, + 76340, 76346, 76350, 76358, 76363, 34753, 76367, 76375, 76381, 76388, + 76393, 76397, 76402, 58440, 34759, 76408, 76413, 76417, 76422, 76427, + 76432, 76436, 76441, 76446, 76452, 76457, 76462, 76468, 76474, 76479, + 76483, 76488, 76493, 76498, 76502, 24103, 76507, 76512, 76518, 76524, + 76530, 76535, 76539, 76544, 76549, 76554, 76558, 76563, 76568, 76573, + 76578, 76582, 32865, 76590, 76594, 76602, 76610, 76621, 76626, 76630, + 22397, 76635, 76641, 76651, 76658, 76663, 76672, 76677, 76681, 76686, + 76694, 76702, 76709, 65109, 76715, 76723, 76730, 76741, 76747, 76751, + 76757, 32875, 76760, 76767, 76775, 76780, 39620, 76784, 76789, 76796, + 76801, 8992, 76805, 76813, 76820, 76827, 76833, 76847, 63381, 76855, + 76861, 76865, 76868, 76876, 76883, 76888, 76901, 76908, 76912, 76919, + 76924, 60860, 76929, 76932, 76939, 76945, 76949, 76957, 76966, 76976, + 76986, 76995, 77003, 77014, 77019, 77023, 77028, 77032, 35389, 77040, + 21357, 35398, 77045, 77050, 77055, 77060, 77065, 77070, 77075, 77079, + 77084, 77089, 77094, 77099, 77104, 77109, 77113, 77118, 77123, 77127, + 77131, 77135, 77139, 77144, 77149, 77153, 77158, 77162, 77166, 77171, + 77176, 77181, 77186, 77190, 77195, 77200, 77204, 77209, 77214, 77219, + 77224, 77229, 77234, 77239, 77244, 77249, 77254, 77259, 77264, 77269, + 77274, 77279, 77284, 77289, 77294, 77299, 77304, 77308, 77313, 77318, + 77323, 77328, 77333, 77338, 77343, 77348, 77353, 77358, 77363, 77367, + 77372, 77376, 77381, 77386, 77391, 77396, 77401, 77406, 77411, 77416, + 77421, 77425, 77429, 77434, 77439, 77443, 77448, 77453, 77457, 77462, + 77467, 77472, 77477, 77481, 77486, 77491, 77495, 77500, 77504, 77508, + 77512, 77516, 77521, 77525, 77529, 77533, 77537, 77541, 77545, 77549, + 77553, 77557, 77562, 77567, 77572, 77577, 77582, 77587, 77592, 77597, + 77602, 77607, 77611, 77615, 77619, 77623, 77627, 77631, 77636, 77640, + 77645, 77649, 77654, 77659, 77663, 77667, 77672, 77676, 77680, 77684, + 77688, 77692, 77696, 77700, 77704, 77708, 77712, 77716, 77720, 77724, + 77728, 77733, 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77767, + 77771, 77775, 77779, 77783, 77787, 77791, 77796, 77800, 77805, 77809, + 77813, 77817, 77821, 77825, 77829, 77833, 77837, 77841, 77845, 77849, + 77854, 77858, 77862, 77866, 77870, 77874, 77878, 77882, 77886, 77890, + 77894, 77898, 77903, 77907, 77911, 77916, 77921, 77925, 77929, 77933, + 77937, 77941, 77945, 77949, 77953, 77958, 77962, 77967, 77971, 77976, + 77980, 77985, 77989, 77995, 78000, 78004, 78009, 78013, 78018, 78022, + 78027, 78031, 78036, 1521, 78040, 2824, 1759, 1764, 78044, 78048, 2828, + 78052, 1397, 78057, 1342, 78061, 2840, 78065, 78072, 78079, 78093, 2844, + 7131, 78102, 78110, 78117, 78128, 78137, 78144, 78156, 78169, 78182, + 78193, 78198, 78205, 78217, 78221, 2848, 11747, 78231, 78236, 78245, + 78255, 2852, 78260, 78264, 78269, 78276, 78282, 78290, 78302, 1347, + 13042, 78312, 78316, 78322, 78336, 78348, 78360, 78370, 78379, 78388, + 78397, 78405, 78416, 78424, 4051, 78434, 78445, 78454, 78460, 78475, + 78482, 78488, 35514, 78493, 2876, 13046, 78497, 78504, 8930, 78513, 2881, + 32361, 78519, 60609, 78526, 78532, 78543, 78549, 78556, 78562, 78570, + 78577, 78583, 78593, 78602, 78613, 78620, 78626, 78636, 78644, 78650, + 78665, 78671, 78676, 78683, 78686, 78692, 78699, 78705, 78713, 78722, + 78730, 78736, 78745, 41464, 78759, 78764, 78770, 14757, 78775, 78788, + 78797, 78805, 78812, 78816, 78820, 78823, 78830, 78837, 78845, 78853, + 78862, 78870, 14684, 78878, 78883, 78887, 78899, 78906, 78915, 748, + 78925, 78934, 78945, 2897, 78949, 78953, 78959, 78972, 78984, 78994, + 79003, 79015, 26369, 79026, 79034, 79043, 79054, 79065, 79075, 79085, + 79094, 79102, 11312, 79109, 79113, 79116, 79121, 79126, 79130, 79136, + 1352, 11818, 79143, 79154, 79163, 79171, 79180, 79188, 79204, 79215, + 79224, 79232, 79244, 79255, 79271, 79281, 79302, 79315, 79323, 79330, + 14868, 79343, 79348, 79354, 5908, 79360, 79363, 79370, 79380, 8176, + 79387, 79392, 79397, 79402, 79410, 79419, 79427, 9756, 9765, 79432, + 79443, 79448, 79454, 2913, 2918, 79460, 10879, 79466, 79473, 79480, + 79493, 2251, 68, 79498, 79503, 79513, 79519, 79528, 79536, 79546, 79550, + 79555, 79559, 79571, 2941, 79579, 79587, 79592, 79603, 79614, 79623, + 79628, 79634, 79639, 79649, 79659, 79664, 79670, 79674, 79679, 79688, + 21410, 79692, 4128, 20, 79697, 79706, 79713, 79720, 79726, 79732, 864, + 79737, 79742, 60937, 79747, 79752, 79758, 79764, 79772, 79777, 79784, + 79790, 79795, 38030, 41358, 79801, 2945, 32, 79811, 79824, 79829, 79837, + 79842, 79848, 2967, 28310, 79853, 79861, 79868, 79873, 58682, 61940, + 79882, 79886, 1704, 1813, 79891, 79896, 79903, 1817, 247, 79910, 79916, + 2989, 79921, 79926, 79933, 1821, 79938, 79944, 79949, 79961, 6119, 79971, + 1828, 79977, 79982, 79989, 79996, 80011, 80018, 80029, 80037, 2618, + 80041, 80053, 80058, 80062, 80068, 28135, 2256, 80072, 80083, 80087, + 80091, 80097, 80101, 80110, 80114, 80125, 80129, 2302, 32190, 80133, + 80143, 3080, 9371, 80151, 80156, 80160, 80169, 80176, 80182, 3050, 17152, + 80186, 80199, 80217, 80222, 80230, 80238, 80248, 9985, 13154, 80260, + 80273, 80280, 80287, 80303, 80310, 80316, 1064, 80323, 80330, 80340, + 80349, 80361, 42328, 80369, 3064, 12030, 80372, 80380, 80384, 78272, + 3068, 80388, 21191, 12046, 3756, 80392, 3074, 80396, 80406, 80412, 80418, + 80424, 80430, 80436, 80442, 80448, 80454, 80460, 80466, 80472, 80478, + 80484, 80490, 80496, 80502, 80508, 80514, 80520, 80526, 80532, 80538, + 80544, 80550, 80556, 80563, 80570, 80576, 80582, 80588, 80594, 80600, + 80606, 1357, 16062, 12068, 80612, 80617, 80622, 80627, 80632, 80637, + 80642, 80647, 80652, 80657, 80662, 80667, 80672, 80677, 80682, 80687, + 80692, 80697, 80702, 80707, 80712, 80717, 80722, 80727, 80732, 80737, + 80743, 80748, 80753, 80759, 80764, 80770, 80775, 80780, 80786, 80791, + 80796, 80801, 80806, 80811, 80816, 80821, 80826, 80407, 80413, 80419, + 80425, 80431, 80437, 80443, 80449, 80455, 80461, 80467, 80473, 80479, + 80485, 80491, 80832, 80497, 80503, 80509, 80838, 80515, 80521, 80527, + 80533, 80539, 80545, 80551, 80571, 80844, 80850, 80577, 80856, 80583, + 80589, 80595, 80601, 80607, 3091, 3096, 80862, 80867, 80870, 80876, + 80882, 80889, 80894, 80899, 2307, }; /* code->name phrasebook */ #define phrasebook_shift 7 #define phrasebook_short 209 static unsigned char phrasebook[] = { - 0, 219, 19, 245, 32, 78, 223, 255, 78, 54, 50, 247, 133, 50, 225, 183, - 50, 254, 127, 254, 58, 43, 226, 4, 44, 226, 4, 253, 217, 96, 50, 249, - 220, 240, 168, 243, 230, 218, 130, 219, 47, 21, 210, 86, 21, 110, 21, - 105, 21, 158, 21, 161, 21, 189, 21, 194, 21, 198, 21, 195, 21, 200, 249, - 227, 220, 151, 233, 16, 50, 245, 99, 50, 242, 131, 50, 224, 14, 78, 249, - 218, 253, 207, 7, 6, 1, 61, 7, 6, 1, 253, 159, 7, 6, 1, 251, 67, 7, 6, 1, - 249, 61, 7, 6, 1, 75, 7, 6, 1, 245, 7, 7, 6, 1, 243, 203, 7, 6, 1, 242, - 61, 7, 6, 1, 73, 7, 6, 1, 235, 145, 7, 6, 1, 235, 24, 7, 6, 1, 156, 7, 6, - 1, 193, 7, 6, 1, 230, 26, 7, 6, 1, 76, 7, 6, 1, 226, 106, 7, 6, 1, 224, - 97, 7, 6, 1, 153, 7, 6, 1, 222, 92, 7, 6, 1, 217, 153, 7, 6, 1, 70, 7, 6, - 1, 214, 105, 7, 6, 1, 212, 98, 7, 6, 1, 211, 178, 7, 6, 1, 211, 117, 7, - 6, 1, 210, 159, 43, 42, 127, 223, 51, 219, 47, 44, 42, 127, 250, 32, 255, - 15, 121, 232, 214, 242, 138, 255, 15, 7, 4, 1, 61, 7, 4, 1, 253, 159, 7, - 4, 1, 251, 67, 7, 4, 1, 249, 61, 7, 4, 1, 75, 7, 4, 1, 245, 7, 7, 4, 1, - 243, 203, 7, 4, 1, 242, 61, 7, 4, 1, 73, 7, 4, 1, 235, 145, 7, 4, 1, 235, - 24, 7, 4, 1, 156, 7, 4, 1, 193, 7, 4, 1, 230, 26, 7, 4, 1, 76, 7, 4, 1, - 226, 106, 7, 4, 1, 224, 97, 7, 4, 1, 153, 7, 4, 1, 222, 92, 7, 4, 1, 217, - 153, 7, 4, 1, 70, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178, - 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 100, 127, 67, 232, 214, - 44, 249, 100, 127, 183, 228, 74, 219, 19, 235, 194, 245, 32, 78, 250, - 177, 50, 224, 229, 50, 249, 99, 50, 211, 40, 50, 251, 136, 130, 221, 174, - 50, 248, 2, 249, 164, 50, 244, 137, 226, 155, 235, 239, 233, 43, 52, 254, - 111, 223, 255, 78, 228, 53, 50, 219, 53, 240, 169, 223, 103, 50, 231, - 233, 248, 72, 50, 225, 22, 50, 218, 24, 105, 218, 24, 158, 255, 4, 255, - 15, 230, 229, 50, 225, 69, 50, 230, 225, 247, 121, 250, 184, 218, 24, - 110, 231, 149, 226, 155, 235, 239, 222, 248, 52, 254, 111, 223, 255, 78, - 212, 114, 244, 3, 123, 224, 22, 212, 114, 244, 3, 123, 242, 28, 212, 114, - 244, 3, 134, 224, 20, 235, 194, 224, 14, 78, 7, 6, 1, 115, 2, 242, 137, - 7, 6, 1, 115, 2, 142, 7, 6, 1, 115, 2, 250, 31, 7, 6, 1, 115, 2, 183, 7, - 6, 1, 115, 2, 248, 2, 7, 6, 1, 115, 2, 222, 235, 48, 7, 6, 1, 254, 244, - 7, 6, 1, 251, 68, 2, 250, 184, 7, 6, 1, 160, 2, 242, 137, 7, 6, 1, 160, - 2, 142, 7, 6, 1, 160, 2, 250, 31, 7, 6, 1, 160, 2, 248, 2, 7, 6, 1, 240, - 155, 2, 242, 137, 7, 6, 1, 240, 155, 2, 142, 7, 6, 1, 240, 155, 2, 250, - 31, 7, 6, 1, 240, 155, 2, 248, 2, 7, 6, 1, 245, 60, 7, 6, 1, 230, 27, 2, - 183, 7, 6, 1, 144, 2, 242, 137, 7, 6, 1, 144, 2, 142, 7, 6, 1, 144, 2, - 250, 31, 7, 6, 1, 144, 2, 183, 7, 6, 1, 144, 2, 248, 2, 230, 85, 50, 7, - 6, 1, 144, 2, 91, 7, 6, 1, 104, 2, 242, 137, 7, 6, 1, 104, 2, 142, 7, 6, - 1, 104, 2, 250, 31, 7, 6, 1, 104, 2, 248, 2, 7, 6, 1, 211, 118, 2, 142, - 7, 6, 1, 216, 152, 7, 4, 1, 220, 77, 222, 92, 7, 4, 1, 115, 2, 242, 137, - 7, 4, 1, 115, 2, 142, 7, 4, 1, 115, 2, 250, 31, 7, 4, 1, 115, 2, 183, 7, - 4, 1, 115, 2, 248, 2, 7, 4, 1, 115, 2, 222, 235, 48, 7, 4, 1, 254, 244, - 7, 4, 1, 251, 68, 2, 250, 184, 7, 4, 1, 160, 2, 242, 137, 7, 4, 1, 160, - 2, 142, 7, 4, 1, 160, 2, 250, 31, 7, 4, 1, 160, 2, 248, 2, 7, 4, 1, 240, - 155, 2, 242, 137, 7, 4, 1, 240, 155, 2, 142, 7, 4, 1, 240, 155, 2, 250, - 31, 7, 4, 1, 240, 155, 2, 248, 2, 7, 4, 1, 245, 60, 7, 4, 1, 230, 27, 2, - 183, 7, 4, 1, 144, 2, 242, 137, 7, 4, 1, 144, 2, 142, 7, 4, 1, 144, 2, - 250, 31, 7, 4, 1, 144, 2, 183, 7, 4, 1, 144, 2, 248, 2, 247, 170, 50, 7, - 4, 1, 144, 2, 91, 7, 4, 1, 104, 2, 242, 137, 7, 4, 1, 104, 2, 142, 7, 4, - 1, 104, 2, 250, 31, 7, 4, 1, 104, 2, 248, 2, 7, 4, 1, 211, 118, 2, 142, - 7, 4, 1, 216, 152, 7, 4, 1, 211, 118, 2, 248, 2, 7, 6, 1, 115, 2, 231, - 233, 7, 4, 1, 115, 2, 231, 233, 7, 6, 1, 115, 2, 251, 147, 7, 4, 1, 115, - 2, 251, 147, 7, 6, 1, 115, 2, 226, 225, 7, 4, 1, 115, 2, 226, 225, 7, 6, - 1, 251, 68, 2, 142, 7, 4, 1, 251, 68, 2, 142, 7, 6, 1, 251, 68, 2, 250, - 31, 7, 4, 1, 251, 68, 2, 250, 31, 7, 6, 1, 251, 68, 2, 59, 48, 7, 4, 1, - 251, 68, 2, 59, 48, 7, 6, 1, 251, 68, 2, 250, 235, 7, 4, 1, 251, 68, 2, - 250, 235, 7, 6, 1, 249, 62, 2, 250, 235, 7, 4, 1, 249, 62, 2, 250, 235, - 7, 6, 1, 249, 62, 2, 91, 7, 4, 1, 249, 62, 2, 91, 7, 6, 1, 160, 2, 231, - 233, 7, 4, 1, 160, 2, 231, 233, 7, 6, 1, 160, 2, 251, 147, 7, 4, 1, 160, - 2, 251, 147, 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, 1, - 160, 2, 226, 225, 7, 4, 1, 160, 2, 226, 225, 7, 6, 1, 160, 2, 250, 235, - 7, 4, 1, 160, 2, 250, 235, 7, 6, 1, 243, 204, 2, 250, 31, 7, 4, 1, 243, - 204, 2, 250, 31, 7, 6, 1, 243, 204, 2, 251, 147, 7, 4, 1, 243, 204, 2, - 251, 147, 7, 6, 1, 243, 204, 2, 59, 48, 7, 4, 1, 243, 204, 2, 59, 48, 7, - 6, 1, 243, 204, 2, 250, 184, 7, 4, 1, 243, 204, 2, 250, 184, 7, 6, 1, - 242, 62, 2, 250, 31, 7, 4, 1, 242, 62, 2, 250, 31, 7, 6, 1, 242, 62, 2, - 91, 7, 4, 1, 242, 62, 2, 91, 7, 6, 1, 240, 155, 2, 183, 7, 4, 1, 240, - 155, 2, 183, 7, 6, 1, 240, 155, 2, 231, 233, 7, 4, 1, 240, 155, 2, 231, - 233, 7, 6, 1, 240, 155, 2, 251, 147, 7, 4, 1, 240, 155, 2, 251, 147, 7, - 6, 1, 240, 155, 2, 226, 225, 7, 4, 1, 240, 155, 2, 226, 225, 7, 6, 1, - 240, 155, 2, 59, 48, 7, 4, 1, 247, 120, 73, 7, 6, 27, 236, 32, 7, 4, 27, - 236, 32, 7, 6, 1, 235, 146, 2, 250, 31, 7, 4, 1, 235, 146, 2, 250, 31, 7, - 6, 1, 235, 25, 2, 250, 184, 7, 4, 1, 235, 25, 2, 250, 184, 7, 4, 1, 233, - 240, 7, 6, 1, 233, 150, 2, 142, 7, 4, 1, 233, 150, 2, 142, 7, 6, 1, 233, - 150, 2, 250, 184, 7, 4, 1, 233, 150, 2, 250, 184, 7, 6, 1, 233, 150, 2, - 250, 235, 7, 4, 1, 233, 150, 2, 250, 235, 7, 6, 1, 233, 150, 2, 230, 225, - 247, 121, 7, 4, 1, 233, 150, 2, 230, 225, 247, 121, 7, 6, 1, 233, 150, 2, - 91, 7, 4, 1, 233, 150, 2, 91, 7, 6, 1, 230, 27, 2, 142, 7, 4, 1, 230, 27, - 2, 142, 7, 6, 1, 230, 27, 2, 250, 184, 7, 4, 1, 230, 27, 2, 250, 184, 7, - 6, 1, 230, 27, 2, 250, 235, 7, 4, 1, 230, 27, 2, 250, 235, 7, 4, 1, 230, - 27, 224, 205, 251, 79, 254, 58, 7, 6, 1, 245, 139, 7, 4, 1, 245, 139, 7, - 6, 1, 144, 2, 231, 233, 7, 4, 1, 144, 2, 231, 233, 7, 6, 1, 144, 2, 251, - 147, 7, 4, 1, 144, 2, 251, 147, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144, - 2, 52, 142, 7, 6, 27, 226, 235, 7, 4, 27, 226, 235, 7, 6, 1, 223, 225, 2, - 142, 7, 4, 1, 223, 225, 2, 142, 7, 6, 1, 223, 225, 2, 250, 184, 7, 4, 1, - 223, 225, 2, 250, 184, 7, 6, 1, 223, 225, 2, 250, 235, 7, 4, 1, 223, 225, - 2, 250, 235, 7, 6, 1, 222, 93, 2, 142, 7, 4, 1, 222, 93, 2, 142, 7, 6, 1, - 222, 93, 2, 250, 31, 7, 4, 1, 222, 93, 2, 250, 31, 7, 6, 1, 222, 93, 2, - 250, 184, 7, 4, 1, 222, 93, 2, 250, 184, 7, 6, 1, 222, 93, 2, 250, 235, - 7, 4, 1, 222, 93, 2, 250, 235, 7, 6, 1, 217, 154, 2, 250, 184, 7, 4, 1, - 217, 154, 2, 250, 184, 7, 6, 1, 217, 154, 2, 250, 235, 7, 4, 1, 217, 154, - 2, 250, 235, 7, 6, 1, 217, 154, 2, 91, 7, 4, 1, 217, 154, 2, 91, 7, 6, 1, - 104, 2, 183, 7, 4, 1, 104, 2, 183, 7, 6, 1, 104, 2, 231, 233, 7, 4, 1, - 104, 2, 231, 233, 7, 6, 1, 104, 2, 251, 147, 7, 4, 1, 104, 2, 251, 147, - 7, 6, 1, 104, 2, 222, 235, 48, 7, 4, 1, 104, 2, 222, 235, 48, 7, 6, 1, - 104, 2, 52, 142, 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 225, 7, - 4, 1, 104, 2, 226, 225, 7, 6, 1, 212, 99, 2, 250, 31, 7, 4, 1, 212, 99, - 2, 250, 31, 7, 6, 1, 211, 118, 2, 250, 31, 7, 4, 1, 211, 118, 2, 250, 31, - 7, 6, 1, 211, 118, 2, 248, 2, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210, + 0, 219, 20, 245, 39, 79, 224, 1, 79, 54, 50, 247, 140, 50, 225, 185, 50, + 254, 134, 254, 65, 43, 226, 7, 44, 226, 7, 253, 224, 96, 50, 249, 227, + 240, 174, 243, 236, 218, 131, 219, 48, 21, 210, 86, 21, 111, 21, 105, 21, + 158, 21, 161, 21, 190, 21, 195, 21, 199, 21, 196, 21, 201, 249, 234, 220, + 152, 233, 21, 50, 245, 106, 50, 242, 137, 50, 224, 16, 79, 249, 225, 253, + 214, 7, 6, 1, 61, 7, 6, 1, 253, 166, 7, 6, 1, 251, 74, 7, 6, 1, 249, 68, + 7, 6, 1, 76, 7, 6, 1, 245, 14, 7, 6, 1, 243, 209, 7, 6, 1, 242, 67, 7, 6, + 1, 74, 7, 6, 1, 235, 150, 7, 6, 1, 235, 29, 7, 6, 1, 156, 7, 6, 1, 194, + 7, 6, 1, 230, 30, 7, 6, 1, 78, 7, 6, 1, 226, 109, 7, 6, 1, 224, 99, 7, 6, + 1, 153, 7, 6, 1, 222, 93, 7, 6, 1, 217, 153, 7, 6, 1, 69, 7, 6, 1, 214, + 105, 7, 6, 1, 212, 98, 7, 6, 1, 211, 178, 7, 6, 1, 211, 117, 7, 6, 1, + 210, 159, 43, 42, 127, 223, 53, 219, 48, 44, 42, 127, 250, 39, 255, 23, + 121, 232, 219, 242, 144, 255, 23, 7, 4, 1, 61, 7, 4, 1, 253, 166, 7, 4, + 1, 251, 74, 7, 4, 1, 249, 68, 7, 4, 1, 76, 7, 4, 1, 245, 14, 7, 4, 1, + 243, 209, 7, 4, 1, 242, 67, 7, 4, 1, 74, 7, 4, 1, 235, 150, 7, 4, 1, 235, + 29, 7, 4, 1, 156, 7, 4, 1, 194, 7, 4, 1, 230, 30, 7, 4, 1, 78, 7, 4, 1, + 226, 109, 7, 4, 1, 224, 99, 7, 4, 1, 153, 7, 4, 1, 222, 93, 7, 4, 1, 217, + 153, 7, 4, 1, 69, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178, + 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 107, 127, 67, 232, 219, + 44, 249, 107, 127, 184, 228, 78, 219, 20, 235, 200, 245, 39, 79, 250, + 184, 50, 224, 231, 50, 249, 106, 50, 211, 40, 50, 251, 143, 130, 221, + 175, 50, 248, 9, 249, 171, 50, 244, 144, 226, 158, 235, 245, 233, 48, 52, + 254, 118, 224, 1, 79, 228, 57, 50, 219, 54, 240, 175, 223, 105, 50, 231, + 237, 248, 79, 50, 225, 24, 50, 218, 24, 105, 218, 24, 158, 255, 12, 255, + 23, 230, 233, 50, 225, 71, 50, 230, 229, 247, 128, 250, 191, 218, 24, + 111, 231, 153, 226, 158, 235, 245, 222, 250, 52, 254, 118, 224, 1, 79, + 212, 114, 244, 10, 123, 224, 24, 212, 114, 244, 10, 123, 242, 34, 212, + 114, 244, 10, 134, 224, 22, 235, 200, 224, 16, 79, 7, 6, 1, 116, 2, 242, + 143, 7, 6, 1, 116, 2, 142, 7, 6, 1, 116, 2, 250, 38, 7, 6, 1, 116, 2, + 184, 7, 6, 1, 116, 2, 248, 9, 7, 6, 1, 116, 2, 222, 237, 48, 7, 6, 1, + 254, 252, 7, 6, 1, 251, 75, 2, 250, 191, 7, 6, 1, 160, 2, 242, 143, 7, 6, + 1, 160, 2, 142, 7, 6, 1, 160, 2, 250, 38, 7, 6, 1, 160, 2, 248, 9, 7, 6, + 1, 240, 161, 2, 242, 143, 7, 6, 1, 240, 161, 2, 142, 7, 6, 1, 240, 161, + 2, 250, 38, 7, 6, 1, 240, 161, 2, 248, 9, 7, 6, 1, 245, 67, 7, 6, 1, 230, + 31, 2, 184, 7, 6, 1, 144, 2, 242, 143, 7, 6, 1, 144, 2, 142, 7, 6, 1, + 144, 2, 250, 38, 7, 6, 1, 144, 2, 184, 7, 6, 1, 144, 2, 248, 9, 230, 89, + 50, 7, 6, 1, 144, 2, 91, 7, 6, 1, 104, 2, 242, 143, 7, 6, 1, 104, 2, 142, + 7, 6, 1, 104, 2, 250, 38, 7, 6, 1, 104, 2, 248, 9, 7, 6, 1, 211, 118, 2, + 142, 7, 6, 1, 216, 152, 7, 4, 1, 220, 78, 222, 93, 7, 4, 1, 116, 2, 242, + 143, 7, 4, 1, 116, 2, 142, 7, 4, 1, 116, 2, 250, 38, 7, 4, 1, 116, 2, + 184, 7, 4, 1, 116, 2, 248, 9, 7, 4, 1, 116, 2, 222, 237, 48, 7, 4, 1, + 254, 252, 7, 4, 1, 251, 75, 2, 250, 191, 7, 4, 1, 160, 2, 242, 143, 7, 4, + 1, 160, 2, 142, 7, 4, 1, 160, 2, 250, 38, 7, 4, 1, 160, 2, 248, 9, 7, 4, + 1, 240, 161, 2, 242, 143, 7, 4, 1, 240, 161, 2, 142, 7, 4, 1, 240, 161, + 2, 250, 38, 7, 4, 1, 240, 161, 2, 248, 9, 7, 4, 1, 245, 67, 7, 4, 1, 230, + 31, 2, 184, 7, 4, 1, 144, 2, 242, 143, 7, 4, 1, 144, 2, 142, 7, 4, 1, + 144, 2, 250, 38, 7, 4, 1, 144, 2, 184, 7, 4, 1, 144, 2, 248, 9, 247, 177, + 50, 7, 4, 1, 144, 2, 91, 7, 4, 1, 104, 2, 242, 143, 7, 4, 1, 104, 2, 142, + 7, 4, 1, 104, 2, 250, 38, 7, 4, 1, 104, 2, 248, 9, 7, 4, 1, 211, 118, 2, + 142, 7, 4, 1, 216, 152, 7, 4, 1, 211, 118, 2, 248, 9, 7, 6, 1, 116, 2, + 231, 237, 7, 4, 1, 116, 2, 231, 237, 7, 6, 1, 116, 2, 251, 154, 7, 4, 1, + 116, 2, 251, 154, 7, 6, 1, 116, 2, 226, 228, 7, 4, 1, 116, 2, 226, 228, + 7, 6, 1, 251, 75, 2, 142, 7, 4, 1, 251, 75, 2, 142, 7, 6, 1, 251, 75, 2, + 250, 38, 7, 4, 1, 251, 75, 2, 250, 38, 7, 6, 1, 251, 75, 2, 59, 48, 7, 4, + 1, 251, 75, 2, 59, 48, 7, 6, 1, 251, 75, 2, 250, 242, 7, 4, 1, 251, 75, + 2, 250, 242, 7, 6, 1, 249, 69, 2, 250, 242, 7, 4, 1, 249, 69, 2, 250, + 242, 7, 6, 1, 249, 69, 2, 91, 7, 4, 1, 249, 69, 2, 91, 7, 6, 1, 160, 2, + 231, 237, 7, 4, 1, 160, 2, 231, 237, 7, 6, 1, 160, 2, 251, 154, 7, 4, 1, + 160, 2, 251, 154, 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, + 1, 160, 2, 226, 228, 7, 4, 1, 160, 2, 226, 228, 7, 6, 1, 160, 2, 250, + 242, 7, 4, 1, 160, 2, 250, 242, 7, 6, 1, 243, 210, 2, 250, 38, 7, 4, 1, + 243, 210, 2, 250, 38, 7, 6, 1, 243, 210, 2, 251, 154, 7, 4, 1, 243, 210, + 2, 251, 154, 7, 6, 1, 243, 210, 2, 59, 48, 7, 4, 1, 243, 210, 2, 59, 48, + 7, 6, 1, 243, 210, 2, 250, 191, 7, 4, 1, 243, 210, 2, 250, 191, 7, 6, 1, + 242, 68, 2, 250, 38, 7, 4, 1, 242, 68, 2, 250, 38, 7, 6, 1, 242, 68, 2, + 91, 7, 4, 1, 242, 68, 2, 91, 7, 6, 1, 240, 161, 2, 184, 7, 4, 1, 240, + 161, 2, 184, 7, 6, 1, 240, 161, 2, 231, 237, 7, 4, 1, 240, 161, 2, 231, + 237, 7, 6, 1, 240, 161, 2, 251, 154, 7, 4, 1, 240, 161, 2, 251, 154, 7, + 6, 1, 240, 161, 2, 226, 228, 7, 4, 1, 240, 161, 2, 226, 228, 7, 6, 1, + 240, 161, 2, 59, 48, 7, 4, 1, 247, 127, 74, 7, 6, 27, 236, 38, 7, 4, 27, + 236, 38, 7, 6, 1, 235, 151, 2, 250, 38, 7, 4, 1, 235, 151, 2, 250, 38, 7, + 6, 1, 235, 30, 2, 250, 191, 7, 4, 1, 235, 30, 2, 250, 191, 7, 4, 1, 233, + 245, 7, 6, 1, 233, 155, 2, 142, 7, 4, 1, 233, 155, 2, 142, 7, 6, 1, 233, + 155, 2, 250, 191, 7, 4, 1, 233, 155, 2, 250, 191, 7, 6, 1, 233, 155, 2, + 250, 242, 7, 4, 1, 233, 155, 2, 250, 242, 7, 6, 1, 233, 155, 2, 230, 229, + 247, 128, 7, 4, 1, 233, 155, 2, 230, 229, 247, 128, 7, 6, 1, 233, 155, 2, + 91, 7, 4, 1, 233, 155, 2, 91, 7, 6, 1, 230, 31, 2, 142, 7, 4, 1, 230, 31, + 2, 142, 7, 6, 1, 230, 31, 2, 250, 191, 7, 4, 1, 230, 31, 2, 250, 191, 7, + 6, 1, 230, 31, 2, 250, 242, 7, 4, 1, 230, 31, 2, 250, 242, 7, 4, 1, 230, + 31, 224, 207, 251, 86, 254, 65, 7, 6, 1, 245, 146, 7, 4, 1, 245, 146, 7, + 6, 1, 144, 2, 231, 237, 7, 4, 1, 144, 2, 231, 237, 7, 6, 1, 144, 2, 251, + 154, 7, 4, 1, 144, 2, 251, 154, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144, + 2, 52, 142, 7, 6, 27, 226, 238, 7, 4, 27, 226, 238, 7, 6, 1, 223, 227, 2, + 142, 7, 4, 1, 223, 227, 2, 142, 7, 6, 1, 223, 227, 2, 250, 191, 7, 4, 1, + 223, 227, 2, 250, 191, 7, 6, 1, 223, 227, 2, 250, 242, 7, 4, 1, 223, 227, + 2, 250, 242, 7, 6, 1, 222, 94, 2, 142, 7, 4, 1, 222, 94, 2, 142, 7, 6, 1, + 222, 94, 2, 250, 38, 7, 4, 1, 222, 94, 2, 250, 38, 7, 6, 1, 222, 94, 2, + 250, 191, 7, 4, 1, 222, 94, 2, 250, 191, 7, 6, 1, 222, 94, 2, 250, 242, + 7, 4, 1, 222, 94, 2, 250, 242, 7, 6, 1, 217, 154, 2, 250, 191, 7, 4, 1, + 217, 154, 2, 250, 191, 7, 6, 1, 217, 154, 2, 250, 242, 7, 4, 1, 217, 154, + 2, 250, 242, 7, 6, 1, 217, 154, 2, 91, 7, 4, 1, 217, 154, 2, 91, 7, 6, 1, + 104, 2, 184, 7, 4, 1, 104, 2, 184, 7, 6, 1, 104, 2, 231, 237, 7, 4, 1, + 104, 2, 231, 237, 7, 6, 1, 104, 2, 251, 154, 7, 4, 1, 104, 2, 251, 154, + 7, 6, 1, 104, 2, 222, 237, 48, 7, 4, 1, 104, 2, 222, 237, 48, 7, 6, 1, + 104, 2, 52, 142, 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 228, 7, + 4, 1, 104, 2, 226, 228, 7, 6, 1, 212, 99, 2, 250, 38, 7, 4, 1, 212, 99, + 2, 250, 38, 7, 6, 1, 211, 118, 2, 250, 38, 7, 4, 1, 211, 118, 2, 250, 38, + 7, 6, 1, 211, 118, 2, 248, 9, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210, 160, 2, 142, 7, 6, 1, 210, 160, 2, 59, 48, 7, 4, 1, 210, 160, 2, 59, 48, - 7, 6, 1, 210, 160, 2, 250, 235, 7, 4, 1, 210, 160, 2, 250, 235, 7, 4, 1, - 199, 222, 92, 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2, - 216, 12, 7, 4, 1, 57, 2, 216, 12, 7, 6, 1, 138, 194, 7, 4, 1, 138, 194, - 7, 6, 1, 204, 76, 7, 6, 1, 251, 68, 2, 103, 7, 4, 1, 251, 68, 2, 103, 7, - 6, 1, 254, 220, 249, 61, 7, 6, 1, 249, 62, 2, 103, 7, 6, 1, 249, 62, 2, - 216, 12, 7, 4, 1, 249, 62, 2, 216, 12, 7, 4, 1, 215, 94, 248, 55, 7, 6, - 1, 223, 50, 75, 7, 6, 1, 221, 196, 7, 6, 1, 204, 75, 7, 6, 1, 245, 8, 2, - 103, 7, 4, 1, 245, 8, 2, 103, 7, 6, 1, 243, 204, 2, 103, 7, 6, 1, 243, - 108, 7, 4, 1, 240, 202, 7, 6, 1, 235, 186, 7, 6, 1, 240, 155, 2, 91, 7, - 6, 1, 235, 25, 2, 103, 7, 4, 1, 235, 25, 2, 103, 7, 4, 1, 233, 150, 2, - 130, 7, 4, 1, 233, 101, 2, 91, 7, 6, 1, 215, 94, 193, 7, 6, 1, 230, 27, - 2, 43, 103, 7, 4, 1, 230, 27, 2, 199, 44, 233, 37, 7, 6, 1, 144, 2, 230, - 225, 183, 7, 6, 1, 144, 2, 240, 249, 7, 4, 1, 144, 2, 240, 249, 7, 6, 1, - 226, 220, 7, 4, 1, 226, 220, 7, 6, 1, 226, 107, 2, 103, 7, 4, 1, 226, - 107, 2, 103, 7, 1, 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6, - 1, 245, 76, 7, 1, 223, 50, 245, 77, 232, 124, 7, 4, 1, 217, 154, 2, 226, - 67, 103, 7, 6, 1, 217, 154, 2, 103, 7, 4, 1, 217, 154, 2, 103, 7, 6, 1, - 217, 154, 2, 223, 56, 103, 7, 6, 1, 104, 2, 240, 249, 7, 4, 1, 104, 2, - 240, 249, 7, 6, 1, 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211, + 7, 6, 1, 210, 160, 2, 250, 242, 7, 4, 1, 210, 160, 2, 250, 242, 7, 4, 1, + 200, 222, 93, 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2, + 216, 12, 7, 4, 1, 57, 2, 216, 12, 7, 6, 1, 138, 195, 7, 4, 1, 138, 195, + 7, 6, 1, 204, 78, 7, 6, 1, 251, 75, 2, 103, 7, 4, 1, 251, 75, 2, 103, 7, + 6, 1, 254, 228, 249, 68, 7, 6, 1, 249, 69, 2, 103, 7, 6, 1, 249, 69, 2, + 216, 12, 7, 4, 1, 249, 69, 2, 216, 12, 7, 4, 1, 215, 94, 248, 62, 7, 6, + 1, 223, 52, 76, 7, 6, 1, 221, 197, 7, 6, 1, 204, 76, 7, 6, 1, 245, 15, 2, + 103, 7, 4, 1, 245, 15, 2, 103, 7, 6, 1, 243, 210, 2, 103, 7, 6, 1, 243, + 114, 7, 4, 1, 240, 208, 7, 6, 1, 235, 192, 7, 6, 1, 240, 161, 2, 91, 7, + 6, 1, 235, 30, 2, 103, 7, 4, 1, 235, 30, 2, 103, 7, 4, 1, 233, 155, 2, + 130, 7, 4, 1, 233, 106, 2, 91, 7, 6, 1, 215, 94, 194, 7, 6, 1, 230, 31, + 2, 43, 103, 7, 4, 1, 230, 31, 2, 200, 44, 233, 42, 7, 6, 1, 144, 2, 230, + 229, 184, 7, 6, 1, 144, 2, 240, 255, 7, 4, 1, 144, 2, 240, 255, 7, 6, 1, + 226, 223, 7, 4, 1, 226, 223, 7, 6, 1, 226, 110, 2, 103, 7, 4, 1, 226, + 110, 2, 103, 7, 1, 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6, + 1, 245, 83, 7, 1, 223, 52, 245, 84, 232, 129, 7, 4, 1, 217, 154, 2, 226, + 70, 103, 7, 6, 1, 217, 154, 2, 103, 7, 4, 1, 217, 154, 2, 103, 7, 6, 1, + 217, 154, 2, 223, 58, 103, 7, 6, 1, 104, 2, 240, 255, 7, 4, 1, 104, 2, + 240, 255, 7, 6, 1, 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211, 118, 2, 103, 7, 4, 1, 211, 118, 2, 103, 7, 6, 1, 210, 160, 2, 91, 7, 4, - 1, 210, 160, 2, 91, 7, 6, 1, 245, 9, 7, 6, 1, 245, 10, 223, 49, 7, 4, 1, - 245, 10, 223, 49, 7, 4, 1, 245, 10, 2, 217, 78, 7, 1, 113, 2, 91, 7, 6, - 1, 138, 189, 7, 4, 1, 138, 189, 7, 1, 235, 194, 242, 181, 218, 131, 2, - 91, 7, 1, 211, 181, 7, 1, 248, 48, 250, 12, 7, 1, 233, 78, 250, 12, 7, 1, - 254, 138, 250, 12, 7, 1, 223, 56, 250, 12, 7, 6, 1, 246, 41, 2, 250, 235, - 7, 6, 1, 249, 62, 2, 4, 1, 210, 160, 2, 250, 235, 7, 4, 1, 246, 41, 2, - 250, 235, 7, 6, 1, 232, 189, 7, 6, 1, 233, 150, 2, 4, 1, 235, 145, 7, 4, - 1, 232, 189, 7, 6, 1, 228, 187, 7, 6, 1, 230, 27, 2, 4, 1, 235, 145, 7, - 4, 1, 228, 187, 7, 6, 1, 115, 2, 250, 235, 7, 4, 1, 115, 2, 250, 235, 7, - 6, 1, 240, 155, 2, 250, 235, 7, 4, 1, 240, 155, 2, 250, 235, 7, 6, 1, - 144, 2, 250, 235, 7, 4, 1, 144, 2, 250, 235, 7, 6, 1, 104, 2, 250, 235, - 7, 4, 1, 104, 2, 250, 235, 7, 6, 1, 104, 2, 248, 3, 22, 231, 233, 7, 4, - 1, 104, 2, 248, 3, 22, 231, 233, 7, 6, 1, 104, 2, 248, 3, 22, 142, 7, 4, - 1, 104, 2, 248, 3, 22, 142, 7, 6, 1, 104, 2, 248, 3, 22, 250, 235, 7, 4, - 1, 104, 2, 248, 3, 22, 250, 235, 7, 6, 1, 104, 2, 248, 3, 22, 242, 137, - 7, 4, 1, 104, 2, 248, 3, 22, 242, 137, 7, 4, 1, 215, 94, 75, 7, 6, 1, - 115, 2, 248, 3, 22, 231, 233, 7, 4, 1, 115, 2, 248, 3, 22, 231, 233, 7, - 6, 1, 115, 2, 59, 77, 22, 231, 233, 7, 4, 1, 115, 2, 59, 77, 22, 231, - 233, 7, 6, 1, 254, 245, 2, 231, 233, 7, 4, 1, 254, 245, 2, 231, 233, 7, - 6, 1, 243, 204, 2, 91, 7, 4, 1, 243, 204, 2, 91, 7, 6, 1, 243, 204, 2, - 250, 235, 7, 4, 1, 243, 204, 2, 250, 235, 7, 6, 1, 235, 25, 2, 250, 235, - 7, 4, 1, 235, 25, 2, 250, 235, 7, 6, 1, 144, 2, 226, 225, 7, 4, 1, 144, - 2, 226, 225, 7, 6, 1, 144, 2, 226, 226, 22, 231, 233, 7, 4, 1, 144, 2, - 226, 226, 22, 231, 233, 7, 6, 1, 245, 10, 2, 250, 235, 7, 4, 1, 245, 10, - 2, 250, 235, 7, 4, 1, 235, 146, 2, 250, 235, 7, 6, 1, 246, 40, 7, 6, 1, - 249, 62, 2, 4, 1, 210, 159, 7, 4, 1, 246, 40, 7, 6, 1, 243, 204, 2, 142, - 7, 4, 1, 243, 204, 2, 142, 7, 6, 1, 240, 200, 7, 6, 1, 211, 181, 7, 6, 1, - 230, 27, 2, 242, 137, 7, 4, 1, 230, 27, 2, 242, 137, 7, 6, 1, 115, 2, - 222, 235, 77, 22, 142, 7, 4, 1, 115, 2, 222, 235, 77, 22, 142, 7, 6, 1, - 254, 245, 2, 142, 7, 4, 1, 254, 245, 2, 142, 7, 6, 1, 144, 2, 218, 104, - 22, 142, 7, 4, 1, 144, 2, 218, 104, 22, 142, 7, 6, 1, 115, 2, 52, 242, - 137, 7, 4, 1, 115, 2, 52, 242, 137, 7, 6, 1, 115, 2, 235, 194, 251, 147, - 7, 4, 1, 115, 2, 235, 194, 251, 147, 7, 6, 1, 160, 2, 52, 242, 137, 7, 4, - 1, 160, 2, 52, 242, 137, 7, 6, 1, 160, 2, 235, 194, 251, 147, 7, 4, 1, - 160, 2, 235, 194, 251, 147, 7, 6, 1, 240, 155, 2, 52, 242, 137, 7, 4, 1, - 240, 155, 2, 52, 242, 137, 7, 6, 1, 240, 155, 2, 235, 194, 251, 147, 7, - 4, 1, 240, 155, 2, 235, 194, 251, 147, 7, 6, 1, 144, 2, 52, 242, 137, 7, - 4, 1, 144, 2, 52, 242, 137, 7, 6, 1, 144, 2, 235, 194, 251, 147, 7, 4, 1, - 144, 2, 235, 194, 251, 147, 7, 6, 1, 223, 225, 2, 52, 242, 137, 7, 4, 1, - 223, 225, 2, 52, 242, 137, 7, 6, 1, 223, 225, 2, 235, 194, 251, 147, 7, - 4, 1, 223, 225, 2, 235, 194, 251, 147, 7, 6, 1, 104, 2, 52, 242, 137, 7, - 4, 1, 104, 2, 52, 242, 137, 7, 6, 1, 104, 2, 235, 194, 251, 147, 7, 4, 1, - 104, 2, 235, 194, 251, 147, 7, 6, 1, 222, 93, 2, 249, 221, 51, 7, 4, 1, - 222, 93, 2, 249, 221, 51, 7, 6, 1, 217, 154, 2, 249, 221, 51, 7, 4, 1, - 217, 154, 2, 249, 221, 51, 7, 6, 1, 210, 231, 7, 4, 1, 210, 231, 7, 6, 1, - 242, 62, 2, 250, 235, 7, 4, 1, 242, 62, 2, 250, 235, 7, 6, 1, 230, 27, 2, - 199, 44, 233, 37, 7, 4, 1, 249, 62, 2, 249, 101, 7, 6, 1, 226, 135, 7, 4, - 1, 226, 135, 7, 6, 1, 210, 160, 2, 103, 7, 4, 1, 210, 160, 2, 103, 7, 6, - 1, 115, 2, 59, 48, 7, 4, 1, 115, 2, 59, 48, 7, 6, 1, 160, 2, 250, 184, 7, - 4, 1, 160, 2, 250, 184, 7, 6, 1, 144, 2, 248, 3, 22, 231, 233, 7, 4, 1, - 144, 2, 248, 3, 22, 231, 233, 7, 6, 1, 144, 2, 216, 90, 22, 231, 233, 7, - 4, 1, 144, 2, 216, 90, 22, 231, 233, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1, - 144, 2, 59, 48, 7, 6, 1, 144, 2, 59, 77, 22, 231, 233, 7, 4, 1, 144, 2, - 59, 77, 22, 231, 233, 7, 6, 1, 211, 118, 2, 231, 233, 7, 4, 1, 211, 118, - 2, 231, 233, 7, 4, 1, 233, 150, 2, 249, 101, 7, 4, 1, 230, 27, 2, 249, - 101, 7, 4, 1, 217, 154, 2, 249, 101, 7, 4, 1, 247, 120, 235, 145, 7, 4, - 1, 248, 144, 247, 221, 7, 4, 1, 224, 32, 247, 221, 7, 6, 1, 115, 2, 91, - 7, 6, 1, 251, 68, 2, 91, 7, 4, 1, 251, 68, 2, 91, 7, 6, 1, 233, 150, 2, - 130, 7, 6, 1, 217, 154, 2, 248, 0, 91, 7, 4, 1, 222, 93, 2, 217, 251, - 217, 78, 7, 4, 1, 210, 160, 2, 217, 251, 217, 78, 7, 6, 1, 242, 181, 218, - 130, 7, 4, 1, 242, 181, 218, 130, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130, + 1, 210, 160, 2, 91, 7, 6, 1, 245, 16, 7, 6, 1, 245, 17, 223, 51, 7, 4, 1, + 245, 17, 223, 51, 7, 4, 1, 245, 17, 2, 217, 78, 7, 1, 113, 2, 91, 7, 6, + 1, 138, 190, 7, 4, 1, 138, 190, 7, 1, 235, 200, 242, 187, 218, 132, 2, + 91, 7, 1, 211, 181, 7, 1, 248, 55, 250, 19, 7, 1, 233, 83, 250, 19, 7, 1, + 254, 145, 250, 19, 7, 1, 223, 58, 250, 19, 7, 6, 1, 246, 48, 2, 250, 242, + 7, 6, 1, 249, 69, 2, 4, 1, 210, 160, 2, 250, 242, 7, 4, 1, 246, 48, 2, + 250, 242, 7, 6, 1, 232, 194, 7, 6, 1, 233, 155, 2, 4, 1, 235, 150, 7, 4, + 1, 232, 194, 7, 6, 1, 228, 191, 7, 6, 1, 230, 31, 2, 4, 1, 235, 150, 7, + 4, 1, 228, 191, 7, 6, 1, 116, 2, 250, 242, 7, 4, 1, 116, 2, 250, 242, 7, + 6, 1, 240, 161, 2, 250, 242, 7, 4, 1, 240, 161, 2, 250, 242, 7, 6, 1, + 144, 2, 250, 242, 7, 4, 1, 144, 2, 250, 242, 7, 6, 1, 104, 2, 250, 242, + 7, 4, 1, 104, 2, 250, 242, 7, 6, 1, 104, 2, 248, 10, 22, 231, 237, 7, 4, + 1, 104, 2, 248, 10, 22, 231, 237, 7, 6, 1, 104, 2, 248, 10, 22, 142, 7, + 4, 1, 104, 2, 248, 10, 22, 142, 7, 6, 1, 104, 2, 248, 10, 22, 250, 242, + 7, 4, 1, 104, 2, 248, 10, 22, 250, 242, 7, 6, 1, 104, 2, 248, 10, 22, + 242, 143, 7, 4, 1, 104, 2, 248, 10, 22, 242, 143, 7, 4, 1, 215, 94, 76, + 7, 6, 1, 116, 2, 248, 10, 22, 231, 237, 7, 4, 1, 116, 2, 248, 10, 22, + 231, 237, 7, 6, 1, 116, 2, 59, 72, 22, 231, 237, 7, 4, 1, 116, 2, 59, 72, + 22, 231, 237, 7, 6, 1, 254, 253, 2, 231, 237, 7, 4, 1, 254, 253, 2, 231, + 237, 7, 6, 1, 243, 210, 2, 91, 7, 4, 1, 243, 210, 2, 91, 7, 6, 1, 243, + 210, 2, 250, 242, 7, 4, 1, 243, 210, 2, 250, 242, 7, 6, 1, 235, 30, 2, + 250, 242, 7, 4, 1, 235, 30, 2, 250, 242, 7, 6, 1, 144, 2, 226, 228, 7, 4, + 1, 144, 2, 226, 228, 7, 6, 1, 144, 2, 226, 229, 22, 231, 237, 7, 4, 1, + 144, 2, 226, 229, 22, 231, 237, 7, 6, 1, 245, 17, 2, 250, 242, 7, 4, 1, + 245, 17, 2, 250, 242, 7, 4, 1, 235, 151, 2, 250, 242, 7, 6, 1, 246, 47, + 7, 6, 1, 249, 69, 2, 4, 1, 210, 159, 7, 4, 1, 246, 47, 7, 6, 1, 243, 210, + 2, 142, 7, 4, 1, 243, 210, 2, 142, 7, 6, 1, 240, 206, 7, 6, 1, 211, 181, + 7, 6, 1, 230, 31, 2, 242, 143, 7, 4, 1, 230, 31, 2, 242, 143, 7, 6, 1, + 116, 2, 222, 237, 72, 22, 142, 7, 4, 1, 116, 2, 222, 237, 72, 22, 142, 7, + 6, 1, 254, 253, 2, 142, 7, 4, 1, 254, 253, 2, 142, 7, 6, 1, 144, 2, 218, + 105, 22, 142, 7, 4, 1, 144, 2, 218, 105, 22, 142, 7, 6, 1, 116, 2, 52, + 242, 143, 7, 4, 1, 116, 2, 52, 242, 143, 7, 6, 1, 116, 2, 235, 200, 251, + 154, 7, 4, 1, 116, 2, 235, 200, 251, 154, 7, 6, 1, 160, 2, 52, 242, 143, + 7, 4, 1, 160, 2, 52, 242, 143, 7, 6, 1, 160, 2, 235, 200, 251, 154, 7, 4, + 1, 160, 2, 235, 200, 251, 154, 7, 6, 1, 240, 161, 2, 52, 242, 143, 7, 4, + 1, 240, 161, 2, 52, 242, 143, 7, 6, 1, 240, 161, 2, 235, 200, 251, 154, + 7, 4, 1, 240, 161, 2, 235, 200, 251, 154, 7, 6, 1, 144, 2, 52, 242, 143, + 7, 4, 1, 144, 2, 52, 242, 143, 7, 6, 1, 144, 2, 235, 200, 251, 154, 7, 4, + 1, 144, 2, 235, 200, 251, 154, 7, 6, 1, 223, 227, 2, 52, 242, 143, 7, 4, + 1, 223, 227, 2, 52, 242, 143, 7, 6, 1, 223, 227, 2, 235, 200, 251, 154, + 7, 4, 1, 223, 227, 2, 235, 200, 251, 154, 7, 6, 1, 104, 2, 52, 242, 143, + 7, 4, 1, 104, 2, 52, 242, 143, 7, 6, 1, 104, 2, 235, 200, 251, 154, 7, 4, + 1, 104, 2, 235, 200, 251, 154, 7, 6, 1, 222, 94, 2, 249, 228, 51, 7, 4, + 1, 222, 94, 2, 249, 228, 51, 7, 6, 1, 217, 154, 2, 249, 228, 51, 7, 4, 1, + 217, 154, 2, 249, 228, 51, 7, 6, 1, 210, 231, 7, 4, 1, 210, 231, 7, 6, 1, + 242, 68, 2, 250, 242, 7, 4, 1, 242, 68, 2, 250, 242, 7, 6, 1, 230, 31, 2, + 200, 44, 233, 42, 7, 4, 1, 249, 69, 2, 249, 108, 7, 6, 1, 226, 138, 7, 4, + 1, 226, 138, 7, 6, 1, 210, 160, 2, 103, 7, 4, 1, 210, 160, 2, 103, 7, 6, + 1, 116, 2, 59, 48, 7, 4, 1, 116, 2, 59, 48, 7, 6, 1, 160, 2, 250, 191, 7, + 4, 1, 160, 2, 250, 191, 7, 6, 1, 144, 2, 248, 10, 22, 231, 237, 7, 4, 1, + 144, 2, 248, 10, 22, 231, 237, 7, 6, 1, 144, 2, 216, 90, 22, 231, 237, 7, + 4, 1, 144, 2, 216, 90, 22, 231, 237, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1, + 144, 2, 59, 48, 7, 6, 1, 144, 2, 59, 72, 22, 231, 237, 7, 4, 1, 144, 2, + 59, 72, 22, 231, 237, 7, 6, 1, 211, 118, 2, 231, 237, 7, 4, 1, 211, 118, + 2, 231, 237, 7, 4, 1, 233, 155, 2, 249, 108, 7, 4, 1, 230, 31, 2, 249, + 108, 7, 4, 1, 217, 154, 2, 249, 108, 7, 4, 1, 247, 127, 235, 150, 7, 4, + 1, 248, 151, 247, 228, 7, 4, 1, 224, 34, 247, 228, 7, 6, 1, 116, 2, 91, + 7, 6, 1, 251, 75, 2, 91, 7, 4, 1, 251, 75, 2, 91, 7, 6, 1, 233, 155, 2, + 130, 7, 6, 1, 217, 154, 2, 248, 7, 91, 7, 4, 1, 222, 94, 2, 217, 251, + 217, 78, 7, 4, 1, 210, 160, 2, 217, 251, 217, 78, 7, 6, 1, 242, 187, 218, + 131, 7, 4, 1, 242, 187, 218, 131, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130, 7, 6, 1, 215, 94, 214, 105, 7, 6, 1, 160, 2, 91, 7, 4, 1, 160, 2, 91, 7, - 6, 1, 235, 146, 2, 91, 7, 4, 1, 235, 146, 2, 91, 7, 6, 1, 4, 224, 98, 2, - 241, 53, 217, 78, 7, 4, 1, 224, 98, 2, 241, 53, 217, 78, 7, 6, 1, 223, - 225, 2, 91, 7, 4, 1, 223, 225, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1, - 211, 118, 2, 91, 7, 4, 1, 215, 94, 61, 7, 4, 1, 254, 144, 7, 4, 1, 215, - 94, 254, 144, 7, 4, 1, 57, 2, 103, 7, 4, 1, 204, 76, 7, 4, 1, 251, 68, 2, - 249, 101, 7, 4, 1, 249, 62, 2, 217, 78, 7, 4, 1, 249, 62, 2, 103, 7, 4, - 1, 223, 50, 75, 7, 4, 1, 221, 196, 7, 4, 1, 221, 197, 2, 103, 7, 4, 1, - 204, 75, 7, 4, 1, 223, 50, 204, 75, 7, 4, 1, 223, 50, 204, 160, 2, 103, - 7, 4, 1, 250, 1, 223, 50, 204, 75, 7, 4, 1, 247, 120, 235, 146, 2, 91, 7, - 4, 1, 243, 204, 2, 103, 7, 4, 1, 119, 243, 203, 7, 1, 4, 6, 243, 203, 7, - 4, 1, 243, 108, 7, 4, 1, 223, 152, 240, 249, 7, 4, 1, 215, 94, 242, 61, - 7, 4, 1, 242, 62, 2, 103, 7, 4, 1, 241, 209, 2, 103, 7, 4, 1, 240, 155, - 2, 91, 7, 4, 1, 235, 186, 7, 1, 4, 6, 73, 7, 4, 1, 233, 150, 2, 230, 225, - 183, 7, 4, 1, 233, 150, 2, 252, 42, 7, 4, 1, 233, 150, 2, 223, 56, 103, - 7, 4, 1, 233, 2, 7, 4, 1, 215, 94, 193, 7, 4, 1, 215, 94, 232, 51, 2, - 199, 233, 37, 7, 4, 1, 232, 51, 2, 103, 7, 4, 1, 230, 27, 2, 43, 103, 7, - 4, 1, 230, 27, 2, 223, 56, 103, 7, 1, 4, 6, 230, 26, 7, 4, 1, 252, 135, - 76, 7, 1, 4, 6, 226, 235, 7, 4, 1, 250, 1, 226, 202, 7, 4, 1, 225, 134, - 7, 4, 1, 215, 94, 153, 7, 4, 1, 215, 94, 223, 225, 2, 199, 233, 37, 7, 4, - 1, 215, 94, 223, 225, 2, 103, 7, 4, 1, 223, 225, 2, 199, 233, 37, 7, 4, - 1, 223, 225, 2, 217, 78, 7, 4, 1, 223, 225, 2, 244, 88, 7, 4, 1, 223, 50, - 223, 225, 2, 244, 88, 7, 1, 4, 6, 153, 7, 1, 4, 6, 235, 194, 153, 7, 4, - 1, 222, 93, 2, 103, 7, 4, 1, 245, 76, 7, 4, 1, 247, 120, 235, 146, 2, - 218, 104, 22, 103, 7, 4, 1, 218, 232, 223, 50, 245, 76, 7, 4, 1, 245, 77, - 2, 249, 101, 7, 4, 1, 215, 94, 217, 153, 7, 4, 1, 217, 154, 2, 223, 56, + 6, 1, 235, 151, 2, 91, 7, 4, 1, 235, 151, 2, 91, 7, 6, 1, 4, 224, 100, 2, + 241, 59, 217, 78, 7, 4, 1, 224, 100, 2, 241, 59, 217, 78, 7, 6, 1, 223, + 227, 2, 91, 7, 4, 1, 223, 227, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1, + 211, 118, 2, 91, 7, 4, 1, 215, 94, 61, 7, 4, 1, 254, 151, 7, 4, 1, 215, + 94, 254, 151, 7, 4, 1, 57, 2, 103, 7, 4, 1, 204, 78, 7, 4, 1, 251, 75, 2, + 249, 108, 7, 4, 1, 249, 69, 2, 217, 78, 7, 4, 1, 249, 69, 2, 103, 7, 4, + 1, 223, 52, 76, 7, 4, 1, 221, 197, 7, 4, 1, 221, 198, 2, 103, 7, 4, 1, + 204, 76, 7, 4, 1, 223, 52, 204, 76, 7, 4, 1, 223, 52, 204, 160, 2, 103, + 7, 4, 1, 250, 8, 223, 52, 204, 76, 7, 4, 1, 247, 127, 235, 151, 2, 91, 7, + 4, 1, 243, 210, 2, 103, 7, 4, 1, 119, 243, 209, 7, 1, 4, 6, 243, 209, 7, + 4, 1, 243, 114, 7, 4, 1, 223, 154, 240, 255, 7, 4, 1, 215, 94, 242, 67, + 7, 4, 1, 242, 68, 2, 103, 7, 4, 1, 241, 215, 2, 103, 7, 4, 1, 240, 161, + 2, 91, 7, 4, 1, 235, 192, 7, 1, 4, 6, 74, 7, 4, 1, 233, 155, 2, 230, 229, + 184, 7, 4, 1, 233, 155, 2, 252, 49, 7, 4, 1, 233, 155, 2, 223, 58, 103, + 7, 4, 1, 233, 7, 7, 4, 1, 215, 94, 194, 7, 4, 1, 215, 94, 232, 55, 2, + 200, 233, 42, 7, 4, 1, 232, 55, 2, 103, 7, 4, 1, 230, 31, 2, 43, 103, 7, + 4, 1, 230, 31, 2, 223, 58, 103, 7, 1, 4, 6, 230, 30, 7, 4, 1, 252, 142, + 78, 7, 1, 4, 6, 226, 238, 7, 4, 1, 250, 8, 226, 205, 7, 4, 1, 225, 136, + 7, 4, 1, 215, 94, 153, 7, 4, 1, 215, 94, 223, 227, 2, 200, 233, 42, 7, 4, + 1, 215, 94, 223, 227, 2, 103, 7, 4, 1, 223, 227, 2, 200, 233, 42, 7, 4, + 1, 223, 227, 2, 217, 78, 7, 4, 1, 223, 227, 2, 244, 95, 7, 4, 1, 223, 52, + 223, 227, 2, 244, 95, 7, 1, 4, 6, 153, 7, 1, 4, 6, 235, 200, 153, 7, 4, + 1, 222, 94, 2, 103, 7, 4, 1, 245, 83, 7, 4, 1, 247, 127, 235, 151, 2, + 218, 105, 22, 103, 7, 4, 1, 218, 233, 223, 52, 245, 83, 7, 4, 1, 245, 84, + 2, 249, 108, 7, 4, 1, 215, 94, 217, 153, 7, 4, 1, 217, 154, 2, 223, 58, 103, 7, 4, 1, 104, 130, 7, 4, 1, 214, 157, 7, 4, 1, 214, 106, 2, 103, 7, 4, 1, 215, 94, 214, 105, 7, 4, 1, 215, 94, 212, 98, 7, 4, 1, 215, 94, - 211, 117, 7, 1, 4, 6, 211, 117, 7, 4, 1, 210, 160, 2, 223, 56, 103, 7, 4, - 1, 210, 160, 2, 249, 101, 7, 4, 1, 245, 9, 7, 4, 1, 245, 10, 2, 249, 101, - 7, 1, 242, 181, 218, 130, 7, 1, 225, 140, 213, 135, 243, 250, 7, 1, 235, - 194, 242, 181, 218, 130, 7, 1, 218, 111, 251, 67, 7, 1, 251, 247, 250, - 12, 7, 1, 4, 6, 253, 159, 7, 4, 1, 250, 1, 204, 75, 7, 1, 4, 6, 243, 204, - 2, 103, 7, 1, 4, 6, 242, 61, 7, 4, 1, 235, 146, 2, 249, 128, 7, 4, 1, - 215, 94, 235, 24, 7, 1, 4, 6, 156, 7, 4, 1, 224, 98, 2, 103, 7, 1, 242, - 181, 218, 131, 2, 91, 7, 1, 223, 50, 242, 181, 218, 131, 2, 91, 7, 4, 1, - 246, 41, 247, 221, 7, 4, 1, 248, 27, 247, 221, 7, 4, 1, 246, 41, 247, - 222, 2, 249, 101, 7, 4, 1, 215, 186, 247, 221, 7, 4, 1, 216, 236, 247, - 221, 7, 4, 1, 217, 30, 247, 222, 2, 249, 101, 7, 4, 1, 244, 135, 247, - 221, 7, 4, 1, 232, 101, 247, 221, 7, 4, 1, 232, 52, 247, 221, 7, 1, 251, - 247, 225, 182, 7, 1, 251, 255, 225, 182, 7, 4, 1, 215, 94, 242, 62, 2, - 244, 88, 7, 4, 1, 215, 94, 242, 62, 2, 244, 89, 22, 217, 78, 58, 1, 4, - 242, 61, 58, 1, 4, 242, 62, 2, 103, 58, 1, 4, 235, 145, 58, 1, 4, 153, - 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223, 225, 2, 103, 58, 1, 4, 6, - 235, 194, 153, 58, 1, 4, 212, 98, 58, 1, 4, 211, 117, 58, 1, 224, 191, - 58, 1, 52, 224, 191, 58, 1, 215, 94, 249, 220, 58, 1, 254, 58, 58, 1, - 223, 50, 249, 220, 58, 1, 44, 163, 222, 234, 58, 1, 43, 163, 222, 234, - 58, 1, 242, 181, 218, 130, 58, 1, 223, 50, 242, 181, 218, 130, 58, 1, 43, - 253, 250, 58, 1, 44, 253, 250, 58, 1, 120, 253, 250, 58, 1, 124, 253, - 250, 58, 1, 250, 32, 255, 15, 250, 235, 58, 1, 67, 232, 214, 58, 1, 231, - 233, 58, 1, 255, 4, 255, 15, 58, 1, 242, 138, 255, 15, 58, 1, 121, 67, - 232, 214, 58, 1, 121, 231, 233, 58, 1, 121, 242, 138, 255, 15, 58, 1, - 121, 255, 4, 255, 15, 58, 1, 215, 223, 249, 227, 58, 1, 163, 215, 223, - 249, 227, 58, 1, 250, 174, 44, 163, 222, 234, 58, 1, 250, 174, 43, 163, - 222, 234, 58, 1, 120, 217, 88, 58, 1, 124, 217, 88, 58, 1, 96, 50, 58, 1, - 230, 183, 50, 251, 147, 59, 48, 222, 235, 48, 226, 225, 4, 183, 52, 255, - 4, 255, 15, 58, 1, 223, 37, 103, 58, 1, 249, 132, 255, 15, 58, 1, 4, 243, - 108, 58, 1, 4, 156, 58, 1, 4, 222, 92, 58, 1, 4, 211, 178, 58, 1, 4, 223, - 50, 242, 181, 218, 130, 58, 1, 245, 21, 138, 130, 58, 1, 125, 138, 130, - 58, 1, 230, 226, 138, 130, 58, 1, 121, 138, 130, 58, 1, 245, 20, 138, - 130, 58, 1, 210, 254, 248, 45, 138, 78, 58, 1, 211, 70, 248, 45, 138, 78, - 58, 1, 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 58, 58, 1, 121, 124, - 253, 250, 58, 1, 121, 120, 253, 250, 58, 1, 121, 43, 253, 250, 58, 1, - 121, 44, 253, 250, 58, 1, 121, 222, 234, 58, 1, 230, 225, 242, 138, 255, - 15, 58, 1, 230, 225, 52, 242, 138, 255, 15, 58, 1, 230, 225, 52, 255, 4, - 255, 15, 58, 1, 121, 183, 58, 1, 223, 158, 249, 227, 58, 1, 252, 59, 125, - 216, 31, 58, 1, 245, 144, 125, 216, 31, 58, 1, 252, 59, 121, 216, 31, 58, - 1, 245, 144, 121, 216, 31, 58, 1, 220, 55, 58, 1, 204, 220, 55, 58, 1, - 121, 43, 74, 38, 242, 138, 255, 15, 38, 255, 4, 255, 15, 38, 250, 32, - 255, 15, 38, 183, 38, 231, 233, 38, 226, 120, 38, 251, 147, 38, 59, 48, - 38, 248, 2, 38, 241, 53, 48, 38, 222, 235, 48, 38, 52, 255, 4, 255, 15, - 38, 250, 235, 38, 67, 232, 215, 48, 38, 52, 67, 232, 215, 48, 38, 52, - 242, 138, 255, 15, 38, 251, 0, 38, 235, 194, 251, 147, 38, 215, 94, 249, - 221, 48, 38, 249, 221, 48, 38, 223, 50, 249, 221, 48, 38, 249, 221, 77, - 222, 252, 38, 242, 138, 255, 16, 51, 38, 255, 4, 255, 16, 51, 38, 43, - 217, 89, 51, 38, 44, 217, 89, 51, 38, 43, 254, 111, 48, 38, 240, 249, 38, - 43, 163, 222, 235, 51, 38, 120, 217, 89, 51, 38, 124, 217, 89, 51, 38, - 96, 5, 51, 38, 230, 183, 5, 51, 38, 226, 65, 241, 53, 51, 38, 223, 56, - 241, 53, 51, 38, 59, 51, 38, 248, 3, 51, 38, 222, 235, 51, 38, 249, 221, - 51, 38, 250, 184, 38, 226, 225, 38, 67, 232, 215, 51, 38, 251, 141, 51, - 38, 235, 194, 52, 254, 25, 51, 38, 250, 236, 51, 38, 250, 32, 255, 16, - 51, 38, 251, 148, 51, 38, 235, 194, 251, 148, 51, 38, 216, 90, 51, 38, - 231, 234, 51, 38, 121, 232, 214, 38, 52, 121, 232, 214, 38, 216, 90, 226, - 121, 38, 219, 252, 218, 104, 226, 121, 38, 199, 218, 104, 226, 121, 38, - 219, 252, 219, 48, 226, 121, 38, 199, 219, 48, 226, 121, 38, 44, 163, - 222, 235, 51, 38, 235, 194, 251, 141, 51, 38, 42, 51, 38, 221, 181, 51, - 38, 211, 179, 48, 38, 67, 183, 38, 52, 226, 120, 38, 242, 138, 138, 78, - 38, 255, 4, 138, 78, 38, 26, 225, 176, 38, 26, 234, 3, 38, 26, 247, 253, - 216, 19, 38, 26, 210, 219, 38, 251, 141, 48, 38, 245, 99, 5, 51, 38, 52, - 67, 232, 215, 51, 38, 43, 254, 111, 51, 38, 228, 53, 216, 90, 48, 38, - 241, 59, 48, 38, 254, 149, 128, 216, 43, 48, 38, 43, 44, 80, 51, 38, 214, - 153, 80, 51, 38, 242, 143, 235, 64, 38, 44, 253, 251, 48, 38, 43, 163, - 222, 235, 48, 38, 244, 132, 38, 211, 179, 51, 38, 43, 253, 251, 51, 38, - 44, 253, 251, 51, 38, 44, 253, 251, 22, 120, 253, 251, 51, 38, 44, 163, - 222, 235, 48, 38, 59, 77, 222, 252, 38, 253, 218, 51, 38, 52, 222, 235, - 51, 38, 210, 35, 48, 38, 52, 251, 148, 51, 38, 52, 251, 147, 38, 52, 231, - 233, 38, 52, 231, 234, 51, 38, 52, 183, 38, 52, 235, 194, 251, 147, 38, - 52, 97, 80, 51, 38, 7, 4, 1, 61, 38, 7, 4, 1, 75, 38, 7, 4, 1, 73, 38, 7, - 4, 1, 76, 38, 7, 4, 1, 70, 38, 7, 4, 1, 251, 67, 38, 7, 4, 1, 249, 61, - 38, 7, 4, 1, 242, 61, 38, 7, 4, 1, 193, 38, 7, 4, 1, 153, 38, 7, 4, 1, - 217, 153, 38, 7, 4, 1, 214, 105, 38, 7, 4, 1, 211, 178, 26, 6, 1, 241, - 197, 26, 4, 1, 241, 197, 26, 6, 1, 254, 24, 221, 247, 26, 4, 1, 254, 24, - 221, 247, 26, 227, 199, 50, 26, 232, 109, 227, 199, 50, 26, 6, 1, 226, - 52, 247, 228, 26, 4, 1, 226, 52, 247, 228, 26, 210, 219, 26, 4, 223, 50, - 232, 84, 219, 179, 87, 26, 4, 246, 119, 232, 84, 219, 179, 87, 26, 4, - 223, 50, 246, 119, 232, 84, 219, 179, 87, 26, 224, 14, 78, 26, 216, 19, - 26, 247, 253, 216, 19, 26, 6, 1, 254, 145, 2, 216, 19, 26, 254, 98, 217, - 3, 26, 6, 1, 245, 102, 2, 216, 19, 26, 6, 1, 245, 65, 2, 216, 19, 26, 6, - 1, 235, 187, 2, 216, 19, 26, 6, 1, 226, 201, 2, 216, 19, 26, 6, 1, 214, - 158, 2, 216, 19, 26, 6, 1, 226, 203, 2, 216, 19, 26, 4, 1, 235, 187, 2, - 247, 253, 22, 216, 19, 26, 6, 1, 254, 144, 26, 6, 1, 252, 27, 26, 6, 1, - 243, 108, 26, 6, 1, 248, 55, 26, 6, 1, 245, 101, 26, 6, 1, 210, 85, 26, - 6, 1, 245, 64, 26, 6, 1, 216, 180, 26, 6, 1, 235, 186, 26, 6, 1, 234, - 223, 26, 6, 1, 233, 99, 26, 6, 1, 230, 103, 26, 6, 1, 227, 238, 26, 6, 1, - 211, 157, 26, 6, 1, 226, 200, 26, 6, 1, 225, 109, 26, 6, 1, 223, 38, 26, - 6, 1, 219, 178, 26, 6, 1, 217, 42, 26, 6, 1, 214, 157, 26, 6, 1, 225, - 134, 26, 6, 1, 250, 111, 26, 6, 1, 224, 162, 26, 6, 1, 226, 202, 26, 6, - 1, 235, 187, 2, 247, 252, 26, 6, 1, 214, 158, 2, 247, 252, 26, 4, 1, 254, - 145, 2, 216, 19, 26, 4, 1, 245, 102, 2, 216, 19, 26, 4, 1, 245, 65, 2, - 216, 19, 26, 4, 1, 235, 187, 2, 216, 19, 26, 4, 1, 214, 158, 2, 247, 253, - 22, 216, 19, 26, 4, 1, 254, 144, 26, 4, 1, 252, 27, 26, 4, 1, 243, 108, - 26, 4, 1, 248, 55, 26, 4, 1, 245, 101, 26, 4, 1, 210, 85, 26, 4, 1, 245, - 64, 26, 4, 1, 216, 180, 26, 4, 1, 235, 186, 26, 4, 1, 234, 223, 26, 4, 1, - 233, 99, 26, 4, 1, 230, 103, 26, 4, 1, 227, 238, 26, 4, 1, 211, 157, 26, - 4, 1, 226, 200, 26, 4, 1, 225, 109, 26, 4, 1, 223, 38, 26, 4, 1, 40, 219, - 178, 26, 4, 1, 219, 178, 26, 4, 1, 217, 42, 26, 4, 1, 214, 157, 26, 4, 1, - 225, 134, 26, 4, 1, 250, 111, 26, 4, 1, 224, 162, 26, 4, 1, 226, 202, 26, - 4, 1, 235, 187, 2, 247, 252, 26, 4, 1, 214, 158, 2, 247, 252, 26, 4, 1, - 226, 201, 2, 216, 19, 26, 4, 1, 214, 158, 2, 216, 19, 26, 4, 1, 226, 203, - 2, 216, 19, 26, 6, 234, 248, 87, 26, 252, 28, 87, 26, 216, 181, 87, 26, - 214, 158, 2, 241, 53, 87, 26, 214, 158, 2, 255, 4, 22, 241, 53, 87, 26, - 214, 158, 2, 248, 3, 22, 241, 53, 87, 26, 225, 135, 87, 26, 225, 110, 87, - 26, 234, 248, 87, 26, 1, 254, 24, 234, 7, 26, 4, 1, 254, 24, 234, 7, 26, - 1, 218, 138, 26, 4, 1, 218, 138, 26, 1, 247, 228, 26, 4, 1, 247, 228, 26, - 1, 234, 7, 26, 4, 1, 234, 7, 26, 1, 221, 247, 26, 4, 1, 221, 247, 81, 6, - 1, 220, 56, 81, 4, 1, 220, 56, 81, 6, 1, 244, 141, 81, 4, 1, 244, 141, - 81, 6, 1, 234, 118, 81, 4, 1, 234, 118, 81, 6, 1, 241, 46, 81, 4, 1, 241, - 46, 81, 6, 1, 243, 103, 81, 4, 1, 243, 103, 81, 6, 1, 220, 23, 81, 4, 1, - 220, 23, 81, 6, 1, 248, 70, 81, 4, 1, 248, 70, 26, 234, 224, 87, 26, 223, - 39, 87, 26, 232, 84, 219, 179, 87, 26, 1, 210, 224, 26, 6, 216, 181, 87, - 26, 232, 84, 245, 102, 87, 26, 223, 50, 232, 84, 245, 102, 87, 26, 6, 1, - 220, 8, 26, 4, 1, 220, 8, 26, 6, 232, 84, 219, 179, 87, 26, 6, 1, 221, - 244, 26, 4, 1, 221, 244, 26, 223, 39, 2, 218, 104, 87, 26, 6, 223, 50, - 232, 84, 219, 179, 87, 26, 6, 246, 119, 232, 84, 219, 179, 87, 26, 6, - 223, 50, 246, 119, 232, 84, 219, 179, 87, 33, 6, 1, 236, 62, 2, 242, 137, - 33, 6, 1, 235, 190, 33, 6, 1, 247, 163, 33, 6, 1, 242, 188, 33, 6, 1, - 214, 202, 236, 61, 33, 6, 1, 246, 37, 33, 6, 1, 251, 77, 73, 33, 6, 1, - 211, 8, 33, 6, 1, 235, 127, 33, 6, 1, 232, 188, 33, 6, 1, 228, 179, 33, - 6, 1, 215, 175, 33, 6, 1, 234, 49, 33, 6, 1, 240, 155, 2, 242, 137, 33, - 6, 1, 219, 252, 70, 33, 6, 1, 246, 33, 33, 6, 1, 61, 33, 6, 1, 252, 76, - 33, 6, 1, 213, 255, 33, 6, 1, 242, 237, 33, 6, 1, 248, 91, 33, 6, 1, 236, - 61, 33, 6, 1, 210, 74, 33, 6, 1, 210, 94, 33, 6, 1, 73, 33, 6, 1, 219, - 252, 73, 33, 6, 1, 176, 33, 6, 1, 245, 175, 33, 6, 1, 245, 160, 33, 6, 1, - 245, 151, 33, 6, 1, 76, 33, 6, 1, 225, 222, 33, 6, 1, 245, 93, 33, 6, 1, - 245, 83, 33, 6, 1, 217, 23, 33, 6, 1, 70, 33, 6, 1, 245, 203, 33, 6, 1, - 162, 33, 6, 1, 215, 179, 33, 6, 1, 250, 132, 33, 6, 1, 220, 103, 33, 6, - 1, 220, 66, 33, 6, 1, 242, 4, 50, 33, 6, 1, 211, 27, 33, 6, 1, 219, 53, - 50, 33, 6, 1, 75, 33, 6, 1, 210, 212, 33, 6, 1, 191, 33, 4, 1, 61, 33, 4, - 1, 252, 76, 33, 4, 1, 213, 255, 33, 4, 1, 242, 237, 33, 4, 1, 248, 91, - 33, 4, 1, 236, 61, 33, 4, 1, 210, 74, 33, 4, 1, 210, 94, 33, 4, 1, 73, - 33, 4, 1, 219, 252, 73, 33, 4, 1, 176, 33, 4, 1, 245, 175, 33, 4, 1, 245, - 160, 33, 4, 1, 245, 151, 33, 4, 1, 76, 33, 4, 1, 225, 222, 33, 4, 1, 245, - 93, 33, 4, 1, 245, 83, 33, 4, 1, 217, 23, 33, 4, 1, 70, 33, 4, 1, 245, - 203, 33, 4, 1, 162, 33, 4, 1, 215, 179, 33, 4, 1, 250, 132, 33, 4, 1, - 220, 103, 33, 4, 1, 220, 66, 33, 4, 1, 242, 4, 50, 33, 4, 1, 211, 27, 33, - 4, 1, 219, 53, 50, 33, 4, 1, 75, 33, 4, 1, 210, 212, 33, 4, 1, 191, 33, - 4, 1, 236, 62, 2, 242, 137, 33, 4, 1, 235, 190, 33, 4, 1, 247, 163, 33, - 4, 1, 242, 188, 33, 4, 1, 214, 202, 236, 61, 33, 4, 1, 246, 37, 33, 4, 1, - 251, 77, 73, 33, 4, 1, 211, 8, 33, 4, 1, 235, 127, 33, 4, 1, 232, 188, - 33, 4, 1, 228, 179, 33, 4, 1, 215, 175, 33, 4, 1, 234, 49, 33, 4, 1, 240, - 155, 2, 242, 137, 33, 4, 1, 219, 252, 70, 33, 4, 1, 246, 33, 33, 6, 1, - 226, 202, 33, 4, 1, 226, 202, 33, 6, 1, 211, 59, 33, 4, 1, 211, 59, 33, - 6, 1, 235, 184, 75, 33, 4, 1, 235, 184, 75, 33, 6, 1, 232, 193, 210, 183, - 33, 4, 1, 232, 193, 210, 183, 33, 6, 1, 235, 184, 232, 193, 210, 183, 33, - 4, 1, 235, 184, 232, 193, 210, 183, 33, 6, 1, 251, 250, 210, 183, 33, 4, - 1, 251, 250, 210, 183, 33, 6, 1, 235, 184, 251, 250, 210, 183, 33, 4, 1, - 235, 184, 251, 250, 210, 183, 33, 6, 1, 233, 234, 33, 4, 1, 233, 234, 33, - 6, 1, 224, 162, 33, 4, 1, 224, 162, 33, 6, 1, 244, 83, 33, 4, 1, 244, 83, - 33, 6, 1, 235, 147, 33, 4, 1, 235, 147, 33, 6, 1, 235, 148, 2, 52, 242, - 138, 255, 15, 33, 4, 1, 235, 148, 2, 52, 242, 138, 255, 15, 33, 6, 1, - 214, 205, 33, 4, 1, 214, 205, 33, 6, 1, 222, 186, 226, 202, 33, 4, 1, - 222, 186, 226, 202, 33, 6, 1, 226, 203, 2, 216, 66, 33, 4, 1, 226, 203, - 2, 216, 66, 33, 6, 1, 226, 141, 33, 4, 1, 226, 141, 33, 6, 1, 234, 7, 33, - 4, 1, 234, 7, 33, 216, 147, 50, 38, 33, 216, 66, 38, 33, 226, 66, 38, 33, - 248, 155, 225, 19, 38, 33, 224, 156, 225, 19, 38, 33, 225, 4, 38, 33, - 240, 212, 216, 147, 50, 38, 33, 230, 192, 50, 33, 6, 1, 219, 252, 240, - 155, 2, 217, 78, 33, 4, 1, 219, 252, 240, 155, 2, 217, 78, 33, 6, 1, 220, - 147, 50, 33, 4, 1, 220, 147, 50, 33, 6, 1, 245, 94, 2, 216, 115, 33, 4, - 1, 245, 94, 2, 216, 115, 33, 6, 1, 242, 238, 2, 214, 156, 33, 4, 1, 242, - 238, 2, 214, 156, 33, 6, 1, 242, 238, 2, 91, 33, 4, 1, 242, 238, 2, 91, - 33, 6, 1, 242, 238, 2, 230, 225, 103, 33, 4, 1, 242, 238, 2, 230, 225, - 103, 33, 6, 1, 210, 75, 2, 248, 40, 33, 4, 1, 210, 75, 2, 248, 40, 33, 6, - 1, 210, 95, 2, 248, 40, 33, 4, 1, 210, 95, 2, 248, 40, 33, 6, 1, 235, 14, - 2, 248, 40, 33, 4, 1, 235, 14, 2, 248, 40, 33, 6, 1, 235, 14, 2, 67, 91, - 33, 4, 1, 235, 14, 2, 67, 91, 33, 6, 1, 235, 14, 2, 91, 33, 4, 1, 235, - 14, 2, 91, 33, 6, 1, 252, 125, 176, 33, 4, 1, 252, 125, 176, 33, 6, 1, - 245, 152, 2, 248, 40, 33, 4, 1, 245, 152, 2, 248, 40, 33, 6, 27, 245, - 152, 242, 237, 33, 4, 27, 245, 152, 242, 237, 33, 6, 1, 225, 223, 2, 230, - 225, 103, 33, 4, 1, 225, 223, 2, 230, 225, 103, 33, 6, 1, 255, 21, 162, - 33, 4, 1, 255, 21, 162, 33, 6, 1, 245, 84, 2, 248, 40, 33, 4, 1, 245, 84, - 2, 248, 40, 33, 6, 1, 217, 24, 2, 248, 40, 33, 4, 1, 217, 24, 2, 248, 40, - 33, 6, 1, 218, 122, 70, 33, 4, 1, 218, 122, 70, 33, 6, 1, 218, 122, 104, - 2, 91, 33, 4, 1, 218, 122, 104, 2, 91, 33, 6, 1, 242, 50, 2, 248, 40, 33, - 4, 1, 242, 50, 2, 248, 40, 33, 6, 27, 217, 24, 215, 179, 33, 4, 27, 217, - 24, 215, 179, 33, 6, 1, 250, 133, 2, 248, 40, 33, 4, 1, 250, 133, 2, 248, - 40, 33, 6, 1, 250, 133, 2, 67, 91, 33, 4, 1, 250, 133, 2, 67, 91, 33, 6, - 1, 220, 34, 33, 4, 1, 220, 34, 33, 6, 1, 255, 21, 250, 132, 33, 4, 1, - 255, 21, 250, 132, 33, 6, 1, 255, 21, 250, 133, 2, 248, 40, 33, 4, 1, - 255, 21, 250, 133, 2, 248, 40, 33, 1, 226, 59, 33, 6, 1, 210, 75, 2, 251, - 147, 33, 4, 1, 210, 75, 2, 251, 147, 33, 6, 1, 235, 14, 2, 103, 33, 4, 1, - 235, 14, 2, 103, 33, 6, 1, 245, 176, 2, 217, 78, 33, 4, 1, 245, 176, 2, - 217, 78, 33, 6, 1, 245, 152, 2, 103, 33, 4, 1, 245, 152, 2, 103, 33, 6, - 1, 245, 152, 2, 217, 78, 33, 4, 1, 245, 152, 2, 217, 78, 33, 6, 1, 234, - 128, 250, 132, 33, 4, 1, 234, 128, 250, 132, 33, 6, 1, 245, 161, 2, 217, - 78, 33, 4, 1, 245, 161, 2, 217, 78, 33, 4, 1, 226, 59, 33, 6, 1, 115, 2, - 251, 147, 33, 4, 1, 115, 2, 251, 147, 33, 6, 1, 115, 2, 248, 2, 33, 4, 1, - 115, 2, 248, 2, 33, 6, 27, 115, 236, 61, 33, 4, 27, 115, 236, 61, 33, 6, - 1, 236, 62, 2, 251, 147, 33, 4, 1, 236, 62, 2, 251, 147, 33, 6, 1, 221, - 196, 33, 4, 1, 221, 196, 33, 6, 1, 221, 197, 2, 248, 2, 33, 4, 1, 221, - 197, 2, 248, 2, 33, 6, 1, 210, 75, 2, 248, 2, 33, 4, 1, 210, 75, 2, 248, - 2, 33, 6, 1, 210, 95, 2, 248, 2, 33, 4, 1, 210, 95, 2, 248, 2, 33, 6, 1, - 255, 21, 246, 37, 33, 4, 1, 255, 21, 246, 37, 33, 6, 1, 240, 155, 2, 231, - 233, 33, 4, 1, 240, 155, 2, 231, 233, 33, 6, 1, 240, 155, 2, 248, 2, 33, - 4, 1, 240, 155, 2, 248, 2, 33, 6, 1, 144, 2, 248, 2, 33, 4, 1, 144, 2, - 248, 2, 33, 6, 1, 252, 135, 76, 33, 4, 1, 252, 135, 76, 33, 6, 1, 252, - 135, 144, 2, 248, 2, 33, 4, 1, 252, 135, 144, 2, 248, 2, 33, 6, 1, 160, - 2, 248, 2, 33, 4, 1, 160, 2, 248, 2, 33, 6, 1, 104, 2, 231, 233, 33, 4, - 1, 104, 2, 231, 233, 33, 6, 1, 104, 2, 248, 2, 33, 4, 1, 104, 2, 248, 2, - 33, 6, 1, 104, 2, 52, 142, 33, 4, 1, 104, 2, 52, 142, 33, 6, 1, 250, 133, - 2, 248, 2, 33, 4, 1, 250, 133, 2, 248, 2, 33, 6, 1, 242, 238, 2, 248, 40, - 33, 4, 1, 242, 238, 2, 248, 40, 33, 6, 1, 211, 28, 2, 248, 2, 33, 4, 1, - 211, 28, 2, 248, 2, 33, 6, 1, 242, 238, 2, 218, 104, 22, 103, 33, 4, 1, - 242, 238, 2, 218, 104, 22, 103, 33, 6, 1, 242, 50, 2, 103, 33, 4, 1, 242, - 50, 2, 103, 33, 6, 1, 242, 50, 2, 91, 33, 4, 1, 242, 50, 2, 91, 33, 6, 1, - 234, 15, 248, 91, 33, 4, 1, 234, 15, 248, 91, 33, 6, 1, 234, 15, 247, - 163, 33, 4, 1, 234, 15, 247, 163, 33, 6, 1, 234, 15, 210, 27, 33, 4, 1, - 234, 15, 210, 27, 33, 6, 1, 234, 15, 246, 31, 33, 4, 1, 234, 15, 246, 31, - 33, 6, 1, 234, 15, 232, 188, 33, 4, 1, 234, 15, 232, 188, 33, 6, 1, 234, - 15, 228, 179, 33, 4, 1, 234, 15, 228, 179, 33, 6, 1, 234, 15, 219, 110, - 33, 4, 1, 234, 15, 219, 110, 33, 6, 1, 234, 15, 216, 61, 33, 4, 1, 234, - 15, 216, 61, 33, 6, 1, 223, 50, 210, 94, 33, 4, 1, 223, 50, 210, 94, 33, - 6, 1, 245, 176, 2, 103, 33, 4, 1, 245, 176, 2, 103, 33, 6, 1, 232, 255, - 33, 4, 1, 232, 255, 33, 6, 1, 223, 40, 33, 4, 1, 223, 40, 33, 6, 1, 211, - 92, 33, 4, 1, 211, 92, 33, 6, 1, 224, 89, 33, 4, 1, 224, 89, 33, 6, 1, - 212, 22, 33, 4, 1, 212, 22, 33, 6, 1, 254, 167, 176, 33, 4, 1, 254, 167, - 176, 33, 6, 1, 245, 176, 2, 230, 225, 103, 33, 4, 1, 245, 176, 2, 230, - 225, 103, 33, 6, 1, 245, 152, 2, 230, 225, 103, 33, 4, 1, 245, 152, 2, - 230, 225, 103, 33, 6, 1, 225, 223, 2, 248, 40, 33, 4, 1, 225, 223, 2, - 248, 40, 33, 6, 1, 220, 35, 2, 248, 40, 33, 4, 1, 220, 35, 2, 248, 40, - 150, 6, 1, 253, 165, 150, 6, 1, 252, 40, 150, 6, 1, 242, 204, 150, 6, 1, - 248, 222, 150, 6, 1, 245, 214, 150, 6, 1, 210, 116, 150, 6, 1, 245, 198, - 150, 6, 1, 245, 66, 150, 6, 1, 111, 150, 6, 1, 210, 74, 150, 6, 1, 235, - 228, 150, 6, 1, 232, 191, 150, 6, 1, 211, 160, 150, 6, 1, 251, 34, 150, - 6, 1, 234, 166, 150, 6, 1, 241, 69, 150, 6, 1, 235, 142, 150, 6, 1, 242, - 247, 150, 6, 1, 250, 127, 150, 6, 1, 231, 59, 150, 6, 1, 211, 8, 150, 6, - 1, 228, 40, 150, 6, 1, 220, 103, 150, 6, 1, 213, 138, 150, 6, 1, 250, - 158, 150, 6, 1, 225, 206, 150, 6, 1, 235, 111, 150, 6, 1, 205, 150, 6, 1, - 221, 162, 150, 6, 1, 213, 179, 150, 6, 1, 216, 63, 150, 6, 1, 223, 96, - 150, 6, 1, 249, 239, 150, 6, 1, 210, 249, 150, 6, 1, 225, 47, 150, 6, 1, - 234, 177, 150, 6, 1, 226, 223, 150, 6, 1, 244, 143, 150, 58, 1, 43, 163, - 222, 234, 150, 254, 58, 150, 245, 155, 78, 150, 245, 32, 78, 150, 249, - 220, 150, 224, 14, 78, 150, 255, 22, 78, 150, 4, 1, 253, 165, 150, 4, 1, - 252, 40, 150, 4, 1, 242, 204, 150, 4, 1, 248, 222, 150, 4, 1, 245, 214, - 150, 4, 1, 210, 116, 150, 4, 1, 245, 198, 150, 4, 1, 245, 66, 150, 4, 1, - 111, 150, 4, 1, 210, 74, 150, 4, 1, 235, 228, 150, 4, 1, 232, 191, 150, - 4, 1, 211, 160, 150, 4, 1, 251, 34, 150, 4, 1, 234, 166, 150, 4, 1, 241, - 69, 150, 4, 1, 235, 142, 150, 4, 1, 242, 247, 150, 4, 1, 250, 127, 150, - 4, 1, 231, 59, 150, 4, 1, 211, 8, 150, 4, 1, 228, 40, 150, 4, 1, 220, - 103, 150, 4, 1, 213, 138, 150, 4, 1, 250, 158, 150, 4, 1, 225, 206, 150, - 4, 1, 235, 111, 150, 4, 1, 205, 150, 4, 1, 221, 162, 150, 4, 1, 213, 179, - 150, 4, 1, 216, 63, 150, 4, 1, 223, 96, 150, 4, 1, 249, 239, 150, 4, 1, - 210, 249, 150, 4, 1, 225, 47, 150, 4, 1, 234, 177, 150, 4, 1, 226, 223, - 150, 4, 1, 244, 143, 150, 4, 27, 245, 215, 210, 249, 150, 243, 230, 218, - 130, 150, 240, 169, 150, 246, 96, 50, 94, 255, 16, 245, 58, 94, 255, 16, - 221, 163, 94, 255, 16, 220, 89, 94, 255, 16, 210, 104, 224, 72, 94, 255, - 16, 210, 104, 243, 126, 94, 255, 16, 216, 76, 94, 255, 16, 223, 48, 94, - 255, 16, 210, 103, 94, 255, 16, 225, 246, 94, 255, 16, 211, 20, 94, 255, - 16, 216, 215, 94, 255, 16, 243, 42, 94, 255, 16, 243, 43, 230, 70, 94, - 255, 16, 243, 40, 94, 255, 16, 224, 73, 226, 17, 94, 255, 16, 216, 254, - 243, 57, 94, 255, 16, 225, 227, 94, 255, 16, 253, 201, 242, 42, 94, 255, - 16, 230, 80, 94, 255, 16, 231, 209, 94, 255, 16, 231, 50, 94, 255, 16, - 231, 51, 234, 178, 94, 255, 16, 248, 164, 94, 255, 16, 224, 84, 94, 255, - 16, 216, 254, 224, 68, 94, 255, 16, 211, 30, 252, 41, 210, 230, 94, 255, - 16, 226, 208, 94, 255, 16, 236, 20, 94, 255, 16, 248, 71, 94, 255, 16, - 210, 33, 94, 164, 231, 144, 250, 36, 94, 225, 12, 220, 37, 94, 225, 12, - 241, 251, 221, 163, 94, 225, 12, 241, 251, 225, 240, 94, 225, 12, 241, - 251, 224, 77, 94, 225, 12, 241, 159, 94, 225, 12, 215, 177, 94, 225, 12, - 221, 163, 94, 225, 12, 225, 240, 94, 225, 12, 224, 77, 94, 225, 12, 241, - 62, 94, 225, 12, 241, 63, 241, 253, 31, 214, 3, 94, 225, 12, 224, 18, 94, - 225, 12, 248, 209, 177, 231, 172, 94, 225, 12, 231, 39, 94, 224, 142, - 231, 169, 94, 225, 12, 223, 170, 94, 224, 142, 225, 248, 94, 225, 12, - 220, 22, 247, 121, 94, 225, 12, 219, 160, 247, 121, 94, 224, 142, 219, - 54, 225, 242, 94, 164, 214, 160, 247, 121, 94, 164, 232, 109, 247, 121, - 94, 224, 142, 227, 196, 242, 41, 94, 225, 12, 224, 78, 224, 72, 94, 1, - 254, 171, 94, 1, 252, 29, 94, 1, 242, 202, 94, 1, 248, 190, 94, 1, 241, - 239, 94, 1, 214, 3, 94, 1, 210, 97, 94, 1, 241, 198, 94, 1, 216, 231, 94, - 1, 210, 233, 94, 1, 40, 234, 251, 94, 1, 234, 251, 94, 1, 233, 95, 94, 1, - 40, 231, 66, 94, 1, 231, 66, 94, 1, 40, 227, 195, 94, 1, 227, 195, 94, 1, - 221, 250, 94, 1, 253, 163, 94, 1, 40, 225, 222, 94, 1, 225, 222, 94, 1, - 40, 215, 180, 94, 1, 215, 180, 94, 1, 224, 40, 94, 1, 223, 68, 94, 1, - 220, 21, 94, 1, 217, 39, 94, 27, 211, 6, 52, 214, 3, 94, 27, 211, 6, 214, - 4, 210, 233, 94, 27, 211, 6, 52, 210, 233, 94, 224, 142, 243, 42, 94, - 224, 142, 243, 40, 10, 54, 50, 10, 5, 221, 243, 10, 244, 31, 231, 155, - 10, 5, 222, 24, 10, 5, 221, 246, 254, 38, 249, 110, 222, 194, 254, 38, - 244, 5, 222, 194, 10, 223, 135, 254, 38, 225, 184, 230, 194, 50, 254, 38, - 225, 184, 216, 249, 216, 149, 50, 254, 222, 50, 10, 249, 220, 10, 248, - 151, 220, 138, 10, 225, 14, 213, 241, 50, 10, 5, 230, 175, 10, 5, 222, 4, - 254, 173, 212, 45, 10, 5, 254, 173, 253, 222, 10, 5, 223, 168, 254, 172, - 10, 5, 223, 176, 254, 153, 254, 105, 10, 5, 217, 71, 10, 4, 125, 217, 81, - 10, 4, 125, 27, 112, 2, 233, 104, 2, 211, 43, 10, 4, 125, 210, 108, 10, - 4, 244, 166, 10, 4, 248, 185, 10, 4, 234, 206, 10, 220, 151, 10, 215, - 212, 59, 224, 142, 78, 10, 224, 14, 78, 10, 1, 234, 210, 211, 43, 10, 1, - 242, 20, 10, 1, 112, 2, 231, 229, 48, 10, 1, 112, 2, 202, 48, 10, 1, 212, - 31, 2, 202, 48, 10, 1, 112, 2, 202, 51, 10, 1, 79, 2, 202, 48, 10, 1, - 254, 171, 10, 1, 252, 55, 10, 1, 217, 9, 231, 165, 10, 1, 217, 8, 10, 1, - 216, 193, 10, 1, 235, 124, 10, 1, 242, 38, 10, 1, 234, 130, 10, 1, 248, - 196, 10, 1, 216, 203, 10, 1, 223, 96, 10, 1, 210, 108, 10, 1, 221, 167, - 10, 1, 220, 60, 10, 1, 222, 27, 10, 1, 248, 217, 10, 1, 217, 81, 10, 1, - 210, 111, 10, 1, 254, 197, 10, 1, 242, 245, 10, 1, 234, 176, 2, 113, 170, - 48, 10, 1, 234, 176, 2, 134, 170, 51, 10, 1, 244, 169, 79, 2, 235, 194, - 214, 105, 10, 1, 244, 169, 79, 2, 113, 170, 48, 10, 1, 244, 169, 79, 2, - 134, 170, 48, 10, 217, 44, 10, 1, 244, 143, 10, 1, 224, 82, 10, 1, 234, - 251, 10, 1, 233, 103, 10, 1, 231, 79, 10, 1, 228, 63, 10, 1, 241, 219, - 10, 1, 212, 30, 10, 1, 112, 231, 193, 10, 1, 211, 43, 10, 244, 164, 10, - 248, 183, 10, 234, 204, 10, 244, 166, 10, 248, 185, 10, 234, 206, 10, - 220, 94, 10, 218, 46, 10, 231, 227, 48, 10, 202, 48, 10, 202, 51, 10, - 218, 66, 254, 171, 10, 235, 194, 248, 185, 10, 164, 228, 64, 242, 219, - 10, 209, 255, 10, 25, 5, 4, 214, 106, 48, 10, 25, 5, 235, 194, 4, 214, - 106, 48, 10, 25, 5, 59, 51, 10, 223, 50, 248, 185, 10, 244, 167, 2, 113, - 247, 119, 10, 212, 32, 202, 51, 254, 38, 21, 210, 86, 254, 38, 21, 110, - 254, 38, 21, 105, 254, 38, 21, 158, 254, 38, 21, 161, 254, 38, 21, 189, - 254, 38, 21, 194, 254, 38, 21, 198, 254, 38, 21, 195, 254, 38, 21, 200, - 10, 225, 183, 50, 10, 248, 84, 220, 138, 10, 216, 147, 220, 138, 10, 244, - 82, 225, 10, 218, 157, 10, 1, 247, 120, 252, 55, 10, 1, 247, 120, 224, - 82, 10, 1, 218, 24, 254, 171, 10, 1, 112, 212, 46, 10, 1, 112, 2, 212, - 32, 202, 48, 10, 1, 112, 2, 212, 32, 202, 51, 10, 1, 125, 242, 20, 10, 1, - 125, 202, 254, 171, 10, 1, 125, 202, 212, 30, 10, 1, 104, 2, 202, 48, 10, - 1, 125, 202, 211, 43, 10, 1, 215, 149, 10, 1, 215, 147, 10, 1, 252, 65, - 10, 1, 217, 9, 2, 222, 234, 10, 1, 217, 9, 2, 134, 170, 77, 246, 104, 10, - 1, 225, 206, 10, 1, 217, 6, 10, 1, 252, 53, 10, 1, 122, 2, 202, 48, 10, - 1, 122, 2, 113, 170, 67, 48, 10, 1, 227, 154, 10, 1, 246, 44, 10, 1, 122, - 2, 134, 170, 48, 10, 1, 217, 27, 10, 1, 217, 25, 10, 1, 248, 131, 10, 1, - 248, 197, 2, 222, 234, 10, 1, 248, 197, 2, 59, 51, 10, 1, 248, 197, 2, - 59, 252, 44, 22, 4, 217, 81, 10, 1, 248, 202, 10, 1, 248, 133, 10, 1, - 246, 71, 10, 1, 248, 197, 2, 134, 170, 77, 246, 104, 10, 1, 248, 197, 2, - 244, 12, 170, 48, 10, 1, 222, 172, 10, 1, 223, 97, 2, 4, 214, 105, 10, 1, - 223, 97, 2, 222, 234, 10, 1, 223, 97, 2, 59, 51, 10, 1, 223, 97, 2, 4, - 214, 106, 51, 10, 1, 223, 97, 2, 59, 252, 44, 22, 59, 48, 10, 1, 223, 97, - 2, 113, 170, 48, 10, 1, 235, 121, 10, 1, 223, 97, 2, 244, 12, 170, 48, - 10, 1, 221, 168, 2, 59, 252, 44, 22, 59, 48, 10, 1, 221, 168, 2, 134, - 170, 51, 10, 1, 221, 168, 2, 134, 170, 252, 44, 22, 134, 170, 48, 10, 1, - 222, 28, 2, 113, 170, 51, 10, 1, 222, 28, 2, 134, 170, 48, 10, 1, 217, - 82, 2, 134, 170, 48, 10, 1, 254, 198, 2, 134, 170, 48, 10, 1, 247, 120, - 244, 143, 10, 1, 244, 144, 2, 59, 230, 110, 51, 10, 1, 244, 144, 2, 59, - 51, 10, 1, 213, 248, 10, 1, 244, 144, 2, 134, 170, 51, 10, 1, 225, 204, - 10, 1, 224, 83, 2, 59, 48, 10, 1, 224, 83, 2, 134, 170, 48, 10, 1, 234, - 175, 10, 1, 217, 251, 234, 251, 10, 1, 234, 252, 2, 222, 234, 10, 1, 234, - 252, 2, 59, 48, 10, 1, 229, 80, 10, 1, 234, 252, 2, 134, 170, 51, 10, 1, - 243, 123, 10, 1, 243, 124, 2, 222, 234, 10, 1, 229, 3, 10, 1, 243, 124, - 2, 113, 170, 51, 10, 1, 242, 102, 10, 1, 243, 124, 2, 134, 170, 48, 10, - 1, 233, 104, 2, 4, 214, 105, 10, 1, 233, 104, 2, 59, 48, 10, 1, 233, 104, - 2, 134, 170, 48, 10, 1, 233, 104, 2, 134, 170, 51, 10, 1, 228, 64, 2, 59, - 51, 10, 1, 228, 64, 242, 219, 10, 1, 222, 215, 10, 1, 228, 64, 2, 222, - 234, 10, 1, 228, 64, 2, 134, 170, 48, 10, 1, 241, 220, 247, 142, 10, 1, - 217, 28, 2, 59, 48, 10, 1, 241, 220, 2, 79, 48, 10, 1, 241, 220, 242, - 172, 10, 1, 241, 220, 242, 173, 2, 202, 48, 10, 1, 217, 9, 231, 166, 242, - 172, 10, 1, 212, 31, 2, 222, 234, 10, 1, 234, 74, 226, 235, 10, 1, 226, - 235, 10, 1, 70, 10, 1, 210, 212, 10, 1, 234, 74, 210, 212, 10, 1, 212, - 31, 2, 113, 170, 48, 10, 1, 213, 255, 10, 1, 244, 169, 211, 43, 10, 1, - 79, 2, 217, 78, 10, 1, 79, 2, 4, 214, 105, 10, 1, 212, 31, 2, 59, 48, 10, - 1, 75, 10, 1, 79, 2, 134, 170, 51, 10, 1, 79, 252, 133, 10, 1, 79, 252, - 134, 2, 202, 48, 10, 243, 230, 218, 130, 10, 1, 254, 244, 10, 4, 125, 27, - 222, 28, 2, 233, 104, 2, 112, 231, 193, 10, 4, 125, 27, 224, 83, 2, 233, - 104, 2, 112, 231, 193, 10, 4, 125, 66, 65, 17, 10, 4, 125, 233, 104, 254, - 171, 10, 4, 125, 235, 124, 10, 4, 125, 134, 247, 119, 10, 4, 125, 221, - 167, 10, 245, 144, 64, 253, 167, 10, 218, 153, 64, 222, 139, 245, 176, - 241, 156, 10, 4, 125, 222, 184, 210, 86, 10, 4, 125, 214, 159, 223, 116, - 210, 86, 10, 4, 125, 247, 120, 241, 237, 64, 234, 130, 10, 4, 125, 66, - 53, 17, 10, 4, 121, 221, 167, 10, 4, 125, 231, 228, 10, 4, 212, 30, 10, - 4, 211, 43, 10, 4, 125, 211, 43, 10, 4, 125, 228, 63, 10, 225, 42, 64, - 222, 14, 10, 245, 153, 250, 176, 121, 218, 130, 10, 245, 153, 250, 176, - 125, 218, 130, 10, 222, 184, 125, 218, 131, 2, 244, 105, 250, 175, 10, 4, - 121, 231, 79, 10, 1, 248, 197, 2, 235, 194, 214, 105, 10, 1, 223, 97, 2, - 235, 194, 214, 105, 245, 23, 254, 38, 21, 210, 86, 245, 23, 254, 38, 21, - 110, 245, 23, 254, 38, 21, 105, 245, 23, 254, 38, 21, 158, 245, 23, 254, - 38, 21, 161, 245, 23, 254, 38, 21, 189, 245, 23, 254, 38, 21, 194, 245, - 23, 254, 38, 21, 198, 245, 23, 254, 38, 21, 195, 245, 23, 254, 38, 21, - 200, 10, 1, 220, 61, 2, 59, 51, 10, 1, 248, 218, 2, 59, 51, 10, 1, 242, - 246, 2, 59, 51, 10, 5, 219, 159, 254, 127, 10, 5, 219, 159, 224, 236, - 231, 59, 10, 1, 241, 220, 2, 235, 194, 214, 105, 182, 245, 144, 64, 226, - 15, 182, 218, 20, 243, 230, 218, 130, 182, 218, 68, 243, 230, 218, 130, - 182, 218, 20, 249, 227, 182, 218, 68, 249, 227, 182, 203, 249, 227, 182, - 249, 228, 219, 107, 233, 47, 182, 249, 228, 219, 107, 222, 252, 182, 218, - 20, 249, 228, 219, 107, 233, 47, 182, 218, 68, 249, 228, 219, 107, 222, - 252, 182, 249, 181, 182, 242, 2, 226, 251, 182, 242, 2, 231, 37, 182, - 242, 2, 253, 219, 182, 255, 22, 78, 182, 1, 254, 175, 182, 1, 218, 24, - 254, 175, 182, 1, 252, 26, 182, 1, 243, 114, 182, 1, 243, 115, 243, 92, - 182, 1, 248, 193, 182, 1, 247, 120, 248, 194, 222, 230, 182, 1, 241, 239, - 182, 1, 212, 30, 182, 1, 210, 108, 182, 1, 241, 196, 182, 1, 216, 227, - 182, 1, 216, 228, 243, 92, 182, 1, 210, 199, 182, 1, 210, 200, 241, 239, - 182, 1, 234, 226, 182, 1, 233, 102, 182, 1, 230, 191, 182, 1, 227, 195, - 182, 1, 220, 144, 182, 1, 40, 220, 144, 182, 1, 75, 182, 1, 225, 222, - 182, 1, 223, 50, 225, 222, 182, 1, 222, 25, 182, 1, 224, 76, 182, 1, 222, - 230, 182, 1, 220, 21, 182, 1, 217, 37, 182, 1, 225, 170, 252, 13, 182, 1, - 225, 170, 242, 243, 182, 1, 225, 170, 248, 21, 182, 224, 152, 48, 182, - 224, 152, 51, 182, 224, 152, 246, 118, 182, 210, 17, 48, 182, 210, 17, - 51, 182, 210, 17, 246, 118, 182, 223, 132, 48, 182, 223, 132, 51, 182, - 246, 119, 210, 24, 241, 45, 182, 246, 119, 210, 24, 254, 106, 182, 241, - 242, 48, 182, 241, 242, 51, 182, 241, 241, 246, 118, 182, 245, 80, 48, - 182, 245, 80, 51, 182, 222, 108, 182, 244, 137, 247, 121, 182, 223, 249, - 182, 222, 135, 182, 113, 67, 170, 48, 182, 113, 67, 170, 51, 182, 134, - 170, 48, 182, 134, 170, 51, 182, 226, 249, 232, 215, 48, 182, 226, 249, - 232, 215, 51, 182, 230, 57, 182, 252, 132, 182, 1, 219, 50, 210, 80, 182, - 1, 219, 50, 234, 123, 182, 1, 219, 50, 244, 155, 10, 1, 252, 56, 2, 134, - 170, 240, 251, 51, 10, 1, 252, 56, 2, 59, 252, 44, 22, 134, 170, 48, 10, - 1, 252, 56, 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 252, 56, 2, 134, - 170, 225, 8, 214, 153, 252, 44, 22, 113, 170, 48, 10, 1, 252, 56, 2, 113, - 170, 252, 44, 22, 59, 48, 10, 1, 252, 56, 2, 235, 194, 4, 214, 106, 51, - 10, 1, 252, 56, 2, 4, 214, 105, 10, 1, 122, 2, 113, 170, 48, 10, 1, 122, - 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 248, 197, 2, 113, 170, 213, - 189, 252, 44, 22, 4, 217, 81, 10, 1, 248, 197, 2, 235, 194, 4, 214, 106, - 51, 10, 1, 223, 97, 2, 91, 10, 1, 221, 168, 2, 244, 12, 170, 48, 10, 1, - 254, 198, 2, 113, 170, 48, 10, 1, 254, 198, 2, 134, 170, 225, 8, 246, - 105, 48, 10, 1, 254, 198, 2, 113, 170, 213, 189, 48, 10, 1, 244, 144, 2, - 113, 170, 51, 10, 1, 244, 144, 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, - 234, 176, 2, 59, 48, 10, 1, 234, 176, 2, 134, 170, 48, 10, 1, 234, 176, - 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 66, 2, 59, 48, 10, 1, 66, 2, - 59, 51, 10, 1, 228, 64, 2, 113, 170, 51, 10, 1, 228, 64, 2, 4, 217, 81, - 10, 1, 228, 64, 2, 4, 214, 105, 10, 1, 233, 104, 2, 130, 10, 1, 223, 97, - 2, 113, 170, 213, 189, 48, 10, 1, 223, 97, 2, 202, 48, 10, 1, 221, 168, - 2, 113, 170, 213, 189, 48, 10, 1, 122, 2, 4, 10, 1, 217, 82, 51, 10, 1, - 122, 2, 4, 10, 1, 217, 82, 22, 113, 247, 119, 10, 1, 221, 168, 2, 4, 10, - 1, 217, 82, 22, 113, 247, 119, 10, 1, 223, 97, 2, 4, 10, 1, 217, 82, 22, - 113, 247, 119, 10, 1, 122, 2, 4, 10, 1, 217, 82, 48, 10, 1, 112, 2, 245, - 23, 254, 38, 21, 113, 48, 10, 1, 112, 2, 245, 23, 254, 38, 21, 134, 48, - 10, 1, 244, 169, 79, 2, 245, 23, 254, 38, 21, 113, 48, 10, 1, 244, 169, - 79, 2, 245, 23, 254, 38, 21, 134, 48, 10, 1, 244, 169, 79, 2, 245, 23, - 254, 38, 21, 244, 12, 51, 10, 1, 212, 31, 2, 245, 23, 254, 38, 21, 113, - 48, 10, 1, 212, 31, 2, 245, 23, 254, 38, 21, 134, 48, 10, 1, 79, 252, - 134, 2, 245, 23, 254, 38, 21, 113, 48, 10, 1, 79, 252, 134, 2, 245, 23, - 254, 38, 21, 134, 48, 10, 1, 122, 2, 245, 23, 254, 38, 21, 244, 12, 51, - 10, 1, 221, 168, 2, 245, 23, 254, 38, 21, 244, 12, 48, 10, 1, 221, 168, - 2, 235, 194, 214, 105, 10, 1, 234, 252, 2, 113, 170, 48, 216, 206, 1, - 242, 47, 216, 206, 1, 220, 69, 216, 206, 1, 228, 62, 216, 206, 1, 223, - 185, 216, 206, 1, 252, 190, 216, 206, 1, 232, 252, 216, 206, 1, 235, 9, - 216, 206, 1, 254, 160, 216, 206, 1, 214, 25, 216, 206, 1, 231, 78, 216, - 206, 1, 244, 195, 216, 206, 1, 248, 24, 216, 206, 1, 216, 208, 216, 206, - 1, 233, 132, 216, 206, 1, 243, 132, 216, 206, 1, 242, 178, 216, 206, 1, - 221, 166, 216, 206, 1, 248, 149, 216, 206, 1, 210, 100, 216, 206, 1, 217, - 38, 216, 206, 1, 211, 103, 216, 206, 1, 225, 234, 216, 206, 1, 235, 129, - 216, 206, 1, 250, 135, 216, 206, 1, 215, 156, 216, 206, 1, 241, 189, 216, - 206, 1, 234, 132, 216, 206, 1, 216, 207, 216, 206, 1, 210, 115, 216, 206, - 1, 220, 59, 216, 206, 1, 222, 31, 216, 206, 1, 248, 220, 216, 206, 1, - 111, 216, 206, 1, 210, 23, 216, 206, 1, 254, 194, 216, 206, 1, 242, 244, - 216, 206, 1, 224, 86, 216, 206, 1, 212, 63, 216, 206, 255, 23, 216, 206, - 255, 39, 216, 206, 240, 115, 216, 206, 245, 209, 216, 206, 214, 222, 216, - 206, 226, 183, 216, 206, 245, 217, 216, 206, 245, 17, 216, 206, 226, 248, - 216, 206, 227, 0, 216, 206, 218, 46, 216, 206, 1, 229, 226, 228, 138, 21, - 210, 86, 228, 138, 21, 110, 228, 138, 21, 105, 228, 138, 21, 158, 228, - 138, 21, 161, 228, 138, 21, 189, 228, 138, 21, 194, 228, 138, 21, 198, - 228, 138, 21, 195, 228, 138, 21, 200, 228, 138, 1, 61, 228, 138, 1, 245, - 210, 228, 138, 1, 73, 228, 138, 1, 75, 228, 138, 1, 70, 228, 138, 1, 226, - 184, 228, 138, 1, 76, 228, 138, 1, 248, 210, 228, 138, 1, 230, 26, 228, - 138, 1, 252, 192, 228, 138, 1, 190, 228, 138, 1, 217, 106, 228, 138, 1, - 235, 142, 228, 138, 1, 250, 158, 228, 138, 1, 248, 222, 228, 138, 1, 205, - 228, 138, 1, 222, 180, 228, 138, 1, 206, 228, 138, 1, 243, 80, 228, 138, - 1, 244, 197, 228, 138, 1, 176, 228, 138, 1, 233, 136, 228, 138, 1, 229, - 230, 211, 223, 228, 138, 1, 185, 228, 138, 1, 227, 166, 228, 138, 1, 197, - 228, 138, 1, 162, 228, 138, 1, 212, 65, 228, 138, 1, 191, 228, 138, 1, - 227, 167, 211, 223, 228, 138, 1, 235, 62, 235, 142, 228, 138, 1, 235, 62, - 250, 158, 228, 138, 1, 235, 62, 205, 228, 138, 38, 219, 252, 125, 216, - 31, 228, 138, 38, 219, 252, 121, 216, 31, 228, 138, 38, 219, 252, 222, - 229, 216, 31, 228, 138, 38, 199, 248, 39, 216, 31, 228, 138, 38, 199, - 125, 216, 31, 228, 138, 38, 199, 121, 216, 31, 228, 138, 38, 199, 222, - 229, 216, 31, 228, 138, 38, 229, 194, 78, 228, 138, 38, 52, 59, 48, 228, - 138, 125, 138, 254, 58, 228, 138, 121, 138, 254, 58, 228, 138, 16, 226, - 185, 248, 51, 228, 138, 16, 243, 79, 228, 138, 249, 220, 228, 138, 245, - 32, 78, 228, 138, 233, 109, 221, 253, 1, 254, 177, 221, 253, 1, 251, 229, - 221, 253, 1, 243, 113, 221, 253, 1, 248, 195, 221, 253, 1, 235, 153, 221, - 253, 1, 252, 190, 221, 253, 1, 210, 89, 221, 253, 1, 235, 161, 221, 253, - 1, 216, 68, 221, 253, 1, 210, 182, 221, 253, 1, 235, 10, 221, 253, 1, - 233, 129, 221, 253, 1, 230, 191, 221, 253, 1, 227, 195, 221, 253, 1, 219, - 157, 221, 253, 1, 236, 0, 221, 253, 1, 244, 122, 221, 253, 1, 215, 182, - 221, 253, 1, 224, 11, 221, 253, 1, 222, 230, 221, 253, 1, 220, 86, 221, - 253, 1, 217, 101, 221, 253, 164, 236, 0, 221, 253, 164, 235, 255, 221, - 253, 164, 226, 244, 221, 253, 164, 248, 208, 221, 253, 58, 1, 245, 106, - 210, 182, 221, 253, 164, 245, 106, 210, 182, 221, 253, 25, 5, 199, 75, - 221, 253, 25, 5, 75, 221, 253, 25, 5, 226, 119, 255, 74, 221, 253, 25, 5, - 199, 255, 74, 221, 253, 25, 5, 255, 74, 221, 253, 25, 5, 226, 119, 61, - 221, 253, 25, 5, 199, 61, 221, 253, 25, 5, 61, 221, 253, 58, 1, 219, 252, - 61, 221, 253, 25, 5, 219, 252, 61, 221, 253, 25, 5, 199, 70, 221, 253, - 25, 5, 70, 221, 253, 58, 1, 73, 221, 253, 25, 5, 199, 73, 221, 253, 25, - 5, 73, 221, 253, 25, 5, 76, 221, 253, 25, 5, 218, 46, 221, 253, 164, 229, - 93, 221, 253, 224, 142, 229, 93, 221, 253, 224, 142, 254, 219, 221, 253, - 224, 142, 254, 115, 221, 253, 224, 142, 252, 115, 221, 253, 224, 142, - 253, 202, 221, 253, 224, 142, 220, 9, 221, 253, 255, 22, 78, 221, 253, - 224, 142, 231, 69, 224, 46, 221, 253, 224, 142, 210, 31, 221, 253, 224, - 142, 224, 46, 221, 253, 224, 142, 210, 114, 221, 253, 224, 142, 215, 90, - 221, 253, 224, 142, 254, 10, 221, 253, 224, 142, 219, 54, 231, 146, 221, - 253, 224, 142, 254, 101, 231, 183, 1, 242, 25, 231, 183, 1, 255, 26, 231, - 183, 1, 254, 217, 231, 183, 1, 255, 0, 231, 183, 1, 254, 210, 231, 183, - 1, 214, 124, 231, 183, 1, 253, 161, 231, 183, 1, 235, 161, 231, 183, 1, - 253, 199, 231, 183, 1, 254, 182, 231, 183, 1, 254, 187, 231, 183, 1, 254, - 179, 231, 183, 1, 254, 137, 231, 183, 1, 254, 124, 231, 183, 1, 253, 238, - 231, 183, 1, 236, 0, 231, 183, 1, 254, 73, 231, 183, 1, 253, 209, 231, - 183, 1, 254, 46, 231, 183, 1, 254, 42, 231, 183, 1, 253, 232, 231, 183, - 1, 253, 207, 231, 183, 1, 246, 56, 231, 183, 1, 235, 3, 231, 183, 1, 254, - 197, 231, 183, 254, 223, 78, 231, 183, 213, 136, 78, 231, 183, 243, 54, - 78, 231, 183, 224, 141, 10, 1, 252, 56, 2, 4, 214, 106, 51, 10, 1, 151, - 2, 113, 170, 48, 10, 1, 217, 82, 2, 113, 170, 48, 10, 1, 244, 144, 2, 59, - 252, 44, 22, 134, 170, 48, 10, 1, 224, 83, 2, 59, 51, 10, 1, 233, 104, 2, - 52, 130, 10, 1, 66, 2, 134, 170, 48, 10, 1, 79, 2, 113, 170, 252, 44, 22, - 202, 48, 10, 1, 79, 2, 113, 170, 252, 44, 22, 59, 48, 10, 1, 223, 97, 2, - 232, 124, 10, 1, 212, 31, 2, 59, 211, 231, 10, 1, 222, 202, 211, 43, 10, - 249, 100, 244, 166, 10, 249, 100, 248, 185, 10, 249, 100, 234, 206, 10, - 249, 100, 244, 164, 10, 249, 100, 248, 183, 10, 249, 100, 234, 204, 10, - 138, 123, 59, 48, 10, 138, 113, 170, 48, 10, 138, 232, 125, 48, 10, 138, - 123, 59, 51, 10, 138, 113, 170, 51, 10, 138, 232, 125, 51, 10, 204, 244, - 164, 10, 204, 248, 183, 10, 204, 234, 204, 10, 4, 125, 212, 30, 10, 244, - 167, 2, 222, 234, 10, 244, 167, 2, 59, 48, 10, 234, 207, 2, 59, 51, 10, - 43, 253, 251, 48, 10, 44, 253, 251, 48, 10, 43, 253, 251, 51, 10, 44, - 253, 251, 51, 10, 52, 44, 253, 251, 48, 10, 52, 44, 253, 251, 77, 2, 247, - 121, 10, 44, 253, 251, 77, 2, 247, 121, 10, 248, 186, 2, 247, 121, 84, 5, - 235, 194, 251, 0, 84, 5, 251, 0, 84, 5, 254, 76, 84, 5, 213, 147, 84, 1, - 219, 252, 61, 84, 1, 61, 84, 1, 255, 74, 84, 1, 73, 84, 1, 236, 34, 84, - 1, 70, 84, 1, 214, 118, 84, 1, 149, 153, 84, 1, 149, 156, 84, 1, 251, 3, - 75, 84, 1, 219, 252, 75, 84, 1, 75, 84, 1, 254, 202, 84, 1, 251, 3, 76, - 84, 1, 219, 252, 76, 84, 1, 76, 84, 1, 253, 193, 84, 1, 176, 84, 1, 234, - 133, 84, 1, 243, 136, 84, 1, 242, 250, 84, 1, 229, 78, 84, 1, 251, 34, - 84, 1, 250, 158, 84, 1, 235, 142, 84, 1, 235, 115, 84, 1, 227, 166, 84, - 1, 215, 157, 84, 1, 215, 145, 84, 1, 248, 136, 84, 1, 248, 120, 84, 1, - 228, 111, 84, 1, 217, 106, 84, 1, 216, 209, 84, 1, 248, 222, 84, 1, 248, - 26, 84, 1, 197, 84, 1, 228, 93, 84, 1, 190, 84, 1, 225, 148, 84, 1, 252, - 192, 84, 1, 252, 19, 84, 1, 185, 84, 1, 191, 84, 1, 205, 84, 1, 222, 180, - 84, 1, 233, 136, 84, 1, 232, 185, 84, 1, 232, 176, 84, 1, 214, 27, 84, 1, - 220, 103, 84, 1, 218, 224, 84, 1, 206, 84, 1, 162, 84, 25, 5, 226, 235, - 84, 25, 5, 226, 182, 84, 5, 227, 206, 84, 5, 253, 176, 84, 25, 5, 255, - 74, 84, 25, 5, 73, 84, 25, 5, 236, 34, 84, 25, 5, 70, 84, 25, 5, 214, - 118, 84, 25, 5, 149, 153, 84, 25, 5, 149, 222, 181, 84, 25, 5, 251, 3, - 75, 84, 25, 5, 219, 252, 75, 84, 25, 5, 75, 84, 25, 5, 254, 202, 84, 25, - 5, 251, 3, 76, 84, 25, 5, 219, 252, 76, 84, 25, 5, 76, 84, 25, 5, 253, - 193, 84, 5, 213, 152, 84, 25, 5, 224, 186, 75, 84, 25, 5, 253, 172, 84, - 226, 205, 84, 218, 112, 5, 214, 216, 84, 218, 112, 5, 254, 78, 84, 242, - 138, 255, 15, 84, 255, 4, 255, 15, 84, 25, 5, 251, 3, 199, 75, 84, 25, 5, - 214, 214, 84, 25, 5, 214, 117, 84, 1, 224, 89, 84, 1, 234, 116, 84, 1, - 242, 227, 84, 1, 210, 116, 84, 1, 248, 125, 84, 1, 223, 40, 84, 1, 244, - 197, 84, 1, 210, 168, 84, 1, 149, 222, 181, 84, 1, 149, 232, 186, 84, 25, - 5, 149, 156, 84, 25, 5, 149, 232, 186, 84, 248, 179, 84, 52, 248, 179, - 84, 21, 210, 86, 84, 21, 110, 84, 21, 105, 84, 21, 158, 84, 21, 161, 84, - 21, 189, 84, 21, 194, 84, 21, 198, 84, 21, 195, 84, 21, 200, 84, 255, 22, - 50, 84, 5, 125, 219, 18, 247, 121, 84, 1, 251, 3, 61, 84, 1, 226, 235, - 84, 1, 226, 182, 84, 1, 253, 172, 84, 1, 214, 214, 84, 1, 214, 117, 84, - 1, 210, 82, 84, 1, 114, 191, 84, 1, 243, 30, 84, 1, 235, 97, 84, 1, 242, - 181, 218, 130, 84, 1, 248, 126, 84, 1, 252, 112, 146, 5, 251, 0, 146, 5, - 254, 76, 146, 5, 213, 147, 146, 1, 61, 146, 1, 255, 74, 146, 1, 73, 146, - 1, 236, 34, 146, 1, 70, 146, 1, 214, 118, 146, 1, 149, 153, 146, 1, 149, - 156, 146, 1, 75, 146, 1, 254, 202, 146, 1, 76, 146, 1, 253, 193, 146, 1, - 176, 146, 1, 234, 133, 146, 1, 243, 136, 146, 1, 242, 250, 146, 1, 229, - 78, 146, 1, 251, 34, 146, 1, 250, 158, 146, 1, 235, 142, 146, 1, 235, - 115, 146, 1, 227, 166, 146, 1, 215, 157, 146, 1, 215, 145, 146, 1, 248, - 136, 146, 1, 248, 120, 146, 1, 228, 111, 146, 1, 217, 106, 146, 1, 216, - 209, 146, 1, 248, 222, 146, 1, 248, 26, 146, 1, 197, 146, 1, 190, 146, 1, - 225, 148, 146, 1, 252, 192, 146, 1, 252, 19, 146, 1, 185, 146, 1, 191, - 146, 1, 205, 146, 1, 233, 136, 146, 1, 220, 103, 146, 1, 218, 224, 146, - 1, 206, 146, 1, 162, 146, 5, 227, 206, 146, 5, 253, 176, 146, 25, 5, 255, - 74, 146, 25, 5, 73, 146, 25, 5, 236, 34, 146, 25, 5, 70, 146, 25, 5, 214, - 118, 146, 25, 5, 149, 153, 146, 25, 5, 149, 222, 181, 146, 25, 5, 75, - 146, 25, 5, 254, 202, 146, 25, 5, 76, 146, 25, 5, 253, 193, 146, 5, 213, - 152, 146, 1, 234, 125, 217, 106, 146, 253, 194, 233, 24, 78, 146, 1, 222, - 180, 146, 1, 223, 40, 146, 1, 210, 168, 146, 1, 149, 222, 181, 146, 1, - 149, 232, 186, 146, 25, 5, 149, 156, 146, 25, 5, 149, 232, 186, 146, 21, - 210, 86, 146, 21, 110, 146, 21, 105, 146, 21, 158, 146, 21, 161, 146, 21, - 189, 146, 21, 194, 146, 21, 198, 146, 21, 195, 146, 21, 200, 146, 1, 223, - 189, 2, 230, 225, 247, 255, 146, 1, 223, 189, 2, 232, 109, 247, 255, 146, - 222, 119, 78, 146, 222, 119, 50, 146, 249, 99, 227, 198, 110, 146, 249, - 99, 227, 198, 105, 146, 249, 99, 227, 198, 158, 146, 249, 99, 227, 198, - 161, 146, 249, 99, 227, 198, 123, 233, 17, 216, 202, 216, 197, 248, 49, - 146, 249, 99, 248, 50, 219, 120, 146, 235, 162, 146, 243, 104, 78, 184, - 5, 254, 255, 251, 244, 184, 5, 251, 244, 184, 5, 213, 147, 184, 1, 61, - 184, 1, 255, 74, 184, 1, 73, 184, 1, 236, 34, 184, 1, 70, 184, 1, 214, - 118, 184, 1, 245, 210, 184, 1, 254, 202, 184, 1, 226, 184, 184, 1, 253, - 193, 184, 1, 176, 184, 1, 234, 133, 184, 1, 243, 136, 184, 1, 242, 250, - 184, 1, 229, 78, 184, 1, 251, 34, 184, 1, 250, 158, 184, 1, 235, 142, - 184, 1, 235, 115, 184, 1, 227, 166, 184, 1, 215, 157, 184, 1, 215, 145, - 184, 1, 248, 136, 184, 1, 248, 120, 184, 1, 228, 111, 184, 1, 217, 106, - 184, 1, 216, 209, 184, 1, 248, 222, 184, 1, 248, 26, 184, 1, 197, 184, 1, - 190, 184, 1, 225, 148, 184, 1, 252, 192, 184, 1, 252, 19, 184, 1, 185, - 184, 1, 191, 184, 1, 205, 184, 1, 233, 136, 184, 1, 232, 185, 184, 1, - 214, 27, 184, 1, 220, 103, 184, 1, 206, 184, 1, 162, 184, 5, 227, 206, - 184, 25, 5, 255, 74, 184, 25, 5, 73, 184, 25, 5, 236, 34, 184, 25, 5, 70, - 184, 25, 5, 214, 118, 184, 25, 5, 245, 210, 184, 25, 5, 254, 202, 184, - 25, 5, 226, 184, 184, 25, 5, 253, 193, 184, 5, 213, 152, 184, 5, 214, - 218, 184, 1, 234, 116, 184, 1, 242, 227, 184, 1, 210, 116, 184, 1, 222, - 180, 184, 1, 244, 197, 184, 21, 210, 86, 184, 21, 110, 184, 21, 105, 184, - 21, 158, 184, 21, 161, 184, 21, 189, 184, 21, 194, 184, 21, 198, 184, 21, - 195, 184, 21, 200, 184, 216, 75, 184, 254, 254, 184, 235, 179, 184, 214, - 146, 184, 245, 182, 226, 189, 184, 5, 211, 78, 171, 5, 251, 0, 171, 5, - 254, 76, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, 74, 171, 1, 73, 171, - 1, 236, 34, 171, 1, 70, 171, 1, 214, 118, 171, 1, 149, 153, 171, 1, 149, - 156, 171, 25, 251, 3, 75, 171, 1, 75, 171, 1, 254, 202, 171, 25, 251, 3, - 76, 171, 1, 76, 171, 1, 253, 193, 171, 1, 176, 171, 1, 234, 133, 171, 1, - 243, 136, 171, 1, 242, 250, 171, 1, 229, 78, 171, 1, 251, 34, 171, 1, - 250, 158, 171, 1, 235, 142, 171, 1, 235, 115, 171, 1, 227, 166, 171, 1, - 215, 157, 171, 1, 215, 145, 171, 1, 248, 136, 171, 1, 248, 120, 171, 1, - 228, 111, 171, 1, 217, 106, 171, 1, 216, 209, 171, 1, 248, 222, 171, 1, - 248, 26, 171, 1, 197, 171, 1, 190, 171, 1, 225, 148, 171, 1, 252, 192, - 171, 1, 252, 19, 171, 1, 185, 171, 1, 191, 171, 1, 205, 171, 1, 233, 136, - 171, 1, 232, 185, 171, 1, 214, 27, 171, 1, 220, 103, 171, 1, 218, 224, - 171, 1, 206, 171, 1, 162, 171, 5, 227, 206, 171, 5, 253, 176, 171, 25, 5, - 255, 74, 171, 25, 5, 73, 171, 25, 5, 236, 34, 171, 25, 5, 70, 171, 25, 5, - 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, 149, 222, 181, 171, 25, 5, - 251, 3, 75, 171, 25, 5, 75, 171, 25, 5, 254, 202, 171, 25, 5, 251, 3, 76, - 171, 25, 5, 76, 171, 25, 5, 253, 193, 171, 5, 213, 152, 171, 226, 205, - 171, 1, 149, 222, 181, 171, 1, 149, 232, 186, 171, 25, 5, 149, 156, 171, - 25, 5, 149, 232, 186, 171, 21, 210, 86, 171, 21, 110, 171, 21, 105, 171, - 21, 158, 171, 21, 161, 171, 21, 189, 171, 21, 194, 171, 21, 198, 171, 21, - 195, 171, 21, 200, 171, 255, 22, 50, 171, 222, 119, 50, 157, 5, 251, 0, - 157, 5, 254, 76, 157, 5, 213, 147, 157, 1, 61, 157, 1, 255, 74, 157, 1, - 73, 157, 1, 236, 34, 157, 1, 70, 157, 1, 214, 118, 157, 1, 149, 153, 157, - 1, 149, 156, 157, 1, 75, 157, 1, 254, 202, 157, 1, 76, 157, 1, 253, 193, - 157, 1, 176, 157, 1, 234, 133, 157, 1, 243, 136, 157, 1, 242, 250, 157, - 1, 229, 78, 157, 1, 251, 34, 157, 1, 250, 158, 157, 1, 235, 142, 157, 1, - 235, 115, 157, 1, 227, 166, 157, 1, 215, 157, 157, 1, 215, 145, 157, 1, - 248, 136, 157, 1, 248, 120, 157, 1, 228, 111, 157, 1, 217, 106, 157, 1, - 216, 209, 157, 1, 248, 222, 157, 1, 248, 26, 157, 1, 197, 157, 1, 190, - 157, 1, 225, 148, 157, 1, 252, 192, 157, 1, 252, 19, 157, 1, 185, 157, 1, - 191, 157, 1, 205, 157, 1, 233, 136, 157, 1, 232, 185, 157, 1, 214, 27, - 157, 1, 220, 103, 157, 1, 218, 224, 157, 1, 206, 157, 1, 162, 157, 5, - 227, 206, 157, 5, 253, 176, 157, 25, 5, 255, 74, 157, 25, 5, 73, 157, 25, - 5, 236, 34, 157, 25, 5, 70, 157, 25, 5, 214, 118, 157, 25, 5, 149, 153, - 157, 25, 5, 149, 222, 181, 157, 25, 5, 75, 157, 25, 5, 254, 202, 157, 25, - 5, 76, 157, 25, 5, 253, 193, 157, 5, 213, 152, 157, 254, 203, 233, 24, - 78, 157, 253, 194, 233, 24, 78, 157, 1, 222, 180, 157, 1, 223, 40, 157, - 1, 210, 168, 157, 1, 149, 222, 181, 157, 1, 149, 232, 186, 157, 25, 5, - 149, 156, 157, 25, 5, 149, 232, 186, 157, 21, 210, 86, 157, 21, 110, 157, - 21, 105, 157, 21, 158, 157, 21, 161, 157, 21, 189, 157, 21, 194, 157, 21, - 198, 157, 21, 195, 157, 21, 200, 157, 235, 162, 157, 1, 212, 65, 157, - 244, 3, 123, 224, 22, 157, 244, 3, 123, 242, 28, 157, 244, 3, 134, 224, - 20, 157, 244, 3, 123, 219, 118, 157, 244, 3, 123, 245, 189, 157, 244, 3, - 134, 219, 117, 36, 5, 254, 76, 36, 5, 213, 147, 36, 1, 61, 36, 1, 255, - 74, 36, 1, 73, 36, 1, 236, 34, 36, 1, 70, 36, 1, 214, 118, 36, 1, 75, 36, - 1, 245, 210, 36, 1, 254, 202, 36, 1, 76, 36, 1, 226, 184, 36, 1, 253, - 193, 36, 1, 176, 36, 1, 229, 78, 36, 1, 251, 34, 36, 1, 235, 142, 36, 1, - 227, 166, 36, 1, 215, 157, 36, 1, 228, 111, 36, 1, 217, 106, 36, 1, 197, - 36, 1, 228, 93, 36, 1, 190, 36, 1, 185, 36, 1, 191, 36, 1, 205, 36, 1, - 222, 180, 36, 1, 233, 136, 36, 1, 232, 185, 36, 1, 232, 176, 36, 1, 214, - 27, 36, 1, 220, 103, 36, 1, 218, 224, 36, 1, 206, 36, 1, 162, 36, 25, 5, - 255, 74, 36, 25, 5, 73, 36, 25, 5, 236, 34, 36, 25, 5, 70, 36, 25, 5, - 214, 118, 36, 25, 5, 75, 36, 25, 5, 245, 210, 36, 25, 5, 254, 202, 36, - 25, 5, 76, 36, 25, 5, 226, 184, 36, 25, 5, 253, 193, 36, 5, 213, 152, 36, - 226, 205, 36, 253, 194, 233, 24, 78, 36, 21, 210, 86, 36, 21, 110, 36, - 21, 105, 36, 21, 158, 36, 21, 161, 36, 21, 189, 36, 21, 194, 36, 21, 198, - 36, 21, 195, 36, 21, 200, 36, 54, 216, 248, 36, 54, 123, 240, 211, 36, - 54, 123, 216, 148, 36, 248, 147, 50, 36, 230, 136, 50, 36, 211, 45, 50, - 36, 248, 88, 50, 36, 249, 140, 50, 36, 253, 239, 77, 50, 36, 222, 119, - 50, 36, 54, 50, 148, 5, 251, 0, 148, 5, 254, 76, 148, 5, 213, 147, 148, - 1, 61, 148, 1, 255, 74, 148, 1, 73, 148, 1, 236, 34, 148, 1, 70, 148, 1, - 214, 118, 148, 1, 149, 153, 148, 1, 149, 156, 148, 1, 75, 148, 1, 245, - 210, 148, 1, 254, 202, 148, 1, 76, 148, 1, 226, 184, 148, 1, 253, 193, - 148, 1, 176, 148, 1, 234, 133, 148, 1, 243, 136, 148, 1, 242, 250, 148, - 1, 229, 78, 148, 1, 251, 34, 148, 1, 250, 158, 148, 1, 235, 142, 148, 1, - 235, 115, 148, 1, 227, 166, 148, 1, 215, 157, 148, 1, 215, 145, 148, 1, - 248, 136, 148, 1, 248, 120, 148, 1, 228, 111, 148, 1, 217, 106, 148, 1, - 216, 209, 148, 1, 248, 222, 148, 1, 248, 26, 148, 1, 197, 148, 1, 190, - 148, 1, 225, 148, 148, 1, 252, 192, 148, 1, 252, 19, 148, 1, 185, 148, 1, - 191, 148, 1, 205, 148, 1, 222, 180, 148, 1, 233, 136, 148, 1, 232, 185, - 148, 1, 214, 27, 148, 1, 220, 103, 148, 1, 218, 224, 148, 1, 206, 148, 1, - 162, 148, 5, 253, 176, 148, 25, 5, 255, 74, 148, 25, 5, 73, 148, 25, 5, - 236, 34, 148, 25, 5, 70, 148, 25, 5, 214, 118, 148, 25, 5, 149, 153, 148, - 25, 5, 149, 222, 181, 148, 25, 5, 75, 148, 25, 5, 245, 210, 148, 25, 5, - 254, 202, 148, 25, 5, 76, 148, 25, 5, 226, 184, 148, 25, 5, 253, 193, - 148, 5, 213, 152, 148, 233, 24, 78, 148, 254, 203, 233, 24, 78, 148, 1, - 215, 184, 148, 1, 246, 39, 148, 1, 149, 222, 181, 148, 1, 149, 232, 186, - 148, 25, 5, 149, 156, 148, 25, 5, 149, 232, 186, 148, 21, 210, 86, 148, - 21, 110, 148, 21, 105, 148, 21, 158, 148, 21, 161, 148, 21, 189, 148, 21, - 194, 148, 21, 198, 148, 21, 195, 148, 21, 200, 148, 244, 3, 21, 210, 87, - 31, 226, 238, 224, 224, 64, 161, 148, 244, 3, 21, 123, 31, 226, 238, 224, - 224, 64, 161, 148, 244, 3, 21, 113, 31, 226, 238, 224, 224, 64, 161, 148, - 244, 3, 21, 134, 31, 226, 238, 224, 224, 64, 161, 148, 244, 3, 21, 123, - 31, 245, 43, 224, 224, 64, 161, 148, 244, 3, 21, 113, 31, 245, 43, 224, - 224, 64, 161, 148, 244, 3, 21, 134, 31, 245, 43, 224, 224, 64, 161, 148, - 5, 215, 84, 165, 5, 254, 76, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255, - 74, 165, 1, 73, 165, 1, 236, 34, 165, 1, 70, 165, 1, 214, 118, 165, 1, - 149, 153, 165, 1, 149, 156, 165, 1, 75, 165, 1, 245, 210, 165, 1, 254, - 202, 165, 1, 76, 165, 1, 226, 184, 165, 1, 253, 193, 165, 1, 176, 165, 1, - 234, 133, 165, 1, 243, 136, 165, 1, 242, 250, 165, 1, 229, 78, 165, 1, - 251, 34, 165, 1, 250, 158, 165, 1, 235, 142, 165, 1, 235, 115, 165, 1, - 227, 166, 165, 1, 215, 157, 165, 1, 215, 145, 165, 1, 248, 136, 165, 1, - 248, 120, 165, 1, 228, 111, 165, 1, 217, 106, 165, 1, 216, 209, 165, 1, - 248, 222, 165, 1, 248, 26, 165, 1, 197, 165, 1, 190, 165, 1, 225, 148, - 165, 1, 252, 192, 165, 1, 252, 19, 165, 1, 185, 165, 1, 191, 165, 1, 205, - 165, 1, 222, 180, 165, 1, 233, 136, 165, 1, 232, 185, 165, 1, 214, 27, - 165, 1, 220, 103, 165, 1, 218, 224, 165, 1, 206, 165, 1, 162, 165, 5, - 227, 206, 165, 5, 253, 176, 165, 25, 5, 255, 74, 165, 25, 5, 73, 165, 25, - 5, 236, 34, 165, 25, 5, 70, 165, 25, 5, 214, 118, 165, 25, 5, 149, 153, - 165, 25, 5, 149, 222, 181, 165, 25, 5, 75, 165, 25, 5, 245, 210, 165, 25, - 5, 254, 202, 165, 25, 5, 76, 165, 25, 5, 226, 184, 165, 25, 5, 253, 193, - 165, 5, 213, 152, 165, 233, 24, 78, 165, 254, 203, 233, 24, 78, 165, 1, - 244, 197, 165, 1, 149, 222, 181, 165, 1, 149, 232, 186, 165, 25, 5, 149, - 156, 165, 25, 5, 149, 232, 186, 165, 21, 210, 86, 165, 21, 110, 165, 21, - 105, 165, 21, 158, 165, 21, 161, 165, 21, 189, 165, 21, 194, 165, 21, - 198, 165, 21, 195, 165, 21, 200, 165, 5, 235, 103, 165, 5, 214, 161, 136, - 5, 254, 76, 136, 5, 213, 147, 136, 1, 61, 136, 1, 255, 74, 136, 1, 73, - 136, 1, 236, 34, 136, 1, 70, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1, - 149, 156, 136, 1, 75, 136, 1, 245, 210, 136, 1, 254, 202, 136, 1, 76, - 136, 1, 226, 184, 136, 1, 253, 193, 136, 1, 176, 136, 1, 234, 133, 136, - 1, 243, 136, 136, 1, 242, 250, 136, 1, 229, 78, 136, 1, 251, 34, 136, 1, - 250, 158, 136, 1, 235, 142, 136, 1, 235, 115, 136, 1, 227, 166, 136, 1, - 215, 157, 136, 1, 215, 145, 136, 1, 248, 136, 136, 1, 248, 120, 136, 1, - 228, 111, 136, 1, 217, 106, 136, 1, 216, 209, 136, 1, 248, 222, 136, 1, - 248, 26, 136, 1, 197, 136, 1, 228, 93, 136, 1, 190, 136, 1, 225, 148, - 136, 1, 252, 192, 136, 1, 252, 19, 136, 1, 185, 136, 1, 191, 136, 1, 205, - 136, 1, 222, 180, 136, 1, 233, 136, 136, 1, 232, 185, 136, 1, 232, 176, - 136, 1, 214, 27, 136, 1, 220, 103, 136, 1, 218, 224, 136, 1, 206, 136, 1, - 162, 136, 1, 215, 126, 136, 5, 253, 176, 136, 25, 5, 255, 74, 136, 25, 5, - 73, 136, 25, 5, 236, 34, 136, 25, 5, 70, 136, 25, 5, 214, 118, 136, 25, - 5, 149, 153, 136, 25, 5, 149, 222, 181, 136, 25, 5, 75, 136, 25, 5, 245, - 210, 136, 25, 5, 254, 202, 136, 25, 5, 76, 136, 25, 5, 226, 184, 136, 25, - 5, 253, 193, 136, 5, 213, 152, 136, 1, 59, 223, 74, 136, 253, 194, 233, - 24, 78, 136, 1, 149, 222, 181, 136, 1, 149, 232, 186, 136, 25, 5, 149, - 156, 136, 25, 5, 149, 232, 186, 136, 21, 210, 86, 136, 21, 110, 136, 21, - 105, 136, 21, 158, 136, 21, 161, 136, 21, 189, 136, 21, 194, 136, 21, - 198, 136, 21, 195, 136, 21, 200, 136, 54, 216, 248, 136, 54, 123, 240, - 211, 136, 54, 123, 216, 148, 136, 244, 3, 123, 224, 22, 136, 244, 3, 123, - 242, 28, 136, 244, 3, 134, 224, 20, 136, 248, 151, 78, 136, 1, 250, 100, - 228, 112, 136, 1, 250, 100, 230, 26, 136, 1, 250, 100, 222, 181, 136, 1, - 250, 100, 156, 136, 1, 250, 100, 232, 186, 136, 1, 250, 100, 235, 24, - 175, 5, 254, 75, 175, 5, 213, 146, 175, 1, 253, 166, 175, 1, 255, 28, - 175, 1, 254, 224, 175, 1, 254, 239, 175, 1, 235, 152, 175, 1, 236, 33, - 175, 1, 214, 110, 175, 1, 214, 112, 175, 1, 235, 174, 175, 1, 235, 175, - 175, 1, 236, 19, 175, 1, 236, 21, 175, 1, 245, 18, 175, 1, 245, 205, 175, - 1, 254, 189, 175, 1, 226, 109, 175, 1, 226, 178, 175, 1, 253, 179, 175, - 1, 254, 147, 234, 188, 175, 1, 231, 210, 234, 188, 175, 1, 254, 147, 243, - 83, 175, 1, 231, 210, 243, 83, 175, 1, 234, 230, 229, 223, 175, 1, 221, - 237, 243, 83, 175, 1, 254, 147, 250, 217, 175, 1, 231, 210, 250, 217, - 175, 1, 254, 147, 235, 128, 175, 1, 231, 210, 235, 128, 175, 1, 217, 99, - 229, 223, 175, 1, 217, 99, 221, 236, 229, 224, 175, 1, 221, 237, 235, - 128, 175, 1, 254, 147, 215, 153, 175, 1, 231, 210, 215, 153, 175, 1, 254, - 147, 248, 127, 175, 1, 231, 210, 248, 127, 175, 1, 230, 54, 229, 181, - 175, 1, 221, 237, 248, 127, 175, 1, 254, 147, 217, 31, 175, 1, 231, 210, - 217, 31, 175, 1, 254, 147, 248, 145, 175, 1, 231, 210, 248, 145, 175, 1, - 248, 175, 229, 181, 175, 1, 221, 237, 248, 145, 175, 1, 254, 147, 225, - 229, 175, 1, 231, 210, 225, 229, 175, 1, 254, 147, 252, 113, 175, 1, 231, - 210, 252, 113, 175, 1, 231, 132, 175, 1, 254, 132, 252, 113, 175, 1, 211, - 51, 175, 1, 223, 134, 175, 1, 248, 175, 233, 68, 175, 1, 214, 1, 175, 1, - 217, 99, 221, 211, 175, 1, 230, 54, 221, 211, 175, 1, 248, 175, 221, 211, - 175, 1, 241, 243, 175, 1, 230, 54, 233, 68, 175, 1, 244, 157, 175, 5, - 254, 178, 175, 25, 5, 254, 234, 175, 25, 5, 234, 156, 254, 241, 175, 25, - 5, 247, 229, 254, 241, 175, 25, 5, 234, 156, 235, 171, 175, 25, 5, 247, - 229, 235, 171, 175, 25, 5, 234, 156, 226, 89, 175, 25, 5, 247, 229, 226, - 89, 175, 25, 5, 243, 125, 175, 25, 5, 234, 16, 175, 25, 5, 247, 229, 234, - 16, 175, 25, 5, 234, 18, 248, 68, 175, 25, 5, 234, 17, 242, 48, 254, 234, - 175, 25, 5, 234, 17, 242, 48, 247, 229, 254, 234, 175, 25, 5, 234, 17, - 242, 48, 243, 82, 175, 25, 5, 243, 82, 175, 25, 5, 247, 229, 243, 125, - 175, 25, 5, 247, 229, 243, 82, 175, 224, 142, 233, 208, 168, 135, 234, - 30, 234, 247, 168, 135, 234, 107, 234, 129, 168, 135, 234, 107, 234, 100, - 168, 135, 234, 107, 234, 96, 168, 135, 234, 107, 234, 104, 168, 135, 234, - 107, 223, 155, 168, 135, 229, 6, 228, 249, 168, 135, 250, 88, 250, 148, - 168, 135, 250, 88, 250, 96, 168, 135, 250, 88, 250, 147, 168, 135, 219, - 60, 219, 59, 168, 135, 250, 88, 250, 84, 168, 135, 210, 245, 210, 252, - 168, 135, 247, 147, 250, 155, 168, 135, 216, 43, 225, 239, 168, 135, 216, - 158, 216, 201, 168, 135, 216, 158, 229, 202, 168, 135, 216, 158, 225, - 112, 168, 135, 228, 76, 229, 99, 168, 135, 247, 147, 248, 69, 168, 135, - 216, 43, 217, 56, 168, 135, 216, 158, 216, 132, 168, 135, 216, 158, 216, - 205, 168, 135, 216, 158, 216, 155, 168, 135, 228, 76, 227, 238, 168, 135, - 251, 207, 252, 165, 168, 135, 225, 18, 225, 43, 168, 135, 225, 123, 225, - 114, 168, 135, 244, 45, 244, 197, 168, 135, 225, 123, 225, 142, 168, 135, - 244, 45, 244, 174, 168, 135, 225, 123, 221, 248, 168, 135, 230, 163, 185, - 168, 135, 210, 245, 211, 79, 168, 135, 222, 213, 222, 140, 168, 135, 222, - 141, 168, 135, 232, 158, 232, 207, 168, 135, 232, 99, 168, 135, 211, 228, - 212, 61, 168, 135, 219, 60, 222, 7, 168, 135, 219, 60, 222, 115, 168, - 135, 219, 60, 218, 83, 168, 135, 241, 70, 241, 160, 168, 135, 232, 158, - 250, 69, 168, 135, 144, 254, 116, 168, 135, 241, 70, 228, 71, 168, 135, - 226, 69, 168, 135, 221, 231, 61, 168, 135, 231, 205, 242, 18, 168, 135, - 221, 231, 255, 74, 168, 135, 221, 231, 254, 137, 168, 135, 221, 231, 73, - 168, 135, 221, 231, 236, 34, 168, 135, 221, 231, 214, 214, 168, 135, 221, - 231, 214, 212, 168, 135, 221, 231, 70, 168, 135, 221, 231, 214, 118, 168, - 135, 225, 125, 168, 249, 99, 16, 252, 166, 168, 135, 221, 231, 75, 168, - 135, 221, 231, 254, 244, 168, 135, 221, 231, 76, 168, 135, 221, 231, 254, - 203, 231, 199, 168, 135, 221, 231, 254, 203, 231, 200, 168, 135, 233, - 107, 168, 135, 231, 196, 168, 135, 231, 197, 168, 135, 231, 205, 245, - 181, 168, 135, 231, 205, 216, 157, 168, 135, 231, 205, 215, 229, 168, - 135, 231, 205, 250, 136, 168, 135, 216, 199, 168, 135, 228, 206, 168, - 135, 211, 73, 168, 135, 244, 36, 168, 21, 210, 86, 168, 21, 110, 168, 21, - 105, 168, 21, 158, 168, 21, 161, 168, 21, 189, 168, 21, 194, 168, 21, - 198, 168, 21, 195, 168, 21, 200, 168, 135, 254, 112, 168, 135, 234, 105, - 209, 209, 1, 234, 29, 209, 209, 1, 234, 107, 218, 36, 209, 209, 1, 234, - 107, 217, 63, 209, 209, 1, 229, 5, 209, 209, 1, 249, 239, 209, 209, 1, - 219, 60, 217, 63, 209, 209, 1, 227, 135, 209, 209, 1, 247, 146, 209, 209, - 1, 111, 209, 209, 1, 216, 158, 218, 36, 209, 209, 1, 216, 158, 217, 63, - 209, 209, 1, 228, 75, 209, 209, 1, 251, 206, 209, 209, 1, 225, 17, 209, - 209, 1, 225, 123, 218, 36, 209, 209, 1, 244, 45, 217, 63, 209, 209, 1, - 225, 123, 217, 63, 209, 209, 1, 244, 45, 218, 36, 209, 209, 1, 230, 162, - 209, 209, 1, 210, 244, 209, 209, 1, 232, 158, 232, 207, 209, 209, 1, 232, - 158, 232, 122, 209, 209, 1, 211, 227, 209, 209, 1, 219, 60, 218, 36, 209, - 209, 1, 241, 70, 218, 36, 209, 209, 1, 76, 209, 209, 1, 241, 70, 217, 63, - 209, 209, 245, 164, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 205, 234, - 235, 209, 209, 25, 5, 255, 74, 209, 209, 25, 5, 254, 137, 209, 209, 25, - 5, 73, 209, 209, 25, 5, 236, 34, 209, 209, 25, 5, 211, 117, 209, 209, 25, - 5, 210, 169, 209, 209, 25, 5, 70, 209, 209, 25, 5, 214, 118, 209, 209, - 25, 5, 231, 205, 234, 14, 209, 209, 220, 146, 5, 232, 157, 209, 209, 220, - 146, 5, 227, 135, 209, 209, 25, 5, 75, 209, 209, 25, 5, 245, 196, 209, - 209, 25, 5, 76, 209, 209, 25, 5, 253, 168, 209, 209, 25, 5, 254, 202, - 209, 209, 234, 30, 233, 136, 209, 209, 138, 231, 205, 245, 181, 209, 209, - 138, 231, 205, 216, 157, 209, 209, 138, 231, 205, 216, 118, 209, 209, - 138, 231, 205, 250, 224, 209, 209, 251, 5, 78, 209, 209, 228, 215, 209, - 209, 21, 210, 86, 209, 209, 21, 110, 209, 209, 21, 105, 209, 209, 21, - 158, 209, 209, 21, 161, 209, 209, 21, 189, 209, 209, 21, 194, 209, 209, - 21, 198, 209, 209, 21, 195, 209, 209, 21, 200, 209, 209, 241, 70, 228, - 75, 209, 209, 241, 70, 230, 162, 209, 209, 1, 234, 108, 242, 175, 209, - 209, 1, 234, 108, 227, 135, 63, 3, 226, 205, 63, 164, 242, 116, 211, 0, - 230, 249, 215, 190, 61, 63, 164, 242, 116, 211, 0, 230, 249, 255, 160, - 222, 217, 252, 78, 185, 63, 164, 242, 116, 211, 0, 230, 249, 255, 160, - 242, 116, 215, 174, 185, 63, 164, 65, 211, 0, 230, 249, 231, 94, 185, 63, - 164, 249, 253, 211, 0, 230, 249, 220, 110, 185, 63, 164, 250, 240, 211, - 0, 230, 249, 225, 113, 220, 97, 185, 63, 164, 211, 0, 230, 249, 215, 174, - 220, 97, 185, 63, 164, 221, 209, 220, 96, 63, 164, 251, 129, 211, 0, 230, - 248, 63, 164, 251, 224, 220, 4, 211, 0, 230, 248, 63, 164, 235, 198, 215, - 173, 63, 164, 248, 62, 215, 174, 251, 128, 63, 164, 220, 96, 63, 164, - 227, 140, 220, 96, 63, 164, 215, 174, 220, 96, 63, 164, 227, 140, 215, - 174, 220, 96, 63, 164, 222, 237, 250, 123, 218, 237, 220, 96, 63, 164, - 223, 43, 242, 147, 220, 96, 63, 164, 250, 240, 255, 164, 222, 145, 231, - 93, 199, 251, 8, 63, 164, 242, 116, 215, 173, 63, 232, 145, 5, 250, 156, - 222, 144, 63, 232, 145, 5, 232, 253, 222, 144, 63, 253, 213, 5, 220, 106, - 243, 66, 255, 165, 222, 144, 63, 253, 213, 5, 255, 162, 190, 63, 253, - 213, 5, 221, 183, 215, 169, 63, 5, 223, 131, 247, 160, 243, 65, 63, 5, - 223, 131, 247, 160, 242, 177, 63, 5, 223, 131, 247, 160, 242, 117, 63, 5, - 223, 131, 229, 220, 243, 65, 63, 5, 223, 131, 229, 220, 242, 177, 63, 5, - 223, 131, 247, 160, 223, 131, 229, 219, 63, 21, 210, 86, 63, 21, 110, 63, - 21, 105, 63, 21, 158, 63, 21, 161, 63, 21, 189, 63, 21, 194, 63, 21, 198, - 63, 21, 195, 63, 21, 200, 63, 21, 163, 110, 63, 21, 163, 105, 63, 21, - 163, 158, 63, 21, 163, 161, 63, 21, 163, 189, 63, 21, 163, 194, 63, 21, - 163, 198, 63, 21, 163, 195, 63, 21, 163, 200, 63, 21, 163, 210, 86, 63, - 164, 251, 131, 222, 144, 63, 164, 229, 69, 251, 69, 227, 150, 210, 25, - 63, 164, 250, 240, 255, 164, 222, 145, 251, 70, 230, 203, 251, 8, 63, - 164, 229, 69, 251, 69, 220, 107, 222, 144, 63, 164, 250, 133, 230, 248, - 63, 164, 215, 185, 255, 161, 63, 164, 242, 101, 222, 145, 242, 64, 63, - 164, 242, 101, 222, 145, 242, 70, 63, 164, 254, 117, 234, 124, 242, 64, - 63, 164, 254, 117, 234, 124, 242, 70, 63, 5, 211, 65, 215, 172, 63, 5, - 231, 168, 215, 172, 63, 1, 176, 63, 1, 234, 133, 63, 1, 243, 136, 63, 1, - 242, 250, 63, 1, 229, 78, 63, 1, 251, 34, 63, 1, 250, 158, 63, 1, 235, - 142, 63, 1, 227, 166, 63, 1, 215, 157, 63, 1, 215, 145, 63, 1, 248, 136, - 63, 1, 248, 120, 63, 1, 228, 111, 63, 1, 217, 106, 63, 1, 216, 209, 63, - 1, 248, 222, 63, 1, 248, 26, 63, 1, 197, 63, 1, 190, 63, 1, 225, 148, 63, - 1, 252, 192, 63, 1, 252, 19, 63, 1, 185, 63, 1, 215, 184, 63, 1, 215, - 176, 63, 1, 246, 39, 63, 1, 246, 34, 63, 1, 212, 65, 63, 1, 210, 82, 63, - 1, 210, 116, 63, 1, 255, 167, 63, 1, 191, 63, 1, 205, 63, 1, 233, 136, - 63, 1, 220, 103, 63, 1, 218, 224, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63, - 1, 233, 232, 63, 1, 244, 78, 205, 63, 1, 234, 47, 63, 1, 222, 180, 63, - 25, 5, 255, 74, 63, 25, 5, 73, 63, 25, 5, 236, 34, 63, 25, 5, 70, 63, 25, - 5, 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 181, 63, 25, 5, - 149, 156, 63, 25, 5, 149, 232, 186, 63, 25, 5, 75, 63, 25, 5, 245, 210, - 63, 25, 5, 76, 63, 25, 5, 226, 184, 63, 5, 222, 222, 218, 85, 229, 79, - 222, 212, 63, 5, 222, 217, 252, 77, 63, 25, 5, 223, 50, 73, 63, 25, 5, - 223, 50, 236, 34, 63, 5, 227, 150, 210, 26, 229, 227, 248, 222, 63, 5, - 219, 72, 233, 61, 63, 164, 242, 30, 63, 164, 226, 58, 63, 5, 233, 64, - 222, 144, 63, 5, 211, 70, 222, 144, 63, 5, 233, 65, 215, 185, 251, 8, 63, - 5, 231, 96, 251, 8, 63, 5, 242, 120, 251, 9, 223, 41, 63, 5, 242, 120, - 231, 86, 223, 41, 63, 5, 235, 194, 231, 96, 251, 8, 63, 218, 74, 5, 233, - 65, 215, 185, 251, 8, 63, 218, 74, 5, 231, 96, 251, 8, 63, 218, 74, 5, - 235, 194, 231, 96, 251, 8, 63, 218, 74, 1, 176, 63, 218, 74, 1, 234, 133, - 63, 218, 74, 1, 243, 136, 63, 218, 74, 1, 242, 250, 63, 218, 74, 1, 229, - 78, 63, 218, 74, 1, 251, 34, 63, 218, 74, 1, 250, 158, 63, 218, 74, 1, - 235, 142, 63, 218, 74, 1, 227, 166, 63, 218, 74, 1, 215, 157, 63, 218, - 74, 1, 215, 145, 63, 218, 74, 1, 248, 136, 63, 218, 74, 1, 248, 120, 63, - 218, 74, 1, 228, 111, 63, 218, 74, 1, 217, 106, 63, 218, 74, 1, 216, 209, - 63, 218, 74, 1, 248, 222, 63, 218, 74, 1, 248, 26, 63, 218, 74, 1, 197, - 63, 218, 74, 1, 190, 63, 218, 74, 1, 225, 148, 63, 218, 74, 1, 252, 192, - 63, 218, 74, 1, 252, 19, 63, 218, 74, 1, 185, 63, 218, 74, 1, 215, 184, - 63, 218, 74, 1, 215, 176, 63, 218, 74, 1, 246, 39, 63, 218, 74, 1, 246, - 34, 63, 218, 74, 1, 212, 65, 63, 218, 74, 1, 210, 82, 63, 218, 74, 1, - 210, 116, 63, 218, 74, 1, 255, 167, 63, 218, 74, 1, 191, 63, 218, 74, 1, - 205, 63, 218, 74, 1, 233, 136, 63, 218, 74, 1, 220, 103, 63, 218, 74, 1, - 218, 224, 63, 218, 74, 1, 206, 63, 218, 74, 1, 162, 63, 218, 74, 1, 61, - 63, 218, 74, 1, 233, 232, 63, 218, 74, 1, 244, 78, 212, 65, 63, 218, 74, - 1, 244, 78, 191, 63, 218, 74, 1, 244, 78, 205, 63, 233, 219, 222, 142, - 234, 133, 63, 233, 219, 222, 142, 234, 134, 251, 70, 230, 203, 251, 8, - 63, 250, 253, 5, 114, 252, 71, 63, 250, 253, 5, 192, 252, 71, 63, 250, - 253, 5, 250, 254, 217, 21, 63, 250, 253, 5, 221, 208, 255, 166, 63, 16, - 246, 92, 251, 126, 63, 16, 223, 130, 222, 223, 63, 16, 226, 78, 243, 64, - 63, 16, 223, 130, 222, 224, 223, 43, 242, 146, 63, 16, 225, 113, 190, 63, - 16, 228, 60, 251, 126, 63, 16, 228, 60, 251, 127, 227, 140, 255, 163, 63, - 16, 228, 60, 251, 127, 242, 118, 255, 163, 63, 16, 228, 60, 251, 127, - 251, 70, 255, 163, 63, 5, 223, 131, 229, 220, 223, 131, 247, 159, 63, 5, - 223, 131, 229, 220, 242, 117, 63, 164, 251, 130, 220, 4, 242, 216, 230, - 249, 223, 42, 63, 164, 230, 164, 211, 0, 242, 216, 230, 249, 223, 42, 63, - 164, 227, 140, 215, 173, 63, 164, 65, 251, 153, 222, 214, 211, 0, 230, - 249, 231, 94, 185, 63, 164, 249, 253, 251, 153, 222, 214, 211, 0, 230, - 249, 220, 110, 185, 222, 251, 218, 0, 50, 233, 46, 218, 0, 50, 222, 251, - 218, 0, 5, 2, 247, 119, 233, 46, 218, 0, 5, 2, 247, 119, 63, 164, 233, - 56, 231, 97, 222, 144, 63, 164, 215, 251, 231, 97, 222, 144, 68, 1, 176, - 68, 1, 234, 133, 68, 1, 243, 136, 68, 1, 242, 250, 68, 1, 229, 78, 68, 1, - 251, 34, 68, 1, 250, 158, 68, 1, 235, 142, 68, 1, 235, 115, 68, 1, 227, - 166, 68, 1, 228, 77, 68, 1, 215, 157, 68, 1, 215, 145, 68, 1, 248, 136, - 68, 1, 248, 120, 68, 1, 228, 111, 68, 1, 217, 106, 68, 1, 216, 209, 68, - 1, 248, 222, 68, 1, 248, 26, 68, 1, 197, 68, 1, 190, 68, 1, 225, 148, 68, - 1, 252, 192, 68, 1, 252, 19, 68, 1, 185, 68, 1, 191, 68, 1, 205, 68, 1, - 233, 136, 68, 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1, 232, 185, 68, 1, - 61, 68, 1, 220, 87, 61, 68, 1, 73, 68, 1, 236, 34, 68, 1, 70, 68, 1, 214, - 118, 68, 1, 75, 68, 1, 230, 152, 75, 68, 1, 76, 68, 1, 253, 193, 68, 25, - 5, 217, 65, 255, 74, 68, 25, 5, 255, 74, 68, 25, 5, 73, 68, 25, 5, 236, - 34, 68, 25, 5, 70, 68, 25, 5, 214, 118, 68, 25, 5, 75, 68, 25, 5, 254, - 202, 68, 25, 5, 230, 152, 236, 34, 68, 25, 5, 230, 152, 76, 68, 25, 5, - 160, 48, 68, 5, 254, 76, 68, 5, 59, 51, 68, 5, 213, 147, 68, 5, 213, 152, - 68, 5, 253, 236, 68, 116, 5, 147, 191, 68, 116, 5, 147, 205, 68, 116, 5, - 147, 212, 65, 68, 116, 5, 147, 162, 68, 1, 242, 133, 206, 68, 21, 210, - 86, 68, 21, 110, 68, 21, 105, 68, 21, 158, 68, 21, 161, 68, 21, 189, 68, - 21, 194, 68, 21, 198, 68, 21, 195, 68, 21, 200, 68, 5, 232, 193, 221, - 173, 68, 5, 221, 173, 68, 16, 232, 154, 68, 16, 249, 214, 68, 16, 254, - 221, 68, 16, 243, 49, 68, 1, 220, 103, 68, 1, 218, 224, 68, 1, 149, 153, - 68, 1, 149, 222, 181, 68, 1, 149, 156, 68, 1, 149, 232, 186, 68, 25, 5, - 149, 153, 68, 25, 5, 149, 222, 181, 68, 25, 5, 149, 156, 68, 25, 5, 149, - 232, 186, 68, 1, 230, 152, 229, 78, 68, 1, 230, 152, 235, 115, 68, 1, - 230, 152, 252, 112, 68, 1, 230, 152, 252, 107, 68, 116, 5, 230, 152, 147, - 197, 68, 116, 5, 230, 152, 147, 185, 68, 116, 5, 230, 152, 147, 233, 136, - 68, 1, 220, 109, 234, 214, 220, 103, 68, 25, 5, 220, 109, 234, 214, 245, - 56, 68, 138, 164, 220, 109, 234, 214, 241, 248, 68, 138, 164, 220, 109, - 234, 214, 234, 184, 225, 122, 68, 1, 212, 7, 224, 109, 234, 214, 216, - 209, 68, 1, 212, 7, 224, 109, 234, 214, 224, 115, 68, 25, 5, 212, 7, 224, - 109, 234, 214, 245, 56, 68, 25, 5, 212, 7, 224, 109, 234, 214, 214, 214, - 68, 5, 212, 7, 224, 109, 234, 214, 216, 30, 68, 5, 212, 7, 224, 109, 234, - 214, 216, 29, 68, 5, 212, 7, 224, 109, 234, 214, 216, 28, 68, 5, 212, 7, - 224, 109, 234, 214, 216, 27, 68, 5, 212, 7, 224, 109, 234, 214, 216, 26, - 68, 1, 245, 220, 224, 109, 234, 214, 228, 111, 68, 1, 245, 220, 224, 109, - 234, 214, 210, 176, 68, 1, 245, 220, 224, 109, 234, 214, 242, 218, 68, - 25, 5, 243, 60, 234, 214, 73, 68, 25, 5, 234, 189, 226, 235, 68, 25, 5, - 234, 189, 70, 68, 25, 5, 234, 189, 245, 210, 68, 1, 220, 87, 176, 68, 1, - 220, 87, 234, 133, 68, 1, 220, 87, 243, 136, 68, 1, 220, 87, 251, 34, 68, - 1, 220, 87, 210, 116, 68, 1, 220, 87, 227, 166, 68, 1, 220, 87, 248, 222, - 68, 1, 220, 87, 197, 68, 1, 220, 87, 225, 148, 68, 1, 220, 87, 244, 197, - 68, 1, 220, 87, 252, 192, 68, 1, 220, 87, 216, 209, 68, 1, 220, 87, 162, - 68, 116, 5, 220, 87, 147, 212, 65, 68, 25, 5, 220, 87, 255, 74, 68, 25, - 5, 220, 87, 75, 68, 25, 5, 220, 87, 160, 48, 68, 25, 5, 220, 87, 40, 211, - 117, 68, 5, 220, 87, 216, 29, 68, 5, 220, 87, 216, 28, 68, 5, 220, 87, - 216, 26, 68, 5, 220, 87, 216, 25, 68, 5, 220, 87, 249, 153, 216, 29, 68, - 5, 220, 87, 249, 153, 216, 28, 68, 5, 220, 87, 249, 153, 245, 154, 216, - 31, 68, 1, 222, 129, 226, 64, 244, 197, 68, 5, 222, 129, 226, 64, 216, - 26, 68, 220, 87, 21, 210, 86, 68, 220, 87, 21, 110, 68, 220, 87, 21, 105, - 68, 220, 87, 21, 158, 68, 220, 87, 21, 161, 68, 220, 87, 21, 189, 68, - 220, 87, 21, 194, 68, 220, 87, 21, 198, 68, 220, 87, 21, 195, 68, 220, - 87, 21, 200, 68, 5, 234, 127, 216, 30, 68, 5, 234, 127, 216, 28, 68, 25, - 5, 254, 191, 61, 68, 25, 5, 254, 191, 254, 202, 68, 16, 220, 87, 110, 68, - 16, 220, 87, 245, 31, 98, 6, 1, 254, 124, 98, 6, 1, 252, 153, 98, 6, 1, - 243, 107, 98, 6, 1, 247, 129, 98, 6, 1, 245, 151, 98, 6, 1, 213, 160, 98, - 6, 1, 210, 89, 98, 6, 1, 217, 61, 98, 6, 1, 236, 0, 98, 6, 1, 234, 235, - 98, 6, 1, 233, 82, 98, 6, 1, 231, 186, 98, 6, 1, 229, 196, 98, 6, 1, 226, - 197, 98, 6, 1, 226, 18, 98, 6, 1, 210, 78, 98, 6, 1, 223, 172, 98, 6, 1, - 221, 244, 98, 6, 1, 217, 51, 98, 6, 1, 214, 190, 98, 6, 1, 225, 141, 98, - 6, 1, 234, 122, 98, 6, 1, 242, 242, 98, 6, 1, 224, 74, 98, 6, 1, 220, 21, - 98, 6, 1, 250, 98, 98, 6, 1, 251, 8, 98, 6, 1, 235, 101, 98, 6, 1, 250, - 41, 98, 6, 1, 250, 144, 98, 6, 1, 211, 163, 98, 6, 1, 235, 112, 98, 6, 1, - 242, 44, 98, 6, 1, 241, 239, 98, 6, 1, 241, 176, 98, 6, 1, 212, 22, 98, - 6, 1, 242, 5, 98, 6, 1, 241, 66, 98, 6, 1, 210, 246, 98, 6, 1, 254, 233, - 98, 1, 254, 124, 98, 1, 252, 153, 98, 1, 243, 107, 98, 1, 247, 129, 98, - 1, 245, 151, 98, 1, 213, 160, 98, 1, 210, 89, 98, 1, 217, 61, 98, 1, 236, - 0, 98, 1, 234, 235, 98, 1, 233, 82, 98, 1, 231, 186, 98, 1, 229, 196, 98, - 1, 226, 197, 98, 1, 226, 18, 98, 1, 210, 78, 98, 1, 223, 172, 98, 1, 221, - 244, 98, 1, 217, 51, 98, 1, 214, 190, 98, 1, 225, 141, 98, 1, 234, 122, - 98, 1, 242, 242, 98, 1, 224, 74, 98, 1, 220, 21, 98, 1, 250, 98, 98, 1, - 251, 8, 98, 1, 235, 101, 98, 1, 250, 41, 98, 1, 250, 144, 98, 1, 211, - 163, 98, 1, 235, 112, 98, 1, 242, 44, 98, 1, 241, 239, 98, 1, 241, 176, - 98, 1, 212, 22, 98, 1, 242, 5, 98, 1, 241, 66, 98, 1, 244, 122, 98, 1, - 210, 246, 98, 1, 245, 166, 98, 1, 215, 94, 243, 107, 98, 1, 254, 197, 98, - 226, 16, 220, 138, 58, 1, 98, 229, 196, 98, 1, 254, 233, 98, 1, 242, 4, - 50, 98, 1, 233, 128, 50, 24, 100, 234, 59, 24, 100, 218, 216, 24, 100, - 228, 227, 24, 100, 216, 102, 24, 100, 218, 205, 24, 100, 223, 27, 24, - 100, 230, 218, 24, 100, 225, 96, 24, 100, 218, 213, 24, 100, 219, 149, - 24, 100, 218, 210, 24, 100, 236, 57, 24, 100, 250, 47, 24, 100, 218, 220, - 24, 100, 250, 107, 24, 100, 234, 111, 24, 100, 216, 174, 24, 100, 225, - 132, 24, 100, 241, 173, 24, 100, 228, 223, 24, 100, 218, 214, 24, 100, - 228, 217, 24, 100, 228, 221, 24, 100, 216, 99, 24, 100, 223, 15, 24, 100, - 218, 212, 24, 100, 223, 25, 24, 100, 234, 219, 24, 100, 230, 211, 24, - 100, 234, 222, 24, 100, 225, 91, 24, 100, 225, 89, 24, 100, 225, 77, 24, - 100, 225, 85, 24, 100, 225, 83, 24, 100, 225, 80, 24, 100, 225, 82, 24, - 100, 225, 79, 24, 100, 225, 84, 24, 100, 225, 94, 24, 100, 225, 95, 24, - 100, 225, 78, 24, 100, 225, 88, 24, 100, 234, 220, 24, 100, 234, 218, 24, - 100, 219, 142, 24, 100, 219, 140, 24, 100, 219, 132, 24, 100, 219, 135, - 24, 100, 219, 141, 24, 100, 219, 137, 24, 100, 219, 136, 24, 100, 219, - 134, 24, 100, 219, 145, 24, 100, 219, 147, 24, 100, 219, 148, 24, 100, - 219, 143, 24, 100, 219, 133, 24, 100, 219, 138, 24, 100, 219, 146, 24, - 100, 250, 91, 24, 100, 250, 89, 24, 100, 250, 169, 24, 100, 250, 167, 24, - 100, 226, 33, 24, 100, 236, 52, 24, 100, 236, 43, 24, 100, 236, 51, 24, - 100, 236, 48, 24, 100, 236, 46, 24, 100, 236, 50, 24, 100, 218, 217, 24, - 100, 236, 55, 24, 100, 236, 56, 24, 100, 236, 44, 24, 100, 236, 49, 24, - 100, 211, 26, 24, 100, 250, 46, 24, 100, 250, 92, 24, 100, 250, 90, 24, - 100, 250, 170, 24, 100, 250, 168, 24, 100, 250, 105, 24, 100, 250, 106, - 24, 100, 250, 93, 24, 100, 250, 171, 24, 100, 225, 130, 24, 100, 234, - 221, 24, 100, 218, 218, 24, 100, 211, 32, 24, 100, 234, 50, 24, 100, 228, - 219, 24, 100, 228, 225, 24, 100, 228, 224, 24, 100, 216, 96, 24, 100, - 244, 104, 24, 143, 244, 104, 24, 143, 61, 24, 143, 254, 244, 24, 143, - 191, 24, 143, 211, 92, 24, 143, 245, 118, 24, 143, 75, 24, 143, 211, 36, - 24, 143, 211, 47, 24, 143, 76, 24, 143, 212, 65, 24, 143, 212, 62, 24, - 143, 226, 235, 24, 143, 210, 244, 24, 143, 70, 24, 143, 212, 11, 24, 143, - 212, 22, 24, 143, 211, 250, 24, 143, 210, 212, 24, 143, 245, 56, 24, 143, - 211, 8, 24, 143, 73, 24, 143, 255, 158, 24, 143, 255, 157, 24, 143, 211, - 106, 24, 143, 211, 104, 24, 143, 245, 116, 24, 143, 245, 115, 24, 143, - 245, 117, 24, 143, 211, 35, 24, 143, 211, 34, 24, 143, 227, 85, 24, 143, - 227, 86, 24, 143, 227, 79, 24, 143, 227, 84, 24, 143, 227, 82, 24, 143, + 211, 117, 7, 1, 4, 6, 211, 117, 7, 4, 1, 210, 160, 2, 223, 58, 103, 7, 4, + 1, 210, 160, 2, 249, 108, 7, 4, 1, 245, 16, 7, 4, 1, 245, 17, 2, 249, + 108, 7, 1, 242, 187, 218, 131, 7, 1, 225, 142, 213, 135, 244, 1, 7, 1, + 235, 200, 242, 187, 218, 131, 7, 1, 218, 112, 251, 74, 7, 1, 251, 254, + 250, 19, 7, 1, 4, 6, 253, 166, 7, 4, 1, 250, 8, 204, 76, 7, 1, 4, 6, 243, + 210, 2, 103, 7, 1, 4, 6, 242, 67, 7, 4, 1, 235, 151, 2, 249, 135, 7, 4, + 1, 215, 94, 235, 29, 7, 1, 4, 6, 156, 7, 4, 1, 224, 100, 2, 103, 7, 1, + 242, 187, 218, 132, 2, 91, 7, 1, 223, 52, 242, 187, 218, 132, 2, 91, 7, + 4, 1, 246, 48, 247, 228, 7, 4, 1, 248, 34, 247, 228, 7, 4, 1, 246, 48, + 247, 229, 2, 249, 108, 7, 4, 1, 215, 186, 247, 228, 7, 4, 1, 216, 236, + 247, 228, 7, 4, 1, 217, 30, 247, 229, 2, 249, 108, 7, 4, 1, 244, 142, + 247, 228, 7, 4, 1, 232, 105, 247, 228, 7, 4, 1, 232, 56, 247, 228, 7, 1, + 251, 254, 225, 184, 7, 1, 252, 6, 225, 184, 7, 4, 1, 215, 94, 242, 68, 2, + 244, 95, 7, 4, 1, 215, 94, 242, 68, 2, 244, 96, 22, 217, 78, 58, 1, 4, + 242, 67, 58, 1, 4, 242, 68, 2, 103, 58, 1, 4, 235, 150, 58, 1, 4, 153, + 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223, 227, 2, 103, 58, 1, 4, 6, + 235, 200, 153, 58, 1, 4, 212, 98, 58, 1, 4, 211, 117, 58, 1, 224, 193, + 58, 1, 52, 224, 193, 58, 1, 215, 94, 249, 227, 58, 1, 254, 65, 58, 1, + 223, 52, 249, 227, 58, 1, 44, 163, 222, 236, 58, 1, 43, 163, 222, 236, + 58, 1, 242, 187, 218, 131, 58, 1, 223, 52, 242, 187, 218, 131, 58, 1, 43, + 254, 1, 58, 1, 44, 254, 1, 58, 1, 120, 254, 1, 58, 1, 124, 254, 1, 58, 1, + 250, 39, 255, 23, 250, 242, 58, 1, 67, 232, 219, 58, 1, 231, 237, 58, 1, + 255, 12, 255, 23, 58, 1, 242, 144, 255, 23, 58, 1, 121, 67, 232, 219, 58, + 1, 121, 231, 237, 58, 1, 121, 242, 144, 255, 23, 58, 1, 121, 255, 12, + 255, 23, 58, 1, 215, 223, 249, 234, 58, 1, 163, 215, 223, 249, 234, 58, + 1, 250, 181, 44, 163, 222, 236, 58, 1, 250, 181, 43, 163, 222, 236, 58, + 1, 120, 217, 88, 58, 1, 124, 217, 88, 58, 1, 96, 50, 58, 1, 230, 187, 50, + 251, 154, 59, 48, 222, 237, 48, 226, 228, 4, 184, 52, 255, 12, 255, 23, + 58, 1, 223, 39, 103, 58, 1, 249, 139, 255, 23, 58, 1, 4, 243, 114, 58, 1, + 4, 156, 58, 1, 4, 222, 93, 58, 1, 4, 211, 178, 58, 1, 4, 223, 52, 242, + 187, 218, 131, 58, 1, 245, 28, 138, 130, 58, 1, 125, 138, 130, 58, 1, + 230, 230, 138, 130, 58, 1, 121, 138, 130, 58, 1, 245, 27, 138, 130, 58, + 1, 210, 254, 248, 52, 138, 79, 58, 1, 211, 70, 248, 52, 138, 79, 58, 1, + 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 65, 58, 1, 121, 124, 254, 1, + 58, 1, 121, 120, 254, 1, 58, 1, 121, 43, 254, 1, 58, 1, 121, 44, 254, 1, + 58, 1, 121, 222, 236, 58, 1, 230, 229, 242, 144, 255, 23, 58, 1, 230, + 229, 52, 242, 144, 255, 23, 58, 1, 230, 229, 52, 255, 12, 255, 23, 58, 1, + 121, 184, 58, 1, 223, 160, 249, 234, 58, 1, 252, 66, 125, 216, 31, 58, 1, + 245, 151, 125, 216, 31, 58, 1, 252, 66, 121, 216, 31, 58, 1, 245, 151, + 121, 216, 31, 58, 1, 220, 56, 58, 1, 204, 220, 56, 58, 1, 121, 43, 75, + 38, 242, 144, 255, 23, 38, 255, 12, 255, 23, 38, 250, 39, 255, 23, 38, + 184, 38, 231, 237, 38, 226, 123, 38, 251, 154, 38, 59, 48, 38, 248, 9, + 38, 241, 59, 48, 38, 222, 237, 48, 38, 52, 255, 12, 255, 23, 38, 250, + 242, 38, 67, 232, 220, 48, 38, 52, 67, 232, 220, 48, 38, 52, 242, 144, + 255, 23, 38, 251, 7, 38, 235, 200, 251, 154, 38, 215, 94, 249, 228, 48, + 38, 249, 228, 48, 38, 223, 52, 249, 228, 48, 38, 249, 228, 72, 222, 254, + 38, 242, 144, 255, 24, 51, 38, 255, 12, 255, 24, 51, 38, 43, 217, 89, 51, + 38, 44, 217, 89, 51, 38, 43, 254, 118, 48, 38, 240, 255, 38, 43, 163, + 222, 237, 51, 38, 120, 217, 89, 51, 38, 124, 217, 89, 51, 38, 96, 5, 51, + 38, 230, 187, 5, 51, 38, 226, 68, 241, 59, 51, 38, 223, 58, 241, 59, 51, + 38, 59, 51, 38, 248, 10, 51, 38, 222, 237, 51, 38, 249, 228, 51, 38, 250, + 191, 38, 226, 228, 38, 67, 232, 220, 51, 38, 251, 148, 51, 38, 235, 200, + 52, 254, 32, 51, 38, 250, 243, 51, 38, 250, 39, 255, 24, 51, 38, 251, + 155, 51, 38, 235, 200, 251, 155, 51, 38, 216, 90, 51, 38, 231, 238, 51, + 38, 121, 232, 219, 38, 52, 121, 232, 219, 38, 216, 90, 226, 124, 38, 219, + 253, 218, 105, 226, 124, 38, 200, 218, 105, 226, 124, 38, 219, 253, 219, + 49, 226, 124, 38, 200, 219, 49, 226, 124, 38, 44, 163, 222, 237, 51, 38, + 235, 200, 251, 148, 51, 38, 42, 51, 38, 221, 182, 51, 38, 211, 179, 48, + 38, 67, 184, 38, 52, 226, 123, 38, 242, 144, 138, 79, 38, 255, 12, 138, + 79, 38, 26, 225, 178, 38, 26, 234, 8, 38, 26, 248, 4, 216, 19, 38, 26, + 210, 219, 38, 251, 148, 48, 38, 245, 106, 5, 51, 38, 52, 67, 232, 220, + 51, 38, 43, 254, 118, 51, 38, 228, 57, 216, 90, 48, 38, 241, 65, 48, 38, + 254, 156, 128, 216, 43, 48, 38, 43, 44, 80, 51, 38, 214, 153, 80, 51, 38, + 242, 149, 235, 69, 38, 44, 254, 2, 48, 38, 43, 163, 222, 237, 48, 38, + 244, 139, 38, 211, 179, 51, 38, 43, 254, 2, 51, 38, 44, 254, 2, 51, 38, + 44, 254, 2, 22, 120, 254, 2, 51, 38, 44, 163, 222, 237, 48, 38, 59, 72, + 222, 254, 38, 253, 225, 51, 38, 52, 222, 237, 51, 38, 210, 35, 48, 38, + 52, 251, 155, 51, 38, 52, 251, 154, 38, 52, 231, 237, 38, 52, 231, 238, + 51, 38, 52, 184, 38, 52, 235, 200, 251, 154, 38, 52, 97, 80, 51, 38, 7, + 4, 1, 61, 38, 7, 4, 1, 76, 38, 7, 4, 1, 74, 38, 7, 4, 1, 78, 38, 7, 4, 1, + 69, 38, 7, 4, 1, 251, 74, 38, 7, 4, 1, 249, 68, 38, 7, 4, 1, 242, 67, 38, + 7, 4, 1, 194, 38, 7, 4, 1, 153, 38, 7, 4, 1, 217, 153, 38, 7, 4, 1, 214, + 105, 38, 7, 4, 1, 211, 178, 26, 6, 1, 241, 203, 26, 4, 1, 241, 203, 26, + 6, 1, 254, 31, 221, 248, 26, 4, 1, 254, 31, 221, 248, 26, 227, 202, 50, + 26, 232, 114, 227, 202, 50, 26, 6, 1, 226, 55, 247, 235, 26, 4, 1, 226, + 55, 247, 235, 26, 210, 219, 26, 4, 223, 52, 232, 88, 219, 180, 87, 26, 4, + 246, 126, 232, 88, 219, 180, 87, 26, 4, 223, 52, 246, 126, 232, 88, 219, + 180, 87, 26, 224, 16, 79, 26, 216, 19, 26, 248, 4, 216, 19, 26, 6, 1, + 254, 152, 2, 216, 19, 26, 254, 105, 217, 3, 26, 6, 1, 245, 109, 2, 216, + 19, 26, 6, 1, 245, 72, 2, 216, 19, 26, 6, 1, 235, 193, 2, 216, 19, 26, 6, + 1, 226, 204, 2, 216, 19, 26, 6, 1, 214, 158, 2, 216, 19, 26, 6, 1, 226, + 206, 2, 216, 19, 26, 4, 1, 235, 193, 2, 248, 4, 22, 216, 19, 26, 6, 1, + 254, 151, 26, 6, 1, 252, 34, 26, 6, 1, 243, 114, 26, 6, 1, 248, 62, 26, + 6, 1, 245, 108, 26, 6, 1, 210, 85, 26, 6, 1, 245, 71, 26, 6, 1, 216, 180, + 26, 6, 1, 235, 192, 26, 6, 1, 234, 228, 26, 6, 1, 233, 104, 26, 6, 1, + 230, 107, 26, 6, 1, 227, 242, 26, 6, 1, 211, 157, 26, 6, 1, 226, 203, 26, + 6, 1, 225, 111, 26, 6, 1, 223, 40, 26, 6, 1, 219, 179, 26, 6, 1, 217, 42, + 26, 6, 1, 214, 157, 26, 6, 1, 225, 136, 26, 6, 1, 250, 118, 26, 6, 1, + 224, 164, 26, 6, 1, 226, 205, 26, 6, 1, 235, 193, 2, 248, 3, 26, 6, 1, + 214, 158, 2, 248, 3, 26, 4, 1, 254, 152, 2, 216, 19, 26, 4, 1, 245, 109, + 2, 216, 19, 26, 4, 1, 245, 72, 2, 216, 19, 26, 4, 1, 235, 193, 2, 216, + 19, 26, 4, 1, 214, 158, 2, 248, 4, 22, 216, 19, 26, 4, 1, 254, 151, 26, + 4, 1, 252, 34, 26, 4, 1, 243, 114, 26, 4, 1, 248, 62, 26, 4, 1, 245, 108, + 26, 4, 1, 210, 85, 26, 4, 1, 245, 71, 26, 4, 1, 216, 180, 26, 4, 1, 235, + 192, 26, 4, 1, 234, 228, 26, 4, 1, 233, 104, 26, 4, 1, 230, 107, 26, 4, + 1, 227, 242, 26, 4, 1, 211, 157, 26, 4, 1, 226, 203, 26, 4, 1, 225, 111, + 26, 4, 1, 223, 40, 26, 4, 1, 40, 219, 179, 26, 4, 1, 219, 179, 26, 4, 1, + 217, 42, 26, 4, 1, 214, 157, 26, 4, 1, 225, 136, 26, 4, 1, 250, 118, 26, + 4, 1, 224, 164, 26, 4, 1, 226, 205, 26, 4, 1, 235, 193, 2, 248, 3, 26, 4, + 1, 214, 158, 2, 248, 3, 26, 4, 1, 226, 204, 2, 216, 19, 26, 4, 1, 214, + 158, 2, 216, 19, 26, 4, 1, 226, 206, 2, 216, 19, 26, 6, 234, 253, 87, 26, + 252, 35, 87, 26, 216, 181, 87, 26, 214, 158, 2, 241, 59, 87, 26, 214, + 158, 2, 255, 12, 22, 241, 59, 87, 26, 214, 158, 2, 248, 10, 22, 241, 59, + 87, 26, 225, 137, 87, 26, 225, 112, 87, 26, 234, 253, 87, 26, 1, 254, 31, + 234, 12, 26, 4, 1, 254, 31, 234, 12, 26, 1, 218, 139, 26, 4, 1, 218, 139, + 26, 1, 247, 235, 26, 4, 1, 247, 235, 26, 1, 234, 12, 26, 4, 1, 234, 12, + 26, 1, 221, 248, 26, 4, 1, 221, 248, 81, 6, 1, 220, 57, 81, 4, 1, 220, + 57, 81, 6, 1, 244, 148, 81, 4, 1, 244, 148, 81, 6, 1, 234, 123, 81, 4, 1, + 234, 123, 81, 6, 1, 241, 52, 81, 4, 1, 241, 52, 81, 6, 1, 243, 109, 81, + 4, 1, 243, 109, 81, 6, 1, 220, 24, 81, 4, 1, 220, 24, 81, 6, 1, 248, 77, + 81, 4, 1, 248, 77, 26, 234, 229, 87, 26, 223, 41, 87, 26, 232, 88, 219, + 180, 87, 26, 1, 210, 224, 26, 6, 216, 181, 87, 26, 232, 88, 245, 109, 87, + 26, 223, 52, 232, 88, 245, 109, 87, 26, 6, 1, 220, 9, 26, 4, 1, 220, 9, + 26, 6, 232, 88, 219, 180, 87, 26, 6, 1, 221, 245, 26, 4, 1, 221, 245, 26, + 223, 41, 2, 218, 105, 87, 26, 6, 223, 52, 232, 88, 219, 180, 87, 26, 6, + 246, 126, 232, 88, 219, 180, 87, 26, 6, 223, 52, 246, 126, 232, 88, 219, + 180, 87, 33, 6, 1, 236, 68, 2, 242, 143, 33, 6, 1, 235, 196, 33, 6, 1, + 247, 170, 33, 6, 1, 242, 194, 33, 6, 1, 214, 202, 236, 67, 33, 6, 1, 246, + 44, 33, 6, 1, 251, 84, 74, 33, 6, 1, 211, 8, 33, 6, 1, 235, 132, 33, 6, + 1, 232, 193, 33, 6, 1, 228, 183, 33, 6, 1, 215, 175, 33, 6, 1, 234, 54, + 33, 6, 1, 240, 161, 2, 242, 143, 33, 6, 1, 219, 253, 69, 33, 6, 1, 246, + 40, 33, 6, 1, 61, 33, 6, 1, 252, 83, 33, 6, 1, 213, 255, 33, 6, 1, 242, + 243, 33, 6, 1, 248, 98, 33, 6, 1, 236, 67, 33, 6, 1, 210, 74, 33, 6, 1, + 210, 94, 33, 6, 1, 74, 33, 6, 1, 219, 253, 74, 33, 6, 1, 176, 33, 6, 1, + 245, 182, 33, 6, 1, 245, 167, 33, 6, 1, 245, 158, 33, 6, 1, 78, 33, 6, 1, + 225, 224, 33, 6, 1, 245, 100, 33, 6, 1, 245, 90, 33, 6, 1, 217, 23, 33, + 6, 1, 69, 33, 6, 1, 245, 210, 33, 6, 1, 162, 33, 6, 1, 215, 179, 33, 6, + 1, 250, 139, 33, 6, 1, 220, 104, 33, 6, 1, 220, 67, 33, 6, 1, 242, 10, + 50, 33, 6, 1, 211, 27, 33, 6, 1, 219, 54, 50, 33, 6, 1, 76, 33, 6, 1, + 210, 212, 33, 6, 1, 192, 33, 4, 1, 61, 33, 4, 1, 252, 83, 33, 4, 1, 213, + 255, 33, 4, 1, 242, 243, 33, 4, 1, 248, 98, 33, 4, 1, 236, 67, 33, 4, 1, + 210, 74, 33, 4, 1, 210, 94, 33, 4, 1, 74, 33, 4, 1, 219, 253, 74, 33, 4, + 1, 176, 33, 4, 1, 245, 182, 33, 4, 1, 245, 167, 33, 4, 1, 245, 158, 33, + 4, 1, 78, 33, 4, 1, 225, 224, 33, 4, 1, 245, 100, 33, 4, 1, 245, 90, 33, + 4, 1, 217, 23, 33, 4, 1, 69, 33, 4, 1, 245, 210, 33, 4, 1, 162, 33, 4, 1, + 215, 179, 33, 4, 1, 250, 139, 33, 4, 1, 220, 104, 33, 4, 1, 220, 67, 33, + 4, 1, 242, 10, 50, 33, 4, 1, 211, 27, 33, 4, 1, 219, 54, 50, 33, 4, 1, + 76, 33, 4, 1, 210, 212, 33, 4, 1, 192, 33, 4, 1, 236, 68, 2, 242, 143, + 33, 4, 1, 235, 196, 33, 4, 1, 247, 170, 33, 4, 1, 242, 194, 33, 4, 1, + 214, 202, 236, 67, 33, 4, 1, 246, 44, 33, 4, 1, 251, 84, 74, 33, 4, 1, + 211, 8, 33, 4, 1, 235, 132, 33, 4, 1, 232, 193, 33, 4, 1, 228, 183, 33, + 4, 1, 215, 175, 33, 4, 1, 234, 54, 33, 4, 1, 240, 161, 2, 242, 143, 33, + 4, 1, 219, 253, 69, 33, 4, 1, 246, 40, 33, 6, 1, 226, 205, 33, 4, 1, 226, + 205, 33, 6, 1, 211, 59, 33, 4, 1, 211, 59, 33, 6, 1, 235, 190, 76, 33, 4, + 1, 235, 190, 76, 33, 6, 1, 232, 198, 210, 183, 33, 4, 1, 232, 198, 210, + 183, 33, 6, 1, 235, 190, 232, 198, 210, 183, 33, 4, 1, 235, 190, 232, + 198, 210, 183, 33, 6, 1, 252, 1, 210, 183, 33, 4, 1, 252, 1, 210, 183, + 33, 6, 1, 235, 190, 252, 1, 210, 183, 33, 4, 1, 235, 190, 252, 1, 210, + 183, 33, 6, 1, 233, 239, 33, 4, 1, 233, 239, 33, 6, 1, 224, 164, 33, 4, + 1, 224, 164, 33, 6, 1, 244, 90, 33, 4, 1, 244, 90, 33, 6, 1, 235, 152, + 33, 4, 1, 235, 152, 33, 6, 1, 235, 153, 2, 52, 242, 144, 255, 23, 33, 4, + 1, 235, 153, 2, 52, 242, 144, 255, 23, 33, 6, 1, 214, 205, 33, 4, 1, 214, + 205, 33, 6, 1, 222, 187, 226, 205, 33, 4, 1, 222, 187, 226, 205, 33, 6, + 1, 226, 206, 2, 216, 66, 33, 4, 1, 226, 206, 2, 216, 66, 33, 6, 1, 226, + 144, 33, 4, 1, 226, 144, 33, 6, 1, 234, 12, 33, 4, 1, 234, 12, 33, 216, + 147, 50, 38, 33, 216, 66, 38, 33, 226, 69, 38, 33, 248, 162, 225, 21, 38, + 33, 224, 158, 225, 21, 38, 33, 225, 6, 38, 33, 240, 218, 216, 147, 50, + 38, 33, 230, 196, 50, 33, 6, 1, 219, 253, 240, 161, 2, 217, 78, 33, 4, 1, + 219, 253, 240, 161, 2, 217, 78, 33, 6, 1, 220, 148, 50, 33, 4, 1, 220, + 148, 50, 33, 6, 1, 245, 101, 2, 216, 115, 33, 4, 1, 245, 101, 2, 216, + 115, 33, 6, 1, 242, 244, 2, 214, 156, 33, 4, 1, 242, 244, 2, 214, 156, + 33, 6, 1, 242, 244, 2, 91, 33, 4, 1, 242, 244, 2, 91, 33, 6, 1, 242, 244, + 2, 230, 229, 103, 33, 4, 1, 242, 244, 2, 230, 229, 103, 33, 6, 1, 210, + 75, 2, 248, 47, 33, 4, 1, 210, 75, 2, 248, 47, 33, 6, 1, 210, 95, 2, 248, + 47, 33, 4, 1, 210, 95, 2, 248, 47, 33, 6, 1, 235, 19, 2, 248, 47, 33, 4, + 1, 235, 19, 2, 248, 47, 33, 6, 1, 235, 19, 2, 67, 91, 33, 4, 1, 235, 19, + 2, 67, 91, 33, 6, 1, 235, 19, 2, 91, 33, 4, 1, 235, 19, 2, 91, 33, 6, 1, + 252, 132, 176, 33, 4, 1, 252, 132, 176, 33, 6, 1, 245, 159, 2, 248, 47, + 33, 4, 1, 245, 159, 2, 248, 47, 33, 6, 27, 245, 159, 242, 243, 33, 4, 27, + 245, 159, 242, 243, 33, 6, 1, 225, 225, 2, 230, 229, 103, 33, 4, 1, 225, + 225, 2, 230, 229, 103, 33, 6, 1, 255, 29, 162, 33, 4, 1, 255, 29, 162, + 33, 6, 1, 245, 91, 2, 248, 47, 33, 4, 1, 245, 91, 2, 248, 47, 33, 6, 1, + 217, 24, 2, 248, 47, 33, 4, 1, 217, 24, 2, 248, 47, 33, 6, 1, 218, 123, + 69, 33, 4, 1, 218, 123, 69, 33, 6, 1, 218, 123, 104, 2, 91, 33, 4, 1, + 218, 123, 104, 2, 91, 33, 6, 1, 242, 56, 2, 248, 47, 33, 4, 1, 242, 56, + 2, 248, 47, 33, 6, 27, 217, 24, 215, 179, 33, 4, 27, 217, 24, 215, 179, + 33, 6, 1, 250, 140, 2, 248, 47, 33, 4, 1, 250, 140, 2, 248, 47, 33, 6, 1, + 250, 140, 2, 67, 91, 33, 4, 1, 250, 140, 2, 67, 91, 33, 6, 1, 220, 35, + 33, 4, 1, 220, 35, 33, 6, 1, 255, 29, 250, 139, 33, 4, 1, 255, 29, 250, + 139, 33, 6, 1, 255, 29, 250, 140, 2, 248, 47, 33, 4, 1, 255, 29, 250, + 140, 2, 248, 47, 33, 1, 226, 62, 33, 6, 1, 210, 75, 2, 251, 154, 33, 4, + 1, 210, 75, 2, 251, 154, 33, 6, 1, 235, 19, 2, 103, 33, 4, 1, 235, 19, 2, + 103, 33, 6, 1, 245, 183, 2, 217, 78, 33, 4, 1, 245, 183, 2, 217, 78, 33, + 6, 1, 245, 159, 2, 103, 33, 4, 1, 245, 159, 2, 103, 33, 6, 1, 245, 159, + 2, 217, 78, 33, 4, 1, 245, 159, 2, 217, 78, 33, 6, 1, 234, 133, 250, 139, + 33, 4, 1, 234, 133, 250, 139, 33, 6, 1, 245, 168, 2, 217, 78, 33, 4, 1, + 245, 168, 2, 217, 78, 33, 4, 1, 226, 62, 33, 6, 1, 116, 2, 251, 154, 33, + 4, 1, 116, 2, 251, 154, 33, 6, 1, 116, 2, 248, 9, 33, 4, 1, 116, 2, 248, + 9, 33, 6, 27, 116, 236, 67, 33, 4, 27, 116, 236, 67, 33, 6, 1, 236, 68, + 2, 251, 154, 33, 4, 1, 236, 68, 2, 251, 154, 33, 6, 1, 221, 197, 33, 4, + 1, 221, 197, 33, 6, 1, 221, 198, 2, 248, 9, 33, 4, 1, 221, 198, 2, 248, + 9, 33, 6, 1, 210, 75, 2, 248, 9, 33, 4, 1, 210, 75, 2, 248, 9, 33, 6, 1, + 210, 95, 2, 248, 9, 33, 4, 1, 210, 95, 2, 248, 9, 33, 6, 1, 255, 29, 246, + 44, 33, 4, 1, 255, 29, 246, 44, 33, 6, 1, 240, 161, 2, 231, 237, 33, 4, + 1, 240, 161, 2, 231, 237, 33, 6, 1, 240, 161, 2, 248, 9, 33, 4, 1, 240, + 161, 2, 248, 9, 33, 6, 1, 144, 2, 248, 9, 33, 4, 1, 144, 2, 248, 9, 33, + 6, 1, 252, 142, 78, 33, 4, 1, 252, 142, 78, 33, 6, 1, 252, 142, 144, 2, + 248, 9, 33, 4, 1, 252, 142, 144, 2, 248, 9, 33, 6, 1, 160, 2, 248, 9, 33, + 4, 1, 160, 2, 248, 9, 33, 6, 1, 104, 2, 231, 237, 33, 4, 1, 104, 2, 231, + 237, 33, 6, 1, 104, 2, 248, 9, 33, 4, 1, 104, 2, 248, 9, 33, 6, 1, 104, + 2, 52, 142, 33, 4, 1, 104, 2, 52, 142, 33, 6, 1, 250, 140, 2, 248, 9, 33, + 4, 1, 250, 140, 2, 248, 9, 33, 6, 1, 242, 244, 2, 248, 47, 33, 4, 1, 242, + 244, 2, 248, 47, 33, 6, 1, 211, 28, 2, 248, 9, 33, 4, 1, 211, 28, 2, 248, + 9, 33, 6, 1, 242, 244, 2, 218, 105, 22, 103, 33, 4, 1, 242, 244, 2, 218, + 105, 22, 103, 33, 6, 1, 242, 56, 2, 103, 33, 4, 1, 242, 56, 2, 103, 33, + 6, 1, 242, 56, 2, 91, 33, 4, 1, 242, 56, 2, 91, 33, 6, 1, 234, 20, 248, + 98, 33, 4, 1, 234, 20, 248, 98, 33, 6, 1, 234, 20, 247, 170, 33, 4, 1, + 234, 20, 247, 170, 33, 6, 1, 234, 20, 210, 27, 33, 4, 1, 234, 20, 210, + 27, 33, 6, 1, 234, 20, 246, 38, 33, 4, 1, 234, 20, 246, 38, 33, 6, 1, + 234, 20, 232, 193, 33, 4, 1, 234, 20, 232, 193, 33, 6, 1, 234, 20, 228, + 183, 33, 4, 1, 234, 20, 228, 183, 33, 6, 1, 234, 20, 219, 111, 33, 4, 1, + 234, 20, 219, 111, 33, 6, 1, 234, 20, 216, 61, 33, 4, 1, 234, 20, 216, + 61, 33, 6, 1, 223, 52, 210, 94, 33, 4, 1, 223, 52, 210, 94, 33, 6, 1, + 245, 183, 2, 103, 33, 4, 1, 245, 183, 2, 103, 33, 6, 1, 233, 4, 33, 4, 1, + 233, 4, 33, 6, 1, 223, 42, 33, 4, 1, 223, 42, 33, 6, 1, 211, 92, 33, 4, + 1, 211, 92, 33, 6, 1, 224, 91, 33, 4, 1, 224, 91, 33, 6, 1, 212, 22, 33, + 4, 1, 212, 22, 33, 6, 1, 254, 175, 176, 33, 4, 1, 254, 175, 176, 33, 6, + 1, 245, 183, 2, 230, 229, 103, 33, 4, 1, 245, 183, 2, 230, 229, 103, 33, + 6, 1, 245, 159, 2, 230, 229, 103, 33, 4, 1, 245, 159, 2, 230, 229, 103, + 33, 6, 1, 225, 225, 2, 248, 47, 33, 4, 1, 225, 225, 2, 248, 47, 33, 6, 1, + 220, 36, 2, 248, 47, 33, 4, 1, 220, 36, 2, 248, 47, 150, 6, 1, 253, 172, + 150, 6, 1, 252, 47, 150, 6, 1, 242, 210, 150, 6, 1, 248, 229, 150, 6, 1, + 245, 221, 150, 6, 1, 210, 116, 150, 6, 1, 245, 205, 150, 6, 1, 245, 73, + 150, 6, 1, 112, 150, 6, 1, 210, 74, 150, 6, 1, 235, 234, 150, 6, 1, 232, + 196, 150, 6, 1, 211, 160, 150, 6, 1, 251, 41, 150, 6, 1, 234, 171, 150, + 6, 1, 241, 75, 150, 6, 1, 235, 147, 150, 6, 1, 242, 253, 150, 6, 1, 250, + 134, 150, 6, 1, 231, 63, 150, 6, 1, 211, 8, 150, 6, 1, 228, 44, 150, 6, + 1, 220, 104, 150, 6, 1, 213, 138, 150, 6, 1, 250, 165, 150, 6, 1, 225, + 208, 150, 6, 1, 235, 116, 150, 6, 1, 205, 150, 6, 1, 221, 163, 150, 6, 1, + 213, 179, 150, 6, 1, 216, 63, 150, 6, 1, 223, 98, 150, 6, 1, 249, 246, + 150, 6, 1, 210, 249, 150, 6, 1, 225, 49, 150, 6, 1, 234, 182, 150, 6, 1, + 226, 226, 150, 6, 1, 244, 150, 150, 58, 1, 43, 163, 222, 236, 150, 254, + 65, 150, 245, 162, 79, 150, 245, 39, 79, 150, 249, 227, 150, 224, 16, 79, + 150, 255, 30, 79, 150, 4, 1, 253, 172, 150, 4, 1, 252, 47, 150, 4, 1, + 242, 210, 150, 4, 1, 248, 229, 150, 4, 1, 245, 221, 150, 4, 1, 210, 116, + 150, 4, 1, 245, 205, 150, 4, 1, 245, 73, 150, 4, 1, 112, 150, 4, 1, 210, + 74, 150, 4, 1, 235, 234, 150, 4, 1, 232, 196, 150, 4, 1, 211, 160, 150, + 4, 1, 251, 41, 150, 4, 1, 234, 171, 150, 4, 1, 241, 75, 150, 4, 1, 235, + 147, 150, 4, 1, 242, 253, 150, 4, 1, 250, 134, 150, 4, 1, 231, 63, 150, + 4, 1, 211, 8, 150, 4, 1, 228, 44, 150, 4, 1, 220, 104, 150, 4, 1, 213, + 138, 150, 4, 1, 250, 165, 150, 4, 1, 225, 208, 150, 4, 1, 235, 116, 150, + 4, 1, 205, 150, 4, 1, 221, 163, 150, 4, 1, 213, 179, 150, 4, 1, 216, 63, + 150, 4, 1, 223, 98, 150, 4, 1, 249, 246, 150, 4, 1, 210, 249, 150, 4, 1, + 225, 49, 150, 4, 1, 234, 182, 150, 4, 1, 226, 226, 150, 4, 1, 244, 150, + 150, 4, 27, 245, 222, 210, 249, 150, 243, 236, 218, 131, 150, 240, 175, + 150, 246, 103, 50, 94, 255, 24, 245, 65, 94, 255, 24, 221, 164, 94, 255, + 24, 220, 90, 94, 255, 24, 210, 104, 224, 74, 94, 255, 24, 210, 104, 243, + 132, 94, 255, 24, 216, 76, 94, 255, 24, 223, 50, 94, 255, 24, 210, 103, + 94, 255, 24, 225, 249, 94, 255, 24, 211, 20, 94, 255, 24, 216, 215, 94, + 255, 24, 243, 48, 94, 255, 24, 243, 49, 230, 74, 94, 255, 24, 243, 46, + 94, 255, 24, 224, 75, 226, 20, 94, 255, 24, 216, 254, 243, 63, 94, 255, + 24, 225, 230, 94, 255, 24, 253, 208, 242, 48, 94, 255, 24, 230, 84, 94, + 255, 24, 231, 213, 94, 255, 24, 231, 54, 94, 255, 24, 231, 55, 234, 183, + 94, 255, 24, 248, 171, 94, 255, 24, 224, 86, 94, 255, 24, 216, 254, 224, + 70, 94, 255, 24, 211, 30, 252, 48, 210, 230, 94, 255, 24, 226, 211, 94, + 255, 24, 236, 26, 94, 255, 24, 248, 78, 94, 255, 24, 210, 33, 94, 164, + 231, 148, 250, 43, 94, 225, 14, 220, 38, 94, 225, 14, 242, 1, 221, 164, + 94, 225, 14, 242, 1, 225, 243, 94, 225, 14, 242, 1, 224, 79, 94, 225, 14, + 241, 165, 94, 225, 14, 215, 177, 94, 225, 14, 221, 164, 94, 225, 14, 225, + 243, 94, 225, 14, 224, 79, 94, 225, 14, 241, 68, 94, 225, 14, 241, 69, + 242, 3, 31, 214, 3, 94, 225, 14, 224, 20, 94, 225, 14, 248, 216, 177, + 231, 176, 94, 225, 14, 231, 43, 94, 224, 144, 231, 173, 94, 225, 14, 223, + 172, 94, 224, 144, 225, 251, 94, 225, 14, 220, 23, 247, 128, 94, 225, 14, + 219, 161, 247, 128, 94, 224, 144, 219, 55, 225, 245, 94, 164, 214, 160, + 247, 128, 94, 164, 232, 114, 247, 128, 94, 224, 144, 227, 199, 242, 47, + 94, 225, 14, 224, 80, 224, 74, 94, 1, 254, 179, 94, 1, 252, 36, 94, 1, + 242, 208, 94, 1, 248, 197, 94, 1, 241, 245, 94, 1, 214, 3, 94, 1, 210, + 97, 94, 1, 241, 204, 94, 1, 216, 231, 94, 1, 210, 233, 94, 1, 40, 235, 0, + 94, 1, 235, 0, 94, 1, 233, 100, 94, 1, 40, 231, 70, 94, 1, 231, 70, 94, + 1, 40, 227, 198, 94, 1, 227, 198, 94, 1, 221, 251, 94, 1, 253, 170, 94, + 1, 40, 225, 224, 94, 1, 225, 224, 94, 1, 40, 215, 180, 94, 1, 215, 180, + 94, 1, 224, 42, 94, 1, 223, 70, 94, 1, 220, 22, 94, 1, 217, 39, 94, 27, + 211, 6, 52, 214, 3, 94, 27, 211, 6, 214, 4, 210, 233, 94, 27, 211, 6, 52, + 210, 233, 94, 224, 144, 243, 48, 94, 224, 144, 243, 46, 9, 54, 50, 9, 5, + 221, 244, 9, 244, 38, 231, 159, 9, 5, 222, 25, 9, 5, 221, 247, 254, 45, + 249, 117, 222, 195, 254, 45, 244, 12, 222, 195, 9, 223, 137, 254, 45, + 225, 186, 230, 198, 50, 254, 45, 225, 186, 216, 249, 216, 149, 50, 254, + 230, 50, 9, 249, 227, 9, 248, 158, 220, 139, 9, 225, 16, 213, 241, 50, 9, + 5, 230, 179, 9, 5, 222, 5, 254, 181, 212, 45, 9, 5, 254, 181, 253, 229, + 9, 5, 223, 170, 254, 180, 9, 5, 223, 178, 254, 161, 254, 112, 9, 5, 217, + 71, 9, 4, 125, 217, 81, 9, 4, 125, 27, 109, 2, 233, 109, 2, 211, 43, 9, + 4, 125, 210, 108, 9, 4, 244, 173, 9, 4, 248, 192, 9, 4, 234, 211, 9, 220, + 152, 9, 1, 79, 9, 215, 212, 59, 224, 144, 79, 9, 224, 16, 79, 9, 1, 234, + 215, 211, 43, 9, 1, 242, 26, 9, 1, 109, 2, 231, 233, 48, 9, 1, 109, 2, + 182, 48, 9, 1, 212, 31, 2, 182, 48, 9, 1, 109, 2, 182, 51, 9, 1, 77, 2, + 182, 48, 9, 1, 254, 179, 9, 1, 252, 62, 9, 1, 217, 9, 231, 169, 9, 1, + 217, 8, 9, 1, 216, 193, 9, 1, 235, 129, 9, 1, 242, 44, 9, 1, 234, 135, 9, + 1, 248, 203, 9, 1, 216, 203, 9, 1, 223, 98, 9, 1, 210, 108, 9, 1, 221, + 168, 9, 1, 220, 61, 9, 1, 222, 28, 9, 1, 248, 224, 9, 1, 217, 81, 9, 1, + 210, 111, 9, 1, 254, 205, 9, 1, 242, 251, 9, 1, 234, 181, 2, 113, 170, + 48, 9, 1, 234, 181, 2, 134, 170, 51, 9, 1, 244, 176, 77, 2, 235, 200, + 214, 105, 9, 1, 244, 176, 77, 2, 113, 170, 48, 9, 1, 244, 176, 77, 2, + 134, 170, 48, 9, 217, 44, 9, 1, 244, 150, 9, 1, 224, 84, 9, 1, 235, 0, 9, + 1, 233, 108, 9, 1, 231, 83, 9, 1, 228, 67, 9, 1, 241, 225, 9, 1, 212, 30, + 9, 1, 109, 231, 197, 9, 1, 211, 43, 9, 244, 171, 9, 248, 190, 9, 234, + 209, 9, 244, 173, 9, 248, 192, 9, 234, 211, 9, 220, 95, 9, 218, 46, 9, + 231, 231, 48, 9, 182, 48, 9, 182, 51, 9, 218, 66, 254, 179, 9, 235, 200, + 248, 192, 9, 164, 228, 68, 242, 225, 9, 209, 255, 9, 25, 5, 4, 214, 106, + 48, 9, 25, 5, 235, 200, 4, 214, 106, 48, 9, 25, 5, 59, 51, 9, 223, 52, + 248, 192, 9, 244, 174, 2, 113, 247, 126, 9, 212, 32, 182, 51, 254, 45, + 21, 210, 86, 254, 45, 21, 111, 254, 45, 21, 105, 254, 45, 21, 158, 254, + 45, 21, 161, 254, 45, 21, 190, 254, 45, 21, 195, 254, 45, 21, 199, 254, + 45, 21, 196, 254, 45, 21, 201, 9, 225, 185, 50, 9, 248, 91, 220, 139, 9, + 216, 147, 220, 139, 9, 244, 89, 225, 12, 218, 158, 9, 1, 247, 127, 252, + 62, 9, 1, 247, 127, 224, 84, 9, 1, 218, 24, 254, 179, 9, 1, 109, 212, 46, + 9, 1, 109, 2, 212, 32, 182, 48, 9, 1, 109, 2, 212, 32, 182, 51, 9, 1, + 125, 242, 26, 9, 1, 125, 182, 254, 179, 9, 1, 125, 182, 212, 30, 9, 1, + 104, 2, 182, 48, 9, 1, 125, 182, 211, 43, 9, 1, 215, 149, 9, 1, 215, 147, + 9, 1, 252, 72, 9, 1, 217, 9, 2, 222, 236, 9, 1, 217, 9, 2, 134, 170, 72, + 246, 111, 9, 1, 225, 208, 9, 1, 217, 6, 9, 1, 252, 60, 9, 1, 122, 2, 182, + 48, 9, 1, 122, 2, 113, 170, 67, 48, 9, 1, 227, 157, 9, 1, 246, 51, 9, 1, + 122, 2, 134, 170, 48, 9, 1, 217, 27, 9, 1, 217, 25, 9, 1, 248, 138, 9, 1, + 248, 204, 2, 222, 236, 9, 1, 248, 204, 2, 59, 51, 9, 1, 248, 204, 2, 59, + 252, 51, 22, 4, 217, 81, 9, 1, 248, 209, 9, 1, 248, 140, 9, 1, 246, 78, + 9, 1, 248, 204, 2, 134, 170, 72, 246, 111, 9, 1, 248, 204, 2, 244, 19, + 170, 48, 9, 1, 222, 173, 9, 1, 223, 99, 2, 4, 214, 105, 9, 1, 223, 99, 2, + 222, 236, 9, 1, 223, 99, 2, 59, 51, 9, 1, 223, 99, 2, 4, 214, 106, 51, 9, + 1, 223, 99, 2, 59, 252, 51, 22, 59, 48, 9, 1, 223, 99, 2, 113, 170, 48, + 9, 1, 235, 126, 9, 1, 223, 99, 2, 244, 19, 170, 48, 9, 1, 221, 169, 2, + 59, 252, 51, 22, 59, 48, 9, 1, 221, 169, 2, 134, 170, 51, 9, 1, 221, 169, + 2, 134, 170, 252, 51, 22, 134, 170, 48, 9, 1, 222, 29, 2, 113, 170, 51, + 9, 1, 222, 29, 2, 134, 170, 48, 9, 1, 217, 82, 2, 134, 170, 48, 9, 1, + 254, 206, 2, 134, 170, 48, 9, 1, 247, 127, 244, 150, 9, 1, 244, 151, 2, + 59, 230, 114, 51, 9, 1, 244, 151, 2, 59, 51, 9, 1, 213, 248, 9, 1, 244, + 151, 2, 134, 170, 51, 9, 1, 225, 206, 9, 1, 224, 85, 2, 59, 48, 9, 1, + 224, 85, 2, 134, 170, 48, 9, 1, 234, 180, 9, 1, 217, 251, 235, 0, 9, 1, + 235, 1, 2, 222, 236, 9, 1, 235, 1, 2, 59, 48, 9, 1, 229, 84, 9, 1, 235, + 1, 2, 134, 170, 51, 9, 1, 243, 129, 9, 1, 243, 130, 2, 222, 236, 9, 1, + 229, 7, 9, 1, 243, 130, 2, 113, 170, 51, 9, 1, 242, 108, 9, 1, 243, 130, + 2, 134, 170, 48, 9, 1, 233, 109, 2, 4, 214, 105, 9, 1, 233, 109, 2, 59, + 48, 9, 1, 233, 109, 2, 134, 170, 48, 9, 1, 233, 109, 2, 134, 170, 51, 9, + 1, 228, 68, 2, 59, 51, 9, 1, 228, 68, 242, 225, 9, 1, 222, 216, 9, 1, + 228, 68, 2, 222, 236, 9, 1, 228, 68, 2, 134, 170, 48, 9, 1, 241, 226, + 247, 149, 9, 1, 217, 28, 2, 59, 48, 9, 1, 241, 226, 2, 77, 48, 9, 1, 241, + 226, 242, 178, 9, 1, 241, 226, 242, 179, 2, 182, 48, 9, 1, 217, 9, 231, + 170, 242, 178, 9, 1, 212, 31, 2, 222, 236, 9, 1, 234, 79, 226, 238, 9, 1, + 226, 238, 9, 1, 69, 9, 1, 210, 212, 9, 1, 234, 79, 210, 212, 9, 1, 212, + 31, 2, 113, 170, 48, 9, 1, 213, 255, 9, 1, 244, 176, 211, 43, 9, 1, 77, + 2, 217, 78, 9, 1, 77, 2, 4, 214, 105, 9, 1, 212, 31, 2, 59, 48, 9, 1, 76, + 9, 1, 77, 2, 134, 170, 51, 9, 1, 77, 252, 140, 9, 1, 77, 252, 141, 2, + 182, 48, 9, 243, 236, 218, 131, 9, 1, 254, 252, 9, 4, 125, 27, 222, 29, + 2, 233, 109, 2, 109, 231, 197, 9, 4, 125, 27, 224, 85, 2, 233, 109, 2, + 109, 231, 197, 9, 4, 125, 66, 65, 17, 9, 4, 125, 233, 109, 254, 179, 9, + 4, 125, 235, 129, 9, 4, 125, 134, 247, 126, 9, 4, 125, 221, 168, 9, 245, + 151, 64, 253, 174, 9, 218, 154, 64, 222, 140, 245, 183, 241, 162, 9, 4, + 125, 222, 185, 210, 86, 9, 4, 125, 214, 159, 223, 118, 210, 86, 9, 4, + 125, 247, 127, 241, 243, 64, 234, 135, 9, 4, 125, 66, 53, 17, 9, 4, 121, + 221, 168, 9, 4, 125, 231, 232, 9, 4, 212, 30, 9, 4, 211, 43, 9, 4, 125, + 211, 43, 9, 4, 125, 228, 67, 9, 225, 44, 64, 222, 15, 9, 245, 160, 250, + 183, 121, 218, 131, 9, 245, 160, 250, 183, 125, 218, 131, 9, 222, 185, + 125, 218, 132, 2, 244, 112, 250, 182, 9, 4, 121, 231, 83, 9, 1, 248, 204, + 2, 235, 200, 214, 105, 9, 1, 223, 99, 2, 235, 200, 214, 105, 245, 30, + 254, 45, 21, 210, 86, 245, 30, 254, 45, 21, 111, 245, 30, 254, 45, 21, + 105, 245, 30, 254, 45, 21, 158, 245, 30, 254, 45, 21, 161, 245, 30, 254, + 45, 21, 190, 245, 30, 254, 45, 21, 195, 245, 30, 254, 45, 21, 199, 245, + 30, 254, 45, 21, 196, 245, 30, 254, 45, 21, 201, 9, 1, 220, 62, 2, 59, + 51, 9, 1, 248, 225, 2, 59, 51, 9, 1, 242, 252, 2, 59, 51, 9, 5, 219, 160, + 254, 134, 9, 5, 219, 160, 224, 238, 231, 63, 9, 1, 241, 226, 2, 235, 200, + 214, 105, 183, 245, 151, 64, 226, 18, 183, 218, 20, 243, 236, 218, 131, + 183, 218, 68, 243, 236, 218, 131, 183, 218, 20, 249, 234, 183, 218, 68, + 249, 234, 183, 203, 249, 234, 183, 249, 235, 219, 108, 233, 52, 183, 249, + 235, 219, 108, 222, 254, 183, 218, 20, 249, 235, 219, 108, 233, 52, 183, + 218, 68, 249, 235, 219, 108, 222, 254, 183, 249, 188, 183, 242, 8, 226, + 254, 183, 242, 8, 231, 41, 183, 242, 8, 253, 226, 183, 255, 30, 79, 183, + 1, 254, 183, 183, 1, 218, 24, 254, 183, 183, 1, 252, 33, 183, 1, 243, + 120, 183, 1, 243, 121, 243, 98, 183, 1, 248, 200, 183, 1, 247, 127, 248, + 201, 222, 232, 183, 1, 241, 245, 183, 1, 212, 30, 183, 1, 210, 108, 183, + 1, 241, 202, 183, 1, 216, 227, 183, 1, 216, 228, 243, 98, 183, 1, 210, + 199, 183, 1, 210, 200, 241, 245, 183, 1, 234, 231, 183, 1, 233, 107, 183, + 1, 230, 195, 183, 1, 227, 198, 183, 1, 220, 145, 183, 1, 40, 220, 145, + 183, 1, 76, 183, 1, 225, 224, 183, 1, 223, 52, 225, 224, 183, 1, 222, 26, + 183, 1, 224, 78, 183, 1, 222, 232, 183, 1, 220, 22, 183, 1, 217, 37, 183, + 1, 225, 172, 252, 20, 183, 1, 225, 172, 242, 249, 183, 1, 225, 172, 248, + 28, 183, 224, 154, 48, 183, 224, 154, 51, 183, 224, 154, 246, 125, 183, + 210, 17, 48, 183, 210, 17, 51, 183, 210, 17, 246, 125, 183, 223, 134, 48, + 183, 223, 134, 51, 183, 246, 126, 210, 24, 241, 51, 183, 246, 126, 210, + 24, 254, 113, 183, 241, 248, 48, 183, 241, 248, 51, 183, 241, 247, 246, + 125, 183, 245, 87, 48, 183, 245, 87, 51, 183, 222, 109, 183, 244, 144, + 247, 128, 183, 223, 251, 183, 222, 136, 183, 113, 67, 170, 48, 183, 113, + 67, 170, 51, 183, 134, 170, 48, 183, 134, 170, 51, 183, 226, 252, 232, + 220, 48, 183, 226, 252, 232, 220, 51, 183, 230, 61, 183, 252, 139, 183, + 1, 219, 51, 210, 80, 183, 1, 219, 51, 234, 128, 183, 1, 219, 51, 244, + 162, 9, 1, 252, 63, 2, 134, 170, 241, 1, 51, 9, 1, 252, 63, 2, 59, 252, + 51, 22, 134, 170, 48, 9, 1, 252, 63, 2, 134, 170, 225, 10, 214, 153, 51, + 9, 1, 252, 63, 2, 134, 170, 225, 10, 214, 153, 252, 51, 22, 113, 170, 48, + 9, 1, 252, 63, 2, 113, 170, 252, 51, 22, 59, 48, 9, 1, 252, 63, 2, 235, + 200, 4, 214, 106, 51, 9, 1, 252, 63, 2, 4, 214, 105, 9, 1, 122, 2, 113, + 170, 48, 9, 1, 122, 2, 134, 170, 225, 10, 214, 153, 51, 9, 1, 248, 204, + 2, 113, 170, 213, 189, 252, 51, 22, 4, 217, 81, 9, 1, 248, 204, 2, 235, + 200, 4, 214, 106, 51, 9, 1, 223, 99, 2, 91, 9, 1, 221, 169, 2, 244, 19, + 170, 48, 9, 1, 254, 206, 2, 113, 170, 48, 9, 1, 254, 206, 2, 134, 170, + 225, 10, 246, 112, 48, 9, 1, 254, 206, 2, 113, 170, 213, 189, 48, 9, 1, + 244, 151, 2, 113, 170, 51, 9, 1, 244, 151, 2, 134, 170, 225, 10, 214, + 153, 51, 9, 1, 234, 181, 2, 59, 48, 9, 1, 234, 181, 2, 134, 170, 48, 9, + 1, 234, 181, 2, 134, 170, 225, 10, 214, 153, 51, 9, 1, 66, 2, 59, 48, 9, + 1, 66, 2, 59, 51, 9, 1, 228, 68, 2, 113, 170, 51, 9, 1, 228, 68, 2, 4, + 217, 81, 9, 1, 228, 68, 2, 4, 214, 105, 9, 1, 233, 109, 2, 130, 9, 1, + 223, 99, 2, 113, 170, 213, 189, 48, 9, 1, 223, 99, 2, 182, 48, 9, 1, 221, + 169, 2, 113, 170, 213, 189, 48, 9, 1, 122, 2, 4, 9, 1, 217, 82, 51, 9, 1, + 122, 2, 4, 9, 1, 217, 82, 22, 113, 247, 126, 9, 1, 221, 169, 2, 4, 9, 1, + 217, 82, 22, 113, 247, 126, 9, 1, 223, 99, 2, 4, 9, 1, 217, 82, 22, 113, + 247, 126, 9, 1, 122, 2, 4, 9, 1, 217, 82, 48, 9, 1, 109, 2, 245, 30, 254, + 45, 21, 113, 48, 9, 1, 109, 2, 245, 30, 254, 45, 21, 134, 48, 9, 1, 244, + 176, 77, 2, 245, 30, 254, 45, 21, 113, 48, 9, 1, 244, 176, 77, 2, 245, + 30, 254, 45, 21, 134, 48, 9, 1, 244, 176, 77, 2, 245, 30, 254, 45, 21, + 244, 19, 51, 9, 1, 212, 31, 2, 245, 30, 254, 45, 21, 113, 48, 9, 1, 212, + 31, 2, 245, 30, 254, 45, 21, 134, 48, 9, 1, 77, 252, 141, 2, 245, 30, + 254, 45, 21, 113, 48, 9, 1, 77, 252, 141, 2, 245, 30, 254, 45, 21, 134, + 48, 9, 1, 122, 2, 245, 30, 254, 45, 21, 244, 19, 51, 9, 1, 221, 169, 2, + 245, 30, 254, 45, 21, 244, 19, 48, 9, 1, 221, 169, 2, 235, 200, 214, 105, + 9, 1, 235, 1, 2, 113, 170, 48, 216, 206, 1, 242, 53, 216, 206, 1, 220, + 70, 216, 206, 1, 228, 66, 216, 206, 1, 223, 187, 216, 206, 1, 252, 197, + 216, 206, 1, 233, 1, 216, 206, 1, 235, 14, 216, 206, 1, 254, 168, 216, + 206, 1, 214, 25, 216, 206, 1, 231, 82, 216, 206, 1, 244, 202, 216, 206, + 1, 248, 31, 216, 206, 1, 216, 208, 216, 206, 1, 233, 137, 216, 206, 1, + 243, 138, 216, 206, 1, 242, 184, 216, 206, 1, 221, 167, 216, 206, 1, 248, + 156, 216, 206, 1, 210, 100, 216, 206, 1, 217, 38, 216, 206, 1, 211, 103, + 216, 206, 1, 225, 237, 216, 206, 1, 235, 134, 216, 206, 1, 250, 142, 216, + 206, 1, 215, 156, 216, 206, 1, 241, 195, 216, 206, 1, 234, 137, 216, 206, + 1, 216, 207, 216, 206, 1, 210, 115, 216, 206, 1, 220, 60, 216, 206, 1, + 222, 32, 216, 206, 1, 248, 227, 216, 206, 1, 112, 216, 206, 1, 210, 23, + 216, 206, 1, 254, 202, 216, 206, 1, 242, 250, 216, 206, 1, 224, 88, 216, + 206, 1, 212, 63, 216, 206, 255, 31, 216, 206, 255, 47, 216, 206, 240, + 121, 216, 206, 245, 216, 216, 206, 214, 222, 216, 206, 226, 186, 216, + 206, 245, 224, 216, 206, 245, 24, 216, 206, 226, 251, 216, 206, 227, 3, + 216, 206, 218, 46, 216, 206, 1, 229, 230, 228, 142, 21, 210, 86, 228, + 142, 21, 111, 228, 142, 21, 105, 228, 142, 21, 158, 228, 142, 21, 161, + 228, 142, 21, 190, 228, 142, 21, 195, 228, 142, 21, 199, 228, 142, 21, + 196, 228, 142, 21, 201, 228, 142, 1, 61, 228, 142, 1, 245, 217, 228, 142, + 1, 74, 228, 142, 1, 76, 228, 142, 1, 69, 228, 142, 1, 226, 187, 228, 142, + 1, 78, 228, 142, 1, 248, 217, 228, 142, 1, 230, 30, 228, 142, 1, 252, + 199, 228, 142, 1, 191, 228, 142, 1, 217, 106, 228, 142, 1, 235, 147, 228, + 142, 1, 250, 165, 228, 142, 1, 248, 229, 228, 142, 1, 205, 228, 142, 1, + 222, 181, 228, 142, 1, 206, 228, 142, 1, 243, 86, 228, 142, 1, 244, 204, + 228, 142, 1, 176, 228, 142, 1, 233, 141, 228, 142, 1, 229, 234, 211, 223, + 228, 142, 1, 186, 228, 142, 1, 227, 169, 228, 142, 1, 198, 228, 142, 1, + 162, 228, 142, 1, 212, 65, 228, 142, 1, 192, 228, 142, 1, 227, 170, 211, + 223, 228, 142, 1, 235, 67, 235, 147, 228, 142, 1, 235, 67, 250, 165, 228, + 142, 1, 235, 67, 205, 228, 142, 38, 219, 253, 125, 216, 31, 228, 142, 38, + 219, 253, 121, 216, 31, 228, 142, 38, 219, 253, 222, 231, 216, 31, 228, + 142, 38, 200, 248, 46, 216, 31, 228, 142, 38, 200, 125, 216, 31, 228, + 142, 38, 200, 121, 216, 31, 228, 142, 38, 200, 222, 231, 216, 31, 228, + 142, 38, 229, 198, 79, 228, 142, 38, 52, 59, 48, 228, 142, 125, 138, 254, + 65, 228, 142, 121, 138, 254, 65, 228, 142, 16, 226, 188, 248, 58, 228, + 142, 16, 243, 85, 228, 142, 249, 227, 228, 142, 245, 39, 79, 228, 142, + 233, 114, 221, 254, 1, 254, 185, 221, 254, 1, 251, 236, 221, 254, 1, 243, + 119, 221, 254, 1, 248, 202, 221, 254, 1, 235, 158, 221, 254, 1, 252, 197, + 221, 254, 1, 210, 89, 221, 254, 1, 235, 166, 221, 254, 1, 216, 68, 221, + 254, 1, 210, 182, 221, 254, 1, 235, 15, 221, 254, 1, 233, 134, 221, 254, + 1, 230, 195, 221, 254, 1, 227, 198, 221, 254, 1, 219, 158, 221, 254, 1, + 236, 6, 221, 254, 1, 244, 129, 221, 254, 1, 215, 182, 221, 254, 1, 224, + 13, 221, 254, 1, 222, 232, 221, 254, 1, 220, 87, 221, 254, 1, 217, 101, + 221, 254, 164, 236, 6, 221, 254, 164, 236, 5, 221, 254, 164, 226, 247, + 221, 254, 164, 248, 215, 221, 254, 58, 1, 245, 113, 210, 182, 221, 254, + 164, 245, 113, 210, 182, 221, 254, 25, 5, 200, 76, 221, 254, 25, 5, 76, + 221, 254, 25, 5, 226, 122, 255, 82, 221, 254, 25, 5, 200, 255, 82, 221, + 254, 25, 5, 255, 82, 221, 254, 25, 5, 226, 122, 61, 221, 254, 25, 5, 200, + 61, 221, 254, 25, 5, 61, 221, 254, 58, 1, 219, 253, 61, 221, 254, 25, 5, + 219, 253, 61, 221, 254, 25, 5, 200, 69, 221, 254, 25, 5, 69, 221, 254, + 58, 1, 74, 221, 254, 25, 5, 200, 74, 221, 254, 25, 5, 74, 221, 254, 25, + 5, 78, 221, 254, 25, 5, 218, 46, 221, 254, 164, 229, 97, 221, 254, 224, + 144, 229, 97, 221, 254, 224, 144, 254, 227, 221, 254, 224, 144, 254, 122, + 221, 254, 224, 144, 252, 122, 221, 254, 224, 144, 253, 209, 221, 254, + 224, 144, 220, 10, 221, 254, 255, 30, 79, 221, 254, 224, 144, 231, 73, + 224, 48, 221, 254, 224, 144, 210, 31, 221, 254, 224, 144, 224, 48, 221, + 254, 224, 144, 210, 114, 221, 254, 224, 144, 215, 90, 221, 254, 224, 144, + 254, 17, 221, 254, 224, 144, 219, 55, 231, 150, 221, 254, 224, 144, 254, + 108, 231, 187, 1, 242, 31, 231, 187, 1, 255, 34, 231, 187, 1, 254, 225, + 231, 187, 1, 255, 8, 231, 187, 1, 254, 218, 231, 187, 1, 214, 124, 231, + 187, 1, 253, 168, 231, 187, 1, 235, 166, 231, 187, 1, 253, 206, 231, 187, + 1, 254, 190, 231, 187, 1, 254, 195, 231, 187, 1, 254, 187, 231, 187, 1, + 254, 144, 231, 187, 1, 254, 131, 231, 187, 1, 253, 245, 231, 187, 1, 236, + 6, 231, 187, 1, 254, 80, 231, 187, 1, 253, 216, 231, 187, 1, 254, 53, + 231, 187, 1, 254, 49, 231, 187, 1, 253, 239, 231, 187, 1, 253, 214, 231, + 187, 1, 246, 63, 231, 187, 1, 235, 8, 231, 187, 1, 254, 205, 231, 187, + 254, 231, 79, 231, 187, 213, 136, 79, 231, 187, 243, 60, 79, 231, 187, + 224, 143, 9, 1, 252, 63, 2, 4, 214, 106, 51, 9, 1, 151, 2, 113, 170, 48, + 9, 1, 217, 82, 2, 113, 170, 48, 9, 1, 244, 151, 2, 59, 252, 51, 22, 134, + 170, 48, 9, 1, 224, 85, 2, 59, 51, 9, 1, 233, 109, 2, 52, 130, 9, 1, 66, + 2, 134, 170, 48, 9, 1, 77, 2, 113, 170, 252, 51, 22, 182, 48, 9, 1, 77, + 2, 113, 170, 252, 51, 22, 59, 48, 9, 1, 223, 99, 2, 232, 129, 9, 1, 212, + 31, 2, 59, 211, 231, 9, 1, 222, 203, 211, 43, 9, 249, 107, 244, 173, 9, + 249, 107, 248, 192, 9, 249, 107, 234, 211, 9, 249, 107, 244, 171, 9, 249, + 107, 248, 190, 9, 249, 107, 234, 209, 9, 138, 123, 59, 48, 9, 138, 113, + 170, 48, 9, 138, 232, 130, 48, 9, 138, 123, 59, 51, 9, 138, 113, 170, 51, + 9, 138, 232, 130, 51, 9, 204, 244, 171, 9, 204, 248, 190, 9, 204, 234, + 209, 9, 4, 125, 212, 30, 9, 244, 174, 2, 222, 236, 9, 244, 174, 2, 59, + 48, 9, 234, 212, 2, 59, 51, 9, 43, 254, 2, 48, 9, 44, 254, 2, 48, 9, 43, + 254, 2, 51, 9, 44, 254, 2, 51, 9, 52, 44, 254, 2, 48, 9, 52, 44, 254, 2, + 72, 2, 247, 128, 9, 44, 254, 2, 72, 2, 247, 128, 9, 248, 193, 2, 247, + 128, 84, 5, 235, 200, 251, 7, 84, 5, 251, 7, 84, 5, 254, 83, 84, 5, 213, + 147, 84, 1, 219, 253, 61, 84, 1, 61, 84, 1, 255, 82, 84, 1, 74, 84, 1, + 236, 40, 84, 1, 69, 84, 1, 214, 118, 84, 1, 149, 153, 84, 1, 149, 156, + 84, 1, 251, 10, 76, 84, 1, 219, 253, 76, 84, 1, 76, 84, 1, 254, 210, 84, + 1, 251, 10, 78, 84, 1, 219, 253, 78, 84, 1, 78, 84, 1, 253, 200, 84, 1, + 176, 84, 1, 234, 138, 84, 1, 243, 142, 84, 1, 243, 0, 84, 1, 229, 82, 84, + 1, 251, 41, 84, 1, 250, 165, 84, 1, 235, 147, 84, 1, 235, 120, 84, 1, + 227, 169, 84, 1, 215, 157, 84, 1, 215, 145, 84, 1, 248, 143, 84, 1, 248, + 127, 84, 1, 228, 115, 84, 1, 217, 106, 84, 1, 216, 209, 84, 1, 248, 229, + 84, 1, 248, 33, 84, 1, 198, 84, 1, 228, 97, 84, 1, 191, 84, 1, 225, 150, + 84, 1, 252, 199, 84, 1, 252, 26, 84, 1, 186, 84, 1, 192, 84, 1, 205, 84, + 1, 222, 181, 84, 1, 233, 141, 84, 1, 232, 190, 84, 1, 232, 181, 84, 1, + 214, 27, 84, 1, 220, 104, 84, 1, 218, 225, 84, 1, 206, 84, 1, 162, 84, + 25, 5, 226, 238, 84, 25, 5, 226, 185, 84, 5, 227, 209, 84, 5, 253, 183, + 84, 25, 5, 255, 82, 84, 25, 5, 74, 84, 25, 5, 236, 40, 84, 25, 5, 69, 84, + 25, 5, 214, 118, 84, 25, 5, 149, 153, 84, 25, 5, 149, 222, 182, 84, 25, + 5, 251, 10, 76, 84, 25, 5, 219, 253, 76, 84, 25, 5, 76, 84, 25, 5, 254, + 210, 84, 25, 5, 251, 10, 78, 84, 25, 5, 219, 253, 78, 84, 25, 5, 78, 84, + 25, 5, 253, 200, 84, 5, 213, 152, 84, 25, 5, 224, 188, 76, 84, 25, 5, + 253, 179, 84, 226, 208, 84, 218, 113, 5, 214, 216, 84, 218, 113, 5, 254, + 85, 84, 242, 144, 255, 23, 84, 255, 12, 255, 23, 84, 25, 5, 251, 10, 200, + 76, 84, 25, 5, 214, 214, 84, 25, 5, 214, 117, 84, 1, 224, 91, 84, 1, 234, + 121, 84, 1, 242, 233, 84, 1, 210, 116, 84, 1, 248, 132, 84, 1, 223, 42, + 84, 1, 244, 204, 84, 1, 210, 168, 84, 1, 149, 222, 182, 84, 1, 149, 232, + 191, 84, 25, 5, 149, 156, 84, 25, 5, 149, 232, 191, 84, 248, 186, 84, 52, + 248, 186, 84, 21, 210, 86, 84, 21, 111, 84, 21, 105, 84, 21, 158, 84, 21, + 161, 84, 21, 190, 84, 21, 195, 84, 21, 199, 84, 21, 196, 84, 21, 201, 84, + 255, 30, 50, 84, 5, 125, 219, 19, 247, 128, 84, 1, 251, 10, 61, 84, 1, + 226, 238, 84, 1, 226, 185, 84, 1, 253, 179, 84, 1, 214, 214, 84, 1, 214, + 117, 84, 1, 210, 82, 84, 1, 114, 192, 84, 1, 243, 36, 84, 1, 235, 102, + 84, 1, 242, 187, 218, 131, 84, 1, 248, 133, 84, 1, 252, 119, 146, 5, 251, + 7, 146, 5, 254, 83, 146, 5, 213, 147, 146, 1, 61, 146, 1, 255, 82, 146, + 1, 74, 146, 1, 236, 40, 146, 1, 69, 146, 1, 214, 118, 146, 1, 149, 153, + 146, 1, 149, 156, 146, 1, 76, 146, 1, 254, 210, 146, 1, 78, 146, 1, 253, + 200, 146, 1, 176, 146, 1, 234, 138, 146, 1, 243, 142, 146, 1, 243, 0, + 146, 1, 229, 82, 146, 1, 251, 41, 146, 1, 250, 165, 146, 1, 235, 147, + 146, 1, 235, 120, 146, 1, 227, 169, 146, 1, 215, 157, 146, 1, 215, 145, + 146, 1, 248, 143, 146, 1, 248, 127, 146, 1, 228, 115, 146, 1, 217, 106, + 146, 1, 216, 209, 146, 1, 248, 229, 146, 1, 248, 33, 146, 1, 198, 146, 1, + 191, 146, 1, 225, 150, 146, 1, 252, 199, 146, 1, 252, 26, 146, 1, 186, + 146, 1, 192, 146, 1, 205, 146, 1, 233, 141, 146, 1, 220, 104, 146, 1, + 218, 225, 146, 1, 206, 146, 1, 162, 146, 5, 227, 209, 146, 5, 253, 183, + 146, 25, 5, 255, 82, 146, 25, 5, 74, 146, 25, 5, 236, 40, 146, 25, 5, 69, + 146, 25, 5, 214, 118, 146, 25, 5, 149, 153, 146, 25, 5, 149, 222, 182, + 146, 25, 5, 76, 146, 25, 5, 254, 210, 146, 25, 5, 78, 146, 25, 5, 253, + 200, 146, 5, 213, 152, 146, 1, 234, 130, 217, 106, 146, 253, 201, 233, + 29, 79, 146, 1, 222, 181, 146, 1, 223, 42, 146, 1, 210, 168, 146, 1, 149, + 222, 182, 146, 1, 149, 232, 191, 146, 25, 5, 149, 156, 146, 25, 5, 149, + 232, 191, 146, 21, 210, 86, 146, 21, 111, 146, 21, 105, 146, 21, 158, + 146, 21, 161, 146, 21, 190, 146, 21, 195, 146, 21, 199, 146, 21, 196, + 146, 21, 201, 146, 1, 223, 191, 2, 230, 229, 248, 6, 146, 1, 223, 191, 2, + 232, 114, 248, 6, 146, 222, 120, 79, 146, 222, 120, 50, 146, 249, 106, + 227, 201, 111, 146, 249, 106, 227, 201, 105, 146, 249, 106, 227, 201, + 158, 146, 249, 106, 227, 201, 161, 146, 249, 106, 227, 201, 123, 233, 22, + 216, 202, 216, 197, 248, 56, 146, 249, 106, 248, 57, 219, 121, 146, 235, + 167, 146, 243, 110, 79, 185, 5, 255, 7, 251, 251, 185, 5, 251, 251, 185, + 5, 213, 147, 185, 1, 61, 185, 1, 255, 82, 185, 1, 74, 185, 1, 236, 40, + 185, 1, 69, 185, 1, 214, 118, 185, 1, 245, 217, 185, 1, 254, 210, 185, 1, + 226, 187, 185, 1, 253, 200, 185, 1, 176, 185, 1, 234, 138, 185, 1, 243, + 142, 185, 1, 243, 0, 185, 1, 229, 82, 185, 1, 251, 41, 185, 1, 250, 165, + 185, 1, 235, 147, 185, 1, 235, 120, 185, 1, 227, 169, 185, 1, 215, 157, + 185, 1, 215, 145, 185, 1, 248, 143, 185, 1, 248, 127, 185, 1, 228, 115, + 185, 1, 217, 106, 185, 1, 216, 209, 185, 1, 248, 229, 185, 1, 248, 33, + 185, 1, 198, 185, 1, 191, 185, 1, 225, 150, 185, 1, 252, 199, 185, 1, + 252, 26, 185, 1, 186, 185, 1, 192, 185, 1, 205, 185, 1, 233, 141, 185, 1, + 232, 190, 185, 1, 214, 27, 185, 1, 220, 104, 185, 1, 206, 185, 1, 162, + 185, 5, 227, 209, 185, 25, 5, 255, 82, 185, 25, 5, 74, 185, 25, 5, 236, + 40, 185, 25, 5, 69, 185, 25, 5, 214, 118, 185, 25, 5, 245, 217, 185, 25, + 5, 254, 210, 185, 25, 5, 226, 187, 185, 25, 5, 253, 200, 185, 5, 213, + 152, 185, 5, 214, 218, 185, 1, 234, 121, 185, 1, 242, 233, 185, 1, 210, + 116, 185, 1, 222, 181, 185, 1, 244, 204, 185, 21, 210, 86, 185, 21, 111, + 185, 21, 105, 185, 21, 158, 185, 21, 161, 185, 21, 190, 185, 21, 195, + 185, 21, 199, 185, 21, 196, 185, 21, 201, 185, 216, 75, 185, 255, 6, 185, + 235, 185, 185, 214, 146, 185, 245, 189, 226, 192, 185, 5, 211, 78, 171, + 5, 251, 7, 171, 5, 254, 83, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, + 82, 171, 1, 74, 171, 1, 236, 40, 171, 1, 69, 171, 1, 214, 118, 171, 1, + 149, 153, 171, 1, 149, 156, 171, 25, 251, 10, 76, 171, 1, 76, 171, 1, + 254, 210, 171, 25, 251, 10, 78, 171, 1, 78, 171, 1, 253, 200, 171, 1, + 176, 171, 1, 234, 138, 171, 1, 243, 142, 171, 1, 243, 0, 171, 1, 229, 82, + 171, 1, 251, 41, 171, 1, 250, 165, 171, 1, 235, 147, 171, 1, 235, 120, + 171, 1, 227, 169, 171, 1, 215, 157, 171, 1, 215, 145, 171, 1, 248, 143, + 171, 1, 248, 127, 171, 1, 228, 115, 171, 1, 217, 106, 171, 1, 216, 209, + 171, 1, 248, 229, 171, 1, 248, 33, 171, 1, 198, 171, 1, 191, 171, 1, 225, + 150, 171, 1, 252, 199, 171, 1, 252, 26, 171, 1, 186, 171, 1, 192, 171, 1, + 205, 171, 1, 233, 141, 171, 1, 232, 190, 171, 1, 214, 27, 171, 1, 220, + 104, 171, 1, 218, 225, 171, 1, 206, 171, 1, 162, 171, 5, 227, 209, 171, + 5, 253, 183, 171, 25, 5, 255, 82, 171, 25, 5, 74, 171, 25, 5, 236, 40, + 171, 25, 5, 69, 171, 25, 5, 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, + 149, 222, 182, 171, 25, 5, 251, 10, 76, 171, 25, 5, 76, 171, 25, 5, 254, + 210, 171, 25, 5, 251, 10, 78, 171, 25, 5, 78, 171, 25, 5, 253, 200, 171, + 5, 213, 152, 171, 226, 208, 171, 1, 149, 222, 182, 171, 1, 149, 232, 191, + 171, 25, 5, 149, 156, 171, 25, 5, 149, 232, 191, 171, 21, 210, 86, 171, + 21, 111, 171, 21, 105, 171, 21, 158, 171, 21, 161, 171, 21, 190, 171, 21, + 195, 171, 21, 199, 171, 21, 196, 171, 21, 201, 171, 255, 30, 50, 171, + 222, 120, 50, 157, 5, 251, 7, 157, 5, 254, 83, 157, 5, 213, 147, 157, 1, + 61, 157, 1, 255, 82, 157, 1, 74, 157, 1, 236, 40, 157, 1, 69, 157, 1, + 214, 118, 157, 1, 149, 153, 157, 1, 149, 156, 157, 1, 76, 157, 1, 254, + 210, 157, 1, 78, 157, 1, 253, 200, 157, 1, 176, 157, 1, 234, 138, 157, 1, + 243, 142, 157, 1, 243, 0, 157, 1, 229, 82, 157, 1, 251, 41, 157, 1, 250, + 165, 157, 1, 235, 147, 157, 1, 235, 120, 157, 1, 227, 169, 157, 1, 215, + 157, 157, 1, 215, 145, 157, 1, 248, 143, 157, 1, 248, 127, 157, 1, 228, + 115, 157, 1, 217, 106, 157, 1, 216, 209, 157, 1, 248, 229, 157, 1, 248, + 33, 157, 1, 198, 157, 1, 191, 157, 1, 225, 150, 157, 1, 252, 199, 157, 1, + 252, 26, 157, 1, 186, 157, 1, 192, 157, 1, 205, 157, 1, 233, 141, 157, 1, + 232, 190, 157, 1, 214, 27, 157, 1, 220, 104, 157, 1, 218, 225, 157, 1, + 206, 157, 1, 162, 157, 5, 227, 209, 157, 5, 253, 183, 157, 25, 5, 255, + 82, 157, 25, 5, 74, 157, 25, 5, 236, 40, 157, 25, 5, 69, 157, 25, 5, 214, + 118, 157, 25, 5, 149, 153, 157, 25, 5, 149, 222, 182, 157, 25, 5, 76, + 157, 25, 5, 254, 210, 157, 25, 5, 78, 157, 25, 5, 253, 200, 157, 5, 213, + 152, 157, 254, 211, 233, 29, 79, 157, 253, 201, 233, 29, 79, 157, 1, 222, + 181, 157, 1, 223, 42, 157, 1, 210, 168, 157, 1, 149, 222, 182, 157, 1, + 149, 232, 191, 157, 25, 5, 149, 156, 157, 25, 5, 149, 232, 191, 157, 21, + 210, 86, 157, 21, 111, 157, 21, 105, 157, 21, 158, 157, 21, 161, 157, 21, + 190, 157, 21, 195, 157, 21, 199, 157, 21, 196, 157, 21, 201, 157, 235, + 167, 157, 1, 212, 65, 157, 244, 10, 123, 224, 24, 157, 244, 10, 123, 242, + 34, 157, 244, 10, 134, 224, 22, 157, 244, 10, 123, 219, 119, 157, 244, + 10, 123, 245, 196, 157, 244, 10, 134, 219, 118, 36, 5, 254, 83, 36, 5, + 213, 147, 36, 1, 61, 36, 1, 255, 82, 36, 1, 74, 36, 1, 236, 40, 36, 1, + 69, 36, 1, 214, 118, 36, 1, 76, 36, 1, 245, 217, 36, 1, 254, 210, 36, 1, + 78, 36, 1, 226, 187, 36, 1, 253, 200, 36, 1, 176, 36, 1, 229, 82, 36, 1, + 251, 41, 36, 1, 235, 147, 36, 1, 227, 169, 36, 1, 215, 157, 36, 1, 228, + 115, 36, 1, 217, 106, 36, 1, 198, 36, 1, 228, 97, 36, 1, 191, 36, 1, 186, + 36, 1, 192, 36, 1, 205, 36, 1, 222, 181, 36, 1, 233, 141, 36, 1, 232, + 190, 36, 1, 232, 181, 36, 1, 214, 27, 36, 1, 220, 104, 36, 1, 218, 225, + 36, 1, 206, 36, 1, 162, 36, 25, 5, 255, 82, 36, 25, 5, 74, 36, 25, 5, + 236, 40, 36, 25, 5, 69, 36, 25, 5, 214, 118, 36, 25, 5, 76, 36, 25, 5, + 245, 217, 36, 25, 5, 254, 210, 36, 25, 5, 78, 36, 25, 5, 226, 187, 36, + 25, 5, 253, 200, 36, 5, 213, 152, 36, 226, 208, 36, 253, 201, 233, 29, + 79, 36, 21, 210, 86, 36, 21, 111, 36, 21, 105, 36, 21, 158, 36, 21, 161, + 36, 21, 190, 36, 21, 195, 36, 21, 199, 36, 21, 196, 36, 21, 201, 36, 54, + 216, 248, 36, 54, 123, 240, 217, 36, 54, 123, 216, 148, 36, 248, 154, 50, + 36, 230, 140, 50, 36, 211, 45, 50, 36, 248, 95, 50, 36, 249, 147, 50, 36, + 253, 246, 72, 50, 36, 222, 120, 50, 36, 54, 50, 148, 5, 251, 7, 148, 5, + 254, 83, 148, 5, 213, 147, 148, 1, 61, 148, 1, 255, 82, 148, 1, 74, 148, + 1, 236, 40, 148, 1, 69, 148, 1, 214, 118, 148, 1, 149, 153, 148, 1, 149, + 156, 148, 1, 76, 148, 1, 245, 217, 148, 1, 254, 210, 148, 1, 78, 148, 1, + 226, 187, 148, 1, 253, 200, 148, 1, 176, 148, 1, 234, 138, 148, 1, 243, + 142, 148, 1, 243, 0, 148, 1, 229, 82, 148, 1, 251, 41, 148, 1, 250, 165, + 148, 1, 235, 147, 148, 1, 235, 120, 148, 1, 227, 169, 148, 1, 215, 157, + 148, 1, 215, 145, 148, 1, 248, 143, 148, 1, 248, 127, 148, 1, 228, 115, + 148, 1, 217, 106, 148, 1, 216, 209, 148, 1, 248, 229, 148, 1, 248, 33, + 148, 1, 198, 148, 1, 191, 148, 1, 225, 150, 148, 1, 252, 199, 148, 1, + 252, 26, 148, 1, 186, 148, 1, 192, 148, 1, 205, 148, 1, 222, 181, 148, 1, + 233, 141, 148, 1, 232, 190, 148, 1, 214, 27, 148, 1, 220, 104, 148, 1, + 218, 225, 148, 1, 206, 148, 1, 162, 148, 5, 253, 183, 148, 25, 5, 255, + 82, 148, 25, 5, 74, 148, 25, 5, 236, 40, 148, 25, 5, 69, 148, 25, 5, 214, + 118, 148, 25, 5, 149, 153, 148, 25, 5, 149, 222, 182, 148, 25, 5, 76, + 148, 25, 5, 245, 217, 148, 25, 5, 254, 210, 148, 25, 5, 78, 148, 25, 5, + 226, 187, 148, 25, 5, 253, 200, 148, 5, 213, 152, 148, 233, 29, 79, 148, + 254, 211, 233, 29, 79, 148, 1, 215, 184, 148, 1, 246, 46, 148, 1, 149, + 222, 182, 148, 1, 149, 232, 191, 148, 25, 5, 149, 156, 148, 25, 5, 149, + 232, 191, 148, 21, 210, 86, 148, 21, 111, 148, 21, 105, 148, 21, 158, + 148, 21, 161, 148, 21, 190, 148, 21, 195, 148, 21, 199, 148, 21, 196, + 148, 21, 201, 148, 244, 10, 21, 210, 87, 31, 226, 241, 224, 226, 64, 161, + 148, 244, 10, 21, 123, 31, 226, 241, 224, 226, 64, 161, 148, 244, 10, 21, + 113, 31, 226, 241, 224, 226, 64, 161, 148, 244, 10, 21, 134, 31, 226, + 241, 224, 226, 64, 161, 148, 244, 10, 21, 123, 31, 245, 50, 224, 226, 64, + 161, 148, 244, 10, 21, 113, 31, 245, 50, 224, 226, 64, 161, 148, 244, 10, + 21, 134, 31, 245, 50, 224, 226, 64, 161, 148, 5, 215, 84, 165, 5, 254, + 83, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255, 82, 165, 1, 74, 165, 1, + 236, 40, 165, 1, 69, 165, 1, 214, 118, 165, 1, 149, 153, 165, 1, 149, + 156, 165, 1, 76, 165, 1, 245, 217, 165, 1, 254, 210, 165, 1, 78, 165, 1, + 226, 187, 165, 1, 253, 200, 165, 1, 176, 165, 1, 234, 138, 165, 1, 243, + 142, 165, 1, 243, 0, 165, 1, 229, 82, 165, 1, 251, 41, 165, 1, 250, 165, + 165, 1, 235, 147, 165, 1, 235, 120, 165, 1, 227, 169, 165, 1, 215, 157, + 165, 1, 215, 145, 165, 1, 248, 143, 165, 1, 248, 127, 165, 1, 228, 115, + 165, 1, 217, 106, 165, 1, 216, 209, 165, 1, 248, 229, 165, 1, 248, 33, + 165, 1, 198, 165, 1, 191, 165, 1, 225, 150, 165, 1, 252, 199, 165, 1, + 252, 26, 165, 1, 186, 165, 1, 192, 165, 1, 205, 165, 1, 222, 181, 165, 1, + 233, 141, 165, 1, 232, 190, 165, 1, 214, 27, 165, 1, 220, 104, 165, 1, + 218, 225, 165, 1, 206, 165, 1, 162, 165, 5, 227, 209, 165, 5, 253, 183, + 165, 25, 5, 255, 82, 165, 25, 5, 74, 165, 25, 5, 236, 40, 165, 25, 5, 69, + 165, 25, 5, 214, 118, 165, 25, 5, 149, 153, 165, 25, 5, 149, 222, 182, + 165, 25, 5, 76, 165, 25, 5, 245, 217, 165, 25, 5, 254, 210, 165, 25, 5, + 78, 165, 25, 5, 226, 187, 165, 25, 5, 253, 200, 165, 5, 213, 152, 165, + 233, 29, 79, 165, 254, 211, 233, 29, 79, 165, 1, 244, 204, 165, 1, 149, + 222, 182, 165, 1, 149, 232, 191, 165, 25, 5, 149, 156, 165, 25, 5, 149, + 232, 191, 165, 21, 210, 86, 165, 21, 111, 165, 21, 105, 165, 21, 158, + 165, 21, 161, 165, 21, 190, 165, 21, 195, 165, 21, 199, 165, 21, 196, + 165, 21, 201, 165, 5, 235, 108, 165, 5, 214, 161, 136, 5, 254, 83, 136, + 5, 213, 147, 136, 1, 61, 136, 1, 255, 82, 136, 1, 74, 136, 1, 236, 40, + 136, 1, 69, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1, 149, 156, 136, 1, + 76, 136, 1, 245, 217, 136, 1, 254, 210, 136, 1, 78, 136, 1, 226, 187, + 136, 1, 253, 200, 136, 1, 176, 136, 1, 234, 138, 136, 1, 243, 142, 136, + 1, 243, 0, 136, 1, 229, 82, 136, 1, 251, 41, 136, 1, 250, 165, 136, 1, + 235, 147, 136, 1, 235, 120, 136, 1, 227, 169, 136, 1, 215, 157, 136, 1, + 215, 145, 136, 1, 248, 143, 136, 1, 248, 127, 136, 1, 228, 115, 136, 1, + 217, 106, 136, 1, 216, 209, 136, 1, 248, 229, 136, 1, 248, 33, 136, 1, + 198, 136, 1, 228, 97, 136, 1, 191, 136, 1, 225, 150, 136, 1, 252, 199, + 136, 1, 252, 26, 136, 1, 186, 136, 1, 192, 136, 1, 205, 136, 1, 222, 181, + 136, 1, 233, 141, 136, 1, 232, 190, 136, 1, 232, 181, 136, 1, 214, 27, + 136, 1, 220, 104, 136, 1, 218, 225, 136, 1, 206, 136, 1, 162, 136, 1, + 215, 126, 136, 5, 253, 183, 136, 25, 5, 255, 82, 136, 25, 5, 74, 136, 25, + 5, 236, 40, 136, 25, 5, 69, 136, 25, 5, 214, 118, 136, 25, 5, 149, 153, + 136, 25, 5, 149, 222, 182, 136, 25, 5, 76, 136, 25, 5, 245, 217, 136, 25, + 5, 254, 210, 136, 25, 5, 78, 136, 25, 5, 226, 187, 136, 25, 5, 253, 200, + 136, 5, 213, 152, 136, 1, 59, 223, 76, 136, 253, 201, 233, 29, 79, 136, + 1, 149, 222, 182, 136, 1, 149, 232, 191, 136, 25, 5, 149, 156, 136, 25, + 5, 149, 232, 191, 136, 21, 210, 86, 136, 21, 111, 136, 21, 105, 136, 21, + 158, 136, 21, 161, 136, 21, 190, 136, 21, 195, 136, 21, 199, 136, 21, + 196, 136, 21, 201, 136, 54, 216, 248, 136, 54, 123, 240, 217, 136, 54, + 123, 216, 148, 136, 244, 10, 123, 224, 24, 136, 244, 10, 123, 242, 34, + 136, 244, 10, 134, 224, 22, 136, 248, 158, 79, 136, 1, 250, 107, 228, + 116, 136, 1, 250, 107, 230, 30, 136, 1, 250, 107, 222, 182, 136, 1, 250, + 107, 156, 136, 1, 250, 107, 232, 191, 136, 1, 250, 107, 235, 29, 175, 5, + 254, 82, 175, 5, 213, 146, 175, 1, 253, 173, 175, 1, 255, 36, 175, 1, + 254, 232, 175, 1, 254, 247, 175, 1, 235, 157, 175, 1, 236, 39, 175, 1, + 214, 110, 175, 1, 214, 112, 175, 1, 235, 180, 175, 1, 235, 181, 175, 1, + 236, 25, 175, 1, 236, 27, 175, 1, 245, 25, 175, 1, 245, 212, 175, 1, 254, + 197, 175, 1, 226, 112, 175, 1, 226, 181, 175, 1, 253, 186, 175, 1, 254, + 154, 234, 193, 175, 1, 231, 214, 234, 193, 175, 1, 254, 154, 243, 89, + 175, 1, 231, 214, 243, 89, 175, 1, 234, 235, 229, 227, 175, 1, 221, 238, + 243, 89, 175, 1, 254, 154, 250, 224, 175, 1, 231, 214, 250, 224, 175, 1, + 254, 154, 235, 133, 175, 1, 231, 214, 235, 133, 175, 1, 217, 99, 229, + 227, 175, 1, 217, 99, 221, 237, 229, 228, 175, 1, 221, 238, 235, 133, + 175, 1, 254, 154, 215, 153, 175, 1, 231, 214, 215, 153, 175, 1, 254, 154, + 248, 134, 175, 1, 231, 214, 248, 134, 175, 1, 230, 58, 229, 185, 175, 1, + 221, 238, 248, 134, 175, 1, 254, 154, 217, 31, 175, 1, 231, 214, 217, 31, + 175, 1, 254, 154, 248, 152, 175, 1, 231, 214, 248, 152, 175, 1, 248, 182, + 229, 185, 175, 1, 221, 238, 248, 152, 175, 1, 254, 154, 225, 232, 175, 1, + 231, 214, 225, 232, 175, 1, 254, 154, 252, 120, 175, 1, 231, 214, 252, + 120, 175, 1, 231, 136, 175, 1, 254, 139, 252, 120, 175, 1, 211, 51, 175, + 1, 223, 136, 175, 1, 248, 182, 233, 73, 175, 1, 214, 1, 175, 1, 217, 99, + 221, 212, 175, 1, 230, 58, 221, 212, 175, 1, 248, 182, 221, 212, 175, 1, + 241, 249, 175, 1, 230, 58, 233, 73, 175, 1, 244, 164, 175, 5, 254, 186, + 175, 25, 5, 254, 242, 175, 25, 5, 234, 161, 254, 249, 175, 25, 5, 247, + 236, 254, 249, 175, 25, 5, 234, 161, 235, 177, 175, 25, 5, 247, 236, 235, + 177, 175, 25, 5, 234, 161, 226, 92, 175, 25, 5, 247, 236, 226, 92, 175, + 25, 5, 243, 131, 175, 25, 5, 234, 21, 175, 25, 5, 247, 236, 234, 21, 175, + 25, 5, 234, 23, 248, 75, 175, 25, 5, 234, 22, 242, 54, 254, 242, 175, 25, + 5, 234, 22, 242, 54, 247, 236, 254, 242, 175, 25, 5, 234, 22, 242, 54, + 243, 88, 175, 25, 5, 243, 88, 175, 25, 5, 247, 236, 243, 131, 175, 25, 5, + 247, 236, 243, 88, 175, 224, 144, 233, 213, 168, 135, 234, 35, 234, 252, + 168, 135, 234, 112, 234, 134, 168, 135, 234, 112, 234, 105, 168, 135, + 234, 112, 234, 101, 168, 135, 234, 112, 234, 109, 168, 135, 234, 112, + 223, 157, 168, 135, 229, 10, 228, 253, 168, 135, 250, 95, 250, 155, 168, + 135, 250, 95, 250, 103, 168, 135, 250, 95, 250, 154, 168, 135, 219, 61, + 219, 60, 168, 135, 250, 95, 250, 91, 168, 135, 210, 245, 210, 252, 168, + 135, 247, 154, 250, 162, 168, 135, 216, 43, 225, 242, 168, 135, 216, 158, + 216, 201, 168, 135, 216, 158, 229, 206, 168, 135, 216, 158, 225, 114, + 168, 135, 228, 80, 229, 103, 168, 135, 247, 154, 248, 76, 168, 135, 216, + 43, 217, 56, 168, 135, 216, 158, 216, 132, 168, 135, 216, 158, 216, 205, + 168, 135, 216, 158, 216, 155, 168, 135, 228, 80, 227, 242, 168, 135, 251, + 214, 252, 172, 168, 135, 225, 20, 225, 45, 168, 135, 225, 125, 225, 116, + 168, 135, 244, 52, 244, 204, 168, 135, 225, 125, 225, 144, 168, 135, 244, + 52, 244, 181, 168, 135, 225, 125, 221, 249, 168, 135, 230, 167, 186, 168, + 135, 210, 245, 211, 79, 168, 135, 222, 214, 222, 141, 168, 135, 222, 142, + 168, 135, 232, 163, 232, 212, 168, 135, 232, 103, 168, 135, 211, 228, + 212, 61, 168, 135, 219, 61, 222, 8, 168, 135, 219, 61, 222, 116, 168, + 135, 219, 61, 218, 83, 168, 135, 241, 76, 241, 166, 168, 135, 232, 163, + 250, 76, 168, 135, 144, 254, 123, 168, 135, 241, 76, 228, 75, 168, 135, + 226, 72, 168, 135, 221, 232, 61, 168, 135, 231, 209, 242, 24, 168, 135, + 221, 232, 255, 82, 168, 135, 221, 232, 254, 144, 168, 135, 221, 232, 74, + 168, 135, 221, 232, 236, 40, 168, 135, 221, 232, 214, 214, 168, 135, 221, + 232, 214, 212, 168, 135, 221, 232, 69, 168, 135, 221, 232, 214, 118, 168, + 135, 225, 127, 168, 249, 106, 16, 252, 173, 168, 135, 221, 232, 76, 168, + 135, 221, 232, 254, 252, 168, 135, 221, 232, 78, 168, 135, 221, 232, 254, + 211, 231, 203, 168, 135, 221, 232, 254, 211, 231, 204, 168, 135, 233, + 112, 168, 135, 231, 200, 168, 135, 231, 201, 168, 135, 231, 209, 245, + 188, 168, 135, 231, 209, 216, 157, 168, 135, 231, 209, 215, 229, 168, + 135, 231, 209, 250, 143, 168, 135, 216, 199, 168, 135, 228, 210, 168, + 135, 211, 73, 168, 135, 244, 43, 168, 21, 210, 86, 168, 21, 111, 168, 21, + 105, 168, 21, 158, 168, 21, 161, 168, 21, 190, 168, 21, 195, 168, 21, + 199, 168, 21, 196, 168, 21, 201, 168, 135, 254, 119, 168, 135, 234, 110, + 209, 209, 1, 234, 34, 209, 209, 1, 234, 112, 218, 36, 209, 209, 1, 234, + 112, 217, 63, 209, 209, 1, 229, 9, 209, 209, 1, 249, 246, 209, 209, 1, + 219, 61, 217, 63, 209, 209, 1, 227, 138, 209, 209, 1, 247, 153, 209, 209, + 1, 112, 209, 209, 1, 216, 158, 218, 36, 209, 209, 1, 216, 158, 217, 63, + 209, 209, 1, 228, 79, 209, 209, 1, 251, 213, 209, 209, 1, 225, 19, 209, + 209, 1, 225, 125, 218, 36, 209, 209, 1, 244, 52, 217, 63, 209, 209, 1, + 225, 125, 217, 63, 209, 209, 1, 244, 52, 218, 36, 209, 209, 1, 230, 166, + 209, 209, 1, 210, 244, 209, 209, 1, 232, 163, 232, 212, 209, 209, 1, 232, + 163, 232, 127, 209, 209, 1, 211, 227, 209, 209, 1, 219, 61, 218, 36, 209, + 209, 1, 241, 76, 218, 36, 209, 209, 1, 78, 209, 209, 1, 241, 76, 217, 63, + 209, 209, 245, 171, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 209, 234, + 240, 209, 209, 25, 5, 255, 82, 209, 209, 25, 5, 254, 144, 209, 209, 25, + 5, 74, 209, 209, 25, 5, 236, 40, 209, 209, 25, 5, 211, 117, 209, 209, 25, + 5, 210, 169, 209, 209, 25, 5, 69, 209, 209, 25, 5, 214, 118, 209, 209, + 25, 5, 231, 209, 234, 19, 209, 209, 220, 147, 5, 232, 162, 209, 209, 220, + 147, 5, 227, 138, 209, 209, 25, 5, 76, 209, 209, 25, 5, 245, 203, 209, + 209, 25, 5, 78, 209, 209, 25, 5, 253, 175, 209, 209, 25, 5, 254, 210, + 209, 209, 234, 35, 233, 141, 209, 209, 138, 231, 209, 245, 188, 209, 209, + 138, 231, 209, 216, 157, 209, 209, 138, 231, 209, 216, 118, 209, 209, + 138, 231, 209, 250, 231, 209, 209, 251, 12, 79, 209, 209, 228, 219, 209, + 209, 21, 210, 86, 209, 209, 21, 111, 209, 209, 21, 105, 209, 209, 21, + 158, 209, 209, 21, 161, 209, 209, 21, 190, 209, 209, 21, 195, 209, 209, + 21, 199, 209, 209, 21, 196, 209, 209, 21, 201, 209, 209, 241, 76, 228, + 79, 209, 209, 241, 76, 230, 166, 209, 209, 1, 234, 113, 242, 181, 209, + 209, 1, 234, 113, 227, 138, 63, 3, 226, 208, 63, 164, 242, 122, 211, 0, + 230, 253, 215, 190, 61, 63, 164, 242, 122, 211, 0, 230, 253, 255, 168, + 222, 218, 252, 85, 186, 63, 164, 242, 122, 211, 0, 230, 253, 255, 168, + 242, 122, 215, 174, 186, 63, 164, 65, 211, 0, 230, 253, 231, 98, 186, 63, + 164, 250, 4, 211, 0, 230, 253, 220, 111, 186, 63, 164, 250, 247, 211, 0, + 230, 253, 225, 115, 220, 98, 186, 63, 164, 211, 0, 230, 253, 215, 174, + 220, 98, 186, 63, 164, 221, 210, 220, 97, 63, 164, 251, 136, 211, 0, 230, + 252, 63, 164, 251, 231, 220, 5, 211, 0, 230, 252, 63, 164, 235, 204, 215, + 173, 63, 164, 248, 69, 215, 174, 251, 135, 63, 164, 220, 97, 63, 164, + 227, 143, 220, 97, 63, 164, 215, 174, 220, 97, 63, 164, 227, 143, 215, + 174, 220, 97, 63, 164, 222, 239, 250, 130, 218, 238, 220, 97, 63, 164, + 223, 45, 242, 153, 220, 97, 63, 164, 250, 247, 255, 172, 222, 146, 231, + 97, 200, 251, 15, 63, 164, 242, 122, 215, 173, 63, 232, 150, 5, 250, 163, + 222, 145, 63, 232, 150, 5, 233, 2, 222, 145, 63, 253, 220, 5, 220, 107, + 243, 72, 255, 173, 222, 145, 63, 253, 220, 5, 255, 170, 191, 63, 253, + 220, 5, 221, 184, 215, 169, 63, 5, 223, 133, 247, 167, 243, 71, 63, 5, + 223, 133, 247, 167, 242, 183, 63, 5, 223, 133, 247, 167, 242, 123, 63, 5, + 223, 133, 229, 224, 243, 71, 63, 5, 223, 133, 229, 224, 242, 183, 63, 5, + 223, 133, 247, 167, 223, 133, 229, 223, 63, 21, 210, 86, 63, 21, 111, 63, + 21, 105, 63, 21, 158, 63, 21, 161, 63, 21, 190, 63, 21, 195, 63, 21, 199, + 63, 21, 196, 63, 21, 201, 63, 21, 163, 111, 63, 21, 163, 105, 63, 21, + 163, 158, 63, 21, 163, 161, 63, 21, 163, 190, 63, 21, 163, 195, 63, 21, + 163, 199, 63, 21, 163, 196, 63, 21, 163, 201, 63, 21, 163, 210, 86, 63, + 164, 251, 138, 222, 145, 63, 164, 229, 73, 251, 76, 227, 153, 210, 25, + 63, 164, 250, 247, 255, 172, 222, 146, 251, 77, 230, 207, 251, 15, 63, + 164, 229, 73, 251, 76, 220, 108, 222, 145, 63, 164, 250, 140, 230, 252, + 63, 164, 215, 185, 255, 169, 63, 164, 242, 107, 222, 146, 242, 70, 63, + 164, 242, 107, 222, 146, 242, 76, 63, 164, 254, 124, 234, 129, 242, 70, + 63, 164, 254, 124, 234, 129, 242, 76, 63, 5, 211, 65, 215, 172, 63, 5, + 231, 172, 215, 172, 63, 1, 176, 63, 1, 234, 138, 63, 1, 243, 142, 63, 1, + 243, 0, 63, 1, 229, 82, 63, 1, 251, 41, 63, 1, 250, 165, 63, 1, 235, 147, + 63, 1, 227, 169, 63, 1, 215, 157, 63, 1, 215, 145, 63, 1, 248, 143, 63, + 1, 248, 127, 63, 1, 228, 115, 63, 1, 217, 106, 63, 1, 216, 209, 63, 1, + 248, 229, 63, 1, 248, 33, 63, 1, 198, 63, 1, 191, 63, 1, 225, 150, 63, 1, + 252, 199, 63, 1, 252, 26, 63, 1, 186, 63, 1, 215, 184, 63, 1, 215, 176, + 63, 1, 246, 46, 63, 1, 246, 41, 63, 1, 212, 65, 63, 1, 210, 82, 63, 1, + 210, 116, 63, 1, 255, 175, 63, 1, 192, 63, 1, 205, 63, 1, 233, 141, 63, + 1, 220, 104, 63, 1, 218, 225, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63, 1, + 233, 237, 63, 1, 244, 85, 205, 63, 1, 234, 52, 63, 1, 222, 181, 63, 25, + 5, 255, 82, 63, 25, 5, 74, 63, 25, 5, 236, 40, 63, 25, 5, 69, 63, 25, 5, + 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 182, 63, 25, 5, 149, + 156, 63, 25, 5, 149, 232, 191, 63, 25, 5, 76, 63, 25, 5, 245, 217, 63, + 25, 5, 78, 63, 25, 5, 226, 187, 63, 5, 222, 224, 218, 85, 229, 83, 222, + 213, 63, 5, 222, 218, 252, 84, 63, 25, 5, 223, 52, 74, 63, 25, 5, 223, + 52, 236, 40, 63, 5, 227, 153, 210, 26, 229, 231, 248, 229, 63, 5, 219, + 73, 233, 66, 63, 164, 242, 36, 63, 164, 226, 61, 63, 5, 233, 69, 222, + 145, 63, 5, 211, 70, 222, 145, 63, 5, 233, 70, 215, 185, 251, 15, 63, 5, + 231, 100, 251, 15, 63, 5, 242, 126, 251, 16, 223, 43, 63, 5, 242, 126, + 231, 90, 223, 43, 63, 5, 235, 200, 231, 100, 251, 15, 63, 218, 74, 5, + 233, 70, 215, 185, 251, 15, 63, 218, 74, 5, 231, 100, 251, 15, 63, 218, + 74, 5, 235, 200, 231, 100, 251, 15, 63, 218, 74, 1, 176, 63, 218, 74, 1, + 234, 138, 63, 218, 74, 1, 243, 142, 63, 218, 74, 1, 243, 0, 63, 218, 74, + 1, 229, 82, 63, 218, 74, 1, 251, 41, 63, 218, 74, 1, 250, 165, 63, 218, + 74, 1, 235, 147, 63, 218, 74, 1, 227, 169, 63, 218, 74, 1, 215, 157, 63, + 218, 74, 1, 215, 145, 63, 218, 74, 1, 248, 143, 63, 218, 74, 1, 248, 127, + 63, 218, 74, 1, 228, 115, 63, 218, 74, 1, 217, 106, 63, 218, 74, 1, 216, + 209, 63, 218, 74, 1, 248, 229, 63, 218, 74, 1, 248, 33, 63, 218, 74, 1, + 198, 63, 218, 74, 1, 191, 63, 218, 74, 1, 225, 150, 63, 218, 74, 1, 252, + 199, 63, 218, 74, 1, 252, 26, 63, 218, 74, 1, 186, 63, 218, 74, 1, 215, + 184, 63, 218, 74, 1, 215, 176, 63, 218, 74, 1, 246, 46, 63, 218, 74, 1, + 246, 41, 63, 218, 74, 1, 212, 65, 63, 218, 74, 1, 210, 82, 63, 218, 74, + 1, 210, 116, 63, 218, 74, 1, 255, 175, 63, 218, 74, 1, 192, 63, 218, 74, + 1, 205, 63, 218, 74, 1, 233, 141, 63, 218, 74, 1, 220, 104, 63, 218, 74, + 1, 218, 225, 63, 218, 74, 1, 206, 63, 218, 74, 1, 162, 63, 218, 74, 1, + 61, 63, 218, 74, 1, 233, 237, 63, 218, 74, 1, 244, 85, 212, 65, 63, 218, + 74, 1, 244, 85, 192, 63, 218, 74, 1, 244, 85, 205, 63, 233, 224, 222, + 143, 234, 138, 63, 233, 224, 222, 143, 234, 139, 251, 77, 230, 207, 251, + 15, 63, 251, 4, 5, 114, 252, 78, 63, 251, 4, 5, 193, 252, 78, 63, 251, 4, + 5, 251, 5, 217, 21, 63, 251, 4, 5, 221, 209, 255, 174, 63, 16, 246, 99, + 251, 133, 63, 16, 223, 132, 222, 225, 63, 16, 226, 81, 243, 70, 63, 16, + 223, 132, 222, 226, 223, 45, 242, 152, 63, 16, 225, 115, 191, 63, 16, + 228, 64, 251, 133, 63, 16, 228, 64, 251, 134, 227, 143, 255, 171, 63, 16, + 228, 64, 251, 134, 242, 124, 255, 171, 63, 16, 228, 64, 251, 134, 251, + 77, 255, 171, 63, 5, 223, 133, 229, 224, 223, 133, 247, 166, 63, 5, 223, + 133, 229, 224, 242, 123, 63, 164, 251, 137, 220, 5, 242, 222, 230, 253, + 223, 44, 63, 164, 230, 168, 211, 0, 242, 222, 230, 253, 223, 44, 63, 164, + 227, 143, 215, 173, 63, 164, 65, 251, 160, 222, 215, 211, 0, 230, 253, + 231, 98, 186, 63, 164, 250, 4, 251, 160, 222, 215, 211, 0, 230, 253, 220, + 111, 186, 222, 253, 218, 0, 50, 233, 51, 218, 0, 50, 222, 253, 218, 0, 5, + 2, 247, 126, 233, 51, 218, 0, 5, 2, 247, 126, 63, 164, 233, 61, 231, 101, + 222, 145, 63, 164, 215, 251, 231, 101, 222, 145, 68, 1, 176, 68, 1, 234, + 138, 68, 1, 243, 142, 68, 1, 243, 0, 68, 1, 229, 82, 68, 1, 251, 41, 68, + 1, 250, 165, 68, 1, 235, 147, 68, 1, 235, 120, 68, 1, 227, 169, 68, 1, + 228, 81, 68, 1, 215, 157, 68, 1, 215, 145, 68, 1, 248, 143, 68, 1, 248, + 127, 68, 1, 228, 115, 68, 1, 217, 106, 68, 1, 216, 209, 68, 1, 248, 229, + 68, 1, 248, 33, 68, 1, 198, 68, 1, 191, 68, 1, 225, 150, 68, 1, 252, 199, + 68, 1, 252, 26, 68, 1, 186, 68, 1, 192, 68, 1, 205, 68, 1, 233, 141, 68, + 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1, 232, 190, 68, 1, 61, 68, 1, + 220, 88, 61, 68, 1, 74, 68, 1, 236, 40, 68, 1, 69, 68, 1, 214, 118, 68, + 1, 76, 68, 1, 230, 156, 76, 68, 1, 78, 68, 1, 253, 200, 68, 25, 5, 217, + 65, 255, 82, 68, 25, 5, 255, 82, 68, 25, 5, 74, 68, 25, 5, 236, 40, 68, + 25, 5, 69, 68, 25, 5, 214, 118, 68, 25, 5, 76, 68, 25, 5, 254, 210, 68, + 25, 5, 230, 156, 236, 40, 68, 25, 5, 230, 156, 78, 68, 25, 5, 160, 48, + 68, 5, 254, 83, 68, 5, 59, 51, 68, 5, 213, 147, 68, 5, 213, 152, 68, 5, + 253, 243, 68, 117, 5, 147, 192, 68, 117, 5, 147, 205, 68, 117, 5, 147, + 212, 65, 68, 117, 5, 147, 162, 68, 1, 242, 139, 206, 68, 21, 210, 86, 68, + 21, 111, 68, 21, 105, 68, 21, 158, 68, 21, 161, 68, 21, 190, 68, 21, 195, + 68, 21, 199, 68, 21, 196, 68, 21, 201, 68, 5, 232, 198, 221, 174, 68, 5, + 221, 174, 68, 16, 232, 159, 68, 16, 249, 221, 68, 16, 254, 229, 68, 16, + 243, 55, 68, 1, 220, 104, 68, 1, 218, 225, 68, 1, 149, 153, 68, 1, 149, + 222, 182, 68, 1, 149, 156, 68, 1, 149, 232, 191, 68, 25, 5, 149, 153, 68, + 25, 5, 149, 222, 182, 68, 25, 5, 149, 156, 68, 25, 5, 149, 232, 191, 68, + 1, 230, 156, 229, 82, 68, 1, 230, 156, 235, 120, 68, 1, 230, 156, 252, + 119, 68, 1, 230, 156, 252, 114, 68, 117, 5, 230, 156, 147, 198, 68, 117, + 5, 230, 156, 147, 186, 68, 117, 5, 230, 156, 147, 233, 141, 68, 1, 220, + 110, 234, 219, 220, 104, 68, 25, 5, 220, 110, 234, 219, 245, 63, 68, 138, + 164, 220, 110, 234, 219, 241, 254, 68, 138, 164, 220, 110, 234, 219, 234, + 189, 225, 124, 68, 1, 212, 7, 224, 111, 234, 219, 216, 209, 68, 1, 212, + 7, 224, 111, 234, 219, 224, 117, 68, 25, 5, 212, 7, 224, 111, 234, 219, + 245, 63, 68, 25, 5, 212, 7, 224, 111, 234, 219, 214, 214, 68, 5, 212, 7, + 224, 111, 234, 219, 216, 30, 68, 5, 212, 7, 224, 111, 234, 219, 216, 29, + 68, 5, 212, 7, 224, 111, 234, 219, 216, 28, 68, 5, 212, 7, 224, 111, 234, + 219, 216, 27, 68, 5, 212, 7, 224, 111, 234, 219, 216, 26, 68, 1, 245, + 227, 224, 111, 234, 219, 228, 115, 68, 1, 245, 227, 224, 111, 234, 219, + 210, 176, 68, 1, 245, 227, 224, 111, 234, 219, 242, 224, 68, 25, 5, 243, + 66, 234, 219, 74, 68, 25, 5, 234, 194, 226, 238, 68, 25, 5, 234, 194, 69, + 68, 25, 5, 234, 194, 245, 217, 68, 1, 220, 88, 176, 68, 1, 220, 88, 234, + 138, 68, 1, 220, 88, 243, 142, 68, 1, 220, 88, 251, 41, 68, 1, 220, 88, + 210, 116, 68, 1, 220, 88, 227, 169, 68, 1, 220, 88, 248, 229, 68, 1, 220, + 88, 198, 68, 1, 220, 88, 225, 150, 68, 1, 220, 88, 244, 204, 68, 1, 220, + 88, 252, 199, 68, 1, 220, 88, 216, 209, 68, 1, 220, 88, 162, 68, 117, 5, + 220, 88, 147, 212, 65, 68, 25, 5, 220, 88, 255, 82, 68, 25, 5, 220, 88, + 76, 68, 25, 5, 220, 88, 160, 48, 68, 25, 5, 220, 88, 40, 211, 117, 68, 5, + 220, 88, 216, 29, 68, 5, 220, 88, 216, 28, 68, 5, 220, 88, 216, 26, 68, + 5, 220, 88, 216, 25, 68, 5, 220, 88, 249, 160, 216, 29, 68, 5, 220, 88, + 249, 160, 216, 28, 68, 5, 220, 88, 249, 160, 245, 161, 216, 31, 68, 1, + 222, 130, 226, 67, 244, 204, 68, 5, 222, 130, 226, 67, 216, 26, 68, 220, + 88, 21, 210, 86, 68, 220, 88, 21, 111, 68, 220, 88, 21, 105, 68, 220, 88, + 21, 158, 68, 220, 88, 21, 161, 68, 220, 88, 21, 190, 68, 220, 88, 21, + 195, 68, 220, 88, 21, 199, 68, 220, 88, 21, 196, 68, 220, 88, 21, 201, + 68, 5, 234, 132, 216, 30, 68, 5, 234, 132, 216, 28, 68, 25, 5, 254, 199, + 61, 68, 25, 5, 254, 199, 254, 210, 68, 16, 220, 88, 111, 68, 16, 220, 88, + 245, 38, 98, 6, 1, 254, 131, 98, 6, 1, 252, 160, 98, 6, 1, 243, 113, 98, + 6, 1, 247, 136, 98, 6, 1, 245, 158, 98, 6, 1, 213, 160, 98, 6, 1, 210, + 89, 98, 6, 1, 217, 61, 98, 6, 1, 236, 6, 98, 6, 1, 234, 240, 98, 6, 1, + 233, 87, 98, 6, 1, 231, 190, 98, 6, 1, 229, 200, 98, 6, 1, 226, 200, 98, + 6, 1, 226, 21, 98, 6, 1, 210, 78, 98, 6, 1, 223, 174, 98, 6, 1, 221, 245, + 98, 6, 1, 217, 51, 98, 6, 1, 214, 190, 98, 6, 1, 225, 143, 98, 6, 1, 234, + 127, 98, 6, 1, 242, 248, 98, 6, 1, 224, 76, 98, 6, 1, 220, 22, 98, 6, 1, + 250, 105, 98, 6, 1, 251, 15, 98, 6, 1, 235, 106, 98, 6, 1, 250, 48, 98, + 6, 1, 250, 151, 98, 6, 1, 211, 163, 98, 6, 1, 235, 117, 98, 6, 1, 242, + 50, 98, 6, 1, 241, 245, 98, 6, 1, 241, 182, 98, 6, 1, 212, 22, 98, 6, 1, + 242, 11, 98, 6, 1, 241, 72, 98, 6, 1, 210, 246, 98, 6, 1, 254, 241, 98, + 1, 254, 131, 98, 1, 252, 160, 98, 1, 243, 113, 98, 1, 247, 136, 98, 1, + 245, 158, 98, 1, 213, 160, 98, 1, 210, 89, 98, 1, 217, 61, 98, 1, 236, 6, + 98, 1, 234, 240, 98, 1, 233, 87, 98, 1, 231, 190, 98, 1, 229, 200, 98, 1, + 226, 200, 98, 1, 226, 21, 98, 1, 210, 78, 98, 1, 223, 174, 98, 1, 221, + 245, 98, 1, 217, 51, 98, 1, 214, 190, 98, 1, 225, 143, 98, 1, 234, 127, + 98, 1, 242, 248, 98, 1, 224, 76, 98, 1, 220, 22, 98, 1, 250, 105, 98, 1, + 251, 15, 98, 1, 235, 106, 98, 1, 250, 48, 98, 1, 250, 151, 98, 1, 211, + 163, 98, 1, 235, 117, 98, 1, 242, 50, 98, 1, 241, 245, 98, 1, 241, 182, + 98, 1, 212, 22, 98, 1, 242, 11, 98, 1, 241, 72, 98, 1, 244, 129, 98, 1, + 210, 246, 98, 1, 245, 173, 98, 1, 215, 94, 243, 113, 98, 1, 254, 205, 98, + 226, 19, 220, 139, 58, 1, 98, 229, 200, 98, 1, 254, 241, 98, 1, 242, 10, + 50, 98, 1, 233, 133, 50, 24, 100, 234, 64, 24, 100, 218, 217, 24, 100, + 228, 231, 24, 100, 216, 102, 24, 100, 218, 206, 24, 100, 223, 29, 24, + 100, 230, 222, 24, 100, 225, 98, 24, 100, 218, 214, 24, 100, 219, 150, + 24, 100, 218, 211, 24, 100, 236, 63, 24, 100, 250, 54, 24, 100, 218, 221, + 24, 100, 250, 114, 24, 100, 234, 116, 24, 100, 216, 174, 24, 100, 225, + 134, 24, 100, 241, 179, 24, 100, 228, 227, 24, 100, 218, 215, 24, 100, + 228, 221, 24, 100, 228, 225, 24, 100, 216, 99, 24, 100, 223, 17, 24, 100, + 218, 213, 24, 100, 223, 27, 24, 100, 234, 224, 24, 100, 230, 215, 24, + 100, 234, 227, 24, 100, 225, 93, 24, 100, 225, 91, 24, 100, 225, 79, 24, + 100, 225, 87, 24, 100, 225, 85, 24, 100, 225, 82, 24, 100, 225, 84, 24, + 100, 225, 81, 24, 100, 225, 86, 24, 100, 225, 96, 24, 100, 225, 97, 24, + 100, 225, 80, 24, 100, 225, 90, 24, 100, 234, 225, 24, 100, 234, 223, 24, + 100, 219, 143, 24, 100, 219, 141, 24, 100, 219, 133, 24, 100, 219, 136, + 24, 100, 219, 142, 24, 100, 219, 138, 24, 100, 219, 137, 24, 100, 219, + 135, 24, 100, 219, 146, 24, 100, 219, 148, 24, 100, 219, 149, 24, 100, + 219, 144, 24, 100, 219, 134, 24, 100, 219, 139, 24, 100, 219, 147, 24, + 100, 250, 98, 24, 100, 250, 96, 24, 100, 250, 176, 24, 100, 250, 174, 24, + 100, 226, 36, 24, 100, 236, 58, 24, 100, 236, 49, 24, 100, 236, 57, 24, + 100, 236, 54, 24, 100, 236, 52, 24, 100, 236, 56, 24, 100, 218, 218, 24, + 100, 236, 61, 24, 100, 236, 62, 24, 100, 236, 50, 24, 100, 236, 55, 24, + 100, 211, 26, 24, 100, 250, 53, 24, 100, 250, 99, 24, 100, 250, 97, 24, + 100, 250, 177, 24, 100, 250, 175, 24, 100, 250, 112, 24, 100, 250, 113, + 24, 100, 250, 100, 24, 100, 250, 178, 24, 100, 225, 132, 24, 100, 234, + 226, 24, 100, 218, 219, 24, 100, 211, 32, 24, 100, 234, 55, 24, 100, 228, + 223, 24, 100, 228, 229, 24, 100, 228, 228, 24, 100, 216, 96, 24, 100, + 244, 111, 24, 143, 244, 111, 24, 143, 61, 24, 143, 254, 252, 24, 143, + 192, 24, 143, 211, 92, 24, 143, 245, 125, 24, 143, 76, 24, 143, 211, 36, + 24, 143, 211, 47, 24, 143, 78, 24, 143, 212, 65, 24, 143, 212, 62, 24, + 143, 226, 238, 24, 143, 210, 244, 24, 143, 69, 24, 143, 212, 11, 24, 143, + 212, 22, 24, 143, 211, 250, 24, 143, 210, 212, 24, 143, 245, 63, 24, 143, + 211, 8, 24, 143, 74, 24, 143, 255, 166, 24, 143, 255, 165, 24, 143, 211, + 106, 24, 143, 211, 104, 24, 143, 245, 123, 24, 143, 245, 122, 24, 143, + 245, 124, 24, 143, 211, 35, 24, 143, 211, 34, 24, 143, 227, 88, 24, 143, + 227, 89, 24, 143, 227, 82, 24, 143, 227, 87, 24, 143, 227, 85, 24, 143, 210, 238, 24, 143, 210, 237, 24, 143, 210, 236, 24, 143, 210, 239, 24, 143, 210, 240, 24, 143, 215, 30, 24, 143, 215, 29, 24, 143, 215, 27, 24, 143, 215, 24, 24, 143, 215, 25, 24, 143, 210, 211, 24, 143, 210, 208, 24, 143, 210, 209, 24, 143, 210, 203, 24, 143, 210, 204, 24, 143, 210, 205, - 24, 143, 210, 207, 24, 143, 245, 50, 24, 143, 245, 52, 24, 143, 211, 7, - 24, 143, 240, 154, 24, 143, 240, 146, 24, 143, 240, 149, 24, 143, 240, - 147, 24, 143, 240, 151, 24, 143, 240, 153, 24, 143, 254, 35, 24, 143, - 254, 32, 24, 143, 254, 30, 24, 143, 254, 31, 24, 143, 218, 221, 24, 143, - 255, 159, 24, 143, 211, 105, 24, 143, 211, 33, 24, 143, 227, 81, 24, 143, - 227, 80, 24, 90, 234, 59, 24, 90, 218, 216, 24, 90, 234, 52, 24, 90, 228, - 227, 24, 90, 228, 225, 24, 90, 228, 224, 24, 90, 216, 102, 24, 90, 223, - 27, 24, 90, 223, 22, 24, 90, 223, 19, 24, 90, 223, 12, 24, 90, 223, 7, - 24, 90, 223, 2, 24, 90, 223, 13, 24, 90, 223, 25, 24, 90, 230, 218, 24, - 90, 225, 96, 24, 90, 225, 85, 24, 90, 219, 149, 24, 90, 218, 210, 24, 90, - 236, 57, 24, 90, 250, 47, 24, 90, 250, 107, 24, 90, 234, 111, 24, 90, - 216, 174, 24, 90, 225, 132, 24, 90, 241, 173, 24, 90, 234, 53, 24, 90, - 234, 51, 24, 90, 228, 223, 24, 90, 228, 217, 24, 90, 228, 219, 24, 90, - 228, 222, 24, 90, 228, 218, 24, 90, 216, 99, 24, 90, 216, 96, 24, 90, - 223, 20, 24, 90, 223, 15, 24, 90, 223, 1, 24, 90, 223, 0, 24, 90, 218, - 212, 24, 90, 223, 17, 24, 90, 223, 16, 24, 90, 223, 9, 24, 90, 223, 11, - 24, 90, 223, 24, 24, 90, 223, 4, 24, 90, 223, 14, 24, 90, 223, 23, 24, - 90, 222, 255, 24, 90, 230, 214, 24, 90, 230, 209, 24, 90, 230, 211, 24, - 90, 230, 208, 24, 90, 230, 206, 24, 90, 230, 212, 24, 90, 230, 217, 24, - 90, 230, 215, 24, 90, 234, 222, 24, 90, 225, 87, 24, 90, 225, 88, 24, 90, - 225, 93, 24, 90, 234, 220, 24, 90, 219, 142, 24, 90, 219, 132, 24, 90, - 219, 135, 24, 90, 219, 137, 24, 90, 226, 33, 24, 90, 236, 52, 24, 90, - 236, 45, 24, 90, 218, 217, 24, 90, 236, 53, 24, 90, 211, 26, 24, 90, 211, - 22, 24, 90, 211, 23, 24, 90, 225, 130, 24, 90, 234, 221, 24, 90, 241, - 171, 24, 90, 241, 169, 24, 90, 241, 172, 24, 90, 241, 170, 24, 90, 211, - 32, 24, 90, 234, 55, 24, 90, 234, 54, 24, 90, 234, 58, 24, 90, 234, 56, - 24, 90, 234, 57, 24, 90, 218, 214, 29, 3, 162, 29, 3, 240, 223, 29, 3, - 241, 181, 29, 3, 242, 47, 29, 3, 241, 221, 29, 3, 241, 239, 29, 3, 241, - 69, 29, 3, 241, 68, 29, 3, 233, 136, 29, 3, 232, 99, 29, 3, 232, 242, 29, - 3, 233, 135, 29, 3, 233, 51, 29, 3, 233, 59, 29, 3, 232, 157, 29, 3, 232, - 71, 29, 3, 241, 190, 29, 3, 241, 184, 29, 3, 241, 186, 29, 3, 241, 189, - 29, 3, 241, 187, 29, 3, 241, 188, 29, 3, 241, 185, 29, 3, 241, 183, 29, - 3, 185, 29, 3, 230, 103, 29, 3, 230, 231, 29, 3, 231, 238, 29, 3, 231, - 81, 29, 3, 231, 92, 29, 3, 230, 162, 29, 3, 230, 43, 29, 3, 217, 164, 29, - 3, 217, 158, 29, 3, 217, 160, 29, 3, 217, 163, 29, 3, 217, 161, 29, 3, - 217, 162, 29, 3, 217, 159, 29, 3, 217, 157, 29, 3, 205, 29, 3, 222, 141, - 29, 3, 223, 36, 29, 3, 223, 185, 29, 3, 223, 109, 29, 3, 223, 129, 29, 3, - 222, 212, 29, 3, 222, 110, 29, 3, 206, 29, 3, 218, 84, 29, 3, 219, 192, - 29, 3, 222, 32, 29, 3, 221, 171, 29, 3, 221, 182, 29, 3, 219, 59, 29, 3, - 217, 254, 29, 3, 220, 103, 29, 3, 219, 226, 29, 3, 220, 33, 29, 3, 220, - 99, 29, 3, 220, 62, 29, 3, 220, 64, 29, 3, 220, 8, 29, 3, 219, 209, 29, - 3, 224, 89, 29, 3, 224, 31, 29, 3, 224, 54, 29, 3, 224, 88, 29, 3, 224, - 69, 29, 3, 224, 70, 29, 3, 224, 43, 29, 3, 224, 42, 29, 3, 223, 243, 29, - 3, 223, 239, 29, 3, 223, 242, 29, 3, 223, 240, 29, 3, 223, 241, 29, 3, - 224, 66, 29, 3, 224, 60, 29, 3, 224, 62, 29, 3, 224, 65, 29, 3, 224, 63, - 29, 3, 224, 64, 29, 3, 224, 61, 29, 3, 224, 59, 29, 3, 224, 55, 29, 3, - 224, 58, 29, 3, 224, 56, 29, 3, 224, 57, 29, 3, 252, 192, 29, 3, 251, - 126, 29, 3, 252, 7, 29, 3, 252, 190, 29, 3, 252, 67, 29, 3, 252, 76, 29, - 3, 251, 206, 29, 3, 251, 84, 29, 3, 214, 27, 29, 3, 212, 116, 29, 3, 213, - 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3, 213, 255, 29, 3, 213, 138, - 29, 3, 212, 107, 29, 3, 217, 106, 29, 3, 215, 119, 29, 3, 216, 118, 29, - 3, 217, 102, 29, 3, 217, 12, 29, 3, 217, 23, 29, 3, 111, 29, 3, 215, 80, - 29, 3, 251, 34, 29, 3, 249, 113, 29, 3, 250, 52, 29, 3, 251, 33, 29, 3, - 250, 183, 29, 3, 250, 191, 29, 3, 249, 239, 29, 3, 249, 82, 29, 3, 211, - 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3, 211, 164, 29, 3, 211, 161, - 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211, 147, 29, 3, 211, 136, 29, - 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133, 29, 3, 211, 134, 29, 3, - 197, 29, 3, 227, 238, 29, 3, 228, 234, 29, 3, 229, 226, 29, 3, 229, 104, - 29, 3, 229, 108, 29, 3, 228, 75, 29, 3, 227, 175, 29, 3, 227, 166, 29, 3, - 227, 129, 29, 3, 227, 149, 29, 3, 227, 165, 29, 3, 227, 156, 29, 3, 227, - 157, 29, 3, 227, 135, 29, 3, 227, 120, 29, 3, 242, 181, 61, 29, 3, 242, - 181, 70, 29, 3, 242, 181, 73, 29, 3, 242, 181, 255, 74, 29, 3, 242, 181, - 245, 210, 29, 3, 242, 181, 75, 29, 3, 242, 181, 76, 29, 3, 242, 181, 212, - 65, 29, 3, 176, 29, 3, 233, 218, 29, 3, 234, 93, 29, 3, 235, 11, 29, 3, - 234, 182, 29, 3, 234, 183, 29, 3, 234, 29, 29, 3, 234, 28, 29, 3, 233, - 183, 29, 3, 233, 177, 29, 3, 233, 182, 29, 3, 233, 178, 29, 3, 233, 179, - 29, 3, 233, 172, 29, 3, 233, 166, 29, 3, 233, 168, 29, 3, 233, 171, 29, - 3, 233, 169, 29, 3, 233, 170, 29, 3, 233, 167, 29, 3, 233, 165, 29, 3, - 233, 161, 29, 3, 233, 164, 29, 3, 233, 162, 29, 3, 233, 163, 29, 3, 212, - 65, 29, 3, 211, 195, 29, 3, 211, 250, 29, 3, 212, 64, 29, 3, 212, 17, 29, - 3, 212, 22, 29, 3, 211, 227, 29, 3, 211, 226, 29, 3, 225, 140, 61, 29, 3, - 225, 140, 70, 29, 3, 225, 140, 73, 29, 3, 225, 140, 255, 74, 29, 3, 225, - 140, 245, 210, 29, 3, 225, 140, 75, 29, 3, 225, 140, 76, 29, 3, 210, 116, - 29, 3, 210, 13, 29, 3, 210, 44, 29, 3, 210, 115, 29, 3, 210, 92, 29, 3, - 210, 94, 29, 3, 210, 23, 29, 3, 210, 0, 29, 3, 210, 82, 29, 3, 210, 62, - 29, 3, 210, 69, 29, 3, 210, 81, 29, 3, 210, 73, 29, 3, 210, 74, 29, 3, - 210, 67, 29, 3, 210, 53, 29, 3, 191, 29, 3, 210, 212, 29, 3, 211, 8, 29, - 3, 211, 103, 29, 3, 211, 44, 29, 3, 211, 47, 29, 3, 210, 244, 29, 3, 210, - 235, 29, 3, 248, 222, 29, 3, 246, 79, 29, 3, 248, 4, 29, 3, 248, 221, 29, - 3, 248, 78, 29, 3, 248, 91, 29, 3, 247, 146, 29, 3, 246, 48, 29, 3, 248, - 136, 29, 3, 248, 101, 29, 3, 248, 113, 29, 3, 248, 135, 29, 3, 248, 123, - 29, 3, 248, 124, 29, 3, 248, 106, 29, 3, 248, 92, 29, 3, 235, 142, 29, 3, - 235, 52, 29, 3, 235, 109, 29, 3, 235, 141, 29, 3, 235, 125, 29, 3, 235, - 127, 29, 3, 235, 69, 29, 3, 235, 32, 29, 3, 243, 136, 29, 3, 242, 114, - 29, 3, 242, 215, 29, 3, 243, 133, 29, 3, 243, 56, 29, 3, 243, 63, 29, 3, - 242, 175, 29, 3, 242, 174, 29, 3, 242, 79, 29, 3, 242, 75, 29, 3, 242, - 78, 29, 3, 242, 76, 29, 3, 242, 77, 29, 3, 243, 30, 29, 3, 243, 10, 29, - 3, 243, 20, 29, 3, 243, 29, 29, 3, 243, 24, 29, 3, 243, 25, 29, 3, 243, - 14, 29, 3, 242, 255, 29, 3, 216, 209, 29, 3, 216, 137, 29, 3, 216, 176, - 29, 3, 216, 208, 29, 3, 216, 195, 29, 3, 216, 196, 29, 3, 216, 157, 29, - 3, 216, 129, 29, 3, 250, 158, 29, 3, 250, 70, 29, 3, 250, 111, 29, 3, - 250, 157, 29, 3, 250, 129, 29, 3, 250, 132, 29, 3, 250, 87, 29, 3, 250, - 59, 29, 3, 225, 148, 29, 3, 225, 115, 29, 3, 225, 134, 29, 3, 225, 147, - 29, 3, 225, 136, 29, 3, 225, 137, 29, 3, 225, 122, 29, 3, 225, 111, 29, + 24, 143, 210, 207, 24, 143, 245, 57, 24, 143, 245, 59, 24, 143, 211, 7, + 24, 143, 240, 160, 24, 143, 240, 152, 24, 143, 240, 155, 24, 143, 240, + 153, 24, 143, 240, 157, 24, 143, 240, 159, 24, 143, 254, 42, 24, 143, + 254, 39, 24, 143, 254, 37, 24, 143, 254, 38, 24, 143, 218, 222, 24, 143, + 255, 167, 24, 143, 211, 105, 24, 143, 211, 33, 24, 143, 227, 84, 24, 143, + 227, 83, 24, 90, 234, 64, 24, 90, 218, 217, 24, 90, 234, 57, 24, 90, 228, + 231, 24, 90, 228, 229, 24, 90, 228, 228, 24, 90, 216, 102, 24, 90, 223, + 29, 24, 90, 223, 24, 24, 90, 223, 21, 24, 90, 223, 14, 24, 90, 223, 9, + 24, 90, 223, 4, 24, 90, 223, 15, 24, 90, 223, 27, 24, 90, 230, 222, 24, + 90, 225, 98, 24, 90, 225, 87, 24, 90, 219, 150, 24, 90, 218, 211, 24, 90, + 236, 63, 24, 90, 250, 54, 24, 90, 250, 114, 24, 90, 234, 116, 24, 90, + 216, 174, 24, 90, 225, 134, 24, 90, 241, 179, 24, 90, 234, 58, 24, 90, + 234, 56, 24, 90, 228, 227, 24, 90, 228, 221, 24, 90, 228, 223, 24, 90, + 228, 226, 24, 90, 228, 222, 24, 90, 216, 99, 24, 90, 216, 96, 24, 90, + 223, 22, 24, 90, 223, 17, 24, 90, 223, 3, 24, 90, 223, 2, 24, 90, 218, + 213, 24, 90, 223, 19, 24, 90, 223, 18, 24, 90, 223, 11, 24, 90, 223, 13, + 24, 90, 223, 26, 24, 90, 223, 6, 24, 90, 223, 16, 24, 90, 223, 25, 24, + 90, 223, 1, 24, 90, 230, 218, 24, 90, 230, 213, 24, 90, 230, 215, 24, 90, + 230, 212, 24, 90, 230, 210, 24, 90, 230, 216, 24, 90, 230, 221, 24, 90, + 230, 219, 24, 90, 234, 227, 24, 90, 225, 89, 24, 90, 225, 90, 24, 90, + 225, 95, 24, 90, 234, 225, 24, 90, 219, 143, 24, 90, 219, 133, 24, 90, + 219, 136, 24, 90, 219, 138, 24, 90, 226, 36, 24, 90, 236, 58, 24, 90, + 236, 51, 24, 90, 218, 218, 24, 90, 236, 59, 24, 90, 211, 26, 24, 90, 211, + 22, 24, 90, 211, 23, 24, 90, 225, 132, 24, 90, 234, 226, 24, 90, 241, + 177, 24, 90, 241, 175, 24, 90, 241, 178, 24, 90, 241, 176, 24, 90, 211, + 32, 24, 90, 234, 60, 24, 90, 234, 59, 24, 90, 234, 63, 24, 90, 234, 61, + 24, 90, 234, 62, 24, 90, 218, 215, 29, 3, 162, 29, 3, 240, 229, 29, 3, + 241, 187, 29, 3, 242, 53, 29, 3, 241, 227, 29, 3, 241, 245, 29, 3, 241, + 75, 29, 3, 241, 74, 29, 3, 233, 141, 29, 3, 232, 103, 29, 3, 232, 247, + 29, 3, 233, 140, 29, 3, 233, 56, 29, 3, 233, 64, 29, 3, 232, 162, 29, 3, + 232, 75, 29, 3, 241, 196, 29, 3, 241, 190, 29, 3, 241, 192, 29, 3, 241, + 195, 29, 3, 241, 193, 29, 3, 241, 194, 29, 3, 241, 191, 29, 3, 241, 189, + 29, 3, 186, 29, 3, 230, 107, 29, 3, 230, 235, 29, 3, 231, 242, 29, 3, + 231, 85, 29, 3, 231, 96, 29, 3, 230, 166, 29, 3, 230, 47, 29, 3, 217, + 164, 29, 3, 217, 158, 29, 3, 217, 160, 29, 3, 217, 163, 29, 3, 217, 161, + 29, 3, 217, 162, 29, 3, 217, 159, 29, 3, 217, 157, 29, 3, 205, 29, 3, + 222, 142, 29, 3, 223, 38, 29, 3, 223, 187, 29, 3, 223, 111, 29, 3, 223, + 131, 29, 3, 222, 213, 29, 3, 222, 111, 29, 3, 206, 29, 3, 218, 84, 29, 3, + 219, 193, 29, 3, 222, 33, 29, 3, 221, 172, 29, 3, 221, 183, 29, 3, 219, + 60, 29, 3, 217, 254, 29, 3, 220, 104, 29, 3, 219, 227, 29, 3, 220, 34, + 29, 3, 220, 100, 29, 3, 220, 63, 29, 3, 220, 65, 29, 3, 220, 9, 29, 3, + 219, 210, 29, 3, 224, 91, 29, 3, 224, 33, 29, 3, 224, 56, 29, 3, 224, 90, + 29, 3, 224, 71, 29, 3, 224, 72, 29, 3, 224, 45, 29, 3, 224, 44, 29, 3, + 223, 245, 29, 3, 223, 241, 29, 3, 223, 244, 29, 3, 223, 242, 29, 3, 223, + 243, 29, 3, 224, 68, 29, 3, 224, 62, 29, 3, 224, 64, 29, 3, 224, 67, 29, + 3, 224, 65, 29, 3, 224, 66, 29, 3, 224, 63, 29, 3, 224, 61, 29, 3, 224, + 57, 29, 3, 224, 60, 29, 3, 224, 58, 29, 3, 224, 59, 29, 3, 252, 199, 29, + 3, 251, 133, 29, 3, 252, 14, 29, 3, 252, 197, 29, 3, 252, 74, 29, 3, 252, + 83, 29, 3, 251, 213, 29, 3, 251, 91, 29, 3, 214, 27, 29, 3, 212, 116, 29, + 3, 213, 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3, 213, 255, 29, 3, + 213, 138, 29, 3, 212, 107, 29, 3, 217, 106, 29, 3, 215, 119, 29, 3, 216, + 118, 29, 3, 217, 102, 29, 3, 217, 12, 29, 3, 217, 23, 29, 3, 112, 29, 3, + 215, 80, 29, 3, 251, 41, 29, 3, 249, 120, 29, 3, 250, 59, 29, 3, 251, 40, + 29, 3, 250, 190, 29, 3, 250, 198, 29, 3, 249, 246, 29, 3, 249, 89, 29, 3, + 211, 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3, 211, 164, 29, 3, 211, + 161, 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211, 147, 29, 3, 211, 136, + 29, 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133, 29, 3, 211, 134, 29, + 3, 198, 29, 3, 227, 242, 29, 3, 228, 238, 29, 3, 229, 230, 29, 3, 229, + 108, 29, 3, 229, 112, 29, 3, 228, 79, 29, 3, 227, 178, 29, 3, 227, 169, + 29, 3, 227, 132, 29, 3, 227, 152, 29, 3, 227, 168, 29, 3, 227, 159, 29, + 3, 227, 160, 29, 3, 227, 138, 29, 3, 227, 123, 29, 3, 242, 187, 61, 29, + 3, 242, 187, 69, 29, 3, 242, 187, 74, 29, 3, 242, 187, 255, 82, 29, 3, + 242, 187, 245, 217, 29, 3, 242, 187, 76, 29, 3, 242, 187, 78, 29, 3, 242, + 187, 212, 65, 29, 3, 176, 29, 3, 233, 223, 29, 3, 234, 98, 29, 3, 235, + 16, 29, 3, 234, 187, 29, 3, 234, 188, 29, 3, 234, 34, 29, 3, 234, 33, 29, + 3, 233, 188, 29, 3, 233, 182, 29, 3, 233, 187, 29, 3, 233, 183, 29, 3, + 233, 184, 29, 3, 233, 177, 29, 3, 233, 171, 29, 3, 233, 173, 29, 3, 233, + 176, 29, 3, 233, 174, 29, 3, 233, 175, 29, 3, 233, 172, 29, 3, 233, 170, + 29, 3, 233, 166, 29, 3, 233, 169, 29, 3, 233, 167, 29, 3, 233, 168, 29, + 3, 212, 65, 29, 3, 211, 195, 29, 3, 211, 250, 29, 3, 212, 64, 29, 3, 212, + 17, 29, 3, 212, 22, 29, 3, 211, 227, 29, 3, 211, 226, 29, 3, 225, 142, + 61, 29, 3, 225, 142, 69, 29, 3, 225, 142, 74, 29, 3, 225, 142, 255, 82, + 29, 3, 225, 142, 245, 217, 29, 3, 225, 142, 76, 29, 3, 225, 142, 78, 29, + 3, 210, 116, 29, 3, 210, 13, 29, 3, 210, 44, 29, 3, 210, 115, 29, 3, 210, + 92, 29, 3, 210, 94, 29, 3, 210, 23, 29, 3, 210, 0, 29, 3, 210, 82, 29, 3, + 210, 62, 29, 3, 210, 69, 29, 3, 210, 81, 29, 3, 210, 73, 29, 3, 210, 74, + 29, 3, 210, 67, 29, 3, 210, 53, 29, 3, 192, 29, 3, 210, 212, 29, 3, 211, + 8, 29, 3, 211, 103, 29, 3, 211, 44, 29, 3, 211, 47, 29, 3, 210, 244, 29, + 3, 210, 235, 29, 3, 248, 229, 29, 3, 246, 86, 29, 3, 248, 11, 29, 3, 248, + 228, 29, 3, 248, 85, 29, 3, 248, 98, 29, 3, 247, 153, 29, 3, 246, 55, 29, + 3, 248, 143, 29, 3, 248, 108, 29, 3, 248, 120, 29, 3, 248, 142, 29, 3, + 248, 130, 29, 3, 248, 131, 29, 3, 248, 113, 29, 3, 248, 99, 29, 3, 235, + 147, 29, 3, 235, 57, 29, 3, 235, 114, 29, 3, 235, 146, 29, 3, 235, 130, + 29, 3, 235, 132, 29, 3, 235, 74, 29, 3, 235, 37, 29, 3, 243, 142, 29, 3, + 242, 120, 29, 3, 242, 221, 29, 3, 243, 139, 29, 3, 243, 62, 29, 3, 243, + 69, 29, 3, 242, 181, 29, 3, 242, 180, 29, 3, 242, 85, 29, 3, 242, 81, 29, + 3, 242, 84, 29, 3, 242, 82, 29, 3, 242, 83, 29, 3, 243, 36, 29, 3, 243, + 16, 29, 3, 243, 26, 29, 3, 243, 35, 29, 3, 243, 30, 29, 3, 243, 31, 29, + 3, 243, 20, 29, 3, 243, 5, 29, 3, 216, 209, 29, 3, 216, 137, 29, 3, 216, + 176, 29, 3, 216, 208, 29, 3, 216, 195, 29, 3, 216, 196, 29, 3, 216, 157, + 29, 3, 216, 129, 29, 3, 250, 165, 29, 3, 250, 77, 29, 3, 250, 118, 29, 3, + 250, 164, 29, 3, 250, 136, 29, 3, 250, 139, 29, 3, 250, 94, 29, 3, 250, + 66, 29, 3, 225, 150, 29, 3, 225, 117, 29, 3, 225, 136, 29, 3, 225, 149, + 29, 3, 225, 138, 29, 3, 225, 139, 29, 3, 225, 124, 29, 3, 225, 113, 29, 3, 215, 184, 29, 3, 215, 164, 29, 3, 215, 168, 29, 3, 215, 183, 29, 3, 215, 178, 29, 3, 215, 179, 29, 3, 215, 167, 29, 3, 215, 162, 29, 3, 215, 39, 29, 3, 215, 31, 29, 3, 215, 35, 29, 3, 215, 38, 29, 3, 215, 36, 29, - 3, 215, 37, 29, 3, 215, 33, 29, 3, 215, 32, 29, 3, 244, 197, 29, 3, 243, - 235, 29, 3, 244, 122, 29, 3, 244, 196, 29, 3, 244, 148, 29, 3, 244, 155, - 29, 3, 244, 44, 29, 3, 243, 214, 29, 3, 190, 29, 3, 224, 151, 29, 3, 225, - 109, 29, 3, 226, 90, 29, 3, 225, 212, 29, 3, 225, 222, 29, 3, 225, 17, - 29, 3, 224, 115, 29, 3, 222, 100, 29, 3, 230, 32, 29, 3, 243, 208, 29, - 38, 243, 54, 22, 25, 233, 24, 78, 29, 38, 25, 233, 24, 78, 29, 38, 243, - 54, 78, 29, 221, 174, 78, 29, 211, 208, 29, 243, 230, 218, 130, 29, 249, - 220, 29, 220, 151, 29, 249, 227, 29, 224, 200, 249, 227, 29, 224, 14, 78, - 29, 226, 16, 220, 138, 29, 21, 110, 29, 21, 105, 29, 21, 158, 29, 21, - 161, 29, 21, 189, 29, 21, 194, 29, 21, 198, 29, 21, 195, 29, 21, 200, 29, - 54, 216, 248, 29, 54, 215, 73, 29, 54, 216, 163, 29, 54, 244, 16, 29, 54, - 244, 115, 29, 54, 219, 112, 29, 54, 220, 117, 29, 54, 245, 185, 29, 54, - 228, 196, 29, 54, 240, 211, 29, 54, 216, 249, 216, 148, 29, 3, 221, 178, - 230, 43, 29, 3, 230, 39, 29, 3, 230, 40, 29, 3, 230, 41, 29, 3, 221, 178, - 251, 84, 29, 3, 251, 81, 29, 3, 251, 82, 29, 3, 251, 83, 29, 3, 221, 178, - 243, 214, 29, 3, 243, 210, 29, 3, 243, 211, 29, 3, 243, 212, 29, 3, 221, - 178, 224, 115, 29, 3, 224, 111, 29, 3, 224, 112, 29, 3, 224, 113, 29, - 216, 32, 164, 210, 247, 29, 216, 32, 164, 248, 42, 29, 216, 32, 164, 222, - 239, 29, 216, 32, 164, 219, 252, 222, 239, 29, 216, 32, 164, 247, 236, - 29, 216, 32, 164, 234, 165, 29, 216, 32, 164, 250, 95, 29, 216, 32, 164, - 241, 178, 29, 216, 32, 164, 248, 41, 29, 216, 32, 164, 233, 195, 169, 1, - 61, 169, 1, 75, 169, 1, 73, 169, 1, 76, 169, 1, 70, 169, 1, 214, 105, - 169, 1, 243, 136, 169, 1, 176, 169, 1, 243, 63, 169, 1, 242, 215, 169, 1, - 242, 175, 169, 1, 242, 114, 169, 1, 242, 80, 169, 1, 162, 169, 1, 241, - 239, 169, 1, 241, 181, 169, 1, 241, 69, 169, 1, 240, 223, 169, 1, 240, - 202, 169, 1, 233, 136, 169, 1, 233, 59, 169, 1, 232, 242, 169, 1, 232, - 157, 169, 1, 232, 99, 169, 1, 232, 72, 169, 1, 185, 169, 1, 231, 92, 169, - 1, 230, 231, 169, 1, 230, 162, 169, 1, 230, 103, 169, 1, 197, 169, 1, - 241, 91, 169, 1, 229, 214, 169, 1, 229, 108, 169, 1, 228, 234, 169, 1, - 228, 75, 169, 1, 227, 238, 169, 1, 227, 177, 169, 1, 224, 30, 169, 1, - 224, 17, 169, 1, 224, 10, 169, 1, 224, 2, 169, 1, 223, 247, 169, 1, 223, - 245, 169, 1, 206, 169, 1, 222, 92, 169, 1, 221, 182, 169, 1, 219, 192, - 169, 1, 219, 59, 169, 1, 218, 84, 169, 1, 218, 3, 169, 1, 248, 222, 169, - 1, 217, 106, 169, 1, 248, 91, 169, 1, 217, 23, 169, 1, 248, 4, 169, 1, - 216, 118, 169, 1, 247, 146, 169, 1, 246, 79, 169, 1, 246, 51, 169, 1, - 247, 157, 169, 1, 216, 60, 169, 1, 216, 59, 169, 1, 216, 48, 169, 1, 216, + 3, 215, 37, 29, 3, 215, 33, 29, 3, 215, 32, 29, 3, 244, 204, 29, 3, 243, + 241, 29, 3, 244, 129, 29, 3, 244, 203, 29, 3, 244, 155, 29, 3, 244, 162, + 29, 3, 244, 51, 29, 3, 243, 220, 29, 3, 191, 29, 3, 224, 153, 29, 3, 225, + 111, 29, 3, 226, 93, 29, 3, 225, 214, 29, 3, 225, 224, 29, 3, 225, 19, + 29, 3, 224, 117, 29, 3, 222, 101, 29, 3, 230, 36, 29, 3, 243, 214, 29, + 38, 243, 60, 22, 25, 233, 29, 79, 29, 38, 25, 233, 29, 79, 29, 38, 243, + 60, 79, 29, 221, 175, 79, 29, 211, 208, 29, 243, 236, 218, 131, 29, 249, + 227, 29, 220, 152, 29, 249, 234, 29, 224, 202, 249, 234, 29, 224, 16, 79, + 29, 226, 19, 220, 139, 29, 21, 111, 29, 21, 105, 29, 21, 158, 29, 21, + 161, 29, 21, 190, 29, 21, 195, 29, 21, 199, 29, 21, 196, 29, 21, 201, 29, + 54, 216, 248, 29, 54, 215, 73, 29, 54, 216, 163, 29, 54, 244, 23, 29, 54, + 244, 122, 29, 54, 219, 113, 29, 54, 220, 118, 29, 54, 245, 192, 29, 54, + 228, 200, 29, 54, 240, 217, 29, 54, 216, 249, 216, 148, 29, 3, 221, 179, + 230, 47, 29, 3, 230, 43, 29, 3, 230, 44, 29, 3, 230, 45, 29, 3, 221, 179, + 251, 91, 29, 3, 251, 88, 29, 3, 251, 89, 29, 3, 251, 90, 29, 3, 221, 179, + 243, 220, 29, 3, 243, 216, 29, 3, 243, 217, 29, 3, 243, 218, 29, 3, 221, + 179, 224, 117, 29, 3, 224, 113, 29, 3, 224, 114, 29, 3, 224, 115, 29, + 216, 32, 164, 210, 247, 29, 216, 32, 164, 248, 49, 29, 216, 32, 164, 222, + 241, 29, 216, 32, 164, 219, 253, 222, 241, 29, 216, 32, 164, 247, 243, + 29, 216, 32, 164, 234, 170, 29, 216, 32, 164, 250, 102, 29, 216, 32, 164, + 241, 184, 29, 216, 32, 164, 248, 48, 29, 216, 32, 164, 233, 200, 169, 1, + 61, 169, 1, 76, 169, 1, 74, 169, 1, 78, 169, 1, 69, 169, 1, 214, 105, + 169, 1, 243, 142, 169, 1, 176, 169, 1, 243, 69, 169, 1, 242, 221, 169, 1, + 242, 181, 169, 1, 242, 120, 169, 1, 242, 86, 169, 1, 162, 169, 1, 241, + 245, 169, 1, 241, 187, 169, 1, 241, 75, 169, 1, 240, 229, 169, 1, 240, + 208, 169, 1, 233, 141, 169, 1, 233, 64, 169, 1, 232, 247, 169, 1, 232, + 162, 169, 1, 232, 103, 169, 1, 232, 76, 169, 1, 186, 169, 1, 231, 96, + 169, 1, 230, 235, 169, 1, 230, 166, 169, 1, 230, 107, 169, 1, 198, 169, + 1, 241, 97, 169, 1, 229, 218, 169, 1, 229, 112, 169, 1, 228, 238, 169, 1, + 228, 79, 169, 1, 227, 242, 169, 1, 227, 180, 169, 1, 224, 32, 169, 1, + 224, 19, 169, 1, 224, 12, 169, 1, 224, 4, 169, 1, 223, 249, 169, 1, 223, + 247, 169, 1, 206, 169, 1, 222, 93, 169, 1, 221, 183, 169, 1, 219, 193, + 169, 1, 219, 60, 169, 1, 218, 84, 169, 1, 218, 3, 169, 1, 248, 229, 169, + 1, 217, 106, 169, 1, 248, 98, 169, 1, 217, 23, 169, 1, 248, 11, 169, 1, + 216, 118, 169, 1, 247, 153, 169, 1, 246, 86, 169, 1, 246, 58, 169, 1, + 247, 164, 169, 1, 216, 60, 169, 1, 216, 59, 169, 1, 216, 48, 169, 1, 216, 47, 169, 1, 216, 46, 169, 1, 216, 45, 169, 1, 215, 184, 169, 1, 215, 179, 169, 1, 215, 168, 169, 1, 215, 167, 169, 1, 215, 164, 169, 1, 215, 163, 169, 1, 212, 65, 169, 1, 212, 22, 169, 1, 211, 250, 169, 1, 211, 227, - 169, 1, 211, 195, 169, 1, 211, 183, 169, 1, 191, 169, 1, 211, 47, 169, 1, + 169, 1, 211, 195, 169, 1, 211, 183, 169, 1, 192, 169, 1, 211, 47, 169, 1, 211, 8, 169, 1, 210, 244, 169, 1, 210, 212, 169, 1, 210, 177, 18, 19, - 240, 169, 18, 19, 75, 18, 19, 255, 38, 18, 19, 73, 18, 19, 236, 34, 18, - 19, 76, 18, 19, 226, 184, 18, 19, 211, 116, 226, 184, 18, 19, 72, 245, - 210, 18, 19, 72, 73, 18, 19, 61, 18, 19, 255, 74, 18, 19, 212, 22, 18, + 240, 175, 18, 19, 76, 18, 19, 255, 46, 18, 19, 74, 18, 19, 236, 40, 18, + 19, 78, 18, 19, 226, 187, 18, 19, 211, 116, 226, 187, 18, 19, 73, 245, + 217, 18, 19, 73, 74, 18, 19, 61, 18, 19, 255, 82, 18, 19, 212, 22, 18, 19, 159, 212, 22, 18, 19, 211, 250, 18, 19, 159, 211, 250, 18, 19, 211, 242, 18, 19, 159, 211, 242, 18, 19, 211, 227, 18, 19, 159, 211, 227, 18, - 19, 211, 215, 18, 19, 159, 211, 215, 18, 19, 229, 191, 211, 215, 18, 19, + 19, 211, 215, 18, 19, 159, 211, 215, 18, 19, 229, 195, 211, 215, 18, 19, 212, 65, 18, 19, 159, 212, 65, 18, 19, 212, 64, 18, 19, 159, 212, 64, 18, - 19, 229, 191, 212, 64, 18, 19, 254, 202, 18, 19, 211, 116, 212, 98, 18, - 19, 242, 181, 218, 130, 18, 19, 40, 142, 18, 19, 40, 242, 137, 18, 19, - 40, 251, 176, 163, 222, 234, 18, 19, 40, 216, 15, 163, 222, 234, 18, 19, - 40, 44, 163, 222, 234, 18, 19, 40, 222, 234, 18, 19, 40, 52, 142, 18, 19, - 40, 52, 219, 252, 67, 218, 91, 18, 19, 40, 230, 225, 247, 121, 18, 19, - 40, 219, 252, 203, 91, 18, 19, 40, 225, 23, 18, 19, 40, 124, 217, 88, 18, - 19, 245, 151, 18, 19, 236, 0, 18, 19, 226, 197, 18, 19, 254, 124, 18, 19, - 225, 222, 18, 19, 226, 88, 18, 19, 225, 109, 18, 19, 225, 72, 18, 19, - 225, 17, 18, 19, 224, 250, 18, 19, 211, 116, 224, 250, 18, 19, 72, 241, - 221, 18, 19, 72, 241, 181, 18, 19, 190, 18, 19, 226, 90, 18, 19, 224, - 113, 18, 19, 159, 224, 113, 18, 19, 224, 111, 18, 19, 159, 224, 111, 18, - 19, 224, 110, 18, 19, 159, 224, 110, 18, 19, 224, 108, 18, 19, 159, 224, - 108, 18, 19, 224, 107, 18, 19, 159, 224, 107, 18, 19, 224, 115, 18, 19, - 159, 224, 115, 18, 19, 224, 114, 18, 19, 159, 224, 114, 18, 19, 211, 116, - 224, 114, 18, 19, 226, 106, 18, 19, 159, 226, 106, 18, 19, 72, 242, 61, + 19, 229, 195, 212, 64, 18, 19, 254, 210, 18, 19, 211, 116, 212, 98, 18, + 19, 242, 187, 218, 131, 18, 19, 40, 142, 18, 19, 40, 242, 143, 18, 19, + 40, 251, 183, 163, 222, 236, 18, 19, 40, 216, 15, 163, 222, 236, 18, 19, + 40, 44, 163, 222, 236, 18, 19, 40, 222, 236, 18, 19, 40, 52, 142, 18, 19, + 40, 52, 219, 253, 67, 218, 92, 18, 19, 40, 230, 229, 247, 128, 18, 19, + 40, 219, 253, 203, 91, 18, 19, 40, 225, 25, 18, 19, 40, 124, 217, 88, 18, + 19, 245, 158, 18, 19, 236, 6, 18, 19, 226, 200, 18, 19, 254, 131, 18, 19, + 225, 224, 18, 19, 226, 91, 18, 19, 225, 111, 18, 19, 225, 74, 18, 19, + 225, 19, 18, 19, 224, 252, 18, 19, 211, 116, 224, 252, 18, 19, 73, 241, + 227, 18, 19, 73, 241, 187, 18, 19, 191, 18, 19, 226, 93, 18, 19, 224, + 115, 18, 19, 159, 224, 115, 18, 19, 224, 113, 18, 19, 159, 224, 113, 18, + 19, 224, 112, 18, 19, 159, 224, 112, 18, 19, 224, 110, 18, 19, 159, 224, + 110, 18, 19, 224, 109, 18, 19, 159, 224, 109, 18, 19, 224, 117, 18, 19, + 159, 224, 117, 18, 19, 224, 116, 18, 19, 159, 224, 116, 18, 19, 211, 116, + 224, 116, 18, 19, 226, 109, 18, 19, 159, 226, 109, 18, 19, 73, 242, 67, 18, 19, 217, 23, 18, 19, 217, 100, 18, 19, 216, 118, 18, 19, 216, 104, - 18, 19, 111, 18, 19, 216, 18, 18, 19, 211, 116, 216, 18, 18, 19, 72, 248, - 78, 18, 19, 72, 248, 4, 18, 19, 217, 106, 18, 19, 217, 102, 18, 19, 215, + 18, 19, 112, 18, 19, 216, 18, 18, 19, 211, 116, 216, 18, 18, 19, 73, 248, + 85, 18, 19, 73, 248, 11, 18, 19, 217, 106, 18, 19, 217, 102, 18, 19, 215, 78, 18, 19, 159, 215, 78, 18, 19, 215, 62, 18, 19, 159, 215, 62, 18, 19, 215, 61, 18, 19, 159, 215, 61, 18, 19, 105, 18, 19, 159, 105, 18, 19, 215, 54, 18, 19, 159, 215, 54, 18, 19, 215, 80, 18, 19, 159, 215, 80, 18, - 19, 215, 79, 18, 19, 159, 215, 79, 18, 19, 229, 191, 215, 79, 18, 19, + 19, 215, 79, 18, 19, 159, 215, 79, 18, 19, 229, 195, 215, 79, 18, 19, 217, 153, 18, 19, 215, 152, 18, 19, 215, 136, 18, 19, 215, 134, 18, 19, - 215, 157, 18, 19, 234, 183, 18, 19, 235, 8, 18, 19, 234, 93, 18, 19, 234, - 84, 18, 19, 234, 29, 18, 19, 234, 11, 18, 19, 211, 116, 234, 11, 18, 19, - 176, 18, 19, 235, 11, 18, 19, 233, 179, 18, 19, 159, 233, 179, 18, 19, - 233, 177, 18, 19, 159, 233, 177, 18, 19, 233, 176, 18, 19, 159, 233, 176, - 18, 19, 233, 175, 18, 19, 159, 233, 175, 18, 19, 233, 174, 18, 19, 159, - 233, 174, 18, 19, 233, 183, 18, 19, 159, 233, 183, 18, 19, 233, 182, 18, - 19, 159, 233, 182, 18, 19, 229, 191, 233, 182, 18, 19, 235, 24, 18, 19, - 233, 184, 18, 19, 219, 28, 234, 177, 18, 19, 219, 28, 234, 85, 18, 19, - 219, 28, 234, 24, 18, 19, 219, 28, 234, 249, 18, 19, 250, 191, 18, 19, - 251, 32, 18, 19, 250, 52, 18, 19, 250, 42, 18, 19, 249, 239, 18, 19, 249, - 175, 18, 19, 211, 116, 249, 175, 18, 19, 251, 34, 18, 19, 251, 33, 18, - 19, 249, 80, 18, 19, 159, 249, 80, 18, 19, 249, 78, 18, 19, 159, 249, 78, - 18, 19, 249, 77, 18, 19, 159, 249, 77, 18, 19, 249, 76, 18, 19, 159, 249, - 76, 18, 19, 249, 75, 18, 19, 159, 249, 75, 18, 19, 249, 82, 18, 19, 159, - 249, 82, 18, 19, 249, 81, 18, 19, 159, 249, 81, 18, 19, 229, 191, 249, - 81, 18, 19, 251, 67, 18, 19, 221, 210, 216, 211, 18, 19, 231, 92, 18, 19, - 231, 237, 18, 19, 230, 231, 18, 19, 230, 202, 18, 19, 230, 162, 18, 19, - 230, 133, 18, 19, 211, 116, 230, 133, 18, 19, 185, 18, 19, 231, 238, 18, - 19, 230, 41, 18, 19, 159, 230, 41, 18, 19, 230, 39, 18, 19, 159, 230, 39, - 18, 19, 230, 38, 18, 19, 159, 230, 38, 18, 19, 230, 37, 18, 19, 159, 230, - 37, 18, 19, 230, 36, 18, 19, 159, 230, 36, 18, 19, 230, 43, 18, 19, 159, - 230, 43, 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 229, 191, 230, - 42, 18, 19, 193, 18, 19, 159, 193, 18, 19, 230, 235, 18, 19, 253, 206, - 193, 18, 19, 221, 210, 193, 18, 19, 229, 108, 18, 19, 229, 225, 18, 19, - 228, 234, 18, 19, 228, 209, 18, 19, 228, 75, 18, 19, 228, 65, 18, 19, - 211, 116, 228, 65, 18, 19, 197, 18, 19, 229, 226, 18, 19, 227, 173, 18, - 19, 159, 227, 173, 18, 19, 227, 175, 18, 19, 159, 227, 175, 18, 19, 227, - 174, 18, 19, 159, 227, 174, 18, 19, 229, 191, 227, 174, 18, 19, 230, 26, - 18, 19, 72, 229, 80, 18, 19, 228, 239, 18, 19, 233, 59, 18, 19, 233, 134, - 18, 19, 232, 242, 18, 19, 232, 228, 18, 19, 232, 157, 18, 19, 232, 128, - 18, 19, 211, 116, 232, 128, 18, 19, 233, 136, 18, 19, 233, 135, 18, 19, - 232, 69, 18, 19, 159, 232, 69, 18, 19, 232, 68, 18, 19, 159, 232, 68, 18, - 19, 232, 67, 18, 19, 159, 232, 67, 18, 19, 232, 66, 18, 19, 159, 232, 66, - 18, 19, 232, 65, 18, 19, 159, 232, 65, 18, 19, 232, 71, 18, 19, 159, 232, - 71, 18, 19, 232, 70, 18, 19, 159, 232, 70, 18, 19, 156, 18, 19, 159, 156, - 18, 19, 147, 156, 18, 19, 221, 182, 18, 19, 222, 30, 18, 19, 219, 192, - 18, 19, 219, 176, 18, 19, 219, 59, 18, 19, 219, 41, 18, 19, 211, 116, - 219, 41, 18, 19, 206, 18, 19, 222, 32, 18, 19, 217, 250, 18, 19, 159, - 217, 250, 18, 19, 217, 244, 18, 19, 159, 217, 244, 18, 19, 217, 243, 18, - 19, 159, 217, 243, 18, 19, 217, 239, 18, 19, 159, 217, 239, 18, 19, 217, - 238, 18, 19, 159, 217, 238, 18, 19, 217, 254, 18, 19, 159, 217, 254, 18, - 19, 217, 253, 18, 19, 159, 217, 253, 18, 19, 229, 191, 217, 253, 18, 19, - 222, 92, 18, 19, 253, 206, 222, 92, 18, 19, 217, 255, 18, 19, 251, 219, - 222, 92, 18, 19, 230, 128, 219, 109, 18, 19, 229, 191, 219, 100, 18, 19, - 229, 191, 222, 90, 18, 19, 229, 191, 218, 236, 18, 19, 229, 191, 218, 87, - 18, 19, 229, 191, 219, 99, 18, 19, 229, 191, 221, 185, 18, 19, 220, 64, - 18, 19, 220, 33, 18, 19, 220, 28, 18, 19, 220, 8, 18, 19, 220, 2, 18, 19, - 220, 103, 18, 19, 220, 99, 18, 19, 219, 207, 18, 19, 159, 219, 207, 18, - 19, 219, 206, 18, 19, 159, 219, 206, 18, 19, 219, 205, 18, 19, 159, 219, - 205, 18, 19, 219, 204, 18, 19, 159, 219, 204, 18, 19, 219, 203, 18, 19, - 159, 219, 203, 18, 19, 219, 209, 18, 19, 159, 219, 209, 18, 19, 219, 208, - 18, 19, 159, 219, 208, 18, 19, 220, 105, 18, 19, 211, 47, 18, 19, 211, - 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210, 244, 18, 19, 210, - 229, 18, 19, 211, 116, 210, 229, 18, 19, 191, 18, 19, 211, 103, 18, 19, - 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18, 19, 159, 210, 173, - 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210, 171, 18, 19, 159, - 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18, 19, 210, 176, 18, - 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210, 175, 18, 19, 229, - 191, 210, 175, 18, 19, 211, 117, 18, 19, 252, 5, 211, 117, 18, 19, 159, - 211, 117, 18, 19, 221, 210, 211, 8, 18, 19, 223, 129, 18, 19, 223, 224, - 223, 129, 18, 19, 159, 233, 59, 18, 19, 223, 184, 18, 19, 223, 36, 18, - 19, 222, 240, 18, 19, 222, 212, 18, 19, 222, 198, 18, 19, 159, 232, 157, - 18, 19, 205, 18, 19, 223, 185, 18, 19, 159, 233, 136, 18, 19, 222, 109, - 18, 19, 159, 222, 109, 18, 19, 153, 18, 19, 159, 153, 18, 19, 147, 153, - 18, 19, 244, 155, 18, 19, 244, 194, 18, 19, 244, 122, 18, 19, 244, 109, - 18, 19, 244, 44, 18, 19, 244, 35, 18, 19, 244, 197, 18, 19, 244, 196, 18, - 19, 243, 213, 18, 19, 159, 243, 213, 18, 19, 245, 7, 18, 19, 216, 196, - 18, 19, 230, 24, 216, 196, 18, 19, 216, 176, 18, 19, 230, 24, 216, 176, - 18, 19, 216, 172, 18, 19, 230, 24, 216, 172, 18, 19, 216, 157, 18, 19, - 216, 154, 18, 19, 216, 209, 18, 19, 216, 208, 18, 19, 216, 128, 18, 19, - 159, 216, 128, 18, 19, 216, 211, 18, 19, 215, 143, 18, 19, 215, 141, 18, - 19, 215, 140, 18, 19, 215, 145, 18, 19, 215, 146, 18, 19, 215, 52, 18, - 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19, 227, 194, 241, - 239, 18, 19, 227, 194, 241, 181, 18, 19, 227, 194, 241, 162, 18, 19, 227, - 194, 241, 69, 18, 19, 227, 194, 241, 54, 18, 19, 227, 194, 162, 18, 19, - 227, 194, 242, 47, 18, 19, 227, 194, 242, 61, 18, 19, 227, 193, 242, 61, - 18, 19, 241, 155, 18, 19, 224, 85, 18, 19, 224, 54, 18, 19, 224, 49, 18, - 19, 224, 43, 18, 19, 224, 38, 18, 19, 224, 89, 18, 19, 224, 88, 18, 19, - 224, 97, 18, 19, 216, 56, 18, 19, 216, 54, 18, 19, 216, 53, 18, 19, 216, - 57, 18, 19, 159, 223, 129, 18, 19, 159, 223, 36, 18, 19, 159, 222, 212, - 18, 19, 159, 205, 18, 19, 229, 76, 18, 19, 229, 28, 18, 19, 229, 24, 18, - 19, 229, 5, 18, 19, 229, 0, 18, 19, 229, 78, 18, 19, 229, 77, 18, 19, - 229, 80, 18, 19, 228, 104, 18, 19, 221, 210, 220, 64, 18, 19, 221, 210, - 220, 33, 18, 19, 221, 210, 220, 8, 18, 19, 221, 210, 220, 103, 18, 19, + 215, 157, 18, 19, 234, 188, 18, 19, 235, 13, 18, 19, 234, 98, 18, 19, + 234, 89, 18, 19, 234, 34, 18, 19, 234, 16, 18, 19, 211, 116, 234, 16, 18, + 19, 176, 18, 19, 235, 16, 18, 19, 233, 184, 18, 19, 159, 233, 184, 18, + 19, 233, 182, 18, 19, 159, 233, 182, 18, 19, 233, 181, 18, 19, 159, 233, + 181, 18, 19, 233, 180, 18, 19, 159, 233, 180, 18, 19, 233, 179, 18, 19, + 159, 233, 179, 18, 19, 233, 188, 18, 19, 159, 233, 188, 18, 19, 233, 187, + 18, 19, 159, 233, 187, 18, 19, 229, 195, 233, 187, 18, 19, 235, 29, 18, + 19, 233, 189, 18, 19, 219, 29, 234, 182, 18, 19, 219, 29, 234, 90, 18, + 19, 219, 29, 234, 29, 18, 19, 219, 29, 234, 254, 18, 19, 250, 198, 18, + 19, 251, 39, 18, 19, 250, 59, 18, 19, 250, 49, 18, 19, 249, 246, 18, 19, + 249, 182, 18, 19, 211, 116, 249, 182, 18, 19, 251, 41, 18, 19, 251, 40, + 18, 19, 249, 87, 18, 19, 159, 249, 87, 18, 19, 249, 85, 18, 19, 159, 249, + 85, 18, 19, 249, 84, 18, 19, 159, 249, 84, 18, 19, 249, 83, 18, 19, 159, + 249, 83, 18, 19, 249, 82, 18, 19, 159, 249, 82, 18, 19, 249, 89, 18, 19, + 159, 249, 89, 18, 19, 249, 88, 18, 19, 159, 249, 88, 18, 19, 229, 195, + 249, 88, 18, 19, 251, 74, 18, 19, 221, 211, 216, 211, 18, 19, 231, 96, + 18, 19, 231, 241, 18, 19, 230, 235, 18, 19, 230, 206, 18, 19, 230, 166, + 18, 19, 230, 137, 18, 19, 211, 116, 230, 137, 18, 19, 186, 18, 19, 231, + 242, 18, 19, 230, 45, 18, 19, 159, 230, 45, 18, 19, 230, 43, 18, 19, 159, + 230, 43, 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 230, 41, 18, 19, + 159, 230, 41, 18, 19, 230, 40, 18, 19, 159, 230, 40, 18, 19, 230, 47, 18, + 19, 159, 230, 47, 18, 19, 230, 46, 18, 19, 159, 230, 46, 18, 19, 229, + 195, 230, 46, 18, 19, 194, 18, 19, 159, 194, 18, 19, 230, 239, 18, 19, + 253, 213, 194, 18, 19, 221, 211, 194, 18, 19, 229, 112, 18, 19, 229, 229, + 18, 19, 228, 238, 18, 19, 228, 213, 18, 19, 228, 79, 18, 19, 228, 69, 18, + 19, 211, 116, 228, 69, 18, 19, 198, 18, 19, 229, 230, 18, 19, 227, 176, + 18, 19, 159, 227, 176, 18, 19, 227, 178, 18, 19, 159, 227, 178, 18, 19, + 227, 177, 18, 19, 159, 227, 177, 18, 19, 229, 195, 227, 177, 18, 19, 230, + 30, 18, 19, 73, 229, 84, 18, 19, 228, 243, 18, 19, 233, 64, 18, 19, 233, + 139, 18, 19, 232, 247, 18, 19, 232, 233, 18, 19, 232, 162, 18, 19, 232, + 133, 18, 19, 211, 116, 232, 133, 18, 19, 233, 141, 18, 19, 233, 140, 18, + 19, 232, 73, 18, 19, 159, 232, 73, 18, 19, 232, 72, 18, 19, 159, 232, 72, + 18, 19, 232, 71, 18, 19, 159, 232, 71, 18, 19, 232, 70, 18, 19, 159, 232, + 70, 18, 19, 232, 69, 18, 19, 159, 232, 69, 18, 19, 232, 75, 18, 19, 159, + 232, 75, 18, 19, 232, 74, 18, 19, 159, 232, 74, 18, 19, 156, 18, 19, 159, + 156, 18, 19, 147, 156, 18, 19, 221, 183, 18, 19, 222, 31, 18, 19, 219, + 193, 18, 19, 219, 177, 18, 19, 219, 60, 18, 19, 219, 42, 18, 19, 211, + 116, 219, 42, 18, 19, 206, 18, 19, 222, 33, 18, 19, 217, 250, 18, 19, + 159, 217, 250, 18, 19, 217, 244, 18, 19, 159, 217, 244, 18, 19, 217, 243, + 18, 19, 159, 217, 243, 18, 19, 217, 239, 18, 19, 159, 217, 239, 18, 19, + 217, 238, 18, 19, 159, 217, 238, 18, 19, 217, 254, 18, 19, 159, 217, 254, + 18, 19, 217, 253, 18, 19, 159, 217, 253, 18, 19, 229, 195, 217, 253, 18, + 19, 222, 93, 18, 19, 253, 213, 222, 93, 18, 19, 217, 255, 18, 19, 251, + 226, 222, 93, 18, 19, 230, 132, 219, 110, 18, 19, 229, 195, 219, 101, 18, + 19, 229, 195, 222, 91, 18, 19, 229, 195, 218, 237, 18, 19, 229, 195, 218, + 87, 18, 19, 229, 195, 219, 100, 18, 19, 229, 195, 221, 186, 18, 19, 220, + 65, 18, 19, 220, 34, 18, 19, 220, 29, 18, 19, 220, 9, 18, 19, 220, 3, 18, + 19, 220, 104, 18, 19, 220, 100, 18, 19, 219, 208, 18, 19, 159, 219, 208, + 18, 19, 219, 207, 18, 19, 159, 219, 207, 18, 19, 219, 206, 18, 19, 159, + 219, 206, 18, 19, 219, 205, 18, 19, 159, 219, 205, 18, 19, 219, 204, 18, + 19, 159, 219, 204, 18, 19, 219, 210, 18, 19, 159, 219, 210, 18, 19, 219, + 209, 18, 19, 159, 219, 209, 18, 19, 220, 106, 18, 19, 211, 47, 18, 19, + 211, 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210, 244, 18, 19, + 210, 229, 18, 19, 211, 116, 210, 229, 18, 19, 192, 18, 19, 211, 103, 18, + 19, 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18, 19, 159, 210, + 173, 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210, 171, 18, 19, + 159, 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18, 19, 210, 176, + 18, 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210, 175, 18, 19, + 229, 195, 210, 175, 18, 19, 211, 117, 18, 19, 252, 12, 211, 117, 18, 19, + 159, 211, 117, 18, 19, 221, 211, 211, 8, 18, 19, 223, 131, 18, 19, 223, + 226, 223, 131, 18, 19, 159, 233, 64, 18, 19, 223, 186, 18, 19, 223, 38, + 18, 19, 222, 242, 18, 19, 222, 213, 18, 19, 222, 199, 18, 19, 159, 232, + 162, 18, 19, 205, 18, 19, 223, 187, 18, 19, 159, 233, 141, 18, 19, 222, + 110, 18, 19, 159, 222, 110, 18, 19, 153, 18, 19, 159, 153, 18, 19, 147, + 153, 18, 19, 244, 162, 18, 19, 244, 201, 18, 19, 244, 129, 18, 19, 244, + 116, 18, 19, 244, 51, 18, 19, 244, 42, 18, 19, 244, 204, 18, 19, 244, + 203, 18, 19, 243, 219, 18, 19, 159, 243, 219, 18, 19, 245, 14, 18, 19, + 216, 196, 18, 19, 230, 28, 216, 196, 18, 19, 216, 176, 18, 19, 230, 28, + 216, 176, 18, 19, 216, 172, 18, 19, 230, 28, 216, 172, 18, 19, 216, 157, + 18, 19, 216, 154, 18, 19, 216, 209, 18, 19, 216, 208, 18, 19, 216, 128, + 18, 19, 159, 216, 128, 18, 19, 216, 211, 18, 19, 215, 143, 18, 19, 215, + 141, 18, 19, 215, 140, 18, 19, 215, 145, 18, 19, 215, 146, 18, 19, 215, + 52, 18, 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19, 227, 197, + 241, 245, 18, 19, 227, 197, 241, 187, 18, 19, 227, 197, 241, 168, 18, 19, + 227, 197, 241, 75, 18, 19, 227, 197, 241, 60, 18, 19, 227, 197, 162, 18, + 19, 227, 197, 242, 53, 18, 19, 227, 197, 242, 67, 18, 19, 227, 196, 242, + 67, 18, 19, 241, 161, 18, 19, 224, 87, 18, 19, 224, 56, 18, 19, 224, 51, + 18, 19, 224, 45, 18, 19, 224, 40, 18, 19, 224, 91, 18, 19, 224, 90, 18, + 19, 224, 99, 18, 19, 216, 56, 18, 19, 216, 54, 18, 19, 216, 53, 18, 19, + 216, 57, 18, 19, 159, 223, 131, 18, 19, 159, 223, 38, 18, 19, 159, 222, + 213, 18, 19, 159, 205, 18, 19, 229, 80, 18, 19, 229, 32, 18, 19, 229, 28, + 18, 19, 229, 9, 18, 19, 229, 4, 18, 19, 229, 82, 18, 19, 229, 81, 18, 19, + 229, 84, 18, 19, 228, 108, 18, 19, 221, 211, 220, 65, 18, 19, 221, 211, + 220, 34, 18, 19, 221, 211, 220, 9, 18, 19, 221, 211, 220, 104, 18, 19, 211, 213, 216, 196, 18, 19, 211, 213, 216, 176, 18, 19, 211, 213, 216, 157, 18, 19, 211, 213, 216, 209, 18, 19, 211, 213, 216, 211, 18, 19, 232, - 249, 18, 19, 232, 248, 18, 19, 232, 247, 18, 19, 232, 246, 18, 19, 232, - 255, 18, 19, 232, 254, 18, 19, 233, 0, 18, 19, 216, 210, 216, 196, 18, - 19, 216, 210, 216, 176, 18, 19, 216, 210, 216, 172, 18, 19, 216, 210, - 216, 157, 18, 19, 216, 210, 216, 154, 18, 19, 216, 210, 216, 209, 18, 19, - 216, 210, 216, 208, 18, 19, 216, 210, 216, 211, 18, 19, 254, 190, 253, - 159, 18, 19, 251, 219, 75, 18, 19, 251, 219, 73, 18, 19, 251, 219, 76, - 18, 19, 251, 219, 61, 18, 19, 251, 219, 212, 22, 18, 19, 251, 219, 211, - 250, 18, 19, 251, 219, 211, 227, 18, 19, 251, 219, 212, 65, 18, 19, 251, - 219, 229, 108, 18, 19, 251, 219, 228, 234, 18, 19, 251, 219, 228, 75, 18, - 19, 251, 219, 197, 18, 19, 251, 219, 234, 183, 18, 19, 251, 219, 234, 93, - 18, 19, 251, 219, 234, 29, 18, 19, 251, 219, 176, 18, 19, 221, 210, 241, - 239, 18, 19, 221, 210, 241, 181, 18, 19, 221, 210, 241, 69, 18, 19, 221, - 210, 162, 18, 19, 72, 242, 221, 18, 19, 72, 242, 225, 18, 19, 72, 242, - 237, 18, 19, 72, 242, 236, 18, 19, 72, 242, 226, 18, 19, 72, 242, 250, - 18, 19, 72, 222, 141, 18, 19, 72, 222, 212, 18, 19, 72, 223, 129, 18, 19, - 72, 223, 109, 18, 19, 72, 223, 36, 18, 19, 72, 205, 18, 19, 72, 211, 195, - 18, 19, 72, 211, 227, 18, 19, 72, 212, 22, 18, 19, 72, 212, 17, 18, 19, - 72, 211, 250, 18, 19, 72, 212, 65, 18, 19, 72, 240, 195, 18, 19, 72, 240, - 196, 18, 19, 72, 240, 199, 18, 19, 72, 240, 198, 18, 19, 72, 240, 197, - 18, 19, 72, 240, 201, 18, 19, 72, 216, 137, 18, 19, 72, 216, 157, 18, 19, - 72, 216, 196, 18, 19, 72, 216, 195, 18, 19, 72, 216, 176, 18, 19, 72, - 216, 209, 18, 19, 72, 215, 124, 18, 19, 72, 215, 134, 18, 19, 72, 215, - 152, 18, 19, 72, 215, 151, 18, 19, 72, 215, 136, 18, 19, 72, 215, 157, - 18, 19, 72, 224, 151, 18, 19, 72, 225, 17, 18, 19, 72, 225, 222, 18, 19, - 72, 225, 212, 18, 19, 72, 225, 109, 18, 19, 72, 190, 18, 19, 72, 226, - 106, 18, 19, 72, 242, 114, 18, 19, 72, 242, 175, 18, 19, 72, 243, 63, 18, - 19, 72, 243, 56, 18, 19, 72, 242, 215, 18, 19, 72, 243, 136, 18, 19, 72, - 234, 101, 18, 19, 72, 234, 106, 18, 19, 72, 234, 120, 18, 19, 72, 234, - 119, 18, 19, 72, 234, 113, 18, 19, 72, 234, 133, 18, 19, 72, 234, 42, 18, - 19, 72, 234, 43, 18, 19, 72, 234, 46, 18, 19, 72, 234, 45, 18, 19, 72, - 234, 44, 18, 19, 72, 234, 47, 18, 19, 72, 234, 48, 18, 19, 72, 227, 238, - 18, 19, 72, 228, 75, 18, 19, 72, 229, 108, 18, 19, 72, 229, 104, 18, 19, - 72, 228, 234, 18, 19, 72, 197, 18, 19, 72, 230, 103, 18, 19, 72, 230, - 162, 18, 19, 72, 231, 92, 18, 19, 72, 231, 81, 18, 19, 72, 230, 231, 18, - 19, 72, 185, 18, 19, 72, 210, 212, 18, 19, 72, 210, 244, 18, 19, 72, 211, - 47, 18, 19, 72, 211, 44, 18, 19, 72, 211, 8, 18, 19, 72, 191, 18, 19, 72, - 235, 52, 18, 19, 221, 210, 235, 52, 18, 19, 72, 235, 69, 18, 19, 72, 235, - 127, 18, 19, 72, 235, 125, 18, 19, 72, 235, 109, 18, 19, 221, 210, 235, - 109, 18, 19, 72, 235, 142, 18, 19, 72, 235, 82, 18, 19, 72, 235, 86, 18, - 19, 72, 235, 96, 18, 19, 72, 235, 95, 18, 19, 72, 235, 94, 18, 19, 72, - 235, 97, 18, 19, 72, 232, 99, 18, 19, 72, 232, 157, 18, 19, 72, 233, 59, - 18, 19, 72, 233, 51, 18, 19, 72, 232, 242, 18, 19, 72, 233, 136, 18, 19, - 72, 247, 150, 18, 19, 72, 247, 151, 18, 19, 72, 247, 156, 18, 19, 72, - 247, 155, 18, 19, 72, 247, 152, 18, 19, 72, 247, 157, 18, 19, 72, 232, - 245, 18, 19, 72, 232, 247, 18, 19, 72, 232, 251, 18, 19, 72, 232, 250, - 18, 19, 72, 232, 249, 18, 19, 72, 232, 255, 18, 19, 72, 216, 51, 18, 19, - 72, 216, 53, 18, 19, 72, 216, 56, 18, 19, 72, 216, 55, 18, 19, 72, 216, - 54, 18, 19, 72, 216, 57, 18, 19, 72, 216, 46, 18, 19, 72, 216, 47, 18, - 19, 72, 216, 59, 18, 19, 72, 216, 58, 18, 19, 72, 216, 48, 18, 19, 72, - 216, 60, 18, 19, 72, 210, 13, 18, 19, 72, 210, 23, 18, 19, 72, 210, 94, - 18, 19, 72, 210, 92, 18, 19, 72, 210, 44, 18, 19, 72, 210, 116, 18, 19, - 72, 210, 159, 18, 19, 72, 65, 210, 159, 18, 19, 72, 246, 29, 18, 19, 72, - 246, 30, 18, 19, 72, 246, 37, 18, 19, 72, 246, 36, 18, 19, 72, 246, 32, - 18, 19, 72, 246, 39, 18, 19, 72, 218, 84, 18, 19, 72, 219, 59, 18, 19, - 72, 221, 182, 18, 19, 72, 221, 171, 18, 19, 72, 219, 192, 18, 19, 72, - 206, 18, 19, 72, 219, 226, 18, 19, 72, 220, 8, 18, 19, 72, 220, 64, 18, - 19, 72, 220, 62, 18, 19, 72, 220, 33, 18, 19, 72, 220, 103, 18, 19, 72, - 220, 105, 18, 19, 72, 215, 164, 18, 19, 72, 215, 167, 18, 19, 72, 215, - 179, 18, 19, 72, 215, 178, 18, 19, 72, 215, 168, 18, 19, 72, 215, 184, - 18, 19, 72, 250, 70, 18, 19, 72, 250, 87, 18, 19, 72, 250, 132, 18, 19, - 72, 250, 129, 18, 19, 72, 250, 111, 18, 19, 72, 250, 158, 18, 19, 72, - 215, 127, 18, 19, 72, 215, 128, 18, 19, 72, 215, 131, 18, 19, 72, 215, - 130, 18, 19, 72, 215, 129, 18, 19, 72, 215, 132, 18, 19, 250, 112, 50, - 18, 19, 243, 230, 218, 130, 18, 19, 224, 81, 18, 19, 229, 74, 18, 19, - 228, 101, 18, 19, 228, 100, 18, 19, 228, 99, 18, 19, 228, 98, 18, 19, - 228, 103, 18, 19, 228, 102, 18, 19, 211, 213, 216, 126, 18, 19, 211, 213, - 216, 125, 18, 19, 211, 213, 216, 124, 18, 19, 211, 213, 216, 123, 18, 19, - 211, 213, 216, 122, 18, 19, 211, 213, 216, 129, 18, 19, 211, 213, 216, - 128, 18, 19, 211, 213, 40, 216, 211, 18, 19, 251, 219, 212, 98, 226, 227, - 219, 20, 78, 226, 227, 1, 252, 49, 226, 227, 1, 232, 88, 226, 227, 1, - 244, 152, 226, 227, 1, 222, 16, 226, 227, 1, 228, 194, 226, 227, 1, 214, - 226, 226, 227, 1, 248, 198, 226, 227, 1, 216, 81, 226, 227, 1, 249, 230, - 226, 227, 1, 250, 181, 226, 227, 1, 230, 92, 226, 227, 1, 242, 157, 226, - 227, 1, 229, 64, 226, 227, 1, 218, 123, 226, 227, 1, 222, 136, 226, 227, - 1, 254, 199, 226, 227, 1, 226, 188, 226, 227, 1, 214, 150, 226, 227, 1, - 245, 232, 226, 227, 1, 235, 189, 226, 227, 1, 245, 233, 226, 227, 1, 226, - 159, 226, 227, 1, 214, 206, 226, 227, 1, 236, 40, 226, 227, 1, 245, 230, - 226, 227, 1, 225, 203, 226, 227, 244, 151, 78, 226, 227, 223, 50, 244, - 151, 78, 178, 1, 244, 142, 244, 134, 244, 156, 245, 7, 178, 1, 214, 105, - 178, 1, 214, 135, 214, 151, 70, 178, 1, 210, 214, 178, 1, 211, 117, 178, - 1, 212, 98, 178, 1, 216, 131, 216, 130, 216, 152, 178, 1, 245, 60, 178, - 1, 254, 94, 61, 178, 1, 226, 144, 76, 178, 1, 255, 18, 61, 178, 1, 254, - 228, 178, 1, 232, 134, 76, 178, 1, 219, 245, 76, 178, 1, 76, 178, 1, 226, - 235, 178, 1, 226, 197, 178, 1, 223, 165, 223, 178, 223, 95, 153, 178, 1, - 234, 194, 178, 1, 250, 178, 178, 1, 234, 195, 235, 24, 178, 1, 243, 203, - 178, 1, 245, 139, 178, 1, 243, 59, 242, 67, 243, 203, 178, 1, 243, 97, - 178, 1, 211, 188, 211, 182, 212, 98, 178, 1, 242, 39, 242, 61, 178, 1, - 242, 43, 242, 61, 178, 1, 232, 136, 242, 61, 178, 1, 219, 248, 242, 61, - 178, 1, 229, 186, 227, 158, 229, 187, 230, 26, 178, 1, 219, 246, 230, 26, - 178, 1, 246, 116, 178, 1, 235, 169, 235, 173, 235, 163, 73, 178, 1, 75, - 178, 1, 235, 118, 235, 145, 178, 1, 243, 44, 178, 1, 232, 137, 254, 244, - 178, 1, 219, 250, 61, 178, 1, 235, 155, 245, 114, 178, 1, 225, 165, 225, - 187, 226, 106, 178, 1, 254, 164, 245, 112, 178, 1, 219, 25, 222, 92, 178, - 1, 219, 180, 232, 133, 222, 92, 178, 1, 219, 244, 222, 92, 178, 1, 251, - 67, 178, 1, 210, 159, 178, 1, 216, 64, 216, 74, 215, 41, 217, 153, 178, - 1, 219, 243, 217, 153, 178, 1, 249, 61, 178, 1, 252, 32, 252, 35, 251, - 225, 253, 159, 178, 1, 219, 249, 253, 159, 178, 1, 246, 115, 178, 1, 226, - 172, 178, 1, 245, 197, 245, 199, 75, 178, 1, 231, 179, 231, 187, 193, - 178, 1, 232, 135, 193, 178, 1, 219, 247, 193, 178, 1, 233, 74, 233, 115, - 232, 144, 156, 178, 1, 246, 117, 178, 1, 235, 231, 178, 1, 235, 232, 178, - 1, 248, 211, 248, 216, 249, 61, 178, 1, 226, 139, 245, 59, 76, 178, 1, - 245, 228, 178, 1, 235, 188, 178, 1, 249, 79, 178, 1, 251, 18, 178, 1, - 250, 190, 178, 1, 218, 162, 178, 1, 232, 132, 178, 1, 219, 242, 178, 1, - 240, 111, 178, 1, 224, 97, 178, 1, 211, 178, 178, 219, 156, 224, 141, - 178, 230, 86, 224, 141, 178, 249, 132, 224, 141, 178, 254, 7, 87, 178, - 215, 82, 87, 178, 252, 47, 87, 217, 84, 1, 61, 217, 84, 1, 73, 217, 84, - 1, 70, 217, 84, 1, 176, 217, 84, 1, 243, 136, 217, 84, 1, 229, 78, 217, - 84, 1, 217, 106, 217, 84, 1, 248, 222, 217, 84, 1, 197, 217, 84, 1, 190, - 217, 84, 1, 252, 192, 217, 84, 1, 185, 217, 84, 1, 191, 217, 84, 1, 233, - 136, 217, 84, 1, 212, 65, 217, 84, 1, 206, 217, 84, 1, 162, 217, 84, 25, - 5, 73, 217, 84, 25, 5, 70, 217, 84, 5, 213, 152, 242, 8, 1, 61, 242, 8, - 1, 73, 242, 8, 1, 70, 242, 8, 1, 176, 242, 8, 1, 243, 136, 242, 8, 1, - 229, 78, 242, 8, 1, 217, 106, 242, 8, 1, 248, 222, 242, 8, 1, 197, 242, - 8, 1, 190, 242, 8, 1, 252, 192, 242, 8, 1, 185, 242, 8, 1, 191, 242, 8, - 1, 205, 242, 8, 1, 233, 136, 242, 8, 1, 212, 65, 242, 8, 1, 206, 242, 8, - 1, 162, 242, 8, 25, 5, 73, 242, 8, 25, 5, 70, 242, 8, 5, 226, 50, 225, - 127, 219, 156, 224, 141, 225, 127, 52, 224, 141, 251, 121, 1, 61, 251, - 121, 1, 73, 251, 121, 1, 70, 251, 121, 1, 176, 251, 121, 1, 243, 136, - 251, 121, 1, 229, 78, 251, 121, 1, 217, 106, 251, 121, 1, 248, 222, 251, - 121, 1, 197, 251, 121, 1, 190, 251, 121, 1, 252, 192, 251, 121, 1, 185, - 251, 121, 1, 191, 251, 121, 1, 205, 251, 121, 1, 233, 136, 251, 121, 1, - 212, 65, 251, 121, 1, 206, 251, 121, 1, 162, 251, 121, 25, 5, 73, 251, - 121, 25, 5, 70, 217, 83, 1, 61, 217, 83, 1, 73, 217, 83, 1, 70, 217, 83, - 1, 176, 217, 83, 1, 243, 136, 217, 83, 1, 229, 78, 217, 83, 1, 217, 106, - 217, 83, 1, 248, 222, 217, 83, 1, 197, 217, 83, 1, 190, 217, 83, 1, 252, - 192, 217, 83, 1, 185, 217, 83, 1, 191, 217, 83, 1, 233, 136, 217, 83, 1, - 212, 65, 217, 83, 1, 206, 217, 83, 25, 5, 73, 217, 83, 25, 5, 70, 69, 1, - 176, 69, 1, 234, 133, 69, 1, 234, 29, 69, 1, 234, 106, 69, 1, 229, 5, 69, - 1, 251, 34, 69, 1, 250, 158, 69, 1, 249, 239, 69, 1, 250, 87, 69, 1, 227, - 135, 69, 1, 248, 222, 69, 1, 215, 145, 69, 1, 247, 146, 69, 1, 215, 140, - 69, 1, 228, 81, 69, 1, 217, 106, 69, 1, 216, 209, 69, 1, 111, 69, 1, 216, - 157, 69, 1, 228, 75, 69, 1, 252, 192, 69, 1, 225, 148, 69, 1, 225, 17, - 69, 1, 225, 122, 69, 1, 230, 162, 69, 1, 210, 244, 69, 1, 222, 212, 69, - 1, 232, 157, 69, 1, 213, 138, 69, 1, 220, 103, 69, 1, 218, 185, 69, 1, - 206, 69, 1, 162, 69, 1, 233, 136, 69, 1, 224, 89, 69, 235, 244, 25, 224, - 75, 69, 235, 244, 25, 224, 88, 69, 235, 244, 25, 224, 54, 69, 235, 244, - 25, 224, 49, 69, 235, 244, 25, 224, 31, 69, 235, 244, 25, 224, 3, 69, - 235, 244, 25, 223, 247, 69, 235, 244, 25, 223, 246, 69, 235, 244, 25, - 222, 101, 69, 235, 244, 25, 222, 94, 69, 235, 244, 25, 232, 63, 69, 235, - 244, 25, 232, 53, 69, 235, 244, 25, 224, 70, 69, 235, 244, 25, 224, 81, - 69, 235, 244, 25, 224, 39, 215, 49, 110, 69, 235, 244, 25, 224, 39, 215, - 49, 105, 69, 235, 244, 25, 224, 71, 69, 25, 235, 230, 254, 46, 69, 25, - 235, 230, 255, 74, 69, 25, 5, 255, 74, 69, 25, 5, 73, 69, 25, 5, 236, 34, - 69, 25, 5, 211, 117, 69, 25, 5, 210, 169, 69, 25, 5, 70, 69, 25, 5, 214, - 118, 69, 25, 5, 214, 229, 69, 25, 5, 226, 235, 69, 25, 5, 191, 69, 25, 5, - 236, 61, 69, 25, 5, 75, 69, 25, 5, 254, 244, 69, 25, 5, 254, 202, 69, 25, - 5, 226, 184, 69, 25, 5, 253, 193, 69, 5, 228, 207, 69, 5, 223, 127, 69, - 5, 210, 180, 69, 5, 230, 53, 69, 5, 215, 214, 69, 5, 252, 144, 69, 5, - 222, 207, 69, 5, 216, 41, 69, 5, 234, 242, 69, 5, 254, 204, 69, 5, 221, - 245, 221, 239, 69, 5, 213, 149, 69, 5, 249, 233, 69, 5, 252, 118, 69, 5, - 234, 126, 69, 5, 252, 138, 69, 5, 251, 10, 225, 73, 233, 188, 69, 5, 233, - 31, 216, 18, 69, 5, 252, 21, 69, 5, 225, 124, 230, 100, 69, 5, 234, 10, - 69, 249, 99, 16, 223, 29, 69, 5, 253, 175, 69, 5, 253, 196, 69, 21, 210, - 86, 69, 21, 110, 69, 21, 105, 69, 21, 158, 69, 21, 161, 69, 21, 189, 69, - 21, 194, 69, 21, 198, 69, 21, 195, 69, 21, 200, 69, 16, 233, 31, 253, - 198, 219, 44, 69, 16, 233, 31, 253, 198, 230, 72, 69, 16, 233, 31, 253, - 198, 225, 72, 69, 16, 233, 31, 253, 198, 252, 50, 69, 16, 233, 31, 253, - 198, 251, 104, 69, 16, 233, 31, 253, 198, 224, 216, 69, 16, 233, 31, 253, - 198, 224, 210, 69, 16, 233, 31, 253, 198, 224, 208, 69, 16, 233, 31, 253, - 198, 224, 214, 69, 16, 233, 31, 253, 198, 224, 212, 83, 251, 237, 83, - 245, 164, 83, 249, 220, 83, 243, 230, 218, 130, 83, 249, 227, 83, 244, - 12, 247, 119, 83, 216, 40, 219, 53, 240, 169, 83, 219, 191, 3, 251, 173, - 231, 155, 83, 231, 184, 249, 220, 83, 231, 184, 243, 230, 218, 130, 83, - 228, 192, 83, 243, 254, 45, 221, 158, 110, 83, 243, 254, 45, 221, 158, - 105, 83, 243, 254, 45, 221, 158, 158, 83, 25, 220, 138, 83, 21, 210, 86, - 83, 21, 110, 83, 21, 105, 83, 21, 158, 83, 21, 161, 83, 21, 189, 83, 21, - 194, 83, 21, 198, 83, 21, 195, 83, 21, 200, 83, 1, 61, 83, 1, 75, 83, 1, - 73, 83, 1, 76, 83, 1, 70, 83, 1, 226, 235, 83, 1, 214, 214, 83, 1, 245, - 210, 83, 1, 197, 83, 1, 254, 116, 83, 1, 252, 192, 83, 1, 190, 83, 1, - 224, 89, 83, 1, 243, 136, 83, 1, 185, 83, 1, 233, 136, 83, 1, 206, 83, 1, - 220, 103, 83, 1, 217, 106, 83, 1, 248, 222, 83, 1, 250, 158, 83, 1, 235, - 142, 83, 1, 191, 83, 1, 205, 83, 1, 212, 65, 83, 1, 244, 197, 83, 1, 176, - 83, 1, 234, 133, 83, 1, 215, 184, 83, 1, 210, 116, 83, 1, 242, 47, 83, 1, - 210, 16, 83, 1, 232, 255, 83, 1, 210, 69, 83, 1, 250, 111, 83, 1, 216, - 40, 199, 25, 50, 83, 1, 216, 40, 75, 83, 1, 216, 40, 73, 83, 1, 216, 40, - 76, 83, 1, 216, 40, 70, 83, 1, 216, 40, 226, 235, 83, 1, 216, 40, 214, - 214, 83, 1, 216, 40, 254, 116, 83, 1, 216, 40, 252, 192, 83, 1, 216, 40, - 190, 83, 1, 216, 40, 224, 89, 83, 1, 216, 40, 243, 136, 83, 1, 216, 40, - 185, 83, 1, 216, 40, 217, 106, 83, 1, 216, 40, 248, 222, 83, 1, 216, 40, - 250, 158, 83, 1, 216, 40, 235, 142, 83, 1, 216, 40, 215, 184, 83, 1, 216, - 40, 191, 83, 1, 216, 40, 212, 65, 83, 1, 216, 40, 176, 83, 1, 216, 40, - 243, 133, 83, 1, 216, 40, 242, 47, 83, 1, 216, 40, 235, 108, 83, 1, 216, - 40, 228, 232, 83, 1, 216, 40, 246, 39, 83, 1, 219, 191, 75, 83, 1, 219, - 191, 73, 83, 1, 219, 191, 235, 153, 83, 1, 219, 191, 214, 214, 83, 1, - 219, 191, 70, 83, 1, 219, 191, 254, 116, 83, 1, 219, 191, 176, 83, 1, - 219, 191, 243, 136, 83, 1, 219, 191, 162, 83, 1, 219, 191, 190, 83, 1, - 219, 191, 220, 103, 83, 1, 219, 191, 217, 106, 83, 1, 219, 191, 248, 222, - 83, 1, 219, 191, 235, 142, 83, 1, 219, 191, 244, 197, 83, 1, 219, 191, - 243, 133, 83, 1, 219, 191, 242, 47, 83, 1, 219, 191, 215, 184, 83, 1, - 219, 191, 210, 116, 83, 1, 219, 191, 223, 185, 83, 1, 219, 191, 250, 158, - 83, 1, 219, 191, 210, 82, 83, 1, 231, 184, 73, 83, 1, 231, 184, 176, 83, - 1, 231, 184, 205, 83, 1, 231, 184, 244, 197, 83, 1, 231, 184, 210, 82, - 83, 1, 254, 163, 243, 117, 254, 77, 110, 83, 1, 254, 163, 243, 117, 213, - 148, 110, 83, 1, 254, 163, 243, 117, 248, 187, 83, 1, 254, 163, 243, 117, - 214, 224, 83, 1, 254, 163, 243, 117, 235, 194, 214, 224, 83, 1, 254, 163, - 243, 117, 252, 156, 83, 1, 254, 163, 243, 117, 134, 252, 156, 83, 1, 254, - 163, 243, 117, 61, 83, 1, 254, 163, 243, 117, 73, 83, 1, 254, 163, 243, - 117, 176, 83, 1, 254, 163, 243, 117, 229, 78, 83, 1, 254, 163, 243, 117, - 251, 34, 83, 1, 254, 163, 243, 117, 215, 157, 83, 1, 254, 163, 243, 117, - 215, 145, 83, 1, 254, 163, 243, 117, 248, 136, 83, 1, 254, 163, 243, 117, - 228, 111, 83, 1, 254, 163, 243, 117, 217, 106, 83, 1, 254, 163, 243, 117, - 248, 222, 83, 1, 254, 163, 243, 117, 190, 83, 1, 254, 163, 243, 117, 225, - 148, 83, 1, 254, 163, 243, 117, 218, 224, 83, 1, 254, 163, 243, 117, 210, - 82, 83, 1, 254, 163, 243, 117, 210, 116, 83, 1, 254, 163, 243, 117, 254, - 210, 83, 1, 216, 40, 254, 163, 243, 117, 217, 106, 83, 1, 216, 40, 254, - 163, 243, 117, 210, 82, 83, 1, 231, 184, 254, 163, 243, 117, 242, 250, - 83, 1, 231, 184, 254, 163, 243, 117, 229, 78, 83, 1, 231, 184, 254, 163, - 243, 117, 251, 34, 83, 1, 231, 184, 254, 163, 243, 117, 235, 115, 83, 1, - 231, 184, 254, 163, 243, 117, 215, 157, 83, 1, 231, 184, 254, 163, 243, - 117, 248, 120, 83, 1, 231, 184, 254, 163, 243, 117, 217, 106, 83, 1, 231, - 184, 254, 163, 243, 117, 248, 26, 83, 1, 231, 184, 254, 163, 243, 117, - 218, 224, 83, 1, 231, 184, 254, 163, 243, 117, 249, 73, 83, 1, 231, 184, - 254, 163, 243, 117, 210, 82, 83, 1, 231, 184, 254, 163, 243, 117, 210, - 116, 83, 1, 254, 163, 243, 117, 163, 70, 83, 1, 254, 163, 243, 117, 163, - 191, 83, 1, 231, 184, 254, 163, 243, 117, 252, 19, 83, 1, 254, 163, 243, - 117, 248, 212, 83, 1, 231, 184, 254, 163, 243, 117, 232, 255, 18, 19, - 226, 110, 18, 19, 253, 168, 18, 19, 255, 29, 18, 19, 212, 25, 18, 19, - 224, 222, 18, 19, 225, 230, 18, 19, 224, 106, 18, 19, 217, 32, 18, 19, - 234, 190, 18, 19, 233, 180, 18, 19, 231, 133, 18, 19, 228, 38, 18, 19, - 229, 182, 18, 19, 233, 69, 18, 19, 219, 23, 18, 19, 221, 212, 18, 19, - 219, 233, 18, 19, 220, 67, 18, 19, 219, 202, 18, 19, 210, 220, 18, 19, - 211, 52, 18, 19, 223, 135, 18, 19, 227, 172, 18, 19, 226, 217, 227, 172, - 18, 19, 227, 171, 18, 19, 226, 217, 227, 171, 18, 19, 227, 170, 18, 19, - 226, 217, 227, 170, 18, 19, 227, 169, 18, 19, 226, 217, 227, 169, 18, 19, - 222, 106, 18, 19, 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19, - 222, 102, 18, 19, 222, 110, 18, 19, 226, 217, 226, 106, 18, 19, 226, 217, - 217, 153, 18, 19, 226, 217, 235, 24, 18, 19, 226, 217, 251, 67, 18, 19, - 226, 217, 193, 18, 19, 226, 217, 230, 26, 18, 19, 226, 217, 222, 92, 18, - 19, 226, 217, 220, 105, 18, 19, 245, 220, 212, 98, 18, 19, 212, 7, 212, - 98, 18, 19, 40, 4, 222, 234, 18, 19, 40, 223, 158, 247, 121, 18, 19, 223, - 224, 222, 107, 18, 19, 159, 232, 128, 18, 19, 159, 233, 135, 18, 19, 216, - 127, 18, 19, 216, 129, 18, 19, 215, 137, 18, 19, 215, 139, 18, 19, 215, - 144, 18, 19, 216, 50, 18, 19, 216, 52, 18, 19, 221, 210, 219, 207, 18, - 19, 221, 210, 220, 2, 18, 19, 221, 210, 241, 54, 18, 19, 72, 242, 74, 18, - 19, 72, 248, 53, 243, 56, 18, 19, 72, 243, 133, 18, 19, 72, 242, 79, 18, - 19, 221, 210, 235, 34, 18, 19, 72, 235, 32, 18, 19, 252, 69, 248, 53, - 156, 18, 19, 252, 69, 248, 53, 153, 18, 19, 72, 248, 48, 222, 92, 232, - 224, 213, 122, 233, 11, 232, 224, 1, 176, 232, 224, 1, 234, 133, 232, - 224, 1, 243, 136, 232, 224, 1, 242, 250, 232, 224, 1, 229, 78, 232, 224, - 1, 251, 34, 232, 224, 1, 250, 158, 232, 224, 1, 235, 142, 232, 224, 1, - 235, 115, 232, 224, 1, 211, 71, 232, 224, 1, 217, 106, 232, 224, 1, 216, - 209, 232, 224, 1, 248, 222, 232, 224, 1, 248, 26, 232, 224, 1, 197, 232, - 224, 1, 190, 232, 224, 1, 225, 148, 232, 224, 1, 252, 192, 232, 224, 1, - 252, 19, 232, 224, 1, 185, 232, 224, 1, 191, 232, 224, 1, 205, 232, 224, - 1, 233, 136, 232, 224, 1, 212, 65, 232, 224, 1, 220, 103, 232, 224, 1, - 218, 224, 232, 224, 1, 206, 232, 224, 1, 162, 232, 224, 25, 5, 61, 232, - 224, 25, 5, 73, 232, 224, 25, 5, 70, 232, 224, 25, 5, 245, 210, 232, 224, - 25, 5, 254, 202, 232, 224, 25, 5, 226, 184, 232, 224, 25, 5, 253, 193, - 232, 224, 25, 5, 75, 232, 224, 25, 5, 76, 232, 224, 218, 74, 1, 191, 232, - 224, 218, 74, 1, 205, 232, 224, 218, 74, 1, 212, 65, 232, 224, 4, 1, 176, - 232, 224, 4, 1, 229, 78, 232, 224, 4, 1, 254, 76, 232, 224, 4, 1, 217, - 106, 232, 224, 4, 1, 197, 232, 224, 4, 1, 190, 232, 224, 4, 1, 185, 232, - 224, 4, 1, 205, 232, 224, 4, 1, 233, 136, 232, 224, 5, 230, 90, 232, 224, - 5, 234, 172, 232, 224, 5, 222, 33, 232, 224, 5, 232, 128, 232, 224, 245, - 32, 78, 232, 224, 224, 14, 78, 232, 224, 21, 210, 86, 232, 224, 21, 110, - 232, 224, 21, 105, 232, 224, 21, 158, 232, 224, 21, 161, 232, 224, 21, - 189, 232, 224, 21, 194, 232, 224, 21, 198, 232, 224, 21, 195, 232, 224, - 21, 200, 39, 233, 60, 1, 176, 39, 233, 60, 1, 211, 165, 39, 233, 60, 1, - 229, 78, 39, 233, 60, 1, 215, 184, 39, 233, 60, 1, 206, 39, 233, 60, 1, - 191, 39, 233, 60, 1, 217, 106, 39, 233, 60, 1, 216, 209, 39, 233, 60, 1, - 233, 136, 39, 233, 60, 1, 190, 39, 233, 60, 1, 225, 148, 39, 233, 60, 1, - 185, 39, 233, 60, 1, 244, 197, 39, 233, 60, 1, 214, 27, 39, 233, 60, 1, - 162, 39, 233, 60, 1, 224, 89, 39, 233, 60, 1, 234, 133, 39, 233, 60, 1, - 215, 176, 39, 233, 60, 1, 197, 39, 233, 60, 1, 61, 39, 233, 60, 1, 73, - 39, 233, 60, 1, 245, 210, 39, 233, 60, 1, 245, 198, 39, 233, 60, 1, 70, - 39, 233, 60, 1, 226, 184, 39, 233, 60, 1, 76, 39, 233, 60, 1, 214, 214, - 39, 233, 60, 1, 75, 39, 233, 60, 1, 253, 191, 39, 233, 60, 1, 254, 202, - 39, 233, 60, 1, 216, 29, 39, 233, 60, 1, 216, 28, 39, 233, 60, 1, 216, - 27, 39, 233, 60, 1, 216, 26, 39, 233, 60, 1, 216, 25, 166, 39, 173, 1, - 125, 224, 89, 166, 39, 173, 1, 121, 224, 89, 166, 39, 173, 1, 125, 176, - 166, 39, 173, 1, 125, 211, 165, 166, 39, 173, 1, 125, 229, 78, 166, 39, - 173, 1, 121, 176, 166, 39, 173, 1, 121, 211, 165, 166, 39, 173, 1, 121, - 229, 78, 166, 39, 173, 1, 125, 215, 184, 166, 39, 173, 1, 125, 206, 166, - 39, 173, 1, 125, 191, 166, 39, 173, 1, 121, 215, 184, 166, 39, 173, 1, - 121, 206, 166, 39, 173, 1, 121, 191, 166, 39, 173, 1, 125, 217, 106, 166, - 39, 173, 1, 125, 216, 209, 166, 39, 173, 1, 125, 197, 166, 39, 173, 1, - 121, 217, 106, 166, 39, 173, 1, 121, 216, 209, 166, 39, 173, 1, 121, 197, - 166, 39, 173, 1, 125, 190, 166, 39, 173, 1, 125, 225, 148, 166, 39, 173, - 1, 125, 185, 166, 39, 173, 1, 121, 190, 166, 39, 173, 1, 121, 225, 148, - 166, 39, 173, 1, 121, 185, 166, 39, 173, 1, 125, 244, 197, 166, 39, 173, - 1, 125, 214, 27, 166, 39, 173, 1, 125, 233, 136, 166, 39, 173, 1, 121, - 244, 197, 166, 39, 173, 1, 121, 214, 27, 166, 39, 173, 1, 121, 233, 136, - 166, 39, 173, 1, 125, 162, 166, 39, 173, 1, 125, 248, 222, 166, 39, 173, - 1, 125, 252, 192, 166, 39, 173, 1, 121, 162, 166, 39, 173, 1, 121, 248, - 222, 166, 39, 173, 1, 121, 252, 192, 166, 39, 173, 1, 125, 233, 185, 166, - 39, 173, 1, 125, 211, 138, 166, 39, 173, 1, 121, 233, 185, 166, 39, 173, - 1, 121, 211, 138, 166, 39, 173, 1, 125, 218, 83, 166, 39, 173, 1, 121, - 218, 83, 166, 39, 173, 25, 5, 25, 219, 240, 166, 39, 173, 25, 5, 255, 74, - 166, 39, 173, 25, 5, 236, 34, 166, 39, 173, 25, 5, 70, 166, 39, 173, 25, - 5, 214, 118, 166, 39, 173, 25, 5, 75, 166, 39, 173, 25, 5, 254, 244, 166, - 39, 173, 25, 5, 76, 166, 39, 173, 25, 5, 227, 1, 166, 39, 173, 25, 5, - 214, 214, 166, 39, 173, 25, 5, 253, 168, 166, 39, 173, 25, 5, 255, 29, - 166, 39, 173, 25, 5, 214, 111, 166, 39, 173, 25, 5, 226, 110, 166, 39, - 173, 25, 5, 226, 254, 166, 39, 173, 25, 5, 214, 210, 166, 39, 173, 25, 5, - 235, 153, 166, 39, 173, 1, 40, 214, 105, 166, 39, 173, 1, 40, 229, 80, - 166, 39, 173, 1, 40, 230, 26, 166, 39, 173, 1, 40, 193, 166, 39, 173, 1, - 40, 235, 24, 166, 39, 173, 1, 40, 249, 61, 166, 39, 173, 1, 40, 253, 159, - 166, 39, 173, 138, 231, 159, 166, 39, 173, 138, 231, 158, 166, 39, 173, - 21, 210, 86, 166, 39, 173, 21, 110, 166, 39, 173, 21, 105, 166, 39, 173, - 21, 158, 166, 39, 173, 21, 161, 166, 39, 173, 21, 189, 166, 39, 173, 21, - 194, 166, 39, 173, 21, 198, 166, 39, 173, 21, 195, 166, 39, 173, 21, 200, - 166, 39, 173, 89, 21, 110, 166, 39, 173, 5, 233, 121, 166, 39, 173, 5, - 233, 120, 69, 16, 225, 237, 69, 16, 230, 73, 234, 26, 69, 16, 225, 73, - 234, 26, 69, 16, 252, 51, 234, 26, 69, 16, 251, 105, 234, 26, 69, 16, - 224, 217, 234, 26, 69, 16, 224, 211, 234, 26, 69, 16, 224, 209, 234, 26, - 69, 16, 224, 215, 234, 26, 69, 16, 224, 213, 234, 26, 69, 16, 248, 174, - 234, 26, 69, 16, 248, 170, 234, 26, 69, 16, 248, 169, 234, 26, 69, 16, - 248, 172, 234, 26, 69, 16, 248, 171, 234, 26, 69, 16, 248, 168, 234, 26, - 69, 16, 215, 87, 69, 16, 230, 73, 222, 206, 69, 16, 225, 73, 222, 206, - 69, 16, 252, 51, 222, 206, 69, 16, 251, 105, 222, 206, 69, 16, 224, 217, - 222, 206, 69, 16, 224, 211, 222, 206, 69, 16, 224, 209, 222, 206, 69, 16, - 224, 215, 222, 206, 69, 16, 224, 213, 222, 206, 69, 16, 248, 174, 222, - 206, 69, 16, 248, 170, 222, 206, 69, 16, 248, 169, 222, 206, 69, 16, 248, - 172, 222, 206, 69, 16, 248, 171, 222, 206, 69, 16, 248, 168, 222, 206, - 251, 122, 1, 176, 251, 122, 1, 243, 136, 251, 122, 1, 229, 78, 251, 122, - 1, 229, 23, 251, 122, 1, 190, 251, 122, 1, 252, 192, 251, 122, 1, 185, - 251, 122, 1, 230, 106, 251, 122, 1, 217, 106, 251, 122, 1, 248, 222, 251, - 122, 1, 197, 251, 122, 1, 228, 37, 251, 122, 1, 251, 34, 251, 122, 1, - 235, 142, 251, 122, 1, 227, 166, 251, 122, 1, 227, 159, 251, 122, 1, 191, - 251, 122, 1, 205, 251, 122, 1, 233, 136, 251, 122, 1, 214, 27, 251, 122, - 1, 206, 251, 122, 1, 61, 251, 122, 1, 162, 251, 122, 25, 5, 73, 251, 122, - 25, 5, 70, 251, 122, 25, 5, 75, 251, 122, 25, 5, 76, 251, 122, 25, 5, - 254, 244, 251, 122, 226, 61, 251, 122, 245, 144, 64, 221, 173, 39, 89, 1, - 125, 176, 39, 89, 1, 125, 234, 133, 39, 89, 1, 125, 233, 172, 39, 89, 1, - 121, 176, 39, 89, 1, 121, 233, 172, 39, 89, 1, 121, 234, 133, 39, 89, 1, - 229, 78, 39, 89, 1, 125, 251, 34, 39, 89, 1, 125, 250, 158, 39, 89, 1, - 121, 251, 34, 39, 89, 1, 121, 206, 39, 89, 1, 121, 250, 158, 39, 89, 1, - 227, 166, 39, 89, 1, 223, 141, 39, 89, 1, 125, 223, 139, 39, 89, 1, 248, - 222, 39, 89, 1, 121, 223, 139, 39, 89, 1, 223, 150, 39, 89, 1, 125, 217, - 106, 39, 89, 1, 125, 216, 209, 39, 89, 1, 121, 217, 106, 39, 89, 1, 121, - 216, 209, 39, 89, 1, 197, 39, 89, 1, 252, 192, 39, 89, 1, 125, 190, 39, - 89, 1, 125, 225, 148, 39, 89, 1, 125, 244, 197, 39, 89, 1, 121, 190, 39, - 89, 1, 121, 244, 197, 39, 89, 1, 121, 225, 148, 39, 89, 1, 185, 39, 89, - 1, 121, 191, 39, 89, 1, 125, 191, 39, 89, 1, 205, 39, 89, 1, 222, 138, - 39, 89, 1, 233, 136, 39, 89, 1, 232, 94, 39, 89, 1, 212, 65, 39, 89, 1, - 125, 220, 103, 39, 89, 1, 125, 218, 224, 39, 89, 1, 125, 206, 39, 89, 1, - 125, 162, 39, 89, 1, 232, 185, 39, 89, 1, 61, 39, 89, 1, 121, 162, 39, - 89, 1, 73, 39, 89, 1, 236, 34, 39, 89, 1, 70, 39, 89, 1, 214, 118, 39, - 89, 1, 245, 210, 39, 89, 1, 226, 184, 39, 89, 1, 233, 121, 39, 89, 1, - 242, 133, 206, 39, 89, 116, 5, 147, 205, 39, 89, 116, 5, 147, 233, 136, - 39, 89, 116, 5, 233, 137, 217, 59, 233, 110, 39, 89, 5, 231, 205, 234, - 232, 233, 110, 39, 89, 116, 5, 40, 229, 78, 39, 89, 116, 5, 121, 190, 39, - 89, 116, 5, 125, 223, 140, 177, 121, 190, 39, 89, 116, 5, 185, 39, 89, - 116, 5, 252, 192, 39, 89, 116, 5, 206, 39, 89, 5, 222, 11, 39, 89, 25, 5, - 61, 39, 89, 25, 5, 231, 205, 221, 227, 39, 89, 25, 5, 255, 74, 39, 89, - 25, 5, 217, 65, 255, 74, 39, 89, 25, 5, 73, 39, 89, 25, 5, 236, 34, 39, - 89, 25, 5, 214, 214, 39, 89, 25, 5, 214, 117, 39, 89, 25, 5, 70, 39, 89, - 25, 5, 214, 118, 39, 89, 25, 5, 76, 39, 89, 25, 5, 227, 2, 51, 39, 89, - 25, 5, 226, 110, 39, 89, 25, 5, 75, 39, 89, 25, 5, 254, 244, 39, 89, 25, - 5, 226, 184, 39, 89, 25, 5, 254, 202, 39, 89, 25, 5, 89, 254, 202, 39, - 89, 25, 5, 227, 2, 48, 39, 89, 5, 231, 205, 234, 231, 39, 89, 5, 216, 30, - 39, 89, 5, 216, 29, 39, 89, 5, 234, 98, 216, 28, 39, 89, 5, 234, 98, 216, - 27, 39, 89, 5, 234, 98, 216, 26, 39, 89, 5, 223, 189, 242, 46, 39, 89, 5, - 231, 205, 221, 254, 39, 89, 5, 234, 97, 234, 216, 39, 89, 38, 249, 116, - 247, 121, 39, 89, 241, 47, 21, 210, 86, 39, 89, 241, 47, 21, 110, 39, 89, - 241, 47, 21, 105, 39, 89, 241, 47, 21, 158, 39, 89, 241, 47, 21, 161, 39, - 89, 241, 47, 21, 189, 39, 89, 241, 47, 21, 194, 39, 89, 241, 47, 21, 198, - 39, 89, 241, 47, 21, 195, 39, 89, 241, 47, 21, 200, 39, 89, 89, 21, 210, - 86, 39, 89, 89, 21, 110, 39, 89, 89, 21, 105, 39, 89, 89, 21, 158, 39, - 89, 89, 21, 161, 39, 89, 89, 21, 189, 39, 89, 89, 21, 194, 39, 89, 89, - 21, 198, 39, 89, 89, 21, 195, 39, 89, 89, 21, 200, 39, 89, 5, 211, 249, - 39, 89, 5, 211, 248, 39, 89, 5, 221, 216, 39, 89, 5, 234, 161, 39, 89, 5, - 240, 233, 39, 89, 5, 247, 135, 39, 89, 5, 223, 50, 222, 188, 223, 150, - 39, 89, 5, 231, 205, 211, 72, 39, 89, 5, 235, 7, 39, 89, 5, 235, 6, 39, - 89, 5, 221, 223, 39, 89, 5, 221, 222, 39, 89, 5, 242, 10, 39, 89, 5, 251, - 31, 102, 5, 214, 200, 223, 31, 102, 5, 214, 200, 251, 2, 102, 5, 250, - 187, 102, 5, 218, 16, 102, 5, 251, 234, 102, 1, 254, 185, 102, 1, 254, - 186, 217, 14, 102, 1, 236, 30, 102, 1, 236, 31, 217, 14, 102, 1, 214, - 203, 102, 1, 214, 204, 217, 14, 102, 1, 223, 189, 223, 80, 102, 1, 223, - 189, 223, 81, 217, 14, 102, 1, 233, 137, 233, 25, 102, 1, 233, 137, 233, - 26, 217, 14, 102, 1, 245, 180, 102, 1, 254, 200, 102, 1, 226, 213, 102, - 1, 226, 214, 217, 14, 102, 1, 176, 102, 1, 235, 14, 231, 208, 102, 1, - 243, 136, 102, 1, 243, 137, 242, 162, 102, 1, 229, 78, 102, 1, 251, 34, - 102, 1, 251, 35, 233, 124, 102, 1, 235, 142, 102, 1, 235, 143, 235, 119, - 102, 1, 227, 166, 102, 1, 217, 107, 233, 77, 102, 1, 217, 107, 230, 68, - 231, 208, 102, 1, 248, 223, 230, 68, 254, 146, 102, 1, 248, 223, 230, 68, - 231, 208, 102, 1, 229, 230, 223, 153, 102, 1, 217, 106, 102, 1, 217, 107, - 217, 36, 102, 1, 248, 222, 102, 1, 248, 223, 231, 226, 102, 1, 197, 102, - 1, 190, 102, 1, 226, 91, 234, 227, 102, 1, 252, 192, 102, 1, 252, 193, - 234, 173, 102, 1, 185, 102, 1, 191, 102, 1, 205, 102, 1, 233, 136, 102, - 1, 212, 65, 102, 1, 222, 35, 222, 21, 102, 1, 222, 35, 221, 234, 102, 1, - 206, 102, 1, 162, 102, 5, 223, 71, 102, 25, 5, 217, 14, 102, 25, 5, 214, - 199, 102, 25, 5, 214, 200, 221, 230, 102, 25, 5, 218, 48, 102, 25, 5, - 218, 49, 236, 22, 102, 25, 5, 223, 189, 223, 80, 102, 25, 5, 223, 189, - 223, 81, 217, 14, 102, 25, 5, 233, 137, 233, 25, 102, 25, 5, 233, 137, - 233, 26, 217, 14, 102, 25, 5, 217, 66, 102, 25, 5, 217, 67, 223, 80, 102, - 25, 5, 217, 67, 217, 14, 102, 25, 5, 217, 67, 223, 81, 217, 14, 102, 25, - 5, 225, 185, 102, 25, 5, 225, 186, 217, 14, 102, 254, 251, 254, 250, 102, - 1, 234, 252, 221, 229, 102, 1, 234, 103, 221, 229, 102, 1, 215, 34, 221, - 229, 102, 1, 245, 204, 221, 229, 102, 1, 214, 0, 221, 229, 102, 1, 210, - 107, 221, 229, 102, 1, 253, 210, 221, 229, 102, 21, 210, 86, 102, 21, - 110, 102, 21, 105, 102, 21, 158, 102, 21, 161, 102, 21, 189, 102, 21, - 194, 102, 21, 198, 102, 21, 195, 102, 21, 200, 102, 226, 30, 102, 226, - 56, 102, 211, 238, 102, 250, 237, 226, 49, 102, 250, 237, 219, 173, 102, - 250, 237, 226, 3, 102, 226, 55, 102, 28, 16, 247, 127, 102, 28, 16, 248, - 52, 102, 28, 16, 246, 65, 102, 28, 16, 248, 177, 102, 28, 16, 248, 178, - 218, 16, 102, 28, 16, 247, 206, 102, 28, 16, 248, 215, 102, 28, 16, 248, - 34, 102, 28, 16, 248, 199, 102, 28, 16, 248, 178, 243, 58, 102, 28, 16, - 38, 217, 10, 102, 28, 16, 38, 245, 142, 102, 28, 16, 38, 234, 168, 102, - 28, 16, 38, 234, 170, 102, 28, 16, 38, 235, 123, 102, 28, 16, 38, 234, - 169, 2, 235, 123, 102, 28, 16, 38, 234, 171, 2, 235, 123, 102, 28, 16, - 38, 252, 38, 102, 28, 16, 38, 242, 166, 102, 28, 16, 222, 250, 204, 246, - 75, 102, 28, 16, 222, 250, 204, 248, 213, 102, 28, 16, 222, 250, 250, 1, - 215, 112, 102, 28, 16, 222, 250, 250, 1, 217, 74, 102, 28, 16, 233, 45, - 204, 226, 44, 102, 28, 16, 233, 45, 204, 224, 140, 102, 28, 16, 233, 45, - 250, 1, 225, 39, 102, 28, 16, 233, 45, 250, 1, 225, 27, 102, 28, 16, 233, - 45, 204, 225, 62, 207, 5, 226, 27, 207, 5, 226, 40, 207, 5, 226, 36, 207, - 1, 61, 207, 1, 73, 207, 1, 70, 207, 1, 254, 244, 207, 1, 76, 207, 1, 75, - 207, 1, 245, 56, 207, 1, 176, 207, 1, 224, 89, 207, 1, 243, 136, 207, 1, - 229, 78, 207, 1, 251, 34, 207, 1, 235, 142, 207, 1, 210, 116, 207, 1, - 227, 166, 207, 1, 217, 106, 207, 1, 248, 222, 207, 1, 197, 207, 1, 190, - 207, 1, 244, 197, 207, 1, 214, 27, 207, 1, 252, 192, 207, 1, 185, 207, 1, - 191, 207, 1, 205, 207, 1, 233, 136, 207, 1, 212, 65, 207, 1, 206, 207, 1, - 211, 165, 207, 1, 162, 207, 116, 5, 226, 53, 207, 116, 5, 226, 29, 207, - 116, 5, 226, 26, 207, 25, 5, 226, 43, 207, 25, 5, 226, 25, 207, 25, 5, - 226, 47, 207, 25, 5, 226, 35, 207, 25, 5, 226, 54, 207, 25, 5, 226, 45, - 207, 5, 226, 57, 207, 5, 213, 152, 207, 116, 5, 225, 249, 185, 207, 116, - 5, 225, 249, 212, 65, 207, 1, 234, 133, 207, 1, 217, 232, 207, 21, 210, - 86, 207, 21, 110, 207, 21, 105, 207, 21, 158, 207, 21, 161, 207, 21, 189, - 207, 21, 194, 207, 21, 198, 207, 21, 195, 207, 21, 200, 207, 253, 176, - 207, 1, 223, 53, 207, 1, 233, 8, 207, 1, 252, 19, 207, 1, 40, 235, 24, - 207, 1, 40, 193, 252, 121, 1, 61, 252, 121, 1, 219, 165, 61, 252, 121, 1, - 162, 252, 121, 1, 219, 165, 162, 252, 121, 1, 231, 182, 162, 252, 121, 1, - 252, 192, 252, 121, 1, 234, 213, 252, 192, 252, 121, 1, 190, 252, 121, 1, - 219, 165, 190, 252, 121, 1, 197, 252, 121, 1, 231, 182, 197, 252, 121, 1, - 212, 65, 252, 121, 1, 219, 165, 212, 65, 252, 121, 1, 226, 68, 212, 65, - 252, 121, 1, 243, 136, 252, 121, 1, 219, 165, 243, 136, 252, 121, 1, 235, - 142, 252, 121, 1, 248, 222, 252, 121, 1, 205, 252, 121, 1, 219, 165, 205, - 252, 121, 1, 185, 252, 121, 1, 219, 165, 185, 252, 121, 1, 219, 27, 217, - 106, 252, 121, 1, 228, 56, 217, 106, 252, 121, 1, 206, 252, 121, 1, 219, - 165, 206, 252, 121, 1, 231, 182, 206, 252, 121, 1, 191, 252, 121, 1, 219, - 165, 191, 252, 121, 1, 229, 78, 252, 121, 1, 233, 136, 252, 121, 1, 219, - 165, 233, 136, 252, 121, 1, 227, 166, 252, 121, 1, 251, 34, 252, 121, 1, - 229, 149, 252, 121, 1, 231, 125, 252, 121, 1, 73, 252, 121, 1, 70, 252, - 121, 5, 216, 34, 252, 121, 25, 5, 75, 252, 121, 25, 5, 226, 68, 75, 252, - 121, 25, 5, 245, 210, 252, 121, 25, 5, 73, 252, 121, 25, 5, 234, 213, 73, - 252, 121, 25, 5, 76, 252, 121, 25, 5, 234, 213, 76, 252, 121, 25, 5, 70, - 252, 121, 25, 5, 104, 31, 219, 165, 206, 252, 121, 116, 5, 229, 80, 252, - 121, 116, 5, 242, 61, 252, 121, 226, 38, 252, 121, 226, 34, 252, 121, 16, - 251, 242, 229, 230, 231, 38, 252, 121, 16, 251, 242, 225, 65, 252, 121, - 16, 251, 242, 235, 49, 252, 121, 16, 251, 242, 226, 38, 196, 1, 176, 196, - 1, 234, 40, 196, 1, 234, 133, 196, 1, 243, 136, 196, 1, 242, 187, 196, 1, - 229, 78, 196, 1, 251, 34, 196, 1, 250, 158, 196, 1, 235, 142, 196, 1, - 227, 166, 196, 1, 217, 106, 196, 1, 216, 209, 196, 1, 248, 222, 196, 1, - 197, 196, 1, 190, 196, 1, 225, 43, 196, 1, 225, 148, 196, 1, 244, 197, - 196, 1, 244, 76, 196, 1, 252, 192, 196, 1, 251, 223, 196, 1, 185, 196, 1, - 230, 169, 196, 1, 215, 184, 196, 1, 215, 176, 196, 1, 246, 39, 196, 1, - 191, 196, 1, 205, 196, 1, 233, 136, 196, 1, 162, 196, 1, 241, 154, 196, - 1, 214, 27, 196, 1, 206, 196, 1, 220, 103, 196, 1, 212, 65, 196, 1, 61, - 196, 218, 74, 1, 191, 196, 218, 74, 1, 205, 196, 25, 5, 255, 74, 196, 25, - 5, 73, 196, 25, 5, 76, 196, 25, 5, 226, 184, 196, 25, 5, 70, 196, 25, 5, - 214, 118, 196, 25, 5, 75, 196, 116, 5, 235, 24, 196, 116, 5, 193, 196, - 116, 5, 156, 196, 116, 5, 230, 26, 196, 116, 5, 226, 106, 196, 116, 5, - 153, 196, 116, 5, 217, 153, 196, 116, 5, 227, 143, 196, 116, 5, 234, 231, - 196, 5, 223, 151, 196, 5, 227, 206, 196, 224, 142, 217, 104, 196, 224, - 142, 227, 153, 216, 121, 217, 104, 196, 224, 142, 250, 165, 196, 224, - 142, 215, 171, 250, 165, 196, 224, 142, 215, 170, 196, 21, 210, 86, 196, - 21, 110, 196, 21, 105, 196, 21, 158, 196, 21, 161, 196, 21, 189, 196, 21, - 194, 196, 21, 198, 196, 21, 195, 196, 21, 200, 196, 1, 215, 157, 196, 1, - 215, 145, 196, 1, 248, 136, 226, 211, 250, 104, 21, 210, 86, 226, 211, - 250, 104, 21, 110, 226, 211, 250, 104, 21, 105, 226, 211, 250, 104, 21, - 158, 226, 211, 250, 104, 21, 161, 226, 211, 250, 104, 21, 189, 226, 211, - 250, 104, 21, 194, 226, 211, 250, 104, 21, 198, 226, 211, 250, 104, 21, - 195, 226, 211, 250, 104, 21, 200, 226, 211, 250, 104, 1, 233, 136, 226, - 211, 250, 104, 1, 253, 207, 226, 211, 250, 104, 1, 254, 217, 226, 211, - 250, 104, 1, 254, 116, 226, 211, 250, 104, 1, 254, 179, 226, 211, 250, - 104, 1, 233, 135, 226, 211, 250, 104, 1, 255, 36, 226, 211, 250, 104, 1, - 255, 37, 226, 211, 250, 104, 1, 255, 35, 226, 211, 250, 104, 1, 255, 30, - 226, 211, 250, 104, 1, 232, 242, 226, 211, 250, 104, 1, 235, 172, 226, - 211, 250, 104, 1, 236, 35, 226, 211, 250, 104, 1, 235, 191, 226, 211, - 250, 104, 1, 235, 180, 226, 211, 250, 104, 1, 232, 99, 226, 211, 250, - 104, 1, 214, 221, 226, 211, 250, 104, 1, 214, 219, 226, 211, 250, 104, 1, - 214, 168, 226, 211, 250, 104, 1, 214, 111, 226, 211, 250, 104, 1, 233, - 59, 226, 211, 250, 104, 1, 245, 109, 226, 211, 250, 104, 1, 245, 213, - 226, 211, 250, 104, 1, 245, 151, 226, 211, 250, 104, 1, 245, 87, 226, - 211, 250, 104, 1, 232, 157, 226, 211, 250, 104, 1, 226, 138, 226, 211, - 250, 104, 1, 226, 253, 226, 211, 250, 104, 1, 226, 126, 226, 211, 250, - 104, 1, 226, 223, 226, 211, 250, 104, 230, 104, 215, 122, 226, 211, 250, - 104, 243, 131, 215, 123, 226, 211, 250, 104, 230, 102, 215, 123, 226, - 211, 250, 104, 223, 93, 226, 211, 250, 104, 225, 146, 226, 211, 250, 104, - 254, 209, 226, 211, 250, 104, 224, 142, 230, 99, 226, 211, 250, 104, 224, - 142, 52, 230, 99, 207, 224, 142, 251, 242, 218, 9, 207, 224, 142, 251, - 242, 226, 39, 207, 224, 142, 251, 242, 224, 130, 207, 224, 142, 251, 242, - 251, 20, 207, 224, 142, 251, 242, 233, 9, 221, 226, 207, 224, 142, 251, - 242, 235, 14, 221, 226, 207, 224, 142, 251, 242, 248, 223, 221, 226, 207, - 224, 142, 251, 242, 252, 193, 221, 226, 213, 252, 138, 234, 211, 213, - 252, 138, 220, 78, 213, 252, 138, 224, 199, 213, 252, 5, 228, 210, 213, - 252, 5, 211, 80, 230, 223, 218, 1, 213, 252, 138, 211, 80, 254, 214, 235, - 244, 218, 1, 213, 252, 138, 211, 80, 235, 244, 218, 1, 213, 252, 138, - 211, 80, 234, 199, 235, 244, 218, 1, 213, 252, 138, 251, 3, 51, 213, 252, - 138, 211, 80, 234, 199, 235, 244, 218, 2, 221, 198, 213, 252, 138, 52, - 218, 1, 213, 252, 138, 215, 212, 218, 1, 213, 252, 138, 234, 199, 254, - 78, 213, 252, 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138, - 134, 170, 51, 213, 252, 138, 222, 241, 234, 210, 235, 244, 218, 1, 213, - 252, 138, 253, 205, 235, 244, 218, 1, 213, 252, 5, 213, 148, 218, 1, 213, - 252, 5, 213, 148, 214, 216, 213, 252, 5, 223, 50, 213, 148, 214, 216, - 213, 252, 5, 213, 148, 254, 78, 213, 252, 5, 223, 50, 213, 148, 254, 78, - 213, 252, 5, 213, 148, 214, 217, 2, 217, 78, 213, 252, 5, 213, 148, 254, - 79, 2, 217, 78, 213, 252, 5, 254, 77, 254, 92, 213, 252, 5, 254, 77, 252, - 167, 213, 252, 5, 254, 77, 214, 20, 213, 252, 5, 254, 77, 214, 21, 2, - 217, 78, 213, 252, 5, 216, 69, 213, 252, 5, 241, 192, 199, 254, 76, 213, - 252, 5, 199, 254, 76, 213, 252, 5, 222, 143, 199, 254, 76, 213, 252, 5, - 254, 77, 214, 223, 230, 91, 213, 252, 5, 254, 21, 213, 252, 5, 222, 188, - 254, 21, 213, 252, 138, 251, 3, 48, 213, 252, 5, 235, 103, 213, 252, 5, - 214, 161, 7, 1, 4, 6, 61, 7, 1, 4, 6, 254, 244, 7, 4, 1, 215, 94, 254, - 244, 7, 1, 4, 6, 252, 135, 253, 159, 7, 1, 4, 6, 251, 67, 7, 1, 4, 6, - 249, 61, 7, 1, 4, 6, 245, 60, 7, 1, 4, 6, 75, 7, 4, 1, 215, 94, 204, 75, - 7, 4, 1, 215, 94, 73, 7, 1, 4, 6, 235, 145, 7, 1, 4, 6, 235, 24, 7, 1, 4, - 6, 233, 150, 2, 91, 7, 1, 4, 6, 193, 7, 1, 4, 6, 223, 50, 230, 26, 7, 1, - 4, 6, 76, 7, 1, 4, 6, 204, 76, 7, 4, 1, 219, 188, 76, 7, 4, 1, 219, 188, - 204, 76, 7, 4, 1, 219, 188, 144, 2, 91, 7, 4, 1, 215, 94, 226, 235, 7, 1, - 4, 6, 226, 135, 7, 4, 1, 216, 15, 163, 76, 7, 4, 1, 251, 176, 163, 76, 7, - 1, 4, 6, 226, 106, 7, 1, 4, 6, 223, 50, 153, 7, 1, 4, 6, 215, 94, 153, 7, - 1, 4, 6, 217, 153, 7, 1, 4, 6, 70, 7, 4, 1, 219, 188, 70, 7, 4, 1, 219, - 188, 248, 1, 70, 7, 4, 1, 219, 188, 215, 94, 193, 7, 1, 4, 6, 214, 105, - 7, 1, 4, 6, 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 9, 7, 1, 213, - 135, 233, 83, 218, 251, 7, 1, 254, 197, 26, 1, 4, 6, 243, 108, 26, 1, 4, - 6, 233, 99, 26, 1, 4, 6, 225, 109, 26, 1, 4, 6, 223, 38, 26, 1, 4, 6, - 224, 162, 33, 1, 4, 6, 245, 175, 58, 1, 6, 61, 58, 1, 6, 254, 244, 58, 1, - 6, 253, 159, 58, 1, 6, 252, 135, 253, 159, 58, 1, 6, 249, 61, 58, 1, 6, - 75, 58, 1, 6, 223, 50, 75, 58, 1, 6, 243, 203, 58, 1, 6, 242, 61, 58, 1, - 6, 73, 58, 1, 6, 235, 145, 58, 1, 6, 235, 24, 58, 1, 6, 156, 58, 1, 6, - 193, 58, 1, 6, 230, 26, 58, 1, 6, 223, 50, 230, 26, 58, 1, 6, 76, 58, 1, - 6, 226, 135, 58, 1, 6, 226, 106, 58, 1, 6, 153, 58, 1, 6, 217, 153, 58, - 1, 6, 70, 58, 1, 6, 212, 98, 58, 1, 4, 61, 58, 1, 4, 215, 94, 61, 58, 1, - 4, 254, 144, 58, 1, 4, 215, 94, 254, 244, 58, 1, 4, 253, 159, 58, 1, 4, - 249, 61, 58, 1, 4, 75, 58, 1, 4, 221, 196, 58, 1, 4, 204, 75, 58, 1, 4, - 215, 94, 204, 75, 58, 1, 4, 243, 203, 58, 1, 4, 215, 94, 73, 58, 1, 4, - 235, 24, 58, 1, 4, 193, 58, 1, 4, 245, 139, 58, 1, 4, 76, 58, 1, 4, 204, - 76, 58, 1, 4, 216, 15, 163, 76, 58, 1, 4, 251, 176, 163, 76, 58, 1, 4, - 226, 106, 58, 1, 4, 217, 153, 58, 1, 4, 70, 58, 1, 4, 219, 188, 70, 58, - 1, 4, 215, 94, 193, 58, 1, 4, 214, 105, 58, 1, 4, 254, 197, 58, 1, 4, - 252, 27, 58, 1, 4, 26, 243, 108, 58, 1, 4, 248, 55, 58, 1, 4, 26, 225, - 134, 58, 1, 4, 250, 111, 7, 218, 66, 4, 1, 73, 7, 218, 66, 4, 1, 153, 7, - 218, 66, 4, 1, 70, 7, 218, 66, 4, 1, 214, 105, 26, 218, 66, 4, 1, 252, - 27, 26, 218, 66, 4, 1, 243, 108, 26, 218, 66, 4, 1, 223, 38, 26, 218, 66, - 4, 1, 225, 134, 26, 218, 66, 4, 1, 250, 111, 7, 4, 1, 214, 214, 7, 4, 1, - 57, 2, 230, 225, 183, 7, 4, 1, 249, 62, 2, 230, 225, 183, 7, 4, 1, 245, - 8, 2, 230, 225, 183, 7, 4, 1, 232, 51, 2, 230, 225, 183, 7, 4, 1, 230, - 27, 2, 230, 225, 183, 7, 4, 1, 226, 107, 2, 230, 225, 183, 7, 4, 1, 223, - 225, 2, 230, 225, 183, 7, 4, 1, 223, 225, 2, 244, 89, 22, 230, 225, 183, - 7, 4, 1, 222, 93, 2, 230, 225, 183, 7, 4, 1, 217, 154, 2, 230, 225, 183, - 7, 4, 1, 210, 160, 2, 230, 225, 183, 7, 4, 1, 215, 94, 243, 203, 58, 1, - 33, 245, 151, 7, 4, 1, 235, 214, 243, 203, 7, 4, 1, 216, 212, 2, 218, - 108, 7, 4, 6, 1, 240, 155, 2, 91, 7, 4, 1, 235, 187, 2, 91, 7, 4, 1, 226, - 107, 2, 91, 7, 4, 6, 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1, - 57, 2, 226, 67, 103, 7, 4, 1, 249, 62, 2, 226, 67, 103, 7, 4, 1, 245, 8, - 2, 226, 67, 103, 7, 4, 1, 243, 204, 2, 226, 67, 103, 7, 4, 1, 235, 25, 2, - 226, 67, 103, 7, 4, 1, 233, 150, 2, 226, 67, 103, 7, 4, 1, 232, 51, 2, - 226, 67, 103, 7, 4, 1, 230, 27, 2, 226, 67, 103, 7, 4, 1, 226, 107, 2, - 226, 67, 103, 7, 4, 1, 223, 225, 2, 226, 67, 103, 7, 4, 1, 222, 93, 2, - 226, 67, 103, 7, 4, 1, 245, 77, 2, 226, 67, 103, 7, 4, 1, 214, 106, 2, - 226, 67, 103, 7, 4, 1, 211, 179, 2, 226, 67, 103, 7, 4, 1, 210, 160, 2, - 226, 67, 103, 7, 4, 1, 115, 2, 223, 56, 103, 7, 4, 1, 254, 145, 2, 223, - 56, 103, 7, 4, 1, 249, 62, 2, 241, 53, 22, 217, 78, 7, 4, 1, 160, 2, 223, - 56, 103, 7, 4, 1, 204, 160, 2, 223, 56, 103, 7, 4, 1, 223, 50, 204, 160, - 2, 223, 56, 103, 7, 4, 1, 221, 197, 2, 223, 56, 103, 7, 4, 1, 240, 155, - 2, 223, 56, 103, 7, 4, 1, 204, 144, 2, 223, 56, 103, 7, 4, 1, 245, 77, 2, - 223, 56, 103, 7, 4, 1, 104, 2, 223, 56, 103, 7, 4, 1, 245, 10, 2, 223, - 56, 103, 58, 1, 4, 215, 94, 254, 144, 58, 1, 4, 251, 67, 58, 1, 4, 251, - 68, 2, 249, 101, 58, 1, 4, 245, 60, 58, 1, 4, 223, 50, 204, 75, 58, 1, 4, - 245, 7, 58, 1, 4, 247, 120, 235, 146, 2, 91, 58, 1, 4, 119, 243, 203, 58, - 1, 4, 215, 94, 242, 61, 58, 1, 4, 240, 155, 2, 91, 58, 1, 4, 235, 186, - 58, 1, 4, 6, 73, 58, 1, 4, 6, 240, 155, 2, 91, 58, 1, 4, 235, 146, 2, - 249, 128, 58, 1, 4, 233, 150, 2, 223, 56, 103, 58, 1, 4, 233, 150, 2, - 226, 67, 103, 58, 1, 4, 6, 156, 58, 1, 4, 232, 51, 2, 103, 58, 1, 4, 215, - 94, 232, 51, 2, 199, 233, 37, 58, 1, 4, 230, 27, 2, 43, 103, 58, 1, 4, - 230, 27, 2, 223, 56, 103, 58, 1, 4, 6, 230, 26, 58, 1, 4, 252, 135, 76, - 58, 1, 4, 225, 134, 58, 1, 4, 222, 93, 2, 103, 58, 1, 4, 245, 76, 58, 1, - 4, 217, 154, 2, 226, 67, 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58, - 1, 4, 6, 70, 58, 1, 4, 214, 106, 2, 103, 58, 1, 4, 215, 94, 214, 105, 58, - 1, 4, 210, 159, 58, 1, 4, 210, 160, 2, 223, 56, 103, 58, 1, 4, 210, 160, - 2, 249, 101, 58, 1, 4, 245, 9, 58, 1, 4, 216, 180, 38, 246, 119, 242, - 138, 255, 15, 38, 246, 119, 255, 4, 255, 15, 38, 219, 70, 51, 38, 218, 7, - 78, 38, 231, 232, 38, 242, 135, 38, 231, 230, 38, 255, 2, 38, 242, 136, - 38, 255, 3, 38, 7, 4, 1, 223, 225, 51, 38, 251, 146, 38, 231, 231, 38, - 52, 250, 32, 48, 38, 226, 226, 48, 38, 210, 35, 51, 38, 235, 173, 51, 38, - 214, 151, 48, 38, 214, 134, 48, 38, 7, 4, 1, 244, 64, 204, 115, 48, 38, - 7, 4, 1, 254, 244, 38, 7, 4, 1, 254, 74, 38, 7, 4, 1, 253, 177, 38, 7, 4, - 1, 251, 68, 250, 184, 38, 7, 4, 1, 235, 214, 249, 61, 38, 7, 4, 1, 245, - 60, 38, 7, 4, 1, 243, 203, 38, 7, 1, 4, 6, 243, 203, 38, 7, 4, 1, 235, - 24, 38, 7, 4, 1, 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 193, 38, 7, 4, - 1, 230, 26, 38, 7, 1, 4, 6, 230, 26, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1, - 223, 225, 222, 187, 38, 7, 4, 1, 222, 92, 38, 7, 4, 1, 199, 222, 92, 38, - 7, 4, 1, 210, 159, 38, 52, 235, 194, 251, 148, 51, 38, 254, 149, 128, - 216, 43, 51, 38, 43, 253, 251, 48, 38, 44, 253, 251, 22, 124, 253, 251, - 51, 7, 6, 1, 115, 2, 222, 235, 51, 7, 4, 1, 115, 2, 222, 235, 51, 7, 6, - 1, 57, 2, 59, 48, 7, 4, 1, 57, 2, 59, 48, 7, 6, 1, 57, 2, 59, 51, 7, 4, - 1, 57, 2, 59, 51, 7, 6, 1, 57, 2, 232, 215, 51, 7, 4, 1, 57, 2, 232, 215, - 51, 7, 6, 1, 251, 68, 2, 250, 185, 22, 142, 7, 4, 1, 251, 68, 2, 250, - 185, 22, 142, 7, 6, 1, 249, 62, 2, 59, 48, 7, 4, 1, 249, 62, 2, 59, 48, - 7, 6, 1, 249, 62, 2, 59, 51, 7, 4, 1, 249, 62, 2, 59, 51, 7, 6, 1, 249, - 62, 2, 232, 215, 51, 7, 4, 1, 249, 62, 2, 232, 215, 51, 7, 6, 1, 249, 62, - 2, 250, 184, 7, 4, 1, 249, 62, 2, 250, 184, 7, 6, 1, 249, 62, 2, 250, 32, - 51, 7, 4, 1, 249, 62, 2, 250, 32, 51, 7, 6, 1, 160, 2, 231, 234, 22, 242, - 137, 7, 4, 1, 160, 2, 231, 234, 22, 242, 137, 7, 6, 1, 160, 2, 231, 234, - 22, 142, 7, 4, 1, 160, 2, 231, 234, 22, 142, 7, 6, 1, 160, 2, 250, 32, - 51, 7, 4, 1, 160, 2, 250, 32, 51, 7, 6, 1, 160, 2, 216, 90, 51, 7, 4, 1, - 160, 2, 216, 90, 51, 7, 6, 1, 160, 2, 250, 185, 22, 251, 147, 7, 4, 1, - 160, 2, 250, 185, 22, 251, 147, 7, 6, 1, 245, 8, 2, 59, 48, 7, 4, 1, 245, - 8, 2, 59, 48, 7, 6, 1, 243, 204, 2, 231, 233, 7, 4, 1, 243, 204, 2, 231, - 233, 7, 6, 1, 242, 62, 2, 59, 48, 7, 4, 1, 242, 62, 2, 59, 48, 7, 6, 1, - 242, 62, 2, 59, 51, 7, 4, 1, 242, 62, 2, 59, 51, 7, 6, 1, 242, 62, 2, - 248, 2, 7, 4, 1, 242, 62, 2, 248, 2, 7, 6, 1, 242, 62, 2, 250, 184, 7, 4, - 1, 242, 62, 2, 250, 184, 7, 6, 1, 242, 62, 2, 251, 148, 51, 7, 4, 1, 242, - 62, 2, 251, 148, 51, 7, 6, 1, 240, 155, 2, 216, 90, 51, 7, 4, 1, 240, - 155, 2, 216, 90, 51, 7, 6, 1, 240, 155, 2, 248, 3, 22, 142, 7, 4, 1, 240, - 155, 2, 248, 3, 22, 142, 7, 6, 1, 235, 25, 2, 142, 7, 4, 1, 235, 25, 2, - 142, 7, 6, 1, 235, 25, 2, 59, 51, 7, 4, 1, 235, 25, 2, 59, 51, 7, 6, 1, - 235, 25, 2, 232, 215, 51, 7, 4, 1, 235, 25, 2, 232, 215, 51, 7, 6, 1, - 233, 150, 2, 59, 51, 7, 4, 1, 233, 150, 2, 59, 51, 7, 6, 1, 233, 150, 2, - 59, 252, 44, 22, 231, 233, 7, 4, 1, 233, 150, 2, 59, 252, 44, 22, 231, - 233, 7, 6, 1, 233, 150, 2, 232, 215, 51, 7, 4, 1, 233, 150, 2, 232, 215, - 51, 7, 6, 1, 233, 150, 2, 250, 32, 51, 7, 4, 1, 233, 150, 2, 250, 32, 51, - 7, 6, 1, 232, 51, 2, 142, 7, 4, 1, 232, 51, 2, 142, 7, 6, 1, 232, 51, 2, - 59, 48, 7, 4, 1, 232, 51, 2, 59, 48, 7, 6, 1, 232, 51, 2, 59, 51, 7, 4, - 1, 232, 51, 2, 59, 51, 7, 6, 1, 230, 27, 2, 59, 48, 7, 4, 1, 230, 27, 2, - 59, 48, 7, 6, 1, 230, 27, 2, 59, 51, 7, 4, 1, 230, 27, 2, 59, 51, 7, 6, - 1, 230, 27, 2, 232, 215, 51, 7, 4, 1, 230, 27, 2, 232, 215, 51, 7, 6, 1, - 230, 27, 2, 250, 32, 51, 7, 4, 1, 230, 27, 2, 250, 32, 51, 7, 6, 1, 144, - 2, 216, 90, 22, 142, 7, 4, 1, 144, 2, 216, 90, 22, 142, 7, 6, 1, 144, 2, - 216, 90, 22, 248, 2, 7, 4, 1, 144, 2, 216, 90, 22, 248, 2, 7, 6, 1, 144, - 2, 231, 234, 22, 242, 137, 7, 4, 1, 144, 2, 231, 234, 22, 242, 137, 7, 6, - 1, 144, 2, 231, 234, 22, 142, 7, 4, 1, 144, 2, 231, 234, 22, 142, 7, 6, - 1, 226, 107, 2, 142, 7, 4, 1, 226, 107, 2, 142, 7, 6, 1, 226, 107, 2, 59, - 48, 7, 4, 1, 226, 107, 2, 59, 48, 7, 6, 1, 223, 225, 2, 59, 48, 7, 4, 1, - 223, 225, 2, 59, 48, 7, 6, 1, 223, 225, 2, 59, 51, 7, 4, 1, 223, 225, 2, - 59, 51, 7, 6, 1, 223, 225, 2, 59, 252, 44, 22, 231, 233, 7, 4, 1, 223, - 225, 2, 59, 252, 44, 22, 231, 233, 7, 6, 1, 223, 225, 2, 232, 215, 51, 7, - 4, 1, 223, 225, 2, 232, 215, 51, 7, 6, 1, 222, 93, 2, 59, 48, 7, 4, 1, - 222, 93, 2, 59, 48, 7, 6, 1, 222, 93, 2, 59, 51, 7, 4, 1, 222, 93, 2, 59, - 51, 7, 6, 1, 222, 93, 2, 255, 4, 22, 59, 48, 7, 4, 1, 222, 93, 2, 255, 4, - 22, 59, 48, 7, 6, 1, 222, 93, 2, 250, 236, 22, 59, 48, 7, 4, 1, 222, 93, - 2, 250, 236, 22, 59, 48, 7, 6, 1, 222, 93, 2, 59, 252, 44, 22, 59, 48, 7, - 4, 1, 222, 93, 2, 59, 252, 44, 22, 59, 48, 7, 6, 1, 217, 154, 2, 59, 48, + 254, 18, 19, 232, 253, 18, 19, 232, 252, 18, 19, 232, 251, 18, 19, 233, + 4, 18, 19, 233, 3, 18, 19, 233, 5, 18, 19, 216, 210, 216, 196, 18, 19, + 216, 210, 216, 176, 18, 19, 216, 210, 216, 172, 18, 19, 216, 210, 216, + 157, 18, 19, 216, 210, 216, 154, 18, 19, 216, 210, 216, 209, 18, 19, 216, + 210, 216, 208, 18, 19, 216, 210, 216, 211, 18, 19, 254, 198, 253, 166, + 18, 19, 251, 226, 76, 18, 19, 251, 226, 74, 18, 19, 251, 226, 78, 18, 19, + 251, 226, 61, 18, 19, 251, 226, 212, 22, 18, 19, 251, 226, 211, 250, 18, + 19, 251, 226, 211, 227, 18, 19, 251, 226, 212, 65, 18, 19, 251, 226, 229, + 112, 18, 19, 251, 226, 228, 238, 18, 19, 251, 226, 228, 79, 18, 19, 251, + 226, 198, 18, 19, 251, 226, 234, 188, 18, 19, 251, 226, 234, 98, 18, 19, + 251, 226, 234, 34, 18, 19, 251, 226, 176, 18, 19, 221, 211, 241, 245, 18, + 19, 221, 211, 241, 187, 18, 19, 221, 211, 241, 75, 18, 19, 221, 211, 162, + 18, 19, 73, 242, 227, 18, 19, 73, 242, 231, 18, 19, 73, 242, 243, 18, 19, + 73, 242, 242, 18, 19, 73, 242, 232, 18, 19, 73, 243, 0, 18, 19, 73, 222, + 142, 18, 19, 73, 222, 213, 18, 19, 73, 223, 131, 18, 19, 73, 223, 111, + 18, 19, 73, 223, 38, 18, 19, 73, 205, 18, 19, 73, 211, 195, 18, 19, 73, + 211, 227, 18, 19, 73, 212, 22, 18, 19, 73, 212, 17, 18, 19, 73, 211, 250, + 18, 19, 73, 212, 65, 18, 19, 73, 240, 201, 18, 19, 73, 240, 202, 18, 19, + 73, 240, 205, 18, 19, 73, 240, 204, 18, 19, 73, 240, 203, 18, 19, 73, + 240, 207, 18, 19, 73, 216, 137, 18, 19, 73, 216, 157, 18, 19, 73, 216, + 196, 18, 19, 73, 216, 195, 18, 19, 73, 216, 176, 18, 19, 73, 216, 209, + 18, 19, 73, 215, 124, 18, 19, 73, 215, 134, 18, 19, 73, 215, 152, 18, 19, + 73, 215, 151, 18, 19, 73, 215, 136, 18, 19, 73, 215, 157, 18, 19, 73, + 224, 153, 18, 19, 73, 225, 19, 18, 19, 73, 225, 224, 18, 19, 73, 225, + 214, 18, 19, 73, 225, 111, 18, 19, 73, 191, 18, 19, 73, 226, 109, 18, 19, + 73, 242, 120, 18, 19, 73, 242, 181, 18, 19, 73, 243, 69, 18, 19, 73, 243, + 62, 18, 19, 73, 242, 221, 18, 19, 73, 243, 142, 18, 19, 73, 234, 106, 18, + 19, 73, 234, 111, 18, 19, 73, 234, 125, 18, 19, 73, 234, 124, 18, 19, 73, + 234, 118, 18, 19, 73, 234, 138, 18, 19, 73, 234, 47, 18, 19, 73, 234, 48, + 18, 19, 73, 234, 51, 18, 19, 73, 234, 50, 18, 19, 73, 234, 49, 18, 19, + 73, 234, 52, 18, 19, 73, 234, 53, 18, 19, 73, 227, 242, 18, 19, 73, 228, + 79, 18, 19, 73, 229, 112, 18, 19, 73, 229, 108, 18, 19, 73, 228, 238, 18, + 19, 73, 198, 18, 19, 73, 230, 107, 18, 19, 73, 230, 166, 18, 19, 73, 231, + 96, 18, 19, 73, 231, 85, 18, 19, 73, 230, 235, 18, 19, 73, 186, 18, 19, + 73, 210, 212, 18, 19, 73, 210, 244, 18, 19, 73, 211, 47, 18, 19, 73, 211, + 44, 18, 19, 73, 211, 8, 18, 19, 73, 192, 18, 19, 73, 235, 57, 18, 19, + 221, 211, 235, 57, 18, 19, 73, 235, 74, 18, 19, 73, 235, 132, 18, 19, 73, + 235, 130, 18, 19, 73, 235, 114, 18, 19, 221, 211, 235, 114, 18, 19, 73, + 235, 147, 18, 19, 73, 235, 87, 18, 19, 73, 235, 91, 18, 19, 73, 235, 101, + 18, 19, 73, 235, 100, 18, 19, 73, 235, 99, 18, 19, 73, 235, 102, 18, 19, + 73, 232, 103, 18, 19, 73, 232, 162, 18, 19, 73, 233, 64, 18, 19, 73, 233, + 56, 18, 19, 73, 232, 247, 18, 19, 73, 233, 141, 18, 19, 73, 247, 157, 18, + 19, 73, 247, 158, 18, 19, 73, 247, 163, 18, 19, 73, 247, 162, 18, 19, 73, + 247, 159, 18, 19, 73, 247, 164, 18, 19, 73, 232, 250, 18, 19, 73, 232, + 252, 18, 19, 73, 233, 0, 18, 19, 73, 232, 255, 18, 19, 73, 232, 254, 18, + 19, 73, 233, 4, 18, 19, 73, 216, 51, 18, 19, 73, 216, 53, 18, 19, 73, + 216, 56, 18, 19, 73, 216, 55, 18, 19, 73, 216, 54, 18, 19, 73, 216, 57, + 18, 19, 73, 216, 46, 18, 19, 73, 216, 47, 18, 19, 73, 216, 59, 18, 19, + 73, 216, 58, 18, 19, 73, 216, 48, 18, 19, 73, 216, 60, 18, 19, 73, 210, + 13, 18, 19, 73, 210, 23, 18, 19, 73, 210, 94, 18, 19, 73, 210, 92, 18, + 19, 73, 210, 44, 18, 19, 73, 210, 116, 18, 19, 73, 210, 159, 18, 19, 73, + 65, 210, 159, 18, 19, 73, 246, 36, 18, 19, 73, 246, 37, 18, 19, 73, 246, + 44, 18, 19, 73, 246, 43, 18, 19, 73, 246, 39, 18, 19, 73, 246, 46, 18, + 19, 73, 218, 84, 18, 19, 73, 219, 60, 18, 19, 73, 221, 183, 18, 19, 73, + 221, 172, 18, 19, 73, 219, 193, 18, 19, 73, 206, 18, 19, 73, 219, 227, + 18, 19, 73, 220, 9, 18, 19, 73, 220, 65, 18, 19, 73, 220, 63, 18, 19, 73, + 220, 34, 18, 19, 73, 220, 104, 18, 19, 73, 220, 106, 18, 19, 73, 215, + 164, 18, 19, 73, 215, 167, 18, 19, 73, 215, 179, 18, 19, 73, 215, 178, + 18, 19, 73, 215, 168, 18, 19, 73, 215, 184, 18, 19, 73, 250, 77, 18, 19, + 73, 250, 94, 18, 19, 73, 250, 139, 18, 19, 73, 250, 136, 18, 19, 73, 250, + 118, 18, 19, 73, 250, 165, 18, 19, 73, 215, 127, 18, 19, 73, 215, 128, + 18, 19, 73, 215, 131, 18, 19, 73, 215, 130, 18, 19, 73, 215, 129, 18, 19, + 73, 215, 132, 18, 19, 250, 119, 50, 18, 19, 243, 236, 218, 131, 18, 19, + 224, 83, 18, 19, 229, 78, 18, 19, 228, 105, 18, 19, 228, 104, 18, 19, + 228, 103, 18, 19, 228, 102, 18, 19, 228, 107, 18, 19, 228, 106, 18, 19, + 211, 213, 216, 126, 18, 19, 211, 213, 216, 125, 18, 19, 211, 213, 216, + 124, 18, 19, 211, 213, 216, 123, 18, 19, 211, 213, 216, 122, 18, 19, 211, + 213, 216, 129, 18, 19, 211, 213, 216, 128, 18, 19, 211, 213, 40, 216, + 211, 18, 19, 251, 226, 212, 98, 226, 230, 219, 21, 79, 226, 230, 1, 252, + 56, 226, 230, 1, 232, 92, 226, 230, 1, 244, 159, 226, 230, 1, 222, 17, + 226, 230, 1, 228, 198, 226, 230, 1, 214, 226, 226, 230, 1, 248, 205, 226, + 230, 1, 216, 81, 226, 230, 1, 249, 237, 226, 230, 1, 250, 188, 226, 230, + 1, 230, 96, 226, 230, 1, 242, 163, 226, 230, 1, 229, 68, 226, 230, 1, + 218, 124, 226, 230, 1, 222, 137, 226, 230, 1, 254, 207, 226, 230, 1, 226, + 191, 226, 230, 1, 214, 150, 226, 230, 1, 245, 239, 226, 230, 1, 235, 195, + 226, 230, 1, 245, 240, 226, 230, 1, 226, 162, 226, 230, 1, 214, 206, 226, + 230, 1, 236, 46, 226, 230, 1, 245, 237, 226, 230, 1, 225, 205, 226, 230, + 244, 158, 79, 226, 230, 223, 52, 244, 158, 79, 178, 1, 244, 149, 244, + 141, 244, 163, 245, 14, 178, 1, 214, 105, 178, 1, 214, 135, 214, 151, 69, + 178, 1, 210, 214, 178, 1, 211, 117, 178, 1, 212, 98, 178, 1, 216, 131, + 216, 130, 216, 152, 178, 1, 245, 67, 178, 1, 254, 101, 61, 178, 1, 226, + 147, 78, 178, 1, 255, 26, 61, 178, 1, 254, 236, 178, 1, 232, 139, 78, + 178, 1, 219, 246, 78, 178, 1, 78, 178, 1, 226, 238, 178, 1, 226, 200, + 178, 1, 223, 167, 223, 180, 223, 97, 153, 178, 1, 234, 199, 178, 1, 250, + 185, 178, 1, 234, 200, 235, 29, 178, 1, 243, 209, 178, 1, 245, 146, 178, + 1, 243, 65, 242, 73, 243, 209, 178, 1, 243, 103, 178, 1, 211, 188, 211, + 182, 212, 98, 178, 1, 242, 45, 242, 67, 178, 1, 242, 49, 242, 67, 178, 1, + 232, 141, 242, 67, 178, 1, 219, 249, 242, 67, 178, 1, 229, 190, 227, 161, + 229, 191, 230, 30, 178, 1, 219, 247, 230, 30, 178, 1, 246, 123, 178, 1, + 235, 175, 235, 179, 235, 168, 74, 178, 1, 76, 178, 1, 235, 123, 235, 150, + 178, 1, 243, 50, 178, 1, 232, 142, 254, 252, 178, 1, 219, 251, 61, 178, + 1, 235, 160, 245, 121, 178, 1, 225, 167, 225, 189, 226, 109, 178, 1, 254, + 172, 245, 119, 178, 1, 219, 26, 222, 93, 178, 1, 219, 181, 232, 138, 222, + 93, 178, 1, 219, 245, 222, 93, 178, 1, 251, 74, 178, 1, 210, 159, 178, 1, + 216, 64, 216, 74, 215, 41, 217, 153, 178, 1, 219, 244, 217, 153, 178, 1, + 249, 68, 178, 1, 252, 39, 252, 42, 251, 232, 253, 166, 178, 1, 219, 250, + 253, 166, 178, 1, 246, 122, 178, 1, 226, 175, 178, 1, 245, 204, 245, 206, + 76, 178, 1, 231, 183, 231, 191, 194, 178, 1, 232, 140, 194, 178, 1, 219, + 248, 194, 178, 1, 233, 79, 233, 120, 232, 149, 156, 178, 1, 246, 124, + 178, 1, 235, 237, 178, 1, 235, 238, 178, 1, 248, 218, 248, 223, 249, 68, + 178, 1, 226, 142, 245, 66, 78, 178, 1, 245, 235, 178, 1, 235, 194, 178, + 1, 249, 86, 178, 1, 251, 25, 178, 1, 250, 197, 178, 1, 218, 163, 178, 1, + 232, 137, 178, 1, 219, 243, 178, 1, 240, 117, 178, 1, 224, 99, 178, 1, + 211, 178, 178, 219, 157, 224, 143, 178, 230, 90, 224, 143, 178, 249, 139, + 224, 143, 178, 254, 14, 87, 178, 215, 82, 87, 178, 252, 54, 87, 217, 84, + 1, 61, 217, 84, 1, 74, 217, 84, 1, 69, 217, 84, 1, 176, 217, 84, 1, 243, + 142, 217, 84, 1, 229, 82, 217, 84, 1, 217, 106, 217, 84, 1, 248, 229, + 217, 84, 1, 198, 217, 84, 1, 191, 217, 84, 1, 252, 199, 217, 84, 1, 186, + 217, 84, 1, 192, 217, 84, 1, 233, 141, 217, 84, 1, 212, 65, 217, 84, 1, + 206, 217, 84, 1, 162, 217, 84, 25, 5, 74, 217, 84, 25, 5, 69, 217, 84, 5, + 213, 152, 242, 14, 1, 61, 242, 14, 1, 74, 242, 14, 1, 69, 242, 14, 1, + 176, 242, 14, 1, 243, 142, 242, 14, 1, 229, 82, 242, 14, 1, 217, 106, + 242, 14, 1, 248, 229, 242, 14, 1, 198, 242, 14, 1, 191, 242, 14, 1, 252, + 199, 242, 14, 1, 186, 242, 14, 1, 192, 242, 14, 1, 205, 242, 14, 1, 233, + 141, 242, 14, 1, 212, 65, 242, 14, 1, 206, 242, 14, 1, 162, 242, 14, 25, + 5, 74, 242, 14, 25, 5, 69, 242, 14, 5, 226, 53, 225, 129, 219, 157, 224, + 143, 225, 129, 52, 224, 143, 251, 128, 1, 61, 251, 128, 1, 74, 251, 128, + 1, 69, 251, 128, 1, 176, 251, 128, 1, 243, 142, 251, 128, 1, 229, 82, + 251, 128, 1, 217, 106, 251, 128, 1, 248, 229, 251, 128, 1, 198, 251, 128, + 1, 191, 251, 128, 1, 252, 199, 251, 128, 1, 186, 251, 128, 1, 192, 251, + 128, 1, 205, 251, 128, 1, 233, 141, 251, 128, 1, 212, 65, 251, 128, 1, + 206, 251, 128, 1, 162, 251, 128, 25, 5, 74, 251, 128, 25, 5, 69, 217, 83, + 1, 61, 217, 83, 1, 74, 217, 83, 1, 69, 217, 83, 1, 176, 217, 83, 1, 243, + 142, 217, 83, 1, 229, 82, 217, 83, 1, 217, 106, 217, 83, 1, 248, 229, + 217, 83, 1, 198, 217, 83, 1, 191, 217, 83, 1, 252, 199, 217, 83, 1, 186, + 217, 83, 1, 192, 217, 83, 1, 233, 141, 217, 83, 1, 212, 65, 217, 83, 1, + 206, 217, 83, 25, 5, 74, 217, 83, 25, 5, 69, 70, 1, 176, 70, 1, 234, 138, + 70, 1, 234, 34, 70, 1, 234, 111, 70, 1, 229, 9, 70, 1, 251, 41, 70, 1, + 250, 165, 70, 1, 249, 246, 70, 1, 250, 94, 70, 1, 227, 138, 70, 1, 248, + 229, 70, 1, 215, 145, 70, 1, 247, 153, 70, 1, 215, 140, 70, 1, 228, 85, + 70, 1, 217, 106, 70, 1, 216, 209, 70, 1, 112, 70, 1, 216, 157, 70, 1, + 228, 79, 70, 1, 252, 199, 70, 1, 225, 150, 70, 1, 225, 19, 70, 1, 225, + 124, 70, 1, 230, 166, 70, 1, 210, 244, 70, 1, 222, 213, 70, 1, 232, 162, + 70, 1, 213, 138, 70, 1, 220, 104, 70, 1, 218, 186, 70, 1, 206, 70, 1, + 162, 70, 1, 233, 141, 70, 1, 224, 91, 70, 235, 250, 25, 224, 77, 70, 235, + 250, 25, 224, 90, 70, 235, 250, 25, 224, 56, 70, 235, 250, 25, 224, 51, + 70, 235, 250, 25, 224, 33, 70, 235, 250, 25, 224, 5, 70, 235, 250, 25, + 223, 249, 70, 235, 250, 25, 223, 248, 70, 235, 250, 25, 222, 102, 70, + 235, 250, 25, 222, 95, 70, 235, 250, 25, 232, 67, 70, 235, 250, 25, 232, + 57, 70, 235, 250, 25, 224, 72, 70, 235, 250, 25, 224, 83, 70, 235, 250, + 25, 224, 41, 215, 49, 111, 70, 235, 250, 25, 224, 41, 215, 49, 105, 70, + 235, 250, 25, 224, 73, 70, 25, 235, 236, 254, 53, 70, 25, 235, 236, 255, + 82, 70, 25, 5, 255, 82, 70, 25, 5, 74, 70, 25, 5, 236, 40, 70, 25, 5, + 211, 117, 70, 25, 5, 210, 169, 70, 25, 5, 69, 70, 25, 5, 214, 118, 70, + 25, 5, 214, 229, 70, 25, 5, 226, 238, 70, 25, 5, 192, 70, 25, 5, 236, 67, + 70, 25, 5, 76, 70, 25, 5, 254, 252, 70, 25, 5, 254, 210, 70, 25, 5, 226, + 187, 70, 25, 5, 253, 200, 70, 5, 228, 211, 70, 5, 223, 129, 70, 5, 210, + 180, 70, 5, 230, 57, 70, 5, 215, 214, 70, 5, 252, 151, 70, 5, 222, 208, + 70, 5, 216, 41, 70, 5, 234, 247, 70, 5, 254, 212, 70, 5, 221, 246, 221, + 240, 70, 5, 213, 149, 70, 5, 249, 240, 70, 5, 252, 125, 70, 5, 234, 131, + 70, 5, 252, 145, 70, 5, 251, 17, 225, 75, 233, 193, 70, 5, 233, 36, 216, + 18, 70, 5, 252, 28, 70, 5, 225, 126, 230, 104, 70, 5, 234, 15, 70, 249, + 106, 16, 223, 31, 70, 5, 253, 182, 70, 5, 253, 203, 70, 21, 210, 86, 70, + 21, 111, 70, 21, 105, 70, 21, 158, 70, 21, 161, 70, 21, 190, 70, 21, 195, + 70, 21, 199, 70, 21, 196, 70, 21, 201, 70, 16, 233, 36, 253, 205, 219, + 45, 70, 16, 233, 36, 253, 205, 230, 76, 70, 16, 233, 36, 253, 205, 225, + 74, 70, 16, 233, 36, 253, 205, 252, 57, 70, 16, 233, 36, 253, 205, 251, + 111, 70, 16, 233, 36, 253, 205, 224, 218, 70, 16, 233, 36, 253, 205, 224, + 212, 70, 16, 233, 36, 253, 205, 224, 210, 70, 16, 233, 36, 253, 205, 224, + 216, 70, 16, 233, 36, 253, 205, 224, 214, 83, 251, 244, 83, 245, 171, 83, + 249, 227, 83, 243, 236, 218, 131, 83, 249, 234, 83, 244, 19, 247, 126, + 83, 216, 40, 219, 54, 240, 175, 83, 219, 192, 3, 251, 180, 231, 159, 83, + 231, 188, 249, 227, 83, 231, 188, 243, 236, 218, 131, 83, 228, 196, 83, + 244, 5, 45, 221, 159, 111, 83, 244, 5, 45, 221, 159, 105, 83, 244, 5, 45, + 221, 159, 158, 83, 25, 220, 139, 83, 21, 210, 86, 83, 21, 111, 83, 21, + 105, 83, 21, 158, 83, 21, 161, 83, 21, 190, 83, 21, 195, 83, 21, 199, 83, + 21, 196, 83, 21, 201, 83, 1, 61, 83, 1, 76, 83, 1, 74, 83, 1, 78, 83, 1, + 69, 83, 1, 226, 238, 83, 1, 214, 214, 83, 1, 245, 217, 83, 1, 198, 83, 1, + 254, 123, 83, 1, 252, 199, 83, 1, 191, 83, 1, 224, 91, 83, 1, 243, 142, + 83, 1, 186, 83, 1, 233, 141, 83, 1, 206, 83, 1, 220, 104, 83, 1, 217, + 106, 83, 1, 248, 229, 83, 1, 250, 165, 83, 1, 235, 147, 83, 1, 192, 83, + 1, 205, 83, 1, 212, 65, 83, 1, 244, 204, 83, 1, 176, 83, 1, 234, 138, 83, + 1, 215, 184, 83, 1, 210, 116, 83, 1, 242, 53, 83, 1, 210, 16, 83, 1, 233, + 4, 83, 1, 210, 69, 83, 1, 250, 118, 83, 1, 216, 40, 200, 25, 50, 83, 1, + 216, 40, 76, 83, 1, 216, 40, 74, 83, 1, 216, 40, 78, 83, 1, 216, 40, 69, + 83, 1, 216, 40, 226, 238, 83, 1, 216, 40, 214, 214, 83, 1, 216, 40, 254, + 123, 83, 1, 216, 40, 252, 199, 83, 1, 216, 40, 191, 83, 1, 216, 40, 224, + 91, 83, 1, 216, 40, 243, 142, 83, 1, 216, 40, 186, 83, 1, 216, 40, 217, + 106, 83, 1, 216, 40, 248, 229, 83, 1, 216, 40, 250, 165, 83, 1, 216, 40, + 235, 147, 83, 1, 216, 40, 215, 184, 83, 1, 216, 40, 192, 83, 1, 216, 40, + 212, 65, 83, 1, 216, 40, 176, 83, 1, 216, 40, 243, 139, 83, 1, 216, 40, + 242, 53, 83, 1, 216, 40, 235, 113, 83, 1, 216, 40, 228, 236, 83, 1, 216, + 40, 246, 46, 83, 1, 219, 192, 76, 83, 1, 219, 192, 74, 83, 1, 219, 192, + 235, 158, 83, 1, 219, 192, 214, 214, 83, 1, 219, 192, 69, 83, 1, 219, + 192, 254, 123, 83, 1, 219, 192, 176, 83, 1, 219, 192, 243, 142, 83, 1, + 219, 192, 162, 83, 1, 219, 192, 191, 83, 1, 219, 192, 220, 104, 83, 1, + 219, 192, 217, 106, 83, 1, 219, 192, 248, 229, 83, 1, 219, 192, 235, 147, + 83, 1, 219, 192, 244, 204, 83, 1, 219, 192, 243, 139, 83, 1, 219, 192, + 242, 53, 83, 1, 219, 192, 215, 184, 83, 1, 219, 192, 210, 116, 83, 1, + 219, 192, 223, 187, 83, 1, 219, 192, 250, 165, 83, 1, 219, 192, 210, 82, + 83, 1, 231, 188, 74, 83, 1, 231, 188, 176, 83, 1, 231, 188, 205, 83, 1, + 231, 188, 244, 204, 83, 1, 231, 188, 210, 82, 83, 1, 254, 171, 243, 123, + 254, 84, 111, 83, 1, 254, 171, 243, 123, 213, 148, 111, 83, 1, 254, 171, + 243, 123, 248, 194, 83, 1, 254, 171, 243, 123, 214, 224, 83, 1, 254, 171, + 243, 123, 235, 200, 214, 224, 83, 1, 254, 171, 243, 123, 252, 163, 83, 1, + 254, 171, 243, 123, 134, 252, 163, 83, 1, 254, 171, 243, 123, 61, 83, 1, + 254, 171, 243, 123, 74, 83, 1, 254, 171, 243, 123, 176, 83, 1, 254, 171, + 243, 123, 229, 82, 83, 1, 254, 171, 243, 123, 251, 41, 83, 1, 254, 171, + 243, 123, 215, 157, 83, 1, 254, 171, 243, 123, 215, 145, 83, 1, 254, 171, + 243, 123, 248, 143, 83, 1, 254, 171, 243, 123, 228, 115, 83, 1, 254, 171, + 243, 123, 217, 106, 83, 1, 254, 171, 243, 123, 248, 229, 83, 1, 254, 171, + 243, 123, 191, 83, 1, 254, 171, 243, 123, 225, 150, 83, 1, 254, 171, 243, + 123, 218, 225, 83, 1, 254, 171, 243, 123, 210, 82, 83, 1, 254, 171, 243, + 123, 210, 116, 83, 1, 254, 171, 243, 123, 254, 218, 83, 1, 216, 40, 254, + 171, 243, 123, 217, 106, 83, 1, 216, 40, 254, 171, 243, 123, 210, 82, 83, + 1, 231, 188, 254, 171, 243, 123, 243, 0, 83, 1, 231, 188, 254, 171, 243, + 123, 229, 82, 83, 1, 231, 188, 254, 171, 243, 123, 251, 41, 83, 1, 231, + 188, 254, 171, 243, 123, 235, 120, 83, 1, 231, 188, 254, 171, 243, 123, + 215, 157, 83, 1, 231, 188, 254, 171, 243, 123, 248, 127, 83, 1, 231, 188, + 254, 171, 243, 123, 217, 106, 83, 1, 231, 188, 254, 171, 243, 123, 248, + 33, 83, 1, 231, 188, 254, 171, 243, 123, 218, 225, 83, 1, 231, 188, 254, + 171, 243, 123, 249, 80, 83, 1, 231, 188, 254, 171, 243, 123, 210, 82, 83, + 1, 231, 188, 254, 171, 243, 123, 210, 116, 83, 1, 254, 171, 243, 123, + 163, 69, 83, 1, 254, 171, 243, 123, 163, 192, 83, 1, 231, 188, 254, 171, + 243, 123, 252, 26, 83, 1, 254, 171, 243, 123, 248, 219, 83, 1, 231, 188, + 254, 171, 243, 123, 233, 4, 18, 19, 226, 113, 18, 19, 253, 175, 18, 19, + 255, 37, 18, 19, 212, 25, 18, 19, 224, 224, 18, 19, 225, 233, 18, 19, + 224, 108, 18, 19, 217, 32, 18, 19, 234, 195, 18, 19, 233, 185, 18, 19, + 231, 137, 18, 19, 228, 42, 18, 19, 229, 186, 18, 19, 233, 74, 18, 19, + 219, 24, 18, 19, 221, 213, 18, 19, 219, 234, 18, 19, 220, 68, 18, 19, + 219, 203, 18, 19, 210, 220, 18, 19, 211, 52, 18, 19, 223, 137, 18, 19, + 227, 175, 18, 19, 226, 220, 227, 175, 18, 19, 227, 174, 18, 19, 226, 220, + 227, 174, 18, 19, 227, 173, 18, 19, 226, 220, 227, 173, 18, 19, 227, 172, + 18, 19, 226, 220, 227, 172, 18, 19, 222, 107, 18, 19, 222, 106, 18, 19, + 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19, 222, 111, 18, 19, + 226, 220, 226, 109, 18, 19, 226, 220, 217, 153, 18, 19, 226, 220, 235, + 29, 18, 19, 226, 220, 251, 74, 18, 19, 226, 220, 194, 18, 19, 226, 220, + 230, 30, 18, 19, 226, 220, 222, 93, 18, 19, 226, 220, 220, 106, 18, 19, + 245, 227, 212, 98, 18, 19, 212, 7, 212, 98, 18, 19, 40, 4, 222, 236, 18, + 19, 40, 223, 160, 247, 128, 18, 19, 223, 226, 222, 108, 18, 19, 159, 232, + 133, 18, 19, 159, 233, 140, 18, 19, 216, 127, 18, 19, 216, 129, 18, 19, + 215, 137, 18, 19, 215, 139, 18, 19, 215, 144, 18, 19, 216, 50, 18, 19, + 216, 52, 18, 19, 221, 211, 219, 208, 18, 19, 221, 211, 220, 3, 18, 19, + 221, 211, 241, 60, 18, 19, 73, 242, 80, 18, 19, 73, 248, 60, 243, 62, 18, + 19, 73, 243, 139, 18, 19, 73, 242, 85, 18, 19, 221, 211, 235, 39, 18, 19, + 73, 235, 37, 18, 19, 252, 76, 248, 60, 156, 18, 19, 252, 76, 248, 60, + 153, 18, 19, 73, 248, 55, 222, 93, 232, 229, 213, 122, 233, 16, 232, 229, + 1, 176, 232, 229, 1, 234, 138, 232, 229, 1, 243, 142, 232, 229, 1, 243, + 0, 232, 229, 1, 229, 82, 232, 229, 1, 251, 41, 232, 229, 1, 250, 165, + 232, 229, 1, 235, 147, 232, 229, 1, 235, 120, 232, 229, 1, 211, 71, 232, + 229, 1, 217, 106, 232, 229, 1, 216, 209, 232, 229, 1, 248, 229, 232, 229, + 1, 248, 33, 232, 229, 1, 198, 232, 229, 1, 191, 232, 229, 1, 225, 150, + 232, 229, 1, 252, 199, 232, 229, 1, 252, 26, 232, 229, 1, 186, 232, 229, + 1, 192, 232, 229, 1, 205, 232, 229, 1, 233, 141, 232, 229, 1, 212, 65, + 232, 229, 1, 220, 104, 232, 229, 1, 218, 225, 232, 229, 1, 206, 232, 229, + 1, 162, 232, 229, 25, 5, 61, 232, 229, 25, 5, 74, 232, 229, 25, 5, 69, + 232, 229, 25, 5, 245, 217, 232, 229, 25, 5, 254, 210, 232, 229, 25, 5, + 226, 187, 232, 229, 25, 5, 253, 200, 232, 229, 25, 5, 76, 232, 229, 25, + 5, 78, 232, 229, 218, 74, 1, 192, 232, 229, 218, 74, 1, 205, 232, 229, + 218, 74, 1, 212, 65, 232, 229, 4, 1, 176, 232, 229, 4, 1, 229, 82, 232, + 229, 4, 1, 254, 83, 232, 229, 4, 1, 217, 106, 232, 229, 4, 1, 198, 232, + 229, 4, 1, 191, 232, 229, 4, 1, 186, 232, 229, 4, 1, 205, 232, 229, 4, 1, + 233, 141, 232, 229, 5, 230, 94, 232, 229, 5, 234, 177, 232, 229, 5, 222, + 34, 232, 229, 5, 232, 133, 232, 229, 245, 39, 79, 232, 229, 224, 16, 79, + 232, 229, 21, 210, 86, 232, 229, 21, 111, 232, 229, 21, 105, 232, 229, + 21, 158, 232, 229, 21, 161, 232, 229, 21, 190, 232, 229, 21, 195, 232, + 229, 21, 199, 232, 229, 21, 196, 232, 229, 21, 201, 39, 233, 65, 1, 176, + 39, 233, 65, 1, 211, 165, 39, 233, 65, 1, 229, 82, 39, 233, 65, 1, 215, + 184, 39, 233, 65, 1, 206, 39, 233, 65, 1, 192, 39, 233, 65, 1, 217, 106, + 39, 233, 65, 1, 216, 209, 39, 233, 65, 1, 233, 141, 39, 233, 65, 1, 191, + 39, 233, 65, 1, 225, 150, 39, 233, 65, 1, 186, 39, 233, 65, 1, 244, 204, + 39, 233, 65, 1, 214, 27, 39, 233, 65, 1, 162, 39, 233, 65, 1, 224, 91, + 39, 233, 65, 1, 234, 138, 39, 233, 65, 1, 215, 176, 39, 233, 65, 1, 198, + 39, 233, 65, 1, 61, 39, 233, 65, 1, 74, 39, 233, 65, 1, 245, 217, 39, + 233, 65, 1, 245, 205, 39, 233, 65, 1, 69, 39, 233, 65, 1, 226, 187, 39, + 233, 65, 1, 78, 39, 233, 65, 1, 214, 214, 39, 233, 65, 1, 76, 39, 233, + 65, 1, 253, 198, 39, 233, 65, 1, 254, 210, 39, 233, 65, 1, 216, 29, 39, + 233, 65, 1, 216, 28, 39, 233, 65, 1, 216, 27, 39, 233, 65, 1, 216, 26, + 39, 233, 65, 1, 216, 25, 166, 39, 173, 1, 125, 224, 91, 166, 39, 173, 1, + 121, 224, 91, 166, 39, 173, 1, 125, 176, 166, 39, 173, 1, 125, 211, 165, + 166, 39, 173, 1, 125, 229, 82, 166, 39, 173, 1, 121, 176, 166, 39, 173, + 1, 121, 211, 165, 166, 39, 173, 1, 121, 229, 82, 166, 39, 173, 1, 125, + 215, 184, 166, 39, 173, 1, 125, 206, 166, 39, 173, 1, 125, 192, 166, 39, + 173, 1, 121, 215, 184, 166, 39, 173, 1, 121, 206, 166, 39, 173, 1, 121, + 192, 166, 39, 173, 1, 125, 217, 106, 166, 39, 173, 1, 125, 216, 209, 166, + 39, 173, 1, 125, 198, 166, 39, 173, 1, 121, 217, 106, 166, 39, 173, 1, + 121, 216, 209, 166, 39, 173, 1, 121, 198, 166, 39, 173, 1, 125, 191, 166, + 39, 173, 1, 125, 225, 150, 166, 39, 173, 1, 125, 186, 166, 39, 173, 1, + 121, 191, 166, 39, 173, 1, 121, 225, 150, 166, 39, 173, 1, 121, 186, 166, + 39, 173, 1, 125, 244, 204, 166, 39, 173, 1, 125, 214, 27, 166, 39, 173, + 1, 125, 233, 141, 166, 39, 173, 1, 121, 244, 204, 166, 39, 173, 1, 121, + 214, 27, 166, 39, 173, 1, 121, 233, 141, 166, 39, 173, 1, 125, 162, 166, + 39, 173, 1, 125, 248, 229, 166, 39, 173, 1, 125, 252, 199, 166, 39, 173, + 1, 121, 162, 166, 39, 173, 1, 121, 248, 229, 166, 39, 173, 1, 121, 252, + 199, 166, 39, 173, 1, 125, 233, 190, 166, 39, 173, 1, 125, 211, 138, 166, + 39, 173, 1, 121, 233, 190, 166, 39, 173, 1, 121, 211, 138, 166, 39, 173, + 1, 125, 218, 83, 166, 39, 173, 1, 121, 218, 83, 166, 39, 173, 25, 5, 25, + 219, 241, 166, 39, 173, 25, 5, 255, 82, 166, 39, 173, 25, 5, 236, 40, + 166, 39, 173, 25, 5, 69, 166, 39, 173, 25, 5, 214, 118, 166, 39, 173, 25, + 5, 76, 166, 39, 173, 25, 5, 254, 252, 166, 39, 173, 25, 5, 78, 166, 39, + 173, 25, 5, 227, 4, 166, 39, 173, 25, 5, 214, 214, 166, 39, 173, 25, 5, + 253, 175, 166, 39, 173, 25, 5, 255, 37, 166, 39, 173, 25, 5, 214, 111, + 166, 39, 173, 25, 5, 226, 113, 166, 39, 173, 25, 5, 227, 1, 166, 39, 173, + 25, 5, 214, 210, 166, 39, 173, 25, 5, 235, 158, 166, 39, 173, 1, 40, 214, + 105, 166, 39, 173, 1, 40, 229, 84, 166, 39, 173, 1, 40, 230, 30, 166, 39, + 173, 1, 40, 194, 166, 39, 173, 1, 40, 235, 29, 166, 39, 173, 1, 40, 249, + 68, 166, 39, 173, 1, 40, 253, 166, 166, 39, 173, 138, 231, 163, 166, 39, + 173, 138, 231, 162, 166, 39, 173, 21, 210, 86, 166, 39, 173, 21, 111, + 166, 39, 173, 21, 105, 166, 39, 173, 21, 158, 166, 39, 173, 21, 161, 166, + 39, 173, 21, 190, 166, 39, 173, 21, 195, 166, 39, 173, 21, 199, 166, 39, + 173, 21, 196, 166, 39, 173, 21, 201, 166, 39, 173, 89, 21, 111, 166, 39, + 173, 5, 233, 126, 166, 39, 173, 5, 233, 125, 70, 16, 225, 240, 70, 16, + 230, 77, 234, 31, 70, 16, 225, 75, 234, 31, 70, 16, 252, 58, 234, 31, 70, + 16, 251, 112, 234, 31, 70, 16, 224, 219, 234, 31, 70, 16, 224, 213, 234, + 31, 70, 16, 224, 211, 234, 31, 70, 16, 224, 217, 234, 31, 70, 16, 224, + 215, 234, 31, 70, 16, 248, 181, 234, 31, 70, 16, 248, 177, 234, 31, 70, + 16, 248, 176, 234, 31, 70, 16, 248, 179, 234, 31, 70, 16, 248, 178, 234, + 31, 70, 16, 248, 175, 234, 31, 70, 16, 215, 87, 70, 16, 230, 77, 222, + 207, 70, 16, 225, 75, 222, 207, 70, 16, 252, 58, 222, 207, 70, 16, 251, + 112, 222, 207, 70, 16, 224, 219, 222, 207, 70, 16, 224, 213, 222, 207, + 70, 16, 224, 211, 222, 207, 70, 16, 224, 217, 222, 207, 70, 16, 224, 215, + 222, 207, 70, 16, 248, 181, 222, 207, 70, 16, 248, 177, 222, 207, 70, 16, + 248, 176, 222, 207, 70, 16, 248, 179, 222, 207, 70, 16, 248, 178, 222, + 207, 70, 16, 248, 175, 222, 207, 251, 129, 1, 176, 251, 129, 1, 243, 142, + 251, 129, 1, 229, 82, 251, 129, 1, 229, 27, 251, 129, 1, 191, 251, 129, + 1, 252, 199, 251, 129, 1, 186, 251, 129, 1, 230, 110, 251, 129, 1, 217, + 106, 251, 129, 1, 248, 229, 251, 129, 1, 198, 251, 129, 1, 228, 41, 251, + 129, 1, 251, 41, 251, 129, 1, 235, 147, 251, 129, 1, 227, 169, 251, 129, + 1, 227, 162, 251, 129, 1, 192, 251, 129, 1, 205, 251, 129, 1, 233, 141, + 251, 129, 1, 214, 27, 251, 129, 1, 206, 251, 129, 1, 61, 251, 129, 1, + 162, 251, 129, 25, 5, 74, 251, 129, 25, 5, 69, 251, 129, 25, 5, 76, 251, + 129, 25, 5, 78, 251, 129, 25, 5, 254, 252, 251, 129, 226, 64, 251, 129, + 245, 151, 64, 221, 174, 39, 89, 1, 125, 176, 39, 89, 1, 125, 234, 138, + 39, 89, 1, 125, 233, 177, 39, 89, 1, 121, 176, 39, 89, 1, 121, 233, 177, + 39, 89, 1, 121, 234, 138, 39, 89, 1, 229, 82, 39, 89, 1, 125, 251, 41, + 39, 89, 1, 125, 250, 165, 39, 89, 1, 121, 251, 41, 39, 89, 1, 121, 206, + 39, 89, 1, 121, 250, 165, 39, 89, 1, 227, 169, 39, 89, 1, 223, 143, 39, + 89, 1, 125, 223, 141, 39, 89, 1, 248, 229, 39, 89, 1, 121, 223, 141, 39, + 89, 1, 223, 152, 39, 89, 1, 125, 217, 106, 39, 89, 1, 125, 216, 209, 39, + 89, 1, 121, 217, 106, 39, 89, 1, 121, 216, 209, 39, 89, 1, 198, 39, 89, + 1, 252, 199, 39, 89, 1, 125, 191, 39, 89, 1, 125, 225, 150, 39, 89, 1, + 125, 244, 204, 39, 89, 1, 121, 191, 39, 89, 1, 121, 244, 204, 39, 89, 1, + 121, 225, 150, 39, 89, 1, 186, 39, 89, 1, 121, 192, 39, 89, 1, 125, 192, + 39, 89, 1, 205, 39, 89, 1, 222, 139, 39, 89, 1, 233, 141, 39, 89, 1, 232, + 98, 39, 89, 1, 212, 65, 39, 89, 1, 125, 220, 104, 39, 89, 1, 125, 218, + 225, 39, 89, 1, 125, 206, 39, 89, 1, 125, 162, 39, 89, 1, 232, 190, 39, + 89, 1, 61, 39, 89, 1, 121, 162, 39, 89, 1, 74, 39, 89, 1, 236, 40, 39, + 89, 1, 69, 39, 89, 1, 214, 118, 39, 89, 1, 245, 217, 39, 89, 1, 226, 187, + 39, 89, 1, 233, 126, 39, 89, 1, 242, 139, 206, 39, 89, 117, 5, 147, 205, + 39, 89, 117, 5, 147, 233, 141, 39, 89, 117, 5, 233, 142, 217, 59, 233, + 115, 39, 89, 5, 231, 209, 234, 237, 233, 115, 39, 89, 117, 5, 40, 229, + 82, 39, 89, 117, 5, 121, 191, 39, 89, 117, 5, 125, 223, 142, 177, 121, + 191, 39, 89, 117, 5, 186, 39, 89, 117, 5, 252, 199, 39, 89, 117, 5, 206, + 39, 89, 5, 222, 12, 39, 89, 25, 5, 61, 39, 89, 25, 5, 231, 209, 221, 228, + 39, 89, 25, 5, 255, 82, 39, 89, 25, 5, 217, 65, 255, 82, 39, 89, 25, 5, + 74, 39, 89, 25, 5, 236, 40, 39, 89, 25, 5, 214, 214, 39, 89, 25, 5, 214, + 117, 39, 89, 25, 5, 69, 39, 89, 25, 5, 214, 118, 39, 89, 25, 5, 78, 39, + 89, 25, 5, 227, 5, 51, 39, 89, 25, 5, 226, 113, 39, 89, 25, 5, 76, 39, + 89, 25, 5, 254, 252, 39, 89, 25, 5, 226, 187, 39, 89, 25, 5, 254, 210, + 39, 89, 25, 5, 89, 254, 210, 39, 89, 25, 5, 227, 5, 48, 39, 89, 5, 231, + 209, 234, 236, 39, 89, 5, 216, 30, 39, 89, 5, 216, 29, 39, 89, 5, 234, + 103, 216, 28, 39, 89, 5, 234, 103, 216, 27, 39, 89, 5, 234, 103, 216, 26, + 39, 89, 5, 223, 191, 242, 52, 39, 89, 5, 231, 209, 221, 255, 39, 89, 5, + 234, 102, 234, 221, 39, 89, 38, 249, 123, 247, 128, 39, 89, 241, 53, 21, + 210, 86, 39, 89, 241, 53, 21, 111, 39, 89, 241, 53, 21, 105, 39, 89, 241, + 53, 21, 158, 39, 89, 241, 53, 21, 161, 39, 89, 241, 53, 21, 190, 39, 89, + 241, 53, 21, 195, 39, 89, 241, 53, 21, 199, 39, 89, 241, 53, 21, 196, 39, + 89, 241, 53, 21, 201, 39, 89, 89, 21, 210, 86, 39, 89, 89, 21, 111, 39, + 89, 89, 21, 105, 39, 89, 89, 21, 158, 39, 89, 89, 21, 161, 39, 89, 89, + 21, 190, 39, 89, 89, 21, 195, 39, 89, 89, 21, 199, 39, 89, 89, 21, 196, + 39, 89, 89, 21, 201, 39, 89, 5, 211, 249, 39, 89, 5, 211, 248, 39, 89, 5, + 221, 217, 39, 89, 5, 234, 166, 39, 89, 5, 240, 239, 39, 89, 5, 247, 142, + 39, 89, 5, 223, 52, 222, 189, 223, 152, 39, 89, 5, 231, 209, 211, 72, 39, + 89, 5, 235, 12, 39, 89, 5, 235, 11, 39, 89, 5, 221, 224, 39, 89, 5, 221, + 223, 39, 89, 5, 242, 16, 39, 89, 5, 251, 38, 102, 5, 214, 200, 223, 33, + 102, 5, 214, 200, 251, 9, 102, 5, 250, 194, 102, 5, 218, 16, 102, 5, 251, + 241, 102, 1, 254, 193, 102, 1, 254, 194, 217, 14, 102, 1, 236, 36, 102, + 1, 236, 37, 217, 14, 102, 1, 214, 203, 102, 1, 214, 204, 217, 14, 102, 1, + 223, 191, 223, 82, 102, 1, 223, 191, 223, 83, 217, 14, 102, 1, 233, 142, + 233, 30, 102, 1, 233, 142, 233, 31, 217, 14, 102, 1, 245, 187, 102, 1, + 254, 208, 102, 1, 226, 216, 102, 1, 226, 217, 217, 14, 102, 1, 176, 102, + 1, 235, 19, 231, 212, 102, 1, 243, 142, 102, 1, 243, 143, 242, 168, 102, + 1, 229, 82, 102, 1, 251, 41, 102, 1, 251, 42, 233, 129, 102, 1, 235, 147, + 102, 1, 235, 148, 235, 124, 102, 1, 227, 169, 102, 1, 217, 107, 233, 82, + 102, 1, 217, 107, 230, 72, 231, 212, 102, 1, 248, 230, 230, 72, 254, 153, + 102, 1, 248, 230, 230, 72, 231, 212, 102, 1, 229, 234, 223, 155, 102, 1, + 217, 106, 102, 1, 217, 107, 217, 36, 102, 1, 248, 229, 102, 1, 248, 230, + 231, 230, 102, 1, 198, 102, 1, 191, 102, 1, 226, 94, 234, 232, 102, 1, + 252, 199, 102, 1, 252, 200, 234, 178, 102, 1, 186, 102, 1, 192, 102, 1, + 205, 102, 1, 233, 141, 102, 1, 212, 65, 102, 1, 222, 36, 222, 22, 102, 1, + 222, 36, 221, 235, 102, 1, 206, 102, 1, 162, 102, 5, 223, 73, 102, 25, 5, + 217, 14, 102, 25, 5, 214, 199, 102, 25, 5, 214, 200, 221, 231, 102, 25, + 5, 218, 48, 102, 25, 5, 218, 49, 236, 28, 102, 25, 5, 223, 191, 223, 82, + 102, 25, 5, 223, 191, 223, 83, 217, 14, 102, 25, 5, 233, 142, 233, 30, + 102, 25, 5, 233, 142, 233, 31, 217, 14, 102, 25, 5, 217, 66, 102, 25, 5, + 217, 67, 223, 82, 102, 25, 5, 217, 67, 217, 14, 102, 25, 5, 217, 67, 223, + 83, 217, 14, 102, 25, 5, 225, 187, 102, 25, 5, 225, 188, 217, 14, 102, + 255, 3, 255, 2, 102, 1, 235, 1, 221, 230, 102, 1, 234, 108, 221, 230, + 102, 1, 215, 34, 221, 230, 102, 1, 245, 211, 221, 230, 102, 1, 214, 0, + 221, 230, 102, 1, 210, 107, 221, 230, 102, 1, 253, 217, 221, 230, 102, + 21, 210, 86, 102, 21, 111, 102, 21, 105, 102, 21, 158, 102, 21, 161, 102, + 21, 190, 102, 21, 195, 102, 21, 199, 102, 21, 196, 102, 21, 201, 102, + 226, 33, 102, 226, 59, 102, 211, 238, 102, 250, 244, 226, 52, 102, 250, + 244, 219, 174, 102, 250, 244, 226, 6, 102, 226, 58, 102, 28, 16, 247, + 134, 102, 28, 16, 248, 59, 102, 28, 16, 246, 72, 102, 28, 16, 248, 184, + 102, 28, 16, 248, 185, 218, 16, 102, 28, 16, 247, 213, 102, 28, 16, 248, + 222, 102, 28, 16, 248, 41, 102, 28, 16, 248, 206, 102, 28, 16, 248, 185, + 243, 64, 102, 28, 16, 38, 217, 10, 102, 28, 16, 38, 245, 149, 102, 28, + 16, 38, 234, 173, 102, 28, 16, 38, 234, 175, 102, 28, 16, 38, 235, 128, + 102, 28, 16, 38, 234, 174, 2, 235, 128, 102, 28, 16, 38, 234, 176, 2, + 235, 128, 102, 28, 16, 38, 252, 45, 102, 28, 16, 38, 242, 172, 102, 28, + 16, 222, 252, 204, 246, 82, 102, 28, 16, 222, 252, 204, 248, 220, 102, + 28, 16, 222, 252, 250, 8, 215, 112, 102, 28, 16, 222, 252, 250, 8, 217, + 74, 102, 28, 16, 233, 50, 204, 226, 47, 102, 28, 16, 233, 50, 204, 224, + 142, 102, 28, 16, 233, 50, 250, 8, 225, 41, 102, 28, 16, 233, 50, 250, 8, + 225, 29, 102, 28, 16, 233, 50, 204, 225, 64, 207, 5, 226, 30, 207, 5, + 226, 43, 207, 5, 226, 39, 207, 1, 61, 207, 1, 74, 207, 1, 69, 207, 1, + 254, 252, 207, 1, 78, 207, 1, 76, 207, 1, 245, 63, 207, 1, 176, 207, 1, + 224, 91, 207, 1, 243, 142, 207, 1, 229, 82, 207, 1, 251, 41, 207, 1, 235, + 147, 207, 1, 210, 116, 207, 1, 227, 169, 207, 1, 217, 106, 207, 1, 248, + 229, 207, 1, 198, 207, 1, 191, 207, 1, 244, 204, 207, 1, 214, 27, 207, 1, + 252, 199, 207, 1, 186, 207, 1, 192, 207, 1, 205, 207, 1, 233, 141, 207, + 1, 212, 65, 207, 1, 206, 207, 1, 211, 165, 207, 1, 162, 207, 117, 5, 226, + 56, 207, 117, 5, 226, 32, 207, 117, 5, 226, 29, 207, 25, 5, 226, 46, 207, + 25, 5, 226, 28, 207, 25, 5, 226, 50, 207, 25, 5, 226, 38, 207, 25, 5, + 226, 57, 207, 25, 5, 226, 48, 207, 5, 226, 60, 207, 5, 213, 152, 207, + 117, 5, 225, 252, 186, 207, 117, 5, 225, 252, 212, 65, 207, 1, 234, 138, + 207, 1, 217, 232, 207, 21, 210, 86, 207, 21, 111, 207, 21, 105, 207, 21, + 158, 207, 21, 161, 207, 21, 190, 207, 21, 195, 207, 21, 199, 207, 21, + 196, 207, 21, 201, 207, 253, 183, 207, 1, 223, 55, 207, 1, 233, 13, 207, + 1, 252, 26, 207, 1, 40, 235, 29, 207, 1, 40, 194, 252, 128, 1, 61, 252, + 128, 1, 219, 166, 61, 252, 128, 1, 162, 252, 128, 1, 219, 166, 162, 252, + 128, 1, 231, 186, 162, 252, 128, 1, 252, 199, 252, 128, 1, 234, 218, 252, + 199, 252, 128, 1, 191, 252, 128, 1, 219, 166, 191, 252, 128, 1, 198, 252, + 128, 1, 231, 186, 198, 252, 128, 1, 212, 65, 252, 128, 1, 219, 166, 212, + 65, 252, 128, 1, 226, 71, 212, 65, 252, 128, 1, 243, 142, 252, 128, 1, + 219, 166, 243, 142, 252, 128, 1, 235, 147, 252, 128, 1, 248, 229, 252, + 128, 1, 205, 252, 128, 1, 219, 166, 205, 252, 128, 1, 186, 252, 128, 1, + 219, 166, 186, 252, 128, 1, 219, 28, 217, 106, 252, 128, 1, 228, 60, 217, + 106, 252, 128, 1, 206, 252, 128, 1, 219, 166, 206, 252, 128, 1, 231, 186, + 206, 252, 128, 1, 192, 252, 128, 1, 219, 166, 192, 252, 128, 1, 229, 82, + 252, 128, 1, 233, 141, 252, 128, 1, 219, 166, 233, 141, 252, 128, 1, 227, + 169, 252, 128, 1, 251, 41, 252, 128, 1, 229, 153, 252, 128, 1, 231, 129, + 252, 128, 1, 74, 252, 128, 1, 69, 252, 128, 5, 216, 34, 252, 128, 25, 5, + 76, 252, 128, 25, 5, 226, 71, 76, 252, 128, 25, 5, 245, 217, 252, 128, + 25, 5, 74, 252, 128, 25, 5, 234, 218, 74, 252, 128, 25, 5, 78, 252, 128, + 25, 5, 234, 218, 78, 252, 128, 25, 5, 69, 252, 128, 25, 5, 104, 31, 219, + 166, 206, 252, 128, 117, 5, 229, 84, 252, 128, 117, 5, 242, 67, 252, 128, + 226, 41, 252, 128, 226, 37, 252, 128, 16, 251, 249, 229, 234, 231, 42, + 252, 128, 16, 251, 249, 225, 67, 252, 128, 16, 251, 249, 235, 54, 252, + 128, 16, 251, 249, 226, 41, 197, 1, 176, 197, 1, 234, 45, 197, 1, 234, + 138, 197, 1, 243, 142, 197, 1, 242, 193, 197, 1, 229, 82, 197, 1, 251, + 41, 197, 1, 250, 165, 197, 1, 235, 147, 197, 1, 227, 169, 197, 1, 217, + 106, 197, 1, 216, 209, 197, 1, 248, 229, 197, 1, 198, 197, 1, 191, 197, + 1, 225, 45, 197, 1, 225, 150, 197, 1, 244, 204, 197, 1, 244, 83, 197, 1, + 252, 199, 197, 1, 251, 230, 197, 1, 186, 197, 1, 230, 173, 197, 1, 215, + 184, 197, 1, 215, 176, 197, 1, 246, 46, 197, 1, 192, 197, 1, 205, 197, 1, + 233, 141, 197, 1, 162, 197, 1, 241, 160, 197, 1, 214, 27, 197, 1, 206, + 197, 1, 220, 104, 197, 1, 212, 65, 197, 1, 61, 197, 218, 74, 1, 192, 197, + 218, 74, 1, 205, 197, 25, 5, 255, 82, 197, 25, 5, 74, 197, 25, 5, 78, + 197, 25, 5, 226, 187, 197, 25, 5, 69, 197, 25, 5, 214, 118, 197, 25, 5, + 76, 197, 117, 5, 235, 29, 197, 117, 5, 194, 197, 117, 5, 156, 197, 117, + 5, 230, 30, 197, 117, 5, 226, 109, 197, 117, 5, 153, 197, 117, 5, 217, + 153, 197, 117, 5, 227, 146, 197, 117, 5, 234, 236, 197, 5, 223, 153, 197, + 5, 227, 209, 197, 224, 144, 217, 104, 197, 224, 144, 227, 156, 216, 121, + 217, 104, 197, 224, 144, 250, 172, 197, 224, 144, 215, 171, 250, 172, + 197, 224, 144, 215, 170, 197, 21, 210, 86, 197, 21, 111, 197, 21, 105, + 197, 21, 158, 197, 21, 161, 197, 21, 190, 197, 21, 195, 197, 21, 199, + 197, 21, 196, 197, 21, 201, 197, 1, 215, 157, 197, 1, 215, 145, 197, 1, + 248, 143, 226, 214, 250, 111, 21, 210, 86, 226, 214, 250, 111, 21, 111, + 226, 214, 250, 111, 21, 105, 226, 214, 250, 111, 21, 158, 226, 214, 250, + 111, 21, 161, 226, 214, 250, 111, 21, 190, 226, 214, 250, 111, 21, 195, + 226, 214, 250, 111, 21, 199, 226, 214, 250, 111, 21, 196, 226, 214, 250, + 111, 21, 201, 226, 214, 250, 111, 1, 233, 141, 226, 214, 250, 111, 1, + 253, 214, 226, 214, 250, 111, 1, 254, 225, 226, 214, 250, 111, 1, 254, + 123, 226, 214, 250, 111, 1, 254, 187, 226, 214, 250, 111, 1, 233, 140, + 226, 214, 250, 111, 1, 255, 44, 226, 214, 250, 111, 1, 255, 45, 226, 214, + 250, 111, 1, 255, 43, 226, 214, 250, 111, 1, 255, 38, 226, 214, 250, 111, + 1, 232, 247, 226, 214, 250, 111, 1, 235, 178, 226, 214, 250, 111, 1, 236, + 41, 226, 214, 250, 111, 1, 235, 197, 226, 214, 250, 111, 1, 235, 186, + 226, 214, 250, 111, 1, 232, 103, 226, 214, 250, 111, 1, 214, 221, 226, + 214, 250, 111, 1, 214, 219, 226, 214, 250, 111, 1, 214, 168, 226, 214, + 250, 111, 1, 214, 111, 226, 214, 250, 111, 1, 233, 64, 226, 214, 250, + 111, 1, 245, 116, 226, 214, 250, 111, 1, 245, 220, 226, 214, 250, 111, 1, + 245, 158, 226, 214, 250, 111, 1, 245, 94, 226, 214, 250, 111, 1, 232, + 162, 226, 214, 250, 111, 1, 226, 141, 226, 214, 250, 111, 1, 227, 0, 226, + 214, 250, 111, 1, 226, 129, 226, 214, 250, 111, 1, 226, 226, 226, 214, + 250, 111, 230, 108, 215, 122, 226, 214, 250, 111, 243, 137, 215, 123, + 226, 214, 250, 111, 230, 106, 215, 123, 226, 214, 250, 111, 223, 95, 226, + 214, 250, 111, 225, 148, 226, 214, 250, 111, 254, 217, 226, 214, 250, + 111, 224, 144, 230, 103, 226, 214, 250, 111, 224, 144, 52, 230, 103, 207, + 224, 144, 251, 249, 218, 9, 207, 224, 144, 251, 249, 226, 42, 207, 224, + 144, 251, 249, 224, 132, 207, 224, 144, 251, 249, 251, 27, 207, 224, 144, + 251, 249, 233, 14, 221, 227, 207, 224, 144, 251, 249, 235, 19, 221, 227, + 207, 224, 144, 251, 249, 248, 230, 221, 227, 207, 224, 144, 251, 249, + 252, 200, 221, 227, 213, 252, 138, 234, 216, 213, 252, 138, 220, 79, 213, + 252, 138, 224, 201, 213, 252, 5, 228, 214, 213, 252, 5, 211, 80, 230, + 227, 218, 1, 213, 252, 138, 211, 80, 254, 222, 235, 250, 218, 1, 213, + 252, 138, 211, 80, 235, 250, 218, 1, 213, 252, 138, 211, 80, 234, 204, + 235, 250, 218, 1, 213, 252, 138, 251, 10, 51, 213, 252, 138, 211, 80, + 234, 204, 235, 250, 218, 2, 221, 199, 213, 252, 138, 52, 218, 1, 213, + 252, 138, 215, 212, 218, 1, 213, 252, 138, 234, 204, 254, 85, 213, 252, + 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138, 134, 170, 51, + 213, 252, 138, 222, 243, 234, 215, 235, 250, 218, 1, 213, 252, 138, 253, + 212, 235, 250, 218, 1, 213, 252, 5, 213, 148, 218, 1, 213, 252, 5, 213, + 148, 214, 216, 213, 252, 5, 223, 52, 213, 148, 214, 216, 213, 252, 5, + 213, 148, 254, 85, 213, 252, 5, 223, 52, 213, 148, 254, 85, 213, 252, 5, + 213, 148, 214, 217, 2, 217, 78, 213, 252, 5, 213, 148, 254, 86, 2, 217, + 78, 213, 252, 5, 254, 84, 254, 99, 213, 252, 5, 254, 84, 252, 174, 213, + 252, 5, 254, 84, 214, 20, 213, 252, 5, 254, 84, 214, 21, 2, 217, 78, 213, + 252, 5, 216, 69, 213, 252, 5, 241, 198, 200, 254, 83, 213, 252, 5, 200, + 254, 83, 213, 252, 5, 222, 144, 200, 254, 83, 213, 252, 5, 254, 84, 214, + 223, 230, 95, 213, 252, 5, 254, 28, 213, 252, 5, 222, 189, 254, 28, 213, + 252, 138, 251, 10, 48, 213, 252, 5, 235, 108, 213, 252, 5, 214, 161, 7, + 1, 4, 6, 61, 7, 1, 4, 6, 254, 252, 7, 4, 1, 215, 94, 254, 252, 7, 1, 4, + 6, 252, 142, 253, 166, 7, 1, 4, 6, 251, 74, 7, 1, 4, 6, 249, 68, 7, 1, 4, + 6, 245, 67, 7, 1, 4, 6, 76, 7, 4, 1, 215, 94, 204, 76, 7, 4, 1, 215, 94, + 74, 7, 1, 4, 6, 235, 150, 7, 1, 4, 6, 235, 29, 7, 1, 4, 6, 233, 155, 2, + 91, 7, 1, 4, 6, 194, 7, 1, 4, 6, 223, 52, 230, 30, 7, 1, 4, 6, 78, 7, 1, + 4, 6, 204, 78, 7, 4, 1, 219, 189, 78, 7, 4, 1, 219, 189, 204, 78, 7, 4, + 1, 219, 189, 144, 2, 91, 7, 4, 1, 215, 94, 226, 238, 7, 1, 4, 6, 226, + 138, 7, 4, 1, 216, 15, 163, 78, 7, 4, 1, 251, 183, 163, 78, 7, 1, 4, 6, + 226, 109, 7, 1, 4, 6, 223, 52, 153, 7, 1, 4, 6, 215, 94, 153, 7, 1, 4, 6, + 217, 153, 7, 1, 4, 6, 69, 7, 4, 1, 219, 189, 69, 7, 4, 1, 219, 189, 248, + 8, 69, 7, 4, 1, 219, 189, 215, 94, 194, 7, 1, 4, 6, 214, 105, 7, 1, 4, 6, + 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 16, 7, 1, 213, 135, 233, + 88, 218, 252, 7, 1, 254, 205, 26, 1, 4, 6, 243, 114, 26, 1, 4, 6, 233, + 104, 26, 1, 4, 6, 225, 111, 26, 1, 4, 6, 223, 40, 26, 1, 4, 6, 224, 164, + 33, 1, 4, 6, 245, 182, 58, 1, 6, 61, 58, 1, 6, 254, 252, 58, 1, 6, 253, + 166, 58, 1, 6, 252, 142, 253, 166, 58, 1, 6, 249, 68, 58, 1, 6, 76, 58, + 1, 6, 223, 52, 76, 58, 1, 6, 243, 209, 58, 1, 6, 242, 67, 58, 1, 6, 74, + 58, 1, 6, 235, 150, 58, 1, 6, 235, 29, 58, 1, 6, 156, 58, 1, 6, 194, 58, + 1, 6, 230, 30, 58, 1, 6, 223, 52, 230, 30, 58, 1, 6, 78, 58, 1, 6, 226, + 138, 58, 1, 6, 226, 109, 58, 1, 6, 153, 58, 1, 6, 217, 153, 58, 1, 6, 69, + 58, 1, 6, 212, 98, 58, 1, 4, 61, 58, 1, 4, 215, 94, 61, 58, 1, 4, 254, + 151, 58, 1, 4, 215, 94, 254, 252, 58, 1, 4, 253, 166, 58, 1, 4, 249, 68, + 58, 1, 4, 76, 58, 1, 4, 221, 197, 58, 1, 4, 204, 76, 58, 1, 4, 215, 94, + 204, 76, 58, 1, 4, 243, 209, 58, 1, 4, 215, 94, 74, 58, 1, 4, 235, 29, + 58, 1, 4, 194, 58, 1, 4, 245, 146, 58, 1, 4, 78, 58, 1, 4, 204, 78, 58, + 1, 4, 216, 15, 163, 78, 58, 1, 4, 251, 183, 163, 78, 58, 1, 4, 226, 109, + 58, 1, 4, 217, 153, 58, 1, 4, 69, 58, 1, 4, 219, 189, 69, 58, 1, 4, 215, + 94, 194, 58, 1, 4, 214, 105, 58, 1, 4, 254, 205, 58, 1, 4, 252, 34, 58, + 1, 4, 26, 243, 114, 58, 1, 4, 248, 62, 58, 1, 4, 26, 225, 136, 58, 1, 4, + 250, 118, 7, 218, 66, 4, 1, 74, 7, 218, 66, 4, 1, 153, 7, 218, 66, 4, 1, + 69, 7, 218, 66, 4, 1, 214, 105, 26, 218, 66, 4, 1, 252, 34, 26, 218, 66, + 4, 1, 243, 114, 26, 218, 66, 4, 1, 223, 40, 26, 218, 66, 4, 1, 225, 136, + 26, 218, 66, 4, 1, 250, 118, 7, 4, 1, 214, 214, 7, 4, 1, 57, 2, 230, 229, + 184, 7, 4, 1, 249, 69, 2, 230, 229, 184, 7, 4, 1, 245, 15, 2, 230, 229, + 184, 7, 4, 1, 232, 55, 2, 230, 229, 184, 7, 4, 1, 230, 31, 2, 230, 229, + 184, 7, 4, 1, 226, 110, 2, 230, 229, 184, 7, 4, 1, 223, 227, 2, 230, 229, + 184, 7, 4, 1, 223, 227, 2, 244, 96, 22, 230, 229, 184, 7, 4, 1, 222, 94, + 2, 230, 229, 184, 7, 4, 1, 217, 154, 2, 230, 229, 184, 7, 4, 1, 210, 160, + 2, 230, 229, 184, 7, 4, 1, 215, 94, 243, 209, 58, 1, 33, 245, 158, 7, 4, + 1, 235, 220, 243, 209, 7, 4, 1, 216, 212, 2, 218, 109, 7, 4, 6, 1, 240, + 161, 2, 91, 7, 4, 1, 235, 193, 2, 91, 7, 4, 1, 226, 110, 2, 91, 7, 4, 6, + 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1, 57, 2, 226, 70, 103, 7, + 4, 1, 249, 69, 2, 226, 70, 103, 7, 4, 1, 245, 15, 2, 226, 70, 103, 7, 4, + 1, 243, 210, 2, 226, 70, 103, 7, 4, 1, 235, 30, 2, 226, 70, 103, 7, 4, 1, + 233, 155, 2, 226, 70, 103, 7, 4, 1, 232, 55, 2, 226, 70, 103, 7, 4, 1, + 230, 31, 2, 226, 70, 103, 7, 4, 1, 226, 110, 2, 226, 70, 103, 7, 4, 1, + 223, 227, 2, 226, 70, 103, 7, 4, 1, 222, 94, 2, 226, 70, 103, 7, 4, 1, + 245, 84, 2, 226, 70, 103, 7, 4, 1, 214, 106, 2, 226, 70, 103, 7, 4, 1, + 211, 179, 2, 226, 70, 103, 7, 4, 1, 210, 160, 2, 226, 70, 103, 7, 4, 1, + 116, 2, 223, 58, 103, 7, 4, 1, 254, 152, 2, 223, 58, 103, 7, 4, 1, 249, + 69, 2, 241, 59, 22, 217, 78, 7, 4, 1, 160, 2, 223, 58, 103, 7, 4, 1, 204, + 160, 2, 223, 58, 103, 7, 4, 1, 223, 52, 204, 160, 2, 223, 58, 103, 7, 4, + 1, 221, 198, 2, 223, 58, 103, 7, 4, 1, 240, 161, 2, 223, 58, 103, 7, 4, + 1, 204, 144, 2, 223, 58, 103, 7, 4, 1, 245, 84, 2, 223, 58, 103, 7, 4, 1, + 104, 2, 223, 58, 103, 7, 4, 1, 245, 17, 2, 223, 58, 103, 58, 1, 4, 215, + 94, 254, 151, 58, 1, 4, 251, 74, 58, 1, 4, 251, 75, 2, 249, 108, 58, 1, + 4, 245, 67, 58, 1, 4, 223, 52, 204, 76, 58, 1, 4, 245, 14, 58, 1, 4, 247, + 127, 235, 151, 2, 91, 58, 1, 4, 119, 243, 209, 58, 1, 4, 215, 94, 242, + 67, 58, 1, 4, 240, 161, 2, 91, 58, 1, 4, 235, 192, 58, 1, 4, 6, 74, 58, + 1, 4, 6, 240, 161, 2, 91, 58, 1, 4, 235, 151, 2, 249, 135, 58, 1, 4, 233, + 155, 2, 223, 58, 103, 58, 1, 4, 233, 155, 2, 226, 70, 103, 58, 1, 4, 6, + 156, 58, 1, 4, 232, 55, 2, 103, 58, 1, 4, 215, 94, 232, 55, 2, 200, 233, + 42, 58, 1, 4, 230, 31, 2, 43, 103, 58, 1, 4, 230, 31, 2, 223, 58, 103, + 58, 1, 4, 6, 230, 30, 58, 1, 4, 252, 142, 78, 58, 1, 4, 225, 136, 58, 1, + 4, 222, 94, 2, 103, 58, 1, 4, 245, 83, 58, 1, 4, 217, 154, 2, 226, 70, + 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58, 1, 4, 6, 69, 58, 1, 4, + 214, 106, 2, 103, 58, 1, 4, 215, 94, 214, 105, 58, 1, 4, 210, 159, 58, 1, + 4, 210, 160, 2, 223, 58, 103, 58, 1, 4, 210, 160, 2, 249, 108, 58, 1, 4, + 245, 16, 58, 1, 4, 216, 180, 38, 246, 126, 242, 144, 255, 23, 38, 246, + 126, 255, 12, 255, 23, 38, 219, 71, 51, 38, 218, 7, 79, 38, 231, 236, 38, + 242, 141, 38, 231, 234, 38, 255, 10, 38, 242, 142, 38, 255, 11, 38, 7, 4, + 1, 223, 227, 51, 38, 251, 153, 38, 231, 235, 38, 52, 250, 39, 48, 38, + 226, 229, 48, 38, 210, 35, 51, 38, 235, 179, 51, 38, 214, 151, 48, 38, + 214, 134, 48, 38, 7, 4, 1, 244, 71, 204, 116, 48, 38, 7, 4, 1, 254, 252, + 38, 7, 4, 1, 254, 81, 38, 7, 4, 1, 253, 184, 38, 7, 4, 1, 251, 75, 250, + 191, 38, 7, 4, 1, 235, 220, 249, 68, 38, 7, 4, 1, 245, 67, 38, 7, 4, 1, + 243, 209, 38, 7, 1, 4, 6, 243, 209, 38, 7, 4, 1, 235, 29, 38, 7, 4, 1, + 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 194, 38, 7, 4, 1, 230, 30, 38, + 7, 1, 4, 6, 230, 30, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1, 223, 227, 222, + 188, 38, 7, 4, 1, 222, 93, 38, 7, 4, 1, 200, 222, 93, 38, 7, 4, 1, 210, + 159, 38, 52, 235, 200, 251, 155, 51, 38, 254, 156, 128, 216, 43, 51, 38, + 43, 254, 2, 48, 38, 44, 254, 2, 22, 124, 254, 2, 51, 7, 6, 1, 116, 2, + 222, 237, 51, 7, 4, 1, 116, 2, 222, 237, 51, 7, 6, 1, 57, 2, 59, 48, 7, + 4, 1, 57, 2, 59, 48, 7, 6, 1, 57, 2, 59, 51, 7, 4, 1, 57, 2, 59, 51, 7, + 6, 1, 57, 2, 232, 220, 51, 7, 4, 1, 57, 2, 232, 220, 51, 7, 6, 1, 251, + 75, 2, 250, 192, 22, 142, 7, 4, 1, 251, 75, 2, 250, 192, 22, 142, 7, 6, + 1, 249, 69, 2, 59, 48, 7, 4, 1, 249, 69, 2, 59, 48, 7, 6, 1, 249, 69, 2, + 59, 51, 7, 4, 1, 249, 69, 2, 59, 51, 7, 6, 1, 249, 69, 2, 232, 220, 51, + 7, 4, 1, 249, 69, 2, 232, 220, 51, 7, 6, 1, 249, 69, 2, 250, 191, 7, 4, + 1, 249, 69, 2, 250, 191, 7, 6, 1, 249, 69, 2, 250, 39, 51, 7, 4, 1, 249, + 69, 2, 250, 39, 51, 7, 6, 1, 160, 2, 231, 238, 22, 242, 143, 7, 4, 1, + 160, 2, 231, 238, 22, 242, 143, 7, 6, 1, 160, 2, 231, 238, 22, 142, 7, 4, + 1, 160, 2, 231, 238, 22, 142, 7, 6, 1, 160, 2, 250, 39, 51, 7, 4, 1, 160, + 2, 250, 39, 51, 7, 6, 1, 160, 2, 216, 90, 51, 7, 4, 1, 160, 2, 216, 90, + 51, 7, 6, 1, 160, 2, 250, 192, 22, 251, 154, 7, 4, 1, 160, 2, 250, 192, + 22, 251, 154, 7, 6, 1, 245, 15, 2, 59, 48, 7, 4, 1, 245, 15, 2, 59, 48, + 7, 6, 1, 243, 210, 2, 231, 237, 7, 4, 1, 243, 210, 2, 231, 237, 7, 6, 1, + 242, 68, 2, 59, 48, 7, 4, 1, 242, 68, 2, 59, 48, 7, 6, 1, 242, 68, 2, 59, + 51, 7, 4, 1, 242, 68, 2, 59, 51, 7, 6, 1, 242, 68, 2, 248, 9, 7, 4, 1, + 242, 68, 2, 248, 9, 7, 6, 1, 242, 68, 2, 250, 191, 7, 4, 1, 242, 68, 2, + 250, 191, 7, 6, 1, 242, 68, 2, 251, 155, 51, 7, 4, 1, 242, 68, 2, 251, + 155, 51, 7, 6, 1, 240, 161, 2, 216, 90, 51, 7, 4, 1, 240, 161, 2, 216, + 90, 51, 7, 6, 1, 240, 161, 2, 248, 10, 22, 142, 7, 4, 1, 240, 161, 2, + 248, 10, 22, 142, 7, 6, 1, 235, 30, 2, 142, 7, 4, 1, 235, 30, 2, 142, 7, + 6, 1, 235, 30, 2, 59, 51, 7, 4, 1, 235, 30, 2, 59, 51, 7, 6, 1, 235, 30, + 2, 232, 220, 51, 7, 4, 1, 235, 30, 2, 232, 220, 51, 7, 6, 1, 233, 155, 2, + 59, 51, 7, 4, 1, 233, 155, 2, 59, 51, 7, 6, 1, 233, 155, 2, 59, 252, 51, + 22, 231, 237, 7, 4, 1, 233, 155, 2, 59, 252, 51, 22, 231, 237, 7, 6, 1, + 233, 155, 2, 232, 220, 51, 7, 4, 1, 233, 155, 2, 232, 220, 51, 7, 6, 1, + 233, 155, 2, 250, 39, 51, 7, 4, 1, 233, 155, 2, 250, 39, 51, 7, 6, 1, + 232, 55, 2, 142, 7, 4, 1, 232, 55, 2, 142, 7, 6, 1, 232, 55, 2, 59, 48, + 7, 4, 1, 232, 55, 2, 59, 48, 7, 6, 1, 232, 55, 2, 59, 51, 7, 4, 1, 232, + 55, 2, 59, 51, 7, 6, 1, 230, 31, 2, 59, 48, 7, 4, 1, 230, 31, 2, 59, 48, + 7, 6, 1, 230, 31, 2, 59, 51, 7, 4, 1, 230, 31, 2, 59, 51, 7, 6, 1, 230, + 31, 2, 232, 220, 51, 7, 4, 1, 230, 31, 2, 232, 220, 51, 7, 6, 1, 230, 31, + 2, 250, 39, 51, 7, 4, 1, 230, 31, 2, 250, 39, 51, 7, 6, 1, 144, 2, 216, + 90, 22, 142, 7, 4, 1, 144, 2, 216, 90, 22, 142, 7, 6, 1, 144, 2, 216, 90, + 22, 248, 9, 7, 4, 1, 144, 2, 216, 90, 22, 248, 9, 7, 6, 1, 144, 2, 231, + 238, 22, 242, 143, 7, 4, 1, 144, 2, 231, 238, 22, 242, 143, 7, 6, 1, 144, + 2, 231, 238, 22, 142, 7, 4, 1, 144, 2, 231, 238, 22, 142, 7, 6, 1, 226, + 110, 2, 142, 7, 4, 1, 226, 110, 2, 142, 7, 6, 1, 226, 110, 2, 59, 48, 7, + 4, 1, 226, 110, 2, 59, 48, 7, 6, 1, 223, 227, 2, 59, 48, 7, 4, 1, 223, + 227, 2, 59, 48, 7, 6, 1, 223, 227, 2, 59, 51, 7, 4, 1, 223, 227, 2, 59, + 51, 7, 6, 1, 223, 227, 2, 59, 252, 51, 22, 231, 237, 7, 4, 1, 223, 227, + 2, 59, 252, 51, 22, 231, 237, 7, 6, 1, 223, 227, 2, 232, 220, 51, 7, 4, + 1, 223, 227, 2, 232, 220, 51, 7, 6, 1, 222, 94, 2, 59, 48, 7, 4, 1, 222, + 94, 2, 59, 48, 7, 6, 1, 222, 94, 2, 59, 51, 7, 4, 1, 222, 94, 2, 59, 51, + 7, 6, 1, 222, 94, 2, 255, 12, 22, 59, 48, 7, 4, 1, 222, 94, 2, 255, 12, + 22, 59, 48, 7, 6, 1, 222, 94, 2, 250, 243, 22, 59, 48, 7, 4, 1, 222, 94, + 2, 250, 243, 22, 59, 48, 7, 6, 1, 222, 94, 2, 59, 252, 51, 22, 59, 48, 7, + 4, 1, 222, 94, 2, 59, 252, 51, 22, 59, 48, 7, 6, 1, 217, 154, 2, 59, 48, 7, 4, 1, 217, 154, 2, 59, 48, 7, 6, 1, 217, 154, 2, 59, 51, 7, 4, 1, 217, - 154, 2, 59, 51, 7, 6, 1, 217, 154, 2, 232, 215, 51, 7, 4, 1, 217, 154, 2, - 232, 215, 51, 7, 6, 1, 217, 154, 2, 250, 32, 51, 7, 4, 1, 217, 154, 2, - 250, 32, 51, 7, 6, 1, 104, 2, 248, 3, 51, 7, 4, 1, 104, 2, 248, 3, 51, 7, - 6, 1, 104, 2, 216, 90, 51, 7, 4, 1, 104, 2, 216, 90, 51, 7, 6, 1, 104, 2, - 250, 32, 51, 7, 4, 1, 104, 2, 250, 32, 51, 7, 6, 1, 104, 2, 216, 90, 22, - 142, 7, 4, 1, 104, 2, 216, 90, 22, 142, 7, 6, 1, 104, 2, 231, 234, 22, - 248, 2, 7, 4, 1, 104, 2, 231, 234, 22, 248, 2, 7, 6, 1, 214, 106, 2, 183, - 7, 4, 1, 214, 106, 2, 183, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, 214, - 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 137, 7, 4, 1, 212, 99, 2, 242, - 137, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, 212, - 99, 2, 248, 2, 7, 4, 1, 212, 99, 2, 248, 2, 7, 6, 1, 212, 99, 2, 59, 48, - 7, 4, 1, 212, 99, 2, 59, 48, 7, 6, 1, 212, 99, 2, 59, 51, 7, 4, 1, 212, - 99, 2, 59, 51, 7, 6, 1, 211, 179, 2, 59, 48, 7, 4, 1, 211, 179, 2, 59, - 48, 7, 6, 1, 211, 179, 2, 248, 2, 7, 4, 1, 211, 179, 2, 248, 2, 7, 6, 1, - 211, 118, 2, 59, 48, 7, 4, 1, 211, 118, 2, 59, 48, 7, 6, 1, 210, 160, 2, - 250, 31, 7, 4, 1, 210, 160, 2, 250, 31, 7, 6, 1, 210, 160, 2, 59, 51, 7, - 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 215, 51, 7, 4, 1, - 210, 160, 2, 232, 215, 51, 7, 4, 1, 242, 62, 2, 232, 215, 51, 7, 4, 1, - 217, 154, 2, 248, 2, 7, 4, 1, 212, 99, 2, 222, 235, 48, 7, 4, 1, 211, - 118, 2, 222, 235, 48, 7, 4, 1, 115, 2, 44, 163, 222, 234, 7, 4, 1, 199, - 222, 93, 2, 59, 48, 7, 4, 1, 199, 222, 93, 2, 248, 0, 91, 7, 4, 1, 199, - 222, 93, 2, 125, 91, 7, 6, 1, 220, 77, 222, 92, 7, 4, 1, 248, 55, 7, 6, - 1, 115, 2, 59, 51, 7, 4, 1, 115, 2, 59, 51, 7, 6, 1, 115, 2, 241, 53, 48, - 7, 4, 1, 115, 2, 241, 53, 48, 7, 6, 1, 115, 2, 250, 32, 22, 142, 7, 4, 1, - 115, 2, 250, 32, 22, 142, 7, 6, 1, 115, 2, 250, 32, 22, 242, 137, 7, 4, - 1, 115, 2, 250, 32, 22, 242, 137, 7, 6, 1, 115, 2, 250, 32, 22, 241, 53, - 48, 7, 4, 1, 115, 2, 250, 32, 22, 241, 53, 48, 7, 6, 1, 115, 2, 250, 32, - 22, 183, 7, 4, 1, 115, 2, 250, 32, 22, 183, 7, 6, 1, 115, 2, 250, 32, 22, - 59, 51, 7, 4, 1, 115, 2, 250, 32, 22, 59, 51, 7, 6, 1, 115, 2, 251, 148, - 22, 142, 7, 4, 1, 115, 2, 251, 148, 22, 142, 7, 6, 1, 115, 2, 251, 148, - 22, 242, 137, 7, 4, 1, 115, 2, 251, 148, 22, 242, 137, 7, 6, 1, 115, 2, - 251, 148, 22, 241, 53, 48, 7, 4, 1, 115, 2, 251, 148, 22, 241, 53, 48, 7, - 6, 1, 115, 2, 251, 148, 22, 183, 7, 4, 1, 115, 2, 251, 148, 22, 183, 7, - 6, 1, 115, 2, 251, 148, 22, 59, 51, 7, 4, 1, 115, 2, 251, 148, 22, 59, + 154, 2, 59, 51, 7, 6, 1, 217, 154, 2, 232, 220, 51, 7, 4, 1, 217, 154, 2, + 232, 220, 51, 7, 6, 1, 217, 154, 2, 250, 39, 51, 7, 4, 1, 217, 154, 2, + 250, 39, 51, 7, 6, 1, 104, 2, 248, 10, 51, 7, 4, 1, 104, 2, 248, 10, 51, + 7, 6, 1, 104, 2, 216, 90, 51, 7, 4, 1, 104, 2, 216, 90, 51, 7, 6, 1, 104, + 2, 250, 39, 51, 7, 4, 1, 104, 2, 250, 39, 51, 7, 6, 1, 104, 2, 216, 90, + 22, 142, 7, 4, 1, 104, 2, 216, 90, 22, 142, 7, 6, 1, 104, 2, 231, 238, + 22, 248, 9, 7, 4, 1, 104, 2, 231, 238, 22, 248, 9, 7, 6, 1, 214, 106, 2, + 184, 7, 4, 1, 214, 106, 2, 184, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, + 214, 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 143, 7, 4, 1, 212, 99, 2, + 242, 143, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, + 212, 99, 2, 248, 9, 7, 4, 1, 212, 99, 2, 248, 9, 7, 6, 1, 212, 99, 2, 59, + 48, 7, 4, 1, 212, 99, 2, 59, 48, 7, 6, 1, 212, 99, 2, 59, 51, 7, 4, 1, + 212, 99, 2, 59, 51, 7, 6, 1, 211, 179, 2, 59, 48, 7, 4, 1, 211, 179, 2, + 59, 48, 7, 6, 1, 211, 179, 2, 248, 9, 7, 4, 1, 211, 179, 2, 248, 9, 7, 6, + 1, 211, 118, 2, 59, 48, 7, 4, 1, 211, 118, 2, 59, 48, 7, 6, 1, 210, 160, + 2, 250, 38, 7, 4, 1, 210, 160, 2, 250, 38, 7, 6, 1, 210, 160, 2, 59, 51, + 7, 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 220, 51, 7, 4, + 1, 210, 160, 2, 232, 220, 51, 7, 4, 1, 242, 68, 2, 232, 220, 51, 7, 4, 1, + 217, 154, 2, 248, 9, 7, 4, 1, 212, 99, 2, 222, 237, 48, 7, 4, 1, 211, + 118, 2, 222, 237, 48, 7, 4, 1, 116, 2, 44, 163, 222, 236, 7, 4, 1, 200, + 222, 94, 2, 59, 48, 7, 4, 1, 200, 222, 94, 2, 248, 7, 91, 7, 4, 1, 200, + 222, 94, 2, 125, 91, 7, 6, 1, 220, 78, 222, 93, 7, 4, 1, 248, 62, 7, 6, + 1, 116, 2, 59, 51, 7, 4, 1, 116, 2, 59, 51, 7, 6, 1, 116, 2, 241, 59, 48, + 7, 4, 1, 116, 2, 241, 59, 48, 7, 6, 1, 116, 2, 250, 39, 22, 142, 7, 4, 1, + 116, 2, 250, 39, 22, 142, 7, 6, 1, 116, 2, 250, 39, 22, 242, 143, 7, 4, + 1, 116, 2, 250, 39, 22, 242, 143, 7, 6, 1, 116, 2, 250, 39, 22, 241, 59, + 48, 7, 4, 1, 116, 2, 250, 39, 22, 241, 59, 48, 7, 6, 1, 116, 2, 250, 39, + 22, 184, 7, 4, 1, 116, 2, 250, 39, 22, 184, 7, 6, 1, 116, 2, 250, 39, 22, + 59, 51, 7, 4, 1, 116, 2, 250, 39, 22, 59, 51, 7, 6, 1, 116, 2, 251, 155, + 22, 142, 7, 4, 1, 116, 2, 251, 155, 22, 142, 7, 6, 1, 116, 2, 251, 155, + 22, 242, 143, 7, 4, 1, 116, 2, 251, 155, 22, 242, 143, 7, 6, 1, 116, 2, + 251, 155, 22, 241, 59, 48, 7, 4, 1, 116, 2, 251, 155, 22, 241, 59, 48, 7, + 6, 1, 116, 2, 251, 155, 22, 184, 7, 4, 1, 116, 2, 251, 155, 22, 184, 7, + 6, 1, 116, 2, 251, 155, 22, 59, 51, 7, 4, 1, 116, 2, 251, 155, 22, 59, 51, 7, 6, 1, 160, 2, 59, 51, 7, 4, 1, 160, 2, 59, 51, 7, 6, 1, 160, 2, - 241, 53, 48, 7, 4, 1, 160, 2, 241, 53, 48, 7, 6, 1, 160, 2, 183, 7, 4, 1, - 160, 2, 183, 7, 6, 1, 160, 2, 250, 32, 22, 142, 7, 4, 1, 160, 2, 250, 32, - 22, 142, 7, 6, 1, 160, 2, 250, 32, 22, 242, 137, 7, 4, 1, 160, 2, 250, - 32, 22, 242, 137, 7, 6, 1, 160, 2, 250, 32, 22, 241, 53, 48, 7, 4, 1, - 160, 2, 250, 32, 22, 241, 53, 48, 7, 6, 1, 160, 2, 250, 32, 22, 183, 7, - 4, 1, 160, 2, 250, 32, 22, 183, 7, 6, 1, 160, 2, 250, 32, 22, 59, 51, 7, - 4, 1, 160, 2, 250, 32, 22, 59, 51, 7, 6, 1, 240, 155, 2, 241, 53, 48, 7, - 4, 1, 240, 155, 2, 241, 53, 48, 7, 6, 1, 240, 155, 2, 59, 51, 7, 4, 1, - 240, 155, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7, - 6, 1, 144, 2, 241, 53, 48, 7, 4, 1, 144, 2, 241, 53, 48, 7, 6, 1, 144, 2, - 250, 32, 22, 142, 7, 4, 1, 144, 2, 250, 32, 22, 142, 7, 6, 1, 144, 2, - 250, 32, 22, 242, 137, 7, 4, 1, 144, 2, 250, 32, 22, 242, 137, 7, 6, 1, - 144, 2, 250, 32, 22, 241, 53, 48, 7, 4, 1, 144, 2, 250, 32, 22, 241, 53, - 48, 7, 6, 1, 144, 2, 250, 32, 22, 183, 7, 4, 1, 144, 2, 250, 32, 22, 183, - 7, 6, 1, 144, 2, 250, 32, 22, 59, 51, 7, 4, 1, 144, 2, 250, 32, 22, 59, - 51, 7, 6, 1, 144, 2, 240, 250, 22, 142, 7, 4, 1, 144, 2, 240, 250, 22, - 142, 7, 6, 1, 144, 2, 240, 250, 22, 242, 137, 7, 4, 1, 144, 2, 240, 250, - 22, 242, 137, 7, 6, 1, 144, 2, 240, 250, 22, 241, 53, 48, 7, 4, 1, 144, - 2, 240, 250, 22, 241, 53, 48, 7, 6, 1, 144, 2, 240, 250, 22, 183, 7, 4, - 1, 144, 2, 240, 250, 22, 183, 7, 6, 1, 144, 2, 240, 250, 22, 59, 51, 7, - 4, 1, 144, 2, 240, 250, 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1, - 104, 2, 59, 51, 7, 6, 1, 104, 2, 241, 53, 48, 7, 4, 1, 104, 2, 241, 53, - 48, 7, 6, 1, 104, 2, 240, 250, 22, 142, 7, 4, 1, 104, 2, 240, 250, 22, - 142, 7, 6, 1, 104, 2, 240, 250, 22, 242, 137, 7, 4, 1, 104, 2, 240, 250, - 22, 242, 137, 7, 6, 1, 104, 2, 240, 250, 22, 241, 53, 48, 7, 4, 1, 104, - 2, 240, 250, 22, 241, 53, 48, 7, 6, 1, 104, 2, 240, 250, 22, 183, 7, 4, - 1, 104, 2, 240, 250, 22, 183, 7, 6, 1, 104, 2, 240, 250, 22, 59, 51, 7, - 4, 1, 104, 2, 240, 250, 22, 59, 51, 7, 6, 1, 211, 118, 2, 242, 137, 7, 4, - 1, 211, 118, 2, 242, 137, 7, 6, 1, 211, 118, 2, 59, 51, 7, 4, 1, 211, - 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 53, 48, 7, 4, 1, 211, 118, 2, - 241, 53, 48, 7, 6, 1, 211, 118, 2, 183, 7, 4, 1, 211, 118, 2, 183, 7, 6, - 1, 230, 224, 232, 186, 7, 4, 1, 230, 224, 232, 186, 7, 6, 1, 230, 224, - 214, 105, 7, 4, 1, 230, 224, 214, 105, 7, 6, 1, 211, 118, 2, 232, 124, 7, - 4, 1, 211, 118, 2, 232, 124, 26, 4, 1, 254, 145, 2, 224, 155, 26, 4, 1, - 254, 145, 2, 248, 154, 26, 4, 1, 254, 145, 2, 224, 156, 22, 214, 13, 26, - 4, 1, 254, 145, 2, 248, 155, 22, 214, 13, 26, 4, 1, 254, 145, 2, 224, - 156, 22, 226, 111, 26, 4, 1, 254, 145, 2, 248, 155, 22, 226, 111, 26, 4, - 1, 254, 145, 2, 224, 156, 22, 225, 176, 26, 4, 1, 254, 145, 2, 248, 155, - 22, 225, 176, 26, 6, 1, 254, 145, 2, 224, 155, 26, 6, 1, 254, 145, 2, - 248, 154, 26, 6, 1, 254, 145, 2, 224, 156, 22, 214, 13, 26, 6, 1, 254, - 145, 2, 248, 155, 22, 214, 13, 26, 6, 1, 254, 145, 2, 224, 156, 22, 226, - 111, 26, 6, 1, 254, 145, 2, 248, 155, 22, 226, 111, 26, 6, 1, 254, 145, - 2, 224, 156, 22, 225, 176, 26, 6, 1, 254, 145, 2, 248, 155, 22, 225, 176, - 26, 4, 1, 245, 102, 2, 224, 155, 26, 4, 1, 245, 102, 2, 248, 154, 26, 4, - 1, 245, 102, 2, 224, 156, 22, 214, 13, 26, 4, 1, 245, 102, 2, 248, 155, - 22, 214, 13, 26, 4, 1, 245, 102, 2, 224, 156, 22, 226, 111, 26, 4, 1, - 245, 102, 2, 248, 155, 22, 226, 111, 26, 6, 1, 245, 102, 2, 224, 155, 26, - 6, 1, 245, 102, 2, 248, 154, 26, 6, 1, 245, 102, 2, 224, 156, 22, 214, - 13, 26, 6, 1, 245, 102, 2, 248, 155, 22, 214, 13, 26, 6, 1, 245, 102, 2, - 224, 156, 22, 226, 111, 26, 6, 1, 245, 102, 2, 248, 155, 22, 226, 111, - 26, 4, 1, 245, 65, 2, 224, 155, 26, 4, 1, 245, 65, 2, 248, 154, 26, 4, 1, - 245, 65, 2, 224, 156, 22, 214, 13, 26, 4, 1, 245, 65, 2, 248, 155, 22, - 214, 13, 26, 4, 1, 245, 65, 2, 224, 156, 22, 226, 111, 26, 4, 1, 245, 65, - 2, 248, 155, 22, 226, 111, 26, 4, 1, 245, 65, 2, 224, 156, 22, 225, 176, - 26, 4, 1, 245, 65, 2, 248, 155, 22, 225, 176, 26, 6, 1, 245, 65, 2, 224, - 155, 26, 6, 1, 245, 65, 2, 248, 154, 26, 6, 1, 245, 65, 2, 224, 156, 22, - 214, 13, 26, 6, 1, 245, 65, 2, 248, 155, 22, 214, 13, 26, 6, 1, 245, 65, - 2, 224, 156, 22, 226, 111, 26, 6, 1, 245, 65, 2, 248, 155, 22, 226, 111, - 26, 6, 1, 245, 65, 2, 224, 156, 22, 225, 176, 26, 6, 1, 245, 65, 2, 248, - 155, 22, 225, 176, 26, 4, 1, 235, 187, 2, 224, 155, 26, 4, 1, 235, 187, - 2, 248, 154, 26, 4, 1, 235, 187, 2, 224, 156, 22, 214, 13, 26, 4, 1, 235, - 187, 2, 248, 155, 22, 214, 13, 26, 4, 1, 235, 187, 2, 224, 156, 22, 226, - 111, 26, 4, 1, 235, 187, 2, 248, 155, 22, 226, 111, 26, 4, 1, 235, 187, - 2, 224, 156, 22, 225, 176, 26, 4, 1, 235, 187, 2, 248, 155, 22, 225, 176, - 26, 6, 1, 235, 187, 2, 224, 155, 26, 6, 1, 235, 187, 2, 248, 154, 26, 6, - 1, 235, 187, 2, 224, 156, 22, 214, 13, 26, 6, 1, 235, 187, 2, 248, 155, - 22, 214, 13, 26, 6, 1, 235, 187, 2, 224, 156, 22, 226, 111, 26, 6, 1, - 235, 187, 2, 248, 155, 22, 226, 111, 26, 6, 1, 235, 187, 2, 224, 156, 22, - 225, 176, 26, 6, 1, 235, 187, 2, 248, 155, 22, 225, 176, 26, 4, 1, 226, - 201, 2, 224, 155, 26, 4, 1, 226, 201, 2, 248, 154, 26, 4, 1, 226, 201, 2, - 224, 156, 22, 214, 13, 26, 4, 1, 226, 201, 2, 248, 155, 22, 214, 13, 26, - 4, 1, 226, 201, 2, 224, 156, 22, 226, 111, 26, 4, 1, 226, 201, 2, 248, - 155, 22, 226, 111, 26, 6, 1, 226, 201, 2, 224, 155, 26, 6, 1, 226, 201, - 2, 248, 154, 26, 6, 1, 226, 201, 2, 224, 156, 22, 214, 13, 26, 6, 1, 226, - 201, 2, 248, 155, 22, 214, 13, 26, 6, 1, 226, 201, 2, 224, 156, 22, 226, - 111, 26, 6, 1, 226, 201, 2, 248, 155, 22, 226, 111, 26, 4, 1, 214, 158, - 2, 224, 155, 26, 4, 1, 214, 158, 2, 248, 154, 26, 4, 1, 214, 158, 2, 224, - 156, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 155, 22, 214, 13, 26, 4, 1, - 214, 158, 2, 224, 156, 22, 226, 111, 26, 4, 1, 214, 158, 2, 248, 155, 22, - 226, 111, 26, 4, 1, 214, 158, 2, 224, 156, 22, 225, 176, 26, 4, 1, 214, - 158, 2, 248, 155, 22, 225, 176, 26, 6, 1, 214, 158, 2, 248, 154, 26, 6, - 1, 214, 158, 2, 248, 155, 22, 214, 13, 26, 6, 1, 214, 158, 2, 248, 155, - 22, 226, 111, 26, 6, 1, 214, 158, 2, 248, 155, 22, 225, 176, 26, 4, 1, - 226, 203, 2, 224, 155, 26, 4, 1, 226, 203, 2, 248, 154, 26, 4, 1, 226, - 203, 2, 224, 156, 22, 214, 13, 26, 4, 1, 226, 203, 2, 248, 155, 22, 214, - 13, 26, 4, 1, 226, 203, 2, 224, 156, 22, 226, 111, 26, 4, 1, 226, 203, 2, - 248, 155, 22, 226, 111, 26, 4, 1, 226, 203, 2, 224, 156, 22, 225, 176, - 26, 4, 1, 226, 203, 2, 248, 155, 22, 225, 176, 26, 6, 1, 226, 203, 2, - 224, 155, 26, 6, 1, 226, 203, 2, 248, 154, 26, 6, 1, 226, 203, 2, 224, - 156, 22, 214, 13, 26, 6, 1, 226, 203, 2, 248, 155, 22, 214, 13, 26, 6, 1, - 226, 203, 2, 224, 156, 22, 226, 111, 26, 6, 1, 226, 203, 2, 248, 155, 22, - 226, 111, 26, 6, 1, 226, 203, 2, 224, 156, 22, 225, 176, 26, 6, 1, 226, - 203, 2, 248, 155, 22, 225, 176, 26, 4, 1, 254, 145, 2, 214, 13, 26, 4, 1, - 254, 145, 2, 226, 111, 26, 4, 1, 245, 102, 2, 214, 13, 26, 4, 1, 245, - 102, 2, 226, 111, 26, 4, 1, 245, 65, 2, 214, 13, 26, 4, 1, 245, 65, 2, - 226, 111, 26, 4, 1, 235, 187, 2, 214, 13, 26, 4, 1, 235, 187, 2, 226, - 111, 26, 4, 1, 226, 201, 2, 214, 13, 26, 4, 1, 226, 201, 2, 226, 111, 26, - 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, 158, 2, 226, 111, 26, 4, 1, - 226, 203, 2, 214, 13, 26, 4, 1, 226, 203, 2, 226, 111, 26, 4, 1, 254, - 145, 2, 224, 156, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155, 22, 210, - 219, 26, 4, 1, 254, 145, 2, 224, 156, 22, 214, 14, 22, 210, 219, 26, 4, - 1, 254, 145, 2, 248, 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 254, 145, - 2, 224, 156, 22, 226, 112, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155, - 22, 226, 112, 22, 210, 219, 26, 4, 1, 254, 145, 2, 224, 156, 22, 225, - 177, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155, 22, 225, 177, 22, - 210, 219, 26, 6, 1, 254, 145, 2, 224, 156, 22, 224, 168, 26, 6, 1, 254, - 145, 2, 248, 155, 22, 224, 168, 26, 6, 1, 254, 145, 2, 224, 156, 22, 214, - 14, 22, 224, 168, 26, 6, 1, 254, 145, 2, 248, 155, 22, 214, 14, 22, 224, - 168, 26, 6, 1, 254, 145, 2, 224, 156, 22, 226, 112, 22, 224, 168, 26, 6, - 1, 254, 145, 2, 248, 155, 22, 226, 112, 22, 224, 168, 26, 6, 1, 254, 145, - 2, 224, 156, 22, 225, 177, 22, 224, 168, 26, 6, 1, 254, 145, 2, 248, 155, - 22, 225, 177, 22, 224, 168, 26, 4, 1, 245, 65, 2, 224, 156, 22, 210, 219, - 26, 4, 1, 245, 65, 2, 248, 155, 22, 210, 219, 26, 4, 1, 245, 65, 2, 224, - 156, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 248, 155, 22, 214, - 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 224, 156, 22, 226, 112, 22, 210, - 219, 26, 4, 1, 245, 65, 2, 248, 155, 22, 226, 112, 22, 210, 219, 26, 4, - 1, 245, 65, 2, 224, 156, 22, 225, 177, 22, 210, 219, 26, 4, 1, 245, 65, - 2, 248, 155, 22, 225, 177, 22, 210, 219, 26, 6, 1, 245, 65, 2, 224, 156, - 22, 224, 168, 26, 6, 1, 245, 65, 2, 248, 155, 22, 224, 168, 26, 6, 1, - 245, 65, 2, 224, 156, 22, 214, 14, 22, 224, 168, 26, 6, 1, 245, 65, 2, - 248, 155, 22, 214, 14, 22, 224, 168, 26, 6, 1, 245, 65, 2, 224, 156, 22, - 226, 112, 22, 224, 168, 26, 6, 1, 245, 65, 2, 248, 155, 22, 226, 112, 22, - 224, 168, 26, 6, 1, 245, 65, 2, 224, 156, 22, 225, 177, 22, 224, 168, 26, - 6, 1, 245, 65, 2, 248, 155, 22, 225, 177, 22, 224, 168, 26, 4, 1, 226, - 203, 2, 224, 156, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155, 22, 210, - 219, 26, 4, 1, 226, 203, 2, 224, 156, 22, 214, 14, 22, 210, 219, 26, 4, - 1, 226, 203, 2, 248, 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 226, 203, - 2, 224, 156, 22, 226, 112, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155, - 22, 226, 112, 22, 210, 219, 26, 4, 1, 226, 203, 2, 224, 156, 22, 225, - 177, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155, 22, 225, 177, 22, - 210, 219, 26, 6, 1, 226, 203, 2, 224, 156, 22, 224, 168, 26, 6, 1, 226, - 203, 2, 248, 155, 22, 224, 168, 26, 6, 1, 226, 203, 2, 224, 156, 22, 214, - 14, 22, 224, 168, 26, 6, 1, 226, 203, 2, 248, 155, 22, 214, 14, 22, 224, - 168, 26, 6, 1, 226, 203, 2, 224, 156, 22, 226, 112, 22, 224, 168, 26, 6, - 1, 226, 203, 2, 248, 155, 22, 226, 112, 22, 224, 168, 26, 6, 1, 226, 203, - 2, 224, 156, 22, 225, 177, 22, 224, 168, 26, 6, 1, 226, 203, 2, 248, 155, - 22, 225, 177, 22, 224, 168, 26, 4, 1, 254, 145, 2, 213, 120, 26, 4, 1, - 254, 145, 2, 231, 233, 26, 4, 1, 254, 145, 2, 214, 14, 22, 210, 219, 26, - 4, 1, 254, 145, 2, 210, 219, 26, 4, 1, 254, 145, 2, 226, 112, 22, 210, - 219, 26, 4, 1, 254, 145, 2, 225, 176, 26, 4, 1, 254, 145, 2, 225, 177, - 22, 210, 219, 26, 6, 1, 254, 145, 2, 213, 120, 26, 6, 1, 254, 145, 2, - 231, 233, 26, 6, 1, 254, 145, 2, 214, 13, 26, 6, 1, 254, 145, 2, 226, - 111, 26, 6, 1, 254, 145, 2, 224, 168, 26, 234, 3, 26, 224, 168, 26, 224, - 155, 26, 225, 176, 26, 247, 253, 22, 225, 176, 26, 4, 1, 245, 65, 2, 214, - 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 210, 219, 26, 4, 1, 245, 65, 2, - 226, 112, 22, 210, 219, 26, 4, 1, 245, 65, 2, 225, 176, 26, 4, 1, 245, - 65, 2, 225, 177, 22, 210, 219, 26, 6, 1, 245, 102, 2, 214, 13, 26, 6, 1, - 245, 102, 2, 226, 111, 26, 6, 1, 245, 65, 2, 214, 13, 26, 6, 1, 245, 65, - 2, 226, 111, 26, 6, 1, 245, 65, 2, 224, 168, 26, 224, 156, 22, 214, 13, - 26, 224, 156, 22, 226, 111, 26, 224, 156, 22, 225, 176, 26, 4, 1, 235, - 187, 2, 213, 120, 26, 4, 1, 235, 187, 2, 231, 233, 26, 4, 1, 235, 187, 2, - 247, 253, 22, 214, 13, 26, 4, 1, 235, 187, 2, 247, 253, 22, 226, 111, 26, - 4, 1, 235, 187, 2, 225, 176, 26, 4, 1, 235, 187, 2, 247, 253, 22, 225, - 176, 26, 6, 1, 235, 187, 2, 213, 120, 26, 6, 1, 235, 187, 2, 231, 233, - 26, 6, 1, 235, 187, 2, 214, 13, 26, 6, 1, 235, 187, 2, 226, 111, 26, 248, - 155, 22, 214, 13, 26, 248, 155, 22, 226, 111, 26, 248, 155, 22, 225, 176, - 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 233, 26, 4, - 1, 214, 158, 2, 247, 253, 22, 214, 13, 26, 4, 1, 214, 158, 2, 247, 253, - 22, 226, 111, 26, 4, 1, 223, 39, 2, 224, 155, 26, 4, 1, 223, 39, 2, 248, - 154, 26, 4, 1, 214, 158, 2, 225, 176, 26, 4, 1, 214, 158, 2, 247, 253, - 22, 225, 176, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2, - 231, 233, 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226, - 111, 26, 6, 1, 223, 39, 2, 248, 154, 26, 247, 253, 22, 214, 13, 26, 247, - 253, 22, 226, 111, 26, 214, 13, 26, 4, 1, 226, 203, 2, 214, 14, 22, 210, - 219, 26, 4, 1, 226, 203, 2, 210, 219, 26, 4, 1, 226, 203, 2, 226, 112, - 22, 210, 219, 26, 4, 1, 226, 203, 2, 225, 176, 26, 4, 1, 226, 203, 2, - 225, 177, 22, 210, 219, 26, 6, 1, 226, 201, 2, 214, 13, 26, 6, 1, 226, - 201, 2, 226, 111, 26, 6, 1, 226, 203, 2, 214, 13, 26, 6, 1, 226, 203, 2, - 226, 111, 26, 6, 1, 226, 203, 2, 224, 168, 26, 226, 111, 26, 248, 154, - 245, 152, 224, 28, 245, 161, 224, 28, 245, 152, 219, 19, 245, 161, 219, - 19, 216, 142, 219, 19, 244, 10, 219, 19, 219, 124, 219, 19, 244, 113, - 219, 19, 224, 142, 219, 19, 216, 171, 219, 19, 242, 36, 219, 19, 210, 87, - 211, 245, 219, 19, 210, 87, 211, 245, 228, 68, 210, 87, 211, 245, 235, - 64, 233, 39, 78, 222, 244, 78, 240, 169, 228, 69, 240, 169, 244, 113, - 248, 157, 245, 152, 248, 157, 245, 161, 248, 157, 203, 130, 52, 67, 232, - 214, 52, 121, 232, 214, 43, 219, 156, 223, 255, 78, 44, 219, 156, 223, - 255, 78, 219, 156, 232, 110, 223, 255, 78, 219, 156, 241, 164, 223, 255, - 78, 43, 52, 223, 255, 78, 44, 52, 223, 255, 78, 52, 232, 110, 223, 255, - 78, 52, 241, 164, 223, 255, 78, 248, 206, 52, 248, 206, 251, 114, 215, - 223, 251, 114, 123, 59, 233, 57, 113, 59, 233, 57, 203, 245, 164, 240, - 167, 225, 11, 232, 215, 220, 138, 226, 16, 220, 138, 233, 39, 245, 159, - 222, 244, 245, 159, 224, 247, 247, 197, 244, 20, 233, 39, 226, 118, 222, - 244, 226, 118, 229, 195, 228, 74, 219, 19, 225, 184, 230, 194, 50, 225, - 184, 216, 249, 216, 149, 50, 224, 191, 52, 224, 191, 215, 212, 224, 191, - 223, 50, 224, 191, 223, 50, 52, 224, 191, 223, 50, 215, 212, 224, 191, - 250, 239, 219, 156, 233, 43, 254, 111, 223, 255, 78, 219, 156, 222, 248, - 254, 111, 223, 255, 78, 223, 108, 78, 52, 245, 32, 78, 235, 202, 226, - 120, 214, 180, 135, 216, 112, 250, 240, 235, 217, 225, 11, 253, 215, 240, - 170, 251, 114, 244, 3, 219, 96, 43, 42, 251, 159, 2, 224, 8, 44, 42, 251, - 159, 2, 224, 8, 52, 224, 14, 78, 224, 14, 245, 32, 78, 245, 32, 224, 14, - 78, 216, 71, 5, 245, 66, 223, 50, 225, 69, 50, 85, 140, 251, 114, 85, 97, - 251, 114, 121, 253, 217, 223, 50, 220, 151, 250, 2, 214, 163, 113, 253, - 216, 254, 159, 213, 188, 249, 218, 230, 183, 50, 217, 235, 248, 157, 235, - 194, 214, 180, 244, 53, 224, 142, 78, 134, 59, 224, 141, 224, 25, 224, - 191, 244, 12, 59, 224, 141, 244, 82, 59, 224, 141, 113, 59, 224, 141, - 244, 12, 59, 78, 246, 119, 249, 131, 215, 222, 67, 244, 12, 247, 119, - 231, 83, 11, 219, 19, 211, 209, 235, 64, 243, 228, 254, 53, 235, 192, - 216, 86, 235, 192, 220, 138, 235, 192, 225, 23, 235, 229, 217, 183, 217, - 252, 255, 6, 217, 183, 217, 252, 235, 229, 10, 244, 21, 220, 81, 255, 6, - 10, 244, 21, 220, 81, 229, 190, 21, 220, 82, 228, 70, 21, 220, 82, 218, - 24, 210, 86, 218, 24, 7, 4, 1, 73, 218, 24, 161, 218, 24, 189, 218, 24, - 194, 218, 24, 198, 218, 24, 195, 218, 24, 200, 218, 24, 96, 50, 218, 24, - 230, 182, 218, 24, 245, 99, 50, 218, 24, 43, 226, 4, 218, 24, 44, 226, 4, - 218, 24, 7, 4, 1, 230, 26, 218, 66, 210, 86, 218, 66, 110, 218, 66, 105, - 218, 66, 158, 218, 66, 161, 218, 66, 189, 218, 66, 194, 218, 66, 198, - 218, 66, 195, 218, 66, 200, 218, 66, 96, 50, 218, 66, 230, 182, 218, 66, - 245, 99, 50, 218, 66, 43, 226, 4, 218, 66, 44, 226, 4, 7, 218, 66, 4, 1, - 61, 7, 218, 66, 4, 1, 75, 7, 218, 66, 4, 1, 76, 7, 218, 66, 4, 1, 211, - 178, 7, 218, 66, 4, 1, 221, 196, 7, 218, 66, 4, 1, 242, 61, 7, 218, 66, - 4, 1, 235, 24, 7, 218, 66, 4, 1, 156, 7, 218, 66, 4, 1, 193, 7, 218, 66, - 4, 1, 230, 26, 7, 218, 66, 4, 1, 226, 106, 7, 218, 66, 4, 1, 222, 92, 7, - 218, 66, 4, 1, 217, 153, 245, 47, 50, 249, 228, 50, 249, 118, 50, 243, - 252, 243, 255, 50, 232, 199, 50, 230, 195, 50, 229, 211, 50, 225, 163, - 50, 222, 119, 50, 211, 217, 50, 166, 220, 50, 50, 247, 128, 50, 245, 48, - 50, 234, 77, 50, 215, 113, 50, 246, 102, 50, 243, 41, 225, 194, 50, 225, - 161, 50, 242, 110, 50, 253, 183, 50, 240, 229, 50, 250, 186, 50, 232, - 192, 216, 4, 50, 219, 1, 50, 216, 246, 50, 235, 242, 222, 119, 50, 215, - 97, 232, 199, 50, 38, 43, 242, 0, 48, 38, 44, 242, 0, 48, 38, 199, 67, - 232, 215, 226, 121, 38, 219, 252, 67, 232, 215, 226, 121, 38, 254, 89, - 80, 48, 38, 250, 3, 80, 48, 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 235, - 226, 121, 38, 250, 3, 222, 235, 226, 121, 38, 254, 89, 222, 235, 226, - 121, 38, 134, 170, 48, 38, 244, 12, 170, 48, 38, 245, 147, 250, 36, 38, - 245, 147, 218, 235, 38, 245, 147, 247, 249, 38, 245, 147, 250, 37, 252, - 181, 38, 43, 44, 80, 48, 38, 245, 147, 221, 189, 38, 245, 147, 234, 136, - 38, 245, 147, 214, 155, 225, 8, 215, 226, 38, 223, 51, 219, 48, 226, 121, - 38, 52, 67, 218, 104, 226, 121, 38, 254, 99, 87, 38, 215, 212, 214, 182, - 38, 211, 247, 251, 141, 48, 38, 140, 80, 226, 121, 38, 199, 52, 219, 48, - 226, 121, 38, 97, 242, 0, 2, 252, 140, 246, 104, 38, 140, 242, 0, 2, 252, - 140, 246, 104, 38, 43, 80, 51, 38, 44, 80, 51, 38, 253, 218, 48, 255, 12, - 226, 232, 254, 252, 216, 43, 216, 197, 218, 75, 139, 6, 251, 67, 248, 72, - 250, 179, 250, 176, 232, 215, 87, 250, 241, 226, 232, 251, 27, 214, 189, - 245, 49, 249, 192, 221, 186, 248, 72, 244, 180, 119, 4, 243, 203, 119, 6, - 242, 61, 251, 220, 6, 242, 61, 139, 6, 242, 61, 225, 38, 249, 192, 225, - 38, 249, 193, 117, 113, 225, 109, 119, 6, 73, 251, 220, 6, 73, 119, 6, - 156, 119, 4, 156, 233, 150, 57, 252, 142, 87, 139, 6, 230, 26, 227, 197, - 50, 219, 32, 223, 120, 249, 163, 119, 6, 226, 106, 139, 6, 226, 106, 139, - 6, 224, 97, 119, 6, 153, 251, 220, 6, 153, 139, 6, 153, 224, 197, 217, - 72, 223, 63, 220, 133, 78, 217, 2, 50, 215, 254, 164, 50, 213, 240, 139, - 6, 210, 159, 226, 134, 50, 226, 222, 50, 235, 194, 226, 222, 50, 251, - 220, 6, 210, 159, 215, 94, 26, 4, 1, 235, 186, 234, 174, 50, 254, 108, - 50, 119, 6, 253, 159, 251, 220, 6, 251, 67, 245, 69, 87, 119, 4, 75, 119, - 6, 75, 119, 6, 245, 7, 215, 94, 6, 245, 7, 119, 6, 193, 119, 4, 76, 112, - 87, 252, 30, 87, 242, 203, 87, 248, 191, 87, 235, 233, 219, 30, 222, 188, - 6, 224, 97, 244, 183, 50, 139, 4, 225, 109, 139, 4, 243, 108, 139, 6, - 243, 108, 139, 6, 225, 109, 139, 230, 25, 218, 41, 215, 94, 35, 6, 243, - 203, 215, 94, 35, 6, 156, 223, 50, 35, 6, 156, 215, 94, 35, 6, 211, 117, - 139, 32, 6, 249, 61, 139, 32, 4, 249, 61, 139, 32, 4, 75, 139, 32, 4, 73, - 139, 32, 4, 235, 145, 224, 171, 232, 214, 215, 94, 254, 127, 225, 184, - 50, 254, 181, 215, 94, 4, 245, 7, 16, 31, 221, 253, 219, 30, 212, 114, - 244, 3, 123, 220, 119, 212, 114, 244, 3, 123, 228, 195, 212, 114, 244, 3, - 123, 216, 242, 212, 114, 244, 3, 123, 216, 169, 212, 114, 244, 3, 113, - 216, 167, 212, 114, 244, 3, 123, 244, 118, 212, 114, 244, 3, 113, 244, - 117, 212, 114, 244, 3, 134, 244, 117, 212, 114, 244, 3, 244, 12, 244, - 117, 212, 114, 244, 3, 123, 219, 116, 212, 114, 244, 3, 244, 82, 219, - 114, 212, 114, 244, 3, 123, 245, 189, 212, 114, 244, 3, 134, 245, 187, - 212, 114, 244, 3, 244, 82, 245, 187, 212, 114, 244, 3, 220, 123, 245, - 187, 244, 3, 227, 198, 110, 222, 199, 227, 199, 110, 222, 199, 227, 199, - 105, 222, 199, 227, 199, 158, 222, 199, 227, 199, 161, 222, 199, 227, - 199, 189, 222, 199, 227, 199, 194, 222, 199, 227, 199, 198, 222, 199, - 227, 199, 195, 222, 199, 227, 199, 200, 222, 199, 227, 199, 216, 248, - 222, 199, 227, 199, 245, 168, 222, 199, 227, 199, 215, 76, 222, 199, 227, - 199, 244, 115, 222, 199, 227, 199, 123, 240, 211, 222, 199, 227, 199, - 244, 82, 240, 211, 222, 199, 227, 199, 123, 216, 148, 4, 222, 199, 227, - 199, 110, 4, 222, 199, 227, 199, 105, 4, 222, 199, 227, 199, 158, 4, 222, - 199, 227, 199, 161, 4, 222, 199, 227, 199, 189, 4, 222, 199, 227, 199, - 194, 4, 222, 199, 227, 199, 198, 4, 222, 199, 227, 199, 195, 4, 222, 199, - 227, 199, 200, 4, 222, 199, 227, 199, 216, 248, 4, 222, 199, 227, 199, - 245, 168, 4, 222, 199, 227, 199, 215, 76, 4, 222, 199, 227, 199, 244, - 115, 4, 222, 199, 227, 199, 123, 240, 211, 4, 222, 199, 227, 199, 244, - 82, 240, 211, 4, 222, 199, 227, 199, 123, 216, 148, 222, 199, 227, 199, - 123, 216, 149, 251, 68, 249, 61, 222, 199, 227, 199, 244, 82, 216, 148, - 222, 199, 227, 199, 216, 249, 216, 148, 222, 199, 227, 199, 223, 50, 123, - 240, 211, 7, 4, 1, 223, 50, 251, 67, 222, 199, 227, 199, 219, 126, 233, - 79, 17, 222, 199, 227, 199, 244, 116, 245, 227, 17, 222, 199, 227, 199, - 244, 116, 216, 148, 222, 199, 227, 199, 123, 240, 212, 216, 148, 212, - 114, 244, 3, 210, 87, 216, 167, 140, 74, 214, 153, 74, 97, 74, 246, 105, - 74, 43, 44, 74, 120, 124, 74, 228, 57, 212, 9, 74, 228, 57, 245, 221, 74, - 219, 29, 245, 221, 74, 219, 29, 212, 9, 74, 140, 80, 2, 91, 97, 80, 2, - 91, 140, 212, 36, 74, 97, 212, 36, 74, 140, 113, 241, 235, 74, 214, 153, - 113, 241, 235, 74, 97, 113, 241, 235, 74, 246, 105, 113, 241, 235, 74, - 140, 80, 2, 217, 78, 97, 80, 2, 217, 78, 140, 80, 243, 244, 130, 214, - 153, 80, 243, 244, 130, 97, 80, 243, 244, 130, 246, 105, 80, 243, 244, - 130, 120, 124, 80, 2, 252, 128, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80, - 2, 232, 124, 97, 80, 2, 232, 124, 43, 44, 212, 36, 74, 43, 44, 80, 2, 91, - 246, 105, 210, 35, 74, 214, 153, 80, 2, 216, 78, 233, 38, 214, 153, 80, - 2, 216, 78, 222, 242, 246, 105, 80, 2, 216, 78, 233, 38, 246, 105, 80, 2, - 216, 78, 222, 242, 97, 80, 2, 249, 162, 246, 104, 246, 105, 80, 2, 249, - 162, 233, 38, 254, 89, 216, 15, 220, 154, 74, 250, 3, 216, 15, 220, 154, - 74, 228, 57, 212, 9, 80, 216, 43, 199, 130, 140, 80, 216, 43, 252, 142, - 117, 97, 80, 216, 43, 130, 254, 89, 204, 250, 37, 74, 250, 3, 204, 250, - 37, 74, 140, 242, 0, 2, 252, 140, 214, 152, 140, 242, 0, 2, 252, 140, - 246, 104, 214, 153, 242, 0, 2, 252, 140, 222, 242, 214, 153, 242, 0, 2, - 252, 140, 233, 38, 97, 242, 0, 2, 252, 140, 214, 152, 97, 242, 0, 2, 252, - 140, 246, 104, 246, 105, 242, 0, 2, 252, 140, 222, 242, 246, 105, 242, 0, - 2, 252, 140, 233, 38, 97, 80, 117, 140, 74, 214, 153, 80, 140, 64, 246, - 105, 74, 140, 80, 117, 97, 74, 140, 226, 71, 253, 248, 214, 153, 226, 71, - 253, 248, 97, 226, 71, 253, 248, 246, 105, 226, 71, 253, 248, 140, 242, - 0, 117, 97, 241, 255, 97, 242, 0, 117, 140, 241, 255, 140, 52, 80, 2, 91, - 43, 44, 52, 80, 2, 91, 97, 52, 80, 2, 91, 140, 52, 74, 214, 153, 52, 74, - 97, 52, 74, 246, 105, 52, 74, 43, 44, 52, 74, 120, 124, 52, 74, 228, 57, - 212, 9, 52, 74, 228, 57, 245, 221, 52, 74, 219, 29, 245, 221, 52, 74, - 219, 29, 212, 9, 52, 74, 140, 215, 212, 74, 97, 215, 212, 74, 140, 218, - 231, 74, 97, 218, 231, 74, 214, 153, 80, 2, 52, 91, 246, 105, 80, 2, 52, - 91, 140, 248, 156, 74, 214, 153, 248, 156, 74, 97, 248, 156, 74, 246, - 105, 248, 156, 74, 140, 80, 216, 43, 130, 97, 80, 216, 43, 130, 140, 71, - 74, 214, 153, 71, 74, 97, 71, 74, 246, 105, 71, 74, 214, 153, 71, 80, - 243, 244, 130, 214, 153, 71, 80, 226, 198, 225, 215, 214, 153, 71, 80, - 226, 198, 225, 216, 2, 203, 130, 214, 153, 71, 80, 226, 198, 225, 216, 2, - 67, 130, 214, 153, 71, 52, 74, 214, 153, 71, 52, 80, 226, 198, 225, 215, - 97, 71, 80, 243, 244, 212, 56, 228, 57, 212, 9, 80, 216, 43, 249, 161, - 219, 29, 245, 221, 80, 216, 43, 249, 161, 120, 124, 71, 74, 44, 80, 2, 4, - 250, 36, 246, 105, 80, 140, 64, 214, 153, 74, 134, 97, 253, 248, 140, 80, - 2, 67, 91, 97, 80, 2, 67, 91, 43, 44, 80, 2, 67, 91, 140, 80, 2, 52, 67, - 91, 97, 80, 2, 52, 67, 91, 43, 44, 80, 2, 52, 67, 91, 140, 226, 174, 74, - 97, 226, 174, 74, 43, 44, 226, 174, 74, 31, 254, 155, 249, 215, 225, 254, - 247, 234, 216, 188, 245, 28, 216, 188, 247, 139, 228, 53, 245, 29, 245, - 153, 220, 128, 235, 246, 229, 222, 245, 171, 226, 232, 228, 53, 254, 125, - 245, 171, 226, 232, 4, 245, 171, 226, 232, 249, 187, 253, 239, 231, 63, - 247, 139, 228, 53, 249, 189, 253, 239, 231, 63, 4, 249, 187, 253, 239, - 231, 63, 245, 144, 64, 224, 173, 230, 25, 224, 181, 230, 25, 249, 166, - 230, 25, 218, 41, 230, 183, 50, 230, 181, 50, 59, 225, 23, 247, 170, 219, - 96, 220, 129, 230, 182, 253, 218, 226, 168, 222, 235, 226, 168, 251, 115, - 226, 168, 42, 222, 194, 249, 110, 222, 194, 244, 5, 222, 194, 224, 169, - 111, 235, 235, 44, 254, 110, 254, 110, 231, 89, 254, 110, 219, 0, 254, - 110, 247, 172, 247, 139, 228, 53, 247, 175, 226, 9, 111, 228, 53, 226, 9, - 111, 232, 147, 254, 119, 232, 147, 226, 159, 235, 199, 214, 175, 235, - 212, 52, 235, 212, 215, 212, 235, 212, 249, 183, 235, 212, 218, 14, 235, - 212, 213, 129, 235, 212, 250, 3, 235, 212, 250, 3, 249, 183, 235, 212, - 254, 89, 249, 183, 235, 212, 216, 187, 252, 68, 223, 138, 224, 170, 59, - 230, 182, 245, 34, 243, 47, 224, 170, 241, 58, 216, 90, 226, 168, 223, - 50, 183, 235, 194, 233, 66, 222, 92, 219, 158, 212, 35, 211, 200, 224, - 181, 228, 53, 183, 230, 183, 183, 253, 211, 128, 111, 228, 53, 253, 211, - 128, 111, 254, 49, 128, 111, 254, 49, 251, 89, 228, 53, 255, 5, 128, 111, - 229, 101, 254, 49, 228, 60, 255, 5, 128, 111, 254, 149, 128, 111, 228, - 53, 254, 149, 128, 111, 254, 149, 128, 177, 128, 111, 215, 212, 183, 254, - 156, 128, 111, 245, 95, 111, 243, 46, 245, 95, 111, 247, 235, 252, 24, - 254, 51, 216, 197, 232, 222, 243, 46, 128, 111, 254, 49, 128, 216, 43, - 177, 216, 197, 236, 16, 226, 232, 236, 16, 64, 177, 254, 49, 128, 111, - 249, 228, 245, 98, 245, 99, 249, 227, 222, 235, 236, 1, 128, 111, 222, - 235, 128, 111, 249, 155, 111, 245, 68, 245, 97, 111, 218, 158, 245, 98, - 248, 56, 128, 111, 128, 216, 43, 251, 79, 248, 73, 231, 89, 251, 78, 224, - 12, 128, 111, 228, 53, 128, 111, 240, 105, 111, 228, 53, 240, 105, 111, - 218, 110, 245, 95, 111, 233, 16, 177, 128, 111, 242, 131, 177, 128, 111, - 233, 16, 117, 128, 111, 242, 131, 117, 128, 111, 233, 16, 251, 89, 228, - 53, 128, 111, 242, 131, 251, 89, 228, 53, 128, 111, 230, 98, 233, 15, - 230, 98, 242, 130, 252, 24, 228, 53, 245, 95, 111, 228, 53, 233, 15, 228, - 53, 242, 130, 229, 101, 233, 16, 228, 60, 128, 111, 229, 101, 242, 131, - 228, 60, 128, 111, 233, 16, 177, 245, 95, 111, 242, 131, 177, 245, 95, - 111, 229, 101, 233, 16, 228, 60, 245, 95, 111, 229, 101, 242, 131, 228, - 60, 245, 95, 111, 233, 16, 177, 242, 130, 242, 131, 177, 233, 15, 229, - 101, 233, 16, 228, 60, 242, 130, 229, 101, 242, 131, 228, 60, 233, 15, - 224, 203, 218, 56, 224, 204, 177, 128, 111, 218, 57, 177, 128, 111, 224, - 204, 177, 245, 95, 111, 218, 57, 177, 245, 95, 111, 247, 139, 228, 53, - 224, 206, 247, 139, 228, 53, 218, 58, 218, 65, 226, 232, 218, 23, 226, - 232, 228, 53, 115, 218, 65, 226, 232, 228, 53, 115, 218, 23, 226, 232, - 218, 65, 64, 177, 128, 111, 218, 23, 64, 177, 128, 111, 229, 101, 115, - 218, 65, 64, 228, 60, 128, 111, 229, 101, 115, 218, 23, 64, 228, 60, 128, - 111, 218, 65, 64, 2, 228, 53, 128, 111, 218, 23, 64, 2, 228, 53, 128, - 111, 230, 82, 230, 83, 230, 84, 230, 83, 214, 175, 42, 236, 16, 226, 232, - 42, 226, 151, 226, 232, 42, 236, 16, 64, 177, 128, 111, 42, 226, 151, 64, - 177, 128, 111, 42, 250, 252, 42, 249, 103, 37, 225, 23, 37, 230, 182, 37, - 216, 86, 37, 247, 170, 219, 96, 37, 59, 226, 168, 37, 222, 235, 226, 168, - 37, 253, 218, 226, 168, 37, 245, 98, 37, 248, 157, 92, 225, 23, 92, 230, - 182, 92, 216, 86, 92, 59, 226, 168, 44, 217, 88, 43, 217, 88, 124, 217, - 88, 120, 217, 88, 253, 221, 230, 157, 215, 192, 244, 26, 215, 212, 67, - 252, 142, 44, 215, 93, 52, 67, 252, 142, 52, 44, 215, 93, 247, 139, 228, - 53, 224, 164, 228, 53, 215, 192, 247, 139, 228, 53, 244, 27, 229, 103, - 52, 67, 252, 142, 52, 44, 215, 93, 224, 204, 214, 184, 223, 92, 218, 57, - 214, 184, 223, 92, 228, 58, 218, 78, 226, 232, 249, 187, 253, 239, 228, - 58, 218, 77, 228, 58, 218, 78, 64, 177, 128, 111, 249, 187, 253, 239, - 228, 58, 218, 78, 177, 128, 111, 226, 151, 226, 232, 236, 16, 226, 232, - 230, 88, 241, 201, 249, 197, 231, 138, 235, 209, 211, 145, 229, 203, 228, - 59, 44, 254, 111, 2, 254, 26, 44, 215, 226, 230, 25, 232, 147, 254, 119, - 230, 25, 232, 147, 226, 159, 230, 25, 235, 199, 230, 25, 214, 175, 247, - 250, 226, 168, 59, 226, 168, 218, 158, 226, 168, 247, 170, 216, 86, 251, - 165, 43, 228, 58, 244, 182, 220, 150, 224, 181, 44, 228, 58, 244, 182, - 220, 150, 224, 181, 43, 220, 150, 224, 181, 44, 220, 150, 224, 181, 223, - 50, 216, 90, 245, 98, 249, 100, 232, 147, 226, 159, 249, 100, 232, 147, - 254, 119, 52, 218, 64, 52, 218, 22, 52, 235, 199, 52, 214, 175, 225, 48, - 128, 22, 226, 9, 111, 233, 16, 2, 247, 121, 242, 131, 2, 247, 121, 213, - 187, 230, 98, 233, 15, 213, 187, 230, 98, 242, 130, 233, 16, 128, 216, - 43, 177, 242, 130, 242, 131, 128, 216, 43, 177, 233, 15, 128, 216, 43, - 177, 233, 15, 128, 216, 43, 177, 242, 130, 128, 216, 43, 177, 224, 203, - 128, 216, 43, 177, 218, 56, 247, 139, 228, 53, 224, 207, 177, 245, 100, - 247, 139, 228, 53, 218, 59, 177, 245, 100, 228, 53, 42, 236, 16, 64, 177, - 128, 111, 228, 53, 42, 226, 151, 64, 177, 128, 111, 42, 236, 16, 64, 177, - 228, 53, 128, 111, 42, 226, 151, 64, 177, 228, 53, 128, 111, 233, 16, - 251, 89, 228, 53, 245, 95, 111, 242, 131, 251, 89, 228, 53, 245, 95, 111, - 224, 204, 251, 89, 228, 53, 245, 95, 111, 218, 57, 251, 89, 228, 53, 245, - 95, 111, 228, 53, 228, 58, 218, 78, 226, 232, 247, 139, 228, 53, 249, - 189, 253, 239, 228, 58, 218, 77, 228, 53, 228, 58, 218, 78, 64, 177, 128, - 111, 247, 139, 228, 53, 249, 189, 253, 239, 228, 58, 218, 78, 177, 245, - 100, 67, 245, 164, 230, 223, 203, 245, 164, 120, 44, 248, 0, 245, 164, - 124, 44, 248, 0, 245, 164, 245, 171, 64, 2, 199, 203, 91, 245, 171, 64, - 2, 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 4, 245, 171, 64, 2, 67, - 252, 142, 253, 208, 245, 144, 64, 203, 91, 245, 171, 64, 2, 59, 48, 245, - 171, 64, 2, 226, 124, 4, 245, 171, 64, 2, 226, 124, 245, 171, 64, 2, 214, - 183, 245, 171, 64, 2, 113, 203, 218, 91, 249, 187, 2, 199, 203, 91, 249, - 187, 2, 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 4, 249, 187, 2, - 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 249, 187, 2, 226, 124, 4, - 249, 187, 2, 226, 124, 210, 160, 188, 252, 174, 231, 62, 247, 251, 50, - 245, 173, 74, 240, 235, 120, 253, 250, 124, 253, 250, 224, 176, 225, 166, - 212, 32, 232, 214, 43, 250, 182, 44, 250, 182, 43, 244, 58, 44, 244, 58, - 251, 176, 44, 249, 133, 251, 176, 43, 249, 133, 216, 15, 44, 249, 133, - 216, 15, 43, 249, 133, 223, 50, 228, 53, 50, 42, 232, 105, 254, 26, 221, - 165, 221, 172, 217, 2, 223, 121, 224, 242, 235, 239, 213, 165, 218, 235, - 225, 42, 64, 235, 208, 50, 215, 94, 228, 53, 50, 212, 42, 240, 237, 216, - 15, 43, 249, 161, 216, 15, 44, 249, 161, 251, 176, 43, 249, 161, 251, - 176, 44, 249, 161, 216, 15, 163, 235, 212, 251, 176, 163, 235, 212, 243, - 241, 219, 76, 120, 253, 251, 252, 25, 113, 203, 252, 130, 226, 161, 234, - 139, 245, 91, 216, 43, 216, 197, 222, 252, 211, 179, 236, 1, 115, 223, - 118, 251, 164, 234, 138, 233, 43, 254, 111, 127, 222, 248, 254, 111, 127, - 245, 91, 216, 43, 216, 197, 233, 47, 252, 36, 222, 234, 249, 71, 254, - 156, 254, 2, 217, 182, 216, 5, 222, 124, 247, 216, 226, 152, 249, 199, - 217, 53, 219, 87, 249, 152, 249, 151, 254, 67, 243, 226, 16, 240, 152, - 254, 67, 243, 226, 16, 218, 229, 224, 28, 254, 67, 243, 226, 16, 224, 29, - 245, 100, 254, 67, 243, 226, 16, 224, 29, 247, 175, 254, 67, 243, 226, - 16, 224, 29, 247, 249, 254, 67, 243, 226, 16, 224, 29, 235, 57, 254, 67, - 243, 226, 16, 224, 29, 250, 36, 254, 67, 243, 226, 16, 250, 37, 218, 136, - 254, 67, 243, 226, 16, 250, 37, 235, 57, 254, 67, 243, 226, 16, 219, 97, - 130, 254, 67, 243, 226, 16, 252, 182, 130, 254, 67, 243, 226, 16, 224, - 29, 219, 96, 254, 67, 243, 226, 16, 224, 29, 252, 181, 254, 67, 243, 226, - 16, 224, 29, 233, 15, 254, 67, 243, 226, 16, 224, 29, 242, 130, 254, 67, - 243, 226, 16, 140, 214, 19, 254, 67, 243, 226, 16, 97, 214, 19, 254, 67, - 243, 226, 16, 224, 29, 140, 74, 254, 67, 243, 226, 16, 224, 29, 97, 74, - 254, 67, 243, 226, 16, 250, 37, 252, 181, 254, 67, 243, 226, 16, 124, - 217, 89, 214, 183, 254, 67, 243, 226, 16, 248, 56, 218, 136, 254, 67, - 243, 226, 16, 224, 29, 124, 250, 239, 254, 67, 243, 226, 16, 224, 29, - 248, 55, 254, 67, 243, 226, 16, 124, 217, 89, 235, 57, 254, 67, 243, 226, - 16, 214, 153, 214, 19, 254, 67, 243, 226, 16, 224, 29, 214, 153, 74, 254, - 67, 243, 226, 16, 120, 217, 89, 226, 124, 254, 67, 243, 226, 16, 248, 67, - 218, 136, 254, 67, 243, 226, 16, 224, 29, 120, 250, 239, 254, 67, 243, - 226, 16, 224, 29, 248, 66, 254, 67, 243, 226, 16, 120, 217, 89, 235, 57, - 254, 67, 243, 226, 16, 246, 105, 214, 19, 254, 67, 243, 226, 16, 224, 29, - 246, 105, 74, 254, 67, 243, 226, 16, 223, 254, 214, 183, 254, 67, 243, - 226, 16, 248, 56, 214, 183, 254, 67, 243, 226, 16, 247, 250, 214, 183, - 254, 67, 243, 226, 16, 235, 58, 214, 183, 254, 67, 243, 226, 16, 250, 37, - 214, 183, 254, 67, 243, 226, 16, 120, 220, 6, 235, 57, 254, 67, 243, 226, - 16, 223, 254, 224, 28, 254, 67, 243, 226, 16, 250, 37, 218, 157, 254, 67, - 243, 226, 16, 224, 29, 249, 227, 254, 67, 243, 226, 16, 120, 217, 89, - 248, 2, 254, 67, 243, 226, 16, 248, 67, 248, 2, 254, 67, 243, 226, 16, - 218, 158, 248, 2, 254, 67, 243, 226, 16, 235, 58, 248, 2, 254, 67, 243, - 226, 16, 250, 37, 248, 2, 254, 67, 243, 226, 16, 124, 220, 6, 218, 136, - 254, 67, 243, 226, 16, 43, 220, 6, 218, 136, 254, 67, 243, 226, 16, 216, - 90, 248, 2, 254, 67, 243, 226, 16, 242, 131, 248, 2, 254, 67, 243, 226, - 16, 249, 221, 130, 254, 67, 243, 226, 16, 248, 67, 183, 254, 67, 243, - 226, 16, 210, 34, 254, 67, 243, 226, 16, 218, 137, 183, 254, 67, 243, - 226, 16, 220, 152, 214, 183, 254, 67, 243, 226, 16, 224, 29, 228, 53, - 245, 100, 254, 67, 243, 226, 16, 224, 29, 224, 13, 254, 67, 243, 226, 16, - 124, 250, 240, 183, 254, 67, 243, 226, 16, 120, 250, 240, 183, 254, 67, - 243, 226, 16, 235, 186, 254, 67, 243, 226, 16, 223, 38, 254, 67, 243, - 226, 16, 226, 202, 254, 67, 243, 226, 16, 254, 145, 214, 183, 254, 67, - 243, 226, 16, 245, 102, 214, 183, 254, 67, 243, 226, 16, 235, 187, 214, - 183, 254, 67, 243, 226, 16, 226, 203, 214, 183, 254, 67, 243, 226, 16, - 254, 144, 228, 53, 250, 131, 78, 44, 254, 111, 2, 246, 105, 210, 35, 74, - 219, 236, 204, 251, 164, 252, 46, 87, 67, 232, 215, 2, 230, 225, 247, - 121, 235, 217, 87, 249, 184, 214, 181, 87, 247, 190, 214, 181, 87, 245, - 155, 87, 249, 211, 87, 71, 42, 2, 250, 176, 67, 232, 214, 245, 131, 87, - 254, 140, 234, 140, 87, 241, 214, 87, 37, 203, 252, 142, 2, 228, 51, 37, - 215, 227, 246, 107, 251, 136, 250, 37, 2, 228, 55, 74, 214, 179, 87, 230, - 138, 87, 240, 165, 87, 226, 175, 242, 60, 87, 226, 175, 233, 148, 87, - 225, 245, 87, 225, 244, 87, 247, 198, 249, 98, 16, 244, 21, 105, 219, 51, - 87, 254, 67, 243, 226, 16, 224, 28, 248, 84, 220, 139, 234, 140, 87, 224, - 193, 226, 76, 229, 83, 226, 76, 224, 189, 221, 190, 87, 250, 18, 221, - 190, 87, 43, 226, 5, 214, 160, 103, 43, 226, 5, 245, 22, 43, 226, 5, 232, - 109, 103, 44, 226, 5, 214, 160, 103, 44, 226, 5, 245, 22, 44, 226, 5, - 232, 109, 103, 43, 42, 251, 159, 214, 160, 249, 161, 43, 42, 251, 159, - 245, 22, 43, 42, 251, 159, 232, 109, 249, 161, 44, 42, 251, 159, 214, - 160, 249, 161, 44, 42, 251, 159, 245, 22, 44, 42, 251, 159, 232, 109, - 249, 161, 43, 249, 100, 251, 159, 214, 160, 103, 43, 249, 100, 251, 159, - 230, 225, 225, 102, 43, 249, 100, 251, 159, 232, 109, 103, 249, 100, 251, - 159, 245, 22, 44, 249, 100, 251, 159, 214, 160, 103, 44, 249, 100, 251, - 159, 230, 225, 225, 102, 44, 249, 100, 251, 159, 232, 109, 103, 235, 213, - 245, 22, 203, 232, 215, 245, 22, 214, 160, 43, 177, 232, 109, 44, 249, - 100, 251, 159, 221, 173, 214, 160, 44, 177, 232, 109, 43, 249, 100, 251, - 159, 221, 173, 218, 42, 216, 14, 218, 42, 251, 175, 216, 15, 42, 127, - 251, 176, 42, 127, 251, 176, 42, 251, 159, 117, 216, 15, 42, 127, 34, 16, - 251, 175, 43, 67, 93, 232, 214, 44, 67, 93, 232, 214, 203, 221, 206, 232, - 213, 203, 221, 206, 232, 212, 203, 221, 206, 232, 211, 203, 221, 206, - 232, 210, 248, 47, 16, 192, 67, 22, 216, 15, 222, 252, 248, 47, 16, 192, - 67, 22, 251, 176, 222, 252, 248, 47, 16, 192, 67, 2, 250, 36, 248, 47, - 16, 192, 124, 22, 203, 2, 250, 36, 248, 47, 16, 192, 120, 22, 203, 2, - 250, 36, 248, 47, 16, 192, 67, 2, 215, 226, 248, 47, 16, 192, 124, 22, - 203, 2, 215, 226, 248, 47, 16, 192, 120, 22, 203, 2, 215, 226, 248, 47, - 16, 192, 67, 22, 212, 35, 248, 47, 16, 192, 124, 22, 203, 2, 212, 35, - 248, 47, 16, 192, 120, 22, 203, 2, 212, 35, 248, 47, 16, 192, 124, 22, - 241, 45, 248, 47, 16, 192, 120, 22, 241, 45, 248, 47, 16, 192, 67, 22, - 216, 15, 233, 47, 248, 47, 16, 192, 67, 22, 251, 176, 233, 47, 42, 244, - 33, 223, 55, 87, 245, 183, 87, 67, 232, 215, 245, 22, 231, 34, 251, 147, - 231, 34, 199, 117, 219, 251, 231, 34, 219, 252, 117, 232, 138, 231, 34, - 199, 117, 113, 219, 238, 231, 34, 113, 219, 239, 117, 232, 138, 231, 34, - 113, 219, 239, 235, 65, 231, 34, 215, 209, 231, 34, 216, 224, 231, 34, - 225, 189, 245, 225, 242, 123, 243, 220, 216, 15, 226, 4, 251, 176, 226, - 4, 216, 15, 249, 100, 127, 251, 176, 249, 100, 127, 216, 15, 216, 7, 220, - 54, 127, 251, 176, 216, 7, 220, 54, 127, 71, 215, 240, 252, 36, 222, 235, - 2, 250, 36, 218, 121, 244, 65, 255, 18, 249, 97, 245, 172, 235, 199, 248, - 84, 245, 25, 87, 85, 222, 248, 52, 215, 226, 85, 233, 43, 52, 215, 226, - 85, 214, 162, 52, 215, 226, 85, 246, 106, 52, 215, 226, 85, 222, 248, 52, - 215, 227, 2, 67, 130, 85, 233, 43, 52, 215, 227, 2, 67, 130, 85, 222, - 248, 215, 227, 2, 52, 67, 130, 254, 174, 250, 4, 218, 127, 216, 87, 250, - 4, 240, 238, 2, 244, 51, 221, 242, 16, 31, 227, 203, 16, 31, 218, 153, - 64, 241, 234, 16, 31, 218, 153, 64, 216, 213, 16, 31, 245, 144, 64, 216, - 213, 16, 31, 245, 144, 64, 215, 244, 16, 31, 245, 133, 16, 31, 255, 8, - 16, 31, 252, 45, 16, 31, 252, 180, 16, 31, 203, 217, 90, 16, 31, 232, - 215, 244, 146, 16, 31, 67, 217, 90, 16, 31, 244, 21, 244, 146, 16, 31, - 250, 231, 223, 54, 16, 31, 220, 29, 226, 131, 16, 31, 220, 29, 236, 0, - 16, 31, 248, 152, 232, 205, 245, 78, 16, 31, 248, 32, 249, 179, 110, 16, - 31, 248, 32, 249, 179, 105, 16, 31, 248, 32, 249, 179, 158, 16, 31, 248, - 32, 249, 179, 161, 16, 31, 152, 255, 8, 16, 31, 217, 178, 236, 63, 16, - 31, 245, 144, 64, 215, 245, 251, 214, 16, 31, 251, 6, 16, 31, 245, 144, - 64, 231, 82, 16, 31, 218, 62, 16, 31, 245, 78, 16, 31, 244, 108, 220, - 138, 16, 31, 242, 122, 220, 138, 16, 31, 223, 122, 220, 138, 16, 31, 214, - 174, 220, 138, 16, 31, 219, 19, 16, 31, 248, 64, 251, 217, 87, 204, 251, - 164, 16, 31, 229, 86, 16, 31, 248, 65, 244, 21, 105, 16, 31, 218, 63, - 244, 21, 105, 226, 242, 103, 226, 242, 250, 153, 226, 242, 244, 24, 226, - 242, 235, 194, 244, 24, 226, 242, 252, 43, 251, 125, 226, 242, 251, 171, - 216, 112, 226, 242, 251, 156, 252, 147, 240, 104, 226, 242, 254, 128, 64, - 250, 130, 226, 242, 248, 157, 226, 242, 249, 88, 255, 12, 227, 201, 226, - 242, 52, 252, 181, 37, 21, 110, 37, 21, 105, 37, 21, 158, 37, 21, 161, - 37, 21, 189, 37, 21, 194, 37, 21, 198, 37, 21, 195, 37, 21, 200, 37, 54, - 216, 248, 37, 54, 245, 168, 37, 54, 215, 76, 37, 54, 216, 165, 37, 54, - 244, 6, 37, 54, 244, 119, 37, 54, 219, 120, 37, 54, 220, 120, 37, 54, - 245, 191, 37, 54, 228, 198, 37, 54, 215, 73, 88, 21, 110, 88, 21, 105, - 88, 21, 158, 88, 21, 161, 88, 21, 189, 88, 21, 194, 88, 21, 198, 88, 21, - 195, 88, 21, 200, 88, 54, 216, 248, 88, 54, 245, 168, 88, 54, 215, 76, - 88, 54, 216, 165, 88, 54, 244, 6, 88, 54, 244, 119, 88, 54, 219, 120, 88, - 54, 220, 120, 88, 54, 245, 191, 88, 54, 228, 198, 88, 54, 215, 73, 21, - 123, 243, 230, 218, 130, 21, 113, 243, 230, 218, 130, 21, 134, 243, 230, - 218, 130, 21, 244, 12, 243, 230, 218, 130, 21, 244, 82, 243, 230, 218, - 130, 21, 219, 126, 243, 230, 218, 130, 21, 220, 123, 243, 230, 218, 130, - 21, 245, 194, 243, 230, 218, 130, 21, 228, 201, 243, 230, 218, 130, 54, - 216, 249, 243, 230, 218, 130, 54, 245, 169, 243, 230, 218, 130, 54, 215, - 77, 243, 230, 218, 130, 54, 216, 166, 243, 230, 218, 130, 54, 244, 7, - 243, 230, 218, 130, 54, 244, 120, 243, 230, 218, 130, 54, 219, 121, 243, - 230, 218, 130, 54, 220, 121, 243, 230, 218, 130, 54, 245, 192, 243, 230, - 218, 130, 54, 228, 199, 243, 230, 218, 130, 54, 215, 74, 243, 230, 218, - 130, 88, 7, 4, 1, 61, 88, 7, 4, 1, 253, 159, 88, 7, 4, 1, 251, 67, 88, 7, - 4, 1, 249, 61, 88, 7, 4, 1, 75, 88, 7, 4, 1, 245, 7, 88, 7, 4, 1, 243, - 203, 88, 7, 4, 1, 242, 61, 88, 7, 4, 1, 73, 88, 7, 4, 1, 235, 145, 88, 7, - 4, 1, 235, 24, 88, 7, 4, 1, 156, 88, 7, 4, 1, 193, 88, 7, 4, 1, 230, 26, - 88, 7, 4, 1, 76, 88, 7, 4, 1, 226, 106, 88, 7, 4, 1, 224, 97, 88, 7, 4, - 1, 153, 88, 7, 4, 1, 222, 92, 88, 7, 4, 1, 217, 153, 88, 7, 4, 1, 70, 88, - 7, 4, 1, 214, 105, 88, 7, 4, 1, 212, 98, 88, 7, 4, 1, 211, 178, 88, 7, 4, - 1, 211, 117, 88, 7, 4, 1, 210, 159, 37, 7, 6, 1, 61, 37, 7, 6, 1, 253, - 159, 37, 7, 6, 1, 251, 67, 37, 7, 6, 1, 249, 61, 37, 7, 6, 1, 75, 37, 7, - 6, 1, 245, 7, 37, 7, 6, 1, 243, 203, 37, 7, 6, 1, 242, 61, 37, 7, 6, 1, - 73, 37, 7, 6, 1, 235, 145, 37, 7, 6, 1, 235, 24, 37, 7, 6, 1, 156, 37, 7, - 6, 1, 193, 37, 7, 6, 1, 230, 26, 37, 7, 6, 1, 76, 37, 7, 6, 1, 226, 106, - 37, 7, 6, 1, 224, 97, 37, 7, 6, 1, 153, 37, 7, 6, 1, 222, 92, 37, 7, 6, - 1, 217, 153, 37, 7, 6, 1, 70, 37, 7, 6, 1, 214, 105, 37, 7, 6, 1, 212, - 98, 37, 7, 6, 1, 211, 178, 37, 7, 6, 1, 211, 117, 37, 7, 6, 1, 210, 159, - 37, 7, 4, 1, 61, 37, 7, 4, 1, 253, 159, 37, 7, 4, 1, 251, 67, 37, 7, 4, - 1, 249, 61, 37, 7, 4, 1, 75, 37, 7, 4, 1, 245, 7, 37, 7, 4, 1, 243, 203, - 37, 7, 4, 1, 242, 61, 37, 7, 4, 1, 73, 37, 7, 4, 1, 235, 145, 37, 7, 4, - 1, 235, 24, 37, 7, 4, 1, 156, 37, 7, 4, 1, 193, 37, 7, 4, 1, 230, 26, 37, - 7, 4, 1, 76, 37, 7, 4, 1, 226, 106, 37, 7, 4, 1, 224, 97, 37, 7, 4, 1, - 153, 37, 7, 4, 1, 222, 92, 37, 7, 4, 1, 217, 153, 37, 7, 4, 1, 70, 37, 7, - 4, 1, 214, 105, 37, 7, 4, 1, 212, 98, 37, 7, 4, 1, 211, 178, 37, 7, 4, 1, - 211, 117, 37, 7, 4, 1, 210, 159, 37, 21, 210, 86, 152, 37, 54, 245, 168, - 152, 37, 54, 215, 76, 152, 37, 54, 216, 165, 152, 37, 54, 244, 6, 152, - 37, 54, 244, 119, 152, 37, 54, 219, 120, 152, 37, 54, 220, 120, 152, 37, - 54, 245, 191, 152, 37, 54, 228, 198, 152, 37, 54, 215, 73, 52, 37, 21, - 110, 52, 37, 21, 105, 52, 37, 21, 158, 52, 37, 21, 161, 52, 37, 21, 189, - 52, 37, 21, 194, 52, 37, 21, 198, 52, 37, 21, 195, 52, 37, 21, 200, 52, - 37, 54, 216, 248, 152, 37, 21, 210, 86, 93, 99, 192, 241, 45, 93, 99, - 114, 241, 45, 93, 99, 192, 213, 239, 93, 99, 114, 213, 239, 93, 99, 192, - 215, 212, 248, 158, 241, 45, 93, 99, 114, 215, 212, 248, 158, 241, 45, - 93, 99, 192, 215, 212, 248, 158, 213, 239, 93, 99, 114, 215, 212, 248, - 158, 213, 239, 93, 99, 192, 224, 25, 248, 158, 241, 45, 93, 99, 114, 224, - 25, 248, 158, 241, 45, 93, 99, 192, 224, 25, 248, 158, 213, 239, 93, 99, - 114, 224, 25, 248, 158, 213, 239, 93, 99, 192, 124, 22, 222, 252, 93, 99, - 124, 192, 22, 44, 241, 222, 93, 99, 124, 114, 22, 44, 232, 231, 93, 99, - 114, 124, 22, 222, 252, 93, 99, 192, 124, 22, 233, 47, 93, 99, 124, 192, - 22, 43, 241, 222, 93, 99, 124, 114, 22, 43, 232, 231, 93, 99, 114, 124, - 22, 233, 47, 93, 99, 192, 120, 22, 222, 252, 93, 99, 120, 192, 22, 44, - 241, 222, 93, 99, 120, 114, 22, 44, 232, 231, 93, 99, 114, 120, 22, 222, - 252, 93, 99, 192, 120, 22, 233, 47, 93, 99, 120, 192, 22, 43, 241, 222, - 93, 99, 120, 114, 22, 43, 232, 231, 93, 99, 114, 120, 22, 233, 47, 93, - 99, 192, 67, 22, 222, 252, 93, 99, 67, 192, 22, 44, 241, 222, 93, 99, - 120, 114, 22, 44, 124, 232, 231, 93, 99, 124, 114, 22, 44, 120, 232, 231, - 93, 99, 67, 114, 22, 44, 232, 231, 93, 99, 124, 192, 22, 44, 120, 241, - 222, 93, 99, 120, 192, 22, 44, 124, 241, 222, 93, 99, 114, 67, 22, 222, - 252, 93, 99, 192, 67, 22, 233, 47, 93, 99, 67, 192, 22, 43, 241, 222, 93, - 99, 120, 114, 22, 43, 124, 232, 231, 93, 99, 124, 114, 22, 43, 120, 232, - 231, 93, 99, 67, 114, 22, 43, 232, 231, 93, 99, 124, 192, 22, 43, 120, - 241, 222, 93, 99, 120, 192, 22, 43, 124, 241, 222, 93, 99, 114, 67, 22, - 233, 47, 93, 99, 192, 124, 22, 241, 45, 93, 99, 43, 114, 22, 44, 124, - 232, 231, 93, 99, 44, 114, 22, 43, 124, 232, 231, 93, 99, 124, 192, 22, - 203, 241, 222, 93, 99, 124, 114, 22, 203, 232, 231, 93, 99, 44, 192, 22, - 43, 124, 241, 222, 93, 99, 43, 192, 22, 44, 124, 241, 222, 93, 99, 114, - 124, 22, 241, 45, 93, 99, 192, 120, 22, 241, 45, 93, 99, 43, 114, 22, 44, - 120, 232, 231, 93, 99, 44, 114, 22, 43, 120, 232, 231, 93, 99, 120, 192, - 22, 203, 241, 222, 93, 99, 120, 114, 22, 203, 232, 231, 93, 99, 44, 192, - 22, 43, 120, 241, 222, 93, 99, 43, 192, 22, 44, 120, 241, 222, 93, 99, - 114, 120, 22, 241, 45, 93, 99, 192, 67, 22, 241, 45, 93, 99, 43, 114, 22, - 44, 67, 232, 231, 93, 99, 44, 114, 22, 43, 67, 232, 231, 93, 99, 67, 192, - 22, 203, 241, 222, 93, 99, 120, 114, 22, 124, 203, 232, 231, 93, 99, 124, - 114, 22, 120, 203, 232, 231, 93, 99, 67, 114, 22, 203, 232, 231, 93, 99, - 43, 120, 114, 22, 44, 124, 232, 231, 93, 99, 44, 120, 114, 22, 43, 124, - 232, 231, 93, 99, 43, 124, 114, 22, 44, 120, 232, 231, 93, 99, 44, 124, - 114, 22, 43, 120, 232, 231, 93, 99, 124, 192, 22, 120, 203, 241, 222, 93, - 99, 120, 192, 22, 124, 203, 241, 222, 93, 99, 44, 192, 22, 43, 67, 241, - 222, 93, 99, 43, 192, 22, 44, 67, 241, 222, 93, 99, 114, 67, 22, 241, 45, - 93, 99, 192, 52, 248, 158, 241, 45, 93, 99, 114, 52, 248, 158, 241, 45, - 93, 99, 192, 52, 248, 158, 213, 239, 93, 99, 114, 52, 248, 158, 213, 239, - 93, 99, 52, 241, 45, 93, 99, 52, 213, 239, 93, 99, 124, 219, 156, 22, 44, - 246, 114, 93, 99, 124, 52, 22, 44, 219, 155, 93, 99, 52, 124, 22, 222, - 252, 93, 99, 124, 219, 156, 22, 43, 246, 114, 93, 99, 124, 52, 22, 43, - 219, 155, 93, 99, 52, 124, 22, 233, 47, 93, 99, 120, 219, 156, 22, 44, - 246, 114, 93, 99, 120, 52, 22, 44, 219, 155, 93, 99, 52, 120, 22, 222, - 252, 93, 99, 120, 219, 156, 22, 43, 246, 114, 93, 99, 120, 52, 22, 43, - 219, 155, 93, 99, 52, 120, 22, 233, 47, 93, 99, 67, 219, 156, 22, 44, - 246, 114, 93, 99, 67, 52, 22, 44, 219, 155, 93, 99, 52, 67, 22, 222, 252, - 93, 99, 67, 219, 156, 22, 43, 246, 114, 93, 99, 67, 52, 22, 43, 219, 155, - 93, 99, 52, 67, 22, 233, 47, 93, 99, 124, 219, 156, 22, 203, 246, 114, - 93, 99, 124, 52, 22, 203, 219, 155, 93, 99, 52, 124, 22, 241, 45, 93, 99, - 120, 219, 156, 22, 203, 246, 114, 93, 99, 120, 52, 22, 203, 219, 155, 93, - 99, 52, 120, 22, 241, 45, 93, 99, 67, 219, 156, 22, 203, 246, 114, 93, - 99, 67, 52, 22, 203, 219, 155, 93, 99, 52, 67, 22, 241, 45, 93, 99, 192, - 254, 27, 124, 22, 222, 252, 93, 99, 192, 254, 27, 124, 22, 233, 47, 93, - 99, 192, 254, 27, 120, 22, 233, 47, 93, 99, 192, 254, 27, 120, 22, 222, - 252, 93, 99, 192, 248, 0, 214, 160, 44, 216, 43, 232, 109, 233, 47, 93, - 99, 192, 248, 0, 214, 160, 43, 216, 43, 232, 109, 222, 252, 93, 99, 192, - 248, 0, 249, 131, 93, 99, 192, 233, 47, 93, 99, 192, 214, 163, 93, 99, - 192, 222, 252, 93, 99, 192, 246, 107, 93, 99, 114, 233, 47, 93, 99, 114, - 214, 163, 93, 99, 114, 222, 252, 93, 99, 114, 246, 107, 93, 99, 192, 43, - 22, 114, 222, 252, 93, 99, 192, 120, 22, 114, 246, 107, 93, 99, 114, 43, - 22, 192, 222, 252, 93, 99, 114, 120, 22, 192, 246, 107, 214, 160, 163, - 251, 214, 232, 109, 123, 245, 190, 251, 214, 232, 109, 123, 224, 23, 251, - 214, 232, 109, 134, 245, 188, 251, 214, 232, 109, 163, 251, 214, 232, - 109, 244, 82, 245, 188, 251, 214, 232, 109, 134, 224, 21, 251, 214, 232, - 109, 220, 123, 245, 188, 251, 214, 243, 230, 251, 214, 43, 220, 123, 245, - 188, 251, 214, 43, 134, 224, 21, 251, 214, 43, 244, 82, 245, 188, 251, - 214, 43, 163, 251, 214, 43, 134, 245, 188, 251, 214, 43, 123, 224, 23, - 251, 214, 43, 123, 245, 190, 251, 214, 44, 163, 251, 214, 192, 220, 93, - 231, 83, 220, 93, 248, 163, 220, 93, 214, 160, 123, 245, 190, 251, 214, - 44, 123, 245, 190, 251, 214, 224, 27, 232, 109, 233, 47, 224, 27, 232, - 109, 222, 252, 224, 27, 214, 160, 233, 47, 224, 27, 214, 160, 43, 22, - 232, 109, 43, 22, 232, 109, 222, 252, 224, 27, 214, 160, 43, 22, 232, - 109, 222, 252, 224, 27, 214, 160, 43, 22, 214, 160, 44, 22, 232, 109, - 233, 47, 224, 27, 214, 160, 43, 22, 214, 160, 44, 22, 232, 109, 222, 252, - 224, 27, 214, 160, 222, 252, 224, 27, 214, 160, 44, 22, 232, 109, 233, - 47, 224, 27, 214, 160, 44, 22, 232, 109, 43, 22, 232, 109, 222, 252, 85, - 218, 235, 71, 218, 235, 71, 42, 2, 222, 184, 249, 160, 71, 42, 249, 188, - 85, 4, 218, 235, 42, 2, 203, 244, 106, 42, 2, 67, 244, 106, 42, 2, 226, - 145, 249, 127, 244, 106, 42, 2, 214, 160, 43, 216, 43, 232, 109, 44, 244, - 106, 42, 2, 214, 160, 44, 216, 43, 232, 109, 43, 244, 106, 42, 2, 248, 0, - 249, 127, 244, 106, 85, 4, 218, 235, 71, 4, 218, 235, 85, 223, 117, 71, - 223, 117, 85, 67, 223, 117, 71, 67, 223, 117, 85, 226, 7, 71, 226, 7, 85, - 214, 162, 215, 226, 71, 214, 162, 215, 226, 85, 214, 162, 4, 215, 226, - 71, 214, 162, 4, 215, 226, 85, 222, 248, 215, 226, 71, 222, 248, 215, - 226, 85, 222, 248, 4, 215, 226, 71, 222, 248, 4, 215, 226, 85, 222, 248, - 225, 9, 71, 222, 248, 225, 9, 85, 246, 106, 215, 226, 71, 246, 106, 215, - 226, 85, 246, 106, 4, 215, 226, 71, 246, 106, 4, 215, 226, 85, 233, 43, - 215, 226, 71, 233, 43, 215, 226, 85, 233, 43, 4, 215, 226, 71, 233, 43, - 4, 215, 226, 85, 233, 43, 225, 9, 71, 233, 43, 225, 9, 85, 247, 249, 71, - 247, 249, 71, 247, 250, 249, 188, 85, 4, 247, 249, 244, 90, 232, 105, 71, - 250, 36, 246, 119, 250, 36, 250, 37, 2, 67, 244, 106, 251, 112, 85, 250, - 36, 250, 37, 2, 43, 163, 251, 222, 250, 37, 2, 44, 163, 251, 222, 250, - 37, 2, 232, 109, 163, 251, 222, 250, 37, 2, 214, 160, 163, 251, 222, 250, - 37, 2, 214, 160, 44, 224, 27, 251, 222, 250, 37, 2, 254, 156, 251, 89, - 214, 160, 43, 224, 27, 251, 222, 43, 163, 85, 250, 36, 44, 163, 85, 250, - 36, 235, 195, 251, 114, 235, 195, 71, 250, 36, 214, 160, 163, 235, 195, - 71, 250, 36, 232, 109, 163, 235, 195, 71, 250, 36, 214, 160, 43, 224, 27, - 250, 34, 254, 26, 214, 160, 44, 224, 27, 250, 34, 254, 26, 232, 109, 44, - 224, 27, 250, 34, 254, 26, 232, 109, 43, 224, 27, 250, 34, 254, 26, 214, - 160, 163, 250, 36, 232, 109, 163, 250, 36, 85, 232, 109, 44, 215, 226, - 85, 232, 109, 43, 215, 226, 85, 214, 160, 43, 215, 226, 85, 214, 160, 44, - 215, 226, 71, 251, 114, 42, 2, 43, 163, 251, 222, 42, 2, 44, 163, 251, - 222, 42, 2, 214, 160, 43, 248, 0, 163, 251, 222, 42, 2, 232, 109, 44, - 248, 0, 163, 251, 222, 71, 42, 2, 67, 251, 233, 232, 214, 71, 214, 162, - 215, 227, 2, 247, 121, 214, 162, 215, 227, 2, 43, 163, 251, 222, 214, - 162, 215, 227, 2, 44, 163, 251, 222, 233, 86, 250, 36, 71, 42, 2, 214, - 160, 43, 224, 26, 71, 42, 2, 232, 109, 43, 224, 26, 71, 42, 2, 232, 109, - 44, 224, 26, 71, 42, 2, 214, 160, 44, 224, 26, 71, 250, 37, 2, 214, 160, - 43, 224, 26, 71, 250, 37, 2, 232, 109, 43, 224, 26, 71, 250, 37, 2, 232, - 109, 44, 224, 26, 71, 250, 37, 2, 214, 160, 44, 224, 26, 214, 160, 43, - 215, 226, 214, 160, 44, 215, 226, 232, 109, 43, 215, 226, 71, 231, 83, - 218, 235, 85, 231, 83, 218, 235, 71, 231, 83, 4, 218, 235, 85, 231, 83, - 4, 218, 235, 232, 109, 44, 215, 226, 85, 218, 39, 2, 223, 133, 249, 248, - 214, 194, 219, 61, 249, 223, 85, 218, 157, 71, 218, 157, 232, 229, 216, - 133, 218, 38, 253, 235, 228, 72, 248, 39, 228, 72, 249, 196, 226, 164, - 85, 217, 1, 71, 217, 1, 252, 157, 251, 164, 252, 157, 93, 2, 250, 130, - 252, 157, 93, 2, 211, 178, 221, 255, 214, 195, 2, 223, 161, 246, 85, 240, - 244, 252, 23, 71, 220, 3, 225, 102, 85, 220, 3, 225, 102, 220, 88, 223, - 50, 222, 188, 244, 56, 241, 229, 251, 114, 85, 43, 225, 8, 235, 243, 85, - 44, 225, 8, 235, 243, 71, 43, 225, 8, 235, 243, 71, 120, 225, 8, 235, - 243, 71, 44, 225, 8, 235, 243, 71, 124, 225, 8, 235, 243, 219, 102, 22, - 249, 130, 250, 220, 50, 223, 173, 50, 251, 240, 50, 251, 26, 254, 103, - 226, 146, 249, 131, 250, 112, 223, 38, 249, 132, 64, 232, 119, 249, 132, - 64, 235, 117, 218, 158, 22, 249, 137, 244, 169, 87, 254, 249, 220, 90, - 242, 23, 22, 219, 190, 225, 221, 87, 210, 254, 211, 69, 215, 216, 31, - 241, 224, 215, 216, 31, 233, 108, 215, 216, 31, 244, 97, 215, 216, 31, - 216, 134, 215, 216, 31, 211, 239, 215, 216, 31, 212, 40, 215, 216, 31, - 230, 116, 215, 216, 31, 245, 224, 212, 1, 64, 248, 19, 71, 243, 240, 244, - 191, 71, 219, 75, 244, 191, 85, 219, 75, 244, 191, 71, 218, 39, 2, 223, - 133, 244, 93, 224, 23, 230, 129, 233, 81, 224, 23, 230, 129, 231, 55, - 244, 139, 50, 245, 224, 231, 191, 50, 235, 39, 221, 221, 214, 145, 229, - 94, 225, 21, 254, 13, 217, 41, 243, 53, 251, 4, 233, 20, 213, 150, 232, - 239, 221, 192, 222, 20, 250, 249, 254, 43, 225, 53, 71, 250, 118, 234, - 79, 71, 250, 118, 224, 15, 71, 250, 118, 222, 196, 71, 250, 118, 251, - 232, 71, 250, 118, 234, 31, 71, 250, 118, 225, 232, 85, 250, 118, 234, - 79, 85, 250, 118, 224, 15, 85, 250, 118, 222, 196, 85, 250, 118, 251, - 232, 85, 250, 118, 234, 31, 85, 250, 118, 225, 232, 85, 219, 17, 218, 51, - 71, 241, 229, 218, 51, 71, 247, 250, 218, 51, 85, 249, 246, 218, 51, 71, - 219, 17, 218, 51, 85, 241, 229, 218, 51, 85, 247, 250, 218, 51, 71, 249, - 246, 218, 51, 240, 244, 218, 239, 224, 23, 228, 48, 245, 190, 228, 48, - 252, 74, 245, 190, 228, 43, 252, 74, 219, 119, 228, 43, 230, 58, 244, 67, - 50, 230, 58, 229, 189, 50, 230, 58, 220, 77, 50, 212, 9, 182, 249, 131, - 245, 221, 182, 249, 131, 214, 171, 223, 113, 87, 223, 113, 16, 31, 215, - 48, 225, 35, 223, 113, 16, 31, 215, 47, 225, 35, 223, 113, 16, 31, 215, - 46, 225, 35, 223, 113, 16, 31, 215, 45, 225, 35, 223, 113, 16, 31, 215, - 44, 225, 35, 223, 113, 16, 31, 215, 43, 225, 35, 223, 113, 16, 31, 215, - 42, 225, 35, 223, 113, 16, 31, 243, 51, 231, 139, 85, 214, 171, 223, 113, - 87, 223, 114, 226, 21, 87, 225, 253, 226, 21, 87, 225, 175, 226, 21, 50, - 211, 255, 87, 247, 242, 244, 190, 247, 242, 244, 189, 247, 242, 244, 188, - 247, 242, 244, 187, 247, 242, 244, 186, 247, 242, 244, 185, 71, 250, 37, - 2, 59, 222, 252, 71, 250, 37, 2, 113, 247, 119, 85, 250, 37, 2, 71, 59, - 222, 252, 85, 250, 37, 2, 113, 71, 247, 119, 230, 143, 31, 211, 69, 230, - 143, 31, 210, 253, 247, 225, 31, 242, 132, 211, 69, 247, 225, 31, 233, - 14, 210, 253, 247, 225, 31, 233, 14, 211, 69, 247, 225, 31, 242, 132, - 210, 253, 71, 244, 74, 85, 244, 74, 242, 23, 22, 225, 105, 254, 121, 249, - 129, 217, 236, 218, 165, 64, 254, 227, 221, 207, 254, 170, 244, 52, 243, - 61, 218, 165, 64, 241, 203, 253, 200, 87, 244, 63, 226, 127, 71, 218, - 157, 134, 232, 209, 249, 176, 222, 252, 134, 232, 209, 249, 176, 233, 47, - 212, 50, 50, 125, 213, 130, 50, 246, 111, 244, 139, 50, 246, 111, 231, - 191, 50, 235, 204, 244, 139, 22, 231, 191, 50, 231, 191, 22, 244, 139, - 50, 231, 191, 2, 218, 104, 50, 231, 191, 2, 218, 104, 22, 231, 191, 22, - 244, 139, 50, 67, 231, 191, 2, 218, 104, 50, 203, 231, 191, 2, 218, 104, - 50, 231, 83, 71, 250, 36, 231, 83, 85, 250, 36, 231, 83, 4, 71, 250, 36, - 231, 154, 87, 247, 168, 87, 214, 169, 225, 252, 87, 249, 232, 243, 225, - 214, 141, 229, 89, 250, 162, 226, 62, 235, 45, 213, 185, 250, 94, 85, - 230, 130, 232, 226, 220, 113, 220, 148, 224, 6, 220, 131, 219, 56, 252, - 160, 252, 127, 92, 234, 139, 71, 246, 94, 231, 186, 71, 246, 94, 234, 79, - 85, 246, 94, 231, 186, 85, 246, 94, 234, 79, 219, 62, 211, 230, 219, 65, - 218, 39, 252, 52, 249, 248, 223, 160, 85, 219, 61, 216, 135, 249, 249, - 22, 223, 160, 215, 94, 71, 220, 3, 225, 102, 215, 94, 85, 220, 3, 225, - 102, 71, 247, 250, 236, 1, 218, 235, 249, 126, 233, 92, 247, 194, 250, - 245, 226, 167, 225, 105, 250, 246, 219, 89, 241, 213, 2, 71, 249, 131, - 37, 249, 126, 233, 92, 250, 154, 228, 76, 245, 125, 254, 142, 226, 192, - 43, 212, 26, 215, 252, 85, 215, 55, 43, 212, 26, 215, 252, 71, 215, 55, - 43, 212, 26, 215, 252, 85, 43, 233, 93, 231, 54, 71, 43, 233, 93, 231, - 54, 246, 90, 219, 83, 50, 114, 71, 246, 106, 215, 226, 43, 250, 1, 245, - 125, 92, 221, 255, 244, 176, 248, 0, 236, 1, 71, 250, 37, 236, 1, 85, - 218, 235, 85, 215, 193, 223, 61, 43, 245, 124, 223, 61, 43, 245, 123, - 253, 212, 16, 31, 214, 145, 114, 250, 37, 2, 218, 104, 22, 113, 170, 48, - 225, 190, 222, 249, 235, 206, 225, 190, 233, 44, 235, 206, 225, 190, 235, - 194, 225, 190, 85, 249, 132, 226, 198, 220, 30, 220, 18, 219, 230, 250, - 62, 250, 227, 241, 158, 219, 127, 243, 62, 211, 230, 240, 221, 243, 62, - 2, 242, 13, 231, 174, 16, 31, 232, 230, 230, 116, 214, 195, 226, 198, - 242, 123, 244, 13, 244, 75, 236, 1, 241, 60, 244, 130, 222, 15, 42, 244, - 12, 249, 160, 219, 105, 240, 113, 219, 108, 225, 169, 2, 252, 160, 216, - 243, 235, 132, 252, 147, 87, 241, 232, 242, 134, 87, 243, 233, 224, 143, - 249, 104, 226, 198, 85, 218, 235, 71, 244, 75, 2, 203, 230, 225, 85, 218, - 105, 214, 160, 251, 218, 221, 194, 85, 221, 194, 232, 109, 251, 218, 221, - 194, 71, 221, 194, 71, 114, 250, 131, 78, 217, 2, 232, 155, 50, 217, 54, - 246, 89, 254, 192, 245, 120, 223, 158, 244, 86, 223, 158, 242, 16, 213, - 174, 242, 16, 211, 198, 242, 16, 232, 109, 44, 225, 199, 225, 199, 214, - 160, 44, 225, 199, 71, 228, 231, 85, 228, 231, 250, 131, 78, 114, 250, - 131, 78, 230, 85, 211, 178, 114, 230, 85, 211, 178, 252, 157, 211, 178, - 114, 252, 157, 211, 178, 226, 127, 26, 249, 131, 114, 26, 249, 131, 204, - 250, 176, 249, 131, 114, 204, 250, 176, 249, 131, 7, 249, 131, 220, 92, - 71, 7, 249, 131, 226, 127, 7, 249, 131, 231, 188, 249, 131, 218, 158, 64, - 248, 150, 244, 12, 217, 16, 253, 217, 244, 12, 252, 158, 253, 217, 114, - 244, 12, 252, 158, 253, 217, 244, 12, 249, 244, 253, 217, 85, 244, 12, - 225, 10, 218, 157, 71, 244, 12, 225, 10, 218, 157, 219, 12, 218, 112, - 226, 127, 71, 218, 157, 37, 71, 218, 157, 204, 250, 176, 85, 218, 157, - 85, 250, 176, 71, 218, 157, 226, 127, 85, 218, 157, 114, 226, 127, 85, - 218, 157, 225, 61, 218, 157, 220, 92, 71, 218, 157, 114, 253, 217, 204, - 250, 176, 253, 217, 245, 194, 218, 245, 253, 217, 245, 194, 225, 10, 85, - 218, 157, 245, 194, 225, 10, 225, 61, 218, 157, 219, 126, 225, 10, 85, - 218, 157, 245, 194, 225, 10, 223, 115, 85, 218, 157, 114, 245, 194, 225, - 10, 223, 115, 85, 218, 157, 215, 77, 225, 10, 85, 218, 157, 219, 121, - 225, 10, 253, 217, 217, 16, 253, 217, 204, 250, 176, 217, 16, 253, 217, - 114, 217, 16, 253, 217, 219, 126, 225, 158, 85, 22, 71, 244, 55, 85, 244, - 55, 71, 244, 55, 245, 194, 225, 158, 226, 127, 85, 244, 55, 37, 204, 250, - 176, 245, 194, 225, 10, 218, 157, 114, 217, 16, 225, 61, 253, 217, 219, - 63, 216, 106, 215, 219, 219, 63, 114, 250, 115, 219, 63, 219, 14, 114, - 219, 14, 252, 158, 253, 217, 245, 194, 217, 16, 224, 172, 253, 217, 114, - 245, 194, 217, 16, 224, 172, 253, 217, 249, 132, 78, 220, 92, 71, 250, - 36, 152, 92, 249, 132, 78, 232, 109, 44, 246, 87, 71, 218, 235, 214, 160, - 44, 246, 87, 71, 218, 235, 232, 109, 44, 220, 92, 71, 218, 235, 214, 160, - 44, 220, 92, 71, 218, 235, 85, 224, 14, 164, 226, 148, 71, 224, 14, 164, - 226, 148, 71, 245, 32, 164, 226, 148, 85, 247, 250, 230, 183, 71, 211, - 178, 114, 245, 32, 164, 87, 192, 67, 130, 231, 83, 67, 130, 114, 67, 130, - 114, 219, 156, 215, 94, 249, 221, 223, 255, 164, 226, 148, 114, 219, 156, - 249, 221, 223, 255, 164, 226, 148, 114, 52, 215, 94, 249, 221, 223, 255, - 164, 226, 148, 114, 52, 249, 221, 223, 255, 164, 226, 148, 114, 121, 219, - 156, 249, 221, 223, 255, 164, 226, 148, 114, 121, 52, 249, 221, 223, 255, - 164, 226, 148, 249, 92, 218, 141, 226, 16, 5, 226, 148, 114, 245, 32, - 164, 226, 148, 114, 241, 229, 245, 32, 164, 226, 148, 114, 85, 241, 228, - 222, 188, 114, 85, 241, 229, 251, 114, 244, 56, 241, 228, 222, 188, 244, - 56, 241, 229, 251, 114, 231, 83, 43, 226, 5, 226, 148, 231, 83, 44, 226, - 5, 226, 148, 231, 83, 244, 64, 43, 226, 5, 226, 148, 231, 83, 244, 64, - 44, 226, 5, 226, 148, 231, 83, 233, 43, 254, 111, 251, 159, 226, 148, - 231, 83, 222, 248, 254, 111, 251, 159, 226, 148, 114, 233, 43, 254, 111, - 223, 255, 164, 226, 148, 114, 222, 248, 254, 111, 223, 255, 164, 226, - 148, 114, 233, 43, 254, 111, 251, 159, 226, 148, 114, 222, 248, 254, 111, - 251, 159, 226, 148, 192, 43, 216, 7, 220, 54, 251, 159, 226, 148, 192, - 44, 216, 7, 220, 54, 251, 159, 226, 148, 231, 83, 43, 249, 100, 251, 159, - 226, 148, 231, 83, 44, 249, 100, 251, 159, 226, 148, 247, 205, 152, 37, - 21, 110, 247, 205, 152, 37, 21, 105, 247, 205, 152, 37, 21, 158, 247, - 205, 152, 37, 21, 161, 247, 205, 152, 37, 21, 189, 247, 205, 152, 37, 21, - 194, 247, 205, 152, 37, 21, 198, 247, 205, 152, 37, 21, 195, 247, 205, - 152, 37, 21, 200, 247, 205, 152, 37, 54, 216, 248, 247, 205, 37, 35, 21, - 110, 247, 205, 37, 35, 21, 105, 247, 205, 37, 35, 21, 158, 247, 205, 37, - 35, 21, 161, 247, 205, 37, 35, 21, 189, 247, 205, 37, 35, 21, 194, 247, - 205, 37, 35, 21, 198, 247, 205, 37, 35, 21, 195, 247, 205, 37, 35, 21, - 200, 247, 205, 37, 35, 54, 216, 248, 247, 205, 152, 37, 35, 21, 110, 247, - 205, 152, 37, 35, 21, 105, 247, 205, 152, 37, 35, 21, 158, 247, 205, 152, - 37, 35, 21, 161, 247, 205, 152, 37, 35, 21, 189, 247, 205, 152, 37, 35, - 21, 194, 247, 205, 152, 37, 35, 21, 198, 247, 205, 152, 37, 35, 21, 195, - 247, 205, 152, 37, 35, 21, 200, 247, 205, 152, 37, 35, 54, 216, 248, 114, - 211, 246, 97, 74, 114, 96, 50, 114, 230, 183, 50, 114, 247, 170, 50, 114, - 219, 29, 245, 221, 74, 114, 97, 74, 114, 228, 57, 245, 221, 74, 246, 99, - 225, 12, 97, 74, 114, 222, 185, 97, 74, 215, 225, 97, 74, 114, 215, 225, - 97, 74, 248, 156, 215, 225, 97, 74, 114, 248, 156, 215, 225, 97, 74, 85, - 97, 74, 216, 145, 216, 13, 97, 253, 250, 216, 145, 251, 174, 97, 253, - 250, 85, 97, 253, 250, 114, 85, 249, 92, 246, 105, 22, 97, 74, 114, 85, - 249, 92, 214, 153, 22, 97, 74, 218, 232, 85, 97, 74, 114, 249, 207, 85, - 97, 74, 222, 247, 71, 97, 74, 233, 42, 71, 97, 74, 252, 184, 220, 92, 71, - 97, 74, 243, 242, 220, 92, 71, 97, 74, 114, 232, 109, 222, 246, 71, 97, - 74, 114, 214, 160, 222, 246, 71, 97, 74, 228, 50, 232, 109, 222, 246, 71, - 97, 74, 249, 100, 232, 124, 228, 50, 214, 160, 222, 246, 71, 97, 74, 37, - 114, 71, 97, 74, 211, 252, 97, 74, 251, 221, 219, 29, 245, 221, 74, 251, - 221, 97, 74, 251, 221, 228, 57, 245, 221, 74, 114, 251, 221, 219, 29, - 245, 221, 74, 114, 251, 221, 97, 74, 114, 251, 221, 228, 57, 245, 221, - 74, 217, 18, 97, 74, 114, 217, 17, 97, 74, 212, 18, 97, 74, 114, 212, 18, - 97, 74, 226, 173, 97, 74, 52, 249, 100, 232, 124, 134, 247, 215, 254, - 110, 71, 215, 227, 249, 188, 4, 71, 215, 226, 225, 172, 204, 218, 64, - 204, 218, 22, 43, 222, 91, 252, 174, 248, 61, 44, 222, 91, 252, 174, 248, - 61, 177, 2, 59, 235, 216, 223, 51, 219, 48, 224, 202, 218, 64, 218, 23, - 224, 202, 219, 47, 67, 252, 142, 2, 203, 91, 11, 222, 229, 247, 255, 199, - 247, 169, 11, 244, 176, 247, 255, 92, 232, 147, 254, 119, 92, 232, 147, - 226, 159, 71, 247, 250, 2, 250, 174, 247, 121, 22, 2, 247, 121, 245, 171, - 64, 226, 171, 214, 152, 232, 109, 44, 249, 162, 2, 247, 121, 214, 160, - 43, 249, 162, 2, 247, 121, 43, 226, 129, 235, 67, 44, 226, 129, 235, 67, - 243, 230, 226, 129, 235, 67, 233, 86, 120, 217, 88, 233, 86, 124, 217, - 88, 43, 22, 44, 52, 215, 93, 43, 22, 44, 217, 88, 43, 230, 88, 199, 44, - 217, 88, 199, 43, 217, 88, 120, 217, 89, 2, 250, 37, 48, 232, 106, 247, - 174, 251, 79, 203, 222, 134, 71, 249, 206, 247, 249, 71, 249, 206, 247, - 250, 2, 140, 216, 115, 71, 249, 206, 247, 250, 2, 97, 216, 115, 71, 42, - 2, 140, 216, 115, 71, 42, 2, 97, 216, 115, 11, 43, 71, 42, 127, 11, 44, - 71, 42, 127, 11, 43, 254, 111, 127, 11, 44, 254, 111, 127, 11, 43, 52, - 254, 111, 127, 11, 44, 52, 254, 111, 127, 11, 43, 71, 216, 7, 220, 54, - 127, 11, 44, 71, 216, 7, 220, 54, 127, 11, 43, 244, 64, 226, 4, 11, 44, - 244, 64, 226, 4, 214, 153, 224, 25, 74, 246, 105, 224, 25, 74, 254, 89, - 243, 99, 250, 37, 74, 250, 3, 243, 99, 250, 37, 74, 44, 80, 2, 37, 225, - 23, 199, 140, 74, 199, 97, 74, 199, 43, 44, 74, 199, 140, 52, 74, 199, - 97, 52, 74, 199, 43, 44, 52, 74, 199, 140, 80, 243, 244, 130, 199, 97, - 80, 243, 244, 130, 199, 140, 52, 80, 243, 244, 130, 199, 97, 52, 80, 243, - 244, 130, 199, 97, 218, 231, 74, 46, 47, 251, 216, 46, 47, 247, 118, 46, - 47, 246, 246, 46, 47, 247, 117, 46, 47, 246, 182, 46, 47, 247, 53, 46, - 47, 246, 245, 46, 47, 247, 116, 46, 47, 246, 150, 46, 47, 247, 21, 46, - 47, 246, 213, 46, 47, 247, 84, 46, 47, 246, 181, 46, 47, 247, 52, 46, 47, - 246, 244, 46, 47, 247, 115, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47, + 241, 59, 48, 7, 4, 1, 160, 2, 241, 59, 48, 7, 6, 1, 160, 2, 184, 7, 4, 1, + 160, 2, 184, 7, 6, 1, 160, 2, 250, 39, 22, 142, 7, 4, 1, 160, 2, 250, 39, + 22, 142, 7, 6, 1, 160, 2, 250, 39, 22, 242, 143, 7, 4, 1, 160, 2, 250, + 39, 22, 242, 143, 7, 6, 1, 160, 2, 250, 39, 22, 241, 59, 48, 7, 4, 1, + 160, 2, 250, 39, 22, 241, 59, 48, 7, 6, 1, 160, 2, 250, 39, 22, 184, 7, + 4, 1, 160, 2, 250, 39, 22, 184, 7, 6, 1, 160, 2, 250, 39, 22, 59, 51, 7, + 4, 1, 160, 2, 250, 39, 22, 59, 51, 7, 6, 1, 240, 161, 2, 241, 59, 48, 7, + 4, 1, 240, 161, 2, 241, 59, 48, 7, 6, 1, 240, 161, 2, 59, 51, 7, 4, 1, + 240, 161, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7, + 6, 1, 144, 2, 241, 59, 48, 7, 4, 1, 144, 2, 241, 59, 48, 7, 6, 1, 144, 2, + 250, 39, 22, 142, 7, 4, 1, 144, 2, 250, 39, 22, 142, 7, 6, 1, 144, 2, + 250, 39, 22, 242, 143, 7, 4, 1, 144, 2, 250, 39, 22, 242, 143, 7, 6, 1, + 144, 2, 250, 39, 22, 241, 59, 48, 7, 4, 1, 144, 2, 250, 39, 22, 241, 59, + 48, 7, 6, 1, 144, 2, 250, 39, 22, 184, 7, 4, 1, 144, 2, 250, 39, 22, 184, + 7, 6, 1, 144, 2, 250, 39, 22, 59, 51, 7, 4, 1, 144, 2, 250, 39, 22, 59, + 51, 7, 6, 1, 144, 2, 241, 0, 22, 142, 7, 4, 1, 144, 2, 241, 0, 22, 142, + 7, 6, 1, 144, 2, 241, 0, 22, 242, 143, 7, 4, 1, 144, 2, 241, 0, 22, 242, + 143, 7, 6, 1, 144, 2, 241, 0, 22, 241, 59, 48, 7, 4, 1, 144, 2, 241, 0, + 22, 241, 59, 48, 7, 6, 1, 144, 2, 241, 0, 22, 184, 7, 4, 1, 144, 2, 241, + 0, 22, 184, 7, 6, 1, 144, 2, 241, 0, 22, 59, 51, 7, 4, 1, 144, 2, 241, 0, + 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1, 104, 2, 59, 51, 7, 6, 1, + 104, 2, 241, 59, 48, 7, 4, 1, 104, 2, 241, 59, 48, 7, 6, 1, 104, 2, 241, + 0, 22, 142, 7, 4, 1, 104, 2, 241, 0, 22, 142, 7, 6, 1, 104, 2, 241, 0, + 22, 242, 143, 7, 4, 1, 104, 2, 241, 0, 22, 242, 143, 7, 6, 1, 104, 2, + 241, 0, 22, 241, 59, 48, 7, 4, 1, 104, 2, 241, 0, 22, 241, 59, 48, 7, 6, + 1, 104, 2, 241, 0, 22, 184, 7, 4, 1, 104, 2, 241, 0, 22, 184, 7, 6, 1, + 104, 2, 241, 0, 22, 59, 51, 7, 4, 1, 104, 2, 241, 0, 22, 59, 51, 7, 6, 1, + 211, 118, 2, 242, 143, 7, 4, 1, 211, 118, 2, 242, 143, 7, 6, 1, 211, 118, + 2, 59, 51, 7, 4, 1, 211, 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 59, + 48, 7, 4, 1, 211, 118, 2, 241, 59, 48, 7, 6, 1, 211, 118, 2, 184, 7, 4, + 1, 211, 118, 2, 184, 7, 6, 1, 230, 228, 232, 191, 7, 4, 1, 230, 228, 232, + 191, 7, 6, 1, 230, 228, 214, 105, 7, 4, 1, 230, 228, 214, 105, 7, 6, 1, + 211, 118, 2, 232, 129, 7, 4, 1, 211, 118, 2, 232, 129, 26, 4, 1, 254, + 152, 2, 224, 157, 26, 4, 1, 254, 152, 2, 248, 161, 26, 4, 1, 254, 152, 2, + 224, 158, 22, 214, 13, 26, 4, 1, 254, 152, 2, 248, 162, 22, 214, 13, 26, + 4, 1, 254, 152, 2, 224, 158, 22, 226, 114, 26, 4, 1, 254, 152, 2, 248, + 162, 22, 226, 114, 26, 4, 1, 254, 152, 2, 224, 158, 22, 225, 178, 26, 4, + 1, 254, 152, 2, 248, 162, 22, 225, 178, 26, 6, 1, 254, 152, 2, 224, 157, + 26, 6, 1, 254, 152, 2, 248, 161, 26, 6, 1, 254, 152, 2, 224, 158, 22, + 214, 13, 26, 6, 1, 254, 152, 2, 248, 162, 22, 214, 13, 26, 6, 1, 254, + 152, 2, 224, 158, 22, 226, 114, 26, 6, 1, 254, 152, 2, 248, 162, 22, 226, + 114, 26, 6, 1, 254, 152, 2, 224, 158, 22, 225, 178, 26, 6, 1, 254, 152, + 2, 248, 162, 22, 225, 178, 26, 4, 1, 245, 109, 2, 224, 157, 26, 4, 1, + 245, 109, 2, 248, 161, 26, 4, 1, 245, 109, 2, 224, 158, 22, 214, 13, 26, + 4, 1, 245, 109, 2, 248, 162, 22, 214, 13, 26, 4, 1, 245, 109, 2, 224, + 158, 22, 226, 114, 26, 4, 1, 245, 109, 2, 248, 162, 22, 226, 114, 26, 6, + 1, 245, 109, 2, 224, 157, 26, 6, 1, 245, 109, 2, 248, 161, 26, 6, 1, 245, + 109, 2, 224, 158, 22, 214, 13, 26, 6, 1, 245, 109, 2, 248, 162, 22, 214, + 13, 26, 6, 1, 245, 109, 2, 224, 158, 22, 226, 114, 26, 6, 1, 245, 109, 2, + 248, 162, 22, 226, 114, 26, 4, 1, 245, 72, 2, 224, 157, 26, 4, 1, 245, + 72, 2, 248, 161, 26, 4, 1, 245, 72, 2, 224, 158, 22, 214, 13, 26, 4, 1, + 245, 72, 2, 248, 162, 22, 214, 13, 26, 4, 1, 245, 72, 2, 224, 158, 22, + 226, 114, 26, 4, 1, 245, 72, 2, 248, 162, 22, 226, 114, 26, 4, 1, 245, + 72, 2, 224, 158, 22, 225, 178, 26, 4, 1, 245, 72, 2, 248, 162, 22, 225, + 178, 26, 6, 1, 245, 72, 2, 224, 157, 26, 6, 1, 245, 72, 2, 248, 161, 26, + 6, 1, 245, 72, 2, 224, 158, 22, 214, 13, 26, 6, 1, 245, 72, 2, 248, 162, + 22, 214, 13, 26, 6, 1, 245, 72, 2, 224, 158, 22, 226, 114, 26, 6, 1, 245, + 72, 2, 248, 162, 22, 226, 114, 26, 6, 1, 245, 72, 2, 224, 158, 22, 225, + 178, 26, 6, 1, 245, 72, 2, 248, 162, 22, 225, 178, 26, 4, 1, 235, 193, 2, + 224, 157, 26, 4, 1, 235, 193, 2, 248, 161, 26, 4, 1, 235, 193, 2, 224, + 158, 22, 214, 13, 26, 4, 1, 235, 193, 2, 248, 162, 22, 214, 13, 26, 4, 1, + 235, 193, 2, 224, 158, 22, 226, 114, 26, 4, 1, 235, 193, 2, 248, 162, 22, + 226, 114, 26, 4, 1, 235, 193, 2, 224, 158, 22, 225, 178, 26, 4, 1, 235, + 193, 2, 248, 162, 22, 225, 178, 26, 6, 1, 235, 193, 2, 224, 157, 26, 6, + 1, 235, 193, 2, 248, 161, 26, 6, 1, 235, 193, 2, 224, 158, 22, 214, 13, + 26, 6, 1, 235, 193, 2, 248, 162, 22, 214, 13, 26, 6, 1, 235, 193, 2, 224, + 158, 22, 226, 114, 26, 6, 1, 235, 193, 2, 248, 162, 22, 226, 114, 26, 6, + 1, 235, 193, 2, 224, 158, 22, 225, 178, 26, 6, 1, 235, 193, 2, 248, 162, + 22, 225, 178, 26, 4, 1, 226, 204, 2, 224, 157, 26, 4, 1, 226, 204, 2, + 248, 161, 26, 4, 1, 226, 204, 2, 224, 158, 22, 214, 13, 26, 4, 1, 226, + 204, 2, 248, 162, 22, 214, 13, 26, 4, 1, 226, 204, 2, 224, 158, 22, 226, + 114, 26, 4, 1, 226, 204, 2, 248, 162, 22, 226, 114, 26, 6, 1, 226, 204, + 2, 224, 157, 26, 6, 1, 226, 204, 2, 248, 161, 26, 6, 1, 226, 204, 2, 224, + 158, 22, 214, 13, 26, 6, 1, 226, 204, 2, 248, 162, 22, 214, 13, 26, 6, 1, + 226, 204, 2, 224, 158, 22, 226, 114, 26, 6, 1, 226, 204, 2, 248, 162, 22, + 226, 114, 26, 4, 1, 214, 158, 2, 224, 157, 26, 4, 1, 214, 158, 2, 248, + 161, 26, 4, 1, 214, 158, 2, 224, 158, 22, 214, 13, 26, 4, 1, 214, 158, 2, + 248, 162, 22, 214, 13, 26, 4, 1, 214, 158, 2, 224, 158, 22, 226, 114, 26, + 4, 1, 214, 158, 2, 248, 162, 22, 226, 114, 26, 4, 1, 214, 158, 2, 224, + 158, 22, 225, 178, 26, 4, 1, 214, 158, 2, 248, 162, 22, 225, 178, 26, 6, + 1, 214, 158, 2, 248, 161, 26, 6, 1, 214, 158, 2, 248, 162, 22, 214, 13, + 26, 6, 1, 214, 158, 2, 248, 162, 22, 226, 114, 26, 6, 1, 214, 158, 2, + 248, 162, 22, 225, 178, 26, 4, 1, 226, 206, 2, 224, 157, 26, 4, 1, 226, + 206, 2, 248, 161, 26, 4, 1, 226, 206, 2, 224, 158, 22, 214, 13, 26, 4, 1, + 226, 206, 2, 248, 162, 22, 214, 13, 26, 4, 1, 226, 206, 2, 224, 158, 22, + 226, 114, 26, 4, 1, 226, 206, 2, 248, 162, 22, 226, 114, 26, 4, 1, 226, + 206, 2, 224, 158, 22, 225, 178, 26, 4, 1, 226, 206, 2, 248, 162, 22, 225, + 178, 26, 6, 1, 226, 206, 2, 224, 157, 26, 6, 1, 226, 206, 2, 248, 161, + 26, 6, 1, 226, 206, 2, 224, 158, 22, 214, 13, 26, 6, 1, 226, 206, 2, 248, + 162, 22, 214, 13, 26, 6, 1, 226, 206, 2, 224, 158, 22, 226, 114, 26, 6, + 1, 226, 206, 2, 248, 162, 22, 226, 114, 26, 6, 1, 226, 206, 2, 224, 158, + 22, 225, 178, 26, 6, 1, 226, 206, 2, 248, 162, 22, 225, 178, 26, 4, 1, + 254, 152, 2, 214, 13, 26, 4, 1, 254, 152, 2, 226, 114, 26, 4, 1, 245, + 109, 2, 214, 13, 26, 4, 1, 245, 109, 2, 226, 114, 26, 4, 1, 245, 72, 2, + 214, 13, 26, 4, 1, 245, 72, 2, 226, 114, 26, 4, 1, 235, 193, 2, 214, 13, + 26, 4, 1, 235, 193, 2, 226, 114, 26, 4, 1, 226, 204, 2, 214, 13, 26, 4, + 1, 226, 204, 2, 226, 114, 26, 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, + 158, 2, 226, 114, 26, 4, 1, 226, 206, 2, 214, 13, 26, 4, 1, 226, 206, 2, + 226, 114, 26, 4, 1, 254, 152, 2, 224, 158, 22, 210, 219, 26, 4, 1, 254, + 152, 2, 248, 162, 22, 210, 219, 26, 4, 1, 254, 152, 2, 224, 158, 22, 214, + 14, 22, 210, 219, 26, 4, 1, 254, 152, 2, 248, 162, 22, 214, 14, 22, 210, + 219, 26, 4, 1, 254, 152, 2, 224, 158, 22, 226, 115, 22, 210, 219, 26, 4, + 1, 254, 152, 2, 248, 162, 22, 226, 115, 22, 210, 219, 26, 4, 1, 254, 152, + 2, 224, 158, 22, 225, 179, 22, 210, 219, 26, 4, 1, 254, 152, 2, 248, 162, + 22, 225, 179, 22, 210, 219, 26, 6, 1, 254, 152, 2, 224, 158, 22, 224, + 170, 26, 6, 1, 254, 152, 2, 248, 162, 22, 224, 170, 26, 6, 1, 254, 152, + 2, 224, 158, 22, 214, 14, 22, 224, 170, 26, 6, 1, 254, 152, 2, 248, 162, + 22, 214, 14, 22, 224, 170, 26, 6, 1, 254, 152, 2, 224, 158, 22, 226, 115, + 22, 224, 170, 26, 6, 1, 254, 152, 2, 248, 162, 22, 226, 115, 22, 224, + 170, 26, 6, 1, 254, 152, 2, 224, 158, 22, 225, 179, 22, 224, 170, 26, 6, + 1, 254, 152, 2, 248, 162, 22, 225, 179, 22, 224, 170, 26, 4, 1, 245, 72, + 2, 224, 158, 22, 210, 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 210, 219, + 26, 4, 1, 245, 72, 2, 224, 158, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, + 72, 2, 248, 162, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 72, 2, 224, + 158, 22, 226, 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 226, + 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 224, 158, 22, 225, 179, 22, 210, + 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 225, 179, 22, 210, 219, 26, 6, + 1, 245, 72, 2, 224, 158, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, 162, + 22, 224, 170, 26, 6, 1, 245, 72, 2, 224, 158, 22, 214, 14, 22, 224, 170, + 26, 6, 1, 245, 72, 2, 248, 162, 22, 214, 14, 22, 224, 170, 26, 6, 1, 245, + 72, 2, 224, 158, 22, 226, 115, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, + 162, 22, 226, 115, 22, 224, 170, 26, 6, 1, 245, 72, 2, 224, 158, 22, 225, + 179, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, 162, 22, 225, 179, 22, 224, + 170, 26, 4, 1, 226, 206, 2, 224, 158, 22, 210, 219, 26, 4, 1, 226, 206, + 2, 248, 162, 22, 210, 219, 26, 4, 1, 226, 206, 2, 224, 158, 22, 214, 14, + 22, 210, 219, 26, 4, 1, 226, 206, 2, 248, 162, 22, 214, 14, 22, 210, 219, + 26, 4, 1, 226, 206, 2, 224, 158, 22, 226, 115, 22, 210, 219, 26, 4, 1, + 226, 206, 2, 248, 162, 22, 226, 115, 22, 210, 219, 26, 4, 1, 226, 206, 2, + 224, 158, 22, 225, 179, 22, 210, 219, 26, 4, 1, 226, 206, 2, 248, 162, + 22, 225, 179, 22, 210, 219, 26, 6, 1, 226, 206, 2, 224, 158, 22, 224, + 170, 26, 6, 1, 226, 206, 2, 248, 162, 22, 224, 170, 26, 6, 1, 226, 206, + 2, 224, 158, 22, 214, 14, 22, 224, 170, 26, 6, 1, 226, 206, 2, 248, 162, + 22, 214, 14, 22, 224, 170, 26, 6, 1, 226, 206, 2, 224, 158, 22, 226, 115, + 22, 224, 170, 26, 6, 1, 226, 206, 2, 248, 162, 22, 226, 115, 22, 224, + 170, 26, 6, 1, 226, 206, 2, 224, 158, 22, 225, 179, 22, 224, 170, 26, 6, + 1, 226, 206, 2, 248, 162, 22, 225, 179, 22, 224, 170, 26, 4, 1, 254, 152, + 2, 213, 120, 26, 4, 1, 254, 152, 2, 231, 237, 26, 4, 1, 254, 152, 2, 214, + 14, 22, 210, 219, 26, 4, 1, 254, 152, 2, 210, 219, 26, 4, 1, 254, 152, 2, + 226, 115, 22, 210, 219, 26, 4, 1, 254, 152, 2, 225, 178, 26, 4, 1, 254, + 152, 2, 225, 179, 22, 210, 219, 26, 6, 1, 254, 152, 2, 213, 120, 26, 6, + 1, 254, 152, 2, 231, 237, 26, 6, 1, 254, 152, 2, 214, 13, 26, 6, 1, 254, + 152, 2, 226, 114, 26, 6, 1, 254, 152, 2, 224, 170, 26, 234, 8, 26, 224, + 170, 26, 224, 157, 26, 225, 178, 26, 248, 4, 22, 225, 178, 26, 4, 1, 245, + 72, 2, 214, 14, 22, 210, 219, 26, 4, 1, 245, 72, 2, 210, 219, 26, 4, 1, + 245, 72, 2, 226, 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 225, 178, 26, + 4, 1, 245, 72, 2, 225, 179, 22, 210, 219, 26, 6, 1, 245, 109, 2, 214, 13, + 26, 6, 1, 245, 109, 2, 226, 114, 26, 6, 1, 245, 72, 2, 214, 13, 26, 6, 1, + 245, 72, 2, 226, 114, 26, 6, 1, 245, 72, 2, 224, 170, 26, 224, 158, 22, + 214, 13, 26, 224, 158, 22, 226, 114, 26, 224, 158, 22, 225, 178, 26, 4, + 1, 235, 193, 2, 213, 120, 26, 4, 1, 235, 193, 2, 231, 237, 26, 4, 1, 235, + 193, 2, 248, 4, 22, 214, 13, 26, 4, 1, 235, 193, 2, 248, 4, 22, 226, 114, + 26, 4, 1, 235, 193, 2, 225, 178, 26, 4, 1, 235, 193, 2, 248, 4, 22, 225, + 178, 26, 6, 1, 235, 193, 2, 213, 120, 26, 6, 1, 235, 193, 2, 231, 237, + 26, 6, 1, 235, 193, 2, 214, 13, 26, 6, 1, 235, 193, 2, 226, 114, 26, 248, + 162, 22, 214, 13, 26, 248, 162, 22, 226, 114, 26, 248, 162, 22, 225, 178, + 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 237, 26, 4, + 1, 214, 158, 2, 248, 4, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 4, 22, + 226, 114, 26, 4, 1, 223, 41, 2, 224, 157, 26, 4, 1, 223, 41, 2, 248, 161, + 26, 4, 1, 214, 158, 2, 225, 178, 26, 4, 1, 214, 158, 2, 248, 4, 22, 225, + 178, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2, 231, 237, + 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226, 114, 26, 6, + 1, 223, 41, 2, 248, 161, 26, 248, 4, 22, 214, 13, 26, 248, 4, 22, 226, + 114, 26, 214, 13, 26, 4, 1, 226, 206, 2, 214, 14, 22, 210, 219, 26, 4, 1, + 226, 206, 2, 210, 219, 26, 4, 1, 226, 206, 2, 226, 115, 22, 210, 219, 26, + 4, 1, 226, 206, 2, 225, 178, 26, 4, 1, 226, 206, 2, 225, 179, 22, 210, + 219, 26, 6, 1, 226, 204, 2, 214, 13, 26, 6, 1, 226, 204, 2, 226, 114, 26, + 6, 1, 226, 206, 2, 214, 13, 26, 6, 1, 226, 206, 2, 226, 114, 26, 6, 1, + 226, 206, 2, 224, 170, 26, 226, 114, 26, 248, 161, 245, 159, 224, 30, + 245, 168, 224, 30, 245, 159, 219, 20, 245, 168, 219, 20, 216, 142, 219, + 20, 244, 17, 219, 20, 219, 125, 219, 20, 244, 120, 219, 20, 224, 144, + 219, 20, 216, 171, 219, 20, 242, 42, 219, 20, 210, 87, 211, 245, 219, 20, + 210, 87, 211, 245, 228, 72, 210, 87, 211, 245, 235, 69, 233, 44, 79, 222, + 246, 79, 240, 175, 228, 73, 240, 175, 244, 120, 248, 164, 245, 159, 248, + 164, 245, 168, 248, 164, 203, 130, 52, 67, 232, 219, 52, 121, 232, 219, + 43, 219, 157, 224, 1, 79, 44, 219, 157, 224, 1, 79, 219, 157, 232, 115, + 224, 1, 79, 219, 157, 241, 170, 224, 1, 79, 43, 52, 224, 1, 79, 44, 52, + 224, 1, 79, 52, 232, 115, 224, 1, 79, 52, 241, 170, 224, 1, 79, 248, 213, + 52, 248, 213, 251, 121, 215, 223, 251, 121, 123, 59, 233, 62, 113, 59, + 233, 62, 203, 245, 171, 240, 173, 225, 13, 232, 220, 220, 139, 226, 19, + 220, 139, 233, 44, 245, 166, 222, 246, 245, 166, 224, 249, 247, 204, 244, + 27, 233, 44, 226, 121, 222, 246, 226, 121, 229, 199, 228, 78, 219, 20, + 225, 186, 230, 198, 50, 225, 186, 216, 249, 216, 149, 50, 224, 193, 52, + 224, 193, 215, 212, 224, 193, 223, 52, 224, 193, 223, 52, 52, 224, 193, + 223, 52, 215, 212, 224, 193, 250, 246, 219, 157, 233, 48, 254, 118, 224, + 1, 79, 219, 157, 222, 250, 254, 118, 224, 1, 79, 223, 110, 79, 52, 245, + 39, 79, 235, 208, 226, 123, 214, 180, 135, 216, 112, 250, 247, 235, 223, + 225, 13, 253, 222, 240, 176, 251, 121, 244, 10, 219, 97, 43, 42, 251, + 166, 2, 224, 10, 44, 42, 251, 166, 2, 224, 10, 52, 224, 16, 79, 224, 16, + 245, 39, 79, 245, 39, 224, 16, 79, 216, 71, 5, 245, 73, 223, 52, 225, 71, + 50, 85, 140, 251, 121, 85, 97, 251, 121, 121, 253, 224, 223, 52, 220, + 152, 250, 9, 214, 163, 113, 253, 223, 254, 167, 213, 188, 249, 225, 230, + 187, 50, 217, 235, 248, 164, 235, 200, 214, 180, 244, 60, 224, 144, 79, + 134, 59, 224, 143, 224, 27, 224, 193, 244, 19, 59, 224, 143, 244, 89, 59, + 224, 143, 113, 59, 224, 143, 244, 19, 59, 79, 246, 126, 249, 138, 215, + 222, 67, 244, 19, 247, 126, 231, 87, 11, 219, 20, 211, 209, 235, 69, 243, + 234, 254, 60, 235, 198, 216, 86, 235, 198, 220, 139, 235, 198, 225, 25, + 233, 44, 235, 171, 222, 246, 235, 171, 244, 100, 218, 91, 235, 171, 224, + 249, 247, 204, 235, 171, 235, 235, 217, 183, 217, 252, 255, 14, 217, 183, + 217, 252, 235, 235, 9, 244, 28, 220, 82, 255, 14, 9, 244, 28, 220, 82, + 229, 194, 21, 220, 83, 228, 74, 21, 220, 83, 218, 24, 210, 86, 218, 24, + 7, 4, 1, 74, 218, 24, 161, 218, 24, 190, 218, 24, 195, 218, 24, 199, 218, + 24, 196, 218, 24, 201, 218, 24, 96, 50, 218, 24, 230, 186, 218, 24, 245, + 106, 50, 218, 24, 43, 226, 7, 218, 24, 44, 226, 7, 218, 24, 7, 4, 1, 230, + 30, 218, 66, 210, 86, 218, 66, 111, 218, 66, 105, 218, 66, 158, 218, 66, + 161, 218, 66, 190, 218, 66, 195, 218, 66, 199, 218, 66, 196, 218, 66, + 201, 218, 66, 96, 50, 218, 66, 230, 186, 218, 66, 245, 106, 50, 218, 66, + 43, 226, 7, 218, 66, 44, 226, 7, 7, 218, 66, 4, 1, 61, 7, 218, 66, 4, 1, + 76, 7, 218, 66, 4, 1, 78, 7, 218, 66, 4, 1, 211, 178, 7, 218, 66, 4, 1, + 221, 197, 7, 218, 66, 4, 1, 242, 67, 7, 218, 66, 4, 1, 235, 29, 7, 218, + 66, 4, 1, 156, 7, 218, 66, 4, 1, 194, 7, 218, 66, 4, 1, 230, 30, 7, 218, + 66, 4, 1, 226, 109, 7, 218, 66, 4, 1, 222, 93, 7, 218, 66, 4, 1, 217, + 153, 245, 54, 50, 249, 235, 50, 249, 125, 50, 244, 3, 244, 6, 50, 232, + 204, 50, 230, 199, 50, 229, 215, 50, 225, 165, 50, 222, 120, 50, 211, + 217, 50, 166, 220, 51, 50, 247, 135, 50, 245, 55, 50, 234, 82, 50, 215, + 113, 50, 246, 109, 50, 243, 47, 225, 196, 50, 225, 163, 50, 242, 116, 50, + 253, 190, 50, 240, 235, 50, 250, 193, 50, 232, 197, 216, 4, 50, 219, 2, + 50, 216, 246, 50, 235, 248, 222, 120, 50, 215, 97, 232, 204, 50, 38, 43, + 242, 6, 48, 38, 44, 242, 6, 48, 38, 200, 67, 232, 220, 226, 124, 38, 219, + 253, 67, 232, 220, 226, 124, 38, 254, 96, 80, 48, 38, 250, 10, 80, 48, + 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 237, 226, 124, 38, 250, 10, 222, + 237, 226, 124, 38, 254, 96, 222, 237, 226, 124, 38, 134, 170, 48, 38, + 244, 19, 170, 48, 38, 245, 154, 250, 43, 38, 245, 154, 218, 236, 38, 245, + 154, 248, 0, 38, 245, 154, 250, 44, 252, 188, 38, 43, 44, 80, 48, 38, + 245, 154, 221, 190, 38, 245, 154, 234, 141, 38, 245, 154, 214, 155, 225, + 10, 215, 226, 38, 223, 53, 219, 49, 226, 124, 38, 52, 67, 218, 105, 226, + 124, 38, 254, 106, 87, 38, 215, 212, 214, 182, 38, 211, 247, 251, 148, + 48, 38, 140, 80, 226, 124, 38, 200, 52, 219, 49, 226, 124, 38, 97, 242, + 6, 2, 252, 147, 246, 111, 38, 140, 242, 6, 2, 252, 147, 246, 111, 38, 43, + 80, 51, 38, 44, 80, 51, 38, 253, 225, 48, 255, 20, 226, 235, 255, 4, 216, + 43, 216, 197, 218, 75, 139, 6, 251, 74, 248, 79, 250, 186, 250, 183, 232, + 220, 87, 250, 248, 226, 235, 251, 34, 214, 189, 245, 56, 249, 199, 221, + 187, 248, 79, 244, 187, 119, 4, 243, 209, 119, 6, 242, 67, 251, 227, 6, + 242, 67, 139, 6, 242, 67, 225, 40, 249, 199, 225, 40, 249, 200, 115, 113, + 225, 111, 119, 6, 74, 251, 227, 6, 74, 119, 6, 156, 119, 4, 156, 233, + 155, 57, 252, 149, 87, 139, 6, 230, 30, 227, 200, 50, 219, 33, 223, 122, + 249, 170, 119, 6, 226, 109, 139, 6, 226, 109, 139, 6, 224, 99, 119, 6, + 153, 251, 227, 6, 153, 139, 6, 153, 224, 199, 217, 72, 223, 65, 220, 134, + 79, 217, 2, 50, 215, 254, 164, 50, 213, 240, 139, 6, 210, 159, 226, 137, + 50, 226, 225, 50, 235, 200, 226, 225, 50, 251, 227, 6, 210, 159, 215, 94, + 26, 4, 1, 235, 192, 234, 179, 50, 254, 115, 50, 119, 6, 253, 166, 251, + 227, 6, 251, 74, 245, 76, 87, 119, 4, 76, 119, 6, 76, 119, 6, 245, 14, + 215, 94, 6, 245, 14, 119, 6, 194, 119, 4, 78, 109, 87, 252, 37, 87, 242, + 209, 87, 248, 198, 87, 235, 239, 219, 31, 222, 189, 6, 224, 99, 244, 190, + 50, 139, 4, 225, 111, 139, 4, 243, 114, 139, 6, 243, 114, 139, 6, 225, + 111, 139, 230, 29, 218, 41, 215, 94, 35, 6, 243, 209, 215, 94, 35, 6, + 156, 223, 52, 35, 6, 156, 215, 94, 35, 6, 211, 117, 139, 32, 6, 249, 68, + 139, 32, 4, 249, 68, 139, 32, 4, 76, 139, 32, 4, 74, 139, 32, 4, 235, + 150, 224, 173, 232, 219, 215, 94, 254, 134, 225, 186, 50, 254, 189, 215, + 94, 4, 245, 14, 16, 31, 221, 254, 219, 31, 212, 114, 244, 10, 123, 220, + 120, 212, 114, 244, 10, 123, 228, 199, 212, 114, 244, 10, 123, 216, 242, + 212, 114, 244, 10, 123, 216, 169, 212, 114, 244, 10, 113, 216, 167, 212, + 114, 244, 10, 123, 244, 125, 212, 114, 244, 10, 113, 244, 124, 212, 114, + 244, 10, 134, 244, 124, 212, 114, 244, 10, 244, 19, 244, 124, 212, 114, + 244, 10, 123, 219, 117, 212, 114, 244, 10, 244, 89, 219, 115, 212, 114, + 244, 10, 123, 245, 196, 212, 114, 244, 10, 134, 245, 194, 212, 114, 244, + 10, 244, 89, 245, 194, 212, 114, 244, 10, 220, 124, 245, 194, 244, 10, + 227, 201, 111, 222, 200, 227, 202, 111, 222, 200, 227, 202, 105, 222, + 200, 227, 202, 158, 222, 200, 227, 202, 161, 222, 200, 227, 202, 190, + 222, 200, 227, 202, 195, 222, 200, 227, 202, 199, 222, 200, 227, 202, + 196, 222, 200, 227, 202, 201, 222, 200, 227, 202, 216, 248, 222, 200, + 227, 202, 245, 175, 222, 200, 227, 202, 215, 76, 222, 200, 227, 202, 244, + 122, 222, 200, 227, 202, 123, 240, 217, 222, 200, 227, 202, 244, 89, 240, + 217, 222, 200, 227, 202, 123, 216, 148, 4, 222, 200, 227, 202, 111, 4, + 222, 200, 227, 202, 105, 4, 222, 200, 227, 202, 158, 4, 222, 200, 227, + 202, 161, 4, 222, 200, 227, 202, 190, 4, 222, 200, 227, 202, 195, 4, 222, + 200, 227, 202, 199, 4, 222, 200, 227, 202, 196, 4, 222, 200, 227, 202, + 201, 4, 222, 200, 227, 202, 216, 248, 4, 222, 200, 227, 202, 245, 175, 4, + 222, 200, 227, 202, 215, 76, 4, 222, 200, 227, 202, 244, 122, 4, 222, + 200, 227, 202, 123, 240, 217, 4, 222, 200, 227, 202, 244, 89, 240, 217, + 4, 222, 200, 227, 202, 123, 216, 148, 222, 200, 227, 202, 123, 216, 149, + 251, 75, 249, 68, 222, 200, 227, 202, 244, 89, 216, 148, 222, 200, 227, + 202, 216, 249, 216, 148, 222, 200, 227, 202, 223, 52, 123, 240, 217, 7, + 4, 1, 223, 52, 251, 74, 222, 200, 227, 202, 219, 127, 233, 84, 17, 222, + 200, 227, 202, 244, 123, 245, 234, 17, 222, 200, 227, 202, 244, 123, 216, + 148, 222, 200, 227, 202, 123, 240, 218, 216, 148, 212, 114, 244, 10, 210, + 87, 216, 167, 140, 75, 214, 153, 75, 97, 75, 246, 112, 75, 43, 44, 75, + 120, 124, 75, 228, 61, 212, 9, 75, 228, 61, 245, 228, 75, 219, 30, 245, + 228, 75, 219, 30, 212, 9, 75, 140, 80, 2, 91, 97, 80, 2, 91, 140, 212, + 36, 75, 97, 212, 36, 75, 140, 113, 241, 241, 75, 214, 153, 113, 241, 241, + 75, 97, 113, 241, 241, 75, 246, 112, 113, 241, 241, 75, 140, 80, 2, 217, + 78, 97, 80, 2, 217, 78, 140, 80, 243, 251, 130, 214, 153, 80, 243, 251, + 130, 97, 80, 243, 251, 130, 246, 112, 80, 243, 251, 130, 120, 124, 80, 2, + 252, 135, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80, 2, 232, 129, 97, 80, + 2, 232, 129, 43, 44, 212, 36, 75, 43, 44, 80, 2, 91, 246, 112, 210, 35, + 75, 214, 153, 80, 2, 216, 78, 233, 43, 214, 153, 80, 2, 216, 78, 222, + 244, 246, 112, 80, 2, 216, 78, 233, 43, 246, 112, 80, 2, 216, 78, 222, + 244, 97, 80, 2, 249, 169, 246, 111, 246, 112, 80, 2, 249, 169, 233, 43, + 254, 96, 216, 15, 220, 155, 75, 250, 10, 216, 15, 220, 155, 75, 228, 61, + 212, 9, 80, 216, 43, 200, 130, 140, 80, 216, 43, 252, 149, 115, 97, 80, + 216, 43, 130, 254, 96, 204, 250, 44, 75, 250, 10, 204, 250, 44, 75, 140, + 242, 6, 2, 252, 147, 214, 152, 140, 242, 6, 2, 252, 147, 246, 111, 214, + 153, 242, 6, 2, 252, 147, 222, 244, 214, 153, 242, 6, 2, 252, 147, 233, + 43, 97, 242, 6, 2, 252, 147, 214, 152, 97, 242, 6, 2, 252, 147, 246, 111, + 246, 112, 242, 6, 2, 252, 147, 222, 244, 246, 112, 242, 6, 2, 252, 147, + 233, 43, 97, 80, 115, 140, 75, 214, 153, 80, 140, 64, 246, 112, 75, 140, + 80, 115, 97, 75, 140, 226, 74, 253, 255, 214, 153, 226, 74, 253, 255, 97, + 226, 74, 253, 255, 246, 112, 226, 74, 253, 255, 140, 242, 6, 115, 97, + 242, 5, 97, 242, 6, 115, 140, 242, 5, 140, 52, 80, 2, 91, 43, 44, 52, 80, + 2, 91, 97, 52, 80, 2, 91, 140, 52, 75, 214, 153, 52, 75, 97, 52, 75, 246, + 112, 52, 75, 43, 44, 52, 75, 120, 124, 52, 75, 228, 61, 212, 9, 52, 75, + 228, 61, 245, 228, 52, 75, 219, 30, 245, 228, 52, 75, 219, 30, 212, 9, + 52, 75, 140, 215, 212, 75, 97, 215, 212, 75, 140, 218, 232, 75, 97, 218, + 232, 75, 214, 153, 80, 2, 52, 91, 246, 112, 80, 2, 52, 91, 140, 248, 163, + 75, 214, 153, 248, 163, 75, 97, 248, 163, 75, 246, 112, 248, 163, 75, + 140, 80, 216, 43, 130, 97, 80, 216, 43, 130, 140, 71, 75, 214, 153, 71, + 75, 97, 71, 75, 246, 112, 71, 75, 214, 153, 71, 80, 243, 251, 130, 214, + 153, 71, 80, 226, 201, 225, 217, 214, 153, 71, 80, 226, 201, 225, 218, 2, + 203, 130, 214, 153, 71, 80, 226, 201, 225, 218, 2, 67, 130, 214, 153, 71, + 52, 75, 214, 153, 71, 52, 80, 226, 201, 225, 217, 97, 71, 80, 243, 251, + 212, 56, 228, 61, 212, 9, 80, 216, 43, 249, 168, 219, 30, 245, 228, 80, + 216, 43, 249, 168, 120, 124, 71, 75, 44, 80, 2, 4, 250, 43, 246, 112, 80, + 140, 64, 214, 153, 75, 134, 97, 253, 255, 140, 80, 2, 67, 91, 97, 80, 2, + 67, 91, 43, 44, 80, 2, 67, 91, 140, 80, 2, 52, 67, 91, 97, 80, 2, 52, 67, + 91, 43, 44, 80, 2, 52, 67, 91, 140, 226, 177, 75, 97, 226, 177, 75, 43, + 44, 226, 177, 75, 31, 254, 163, 249, 222, 226, 1, 247, 241, 216, 188, + 245, 35, 216, 188, 247, 146, 228, 57, 245, 36, 245, 160, 220, 129, 235, + 252, 229, 226, 245, 178, 226, 235, 228, 57, 254, 132, 245, 178, 226, 235, + 4, 245, 178, 226, 235, 249, 194, 253, 246, 231, 67, 247, 146, 228, 57, + 249, 196, 253, 246, 231, 67, 4, 249, 194, 253, 246, 231, 67, 245, 151, + 64, 224, 175, 230, 29, 224, 183, 230, 29, 249, 173, 230, 29, 218, 41, + 230, 187, 50, 230, 185, 50, 59, 225, 25, 247, 177, 219, 97, 220, 130, + 230, 186, 253, 225, 226, 171, 222, 237, 226, 171, 251, 122, 226, 171, 42, + 222, 195, 249, 117, 222, 195, 244, 12, 222, 195, 224, 171, 112, 235, 241, + 44, 254, 117, 254, 117, 231, 93, 254, 117, 219, 1, 254, 117, 247, 179, + 247, 146, 228, 57, 247, 182, 226, 12, 112, 228, 57, 226, 12, 112, 232, + 152, 254, 126, 232, 152, 226, 162, 235, 205, 214, 175, 235, 218, 52, 235, + 218, 215, 212, 235, 218, 249, 190, 235, 218, 218, 14, 235, 218, 213, 129, + 235, 218, 250, 10, 235, 218, 250, 10, 249, 190, 235, 218, 254, 96, 249, + 190, 235, 218, 216, 187, 252, 75, 223, 140, 224, 172, 59, 230, 186, 245, + 41, 243, 53, 224, 172, 241, 64, 216, 90, 226, 171, 223, 52, 184, 235, + 200, 233, 71, 222, 93, 219, 159, 212, 35, 211, 200, 224, 183, 228, 57, + 184, 230, 187, 184, 253, 218, 128, 112, 228, 57, 253, 218, 128, 112, 254, + 56, 128, 112, 254, 56, 251, 96, 228, 57, 255, 13, 128, 112, 229, 105, + 254, 56, 228, 64, 255, 13, 128, 112, 254, 156, 128, 112, 228, 57, 254, + 156, 128, 112, 254, 156, 128, 177, 128, 112, 215, 212, 184, 254, 164, + 128, 112, 245, 102, 112, 243, 52, 245, 102, 112, 247, 242, 252, 31, 254, + 58, 216, 197, 232, 227, 243, 52, 128, 112, 254, 56, 128, 216, 43, 177, + 216, 197, 236, 22, 226, 235, 236, 22, 64, 177, 254, 56, 128, 112, 249, + 235, 245, 105, 245, 106, 249, 234, 222, 237, 236, 7, 128, 112, 222, 237, + 128, 112, 249, 162, 112, 245, 75, 245, 104, 112, 218, 159, 245, 105, 248, + 63, 128, 112, 128, 216, 43, 251, 86, 248, 80, 231, 93, 251, 85, 224, 14, + 128, 112, 228, 57, 128, 112, 240, 111, 112, 228, 57, 240, 111, 112, 218, + 111, 245, 102, 112, 233, 21, 177, 128, 112, 242, 137, 177, 128, 112, 233, + 21, 115, 128, 112, 242, 137, 115, 128, 112, 233, 21, 251, 96, 228, 57, + 128, 112, 242, 137, 251, 96, 228, 57, 128, 112, 230, 102, 233, 20, 230, + 102, 242, 136, 252, 31, 228, 57, 245, 102, 112, 228, 57, 233, 20, 228, + 57, 242, 136, 229, 105, 233, 21, 228, 64, 128, 112, 229, 105, 242, 137, + 228, 64, 128, 112, 233, 21, 177, 245, 102, 112, 242, 137, 177, 245, 102, + 112, 229, 105, 233, 21, 228, 64, 245, 102, 112, 229, 105, 242, 137, 228, + 64, 245, 102, 112, 233, 21, 177, 242, 136, 242, 137, 177, 233, 20, 229, + 105, 233, 21, 228, 64, 242, 136, 229, 105, 242, 137, 228, 64, 233, 20, + 224, 205, 218, 56, 224, 206, 177, 128, 112, 218, 57, 177, 128, 112, 224, + 206, 177, 245, 102, 112, 218, 57, 177, 245, 102, 112, 247, 146, 228, 57, + 224, 208, 247, 146, 228, 57, 218, 58, 218, 65, 226, 235, 218, 23, 226, + 235, 228, 57, 116, 218, 65, 226, 235, 228, 57, 116, 218, 23, 226, 235, + 218, 65, 64, 177, 128, 112, 218, 23, 64, 177, 128, 112, 229, 105, 116, + 218, 65, 64, 228, 64, 128, 112, 229, 105, 116, 218, 23, 64, 228, 64, 128, + 112, 218, 65, 64, 2, 228, 57, 128, 112, 218, 23, 64, 2, 228, 57, 128, + 112, 230, 86, 230, 87, 230, 88, 230, 87, 214, 175, 42, 236, 22, 226, 235, + 42, 226, 154, 226, 235, 42, 236, 22, 64, 177, 128, 112, 42, 226, 154, 64, + 177, 128, 112, 42, 251, 3, 42, 249, 110, 37, 225, 25, 37, 230, 186, 37, + 216, 86, 37, 247, 177, 219, 97, 37, 59, 226, 171, 37, 222, 237, 226, 171, + 37, 253, 225, 226, 171, 37, 245, 105, 37, 248, 164, 92, 225, 25, 92, 230, + 186, 92, 216, 86, 92, 59, 226, 171, 44, 217, 88, 43, 217, 88, 124, 217, + 88, 120, 217, 88, 253, 228, 230, 161, 215, 192, 244, 33, 215, 212, 67, + 252, 149, 44, 215, 93, 52, 67, 252, 149, 52, 44, 215, 93, 247, 146, 228, + 57, 224, 166, 228, 57, 215, 192, 247, 146, 228, 57, 244, 34, 229, 107, + 52, 67, 252, 149, 52, 44, 215, 93, 224, 206, 214, 184, 223, 94, 218, 57, + 214, 184, 223, 94, 228, 62, 218, 78, 226, 235, 249, 194, 253, 246, 228, + 62, 218, 77, 228, 62, 218, 78, 64, 177, 128, 112, 249, 194, 253, 246, + 228, 62, 218, 78, 177, 128, 112, 226, 154, 226, 235, 236, 22, 226, 235, + 230, 92, 241, 207, 249, 204, 231, 142, 235, 215, 211, 145, 229, 207, 228, + 63, 44, 254, 118, 2, 254, 33, 44, 215, 226, 230, 29, 232, 152, 254, 126, + 230, 29, 232, 152, 226, 162, 230, 29, 235, 205, 230, 29, 214, 175, 248, + 1, 226, 171, 59, 226, 171, 218, 159, 226, 171, 247, 177, 216, 86, 251, + 172, 43, 228, 62, 244, 189, 220, 151, 224, 183, 44, 228, 62, 244, 189, + 220, 151, 224, 183, 43, 220, 151, 224, 183, 44, 220, 151, 224, 183, 223, + 52, 216, 90, 245, 105, 249, 107, 232, 152, 226, 162, 249, 107, 232, 152, + 254, 126, 52, 218, 64, 52, 218, 22, 52, 235, 205, 52, 214, 175, 225, 50, + 128, 22, 226, 12, 112, 233, 21, 2, 247, 128, 242, 137, 2, 247, 128, 213, + 187, 230, 102, 233, 20, 213, 187, 230, 102, 242, 136, 233, 21, 128, 216, + 43, 177, 242, 136, 242, 137, 128, 216, 43, 177, 233, 20, 128, 216, 43, + 177, 233, 20, 128, 216, 43, 177, 242, 136, 128, 216, 43, 177, 224, 205, + 128, 216, 43, 177, 218, 56, 247, 146, 228, 57, 224, 209, 177, 245, 107, + 247, 146, 228, 57, 218, 59, 177, 245, 107, 228, 57, 42, 236, 22, 64, 177, + 128, 112, 228, 57, 42, 226, 154, 64, 177, 128, 112, 42, 236, 22, 64, 177, + 228, 57, 128, 112, 42, 226, 154, 64, 177, 228, 57, 128, 112, 233, 21, + 251, 96, 228, 57, 245, 102, 112, 242, 137, 251, 96, 228, 57, 245, 102, + 112, 224, 206, 251, 96, 228, 57, 245, 102, 112, 218, 57, 251, 96, 228, + 57, 245, 102, 112, 228, 57, 228, 62, 218, 78, 226, 235, 247, 146, 228, + 57, 249, 196, 253, 246, 228, 62, 218, 77, 228, 57, 228, 62, 218, 78, 64, + 177, 128, 112, 247, 146, 228, 57, 249, 196, 253, 246, 228, 62, 218, 78, + 177, 245, 107, 67, 245, 171, 230, 227, 203, 245, 171, 120, 44, 248, 7, + 245, 171, 124, 44, 248, 7, 245, 171, 245, 178, 64, 2, 200, 203, 91, 245, + 178, 64, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 4, 245, 178, + 64, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 245, 178, 64, 2, + 59, 48, 245, 178, 64, 2, 226, 127, 4, 245, 178, 64, 2, 226, 127, 245, + 178, 64, 2, 214, 183, 245, 178, 64, 2, 113, 203, 218, 92, 249, 194, 2, + 200, 203, 91, 249, 194, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, + 4, 249, 194, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 249, 194, + 2, 226, 127, 4, 249, 194, 2, 226, 127, 210, 160, 189, 252, 181, 231, 66, + 248, 2, 50, 245, 180, 75, 240, 241, 120, 254, 1, 124, 254, 1, 224, 178, + 225, 168, 212, 32, 232, 219, 43, 250, 189, 44, 250, 189, 43, 244, 65, 44, + 244, 65, 251, 183, 44, 249, 140, 251, 183, 43, 249, 140, 216, 15, 44, + 249, 140, 216, 15, 43, 249, 140, 223, 52, 228, 57, 50, 42, 232, 110, 254, + 33, 221, 166, 221, 173, 217, 2, 223, 123, 224, 244, 235, 245, 213, 165, + 218, 236, 225, 44, 64, 235, 214, 50, 215, 94, 228, 57, 50, 212, 42, 240, + 243, 216, 15, 43, 249, 168, 216, 15, 44, 249, 168, 251, 183, 43, 249, + 168, 251, 183, 44, 249, 168, 216, 15, 163, 235, 218, 251, 183, 163, 235, + 218, 243, 248, 219, 77, 120, 254, 2, 252, 32, 113, 203, 252, 137, 226, + 164, 234, 144, 245, 98, 216, 43, 216, 197, 222, 254, 211, 179, 236, 7, + 116, 223, 120, 251, 171, 234, 143, 233, 48, 254, 118, 127, 222, 250, 254, + 118, 127, 245, 98, 216, 43, 216, 197, 233, 52, 252, 43, 222, 236, 249, + 78, 254, 164, 254, 9, 217, 182, 216, 5, 222, 125, 247, 223, 226, 155, + 249, 206, 217, 53, 219, 88, 249, 159, 249, 158, 254, 74, 243, 232, 16, + 240, 158, 254, 74, 243, 232, 16, 218, 230, 224, 30, 254, 74, 243, 232, + 16, 224, 31, 245, 107, 254, 74, 243, 232, 16, 224, 31, 247, 182, 254, 74, + 243, 232, 16, 224, 31, 248, 0, 254, 74, 243, 232, 16, 224, 31, 235, 62, + 254, 74, 243, 232, 16, 224, 31, 250, 43, 254, 74, 243, 232, 16, 250, 44, + 218, 137, 254, 74, 243, 232, 16, 250, 44, 235, 62, 254, 74, 243, 232, 16, + 219, 98, 130, 254, 74, 243, 232, 16, 252, 189, 130, 254, 74, 243, 232, + 16, 224, 31, 219, 97, 254, 74, 243, 232, 16, 224, 31, 252, 188, 254, 74, + 243, 232, 16, 224, 31, 233, 20, 254, 74, 243, 232, 16, 224, 31, 242, 136, + 254, 74, 243, 232, 16, 140, 214, 19, 254, 74, 243, 232, 16, 97, 214, 19, + 254, 74, 243, 232, 16, 224, 31, 140, 75, 254, 74, 243, 232, 16, 224, 31, + 97, 75, 254, 74, 243, 232, 16, 250, 44, 252, 188, 254, 74, 243, 232, 16, + 124, 217, 89, 214, 183, 254, 74, 243, 232, 16, 248, 63, 218, 137, 254, + 74, 243, 232, 16, 224, 31, 124, 250, 246, 254, 74, 243, 232, 16, 224, 31, + 248, 62, 254, 74, 243, 232, 16, 124, 217, 89, 235, 62, 254, 74, 243, 232, + 16, 214, 153, 214, 19, 254, 74, 243, 232, 16, 224, 31, 214, 153, 75, 254, + 74, 243, 232, 16, 120, 217, 89, 226, 127, 254, 74, 243, 232, 16, 248, 74, + 218, 137, 254, 74, 243, 232, 16, 224, 31, 120, 250, 246, 254, 74, 243, + 232, 16, 224, 31, 248, 73, 254, 74, 243, 232, 16, 120, 217, 89, 235, 62, + 254, 74, 243, 232, 16, 246, 112, 214, 19, 254, 74, 243, 232, 16, 224, 31, + 246, 112, 75, 254, 74, 243, 232, 16, 224, 0, 214, 183, 254, 74, 243, 232, + 16, 248, 63, 214, 183, 254, 74, 243, 232, 16, 248, 1, 214, 183, 254, 74, + 243, 232, 16, 235, 63, 214, 183, 254, 74, 243, 232, 16, 250, 44, 214, + 183, 254, 74, 243, 232, 16, 120, 220, 7, 235, 62, 254, 74, 243, 232, 16, + 224, 0, 224, 30, 254, 74, 243, 232, 16, 250, 44, 218, 158, 254, 74, 243, + 232, 16, 224, 31, 249, 234, 254, 74, 243, 232, 16, 120, 217, 89, 248, 9, + 254, 74, 243, 232, 16, 248, 74, 248, 9, 254, 74, 243, 232, 16, 218, 159, + 248, 9, 254, 74, 243, 232, 16, 235, 63, 248, 9, 254, 74, 243, 232, 16, + 250, 44, 248, 9, 254, 74, 243, 232, 16, 124, 220, 7, 218, 137, 254, 74, + 243, 232, 16, 43, 220, 7, 218, 137, 254, 74, 243, 232, 16, 216, 90, 248, + 9, 254, 74, 243, 232, 16, 242, 137, 248, 9, 254, 74, 243, 232, 16, 249, + 228, 130, 254, 74, 243, 232, 16, 248, 74, 184, 254, 74, 243, 232, 16, + 210, 34, 254, 74, 243, 232, 16, 218, 138, 184, 254, 74, 243, 232, 16, + 220, 153, 214, 183, 254, 74, 243, 232, 16, 224, 31, 228, 57, 245, 107, + 254, 74, 243, 232, 16, 224, 31, 224, 15, 254, 74, 243, 232, 16, 124, 250, + 247, 184, 254, 74, 243, 232, 16, 120, 250, 247, 184, 254, 74, 243, 232, + 16, 235, 192, 254, 74, 243, 232, 16, 223, 40, 254, 74, 243, 232, 16, 226, + 205, 254, 74, 243, 232, 16, 254, 152, 214, 183, 254, 74, 243, 232, 16, + 245, 109, 214, 183, 254, 74, 243, 232, 16, 235, 193, 214, 183, 254, 74, + 243, 232, 16, 226, 206, 214, 183, 254, 74, 243, 232, 16, 254, 151, 228, + 57, 250, 138, 79, 44, 254, 118, 2, 246, 112, 210, 35, 75, 219, 237, 204, + 251, 171, 252, 53, 87, 67, 232, 220, 2, 230, 229, 247, 128, 235, 223, 87, + 249, 191, 214, 181, 87, 247, 197, 214, 181, 87, 245, 162, 87, 249, 218, + 87, 71, 42, 2, 250, 183, 67, 232, 219, 245, 138, 87, 254, 147, 234, 145, + 87, 241, 220, 87, 37, 203, 252, 149, 2, 228, 55, 37, 215, 227, 246, 114, + 251, 143, 250, 44, 2, 228, 59, 75, 214, 179, 87, 230, 142, 87, 240, 171, + 87, 226, 178, 242, 66, 87, 226, 178, 233, 153, 87, 225, 248, 87, 225, + 247, 87, 247, 205, 249, 105, 16, 244, 28, 105, 219, 52, 87, 254, 74, 243, + 232, 16, 224, 30, 248, 91, 220, 140, 234, 145, 87, 224, 195, 226, 79, + 229, 87, 226, 79, 224, 191, 221, 191, 87, 250, 25, 221, 191, 87, 43, 226, + 8, 214, 160, 103, 43, 226, 8, 245, 29, 43, 226, 8, 232, 114, 103, 44, + 226, 8, 214, 160, 103, 44, 226, 8, 245, 29, 44, 226, 8, 232, 114, 103, + 43, 42, 251, 166, 214, 160, 249, 168, 43, 42, 251, 166, 245, 29, 43, 42, + 251, 166, 232, 114, 249, 168, 44, 42, 251, 166, 214, 160, 249, 168, 44, + 42, 251, 166, 245, 29, 44, 42, 251, 166, 232, 114, 249, 168, 43, 249, + 107, 251, 166, 214, 160, 103, 43, 249, 107, 251, 166, 230, 229, 225, 104, + 43, 249, 107, 251, 166, 232, 114, 103, 249, 107, 251, 166, 245, 29, 44, + 249, 107, 251, 166, 214, 160, 103, 44, 249, 107, 251, 166, 230, 229, 225, + 104, 44, 249, 107, 251, 166, 232, 114, 103, 235, 219, 245, 29, 203, 232, + 220, 245, 29, 214, 160, 43, 177, 232, 114, 44, 249, 107, 251, 166, 221, + 174, 214, 160, 44, 177, 232, 114, 43, 249, 107, 251, 166, 221, 174, 218, + 42, 216, 14, 218, 42, 251, 182, 216, 15, 42, 127, 251, 183, 42, 127, 251, + 183, 42, 251, 166, 115, 216, 15, 42, 127, 34, 16, 251, 182, 43, 67, 93, + 232, 219, 44, 67, 93, 232, 219, 203, 221, 207, 232, 218, 203, 221, 207, + 232, 217, 203, 221, 207, 232, 216, 203, 221, 207, 232, 215, 248, 54, 16, + 193, 67, 22, 216, 15, 222, 254, 248, 54, 16, 193, 67, 22, 251, 183, 222, + 254, 248, 54, 16, 193, 67, 2, 250, 43, 248, 54, 16, 193, 124, 22, 203, 2, + 250, 43, 248, 54, 16, 193, 120, 22, 203, 2, 250, 43, 248, 54, 16, 193, + 67, 2, 215, 226, 248, 54, 16, 193, 124, 22, 203, 2, 215, 226, 248, 54, + 16, 193, 120, 22, 203, 2, 215, 226, 248, 54, 16, 193, 67, 22, 212, 35, + 248, 54, 16, 193, 124, 22, 203, 2, 212, 35, 248, 54, 16, 193, 120, 22, + 203, 2, 212, 35, 248, 54, 16, 193, 124, 22, 241, 51, 248, 54, 16, 193, + 120, 22, 241, 51, 248, 54, 16, 193, 67, 22, 216, 15, 233, 52, 248, 54, + 16, 193, 67, 22, 251, 183, 233, 52, 42, 244, 40, 223, 57, 87, 245, 190, + 87, 67, 232, 220, 245, 29, 231, 38, 251, 154, 231, 38, 200, 115, 219, + 252, 231, 38, 219, 253, 115, 232, 143, 231, 38, 200, 115, 113, 219, 239, + 231, 38, 113, 219, 240, 115, 232, 143, 231, 38, 113, 219, 240, 235, 70, + 231, 38, 215, 209, 231, 38, 216, 224, 231, 38, 225, 191, 245, 232, 242, + 129, 243, 226, 216, 15, 226, 7, 251, 183, 226, 7, 216, 15, 249, 107, 127, + 251, 183, 249, 107, 127, 216, 15, 216, 7, 220, 55, 127, 251, 183, 216, 7, + 220, 55, 127, 71, 215, 240, 252, 43, 222, 237, 2, 250, 43, 218, 122, 244, + 72, 255, 26, 249, 104, 245, 179, 235, 205, 248, 91, 245, 32, 87, 85, 222, + 250, 52, 215, 226, 85, 233, 48, 52, 215, 226, 85, 214, 162, 52, 215, 226, + 85, 246, 113, 52, 215, 226, 85, 222, 250, 52, 215, 227, 2, 67, 130, 85, + 233, 48, 52, 215, 227, 2, 67, 130, 85, 222, 250, 215, 227, 2, 52, 67, + 130, 254, 182, 250, 11, 218, 128, 216, 87, 250, 11, 240, 244, 2, 244, 58, + 221, 243, 16, 31, 227, 206, 16, 31, 218, 154, 64, 241, 240, 16, 31, 218, + 154, 64, 216, 213, 16, 31, 245, 151, 64, 216, 213, 16, 31, 245, 151, 64, + 215, 244, 16, 31, 245, 140, 16, 31, 255, 16, 16, 31, 252, 52, 16, 31, + 252, 187, 16, 31, 203, 217, 90, 16, 31, 232, 220, 244, 153, 16, 31, 67, + 217, 90, 16, 31, 244, 28, 244, 153, 16, 31, 250, 238, 223, 56, 16, 31, + 220, 30, 226, 134, 16, 31, 220, 30, 236, 6, 16, 31, 248, 159, 232, 210, + 245, 85, 16, 31, 248, 39, 249, 186, 111, 16, 31, 248, 39, 249, 186, 105, + 16, 31, 248, 39, 249, 186, 158, 16, 31, 248, 39, 249, 186, 161, 16, 31, + 152, 255, 16, 16, 31, 217, 178, 236, 69, 16, 31, 245, 151, 64, 215, 245, + 251, 221, 16, 31, 251, 13, 16, 31, 245, 151, 64, 231, 86, 16, 31, 218, + 62, 16, 31, 245, 85, 16, 31, 244, 115, 220, 139, 16, 31, 242, 128, 220, + 139, 16, 31, 223, 124, 220, 139, 16, 31, 214, 174, 220, 139, 16, 31, 219, + 20, 16, 31, 248, 71, 251, 224, 87, 204, 251, 171, 16, 31, 229, 90, 16, + 31, 248, 72, 244, 28, 105, 16, 31, 218, 63, 244, 28, 105, 226, 245, 103, + 226, 245, 250, 160, 226, 245, 244, 31, 226, 245, 235, 200, 244, 31, 226, + 245, 252, 50, 251, 132, 226, 245, 251, 178, 216, 112, 226, 245, 251, 163, + 252, 154, 240, 110, 226, 245, 254, 135, 64, 250, 137, 226, 245, 248, 164, + 226, 245, 249, 95, 255, 20, 227, 204, 226, 245, 52, 252, 188, 37, 21, + 111, 37, 21, 105, 37, 21, 158, 37, 21, 161, 37, 21, 190, 37, 21, 195, 37, + 21, 199, 37, 21, 196, 37, 21, 201, 37, 54, 216, 248, 37, 54, 245, 175, + 37, 54, 215, 76, 37, 54, 216, 165, 37, 54, 244, 13, 37, 54, 244, 126, 37, + 54, 219, 121, 37, 54, 220, 121, 37, 54, 245, 198, 37, 54, 228, 202, 37, + 54, 215, 73, 88, 21, 111, 88, 21, 105, 88, 21, 158, 88, 21, 161, 88, 21, + 190, 88, 21, 195, 88, 21, 199, 88, 21, 196, 88, 21, 201, 88, 54, 216, + 248, 88, 54, 245, 175, 88, 54, 215, 76, 88, 54, 216, 165, 88, 54, 244, + 13, 88, 54, 244, 126, 88, 54, 219, 121, 88, 54, 220, 121, 88, 54, 245, + 198, 88, 54, 228, 202, 88, 54, 215, 73, 21, 123, 243, 236, 218, 131, 21, + 113, 243, 236, 218, 131, 21, 134, 243, 236, 218, 131, 21, 244, 19, 243, + 236, 218, 131, 21, 244, 89, 243, 236, 218, 131, 21, 219, 127, 243, 236, + 218, 131, 21, 220, 124, 243, 236, 218, 131, 21, 245, 201, 243, 236, 218, + 131, 21, 228, 205, 243, 236, 218, 131, 54, 216, 249, 243, 236, 218, 131, + 54, 245, 176, 243, 236, 218, 131, 54, 215, 77, 243, 236, 218, 131, 54, + 216, 166, 243, 236, 218, 131, 54, 244, 14, 243, 236, 218, 131, 54, 244, + 127, 243, 236, 218, 131, 54, 219, 122, 243, 236, 218, 131, 54, 220, 122, + 243, 236, 218, 131, 54, 245, 199, 243, 236, 218, 131, 54, 228, 203, 243, + 236, 218, 131, 54, 215, 74, 243, 236, 218, 131, 88, 7, 4, 1, 61, 88, 7, + 4, 1, 253, 166, 88, 7, 4, 1, 251, 74, 88, 7, 4, 1, 249, 68, 88, 7, 4, 1, + 76, 88, 7, 4, 1, 245, 14, 88, 7, 4, 1, 243, 209, 88, 7, 4, 1, 242, 67, + 88, 7, 4, 1, 74, 88, 7, 4, 1, 235, 150, 88, 7, 4, 1, 235, 29, 88, 7, 4, + 1, 156, 88, 7, 4, 1, 194, 88, 7, 4, 1, 230, 30, 88, 7, 4, 1, 78, 88, 7, + 4, 1, 226, 109, 88, 7, 4, 1, 224, 99, 88, 7, 4, 1, 153, 88, 7, 4, 1, 222, + 93, 88, 7, 4, 1, 217, 153, 88, 7, 4, 1, 69, 88, 7, 4, 1, 214, 105, 88, 7, + 4, 1, 212, 98, 88, 7, 4, 1, 211, 178, 88, 7, 4, 1, 211, 117, 88, 7, 4, 1, + 210, 159, 37, 7, 6, 1, 61, 37, 7, 6, 1, 253, 166, 37, 7, 6, 1, 251, 74, + 37, 7, 6, 1, 249, 68, 37, 7, 6, 1, 76, 37, 7, 6, 1, 245, 14, 37, 7, 6, 1, + 243, 209, 37, 7, 6, 1, 242, 67, 37, 7, 6, 1, 74, 37, 7, 6, 1, 235, 150, + 37, 7, 6, 1, 235, 29, 37, 7, 6, 1, 156, 37, 7, 6, 1, 194, 37, 7, 6, 1, + 230, 30, 37, 7, 6, 1, 78, 37, 7, 6, 1, 226, 109, 37, 7, 6, 1, 224, 99, + 37, 7, 6, 1, 153, 37, 7, 6, 1, 222, 93, 37, 7, 6, 1, 217, 153, 37, 7, 6, + 1, 69, 37, 7, 6, 1, 214, 105, 37, 7, 6, 1, 212, 98, 37, 7, 6, 1, 211, + 178, 37, 7, 6, 1, 211, 117, 37, 7, 6, 1, 210, 159, 37, 7, 4, 1, 61, 37, + 7, 4, 1, 253, 166, 37, 7, 4, 1, 251, 74, 37, 7, 4, 1, 249, 68, 37, 7, 4, + 1, 76, 37, 7, 4, 1, 245, 14, 37, 7, 4, 1, 243, 209, 37, 7, 4, 1, 242, 67, + 37, 7, 4, 1, 74, 37, 7, 4, 1, 235, 150, 37, 7, 4, 1, 235, 29, 37, 7, 4, + 1, 156, 37, 7, 4, 1, 194, 37, 7, 4, 1, 230, 30, 37, 7, 4, 1, 78, 37, 7, + 4, 1, 226, 109, 37, 7, 4, 1, 224, 99, 37, 7, 4, 1, 153, 37, 7, 4, 1, 222, + 93, 37, 7, 4, 1, 217, 153, 37, 7, 4, 1, 69, 37, 7, 4, 1, 214, 105, 37, 7, + 4, 1, 212, 98, 37, 7, 4, 1, 211, 178, 37, 7, 4, 1, 211, 117, 37, 7, 4, 1, + 210, 159, 37, 21, 210, 86, 152, 37, 54, 245, 175, 152, 37, 54, 215, 76, + 152, 37, 54, 216, 165, 152, 37, 54, 244, 13, 152, 37, 54, 244, 126, 152, + 37, 54, 219, 121, 152, 37, 54, 220, 121, 152, 37, 54, 245, 198, 152, 37, + 54, 228, 202, 152, 37, 54, 215, 73, 52, 37, 21, 111, 52, 37, 21, 105, 52, + 37, 21, 158, 52, 37, 21, 161, 52, 37, 21, 190, 52, 37, 21, 195, 52, 37, + 21, 199, 52, 37, 21, 196, 52, 37, 21, 201, 52, 37, 54, 216, 248, 152, 37, + 21, 210, 86, 93, 99, 193, 241, 51, 93, 99, 114, 241, 51, 93, 99, 193, + 213, 239, 93, 99, 114, 213, 239, 93, 99, 193, 215, 212, 248, 165, 241, + 51, 93, 99, 114, 215, 212, 248, 165, 241, 51, 93, 99, 193, 215, 212, 248, + 165, 213, 239, 93, 99, 114, 215, 212, 248, 165, 213, 239, 93, 99, 193, + 224, 27, 248, 165, 241, 51, 93, 99, 114, 224, 27, 248, 165, 241, 51, 93, + 99, 193, 224, 27, 248, 165, 213, 239, 93, 99, 114, 224, 27, 248, 165, + 213, 239, 93, 99, 193, 124, 22, 222, 254, 93, 99, 124, 193, 22, 44, 241, + 228, 93, 99, 124, 114, 22, 44, 232, 236, 93, 99, 114, 124, 22, 222, 254, + 93, 99, 193, 124, 22, 233, 52, 93, 99, 124, 193, 22, 43, 241, 228, 93, + 99, 124, 114, 22, 43, 232, 236, 93, 99, 114, 124, 22, 233, 52, 93, 99, + 193, 120, 22, 222, 254, 93, 99, 120, 193, 22, 44, 241, 228, 93, 99, 120, + 114, 22, 44, 232, 236, 93, 99, 114, 120, 22, 222, 254, 93, 99, 193, 120, + 22, 233, 52, 93, 99, 120, 193, 22, 43, 241, 228, 93, 99, 120, 114, 22, + 43, 232, 236, 93, 99, 114, 120, 22, 233, 52, 93, 99, 193, 67, 22, 222, + 254, 93, 99, 67, 193, 22, 44, 241, 228, 93, 99, 120, 114, 22, 44, 124, + 232, 236, 93, 99, 124, 114, 22, 44, 120, 232, 236, 93, 99, 67, 114, 22, + 44, 232, 236, 93, 99, 124, 193, 22, 44, 120, 241, 228, 93, 99, 120, 193, + 22, 44, 124, 241, 228, 93, 99, 114, 67, 22, 222, 254, 93, 99, 193, 67, + 22, 233, 52, 93, 99, 67, 193, 22, 43, 241, 228, 93, 99, 120, 114, 22, 43, + 124, 232, 236, 93, 99, 124, 114, 22, 43, 120, 232, 236, 93, 99, 67, 114, + 22, 43, 232, 236, 93, 99, 124, 193, 22, 43, 120, 241, 228, 93, 99, 120, + 193, 22, 43, 124, 241, 228, 93, 99, 114, 67, 22, 233, 52, 93, 99, 193, + 124, 22, 241, 51, 93, 99, 43, 114, 22, 44, 124, 232, 236, 93, 99, 44, + 114, 22, 43, 124, 232, 236, 93, 99, 124, 193, 22, 203, 241, 228, 93, 99, + 124, 114, 22, 203, 232, 236, 93, 99, 44, 193, 22, 43, 124, 241, 228, 93, + 99, 43, 193, 22, 44, 124, 241, 228, 93, 99, 114, 124, 22, 241, 51, 93, + 99, 193, 120, 22, 241, 51, 93, 99, 43, 114, 22, 44, 120, 232, 236, 93, + 99, 44, 114, 22, 43, 120, 232, 236, 93, 99, 120, 193, 22, 203, 241, 228, + 93, 99, 120, 114, 22, 203, 232, 236, 93, 99, 44, 193, 22, 43, 120, 241, + 228, 93, 99, 43, 193, 22, 44, 120, 241, 228, 93, 99, 114, 120, 22, 241, + 51, 93, 99, 193, 67, 22, 241, 51, 93, 99, 43, 114, 22, 44, 67, 232, 236, + 93, 99, 44, 114, 22, 43, 67, 232, 236, 93, 99, 67, 193, 22, 203, 241, + 228, 93, 99, 120, 114, 22, 124, 203, 232, 236, 93, 99, 124, 114, 22, 120, + 203, 232, 236, 93, 99, 67, 114, 22, 203, 232, 236, 93, 99, 43, 120, 114, + 22, 44, 124, 232, 236, 93, 99, 44, 120, 114, 22, 43, 124, 232, 236, 93, + 99, 43, 124, 114, 22, 44, 120, 232, 236, 93, 99, 44, 124, 114, 22, 43, + 120, 232, 236, 93, 99, 124, 193, 22, 120, 203, 241, 228, 93, 99, 120, + 193, 22, 124, 203, 241, 228, 93, 99, 44, 193, 22, 43, 67, 241, 228, 93, + 99, 43, 193, 22, 44, 67, 241, 228, 93, 99, 114, 67, 22, 241, 51, 93, 99, + 193, 52, 248, 165, 241, 51, 93, 99, 114, 52, 248, 165, 241, 51, 93, 99, + 193, 52, 248, 165, 213, 239, 93, 99, 114, 52, 248, 165, 213, 239, 93, 99, + 52, 241, 51, 93, 99, 52, 213, 239, 93, 99, 124, 219, 157, 22, 44, 246, + 121, 93, 99, 124, 52, 22, 44, 219, 156, 93, 99, 52, 124, 22, 222, 254, + 93, 99, 124, 219, 157, 22, 43, 246, 121, 93, 99, 124, 52, 22, 43, 219, + 156, 93, 99, 52, 124, 22, 233, 52, 93, 99, 120, 219, 157, 22, 44, 246, + 121, 93, 99, 120, 52, 22, 44, 219, 156, 93, 99, 52, 120, 22, 222, 254, + 93, 99, 120, 219, 157, 22, 43, 246, 121, 93, 99, 120, 52, 22, 43, 219, + 156, 93, 99, 52, 120, 22, 233, 52, 93, 99, 67, 219, 157, 22, 44, 246, + 121, 93, 99, 67, 52, 22, 44, 219, 156, 93, 99, 52, 67, 22, 222, 254, 93, + 99, 67, 219, 157, 22, 43, 246, 121, 93, 99, 67, 52, 22, 43, 219, 156, 93, + 99, 52, 67, 22, 233, 52, 93, 99, 124, 219, 157, 22, 203, 246, 121, 93, + 99, 124, 52, 22, 203, 219, 156, 93, 99, 52, 124, 22, 241, 51, 93, 99, + 120, 219, 157, 22, 203, 246, 121, 93, 99, 120, 52, 22, 203, 219, 156, 93, + 99, 52, 120, 22, 241, 51, 93, 99, 67, 219, 157, 22, 203, 246, 121, 93, + 99, 67, 52, 22, 203, 219, 156, 93, 99, 52, 67, 22, 241, 51, 93, 99, 193, + 254, 34, 124, 22, 222, 254, 93, 99, 193, 254, 34, 124, 22, 233, 52, 93, + 99, 193, 254, 34, 120, 22, 233, 52, 93, 99, 193, 254, 34, 120, 22, 222, + 254, 93, 99, 193, 248, 7, 214, 160, 44, 216, 43, 232, 114, 233, 52, 93, + 99, 193, 248, 7, 214, 160, 43, 216, 43, 232, 114, 222, 254, 93, 99, 193, + 248, 7, 249, 138, 93, 99, 193, 233, 52, 93, 99, 193, 214, 163, 93, 99, + 193, 222, 254, 93, 99, 193, 246, 114, 93, 99, 114, 233, 52, 93, 99, 114, + 214, 163, 93, 99, 114, 222, 254, 93, 99, 114, 246, 114, 93, 99, 193, 43, + 22, 114, 222, 254, 93, 99, 193, 120, 22, 114, 246, 114, 93, 99, 114, 43, + 22, 193, 222, 254, 93, 99, 114, 120, 22, 193, 246, 114, 214, 160, 163, + 251, 221, 232, 114, 123, 245, 197, 251, 221, 232, 114, 123, 224, 25, 251, + 221, 232, 114, 134, 245, 195, 251, 221, 232, 114, 163, 251, 221, 232, + 114, 244, 89, 245, 195, 251, 221, 232, 114, 134, 224, 23, 251, 221, 232, + 114, 220, 124, 245, 195, 251, 221, 243, 236, 251, 221, 43, 220, 124, 245, + 195, 251, 221, 43, 134, 224, 23, 251, 221, 43, 244, 89, 245, 195, 251, + 221, 43, 163, 251, 221, 43, 134, 245, 195, 251, 221, 43, 123, 224, 25, + 251, 221, 43, 123, 245, 197, 251, 221, 44, 163, 251, 221, 193, 220, 94, + 231, 87, 220, 94, 248, 170, 220, 94, 214, 160, 123, 245, 197, 251, 221, + 44, 123, 245, 197, 251, 221, 224, 29, 232, 114, 233, 52, 224, 29, 232, + 114, 222, 254, 224, 29, 214, 160, 233, 52, 224, 29, 214, 160, 43, 22, + 232, 114, 43, 22, 232, 114, 222, 254, 224, 29, 214, 160, 43, 22, 232, + 114, 222, 254, 224, 29, 214, 160, 43, 22, 214, 160, 44, 22, 232, 114, + 233, 52, 224, 29, 214, 160, 43, 22, 214, 160, 44, 22, 232, 114, 222, 254, + 224, 29, 214, 160, 222, 254, 224, 29, 214, 160, 44, 22, 232, 114, 233, + 52, 224, 29, 214, 160, 44, 22, 232, 114, 43, 22, 232, 114, 222, 254, 85, + 218, 236, 71, 218, 236, 71, 42, 2, 222, 185, 249, 167, 71, 42, 249, 195, + 85, 4, 218, 236, 42, 2, 203, 244, 113, 42, 2, 67, 244, 113, 42, 2, 226, + 148, 249, 134, 244, 113, 42, 2, 214, 160, 43, 216, 43, 232, 114, 44, 244, + 113, 42, 2, 214, 160, 44, 216, 43, 232, 114, 43, 244, 113, 42, 2, 248, 7, + 249, 134, 244, 113, 85, 4, 218, 236, 71, 4, 218, 236, 85, 223, 119, 71, + 223, 119, 85, 67, 223, 119, 71, 67, 223, 119, 85, 226, 10, 71, 226, 10, + 85, 214, 162, 215, 226, 71, 214, 162, 215, 226, 85, 214, 162, 4, 215, + 226, 71, 214, 162, 4, 215, 226, 85, 222, 250, 215, 226, 71, 222, 250, + 215, 226, 85, 222, 250, 4, 215, 226, 71, 222, 250, 4, 215, 226, 85, 222, + 250, 225, 11, 71, 222, 250, 225, 11, 85, 246, 113, 215, 226, 71, 246, + 113, 215, 226, 85, 246, 113, 4, 215, 226, 71, 246, 113, 4, 215, 226, 85, + 233, 48, 215, 226, 71, 233, 48, 215, 226, 85, 233, 48, 4, 215, 226, 71, + 233, 48, 4, 215, 226, 85, 233, 48, 225, 11, 71, 233, 48, 225, 11, 85, + 248, 0, 71, 248, 0, 71, 248, 1, 249, 195, 85, 4, 248, 0, 244, 97, 232, + 110, 71, 250, 43, 246, 126, 250, 43, 250, 44, 2, 67, 244, 113, 251, 119, + 85, 250, 43, 250, 44, 2, 43, 163, 251, 229, 250, 44, 2, 44, 163, 251, + 229, 250, 44, 2, 232, 114, 163, 251, 229, 250, 44, 2, 214, 160, 163, 251, + 229, 250, 44, 2, 214, 160, 44, 224, 29, 251, 229, 250, 44, 2, 254, 164, + 251, 96, 214, 160, 43, 224, 29, 251, 229, 43, 163, 85, 250, 43, 44, 163, + 85, 250, 43, 235, 201, 251, 121, 235, 201, 71, 250, 43, 214, 160, 163, + 235, 201, 71, 250, 43, 232, 114, 163, 235, 201, 71, 250, 43, 214, 160, + 43, 224, 29, 250, 41, 254, 33, 214, 160, 44, 224, 29, 250, 41, 254, 33, + 232, 114, 44, 224, 29, 250, 41, 254, 33, 232, 114, 43, 224, 29, 250, 41, + 254, 33, 214, 160, 163, 250, 43, 232, 114, 163, 250, 43, 85, 232, 114, + 44, 215, 226, 85, 232, 114, 43, 215, 226, 85, 214, 160, 43, 215, 226, 85, + 214, 160, 44, 215, 226, 71, 251, 121, 42, 2, 43, 163, 251, 229, 42, 2, + 44, 163, 251, 229, 42, 2, 214, 160, 43, 248, 7, 163, 251, 229, 42, 2, + 232, 114, 44, 248, 7, 163, 251, 229, 71, 42, 2, 67, 251, 240, 232, 219, + 71, 214, 162, 215, 227, 2, 247, 128, 214, 162, 215, 227, 2, 43, 163, 251, + 229, 214, 162, 215, 227, 2, 44, 163, 251, 229, 233, 91, 250, 43, 71, 42, + 2, 214, 160, 43, 224, 28, 71, 42, 2, 232, 114, 43, 224, 28, 71, 42, 2, + 232, 114, 44, 224, 28, 71, 42, 2, 214, 160, 44, 224, 28, 71, 250, 44, 2, + 214, 160, 43, 224, 28, 71, 250, 44, 2, 232, 114, 43, 224, 28, 71, 250, + 44, 2, 232, 114, 44, 224, 28, 71, 250, 44, 2, 214, 160, 44, 224, 28, 214, + 160, 43, 215, 226, 214, 160, 44, 215, 226, 232, 114, 43, 215, 226, 71, + 231, 87, 218, 236, 85, 231, 87, 218, 236, 71, 231, 87, 4, 218, 236, 85, + 231, 87, 4, 218, 236, 232, 114, 44, 215, 226, 85, 218, 39, 2, 223, 135, + 249, 255, 214, 194, 219, 62, 249, 230, 85, 218, 158, 71, 218, 158, 232, + 234, 216, 133, 218, 38, 253, 242, 228, 76, 248, 46, 228, 76, 249, 203, + 226, 167, 85, 217, 1, 71, 217, 1, 252, 164, 251, 171, 252, 164, 93, 2, + 250, 137, 252, 164, 93, 2, 211, 178, 222, 0, 214, 195, 2, 223, 163, 246, + 92, 240, 250, 252, 30, 71, 220, 4, 225, 104, 85, 220, 4, 225, 104, 220, + 89, 223, 52, 222, 189, 244, 63, 241, 235, 251, 121, 85, 43, 225, 10, 235, + 249, 85, 44, 225, 10, 235, 249, 71, 43, 225, 10, 235, 249, 71, 120, 225, + 10, 235, 249, 71, 44, 225, 10, 235, 249, 71, 124, 225, 10, 235, 249, 219, + 103, 22, 249, 137, 250, 227, 50, 223, 175, 50, 251, 247, 50, 251, 33, + 254, 110, 226, 149, 249, 138, 250, 119, 223, 40, 249, 139, 64, 232, 124, + 249, 139, 64, 235, 122, 218, 159, 22, 249, 144, 244, 176, 87, 255, 1, + 220, 91, 242, 29, 22, 219, 191, 225, 223, 87, 210, 254, 211, 69, 215, + 216, 31, 241, 230, 215, 216, 31, 233, 113, 215, 216, 31, 244, 104, 215, + 216, 31, 216, 134, 215, 216, 31, 211, 239, 215, 216, 31, 212, 40, 215, + 216, 31, 230, 120, 215, 216, 31, 245, 231, 212, 1, 64, 248, 26, 71, 243, + 247, 244, 198, 71, 219, 76, 244, 198, 85, 219, 76, 244, 198, 71, 218, 39, + 2, 223, 135, 244, 100, 224, 25, 230, 133, 233, 86, 224, 25, 230, 133, + 231, 59, 244, 146, 50, 245, 231, 231, 195, 50, 235, 44, 221, 222, 214, + 145, 229, 98, 225, 23, 254, 20, 217, 41, 243, 59, 251, 11, 233, 25, 213, + 150, 232, 244, 221, 193, 222, 21, 251, 0, 254, 50, 225, 55, 71, 250, 125, + 234, 84, 71, 250, 125, 224, 17, 71, 250, 125, 222, 197, 71, 250, 125, + 251, 239, 71, 250, 125, 234, 36, 71, 250, 125, 225, 235, 85, 250, 125, + 234, 84, 85, 250, 125, 224, 17, 85, 250, 125, 222, 197, 85, 250, 125, + 251, 239, 85, 250, 125, 234, 36, 85, 250, 125, 225, 235, 85, 219, 18, + 218, 51, 71, 241, 235, 218, 51, 71, 248, 1, 218, 51, 85, 249, 253, 218, + 51, 71, 219, 18, 218, 51, 85, 241, 235, 218, 51, 85, 248, 1, 218, 51, 71, + 249, 253, 218, 51, 240, 250, 218, 240, 224, 25, 228, 52, 245, 197, 228, + 52, 252, 81, 245, 197, 228, 47, 252, 81, 219, 120, 228, 47, 230, 62, 244, + 74, 50, 230, 62, 229, 193, 50, 230, 62, 220, 78, 50, 212, 9, 183, 249, + 138, 245, 228, 183, 249, 138, 214, 171, 223, 115, 87, 223, 115, 16, 31, + 215, 48, 225, 37, 223, 115, 16, 31, 215, 47, 225, 37, 223, 115, 16, 31, + 215, 46, 225, 37, 223, 115, 16, 31, 215, 45, 225, 37, 223, 115, 16, 31, + 215, 44, 225, 37, 223, 115, 16, 31, 215, 43, 225, 37, 223, 115, 16, 31, + 215, 42, 225, 37, 223, 115, 16, 31, 243, 57, 231, 143, 85, 214, 171, 223, + 115, 87, 223, 116, 226, 24, 87, 226, 0, 226, 24, 87, 225, 177, 226, 24, + 50, 211, 255, 87, 247, 249, 244, 197, 247, 249, 244, 196, 247, 249, 244, + 195, 247, 249, 244, 194, 247, 249, 244, 193, 247, 249, 244, 192, 71, 250, + 44, 2, 59, 222, 254, 71, 250, 44, 2, 113, 247, 126, 85, 250, 44, 2, 71, + 59, 222, 254, 85, 250, 44, 2, 113, 71, 247, 126, 230, 147, 31, 211, 69, + 230, 147, 31, 210, 253, 247, 232, 31, 242, 138, 211, 69, 247, 232, 31, + 233, 19, 210, 253, 247, 232, 31, 233, 19, 211, 69, 247, 232, 31, 242, + 138, 210, 253, 71, 244, 81, 85, 244, 81, 242, 29, 22, 225, 107, 254, 128, + 249, 136, 217, 236, 218, 166, 64, 254, 235, 221, 208, 254, 178, 244, 59, + 243, 67, 218, 166, 64, 241, 209, 253, 207, 87, 244, 70, 226, 130, 71, + 218, 158, 134, 232, 214, 249, 183, 222, 254, 134, 232, 214, 249, 183, + 233, 52, 212, 50, 50, 125, 213, 130, 50, 246, 118, 244, 146, 50, 246, + 118, 231, 195, 50, 235, 210, 244, 146, 22, 231, 195, 50, 231, 195, 22, + 244, 146, 50, 231, 195, 2, 218, 105, 50, 231, 195, 2, 218, 105, 22, 231, + 195, 22, 244, 146, 50, 67, 231, 195, 2, 218, 105, 50, 203, 231, 195, 2, + 218, 105, 50, 231, 87, 71, 250, 43, 231, 87, 85, 250, 43, 231, 87, 4, 71, + 250, 43, 231, 158, 87, 247, 175, 87, 214, 169, 225, 255, 87, 249, 239, + 243, 231, 214, 141, 229, 93, 250, 169, 226, 65, 235, 50, 213, 185, 250, + 101, 85, 230, 134, 232, 231, 220, 114, 220, 149, 224, 8, 220, 132, 219, + 57, 252, 167, 252, 134, 92, 234, 144, 71, 246, 101, 231, 190, 71, 246, + 101, 234, 84, 85, 246, 101, 231, 190, 85, 246, 101, 234, 84, 219, 63, + 211, 230, 219, 66, 218, 39, 252, 59, 249, 255, 223, 162, 85, 219, 62, + 216, 135, 250, 0, 22, 223, 162, 215, 94, 71, 220, 4, 225, 104, 215, 94, + 85, 220, 4, 225, 104, 71, 248, 1, 236, 7, 218, 236, 249, 133, 233, 97, + 247, 201, 250, 252, 226, 170, 225, 107, 250, 253, 219, 90, 241, 219, 2, + 71, 249, 138, 37, 249, 133, 233, 97, 250, 161, 228, 80, 245, 132, 254, + 149, 226, 195, 43, 212, 26, 215, 252, 85, 215, 55, 43, 212, 26, 215, 252, + 71, 215, 55, 43, 212, 26, 215, 252, 85, 43, 233, 98, 231, 58, 71, 43, + 233, 98, 231, 58, 246, 97, 219, 84, 50, 114, 71, 246, 113, 215, 226, 43, + 250, 8, 245, 132, 92, 222, 0, 244, 183, 248, 7, 236, 7, 71, 250, 44, 236, + 7, 85, 218, 236, 85, 215, 193, 223, 63, 43, 245, 131, 223, 63, 43, 245, + 130, 253, 219, 16, 31, 214, 145, 114, 250, 44, 2, 218, 105, 22, 113, 170, + 48, 225, 192, 222, 251, 235, 212, 225, 192, 233, 49, 235, 212, 225, 192, + 235, 200, 225, 192, 85, 249, 139, 226, 201, 220, 31, 220, 19, 219, 231, + 250, 69, 250, 234, 241, 164, 219, 128, 243, 68, 211, 230, 240, 227, 243, + 68, 2, 242, 19, 231, 178, 16, 31, 232, 235, 230, 120, 214, 195, 226, 201, + 242, 129, 244, 20, 244, 82, 236, 7, 241, 66, 244, 137, 222, 16, 42, 244, + 19, 249, 167, 219, 106, 240, 119, 219, 109, 225, 171, 2, 252, 167, 216, + 243, 235, 137, 252, 154, 87, 241, 238, 242, 140, 87, 243, 239, 224, 145, + 249, 111, 226, 201, 85, 218, 236, 71, 244, 82, 2, 203, 230, 229, 85, 218, + 106, 214, 160, 251, 225, 221, 195, 85, 221, 195, 232, 114, 251, 225, 221, + 195, 71, 221, 195, 71, 114, 250, 138, 79, 217, 2, 232, 160, 50, 217, 54, + 246, 96, 254, 200, 245, 127, 223, 160, 244, 93, 223, 160, 242, 22, 213, + 174, 242, 22, 211, 198, 242, 22, 232, 114, 44, 225, 201, 225, 201, 214, + 160, 44, 225, 201, 71, 228, 235, 85, 228, 235, 250, 138, 79, 114, 250, + 138, 79, 230, 89, 211, 178, 114, 230, 89, 211, 178, 252, 164, 211, 178, + 114, 252, 164, 211, 178, 226, 130, 26, 249, 138, 114, 26, 249, 138, 204, + 250, 183, 249, 138, 114, 204, 250, 183, 249, 138, 7, 249, 138, 220, 93, + 71, 7, 249, 138, 226, 130, 7, 249, 138, 231, 192, 249, 138, 218, 159, 64, + 248, 157, 244, 19, 217, 16, 253, 224, 244, 19, 252, 165, 253, 224, 114, + 244, 19, 252, 165, 253, 224, 244, 19, 249, 251, 253, 224, 85, 244, 19, + 225, 12, 218, 158, 71, 244, 19, 225, 12, 218, 158, 219, 13, 218, 113, + 226, 130, 71, 218, 158, 37, 71, 218, 158, 204, 250, 183, 85, 218, 158, + 85, 250, 183, 71, 218, 158, 226, 130, 85, 218, 158, 114, 226, 130, 85, + 218, 158, 225, 63, 218, 158, 220, 93, 71, 218, 158, 114, 253, 224, 204, + 250, 183, 253, 224, 245, 201, 218, 246, 253, 224, 245, 201, 225, 12, 85, + 218, 158, 245, 201, 225, 12, 225, 63, 218, 158, 219, 127, 225, 12, 85, + 218, 158, 245, 201, 225, 12, 223, 117, 85, 218, 158, 114, 245, 201, 225, + 12, 223, 117, 85, 218, 158, 215, 77, 225, 12, 85, 218, 158, 219, 122, + 225, 12, 253, 224, 217, 16, 253, 224, 204, 250, 183, 217, 16, 253, 224, + 114, 217, 16, 253, 224, 219, 127, 225, 160, 85, 22, 71, 244, 62, 85, 244, + 62, 71, 244, 62, 245, 201, 225, 160, 226, 130, 85, 244, 62, 37, 204, 250, + 183, 245, 201, 225, 12, 218, 158, 114, 217, 16, 225, 63, 253, 224, 219, + 64, 216, 106, 215, 219, 219, 64, 114, 250, 122, 219, 64, 219, 15, 114, + 219, 15, 252, 165, 253, 224, 245, 201, 217, 16, 224, 174, 253, 224, 114, + 245, 201, 217, 16, 224, 174, 253, 224, 249, 139, 79, 220, 93, 71, 250, + 43, 152, 92, 249, 139, 79, 232, 114, 44, 246, 94, 71, 218, 236, 214, 160, + 44, 246, 94, 71, 218, 236, 232, 114, 44, 220, 93, 71, 218, 236, 214, 160, + 44, 220, 93, 71, 218, 236, 85, 224, 16, 164, 226, 151, 71, 224, 16, 164, + 226, 151, 71, 245, 39, 164, 226, 151, 85, 248, 1, 230, 187, 71, 211, 178, + 114, 245, 39, 164, 87, 193, 67, 130, 231, 87, 67, 130, 114, 67, 130, 114, + 219, 157, 215, 94, 249, 228, 224, 1, 164, 226, 151, 114, 219, 157, 249, + 228, 224, 1, 164, 226, 151, 114, 52, 215, 94, 249, 228, 224, 1, 164, 226, + 151, 114, 52, 249, 228, 224, 1, 164, 226, 151, 114, 121, 219, 157, 249, + 228, 224, 1, 164, 226, 151, 114, 121, 52, 249, 228, 224, 1, 164, 226, + 151, 249, 99, 218, 142, 226, 19, 5, 226, 151, 114, 245, 39, 164, 226, + 151, 114, 241, 235, 245, 39, 164, 226, 151, 114, 85, 241, 234, 222, 189, + 114, 85, 241, 235, 251, 121, 244, 63, 241, 234, 222, 189, 244, 63, 241, + 235, 251, 121, 231, 87, 43, 226, 8, 226, 151, 231, 87, 44, 226, 8, 226, + 151, 231, 87, 244, 71, 43, 226, 8, 226, 151, 231, 87, 244, 71, 44, 226, + 8, 226, 151, 231, 87, 233, 48, 254, 118, 251, 166, 226, 151, 231, 87, + 222, 250, 254, 118, 251, 166, 226, 151, 114, 233, 48, 254, 118, 224, 1, + 164, 226, 151, 114, 222, 250, 254, 118, 224, 1, 164, 226, 151, 114, 233, + 48, 254, 118, 251, 166, 226, 151, 114, 222, 250, 254, 118, 251, 166, 226, + 151, 193, 43, 216, 7, 220, 55, 251, 166, 226, 151, 193, 44, 216, 7, 220, + 55, 251, 166, 226, 151, 231, 87, 43, 249, 107, 251, 166, 226, 151, 231, + 87, 44, 249, 107, 251, 166, 226, 151, 247, 212, 152, 37, 21, 111, 247, + 212, 152, 37, 21, 105, 247, 212, 152, 37, 21, 158, 247, 212, 152, 37, 21, + 161, 247, 212, 152, 37, 21, 190, 247, 212, 152, 37, 21, 195, 247, 212, + 152, 37, 21, 199, 247, 212, 152, 37, 21, 196, 247, 212, 152, 37, 21, 201, + 247, 212, 152, 37, 54, 216, 248, 247, 212, 37, 35, 21, 111, 247, 212, 37, + 35, 21, 105, 247, 212, 37, 35, 21, 158, 247, 212, 37, 35, 21, 161, 247, + 212, 37, 35, 21, 190, 247, 212, 37, 35, 21, 195, 247, 212, 37, 35, 21, + 199, 247, 212, 37, 35, 21, 196, 247, 212, 37, 35, 21, 201, 247, 212, 37, + 35, 54, 216, 248, 247, 212, 152, 37, 35, 21, 111, 247, 212, 152, 37, 35, + 21, 105, 247, 212, 152, 37, 35, 21, 158, 247, 212, 152, 37, 35, 21, 161, + 247, 212, 152, 37, 35, 21, 190, 247, 212, 152, 37, 35, 21, 195, 247, 212, + 152, 37, 35, 21, 199, 247, 212, 152, 37, 35, 21, 196, 247, 212, 152, 37, + 35, 21, 201, 247, 212, 152, 37, 35, 54, 216, 248, 114, 211, 246, 97, 75, + 114, 96, 50, 114, 230, 187, 50, 114, 247, 177, 50, 114, 219, 30, 245, + 228, 75, 114, 97, 75, 114, 228, 61, 245, 228, 75, 246, 106, 225, 14, 97, + 75, 114, 222, 186, 97, 75, 215, 225, 97, 75, 114, 215, 225, 97, 75, 248, + 163, 215, 225, 97, 75, 114, 248, 163, 215, 225, 97, 75, 85, 97, 75, 216, + 145, 216, 13, 97, 254, 1, 216, 145, 251, 181, 97, 254, 1, 85, 97, 254, 1, + 114, 85, 249, 99, 246, 112, 22, 97, 75, 114, 85, 249, 99, 214, 153, 22, + 97, 75, 218, 233, 85, 97, 75, 114, 249, 214, 85, 97, 75, 222, 249, 71, + 97, 75, 233, 47, 71, 97, 75, 252, 191, 220, 93, 71, 97, 75, 243, 249, + 220, 93, 71, 97, 75, 114, 232, 114, 222, 248, 71, 97, 75, 114, 214, 160, + 222, 248, 71, 97, 75, 228, 54, 232, 114, 222, 248, 71, 97, 75, 249, 107, + 232, 129, 228, 54, 214, 160, 222, 248, 71, 97, 75, 37, 114, 71, 97, 75, + 211, 252, 97, 75, 251, 228, 219, 30, 245, 228, 75, 251, 228, 97, 75, 251, + 228, 228, 61, 245, 228, 75, 114, 251, 228, 219, 30, 245, 228, 75, 114, + 251, 228, 97, 75, 114, 251, 228, 228, 61, 245, 228, 75, 217, 18, 97, 75, + 114, 217, 17, 97, 75, 212, 18, 97, 75, 114, 212, 18, 97, 75, 226, 176, + 97, 75, 52, 249, 107, 232, 129, 134, 247, 222, 254, 117, 71, 215, 227, + 249, 195, 4, 71, 215, 226, 225, 174, 204, 218, 64, 204, 218, 22, 43, 222, + 92, 252, 181, 248, 68, 44, 222, 92, 252, 181, 248, 68, 177, 2, 59, 235, + 222, 223, 53, 219, 49, 224, 204, 218, 64, 218, 23, 224, 204, 219, 48, 67, + 252, 149, 2, 203, 91, 11, 222, 231, 248, 6, 200, 247, 176, 11, 244, 183, + 248, 6, 92, 232, 152, 254, 126, 92, 232, 152, 226, 162, 71, 248, 1, 2, + 250, 181, 247, 128, 22, 2, 247, 128, 245, 178, 64, 226, 174, 214, 152, + 232, 114, 44, 249, 169, 2, 247, 128, 214, 160, 43, 249, 169, 2, 247, 128, + 43, 226, 132, 235, 72, 44, 226, 132, 235, 72, 243, 236, 226, 132, 235, + 72, 233, 91, 120, 217, 88, 233, 91, 124, 217, 88, 43, 22, 44, 52, 215, + 93, 43, 22, 44, 217, 88, 43, 230, 92, 200, 44, 217, 88, 200, 43, 217, 88, + 120, 217, 89, 2, 250, 44, 48, 232, 111, 247, 181, 251, 86, 203, 222, 135, + 71, 249, 213, 248, 0, 71, 249, 213, 248, 1, 2, 140, 216, 115, 71, 249, + 213, 248, 1, 2, 97, 216, 115, 71, 42, 2, 140, 216, 115, 71, 42, 2, 97, + 216, 115, 11, 43, 71, 42, 127, 11, 44, 71, 42, 127, 11, 43, 254, 118, + 127, 11, 44, 254, 118, 127, 11, 43, 52, 254, 118, 127, 11, 44, 52, 254, + 118, 127, 11, 43, 71, 216, 7, 220, 55, 127, 11, 44, 71, 216, 7, 220, 55, + 127, 11, 43, 244, 71, 226, 7, 11, 44, 244, 71, 226, 7, 214, 153, 224, 27, + 75, 246, 112, 224, 27, 75, 254, 96, 243, 105, 250, 44, 75, 250, 10, 243, + 105, 250, 44, 75, 44, 80, 2, 37, 225, 25, 200, 140, 75, 200, 97, 75, 200, + 43, 44, 75, 200, 140, 52, 75, 200, 97, 52, 75, 200, 43, 44, 52, 75, 200, + 140, 80, 243, 251, 130, 200, 97, 80, 243, 251, 130, 200, 140, 52, 80, + 243, 251, 130, 200, 97, 52, 80, 243, 251, 130, 200, 97, 218, 232, 75, 46, + 47, 251, 223, 46, 47, 247, 125, 46, 47, 246, 253, 46, 47, 247, 124, 46, + 47, 246, 189, 46, 47, 247, 60, 46, 47, 246, 252, 46, 47, 247, 123, 46, + 47, 246, 157, 46, 47, 247, 28, 46, 47, 246, 220, 46, 47, 247, 91, 46, 47, + 246, 188, 46, 47, 247, 59, 46, 47, 246, 251, 46, 47, 247, 122, 46, 47, + 246, 141, 46, 47, 247, 12, 46, 47, 246, 204, 46, 47, 247, 75, 46, 47, + 246, 172, 46, 47, 247, 43, 46, 47, 246, 235, 46, 47, 247, 106, 46, 47, + 246, 156, 46, 47, 247, 27, 46, 47, 246, 219, 46, 47, 247, 90, 46, 47, + 246, 187, 46, 47, 247, 58, 46, 47, 246, 250, 46, 47, 247, 121, 46, 47, + 246, 133, 46, 47, 247, 4, 46, 47, 246, 196, 46, 47, 247, 67, 46, 47, 246, + 164, 46, 47, 247, 35, 46, 47, 246, 227, 46, 47, 247, 98, 46, 47, 246, + 148, 46, 47, 247, 19, 46, 47, 246, 211, 46, 47, 247, 82, 46, 47, 246, + 179, 46, 47, 247, 50, 46, 47, 246, 242, 46, 47, 247, 113, 46, 47, 246, + 140, 46, 47, 247, 11, 46, 47, 246, 203, 46, 47, 247, 74, 46, 47, 246, + 171, 46, 47, 247, 42, 46, 47, 246, 234, 46, 47, 247, 105, 46, 47, 246, + 155, 46, 47, 247, 26, 46, 47, 246, 218, 46, 47, 247, 89, 46, 47, 246, + 186, 46, 47, 247, 57, 46, 47, 246, 249, 46, 47, 247, 120, 46, 47, 246, + 129, 46, 47, 247, 0, 46, 47, 246, 192, 46, 47, 247, 63, 46, 47, 246, 160, + 46, 47, 247, 31, 46, 47, 246, 223, 46, 47, 247, 94, 46, 47, 246, 144, 46, + 47, 247, 15, 46, 47, 246, 207, 46, 47, 247, 78, 46, 47, 246, 175, 46, 47, + 247, 46, 46, 47, 246, 238, 46, 47, 247, 109, 46, 47, 246, 136, 46, 47, + 247, 7, 46, 47, 246, 199, 46, 47, 247, 70, 46, 47, 246, 167, 46, 47, 247, + 38, 46, 47, 246, 230, 46, 47, 247, 101, 46, 47, 246, 151, 46, 47, 247, + 22, 46, 47, 246, 214, 46, 47, 247, 85, 46, 47, 246, 182, 46, 47, 247, 53, + 46, 47, 246, 245, 46, 47, 247, 116, 46, 47, 246, 132, 46, 47, 247, 3, 46, + 47, 246, 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247, 34, 46, 47, + 246, 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18, 46, 47, + 246, 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46, 47, + 246, 241, 46, 47, 247, 112, 46, 47, 246, 139, 46, 47, 247, 10, 46, 47, + 246, 202, 46, 47, 247, 73, 46, 47, 246, 170, 46, 47, 247, 41, 46, 47, + 246, 233, 46, 47, 247, 104, 46, 47, 246, 154, 46, 47, 247, 25, 46, 47, + 246, 217, 46, 47, 247, 88, 46, 47, 246, 185, 46, 47, 247, 56, 46, 47, + 246, 248, 46, 47, 247, 119, 46, 47, 246, 127, 46, 47, 246, 254, 46, 47, + 246, 190, 46, 47, 247, 61, 46, 47, 246, 158, 46, 47, 247, 29, 46, 47, + 246, 221, 46, 47, 247, 92, 46, 47, 246, 142, 46, 47, 247, 13, 46, 47, + 246, 205, 46, 47, 247, 76, 46, 47, 246, 173, 46, 47, 247, 44, 46, 47, + 246, 236, 46, 47, 247, 107, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47, 246, 197, 46, 47, 247, 68, 46, 47, 246, 165, 46, 47, 247, 36, 46, 47, 246, 228, 46, 47, 247, 99, 46, 47, 246, 149, 46, 47, 247, 20, 46, 47, 246, 212, 46, 47, 247, 83, 46, 47, 246, 180, 46, 47, 247, 51, 46, 47, - 246, 243, 46, 47, 247, 114, 46, 47, 246, 126, 46, 47, 246, 253, 46, 47, - 246, 189, 46, 47, 247, 60, 46, 47, 246, 157, 46, 47, 247, 28, 46, 47, - 246, 220, 46, 47, 247, 91, 46, 47, 246, 141, 46, 47, 247, 12, 46, 47, - 246, 204, 46, 47, 247, 75, 46, 47, 246, 172, 46, 47, 247, 43, 46, 47, - 246, 235, 46, 47, 247, 106, 46, 47, 246, 133, 46, 47, 247, 4, 46, 47, - 246, 196, 46, 47, 247, 67, 46, 47, 246, 164, 46, 47, 247, 35, 46, 47, - 246, 227, 46, 47, 247, 98, 46, 47, 246, 148, 46, 47, 247, 19, 46, 47, - 246, 211, 46, 47, 247, 82, 46, 47, 246, 179, 46, 47, 247, 50, 46, 47, - 246, 242, 46, 47, 247, 113, 46, 47, 246, 122, 46, 47, 246, 249, 46, 47, - 246, 185, 46, 47, 247, 56, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47, - 246, 216, 46, 47, 247, 87, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, 246, - 200, 46, 47, 247, 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, 246, - 231, 46, 47, 247, 102, 46, 47, 246, 129, 46, 47, 247, 0, 46, 47, 246, - 192, 46, 47, 247, 63, 46, 47, 246, 160, 46, 47, 247, 31, 46, 47, 246, - 223, 46, 47, 247, 94, 46, 47, 246, 144, 46, 47, 247, 15, 46, 47, 246, - 207, 46, 47, 247, 78, 46, 47, 246, 175, 46, 47, 247, 46, 46, 47, 246, - 238, 46, 47, 247, 109, 46, 47, 246, 125, 46, 47, 246, 252, 46, 47, 246, - 188, 46, 47, 247, 59, 46, 47, 246, 156, 46, 47, 247, 27, 46, 47, 246, - 219, 46, 47, 247, 90, 46, 47, 246, 140, 46, 47, 247, 11, 46, 47, 246, - 203, 46, 47, 247, 74, 46, 47, 246, 171, 46, 47, 247, 42, 46, 47, 246, - 234, 46, 47, 247, 105, 46, 47, 246, 132, 46, 47, 247, 3, 46, 47, 246, - 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247, 34, 46, 47, 246, - 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18, 46, 47, 246, - 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46, 47, 246, - 241, 46, 47, 247, 112, 46, 47, 246, 120, 46, 47, 246, 247, 46, 47, 246, - 183, 46, 47, 247, 54, 46, 47, 246, 151, 46, 47, 247, 22, 46, 47, 246, - 214, 46, 47, 247, 85, 46, 47, 246, 135, 46, 47, 247, 6, 46, 47, 246, 198, - 46, 47, 247, 69, 46, 47, 246, 166, 46, 47, 247, 37, 46, 47, 246, 229, 46, - 47, 247, 100, 46, 47, 246, 127, 46, 47, 246, 254, 46, 47, 246, 190, 46, - 47, 247, 61, 46, 47, 246, 158, 46, 47, 247, 29, 46, 47, 246, 221, 46, 47, - 247, 92, 46, 47, 246, 142, 46, 47, 247, 13, 46, 47, 246, 205, 46, 47, - 247, 76, 46, 47, 246, 173, 46, 47, 247, 44, 46, 47, 246, 236, 46, 47, - 247, 107, 46, 47, 246, 123, 46, 47, 246, 250, 46, 47, 246, 186, 46, 47, - 247, 57, 46, 47, 246, 154, 46, 47, 247, 25, 46, 47, 246, 217, 46, 47, - 247, 88, 46, 47, 246, 138, 46, 47, 247, 9, 46, 47, 246, 201, 46, 47, 247, - 72, 46, 47, 246, 169, 46, 47, 247, 40, 46, 47, 246, 232, 46, 47, 247, - 103, 46, 47, 246, 130, 46, 47, 247, 1, 46, 47, 246, 193, 46, 47, 247, 64, - 46, 47, 246, 161, 46, 47, 247, 32, 46, 47, 246, 224, 46, 47, 247, 95, 46, - 47, 246, 145, 46, 47, 247, 16, 46, 47, 246, 208, 46, 47, 247, 79, 46, 47, - 246, 176, 46, 47, 247, 47, 46, 47, 246, 239, 46, 47, 247, 110, 46, 47, - 246, 121, 46, 47, 246, 248, 46, 47, 246, 184, 46, 47, 247, 55, 46, 47, - 246, 152, 46, 47, 247, 23, 46, 47, 246, 215, 46, 47, 247, 86, 46, 47, - 246, 136, 46, 47, 247, 7, 46, 47, 246, 199, 46, 47, 247, 70, 46, 47, 246, - 167, 46, 47, 247, 38, 46, 47, 246, 230, 46, 47, 247, 101, 46, 47, 246, - 128, 46, 47, 246, 255, 46, 47, 246, 191, 46, 47, 247, 62, 46, 47, 246, - 159, 46, 47, 247, 30, 46, 47, 246, 222, 46, 47, 247, 93, 46, 47, 246, - 143, 46, 47, 247, 14, 46, 47, 246, 206, 46, 47, 247, 77, 46, 47, 246, - 174, 46, 47, 247, 45, 46, 47, 246, 237, 46, 47, 247, 108, 46, 47, 246, - 124, 46, 47, 246, 251, 46, 47, 246, 187, 46, 47, 247, 58, 46, 47, 246, - 155, 46, 47, 247, 26, 46, 47, 246, 218, 46, 47, 247, 89, 46, 47, 246, - 139, 46, 47, 247, 10, 46, 47, 246, 202, 46, 47, 247, 73, 46, 47, 246, - 170, 46, 47, 247, 41, 46, 47, 246, 233, 46, 47, 247, 104, 46, 47, 246, - 131, 46, 47, 247, 2, 46, 47, 246, 194, 46, 47, 247, 65, 46, 47, 246, 162, - 46, 47, 247, 33, 46, 47, 246, 225, 46, 47, 247, 96, 46, 47, 246, 146, 46, - 47, 247, 17, 46, 47, 246, 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47, - 247, 48, 46, 47, 246, 240, 46, 47, 247, 111, 97, 215, 58, 80, 2, 67, 91, - 97, 215, 58, 80, 2, 52, 67, 91, 140, 52, 80, 2, 67, 91, 97, 52, 80, 2, - 67, 91, 43, 44, 52, 80, 2, 67, 91, 97, 215, 58, 80, 243, 244, 130, 140, - 52, 80, 243, 244, 130, 97, 52, 80, 243, 244, 130, 246, 105, 80, 2, 203, - 91, 214, 153, 80, 2, 203, 91, 214, 153, 215, 212, 74, 246, 105, 215, 212, - 74, 140, 52, 248, 158, 74, 97, 52, 248, 158, 74, 140, 215, 212, 248, 158, - 74, 97, 215, 212, 248, 158, 74, 97, 215, 58, 215, 212, 248, 158, 74, 97, - 80, 2, 246, 119, 218, 140, 214, 153, 80, 216, 43, 130, 246, 105, 80, 216, - 43, 130, 97, 80, 2, 217, 79, 2, 67, 91, 97, 80, 2, 217, 79, 2, 52, 67, - 91, 97, 215, 58, 80, 2, 217, 78, 97, 215, 58, 80, 2, 217, 79, 2, 67, 91, - 97, 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 253, 252, 97, 253, 252, - 140, 52, 253, 252, 97, 52, 253, 252, 140, 80, 216, 43, 85, 247, 249, 97, - 80, 216, 43, 85, 247, 249, 140, 80, 243, 244, 252, 142, 216, 43, 85, 247, - 249, 97, 80, 243, 244, 252, 142, 216, 43, 85, 247, 249, 228, 57, 212, 9, - 22, 219, 29, 245, 221, 74, 228, 57, 245, 221, 22, 219, 29, 212, 9, 74, - 228, 57, 212, 9, 80, 2, 103, 228, 57, 245, 221, 80, 2, 103, 219, 29, 245, - 221, 80, 2, 103, 219, 29, 212, 9, 80, 2, 103, 228, 57, 212, 9, 80, 22, - 228, 57, 245, 221, 74, 228, 57, 245, 221, 80, 22, 219, 29, 245, 221, 74, - 219, 29, 245, 221, 80, 22, 219, 29, 212, 9, 74, 219, 29, 212, 9, 80, 22, - 228, 57, 212, 9, 74, 222, 229, 248, 0, 249, 126, 244, 176, 247, 255, 244, - 176, 248, 0, 249, 126, 222, 229, 247, 255, 219, 29, 245, 221, 80, 249, - 126, 228, 57, 245, 221, 74, 228, 57, 245, 221, 80, 249, 126, 219, 29, - 245, 221, 74, 244, 176, 248, 0, 249, 126, 228, 57, 245, 221, 74, 222, - 229, 248, 0, 249, 126, 219, 29, 245, 221, 74, 228, 57, 245, 221, 80, 249, - 126, 228, 57, 212, 9, 74, 228, 57, 212, 9, 80, 249, 126, 228, 57, 245, - 221, 74, 212, 36, 80, 225, 8, 247, 196, 222, 252, 80, 225, 8, 97, 216, - 189, 249, 91, 214, 152, 80, 225, 8, 97, 216, 189, 249, 91, 246, 104, 80, - 225, 8, 246, 105, 216, 189, 249, 91, 233, 38, 80, 225, 8, 246, 105, 216, - 189, 249, 91, 222, 242, 222, 245, 254, 27, 250, 3, 74, 233, 41, 254, 27, - 254, 89, 74, 216, 15, 254, 27, 254, 89, 74, 251, 176, 254, 27, 254, 89, - 74, 216, 15, 254, 27, 250, 3, 80, 2, 230, 182, 216, 15, 254, 27, 254, 89, - 80, 2, 225, 23, 232, 109, 44, 220, 153, 250, 3, 74, 232, 109, 43, 220, - 153, 254, 89, 74, 254, 89, 250, 1, 250, 37, 74, 250, 3, 250, 1, 250, 37, - 74, 97, 80, 77, 219, 252, 140, 74, 140, 80, 77, 219, 252, 97, 74, 219, - 252, 97, 80, 77, 140, 74, 97, 80, 2, 96, 51, 140, 80, 2, 96, 51, 97, 80, - 216, 140, 211, 178, 43, 44, 80, 216, 140, 4, 250, 36, 214, 153, 215, 58, - 80, 243, 244, 4, 250, 36, 43, 252, 140, 120, 44, 252, 140, 124, 241, 255, - 43, 252, 140, 124, 44, 252, 140, 120, 241, 255, 120, 252, 140, 44, 124, - 252, 140, 43, 241, 255, 120, 252, 140, 43, 124, 252, 140, 44, 241, 255, - 43, 252, 140, 120, 44, 252, 140, 120, 241, 255, 120, 252, 140, 44, 124, - 252, 140, 44, 241, 255, 43, 252, 140, 124, 44, 252, 140, 124, 241, 255, - 120, 252, 140, 43, 124, 252, 140, 43, 241, 255, 140, 242, 0, 2, 252, 140, - 120, 216, 43, 130, 97, 242, 0, 2, 252, 140, 120, 216, 43, 130, 214, 153, - 242, 0, 2, 252, 140, 44, 216, 43, 130, 246, 105, 242, 0, 2, 252, 140, 44, - 216, 43, 130, 140, 242, 0, 2, 252, 140, 124, 216, 43, 130, 97, 242, 0, 2, - 252, 140, 124, 216, 43, 130, 214, 153, 242, 0, 2, 252, 140, 43, 216, 43, - 130, 246, 105, 242, 0, 2, 252, 140, 43, 216, 43, 130, 140, 242, 0, 2, - 252, 140, 120, 243, 244, 130, 97, 242, 0, 2, 252, 140, 120, 243, 244, - 130, 214, 153, 242, 0, 2, 252, 140, 44, 243, 244, 130, 246, 105, 242, 0, - 2, 252, 140, 44, 243, 244, 130, 140, 242, 0, 2, 252, 140, 124, 243, 244, - 130, 97, 242, 0, 2, 252, 140, 124, 243, 244, 130, 214, 153, 242, 0, 2, - 252, 140, 43, 243, 244, 130, 246, 105, 242, 0, 2, 252, 140, 43, 243, 244, - 130, 140, 242, 0, 2, 252, 140, 120, 77, 140, 242, 0, 2, 252, 140, 246, - 107, 214, 153, 242, 0, 2, 252, 140, 43, 252, 31, 214, 153, 242, 0, 2, - 252, 140, 222, 252, 97, 242, 0, 2, 252, 140, 120, 77, 97, 242, 0, 2, 252, - 140, 246, 107, 246, 105, 242, 0, 2, 252, 140, 43, 252, 31, 246, 105, 242, - 0, 2, 252, 140, 222, 252, 140, 242, 0, 2, 252, 140, 120, 77, 97, 242, 0, - 2, 252, 140, 214, 163, 140, 242, 0, 2, 252, 140, 124, 77, 97, 242, 0, 2, - 252, 140, 246, 107, 97, 242, 0, 2, 252, 140, 120, 77, 140, 242, 0, 2, - 252, 140, 214, 163, 97, 242, 0, 2, 252, 140, 124, 77, 140, 242, 0, 2, - 252, 140, 246, 107, 140, 242, 0, 2, 252, 140, 120, 77, 199, 248, 157, - 140, 242, 0, 2, 252, 140, 124, 252, 44, 199, 248, 157, 97, 242, 0, 2, - 252, 140, 120, 77, 199, 248, 157, 97, 242, 0, 2, 252, 140, 124, 252, 44, - 199, 248, 157, 214, 153, 242, 0, 2, 252, 140, 43, 252, 31, 246, 105, 242, - 0, 2, 252, 140, 222, 252, 246, 105, 242, 0, 2, 252, 140, 43, 252, 31, - 214, 153, 242, 0, 2, 252, 140, 222, 252, 44, 52, 80, 2, 222, 184, 241, - 236, 245, 99, 5, 77, 97, 74, 216, 90, 226, 169, 77, 97, 74, 140, 80, 77, - 216, 90, 226, 168, 97, 80, 77, 216, 90, 226, 168, 97, 80, 77, 254, 149, - 128, 111, 233, 16, 77, 140, 74, 140, 80, 216, 140, 233, 15, 242, 131, 77, - 97, 74, 218, 65, 77, 97, 74, 140, 80, 216, 140, 218, 64, 218, 23, 77, - 140, 74, 43, 244, 92, 217, 78, 44, 244, 92, 217, 78, 120, 244, 92, 217, - 78, 124, 244, 92, 217, 78, 215, 212, 67, 252, 142, 248, 61, 210, 160, - 188, 218, 243, 210, 160, 188, 215, 49, 249, 227, 43, 71, 249, 100, 127, - 44, 71, 249, 100, 127, 43, 71, 226, 4, 44, 71, 226, 4, 210, 160, 188, 43, - 236, 16, 127, 210, 160, 188, 44, 236, 16, 127, 210, 160, 188, 43, 251, - 243, 127, 210, 160, 188, 44, 251, 243, 127, 43, 42, 251, 159, 2, 214, - 183, 44, 42, 251, 159, 2, 214, 183, 43, 42, 251, 159, 2, 216, 116, 236, - 1, 216, 15, 249, 161, 44, 42, 251, 159, 2, 216, 116, 236, 1, 251, 176, - 249, 161, 43, 42, 251, 159, 2, 216, 116, 236, 1, 251, 176, 249, 161, 44, - 42, 251, 159, 2, 216, 116, 236, 1, 216, 15, 249, 161, 43, 254, 111, 251, - 159, 2, 247, 121, 44, 254, 111, 251, 159, 2, 247, 121, 43, 254, 27, 233, - 16, 127, 44, 254, 27, 242, 131, 127, 52, 43, 254, 27, 242, 131, 127, 52, - 44, 254, 27, 233, 16, 127, 43, 85, 216, 7, 220, 54, 127, 44, 85, 216, 7, - 220, 54, 127, 246, 119, 244, 136, 67, 210, 35, 232, 214, 231, 89, 254, - 111, 226, 171, 233, 47, 44, 254, 111, 214, 12, 2, 218, 235, 231, 89, 44, - 254, 111, 2, 247, 121, 254, 111, 2, 222, 93, 235, 216, 255, 4, 254, 110, - 219, 0, 254, 111, 226, 171, 233, 47, 219, 0, 254, 111, 226, 171, 214, - 163, 215, 94, 254, 110, 223, 50, 254, 110, 254, 111, 2, 214, 183, 223, - 50, 254, 111, 2, 214, 183, 226, 249, 254, 111, 226, 171, 214, 163, 226, - 249, 254, 111, 226, 171, 246, 107, 231, 89, 254, 111, 2, 204, 254, 6, - 245, 141, 236, 1, 80, 225, 8, 120, 22, 222, 252, 231, 89, 254, 111, 2, - 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 120, 22, 233, 47, 231, 89, - 254, 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 124, 22, 222, - 252, 231, 89, 254, 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, - 124, 22, 233, 47, 231, 89, 254, 111, 2, 204, 254, 6, 245, 141, 236, 1, - 80, 225, 8, 44, 22, 214, 163, 231, 89, 254, 111, 2, 204, 254, 6, 245, - 141, 236, 1, 80, 225, 8, 43, 22, 214, 163, 231, 89, 254, 111, 2, 204, - 254, 6, 245, 141, 236, 1, 80, 225, 8, 44, 22, 246, 107, 231, 89, 254, - 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 43, 22, 246, 107, 223, - 50, 245, 153, 220, 128, 245, 153, 220, 129, 2, 226, 124, 245, 153, 220, - 129, 2, 4, 250, 37, 48, 245, 153, 220, 129, 2, 44, 80, 48, 245, 153, 220, - 129, 2, 43, 80, 48, 250, 37, 2, 203, 130, 37, 67, 130, 37, 226, 8, 37, - 223, 51, 219, 47, 37, 225, 172, 250, 37, 247, 174, 251, 79, 203, 252, - 142, 22, 216, 15, 163, 247, 174, 251, 79, 67, 130, 250, 37, 2, 218, 25, - 211, 178, 37, 254, 88, 247, 170, 50, 120, 80, 216, 140, 250, 36, 37, 71, - 251, 114, 37, 251, 114, 37, 233, 15, 37, 242, 130, 250, 37, 2, 4, 250, - 37, 216, 43, 216, 197, 222, 252, 250, 37, 2, 113, 203, 218, 92, 216, 43, - 216, 197, 222, 252, 92, 222, 229, 248, 0, 219, 96, 92, 244, 176, 248, 0, - 219, 96, 92, 253, 217, 92, 4, 250, 36, 92, 218, 235, 113, 235, 66, 218, - 233, 215, 227, 2, 59, 48, 215, 227, 2, 214, 183, 222, 93, 236, 1, 215, - 226, 215, 227, 2, 220, 135, 253, 208, 251, 175, 44, 215, 227, 77, 43, - 215, 226, 43, 215, 227, 252, 31, 67, 130, 67, 252, 142, 252, 31, 44, 215, - 226, 251, 166, 2, 43, 163, 251, 222, 251, 166, 2, 44, 163, 251, 222, 85, - 251, 165, 30, 2, 43, 163, 251, 222, 30, 2, 44, 163, 251, 222, 71, 240, - 237, 85, 240, 237, 43, 211, 244, 244, 136, 44, 211, 244, 244, 136, 43, - 52, 211, 244, 244, 136, 44, 52, 211, 244, 244, 136, 235, 249, 235, 235, - 216, 113, 117, 235, 235, 235, 236, 229, 103, 2, 67, 130, 246, 113, 230, - 88, 42, 2, 249, 182, 226, 128, 235, 247, 253, 238, 219, 220, 224, 181, - 245, 99, 5, 22, 219, 98, 226, 8, 245, 99, 5, 22, 219, 98, 226, 9, 2, 216, - 90, 48, 240, 105, 216, 43, 22, 219, 98, 226, 8, 242, 184, 218, 156, 216, - 186, 246, 106, 215, 227, 2, 43, 163, 251, 222, 246, 106, 215, 227, 2, 44, - 163, 251, 222, 85, 247, 250, 2, 124, 74, 85, 232, 105, 71, 250, 37, 2, - 124, 74, 85, 250, 37, 2, 124, 74, 245, 86, 71, 218, 235, 245, 86, 85, - 218, 235, 245, 86, 71, 247, 249, 245, 86, 85, 247, 249, 245, 86, 71, 250, - 36, 245, 86, 85, 250, 36, 222, 133, 223, 51, 219, 48, 226, 168, 219, 48, - 2, 226, 124, 223, 51, 219, 48, 2, 203, 91, 251, 250, 219, 47, 251, 250, - 223, 51, 219, 47, 52, 225, 23, 215, 212, 225, 23, 233, 43, 249, 92, 254, - 111, 127, 222, 248, 249, 92, 254, 111, 127, 216, 79, 230, 180, 230, 25, - 37, 59, 226, 168, 230, 25, 37, 96, 226, 168, 230, 25, 37, 30, 226, 168, - 230, 25, 214, 176, 226, 169, 2, 247, 121, 230, 25, 214, 176, 226, 169, 2, - 225, 23, 230, 25, 42, 235, 200, 226, 168, 230, 25, 42, 214, 176, 226, - 168, 113, 232, 147, 22, 226, 168, 113, 232, 147, 177, 226, 168, 230, 25, - 30, 226, 168, 230, 155, 113, 218, 44, 218, 42, 2, 235, 212, 224, 25, 235, - 213, 226, 168, 244, 100, 226, 0, 235, 212, 235, 213, 2, 52, 91, 235, 213, - 253, 174, 2, 219, 96, 250, 33, 243, 227, 254, 89, 235, 210, 232, 215, - 235, 211, 2, 223, 116, 225, 238, 254, 3, 225, 2, 232, 215, 235, 211, 2, - 220, 153, 225, 238, 254, 3, 225, 2, 232, 215, 235, 211, 228, 53, 235, - 251, 216, 197, 225, 2, 235, 213, 254, 3, 115, 225, 12, 226, 168, 224, 19, - 235, 213, 226, 168, 235, 213, 2, 140, 80, 2, 103, 235, 213, 2, 30, 50, - 235, 213, 2, 235, 199, 235, 213, 2, 214, 175, 235, 213, 2, 226, 124, 235, - 213, 2, 214, 183, 235, 67, 233, 86, 43, 215, 227, 226, 168, 210, 160, - 188, 221, 202, 249, 210, 210, 160, 188, 221, 202, 225, 57, 210, 160, 188, - 221, 202, 224, 177, 96, 5, 2, 4, 250, 37, 48, 96, 5, 2, 250, 32, 255, 16, - 48, 96, 5, 2, 216, 90, 48, 96, 5, 2, 59, 51, 96, 5, 2, 216, 90, 51, 96, - 5, 2, 218, 66, 105, 96, 5, 2, 85, 215, 226, 230, 183, 5, 2, 249, 221, 48, - 230, 183, 5, 2, 59, 51, 230, 183, 5, 2, 244, 176, 247, 119, 230, 183, 5, - 2, 222, 229, 247, 119, 96, 5, 236, 1, 43, 163, 250, 36, 96, 5, 236, 1, - 44, 163, 250, 36, 213, 254, 177, 249, 132, 224, 181, 230, 85, 5, 2, 59, - 48, 230, 85, 5, 2, 214, 183, 220, 150, 224, 182, 2, 251, 176, 250, 0, - 219, 78, 224, 181, 230, 85, 5, 236, 1, 43, 163, 250, 36, 230, 85, 5, 236, - 1, 44, 163, 250, 36, 37, 230, 85, 5, 2, 250, 32, 255, 15, 230, 85, 5, - 236, 1, 52, 250, 36, 37, 247, 170, 50, 96, 5, 236, 1, 215, 226, 230, 183, - 5, 236, 1, 215, 226, 230, 85, 5, 236, 1, 215, 226, 235, 207, 224, 181, - 222, 243, 235, 207, 224, 181, 210, 160, 188, 223, 91, 249, 210, 254, 135, - 177, 249, 166, 235, 200, 2, 247, 121, 214, 176, 2, 230, 183, 50, 214, - 176, 2, 226, 124, 235, 200, 2, 226, 124, 235, 200, 2, 232, 147, 254, 119, - 214, 176, 2, 232, 147, 226, 159, 214, 176, 77, 235, 199, 235, 200, 77, - 214, 175, 214, 176, 77, 252, 142, 77, 235, 199, 235, 200, 77, 252, 142, - 77, 214, 175, 214, 176, 252, 31, 22, 235, 66, 2, 214, 175, 235, 200, 252, - 31, 22, 235, 66, 2, 235, 199, 250, 1, 214, 176, 2, 220, 134, 250, 1, 235, - 200, 2, 220, 134, 52, 42, 235, 199, 52, 42, 214, 175, 250, 1, 214, 176, - 2, 220, 135, 22, 219, 78, 224, 181, 232, 147, 22, 2, 59, 48, 232, 147, - 177, 2, 59, 48, 52, 232, 147, 254, 119, 52, 232, 147, 226, 159, 113, 235, - 201, 232, 147, 254, 119, 113, 235, 201, 232, 147, 226, 159, 219, 86, 233, - 86, 226, 159, 219, 86, 233, 86, 254, 119, 232, 147, 177, 226, 122, 232, - 147, 254, 119, 232, 147, 22, 2, 230, 225, 218, 140, 232, 147, 177, 2, - 230, 225, 218, 140, 232, 147, 22, 2, 203, 248, 157, 232, 147, 177, 2, - 203, 248, 157, 232, 147, 22, 2, 52, 226, 124, 232, 147, 22, 2, 214, 183, - 232, 147, 22, 2, 52, 214, 183, 4, 213, 251, 2, 214, 183, 232, 147, 177, - 2, 52, 226, 124, 232, 147, 177, 2, 52, 214, 183, 210, 160, 188, 247, 130, - 254, 80, 210, 160, 188, 223, 149, 254, 80, 245, 99, 5, 2, 59, 51, 240, - 105, 2, 59, 48, 215, 212, 203, 252, 142, 2, 52, 67, 91, 215, 212, 203, - 252, 142, 2, 215, 212, 67, 91, 216, 90, 226, 169, 2, 59, 48, 216, 90, - 226, 169, 2, 222, 229, 247, 119, 219, 163, 230, 183, 219, 162, 249, 200, - 2, 59, 48, 245, 99, 2, 253, 217, 254, 149, 128, 216, 43, 2, 250, 32, 255, - 15, 254, 49, 128, 177, 128, 111, 245, 99, 5, 77, 96, 50, 96, 5, 77, 245, - 99, 50, 245, 99, 5, 77, 216, 90, 226, 168, 52, 249, 228, 245, 100, 113, - 249, 195, 245, 99, 219, 177, 134, 249, 195, 245, 99, 219, 177, 245, 99, - 5, 2, 113, 170, 77, 22, 113, 170, 51, 245, 95, 2, 244, 12, 170, 48, 233, - 16, 2, 250, 37, 235, 216, 242, 131, 2, 250, 37, 235, 216, 233, 16, 2, - 224, 14, 164, 48, 242, 131, 2, 224, 14, 164, 48, 233, 16, 177, 219, 98, - 128, 111, 242, 131, 177, 219, 98, 128, 111, 233, 16, 177, 219, 98, 128, - 216, 43, 2, 59, 235, 216, 242, 131, 177, 219, 98, 128, 216, 43, 2, 59, - 235, 216, 233, 16, 177, 219, 98, 128, 216, 43, 2, 59, 48, 242, 131, 177, - 219, 98, 128, 216, 43, 2, 59, 48, 233, 16, 177, 219, 98, 128, 216, 43, 2, - 59, 77, 222, 252, 242, 131, 177, 219, 98, 128, 216, 43, 2, 59, 77, 233, - 47, 233, 16, 177, 254, 50, 242, 131, 177, 254, 50, 233, 16, 22, 219, 154, - 228, 53, 128, 111, 242, 131, 22, 219, 154, 228, 53, 128, 111, 233, 16, - 22, 228, 53, 254, 50, 242, 131, 22, 228, 53, 254, 50, 233, 16, 77, 246, - 112, 128, 77, 242, 130, 242, 131, 77, 246, 112, 128, 77, 233, 15, 233, - 16, 77, 219, 163, 177, 245, 100, 242, 131, 77, 219, 163, 177, 245, 100, - 233, 16, 77, 219, 163, 77, 242, 130, 242, 131, 77, 219, 163, 77, 233, 15, - 233, 16, 77, 242, 131, 77, 246, 112, 245, 100, 242, 131, 77, 233, 16, 77, - 246, 112, 245, 100, 233, 16, 77, 219, 98, 128, 77, 242, 131, 77, 219, 98, - 245, 100, 242, 131, 77, 219, 98, 128, 77, 233, 16, 77, 219, 98, 245, 100, - 219, 98, 128, 216, 43, 177, 233, 15, 219, 98, 128, 216, 43, 177, 242, - 130, 219, 98, 128, 216, 43, 177, 233, 16, 2, 59, 235, 216, 219, 98, 128, - 216, 43, 177, 242, 131, 2, 59, 235, 216, 246, 112, 128, 216, 43, 177, - 233, 15, 246, 112, 128, 216, 43, 177, 242, 130, 246, 112, 219, 98, 128, - 216, 43, 177, 233, 15, 246, 112, 219, 98, 128, 216, 43, 177, 242, 130, - 219, 163, 177, 233, 15, 219, 163, 177, 242, 130, 219, 163, 77, 233, 16, - 77, 245, 99, 50, 219, 163, 77, 242, 131, 77, 245, 99, 50, 52, 229, 92, - 233, 15, 52, 229, 92, 242, 130, 52, 229, 92, 233, 16, 2, 214, 183, 242, - 131, 226, 122, 233, 15, 242, 131, 252, 31, 233, 15, 233, 16, 250, 1, 251, - 79, 249, 93, 242, 131, 250, 1, 251, 79, 249, 93, 233, 16, 250, 1, 251, - 79, 249, 94, 77, 219, 98, 245, 100, 242, 131, 250, 1, 251, 79, 249, 94, - 77, 219, 98, 245, 100, 219, 79, 216, 201, 233, 84, 216, 201, 219, 79, - 216, 202, 177, 128, 111, 233, 84, 216, 202, 177, 128, 111, 245, 99, 5, 2, - 251, 109, 48, 224, 204, 77, 219, 154, 245, 99, 50, 218, 57, 77, 219, 154, - 245, 99, 50, 224, 204, 77, 219, 154, 228, 53, 128, 111, 218, 57, 77, 219, - 154, 228, 53, 128, 111, 224, 204, 77, 245, 99, 50, 218, 57, 77, 245, 99, - 50, 224, 204, 77, 228, 53, 128, 111, 218, 57, 77, 228, 53, 128, 111, 224, - 204, 77, 254, 149, 128, 111, 218, 57, 77, 254, 149, 128, 111, 224, 204, - 77, 228, 53, 254, 149, 128, 111, 218, 57, 77, 228, 53, 254, 149, 128, - 111, 52, 224, 203, 52, 218, 56, 218, 65, 2, 247, 121, 218, 23, 2, 247, - 121, 218, 65, 2, 96, 5, 51, 218, 23, 2, 96, 5, 51, 218, 65, 2, 230, 85, - 5, 51, 218, 23, 2, 230, 85, 5, 51, 218, 65, 64, 177, 128, 216, 43, 2, 59, - 48, 218, 23, 64, 177, 128, 216, 43, 2, 59, 48, 218, 65, 64, 77, 245, 99, - 50, 218, 23, 64, 77, 245, 99, 50, 218, 65, 64, 77, 216, 90, 226, 168, - 218, 23, 64, 77, 216, 90, 226, 168, 218, 65, 64, 77, 254, 149, 128, 111, - 218, 23, 64, 77, 254, 149, 128, 111, 218, 65, 64, 77, 228, 53, 128, 111, - 218, 23, 64, 77, 228, 53, 128, 111, 42, 43, 204, 93, 226, 168, 42, 44, - 204, 93, 226, 168, 250, 1, 218, 64, 250, 1, 218, 22, 250, 1, 218, 65, - 177, 128, 111, 250, 1, 218, 23, 177, 128, 111, 218, 65, 77, 218, 22, 218, - 23, 77, 218, 64, 218, 65, 77, 218, 64, 218, 23, 77, 218, 22, 218, 23, - 252, 31, 218, 64, 218, 23, 252, 31, 22, 235, 66, 251, 79, 248, 158, 2, - 218, 64, 245, 171, 64, 226, 171, 246, 104, 225, 49, 2, 217, 13, 216, 14, - 215, 241, 235, 199, 244, 22, 228, 66, 219, 252, 43, 217, 88, 219, 252, - 124, 217, 88, 219, 252, 120, 217, 88, 225, 173, 2, 222, 92, 67, 252, 142, - 215, 212, 44, 215, 93, 52, 67, 252, 142, 43, 215, 93, 67, 252, 142, 52, - 43, 215, 93, 52, 67, 252, 142, 52, 43, 215, 93, 199, 248, 158, 243, 244, - 43, 231, 64, 64, 52, 213, 239, 219, 252, 124, 217, 89, 2, 226, 124, 219, - 252, 120, 217, 89, 2, 214, 183, 219, 252, 120, 217, 89, 77, 219, 252, - 124, 217, 88, 52, 124, 217, 88, 52, 120, 217, 88, 52, 218, 104, 228, 53, - 50, 223, 50, 52, 218, 104, 228, 53, 50, 247, 139, 228, 53, 247, 176, 2, - 223, 50, 229, 102, 219, 96, 67, 232, 215, 2, 250, 37, 48, 67, 232, 215, - 2, 250, 37, 51, 124, 217, 89, 2, 250, 37, 51, 226, 9, 2, 203, 91, 226, 9, - 2, 216, 90, 226, 168, 215, 212, 67, 252, 142, 251, 245, 223, 92, 215, - 212, 67, 252, 142, 2, 203, 91, 215, 212, 249, 228, 226, 168, 215, 212, - 229, 92, 233, 15, 215, 212, 229, 92, 242, 130, 246, 112, 219, 98, 233, - 16, 177, 128, 111, 246, 112, 219, 98, 242, 131, 177, 128, 111, 215, 212, - 219, 48, 251, 245, 223, 92, 233, 86, 215, 212, 67, 252, 142, 226, 168, - 52, 219, 48, 226, 168, 71, 67, 130, 230, 25, 71, 67, 130, 228, 57, 245, - 221, 71, 74, 228, 57, 212, 9, 71, 74, 219, 29, 245, 221, 71, 74, 219, 29, - 212, 9, 71, 74, 43, 44, 71, 74, 140, 85, 74, 214, 153, 85, 74, 246, 105, - 85, 74, 228, 57, 245, 221, 85, 74, 228, 57, 212, 9, 85, 74, 219, 29, 245, - 221, 85, 74, 219, 29, 212, 9, 85, 74, 43, 44, 85, 74, 120, 124, 85, 74, - 97, 80, 2, 216, 78, 246, 104, 97, 80, 2, 216, 78, 214, 152, 140, 80, 2, - 216, 78, 246, 104, 140, 80, 2, 216, 78, 214, 152, 42, 2, 216, 15, 163, - 251, 222, 42, 2, 251, 176, 163, 251, 222, 42, 2, 214, 160, 44, 248, 0, - 163, 251, 222, 42, 2, 232, 109, 43, 248, 0, 163, 251, 222, 247, 250, 2, - 43, 163, 251, 222, 247, 250, 2, 44, 163, 251, 222, 247, 250, 2, 216, 15, - 163, 251, 222, 247, 250, 2, 251, 176, 163, 251, 222, 246, 119, 218, 235, - 85, 233, 86, 218, 235, 71, 233, 86, 218, 235, 85, 213, 187, 4, 218, 235, - 71, 213, 187, 4, 218, 235, 85, 225, 191, 71, 225, 191, 71, 241, 194, 85, - 241, 194, 203, 85, 241, 194, 85, 233, 86, 250, 36, 85, 231, 83, 247, 249, - 71, 231, 83, 247, 249, 85, 231, 83, 232, 105, 71, 231, 83, 232, 105, 85, - 4, 247, 249, 85, 4, 232, 105, 71, 4, 232, 105, 85, 203, 245, 165, 71, - 203, 245, 165, 85, 67, 245, 165, 71, 67, 245, 165, 43, 80, 2, 4, 250, 36, - 134, 140, 253, 248, 43, 80, 2, 37, 225, 23, 199, 140, 218, 231, 74, 140, - 215, 58, 80, 2, 67, 91, 140, 215, 58, 80, 2, 52, 67, 91, 140, 215, 58, - 80, 243, 244, 130, 140, 215, 58, 215, 212, 248, 158, 74, 140, 80, 2, 246, - 119, 218, 140, 140, 80, 2, 217, 79, 2, 67, 91, 140, 80, 2, 217, 79, 2, - 52, 67, 91, 140, 215, 58, 80, 2, 217, 78, 140, 215, 58, 80, 2, 217, 79, - 2, 67, 91, 140, 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 80, 216, - 140, 211, 178, 212, 36, 80, 225, 8, 247, 196, 233, 47, 245, 99, 5, 77, - 140, 74, 223, 51, 216, 90, 226, 169, 77, 140, 74, 140, 80, 77, 223, 51, - 254, 149, 128, 111, 97, 80, 216, 140, 242, 130, 97, 80, 216, 140, 218, - 22, 140, 224, 25, 74, 97, 224, 25, 74, 223, 51, 216, 90, 226, 169, 77, - 97, 74, 97, 80, 77, 223, 51, 254, 149, 128, 111, 216, 90, 226, 169, 77, - 140, 74, 140, 80, 77, 254, 149, 128, 111, 140, 80, 77, 223, 51, 216, 90, - 226, 168, 97, 80, 77, 223, 51, 216, 90, 226, 168, 71, 231, 83, 218, 157, - 85, 4, 218, 157, 71, 4, 218, 157, 85, 222, 248, 225, 191, 71, 222, 248, - 225, 191, 114, 233, 86, 250, 36, 114, 226, 125, 2, 226, 125, 235, 216, - 114, 250, 37, 2, 250, 37, 235, 216, 114, 250, 36, 114, 37, 221, 255, 145, - 6, 1, 253, 160, 145, 6, 1, 251, 118, 145, 6, 1, 213, 253, 145, 6, 1, 242, - 186, 145, 6, 1, 247, 141, 145, 6, 1, 211, 21, 145, 6, 1, 210, 68, 145, 6, - 1, 246, 35, 145, 6, 1, 210, 91, 145, 6, 1, 235, 149, 145, 6, 1, 65, 235, - 149, 145, 6, 1, 73, 145, 6, 1, 247, 161, 145, 6, 1, 234, 241, 145, 6, 1, - 232, 187, 145, 6, 1, 230, 30, 145, 6, 1, 229, 192, 145, 6, 1, 226, 186, - 145, 6, 1, 225, 5, 145, 6, 1, 222, 228, 145, 6, 1, 219, 84, 145, 6, 1, - 215, 81, 145, 6, 1, 214, 201, 145, 6, 1, 243, 247, 145, 6, 1, 241, 200, - 145, 6, 1, 226, 136, 145, 6, 1, 225, 222, 145, 6, 1, 219, 229, 145, 6, 1, - 215, 168, 145, 6, 1, 250, 76, 145, 6, 1, 220, 103, 145, 6, 1, 211, 27, - 145, 6, 1, 211, 29, 145, 6, 1, 211, 57, 145, 6, 1, 218, 254, 162, 145, 6, - 1, 210, 212, 145, 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184, 2, 217, 78, - 145, 6, 1, 210, 244, 145, 6, 1, 235, 185, 4, 210, 183, 145, 6, 1, 251, - 250, 210, 183, 145, 6, 1, 235, 185, 251, 250, 210, 183, 145, 6, 1, 244, - 83, 145, 6, 1, 235, 147, 145, 6, 1, 219, 228, 145, 6, 1, 215, 203, 61, - 145, 6, 1, 233, 76, 230, 30, 145, 4, 1, 253, 160, 145, 4, 1, 251, 118, - 145, 4, 1, 213, 253, 145, 4, 1, 242, 186, 145, 4, 1, 247, 141, 145, 4, 1, - 211, 21, 145, 4, 1, 210, 68, 145, 4, 1, 246, 35, 145, 4, 1, 210, 91, 145, - 4, 1, 235, 149, 145, 4, 1, 65, 235, 149, 145, 4, 1, 73, 145, 4, 1, 247, - 161, 145, 4, 1, 234, 241, 145, 4, 1, 232, 187, 145, 4, 1, 230, 30, 145, - 4, 1, 229, 192, 145, 4, 1, 226, 186, 145, 4, 1, 225, 5, 145, 4, 1, 222, - 228, 145, 4, 1, 219, 84, 145, 4, 1, 215, 81, 145, 4, 1, 214, 201, 145, 4, - 1, 243, 247, 145, 4, 1, 241, 200, 145, 4, 1, 226, 136, 145, 4, 1, 225, - 222, 145, 4, 1, 219, 229, 145, 4, 1, 215, 168, 145, 4, 1, 250, 76, 145, - 4, 1, 220, 103, 145, 4, 1, 211, 27, 145, 4, 1, 211, 29, 145, 4, 1, 211, - 57, 145, 4, 1, 218, 254, 162, 145, 4, 1, 210, 212, 145, 4, 1, 4, 210, - 183, 145, 4, 1, 4, 210, 184, 2, 217, 78, 145, 4, 1, 210, 244, 145, 4, 1, - 235, 185, 4, 210, 183, 145, 4, 1, 251, 250, 210, 183, 145, 4, 1, 235, - 185, 251, 250, 210, 183, 145, 4, 1, 244, 83, 145, 4, 1, 235, 147, 145, 4, - 1, 219, 228, 145, 4, 1, 215, 203, 61, 145, 4, 1, 233, 76, 230, 30, 7, 6, - 1, 233, 150, 2, 52, 130, 7, 4, 1, 233, 150, 2, 52, 130, 7, 6, 1, 233, - 150, 2, 230, 225, 183, 7, 6, 1, 226, 107, 2, 91, 7, 6, 1, 223, 225, 2, - 217, 78, 7, 4, 1, 115, 2, 91, 7, 4, 1, 217, 154, 2, 248, 0, 91, 7, 6, 1, - 242, 62, 2, 248, 40, 7, 4, 1, 242, 62, 2, 248, 40, 7, 6, 1, 235, 25, 2, - 248, 40, 7, 4, 1, 235, 25, 2, 248, 40, 7, 6, 1, 210, 160, 2, 248, 40, 7, - 4, 1, 210, 160, 2, 248, 40, 7, 6, 1, 254, 144, 7, 6, 1, 232, 51, 2, 103, - 7, 6, 1, 215, 94, 61, 7, 6, 1, 215, 94, 254, 144, 7, 4, 1, 214, 106, 2, - 44, 103, 7, 6, 1, 212, 99, 2, 103, 7, 4, 1, 212, 99, 2, 103, 7, 4, 1, - 214, 106, 2, 249, 101, 7, 6, 1, 163, 242, 61, 7, 4, 1, 163, 242, 61, 7, - 4, 1, 217, 76, 225, 134, 7, 4, 1, 160, 2, 228, 51, 7, 4, 1, 215, 94, 223, - 225, 2, 217, 78, 7, 4, 1, 144, 2, 121, 222, 235, 235, 216, 7, 1, 4, 6, - 215, 94, 75, 7, 218, 66, 4, 1, 235, 145, 58, 1, 6, 214, 105, 7, 6, 1, - 222, 93, 2, 217, 251, 217, 78, 7, 6, 1, 210, 160, 2, 217, 251, 217, 78, - 81, 6, 1, 254, 165, 81, 4, 1, 254, 165, 81, 6, 1, 213, 173, 81, 4, 1, - 213, 173, 81, 6, 1, 243, 108, 81, 4, 1, 243, 108, 81, 6, 1, 248, 192, 81, - 4, 1, 248, 192, 81, 6, 1, 245, 195, 81, 4, 1, 245, 195, 81, 6, 1, 219, - 34, 81, 4, 1, 219, 34, 81, 6, 1, 210, 101, 81, 4, 1, 210, 101, 81, 6, 1, - 241, 249, 81, 4, 1, 241, 249, 81, 6, 1, 216, 178, 81, 4, 1, 216, 178, 81, - 6, 1, 240, 117, 81, 4, 1, 240, 117, 81, 6, 1, 234, 228, 81, 4, 1, 234, - 228, 81, 6, 1, 233, 73, 81, 4, 1, 233, 73, 81, 6, 1, 230, 231, 81, 4, 1, - 230, 231, 81, 6, 1, 228, 234, 81, 4, 1, 228, 234, 81, 6, 1, 233, 234, 81, - 4, 1, 233, 234, 81, 6, 1, 76, 81, 4, 1, 76, 81, 6, 1, 225, 109, 81, 4, 1, - 225, 109, 81, 6, 1, 222, 212, 81, 4, 1, 222, 212, 81, 6, 1, 219, 166, 81, - 4, 1, 219, 166, 81, 6, 1, 217, 42, 81, 4, 1, 217, 42, 81, 6, 1, 214, 229, - 81, 4, 1, 214, 229, 81, 6, 1, 244, 122, 81, 4, 1, 244, 122, 81, 6, 1, - 234, 113, 81, 4, 1, 234, 113, 81, 6, 1, 224, 162, 81, 4, 1, 224, 162, 81, - 6, 1, 226, 179, 81, 4, 1, 226, 179, 81, 6, 1, 247, 254, 254, 171, 81, 4, - 1, 247, 254, 254, 171, 81, 6, 1, 55, 81, 254, 197, 81, 4, 1, 55, 81, 254, - 197, 81, 6, 1, 249, 116, 245, 195, 81, 4, 1, 249, 116, 245, 195, 81, 6, - 1, 247, 254, 234, 228, 81, 4, 1, 247, 254, 234, 228, 81, 6, 1, 247, 254, - 228, 234, 81, 4, 1, 247, 254, 228, 234, 81, 6, 1, 249, 116, 228, 234, 81, - 4, 1, 249, 116, 228, 234, 81, 6, 1, 55, 81, 226, 179, 81, 4, 1, 55, 81, - 226, 179, 81, 6, 1, 221, 247, 81, 4, 1, 221, 247, 81, 6, 1, 249, 129, - 220, 56, 81, 4, 1, 249, 129, 220, 56, 81, 6, 1, 55, 81, 220, 56, 81, 4, - 1, 55, 81, 220, 56, 81, 6, 1, 55, 81, 245, 76, 81, 4, 1, 55, 81, 245, 76, - 81, 6, 1, 254, 183, 234, 118, 81, 4, 1, 254, 183, 234, 118, 81, 6, 1, - 247, 254, 241, 46, 81, 4, 1, 247, 254, 241, 46, 81, 6, 1, 55, 81, 241, - 46, 81, 4, 1, 55, 81, 241, 46, 81, 6, 1, 55, 81, 162, 81, 4, 1, 55, 81, - 162, 81, 6, 1, 233, 149, 162, 81, 4, 1, 233, 149, 162, 81, 6, 1, 55, 81, - 241, 218, 81, 4, 1, 55, 81, 241, 218, 81, 6, 1, 55, 81, 241, 252, 81, 4, - 1, 55, 81, 241, 252, 81, 6, 1, 55, 81, 243, 103, 81, 4, 1, 55, 81, 243, - 103, 81, 6, 1, 55, 81, 247, 164, 81, 4, 1, 55, 81, 247, 164, 81, 6, 1, - 55, 81, 220, 23, 81, 4, 1, 55, 81, 220, 23, 81, 6, 1, 55, 227, 209, 220, - 23, 81, 4, 1, 55, 227, 209, 220, 23, 81, 6, 1, 55, 227, 209, 229, 28, 81, - 4, 1, 55, 227, 209, 229, 28, 81, 6, 1, 55, 227, 209, 227, 149, 81, 4, 1, - 55, 227, 209, 227, 149, 81, 6, 1, 55, 227, 209, 212, 37, 81, 4, 1, 55, - 227, 209, 212, 37, 81, 16, 234, 247, 81, 16, 230, 232, 222, 212, 81, 16, - 225, 110, 222, 212, 81, 16, 218, 148, 81, 16, 217, 43, 222, 212, 81, 16, - 234, 114, 222, 212, 81, 16, 220, 24, 219, 166, 81, 6, 1, 249, 116, 220, - 56, 81, 4, 1, 249, 116, 220, 56, 81, 6, 1, 249, 116, 243, 103, 81, 4, 1, - 249, 116, 243, 103, 81, 38, 228, 235, 48, 81, 38, 218, 248, 253, 225, 81, - 38, 218, 248, 233, 22, 81, 6, 1, 251, 200, 234, 118, 81, 4, 1, 251, 200, - 234, 118, 81, 55, 227, 209, 243, 230, 218, 130, 81, 55, 227, 209, 247, - 198, 224, 14, 78, 81, 55, 227, 209, 235, 238, 224, 14, 78, 81, 55, 227, - 209, 213, 241, 247, 173, 81, 244, 3, 123, 242, 28, 81, 243, 230, 218, - 130, 81, 230, 125, 247, 173, 98, 4, 1, 254, 124, 98, 4, 1, 252, 153, 98, - 4, 1, 243, 107, 98, 4, 1, 247, 129, 98, 4, 1, 245, 151, 98, 4, 1, 213, - 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 61, 98, 4, 1, 236, 0, 98, 4, 1, - 234, 235, 98, 4, 1, 233, 82, 98, 4, 1, 231, 186, 98, 4, 1, 229, 196, 98, - 4, 1, 226, 197, 98, 4, 1, 226, 18, 98, 4, 1, 210, 78, 98, 4, 1, 223, 172, - 98, 4, 1, 221, 244, 98, 4, 1, 217, 51, 98, 4, 1, 214, 190, 98, 4, 1, 225, - 141, 98, 4, 1, 234, 122, 98, 4, 1, 242, 242, 98, 4, 1, 224, 74, 98, 4, 1, - 220, 21, 98, 4, 1, 250, 98, 98, 4, 1, 251, 8, 98, 4, 1, 235, 101, 98, 4, - 1, 250, 41, 98, 4, 1, 250, 144, 98, 4, 1, 211, 163, 98, 4, 1, 235, 112, - 98, 4, 1, 242, 44, 98, 4, 1, 241, 239, 98, 4, 1, 241, 176, 98, 4, 1, 212, - 22, 98, 4, 1, 242, 5, 98, 4, 1, 241, 66, 98, 4, 1, 210, 246, 98, 4, 1, - 254, 233, 216, 109, 1, 191, 216, 109, 1, 211, 99, 216, 109, 1, 211, 98, - 216, 109, 1, 211, 88, 216, 109, 1, 211, 86, 216, 109, 1, 252, 33, 255, - 17, 211, 81, 216, 109, 1, 211, 81, 216, 109, 1, 211, 96, 216, 109, 1, - 211, 93, 216, 109, 1, 211, 95, 216, 109, 1, 211, 94, 216, 109, 1, 211, - 12, 216, 109, 1, 211, 90, 216, 109, 1, 211, 79, 216, 109, 1, 215, 116, - 211, 79, 216, 109, 1, 211, 76, 216, 109, 1, 211, 84, 216, 109, 1, 252, - 33, 255, 17, 211, 84, 216, 109, 1, 215, 116, 211, 84, 216, 109, 1, 211, - 83, 216, 109, 1, 211, 103, 216, 109, 1, 211, 77, 216, 109, 1, 215, 116, - 211, 77, 216, 109, 1, 211, 66, 216, 109, 1, 215, 116, 211, 66, 216, 109, - 1, 211, 8, 216, 109, 1, 211, 49, 216, 109, 1, 254, 208, 211, 49, 216, - 109, 1, 215, 116, 211, 49, 216, 109, 1, 211, 75, 216, 109, 1, 211, 74, - 216, 109, 1, 211, 71, 216, 109, 1, 215, 116, 211, 85, 216, 109, 1, 215, - 116, 211, 69, 216, 109, 1, 211, 67, 216, 109, 1, 210, 212, 216, 109, 1, - 211, 64, 216, 109, 1, 211, 63, 216, 109, 1, 211, 87, 216, 109, 1, 215, - 116, 211, 87, 216, 109, 1, 253, 164, 211, 87, 216, 109, 1, 211, 62, 216, - 109, 1, 211, 60, 216, 109, 1, 211, 61, 216, 109, 1, 211, 59, 216, 109, 1, - 211, 58, 216, 109, 1, 211, 97, 216, 109, 1, 211, 56, 216, 109, 1, 211, - 54, 216, 109, 1, 211, 53, 216, 109, 1, 211, 52, 216, 109, 1, 211, 50, - 216, 109, 1, 217, 35, 211, 50, 216, 109, 1, 211, 48, 216, 109, 1, 211, - 47, 216, 109, 1, 210, 244, 216, 109, 58, 1, 233, 127, 78, 216, 109, 220, - 139, 78, 216, 109, 116, 235, 64, 29, 3, 232, 156, 29, 3, 230, 161, 29, 3, - 222, 210, 29, 3, 219, 58, 29, 3, 220, 7, 29, 3, 251, 205, 29, 3, 216, 42, - 29, 3, 249, 238, 29, 3, 228, 73, 29, 3, 227, 134, 29, 3, 242, 181, 227, - 1, 29, 3, 210, 22, 29, 3, 247, 144, 29, 3, 248, 105, 29, 3, 235, 68, 29, - 3, 216, 156, 29, 3, 250, 86, 29, 3, 225, 121, 29, 3, 225, 16, 29, 3, 243, - 0, 29, 3, 242, 252, 29, 3, 242, 253, 29, 3, 242, 254, 29, 3, 218, 224, - 29, 3, 218, 180, 29, 3, 218, 193, 29, 3, 218, 223, 29, 3, 218, 197, 29, - 3, 218, 198, 29, 3, 218, 185, 29, 3, 250, 214, 29, 3, 250, 193, 29, 3, - 250, 195, 29, 3, 250, 213, 29, 3, 250, 211, 29, 3, 250, 212, 29, 3, 250, - 194, 29, 3, 209, 243, 29, 3, 209, 221, 29, 3, 209, 234, 29, 3, 209, 242, - 29, 3, 209, 237, 29, 3, 209, 238, 29, 3, 209, 226, 29, 3, 250, 209, 29, - 3, 250, 196, 29, 3, 250, 198, 29, 3, 250, 208, 29, 3, 250, 206, 29, 3, - 250, 207, 29, 3, 250, 197, 29, 3, 223, 237, 29, 3, 223, 227, 29, 3, 223, - 233, 29, 3, 223, 236, 29, 3, 223, 234, 29, 3, 223, 235, 29, 3, 223, 232, - 29, 3, 233, 160, 29, 3, 233, 152, 29, 3, 233, 155, 29, 3, 233, 159, 29, - 3, 233, 156, 29, 3, 233, 157, 29, 3, 233, 153, 29, 3, 211, 130, 29, 3, - 211, 120, 29, 3, 211, 126, 29, 3, 211, 129, 29, 3, 211, 127, 29, 3, 211, - 128, 29, 3, 211, 125, 29, 3, 242, 72, 29, 3, 242, 63, 29, 3, 242, 66, 29, - 3, 242, 71, 29, 3, 242, 68, 29, 3, 242, 69, 29, 3, 242, 65, 38, 33, 1, - 252, 76, 38, 33, 1, 213, 255, 38, 33, 1, 242, 237, 38, 33, 1, 248, 91, - 38, 33, 1, 210, 74, 38, 33, 1, 210, 94, 38, 33, 1, 176, 38, 33, 1, 245, - 175, 38, 33, 1, 245, 160, 38, 33, 1, 245, 151, 38, 33, 1, 76, 38, 33, 1, - 225, 222, 38, 33, 1, 245, 93, 38, 33, 1, 245, 83, 38, 33, 1, 217, 23, 38, - 33, 1, 162, 38, 33, 1, 215, 179, 38, 33, 1, 250, 132, 38, 33, 1, 220, - 103, 38, 33, 1, 220, 66, 38, 33, 1, 244, 83, 38, 33, 1, 245, 82, 38, 33, - 1, 61, 38, 33, 1, 236, 61, 38, 33, 1, 247, 162, 38, 33, 1, 230, 141, 214, - 205, 38, 33, 1, 211, 59, 38, 33, 1, 210, 212, 38, 33, 1, 235, 184, 61, - 38, 33, 1, 232, 193, 210, 183, 38, 33, 1, 251, 250, 210, 183, 38, 33, 1, - 235, 184, 251, 250, 210, 183, 44, 254, 111, 218, 61, 231, 155, 44, 254, - 111, 246, 119, 218, 61, 231, 155, 43, 218, 61, 127, 44, 218, 61, 127, 43, - 246, 119, 218, 61, 127, 44, 246, 119, 218, 61, 127, 223, 158, 235, 203, - 231, 155, 223, 158, 246, 119, 235, 203, 231, 155, 246, 119, 215, 242, - 231, 155, 43, 215, 242, 127, 44, 215, 242, 127, 223, 158, 218, 235, 43, - 223, 158, 226, 199, 127, 44, 223, 158, 226, 199, 127, 245, 211, 249, 159, - 226, 14, 244, 23, 226, 14, 223, 50, 244, 23, 226, 14, 240, 166, 246, 119, - 226, 252, 246, 105, 254, 120, 214, 153, 254, 120, 246, 119, 222, 248, - 254, 110, 52, 226, 249, 240, 169, 235, 194, 235, 202, 226, 60, 251, 155, - 240, 170, 2, 248, 2, 216, 90, 2, 222, 235, 48, 43, 121, 226, 6, 127, 44, - 121, 226, 6, 127, 216, 90, 2, 59, 48, 216, 90, 2, 59, 51, 43, 67, 252, - 142, 2, 224, 8, 44, 67, 252, 142, 2, 224, 8, 216, 15, 43, 163, 127, 216, - 15, 44, 163, 127, 251, 176, 43, 163, 127, 251, 176, 44, 163, 127, 43, - 219, 188, 104, 127, 44, 219, 188, 104, 127, 43, 52, 226, 4, 44, 52, 226, - 4, 113, 170, 117, 123, 59, 224, 141, 123, 59, 117, 113, 170, 224, 141, - 92, 244, 12, 59, 224, 141, 244, 82, 59, 78, 223, 50, 224, 14, 78, 67, - 183, 222, 235, 225, 11, 211, 209, 220, 139, 230, 225, 247, 121, 215, 94, - 249, 220, 223, 158, 247, 121, 223, 158, 249, 220, 215, 94, 220, 151, 248, - 207, 2, 43, 242, 109, 248, 207, 2, 44, 242, 109, 215, 94, 248, 206, 216, - 15, 163, 221, 174, 50, 215, 59, 248, 157, 216, 144, 248, 157, 9, 34, 223, - 77, 9, 34, 250, 11, 9, 34, 221, 177, 110, 9, 34, 221, 177, 105, 9, 34, - 221, 177, 158, 9, 34, 225, 168, 9, 34, 251, 164, 9, 34, 217, 93, 9, 34, - 234, 34, 110, 9, 34, 234, 34, 105, 9, 34, 247, 171, 9, 34, 221, 180, 9, - 34, 4, 110, 9, 34, 4, 105, 9, 34, 233, 98, 110, 9, 34, 233, 98, 105, 9, - 34, 233, 98, 158, 9, 34, 233, 98, 161, 9, 34, 219, 69, 9, 34, 216, 146, - 9, 34, 219, 67, 110, 9, 34, 219, 67, 105, 9, 34, 241, 229, 110, 9, 34, - 241, 229, 105, 9, 34, 242, 16, 9, 34, 223, 148, 9, 34, 250, 83, 9, 34, - 218, 38, 9, 34, 230, 129, 9, 34, 248, 89, 9, 34, 230, 121, 9, 34, 250, - 26, 9, 34, 212, 41, 110, 9, 34, 212, 41, 105, 9, 34, 244, 97, 9, 34, 225, - 233, 110, 9, 34, 225, 233, 105, 9, 34, 219, 161, 163, 215, 237, 215, 189, - 9, 34, 249, 146, 9, 34, 247, 137, 9, 34, 235, 138, 9, 34, 251, 199, 64, - 249, 251, 9, 34, 245, 16, 9, 34, 218, 250, 110, 9, 34, 218, 250, 105, 9, - 34, 252, 155, 9, 34, 219, 168, 9, 34, 251, 64, 219, 168, 9, 34, 229, 91, - 110, 9, 34, 229, 91, 105, 9, 34, 229, 91, 158, 9, 34, 229, 91, 161, 9, - 34, 231, 47, 9, 34, 220, 58, 9, 34, 223, 154, 9, 34, 245, 38, 9, 34, 226, - 210, 9, 34, 251, 134, 110, 9, 34, 251, 134, 105, 9, 34, 231, 87, 9, 34, - 230, 124, 9, 34, 242, 141, 110, 9, 34, 242, 141, 105, 9, 34, 242, 141, - 158, 9, 34, 216, 107, 9, 34, 249, 250, 9, 34, 212, 9, 110, 9, 34, 212, 9, - 105, 9, 34, 251, 64, 221, 171, 9, 34, 219, 161, 240, 249, 9, 34, 240, - 249, 9, 34, 251, 64, 219, 3, 9, 34, 251, 64, 220, 53, 9, 34, 244, 33, 9, - 34, 251, 64, 250, 229, 9, 34, 219, 161, 212, 57, 9, 34, 212, 58, 110, 9, - 34, 212, 58, 105, 9, 34, 250, 28, 9, 34, 251, 64, 242, 167, 9, 34, 199, - 110, 9, 34, 199, 105, 9, 34, 251, 64, 232, 138, 9, 34, 251, 64, 243, 89, - 9, 34, 230, 120, 110, 9, 34, 230, 120, 105, 9, 34, 223, 160, 9, 34, 251, - 208, 9, 34, 251, 64, 217, 57, 233, 53, 9, 34, 251, 64, 233, 54, 9, 34, - 251, 64, 211, 239, 9, 34, 251, 64, 244, 47, 9, 34, 245, 219, 110, 9, 34, - 245, 219, 105, 9, 34, 245, 219, 158, 9, 34, 251, 64, 245, 218, 9, 34, - 241, 236, 9, 34, 251, 64, 240, 246, 9, 34, 251, 195, 9, 34, 242, 223, 9, - 34, 251, 64, 244, 91, 9, 34, 251, 64, 251, 238, 9, 34, 251, 64, 222, 2, - 9, 34, 219, 161, 212, 2, 9, 34, 219, 161, 211, 41, 9, 34, 251, 64, 243, - 245, 9, 34, 235, 144, 245, 42, 9, 34, 251, 64, 245, 42, 9, 34, 235, 144, - 216, 16, 9, 34, 251, 64, 216, 16, 9, 34, 235, 144, 246, 97, 9, 34, 251, - 64, 246, 97, 9, 34, 215, 91, 9, 34, 235, 144, 215, 91, 9, 34, 251, 64, - 215, 91, 60, 34, 110, 60, 34, 232, 214, 60, 34, 247, 121, 60, 34, 219, - 96, 60, 34, 221, 176, 60, 34, 103, 60, 34, 105, 60, 34, 232, 238, 60, 34, - 231, 186, 60, 34, 233, 34, 60, 34, 245, 130, 60, 34, 195, 60, 34, 124, - 251, 164, 60, 34, 249, 148, 60, 34, 240, 112, 60, 34, 217, 93, 60, 34, - 204, 251, 164, 60, 34, 234, 33, 60, 34, 224, 225, 60, 34, 211, 202, 60, - 34, 218, 244, 60, 34, 44, 204, 251, 164, 60, 34, 241, 177, 245, 146, 60, - 34, 216, 248, 60, 34, 247, 171, 60, 34, 221, 180, 60, 34, 250, 11, 60, - 34, 224, 183, 60, 34, 254, 216, 60, 34, 230, 111, 60, 34, 245, 146, 60, - 34, 245, 224, 60, 34, 221, 201, 60, 34, 242, 175, 60, 34, 242, 176, 219, - 82, 60, 34, 245, 41, 60, 34, 251, 249, 60, 34, 211, 221, 60, 34, 250, - 102, 60, 34, 222, 197, 60, 34, 235, 252, 60, 34, 219, 80, 60, 34, 233, - 97, 60, 34, 249, 157, 60, 34, 218, 238, 60, 34, 230, 116, 60, 34, 222, - 225, 60, 34, 211, 206, 60, 34, 226, 191, 60, 34, 215, 98, 60, 34, 246, - 81, 60, 34, 219, 252, 216, 146, 60, 34, 246, 119, 250, 11, 60, 34, 199, - 218, 109, 60, 34, 113, 242, 11, 60, 34, 220, 1, 60, 34, 251, 170, 60, 34, - 219, 66, 60, 34, 251, 138, 60, 34, 218, 139, 60, 34, 241, 228, 60, 34, - 242, 29, 60, 34, 247, 124, 60, 34, 242, 16, 60, 34, 251, 155, 60, 34, - 223, 148, 60, 34, 221, 188, 60, 34, 247, 200, 60, 34, 253, 169, 60, 34, - 218, 235, 60, 34, 228, 52, 60, 34, 218, 38, 60, 34, 221, 212, 60, 34, - 230, 129, 60, 34, 215, 236, 60, 34, 233, 123, 60, 34, 218, 130, 60, 34, - 248, 89, 60, 34, 212, 21, 60, 34, 247, 147, 228, 52, 60, 34, 249, 216, - 60, 34, 243, 223, 60, 34, 250, 22, 60, 34, 218, 143, 60, 34, 212, 40, 60, - 34, 244, 97, 60, 34, 250, 19, 60, 34, 244, 162, 60, 34, 52, 211, 178, 60, - 34, 163, 215, 237, 215, 189, 60, 34, 219, 90, 60, 34, 244, 172, 60, 34, - 249, 146, 60, 34, 247, 137, 60, 34, 224, 180, 60, 34, 235, 138, 60, 34, - 231, 68, 60, 34, 216, 89, 60, 34, 217, 246, 60, 34, 232, 232, 60, 34, - 214, 131, 60, 34, 244, 121, 60, 34, 251, 199, 64, 249, 251, 60, 34, 219, - 189, 60, 34, 246, 119, 216, 243, 60, 34, 211, 253, 60, 34, 219, 104, 60, - 34, 247, 188, 60, 34, 245, 16, 60, 34, 219, 6, 60, 34, 74, 60, 34, 218, - 132, 60, 34, 218, 249, 60, 34, 216, 0, 60, 34, 242, 148, 60, 34, 250, - 219, 60, 34, 218, 161, 60, 34, 252, 155, 60, 34, 223, 32, 60, 34, 219, - 168, 60, 34, 235, 131, 60, 34, 229, 90, 60, 34, 220, 58, 60, 34, 244, - 150, 60, 34, 226, 210, 60, 34, 254, 119, 60, 34, 225, 30, 60, 34, 245, - 228, 60, 34, 251, 133, 60, 34, 231, 87, 60, 34, 230, 184, 60, 34, 220, - 157, 60, 34, 253, 253, 60, 34, 230, 124, 60, 34, 216, 20, 60, 34, 226, - 166, 60, 34, 251, 202, 60, 34, 218, 128, 60, 34, 249, 226, 60, 34, 242, - 140, 60, 34, 216, 107, 60, 34, 235, 218, 60, 34, 251, 212, 60, 34, 212, - 58, 245, 146, 60, 34, 249, 250, 60, 34, 212, 8, 60, 34, 221, 171, 60, 34, - 240, 249, 60, 34, 219, 3, 60, 34, 214, 22, 60, 34, 252, 73, 60, 34, 225, - 74, 60, 34, 252, 175, 60, 34, 220, 53, 60, 34, 223, 111, 60, 34, 222, - 127, 60, 34, 244, 33, 60, 34, 251, 201, 60, 34, 250, 229, 60, 34, 251, - 227, 60, 34, 230, 126, 60, 34, 212, 57, 60, 34, 250, 28, 60, 34, 211, - 236, 60, 34, 247, 181, 60, 34, 213, 161, 60, 34, 242, 167, 60, 34, 232, - 138, 60, 34, 243, 89, 60, 34, 230, 119, 60, 34, 219, 95, 60, 34, 219, - 252, 217, 77, 251, 238, 60, 34, 223, 160, 60, 34, 251, 208, 60, 34, 211, - 197, 60, 34, 244, 191, 60, 34, 233, 53, 60, 34, 217, 57, 233, 53, 60, 34, - 233, 49, 60, 34, 219, 31, 60, 34, 233, 54, 60, 34, 211, 239, 60, 34, 244, - 47, 60, 34, 245, 218, 60, 34, 241, 236, 60, 34, 244, 1, 60, 34, 240, 246, - 60, 34, 251, 195, 60, 34, 217, 64, 60, 34, 242, 35, 60, 34, 244, 114, 60, - 34, 222, 29, 211, 236, 60, 34, 250, 221, 60, 34, 242, 223, 60, 34, 244, - 91, 60, 34, 251, 238, 60, 34, 222, 2, 60, 34, 248, 75, 60, 34, 212, 2, - 60, 34, 241, 211, 60, 34, 211, 41, 60, 34, 230, 193, 60, 34, 251, 222, - 60, 34, 245, 156, 60, 34, 243, 245, 60, 34, 215, 210, 60, 34, 246, 83, - 60, 34, 223, 142, 60, 34, 228, 54, 60, 34, 245, 42, 60, 34, 216, 16, 60, - 34, 246, 97, 60, 34, 215, 91, 60, 34, 244, 49, 109, 248, 38, 135, 43, - 216, 43, 222, 252, 109, 248, 38, 135, 77, 216, 43, 51, 109, 248, 38, 135, - 43, 216, 43, 230, 225, 22, 222, 252, 109, 248, 38, 135, 77, 216, 43, 230, - 225, 22, 51, 109, 248, 38, 135, 243, 230, 218, 11, 109, 248, 38, 135, - 218, 12, 243, 244, 48, 109, 248, 38, 135, 218, 12, 243, 244, 51, 109, - 248, 38, 135, 218, 12, 243, 244, 233, 47, 109, 248, 38, 135, 218, 12, - 243, 244, 214, 160, 233, 47, 109, 248, 38, 135, 218, 12, 243, 244, 214, - 160, 222, 252, 109, 248, 38, 135, 218, 12, 243, 244, 232, 109, 233, 47, - 109, 248, 38, 135, 226, 123, 109, 219, 19, 109, 249, 220, 109, 243, 230, - 218, 130, 247, 178, 78, 235, 132, 235, 237, 218, 160, 87, 109, 235, 159, - 78, 109, 249, 253, 78, 109, 54, 210, 86, 43, 254, 111, 127, 44, 254, 111, - 127, 43, 52, 254, 111, 127, 44, 52, 254, 111, 127, 43, 249, 162, 127, 44, - 249, 162, 127, 43, 71, 249, 162, 127, 44, 71, 249, 162, 127, 43, 85, 233, - 21, 127, 44, 85, 233, 21, 127, 224, 238, 78, 243, 33, 78, 43, 216, 7, - 220, 54, 127, 44, 216, 7, 220, 54, 127, 43, 71, 233, 21, 127, 44, 71, - 233, 21, 127, 43, 71, 216, 7, 220, 54, 127, 44, 71, 216, 7, 220, 54, 127, - 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 157, 223, 50, 52, 224, - 192, 223, 255, 78, 52, 224, 192, 223, 255, 78, 121, 52, 224, 192, 223, - 255, 78, 224, 238, 164, 244, 191, 242, 9, 227, 199, 110, 242, 9, 227, - 199, 105, 242, 9, 227, 199, 158, 242, 9, 227, 199, 161, 242, 9, 227, 199, - 189, 242, 9, 227, 199, 194, 242, 9, 227, 199, 198, 242, 9, 227, 199, 195, - 242, 9, 227, 199, 200, 109, 233, 4, 138, 78, 109, 222, 229, 138, 78, 109, - 248, 45, 138, 78, 109, 245, 129, 138, 78, 24, 219, 156, 59, 138, 78, 24, - 52, 59, 138, 78, 212, 32, 248, 157, 67, 234, 234, 223, 78, 78, 67, 234, - 234, 223, 78, 2, 213, 135, 219, 32, 78, 67, 234, 234, 223, 78, 164, 214, - 160, 242, 28, 67, 234, 234, 223, 78, 2, 213, 135, 219, 32, 164, 214, 160, - 242, 28, 67, 234, 234, 223, 78, 164, 232, 109, 242, 28, 37, 224, 238, 78, - 109, 217, 4, 232, 215, 244, 147, 220, 139, 87, 242, 9, 227, 199, 216, - 248, 242, 9, 227, 199, 215, 73, 242, 9, 227, 199, 216, 163, 67, 109, 235, - 159, 78, 231, 141, 78, 226, 0, 254, 141, 78, 109, 45, 235, 239, 109, 163, - 244, 107, 219, 19, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, 73, 141, 1, 73, - 141, 1, 4, 70, 141, 1, 70, 141, 1, 4, 75, 141, 1, 75, 141, 1, 4, 76, 141, - 1, 76, 141, 1, 176, 141, 1, 243, 136, 141, 1, 234, 93, 141, 1, 242, 215, - 141, 1, 233, 218, 141, 1, 242, 114, 141, 1, 234, 183, 141, 1, 243, 63, - 141, 1, 234, 29, 141, 1, 242, 175, 141, 1, 206, 141, 1, 210, 116, 141, 1, - 219, 192, 141, 1, 210, 44, 141, 1, 218, 84, 141, 1, 210, 13, 141, 1, 221, - 182, 141, 1, 210, 94, 141, 1, 219, 59, 141, 1, 210, 23, 141, 1, 217, 106, - 141, 1, 248, 222, 141, 1, 216, 118, 141, 1, 248, 4, 141, 1, 4, 215, 119, - 141, 1, 215, 119, 141, 1, 246, 79, 141, 1, 217, 23, 141, 1, 248, 91, 141, - 1, 111, 141, 1, 247, 146, 141, 1, 197, 141, 1, 228, 234, 141, 1, 227, - 238, 141, 1, 229, 108, 141, 1, 228, 75, 141, 1, 162, 141, 1, 252, 192, - 141, 1, 190, 141, 1, 241, 181, 141, 1, 252, 7, 141, 1, 225, 109, 141, 1, - 240, 223, 141, 1, 251, 126, 141, 1, 224, 151, 141, 1, 241, 239, 141, 1, - 252, 76, 141, 1, 225, 222, 141, 1, 241, 69, 141, 1, 251, 206, 141, 1, - 225, 17, 141, 1, 185, 141, 1, 230, 231, 141, 1, 230, 103, 141, 1, 231, - 92, 141, 1, 230, 162, 141, 1, 4, 191, 141, 1, 191, 141, 1, 4, 210, 212, - 141, 1, 210, 212, 141, 1, 4, 210, 244, 141, 1, 210, 244, 141, 1, 205, - 141, 1, 223, 36, 141, 1, 222, 141, 141, 1, 223, 129, 141, 1, 222, 212, - 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, 211, 250, 141, 1, 212, 22, - 141, 1, 211, 227, 141, 1, 230, 26, 141, 1, 212, 116, 141, 1, 4, 176, 141, - 1, 4, 234, 183, 38, 234, 202, 213, 135, 219, 32, 78, 38, 234, 202, 220, - 156, 219, 32, 78, 234, 202, 213, 135, 219, 32, 78, 234, 202, 220, 156, - 219, 32, 78, 141, 235, 159, 78, 141, 213, 135, 235, 159, 78, 141, 247, - 222, 210, 225, 234, 202, 52, 240, 169, 56, 1, 4, 61, 56, 1, 61, 56, 1, 4, - 73, 56, 1, 73, 56, 1, 4, 70, 56, 1, 70, 56, 1, 4, 75, 56, 1, 75, 56, 1, - 4, 76, 56, 1, 76, 56, 1, 176, 56, 1, 243, 136, 56, 1, 234, 93, 56, 1, - 242, 215, 56, 1, 233, 218, 56, 1, 242, 114, 56, 1, 234, 183, 56, 1, 243, - 63, 56, 1, 234, 29, 56, 1, 242, 175, 56, 1, 206, 56, 1, 210, 116, 56, 1, - 219, 192, 56, 1, 210, 44, 56, 1, 218, 84, 56, 1, 210, 13, 56, 1, 221, - 182, 56, 1, 210, 94, 56, 1, 219, 59, 56, 1, 210, 23, 56, 1, 217, 106, 56, - 1, 248, 222, 56, 1, 216, 118, 56, 1, 248, 4, 56, 1, 4, 215, 119, 56, 1, - 215, 119, 56, 1, 246, 79, 56, 1, 217, 23, 56, 1, 248, 91, 56, 1, 111, 56, - 1, 247, 146, 56, 1, 197, 56, 1, 228, 234, 56, 1, 227, 238, 56, 1, 229, - 108, 56, 1, 228, 75, 56, 1, 162, 56, 1, 252, 192, 56, 1, 190, 56, 1, 241, - 181, 56, 1, 252, 7, 56, 1, 225, 109, 56, 1, 240, 223, 56, 1, 251, 126, - 56, 1, 224, 151, 56, 1, 241, 239, 56, 1, 252, 76, 56, 1, 225, 222, 56, 1, - 241, 69, 56, 1, 251, 206, 56, 1, 225, 17, 56, 1, 185, 56, 1, 230, 231, - 56, 1, 230, 103, 56, 1, 231, 92, 56, 1, 230, 162, 56, 1, 4, 191, 56, 1, - 191, 56, 1, 4, 210, 212, 56, 1, 210, 212, 56, 1, 4, 210, 244, 56, 1, 210, - 244, 56, 1, 205, 56, 1, 223, 36, 56, 1, 222, 141, 56, 1, 223, 129, 56, 1, - 222, 212, 56, 1, 4, 212, 65, 56, 1, 212, 65, 56, 1, 211, 250, 56, 1, 212, - 22, 56, 1, 211, 227, 56, 1, 230, 26, 56, 1, 212, 116, 56, 1, 4, 176, 56, - 1, 4, 234, 183, 56, 1, 214, 27, 56, 1, 213, 176, 56, 1, 213, 255, 56, 1, - 213, 138, 56, 230, 225, 247, 121, 234, 202, 224, 174, 219, 32, 78, 56, - 235, 159, 78, 56, 213, 135, 235, 159, 78, 56, 247, 222, 234, 0, 251, 185, - 1, 253, 159, 251, 185, 1, 226, 106, 251, 185, 1, 193, 251, 185, 1, 245, - 7, 251, 185, 1, 249, 61, 251, 185, 1, 217, 153, 251, 185, 1, 230, 26, - 251, 185, 1, 156, 251, 185, 1, 243, 203, 251, 185, 1, 235, 24, 251, 185, - 1, 242, 61, 251, 185, 1, 235, 145, 251, 185, 1, 224, 97, 251, 185, 1, - 211, 178, 251, 185, 1, 210, 83, 251, 185, 1, 250, 159, 251, 185, 1, 220, - 105, 251, 185, 1, 153, 251, 185, 1, 210, 159, 251, 185, 1, 251, 67, 251, - 185, 1, 222, 92, 251, 185, 1, 61, 251, 185, 1, 76, 251, 185, 1, 75, 251, - 185, 1, 245, 198, 251, 185, 1, 254, 202, 251, 185, 1, 245, 196, 251, 185, - 1, 253, 193, 251, 185, 1, 226, 135, 251, 185, 1, 254, 124, 251, 185, 1, - 245, 151, 251, 185, 1, 254, 116, 251, 185, 1, 245, 139, 251, 185, 1, 245, - 93, 251, 185, 1, 73, 251, 185, 1, 70, 251, 185, 1, 235, 157, 251, 185, 1, - 214, 105, 251, 185, 1, 229, 80, 251, 185, 1, 242, 179, 251, 185, 1, 236, - 35, 24, 1, 234, 59, 24, 1, 218, 216, 24, 1, 234, 52, 24, 1, 228, 227, 24, - 1, 228, 225, 24, 1, 228, 224, 24, 1, 216, 102, 24, 1, 218, 205, 24, 1, - 223, 27, 24, 1, 223, 22, 24, 1, 223, 19, 24, 1, 223, 12, 24, 1, 223, 7, - 24, 1, 223, 2, 24, 1, 223, 13, 24, 1, 223, 25, 24, 1, 230, 218, 24, 1, - 225, 96, 24, 1, 218, 213, 24, 1, 225, 85, 24, 1, 219, 149, 24, 1, 218, - 210, 24, 1, 236, 57, 24, 1, 250, 47, 24, 1, 218, 220, 24, 1, 250, 107, - 24, 1, 234, 111, 24, 1, 216, 174, 24, 1, 225, 132, 24, 1, 241, 173, 24, - 1, 61, 24, 1, 254, 244, 24, 1, 191, 24, 1, 211, 92, 24, 1, 245, 118, 24, - 1, 75, 24, 1, 211, 36, 24, 1, 211, 47, 24, 1, 76, 24, 1, 212, 65, 24, 1, - 212, 62, 24, 1, 226, 235, 24, 1, 210, 244, 24, 1, 70, 24, 1, 212, 11, 24, - 1, 212, 22, 24, 1, 211, 250, 24, 1, 210, 212, 24, 1, 245, 56, 24, 1, 211, - 8, 24, 1, 73, 24, 244, 104, 24, 1, 218, 214, 24, 1, 228, 217, 24, 1, 228, - 219, 24, 1, 228, 222, 24, 1, 223, 20, 24, 1, 223, 1, 24, 1, 223, 9, 24, - 1, 223, 14, 24, 1, 222, 255, 24, 1, 230, 211, 24, 1, 230, 208, 24, 1, - 230, 212, 24, 1, 234, 222, 24, 1, 225, 91, 24, 1, 225, 77, 24, 1, 225, - 83, 24, 1, 225, 80, 24, 1, 225, 94, 24, 1, 225, 78, 24, 1, 234, 220, 24, - 1, 234, 218, 24, 1, 219, 142, 24, 1, 219, 140, 24, 1, 219, 132, 24, 1, - 219, 137, 24, 1, 219, 147, 24, 1, 226, 33, 24, 1, 218, 217, 24, 1, 211, - 26, 24, 1, 211, 22, 24, 1, 211, 23, 24, 1, 234, 221, 24, 1, 218, 218, 24, - 1, 211, 32, 24, 1, 210, 238, 24, 1, 210, 237, 24, 1, 210, 240, 24, 1, - 210, 203, 24, 1, 210, 204, 24, 1, 210, 207, 24, 1, 254, 35, 24, 1, 254, - 29, 109, 254, 100, 232, 204, 78, 109, 254, 100, 223, 51, 78, 109, 254, - 100, 123, 78, 109, 254, 100, 113, 78, 109, 254, 100, 134, 78, 109, 254, - 100, 244, 12, 78, 109, 254, 100, 216, 15, 78, 109, 254, 100, 230, 225, - 78, 109, 254, 100, 251, 176, 78, 109, 254, 100, 244, 93, 78, 109, 254, - 100, 221, 177, 78, 109, 254, 100, 216, 170, 78, 109, 254, 100, 244, 5, - 78, 109, 254, 100, 241, 225, 78, 109, 254, 100, 245, 225, 78, 109, 254, - 100, 231, 187, 78, 251, 185, 1, 251, 126, 251, 185, 1, 210, 44, 251, 185, - 1, 235, 109, 251, 185, 1, 242, 114, 251, 185, 1, 245, 210, 251, 185, 1, - 245, 136, 251, 185, 1, 226, 184, 251, 185, 1, 226, 188, 251, 185, 1, 235, - 180, 251, 185, 1, 254, 102, 251, 185, 1, 235, 225, 251, 185, 1, 214, 168, - 251, 185, 1, 236, 17, 251, 185, 1, 229, 58, 251, 185, 1, 254, 196, 251, - 185, 1, 253, 188, 251, 185, 1, 254, 137, 251, 185, 1, 226, 205, 251, 185, - 1, 226, 190, 251, 185, 1, 235, 222, 251, 185, 40, 1, 226, 106, 251, 185, - 40, 1, 217, 153, 251, 185, 40, 1, 235, 24, 251, 185, 40, 1, 242, 61, 251, - 185, 1, 242, 251, 251, 185, 1, 233, 0, 251, 185, 1, 209, 250, 9, 218, - 104, 217, 153, 9, 218, 104, 212, 4, 9, 218, 104, 211, 158, 9, 218, 104, - 251, 80, 9, 218, 104, 217, 255, 9, 218, 104, 240, 159, 9, 218, 104, 240, - 163, 9, 218, 104, 240, 232, 9, 218, 104, 240, 160, 9, 218, 104, 217, 156, - 9, 218, 104, 240, 162, 9, 218, 104, 240, 158, 9, 218, 104, 240, 230, 9, - 218, 104, 240, 161, 9, 218, 104, 240, 157, 9, 218, 104, 230, 26, 9, 218, - 104, 242, 61, 9, 218, 104, 222, 92, 9, 218, 104, 226, 106, 9, 218, 104, - 219, 22, 9, 218, 104, 249, 61, 9, 218, 104, 240, 164, 9, 218, 104, 241, - 191, 9, 218, 104, 217, 165, 9, 218, 104, 217, 234, 9, 218, 104, 218, 169, - 9, 218, 104, 220, 111, 9, 218, 104, 225, 225, 9, 218, 104, 224, 99, 9, - 218, 104, 216, 44, 9, 218, 104, 217, 155, 9, 218, 104, 217, 245, 9, 218, - 104, 240, 171, 9, 218, 104, 240, 156, 9, 218, 104, 225, 150, 9, 218, 104, - 224, 97, 56, 1, 4, 233, 218, 56, 1, 4, 219, 192, 56, 1, 4, 218, 84, 56, - 1, 4, 111, 56, 1, 4, 227, 238, 56, 1, 4, 162, 56, 1, 4, 241, 181, 56, 1, - 4, 240, 223, 56, 1, 4, 241, 239, 56, 1, 4, 241, 69, 56, 1, 4, 230, 103, - 56, 1, 4, 205, 56, 1, 4, 223, 36, 56, 1, 4, 222, 141, 56, 1, 4, 223, 129, - 56, 1, 4, 222, 212, 88, 24, 234, 59, 88, 24, 228, 227, 88, 24, 216, 102, - 88, 24, 223, 27, 88, 24, 230, 218, 88, 24, 225, 96, 88, 24, 219, 149, 88, - 24, 236, 57, 88, 24, 250, 47, 88, 24, 250, 107, 88, 24, 234, 111, 88, 24, - 216, 174, 88, 24, 225, 132, 88, 24, 241, 173, 88, 24, 234, 60, 61, 88, - 24, 228, 228, 61, 88, 24, 216, 103, 61, 88, 24, 223, 28, 61, 88, 24, 230, - 219, 61, 88, 24, 225, 97, 61, 88, 24, 219, 150, 61, 88, 24, 236, 58, 61, - 88, 24, 250, 48, 61, 88, 24, 250, 108, 61, 88, 24, 234, 112, 61, 88, 24, - 216, 175, 61, 88, 24, 225, 133, 61, 88, 24, 241, 174, 61, 88, 24, 250, - 48, 70, 88, 234, 4, 135, 226, 218, 88, 234, 4, 135, 144, 240, 223, 88, - 154, 110, 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, 154, 189, 88, - 154, 194, 88, 154, 198, 88, 154, 195, 88, 154, 200, 88, 154, 216, 248, - 88, 154, 230, 129, 88, 154, 244, 97, 88, 154, 212, 40, 88, 154, 211, 214, - 88, 154, 231, 40, 88, 154, 245, 224, 88, 154, 218, 38, 88, 154, 218, 133, - 88, 154, 241, 245, 88, 154, 219, 55, 88, 154, 229, 205, 88, 154, 219, 5, - 88, 154, 244, 103, 88, 154, 249, 201, 88, 154, 233, 126, 88, 154, 223, - 72, 88, 154, 251, 16, 88, 154, 218, 88, 88, 154, 218, 21, 88, 154, 245, - 128, 88, 154, 223, 64, 88, 154, 254, 151, 88, 154, 244, 129, 88, 154, - 223, 62, 88, 154, 220, 157, 88, 154, 223, 128, 37, 154, 224, 13, 37, 154, - 234, 81, 37, 154, 221, 199, 37, 154, 234, 0, 37, 54, 216, 249, 226, 198, - 85, 218, 235, 37, 54, 215, 74, 226, 198, 85, 218, 235, 37, 54, 216, 164, - 226, 198, 85, 218, 235, 37, 54, 244, 17, 226, 198, 85, 218, 235, 37, 54, - 244, 116, 226, 198, 85, 218, 235, 37, 54, 219, 113, 226, 198, 85, 218, - 235, 37, 54, 220, 118, 226, 198, 85, 218, 235, 37, 54, 245, 186, 226, - 198, 85, 218, 235, 225, 252, 50, 37, 54, 215, 74, 110, 37, 54, 215, 74, - 105, 37, 54, 215, 74, 158, 37, 54, 215, 74, 161, 37, 54, 215, 74, 189, - 37, 54, 215, 74, 194, 37, 54, 215, 74, 198, 37, 54, 215, 74, 195, 37, 54, - 215, 74, 200, 37, 54, 216, 163, 37, 54, 216, 164, 110, 37, 54, 216, 164, - 105, 37, 54, 216, 164, 158, 37, 54, 216, 164, 161, 37, 54, 216, 164, 189, - 37, 24, 234, 59, 37, 24, 228, 227, 37, 24, 216, 102, 37, 24, 223, 27, 37, - 24, 230, 218, 37, 24, 225, 96, 37, 24, 219, 149, 37, 24, 236, 57, 37, 24, - 250, 47, 37, 24, 250, 107, 37, 24, 234, 111, 37, 24, 216, 174, 37, 24, - 225, 132, 37, 24, 241, 173, 37, 24, 234, 60, 61, 37, 24, 228, 228, 61, - 37, 24, 216, 103, 61, 37, 24, 223, 28, 61, 37, 24, 230, 219, 61, 37, 24, - 225, 97, 61, 37, 24, 219, 150, 61, 37, 24, 236, 58, 61, 37, 24, 250, 48, - 61, 37, 24, 250, 108, 61, 37, 24, 234, 112, 61, 37, 24, 216, 175, 61, 37, - 24, 225, 133, 61, 37, 24, 241, 174, 61, 37, 234, 4, 135, 250, 149, 37, - 234, 4, 135, 235, 48, 37, 24, 236, 58, 70, 234, 4, 218, 160, 87, 37, 154, - 110, 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, 154, 189, 37, 154, - 194, 37, 154, 198, 37, 154, 195, 37, 154, 200, 37, 154, 216, 248, 37, - 154, 230, 129, 37, 154, 244, 97, 37, 154, 212, 40, 37, 154, 211, 214, 37, - 154, 231, 40, 37, 154, 245, 224, 37, 154, 218, 38, 37, 154, 218, 133, 37, - 154, 241, 245, 37, 154, 219, 55, 37, 154, 229, 205, 37, 154, 219, 5, 37, - 154, 244, 103, 37, 154, 249, 201, 37, 154, 233, 126, 37, 154, 221, 175, - 37, 154, 231, 190, 37, 154, 244, 138, 37, 154, 218, 50, 37, 154, 245, 35, - 37, 154, 224, 188, 37, 154, 253, 197, 37, 154, 235, 160, 37, 154, 223, - 62, 37, 154, 249, 165, 37, 154, 249, 156, 37, 154, 241, 166, 37, 154, - 250, 175, 37, 154, 232, 111, 37, 154, 233, 47, 37, 154, 222, 252, 37, - 154, 231, 84, 37, 154, 223, 88, 37, 154, 218, 88, 37, 154, 218, 21, 37, - 154, 245, 128, 37, 154, 223, 64, 37, 154, 254, 151, 37, 154, 228, 213, - 37, 54, 216, 164, 194, 37, 54, 216, 164, 198, 37, 54, 216, 164, 195, 37, - 54, 216, 164, 200, 37, 54, 244, 16, 37, 54, 244, 17, 110, 37, 54, 244, - 17, 105, 37, 54, 244, 17, 158, 37, 54, 244, 17, 161, 37, 54, 244, 17, - 189, 37, 54, 244, 17, 194, 37, 54, 244, 17, 198, 37, 54, 244, 17, 195, - 37, 54, 244, 17, 200, 37, 54, 244, 115, 109, 217, 4, 16, 31, 235, 134, - 109, 217, 4, 16, 31, 244, 149, 109, 217, 4, 16, 31, 231, 161, 109, 217, - 4, 16, 31, 254, 48, 109, 217, 4, 16, 31, 231, 133, 109, 217, 4, 16, 31, - 235, 46, 109, 217, 4, 16, 31, 235, 47, 109, 217, 4, 16, 31, 253, 189, - 109, 217, 4, 16, 31, 220, 137, 109, 217, 4, 16, 31, 226, 240, 109, 217, - 4, 16, 31, 228, 41, 109, 217, 4, 16, 31, 248, 86, 42, 241, 191, 42, 245, - 89, 42, 245, 44, 232, 220, 232, 241, 50, 37, 56, 61, 37, 56, 73, 37, 56, - 70, 37, 56, 75, 37, 56, 76, 37, 56, 176, 37, 56, 234, 93, 37, 56, 233, - 218, 37, 56, 234, 183, 37, 56, 234, 29, 37, 56, 206, 37, 56, 219, 192, - 37, 56, 218, 84, 37, 56, 221, 182, 37, 56, 219, 59, 37, 56, 217, 106, 37, - 56, 216, 118, 37, 56, 215, 119, 37, 56, 217, 23, 37, 56, 111, 37, 56, - 197, 37, 56, 228, 234, 37, 56, 227, 238, 37, 56, 229, 108, 37, 56, 228, - 75, 37, 56, 162, 37, 56, 241, 181, 37, 56, 240, 223, 37, 56, 241, 239, - 37, 56, 241, 69, 37, 56, 185, 37, 56, 230, 231, 37, 56, 230, 103, 37, 56, - 231, 92, 37, 56, 230, 162, 37, 56, 191, 37, 56, 210, 212, 37, 56, 210, - 244, 37, 56, 205, 37, 56, 223, 36, 37, 56, 222, 141, 37, 56, 223, 129, - 37, 56, 222, 212, 37, 56, 212, 65, 37, 56, 211, 250, 37, 56, 212, 22, 37, - 56, 211, 227, 42, 254, 72, 42, 253, 240, 42, 254, 96, 42, 255, 32, 42, - 235, 227, 42, 235, 197, 42, 214, 166, 42, 245, 67, 42, 245, 207, 42, 226, - 187, 42, 226, 181, 42, 234, 246, 42, 234, 215, 42, 234, 212, 42, 243, 93, - 42, 243, 102, 42, 242, 205, 42, 242, 201, 42, 233, 151, 42, 242, 194, 42, - 234, 73, 42, 234, 72, 42, 234, 71, 42, 234, 70, 42, 242, 87, 42, 242, 86, - 42, 233, 194, 42, 233, 196, 42, 234, 179, 42, 234, 2, 42, 234, 9, 42, - 222, 17, 42, 221, 238, 42, 219, 130, 42, 220, 142, 42, 220, 141, 42, 248, - 219, 42, 248, 37, 42, 247, 122, 42, 216, 33, 42, 229, 201, 42, 228, 42, - 42, 242, 33, 42, 226, 85, 42, 226, 84, 42, 252, 189, 42, 225, 106, 42, - 225, 70, 42, 225, 71, 42, 251, 235, 42, 240, 222, 42, 240, 218, 42, 251, - 92, 42, 240, 205, 42, 241, 216, 42, 225, 160, 42, 225, 195, 42, 241, 199, - 42, 225, 192, 42, 225, 208, 42, 252, 62, 42, 225, 7, 42, 251, 181, 42, - 241, 57, 42, 224, 251, 42, 241, 49, 42, 241, 51, 42, 231, 202, 42, 231, - 198, 42, 231, 207, 42, 231, 151, 42, 231, 176, 42, 230, 198, 42, 230, - 177, 42, 230, 176, 42, 231, 75, 42, 231, 72, 42, 231, 76, 42, 211, 102, - 42, 211, 100, 42, 210, 201, 42, 222, 227, 42, 222, 231, 42, 222, 118, 42, - 222, 112, 42, 223, 86, 42, 223, 83, 42, 212, 38, 109, 217, 4, 16, 31, - 240, 240, 210, 86, 109, 217, 4, 16, 31, 240, 240, 110, 109, 217, 4, 16, - 31, 240, 240, 105, 109, 217, 4, 16, 31, 240, 240, 158, 109, 217, 4, 16, - 31, 240, 240, 161, 109, 217, 4, 16, 31, 240, 240, 189, 109, 217, 4, 16, - 31, 240, 240, 194, 109, 217, 4, 16, 31, 240, 240, 198, 109, 217, 4, 16, - 31, 240, 240, 195, 109, 217, 4, 16, 31, 240, 240, 200, 109, 217, 4, 16, - 31, 240, 240, 216, 248, 109, 217, 4, 16, 31, 240, 240, 245, 168, 109, - 217, 4, 16, 31, 240, 240, 215, 76, 109, 217, 4, 16, 31, 240, 240, 216, - 165, 109, 217, 4, 16, 31, 240, 240, 244, 6, 109, 217, 4, 16, 31, 240, - 240, 244, 119, 109, 217, 4, 16, 31, 240, 240, 219, 120, 109, 217, 4, 16, - 31, 240, 240, 220, 120, 109, 217, 4, 16, 31, 240, 240, 245, 191, 109, - 217, 4, 16, 31, 240, 240, 228, 198, 109, 217, 4, 16, 31, 240, 240, 215, - 73, 109, 217, 4, 16, 31, 240, 240, 215, 67, 109, 217, 4, 16, 31, 240, - 240, 215, 63, 109, 217, 4, 16, 31, 240, 240, 215, 64, 109, 217, 4, 16, - 31, 240, 240, 215, 69, 42, 240, 231, 42, 248, 222, 42, 253, 193, 42, 130, - 42, 226, 126, 42, 225, 226, 42, 247, 148, 42, 247, 149, 218, 234, 42, - 247, 149, 249, 109, 42, 235, 157, 42, 245, 92, 229, 206, 241, 217, 42, - 245, 92, 229, 206, 217, 175, 42, 245, 92, 229, 206, 217, 75, 42, 245, 92, - 229, 206, 231, 71, 42, 249, 158, 42, 226, 91, 254, 126, 42, 197, 42, 230, - 104, 61, 42, 185, 42, 176, 42, 234, 186, 42, 231, 130, 42, 243, 81, 42, - 251, 19, 42, 234, 185, 42, 225, 151, 42, 229, 82, 42, 230, 104, 245, 7, - 42, 230, 104, 243, 203, 42, 231, 16, 42, 234, 135, 42, 240, 164, 42, 234, - 95, 42, 230, 233, 42, 242, 217, 42, 216, 120, 42, 230, 104, 156, 42, 230, - 170, 42, 247, 158, 42, 234, 41, 42, 244, 46, 42, 228, 113, 42, 230, 104, - 193, 42, 230, 167, 42, 249, 240, 42, 234, 35, 42, 230, 168, 218, 234, 42, - 249, 241, 218, 234, 42, 232, 51, 218, 234, 42, 234, 36, 218, 234, 42, - 230, 168, 249, 109, 42, 249, 241, 249, 109, 42, 232, 51, 249, 109, 42, - 234, 36, 249, 109, 42, 232, 51, 117, 222, 92, 42, 232, 51, 117, 222, 93, - 218, 234, 42, 190, 42, 233, 252, 42, 230, 106, 42, 242, 152, 42, 223, - 177, 42, 223, 178, 117, 222, 92, 42, 223, 178, 117, 222, 93, 218, 234, - 42, 224, 163, 42, 228, 14, 42, 230, 104, 222, 92, 42, 230, 105, 42, 224, - 117, 42, 227, 177, 42, 230, 104, 214, 105, 42, 230, 50, 42, 233, 186, 42, - 230, 51, 231, 75, 42, 224, 116, 42, 227, 176, 42, 230, 104, 212, 98, 42, - 230, 44, 42, 233, 184, 42, 230, 45, 231, 75, 42, 235, 25, 226, 221, 42, - 232, 51, 226, 221, 42, 254, 137, 42, 251, 161, 42, 250, 215, 42, 250, - 192, 42, 251, 68, 117, 234, 135, 42, 249, 239, 42, 248, 143, 42, 242, 73, - 42, 162, 42, 240, 232, 42, 236, 0, 42, 234, 48, 42, 234, 36, 250, 251, - 42, 233, 220, 42, 232, 160, 42, 232, 159, 42, 232, 148, 42, 232, 64, 42, - 231, 131, 219, 80, 42, 230, 197, 42, 230, 153, 42, 225, 149, 42, 225, 20, - 42, 224, 220, 42, 224, 218, 42, 218, 228, 42, 218, 3, 42, 212, 24, 42, - 214, 106, 117, 193, 42, 115, 117, 193, 109, 217, 4, 16, 31, 248, 147, - 110, 109, 217, 4, 16, 31, 248, 147, 105, 109, 217, 4, 16, 31, 248, 147, - 158, 109, 217, 4, 16, 31, 248, 147, 161, 109, 217, 4, 16, 31, 248, 147, - 189, 109, 217, 4, 16, 31, 248, 147, 194, 109, 217, 4, 16, 31, 248, 147, - 198, 109, 217, 4, 16, 31, 248, 147, 195, 109, 217, 4, 16, 31, 248, 147, - 200, 109, 217, 4, 16, 31, 248, 147, 216, 248, 109, 217, 4, 16, 31, 248, - 147, 245, 168, 109, 217, 4, 16, 31, 248, 147, 215, 76, 109, 217, 4, 16, - 31, 248, 147, 216, 165, 109, 217, 4, 16, 31, 248, 147, 244, 6, 109, 217, - 4, 16, 31, 248, 147, 244, 119, 109, 217, 4, 16, 31, 248, 147, 219, 120, - 109, 217, 4, 16, 31, 248, 147, 220, 120, 109, 217, 4, 16, 31, 248, 147, - 245, 191, 109, 217, 4, 16, 31, 248, 147, 228, 198, 109, 217, 4, 16, 31, - 248, 147, 215, 73, 109, 217, 4, 16, 31, 248, 147, 215, 67, 109, 217, 4, - 16, 31, 248, 147, 215, 63, 109, 217, 4, 16, 31, 248, 147, 215, 64, 109, - 217, 4, 16, 31, 248, 147, 215, 69, 109, 217, 4, 16, 31, 248, 147, 215, - 70, 109, 217, 4, 16, 31, 248, 147, 215, 65, 109, 217, 4, 16, 31, 248, - 147, 215, 66, 109, 217, 4, 16, 31, 248, 147, 215, 72, 109, 217, 4, 16, - 31, 248, 147, 215, 68, 109, 217, 4, 16, 31, 248, 147, 216, 163, 109, 217, - 4, 16, 31, 248, 147, 216, 162, 42, 243, 119, 241, 193, 31, 216, 197, 249, - 141, 241, 224, 241, 193, 31, 216, 197, 223, 123, 245, 224, 241, 193, 31, - 247, 232, 253, 208, 216, 197, 252, 57, 241, 193, 31, 210, 223, 244, 39, - 241, 193, 31, 212, 59, 241, 193, 31, 249, 204, 241, 193, 31, 216, 197, - 254, 4, 241, 193, 31, 241, 61, 216, 39, 241, 193, 31, 4, 217, 62, 241, - 193, 31, 215, 238, 241, 193, 31, 225, 220, 241, 193, 31, 218, 159, 241, - 193, 31, 244, 140, 241, 193, 31, 242, 133, 224, 241, 241, 193, 31, 230, - 156, 241, 193, 31, 245, 127, 241, 193, 31, 244, 40, 241, 193, 31, 211, - 207, 226, 198, 216, 197, 248, 87, 241, 193, 31, 254, 52, 241, 193, 31, - 249, 186, 241, 193, 31, 251, 228, 216, 139, 241, 193, 31, 242, 150, 241, - 193, 31, 218, 246, 254, 71, 241, 193, 31, 223, 54, 241, 193, 31, 235, - 221, 241, 193, 31, 242, 133, 217, 62, 241, 193, 31, 230, 112, 249, 160, - 241, 193, 31, 242, 133, 224, 198, 241, 193, 31, 216, 197, 255, 19, 212, - 40, 241, 193, 31, 216, 197, 250, 9, 244, 97, 241, 193, 31, 235, 234, 241, - 193, 31, 246, 58, 241, 193, 31, 223, 57, 241, 193, 31, 242, 133, 224, - 225, 241, 193, 31, 224, 178, 241, 193, 31, 248, 162, 64, 216, 197, 232, - 231, 241, 193, 31, 216, 197, 244, 175, 241, 193, 31, 226, 164, 241, 193, - 31, 226, 245, 241, 193, 31, 248, 60, 241, 193, 31, 248, 80, 241, 193, 31, - 235, 248, 241, 193, 31, 251, 150, 241, 193, 31, 249, 222, 216, 43, 231, - 77, 241, 193, 31, 243, 88, 216, 39, 241, 193, 31, 224, 126, 214, 154, - 241, 193, 31, 226, 163, 241, 193, 31, 216, 197, 212, 13, 241, 193, 31, - 223, 46, 241, 193, 31, 216, 197, 250, 221, 241, 193, 31, 216, 197, 254, - 0, 216, 134, 241, 193, 31, 216, 197, 234, 180, 218, 135, 230, 116, 241, - 193, 31, 248, 33, 241, 193, 31, 216, 197, 231, 153, 231, 203, 241, 193, - 31, 255, 20, 241, 193, 31, 216, 197, 212, 54, 241, 193, 31, 216, 197, - 243, 48, 211, 239, 241, 193, 31, 216, 197, 235, 53, 233, 108, 241, 193, - 31, 247, 185, 241, 193, 31, 232, 221, 241, 193, 31, 235, 224, 215, 188, - 241, 193, 31, 4, 224, 198, 241, 193, 31, 254, 218, 249, 213, 241, 193, - 31, 252, 60, 249, 213, 8, 3, 235, 161, 8, 3, 235, 154, 8, 3, 73, 8, 3, - 235, 183, 8, 3, 236, 59, 8, 3, 236, 42, 8, 3, 236, 61, 8, 3, 236, 60, 8, - 3, 253, 207, 8, 3, 253, 170, 8, 3, 61, 8, 3, 254, 73, 8, 3, 214, 164, 8, - 3, 214, 167, 8, 3, 214, 165, 8, 3, 226, 141, 8, 3, 226, 115, 8, 3, 76, 8, - 3, 226, 176, 8, 3, 245, 36, 8, 3, 75, 8, 3, 211, 195, 8, 3, 251, 229, 8, - 3, 251, 226, 8, 3, 252, 7, 8, 3, 251, 239, 8, 3, 251, 252, 8, 3, 251, - 251, 8, 3, 251, 254, 8, 3, 251, 253, 8, 3, 252, 122, 8, 3, 252, 114, 8, - 3, 252, 192, 8, 3, 252, 143, 8, 3, 251, 102, 8, 3, 251, 106, 8, 3, 251, - 103, 8, 3, 251, 180, 8, 3, 251, 164, 8, 3, 251, 206, 8, 3, 251, 186, 8, - 3, 252, 22, 8, 3, 252, 76, 8, 3, 252, 34, 8, 3, 251, 88, 8, 3, 251, 85, - 8, 3, 251, 126, 8, 3, 251, 101, 8, 3, 251, 95, 8, 3, 251, 99, 8, 3, 251, - 73, 8, 3, 251, 71, 8, 3, 251, 78, 8, 3, 251, 76, 8, 3, 251, 74, 8, 3, - 251, 75, 8, 3, 225, 50, 8, 3, 225, 46, 8, 3, 225, 109, 8, 3, 225, 60, 8, - 3, 225, 76, 8, 3, 225, 103, 8, 3, 225, 99, 8, 3, 225, 241, 8, 3, 225, - 231, 8, 3, 190, 8, 3, 226, 22, 8, 3, 224, 136, 8, 3, 224, 138, 8, 3, 224, - 137, 8, 3, 224, 234, 8, 3, 224, 223, 8, 3, 225, 17, 8, 3, 224, 246, 8, 3, - 224, 122, 8, 3, 224, 118, 8, 3, 224, 151, 8, 3, 224, 135, 8, 3, 224, 127, - 8, 3, 224, 133, 8, 3, 224, 101, 8, 3, 224, 100, 8, 3, 224, 105, 8, 3, - 224, 104, 8, 3, 224, 102, 8, 3, 224, 103, 8, 3, 252, 97, 8, 3, 252, 96, - 8, 3, 252, 103, 8, 3, 252, 98, 8, 3, 252, 100, 8, 3, 252, 99, 8, 3, 252, - 102, 8, 3, 252, 101, 8, 3, 252, 109, 8, 3, 252, 108, 8, 3, 252, 112, 8, - 3, 252, 110, 8, 3, 252, 88, 8, 3, 252, 90, 8, 3, 252, 89, 8, 3, 252, 93, - 8, 3, 252, 92, 8, 3, 252, 95, 8, 3, 252, 94, 8, 3, 252, 104, 8, 3, 252, - 107, 8, 3, 252, 105, 8, 3, 252, 84, 8, 3, 252, 83, 8, 3, 252, 91, 8, 3, - 252, 87, 8, 3, 252, 85, 8, 3, 252, 86, 8, 3, 252, 80, 8, 3, 252, 79, 8, - 3, 252, 82, 8, 3, 252, 81, 8, 3, 229, 170, 8, 3, 229, 169, 8, 3, 229, - 175, 8, 3, 229, 171, 8, 3, 229, 172, 8, 3, 229, 174, 8, 3, 229, 173, 8, - 3, 229, 178, 8, 3, 229, 177, 8, 3, 229, 180, 8, 3, 229, 179, 8, 3, 229, - 166, 8, 3, 229, 165, 8, 3, 229, 168, 8, 3, 229, 167, 8, 3, 229, 159, 8, - 3, 229, 158, 8, 3, 229, 163, 8, 3, 229, 162, 8, 3, 229, 160, 8, 3, 229, - 161, 8, 3, 229, 153, 8, 3, 229, 152, 8, 3, 229, 157, 8, 3, 229, 156, 8, - 3, 229, 154, 8, 3, 229, 155, 8, 3, 241, 111, 8, 3, 241, 110, 8, 3, 241, - 116, 8, 3, 241, 112, 8, 3, 241, 113, 8, 3, 241, 115, 8, 3, 241, 114, 8, - 3, 241, 119, 8, 3, 241, 118, 8, 3, 241, 121, 8, 3, 241, 120, 8, 3, 241, - 102, 8, 3, 241, 104, 8, 3, 241, 103, 8, 3, 241, 107, 8, 3, 241, 106, 8, - 3, 241, 109, 8, 3, 241, 108, 8, 3, 241, 98, 8, 3, 241, 97, 8, 3, 241, - 105, 8, 3, 241, 101, 8, 3, 241, 99, 8, 3, 241, 100, 8, 3, 241, 92, 8, 3, - 241, 96, 8, 3, 241, 95, 8, 3, 241, 93, 8, 3, 241, 94, 8, 3, 230, 173, 8, - 3, 230, 172, 8, 3, 230, 231, 8, 3, 230, 179, 8, 3, 230, 204, 8, 3, 230, - 222, 8, 3, 230, 220, 8, 3, 231, 140, 8, 3, 231, 135, 8, 3, 185, 8, 3, - 231, 173, 8, 3, 230, 75, 8, 3, 230, 74, 8, 3, 230, 78, 8, 3, 230, 76, 8, - 3, 230, 122, 8, 3, 230, 108, 8, 3, 230, 162, 8, 3, 230, 127, 8, 3, 231, - 27, 8, 3, 231, 92, 8, 3, 230, 56, 8, 3, 230, 52, 8, 3, 230, 103, 8, 3, - 230, 71, 8, 3, 230, 64, 8, 3, 230, 69, 8, 3, 230, 29, 8, 3, 230, 28, 8, - 3, 230, 34, 8, 3, 230, 31, 8, 3, 244, 84, 8, 3, 244, 79, 8, 3, 244, 122, - 8, 3, 244, 99, 8, 3, 244, 168, 8, 3, 244, 159, 8, 3, 244, 197, 8, 3, 244, - 171, 8, 3, 244, 4, 8, 3, 244, 44, 8, 3, 244, 28, 8, 3, 243, 219, 8, 3, - 243, 218, 8, 3, 243, 235, 8, 3, 243, 224, 8, 3, 243, 222, 8, 3, 243, 223, - 8, 3, 243, 206, 8, 3, 243, 205, 8, 3, 243, 209, 8, 3, 243, 207, 8, 3, - 213, 144, 8, 3, 213, 139, 8, 3, 213, 176, 8, 3, 213, 153, 8, 3, 213, 166, - 8, 3, 213, 163, 8, 3, 213, 168, 8, 3, 213, 167, 8, 3, 214, 7, 8, 3, 214, - 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3, 213, 125, 8, 3, 213, 121, 8, 3, - 213, 138, 8, 3, 213, 126, 8, 3, 213, 178, 8, 3, 213, 244, 8, 3, 212, 110, - 8, 3, 212, 108, 8, 3, 212, 116, 8, 3, 212, 113, 8, 3, 212, 111, 8, 3, - 212, 112, 8, 3, 212, 102, 8, 3, 212, 101, 8, 3, 212, 106, 8, 3, 212, 105, - 8, 3, 212, 103, 8, 3, 212, 104, 8, 3, 247, 179, 8, 3, 247, 167, 8, 3, - 248, 4, 8, 3, 247, 204, 8, 3, 247, 237, 8, 3, 247, 241, 8, 3, 247, 240, - 8, 3, 248, 153, 8, 3, 248, 148, 8, 3, 248, 222, 8, 3, 248, 173, 8, 3, - 246, 63, 8, 3, 246, 64, 8, 3, 247, 121, 8, 3, 246, 103, 8, 3, 247, 146, - 8, 3, 247, 123, 8, 3, 248, 31, 8, 3, 248, 91, 8, 3, 248, 46, 8, 3, 246, - 54, 8, 3, 246, 52, 8, 3, 246, 79, 8, 3, 246, 62, 8, 3, 246, 57, 8, 3, - 246, 60, 8, 3, 216, 68, 8, 3, 216, 62, 8, 3, 216, 118, 8, 3, 216, 77, 8, - 3, 216, 110, 8, 3, 216, 112, 8, 3, 216, 111, 8, 3, 217, 47, 8, 3, 217, + 246, 243, 46, 47, 247, 114, 46, 47, 246, 130, 46, 47, 247, 1, 46, 47, + 246, 193, 46, 47, 247, 64, 46, 47, 246, 161, 46, 47, 247, 32, 46, 47, + 246, 224, 46, 47, 247, 95, 46, 47, 246, 145, 46, 47, 247, 16, 46, 47, + 246, 208, 46, 47, 247, 79, 46, 47, 246, 176, 46, 47, 247, 47, 46, 47, + 246, 239, 46, 47, 247, 110, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, + 246, 200, 46, 47, 247, 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, + 246, 231, 46, 47, 247, 102, 46, 47, 246, 152, 46, 47, 247, 23, 46, 47, + 246, 215, 46, 47, 247, 86, 46, 47, 246, 183, 46, 47, 247, 54, 46, 47, + 246, 246, 46, 47, 247, 117, 46, 47, 246, 128, 46, 47, 246, 255, 46, 47, + 246, 191, 46, 47, 247, 62, 46, 47, 246, 159, 46, 47, 247, 30, 46, 47, + 246, 222, 46, 47, 247, 93, 46, 47, 246, 143, 46, 47, 247, 14, 46, 47, + 246, 206, 46, 47, 247, 77, 46, 47, 246, 174, 46, 47, 247, 45, 46, 47, + 246, 237, 46, 47, 247, 108, 46, 47, 246, 135, 46, 47, 247, 6, 46, 47, + 246, 198, 46, 47, 247, 69, 46, 47, 246, 166, 46, 47, 247, 37, 46, 47, + 246, 229, 46, 47, 247, 100, 46, 47, 246, 150, 46, 47, 247, 21, 46, 47, + 246, 213, 46, 47, 247, 84, 46, 47, 246, 181, 46, 47, 247, 52, 46, 47, + 246, 244, 46, 47, 247, 115, 46, 47, 246, 131, 46, 47, 247, 2, 46, 47, + 246, 194, 46, 47, 247, 65, 46, 47, 246, 162, 46, 47, 247, 33, 46, 47, + 246, 225, 46, 47, 247, 96, 46, 47, 246, 146, 46, 47, 247, 17, 46, 47, + 246, 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47, 247, 48, 46, 47, + 246, 240, 46, 47, 247, 111, 46, 47, 246, 138, 46, 47, 247, 9, 46, 47, + 246, 201, 46, 47, 247, 72, 46, 47, 246, 169, 46, 47, 247, 40, 46, 47, + 246, 232, 46, 47, 247, 103, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47, + 246, 216, 46, 47, 247, 87, 46, 47, 246, 184, 46, 47, 247, 55, 46, 47, + 246, 247, 46, 47, 247, 118, 97, 215, 58, 80, 2, 67, 91, 97, 215, 58, 80, + 2, 52, 67, 91, 140, 52, 80, 2, 67, 91, 97, 52, 80, 2, 67, 91, 43, 44, 52, + 80, 2, 67, 91, 97, 215, 58, 80, 243, 251, 130, 140, 52, 80, 243, 251, + 130, 97, 52, 80, 243, 251, 130, 246, 112, 80, 2, 203, 91, 214, 153, 80, + 2, 203, 91, 214, 153, 215, 212, 75, 246, 112, 215, 212, 75, 140, 52, 248, + 165, 75, 97, 52, 248, 165, 75, 140, 215, 212, 248, 165, 75, 97, 215, 212, + 248, 165, 75, 97, 215, 58, 215, 212, 248, 165, 75, 97, 80, 2, 246, 126, + 218, 141, 214, 153, 80, 216, 43, 130, 246, 112, 80, 216, 43, 130, 97, 80, + 2, 217, 79, 2, 67, 91, 97, 80, 2, 217, 79, 2, 52, 67, 91, 97, 215, 58, + 80, 2, 217, 78, 97, 215, 58, 80, 2, 217, 79, 2, 67, 91, 97, 215, 58, 80, + 2, 217, 79, 2, 52, 67, 91, 140, 254, 3, 97, 254, 3, 140, 52, 254, 3, 97, + 52, 254, 3, 140, 80, 216, 43, 85, 248, 0, 97, 80, 216, 43, 85, 248, 0, + 140, 80, 243, 251, 252, 149, 216, 43, 85, 248, 0, 97, 80, 243, 251, 252, + 149, 216, 43, 85, 248, 0, 228, 61, 212, 9, 22, 219, 30, 245, 228, 75, + 228, 61, 245, 228, 22, 219, 30, 212, 9, 75, 228, 61, 212, 9, 80, 2, 103, + 228, 61, 245, 228, 80, 2, 103, 219, 30, 245, 228, 80, 2, 103, 219, 30, + 212, 9, 80, 2, 103, 228, 61, 212, 9, 80, 22, 228, 61, 245, 228, 75, 228, + 61, 245, 228, 80, 22, 219, 30, 245, 228, 75, 219, 30, 245, 228, 80, 22, + 219, 30, 212, 9, 75, 219, 30, 212, 9, 80, 22, 228, 61, 212, 9, 75, 222, + 231, 248, 7, 249, 133, 244, 183, 248, 6, 244, 183, 248, 7, 249, 133, 222, + 231, 248, 6, 219, 30, 245, 228, 80, 249, 133, 228, 61, 245, 228, 75, 228, + 61, 245, 228, 80, 249, 133, 219, 30, 245, 228, 75, 244, 183, 248, 7, 249, + 133, 228, 61, 245, 228, 75, 222, 231, 248, 7, 249, 133, 219, 30, 245, + 228, 75, 228, 61, 245, 228, 80, 249, 133, 228, 61, 212, 9, 75, 228, 61, + 212, 9, 80, 249, 133, 228, 61, 245, 228, 75, 212, 36, 80, 225, 10, 247, + 203, 222, 254, 80, 225, 10, 97, 216, 189, 249, 98, 214, 152, 80, 225, 10, + 97, 216, 189, 249, 98, 246, 111, 80, 225, 10, 246, 112, 216, 189, 249, + 98, 233, 43, 80, 225, 10, 246, 112, 216, 189, 249, 98, 222, 244, 222, + 247, 254, 34, 250, 10, 75, 233, 46, 254, 34, 254, 96, 75, 216, 15, 254, + 34, 254, 96, 75, 251, 183, 254, 34, 254, 96, 75, 216, 15, 254, 34, 250, + 10, 80, 2, 230, 186, 216, 15, 254, 34, 254, 96, 80, 2, 225, 25, 232, 114, + 44, 220, 154, 250, 10, 75, 232, 114, 43, 220, 154, 254, 96, 75, 254, 96, + 250, 8, 250, 44, 75, 250, 10, 250, 8, 250, 44, 75, 97, 80, 72, 219, 253, + 140, 75, 140, 80, 72, 219, 253, 97, 75, 219, 253, 97, 80, 72, 140, 75, + 97, 80, 2, 96, 51, 140, 80, 2, 96, 51, 97, 80, 216, 140, 211, 178, 43, + 44, 80, 216, 140, 4, 250, 43, 214, 153, 215, 58, 80, 243, 251, 4, 250, + 43, 43, 252, 147, 120, 44, 252, 147, 124, 242, 5, 43, 252, 147, 124, 44, + 252, 147, 120, 242, 5, 120, 252, 147, 44, 124, 252, 147, 43, 242, 5, 120, + 252, 147, 43, 124, 252, 147, 44, 242, 5, 43, 252, 147, 120, 44, 252, 147, + 120, 242, 5, 120, 252, 147, 44, 124, 252, 147, 44, 242, 5, 43, 252, 147, + 124, 44, 252, 147, 124, 242, 5, 120, 252, 147, 43, 124, 252, 147, 43, + 242, 5, 140, 242, 6, 2, 252, 147, 120, 216, 43, 130, 97, 242, 6, 2, 252, + 147, 120, 216, 43, 130, 214, 153, 242, 6, 2, 252, 147, 44, 216, 43, 130, + 246, 112, 242, 6, 2, 252, 147, 44, 216, 43, 130, 140, 242, 6, 2, 252, + 147, 124, 216, 43, 130, 97, 242, 6, 2, 252, 147, 124, 216, 43, 130, 214, + 153, 242, 6, 2, 252, 147, 43, 216, 43, 130, 246, 112, 242, 6, 2, 252, + 147, 43, 216, 43, 130, 140, 242, 6, 2, 252, 147, 120, 243, 251, 130, 97, + 242, 6, 2, 252, 147, 120, 243, 251, 130, 214, 153, 242, 6, 2, 252, 147, + 44, 243, 251, 130, 246, 112, 242, 6, 2, 252, 147, 44, 243, 251, 130, 140, + 242, 6, 2, 252, 147, 124, 243, 251, 130, 97, 242, 6, 2, 252, 147, 124, + 243, 251, 130, 214, 153, 242, 6, 2, 252, 147, 43, 243, 251, 130, 246, + 112, 242, 6, 2, 252, 147, 43, 243, 251, 130, 140, 242, 6, 2, 252, 147, + 120, 72, 140, 242, 6, 2, 252, 147, 246, 114, 214, 153, 242, 6, 2, 252, + 147, 43, 252, 38, 214, 153, 242, 6, 2, 252, 147, 222, 254, 97, 242, 6, 2, + 252, 147, 120, 72, 97, 242, 6, 2, 252, 147, 246, 114, 246, 112, 242, 6, + 2, 252, 147, 43, 252, 38, 246, 112, 242, 6, 2, 252, 147, 222, 254, 140, + 242, 6, 2, 252, 147, 120, 72, 97, 242, 6, 2, 252, 147, 214, 163, 140, + 242, 6, 2, 252, 147, 124, 72, 97, 242, 6, 2, 252, 147, 246, 114, 97, 242, + 6, 2, 252, 147, 120, 72, 140, 242, 6, 2, 252, 147, 214, 163, 97, 242, 6, + 2, 252, 147, 124, 72, 140, 242, 6, 2, 252, 147, 246, 114, 140, 242, 6, 2, + 252, 147, 120, 72, 200, 248, 164, 140, 242, 6, 2, 252, 147, 124, 252, 51, + 200, 248, 164, 97, 242, 6, 2, 252, 147, 120, 72, 200, 248, 164, 97, 242, + 6, 2, 252, 147, 124, 252, 51, 200, 248, 164, 214, 153, 242, 6, 2, 252, + 147, 43, 252, 38, 246, 112, 242, 6, 2, 252, 147, 222, 254, 246, 112, 242, + 6, 2, 252, 147, 43, 252, 38, 214, 153, 242, 6, 2, 252, 147, 222, 254, 44, + 52, 80, 2, 222, 185, 241, 242, 245, 106, 5, 72, 97, 75, 216, 90, 226, + 172, 72, 97, 75, 140, 80, 72, 216, 90, 226, 171, 97, 80, 72, 216, 90, + 226, 171, 97, 80, 72, 254, 156, 128, 112, 233, 21, 72, 140, 75, 140, 80, + 216, 140, 233, 20, 242, 137, 72, 97, 75, 218, 65, 72, 97, 75, 140, 80, + 216, 140, 218, 64, 218, 23, 72, 140, 75, 43, 244, 99, 217, 78, 44, 244, + 99, 217, 78, 120, 244, 99, 217, 78, 124, 244, 99, 217, 78, 215, 212, 67, + 252, 149, 248, 68, 210, 160, 189, 218, 244, 210, 160, 189, 215, 49, 249, + 234, 43, 71, 249, 107, 127, 44, 71, 249, 107, 127, 43, 71, 226, 7, 44, + 71, 226, 7, 210, 160, 189, 43, 236, 22, 127, 210, 160, 189, 44, 236, 22, + 127, 210, 160, 189, 43, 251, 250, 127, 210, 160, 189, 44, 251, 250, 127, + 43, 42, 251, 166, 2, 214, 183, 44, 42, 251, 166, 2, 214, 183, 43, 42, + 251, 166, 2, 216, 116, 236, 7, 216, 15, 249, 168, 44, 42, 251, 166, 2, + 216, 116, 236, 7, 251, 183, 249, 168, 43, 42, 251, 166, 2, 216, 116, 236, + 7, 251, 183, 249, 168, 44, 42, 251, 166, 2, 216, 116, 236, 7, 216, 15, + 249, 168, 43, 254, 118, 251, 166, 2, 247, 128, 44, 254, 118, 251, 166, 2, + 247, 128, 43, 254, 34, 233, 21, 127, 44, 254, 34, 242, 137, 127, 52, 43, + 254, 34, 242, 137, 127, 52, 44, 254, 34, 233, 21, 127, 43, 85, 216, 7, + 220, 55, 127, 44, 85, 216, 7, 220, 55, 127, 246, 126, 244, 143, 67, 210, + 35, 232, 219, 231, 93, 254, 118, 226, 174, 233, 52, 44, 254, 118, 214, + 12, 2, 218, 236, 231, 93, 44, 254, 118, 2, 247, 128, 254, 118, 2, 222, + 94, 235, 222, 255, 12, 254, 117, 219, 1, 254, 118, 226, 174, 233, 52, + 219, 1, 254, 118, 226, 174, 214, 163, 215, 94, 254, 117, 223, 52, 254, + 117, 254, 118, 2, 214, 183, 223, 52, 254, 118, 2, 214, 183, 226, 252, + 254, 118, 226, 174, 214, 163, 226, 252, 254, 118, 226, 174, 246, 114, + 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 120, + 22, 222, 254, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, + 225, 10, 120, 22, 233, 52, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, + 236, 7, 80, 225, 10, 124, 22, 222, 254, 231, 93, 254, 118, 2, 204, 254, + 13, 245, 148, 236, 7, 80, 225, 10, 124, 22, 233, 52, 231, 93, 254, 118, + 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 44, 22, 214, 163, 231, + 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 43, 22, + 214, 163, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, + 10, 44, 22, 246, 114, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, + 7, 80, 225, 10, 43, 22, 246, 114, 223, 52, 245, 160, 220, 129, 245, 160, + 220, 130, 2, 226, 127, 245, 160, 220, 130, 2, 4, 250, 44, 48, 245, 160, + 220, 130, 2, 44, 80, 48, 245, 160, 220, 130, 2, 43, 80, 48, 250, 44, 2, + 203, 130, 37, 67, 130, 37, 226, 11, 37, 223, 53, 219, 48, 37, 225, 174, + 250, 44, 247, 181, 251, 86, 203, 252, 149, 22, 216, 15, 163, 247, 181, + 251, 86, 67, 130, 250, 44, 2, 218, 25, 211, 178, 37, 254, 95, 247, 177, + 50, 120, 80, 216, 140, 250, 43, 37, 71, 251, 121, 37, 251, 121, 37, 233, + 20, 37, 242, 136, 250, 44, 2, 4, 250, 44, 216, 43, 216, 197, 222, 254, + 250, 44, 2, 113, 203, 218, 93, 216, 43, 216, 197, 222, 254, 92, 222, 231, + 248, 7, 219, 97, 92, 244, 183, 248, 7, 219, 97, 92, 253, 224, 92, 4, 250, + 43, 92, 218, 236, 113, 235, 71, 218, 234, 215, 227, 2, 59, 48, 215, 227, + 2, 214, 183, 222, 94, 236, 7, 215, 226, 215, 227, 2, 220, 136, 253, 215, + 251, 182, 44, 215, 227, 72, 43, 215, 226, 43, 215, 227, 252, 38, 67, 130, + 67, 252, 149, 252, 38, 44, 215, 226, 251, 173, 2, 43, 163, 251, 229, 251, + 173, 2, 44, 163, 251, 229, 85, 251, 172, 30, 2, 43, 163, 251, 229, 30, 2, + 44, 163, 251, 229, 71, 240, 243, 85, 240, 243, 43, 211, 244, 244, 143, + 44, 211, 244, 244, 143, 43, 52, 211, 244, 244, 143, 44, 52, 211, 244, + 244, 143, 235, 255, 235, 241, 216, 113, 115, 235, 241, 235, 242, 229, + 107, 2, 67, 130, 246, 120, 230, 92, 42, 2, 249, 189, 226, 131, 235, 253, + 253, 245, 219, 221, 224, 183, 245, 106, 5, 22, 219, 99, 226, 11, 245, + 106, 5, 22, 219, 99, 226, 12, 2, 216, 90, 48, 240, 111, 216, 43, 22, 219, + 99, 226, 11, 242, 190, 218, 157, 216, 186, 246, 113, 215, 227, 2, 43, + 163, 251, 229, 246, 113, 215, 227, 2, 44, 163, 251, 229, 85, 248, 1, 2, + 124, 75, 85, 232, 110, 71, 250, 44, 2, 124, 75, 85, 250, 44, 2, 124, 75, + 245, 93, 71, 218, 236, 245, 93, 85, 218, 236, 245, 93, 71, 248, 0, 245, + 93, 85, 248, 0, 245, 93, 71, 250, 43, 245, 93, 85, 250, 43, 222, 134, + 223, 53, 219, 49, 226, 171, 219, 49, 2, 226, 127, 223, 53, 219, 49, 2, + 203, 91, 252, 1, 219, 48, 252, 1, 223, 53, 219, 48, 52, 225, 25, 215, + 212, 225, 25, 233, 48, 249, 99, 254, 118, 127, 222, 250, 249, 99, 254, + 118, 127, 216, 79, 230, 184, 230, 29, 37, 59, 226, 171, 230, 29, 37, 96, + 226, 171, 230, 29, 37, 30, 226, 171, 230, 29, 214, 176, 226, 172, 2, 247, + 128, 230, 29, 214, 176, 226, 172, 2, 225, 25, 230, 29, 42, 235, 206, 226, + 171, 230, 29, 42, 214, 176, 226, 171, 113, 232, 152, 22, 226, 171, 113, + 232, 152, 177, 226, 171, 230, 29, 30, 226, 171, 230, 159, 113, 218, 44, + 218, 42, 2, 235, 218, 224, 27, 235, 219, 226, 171, 244, 107, 226, 3, 235, + 218, 235, 219, 2, 52, 91, 235, 219, 253, 181, 2, 219, 97, 250, 40, 243, + 233, 254, 96, 235, 216, 232, 220, 235, 217, 2, 223, 118, 225, 241, 254, + 10, 225, 4, 232, 220, 235, 217, 2, 220, 154, 225, 241, 254, 10, 225, 4, + 232, 220, 235, 217, 228, 57, 236, 1, 216, 197, 225, 4, 235, 219, 254, 10, + 116, 225, 14, 226, 171, 224, 21, 235, 219, 226, 171, 235, 219, 2, 140, + 80, 2, 103, 235, 219, 2, 30, 50, 235, 219, 2, 235, 205, 235, 219, 2, 214, + 175, 235, 219, 2, 226, 127, 235, 219, 2, 214, 183, 235, 72, 233, 91, 43, + 215, 227, 226, 171, 210, 160, 189, 221, 203, 249, 217, 210, 160, 189, + 221, 203, 225, 59, 210, 160, 189, 221, 203, 224, 179, 96, 5, 2, 4, 250, + 44, 48, 96, 5, 2, 250, 39, 255, 24, 48, 96, 5, 2, 216, 90, 48, 96, 5, 2, + 59, 51, 96, 5, 2, 216, 90, 51, 96, 5, 2, 218, 66, 105, 96, 5, 2, 85, 215, + 226, 230, 187, 5, 2, 249, 228, 48, 230, 187, 5, 2, 59, 51, 230, 187, 5, + 2, 244, 183, 247, 126, 230, 187, 5, 2, 222, 231, 247, 126, 96, 5, 236, 7, + 43, 163, 250, 43, 96, 5, 236, 7, 44, 163, 250, 43, 213, 254, 177, 249, + 139, 224, 183, 230, 89, 5, 2, 59, 48, 230, 89, 5, 2, 214, 183, 220, 151, + 224, 184, 2, 251, 183, 250, 7, 219, 79, 224, 183, 230, 89, 5, 236, 7, 43, + 163, 250, 43, 230, 89, 5, 236, 7, 44, 163, 250, 43, 37, 230, 89, 5, 2, + 250, 39, 255, 23, 230, 89, 5, 236, 7, 52, 250, 43, 37, 247, 177, 50, 96, + 5, 236, 7, 215, 226, 230, 187, 5, 236, 7, 215, 226, 230, 89, 5, 236, 7, + 215, 226, 235, 213, 224, 183, 222, 245, 235, 213, 224, 183, 210, 160, + 189, 223, 93, 249, 217, 254, 142, 177, 249, 173, 235, 206, 2, 247, 128, + 214, 176, 2, 230, 187, 50, 214, 176, 2, 226, 127, 235, 206, 2, 226, 127, + 235, 206, 2, 232, 152, 254, 126, 214, 176, 2, 232, 152, 226, 162, 214, + 176, 72, 235, 205, 235, 206, 72, 214, 175, 214, 176, 72, 252, 149, 72, + 235, 205, 235, 206, 72, 252, 149, 72, 214, 175, 214, 176, 252, 38, 22, + 235, 71, 2, 214, 175, 235, 206, 252, 38, 22, 235, 71, 2, 235, 205, 250, + 8, 214, 176, 2, 220, 135, 250, 8, 235, 206, 2, 220, 135, 52, 42, 235, + 205, 52, 42, 214, 175, 250, 8, 214, 176, 2, 220, 136, 22, 219, 79, 224, + 183, 232, 152, 22, 2, 59, 48, 232, 152, 177, 2, 59, 48, 52, 232, 152, + 254, 126, 52, 232, 152, 226, 162, 113, 235, 207, 232, 152, 254, 126, 113, + 235, 207, 232, 152, 226, 162, 219, 87, 233, 91, 226, 162, 219, 87, 233, + 91, 254, 126, 232, 152, 177, 226, 125, 232, 152, 254, 126, 232, 152, 22, + 2, 230, 229, 218, 141, 232, 152, 177, 2, 230, 229, 218, 141, 232, 152, + 22, 2, 203, 248, 164, 232, 152, 177, 2, 203, 248, 164, 232, 152, 22, 2, + 52, 226, 127, 232, 152, 22, 2, 214, 183, 232, 152, 22, 2, 52, 214, 183, + 4, 213, 251, 2, 214, 183, 232, 152, 177, 2, 52, 226, 127, 232, 152, 177, + 2, 52, 214, 183, 210, 160, 189, 247, 137, 254, 87, 210, 160, 189, 223, + 151, 254, 87, 245, 106, 5, 2, 59, 51, 240, 111, 2, 59, 48, 215, 212, 203, + 252, 149, 2, 52, 67, 91, 215, 212, 203, 252, 149, 2, 215, 212, 67, 91, + 216, 90, 226, 172, 2, 59, 48, 216, 90, 226, 172, 2, 222, 231, 247, 126, + 219, 164, 230, 187, 219, 163, 249, 207, 2, 59, 48, 245, 106, 2, 253, 224, + 254, 156, 128, 216, 43, 2, 250, 39, 255, 23, 254, 56, 128, 177, 128, 112, + 245, 106, 5, 72, 96, 50, 96, 5, 72, 245, 106, 50, 245, 106, 5, 72, 216, + 90, 226, 171, 52, 249, 235, 245, 107, 113, 249, 202, 245, 106, 219, 178, + 134, 249, 202, 245, 106, 219, 178, 245, 106, 5, 2, 113, 170, 72, 22, 113, + 170, 51, 245, 102, 2, 244, 19, 170, 48, 233, 21, 2, 250, 44, 235, 222, + 242, 137, 2, 250, 44, 235, 222, 233, 21, 2, 224, 16, 164, 48, 242, 137, + 2, 224, 16, 164, 48, 233, 21, 177, 219, 99, 128, 112, 242, 137, 177, 219, + 99, 128, 112, 233, 21, 177, 219, 99, 128, 216, 43, 2, 59, 235, 222, 242, + 137, 177, 219, 99, 128, 216, 43, 2, 59, 235, 222, 233, 21, 177, 219, 99, + 128, 216, 43, 2, 59, 48, 242, 137, 177, 219, 99, 128, 216, 43, 2, 59, 48, + 233, 21, 177, 219, 99, 128, 216, 43, 2, 59, 72, 222, 254, 242, 137, 177, + 219, 99, 128, 216, 43, 2, 59, 72, 233, 52, 233, 21, 177, 254, 57, 242, + 137, 177, 254, 57, 233, 21, 22, 219, 155, 228, 57, 128, 112, 242, 137, + 22, 219, 155, 228, 57, 128, 112, 233, 21, 22, 228, 57, 254, 57, 242, 137, + 22, 228, 57, 254, 57, 233, 21, 72, 246, 119, 128, 72, 242, 136, 242, 137, + 72, 246, 119, 128, 72, 233, 20, 233, 21, 72, 219, 164, 177, 245, 107, + 242, 137, 72, 219, 164, 177, 245, 107, 233, 21, 72, 219, 164, 72, 242, + 136, 242, 137, 72, 219, 164, 72, 233, 20, 233, 21, 72, 242, 137, 72, 246, + 119, 245, 107, 242, 137, 72, 233, 21, 72, 246, 119, 245, 107, 233, 21, + 72, 219, 99, 128, 72, 242, 137, 72, 219, 99, 245, 107, 242, 137, 72, 219, + 99, 128, 72, 233, 21, 72, 219, 99, 245, 107, 219, 99, 128, 216, 43, 177, + 233, 20, 219, 99, 128, 216, 43, 177, 242, 136, 219, 99, 128, 216, 43, + 177, 233, 21, 2, 59, 235, 222, 219, 99, 128, 216, 43, 177, 242, 137, 2, + 59, 235, 222, 246, 119, 128, 216, 43, 177, 233, 20, 246, 119, 128, 216, + 43, 177, 242, 136, 246, 119, 219, 99, 128, 216, 43, 177, 233, 20, 246, + 119, 219, 99, 128, 216, 43, 177, 242, 136, 219, 164, 177, 233, 20, 219, + 164, 177, 242, 136, 219, 164, 72, 233, 21, 72, 245, 106, 50, 219, 164, + 72, 242, 137, 72, 245, 106, 50, 52, 229, 96, 233, 20, 52, 229, 96, 242, + 136, 52, 229, 96, 233, 21, 2, 214, 183, 242, 137, 226, 125, 233, 20, 242, + 137, 252, 38, 233, 20, 233, 21, 250, 8, 251, 86, 249, 100, 242, 137, 250, + 8, 251, 86, 249, 100, 233, 21, 250, 8, 251, 86, 249, 101, 72, 219, 99, + 245, 107, 242, 137, 250, 8, 251, 86, 249, 101, 72, 219, 99, 245, 107, + 219, 80, 216, 201, 233, 89, 216, 201, 219, 80, 216, 202, 177, 128, 112, + 233, 89, 216, 202, 177, 128, 112, 245, 106, 5, 2, 251, 116, 48, 224, 206, + 72, 219, 155, 245, 106, 50, 218, 57, 72, 219, 155, 245, 106, 50, 224, + 206, 72, 219, 155, 228, 57, 128, 112, 218, 57, 72, 219, 155, 228, 57, + 128, 112, 224, 206, 72, 245, 106, 50, 218, 57, 72, 245, 106, 50, 224, + 206, 72, 228, 57, 128, 112, 218, 57, 72, 228, 57, 128, 112, 224, 206, 72, + 254, 156, 128, 112, 218, 57, 72, 254, 156, 128, 112, 224, 206, 72, 228, + 57, 254, 156, 128, 112, 218, 57, 72, 228, 57, 254, 156, 128, 112, 52, + 224, 205, 52, 218, 56, 218, 65, 2, 247, 128, 218, 23, 2, 247, 128, 218, + 65, 2, 96, 5, 51, 218, 23, 2, 96, 5, 51, 218, 65, 2, 230, 89, 5, 51, 218, + 23, 2, 230, 89, 5, 51, 218, 65, 64, 177, 128, 216, 43, 2, 59, 48, 218, + 23, 64, 177, 128, 216, 43, 2, 59, 48, 218, 65, 64, 72, 245, 106, 50, 218, + 23, 64, 72, 245, 106, 50, 218, 65, 64, 72, 216, 90, 226, 171, 218, 23, + 64, 72, 216, 90, 226, 171, 218, 65, 64, 72, 254, 156, 128, 112, 218, 23, + 64, 72, 254, 156, 128, 112, 218, 65, 64, 72, 228, 57, 128, 112, 218, 23, + 64, 72, 228, 57, 128, 112, 42, 43, 204, 93, 226, 171, 42, 44, 204, 93, + 226, 171, 250, 8, 218, 64, 250, 8, 218, 22, 250, 8, 218, 65, 177, 128, + 112, 250, 8, 218, 23, 177, 128, 112, 218, 65, 72, 218, 22, 218, 23, 72, + 218, 64, 218, 65, 72, 218, 64, 218, 23, 72, 218, 22, 218, 23, 252, 38, + 218, 64, 218, 23, 252, 38, 22, 235, 71, 251, 86, 248, 165, 2, 218, 64, + 245, 178, 64, 226, 174, 246, 111, 225, 51, 2, 217, 13, 216, 14, 215, 241, + 235, 205, 244, 29, 228, 70, 219, 253, 43, 217, 88, 219, 253, 124, 217, + 88, 219, 253, 120, 217, 88, 225, 175, 2, 222, 93, 67, 252, 149, 215, 212, + 44, 215, 93, 52, 67, 252, 149, 43, 215, 93, 67, 252, 149, 52, 43, 215, + 93, 52, 67, 252, 149, 52, 43, 215, 93, 200, 248, 165, 243, 251, 43, 231, + 68, 64, 52, 213, 239, 219, 253, 124, 217, 89, 2, 226, 127, 219, 253, 120, + 217, 89, 2, 214, 183, 219, 253, 120, 217, 89, 72, 219, 253, 124, 217, 88, + 52, 124, 217, 88, 52, 120, 217, 88, 52, 218, 105, 228, 57, 50, 223, 52, + 52, 218, 105, 228, 57, 50, 247, 146, 228, 57, 247, 183, 2, 223, 52, 229, + 106, 219, 97, 67, 232, 220, 2, 250, 44, 48, 67, 232, 220, 2, 250, 44, 51, + 124, 217, 89, 2, 250, 44, 51, 226, 12, 2, 203, 91, 226, 12, 2, 216, 90, + 226, 171, 215, 212, 67, 252, 149, 251, 252, 223, 94, 215, 212, 67, 252, + 149, 2, 203, 91, 215, 212, 249, 235, 226, 171, 215, 212, 229, 96, 233, + 20, 215, 212, 229, 96, 242, 136, 246, 119, 219, 99, 233, 21, 177, 128, + 112, 246, 119, 219, 99, 242, 137, 177, 128, 112, 215, 212, 219, 49, 251, + 252, 223, 94, 233, 91, 215, 212, 67, 252, 149, 226, 171, 52, 219, 49, + 226, 171, 71, 67, 130, 230, 29, 71, 67, 130, 228, 61, 245, 228, 71, 75, + 228, 61, 212, 9, 71, 75, 219, 30, 245, 228, 71, 75, 219, 30, 212, 9, 71, + 75, 43, 44, 71, 75, 140, 85, 75, 214, 153, 85, 75, 246, 112, 85, 75, 228, + 61, 245, 228, 85, 75, 228, 61, 212, 9, 85, 75, 219, 30, 245, 228, 85, 75, + 219, 30, 212, 9, 85, 75, 43, 44, 85, 75, 120, 124, 85, 75, 97, 80, 2, + 216, 78, 246, 111, 97, 80, 2, 216, 78, 214, 152, 140, 80, 2, 216, 78, + 246, 111, 140, 80, 2, 216, 78, 214, 152, 42, 2, 216, 15, 163, 251, 229, + 42, 2, 251, 183, 163, 251, 229, 42, 2, 214, 160, 44, 248, 7, 163, 251, + 229, 42, 2, 232, 114, 43, 248, 7, 163, 251, 229, 248, 1, 2, 43, 163, 251, + 229, 248, 1, 2, 44, 163, 251, 229, 248, 1, 2, 216, 15, 163, 251, 229, + 248, 1, 2, 251, 183, 163, 251, 229, 246, 126, 218, 236, 85, 233, 91, 218, + 236, 71, 233, 91, 218, 236, 85, 213, 187, 4, 218, 236, 71, 213, 187, 4, + 218, 236, 85, 225, 193, 71, 225, 193, 71, 241, 200, 85, 241, 200, 203, + 85, 241, 200, 85, 233, 91, 250, 43, 85, 231, 87, 248, 0, 71, 231, 87, + 248, 0, 85, 231, 87, 232, 110, 71, 231, 87, 232, 110, 85, 4, 248, 0, 85, + 4, 232, 110, 71, 4, 232, 110, 85, 203, 245, 172, 71, 203, 245, 172, 85, + 67, 245, 172, 71, 67, 245, 172, 43, 80, 2, 4, 250, 43, 134, 140, 253, + 255, 43, 80, 2, 37, 225, 25, 200, 140, 218, 232, 75, 140, 215, 58, 80, 2, + 67, 91, 140, 215, 58, 80, 2, 52, 67, 91, 140, 215, 58, 80, 243, 251, 130, + 140, 215, 58, 215, 212, 248, 165, 75, 140, 80, 2, 246, 126, 218, 141, + 140, 80, 2, 217, 79, 2, 67, 91, 140, 80, 2, 217, 79, 2, 52, 67, 91, 140, + 215, 58, 80, 2, 217, 78, 140, 215, 58, 80, 2, 217, 79, 2, 67, 91, 140, + 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 80, 216, 140, 211, 178, 212, + 36, 80, 225, 10, 247, 203, 233, 52, 245, 106, 5, 72, 140, 75, 223, 53, + 216, 90, 226, 172, 72, 140, 75, 140, 80, 72, 223, 53, 254, 156, 128, 112, + 97, 80, 216, 140, 242, 136, 97, 80, 216, 140, 218, 22, 140, 224, 27, 75, + 97, 224, 27, 75, 223, 53, 216, 90, 226, 172, 72, 97, 75, 97, 80, 72, 223, + 53, 254, 156, 128, 112, 216, 90, 226, 172, 72, 140, 75, 140, 80, 72, 254, + 156, 128, 112, 140, 80, 72, 223, 53, 216, 90, 226, 171, 97, 80, 72, 223, + 53, 216, 90, 226, 171, 71, 231, 87, 218, 158, 85, 4, 218, 158, 71, 4, + 218, 158, 85, 222, 250, 225, 193, 71, 222, 250, 225, 193, 114, 233, 91, + 250, 43, 114, 226, 128, 2, 226, 128, 235, 222, 114, 250, 44, 2, 250, 44, + 235, 222, 114, 250, 43, 114, 37, 222, 0, 145, 6, 1, 253, 167, 145, 6, 1, + 251, 125, 145, 6, 1, 213, 253, 145, 6, 1, 242, 192, 145, 6, 1, 247, 148, + 145, 6, 1, 211, 21, 145, 6, 1, 210, 68, 145, 6, 1, 246, 42, 145, 6, 1, + 210, 91, 145, 6, 1, 235, 154, 145, 6, 1, 65, 235, 154, 145, 6, 1, 74, + 145, 6, 1, 247, 168, 145, 6, 1, 234, 246, 145, 6, 1, 232, 192, 145, 6, 1, + 230, 34, 145, 6, 1, 229, 196, 145, 6, 1, 226, 189, 145, 6, 1, 225, 7, + 145, 6, 1, 222, 230, 145, 6, 1, 219, 85, 145, 6, 1, 215, 81, 145, 6, 1, + 214, 201, 145, 6, 1, 243, 254, 145, 6, 1, 241, 206, 145, 6, 1, 226, 139, + 145, 6, 1, 225, 224, 145, 6, 1, 219, 230, 145, 6, 1, 215, 168, 145, 6, 1, + 250, 83, 145, 6, 1, 220, 104, 145, 6, 1, 211, 27, 145, 6, 1, 211, 29, + 145, 6, 1, 211, 57, 145, 6, 1, 218, 255, 162, 145, 6, 1, 210, 212, 145, + 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184, 2, 217, 78, 145, 6, 1, 210, + 244, 145, 6, 1, 235, 191, 4, 210, 183, 145, 6, 1, 252, 1, 210, 183, 145, + 6, 1, 235, 191, 252, 1, 210, 183, 145, 6, 1, 244, 90, 145, 6, 1, 235, + 152, 145, 6, 1, 219, 229, 145, 6, 1, 215, 203, 61, 145, 6, 1, 233, 81, + 230, 34, 145, 4, 1, 253, 167, 145, 4, 1, 251, 125, 145, 4, 1, 213, 253, + 145, 4, 1, 242, 192, 145, 4, 1, 247, 148, 145, 4, 1, 211, 21, 145, 4, 1, + 210, 68, 145, 4, 1, 246, 42, 145, 4, 1, 210, 91, 145, 4, 1, 235, 154, + 145, 4, 1, 65, 235, 154, 145, 4, 1, 74, 145, 4, 1, 247, 168, 145, 4, 1, + 234, 246, 145, 4, 1, 232, 192, 145, 4, 1, 230, 34, 145, 4, 1, 229, 196, + 145, 4, 1, 226, 189, 145, 4, 1, 225, 7, 145, 4, 1, 222, 230, 145, 4, 1, + 219, 85, 145, 4, 1, 215, 81, 145, 4, 1, 214, 201, 145, 4, 1, 243, 254, + 145, 4, 1, 241, 206, 145, 4, 1, 226, 139, 145, 4, 1, 225, 224, 145, 4, 1, + 219, 230, 145, 4, 1, 215, 168, 145, 4, 1, 250, 83, 145, 4, 1, 220, 104, + 145, 4, 1, 211, 27, 145, 4, 1, 211, 29, 145, 4, 1, 211, 57, 145, 4, 1, + 218, 255, 162, 145, 4, 1, 210, 212, 145, 4, 1, 4, 210, 183, 145, 4, 1, 4, + 210, 184, 2, 217, 78, 145, 4, 1, 210, 244, 145, 4, 1, 235, 191, 4, 210, + 183, 145, 4, 1, 252, 1, 210, 183, 145, 4, 1, 235, 191, 252, 1, 210, 183, + 145, 4, 1, 244, 90, 145, 4, 1, 235, 152, 145, 4, 1, 219, 229, 145, 4, 1, + 215, 203, 61, 145, 4, 1, 233, 81, 230, 34, 7, 6, 1, 233, 155, 2, 52, 130, + 7, 4, 1, 233, 155, 2, 52, 130, 7, 6, 1, 233, 155, 2, 230, 229, 184, 7, 6, + 1, 226, 110, 2, 91, 7, 6, 1, 223, 227, 2, 217, 78, 7, 4, 1, 116, 2, 91, + 7, 4, 1, 217, 154, 2, 248, 7, 91, 7, 6, 1, 242, 68, 2, 248, 47, 7, 4, 1, + 242, 68, 2, 248, 47, 7, 6, 1, 235, 30, 2, 248, 47, 7, 4, 1, 235, 30, 2, + 248, 47, 7, 6, 1, 210, 160, 2, 248, 47, 7, 4, 1, 210, 160, 2, 248, 47, 7, + 6, 1, 254, 151, 7, 6, 1, 232, 55, 2, 103, 7, 6, 1, 215, 94, 61, 7, 6, 1, + 215, 94, 254, 151, 7, 4, 1, 214, 106, 2, 44, 103, 7, 6, 1, 212, 99, 2, + 103, 7, 4, 1, 212, 99, 2, 103, 7, 4, 1, 214, 106, 2, 249, 108, 7, 6, 1, + 163, 242, 67, 7, 4, 1, 163, 242, 67, 7, 4, 1, 217, 76, 225, 136, 7, 4, 1, + 160, 2, 228, 55, 7, 4, 1, 215, 94, 223, 227, 2, 217, 78, 7, 4, 1, 144, 2, + 121, 222, 237, 235, 222, 7, 1, 4, 6, 215, 94, 76, 7, 218, 66, 4, 1, 235, + 150, 58, 1, 6, 214, 105, 7, 6, 1, 222, 94, 2, 217, 251, 217, 78, 7, 6, 1, + 210, 160, 2, 217, 251, 217, 78, 81, 6, 1, 254, 173, 81, 4, 1, 254, 173, + 81, 6, 1, 213, 173, 81, 4, 1, 213, 173, 81, 6, 1, 243, 114, 81, 4, 1, + 243, 114, 81, 6, 1, 248, 199, 81, 4, 1, 248, 199, 81, 6, 1, 245, 202, 81, + 4, 1, 245, 202, 81, 6, 1, 219, 35, 81, 4, 1, 219, 35, 81, 6, 1, 210, 101, + 81, 4, 1, 210, 101, 81, 6, 1, 241, 255, 81, 4, 1, 241, 255, 81, 6, 1, + 216, 178, 81, 4, 1, 216, 178, 81, 6, 1, 240, 123, 81, 4, 1, 240, 123, 81, + 6, 1, 234, 233, 81, 4, 1, 234, 233, 81, 6, 1, 233, 78, 81, 4, 1, 233, 78, + 81, 6, 1, 230, 235, 81, 4, 1, 230, 235, 81, 6, 1, 228, 238, 81, 4, 1, + 228, 238, 81, 6, 1, 233, 239, 81, 4, 1, 233, 239, 81, 6, 1, 78, 81, 4, 1, + 78, 81, 6, 1, 225, 111, 81, 4, 1, 225, 111, 81, 6, 1, 222, 213, 81, 4, 1, + 222, 213, 81, 6, 1, 219, 167, 81, 4, 1, 219, 167, 81, 6, 1, 217, 42, 81, + 4, 1, 217, 42, 81, 6, 1, 214, 229, 81, 4, 1, 214, 229, 81, 6, 1, 244, + 129, 81, 4, 1, 244, 129, 81, 6, 1, 234, 118, 81, 4, 1, 234, 118, 81, 6, + 1, 224, 164, 81, 4, 1, 224, 164, 81, 6, 1, 226, 182, 81, 4, 1, 226, 182, + 81, 6, 1, 248, 5, 254, 179, 81, 4, 1, 248, 5, 254, 179, 81, 6, 1, 55, 81, + 254, 205, 81, 4, 1, 55, 81, 254, 205, 81, 6, 1, 249, 123, 245, 202, 81, + 4, 1, 249, 123, 245, 202, 81, 6, 1, 248, 5, 234, 233, 81, 4, 1, 248, 5, + 234, 233, 81, 6, 1, 248, 5, 228, 238, 81, 4, 1, 248, 5, 228, 238, 81, 6, + 1, 249, 123, 228, 238, 81, 4, 1, 249, 123, 228, 238, 81, 6, 1, 55, 81, + 226, 182, 81, 4, 1, 55, 81, 226, 182, 81, 6, 1, 221, 248, 81, 4, 1, 221, + 248, 81, 6, 1, 249, 136, 220, 57, 81, 4, 1, 249, 136, 220, 57, 81, 6, 1, + 55, 81, 220, 57, 81, 4, 1, 55, 81, 220, 57, 81, 6, 1, 55, 81, 245, 83, + 81, 4, 1, 55, 81, 245, 83, 81, 6, 1, 254, 191, 234, 123, 81, 4, 1, 254, + 191, 234, 123, 81, 6, 1, 248, 5, 241, 52, 81, 4, 1, 248, 5, 241, 52, 81, + 6, 1, 55, 81, 241, 52, 81, 4, 1, 55, 81, 241, 52, 81, 6, 1, 55, 81, 162, + 81, 4, 1, 55, 81, 162, 81, 6, 1, 233, 154, 162, 81, 4, 1, 233, 154, 162, + 81, 6, 1, 55, 81, 241, 224, 81, 4, 1, 55, 81, 241, 224, 81, 6, 1, 55, 81, + 242, 2, 81, 4, 1, 55, 81, 242, 2, 81, 6, 1, 55, 81, 243, 109, 81, 4, 1, + 55, 81, 243, 109, 81, 6, 1, 55, 81, 247, 171, 81, 4, 1, 55, 81, 247, 171, + 81, 6, 1, 55, 81, 220, 24, 81, 4, 1, 55, 81, 220, 24, 81, 6, 1, 55, 227, + 212, 220, 24, 81, 4, 1, 55, 227, 212, 220, 24, 81, 6, 1, 55, 227, 212, + 229, 32, 81, 4, 1, 55, 227, 212, 229, 32, 81, 6, 1, 55, 227, 212, 227, + 152, 81, 4, 1, 55, 227, 212, 227, 152, 81, 6, 1, 55, 227, 212, 212, 37, + 81, 4, 1, 55, 227, 212, 212, 37, 81, 16, 234, 252, 81, 16, 230, 236, 222, + 213, 81, 16, 225, 112, 222, 213, 81, 16, 218, 149, 81, 16, 217, 43, 222, + 213, 81, 16, 234, 119, 222, 213, 81, 16, 220, 25, 219, 167, 81, 6, 1, + 249, 123, 220, 57, 81, 4, 1, 249, 123, 220, 57, 81, 6, 1, 249, 123, 243, + 109, 81, 4, 1, 249, 123, 243, 109, 81, 38, 228, 239, 48, 81, 38, 218, + 249, 253, 232, 81, 38, 218, 249, 233, 27, 81, 6, 1, 251, 207, 234, 123, + 81, 4, 1, 251, 207, 234, 123, 81, 55, 227, 212, 243, 236, 218, 131, 81, + 55, 227, 212, 247, 205, 224, 16, 79, 81, 55, 227, 212, 235, 244, 224, 16, + 79, 81, 55, 227, 212, 213, 241, 247, 180, 81, 244, 10, 123, 242, 34, 81, + 243, 236, 218, 131, 81, 230, 129, 247, 180, 98, 4, 1, 254, 131, 98, 4, 1, + 252, 160, 98, 4, 1, 243, 113, 98, 4, 1, 247, 136, 98, 4, 1, 245, 158, 98, + 4, 1, 213, 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 61, 98, 4, 1, 236, 6, + 98, 4, 1, 234, 240, 98, 4, 1, 233, 87, 98, 4, 1, 231, 190, 98, 4, 1, 229, + 200, 98, 4, 1, 226, 200, 98, 4, 1, 226, 21, 98, 4, 1, 210, 78, 98, 4, 1, + 223, 174, 98, 4, 1, 221, 245, 98, 4, 1, 217, 51, 98, 4, 1, 214, 190, 98, + 4, 1, 225, 143, 98, 4, 1, 234, 127, 98, 4, 1, 242, 248, 98, 4, 1, 224, + 76, 98, 4, 1, 220, 22, 98, 4, 1, 250, 105, 98, 4, 1, 251, 15, 98, 4, 1, + 235, 106, 98, 4, 1, 250, 48, 98, 4, 1, 250, 151, 98, 4, 1, 211, 163, 98, + 4, 1, 235, 117, 98, 4, 1, 242, 50, 98, 4, 1, 241, 245, 98, 4, 1, 241, + 182, 98, 4, 1, 212, 22, 98, 4, 1, 242, 11, 98, 4, 1, 241, 72, 98, 4, 1, + 210, 246, 98, 4, 1, 254, 241, 216, 109, 1, 192, 216, 109, 1, 211, 99, + 216, 109, 1, 211, 98, 216, 109, 1, 211, 88, 216, 109, 1, 211, 86, 216, + 109, 1, 252, 40, 255, 25, 211, 81, 216, 109, 1, 211, 81, 216, 109, 1, + 211, 96, 216, 109, 1, 211, 93, 216, 109, 1, 211, 95, 216, 109, 1, 211, + 94, 216, 109, 1, 211, 12, 216, 109, 1, 211, 90, 216, 109, 1, 211, 79, + 216, 109, 1, 215, 116, 211, 79, 216, 109, 1, 211, 76, 216, 109, 1, 211, + 84, 216, 109, 1, 252, 40, 255, 25, 211, 84, 216, 109, 1, 215, 116, 211, + 84, 216, 109, 1, 211, 83, 216, 109, 1, 211, 103, 216, 109, 1, 211, 77, + 216, 109, 1, 215, 116, 211, 77, 216, 109, 1, 211, 66, 216, 109, 1, 215, + 116, 211, 66, 216, 109, 1, 211, 8, 216, 109, 1, 211, 49, 216, 109, 1, + 254, 216, 211, 49, 216, 109, 1, 215, 116, 211, 49, 216, 109, 1, 211, 75, + 216, 109, 1, 211, 74, 216, 109, 1, 211, 71, 216, 109, 1, 215, 116, 211, + 85, 216, 109, 1, 215, 116, 211, 69, 216, 109, 1, 211, 67, 216, 109, 1, + 210, 212, 216, 109, 1, 211, 64, 216, 109, 1, 211, 63, 216, 109, 1, 211, + 87, 216, 109, 1, 215, 116, 211, 87, 216, 109, 1, 253, 171, 211, 87, 216, + 109, 1, 211, 62, 216, 109, 1, 211, 60, 216, 109, 1, 211, 61, 216, 109, 1, + 211, 59, 216, 109, 1, 211, 58, 216, 109, 1, 211, 97, 216, 109, 1, 211, + 56, 216, 109, 1, 211, 54, 216, 109, 1, 211, 53, 216, 109, 1, 211, 52, + 216, 109, 1, 211, 50, 216, 109, 1, 217, 35, 211, 50, 216, 109, 1, 211, + 48, 216, 109, 1, 211, 47, 216, 109, 1, 210, 244, 216, 109, 58, 1, 233, + 132, 79, 216, 109, 220, 140, 79, 216, 109, 117, 235, 69, 29, 3, 232, 161, + 29, 3, 230, 165, 29, 3, 222, 211, 29, 3, 219, 59, 29, 3, 220, 8, 29, 3, + 251, 212, 29, 3, 216, 42, 29, 3, 249, 245, 29, 3, 228, 77, 29, 3, 227, + 137, 29, 3, 242, 187, 227, 4, 29, 3, 210, 22, 29, 3, 247, 151, 29, 3, + 248, 112, 29, 3, 235, 73, 29, 3, 216, 156, 29, 3, 250, 93, 29, 3, 225, + 123, 29, 3, 225, 18, 29, 3, 243, 6, 29, 3, 243, 2, 29, 3, 243, 3, 29, 3, + 243, 4, 29, 3, 218, 225, 29, 3, 218, 181, 29, 3, 218, 194, 29, 3, 218, + 224, 29, 3, 218, 198, 29, 3, 218, 199, 29, 3, 218, 186, 29, 3, 250, 221, + 29, 3, 250, 200, 29, 3, 250, 202, 29, 3, 250, 220, 29, 3, 250, 218, 29, + 3, 250, 219, 29, 3, 250, 201, 29, 3, 209, 243, 29, 3, 209, 221, 29, 3, + 209, 234, 29, 3, 209, 242, 29, 3, 209, 237, 29, 3, 209, 238, 29, 3, 209, + 226, 29, 3, 250, 216, 29, 3, 250, 203, 29, 3, 250, 205, 29, 3, 250, 215, + 29, 3, 250, 213, 29, 3, 250, 214, 29, 3, 250, 204, 29, 3, 223, 239, 29, + 3, 223, 229, 29, 3, 223, 235, 29, 3, 223, 238, 29, 3, 223, 236, 29, 3, + 223, 237, 29, 3, 223, 234, 29, 3, 233, 165, 29, 3, 233, 157, 29, 3, 233, + 160, 29, 3, 233, 164, 29, 3, 233, 161, 29, 3, 233, 162, 29, 3, 233, 158, + 29, 3, 211, 130, 29, 3, 211, 120, 29, 3, 211, 126, 29, 3, 211, 129, 29, + 3, 211, 127, 29, 3, 211, 128, 29, 3, 211, 125, 29, 3, 242, 78, 29, 3, + 242, 69, 29, 3, 242, 72, 29, 3, 242, 77, 29, 3, 242, 74, 29, 3, 242, 75, + 29, 3, 242, 71, 38, 33, 1, 252, 83, 38, 33, 1, 213, 255, 38, 33, 1, 242, + 243, 38, 33, 1, 248, 98, 38, 33, 1, 210, 74, 38, 33, 1, 210, 94, 38, 33, + 1, 176, 38, 33, 1, 245, 182, 38, 33, 1, 245, 167, 38, 33, 1, 245, 158, + 38, 33, 1, 78, 38, 33, 1, 225, 224, 38, 33, 1, 245, 100, 38, 33, 1, 245, + 90, 38, 33, 1, 217, 23, 38, 33, 1, 162, 38, 33, 1, 215, 179, 38, 33, 1, + 250, 139, 38, 33, 1, 220, 104, 38, 33, 1, 220, 67, 38, 33, 1, 244, 90, + 38, 33, 1, 245, 89, 38, 33, 1, 61, 38, 33, 1, 236, 67, 38, 33, 1, 247, + 169, 38, 33, 1, 230, 145, 214, 205, 38, 33, 1, 211, 59, 38, 33, 1, 210, + 212, 38, 33, 1, 235, 190, 61, 38, 33, 1, 232, 198, 210, 183, 38, 33, 1, + 252, 1, 210, 183, 38, 33, 1, 235, 190, 252, 1, 210, 183, 44, 254, 118, + 218, 61, 231, 159, 44, 254, 118, 246, 126, 218, 61, 231, 159, 43, 218, + 61, 127, 44, 218, 61, 127, 43, 246, 126, 218, 61, 127, 44, 246, 126, 218, + 61, 127, 223, 160, 235, 209, 231, 159, 223, 160, 246, 126, 235, 209, 231, + 159, 246, 126, 215, 242, 231, 159, 43, 215, 242, 127, 44, 215, 242, 127, + 223, 160, 218, 236, 43, 223, 160, 226, 202, 127, 44, 223, 160, 226, 202, + 127, 245, 218, 249, 166, 226, 17, 244, 30, 226, 17, 223, 52, 244, 30, + 226, 17, 240, 172, 246, 126, 226, 255, 246, 112, 254, 127, 214, 153, 254, + 127, 246, 126, 222, 250, 254, 117, 52, 226, 252, 240, 175, 235, 200, 235, + 208, 226, 63, 251, 162, 240, 176, 2, 248, 9, 216, 90, 2, 222, 237, 48, + 43, 121, 226, 9, 127, 44, 121, 226, 9, 127, 216, 90, 2, 59, 48, 216, 90, + 2, 59, 51, 43, 67, 252, 149, 2, 224, 10, 44, 67, 252, 149, 2, 224, 10, + 216, 15, 43, 163, 127, 216, 15, 44, 163, 127, 251, 183, 43, 163, 127, + 251, 183, 44, 163, 127, 43, 219, 189, 104, 127, 44, 219, 189, 104, 127, + 43, 52, 226, 7, 44, 52, 226, 7, 113, 170, 115, 123, 59, 224, 143, 123, + 59, 115, 113, 170, 224, 143, 92, 244, 19, 59, 224, 143, 244, 89, 59, 79, + 223, 52, 224, 16, 79, 67, 184, 222, 237, 225, 13, 211, 209, 220, 140, + 230, 229, 247, 128, 215, 94, 249, 227, 223, 160, 247, 128, 223, 160, 249, + 227, 215, 94, 220, 152, 248, 214, 2, 43, 242, 115, 248, 214, 2, 44, 242, + 115, 215, 94, 248, 213, 216, 15, 163, 221, 175, 50, 215, 59, 248, 164, + 216, 144, 248, 164, 10, 34, 223, 79, 10, 34, 250, 18, 10, 34, 221, 178, + 111, 10, 34, 221, 178, 105, 10, 34, 221, 178, 158, 10, 34, 225, 170, 10, + 34, 251, 171, 10, 34, 217, 93, 10, 34, 234, 39, 111, 10, 34, 234, 39, + 105, 10, 34, 247, 178, 10, 34, 221, 181, 10, 34, 4, 111, 10, 34, 4, 105, + 10, 34, 233, 103, 111, 10, 34, 233, 103, 105, 10, 34, 233, 103, 158, 10, + 34, 233, 103, 161, 10, 34, 219, 70, 10, 34, 216, 146, 10, 34, 219, 68, + 111, 10, 34, 219, 68, 105, 10, 34, 241, 235, 111, 10, 34, 241, 235, 105, + 10, 34, 242, 22, 10, 34, 223, 150, 10, 34, 250, 90, 10, 34, 218, 38, 10, + 34, 230, 133, 10, 34, 248, 96, 10, 34, 230, 125, 10, 34, 250, 33, 10, 34, + 212, 41, 111, 10, 34, 212, 41, 105, 10, 34, 244, 104, 10, 34, 225, 236, + 111, 10, 34, 225, 236, 105, 10, 34, 219, 162, 163, 215, 237, 215, 189, + 10, 34, 249, 153, 10, 34, 247, 144, 10, 34, 235, 143, 10, 34, 251, 206, + 64, 250, 2, 10, 34, 245, 23, 10, 34, 218, 251, 111, 10, 34, 218, 251, + 105, 10, 34, 252, 162, 10, 34, 219, 169, 10, 34, 251, 71, 219, 169, 10, + 34, 229, 95, 111, 10, 34, 229, 95, 105, 10, 34, 229, 95, 158, 10, 34, + 229, 95, 161, 10, 34, 231, 51, 10, 34, 220, 59, 10, 34, 223, 156, 10, 34, + 245, 45, 10, 34, 226, 213, 10, 34, 251, 141, 111, 10, 34, 251, 141, 105, + 10, 34, 231, 91, 10, 34, 230, 128, 10, 34, 242, 147, 111, 10, 34, 242, + 147, 105, 10, 34, 242, 147, 158, 10, 34, 216, 107, 10, 34, 250, 1, 10, + 34, 212, 9, 111, 10, 34, 212, 9, 105, 10, 34, 251, 71, 221, 172, 10, 34, + 219, 162, 240, 255, 10, 34, 240, 255, 10, 34, 251, 71, 219, 4, 10, 34, + 251, 71, 220, 54, 10, 34, 244, 40, 10, 34, 251, 71, 250, 236, 10, 34, + 219, 162, 212, 57, 10, 34, 212, 58, 111, 10, 34, 212, 58, 105, 10, 34, + 250, 35, 10, 34, 251, 71, 242, 173, 10, 34, 200, 111, 10, 34, 200, 105, + 10, 34, 251, 71, 232, 143, 10, 34, 251, 71, 243, 95, 10, 34, 230, 124, + 111, 10, 34, 230, 124, 105, 10, 34, 223, 162, 10, 34, 251, 215, 10, 34, + 251, 71, 217, 57, 233, 58, 10, 34, 251, 71, 233, 59, 10, 34, 251, 71, + 211, 239, 10, 34, 251, 71, 244, 54, 10, 34, 245, 226, 111, 10, 34, 245, + 226, 105, 10, 34, 245, 226, 158, 10, 34, 251, 71, 245, 225, 10, 34, 241, + 242, 10, 34, 251, 71, 240, 252, 10, 34, 251, 202, 10, 34, 242, 229, 10, + 34, 251, 71, 244, 98, 10, 34, 251, 71, 251, 245, 10, 34, 251, 71, 222, 3, + 10, 34, 219, 162, 212, 2, 10, 34, 219, 162, 211, 41, 10, 34, 251, 71, + 243, 252, 10, 34, 235, 149, 245, 49, 10, 34, 251, 71, 245, 49, 10, 34, + 235, 149, 216, 16, 10, 34, 251, 71, 216, 16, 10, 34, 235, 149, 246, 104, + 10, 34, 251, 71, 246, 104, 10, 34, 215, 91, 10, 34, 235, 149, 215, 91, + 10, 34, 251, 71, 215, 91, 60, 34, 111, 60, 34, 232, 219, 60, 34, 247, + 128, 60, 34, 219, 97, 60, 34, 221, 177, 60, 34, 103, 60, 34, 105, 60, 34, + 232, 243, 60, 34, 231, 190, 60, 34, 233, 39, 60, 34, 245, 137, 60, 34, + 196, 60, 34, 124, 251, 171, 60, 34, 249, 155, 60, 34, 240, 118, 60, 34, + 217, 93, 60, 34, 204, 251, 171, 60, 34, 234, 38, 60, 34, 224, 227, 60, + 34, 211, 202, 60, 34, 218, 245, 60, 34, 44, 204, 251, 171, 60, 34, 241, + 183, 245, 153, 60, 34, 216, 248, 60, 34, 247, 178, 60, 34, 221, 181, 60, + 34, 250, 18, 60, 34, 224, 185, 60, 34, 254, 224, 60, 34, 230, 115, 60, + 34, 245, 153, 60, 34, 245, 231, 60, 34, 221, 202, 60, 34, 242, 181, 60, + 34, 242, 182, 219, 83, 60, 34, 245, 48, 60, 34, 252, 0, 60, 34, 211, 221, + 60, 34, 250, 109, 60, 34, 222, 198, 60, 34, 236, 2, 60, 34, 219, 81, 60, + 34, 233, 102, 60, 34, 249, 164, 60, 34, 218, 239, 60, 34, 230, 120, 60, + 34, 222, 227, 60, 34, 211, 206, 60, 34, 226, 194, 60, 34, 215, 98, 60, + 34, 246, 88, 60, 34, 219, 253, 216, 146, 60, 34, 246, 126, 250, 18, 60, + 34, 200, 218, 110, 60, 34, 113, 242, 17, 60, 34, 220, 2, 60, 34, 251, + 177, 60, 34, 219, 67, 60, 34, 251, 145, 60, 34, 218, 140, 60, 34, 241, + 234, 60, 34, 242, 35, 60, 34, 247, 131, 60, 34, 242, 22, 60, 34, 251, + 162, 60, 34, 223, 150, 60, 34, 221, 189, 60, 34, 247, 207, 60, 34, 253, + 176, 60, 34, 218, 236, 60, 34, 228, 56, 60, 34, 218, 38, 60, 34, 221, + 213, 60, 34, 230, 133, 60, 34, 215, 236, 60, 34, 233, 128, 60, 34, 218, + 131, 60, 34, 248, 96, 60, 34, 212, 21, 60, 34, 247, 154, 228, 56, 60, 34, + 249, 223, 60, 34, 243, 229, 60, 34, 250, 29, 60, 34, 218, 144, 60, 34, + 212, 40, 60, 34, 244, 104, 60, 34, 250, 26, 60, 34, 244, 169, 60, 34, 52, + 211, 178, 60, 34, 163, 215, 237, 215, 189, 60, 34, 219, 91, 60, 34, 244, + 179, 60, 34, 249, 153, 60, 34, 247, 144, 60, 34, 224, 182, 60, 34, 235, + 143, 60, 34, 231, 72, 60, 34, 216, 89, 60, 34, 217, 246, 60, 34, 232, + 237, 60, 34, 214, 131, 60, 34, 244, 128, 60, 34, 251, 206, 64, 250, 2, + 60, 34, 219, 190, 60, 34, 246, 126, 216, 243, 60, 34, 211, 253, 60, 34, + 219, 105, 60, 34, 247, 195, 60, 34, 245, 23, 60, 34, 219, 7, 60, 34, 75, + 60, 34, 218, 133, 60, 34, 218, 250, 60, 34, 216, 0, 60, 34, 242, 154, 60, + 34, 250, 226, 60, 34, 218, 162, 60, 34, 252, 162, 60, 34, 223, 34, 60, + 34, 219, 169, 60, 34, 235, 136, 60, 34, 229, 94, 60, 34, 220, 59, 60, 34, + 244, 157, 60, 34, 226, 213, 60, 34, 254, 126, 60, 34, 225, 32, 60, 34, + 245, 235, 60, 34, 251, 140, 60, 34, 231, 91, 60, 34, 230, 188, 60, 34, + 220, 158, 60, 34, 254, 4, 60, 34, 230, 128, 60, 34, 216, 20, 60, 34, 226, + 169, 60, 34, 251, 209, 60, 34, 218, 129, 60, 34, 249, 233, 60, 34, 242, + 146, 60, 34, 216, 107, 60, 34, 235, 224, 60, 34, 251, 219, 60, 34, 212, + 58, 245, 153, 60, 34, 250, 1, 60, 34, 212, 8, 60, 34, 221, 172, 60, 34, + 240, 255, 60, 34, 219, 4, 60, 34, 214, 22, 60, 34, 252, 80, 60, 34, 225, + 76, 60, 34, 252, 182, 60, 34, 220, 54, 60, 34, 223, 113, 60, 34, 222, + 128, 60, 34, 244, 40, 60, 34, 251, 208, 60, 34, 250, 236, 60, 34, 251, + 234, 60, 34, 230, 130, 60, 34, 212, 57, 60, 34, 250, 35, 60, 34, 211, + 236, 60, 34, 247, 188, 60, 34, 213, 161, 60, 34, 242, 173, 60, 34, 232, + 143, 60, 34, 243, 95, 60, 34, 230, 123, 60, 34, 219, 96, 60, 34, 219, + 253, 217, 77, 251, 245, 60, 34, 223, 162, 60, 34, 251, 215, 60, 34, 211, + 197, 60, 34, 244, 198, 60, 34, 233, 58, 60, 34, 217, 57, 233, 58, 60, 34, + 233, 54, 60, 34, 219, 32, 60, 34, 233, 59, 60, 34, 211, 239, 60, 34, 244, + 54, 60, 34, 245, 225, 60, 34, 241, 242, 60, 34, 244, 8, 60, 34, 240, 252, + 60, 34, 251, 202, 60, 34, 217, 64, 60, 34, 242, 41, 60, 34, 244, 121, 60, + 34, 222, 30, 211, 236, 60, 34, 250, 228, 60, 34, 242, 229, 60, 34, 244, + 98, 60, 34, 251, 245, 60, 34, 222, 3, 60, 34, 248, 82, 60, 34, 212, 2, + 60, 34, 241, 217, 60, 34, 211, 41, 60, 34, 230, 197, 60, 34, 251, 229, + 60, 34, 245, 163, 60, 34, 243, 252, 60, 34, 215, 210, 60, 34, 246, 90, + 60, 34, 223, 144, 60, 34, 228, 58, 60, 34, 245, 49, 60, 34, 216, 16, 60, + 34, 246, 104, 60, 34, 215, 91, 60, 34, 244, 56, 110, 248, 45, 135, 43, + 216, 43, 222, 254, 110, 248, 45, 135, 72, 216, 43, 51, 110, 248, 45, 135, + 43, 216, 43, 230, 229, 22, 222, 254, 110, 248, 45, 135, 72, 216, 43, 230, + 229, 22, 51, 110, 248, 45, 135, 243, 236, 218, 11, 110, 248, 45, 135, + 218, 12, 243, 251, 48, 110, 248, 45, 135, 218, 12, 243, 251, 51, 110, + 248, 45, 135, 218, 12, 243, 251, 233, 52, 110, 248, 45, 135, 218, 12, + 243, 251, 214, 160, 233, 52, 110, 248, 45, 135, 218, 12, 243, 251, 214, + 160, 222, 254, 110, 248, 45, 135, 218, 12, 243, 251, 232, 114, 233, 52, + 110, 248, 45, 135, 226, 126, 110, 219, 20, 110, 249, 227, 110, 243, 236, + 218, 131, 247, 185, 79, 235, 137, 235, 243, 218, 161, 87, 110, 235, 164, + 79, 110, 250, 4, 79, 110, 54, 210, 86, 43, 254, 118, 127, 44, 254, 118, + 127, 43, 52, 254, 118, 127, 44, 52, 254, 118, 127, 43, 249, 169, 127, 44, + 249, 169, 127, 43, 71, 249, 169, 127, 44, 71, 249, 169, 127, 43, 85, 233, + 26, 127, 44, 85, 233, 26, 127, 224, 240, 79, 243, 39, 79, 43, 216, 7, + 220, 55, 127, 44, 216, 7, 220, 55, 127, 43, 71, 233, 26, 127, 44, 71, + 233, 26, 127, 43, 71, 216, 7, 220, 55, 127, 44, 71, 216, 7, 220, 55, 127, + 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 164, 223, 52, 52, 224, + 194, 224, 1, 79, 52, 224, 194, 224, 1, 79, 121, 52, 224, 194, 224, 1, 79, + 224, 240, 164, 244, 198, 242, 15, 227, 202, 111, 242, 15, 227, 202, 105, + 242, 15, 227, 202, 158, 242, 15, 227, 202, 161, 242, 15, 227, 202, 190, + 242, 15, 227, 202, 195, 242, 15, 227, 202, 199, 242, 15, 227, 202, 196, + 242, 15, 227, 202, 201, 110, 233, 9, 138, 79, 110, 222, 231, 138, 79, + 110, 248, 52, 138, 79, 110, 245, 136, 138, 79, 24, 219, 157, 59, 138, 79, + 24, 52, 59, 138, 79, 212, 32, 248, 164, 67, 234, 239, 223, 80, 79, 67, + 234, 239, 223, 80, 2, 213, 135, 219, 33, 79, 67, 234, 239, 223, 80, 164, + 214, 160, 242, 34, 67, 234, 239, 223, 80, 2, 213, 135, 219, 33, 164, 214, + 160, 242, 34, 67, 234, 239, 223, 80, 164, 232, 114, 242, 34, 37, 224, + 240, 79, 110, 217, 4, 232, 220, 244, 154, 220, 140, 87, 242, 15, 227, + 202, 216, 248, 242, 15, 227, 202, 215, 73, 242, 15, 227, 202, 216, 163, + 67, 110, 235, 164, 79, 231, 145, 79, 226, 3, 254, 148, 79, 110, 45, 235, + 245, 110, 163, 244, 114, 219, 20, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, + 74, 141, 1, 74, 141, 1, 4, 69, 141, 1, 69, 141, 1, 4, 76, 141, 1, 76, + 141, 1, 4, 78, 141, 1, 78, 141, 1, 176, 141, 1, 243, 142, 141, 1, 234, + 98, 141, 1, 242, 221, 141, 1, 233, 223, 141, 1, 242, 120, 141, 1, 234, + 188, 141, 1, 243, 69, 141, 1, 234, 34, 141, 1, 242, 181, 141, 1, 206, + 141, 1, 210, 116, 141, 1, 219, 193, 141, 1, 210, 44, 141, 1, 218, 84, + 141, 1, 210, 13, 141, 1, 221, 183, 141, 1, 210, 94, 141, 1, 219, 60, 141, + 1, 210, 23, 141, 1, 217, 106, 141, 1, 248, 229, 141, 1, 216, 118, 141, 1, + 248, 11, 141, 1, 4, 215, 119, 141, 1, 215, 119, 141, 1, 246, 86, 141, 1, + 217, 23, 141, 1, 248, 98, 141, 1, 112, 141, 1, 247, 153, 141, 1, 198, + 141, 1, 228, 238, 141, 1, 227, 242, 141, 1, 229, 112, 141, 1, 228, 79, + 141, 1, 162, 141, 1, 252, 199, 141, 1, 191, 141, 1, 241, 187, 141, 1, + 252, 14, 141, 1, 225, 111, 141, 1, 240, 229, 141, 1, 251, 133, 141, 1, + 224, 153, 141, 1, 241, 245, 141, 1, 252, 83, 141, 1, 225, 224, 141, 1, + 241, 75, 141, 1, 251, 213, 141, 1, 225, 19, 141, 1, 186, 141, 1, 230, + 235, 141, 1, 230, 107, 141, 1, 231, 96, 141, 1, 230, 166, 141, 1, 4, 192, + 141, 1, 192, 141, 1, 4, 210, 212, 141, 1, 210, 212, 141, 1, 4, 210, 244, + 141, 1, 210, 244, 141, 1, 205, 141, 1, 223, 38, 141, 1, 222, 142, 141, 1, + 223, 131, 141, 1, 222, 213, 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, + 211, 250, 141, 1, 212, 22, 141, 1, 211, 227, 141, 1, 230, 30, 141, 1, + 212, 116, 141, 1, 4, 176, 141, 1, 4, 234, 188, 38, 234, 207, 213, 135, + 219, 33, 79, 38, 234, 207, 220, 157, 219, 33, 79, 234, 207, 213, 135, + 219, 33, 79, 234, 207, 220, 157, 219, 33, 79, 141, 235, 164, 79, 141, + 213, 135, 235, 164, 79, 141, 247, 229, 210, 225, 234, 207, 52, 240, 175, + 56, 1, 4, 61, 56, 1, 61, 56, 1, 4, 74, 56, 1, 74, 56, 1, 4, 69, 56, 1, + 69, 56, 1, 4, 76, 56, 1, 76, 56, 1, 4, 78, 56, 1, 78, 56, 1, 176, 56, 1, + 243, 142, 56, 1, 234, 98, 56, 1, 242, 221, 56, 1, 233, 223, 56, 1, 242, + 120, 56, 1, 234, 188, 56, 1, 243, 69, 56, 1, 234, 34, 56, 1, 242, 181, + 56, 1, 206, 56, 1, 210, 116, 56, 1, 219, 193, 56, 1, 210, 44, 56, 1, 218, + 84, 56, 1, 210, 13, 56, 1, 221, 183, 56, 1, 210, 94, 56, 1, 219, 60, 56, + 1, 210, 23, 56, 1, 217, 106, 56, 1, 248, 229, 56, 1, 216, 118, 56, 1, + 248, 11, 56, 1, 4, 215, 119, 56, 1, 215, 119, 56, 1, 246, 86, 56, 1, 217, + 23, 56, 1, 248, 98, 56, 1, 112, 56, 1, 247, 153, 56, 1, 198, 56, 1, 228, + 238, 56, 1, 227, 242, 56, 1, 229, 112, 56, 1, 228, 79, 56, 1, 162, 56, 1, + 252, 199, 56, 1, 191, 56, 1, 241, 187, 56, 1, 252, 14, 56, 1, 225, 111, + 56, 1, 240, 229, 56, 1, 251, 133, 56, 1, 224, 153, 56, 1, 241, 245, 56, + 1, 252, 83, 56, 1, 225, 224, 56, 1, 241, 75, 56, 1, 251, 213, 56, 1, 225, + 19, 56, 1, 186, 56, 1, 230, 235, 56, 1, 230, 107, 56, 1, 231, 96, 56, 1, + 230, 166, 56, 1, 4, 192, 56, 1, 192, 56, 1, 4, 210, 212, 56, 1, 210, 212, + 56, 1, 4, 210, 244, 56, 1, 210, 244, 56, 1, 205, 56, 1, 223, 38, 56, 1, + 222, 142, 56, 1, 223, 131, 56, 1, 222, 213, 56, 1, 4, 212, 65, 56, 1, + 212, 65, 56, 1, 211, 250, 56, 1, 212, 22, 56, 1, 211, 227, 56, 1, 230, + 30, 56, 1, 212, 116, 56, 1, 4, 176, 56, 1, 4, 234, 188, 56, 1, 214, 27, + 56, 1, 213, 176, 56, 1, 213, 255, 56, 1, 213, 138, 56, 230, 229, 247, + 128, 234, 207, 224, 176, 219, 33, 79, 56, 235, 164, 79, 56, 213, 135, + 235, 164, 79, 56, 247, 229, 234, 5, 251, 192, 1, 253, 166, 251, 192, 1, + 226, 109, 251, 192, 1, 194, 251, 192, 1, 245, 14, 251, 192, 1, 249, 68, + 251, 192, 1, 217, 153, 251, 192, 1, 230, 30, 251, 192, 1, 156, 251, 192, + 1, 243, 209, 251, 192, 1, 235, 29, 251, 192, 1, 242, 67, 251, 192, 1, + 235, 150, 251, 192, 1, 224, 99, 251, 192, 1, 211, 178, 251, 192, 1, 210, + 83, 251, 192, 1, 250, 166, 251, 192, 1, 220, 106, 251, 192, 1, 153, 251, + 192, 1, 210, 159, 251, 192, 1, 251, 74, 251, 192, 1, 222, 93, 251, 192, + 1, 61, 251, 192, 1, 78, 251, 192, 1, 76, 251, 192, 1, 245, 205, 251, 192, + 1, 254, 210, 251, 192, 1, 245, 203, 251, 192, 1, 253, 200, 251, 192, 1, + 226, 138, 251, 192, 1, 254, 131, 251, 192, 1, 245, 158, 251, 192, 1, 254, + 123, 251, 192, 1, 245, 146, 251, 192, 1, 245, 100, 251, 192, 1, 74, 251, + 192, 1, 69, 251, 192, 1, 235, 162, 251, 192, 1, 214, 105, 251, 192, 1, + 229, 84, 251, 192, 1, 242, 185, 251, 192, 1, 236, 41, 24, 1, 234, 64, 24, + 1, 218, 217, 24, 1, 234, 57, 24, 1, 228, 231, 24, 1, 228, 229, 24, 1, + 228, 228, 24, 1, 216, 102, 24, 1, 218, 206, 24, 1, 223, 29, 24, 1, 223, + 24, 24, 1, 223, 21, 24, 1, 223, 14, 24, 1, 223, 9, 24, 1, 223, 4, 24, 1, + 223, 15, 24, 1, 223, 27, 24, 1, 230, 222, 24, 1, 225, 98, 24, 1, 218, + 214, 24, 1, 225, 87, 24, 1, 219, 150, 24, 1, 218, 211, 24, 1, 236, 63, + 24, 1, 250, 54, 24, 1, 218, 221, 24, 1, 250, 114, 24, 1, 234, 116, 24, 1, + 216, 174, 24, 1, 225, 134, 24, 1, 241, 179, 24, 1, 61, 24, 1, 254, 252, + 24, 1, 192, 24, 1, 211, 92, 24, 1, 245, 125, 24, 1, 76, 24, 1, 211, 36, + 24, 1, 211, 47, 24, 1, 78, 24, 1, 212, 65, 24, 1, 212, 62, 24, 1, 226, + 238, 24, 1, 210, 244, 24, 1, 69, 24, 1, 212, 11, 24, 1, 212, 22, 24, 1, + 211, 250, 24, 1, 210, 212, 24, 1, 245, 63, 24, 1, 211, 8, 24, 1, 74, 24, + 244, 111, 24, 1, 218, 215, 24, 1, 228, 221, 24, 1, 228, 223, 24, 1, 228, + 226, 24, 1, 223, 22, 24, 1, 223, 3, 24, 1, 223, 11, 24, 1, 223, 16, 24, + 1, 223, 1, 24, 1, 230, 215, 24, 1, 230, 212, 24, 1, 230, 216, 24, 1, 234, + 227, 24, 1, 225, 93, 24, 1, 225, 79, 24, 1, 225, 85, 24, 1, 225, 82, 24, + 1, 225, 96, 24, 1, 225, 80, 24, 1, 234, 225, 24, 1, 234, 223, 24, 1, 219, + 143, 24, 1, 219, 141, 24, 1, 219, 133, 24, 1, 219, 138, 24, 1, 219, 148, + 24, 1, 226, 36, 24, 1, 218, 218, 24, 1, 211, 26, 24, 1, 211, 22, 24, 1, + 211, 23, 24, 1, 234, 226, 24, 1, 218, 219, 24, 1, 211, 32, 24, 1, 210, + 238, 24, 1, 210, 237, 24, 1, 210, 240, 24, 1, 210, 203, 24, 1, 210, 204, + 24, 1, 210, 207, 24, 1, 254, 42, 24, 1, 254, 36, 110, 254, 107, 232, 209, + 79, 110, 254, 107, 223, 53, 79, 110, 254, 107, 123, 79, 110, 254, 107, + 113, 79, 110, 254, 107, 134, 79, 110, 254, 107, 244, 19, 79, 110, 254, + 107, 216, 15, 79, 110, 254, 107, 230, 229, 79, 110, 254, 107, 251, 183, + 79, 110, 254, 107, 244, 100, 79, 110, 254, 107, 221, 178, 79, 110, 254, + 107, 216, 170, 79, 110, 254, 107, 244, 12, 79, 110, 254, 107, 241, 231, + 79, 110, 254, 107, 245, 232, 79, 110, 254, 107, 231, 191, 79, 251, 192, + 1, 251, 133, 251, 192, 1, 210, 44, 251, 192, 1, 235, 114, 251, 192, 1, + 242, 120, 251, 192, 1, 245, 217, 251, 192, 1, 245, 143, 251, 192, 1, 226, + 187, 251, 192, 1, 226, 191, 251, 192, 1, 235, 186, 251, 192, 1, 254, 109, + 251, 192, 1, 235, 231, 251, 192, 1, 214, 168, 251, 192, 1, 236, 23, 251, + 192, 1, 229, 62, 251, 192, 1, 254, 204, 251, 192, 1, 253, 195, 251, 192, + 1, 254, 144, 251, 192, 1, 226, 208, 251, 192, 1, 226, 193, 251, 192, 1, + 235, 228, 251, 192, 40, 1, 226, 109, 251, 192, 40, 1, 217, 153, 251, 192, + 40, 1, 235, 29, 251, 192, 40, 1, 242, 67, 251, 192, 1, 243, 1, 251, 192, + 1, 233, 5, 251, 192, 1, 209, 250, 10, 218, 105, 217, 153, 10, 218, 105, + 212, 4, 10, 218, 105, 211, 158, 10, 218, 105, 251, 87, 10, 218, 105, 217, + 255, 10, 218, 105, 240, 165, 10, 218, 105, 240, 169, 10, 218, 105, 240, + 238, 10, 218, 105, 240, 166, 10, 218, 105, 217, 156, 10, 218, 105, 240, + 168, 10, 218, 105, 240, 164, 10, 218, 105, 240, 236, 10, 218, 105, 240, + 167, 10, 218, 105, 240, 163, 10, 218, 105, 230, 30, 10, 218, 105, 242, + 67, 10, 218, 105, 222, 93, 10, 218, 105, 226, 109, 10, 218, 105, 219, 23, + 10, 218, 105, 249, 68, 10, 218, 105, 240, 170, 10, 218, 105, 241, 197, + 10, 218, 105, 217, 165, 10, 218, 105, 217, 234, 10, 218, 105, 218, 170, + 10, 218, 105, 220, 112, 10, 218, 105, 225, 228, 10, 218, 105, 224, 101, + 10, 218, 105, 216, 44, 10, 218, 105, 217, 155, 10, 218, 105, 217, 245, + 10, 218, 105, 240, 177, 10, 218, 105, 240, 162, 10, 218, 105, 225, 152, + 10, 218, 105, 224, 99, 56, 1, 4, 233, 223, 56, 1, 4, 219, 193, 56, 1, 4, + 218, 84, 56, 1, 4, 112, 56, 1, 4, 227, 242, 56, 1, 4, 162, 56, 1, 4, 241, + 187, 56, 1, 4, 240, 229, 56, 1, 4, 241, 245, 56, 1, 4, 241, 75, 56, 1, 4, + 230, 107, 56, 1, 4, 205, 56, 1, 4, 223, 38, 56, 1, 4, 222, 142, 56, 1, 4, + 223, 131, 56, 1, 4, 222, 213, 88, 24, 234, 64, 88, 24, 228, 231, 88, 24, + 216, 102, 88, 24, 223, 29, 88, 24, 230, 222, 88, 24, 225, 98, 88, 24, + 219, 150, 88, 24, 236, 63, 88, 24, 250, 54, 88, 24, 250, 114, 88, 24, + 234, 116, 88, 24, 216, 174, 88, 24, 225, 134, 88, 24, 241, 179, 88, 24, + 234, 65, 61, 88, 24, 228, 232, 61, 88, 24, 216, 103, 61, 88, 24, 223, 30, + 61, 88, 24, 230, 223, 61, 88, 24, 225, 99, 61, 88, 24, 219, 151, 61, 88, + 24, 236, 64, 61, 88, 24, 250, 55, 61, 88, 24, 250, 115, 61, 88, 24, 234, + 117, 61, 88, 24, 216, 175, 61, 88, 24, 225, 135, 61, 88, 24, 241, 180, + 61, 88, 24, 250, 55, 69, 88, 234, 9, 135, 226, 221, 88, 234, 9, 135, 144, + 240, 229, 88, 154, 111, 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, + 154, 190, 88, 154, 195, 88, 154, 199, 88, 154, 196, 88, 154, 201, 88, + 154, 216, 248, 88, 154, 230, 133, 88, 154, 244, 104, 88, 154, 212, 40, + 88, 154, 211, 214, 88, 154, 231, 44, 88, 154, 245, 231, 88, 154, 218, 38, + 88, 154, 218, 134, 88, 154, 241, 251, 88, 154, 219, 56, 88, 154, 229, + 209, 88, 154, 219, 6, 88, 154, 244, 110, 88, 154, 249, 208, 88, 154, 233, + 131, 88, 154, 223, 74, 88, 154, 251, 23, 88, 154, 218, 88, 88, 154, 218, + 21, 88, 154, 245, 135, 88, 154, 223, 66, 88, 154, 254, 159, 88, 154, 244, + 136, 88, 154, 223, 64, 88, 154, 220, 158, 88, 154, 223, 130, 37, 154, + 224, 15, 37, 154, 234, 86, 37, 154, 221, 200, 37, 154, 234, 5, 37, 54, + 216, 249, 226, 201, 85, 218, 236, 37, 54, 215, 74, 226, 201, 85, 218, + 236, 37, 54, 216, 164, 226, 201, 85, 218, 236, 37, 54, 244, 24, 226, 201, + 85, 218, 236, 37, 54, 244, 123, 226, 201, 85, 218, 236, 37, 54, 219, 114, + 226, 201, 85, 218, 236, 37, 54, 220, 119, 226, 201, 85, 218, 236, 37, 54, + 245, 193, 226, 201, 85, 218, 236, 225, 255, 50, 37, 54, 215, 74, 111, 37, + 54, 215, 74, 105, 37, 54, 215, 74, 158, 37, 54, 215, 74, 161, 37, 54, + 215, 74, 190, 37, 54, 215, 74, 195, 37, 54, 215, 74, 199, 37, 54, 215, + 74, 196, 37, 54, 215, 74, 201, 37, 54, 216, 163, 37, 54, 216, 164, 111, + 37, 54, 216, 164, 105, 37, 54, 216, 164, 158, 37, 54, 216, 164, 161, 37, + 54, 216, 164, 190, 37, 24, 234, 64, 37, 24, 228, 231, 37, 24, 216, 102, + 37, 24, 223, 29, 37, 24, 230, 222, 37, 24, 225, 98, 37, 24, 219, 150, 37, + 24, 236, 63, 37, 24, 250, 54, 37, 24, 250, 114, 37, 24, 234, 116, 37, 24, + 216, 174, 37, 24, 225, 134, 37, 24, 241, 179, 37, 24, 234, 65, 61, 37, + 24, 228, 232, 61, 37, 24, 216, 103, 61, 37, 24, 223, 30, 61, 37, 24, 230, + 223, 61, 37, 24, 225, 99, 61, 37, 24, 219, 151, 61, 37, 24, 236, 64, 61, + 37, 24, 250, 55, 61, 37, 24, 250, 115, 61, 37, 24, 234, 117, 61, 37, 24, + 216, 175, 61, 37, 24, 225, 135, 61, 37, 24, 241, 180, 61, 37, 234, 9, + 135, 250, 156, 37, 234, 9, 135, 235, 53, 37, 24, 236, 64, 69, 234, 9, + 218, 161, 87, 37, 154, 111, 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, + 154, 190, 37, 154, 195, 37, 154, 199, 37, 154, 196, 37, 154, 201, 37, + 154, 216, 248, 37, 154, 230, 133, 37, 154, 244, 104, 37, 154, 212, 40, + 37, 154, 211, 214, 37, 154, 231, 44, 37, 154, 245, 231, 37, 154, 218, 38, + 37, 154, 218, 134, 37, 154, 241, 251, 37, 154, 219, 56, 37, 154, 229, + 209, 37, 154, 219, 6, 37, 154, 244, 110, 37, 154, 249, 208, 37, 154, 233, + 131, 37, 154, 221, 176, 37, 154, 231, 194, 37, 154, 244, 145, 37, 154, + 218, 50, 37, 154, 245, 42, 37, 154, 224, 190, 37, 154, 253, 204, 37, 154, + 235, 165, 37, 154, 223, 64, 37, 154, 249, 172, 37, 154, 249, 163, 37, + 154, 241, 172, 37, 154, 250, 182, 37, 154, 232, 116, 37, 154, 233, 52, + 37, 154, 222, 254, 37, 154, 231, 88, 37, 154, 223, 90, 37, 154, 218, 88, + 37, 154, 218, 21, 37, 154, 245, 135, 37, 154, 223, 66, 37, 154, 254, 159, + 37, 154, 228, 217, 37, 54, 216, 164, 195, 37, 54, 216, 164, 199, 37, 54, + 216, 164, 196, 37, 54, 216, 164, 201, 37, 54, 244, 23, 37, 54, 244, 24, + 111, 37, 54, 244, 24, 105, 37, 54, 244, 24, 158, 37, 54, 244, 24, 161, + 37, 54, 244, 24, 190, 37, 54, 244, 24, 195, 37, 54, 244, 24, 199, 37, 54, + 244, 24, 196, 37, 54, 244, 24, 201, 37, 54, 244, 122, 110, 217, 4, 16, + 31, 235, 139, 110, 217, 4, 16, 31, 244, 156, 110, 217, 4, 16, 31, 231, + 165, 110, 217, 4, 16, 31, 254, 55, 110, 217, 4, 16, 31, 231, 137, 110, + 217, 4, 16, 31, 235, 51, 110, 217, 4, 16, 31, 235, 52, 110, 217, 4, 16, + 31, 253, 196, 110, 217, 4, 16, 31, 220, 138, 110, 217, 4, 16, 31, 226, + 243, 110, 217, 4, 16, 31, 228, 45, 110, 217, 4, 16, 31, 248, 93, 42, 241, + 197, 42, 245, 96, 42, 245, 51, 232, 225, 232, 246, 50, 37, 56, 61, 37, + 56, 74, 37, 56, 69, 37, 56, 76, 37, 56, 78, 37, 56, 176, 37, 56, 234, 98, + 37, 56, 233, 223, 37, 56, 234, 188, 37, 56, 234, 34, 37, 56, 206, 37, 56, + 219, 193, 37, 56, 218, 84, 37, 56, 221, 183, 37, 56, 219, 60, 37, 56, + 217, 106, 37, 56, 216, 118, 37, 56, 215, 119, 37, 56, 217, 23, 37, 56, + 112, 37, 56, 198, 37, 56, 228, 238, 37, 56, 227, 242, 37, 56, 229, 112, + 37, 56, 228, 79, 37, 56, 162, 37, 56, 241, 187, 37, 56, 240, 229, 37, 56, + 241, 245, 37, 56, 241, 75, 37, 56, 186, 37, 56, 230, 235, 37, 56, 230, + 107, 37, 56, 231, 96, 37, 56, 230, 166, 37, 56, 192, 37, 56, 210, 212, + 37, 56, 210, 244, 37, 56, 205, 37, 56, 223, 38, 37, 56, 222, 142, 37, 56, + 223, 131, 37, 56, 222, 213, 37, 56, 212, 65, 37, 56, 211, 250, 37, 56, + 212, 22, 37, 56, 211, 227, 42, 254, 79, 42, 253, 247, 42, 254, 103, 42, + 255, 40, 42, 235, 233, 42, 235, 203, 42, 214, 166, 42, 245, 74, 42, 245, + 214, 42, 226, 190, 42, 226, 184, 42, 234, 251, 42, 234, 220, 42, 234, + 217, 42, 243, 99, 42, 243, 108, 42, 242, 211, 42, 242, 207, 42, 233, 156, + 42, 242, 200, 42, 234, 78, 42, 234, 77, 42, 234, 76, 42, 234, 75, 42, + 242, 93, 42, 242, 92, 42, 233, 199, 42, 233, 201, 42, 234, 184, 42, 234, + 7, 42, 234, 14, 42, 222, 18, 42, 221, 239, 42, 219, 131, 42, 220, 143, + 42, 220, 142, 42, 248, 226, 42, 248, 44, 42, 247, 129, 42, 216, 33, 42, + 229, 205, 42, 228, 46, 42, 242, 39, 42, 226, 88, 42, 226, 87, 42, 252, + 196, 42, 225, 108, 42, 225, 72, 42, 225, 73, 42, 251, 242, 42, 240, 228, + 42, 240, 224, 42, 251, 99, 42, 240, 211, 42, 241, 222, 42, 225, 162, 42, + 225, 197, 42, 241, 205, 42, 225, 194, 42, 225, 210, 42, 252, 69, 42, 225, + 9, 42, 251, 188, 42, 241, 63, 42, 224, 253, 42, 241, 55, 42, 241, 57, 42, + 231, 206, 42, 231, 202, 42, 231, 211, 42, 231, 155, 42, 231, 180, 42, + 230, 202, 42, 230, 181, 42, 230, 180, 42, 231, 79, 42, 231, 76, 42, 231, + 80, 42, 211, 102, 42, 211, 100, 42, 210, 201, 42, 222, 229, 42, 222, 233, + 42, 222, 119, 42, 222, 113, 42, 223, 88, 42, 223, 85, 42, 212, 38, 110, + 217, 4, 16, 31, 240, 246, 210, 86, 110, 217, 4, 16, 31, 240, 246, 111, + 110, 217, 4, 16, 31, 240, 246, 105, 110, 217, 4, 16, 31, 240, 246, 158, + 110, 217, 4, 16, 31, 240, 246, 161, 110, 217, 4, 16, 31, 240, 246, 190, + 110, 217, 4, 16, 31, 240, 246, 195, 110, 217, 4, 16, 31, 240, 246, 199, + 110, 217, 4, 16, 31, 240, 246, 196, 110, 217, 4, 16, 31, 240, 246, 201, + 110, 217, 4, 16, 31, 240, 246, 216, 248, 110, 217, 4, 16, 31, 240, 246, + 245, 175, 110, 217, 4, 16, 31, 240, 246, 215, 76, 110, 217, 4, 16, 31, + 240, 246, 216, 165, 110, 217, 4, 16, 31, 240, 246, 244, 13, 110, 217, 4, + 16, 31, 240, 246, 244, 126, 110, 217, 4, 16, 31, 240, 246, 219, 121, 110, + 217, 4, 16, 31, 240, 246, 220, 121, 110, 217, 4, 16, 31, 240, 246, 245, + 198, 110, 217, 4, 16, 31, 240, 246, 228, 202, 110, 217, 4, 16, 31, 240, + 246, 215, 73, 110, 217, 4, 16, 31, 240, 246, 215, 67, 110, 217, 4, 16, + 31, 240, 246, 215, 63, 110, 217, 4, 16, 31, 240, 246, 215, 64, 110, 217, + 4, 16, 31, 240, 246, 215, 69, 42, 240, 237, 42, 248, 229, 42, 253, 200, + 42, 130, 42, 226, 129, 42, 225, 229, 42, 247, 155, 42, 247, 156, 218, + 235, 42, 247, 156, 249, 116, 42, 235, 162, 42, 245, 99, 229, 210, 241, + 223, 42, 245, 99, 229, 210, 217, 175, 42, 245, 99, 229, 210, 217, 75, 42, + 245, 99, 229, 210, 231, 75, 42, 249, 165, 42, 226, 94, 254, 133, 42, 198, + 42, 230, 108, 61, 42, 186, 42, 176, 42, 234, 191, 42, 231, 134, 42, 243, + 87, 42, 251, 26, 42, 234, 190, 42, 225, 153, 42, 229, 86, 42, 230, 108, + 245, 14, 42, 230, 108, 243, 209, 42, 231, 20, 42, 234, 140, 42, 240, 170, + 42, 234, 100, 42, 230, 237, 42, 242, 223, 42, 216, 120, 42, 230, 108, + 156, 42, 230, 174, 42, 247, 165, 42, 234, 46, 42, 244, 53, 42, 228, 117, + 42, 230, 108, 194, 42, 230, 171, 42, 249, 247, 42, 234, 40, 42, 230, 172, + 218, 235, 42, 249, 248, 218, 235, 42, 232, 55, 218, 235, 42, 234, 41, + 218, 235, 42, 230, 172, 249, 116, 42, 249, 248, 249, 116, 42, 232, 55, + 249, 116, 42, 234, 41, 249, 116, 42, 232, 55, 115, 222, 93, 42, 232, 55, + 115, 222, 94, 218, 235, 42, 191, 42, 234, 1, 42, 230, 110, 42, 242, 158, + 42, 223, 179, 42, 223, 180, 115, 222, 93, 42, 223, 180, 115, 222, 94, + 218, 235, 42, 224, 165, 42, 228, 18, 42, 230, 108, 222, 93, 42, 230, 109, + 42, 224, 119, 42, 227, 180, 42, 230, 108, 214, 105, 42, 230, 54, 42, 233, + 191, 42, 230, 55, 231, 79, 42, 224, 118, 42, 227, 179, 42, 230, 108, 212, + 98, 42, 230, 48, 42, 233, 189, 42, 230, 49, 231, 79, 42, 235, 30, 226, + 224, 42, 232, 55, 226, 224, 42, 254, 144, 42, 251, 168, 42, 250, 222, 42, + 250, 199, 42, 251, 75, 115, 234, 140, 42, 249, 246, 42, 248, 150, 42, + 242, 79, 42, 162, 42, 240, 238, 42, 236, 6, 42, 234, 53, 42, 234, 41, + 251, 2, 42, 233, 225, 42, 232, 165, 42, 232, 164, 42, 232, 153, 42, 232, + 68, 42, 231, 135, 219, 81, 42, 230, 201, 42, 230, 157, 42, 225, 151, 42, + 225, 22, 42, 224, 222, 42, 224, 220, 42, 218, 229, 42, 218, 3, 42, 212, + 24, 42, 214, 106, 115, 194, 42, 116, 115, 194, 110, 217, 4, 16, 31, 248, + 154, 111, 110, 217, 4, 16, 31, 248, 154, 105, 110, 217, 4, 16, 31, 248, + 154, 158, 110, 217, 4, 16, 31, 248, 154, 161, 110, 217, 4, 16, 31, 248, + 154, 190, 110, 217, 4, 16, 31, 248, 154, 195, 110, 217, 4, 16, 31, 248, + 154, 199, 110, 217, 4, 16, 31, 248, 154, 196, 110, 217, 4, 16, 31, 248, + 154, 201, 110, 217, 4, 16, 31, 248, 154, 216, 248, 110, 217, 4, 16, 31, + 248, 154, 245, 175, 110, 217, 4, 16, 31, 248, 154, 215, 76, 110, 217, 4, + 16, 31, 248, 154, 216, 165, 110, 217, 4, 16, 31, 248, 154, 244, 13, 110, + 217, 4, 16, 31, 248, 154, 244, 126, 110, 217, 4, 16, 31, 248, 154, 219, + 121, 110, 217, 4, 16, 31, 248, 154, 220, 121, 110, 217, 4, 16, 31, 248, + 154, 245, 198, 110, 217, 4, 16, 31, 248, 154, 228, 202, 110, 217, 4, 16, + 31, 248, 154, 215, 73, 110, 217, 4, 16, 31, 248, 154, 215, 67, 110, 217, + 4, 16, 31, 248, 154, 215, 63, 110, 217, 4, 16, 31, 248, 154, 215, 64, + 110, 217, 4, 16, 31, 248, 154, 215, 69, 110, 217, 4, 16, 31, 248, 154, + 215, 70, 110, 217, 4, 16, 31, 248, 154, 215, 65, 110, 217, 4, 16, 31, + 248, 154, 215, 66, 110, 217, 4, 16, 31, 248, 154, 215, 72, 110, 217, 4, + 16, 31, 248, 154, 215, 68, 110, 217, 4, 16, 31, 248, 154, 216, 163, 110, + 217, 4, 16, 31, 248, 154, 216, 162, 42, 243, 125, 241, 199, 31, 216, 197, + 249, 148, 241, 230, 241, 199, 31, 216, 197, 223, 125, 245, 231, 241, 199, + 31, 247, 239, 253, 215, 216, 197, 252, 64, 241, 199, 31, 210, 223, 244, + 46, 241, 199, 31, 212, 59, 241, 199, 31, 249, 211, 241, 199, 31, 216, + 197, 254, 11, 241, 199, 31, 241, 67, 216, 39, 241, 199, 31, 4, 217, 62, + 241, 199, 31, 215, 238, 241, 199, 31, 225, 222, 241, 199, 31, 218, 160, + 241, 199, 31, 244, 147, 241, 199, 31, 242, 139, 224, 243, 241, 199, 31, + 230, 160, 241, 199, 31, 245, 134, 241, 199, 31, 244, 47, 241, 199, 31, + 211, 207, 226, 201, 216, 197, 248, 94, 241, 199, 31, 254, 59, 241, 199, + 31, 249, 193, 241, 199, 31, 251, 235, 216, 139, 241, 199, 31, 242, 156, + 241, 199, 31, 218, 247, 254, 78, 241, 199, 31, 223, 56, 241, 199, 31, + 235, 227, 241, 199, 31, 242, 139, 217, 62, 241, 199, 31, 230, 116, 249, + 167, 241, 199, 31, 242, 139, 224, 200, 241, 199, 31, 216, 197, 255, 27, + 212, 40, 241, 199, 31, 216, 197, 250, 16, 244, 104, 241, 199, 31, 235, + 240, 241, 199, 31, 246, 65, 241, 199, 31, 223, 59, 241, 199, 31, 242, + 139, 224, 227, 241, 199, 31, 224, 180, 241, 199, 31, 248, 169, 64, 216, + 197, 232, 236, 241, 199, 31, 216, 197, 244, 182, 241, 199, 31, 226, 167, + 241, 199, 31, 226, 248, 241, 199, 31, 248, 67, 241, 199, 31, 248, 87, + 241, 199, 31, 235, 254, 241, 199, 31, 251, 157, 241, 199, 31, 249, 229, + 216, 43, 231, 81, 241, 199, 31, 243, 94, 216, 39, 241, 199, 31, 224, 128, + 214, 154, 241, 199, 31, 226, 166, 241, 199, 31, 216, 197, 212, 13, 241, + 199, 31, 223, 48, 241, 199, 31, 216, 197, 250, 228, 241, 199, 31, 216, + 197, 254, 7, 216, 134, 241, 199, 31, 216, 197, 234, 185, 218, 136, 230, + 120, 241, 199, 31, 248, 40, 241, 199, 31, 216, 197, 231, 157, 231, 207, + 241, 199, 31, 255, 28, 241, 199, 31, 216, 197, 212, 54, 241, 199, 31, + 216, 197, 243, 54, 211, 239, 241, 199, 31, 216, 197, 235, 58, 233, 113, + 241, 199, 31, 247, 192, 241, 199, 31, 232, 226, 241, 199, 31, 235, 230, + 215, 188, 241, 199, 31, 4, 224, 200, 241, 199, 31, 254, 226, 249, 220, + 241, 199, 31, 252, 67, 249, 220, 8, 3, 235, 166, 8, 3, 235, 159, 8, 3, + 74, 8, 3, 235, 189, 8, 3, 236, 65, 8, 3, 236, 48, 8, 3, 236, 67, 8, 3, + 236, 66, 8, 3, 253, 214, 8, 3, 253, 177, 8, 3, 61, 8, 3, 254, 80, 8, 3, + 214, 164, 8, 3, 214, 167, 8, 3, 214, 165, 8, 3, 226, 144, 8, 3, 226, 118, + 8, 3, 78, 8, 3, 226, 179, 8, 3, 245, 43, 8, 3, 76, 8, 3, 211, 195, 8, 3, + 251, 236, 8, 3, 251, 233, 8, 3, 252, 14, 8, 3, 251, 246, 8, 3, 252, 3, 8, + 3, 252, 2, 8, 3, 252, 5, 8, 3, 252, 4, 8, 3, 252, 129, 8, 3, 252, 121, 8, + 3, 252, 199, 8, 3, 252, 150, 8, 3, 251, 109, 8, 3, 251, 113, 8, 3, 251, + 110, 8, 3, 251, 187, 8, 3, 251, 171, 8, 3, 251, 213, 8, 3, 251, 193, 8, + 3, 252, 29, 8, 3, 252, 83, 8, 3, 252, 41, 8, 3, 251, 95, 8, 3, 251, 92, + 8, 3, 251, 133, 8, 3, 251, 108, 8, 3, 251, 102, 8, 3, 251, 106, 8, 3, + 251, 80, 8, 3, 251, 78, 8, 3, 251, 85, 8, 3, 251, 83, 8, 3, 251, 81, 8, + 3, 251, 82, 8, 3, 225, 52, 8, 3, 225, 48, 8, 3, 225, 111, 8, 3, 225, 62, + 8, 3, 225, 78, 8, 3, 225, 105, 8, 3, 225, 101, 8, 3, 225, 244, 8, 3, 225, + 234, 8, 3, 191, 8, 3, 226, 25, 8, 3, 224, 138, 8, 3, 224, 140, 8, 3, 224, + 139, 8, 3, 224, 236, 8, 3, 224, 225, 8, 3, 225, 19, 8, 3, 224, 248, 8, 3, + 224, 124, 8, 3, 224, 120, 8, 3, 224, 153, 8, 3, 224, 137, 8, 3, 224, 129, + 8, 3, 224, 135, 8, 3, 224, 103, 8, 3, 224, 102, 8, 3, 224, 107, 8, 3, + 224, 106, 8, 3, 224, 104, 8, 3, 224, 105, 8, 3, 252, 104, 8, 3, 252, 103, + 8, 3, 252, 110, 8, 3, 252, 105, 8, 3, 252, 107, 8, 3, 252, 106, 8, 3, + 252, 109, 8, 3, 252, 108, 8, 3, 252, 116, 8, 3, 252, 115, 8, 3, 252, 119, + 8, 3, 252, 117, 8, 3, 252, 95, 8, 3, 252, 97, 8, 3, 252, 96, 8, 3, 252, + 100, 8, 3, 252, 99, 8, 3, 252, 102, 8, 3, 252, 101, 8, 3, 252, 111, 8, 3, + 252, 114, 8, 3, 252, 112, 8, 3, 252, 91, 8, 3, 252, 90, 8, 3, 252, 98, 8, + 3, 252, 94, 8, 3, 252, 92, 8, 3, 252, 93, 8, 3, 252, 87, 8, 3, 252, 86, + 8, 3, 252, 89, 8, 3, 252, 88, 8, 3, 229, 174, 8, 3, 229, 173, 8, 3, 229, + 179, 8, 3, 229, 175, 8, 3, 229, 176, 8, 3, 229, 178, 8, 3, 229, 177, 8, + 3, 229, 182, 8, 3, 229, 181, 8, 3, 229, 184, 8, 3, 229, 183, 8, 3, 229, + 170, 8, 3, 229, 169, 8, 3, 229, 172, 8, 3, 229, 171, 8, 3, 229, 163, 8, + 3, 229, 162, 8, 3, 229, 167, 8, 3, 229, 166, 8, 3, 229, 164, 8, 3, 229, + 165, 8, 3, 229, 157, 8, 3, 229, 156, 8, 3, 229, 161, 8, 3, 229, 160, 8, + 3, 229, 158, 8, 3, 229, 159, 8, 3, 241, 117, 8, 3, 241, 116, 8, 3, 241, + 122, 8, 3, 241, 118, 8, 3, 241, 119, 8, 3, 241, 121, 8, 3, 241, 120, 8, + 3, 241, 125, 8, 3, 241, 124, 8, 3, 241, 127, 8, 3, 241, 126, 8, 3, 241, + 108, 8, 3, 241, 110, 8, 3, 241, 109, 8, 3, 241, 113, 8, 3, 241, 112, 8, + 3, 241, 115, 8, 3, 241, 114, 8, 3, 241, 104, 8, 3, 241, 103, 8, 3, 241, + 111, 8, 3, 241, 107, 8, 3, 241, 105, 8, 3, 241, 106, 8, 3, 241, 98, 8, 3, + 241, 102, 8, 3, 241, 101, 8, 3, 241, 99, 8, 3, 241, 100, 8, 3, 230, 177, + 8, 3, 230, 176, 8, 3, 230, 235, 8, 3, 230, 183, 8, 3, 230, 208, 8, 3, + 230, 226, 8, 3, 230, 224, 8, 3, 231, 144, 8, 3, 231, 139, 8, 3, 186, 8, + 3, 231, 177, 8, 3, 230, 79, 8, 3, 230, 78, 8, 3, 230, 82, 8, 3, 230, 80, + 8, 3, 230, 126, 8, 3, 230, 112, 8, 3, 230, 166, 8, 3, 230, 131, 8, 3, + 231, 31, 8, 3, 231, 96, 8, 3, 230, 60, 8, 3, 230, 56, 8, 3, 230, 107, 8, + 3, 230, 75, 8, 3, 230, 68, 8, 3, 230, 73, 8, 3, 230, 33, 8, 3, 230, 32, + 8, 3, 230, 38, 8, 3, 230, 35, 8, 3, 244, 91, 8, 3, 244, 86, 8, 3, 244, + 129, 8, 3, 244, 106, 8, 3, 244, 175, 8, 3, 244, 166, 8, 3, 244, 204, 8, + 3, 244, 178, 8, 3, 244, 11, 8, 3, 244, 51, 8, 3, 244, 35, 8, 3, 243, 225, + 8, 3, 243, 224, 8, 3, 243, 241, 8, 3, 243, 230, 8, 3, 243, 228, 8, 3, + 243, 229, 8, 3, 243, 212, 8, 3, 243, 211, 8, 3, 243, 215, 8, 3, 243, 213, + 8, 3, 213, 144, 8, 3, 213, 139, 8, 3, 213, 176, 8, 3, 213, 153, 8, 3, + 213, 166, 8, 3, 213, 163, 8, 3, 213, 168, 8, 3, 213, 167, 8, 3, 214, 7, + 8, 3, 214, 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3, 213, 125, 8, 3, 213, + 121, 8, 3, 213, 138, 8, 3, 213, 126, 8, 3, 213, 178, 8, 3, 213, 244, 8, + 3, 212, 110, 8, 3, 212, 108, 8, 3, 212, 116, 8, 3, 212, 113, 8, 3, 212, + 111, 8, 3, 212, 112, 8, 3, 212, 102, 8, 3, 212, 101, 8, 3, 212, 106, 8, + 3, 212, 105, 8, 3, 212, 103, 8, 3, 212, 104, 8, 3, 247, 186, 8, 3, 247, + 174, 8, 3, 248, 11, 8, 3, 247, 211, 8, 3, 247, 244, 8, 3, 247, 248, 8, 3, + 247, 247, 8, 3, 248, 160, 8, 3, 248, 155, 8, 3, 248, 229, 8, 3, 248, 180, + 8, 3, 246, 70, 8, 3, 246, 71, 8, 3, 247, 128, 8, 3, 246, 110, 8, 3, 247, + 153, 8, 3, 247, 130, 8, 3, 248, 38, 8, 3, 248, 98, 8, 3, 248, 53, 8, 3, + 246, 61, 8, 3, 246, 59, 8, 3, 246, 86, 8, 3, 246, 69, 8, 3, 246, 64, 8, + 3, 246, 67, 8, 3, 216, 68, 8, 3, 216, 62, 8, 3, 216, 118, 8, 3, 216, 77, + 8, 3, 216, 110, 8, 3, 216, 112, 8, 3, 216, 111, 8, 3, 217, 47, 8, 3, 217, 34, 8, 3, 217, 106, 8, 3, 217, 55, 8, 3, 215, 103, 8, 3, 215, 102, 8, 3, - 215, 105, 8, 3, 215, 104, 8, 3, 216, 6, 8, 3, 216, 2, 8, 3, 111, 8, 3, + 215, 105, 8, 3, 215, 104, 8, 3, 216, 6, 8, 3, 216, 2, 8, 3, 112, 8, 3, 216, 14, 8, 3, 216, 214, 8, 3, 217, 23, 8, 3, 216, 238, 8, 3, 215, 88, 8, 3, 215, 83, 8, 3, 215, 119, 8, 3, 215, 101, 8, 3, 215, 89, 8, 3, 215, 99, - 8, 3, 248, 108, 8, 3, 248, 107, 8, 3, 248, 113, 8, 3, 248, 109, 8, 3, - 248, 110, 8, 3, 248, 112, 8, 3, 248, 111, 8, 3, 248, 129, 8, 3, 248, 128, - 8, 3, 248, 136, 8, 3, 248, 130, 8, 3, 248, 98, 8, 3, 248, 100, 8, 3, 248, - 99, 8, 3, 248, 103, 8, 3, 248, 102, 8, 3, 248, 106, 8, 3, 248, 104, 8, 3, - 248, 121, 8, 3, 248, 124, 8, 3, 248, 122, 8, 3, 248, 94, 8, 3, 248, 93, - 8, 3, 248, 101, 8, 3, 248, 97, 8, 3, 248, 95, 8, 3, 248, 96, 8, 3, 229, - 127, 8, 3, 229, 126, 8, 3, 229, 134, 8, 3, 229, 129, 8, 3, 229, 130, 8, - 3, 229, 131, 8, 3, 229, 143, 8, 3, 229, 142, 8, 3, 229, 149, 8, 3, 229, - 144, 8, 3, 229, 119, 8, 3, 229, 118, 8, 3, 229, 125, 8, 3, 229, 120, 8, - 3, 229, 135, 8, 3, 229, 141, 8, 3, 229, 139, 8, 3, 229, 111, 8, 3, 229, - 110, 8, 3, 229, 116, 8, 3, 229, 114, 8, 3, 229, 112, 8, 3, 229, 113, 8, - 3, 241, 78, 8, 3, 241, 77, 8, 3, 241, 84, 8, 3, 241, 79, 8, 3, 241, 81, - 8, 3, 241, 80, 8, 3, 241, 83, 8, 3, 241, 82, 8, 3, 241, 89, 8, 3, 241, - 88, 8, 3, 241, 91, 8, 3, 241, 90, 8, 3, 241, 72, 8, 3, 241, 73, 8, 3, - 241, 75, 8, 3, 241, 74, 8, 3, 241, 76, 8, 3, 241, 85, 8, 3, 241, 87, 8, - 3, 241, 86, 8, 3, 241, 71, 8, 3, 228, 190, 8, 3, 228, 188, 8, 3, 228, - 234, 8, 3, 228, 193, 8, 3, 228, 216, 8, 3, 228, 230, 8, 3, 228, 229, 8, - 3, 229, 184, 8, 3, 197, 8, 3, 229, 198, 8, 3, 227, 187, 8, 3, 227, 189, - 8, 3, 227, 188, 8, 3, 228, 52, 8, 3, 228, 39, 8, 3, 228, 75, 8, 3, 228, - 61, 8, 3, 229, 84, 8, 3, 229, 108, 8, 3, 229, 95, 8, 3, 227, 182, 8, 3, - 227, 178, 8, 3, 227, 238, 8, 3, 227, 186, 8, 3, 227, 184, 8, 3, 227, 185, - 8, 3, 241, 142, 8, 3, 241, 141, 8, 3, 241, 147, 8, 3, 241, 143, 8, 3, - 241, 144, 8, 3, 241, 146, 8, 3, 241, 145, 8, 3, 241, 152, 8, 3, 241, 151, - 8, 3, 241, 154, 8, 3, 241, 153, 8, 3, 241, 134, 8, 3, 241, 136, 8, 3, - 241, 135, 8, 3, 241, 138, 8, 3, 241, 140, 8, 3, 241, 139, 8, 3, 241, 148, - 8, 3, 241, 150, 8, 3, 241, 149, 8, 3, 241, 130, 8, 3, 241, 129, 8, 3, - 241, 137, 8, 3, 241, 133, 8, 3, 241, 131, 8, 3, 241, 132, 8, 3, 241, 124, - 8, 3, 241, 123, 8, 3, 241, 128, 8, 3, 241, 127, 8, 3, 241, 125, 8, 3, - 241, 126, 8, 3, 232, 196, 8, 3, 232, 190, 8, 3, 232, 242, 8, 3, 232, 203, - 8, 3, 232, 234, 8, 3, 232, 233, 8, 3, 232, 237, 8, 3, 232, 235, 8, 3, - 233, 80, 8, 3, 233, 70, 8, 3, 233, 136, 8, 3, 233, 89, 8, 3, 232, 80, 8, - 3, 232, 79, 8, 3, 232, 82, 8, 3, 232, 81, 8, 3, 232, 117, 8, 3, 232, 107, - 8, 3, 232, 157, 8, 3, 232, 121, 8, 3, 233, 3, 8, 3, 233, 59, 8, 3, 233, - 18, 8, 3, 232, 75, 8, 3, 232, 73, 8, 3, 232, 99, 8, 3, 232, 78, 8, 3, - 232, 76, 8, 3, 232, 77, 8, 3, 232, 55, 8, 3, 232, 54, 8, 3, 232, 63, 8, - 3, 232, 58, 8, 3, 232, 56, 8, 3, 232, 57, 8, 3, 242, 190, 8, 3, 242, 189, - 8, 3, 242, 215, 8, 3, 242, 200, 8, 3, 242, 207, 8, 3, 242, 206, 8, 3, - 242, 209, 8, 3, 242, 208, 8, 3, 243, 90, 8, 3, 243, 85, 8, 3, 243, 136, - 8, 3, 243, 100, 8, 3, 242, 92, 8, 3, 242, 91, 8, 3, 242, 94, 8, 3, 242, - 93, 8, 3, 242, 155, 8, 3, 242, 153, 8, 3, 242, 175, 8, 3, 242, 163, 8, 3, - 243, 34, 8, 3, 243, 32, 8, 3, 243, 63, 8, 3, 243, 45, 8, 3, 242, 82, 8, - 3, 242, 81, 8, 3, 242, 114, 8, 3, 242, 90, 8, 3, 242, 83, 8, 3, 242, 89, - 8, 3, 234, 62, 8, 3, 234, 61, 8, 3, 234, 93, 8, 3, 234, 76, 8, 3, 234, - 86, 8, 3, 234, 89, 8, 3, 234, 87, 8, 3, 234, 203, 8, 3, 234, 191, 8, 3, - 176, 8, 3, 234, 229, 8, 3, 233, 201, 8, 3, 233, 206, 8, 3, 233, 203, 8, - 3, 234, 1, 8, 3, 233, 253, 8, 3, 234, 29, 8, 3, 234, 8, 8, 3, 234, 157, - 8, 3, 234, 141, 8, 3, 234, 183, 8, 3, 234, 160, 8, 3, 233, 190, 8, 3, - 233, 187, 8, 3, 233, 218, 8, 3, 233, 200, 8, 3, 233, 193, 8, 3, 233, 197, - 8, 3, 243, 16, 8, 3, 243, 15, 8, 3, 243, 20, 8, 3, 243, 17, 8, 3, 243, - 19, 8, 3, 243, 18, 8, 3, 243, 27, 8, 3, 243, 26, 8, 3, 243, 30, 8, 3, - 243, 28, 8, 3, 243, 7, 8, 3, 243, 6, 8, 3, 243, 9, 8, 3, 243, 8, 8, 3, - 243, 12, 8, 3, 243, 11, 8, 3, 243, 14, 8, 3, 243, 13, 8, 3, 243, 22, 8, - 3, 243, 21, 8, 3, 243, 25, 8, 3, 243, 23, 8, 3, 243, 2, 8, 3, 243, 1, 8, - 3, 243, 10, 8, 3, 243, 5, 8, 3, 243, 3, 8, 3, 243, 4, 8, 3, 230, 250, 8, - 3, 230, 251, 8, 3, 231, 13, 8, 3, 231, 12, 8, 3, 231, 15, 8, 3, 231, 14, - 8, 3, 230, 241, 8, 3, 230, 243, 8, 3, 230, 242, 8, 3, 230, 246, 8, 3, - 230, 245, 8, 3, 230, 248, 8, 3, 230, 247, 8, 3, 230, 252, 8, 3, 230, 254, - 8, 3, 230, 253, 8, 3, 230, 237, 8, 3, 230, 236, 8, 3, 230, 244, 8, 3, - 230, 240, 8, 3, 230, 238, 8, 3, 230, 239, 8, 3, 240, 181, 8, 3, 240, 180, - 8, 3, 240, 187, 8, 3, 240, 182, 8, 3, 240, 184, 8, 3, 240, 183, 8, 3, - 240, 186, 8, 3, 240, 185, 8, 3, 240, 192, 8, 3, 240, 191, 8, 3, 240, 194, - 8, 3, 240, 193, 8, 3, 240, 173, 8, 3, 240, 172, 8, 3, 240, 175, 8, 3, - 240, 174, 8, 3, 240, 177, 8, 3, 240, 176, 8, 3, 240, 179, 8, 3, 240, 178, - 8, 3, 240, 188, 8, 3, 240, 190, 8, 3, 240, 189, 8, 3, 229, 25, 8, 3, 229, - 27, 8, 3, 229, 26, 8, 3, 229, 68, 8, 3, 229, 66, 8, 3, 229, 78, 8, 3, - 229, 71, 8, 3, 228, 244, 8, 3, 228, 243, 8, 3, 228, 245, 8, 3, 228, 253, - 8, 3, 228, 250, 8, 3, 229, 5, 8, 3, 228, 255, 8, 3, 229, 59, 8, 3, 229, - 65, 8, 3, 229, 61, 8, 3, 241, 157, 8, 3, 241, 167, 8, 3, 241, 176, 8, 3, - 241, 252, 8, 3, 241, 244, 8, 3, 162, 8, 3, 242, 7, 8, 3, 240, 207, 8, 3, - 240, 206, 8, 3, 240, 209, 8, 3, 240, 208, 8, 3, 240, 243, 8, 3, 240, 234, - 8, 3, 241, 69, 8, 3, 241, 48, 8, 3, 241, 195, 8, 3, 241, 239, 8, 3, 241, - 207, 8, 3, 212, 43, 8, 3, 212, 28, 8, 3, 212, 65, 8, 3, 212, 51, 8, 3, - 211, 185, 8, 3, 211, 187, 8, 3, 211, 186, 8, 3, 211, 203, 8, 3, 211, 227, - 8, 3, 211, 210, 8, 3, 212, 5, 8, 3, 212, 22, 8, 3, 212, 10, 8, 3, 210, - 30, 8, 3, 210, 29, 8, 3, 210, 44, 8, 3, 210, 32, 8, 3, 210, 37, 8, 3, - 210, 39, 8, 3, 210, 38, 8, 3, 210, 102, 8, 3, 210, 99, 8, 3, 210, 116, 8, - 3, 210, 105, 8, 3, 210, 6, 8, 3, 210, 8, 8, 3, 210, 7, 8, 3, 210, 19, 8, - 3, 210, 18, 8, 3, 210, 23, 8, 3, 210, 20, 8, 3, 210, 84, 8, 3, 210, 94, - 8, 3, 210, 88, 8, 3, 210, 2, 8, 3, 210, 1, 8, 3, 210, 13, 8, 3, 210, 5, - 8, 3, 210, 3, 8, 3, 210, 4, 8, 3, 209, 245, 8, 3, 209, 244, 8, 3, 209, - 250, 8, 3, 209, 248, 8, 3, 209, 246, 8, 3, 209, 247, 8, 3, 250, 29, 8, 3, - 250, 25, 8, 3, 250, 52, 8, 3, 250, 38, 8, 3, 250, 49, 8, 3, 250, 43, 8, - 3, 250, 51, 8, 3, 250, 50, 8, 3, 250, 225, 8, 3, 250, 218, 8, 3, 251, 34, - 8, 3, 250, 252, 8, 3, 249, 105, 8, 3, 249, 107, 8, 3, 249, 106, 8, 3, - 249, 154, 8, 3, 249, 145, 8, 3, 249, 239, 8, 3, 249, 170, 8, 3, 250, 161, - 8, 3, 250, 191, 8, 3, 250, 166, 8, 3, 249, 85, 8, 3, 249, 83, 8, 3, 249, - 113, 8, 3, 249, 103, 8, 3, 249, 90, 8, 3, 249, 102, 8, 3, 249, 64, 8, 3, - 249, 63, 8, 3, 249, 74, 8, 3, 249, 70, 8, 3, 249, 65, 8, 3, 249, 67, 8, + 8, 3, 248, 115, 8, 3, 248, 114, 8, 3, 248, 120, 8, 3, 248, 116, 8, 3, + 248, 117, 8, 3, 248, 119, 8, 3, 248, 118, 8, 3, 248, 136, 8, 3, 248, 135, + 8, 3, 248, 143, 8, 3, 248, 137, 8, 3, 248, 105, 8, 3, 248, 107, 8, 3, + 248, 106, 8, 3, 248, 110, 8, 3, 248, 109, 8, 3, 248, 113, 8, 3, 248, 111, + 8, 3, 248, 128, 8, 3, 248, 131, 8, 3, 248, 129, 8, 3, 248, 101, 8, 3, + 248, 100, 8, 3, 248, 108, 8, 3, 248, 104, 8, 3, 248, 102, 8, 3, 248, 103, + 8, 3, 229, 131, 8, 3, 229, 130, 8, 3, 229, 138, 8, 3, 229, 133, 8, 3, + 229, 134, 8, 3, 229, 135, 8, 3, 229, 147, 8, 3, 229, 146, 8, 3, 229, 153, + 8, 3, 229, 148, 8, 3, 229, 123, 8, 3, 229, 122, 8, 3, 229, 129, 8, 3, + 229, 124, 8, 3, 229, 139, 8, 3, 229, 145, 8, 3, 229, 143, 8, 3, 229, 115, + 8, 3, 229, 114, 8, 3, 229, 120, 8, 3, 229, 118, 8, 3, 229, 116, 8, 3, + 229, 117, 8, 3, 241, 84, 8, 3, 241, 83, 8, 3, 241, 90, 8, 3, 241, 85, 8, + 3, 241, 87, 8, 3, 241, 86, 8, 3, 241, 89, 8, 3, 241, 88, 8, 3, 241, 95, + 8, 3, 241, 94, 8, 3, 241, 97, 8, 3, 241, 96, 8, 3, 241, 78, 8, 3, 241, + 79, 8, 3, 241, 81, 8, 3, 241, 80, 8, 3, 241, 82, 8, 3, 241, 91, 8, 3, + 241, 93, 8, 3, 241, 92, 8, 3, 241, 77, 8, 3, 228, 194, 8, 3, 228, 192, 8, + 3, 228, 238, 8, 3, 228, 197, 8, 3, 228, 220, 8, 3, 228, 234, 8, 3, 228, + 233, 8, 3, 229, 188, 8, 3, 198, 8, 3, 229, 202, 8, 3, 227, 190, 8, 3, + 227, 192, 8, 3, 227, 191, 8, 3, 228, 56, 8, 3, 228, 43, 8, 3, 228, 79, 8, + 3, 228, 65, 8, 3, 229, 88, 8, 3, 229, 112, 8, 3, 229, 99, 8, 3, 227, 185, + 8, 3, 227, 181, 8, 3, 227, 242, 8, 3, 227, 189, 8, 3, 227, 187, 8, 3, + 227, 188, 8, 3, 241, 148, 8, 3, 241, 147, 8, 3, 241, 153, 8, 3, 241, 149, + 8, 3, 241, 150, 8, 3, 241, 152, 8, 3, 241, 151, 8, 3, 241, 158, 8, 3, + 241, 157, 8, 3, 241, 160, 8, 3, 241, 159, 8, 3, 241, 140, 8, 3, 241, 142, + 8, 3, 241, 141, 8, 3, 241, 144, 8, 3, 241, 146, 8, 3, 241, 145, 8, 3, + 241, 154, 8, 3, 241, 156, 8, 3, 241, 155, 8, 3, 241, 136, 8, 3, 241, 135, + 8, 3, 241, 143, 8, 3, 241, 139, 8, 3, 241, 137, 8, 3, 241, 138, 8, 3, + 241, 130, 8, 3, 241, 129, 8, 3, 241, 134, 8, 3, 241, 133, 8, 3, 241, 131, + 8, 3, 241, 132, 8, 3, 232, 201, 8, 3, 232, 195, 8, 3, 232, 247, 8, 3, + 232, 208, 8, 3, 232, 239, 8, 3, 232, 238, 8, 3, 232, 242, 8, 3, 232, 240, + 8, 3, 233, 85, 8, 3, 233, 75, 8, 3, 233, 141, 8, 3, 233, 94, 8, 3, 232, + 84, 8, 3, 232, 83, 8, 3, 232, 86, 8, 3, 232, 85, 8, 3, 232, 122, 8, 3, + 232, 112, 8, 3, 232, 162, 8, 3, 232, 126, 8, 3, 233, 8, 8, 3, 233, 64, 8, + 3, 233, 23, 8, 3, 232, 79, 8, 3, 232, 77, 8, 3, 232, 103, 8, 3, 232, 82, + 8, 3, 232, 80, 8, 3, 232, 81, 8, 3, 232, 59, 8, 3, 232, 58, 8, 3, 232, + 67, 8, 3, 232, 62, 8, 3, 232, 60, 8, 3, 232, 61, 8, 3, 242, 196, 8, 3, + 242, 195, 8, 3, 242, 221, 8, 3, 242, 206, 8, 3, 242, 213, 8, 3, 242, 212, + 8, 3, 242, 215, 8, 3, 242, 214, 8, 3, 243, 96, 8, 3, 243, 91, 8, 3, 243, + 142, 8, 3, 243, 106, 8, 3, 242, 98, 8, 3, 242, 97, 8, 3, 242, 100, 8, 3, + 242, 99, 8, 3, 242, 161, 8, 3, 242, 159, 8, 3, 242, 181, 8, 3, 242, 169, + 8, 3, 243, 40, 8, 3, 243, 38, 8, 3, 243, 69, 8, 3, 243, 51, 8, 3, 242, + 88, 8, 3, 242, 87, 8, 3, 242, 120, 8, 3, 242, 96, 8, 3, 242, 89, 8, 3, + 242, 95, 8, 3, 234, 67, 8, 3, 234, 66, 8, 3, 234, 98, 8, 3, 234, 81, 8, + 3, 234, 91, 8, 3, 234, 94, 8, 3, 234, 92, 8, 3, 234, 208, 8, 3, 234, 196, + 8, 3, 176, 8, 3, 234, 234, 8, 3, 233, 206, 8, 3, 233, 211, 8, 3, 233, + 208, 8, 3, 234, 6, 8, 3, 234, 2, 8, 3, 234, 34, 8, 3, 234, 13, 8, 3, 234, + 162, 8, 3, 234, 146, 8, 3, 234, 188, 8, 3, 234, 165, 8, 3, 233, 195, 8, + 3, 233, 192, 8, 3, 233, 223, 8, 3, 233, 205, 8, 3, 233, 198, 8, 3, 233, + 202, 8, 3, 243, 22, 8, 3, 243, 21, 8, 3, 243, 26, 8, 3, 243, 23, 8, 3, + 243, 25, 8, 3, 243, 24, 8, 3, 243, 33, 8, 3, 243, 32, 8, 3, 243, 36, 8, + 3, 243, 34, 8, 3, 243, 13, 8, 3, 243, 12, 8, 3, 243, 15, 8, 3, 243, 14, + 8, 3, 243, 18, 8, 3, 243, 17, 8, 3, 243, 20, 8, 3, 243, 19, 8, 3, 243, + 28, 8, 3, 243, 27, 8, 3, 243, 31, 8, 3, 243, 29, 8, 3, 243, 8, 8, 3, 243, + 7, 8, 3, 243, 16, 8, 3, 243, 11, 8, 3, 243, 9, 8, 3, 243, 10, 8, 3, 230, + 254, 8, 3, 230, 255, 8, 3, 231, 17, 8, 3, 231, 16, 8, 3, 231, 19, 8, 3, + 231, 18, 8, 3, 230, 245, 8, 3, 230, 247, 8, 3, 230, 246, 8, 3, 230, 250, + 8, 3, 230, 249, 8, 3, 230, 252, 8, 3, 230, 251, 8, 3, 231, 0, 8, 3, 231, + 2, 8, 3, 231, 1, 8, 3, 230, 241, 8, 3, 230, 240, 8, 3, 230, 248, 8, 3, + 230, 244, 8, 3, 230, 242, 8, 3, 230, 243, 8, 3, 240, 187, 8, 3, 240, 186, + 8, 3, 240, 193, 8, 3, 240, 188, 8, 3, 240, 190, 8, 3, 240, 189, 8, 3, + 240, 192, 8, 3, 240, 191, 8, 3, 240, 198, 8, 3, 240, 197, 8, 3, 240, 200, + 8, 3, 240, 199, 8, 3, 240, 179, 8, 3, 240, 178, 8, 3, 240, 181, 8, 3, + 240, 180, 8, 3, 240, 183, 8, 3, 240, 182, 8, 3, 240, 185, 8, 3, 240, 184, + 8, 3, 240, 194, 8, 3, 240, 196, 8, 3, 240, 195, 8, 3, 229, 29, 8, 3, 229, + 31, 8, 3, 229, 30, 8, 3, 229, 72, 8, 3, 229, 70, 8, 3, 229, 82, 8, 3, + 229, 75, 8, 3, 228, 248, 8, 3, 228, 247, 8, 3, 228, 249, 8, 3, 229, 1, 8, + 3, 228, 254, 8, 3, 229, 9, 8, 3, 229, 3, 8, 3, 229, 63, 8, 3, 229, 69, 8, + 3, 229, 65, 8, 3, 241, 163, 8, 3, 241, 173, 8, 3, 241, 182, 8, 3, 242, 2, + 8, 3, 241, 250, 8, 3, 162, 8, 3, 242, 13, 8, 3, 240, 213, 8, 3, 240, 212, + 8, 3, 240, 215, 8, 3, 240, 214, 8, 3, 240, 249, 8, 3, 240, 240, 8, 3, + 241, 75, 8, 3, 241, 54, 8, 3, 241, 201, 8, 3, 241, 245, 8, 3, 241, 213, + 8, 3, 212, 43, 8, 3, 212, 28, 8, 3, 212, 65, 8, 3, 212, 51, 8, 3, 211, + 185, 8, 3, 211, 187, 8, 3, 211, 186, 8, 3, 211, 203, 8, 3, 211, 227, 8, + 3, 211, 210, 8, 3, 212, 5, 8, 3, 212, 22, 8, 3, 212, 10, 8, 3, 210, 30, + 8, 3, 210, 29, 8, 3, 210, 44, 8, 3, 210, 32, 8, 3, 210, 37, 8, 3, 210, + 39, 8, 3, 210, 38, 8, 3, 210, 102, 8, 3, 210, 99, 8, 3, 210, 116, 8, 3, + 210, 105, 8, 3, 210, 6, 8, 3, 210, 8, 8, 3, 210, 7, 8, 3, 210, 19, 8, 3, + 210, 18, 8, 3, 210, 23, 8, 3, 210, 20, 8, 3, 210, 84, 8, 3, 210, 94, 8, + 3, 210, 88, 8, 3, 210, 2, 8, 3, 210, 1, 8, 3, 210, 13, 8, 3, 210, 5, 8, + 3, 210, 3, 8, 3, 210, 4, 8, 3, 209, 245, 8, 3, 209, 244, 8, 3, 209, 250, + 8, 3, 209, 248, 8, 3, 209, 246, 8, 3, 209, 247, 8, 3, 250, 36, 8, 3, 250, + 32, 8, 3, 250, 59, 8, 3, 250, 45, 8, 3, 250, 56, 8, 3, 250, 50, 8, 3, + 250, 58, 8, 3, 250, 57, 8, 3, 250, 232, 8, 3, 250, 225, 8, 3, 251, 41, 8, + 3, 251, 3, 8, 3, 249, 112, 8, 3, 249, 114, 8, 3, 249, 113, 8, 3, 249, + 161, 8, 3, 249, 152, 8, 3, 249, 246, 8, 3, 249, 177, 8, 3, 250, 168, 8, + 3, 250, 198, 8, 3, 250, 173, 8, 3, 249, 92, 8, 3, 249, 90, 8, 3, 249, + 120, 8, 3, 249, 110, 8, 3, 249, 97, 8, 3, 249, 109, 8, 3, 249, 71, 8, 3, + 249, 70, 8, 3, 249, 81, 8, 3, 249, 77, 8, 3, 249, 72, 8, 3, 249, 74, 8, 3, 209, 228, 8, 3, 209, 227, 8, 3, 209, 234, 8, 3, 209, 229, 8, 3, 209, 231, 8, 3, 209, 230, 8, 3, 209, 233, 8, 3, 209, 232, 8, 3, 209, 240, 8, 3, 209, 239, 8, 3, 209, 243, 8, 3, 209, 241, 8, 3, 209, 224, 8, 3, 209, 226, 8, 3, 209, 225, 8, 3, 209, 235, 8, 3, 209, 238, 8, 3, 209, 236, 8, 3, 209, 217, 8, 3, 209, 221, 8, 3, 209, 220, 8, 3, 209, 218, 8, 3, 209, 219, 8, 3, 209, 211, 8, 3, 209, 210, 8, 3, 209, 216, 8, 3, 209, 214, 8, - 3, 209, 212, 8, 3, 209, 213, 8, 3, 227, 105, 8, 3, 227, 104, 8, 3, 227, - 110, 8, 3, 227, 106, 8, 3, 227, 107, 8, 3, 227, 109, 8, 3, 227, 108, 8, - 3, 227, 115, 8, 3, 227, 114, 8, 3, 227, 118, 8, 3, 227, 117, 8, 3, 227, - 98, 8, 3, 227, 99, 8, 3, 227, 102, 8, 3, 227, 103, 8, 3, 227, 111, 8, 3, - 227, 113, 8, 3, 227, 93, 8, 3, 227, 101, 8, 3, 227, 97, 8, 3, 227, 94, 8, - 3, 227, 95, 8, 3, 227, 88, 8, 3, 227, 87, 8, 3, 227, 92, 8, 3, 227, 91, - 8, 3, 227, 89, 8, 3, 227, 90, 8, 3, 219, 128, 8, 3, 194, 8, 3, 219, 192, - 8, 3, 219, 131, 8, 3, 219, 184, 8, 3, 219, 187, 8, 3, 219, 185, 8, 3, - 221, 227, 8, 3, 221, 215, 8, 3, 206, 8, 3, 221, 235, 8, 3, 218, 29, 8, 3, - 218, 31, 8, 3, 218, 30, 8, 3, 219, 35, 8, 3, 219, 24, 8, 3, 219, 59, 8, - 3, 219, 39, 8, 3, 220, 115, 8, 3, 221, 182, 8, 3, 220, 140, 8, 3, 218, 6, - 8, 3, 218, 4, 8, 3, 218, 84, 8, 3, 218, 28, 8, 3, 218, 10, 8, 3, 218, 18, - 8, 3, 217, 167, 8, 3, 217, 166, 8, 3, 217, 233, 8, 3, 217, 174, 8, 3, - 217, 169, 8, 3, 217, 173, 8, 3, 218, 187, 8, 3, 218, 186, 8, 3, 218, 193, - 8, 3, 218, 188, 8, 3, 218, 190, 8, 3, 218, 192, 8, 3, 218, 191, 8, 3, - 218, 201, 8, 3, 218, 199, 8, 3, 218, 224, 8, 3, 218, 202, 8, 3, 218, 182, - 8, 3, 218, 181, 8, 3, 218, 185, 8, 3, 218, 183, 8, 3, 218, 195, 8, 3, - 218, 198, 8, 3, 218, 196, 8, 3, 218, 178, 8, 3, 218, 176, 8, 3, 218, 180, - 8, 3, 218, 179, 8, 3, 218, 171, 8, 3, 218, 170, 8, 3, 218, 175, 8, 3, - 218, 174, 8, 3, 218, 172, 8, 3, 218, 173, 8, 3, 210, 77, 8, 3, 210, 76, - 8, 3, 210, 82, 8, 3, 210, 79, 8, 3, 210, 59, 8, 3, 210, 61, 8, 3, 210, - 60, 8, 3, 210, 64, 8, 3, 210, 63, 8, 3, 210, 67, 8, 3, 210, 65, 8, 3, - 210, 71, 8, 3, 210, 70, 8, 3, 210, 74, 8, 3, 210, 72, 8, 3, 210, 55, 8, - 3, 210, 54, 8, 3, 210, 62, 8, 3, 210, 58, 8, 3, 210, 56, 8, 3, 210, 57, - 8, 3, 210, 47, 8, 3, 210, 46, 8, 3, 210, 51, 8, 3, 210, 50, 8, 3, 210, - 48, 8, 3, 210, 49, 8, 3, 250, 137, 8, 3, 250, 134, 8, 3, 250, 158, 8, 3, - 250, 145, 8, 3, 250, 66, 8, 3, 250, 65, 8, 3, 250, 68, 8, 3, 250, 67, 8, - 3, 250, 80, 8, 3, 250, 79, 8, 3, 250, 87, 8, 3, 250, 82, 8, 3, 250, 116, - 8, 3, 250, 114, 8, 3, 250, 132, 8, 3, 250, 122, 8, 3, 250, 60, 8, 3, 250, - 70, 8, 3, 250, 64, 8, 3, 250, 61, 8, 3, 250, 63, 8, 3, 250, 54, 8, 3, - 250, 53, 8, 3, 250, 58, 8, 3, 250, 57, 8, 3, 250, 55, 8, 3, 250, 56, 8, - 3, 222, 176, 8, 3, 222, 180, 8, 3, 222, 159, 8, 3, 222, 160, 8, 3, 222, - 163, 8, 3, 222, 162, 8, 3, 222, 166, 8, 3, 222, 164, 8, 3, 222, 170, 8, - 3, 222, 169, 8, 3, 222, 175, 8, 3, 222, 171, 8, 3, 222, 155, 8, 3, 222, - 153, 8, 3, 222, 161, 8, 3, 222, 158, 8, 3, 222, 156, 8, 3, 222, 157, 8, - 3, 222, 148, 8, 3, 222, 147, 8, 3, 222, 152, 8, 3, 222, 151, 8, 3, 222, - 149, 8, 3, 222, 150, 8, 3, 228, 35, 8, 3, 228, 34, 8, 3, 228, 37, 8, 3, - 228, 36, 8, 3, 228, 27, 8, 3, 228, 29, 8, 3, 228, 28, 8, 3, 228, 31, 8, - 3, 228, 30, 8, 3, 228, 33, 8, 3, 228, 32, 8, 3, 228, 22, 8, 3, 228, 21, - 8, 3, 228, 26, 8, 3, 228, 25, 8, 3, 228, 23, 8, 3, 228, 24, 8, 3, 228, - 16, 8, 3, 228, 15, 8, 3, 228, 20, 8, 3, 228, 19, 8, 3, 228, 17, 8, 3, - 228, 18, 8, 3, 220, 73, 8, 3, 220, 68, 8, 3, 220, 103, 8, 3, 220, 84, 8, - 3, 219, 216, 8, 3, 219, 218, 8, 3, 219, 217, 8, 3, 219, 237, 8, 3, 219, - 234, 8, 3, 220, 8, 8, 3, 219, 255, 8, 3, 220, 43, 8, 3, 220, 36, 8, 3, - 220, 64, 8, 3, 220, 51, 8, 3, 219, 212, 8, 3, 219, 210, 8, 3, 219, 226, - 8, 3, 219, 215, 8, 3, 219, 213, 8, 3, 219, 214, 8, 3, 219, 195, 8, 3, - 219, 194, 8, 3, 219, 201, 8, 3, 219, 198, 8, 3, 219, 196, 8, 3, 219, 197, - 8, 3, 223, 142, 8, 3, 223, 136, 8, 3, 205, 8, 3, 223, 148, 8, 3, 222, - 121, 8, 3, 222, 123, 8, 3, 222, 122, 8, 3, 222, 189, 8, 3, 222, 182, 8, - 3, 222, 212, 8, 3, 222, 193, 8, 3, 223, 44, 8, 3, 223, 129, 8, 3, 223, - 82, 8, 3, 222, 114, 8, 3, 222, 111, 8, 3, 222, 141, 8, 3, 222, 120, 8, 3, - 222, 116, 8, 3, 222, 117, 8, 3, 222, 96, 8, 3, 222, 95, 8, 3, 222, 101, - 8, 3, 222, 99, 8, 3, 222, 97, 8, 3, 222, 98, 8, 3, 235, 99, 8, 3, 235, - 98, 8, 3, 235, 109, 8, 3, 235, 100, 8, 3, 235, 105, 8, 3, 235, 104, 8, 3, - 235, 107, 8, 3, 235, 106, 8, 3, 235, 42, 8, 3, 235, 41, 8, 3, 235, 44, 8, - 3, 235, 43, 8, 3, 235, 57, 8, 3, 235, 55, 8, 3, 235, 69, 8, 3, 235, 59, - 8, 3, 235, 35, 8, 3, 235, 33, 8, 3, 235, 52, 8, 3, 235, 40, 8, 3, 235, - 37, 8, 3, 235, 38, 8, 3, 235, 27, 8, 3, 235, 26, 8, 3, 235, 31, 8, 3, - 235, 30, 8, 3, 235, 28, 8, 3, 235, 29, 8, 3, 224, 47, 8, 3, 224, 45, 8, - 3, 224, 54, 8, 3, 224, 48, 8, 3, 224, 51, 8, 3, 224, 50, 8, 3, 224, 53, - 8, 3, 224, 52, 8, 3, 224, 0, 8, 3, 223, 253, 8, 3, 224, 2, 8, 3, 224, 1, - 8, 3, 224, 34, 8, 3, 224, 33, 8, 3, 224, 43, 8, 3, 224, 37, 8, 3, 223, - 248, 8, 3, 223, 244, 8, 3, 224, 31, 8, 3, 223, 252, 8, 3, 223, 250, 8, 3, - 223, 251, 8, 3, 223, 228, 8, 3, 223, 226, 8, 3, 223, 238, 8, 3, 223, 231, - 8, 3, 223, 229, 8, 3, 223, 230, 8, 3, 235, 88, 8, 3, 235, 87, 8, 3, 235, - 94, 8, 3, 235, 89, 8, 3, 235, 91, 8, 3, 235, 90, 8, 3, 235, 93, 8, 3, - 235, 92, 8, 3, 235, 79, 8, 3, 235, 81, 8, 3, 235, 80, 8, 3, 235, 84, 8, - 3, 235, 83, 8, 3, 235, 86, 8, 3, 235, 85, 8, 3, 235, 75, 8, 3, 235, 74, - 8, 3, 235, 82, 8, 3, 235, 78, 8, 3, 235, 76, 8, 3, 235, 77, 8, 3, 235, - 71, 8, 3, 235, 70, 8, 3, 235, 73, 8, 3, 235, 72, 8, 3, 228, 163, 8, 3, - 228, 162, 8, 3, 228, 170, 8, 3, 228, 164, 8, 3, 228, 166, 8, 3, 228, 165, - 8, 3, 228, 169, 8, 3, 228, 167, 8, 3, 228, 152, 8, 3, 228, 153, 8, 3, - 228, 158, 8, 3, 228, 157, 8, 3, 228, 161, 8, 3, 228, 159, 8, 3, 228, 147, - 8, 3, 228, 156, 8, 3, 228, 151, 8, 3, 228, 148, 8, 3, 228, 149, 8, 3, - 228, 142, 8, 3, 228, 141, 8, 3, 228, 146, 8, 3, 228, 145, 8, 3, 228, 143, - 8, 3, 228, 144, 8, 3, 227, 138, 8, 3, 227, 137, 8, 3, 227, 149, 8, 3, - 227, 142, 8, 3, 227, 146, 8, 3, 227, 145, 8, 3, 227, 148, 8, 3, 227, 147, - 8, 3, 227, 125, 8, 3, 227, 127, 8, 3, 227, 126, 8, 3, 227, 131, 8, 3, - 227, 130, 8, 3, 227, 135, 8, 3, 227, 132, 8, 3, 227, 123, 8, 3, 227, 121, - 8, 3, 227, 129, 8, 3, 227, 124, 8, 3, 211, 150, 8, 3, 211, 149, 8, 3, + 3, 209, 212, 8, 3, 209, 213, 8, 3, 227, 108, 8, 3, 227, 107, 8, 3, 227, + 113, 8, 3, 227, 109, 8, 3, 227, 110, 8, 3, 227, 112, 8, 3, 227, 111, 8, + 3, 227, 118, 8, 3, 227, 117, 8, 3, 227, 121, 8, 3, 227, 120, 8, 3, 227, + 101, 8, 3, 227, 102, 8, 3, 227, 105, 8, 3, 227, 106, 8, 3, 227, 114, 8, + 3, 227, 116, 8, 3, 227, 96, 8, 3, 227, 104, 8, 3, 227, 100, 8, 3, 227, + 97, 8, 3, 227, 98, 8, 3, 227, 91, 8, 3, 227, 90, 8, 3, 227, 95, 8, 3, + 227, 94, 8, 3, 227, 92, 8, 3, 227, 93, 8, 3, 219, 129, 8, 3, 195, 8, 3, + 219, 193, 8, 3, 219, 132, 8, 3, 219, 185, 8, 3, 219, 188, 8, 3, 219, 186, + 8, 3, 221, 228, 8, 3, 221, 216, 8, 3, 206, 8, 3, 221, 236, 8, 3, 218, 29, + 8, 3, 218, 31, 8, 3, 218, 30, 8, 3, 219, 36, 8, 3, 219, 25, 8, 3, 219, + 60, 8, 3, 219, 40, 8, 3, 220, 116, 8, 3, 221, 183, 8, 3, 220, 141, 8, 3, + 218, 6, 8, 3, 218, 4, 8, 3, 218, 84, 8, 3, 218, 28, 8, 3, 218, 10, 8, 3, + 218, 18, 8, 3, 217, 167, 8, 3, 217, 166, 8, 3, 217, 233, 8, 3, 217, 174, + 8, 3, 217, 169, 8, 3, 217, 173, 8, 3, 218, 188, 8, 3, 218, 187, 8, 3, + 218, 194, 8, 3, 218, 189, 8, 3, 218, 191, 8, 3, 218, 193, 8, 3, 218, 192, + 8, 3, 218, 202, 8, 3, 218, 200, 8, 3, 218, 225, 8, 3, 218, 203, 8, 3, + 218, 183, 8, 3, 218, 182, 8, 3, 218, 186, 8, 3, 218, 184, 8, 3, 218, 196, + 8, 3, 218, 199, 8, 3, 218, 197, 8, 3, 218, 179, 8, 3, 218, 177, 8, 3, + 218, 181, 8, 3, 218, 180, 8, 3, 218, 172, 8, 3, 218, 171, 8, 3, 218, 176, + 8, 3, 218, 175, 8, 3, 218, 173, 8, 3, 218, 174, 8, 3, 210, 77, 8, 3, 210, + 76, 8, 3, 210, 82, 8, 3, 210, 79, 8, 3, 210, 59, 8, 3, 210, 61, 8, 3, + 210, 60, 8, 3, 210, 64, 8, 3, 210, 63, 8, 3, 210, 67, 8, 3, 210, 65, 8, + 3, 210, 71, 8, 3, 210, 70, 8, 3, 210, 74, 8, 3, 210, 72, 8, 3, 210, 55, + 8, 3, 210, 54, 8, 3, 210, 62, 8, 3, 210, 58, 8, 3, 210, 56, 8, 3, 210, + 57, 8, 3, 210, 47, 8, 3, 210, 46, 8, 3, 210, 51, 8, 3, 210, 50, 8, 3, + 210, 48, 8, 3, 210, 49, 8, 3, 250, 144, 8, 3, 250, 141, 8, 3, 250, 165, + 8, 3, 250, 152, 8, 3, 250, 73, 8, 3, 250, 72, 8, 3, 250, 75, 8, 3, 250, + 74, 8, 3, 250, 87, 8, 3, 250, 86, 8, 3, 250, 94, 8, 3, 250, 89, 8, 3, + 250, 123, 8, 3, 250, 121, 8, 3, 250, 139, 8, 3, 250, 129, 8, 3, 250, 67, + 8, 3, 250, 77, 8, 3, 250, 71, 8, 3, 250, 68, 8, 3, 250, 70, 8, 3, 250, + 61, 8, 3, 250, 60, 8, 3, 250, 65, 8, 3, 250, 64, 8, 3, 250, 62, 8, 3, + 250, 63, 8, 3, 222, 177, 8, 3, 222, 181, 8, 3, 222, 160, 8, 3, 222, 161, + 8, 3, 222, 164, 8, 3, 222, 163, 8, 3, 222, 167, 8, 3, 222, 165, 8, 3, + 222, 171, 8, 3, 222, 170, 8, 3, 222, 176, 8, 3, 222, 172, 8, 3, 222, 156, + 8, 3, 222, 154, 8, 3, 222, 162, 8, 3, 222, 159, 8, 3, 222, 157, 8, 3, + 222, 158, 8, 3, 222, 149, 8, 3, 222, 148, 8, 3, 222, 153, 8, 3, 222, 152, + 8, 3, 222, 150, 8, 3, 222, 151, 8, 3, 228, 39, 8, 3, 228, 38, 8, 3, 228, + 41, 8, 3, 228, 40, 8, 3, 228, 31, 8, 3, 228, 33, 8, 3, 228, 32, 8, 3, + 228, 35, 8, 3, 228, 34, 8, 3, 228, 37, 8, 3, 228, 36, 8, 3, 228, 26, 8, + 3, 228, 25, 8, 3, 228, 30, 8, 3, 228, 29, 8, 3, 228, 27, 8, 3, 228, 28, + 8, 3, 228, 20, 8, 3, 228, 19, 8, 3, 228, 24, 8, 3, 228, 23, 8, 3, 228, + 21, 8, 3, 228, 22, 8, 3, 220, 74, 8, 3, 220, 69, 8, 3, 220, 104, 8, 3, + 220, 85, 8, 3, 219, 217, 8, 3, 219, 219, 8, 3, 219, 218, 8, 3, 219, 238, + 8, 3, 219, 235, 8, 3, 220, 9, 8, 3, 220, 0, 8, 3, 220, 44, 8, 3, 220, 37, + 8, 3, 220, 65, 8, 3, 220, 52, 8, 3, 219, 213, 8, 3, 219, 211, 8, 3, 219, + 227, 8, 3, 219, 216, 8, 3, 219, 214, 8, 3, 219, 215, 8, 3, 219, 196, 8, + 3, 219, 195, 8, 3, 219, 202, 8, 3, 219, 199, 8, 3, 219, 197, 8, 3, 219, + 198, 8, 3, 223, 144, 8, 3, 223, 138, 8, 3, 205, 8, 3, 223, 150, 8, 3, + 222, 122, 8, 3, 222, 124, 8, 3, 222, 123, 8, 3, 222, 190, 8, 3, 222, 183, + 8, 3, 222, 213, 8, 3, 222, 194, 8, 3, 223, 46, 8, 3, 223, 131, 8, 3, 223, + 84, 8, 3, 222, 115, 8, 3, 222, 112, 8, 3, 222, 142, 8, 3, 222, 121, 8, 3, + 222, 117, 8, 3, 222, 118, 8, 3, 222, 97, 8, 3, 222, 96, 8, 3, 222, 102, + 8, 3, 222, 100, 8, 3, 222, 98, 8, 3, 222, 99, 8, 3, 235, 104, 8, 3, 235, + 103, 8, 3, 235, 114, 8, 3, 235, 105, 8, 3, 235, 110, 8, 3, 235, 109, 8, + 3, 235, 112, 8, 3, 235, 111, 8, 3, 235, 47, 8, 3, 235, 46, 8, 3, 235, 49, + 8, 3, 235, 48, 8, 3, 235, 62, 8, 3, 235, 60, 8, 3, 235, 74, 8, 3, 235, + 64, 8, 3, 235, 40, 8, 3, 235, 38, 8, 3, 235, 57, 8, 3, 235, 45, 8, 3, + 235, 42, 8, 3, 235, 43, 8, 3, 235, 32, 8, 3, 235, 31, 8, 3, 235, 36, 8, + 3, 235, 35, 8, 3, 235, 33, 8, 3, 235, 34, 8, 3, 224, 49, 8, 3, 224, 47, + 8, 3, 224, 56, 8, 3, 224, 50, 8, 3, 224, 53, 8, 3, 224, 52, 8, 3, 224, + 55, 8, 3, 224, 54, 8, 3, 224, 2, 8, 3, 223, 255, 8, 3, 224, 4, 8, 3, 224, + 3, 8, 3, 224, 36, 8, 3, 224, 35, 8, 3, 224, 45, 8, 3, 224, 39, 8, 3, 223, + 250, 8, 3, 223, 246, 8, 3, 224, 33, 8, 3, 223, 254, 8, 3, 223, 252, 8, 3, + 223, 253, 8, 3, 223, 230, 8, 3, 223, 228, 8, 3, 223, 240, 8, 3, 223, 233, + 8, 3, 223, 231, 8, 3, 223, 232, 8, 3, 235, 93, 8, 3, 235, 92, 8, 3, 235, + 99, 8, 3, 235, 94, 8, 3, 235, 96, 8, 3, 235, 95, 8, 3, 235, 98, 8, 3, + 235, 97, 8, 3, 235, 84, 8, 3, 235, 86, 8, 3, 235, 85, 8, 3, 235, 89, 8, + 3, 235, 88, 8, 3, 235, 91, 8, 3, 235, 90, 8, 3, 235, 80, 8, 3, 235, 79, + 8, 3, 235, 87, 8, 3, 235, 83, 8, 3, 235, 81, 8, 3, 235, 82, 8, 3, 235, + 76, 8, 3, 235, 75, 8, 3, 235, 78, 8, 3, 235, 77, 8, 3, 228, 167, 8, 3, + 228, 166, 8, 3, 228, 174, 8, 3, 228, 168, 8, 3, 228, 170, 8, 3, 228, 169, + 8, 3, 228, 173, 8, 3, 228, 171, 8, 3, 228, 156, 8, 3, 228, 157, 8, 3, + 228, 162, 8, 3, 228, 161, 8, 3, 228, 165, 8, 3, 228, 163, 8, 3, 228, 151, + 8, 3, 228, 160, 8, 3, 228, 155, 8, 3, 228, 152, 8, 3, 228, 153, 8, 3, + 228, 146, 8, 3, 228, 145, 8, 3, 228, 150, 8, 3, 228, 149, 8, 3, 228, 147, + 8, 3, 228, 148, 8, 3, 227, 141, 8, 3, 227, 140, 8, 3, 227, 152, 8, 3, + 227, 145, 8, 3, 227, 149, 8, 3, 227, 148, 8, 3, 227, 151, 8, 3, 227, 150, + 8, 3, 227, 128, 8, 3, 227, 130, 8, 3, 227, 129, 8, 3, 227, 134, 8, 3, + 227, 133, 8, 3, 227, 138, 8, 3, 227, 135, 8, 3, 227, 126, 8, 3, 227, 124, + 8, 3, 227, 132, 8, 3, 227, 127, 8, 3, 211, 150, 8, 3, 211, 149, 8, 3, 211, 157, 8, 3, 211, 152, 8, 3, 211, 154, 8, 3, 211, 153, 8, 3, 211, 156, 8, 3, 211, 155, 8, 3, 211, 139, 8, 3, 211, 140, 8, 3, 211, 144, 8, 3, 211, 143, 8, 3, 211, 148, 8, 3, 211, 146, 8, 3, 211, 121, 8, 3, 211, 119, @@ -9890,2102 +9891,2101 @@ 244, 8, 3, 210, 228, 8, 3, 210, 182, 8, 3, 210, 178, 8, 3, 210, 212, 8, 3, 210, 189, 8, 3, 210, 185, 8, 3, 210, 186, 8, 3, 210, 162, 8, 3, 210, 161, 8, 3, 210, 169, 8, 3, 210, 165, 8, 3, 210, 163, 8, 3, 210, 164, 8, - 34, 224, 34, 8, 34, 232, 242, 8, 34, 234, 62, 8, 34, 227, 142, 8, 34, - 249, 70, 8, 34, 218, 193, 8, 34, 243, 13, 8, 34, 243, 45, 8, 34, 230, - 231, 8, 34, 240, 181, 8, 34, 232, 57, 8, 34, 252, 84, 8, 34, 230, 127, 8, - 34, 210, 244, 8, 34, 224, 122, 8, 34, 240, 175, 8, 34, 217, 47, 8, 34, - 243, 136, 8, 34, 210, 5, 8, 34, 249, 64, 8, 34, 248, 96, 8, 34, 251, 99, - 8, 34, 243, 9, 8, 34, 227, 132, 8, 34, 215, 119, 8, 34, 226, 176, 8, 34, - 235, 75, 8, 34, 210, 19, 8, 34, 224, 101, 8, 34, 241, 109, 8, 34, 210, - 250, 8, 34, 212, 112, 8, 34, 219, 201, 8, 34, 213, 244, 8, 34, 210, 116, - 8, 34, 235, 69, 8, 34, 227, 97, 8, 34, 235, 73, 8, 34, 242, 155, 8, 34, - 235, 93, 8, 34, 211, 227, 8, 34, 246, 79, 8, 34, 219, 214, 8, 34, 232, - 237, 8, 34, 249, 74, 8, 34, 249, 106, 8, 34, 250, 38, 8, 34, 240, 178, 8, - 34, 220, 73, 8, 34, 210, 4, 8, 34, 219, 255, 8, 34, 250, 132, 8, 34, 209, - 231, 8, 34, 229, 174, 8, 34, 234, 183, 232, 197, 1, 252, 192, 232, 197, - 1, 190, 232, 197, 1, 225, 148, 232, 197, 1, 248, 222, 232, 197, 1, 217, - 106, 232, 197, 1, 216, 209, 232, 197, 1, 243, 136, 232, 197, 1, 176, 232, - 197, 1, 234, 133, 232, 197, 1, 235, 142, 232, 197, 1, 251, 34, 232, 197, - 1, 250, 158, 232, 197, 1, 246, 39, 232, 197, 1, 215, 184, 232, 197, 1, - 215, 176, 232, 197, 1, 185, 232, 197, 1, 197, 232, 197, 1, 233, 136, 232, - 197, 1, 206, 232, 197, 1, 210, 82, 232, 197, 1, 210, 116, 232, 197, 1, - 229, 78, 232, 197, 1, 162, 232, 197, 1, 211, 165, 232, 197, 1, 241, 190, - 232, 197, 1, 244, 197, 232, 197, 1, 212, 65, 232, 197, 1, 220, 103, 232, - 197, 1, 191, 232, 197, 1, 242, 250, 232, 197, 1, 61, 232, 197, 1, 254, - 244, 232, 197, 1, 75, 232, 197, 1, 245, 56, 232, 197, 1, 73, 232, 197, 1, - 76, 232, 197, 1, 70, 232, 197, 1, 214, 214, 232, 197, 1, 214, 208, 232, - 197, 1, 226, 235, 232, 197, 1, 138, 230, 33, 216, 118, 232, 197, 1, 138, - 229, 230, 225, 17, 232, 197, 1, 138, 230, 33, 249, 73, 232, 197, 1, 138, - 230, 33, 251, 206, 232, 197, 1, 138, 230, 33, 197, 232, 197, 1, 138, 230, - 33, 235, 116, 232, 197, 224, 142, 249, 220, 232, 197, 224, 142, 243, 230, - 218, 130, 41, 3, 245, 210, 41, 3, 245, 206, 41, 3, 241, 221, 41, 3, 212, - 17, 41, 3, 212, 16, 41, 3, 225, 212, 41, 3, 252, 14, 41, 3, 252, 67, 41, - 3, 231, 117, 41, 3, 233, 248, 41, 3, 231, 7, 41, 3, 243, 76, 41, 3, 244, - 148, 41, 3, 213, 250, 41, 3, 217, 12, 41, 3, 216, 195, 41, 3, 248, 17, - 41, 3, 248, 14, 41, 3, 233, 51, 41, 3, 223, 109, 41, 3, 248, 78, 41, 3, - 229, 140, 41, 3, 221, 171, 41, 3, 220, 62, 41, 3, 210, 92, 41, 3, 210, - 73, 41, 3, 250, 183, 41, 3, 235, 125, 41, 3, 228, 177, 41, 3, 211, 44, - 41, 3, 234, 182, 41, 3, 229, 52, 41, 3, 243, 56, 41, 3, 231, 81, 41, 3, - 229, 104, 41, 3, 227, 156, 41, 3, 73, 41, 3, 236, 0, 41, 3, 241, 181, 41, - 3, 241, 161, 41, 3, 211, 250, 41, 3, 211, 241, 41, 3, 225, 109, 41, 3, - 252, 12, 41, 3, 252, 7, 41, 3, 231, 110, 41, 3, 233, 245, 41, 3, 231, 4, - 41, 3, 243, 72, 41, 3, 244, 122, 41, 3, 213, 176, 41, 3, 216, 118, 41, 3, - 216, 176, 41, 3, 248, 9, 41, 3, 248, 13, 41, 3, 232, 242, 41, 3, 223, 36, - 41, 3, 248, 4, 41, 3, 229, 134, 41, 3, 219, 192, 41, 3, 220, 33, 41, 3, - 210, 44, 41, 3, 210, 69, 41, 3, 250, 52, 41, 3, 235, 109, 41, 3, 228, - 170, 41, 3, 211, 8, 41, 3, 234, 93, 41, 3, 229, 44, 41, 3, 242, 215, 41, - 3, 230, 231, 41, 3, 228, 234, 41, 3, 227, 149, 41, 3, 61, 41, 3, 254, - 124, 41, 3, 229, 73, 41, 3, 162, 41, 3, 242, 19, 41, 3, 212, 65, 41, 3, - 212, 55, 41, 3, 190, 41, 3, 252, 19, 41, 3, 252, 192, 41, 3, 231, 125, - 41, 3, 233, 252, 41, 3, 233, 251, 41, 3, 231, 11, 41, 3, 243, 80, 41, 3, - 244, 197, 41, 3, 214, 27, 41, 3, 217, 106, 41, 3, 216, 209, 41, 3, 248, - 26, 41, 3, 248, 16, 41, 3, 233, 136, 41, 3, 205, 41, 3, 248, 222, 41, 3, - 229, 149, 41, 3, 206, 41, 3, 220, 103, 41, 3, 210, 116, 41, 3, 210, 82, - 41, 3, 251, 34, 41, 3, 235, 142, 41, 3, 228, 186, 41, 3, 191, 41, 3, 176, - 41, 3, 234, 235, 41, 3, 229, 57, 41, 3, 243, 136, 41, 3, 185, 41, 3, 197, - 41, 3, 227, 166, 41, 3, 226, 184, 41, 3, 226, 180, 41, 3, 241, 54, 41, 3, - 211, 215, 41, 3, 211, 211, 41, 3, 224, 250, 41, 3, 252, 10, 41, 3, 251, - 194, 41, 3, 231, 105, 41, 3, 233, 243, 41, 3, 231, 0, 41, 3, 243, 68, 41, - 3, 244, 35, 41, 3, 213, 127, 41, 3, 216, 18, 41, 3, 216, 154, 41, 3, 248, - 7, 41, 3, 248, 11, 41, 3, 232, 128, 41, 3, 222, 198, 41, 3, 247, 126, 41, - 3, 229, 121, 41, 3, 219, 41, 41, 3, 220, 2, 41, 3, 210, 21, 41, 3, 210, - 66, 41, 3, 249, 175, 41, 3, 235, 60, 41, 3, 228, 160, 41, 3, 210, 229, - 41, 3, 234, 11, 41, 3, 229, 42, 41, 3, 242, 165, 41, 3, 230, 133, 41, 3, - 228, 65, 41, 3, 227, 133, 41, 3, 70, 41, 3, 214, 190, 41, 3, 240, 223, - 41, 3, 240, 213, 41, 3, 211, 195, 41, 3, 211, 189, 41, 3, 224, 151, 41, - 3, 252, 9, 41, 3, 251, 126, 41, 3, 231, 104, 41, 3, 233, 241, 41, 3, 230, - 255, 41, 3, 243, 67, 41, 3, 243, 235, 41, 3, 212, 116, 41, 3, 215, 119, - 41, 3, 216, 137, 41, 3, 248, 5, 41, 3, 248, 10, 41, 3, 232, 99, 41, 3, - 222, 141, 41, 3, 246, 79, 41, 3, 229, 116, 41, 3, 218, 84, 41, 3, 219, - 226, 41, 3, 210, 13, 41, 3, 210, 62, 41, 3, 249, 113, 41, 3, 235, 52, 41, - 3, 228, 156, 41, 3, 210, 212, 41, 3, 233, 218, 41, 3, 229, 41, 41, 3, - 242, 114, 41, 3, 230, 103, 41, 3, 227, 238, 41, 3, 227, 129, 41, 3, 76, - 41, 3, 226, 197, 41, 3, 229, 1, 41, 3, 241, 69, 41, 3, 241, 57, 41, 3, - 211, 227, 41, 3, 211, 216, 41, 3, 225, 17, 41, 3, 252, 11, 41, 3, 251, - 206, 41, 3, 231, 106, 41, 3, 233, 244, 41, 3, 231, 2, 41, 3, 243, 70, 41, - 3, 243, 69, 41, 3, 244, 44, 41, 3, 213, 138, 41, 3, 111, 41, 3, 216, 157, - 41, 3, 248, 8, 41, 3, 248, 12, 41, 3, 232, 157, 41, 3, 222, 212, 41, 3, - 247, 146, 41, 3, 229, 125, 41, 3, 219, 59, 41, 3, 220, 8, 41, 3, 210, 23, - 41, 3, 210, 67, 41, 3, 249, 239, 41, 3, 235, 69, 41, 3, 228, 161, 41, 3, - 210, 244, 41, 3, 234, 29, 41, 3, 229, 43, 41, 3, 242, 175, 41, 3, 230, - 162, 41, 3, 228, 75, 41, 3, 227, 135, 41, 3, 75, 41, 3, 245, 151, 41, 3, - 229, 62, 41, 3, 241, 239, 41, 3, 241, 210, 41, 3, 212, 22, 41, 3, 212, - 12, 41, 3, 225, 222, 41, 3, 252, 15, 41, 3, 252, 76, 41, 3, 231, 118, 41, - 3, 233, 249, 41, 3, 233, 247, 41, 3, 231, 8, 41, 3, 243, 77, 41, 3, 243, - 75, 41, 3, 244, 155, 41, 3, 213, 255, 41, 3, 217, 23, 41, 3, 216, 196, - 41, 3, 248, 18, 41, 3, 248, 15, 41, 3, 233, 59, 41, 3, 223, 129, 41, 3, - 248, 91, 41, 3, 229, 141, 41, 3, 221, 182, 41, 3, 220, 64, 41, 3, 210, - 94, 41, 3, 210, 74, 41, 3, 250, 191, 41, 3, 235, 127, 41, 3, 228, 179, - 41, 3, 211, 47, 41, 3, 234, 183, 41, 3, 229, 53, 41, 3, 229, 49, 41, 3, - 243, 63, 41, 3, 243, 52, 41, 3, 231, 92, 41, 3, 229, 108, 41, 3, 227, - 157, 41, 3, 229, 80, 41, 3, 233, 23, 41, 249, 220, 41, 243, 230, 218, - 130, 41, 224, 14, 78, 41, 3, 229, 124, 244, 197, 41, 3, 229, 124, 176, - 41, 3, 229, 124, 219, 41, 41, 16, 244, 145, 41, 16, 234, 181, 41, 16, - 216, 82, 41, 16, 228, 209, 41, 16, 252, 148, 41, 16, 244, 196, 41, 16, - 217, 102, 41, 16, 248, 177, 41, 16, 247, 125, 41, 16, 233, 207, 41, 16, - 216, 22, 41, 16, 247, 145, 41, 16, 235, 61, 41, 21, 210, 86, 41, 21, 110, - 41, 21, 105, 41, 21, 158, 41, 21, 161, 41, 21, 189, 41, 21, 194, 41, 21, - 198, 41, 21, 195, 41, 21, 200, 41, 3, 229, 124, 185, 41, 3, 229, 124, - 247, 146, 33, 6, 1, 210, 90, 33, 4, 1, 210, 90, 33, 6, 1, 246, 35, 33, 4, - 1, 246, 35, 33, 6, 1, 223, 50, 246, 37, 33, 4, 1, 223, 50, 246, 37, 33, - 6, 1, 235, 186, 33, 4, 1, 235, 186, 33, 6, 1, 247, 162, 33, 4, 1, 247, - 162, 33, 6, 1, 230, 141, 214, 205, 33, 4, 1, 230, 141, 214, 205, 33, 6, - 1, 251, 137, 226, 202, 33, 4, 1, 251, 137, 226, 202, 33, 6, 1, 229, 88, - 211, 31, 33, 4, 1, 229, 88, 211, 31, 33, 6, 1, 211, 28, 2, 252, 186, 211, - 31, 33, 4, 1, 211, 28, 2, 252, 186, 211, 31, 33, 6, 1, 235, 184, 211, 59, - 33, 4, 1, 235, 184, 211, 59, 33, 6, 1, 223, 50, 210, 212, 33, 4, 1, 223, - 50, 210, 212, 33, 6, 1, 235, 184, 61, 33, 4, 1, 235, 184, 61, 33, 6, 1, - 250, 1, 232, 193, 210, 183, 33, 4, 1, 250, 1, 232, 193, 210, 183, 33, 6, - 1, 251, 215, 210, 183, 33, 4, 1, 251, 215, 210, 183, 33, 6, 1, 235, 184, - 250, 1, 232, 193, 210, 183, 33, 4, 1, 235, 184, 250, 1, 232, 193, 210, - 183, 33, 6, 1, 210, 246, 33, 4, 1, 210, 246, 33, 6, 1, 223, 50, 215, 179, - 33, 4, 1, 223, 50, 215, 179, 33, 6, 1, 219, 53, 248, 91, 33, 4, 1, 219, - 53, 248, 91, 33, 6, 1, 219, 53, 245, 175, 33, 4, 1, 219, 53, 245, 175, - 33, 6, 1, 219, 53, 245, 160, 33, 4, 1, 219, 53, 245, 160, 33, 6, 1, 230, - 145, 76, 33, 4, 1, 230, 145, 76, 33, 6, 1, 251, 241, 76, 33, 4, 1, 251, - 241, 76, 33, 6, 1, 52, 230, 145, 76, 33, 4, 1, 52, 230, 145, 76, 33, 1, - 230, 87, 76, 38, 33, 212, 100, 38, 33, 216, 249, 230, 192, 50, 38, 33, - 240, 212, 230, 192, 50, 38, 33, 216, 149, 230, 192, 50, 219, 94, 253, - 217, 38, 33, 1, 214, 202, 236, 61, 38, 33, 1, 73, 38, 33, 1, 211, 8, 38, - 33, 1, 70, 38, 33, 1, 242, 4, 50, 38, 33, 1, 211, 27, 38, 33, 1, 219, 53, - 50, 38, 33, 1, 226, 202, 38, 33, 234, 193, 38, 33, 225, 228, 33, 234, - 193, 33, 225, 228, 33, 6, 1, 246, 47, 33, 4, 1, 246, 47, 33, 6, 1, 246, - 28, 33, 4, 1, 246, 28, 33, 6, 1, 210, 52, 33, 4, 1, 210, 52, 33, 6, 1, - 250, 207, 33, 4, 1, 250, 207, 33, 6, 1, 246, 26, 33, 4, 1, 246, 26, 33, - 6, 1, 217, 24, 2, 230, 225, 103, 33, 4, 1, 217, 24, 2, 230, 225, 103, 33, - 6, 1, 215, 78, 33, 4, 1, 215, 78, 33, 6, 1, 215, 161, 33, 4, 1, 215, 161, - 33, 6, 1, 215, 165, 33, 4, 1, 215, 165, 33, 6, 1, 217, 29, 33, 4, 1, 217, - 29, 33, 6, 1, 240, 199, 33, 4, 1, 240, 199, 33, 6, 1, 219, 207, 33, 4, 1, - 219, 207, 38, 33, 1, 235, 184, 75, 20, 1, 61, 20, 1, 176, 20, 1, 70, 20, - 1, 233, 218, 20, 1, 245, 210, 20, 1, 223, 109, 20, 1, 217, 87, 20, 1, 76, - 20, 1, 227, 149, 20, 1, 73, 20, 1, 233, 136, 20, 1, 190, 20, 1, 222, 240, - 20, 1, 223, 30, 20, 1, 233, 50, 20, 1, 231, 80, 20, 1, 217, 102, 20, 1, - 229, 147, 20, 1, 228, 184, 20, 1, 193, 20, 1, 218, 5, 20, 1, 230, 103, - 20, 1, 220, 28, 20, 1, 219, 192, 20, 1, 220, 38, 20, 1, 220, 124, 20, 1, - 233, 156, 20, 1, 234, 157, 20, 1, 227, 210, 20, 1, 227, 238, 20, 1, 228, - 155, 20, 1, 210, 226, 20, 1, 219, 226, 20, 1, 210, 187, 20, 1, 191, 20, - 1, 228, 10, 20, 1, 234, 143, 20, 1, 225, 152, 20, 1, 228, 177, 20, 1, - 227, 247, 20, 1, 224, 145, 20, 1, 211, 192, 20, 1, 225, 212, 20, 1, 244, - 148, 20, 1, 222, 141, 20, 1, 232, 99, 20, 1, 230, 231, 20, 1, 228, 234, - 20, 1, 223, 52, 20, 1, 223, 172, 20, 1, 234, 166, 20, 1, 229, 8, 20, 1, - 229, 57, 20, 1, 229, 78, 20, 1, 220, 8, 20, 1, 224, 148, 20, 1, 243, 235, - 20, 1, 244, 38, 20, 1, 212, 65, 20, 1, 197, 20, 1, 232, 242, 20, 1, 225, - 109, 20, 1, 232, 120, 20, 1, 234, 29, 20, 1, 231, 115, 20, 1, 223, 84, - 20, 1, 231, 59, 20, 1, 185, 20, 1, 216, 118, 20, 1, 234, 93, 20, 1, 230, - 162, 20, 1, 231, 123, 20, 1, 216, 231, 20, 1, 233, 252, 20, 1, 216, 248, - 20, 1, 227, 239, 20, 1, 221, 252, 20, 1, 244, 193, 20, 1, 233, 254, 20, - 1, 234, 25, 20, 38, 164, 234, 6, 20, 38, 164, 215, 111, 20, 228, 183, 20, - 243, 230, 218, 130, 20, 249, 227, 20, 249, 220, 20, 220, 151, 20, 224, - 14, 78, 58, 1, 250, 97, 138, 210, 254, 225, 62, 58, 1, 250, 97, 138, 211, - 70, 225, 62, 58, 1, 250, 97, 138, 210, 254, 220, 85, 58, 1, 250, 97, 138, - 211, 70, 220, 85, 58, 1, 250, 97, 138, 210, 254, 224, 31, 58, 1, 250, 97, - 138, 211, 70, 224, 31, 58, 1, 250, 97, 138, 210, 254, 222, 141, 58, 1, - 250, 97, 138, 211, 70, 222, 141, 58, 1, 245, 21, 246, 119, 138, 130, 58, - 1, 125, 246, 119, 138, 130, 58, 1, 230, 226, 246, 119, 138, 130, 58, 1, - 121, 246, 119, 138, 130, 58, 1, 245, 20, 246, 119, 138, 130, 58, 1, 245, - 21, 246, 119, 233, 40, 138, 130, 58, 1, 125, 246, 119, 233, 40, 138, 130, - 58, 1, 230, 226, 246, 119, 233, 40, 138, 130, 58, 1, 121, 246, 119, 233, - 40, 138, 130, 58, 1, 245, 20, 246, 119, 233, 40, 138, 130, 58, 1, 245, - 21, 233, 40, 138, 130, 58, 1, 125, 233, 40, 138, 130, 58, 1, 230, 226, - 233, 40, 138, 130, 58, 1, 121, 233, 40, 138, 130, 58, 1, 245, 20, 233, - 40, 138, 130, 58, 1, 59, 67, 130, 58, 1, 59, 219, 96, 58, 1, 59, 203, - 130, 58, 1, 232, 109, 44, 249, 162, 254, 110, 58, 1, 223, 158, 120, 74, - 58, 1, 223, 158, 124, 74, 58, 1, 223, 158, 245, 32, 78, 58, 1, 223, 158, - 235, 194, 245, 32, 78, 58, 1, 121, 235, 194, 245, 32, 78, 58, 1, 218, - 112, 22, 125, 216, 31, 58, 1, 218, 112, 22, 121, 216, 31, 7, 6, 1, 245, - 200, 254, 171, 7, 4, 1, 245, 200, 254, 171, 7, 6, 1, 245, 200, 254, 197, - 7, 4, 1, 245, 200, 254, 197, 7, 6, 1, 241, 208, 7, 4, 1, 241, 208, 7, 6, - 1, 215, 40, 7, 4, 1, 215, 40, 7, 6, 1, 215, 230, 7, 4, 1, 215, 230, 7, 6, - 1, 249, 111, 7, 4, 1, 249, 111, 7, 6, 1, 249, 112, 2, 249, 220, 7, 4, 1, - 249, 112, 2, 249, 220, 7, 1, 4, 6, 245, 7, 7, 1, 4, 6, 222, 92, 7, 6, 1, - 255, 74, 7, 4, 1, 255, 74, 7, 6, 1, 254, 74, 7, 4, 1, 254, 74, 7, 6, 1, - 253, 193, 7, 4, 1, 253, 193, 7, 6, 1, 253, 177, 7, 4, 1, 253, 177, 7, 6, - 1, 253, 178, 2, 203, 130, 7, 4, 1, 253, 178, 2, 203, 130, 7, 6, 1, 253, - 168, 7, 4, 1, 253, 168, 7, 6, 1, 223, 50, 251, 68, 2, 247, 121, 7, 4, 1, - 223, 50, 251, 68, 2, 247, 121, 7, 6, 1, 235, 25, 2, 91, 7, 4, 1, 235, 25, - 2, 91, 7, 6, 1, 235, 25, 2, 248, 0, 91, 7, 4, 1, 235, 25, 2, 248, 0, 91, - 7, 6, 1, 235, 25, 2, 218, 104, 22, 248, 0, 91, 7, 4, 1, 235, 25, 2, 218, - 104, 22, 248, 0, 91, 7, 6, 1, 251, 136, 156, 7, 4, 1, 251, 136, 156, 7, - 6, 1, 233, 150, 2, 125, 91, 7, 4, 1, 233, 150, 2, 125, 91, 7, 6, 1, 144, - 2, 199, 218, 104, 226, 121, 7, 4, 1, 144, 2, 199, 218, 104, 226, 121, 7, - 6, 1, 144, 2, 232, 124, 7, 4, 1, 144, 2, 232, 124, 7, 6, 1, 226, 184, 7, - 4, 1, 226, 184, 7, 6, 1, 226, 107, 2, 218, 104, 216, 140, 248, 40, 7, 4, - 1, 226, 107, 2, 218, 104, 216, 140, 248, 40, 7, 6, 1, 226, 107, 2, 244, - 54, 7, 4, 1, 226, 107, 2, 244, 54, 7, 6, 1, 226, 107, 2, 218, 230, 217, - 78, 7, 4, 1, 226, 107, 2, 218, 230, 217, 78, 7, 6, 1, 224, 98, 2, 218, - 104, 216, 140, 248, 40, 7, 4, 1, 224, 98, 2, 218, 104, 216, 140, 248, 40, - 7, 6, 1, 224, 98, 2, 248, 0, 91, 7, 4, 1, 224, 98, 2, 248, 0, 91, 7, 6, - 1, 223, 225, 222, 187, 7, 4, 1, 223, 225, 222, 187, 7, 6, 1, 222, 131, - 222, 187, 7, 4, 1, 222, 131, 222, 187, 7, 6, 1, 214, 106, 2, 248, 0, 91, - 7, 4, 1, 214, 106, 2, 248, 0, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212, 106, - 7, 6, 1, 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1, 216, - 153, 2, 91, 7, 4, 1, 216, 153, 2, 91, 7, 6, 1, 216, 153, 2, 218, 104, - 216, 140, 248, 40, 7, 4, 1, 216, 153, 2, 218, 104, 216, 140, 248, 40, 7, - 6, 1, 213, 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 66, 7, 4, 1, 245, 66, 7, - 6, 1, 235, 172, 7, 4, 1, 235, 172, 7, 6, 1, 249, 208, 7, 4, 1, 249, 208, - 58, 1, 214, 133, 7, 4, 1, 246, 70, 7, 4, 1, 232, 85, 7, 4, 1, 230, 81, 7, - 4, 1, 227, 202, 7, 4, 1, 222, 130, 7, 1, 4, 6, 222, 130, 7, 4, 1, 215, - 109, 7, 4, 1, 214, 197, 7, 6, 1, 235, 214, 249, 61, 7, 4, 1, 235, 214, - 249, 61, 7, 6, 1, 235, 214, 245, 7, 7, 4, 1, 235, 214, 245, 7, 7, 6, 1, - 235, 214, 243, 203, 7, 6, 1, 215, 94, 235, 214, 243, 203, 7, 4, 1, 215, - 94, 235, 214, 243, 203, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94, 156, 7, - 6, 1, 235, 214, 153, 7, 4, 1, 235, 214, 153, 7, 6, 1, 235, 214, 222, 92, - 7, 4, 1, 235, 214, 222, 92, 7, 6, 1, 235, 214, 217, 153, 7, 4, 1, 235, - 214, 217, 153, 58, 1, 121, 250, 32, 255, 15, 58, 1, 249, 227, 58, 1, 219, - 252, 245, 99, 50, 7, 6, 1, 222, 0, 7, 4, 1, 222, 0, 7, 6, 1, 215, 94, - 242, 61, 7, 4, 1, 233, 150, 2, 223, 56, 241, 53, 22, 252, 42, 7, 6, 1, - 230, 27, 2, 248, 40, 7, 4, 1, 230, 27, 2, 248, 40, 7, 6, 1, 251, 68, 2, - 130, 7, 4, 1, 251, 68, 2, 130, 7, 6, 1, 243, 204, 2, 226, 249, 91, 7, 4, - 1, 243, 204, 2, 226, 249, 91, 7, 6, 1, 235, 25, 2, 226, 249, 91, 7, 4, 1, - 235, 25, 2, 226, 249, 91, 7, 6, 1, 230, 27, 2, 226, 249, 91, 7, 4, 1, - 230, 27, 2, 226, 249, 91, 7, 6, 1, 223, 225, 2, 226, 249, 91, 7, 4, 1, - 223, 225, 2, 226, 249, 91, 7, 6, 1, 222, 93, 2, 226, 249, 91, 7, 4, 1, - 222, 93, 2, 226, 249, 91, 7, 6, 1, 242, 62, 2, 103, 58, 1, 6, 242, 62, 2, - 91, 58, 1, 4, 27, 226, 235, 7, 1, 4, 6, 215, 94, 193, 7, 245, 104, 1, - 223, 50, 245, 7, 7, 245, 104, 1, 223, 50, 226, 106, 7, 245, 104, 1, 235, - 194, 193, 7, 245, 104, 1, 240, 155, 232, 130, 7, 245, 104, 1, 254, 24, - 193, 217, 231, 229, 215, 1, 61, 217, 231, 229, 215, 1, 73, 217, 231, 229, - 215, 5, 246, 49, 217, 231, 229, 215, 1, 70, 217, 231, 229, 215, 1, 75, - 217, 231, 229, 215, 1, 76, 217, 231, 229, 215, 5, 241, 254, 217, 231, - 229, 215, 1, 234, 29, 217, 231, 229, 215, 1, 234, 106, 217, 231, 229, - 215, 1, 242, 175, 217, 231, 229, 215, 1, 242, 225, 217, 231, 229, 215, 5, - 254, 76, 217, 231, 229, 215, 1, 249, 239, 217, 231, 229, 215, 1, 250, 87, - 217, 231, 229, 215, 1, 235, 69, 217, 231, 229, 215, 1, 235, 110, 217, - 231, 229, 215, 1, 215, 134, 217, 231, 229, 215, 1, 215, 140, 217, 231, - 229, 215, 1, 248, 106, 217, 231, 229, 215, 1, 248, 115, 217, 231, 229, - 215, 1, 111, 217, 231, 229, 215, 1, 216, 157, 217, 231, 229, 215, 1, 247, - 146, 217, 231, 229, 215, 1, 248, 8, 217, 231, 229, 215, 1, 228, 75, 217, - 231, 229, 215, 1, 225, 17, 217, 231, 229, 215, 1, 225, 122, 217, 231, - 229, 215, 1, 251, 206, 217, 231, 229, 215, 1, 252, 11, 217, 231, 229, - 215, 1, 230, 162, 217, 231, 229, 215, 1, 222, 212, 217, 231, 229, 215, 1, - 232, 157, 217, 231, 229, 215, 1, 222, 166, 217, 231, 229, 215, 1, 219, - 59, 217, 231, 229, 215, 1, 241, 69, 217, 231, 229, 215, 25, 5, 61, 217, - 231, 229, 215, 25, 5, 73, 217, 231, 229, 215, 25, 5, 70, 217, 231, 229, - 215, 25, 5, 75, 217, 231, 229, 215, 25, 5, 226, 184, 217, 231, 229, 215, - 225, 13, 231, 159, 217, 231, 229, 215, 225, 13, 231, 158, 217, 231, 229, - 215, 225, 13, 231, 157, 217, 231, 229, 215, 225, 13, 231, 156, 228, 57, - 235, 241, 244, 3, 123, 224, 22, 228, 57, 235, 241, 244, 3, 123, 242, 28, - 228, 57, 235, 241, 244, 3, 134, 224, 20, 228, 57, 235, 241, 244, 3, 123, - 219, 118, 228, 57, 235, 241, 244, 3, 123, 245, 189, 228, 57, 235, 241, - 244, 3, 134, 219, 117, 228, 57, 235, 241, 224, 23, 78, 228, 57, 235, 241, - 225, 41, 78, 228, 57, 235, 241, 222, 119, 78, 228, 57, 235, 241, 224, 24, - 78, 225, 145, 1, 176, 225, 145, 1, 234, 133, 225, 145, 1, 243, 136, 225, - 145, 1, 229, 78, 225, 145, 1, 251, 34, 225, 145, 1, 250, 158, 225, 145, - 1, 235, 142, 225, 145, 1, 227, 166, 225, 145, 1, 217, 106, 225, 145, 1, - 216, 209, 225, 145, 1, 248, 222, 225, 145, 1, 197, 225, 145, 1, 190, 225, - 145, 1, 225, 148, 225, 145, 1, 252, 192, 225, 145, 1, 185, 225, 145, 1, - 215, 184, 225, 145, 1, 215, 176, 225, 145, 1, 246, 39, 225, 145, 1, 212, - 65, 225, 145, 1, 210, 82, 225, 145, 1, 210, 116, 225, 145, 1, 4, 61, 225, - 145, 1, 191, 225, 145, 1, 205, 225, 145, 1, 233, 136, 225, 145, 1, 220, - 103, 225, 145, 1, 206, 225, 145, 1, 162, 225, 145, 1, 61, 225, 145, 1, - 73, 225, 145, 1, 70, 225, 145, 1, 75, 225, 145, 1, 76, 225, 145, 1, 224, - 89, 225, 145, 1, 211, 165, 225, 145, 1, 244, 197, 225, 145, 1, 243, 30, - 225, 145, 1, 245, 210, 225, 145, 218, 74, 1, 212, 65, 225, 145, 218, 74, - 1, 191, 225, 145, 1, 215, 157, 225, 145, 1, 215, 145, 225, 145, 1, 248, - 136, 225, 145, 1, 228, 111, 225, 145, 1, 254, 142, 191, 225, 145, 1, 213, - 134, 220, 103, 225, 145, 1, 213, 135, 162, 225, 145, 1, 253, 224, 244, - 197, 225, 145, 218, 74, 1, 205, 225, 145, 218, 26, 1, 205, 225, 145, 1, - 251, 0, 225, 145, 219, 156, 241, 237, 78, 225, 145, 52, 241, 237, 78, - 225, 145, 164, 220, 96, 225, 145, 164, 52, 220, 96, 179, 5, 254, 76, 179, - 5, 213, 147, 179, 1, 61, 179, 1, 255, 74, 179, 1, 73, 179, 1, 236, 34, - 179, 1, 70, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 181, - 179, 1, 149, 156, 179, 1, 149, 232, 186, 179, 1, 75, 179, 1, 245, 210, - 179, 1, 254, 202, 179, 1, 76, 179, 1, 226, 184, 179, 1, 253, 193, 179, 1, - 176, 179, 1, 234, 133, 179, 1, 243, 136, 179, 1, 242, 250, 179, 1, 229, - 78, 179, 1, 251, 34, 179, 1, 250, 158, 179, 1, 235, 142, 179, 1, 235, - 115, 179, 1, 227, 166, 179, 1, 215, 157, 179, 1, 215, 145, 179, 1, 248, - 136, 179, 1, 248, 120, 179, 1, 228, 111, 179, 1, 217, 106, 179, 1, 216, - 209, 179, 1, 248, 222, 179, 1, 248, 26, 179, 1, 197, 179, 1, 190, 179, 1, - 225, 148, 179, 1, 252, 192, 179, 1, 252, 19, 179, 1, 185, 179, 1, 191, - 179, 1, 205, 179, 1, 233, 136, 179, 1, 214, 27, 179, 1, 220, 103, 179, 1, - 218, 224, 179, 1, 206, 179, 1, 162, 179, 1, 232, 185, 179, 116, 5, 242, - 45, 179, 25, 5, 255, 74, 179, 25, 5, 73, 179, 25, 5, 236, 34, 179, 25, 5, - 70, 179, 25, 5, 214, 118, 179, 25, 5, 149, 153, 179, 25, 5, 149, 222, - 181, 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 186, 179, 25, 5, 75, - 179, 25, 5, 245, 210, 179, 25, 5, 254, 202, 179, 25, 5, 76, 179, 25, 5, - 226, 184, 179, 25, 5, 253, 193, 179, 5, 213, 152, 179, 248, 179, 179, 52, - 248, 179, 179, 21, 210, 86, 179, 21, 110, 179, 21, 105, 179, 21, 158, - 179, 21, 161, 179, 21, 189, 179, 21, 194, 179, 21, 198, 179, 21, 195, - 179, 21, 200, 38, 84, 21, 210, 86, 38, 84, 21, 110, 38, 84, 21, 105, 38, - 84, 21, 158, 38, 84, 21, 161, 38, 84, 21, 189, 38, 84, 21, 194, 38, 84, - 21, 198, 38, 84, 21, 195, 38, 84, 21, 200, 38, 84, 1, 61, 38, 84, 1, 70, - 38, 84, 1, 176, 38, 84, 1, 197, 38, 84, 1, 190, 38, 84, 1, 205, 38, 84, - 1, 213, 176, 38, 84, 5, 253, 176, 84, 5, 219, 18, 251, 0, 84, 5, 251, 1, - 213, 152, 84, 5, 52, 251, 1, 213, 152, 84, 5, 251, 1, 105, 84, 5, 251, 1, - 158, 84, 5, 251, 1, 253, 176, 84, 5, 224, 125, 84, 243, 101, 244, 104, - 84, 250, 239, 84, 241, 231, 234, 189, 232, 243, 21, 210, 86, 234, 189, - 232, 243, 21, 110, 234, 189, 232, 243, 21, 105, 234, 189, 232, 243, 21, - 158, 234, 189, 232, 243, 21, 161, 234, 189, 232, 243, 21, 189, 234, 189, - 232, 243, 21, 194, 234, 189, 232, 243, 21, 198, 234, 189, 232, 243, 21, - 195, 234, 189, 232, 243, 21, 200, 234, 189, 232, 243, 1, 176, 234, 189, - 232, 243, 1, 234, 133, 234, 189, 232, 243, 1, 243, 136, 234, 189, 232, - 243, 1, 229, 78, 234, 189, 232, 243, 1, 206, 234, 189, 232, 243, 1, 220, - 103, 234, 189, 232, 243, 1, 210, 116, 234, 189, 232, 243, 1, 227, 166, - 234, 189, 232, 243, 1, 217, 106, 234, 189, 232, 243, 1, 240, 227, 234, - 189, 232, 243, 1, 197, 234, 189, 232, 243, 1, 190, 234, 189, 232, 243, 1, - 225, 148, 234, 189, 232, 243, 1, 185, 234, 189, 232, 243, 1, 248, 222, - 234, 189, 232, 243, 1, 252, 192, 234, 189, 232, 243, 1, 205, 234, 189, - 232, 243, 1, 191, 234, 189, 232, 243, 1, 233, 136, 234, 189, 232, 243, 1, - 212, 65, 234, 189, 232, 243, 1, 216, 209, 234, 189, 232, 243, 1, 162, - 234, 189, 232, 243, 1, 214, 27, 234, 189, 232, 243, 1, 251, 34, 234, 189, - 232, 243, 1, 61, 234, 189, 232, 243, 1, 226, 235, 234, 189, 232, 243, 1, - 73, 234, 189, 232, 243, 1, 226, 184, 234, 189, 232, 243, 25, 214, 214, - 234, 189, 232, 243, 25, 75, 234, 189, 232, 243, 25, 70, 234, 189, 232, - 243, 25, 245, 210, 234, 189, 232, 243, 25, 76, 234, 189, 232, 243, 138, - 225, 31, 234, 189, 232, 243, 138, 251, 13, 234, 189, 232, 243, 138, 251, - 14, 225, 31, 234, 189, 232, 243, 5, 249, 78, 234, 189, 232, 243, 5, 219, - 200, 223, 94, 1, 176, 223, 94, 1, 243, 136, 223, 94, 1, 229, 78, 223, 94, - 1, 217, 106, 223, 94, 1, 248, 222, 223, 94, 1, 197, 223, 94, 1, 190, 223, - 94, 1, 252, 192, 223, 94, 1, 185, 223, 94, 1, 251, 34, 223, 94, 1, 235, - 142, 223, 94, 1, 227, 166, 223, 94, 1, 206, 223, 94, 1, 205, 223, 94, 1, - 233, 136, 223, 94, 1, 191, 223, 94, 1, 212, 65, 223, 94, 1, 162, 223, 94, - 1, 231, 125, 223, 94, 1, 229, 57, 223, 94, 1, 229, 149, 223, 94, 1, 227, - 136, 223, 94, 1, 61, 223, 94, 25, 5, 73, 223, 94, 25, 5, 70, 223, 94, 25, - 5, 75, 223, 94, 25, 5, 254, 202, 223, 94, 25, 5, 76, 223, 94, 25, 5, 253, - 193, 223, 94, 25, 5, 245, 56, 223, 94, 25, 5, 245, 234, 223, 94, 116, 5, - 229, 80, 223, 94, 116, 5, 230, 26, 223, 94, 116, 5, 153, 223, 94, 116, 5, - 242, 61, 223, 94, 213, 152, 223, 94, 221, 174, 78, 24, 100, 216, 98, 24, - 100, 216, 97, 24, 100, 216, 95, 24, 100, 216, 100, 24, 100, 223, 22, 24, - 100, 223, 6, 24, 100, 223, 1, 24, 100, 223, 3, 24, 100, 223, 19, 24, 100, - 223, 12, 24, 100, 223, 5, 24, 100, 223, 24, 24, 100, 223, 7, 24, 100, - 223, 26, 24, 100, 223, 23, 24, 100, 230, 214, 24, 100, 230, 205, 24, 100, - 230, 208, 24, 100, 225, 81, 24, 100, 225, 92, 24, 100, 225, 93, 24, 100, - 218, 208, 24, 100, 236, 47, 24, 100, 236, 54, 24, 100, 218, 219, 24, 100, - 218, 206, 24, 100, 225, 131, 24, 100, 241, 168, 24, 100, 218, 203, 155, - 5, 226, 28, 155, 5, 250, 188, 155, 5, 233, 67, 155, 5, 211, 243, 155, 1, - 61, 155, 1, 240, 155, 234, 192, 155, 1, 73, 155, 1, 236, 34, 155, 1, 70, - 155, 1, 226, 91, 250, 164, 155, 1, 229, 79, 233, 29, 155, 1, 229, 79, - 233, 30, 223, 143, 155, 1, 75, 155, 1, 254, 202, 155, 1, 76, 155, 1, 176, - 155, 1, 235, 14, 221, 229, 155, 1, 235, 14, 230, 67, 155, 1, 243, 136, - 155, 1, 243, 137, 230, 67, 155, 1, 229, 78, 155, 1, 251, 34, 155, 1, 251, - 35, 230, 67, 155, 1, 235, 142, 155, 1, 227, 167, 230, 67, 155, 1, 235, - 143, 231, 208, 155, 1, 227, 166, 155, 1, 215, 157, 155, 1, 215, 158, 231, - 208, 155, 1, 248, 136, 155, 1, 248, 137, 231, 208, 155, 1, 229, 230, 230, - 67, 155, 1, 217, 106, 155, 1, 217, 107, 230, 67, 155, 1, 248, 222, 155, - 1, 248, 223, 231, 208, 155, 1, 197, 155, 1, 190, 155, 1, 226, 91, 230, - 67, 155, 1, 252, 192, 155, 1, 252, 193, 230, 67, 155, 1, 185, 155, 1, - 191, 155, 1, 205, 155, 1, 223, 189, 254, 211, 155, 1, 233, 136, 155, 1, - 212, 65, 155, 1, 222, 35, 230, 67, 155, 1, 222, 35, 231, 208, 155, 1, - 206, 155, 1, 162, 155, 5, 250, 189, 216, 251, 155, 25, 5, 217, 48, 155, - 25, 5, 216, 36, 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 70, 155, - 25, 5, 218, 48, 155, 25, 5, 218, 49, 231, 58, 155, 25, 5, 217, 66, 155, - 25, 5, 247, 195, 230, 66, 155, 25, 5, 225, 185, 155, 116, 5, 234, 159, - 155, 116, 5, 225, 197, 155, 116, 5, 251, 20, 155, 226, 41, 155, 43, 223, - 70, 155, 44, 223, 70, 155, 226, 80, 254, 118, 155, 226, 80, 231, 225, - 155, 226, 80, 232, 89, 155, 226, 80, 211, 238, 155, 226, 80, 226, 42, - 155, 226, 80, 232, 206, 155, 226, 80, 232, 83, 155, 226, 80, 254, 250, - 155, 226, 80, 254, 251, 254, 250, 155, 226, 80, 225, 52, 155, 215, 94, - 226, 80, 225, 52, 155, 226, 37, 155, 21, 210, 86, 155, 21, 110, 155, 21, - 105, 155, 21, 158, 155, 21, 161, 155, 21, 189, 155, 21, 194, 155, 21, - 198, 155, 21, 195, 155, 21, 200, 155, 226, 80, 216, 70, 215, 107, 155, - 226, 80, 235, 168, 172, 1, 61, 172, 1, 73, 172, 1, 70, 172, 1, 75, 172, - 1, 254, 202, 172, 1, 76, 172, 1, 176, 172, 1, 234, 133, 172, 1, 243, 136, - 172, 1, 242, 250, 172, 1, 228, 246, 172, 1, 229, 78, 172, 1, 250, 158, - 172, 1, 250, 113, 172, 1, 235, 142, 172, 1, 235, 115, 172, 1, 228, 236, - 172, 1, 228, 238, 172, 1, 228, 237, 172, 1, 217, 106, 172, 1, 216, 209, - 172, 1, 248, 222, 172, 1, 248, 26, 172, 1, 227, 208, 172, 1, 197, 172, 1, - 248, 136, 172, 1, 190, 172, 1, 224, 221, 172, 1, 225, 148, 172, 1, 252, - 192, 172, 1, 252, 19, 172, 1, 230, 96, 172, 1, 185, 172, 1, 252, 112, - 172, 1, 191, 172, 1, 205, 172, 1, 233, 136, 172, 1, 214, 27, 172, 1, 218, - 224, 172, 1, 206, 172, 1, 162, 172, 25, 5, 255, 74, 172, 25, 5, 73, 172, - 25, 5, 236, 34, 172, 25, 5, 245, 196, 172, 25, 5, 70, 172, 25, 5, 226, - 235, 172, 25, 5, 76, 172, 25, 5, 254, 202, 172, 25, 5, 253, 193, 172, 25, - 5, 214, 214, 172, 116, 5, 191, 172, 116, 5, 205, 172, 116, 5, 233, 136, - 172, 116, 5, 212, 65, 172, 1, 40, 235, 24, 172, 1, 40, 243, 203, 172, 1, - 40, 229, 80, 172, 116, 5, 40, 229, 80, 172, 1, 40, 250, 159, 172, 1, 40, - 217, 153, 172, 1, 40, 230, 26, 172, 1, 40, 226, 106, 172, 1, 40, 211, - 117, 172, 1, 40, 153, 172, 1, 40, 156, 172, 1, 40, 218, 227, 172, 116, 5, - 40, 193, 172, 116, 5, 40, 242, 61, 172, 21, 210, 86, 172, 21, 110, 172, - 21, 105, 172, 21, 158, 172, 21, 161, 172, 21, 189, 172, 21, 194, 172, 21, - 198, 172, 21, 195, 172, 21, 200, 172, 224, 142, 218, 252, 172, 224, 142, - 248, 179, 172, 224, 142, 52, 248, 179, 172, 224, 142, 215, 212, 248, 179, - 68, 1, 234, 127, 243, 136, 68, 1, 234, 127, 251, 34, 68, 1, 234, 127, - 250, 158, 68, 1, 234, 127, 235, 142, 68, 1, 234, 127, 235, 115, 68, 1, - 234, 127, 227, 166, 68, 1, 234, 127, 215, 157, 68, 1, 234, 127, 215, 145, - 68, 1, 234, 127, 248, 136, 68, 1, 234, 127, 248, 120, 68, 1, 234, 127, - 248, 26, 68, 1, 234, 127, 197, 68, 1, 234, 127, 206, 68, 1, 234, 127, - 162, 68, 1, 234, 127, 241, 190, 68, 1, 234, 127, 244, 197, 68, 58, 1, - 234, 127, 223, 110, 68, 1, 234, 127, 211, 165, 68, 1, 234, 127, 210, 116, - 68, 1, 234, 127, 205, 68, 232, 146, 234, 127, 226, 254, 68, 232, 146, - 234, 127, 224, 44, 68, 232, 146, 234, 127, 241, 122, 68, 16, 254, 191, - 245, 31, 68, 16, 254, 191, 110, 68, 16, 254, 191, 105, 68, 1, 254, 191, - 205, 68, 5, 226, 24, 234, 214, 216, 31, 39, 208, 1, 121, 234, 29, 39, - 208, 1, 125, 234, 29, 39, 208, 1, 121, 234, 106, 39, 208, 1, 125, 234, - 106, 39, 208, 1, 121, 234, 115, 39, 208, 1, 125, 234, 115, 39, 208, 1, - 121, 242, 175, 39, 208, 1, 125, 242, 175, 39, 208, 1, 121, 229, 5, 39, - 208, 1, 125, 229, 5, 39, 208, 1, 121, 249, 239, 39, 208, 1, 125, 249, - 239, 39, 208, 1, 121, 250, 87, 39, 208, 1, 125, 250, 87, 39, 208, 1, 121, - 219, 59, 39, 208, 1, 125, 219, 59, 39, 208, 1, 121, 227, 135, 39, 208, 1, - 125, 227, 135, 39, 208, 1, 121, 247, 146, 39, 208, 1, 125, 247, 146, 39, - 208, 1, 121, 111, 39, 208, 1, 125, 111, 39, 208, 1, 121, 216, 157, 39, - 208, 1, 125, 216, 157, 39, 208, 1, 121, 228, 75, 39, 208, 1, 125, 228, - 75, 39, 208, 1, 121, 251, 206, 39, 208, 1, 125, 251, 206, 39, 208, 1, - 121, 225, 17, 39, 208, 1, 125, 225, 17, 39, 208, 1, 121, 225, 122, 39, - 208, 1, 125, 225, 122, 39, 208, 1, 121, 244, 44, 39, 208, 1, 125, 244, - 44, 39, 208, 1, 121, 230, 162, 39, 208, 1, 125, 230, 162, 39, 208, 1, - 121, 210, 244, 39, 208, 1, 125, 210, 244, 39, 208, 1, 121, 222, 212, 39, - 208, 1, 125, 222, 212, 39, 208, 1, 121, 232, 157, 39, 208, 1, 125, 232, - 157, 39, 208, 1, 121, 213, 138, 39, 208, 1, 125, 213, 138, 39, 208, 1, - 121, 241, 69, 39, 208, 1, 125, 241, 69, 39, 208, 1, 121, 76, 39, 208, 1, - 125, 76, 39, 208, 231, 205, 234, 231, 39, 208, 25, 255, 74, 39, 208, 25, - 73, 39, 208, 25, 214, 214, 39, 208, 25, 70, 39, 208, 25, 75, 39, 208, 25, - 76, 39, 208, 231, 205, 234, 109, 39, 208, 25, 240, 120, 39, 208, 25, 214, - 213, 39, 208, 25, 214, 229, 39, 208, 25, 253, 191, 39, 208, 25, 253, 168, - 39, 208, 25, 254, 124, 39, 208, 25, 254, 137, 39, 208, 138, 231, 205, - 245, 181, 39, 208, 138, 231, 205, 227, 207, 39, 208, 138, 231, 205, 216, - 157, 39, 208, 138, 231, 205, 219, 43, 39, 208, 16, 234, 14, 39, 208, 16, - 227, 207, 39, 208, 16, 221, 254, 39, 208, 16, 241, 70, 241, 65, 39, 208, - 16, 234, 23, 234, 22, 187, 186, 1, 75, 187, 186, 1, 76, 187, 186, 1, 250, - 158, 187, 186, 1, 227, 166, 187, 186, 1, 215, 157, 187, 186, 1, 215, 145, - 187, 186, 1, 248, 136, 187, 186, 1, 248, 120, 187, 186, 1, 228, 111, 187, - 186, 1, 220, 103, 187, 186, 1, 218, 224, 187, 186, 25, 5, 236, 34, 187, - 186, 25, 5, 214, 118, 187, 186, 25, 5, 255, 38, 187, 186, 25, 5, 253, - 193, 187, 186, 25, 5, 255, 31, 187, 186, 250, 126, 187, 186, 254, 207, - 234, 99, 187, 186, 254, 104, 187, 186, 3, 223, 75, 78, 187, 186, 211, - 209, 223, 75, 78, 187, 186, 25, 5, 213, 147, 187, 186, 213, 152, 29, 3, - 215, 138, 29, 3, 215, 141, 29, 3, 215, 144, 29, 3, 215, 142, 29, 3, 215, - 143, 29, 3, 215, 140, 29, 3, 248, 114, 29, 3, 248, 116, 29, 3, 248, 119, - 29, 3, 248, 117, 29, 3, 248, 118, 29, 3, 248, 115, 29, 3, 246, 29, 29, 3, - 246, 32, 29, 3, 246, 38, 29, 3, 246, 36, 29, 3, 246, 37, 29, 3, 246, 30, - 29, 3, 250, 205, 29, 3, 250, 199, 29, 3, 250, 201, 29, 3, 250, 204, 29, - 3, 250, 202, 29, 3, 250, 203, 29, 3, 250, 200, 29, 3, 252, 112, 29, 3, - 252, 91, 29, 3, 252, 103, 29, 3, 252, 111, 29, 3, 252, 106, 29, 3, 252, - 107, 29, 3, 252, 95, 187, 186, 1, 234, 20, 187, 186, 1, 221, 254, 187, - 186, 1, 233, 110, 187, 186, 1, 230, 173, 187, 186, 1, 190, 187, 186, 1, - 197, 187, 186, 1, 250, 103, 187, 186, 1, 216, 91, 187, 186, 1, 234, 102, - 187, 186, 1, 228, 251, 187, 186, 1, 216, 151, 187, 186, 1, 212, 60, 187, - 186, 1, 211, 69, 187, 186, 1, 240, 217, 187, 186, 1, 214, 190, 187, 186, - 1, 73, 187, 186, 1, 225, 143, 187, 186, 1, 253, 203, 187, 186, 1, 242, - 168, 187, 186, 1, 235, 113, 187, 186, 1, 223, 167, 187, 186, 1, 252, 192, - 187, 186, 1, 235, 101, 187, 186, 1, 247, 220, 187, 186, 1, 242, 222, 187, - 186, 1, 248, 6, 187, 186, 1, 252, 17, 187, 186, 1, 234, 21, 232, 129, - 187, 186, 1, 233, 111, 232, 129, 187, 186, 1, 230, 174, 232, 129, 187, - 186, 1, 226, 91, 232, 129, 187, 186, 1, 229, 230, 232, 129, 187, 186, 1, - 216, 92, 232, 129, 187, 186, 1, 228, 252, 232, 129, 187, 186, 1, 240, - 155, 232, 129, 187, 186, 25, 5, 226, 196, 187, 186, 25, 5, 235, 254, 187, - 186, 25, 5, 254, 123, 187, 186, 25, 5, 211, 38, 187, 186, 25, 5, 219, 33, - 187, 186, 25, 5, 214, 187, 187, 186, 25, 5, 250, 124, 187, 186, 25, 5, - 227, 192, 187, 186, 250, 125, 187, 186, 232, 86, 235, 151, 187, 186, 254, - 47, 235, 151, 187, 186, 21, 210, 86, 187, 186, 21, 110, 187, 186, 21, - 105, 187, 186, 21, 158, 187, 186, 21, 161, 187, 186, 21, 189, 187, 186, - 21, 194, 187, 186, 21, 198, 187, 186, 21, 195, 187, 186, 21, 200, 24, - 143, 227, 78, 24, 143, 227, 83, 24, 143, 210, 243, 24, 143, 210, 242, 24, - 143, 210, 241, 24, 143, 215, 23, 24, 143, 215, 26, 24, 143, 210, 210, 24, - 143, 210, 206, 24, 143, 245, 55, 24, 143, 245, 53, 24, 143, 245, 54, 24, - 143, 245, 51, 24, 143, 240, 145, 24, 143, 240, 144, 24, 143, 240, 142, - 24, 143, 240, 143, 24, 143, 240, 148, 24, 143, 240, 141, 24, 143, 240, - 140, 24, 143, 240, 150, 24, 143, 254, 34, 24, 143, 254, 33, 24, 90, 228, - 220, 24, 90, 228, 226, 24, 90, 218, 205, 24, 90, 218, 204, 24, 90, 216, - 97, 24, 90, 216, 95, 24, 90, 216, 94, 24, 90, 216, 100, 24, 90, 216, 101, - 24, 90, 216, 93, 24, 90, 223, 6, 24, 90, 223, 21, 24, 90, 218, 211, 24, - 90, 223, 18, 24, 90, 223, 8, 24, 90, 223, 10, 24, 90, 222, 253, 24, 90, - 222, 254, 24, 90, 234, 219, 24, 90, 230, 213, 24, 90, 230, 207, 24, 90, - 218, 215, 24, 90, 230, 210, 24, 90, 230, 216, 24, 90, 225, 77, 24, 90, - 225, 86, 24, 90, 225, 90, 24, 90, 218, 213, 24, 90, 225, 80, 24, 90, 225, - 94, 24, 90, 225, 95, 24, 90, 219, 141, 24, 90, 219, 144, 24, 90, 218, - 209, 24, 90, 218, 207, 24, 90, 219, 139, 24, 90, 219, 147, 24, 90, 219, - 148, 24, 90, 219, 133, 24, 90, 219, 146, 24, 90, 226, 31, 24, 90, 226, - 32, 24, 90, 211, 24, 24, 90, 211, 25, 24, 90, 250, 45, 24, 90, 250, 44, - 24, 90, 218, 220, 24, 90, 225, 129, 24, 90, 225, 128, 9, 14, 238, 25, 9, - 14, 238, 24, 9, 14, 238, 23, 9, 14, 238, 22, 9, 14, 238, 21, 9, 14, 238, - 20, 9, 14, 238, 19, 9, 14, 238, 18, 9, 14, 238, 17, 9, 14, 238, 16, 9, - 14, 238, 15, 9, 14, 238, 14, 9, 14, 238, 13, 9, 14, 238, 12, 9, 14, 238, - 11, 9, 14, 238, 10, 9, 14, 238, 9, 9, 14, 238, 8, 9, 14, 238, 7, 9, 14, - 238, 6, 9, 14, 238, 5, 9, 14, 238, 4, 9, 14, 238, 3, 9, 14, 238, 2, 9, - 14, 238, 1, 9, 14, 238, 0, 9, 14, 237, 255, 9, 14, 237, 254, 9, 14, 237, - 253, 9, 14, 237, 252, 9, 14, 237, 251, 9, 14, 237, 250, 9, 14, 237, 249, - 9, 14, 237, 248, 9, 14, 237, 247, 9, 14, 237, 246, 9, 14, 237, 245, 9, - 14, 237, 244, 9, 14, 237, 243, 9, 14, 237, 242, 9, 14, 237, 241, 9, 14, - 237, 240, 9, 14, 237, 239, 9, 14, 237, 238, 9, 14, 237, 237, 9, 14, 237, - 236, 9, 14, 237, 235, 9, 14, 237, 234, 9, 14, 237, 233, 9, 14, 237, 232, - 9, 14, 237, 231, 9, 14, 237, 230, 9, 14, 237, 229, 9, 14, 237, 228, 9, - 14, 237, 227, 9, 14, 237, 226, 9, 14, 237, 225, 9, 14, 237, 224, 9, 14, - 237, 223, 9, 14, 237, 222, 9, 14, 237, 221, 9, 14, 237, 220, 9, 14, 237, - 219, 9, 14, 237, 218, 9, 14, 237, 217, 9, 14, 237, 216, 9, 14, 237, 215, - 9, 14, 237, 214, 9, 14, 237, 213, 9, 14, 237, 212, 9, 14, 237, 211, 9, - 14, 237, 210, 9, 14, 237, 209, 9, 14, 237, 208, 9, 14, 237, 207, 9, 14, - 237, 206, 9, 14, 237, 205, 9, 14, 237, 204, 9, 14, 237, 203, 9, 14, 237, - 202, 9, 14, 237, 201, 9, 14, 237, 200, 9, 14, 237, 199, 9, 14, 237, 198, - 9, 14, 237, 197, 9, 14, 237, 196, 9, 14, 237, 195, 9, 14, 237, 194, 9, - 14, 237, 193, 9, 14, 237, 192, 9, 14, 237, 191, 9, 14, 237, 190, 9, 14, - 237, 189, 9, 14, 237, 188, 9, 14, 237, 187, 9, 14, 237, 186, 9, 14, 237, - 185, 9, 14, 237, 184, 9, 14, 237, 183, 9, 14, 237, 182, 9, 14, 237, 181, - 9, 14, 237, 180, 9, 14, 237, 179, 9, 14, 237, 178, 9, 14, 237, 177, 9, - 14, 237, 176, 9, 14, 237, 175, 9, 14, 237, 174, 9, 14, 237, 173, 9, 14, - 237, 172, 9, 14, 237, 171, 9, 14, 237, 170, 9, 14, 237, 169, 9, 14, 237, - 168, 9, 14, 237, 167, 9, 14, 237, 166, 9, 14, 237, 165, 9, 14, 237, 164, - 9, 14, 237, 163, 9, 14, 237, 162, 9, 14, 237, 161, 9, 14, 237, 160, 9, - 14, 237, 159, 9, 14, 237, 158, 9, 14, 237, 157, 9, 14, 237, 156, 9, 14, - 237, 155, 9, 14, 237, 154, 9, 14, 237, 153, 9, 14, 237, 152, 9, 14, 237, - 151, 9, 14, 237, 150, 9, 14, 237, 149, 9, 14, 237, 148, 9, 14, 237, 147, - 9, 14, 237, 146, 9, 14, 237, 145, 9, 14, 237, 144, 9, 14, 237, 143, 9, - 14, 237, 142, 9, 14, 237, 141, 9, 14, 237, 140, 9, 14, 237, 139, 9, 14, - 237, 138, 9, 14, 237, 137, 9, 14, 237, 136, 9, 14, 237, 135, 9, 14, 237, - 134, 9, 14, 237, 133, 9, 14, 237, 132, 9, 14, 237, 131, 9, 14, 237, 130, - 9, 14, 237, 129, 9, 14, 237, 128, 9, 14, 237, 127, 9, 14, 237, 126, 9, - 14, 237, 125, 9, 14, 237, 124, 9, 14, 237, 123, 9, 14, 237, 122, 9, 14, - 237, 121, 9, 14, 237, 120, 9, 14, 237, 119, 9, 14, 237, 118, 9, 14, 237, - 117, 9, 14, 237, 116, 9, 14, 237, 115, 9, 14, 237, 114, 9, 14, 237, 113, - 9, 14, 237, 112, 9, 14, 237, 111, 9, 14, 237, 110, 9, 14, 237, 109, 9, - 14, 237, 108, 9, 14, 237, 107, 9, 14, 237, 106, 9, 14, 237, 105, 9, 14, - 237, 104, 9, 14, 237, 103, 9, 14, 237, 102, 9, 14, 237, 101, 9, 14, 237, - 100, 9, 14, 237, 99, 9, 14, 237, 98, 9, 14, 237, 97, 9, 14, 237, 96, 9, - 14, 237, 95, 9, 14, 237, 94, 9, 14, 237, 93, 9, 14, 237, 92, 9, 14, 237, - 91, 9, 14, 237, 90, 9, 14, 237, 89, 9, 14, 237, 88, 9, 14, 237, 87, 9, - 14, 237, 86, 9, 14, 237, 85, 9, 14, 237, 84, 9, 14, 237, 83, 9, 14, 237, - 82, 9, 14, 237, 81, 9, 14, 237, 80, 9, 14, 237, 79, 9, 14, 237, 78, 9, - 14, 237, 77, 9, 14, 237, 76, 9, 14, 237, 75, 9, 14, 237, 74, 9, 14, 237, - 73, 9, 14, 237, 72, 9, 14, 237, 71, 9, 14, 237, 70, 9, 14, 237, 69, 9, - 14, 237, 68, 9, 14, 237, 67, 9, 14, 237, 66, 9, 14, 237, 65, 9, 14, 237, - 64, 9, 14, 237, 63, 9, 14, 237, 62, 9, 14, 237, 61, 9, 14, 237, 60, 9, - 14, 237, 59, 9, 14, 237, 58, 9, 14, 237, 57, 9, 14, 237, 56, 9, 14, 237, - 55, 9, 14, 237, 54, 9, 14, 237, 53, 9, 14, 237, 52, 9, 14, 237, 51, 9, - 14, 237, 50, 9, 14, 237, 49, 9, 14, 237, 48, 9, 14, 237, 47, 9, 14, 237, - 46, 9, 14, 237, 45, 9, 14, 237, 44, 9, 14, 237, 43, 9, 14, 237, 42, 9, - 14, 237, 41, 9, 14, 237, 40, 9, 14, 237, 39, 9, 14, 237, 38, 9, 14, 237, - 37, 9, 14, 237, 36, 9, 14, 237, 35, 9, 14, 237, 34, 9, 14, 237, 33, 9, - 14, 237, 32, 9, 14, 237, 31, 9, 14, 237, 30, 9, 14, 237, 29, 9, 14, 237, - 28, 9, 14, 237, 27, 9, 14, 237, 26, 9, 14, 237, 25, 9, 14, 237, 24, 9, - 14, 237, 23, 9, 14, 237, 22, 9, 14, 237, 21, 9, 14, 237, 20, 9, 14, 237, - 19, 9, 14, 237, 18, 9, 14, 237, 17, 9, 14, 237, 16, 9, 14, 237, 15, 9, - 14, 237, 14, 9, 14, 237, 13, 9, 14, 237, 12, 9, 14, 237, 11, 9, 14, 237, - 10, 9, 14, 237, 9, 9, 14, 237, 8, 9, 14, 237, 7, 9, 14, 237, 6, 9, 14, - 237, 5, 9, 14, 237, 4, 9, 14, 237, 3, 9, 14, 237, 2, 9, 14, 237, 1, 9, - 14, 237, 0, 9, 14, 236, 255, 9, 14, 236, 254, 9, 14, 236, 253, 9, 14, - 236, 252, 9, 14, 236, 251, 9, 14, 236, 250, 9, 14, 236, 249, 9, 14, 236, - 248, 9, 14, 236, 247, 9, 14, 236, 246, 9, 14, 236, 245, 9, 14, 236, 244, - 9, 14, 236, 243, 9, 14, 236, 242, 9, 14, 236, 241, 9, 14, 236, 240, 9, - 14, 236, 239, 9, 14, 236, 238, 9, 14, 236, 237, 9, 14, 236, 236, 9, 14, - 236, 235, 9, 14, 236, 234, 9, 14, 236, 233, 9, 14, 236, 232, 9, 14, 236, - 231, 9, 14, 236, 230, 9, 14, 236, 229, 9, 14, 236, 228, 9, 14, 236, 227, - 9, 14, 236, 226, 9, 14, 236, 225, 9, 14, 236, 224, 9, 14, 236, 223, 9, - 14, 236, 222, 9, 14, 236, 221, 9, 14, 236, 220, 9, 14, 236, 219, 9, 14, - 236, 218, 9, 14, 236, 217, 9, 14, 236, 216, 9, 14, 236, 215, 9, 14, 236, - 214, 9, 14, 236, 213, 9, 14, 236, 212, 9, 14, 236, 211, 9, 14, 236, 210, - 9, 14, 236, 209, 9, 14, 236, 208, 9, 14, 236, 207, 9, 14, 236, 206, 9, - 14, 236, 205, 9, 14, 236, 204, 9, 14, 236, 203, 9, 14, 236, 202, 9, 14, - 236, 201, 9, 14, 236, 200, 9, 14, 236, 199, 9, 14, 236, 198, 9, 14, 236, - 197, 9, 14, 236, 196, 9, 14, 236, 195, 9, 14, 236, 194, 9, 14, 236, 193, - 9, 14, 236, 192, 9, 14, 236, 191, 9, 14, 236, 190, 9, 14, 236, 189, 9, - 14, 236, 188, 9, 14, 236, 187, 9, 14, 236, 186, 9, 14, 236, 185, 9, 14, - 236, 184, 9, 14, 236, 183, 9, 14, 236, 182, 9, 14, 236, 181, 9, 14, 236, - 180, 9, 14, 236, 179, 9, 14, 236, 178, 9, 14, 236, 177, 9, 14, 236, 176, - 9, 14, 236, 175, 9, 14, 236, 174, 9, 14, 236, 173, 9, 14, 236, 172, 9, - 14, 236, 171, 9, 14, 236, 170, 9, 14, 236, 169, 9, 14, 236, 168, 9, 14, - 236, 167, 9, 14, 236, 166, 9, 14, 236, 165, 9, 14, 236, 164, 9, 14, 236, - 163, 9, 14, 236, 162, 9, 14, 236, 161, 9, 14, 236, 160, 9, 14, 236, 159, - 9, 14, 236, 158, 9, 14, 236, 157, 9, 14, 236, 156, 9, 14, 236, 155, 9, - 14, 236, 154, 9, 14, 236, 153, 9, 14, 236, 152, 9, 14, 236, 151, 9, 14, - 236, 150, 9, 14, 236, 149, 9, 14, 236, 148, 9, 14, 236, 147, 9, 14, 236, - 146, 9, 14, 236, 145, 9, 14, 236, 144, 9, 14, 236, 143, 9, 14, 236, 142, - 9, 14, 236, 141, 9, 14, 236, 140, 9, 14, 236, 139, 9, 14, 236, 138, 9, - 14, 236, 137, 9, 14, 236, 136, 9, 14, 236, 135, 9, 14, 236, 134, 9, 14, - 236, 133, 9, 14, 236, 132, 9, 14, 236, 131, 9, 14, 236, 130, 9, 14, 236, - 129, 9, 14, 236, 128, 9, 14, 236, 127, 9, 14, 236, 126, 9, 14, 236, 125, - 9, 14, 236, 124, 9, 14, 236, 123, 9, 14, 236, 122, 9, 14, 236, 121, 9, - 14, 236, 120, 9, 14, 236, 119, 9, 14, 236, 118, 9, 14, 236, 117, 9, 14, - 236, 116, 9, 14, 236, 115, 9, 14, 236, 114, 9, 14, 236, 113, 9, 14, 236, - 112, 9, 14, 236, 111, 9, 14, 236, 110, 9, 14, 236, 109, 9, 14, 236, 108, - 9, 14, 236, 107, 9, 14, 236, 106, 9, 14, 236, 105, 9, 14, 236, 104, 9, - 14, 236, 103, 9, 14, 236, 102, 9, 14, 236, 101, 9, 14, 236, 100, 9, 14, - 236, 99, 9, 14, 236, 98, 9, 14, 236, 97, 9, 14, 236, 96, 9, 14, 236, 95, - 9, 14, 236, 94, 9, 14, 236, 93, 9, 14, 236, 92, 9, 14, 236, 91, 9, 14, - 236, 90, 9, 14, 236, 89, 9, 14, 236, 88, 9, 14, 236, 87, 9, 14, 236, 86, - 9, 14, 236, 85, 9, 14, 236, 84, 9, 14, 236, 83, 9, 14, 236, 82, 9, 14, - 236, 81, 9, 14, 236, 80, 9, 14, 236, 79, 9, 14, 236, 78, 9, 14, 236, 77, - 9, 14, 236, 76, 9, 14, 236, 75, 9, 14, 236, 74, 9, 14, 236, 73, 9, 14, - 236, 72, 9, 14, 236, 71, 9, 14, 236, 70, 9, 14, 236, 69, 9, 14, 236, 68, - 9, 14, 236, 67, 9, 14, 236, 66, 7, 4, 27, 244, 126, 7, 4, 27, 244, 122, - 7, 4, 27, 244, 77, 7, 4, 27, 244, 125, 7, 4, 27, 244, 124, 7, 4, 27, 199, - 222, 93, 217, 153, 7, 4, 27, 218, 169, 150, 4, 27, 231, 60, 228, 40, 150, - 4, 27, 231, 60, 245, 214, 150, 4, 27, 231, 60, 235, 228, 150, 4, 27, 213, - 180, 228, 40, 150, 4, 27, 231, 60, 211, 160, 94, 1, 210, 234, 2, 241, - 159, 94, 225, 12, 235, 51, 214, 11, 94, 27, 211, 6, 210, 234, 210, 234, - 225, 240, 94, 1, 254, 140, 253, 163, 94, 1, 211, 247, 254, 171, 94, 1, - 211, 247, 248, 190, 94, 1, 211, 247, 241, 239, 94, 1, 211, 247, 234, 251, - 94, 1, 211, 247, 233, 95, 94, 1, 211, 247, 40, 231, 66, 94, 1, 211, 247, - 223, 68, 94, 1, 211, 247, 217, 39, 94, 1, 254, 140, 96, 50, 94, 1, 220, - 22, 2, 220, 22, 247, 121, 94, 1, 220, 22, 2, 219, 160, 247, 121, 94, 1, - 220, 22, 2, 248, 209, 22, 220, 22, 247, 121, 94, 1, 220, 22, 2, 248, 209, - 22, 219, 160, 247, 121, 94, 1, 112, 2, 225, 240, 94, 1, 112, 2, 224, 77, - 94, 1, 112, 2, 231, 172, 94, 1, 252, 30, 2, 248, 208, 94, 1, 242, 203, 2, - 248, 208, 94, 1, 248, 191, 2, 248, 208, 94, 1, 241, 240, 2, 231, 172, 94, - 1, 214, 4, 2, 248, 208, 94, 1, 210, 98, 2, 248, 208, 94, 1, 216, 232, 2, - 248, 208, 94, 1, 210, 234, 2, 248, 208, 94, 1, 40, 234, 252, 2, 248, 208, - 94, 1, 234, 252, 2, 248, 208, 94, 1, 233, 96, 2, 248, 208, 94, 1, 231, - 67, 2, 248, 208, 94, 1, 227, 196, 2, 248, 208, 94, 1, 221, 251, 2, 248, - 208, 94, 1, 40, 225, 223, 2, 248, 208, 94, 1, 225, 223, 2, 248, 208, 94, - 1, 215, 181, 2, 248, 208, 94, 1, 224, 41, 2, 248, 208, 94, 1, 223, 69, 2, - 248, 208, 94, 1, 220, 22, 2, 248, 208, 94, 1, 217, 40, 2, 248, 208, 94, - 1, 214, 4, 2, 241, 62, 94, 1, 252, 30, 2, 223, 170, 94, 1, 234, 252, 2, - 223, 170, 94, 1, 225, 223, 2, 223, 170, 94, 27, 112, 233, 95, 10, 1, 112, - 212, 47, 53, 17, 10, 1, 112, 212, 47, 40, 17, 10, 1, 252, 66, 53, 17, 10, - 1, 252, 66, 40, 17, 10, 1, 252, 66, 65, 17, 10, 1, 252, 66, 147, 17, 10, - 1, 225, 207, 53, 17, 10, 1, 225, 207, 40, 17, 10, 1, 225, 207, 65, 17, - 10, 1, 225, 207, 147, 17, 10, 1, 252, 54, 53, 17, 10, 1, 252, 54, 40, 17, - 10, 1, 252, 54, 65, 17, 10, 1, 252, 54, 147, 17, 10, 1, 215, 148, 53, 17, - 10, 1, 215, 148, 40, 17, 10, 1, 215, 148, 65, 17, 10, 1, 215, 148, 147, - 17, 10, 1, 217, 7, 53, 17, 10, 1, 217, 7, 40, 17, 10, 1, 217, 7, 65, 17, - 10, 1, 217, 7, 147, 17, 10, 1, 215, 150, 53, 17, 10, 1, 215, 150, 40, 17, - 10, 1, 215, 150, 65, 17, 10, 1, 215, 150, 147, 17, 10, 1, 213, 249, 53, - 17, 10, 1, 213, 249, 40, 17, 10, 1, 213, 249, 65, 17, 10, 1, 213, 249, - 147, 17, 10, 1, 225, 205, 53, 17, 10, 1, 225, 205, 40, 17, 10, 1, 225, - 205, 65, 17, 10, 1, 225, 205, 147, 17, 10, 1, 246, 45, 53, 17, 10, 1, - 246, 45, 40, 17, 10, 1, 246, 45, 65, 17, 10, 1, 246, 45, 147, 17, 10, 1, - 227, 155, 53, 17, 10, 1, 227, 155, 40, 17, 10, 1, 227, 155, 65, 17, 10, - 1, 227, 155, 147, 17, 10, 1, 217, 28, 53, 17, 10, 1, 217, 28, 40, 17, 10, - 1, 217, 28, 65, 17, 10, 1, 217, 28, 147, 17, 10, 1, 217, 26, 53, 17, 10, - 1, 217, 26, 40, 17, 10, 1, 217, 26, 65, 17, 10, 1, 217, 26, 147, 17, 10, - 1, 248, 134, 53, 17, 10, 1, 248, 134, 40, 17, 10, 1, 248, 203, 53, 17, - 10, 1, 248, 203, 40, 17, 10, 1, 246, 72, 53, 17, 10, 1, 246, 72, 40, 17, - 10, 1, 248, 132, 53, 17, 10, 1, 248, 132, 40, 17, 10, 1, 235, 122, 53, - 17, 10, 1, 235, 122, 40, 17, 10, 1, 222, 173, 53, 17, 10, 1, 222, 173, - 40, 17, 10, 1, 234, 176, 53, 17, 10, 1, 234, 176, 40, 17, 10, 1, 234, - 176, 65, 17, 10, 1, 234, 176, 147, 17, 10, 1, 243, 124, 53, 17, 10, 1, - 243, 124, 40, 17, 10, 1, 243, 124, 65, 17, 10, 1, 243, 124, 147, 17, 10, - 1, 242, 103, 53, 17, 10, 1, 242, 103, 40, 17, 10, 1, 242, 103, 65, 17, - 10, 1, 242, 103, 147, 17, 10, 1, 229, 4, 53, 17, 10, 1, 229, 4, 40, 17, - 10, 1, 229, 4, 65, 17, 10, 1, 229, 4, 147, 17, 10, 1, 228, 64, 242, 220, - 53, 17, 10, 1, 228, 64, 242, 220, 40, 17, 10, 1, 222, 216, 53, 17, 10, 1, - 222, 216, 40, 17, 10, 1, 222, 216, 65, 17, 10, 1, 222, 216, 147, 17, 10, - 1, 241, 220, 2, 79, 77, 53, 17, 10, 1, 241, 220, 2, 79, 77, 40, 17, 10, - 1, 241, 220, 242, 173, 53, 17, 10, 1, 241, 220, 242, 173, 40, 17, 10, 1, - 241, 220, 242, 173, 65, 17, 10, 1, 241, 220, 242, 173, 147, 17, 10, 1, - 241, 220, 247, 143, 53, 17, 10, 1, 241, 220, 247, 143, 40, 17, 10, 1, - 241, 220, 247, 143, 65, 17, 10, 1, 241, 220, 247, 143, 147, 17, 10, 1, - 79, 252, 134, 53, 17, 10, 1, 79, 252, 134, 40, 17, 10, 1, 79, 252, 134, - 2, 202, 77, 53, 17, 10, 1, 79, 252, 134, 2, 202, 77, 40, 17, 10, 16, 59, - 48, 10, 16, 59, 51, 10, 16, 113, 170, 48, 10, 16, 113, 170, 51, 10, 16, - 134, 170, 48, 10, 16, 134, 170, 51, 10, 16, 134, 170, 225, 8, 246, 105, - 48, 10, 16, 134, 170, 225, 8, 246, 105, 51, 10, 16, 244, 12, 170, 48, 10, - 16, 244, 12, 170, 51, 10, 16, 52, 67, 252, 142, 51, 10, 16, 113, 170, - 213, 189, 48, 10, 16, 113, 170, 213, 189, 51, 10, 16, 222, 234, 10, 16, - 4, 217, 82, 48, 10, 16, 4, 217, 82, 51, 10, 1, 229, 81, 53, 17, 10, 1, - 229, 81, 40, 17, 10, 1, 229, 81, 65, 17, 10, 1, 229, 81, 147, 17, 10, 1, - 104, 53, 17, 10, 1, 104, 40, 17, 10, 1, 226, 236, 53, 17, 10, 1, 226, - 236, 40, 17, 10, 1, 210, 213, 53, 17, 10, 1, 210, 213, 40, 17, 10, 1, - 104, 2, 202, 77, 53, 17, 10, 1, 214, 0, 53, 17, 10, 1, 214, 0, 40, 17, - 10, 1, 234, 74, 226, 236, 53, 17, 10, 1, 234, 74, 226, 236, 40, 17, 10, - 1, 234, 74, 210, 213, 53, 17, 10, 1, 234, 74, 210, 213, 40, 17, 10, 1, - 160, 53, 17, 10, 1, 160, 40, 17, 10, 1, 160, 65, 17, 10, 1, 160, 147, 17, - 10, 1, 214, 207, 234, 187, 234, 74, 112, 231, 194, 65, 17, 10, 1, 214, - 207, 234, 187, 234, 74, 112, 231, 194, 147, 17, 10, 27, 79, 2, 202, 77, - 2, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 112, 40, 17, 10, 27, 79, 2, - 202, 77, 2, 254, 245, 53, 17, 10, 27, 79, 2, 202, 77, 2, 254, 245, 40, - 17, 10, 27, 79, 2, 202, 77, 2, 212, 31, 53, 17, 10, 27, 79, 2, 202, 77, - 2, 212, 31, 40, 17, 10, 27, 79, 2, 202, 77, 2, 104, 53, 17, 10, 27, 79, - 2, 202, 77, 2, 104, 40, 17, 10, 27, 79, 2, 202, 77, 2, 226, 236, 53, 17, - 10, 27, 79, 2, 202, 77, 2, 226, 236, 40, 17, 10, 27, 79, 2, 202, 77, 2, - 210, 213, 53, 17, 10, 27, 79, 2, 202, 77, 2, 210, 213, 40, 17, 10, 27, - 79, 2, 202, 77, 2, 160, 53, 17, 10, 27, 79, 2, 202, 77, 2, 160, 40, 17, - 10, 27, 79, 2, 202, 77, 2, 160, 65, 17, 10, 27, 214, 207, 234, 74, 79, 2, - 202, 77, 2, 112, 231, 194, 53, 17, 10, 27, 214, 207, 234, 74, 79, 2, 202, - 77, 2, 112, 231, 194, 40, 17, 10, 27, 214, 207, 234, 74, 79, 2, 202, 77, - 2, 112, 231, 194, 65, 17, 10, 1, 244, 169, 79, 53, 17, 10, 1, 244, 169, - 79, 40, 17, 10, 1, 244, 169, 79, 65, 17, 10, 1, 244, 169, 79, 147, 17, - 10, 27, 79, 2, 202, 77, 2, 151, 53, 17, 10, 27, 79, 2, 202, 77, 2, 122, - 53, 17, 10, 27, 79, 2, 202, 77, 2, 66, 53, 17, 10, 27, 79, 2, 202, 77, 2, - 112, 231, 194, 53, 17, 10, 27, 79, 2, 202, 77, 2, 79, 53, 17, 10, 27, - 252, 56, 2, 151, 53, 17, 10, 27, 252, 56, 2, 122, 53, 17, 10, 27, 252, - 56, 2, 234, 131, 53, 17, 10, 27, 252, 56, 2, 66, 53, 17, 10, 27, 252, 56, - 2, 112, 231, 194, 53, 17, 10, 27, 252, 56, 2, 79, 53, 17, 10, 27, 217, 9, - 2, 151, 53, 17, 10, 27, 217, 9, 2, 122, 53, 17, 10, 27, 217, 9, 2, 234, - 131, 53, 17, 10, 27, 217, 9, 2, 66, 53, 17, 10, 27, 217, 9, 2, 112, 231, - 194, 53, 17, 10, 27, 217, 9, 2, 79, 53, 17, 10, 27, 216, 194, 2, 151, 53, - 17, 10, 27, 216, 194, 2, 66, 53, 17, 10, 27, 216, 194, 2, 112, 231, 194, - 53, 17, 10, 27, 216, 194, 2, 79, 53, 17, 10, 27, 151, 2, 122, 53, 17, 10, - 27, 151, 2, 66, 53, 17, 10, 27, 122, 2, 151, 53, 17, 10, 27, 122, 2, 66, - 53, 17, 10, 27, 234, 131, 2, 151, 53, 17, 10, 27, 234, 131, 2, 122, 53, - 17, 10, 27, 234, 131, 2, 66, 53, 17, 10, 27, 221, 168, 2, 151, 53, 17, - 10, 27, 221, 168, 2, 122, 53, 17, 10, 27, 221, 168, 2, 234, 131, 53, 17, - 10, 27, 221, 168, 2, 66, 53, 17, 10, 27, 222, 28, 2, 122, 53, 17, 10, 27, - 222, 28, 2, 66, 53, 17, 10, 27, 248, 218, 2, 151, 53, 17, 10, 27, 248, - 218, 2, 122, 53, 17, 10, 27, 248, 218, 2, 234, 131, 53, 17, 10, 27, 248, - 218, 2, 66, 53, 17, 10, 27, 217, 82, 2, 122, 53, 17, 10, 27, 217, 82, 2, - 66, 53, 17, 10, 27, 210, 112, 2, 66, 53, 17, 10, 27, 254, 198, 2, 151, - 53, 17, 10, 27, 254, 198, 2, 66, 53, 17, 10, 27, 242, 246, 2, 151, 53, - 17, 10, 27, 242, 246, 2, 66, 53, 17, 10, 27, 244, 144, 2, 151, 53, 17, - 10, 27, 244, 144, 2, 122, 53, 17, 10, 27, 244, 144, 2, 234, 131, 53, 17, - 10, 27, 244, 144, 2, 66, 53, 17, 10, 27, 244, 144, 2, 112, 231, 194, 53, - 17, 10, 27, 244, 144, 2, 79, 53, 17, 10, 27, 224, 83, 2, 122, 53, 17, 10, - 27, 224, 83, 2, 66, 53, 17, 10, 27, 224, 83, 2, 112, 231, 194, 53, 17, - 10, 27, 224, 83, 2, 79, 53, 17, 10, 27, 234, 252, 2, 112, 53, 17, 10, 27, - 234, 252, 2, 151, 53, 17, 10, 27, 234, 252, 2, 122, 53, 17, 10, 27, 234, - 252, 2, 234, 131, 53, 17, 10, 27, 234, 252, 2, 233, 104, 53, 17, 10, 27, - 234, 252, 2, 66, 53, 17, 10, 27, 234, 252, 2, 112, 231, 194, 53, 17, 10, - 27, 234, 252, 2, 79, 53, 17, 10, 27, 233, 104, 2, 151, 53, 17, 10, 27, - 233, 104, 2, 122, 53, 17, 10, 27, 233, 104, 2, 234, 131, 53, 17, 10, 27, - 233, 104, 2, 66, 53, 17, 10, 27, 233, 104, 2, 112, 231, 194, 53, 17, 10, - 27, 233, 104, 2, 79, 53, 17, 10, 27, 66, 2, 151, 53, 17, 10, 27, 66, 2, - 122, 53, 17, 10, 27, 66, 2, 234, 131, 53, 17, 10, 27, 66, 2, 66, 53, 17, - 10, 27, 66, 2, 112, 231, 194, 53, 17, 10, 27, 66, 2, 79, 53, 17, 10, 27, - 228, 64, 2, 151, 53, 17, 10, 27, 228, 64, 2, 122, 53, 17, 10, 27, 228, - 64, 2, 234, 131, 53, 17, 10, 27, 228, 64, 2, 66, 53, 17, 10, 27, 228, 64, - 2, 112, 231, 194, 53, 17, 10, 27, 228, 64, 2, 79, 53, 17, 10, 27, 241, - 220, 2, 151, 53, 17, 10, 27, 241, 220, 2, 66, 53, 17, 10, 27, 241, 220, - 2, 112, 231, 194, 53, 17, 10, 27, 241, 220, 2, 79, 53, 17, 10, 27, 79, 2, - 151, 53, 17, 10, 27, 79, 2, 122, 53, 17, 10, 27, 79, 2, 234, 131, 53, 17, - 10, 27, 79, 2, 66, 53, 17, 10, 27, 79, 2, 112, 231, 194, 53, 17, 10, 27, - 79, 2, 79, 53, 17, 10, 27, 216, 204, 2, 218, 24, 112, 53, 17, 10, 27, - 223, 97, 2, 218, 24, 112, 53, 17, 10, 27, 112, 231, 194, 2, 218, 24, 112, - 53, 17, 10, 27, 220, 95, 2, 248, 184, 53, 17, 10, 27, 220, 95, 2, 234, - 205, 53, 17, 10, 27, 220, 95, 2, 244, 167, 53, 17, 10, 27, 220, 95, 2, - 248, 186, 53, 17, 10, 27, 220, 95, 2, 234, 207, 53, 17, 10, 27, 220, 95, - 2, 218, 24, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 223, 97, 40, 17, 10, - 27, 79, 2, 202, 77, 2, 210, 109, 40, 17, 10, 27, 79, 2, 202, 77, 2, 66, - 40, 17, 10, 27, 79, 2, 202, 77, 2, 228, 64, 40, 17, 10, 27, 79, 2, 202, - 77, 2, 112, 231, 194, 40, 17, 10, 27, 79, 2, 202, 77, 2, 79, 40, 17, 10, - 27, 252, 56, 2, 223, 97, 40, 17, 10, 27, 252, 56, 2, 210, 109, 40, 17, - 10, 27, 252, 56, 2, 66, 40, 17, 10, 27, 252, 56, 2, 228, 64, 40, 17, 10, - 27, 252, 56, 2, 112, 231, 194, 40, 17, 10, 27, 252, 56, 2, 79, 40, 17, - 10, 27, 217, 9, 2, 223, 97, 40, 17, 10, 27, 217, 9, 2, 210, 109, 40, 17, - 10, 27, 217, 9, 2, 66, 40, 17, 10, 27, 217, 9, 2, 228, 64, 40, 17, 10, - 27, 217, 9, 2, 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 79, 40, 17, 10, - 27, 216, 194, 2, 223, 97, 40, 17, 10, 27, 216, 194, 2, 210, 109, 40, 17, - 10, 27, 216, 194, 2, 66, 40, 17, 10, 27, 216, 194, 2, 228, 64, 40, 17, - 10, 27, 216, 194, 2, 112, 231, 194, 40, 17, 10, 27, 216, 194, 2, 79, 40, - 17, 10, 27, 244, 144, 2, 112, 231, 194, 40, 17, 10, 27, 244, 144, 2, 79, - 40, 17, 10, 27, 224, 83, 2, 112, 231, 194, 40, 17, 10, 27, 224, 83, 2, - 79, 40, 17, 10, 27, 234, 252, 2, 112, 40, 17, 10, 27, 234, 252, 2, 233, - 104, 40, 17, 10, 27, 234, 252, 2, 66, 40, 17, 10, 27, 234, 252, 2, 112, - 231, 194, 40, 17, 10, 27, 234, 252, 2, 79, 40, 17, 10, 27, 233, 104, 2, - 66, 40, 17, 10, 27, 233, 104, 2, 112, 231, 194, 40, 17, 10, 27, 233, 104, - 2, 79, 40, 17, 10, 27, 66, 2, 112, 40, 17, 10, 27, 66, 2, 66, 40, 17, 10, - 27, 228, 64, 2, 223, 97, 40, 17, 10, 27, 228, 64, 2, 210, 109, 40, 17, - 10, 27, 228, 64, 2, 66, 40, 17, 10, 27, 228, 64, 2, 228, 64, 40, 17, 10, - 27, 228, 64, 2, 112, 231, 194, 40, 17, 10, 27, 228, 64, 2, 79, 40, 17, - 10, 27, 112, 231, 194, 2, 218, 24, 112, 40, 17, 10, 27, 79, 2, 223, 97, - 40, 17, 10, 27, 79, 2, 210, 109, 40, 17, 10, 27, 79, 2, 66, 40, 17, 10, - 27, 79, 2, 228, 64, 40, 17, 10, 27, 79, 2, 112, 231, 194, 40, 17, 10, 27, - 79, 2, 79, 40, 17, 10, 27, 79, 2, 202, 77, 2, 151, 65, 17, 10, 27, 79, 2, - 202, 77, 2, 122, 65, 17, 10, 27, 79, 2, 202, 77, 2, 234, 131, 65, 17, 10, - 27, 79, 2, 202, 77, 2, 66, 65, 17, 10, 27, 79, 2, 202, 77, 2, 241, 220, - 65, 17, 10, 27, 252, 56, 2, 151, 65, 17, 10, 27, 252, 56, 2, 122, 65, 17, - 10, 27, 252, 56, 2, 234, 131, 65, 17, 10, 27, 252, 56, 2, 66, 65, 17, 10, - 27, 252, 56, 2, 241, 220, 65, 17, 10, 27, 217, 9, 2, 151, 65, 17, 10, 27, - 217, 9, 2, 122, 65, 17, 10, 27, 217, 9, 2, 234, 131, 65, 17, 10, 27, 217, - 9, 2, 66, 65, 17, 10, 27, 217, 9, 2, 241, 220, 65, 17, 10, 27, 216, 194, - 2, 66, 65, 17, 10, 27, 151, 2, 122, 65, 17, 10, 27, 151, 2, 66, 65, 17, - 10, 27, 122, 2, 151, 65, 17, 10, 27, 122, 2, 66, 65, 17, 10, 27, 234, - 131, 2, 151, 65, 17, 10, 27, 234, 131, 2, 66, 65, 17, 10, 27, 221, 168, - 2, 151, 65, 17, 10, 27, 221, 168, 2, 122, 65, 17, 10, 27, 221, 168, 2, - 234, 131, 65, 17, 10, 27, 221, 168, 2, 66, 65, 17, 10, 27, 222, 28, 2, - 122, 65, 17, 10, 27, 222, 28, 2, 234, 131, 65, 17, 10, 27, 222, 28, 2, - 66, 65, 17, 10, 27, 248, 218, 2, 151, 65, 17, 10, 27, 248, 218, 2, 122, - 65, 17, 10, 27, 248, 218, 2, 234, 131, 65, 17, 10, 27, 248, 218, 2, 66, - 65, 17, 10, 27, 217, 82, 2, 122, 65, 17, 10, 27, 210, 112, 2, 66, 65, 17, - 10, 27, 254, 198, 2, 151, 65, 17, 10, 27, 254, 198, 2, 66, 65, 17, 10, - 27, 242, 246, 2, 151, 65, 17, 10, 27, 242, 246, 2, 66, 65, 17, 10, 27, - 244, 144, 2, 151, 65, 17, 10, 27, 244, 144, 2, 122, 65, 17, 10, 27, 244, - 144, 2, 234, 131, 65, 17, 10, 27, 244, 144, 2, 66, 65, 17, 10, 27, 224, - 83, 2, 122, 65, 17, 10, 27, 224, 83, 2, 66, 65, 17, 10, 27, 234, 252, 2, - 151, 65, 17, 10, 27, 234, 252, 2, 122, 65, 17, 10, 27, 234, 252, 2, 234, - 131, 65, 17, 10, 27, 234, 252, 2, 233, 104, 65, 17, 10, 27, 234, 252, 2, - 66, 65, 17, 10, 27, 233, 104, 2, 151, 65, 17, 10, 27, 233, 104, 2, 122, - 65, 17, 10, 27, 233, 104, 2, 234, 131, 65, 17, 10, 27, 233, 104, 2, 66, - 65, 17, 10, 27, 233, 104, 2, 241, 220, 65, 17, 10, 27, 66, 2, 151, 65, - 17, 10, 27, 66, 2, 122, 65, 17, 10, 27, 66, 2, 234, 131, 65, 17, 10, 27, - 66, 2, 66, 65, 17, 10, 27, 228, 64, 2, 151, 65, 17, 10, 27, 228, 64, 2, - 122, 65, 17, 10, 27, 228, 64, 2, 234, 131, 65, 17, 10, 27, 228, 64, 2, - 66, 65, 17, 10, 27, 228, 64, 2, 241, 220, 65, 17, 10, 27, 241, 220, 2, - 151, 65, 17, 10, 27, 241, 220, 2, 66, 65, 17, 10, 27, 241, 220, 2, 218, - 24, 112, 65, 17, 10, 27, 79, 2, 151, 65, 17, 10, 27, 79, 2, 122, 65, 17, - 10, 27, 79, 2, 234, 131, 65, 17, 10, 27, 79, 2, 66, 65, 17, 10, 27, 79, - 2, 241, 220, 65, 17, 10, 27, 79, 2, 202, 77, 2, 66, 147, 17, 10, 27, 79, - 2, 202, 77, 2, 241, 220, 147, 17, 10, 27, 252, 56, 2, 66, 147, 17, 10, - 27, 252, 56, 2, 241, 220, 147, 17, 10, 27, 217, 9, 2, 66, 147, 17, 10, - 27, 217, 9, 2, 241, 220, 147, 17, 10, 27, 216, 194, 2, 66, 147, 17, 10, - 27, 216, 194, 2, 241, 220, 147, 17, 10, 27, 221, 168, 2, 66, 147, 17, 10, - 27, 221, 168, 2, 241, 220, 147, 17, 10, 27, 220, 61, 2, 66, 147, 17, 10, - 27, 220, 61, 2, 241, 220, 147, 17, 10, 27, 234, 252, 2, 233, 104, 147, - 17, 10, 27, 234, 252, 2, 66, 147, 17, 10, 27, 233, 104, 2, 66, 147, 17, - 10, 27, 228, 64, 2, 66, 147, 17, 10, 27, 228, 64, 2, 241, 220, 147, 17, - 10, 27, 79, 2, 66, 147, 17, 10, 27, 79, 2, 241, 220, 147, 17, 10, 27, - 220, 95, 2, 244, 167, 147, 17, 10, 27, 220, 95, 2, 248, 186, 147, 17, 10, - 27, 220, 95, 2, 234, 207, 147, 17, 10, 27, 217, 82, 2, 112, 231, 194, 53, - 17, 10, 27, 217, 82, 2, 79, 53, 17, 10, 27, 254, 198, 2, 112, 231, 194, - 53, 17, 10, 27, 254, 198, 2, 79, 53, 17, 10, 27, 242, 246, 2, 112, 231, - 194, 53, 17, 10, 27, 242, 246, 2, 79, 53, 17, 10, 27, 221, 168, 2, 112, - 231, 194, 53, 17, 10, 27, 221, 168, 2, 79, 53, 17, 10, 27, 220, 61, 2, - 112, 231, 194, 53, 17, 10, 27, 220, 61, 2, 79, 53, 17, 10, 27, 122, 2, - 112, 231, 194, 53, 17, 10, 27, 122, 2, 79, 53, 17, 10, 27, 151, 2, 112, - 231, 194, 53, 17, 10, 27, 151, 2, 79, 53, 17, 10, 27, 234, 131, 2, 112, - 231, 194, 53, 17, 10, 27, 234, 131, 2, 79, 53, 17, 10, 27, 222, 28, 2, - 112, 231, 194, 53, 17, 10, 27, 222, 28, 2, 79, 53, 17, 10, 27, 248, 218, - 2, 112, 231, 194, 53, 17, 10, 27, 248, 218, 2, 79, 53, 17, 10, 27, 220, - 61, 2, 151, 53, 17, 10, 27, 220, 61, 2, 122, 53, 17, 10, 27, 220, 61, 2, - 234, 131, 53, 17, 10, 27, 220, 61, 2, 66, 53, 17, 10, 27, 220, 61, 2, - 223, 97, 53, 17, 10, 27, 221, 168, 2, 223, 97, 53, 17, 10, 27, 222, 28, - 2, 223, 97, 53, 17, 10, 27, 248, 218, 2, 223, 97, 53, 17, 10, 27, 217, - 82, 2, 112, 231, 194, 40, 17, 10, 27, 217, 82, 2, 79, 40, 17, 10, 27, - 254, 198, 2, 112, 231, 194, 40, 17, 10, 27, 254, 198, 2, 79, 40, 17, 10, - 27, 242, 246, 2, 112, 231, 194, 40, 17, 10, 27, 242, 246, 2, 79, 40, 17, - 10, 27, 221, 168, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 79, 40, - 17, 10, 27, 220, 61, 2, 112, 231, 194, 40, 17, 10, 27, 220, 61, 2, 79, - 40, 17, 10, 27, 122, 2, 112, 231, 194, 40, 17, 10, 27, 122, 2, 79, 40, - 17, 10, 27, 151, 2, 112, 231, 194, 40, 17, 10, 27, 151, 2, 79, 40, 17, - 10, 27, 234, 131, 2, 112, 231, 194, 40, 17, 10, 27, 234, 131, 2, 79, 40, - 17, 10, 27, 222, 28, 2, 112, 231, 194, 40, 17, 10, 27, 222, 28, 2, 79, - 40, 17, 10, 27, 248, 218, 2, 112, 231, 194, 40, 17, 10, 27, 248, 218, 2, - 79, 40, 17, 10, 27, 220, 61, 2, 151, 40, 17, 10, 27, 220, 61, 2, 122, 40, - 17, 10, 27, 220, 61, 2, 234, 131, 40, 17, 10, 27, 220, 61, 2, 66, 40, 17, - 10, 27, 220, 61, 2, 223, 97, 40, 17, 10, 27, 221, 168, 2, 223, 97, 40, - 17, 10, 27, 222, 28, 2, 223, 97, 40, 17, 10, 27, 248, 218, 2, 223, 97, - 40, 17, 10, 27, 220, 61, 2, 151, 65, 17, 10, 27, 220, 61, 2, 122, 65, 17, - 10, 27, 220, 61, 2, 234, 131, 65, 17, 10, 27, 220, 61, 2, 66, 65, 17, 10, - 27, 221, 168, 2, 241, 220, 65, 17, 10, 27, 220, 61, 2, 241, 220, 65, 17, - 10, 27, 217, 82, 2, 66, 65, 17, 10, 27, 221, 168, 2, 151, 147, 17, 10, - 27, 221, 168, 2, 122, 147, 17, 10, 27, 221, 168, 2, 234, 131, 147, 17, - 10, 27, 220, 61, 2, 151, 147, 17, 10, 27, 220, 61, 2, 122, 147, 17, 10, - 27, 220, 61, 2, 234, 131, 147, 17, 10, 27, 217, 82, 2, 66, 147, 17, 10, - 27, 210, 112, 2, 66, 147, 17, 10, 27, 112, 2, 244, 165, 40, 17, 10, 27, - 112, 2, 244, 165, 53, 17, 226, 147, 43, 226, 4, 226, 147, 44, 226, 4, 10, - 27, 217, 9, 2, 151, 2, 66, 65, 17, 10, 27, 217, 9, 2, 122, 2, 151, 40, - 17, 10, 27, 217, 9, 2, 122, 2, 151, 65, 17, 10, 27, 217, 9, 2, 122, 2, - 66, 65, 17, 10, 27, 217, 9, 2, 234, 131, 2, 66, 65, 17, 10, 27, 217, 9, - 2, 66, 2, 151, 65, 17, 10, 27, 217, 9, 2, 66, 2, 122, 65, 17, 10, 27, - 217, 9, 2, 66, 2, 234, 131, 65, 17, 10, 27, 151, 2, 66, 2, 122, 40, 17, - 10, 27, 151, 2, 66, 2, 122, 65, 17, 10, 27, 122, 2, 66, 2, 79, 40, 17, - 10, 27, 122, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 122, - 2, 151, 65, 17, 10, 27, 221, 168, 2, 151, 2, 122, 65, 17, 10, 27, 221, - 168, 2, 151, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 66, 2, 122, - 40, 17, 10, 27, 221, 168, 2, 66, 2, 122, 65, 17, 10, 27, 221, 168, 2, 66, - 2, 151, 65, 17, 10, 27, 221, 168, 2, 66, 2, 66, 40, 17, 10, 27, 221, 168, - 2, 66, 2, 66, 65, 17, 10, 27, 222, 28, 2, 122, 2, 122, 40, 17, 10, 27, - 222, 28, 2, 122, 2, 122, 65, 17, 10, 27, 222, 28, 2, 66, 2, 66, 40, 17, - 10, 27, 220, 61, 2, 122, 2, 66, 40, 17, 10, 27, 220, 61, 2, 122, 2, 66, - 65, 17, 10, 27, 220, 61, 2, 151, 2, 79, 40, 17, 10, 27, 220, 61, 2, 66, - 2, 234, 131, 40, 17, 10, 27, 220, 61, 2, 66, 2, 234, 131, 65, 17, 10, 27, - 220, 61, 2, 66, 2, 66, 40, 17, 10, 27, 220, 61, 2, 66, 2, 66, 65, 17, 10, - 27, 248, 218, 2, 122, 2, 112, 231, 194, 40, 17, 10, 27, 248, 218, 2, 234, - 131, 2, 66, 40, 17, 10, 27, 248, 218, 2, 234, 131, 2, 66, 65, 17, 10, 27, - 217, 82, 2, 66, 2, 122, 40, 17, 10, 27, 217, 82, 2, 66, 2, 122, 65, 17, - 10, 27, 217, 82, 2, 66, 2, 66, 65, 17, 10, 27, 217, 82, 2, 66, 2, 79, 40, - 17, 10, 27, 254, 198, 2, 151, 2, 66, 40, 17, 10, 27, 254, 198, 2, 66, 2, - 66, 40, 17, 10, 27, 254, 198, 2, 66, 2, 66, 65, 17, 10, 27, 254, 198, 2, - 66, 2, 112, 231, 194, 40, 17, 10, 27, 242, 246, 2, 66, 2, 66, 40, 17, 10, - 27, 242, 246, 2, 66, 2, 79, 40, 17, 10, 27, 242, 246, 2, 66, 2, 112, 231, - 194, 40, 17, 10, 27, 244, 144, 2, 234, 131, 2, 66, 40, 17, 10, 27, 244, - 144, 2, 234, 131, 2, 66, 65, 17, 10, 27, 224, 83, 2, 66, 2, 122, 40, 17, - 10, 27, 224, 83, 2, 66, 2, 66, 40, 17, 10, 27, 233, 104, 2, 122, 2, 66, - 40, 17, 10, 27, 233, 104, 2, 122, 2, 79, 40, 17, 10, 27, 233, 104, 2, - 122, 2, 112, 231, 194, 40, 17, 10, 27, 233, 104, 2, 151, 2, 151, 65, 17, - 10, 27, 233, 104, 2, 151, 2, 151, 40, 17, 10, 27, 233, 104, 2, 234, 131, - 2, 66, 40, 17, 10, 27, 233, 104, 2, 234, 131, 2, 66, 65, 17, 10, 27, 233, - 104, 2, 66, 2, 122, 40, 17, 10, 27, 233, 104, 2, 66, 2, 122, 65, 17, 10, - 27, 66, 2, 122, 2, 151, 65, 17, 10, 27, 66, 2, 122, 2, 66, 65, 17, 10, - 27, 66, 2, 122, 2, 79, 40, 17, 10, 27, 66, 2, 151, 2, 122, 65, 17, 10, - 27, 66, 2, 151, 2, 66, 65, 17, 10, 27, 66, 2, 234, 131, 2, 151, 65, 17, - 10, 27, 66, 2, 234, 131, 2, 66, 65, 17, 10, 27, 66, 2, 151, 2, 234, 131, - 65, 17, 10, 27, 241, 220, 2, 66, 2, 151, 65, 17, 10, 27, 241, 220, 2, 66, - 2, 66, 65, 17, 10, 27, 228, 64, 2, 122, 2, 66, 65, 17, 10, 27, 228, 64, - 2, 122, 2, 112, 231, 194, 40, 17, 10, 27, 228, 64, 2, 151, 2, 66, 40, 17, - 10, 27, 228, 64, 2, 151, 2, 66, 65, 17, 10, 27, 228, 64, 2, 151, 2, 112, - 231, 194, 40, 17, 10, 27, 228, 64, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64, - 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 79, 2, 66, 2, 66, 40, 17, 10, - 27, 79, 2, 66, 2, 66, 65, 17, 10, 27, 252, 56, 2, 234, 131, 2, 79, 40, - 17, 10, 27, 217, 9, 2, 151, 2, 79, 40, 17, 10, 27, 217, 9, 2, 151, 2, - 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 234, 131, 2, 79, 40, 17, 10, - 27, 217, 9, 2, 234, 131, 2, 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 66, - 2, 79, 40, 17, 10, 27, 217, 9, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, - 151, 2, 66, 2, 79, 40, 17, 10, 27, 151, 2, 122, 2, 112, 231, 194, 40, 17, - 10, 27, 151, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 234, - 131, 2, 112, 231, 194, 40, 17, 10, 27, 222, 28, 2, 122, 2, 79, 40, 17, - 10, 27, 220, 61, 2, 122, 2, 79, 40, 17, 10, 27, 248, 218, 2, 122, 2, 79, - 40, 17, 10, 27, 233, 104, 2, 151, 2, 79, 40, 17, 10, 27, 233, 104, 2, 66, - 2, 79, 40, 17, 10, 27, 79, 2, 122, 2, 79, 40, 17, 10, 27, 79, 2, 151, 2, - 79, 40, 17, 10, 27, 79, 2, 66, 2, 79, 40, 17, 10, 27, 66, 2, 66, 2, 79, - 40, 17, 10, 27, 224, 83, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64, 2, 122, - 2, 79, 40, 17, 10, 27, 224, 83, 2, 66, 2, 122, 65, 17, 10, 27, 233, 104, - 2, 122, 2, 66, 65, 17, 10, 27, 254, 198, 2, 66, 2, 79, 40, 17, 10, 27, - 234, 252, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64, 2, 151, 2, 122, 65, 17, - 10, 27, 66, 2, 234, 131, 2, 79, 40, 17, 10, 27, 233, 104, 2, 151, 2, 66, - 65, 17, 10, 27, 234, 252, 2, 66, 2, 66, 40, 17, 10, 27, 233, 104, 2, 151, - 2, 66, 40, 17, 10, 27, 228, 64, 2, 151, 2, 122, 40, 17, 10, 27, 151, 2, - 122, 2, 79, 40, 17, 10, 27, 122, 2, 151, 2, 79, 40, 17, 10, 27, 66, 2, - 151, 2, 79, 40, 17, 10, 27, 244, 144, 2, 66, 2, 79, 40, 17, 10, 27, 252, - 56, 2, 122, 2, 79, 40, 17, 10, 27, 234, 252, 2, 66, 2, 66, 65, 17, 10, - 27, 254, 198, 2, 151, 2, 66, 65, 17, 10, 27, 222, 28, 2, 66, 2, 66, 65, - 17, 10, 27, 221, 168, 2, 234, 131, 2, 79, 40, 17, 10, 27, 228, 64, 2, - 151, 2, 79, 40, 17, 10, 27, 222, 5, 214, 128, 253, 239, 234, 5, 218, 131, - 5, 53, 17, 10, 27, 224, 79, 214, 128, 253, 239, 234, 5, 218, 131, 5, 53, - 17, 10, 27, 254, 154, 53, 17, 10, 27, 254, 184, 53, 17, 10, 27, 230, 154, - 53, 17, 10, 27, 222, 6, 53, 17, 10, 27, 223, 144, 53, 17, 10, 27, 254, - 173, 53, 17, 10, 27, 212, 49, 53, 17, 10, 27, 222, 5, 53, 17, 10, 27, - 222, 4, 254, 173, 212, 48, 10, 27, 235, 135, 223, 35, 50, 10, 27, 251, - 231, 254, 40, 254, 41, 45, 221, 157, 45, 221, 46, 45, 220, 234, 45, 220, - 223, 45, 220, 212, 45, 220, 201, 45, 220, 190, 45, 220, 179, 45, 220, - 168, 45, 221, 156, 45, 221, 145, 45, 221, 134, 45, 221, 123, 45, 221, - 112, 45, 221, 101, 45, 221, 90, 224, 195, 244, 21, 31, 67, 249, 220, 224, - 195, 244, 21, 31, 67, 109, 249, 220, 224, 195, 244, 21, 31, 67, 109, 243, - 230, 218, 130, 224, 195, 244, 21, 31, 67, 249, 227, 224, 195, 244, 21, - 31, 67, 220, 151, 224, 195, 244, 21, 31, 67, 245, 32, 78, 224, 195, 244, - 21, 31, 67, 224, 14, 78, 224, 195, 244, 21, 31, 67, 43, 71, 233, 21, 127, - 224, 195, 244, 21, 31, 67, 44, 71, 233, 21, 251, 157, 224, 195, 244, 21, - 31, 67, 203, 245, 164, 38, 27, 43, 242, 28, 38, 27, 44, 242, 28, 38, 52, - 216, 90, 43, 242, 28, 38, 52, 216, 90, 44, 242, 28, 38, 231, 234, 43, - 242, 28, 38, 231, 234, 44, 242, 28, 38, 249, 198, 231, 233, 224, 195, - 244, 21, 31, 67, 113, 59, 233, 57, 224, 195, 244, 21, 31, 67, 245, 161, - 248, 157, 224, 195, 244, 21, 31, 67, 245, 152, 248, 157, 224, 195, 244, - 21, 31, 67, 121, 232, 214, 224, 195, 244, 21, 31, 67, 212, 32, 121, 232, - 214, 224, 195, 244, 21, 31, 67, 43, 226, 4, 224, 195, 244, 21, 31, 67, - 44, 226, 4, 224, 195, 244, 21, 31, 67, 43, 249, 100, 127, 224, 195, 244, - 21, 31, 67, 44, 249, 100, 127, 224, 195, 244, 21, 31, 67, 43, 216, 7, - 220, 54, 127, 224, 195, 244, 21, 31, 67, 44, 216, 7, 220, 54, 127, 224, - 195, 244, 21, 31, 67, 43, 85, 233, 21, 127, 224, 195, 244, 21, 31, 67, - 44, 85, 233, 21, 127, 224, 195, 244, 21, 31, 67, 43, 52, 254, 111, 127, - 224, 195, 244, 21, 31, 67, 44, 52, 254, 111, 127, 224, 195, 244, 21, 31, - 67, 43, 254, 111, 127, 224, 195, 244, 21, 31, 67, 44, 254, 111, 127, 224, - 195, 244, 21, 31, 67, 43, 249, 162, 127, 224, 195, 244, 21, 31, 67, 44, - 249, 162, 127, 224, 195, 244, 21, 31, 67, 43, 71, 249, 162, 127, 224, - 195, 244, 21, 31, 67, 44, 71, 249, 162, 127, 220, 132, 247, 121, 71, 220, - 132, 247, 121, 224, 195, 244, 21, 31, 67, 43, 42, 127, 224, 195, 244, 21, - 31, 67, 44, 42, 127, 248, 156, 226, 120, 250, 173, 226, 120, 212, 32, - 226, 120, 52, 212, 32, 226, 120, 248, 156, 121, 232, 214, 250, 173, 121, - 232, 214, 212, 32, 121, 232, 214, 4, 249, 220, 4, 109, 249, 220, 4, 243, - 230, 218, 130, 4, 220, 151, 4, 249, 227, 4, 224, 14, 78, 4, 245, 32, 78, - 4, 245, 161, 248, 157, 4, 43, 226, 4, 4, 44, 226, 4, 4, 43, 249, 100, - 127, 4, 44, 249, 100, 127, 4, 43, 216, 7, 220, 54, 127, 4, 44, 216, 7, - 220, 54, 127, 4, 54, 50, 4, 254, 127, 4, 253, 217, 4, 96, 50, 4, 240, - 168, 4, 233, 16, 50, 4, 242, 131, 50, 4, 245, 99, 50, 4, 223, 51, 219, - 47, 4, 247, 133, 50, 4, 225, 183, 50, 4, 249, 218, 253, 207, 10, 244, - 165, 53, 17, 10, 217, 45, 2, 244, 165, 48, 10, 248, 184, 53, 17, 10, 217, - 79, 244, 2, 10, 234, 205, 53, 17, 10, 244, 167, 53, 17, 10, 244, 167, - 147, 17, 10, 248, 186, 53, 17, 10, 248, 186, 147, 17, 10, 234, 207, 53, - 17, 10, 234, 207, 147, 17, 10, 220, 95, 53, 17, 10, 220, 95, 147, 17, 10, - 218, 47, 53, 17, 10, 218, 47, 147, 17, 10, 1, 202, 53, 17, 10, 1, 112, 2, - 231, 229, 77, 53, 17, 10, 1, 112, 2, 231, 229, 77, 40, 17, 10, 1, 112, 2, - 202, 77, 53, 17, 10, 1, 112, 2, 202, 77, 40, 17, 10, 1, 212, 31, 2, 202, - 77, 53, 17, 10, 1, 212, 31, 2, 202, 77, 40, 17, 10, 1, 112, 2, 202, 252, - 44, 53, 17, 10, 1, 112, 2, 202, 252, 44, 40, 17, 10, 1, 79, 2, 202, 77, - 53, 17, 10, 1, 79, 2, 202, 77, 40, 17, 10, 1, 79, 2, 202, 77, 65, 17, 10, - 1, 79, 2, 202, 77, 147, 17, 10, 1, 112, 53, 17, 10, 1, 112, 40, 17, 10, - 1, 252, 56, 53, 17, 10, 1, 252, 56, 40, 17, 10, 1, 252, 56, 65, 17, 10, - 1, 252, 56, 147, 17, 10, 1, 217, 9, 231, 166, 53, 17, 10, 1, 217, 9, 231, - 166, 40, 17, 10, 1, 217, 9, 53, 17, 10, 1, 217, 9, 40, 17, 10, 1, 217, 9, - 65, 17, 10, 1, 217, 9, 147, 17, 10, 1, 216, 194, 53, 17, 10, 1, 216, 194, - 40, 17, 10, 1, 216, 194, 65, 17, 10, 1, 216, 194, 147, 17, 10, 1, 151, - 53, 17, 10, 1, 151, 40, 17, 10, 1, 151, 65, 17, 10, 1, 151, 147, 17, 10, - 1, 122, 53, 17, 10, 1, 122, 40, 17, 10, 1, 122, 65, 17, 10, 1, 122, 147, - 17, 10, 1, 234, 131, 53, 17, 10, 1, 234, 131, 40, 17, 10, 1, 234, 131, - 65, 17, 10, 1, 234, 131, 147, 17, 10, 1, 248, 197, 53, 17, 10, 1, 248, - 197, 40, 17, 10, 1, 216, 204, 53, 17, 10, 1, 216, 204, 40, 17, 10, 1, - 223, 97, 53, 17, 10, 1, 223, 97, 40, 17, 10, 1, 210, 109, 53, 17, 10, 1, - 210, 109, 40, 17, 10, 1, 221, 168, 53, 17, 10, 1, 221, 168, 40, 17, 10, - 1, 221, 168, 65, 17, 10, 1, 221, 168, 147, 17, 10, 1, 220, 61, 53, 17, - 10, 1, 220, 61, 40, 17, 10, 1, 220, 61, 65, 17, 10, 1, 220, 61, 147, 17, - 10, 1, 222, 28, 53, 17, 10, 1, 222, 28, 40, 17, 10, 1, 222, 28, 65, 17, - 10, 1, 222, 28, 147, 17, 10, 1, 248, 218, 53, 17, 10, 1, 248, 218, 40, - 17, 10, 1, 248, 218, 65, 17, 10, 1, 248, 218, 147, 17, 10, 1, 217, 82, - 53, 17, 10, 1, 217, 82, 40, 17, 10, 1, 217, 82, 65, 17, 10, 1, 217, 82, - 147, 17, 10, 1, 210, 112, 53, 17, 10, 1, 210, 112, 40, 17, 10, 1, 210, - 112, 65, 17, 10, 1, 210, 112, 147, 17, 10, 1, 254, 198, 53, 17, 10, 1, - 254, 198, 40, 17, 10, 1, 254, 198, 65, 17, 10, 1, 254, 198, 147, 17, 10, - 1, 242, 246, 53, 17, 10, 1, 242, 246, 40, 17, 10, 1, 242, 246, 65, 17, - 10, 1, 242, 246, 147, 17, 10, 1, 244, 144, 53, 17, 10, 1, 244, 144, 40, - 17, 10, 1, 244, 144, 65, 17, 10, 1, 244, 144, 147, 17, 10, 1, 224, 83, - 53, 17, 10, 1, 224, 83, 40, 17, 10, 1, 224, 83, 65, 17, 10, 1, 224, 83, - 147, 17, 10, 1, 234, 252, 53, 17, 10, 1, 234, 252, 40, 17, 10, 1, 234, - 252, 65, 17, 10, 1, 234, 252, 147, 17, 10, 1, 233, 104, 53, 17, 10, 1, - 233, 104, 40, 17, 10, 1, 233, 104, 65, 17, 10, 1, 233, 104, 147, 17, 10, - 1, 66, 53, 17, 10, 1, 66, 40, 17, 10, 1, 66, 65, 17, 10, 1, 66, 147, 17, - 10, 1, 228, 64, 53, 17, 10, 1, 228, 64, 40, 17, 10, 1, 228, 64, 65, 17, - 10, 1, 228, 64, 147, 17, 10, 1, 241, 220, 53, 17, 10, 1, 241, 220, 40, - 17, 10, 1, 241, 220, 65, 17, 10, 1, 241, 220, 147, 17, 10, 1, 212, 31, - 53, 17, 10, 1, 212, 31, 40, 17, 10, 1, 112, 231, 194, 53, 17, 10, 1, 112, - 231, 194, 40, 17, 10, 1, 79, 53, 17, 10, 1, 79, 40, 17, 10, 1, 79, 65, - 17, 10, 1, 79, 147, 17, 10, 27, 233, 104, 2, 112, 2, 231, 229, 77, 53, - 17, 10, 27, 233, 104, 2, 112, 2, 231, 229, 77, 40, 17, 10, 27, 233, 104, - 2, 112, 2, 202, 77, 53, 17, 10, 27, 233, 104, 2, 112, 2, 202, 77, 40, 17, - 10, 27, 233, 104, 2, 112, 2, 202, 252, 44, 53, 17, 10, 27, 233, 104, 2, - 112, 2, 202, 252, 44, 40, 17, 10, 27, 233, 104, 2, 112, 53, 17, 10, 27, - 233, 104, 2, 112, 40, 17, 210, 87, 211, 245, 228, 74, 219, 19, 126, 245, - 32, 78, 126, 223, 255, 78, 126, 54, 50, 126, 247, 133, 50, 126, 225, 183, - 50, 126, 254, 127, 126, 254, 58, 126, 43, 226, 4, 126, 44, 226, 4, 126, - 253, 217, 126, 96, 50, 126, 249, 220, 126, 240, 168, 126, 243, 230, 218, - 130, 126, 219, 47, 126, 21, 210, 86, 126, 21, 110, 126, 21, 105, 126, 21, - 158, 126, 21, 161, 126, 21, 189, 126, 21, 194, 126, 21, 198, 126, 21, - 195, 126, 21, 200, 126, 249, 227, 126, 220, 151, 126, 233, 16, 50, 126, - 245, 99, 50, 126, 242, 131, 50, 126, 224, 14, 78, 126, 249, 218, 253, - 207, 126, 7, 6, 1, 61, 126, 7, 6, 1, 253, 159, 126, 7, 6, 1, 251, 67, - 126, 7, 6, 1, 249, 61, 126, 7, 6, 1, 75, 126, 7, 6, 1, 245, 7, 126, 7, 6, - 1, 243, 203, 126, 7, 6, 1, 242, 61, 126, 7, 6, 1, 73, 126, 7, 6, 1, 235, - 145, 126, 7, 6, 1, 235, 24, 126, 7, 6, 1, 156, 126, 7, 6, 1, 193, 126, 7, - 6, 1, 230, 26, 126, 7, 6, 1, 76, 126, 7, 6, 1, 226, 106, 126, 7, 6, 1, - 224, 97, 126, 7, 6, 1, 153, 126, 7, 6, 1, 222, 92, 126, 7, 6, 1, 217, - 153, 126, 7, 6, 1, 70, 126, 7, 6, 1, 214, 105, 126, 7, 6, 1, 212, 98, - 126, 7, 6, 1, 211, 178, 126, 7, 6, 1, 211, 117, 126, 7, 6, 1, 210, 159, - 126, 43, 42, 127, 126, 223, 51, 219, 47, 126, 44, 42, 127, 126, 250, 32, - 255, 15, 126, 121, 232, 214, 126, 242, 138, 255, 15, 126, 7, 4, 1, 61, - 126, 7, 4, 1, 253, 159, 126, 7, 4, 1, 251, 67, 126, 7, 4, 1, 249, 61, - 126, 7, 4, 1, 75, 126, 7, 4, 1, 245, 7, 126, 7, 4, 1, 243, 203, 126, 7, - 4, 1, 242, 61, 126, 7, 4, 1, 73, 126, 7, 4, 1, 235, 145, 126, 7, 4, 1, - 235, 24, 126, 7, 4, 1, 156, 126, 7, 4, 1, 193, 126, 7, 4, 1, 230, 26, - 126, 7, 4, 1, 76, 126, 7, 4, 1, 226, 106, 126, 7, 4, 1, 224, 97, 126, 7, - 4, 1, 153, 126, 7, 4, 1, 222, 92, 126, 7, 4, 1, 217, 153, 126, 7, 4, 1, - 70, 126, 7, 4, 1, 214, 105, 126, 7, 4, 1, 212, 98, 126, 7, 4, 1, 211, - 178, 126, 7, 4, 1, 211, 117, 126, 7, 4, 1, 210, 159, 126, 43, 249, 100, - 127, 126, 67, 232, 214, 126, 44, 249, 100, 127, 126, 183, 126, 43, 71, - 226, 4, 126, 44, 71, 226, 4, 101, 109, 243, 230, 218, 130, 101, 43, 249, - 162, 127, 101, 44, 249, 162, 127, 101, 109, 249, 220, 101, 56, 230, 225, - 247, 121, 101, 56, 1, 211, 227, 101, 56, 1, 4, 61, 101, 56, 1, 4, 73, - 101, 56, 1, 4, 70, 101, 56, 1, 4, 75, 101, 56, 1, 4, 76, 101, 56, 1, 4, - 191, 101, 56, 1, 4, 210, 212, 101, 56, 1, 4, 210, 244, 101, 56, 1, 4, - 215, 119, 101, 234, 202, 224, 174, 219, 32, 78, 101, 56, 1, 61, 101, 56, - 1, 73, 101, 56, 1, 70, 101, 56, 1, 75, 101, 56, 1, 76, 101, 56, 1, 176, - 101, 56, 1, 234, 93, 101, 56, 1, 233, 218, 101, 56, 1, 234, 183, 101, 56, - 1, 234, 29, 101, 56, 1, 206, 101, 56, 1, 219, 192, 101, 56, 1, 218, 84, - 101, 56, 1, 221, 182, 101, 56, 1, 219, 59, 101, 56, 1, 217, 106, 101, 56, - 1, 216, 118, 101, 56, 1, 215, 119, 101, 56, 1, 217, 23, 101, 56, 1, 111, - 101, 56, 1, 197, 101, 56, 1, 228, 234, 101, 56, 1, 227, 238, 101, 56, 1, - 229, 108, 101, 56, 1, 228, 75, 101, 56, 1, 162, 101, 56, 1, 241, 181, - 101, 56, 1, 240, 223, 101, 56, 1, 241, 239, 101, 56, 1, 241, 69, 101, 56, - 1, 185, 101, 56, 1, 230, 231, 101, 56, 1, 230, 103, 101, 56, 1, 231, 92, - 101, 56, 1, 230, 162, 101, 56, 1, 191, 101, 56, 1, 210, 212, 101, 56, 1, - 210, 244, 101, 56, 1, 205, 101, 56, 1, 223, 36, 101, 56, 1, 222, 141, - 101, 56, 1, 223, 129, 101, 56, 1, 222, 212, 101, 56, 1, 212, 65, 101, 56, - 1, 230, 26, 101, 56, 213, 135, 219, 32, 78, 101, 56, 220, 156, 219, 32, - 78, 101, 24, 244, 104, 101, 24, 1, 234, 59, 101, 24, 1, 218, 216, 101, - 24, 1, 234, 52, 101, 24, 1, 228, 227, 101, 24, 1, 228, 225, 101, 24, 1, - 228, 224, 101, 24, 1, 216, 102, 101, 24, 1, 218, 205, 101, 24, 1, 223, - 27, 101, 24, 1, 223, 22, 101, 24, 1, 223, 19, 101, 24, 1, 223, 12, 101, - 24, 1, 223, 7, 101, 24, 1, 223, 2, 101, 24, 1, 223, 13, 101, 24, 1, 223, - 25, 101, 24, 1, 230, 218, 101, 24, 1, 225, 96, 101, 24, 1, 218, 213, 101, - 24, 1, 225, 85, 101, 24, 1, 219, 149, 101, 24, 1, 218, 210, 101, 24, 1, - 236, 57, 101, 24, 1, 250, 47, 101, 24, 1, 218, 220, 101, 24, 1, 250, 107, - 101, 24, 1, 234, 111, 101, 24, 1, 216, 174, 101, 24, 1, 225, 132, 101, - 24, 1, 241, 173, 101, 24, 1, 61, 101, 24, 1, 254, 244, 101, 24, 1, 191, - 101, 24, 1, 211, 92, 101, 24, 1, 245, 118, 101, 24, 1, 75, 101, 24, 1, - 211, 36, 101, 24, 1, 211, 47, 101, 24, 1, 76, 101, 24, 1, 212, 65, 101, - 24, 1, 212, 62, 101, 24, 1, 226, 235, 101, 24, 1, 210, 244, 101, 24, 1, - 70, 101, 24, 1, 212, 11, 101, 24, 1, 212, 22, 101, 24, 1, 211, 250, 101, - 24, 1, 210, 212, 101, 24, 1, 245, 56, 101, 24, 1, 211, 8, 101, 24, 1, 73, - 126, 250, 177, 50, 126, 224, 229, 50, 126, 228, 53, 50, 126, 231, 233, - 126, 251, 136, 130, 126, 211, 40, 50, 126, 211, 217, 50, 101, 244, 19, - 192, 213, 239, 101, 140, 74, 101, 214, 153, 74, 101, 97, 74, 101, 246, - 105, 74, 101, 85, 218, 235, 101, 71, 250, 36, 235, 205, 254, 100, 254, - 121, 235, 205, 254, 100, 220, 138, 235, 205, 254, 100, 216, 237, 226, - 250, 223, 73, 250, 143, 223, 73, 250, 143, 62, 57, 3, 253, 143, 61, 62, - 57, 3, 253, 112, 75, 62, 57, 3, 253, 121, 73, 62, 57, 3, 253, 89, 76, 62, - 57, 3, 253, 139, 70, 62, 57, 3, 253, 158, 248, 222, 62, 57, 3, 253, 105, - 248, 91, 62, 57, 3, 253, 145, 248, 4, 62, 57, 3, 253, 135, 247, 146, 62, - 57, 3, 253, 99, 246, 79, 62, 57, 3, 253, 93, 235, 142, 62, 57, 3, 253, - 104, 235, 127, 62, 57, 3, 253, 114, 235, 69, 62, 57, 3, 253, 85, 235, 52, - 62, 57, 3, 253, 73, 176, 62, 57, 3, 253, 106, 234, 183, 62, 57, 3, 253, - 83, 234, 93, 62, 57, 3, 253, 80, 234, 29, 62, 57, 3, 253, 69, 233, 218, - 62, 57, 3, 253, 70, 185, 62, 57, 3, 253, 136, 231, 92, 62, 57, 3, 253, - 77, 230, 231, 62, 57, 3, 253, 134, 230, 162, 62, 57, 3, 253, 126, 230, - 103, 62, 57, 3, 253, 147, 197, 62, 57, 3, 253, 125, 229, 108, 62, 57, 3, - 253, 119, 228, 234, 62, 57, 3, 253, 98, 228, 75, 62, 57, 3, 253, 95, 227, - 238, 62, 57, 3, 253, 154, 190, 62, 57, 3, 253, 78, 225, 222, 62, 57, 3, - 253, 111, 225, 109, 62, 57, 3, 253, 138, 225, 17, 62, 57, 3, 253, 100, - 224, 151, 62, 57, 3, 253, 133, 224, 89, 62, 57, 3, 253, 72, 224, 70, 62, - 57, 3, 253, 128, 224, 54, 62, 57, 3, 253, 117, 224, 43, 62, 57, 3, 253, - 90, 205, 62, 57, 3, 253, 122, 223, 129, 62, 57, 3, 253, 97, 223, 36, 62, - 57, 3, 253, 156, 222, 212, 62, 57, 3, 253, 123, 222, 141, 62, 57, 3, 253, - 118, 206, 62, 57, 3, 253, 141, 221, 182, 62, 57, 3, 253, 109, 219, 192, - 62, 57, 3, 253, 137, 219, 59, 62, 57, 3, 253, 92, 218, 84, 62, 57, 3, - 253, 91, 217, 106, 62, 57, 3, 253, 152, 217, 23, 62, 57, 3, 253, 113, - 216, 118, 62, 57, 3, 253, 150, 111, 62, 57, 3, 253, 81, 215, 119, 62, 57, - 3, 253, 96, 212, 65, 62, 57, 3, 253, 75, 212, 22, 62, 57, 3, 253, 110, - 211, 250, 62, 57, 3, 253, 108, 211, 227, 62, 57, 3, 253, 132, 210, 116, - 62, 57, 3, 253, 76, 210, 94, 62, 57, 3, 253, 129, 210, 23, 62, 57, 3, - 253, 124, 255, 76, 62, 57, 3, 253, 107, 255, 75, 62, 57, 3, 253, 66, 253, - 193, 62, 57, 3, 253, 79, 246, 47, 62, 57, 3, 253, 62, 246, 46, 62, 57, 3, - 253, 102, 227, 175, 62, 57, 3, 253, 120, 224, 149, 62, 57, 3, 253, 88, - 224, 153, 62, 57, 3, 253, 74, 223, 187, 62, 57, 3, 253, 116, 223, 186, - 62, 57, 3, 253, 82, 222, 211, 62, 57, 3, 253, 84, 217, 103, 62, 57, 3, - 253, 64, 215, 78, 62, 57, 3, 253, 61, 105, 62, 57, 16, 253, 131, 62, 57, - 16, 253, 130, 62, 57, 16, 253, 127, 62, 57, 16, 253, 115, 62, 57, 16, - 253, 103, 62, 57, 16, 253, 101, 62, 57, 16, 253, 94, 62, 57, 16, 253, 87, - 62, 57, 16, 253, 86, 62, 57, 16, 253, 71, 62, 57, 16, 253, 68, 62, 57, - 16, 253, 67, 62, 57, 16, 253, 65, 62, 57, 16, 253, 63, 62, 57, 106, 253, - 60, 231, 186, 62, 57, 106, 253, 59, 211, 221, 62, 57, 106, 253, 58, 248, - 75, 62, 57, 106, 253, 57, 245, 96, 62, 57, 106, 253, 56, 231, 160, 62, - 57, 106, 253, 55, 218, 163, 62, 57, 106, 253, 54, 245, 38, 62, 57, 106, - 253, 53, 223, 154, 62, 57, 106, 253, 52, 220, 63, 62, 57, 106, 253, 51, - 241, 238, 62, 57, 106, 253, 50, 219, 26, 62, 57, 106, 253, 49, 251, 204, - 62, 57, 106, 253, 48, 249, 146, 62, 57, 106, 253, 47, 251, 116, 62, 57, - 106, 253, 46, 212, 2, 62, 57, 106, 253, 45, 252, 137, 62, 57, 106, 253, - 44, 226, 206, 62, 57, 106, 253, 43, 218, 255, 62, 57, 106, 253, 42, 249, - 69, 62, 57, 230, 143, 253, 41, 234, 225, 62, 57, 230, 143, 253, 40, 234, - 233, 62, 57, 106, 253, 39, 226, 219, 62, 57, 106, 253, 38, 211, 236, 62, - 57, 106, 253, 37, 62, 57, 230, 143, 253, 36, 254, 18, 62, 57, 230, 143, - 253, 35, 231, 53, 62, 57, 106, 253, 34, 251, 135, 62, 57, 106, 253, 33, - 242, 167, 62, 57, 106, 253, 32, 62, 57, 106, 253, 31, 211, 212, 62, 57, - 106, 253, 30, 62, 57, 106, 253, 29, 62, 57, 106, 253, 28, 240, 249, 62, - 57, 106, 253, 27, 62, 57, 106, 253, 26, 62, 57, 106, 253, 25, 62, 57, - 230, 143, 253, 23, 215, 92, 62, 57, 106, 253, 22, 62, 57, 106, 253, 21, - 62, 57, 106, 253, 20, 249, 251, 62, 57, 106, 253, 19, 62, 57, 106, 253, - 18, 62, 57, 106, 253, 17, 243, 94, 62, 57, 106, 253, 16, 254, 5, 62, 57, - 106, 253, 15, 62, 57, 106, 253, 14, 62, 57, 106, 253, 13, 62, 57, 106, - 253, 12, 62, 57, 106, 253, 11, 62, 57, 106, 253, 10, 62, 57, 106, 253, 9, - 62, 57, 106, 253, 8, 62, 57, 106, 253, 7, 62, 57, 106, 253, 6, 230, 135, - 62, 57, 106, 253, 5, 62, 57, 106, 253, 4, 215, 236, 62, 57, 106, 253, 3, - 62, 57, 106, 253, 2, 62, 57, 106, 253, 1, 62, 57, 106, 253, 0, 62, 57, - 106, 252, 255, 62, 57, 106, 252, 254, 62, 57, 106, 252, 253, 62, 57, 106, - 252, 252, 62, 57, 106, 252, 251, 62, 57, 106, 252, 250, 62, 57, 106, 252, - 249, 62, 57, 106, 252, 248, 241, 212, 62, 57, 106, 252, 227, 244, 29, 62, - 57, 106, 252, 224, 252, 117, 62, 57, 106, 252, 219, 219, 6, 62, 57, 106, - 252, 218, 74, 62, 57, 106, 252, 217, 62, 57, 106, 252, 216, 217, 237, 62, - 57, 106, 252, 215, 62, 57, 106, 252, 214, 62, 57, 106, 252, 213, 211, - 254, 250, 140, 62, 57, 106, 252, 212, 250, 140, 62, 57, 106, 252, 211, - 250, 141, 244, 0, 62, 57, 106, 252, 210, 212, 0, 62, 57, 106, 252, 209, - 62, 57, 106, 252, 208, 62, 57, 230, 143, 252, 207, 247, 199, 62, 57, 106, - 252, 206, 62, 57, 106, 252, 205, 62, 57, 106, 252, 203, 62, 57, 106, 252, - 202, 62, 57, 106, 252, 201, 62, 57, 106, 252, 200, 248, 160, 62, 57, 106, - 252, 199, 62, 57, 106, 252, 198, 62, 57, 106, 252, 197, 62, 57, 106, 252, - 196, 62, 57, 106, 252, 195, 62, 57, 106, 213, 186, 253, 24, 62, 57, 106, - 213, 186, 252, 247, 62, 57, 106, 213, 186, 252, 246, 62, 57, 106, 213, - 186, 252, 245, 62, 57, 106, 213, 186, 252, 244, 62, 57, 106, 213, 186, - 252, 243, 62, 57, 106, 213, 186, 252, 242, 62, 57, 106, 213, 186, 252, - 241, 62, 57, 106, 213, 186, 252, 240, 62, 57, 106, 213, 186, 252, 239, - 62, 57, 106, 213, 186, 252, 238, 62, 57, 106, 213, 186, 252, 237, 62, 57, - 106, 213, 186, 252, 236, 62, 57, 106, 213, 186, 252, 235, 62, 57, 106, - 213, 186, 252, 234, 62, 57, 106, 213, 186, 252, 233, 62, 57, 106, 213, - 186, 252, 232, 62, 57, 106, 213, 186, 252, 231, 62, 57, 106, 213, 186, - 252, 230, 62, 57, 106, 213, 186, 252, 229, 62, 57, 106, 213, 186, 252, - 228, 62, 57, 106, 213, 186, 252, 226, 62, 57, 106, 213, 186, 252, 225, - 62, 57, 106, 213, 186, 252, 223, 62, 57, 106, 213, 186, 252, 222, 62, 57, - 106, 213, 186, 252, 221, 62, 57, 106, 213, 186, 252, 220, 62, 57, 106, - 213, 186, 252, 204, 62, 57, 106, 213, 186, 252, 194, 254, 237, 211, 209, - 220, 139, 232, 214, 254, 237, 211, 209, 220, 139, 247, 121, 254, 237, - 250, 131, 78, 254, 237, 54, 110, 254, 237, 54, 105, 254, 237, 54, 158, - 254, 237, 54, 161, 254, 237, 54, 189, 254, 237, 54, 194, 254, 237, 54, - 198, 254, 237, 54, 195, 254, 237, 54, 200, 254, 237, 54, 216, 248, 254, - 237, 54, 215, 73, 254, 237, 54, 216, 163, 254, 237, 54, 244, 16, 254, - 237, 54, 244, 115, 254, 237, 54, 219, 112, 254, 237, 54, 220, 117, 254, - 237, 54, 245, 185, 254, 237, 54, 228, 196, 254, 237, 54, 123, 240, 211, - 254, 237, 54, 113, 240, 211, 254, 237, 54, 134, 240, 211, 254, 237, 54, - 244, 12, 240, 211, 254, 237, 54, 244, 82, 240, 211, 254, 237, 54, 219, - 126, 240, 211, 254, 237, 54, 220, 123, 240, 211, 254, 237, 54, 245, 194, - 240, 211, 254, 237, 54, 228, 201, 240, 211, 254, 237, 54, 123, 216, 148, - 254, 237, 54, 113, 216, 148, 254, 237, 54, 134, 216, 148, 254, 237, 54, - 244, 12, 216, 148, 254, 237, 54, 244, 82, 216, 148, 254, 237, 54, 219, - 126, 216, 148, 254, 237, 54, 220, 123, 216, 148, 254, 237, 54, 245, 194, - 216, 148, 254, 237, 54, 228, 201, 216, 148, 254, 237, 54, 216, 249, 216, - 148, 254, 237, 54, 215, 74, 216, 148, 254, 237, 54, 216, 164, 216, 148, - 254, 237, 54, 244, 17, 216, 148, 254, 237, 54, 244, 116, 216, 148, 254, - 237, 54, 219, 113, 216, 148, 254, 237, 54, 220, 118, 216, 148, 254, 237, - 54, 245, 186, 216, 148, 254, 237, 54, 228, 197, 216, 148, 254, 237, 212, - 14, 252, 129, 214, 173, 254, 237, 212, 14, 244, 93, 218, 60, 254, 237, - 212, 14, 221, 177, 218, 60, 254, 237, 212, 14, 216, 170, 218, 60, 254, - 237, 212, 14, 244, 5, 218, 60, 254, 237, 246, 82, 231, 91, 244, 93, 218, - 60, 254, 237, 232, 200, 231, 91, 244, 93, 218, 60, 254, 237, 231, 91, - 221, 177, 218, 60, 254, 237, 231, 91, 216, 170, 218, 60, 26, 255, 7, 253, - 195, 123, 224, 22, 26, 255, 7, 253, 195, 123, 242, 28, 26, 255, 7, 253, - 195, 123, 246, 101, 26, 255, 7, 253, 195, 189, 26, 255, 7, 253, 195, 244, - 115, 26, 255, 7, 253, 195, 244, 82, 240, 211, 26, 255, 7, 253, 195, 244, - 82, 216, 148, 26, 255, 7, 253, 195, 244, 116, 216, 148, 26, 255, 7, 253, - 195, 244, 82, 217, 68, 26, 255, 7, 253, 195, 216, 249, 217, 68, 26, 255, - 7, 253, 195, 244, 116, 217, 68, 26, 255, 7, 253, 195, 123, 240, 212, 217, - 68, 26, 255, 7, 253, 195, 244, 82, 240, 212, 217, 68, 26, 255, 7, 253, - 195, 123, 216, 149, 217, 68, 26, 255, 7, 253, 195, 244, 82, 216, 149, - 217, 68, 26, 255, 7, 253, 195, 244, 82, 218, 151, 26, 255, 7, 253, 195, - 216, 249, 218, 151, 26, 255, 7, 253, 195, 244, 116, 218, 151, 26, 255, 7, - 253, 195, 123, 240, 212, 218, 151, 26, 255, 7, 253, 195, 244, 82, 240, - 212, 218, 151, 26, 255, 7, 253, 195, 123, 216, 149, 218, 151, 26, 255, 7, - 253, 195, 216, 249, 216, 149, 218, 151, 26, 255, 7, 253, 195, 244, 116, - 216, 149, 218, 151, 26, 255, 7, 253, 195, 216, 249, 230, 165, 26, 255, 7, - 241, 206, 123, 225, 32, 26, 255, 7, 216, 182, 110, 26, 255, 7, 241, 202, - 110, 26, 255, 7, 245, 105, 105, 26, 255, 7, 216, 182, 105, 26, 255, 7, - 249, 66, 113, 246, 100, 26, 255, 7, 245, 105, 113, 246, 100, 26, 255, 7, - 215, 204, 189, 26, 255, 7, 215, 204, 216, 248, 26, 255, 7, 215, 204, 216, - 249, 254, 142, 17, 26, 255, 7, 241, 202, 216, 248, 26, 255, 7, 231, 42, - 216, 248, 26, 255, 7, 216, 182, 216, 248, 26, 255, 7, 216, 182, 216, 163, - 26, 255, 7, 215, 204, 244, 115, 26, 255, 7, 215, 204, 244, 116, 254, 142, - 17, 26, 255, 7, 241, 202, 244, 115, 26, 255, 7, 216, 182, 244, 115, 26, - 255, 7, 216, 182, 123, 240, 211, 26, 255, 7, 216, 182, 134, 240, 211, 26, - 255, 7, 245, 105, 244, 82, 240, 211, 26, 255, 7, 215, 204, 244, 82, 240, - 211, 26, 255, 7, 216, 182, 244, 82, 240, 211, 26, 255, 7, 250, 228, 244, - 82, 240, 211, 26, 255, 7, 229, 183, 244, 82, 240, 211, 26, 255, 7, 216, - 182, 123, 216, 148, 26, 255, 7, 216, 182, 244, 82, 216, 148, 26, 255, 7, - 248, 58, 244, 82, 230, 165, 26, 255, 7, 218, 119, 244, 116, 230, 165, 26, - 123, 163, 50, 26, 123, 163, 5, 254, 142, 17, 26, 113, 216, 168, 50, 26, - 134, 224, 21, 50, 26, 211, 45, 50, 26, 217, 69, 50, 26, 246, 102, 50, 26, - 226, 247, 50, 26, 113, 226, 246, 50, 26, 134, 226, 246, 50, 26, 244, 12, - 226, 246, 50, 26, 244, 82, 226, 246, 50, 26, 231, 36, 50, 26, 233, 158, - 252, 129, 50, 26, 232, 195, 50, 26, 226, 132, 50, 26, 211, 159, 50, 26, - 253, 244, 50, 26, 254, 1, 50, 26, 242, 145, 50, 26, 215, 187, 252, 129, - 50, 26, 210, 87, 50, 222, 199, 220, 114, 50, 222, 199, 214, 185, 50, 222, - 199, 220, 143, 50, 222, 199, 220, 112, 50, 222, 199, 247, 214, 220, 112, - 50, 222, 199, 219, 169, 50, 222, 199, 248, 54, 50, 222, 199, 224, 7, 50, - 222, 199, 220, 130, 50, 222, 199, 246, 61, 50, 222, 199, 253, 239, 50, - 222, 199, 250, 172, 50, 225, 144, 247, 192, 5, 225, 214, 225, 144, 247, - 192, 5, 225, 25, 241, 236, 225, 144, 247, 192, 5, 217, 46, 241, 236, 225, - 144, 247, 192, 5, 250, 248, 225, 144, 247, 192, 5, 250, 102, 225, 144, - 247, 192, 5, 211, 221, 225, 144, 247, 192, 5, 241, 212, 225, 144, 247, - 192, 5, 243, 86, 225, 144, 247, 192, 5, 216, 117, 225, 144, 247, 192, 5, - 74, 225, 144, 247, 192, 5, 251, 170, 225, 144, 247, 192, 5, 220, 30, 225, - 144, 247, 192, 5, 249, 245, 225, 144, 247, 192, 5, 231, 185, 225, 144, - 247, 192, 5, 231, 137, 225, 144, 247, 192, 5, 221, 217, 225, 144, 247, - 192, 5, 232, 238, 225, 144, 247, 192, 5, 251, 189, 225, 144, 247, 192, 5, - 250, 232, 225, 36, 225, 144, 247, 192, 5, 247, 134, 225, 144, 247, 192, - 5, 249, 224, 225, 144, 247, 192, 5, 219, 88, 225, 144, 247, 192, 5, 249, - 225, 225, 144, 247, 192, 5, 252, 64, 225, 144, 247, 192, 5, 220, 17, 225, - 144, 247, 192, 5, 240, 249, 225, 144, 247, 192, 5, 241, 179, 225, 144, - 247, 192, 5, 251, 113, 233, 37, 225, 144, 247, 192, 5, 250, 225, 225, - 144, 247, 192, 5, 223, 154, 225, 144, 247, 192, 5, 245, 231, 225, 144, - 247, 192, 5, 246, 108, 225, 144, 247, 192, 5, 215, 106, 225, 144, 247, - 192, 5, 252, 67, 225, 144, 247, 192, 5, 225, 37, 215, 236, 225, 144, 247, - 192, 5, 213, 159, 225, 144, 247, 192, 5, 226, 19, 225, 144, 247, 192, 5, - 222, 191, 225, 144, 247, 192, 5, 232, 225, 225, 144, 247, 192, 5, 226, - 116, 252, 185, 225, 144, 247, 192, 5, 244, 49, 225, 144, 247, 192, 5, - 242, 139, 225, 144, 247, 192, 5, 218, 120, 225, 144, 247, 192, 5, 4, 253, - 169, 225, 144, 247, 192, 5, 212, 32, 252, 149, 225, 144, 247, 192, 5, 38, - 226, 249, 91, 232, 61, 1, 61, 232, 61, 1, 75, 232, 61, 1, 253, 159, 232, - 61, 1, 252, 20, 232, 61, 1, 243, 203, 232, 61, 1, 249, 61, 232, 61, 1, - 73, 232, 61, 1, 212, 98, 232, 61, 1, 210, 159, 232, 61, 1, 216, 211, 232, - 61, 1, 235, 145, 232, 61, 1, 235, 24, 232, 61, 1, 224, 97, 232, 61, 1, - 156, 232, 61, 1, 193, 232, 61, 1, 230, 26, 232, 61, 1, 230, 167, 232, 61, - 1, 228, 112, 232, 61, 1, 70, 232, 61, 1, 226, 106, 232, 61, 1, 234, 48, - 232, 61, 1, 153, 232, 61, 1, 222, 92, 232, 61, 1, 217, 153, 232, 61, 1, - 215, 160, 232, 61, 1, 254, 124, 232, 61, 1, 245, 151, 232, 61, 1, 242, - 61, 232, 61, 1, 211, 178, 250, 238, 1, 61, 250, 238, 1, 226, 92, 250, - 238, 1, 249, 61, 250, 238, 1, 156, 250, 238, 1, 214, 116, 250, 238, 1, - 153, 250, 238, 1, 233, 63, 250, 238, 1, 255, 76, 250, 238, 1, 224, 97, - 250, 238, 1, 253, 159, 250, 238, 1, 193, 250, 238, 1, 76, 250, 238, 1, - 248, 224, 250, 238, 1, 217, 153, 250, 238, 1, 220, 105, 250, 238, 1, 220, - 104, 250, 238, 1, 222, 92, 250, 238, 1, 251, 66, 250, 238, 1, 70, 250, - 238, 1, 228, 112, 250, 238, 1, 211, 178, 250, 238, 1, 230, 26, 250, 238, - 1, 215, 159, 250, 238, 1, 226, 106, 250, 238, 1, 218, 227, 250, 238, 1, - 73, 250, 238, 1, 75, 250, 238, 1, 214, 113, 250, 238, 1, 235, 24, 250, - 238, 1, 235, 15, 250, 238, 1, 229, 151, 250, 238, 1, 214, 118, 250, 238, - 1, 243, 203, 250, 238, 1, 243, 138, 250, 238, 1, 218, 169, 250, 238, 1, - 218, 168, 250, 238, 1, 229, 80, 250, 238, 1, 236, 34, 250, 238, 1, 251, - 65, 250, 238, 1, 215, 160, 250, 238, 1, 214, 115, 250, 238, 1, 222, 181, - 250, 238, 1, 231, 130, 250, 238, 1, 231, 129, 250, 238, 1, 231, 128, 250, - 238, 1, 231, 127, 250, 238, 1, 233, 62, 250, 238, 1, 245, 235, 250, 238, - 1, 214, 114, 55, 32, 1, 61, 55, 32, 1, 252, 76, 55, 32, 1, 234, 183, 55, - 32, 1, 248, 91, 55, 32, 1, 75, 55, 32, 1, 213, 255, 55, 32, 1, 210, 94, - 55, 32, 1, 241, 239, 55, 32, 1, 216, 196, 55, 32, 1, 73, 55, 32, 1, 176, - 55, 32, 1, 245, 175, 55, 32, 1, 245, 160, 55, 32, 1, 245, 151, 55, 32, 1, - 245, 76, 55, 32, 1, 76, 55, 32, 1, 225, 222, 55, 32, 1, 220, 64, 55, 32, - 1, 233, 218, 55, 32, 1, 245, 93, 55, 32, 1, 245, 83, 55, 32, 1, 217, 23, - 55, 32, 1, 70, 55, 32, 1, 245, 178, 55, 32, 1, 225, 137, 55, 32, 1, 234, - 120, 55, 32, 1, 245, 203, 55, 32, 1, 245, 85, 55, 32, 1, 250, 132, 55, - 32, 1, 236, 34, 55, 32, 1, 214, 118, 55, 32, 227, 199, 110, 55, 32, 227, - 199, 189, 55, 32, 227, 199, 216, 248, 55, 32, 227, 199, 244, 115, 242, - 154, 1, 254, 205, 242, 154, 1, 252, 164, 242, 154, 1, 242, 212, 242, 154, - 1, 248, 205, 242, 154, 1, 254, 201, 242, 154, 1, 224, 80, 242, 154, 1, - 235, 156, 242, 154, 1, 242, 40, 242, 154, 1, 216, 159, 242, 154, 1, 245, - 184, 242, 154, 1, 233, 191, 242, 154, 1, 233, 114, 242, 154, 1, 231, 180, - 242, 154, 1, 229, 185, 242, 154, 1, 235, 120, 242, 154, 1, 214, 136, 242, - 154, 1, 226, 70, 242, 154, 1, 228, 196, 242, 154, 1, 223, 166, 242, 154, - 1, 221, 219, 242, 154, 1, 217, 5, 242, 154, 1, 211, 234, 242, 154, 1, - 244, 179, 242, 154, 1, 236, 38, 242, 154, 1, 240, 200, 242, 154, 1, 226, - 140, 242, 154, 1, 228, 201, 240, 211, 214, 209, 1, 254, 148, 214, 209, 1, - 252, 27, 214, 209, 1, 243, 109, 214, 209, 1, 234, 133, 214, 209, 1, 248, - 55, 214, 209, 1, 241, 69, 214, 209, 1, 211, 227, 214, 209, 1, 210, 85, - 214, 209, 1, 240, 242, 214, 209, 1, 216, 231, 214, 209, 1, 210, 233, 214, - 209, 1, 234, 251, 214, 209, 1, 220, 21, 214, 209, 1, 233, 99, 214, 209, - 1, 231, 66, 214, 209, 1, 248, 22, 214, 209, 1, 227, 195, 214, 209, 1, - 210, 13, 214, 209, 1, 221, 249, 214, 209, 1, 254, 197, 214, 209, 1, 224, - 151, 214, 209, 1, 222, 26, 214, 209, 1, 224, 36, 214, 209, 1, 223, 145, - 214, 209, 1, 216, 200, 214, 209, 1, 242, 245, 214, 209, 1, 111, 214, 209, - 1, 73, 214, 209, 1, 70, 214, 209, 1, 218, 180, 214, 209, 211, 209, 247, - 173, 55, 225, 170, 5, 61, 55, 225, 170, 5, 73, 55, 225, 170, 5, 70, 55, - 225, 170, 5, 176, 55, 225, 170, 5, 233, 218, 55, 225, 170, 5, 243, 136, - 55, 225, 170, 5, 242, 114, 55, 225, 170, 5, 211, 165, 55, 225, 170, 5, - 251, 34, 55, 225, 170, 5, 235, 142, 55, 225, 170, 5, 235, 109, 55, 225, - 170, 5, 217, 106, 55, 225, 170, 5, 215, 119, 55, 225, 170, 5, 248, 222, - 55, 225, 170, 5, 248, 4, 55, 225, 170, 5, 246, 79, 55, 225, 170, 5, 216, - 209, 55, 225, 170, 5, 190, 55, 225, 170, 5, 252, 192, 55, 225, 170, 5, - 244, 197, 55, 225, 170, 5, 197, 55, 225, 170, 5, 227, 238, 55, 225, 170, - 5, 185, 55, 225, 170, 5, 230, 231, 55, 225, 170, 5, 230, 103, 55, 225, - 170, 5, 191, 55, 225, 170, 5, 214, 27, 55, 225, 170, 5, 213, 176, 55, - 225, 170, 5, 205, 55, 225, 170, 5, 222, 141, 55, 225, 170, 5, 233, 136, - 55, 225, 170, 5, 206, 55, 225, 170, 5, 210, 116, 55, 225, 170, 5, 220, - 103, 55, 225, 170, 5, 218, 224, 55, 225, 170, 5, 162, 55, 225, 170, 5, - 253, 187, 55, 225, 170, 5, 253, 186, 55, 225, 170, 5, 253, 185, 55, 225, - 170, 5, 211, 142, 55, 225, 170, 5, 248, 201, 55, 225, 170, 5, 248, 200, - 55, 225, 170, 5, 252, 171, 55, 225, 170, 5, 251, 86, 55, 225, 170, 211, - 209, 247, 173, 55, 225, 170, 54, 110, 55, 225, 170, 54, 105, 55, 225, - 170, 54, 216, 248, 55, 225, 170, 54, 215, 73, 55, 225, 170, 54, 240, 211, - 181, 6, 1, 199, 73, 181, 6, 1, 199, 75, 181, 6, 1, 199, 61, 181, 6, 1, - 199, 254, 210, 181, 6, 1, 199, 76, 181, 6, 1, 199, 226, 184, 181, 6, 1, - 219, 252, 73, 181, 6, 1, 219, 252, 75, 181, 6, 1, 219, 252, 61, 181, 6, - 1, 219, 252, 254, 210, 181, 6, 1, 219, 252, 76, 181, 6, 1, 219, 252, 226, - 184, 181, 6, 1, 253, 168, 181, 6, 1, 226, 117, 181, 6, 1, 211, 195, 181, - 6, 1, 211, 44, 181, 6, 1, 242, 61, 181, 6, 1, 225, 212, 181, 6, 1, 252, - 67, 181, 6, 1, 217, 12, 181, 6, 1, 248, 78, 181, 6, 1, 250, 129, 181, 6, - 1, 235, 125, 181, 6, 1, 234, 190, 181, 6, 1, 243, 84, 181, 6, 1, 245, - 203, 181, 6, 1, 213, 250, 181, 6, 1, 245, 60, 181, 6, 1, 216, 195, 181, - 6, 1, 245, 83, 181, 6, 1, 210, 92, 181, 6, 1, 245, 76, 181, 6, 1, 210, - 73, 181, 6, 1, 245, 93, 181, 6, 1, 245, 175, 181, 6, 1, 245, 160, 181, 6, - 1, 245, 151, 181, 6, 1, 245, 139, 181, 6, 1, 226, 220, 181, 6, 1, 245, - 39, 181, 4, 1, 199, 73, 181, 4, 1, 199, 75, 181, 4, 1, 199, 61, 181, 4, - 1, 199, 254, 210, 181, 4, 1, 199, 76, 181, 4, 1, 199, 226, 184, 181, 4, - 1, 219, 252, 73, 181, 4, 1, 219, 252, 75, 181, 4, 1, 219, 252, 61, 181, - 4, 1, 219, 252, 254, 210, 181, 4, 1, 219, 252, 76, 181, 4, 1, 219, 252, - 226, 184, 181, 4, 1, 253, 168, 181, 4, 1, 226, 117, 181, 4, 1, 211, 195, - 181, 4, 1, 211, 44, 181, 4, 1, 242, 61, 181, 4, 1, 225, 212, 181, 4, 1, - 252, 67, 181, 4, 1, 217, 12, 181, 4, 1, 248, 78, 181, 4, 1, 250, 129, - 181, 4, 1, 235, 125, 181, 4, 1, 234, 190, 181, 4, 1, 243, 84, 181, 4, 1, - 245, 203, 181, 4, 1, 213, 250, 181, 4, 1, 245, 60, 181, 4, 1, 216, 195, - 181, 4, 1, 245, 83, 181, 4, 1, 210, 92, 181, 4, 1, 245, 76, 181, 4, 1, - 210, 73, 181, 4, 1, 245, 93, 181, 4, 1, 245, 175, 181, 4, 1, 245, 160, - 181, 4, 1, 245, 151, 181, 4, 1, 245, 139, 181, 4, 1, 226, 220, 181, 4, 1, - 245, 39, 220, 70, 1, 225, 210, 220, 70, 1, 216, 6, 220, 70, 1, 234, 92, - 220, 70, 1, 244, 148, 220, 70, 1, 216, 173, 220, 70, 1, 219, 59, 220, 70, - 1, 218, 15, 220, 70, 1, 250, 62, 220, 70, 1, 211, 46, 220, 70, 1, 240, - 210, 220, 70, 1, 252, 6, 220, 70, 1, 248, 90, 220, 70, 1, 243, 122, 220, - 70, 1, 213, 123, 220, 70, 1, 216, 177, 220, 70, 1, 210, 21, 220, 70, 1, - 231, 90, 220, 70, 1, 235, 50, 220, 70, 1, 211, 225, 220, 70, 1, 242, 49, - 220, 70, 1, 232, 143, 220, 70, 1, 230, 190, 220, 70, 1, 236, 41, 220, 70, - 1, 245, 202, 220, 70, 1, 253, 232, 220, 70, 1, 254, 248, 220, 70, 1, 226, - 197, 220, 70, 1, 211, 212, 220, 70, 1, 226, 131, 220, 70, 1, 254, 210, - 220, 70, 1, 222, 209, 220, 70, 1, 227, 195, 220, 70, 1, 245, 218, 220, - 70, 1, 254, 215, 220, 70, 1, 240, 112, 220, 70, 1, 214, 163, 220, 70, 1, - 226, 255, 220, 70, 1, 226, 177, 220, 70, 1, 226, 219, 220, 70, 1, 253, - 171, 220, 70, 1, 254, 20, 220, 70, 1, 226, 159, 220, 70, 1, 254, 193, - 220, 70, 1, 245, 87, 220, 70, 1, 253, 254, 220, 70, 1, 245, 228, 220, 70, - 1, 240, 119, 220, 70, 1, 211, 13, 226, 142, 1, 254, 171, 226, 142, 1, - 252, 192, 226, 142, 1, 217, 106, 226, 142, 1, 235, 142, 226, 142, 1, 211, - 165, 226, 142, 1, 234, 133, 226, 142, 1, 248, 77, 226, 142, 1, 205, 226, - 142, 1, 206, 226, 142, 1, 220, 27, 226, 142, 1, 248, 26, 226, 142, 1, - 250, 216, 226, 142, 1, 243, 136, 226, 142, 1, 244, 197, 226, 142, 1, 224, - 87, 226, 142, 1, 235, 10, 226, 142, 1, 233, 131, 226, 142, 1, 230, 201, - 226, 142, 1, 227, 179, 226, 142, 1, 212, 30, 226, 142, 1, 162, 226, 142, - 1, 191, 226, 142, 1, 61, 226, 142, 1, 75, 226, 142, 1, 73, 226, 142, 1, - 76, 226, 142, 1, 70, 226, 142, 1, 255, 74, 226, 142, 1, 245, 210, 226, - 142, 1, 226, 184, 226, 142, 21, 210, 86, 226, 142, 21, 110, 226, 142, 21, - 105, 226, 142, 21, 158, 226, 142, 21, 161, 226, 142, 21, 189, 226, 142, - 21, 194, 226, 142, 21, 198, 226, 142, 21, 195, 226, 142, 21, 200, 249, - 68, 3, 61, 249, 68, 3, 75, 249, 68, 3, 73, 249, 68, 3, 76, 249, 68, 3, - 70, 249, 68, 3, 235, 142, 249, 68, 3, 235, 69, 249, 68, 3, 176, 249, 68, - 3, 234, 183, 249, 68, 3, 234, 93, 249, 68, 3, 234, 29, 249, 68, 3, 233, - 218, 249, 68, 3, 233, 136, 249, 68, 3, 233, 59, 249, 68, 3, 232, 242, - 249, 68, 3, 232, 157, 249, 68, 3, 232, 99, 249, 68, 3, 185, 249, 68, 3, - 231, 92, 249, 68, 3, 230, 231, 249, 68, 3, 230, 162, 249, 68, 3, 230, - 103, 249, 68, 3, 197, 249, 68, 3, 229, 108, 249, 68, 3, 228, 234, 249, - 68, 3, 228, 75, 249, 68, 3, 227, 238, 249, 68, 3, 190, 249, 68, 3, 225, - 222, 249, 68, 3, 225, 109, 249, 68, 3, 225, 17, 249, 68, 3, 224, 151, - 249, 68, 3, 205, 249, 68, 3, 223, 129, 249, 68, 3, 223, 36, 249, 68, 3, - 222, 212, 249, 68, 3, 222, 141, 249, 68, 3, 206, 249, 68, 3, 221, 182, - 249, 68, 3, 219, 192, 249, 68, 3, 219, 59, 249, 68, 3, 218, 84, 249, 68, - 3, 217, 106, 249, 68, 3, 217, 23, 249, 68, 3, 216, 118, 249, 68, 3, 111, - 249, 68, 3, 215, 119, 249, 68, 3, 212, 65, 249, 68, 3, 212, 22, 249, 68, - 3, 211, 250, 249, 68, 3, 211, 227, 249, 68, 3, 211, 165, 249, 68, 3, 211, - 162, 249, 68, 3, 210, 116, 249, 68, 3, 210, 23, 236, 2, 254, 28, 1, 254, - 169, 236, 2, 254, 28, 1, 252, 26, 236, 2, 254, 28, 1, 242, 202, 236, 2, - 254, 28, 1, 248, 189, 236, 2, 254, 28, 1, 241, 239, 236, 2, 254, 28, 1, - 212, 30, 236, 2, 254, 28, 1, 210, 97, 236, 2, 254, 28, 1, 241, 196, 236, - 2, 254, 28, 1, 216, 227, 236, 2, 254, 28, 1, 210, 232, 236, 2, 254, 28, - 1, 234, 226, 236, 2, 254, 28, 1, 233, 94, 236, 2, 254, 28, 1, 231, 66, - 236, 2, 254, 28, 1, 227, 195, 236, 2, 254, 28, 1, 221, 250, 236, 2, 254, - 28, 1, 253, 163, 236, 2, 254, 28, 1, 225, 222, 236, 2, 254, 28, 1, 222, - 25, 236, 2, 254, 28, 1, 224, 35, 236, 2, 254, 28, 1, 223, 68, 236, 2, - 254, 28, 1, 220, 21, 236, 2, 254, 28, 1, 217, 37, 236, 2, 254, 28, 221, - 174, 50, 236, 2, 254, 28, 54, 110, 236, 2, 254, 28, 54, 105, 236, 2, 254, - 28, 54, 158, 236, 2, 254, 28, 54, 216, 248, 236, 2, 254, 28, 54, 215, 73, - 236, 2, 254, 28, 54, 123, 240, 211, 236, 2, 254, 28, 54, 123, 216, 148, - 236, 2, 254, 28, 54, 216, 249, 216, 148, 225, 120, 1, 254, 166, 225, 120, - 1, 252, 29, 225, 120, 1, 243, 110, 225, 120, 1, 248, 57, 225, 120, 1, - 241, 239, 225, 120, 1, 212, 37, 225, 120, 1, 210, 110, 225, 120, 1, 241, - 198, 225, 120, 1, 216, 231, 225, 120, 1, 210, 233, 225, 120, 1, 234, 251, - 225, 120, 1, 233, 100, 225, 120, 1, 231, 66, 225, 120, 1, 227, 195, 225, - 120, 1, 220, 145, 225, 120, 1, 254, 197, 225, 120, 1, 225, 222, 225, 120, - 1, 222, 26, 225, 120, 1, 224, 40, 225, 120, 1, 222, 190, 225, 120, 1, - 220, 21, 225, 120, 1, 217, 42, 225, 120, 54, 110, 225, 120, 54, 216, 248, - 225, 120, 54, 215, 73, 225, 120, 54, 123, 240, 211, 225, 120, 54, 105, - 225, 120, 54, 158, 225, 120, 211, 209, 220, 138, 232, 60, 1, 61, 232, 60, - 1, 253, 159, 232, 60, 1, 243, 203, 232, 60, 1, 249, 61, 232, 60, 1, 75, - 232, 60, 1, 214, 105, 232, 60, 1, 73, 232, 60, 1, 211, 117, 232, 60, 1, - 235, 24, 232, 60, 1, 156, 232, 60, 1, 193, 232, 60, 1, 230, 26, 232, 60, - 1, 76, 232, 60, 1, 153, 232, 60, 1, 218, 227, 232, 60, 1, 217, 153, 232, - 60, 1, 70, 232, 60, 1, 245, 7, 232, 60, 1, 224, 97, 232, 60, 1, 222, 92, - 232, 60, 1, 215, 160, 232, 60, 1, 254, 124, 232, 60, 1, 245, 151, 232, - 60, 1, 232, 63, 232, 60, 1, 228, 112, 232, 60, 1, 251, 67, 232, 60, 215, - 223, 78, 231, 49, 241, 175, 1, 61, 231, 49, 241, 175, 1, 75, 231, 49, - 241, 175, 1, 73, 231, 49, 241, 175, 1, 76, 231, 49, 241, 175, 1, 191, - 231, 49, 241, 175, 1, 212, 65, 231, 49, 241, 175, 1, 252, 192, 231, 49, - 241, 175, 1, 252, 191, 231, 49, 241, 175, 1, 190, 231, 49, 241, 175, 1, - 185, 231, 49, 241, 175, 1, 197, 231, 49, 241, 175, 1, 229, 229, 231, 49, - 241, 175, 1, 229, 108, 231, 49, 241, 175, 1, 229, 107, 231, 49, 241, 175, - 1, 205, 231, 49, 241, 175, 1, 223, 188, 231, 49, 241, 175, 1, 233, 136, - 231, 49, 241, 175, 1, 234, 133, 231, 49, 241, 175, 1, 241, 190, 231, 49, - 241, 175, 1, 206, 231, 49, 241, 175, 1, 222, 34, 231, 49, 241, 175, 1, - 221, 182, 231, 49, 241, 175, 1, 176, 231, 49, 241, 175, 1, 224, 89, 231, - 49, 241, 175, 1, 217, 106, 231, 49, 241, 175, 1, 217, 105, 231, 49, 241, - 175, 1, 217, 23, 231, 49, 241, 175, 1, 217, 22, 231, 49, 241, 175, 1, - 111, 231, 49, 241, 175, 1, 248, 222, 231, 49, 241, 175, 16, 213, 170, - 231, 49, 241, 175, 16, 213, 169, 231, 49, 249, 95, 1, 61, 231, 49, 249, - 95, 1, 75, 231, 49, 249, 95, 1, 73, 231, 49, 249, 95, 1, 76, 231, 49, - 249, 95, 1, 191, 231, 49, 249, 95, 1, 212, 65, 231, 49, 249, 95, 1, 252, - 192, 231, 49, 249, 95, 1, 190, 231, 49, 249, 95, 1, 185, 231, 49, 249, - 95, 1, 197, 231, 49, 249, 95, 1, 229, 108, 231, 49, 249, 95, 1, 205, 231, - 49, 249, 95, 1, 233, 136, 231, 49, 249, 95, 1, 234, 133, 231, 49, 249, - 95, 1, 241, 190, 231, 49, 249, 95, 1, 206, 231, 49, 249, 95, 1, 254, 24, - 206, 231, 49, 249, 95, 1, 221, 182, 231, 49, 249, 95, 1, 176, 231, 49, - 249, 95, 1, 224, 89, 231, 49, 249, 95, 1, 217, 106, 231, 49, 249, 95, 1, - 217, 23, 231, 49, 249, 95, 1, 111, 231, 49, 249, 95, 1, 248, 222, 231, - 49, 249, 95, 232, 146, 222, 218, 231, 49, 249, 95, 232, 146, 236, 7, 234, - 121, 1, 61, 234, 121, 25, 5, 73, 234, 121, 25, 5, 70, 234, 121, 25, 5, - 149, 153, 234, 121, 25, 5, 75, 234, 121, 25, 5, 76, 234, 121, 25, 233, - 24, 78, 234, 121, 5, 52, 222, 235, 51, 234, 121, 5, 254, 76, 234, 121, 5, - 213, 147, 234, 121, 1, 176, 234, 121, 1, 234, 133, 234, 121, 1, 243, 136, - 234, 121, 1, 242, 250, 234, 121, 1, 251, 34, 234, 121, 1, 250, 158, 234, - 121, 1, 235, 142, 234, 121, 1, 227, 166, 234, 121, 1, 215, 157, 234, 121, - 1, 215, 145, 234, 121, 1, 248, 136, 234, 121, 1, 248, 120, 234, 121, 1, - 228, 111, 234, 121, 1, 217, 106, 234, 121, 1, 216, 209, 234, 121, 1, 248, - 222, 234, 121, 1, 248, 26, 234, 121, 1, 197, 234, 121, 1, 190, 234, 121, - 1, 225, 148, 234, 121, 1, 252, 192, 234, 121, 1, 252, 19, 234, 121, 1, - 185, 234, 121, 1, 191, 234, 121, 1, 205, 234, 121, 1, 233, 136, 234, 121, - 1, 214, 27, 234, 121, 1, 220, 103, 234, 121, 1, 218, 224, 234, 121, 1, - 206, 234, 121, 1, 210, 116, 234, 121, 1, 162, 234, 121, 1, 234, 47, 234, - 121, 1, 215, 125, 234, 121, 5, 252, 142, 48, 234, 121, 5, 250, 222, 234, - 121, 5, 59, 51, 234, 121, 213, 152, 234, 121, 21, 110, 234, 121, 21, 105, - 234, 121, 21, 158, 234, 121, 21, 161, 234, 121, 54, 216, 248, 234, 121, - 54, 215, 73, 234, 121, 54, 123, 240, 211, 234, 121, 54, 123, 216, 148, - 234, 121, 224, 142, 247, 121, 234, 121, 224, 142, 4, 250, 36, 234, 121, - 224, 142, 250, 36, 234, 121, 224, 142, 249, 138, 130, 234, 121, 224, 142, - 231, 181, 234, 121, 224, 142, 232, 116, 234, 121, 224, 142, 248, 179, - 234, 121, 224, 142, 52, 248, 179, 234, 121, 224, 142, 232, 208, 55, 219, - 29, 254, 39, 1, 241, 239, 55, 219, 29, 254, 39, 1, 233, 94, 55, 219, 29, - 254, 39, 1, 241, 196, 55, 219, 29, 254, 39, 1, 231, 66, 55, 219, 29, 254, - 39, 1, 224, 35, 55, 219, 29, 254, 39, 1, 212, 30, 55, 219, 29, 254, 39, - 1, 220, 21, 55, 219, 29, 254, 39, 1, 223, 68, 55, 219, 29, 254, 39, 1, - 252, 26, 55, 219, 29, 254, 39, 1, 217, 37, 55, 219, 29, 254, 39, 1, 221, - 227, 55, 219, 29, 254, 39, 1, 234, 226, 55, 219, 29, 254, 39, 1, 227, - 195, 55, 219, 29, 254, 39, 1, 234, 117, 55, 219, 29, 254, 39, 1, 222, 25, - 55, 219, 29, 254, 39, 1, 221, 250, 55, 219, 29, 254, 39, 1, 244, 155, 55, - 219, 29, 254, 39, 1, 254, 171, 55, 219, 29, 254, 39, 1, 253, 162, 55, - 219, 29, 254, 39, 1, 248, 23, 55, 219, 29, 254, 39, 1, 242, 202, 55, 219, - 29, 254, 39, 1, 248, 189, 55, 219, 29, 254, 39, 1, 242, 239, 55, 219, 29, - 254, 39, 1, 216, 227, 55, 219, 29, 254, 39, 1, 210, 96, 55, 219, 29, 254, - 39, 1, 248, 20, 55, 219, 29, 254, 39, 1, 210, 232, 55, 219, 29, 254, 39, - 1, 216, 198, 55, 219, 29, 254, 39, 1, 216, 179, 55, 219, 29, 254, 39, 54, - 110, 55, 219, 29, 254, 39, 54, 244, 115, 55, 219, 29, 254, 39, 132, 235, - 239, 253, 173, 1, 61, 253, 173, 1, 255, 74, 253, 173, 1, 254, 74, 253, - 173, 1, 255, 33, 253, 173, 1, 254, 124, 253, 173, 1, 255, 34, 253, 173, - 1, 254, 244, 253, 173, 1, 254, 240, 253, 173, 1, 75, 253, 173, 1, 245, - 210, 253, 173, 1, 76, 253, 173, 1, 226, 184, 253, 173, 1, 73, 253, 173, - 1, 236, 34, 253, 173, 1, 70, 253, 173, 1, 214, 118, 253, 173, 1, 234, - 183, 253, 173, 1, 211, 162, 253, 173, 1, 211, 128, 253, 173, 1, 211, 137, - 253, 173, 1, 243, 63, 253, 173, 1, 243, 25, 253, 173, 1, 242, 237, 253, - 173, 1, 250, 191, 253, 173, 1, 235, 127, 253, 173, 1, 217, 23, 253, 173, - 1, 216, 196, 253, 173, 1, 248, 91, 253, 173, 1, 248, 18, 253, 173, 1, - 215, 152, 253, 173, 1, 225, 222, 253, 173, 1, 244, 155, 253, 173, 1, 252, - 76, 253, 173, 1, 252, 15, 253, 173, 1, 229, 65, 253, 173, 1, 228, 240, - 253, 173, 1, 228, 241, 253, 173, 1, 229, 108, 253, 173, 1, 227, 157, 253, - 173, 1, 228, 106, 253, 173, 1, 231, 92, 253, 173, 1, 241, 117, 253, 173, - 1, 210, 166, 253, 173, 1, 211, 47, 253, 173, 1, 213, 255, 253, 173, 1, - 223, 129, 253, 173, 1, 233, 59, 253, 173, 1, 221, 182, 253, 173, 1, 210, - 94, 253, 173, 1, 220, 64, 253, 173, 1, 210, 74, 253, 173, 1, 219, 199, - 253, 173, 1, 218, 194, 253, 173, 1, 241, 239, 253, 173, 255, 22, 78, 216, - 80, 113, 170, 117, 123, 59, 224, 141, 4, 113, 170, 117, 123, 59, 224, - 141, 233, 86, 113, 170, 117, 123, 59, 224, 141, 233, 86, 123, 59, 117, - 113, 170, 224, 141, 233, 86, 113, 222, 233, 117, 123, 222, 235, 224, 141, - 233, 86, 123, 222, 235, 117, 113, 222, 233, 224, 141, 235, 219, 225, 255, - 1, 254, 169, 235, 219, 225, 255, 1, 252, 26, 235, 219, 225, 255, 1, 242, - 202, 235, 219, 225, 255, 1, 248, 189, 235, 219, 225, 255, 1, 241, 239, - 235, 219, 225, 255, 1, 212, 30, 235, 219, 225, 255, 1, 210, 97, 235, 219, - 225, 255, 1, 241, 196, 235, 219, 225, 255, 1, 216, 227, 235, 219, 225, - 255, 1, 210, 232, 235, 219, 225, 255, 1, 234, 226, 235, 219, 225, 255, 1, - 233, 94, 235, 219, 225, 255, 1, 231, 66, 235, 219, 225, 255, 1, 227, 195, - 235, 219, 225, 255, 1, 221, 250, 235, 219, 225, 255, 1, 253, 163, 235, - 219, 225, 255, 1, 225, 222, 235, 219, 225, 255, 1, 222, 25, 235, 219, - 225, 255, 1, 224, 35, 235, 219, 225, 255, 1, 223, 68, 235, 219, 225, 255, - 1, 220, 21, 235, 219, 225, 255, 1, 217, 37, 235, 219, 225, 255, 54, 110, - 235, 219, 225, 255, 54, 105, 235, 219, 225, 255, 54, 158, 235, 219, 225, - 255, 54, 161, 235, 219, 225, 255, 54, 216, 248, 235, 219, 225, 255, 54, - 215, 73, 235, 219, 225, 255, 54, 123, 240, 211, 235, 219, 225, 255, 54, - 123, 216, 148, 235, 219, 226, 73, 1, 254, 169, 235, 219, 226, 73, 1, 252, - 26, 235, 219, 226, 73, 1, 242, 202, 235, 219, 226, 73, 1, 248, 189, 235, - 219, 226, 73, 1, 241, 239, 235, 219, 226, 73, 1, 212, 29, 235, 219, 226, - 73, 1, 210, 97, 235, 219, 226, 73, 1, 241, 196, 235, 219, 226, 73, 1, - 216, 227, 235, 219, 226, 73, 1, 210, 232, 235, 219, 226, 73, 1, 234, 226, - 235, 219, 226, 73, 1, 233, 94, 235, 219, 226, 73, 1, 231, 65, 235, 219, - 226, 73, 1, 227, 195, 235, 219, 226, 73, 1, 221, 250, 235, 219, 226, 73, - 1, 225, 222, 235, 219, 226, 73, 1, 222, 25, 235, 219, 226, 73, 1, 220, - 21, 235, 219, 226, 73, 1, 217, 37, 235, 219, 226, 73, 54, 110, 235, 219, - 226, 73, 54, 105, 235, 219, 226, 73, 54, 158, 235, 219, 226, 73, 54, 161, - 235, 219, 226, 73, 54, 216, 248, 235, 219, 226, 73, 54, 215, 73, 235, - 219, 226, 73, 54, 123, 240, 211, 235, 219, 226, 73, 54, 123, 216, 148, - 55, 201, 1, 226, 150, 61, 55, 201, 1, 211, 37, 61, 55, 201, 1, 211, 37, - 254, 244, 55, 201, 1, 226, 150, 73, 55, 201, 1, 211, 37, 73, 55, 201, 1, - 211, 37, 75, 55, 201, 1, 226, 150, 76, 55, 201, 1, 226, 150, 226, 235, - 55, 201, 1, 211, 37, 226, 235, 55, 201, 1, 226, 150, 255, 26, 55, 201, 1, - 211, 37, 255, 26, 55, 201, 1, 226, 150, 254, 243, 55, 201, 1, 211, 37, - 254, 243, 55, 201, 1, 226, 150, 254, 217, 55, 201, 1, 211, 37, 254, 217, - 55, 201, 1, 226, 150, 254, 238, 55, 201, 1, 211, 37, 254, 238, 55, 201, - 1, 226, 150, 255, 0, 55, 201, 1, 211, 37, 255, 0, 55, 201, 1, 226, 150, - 254, 242, 55, 201, 1, 226, 150, 245, 13, 55, 201, 1, 211, 37, 245, 13, - 55, 201, 1, 226, 150, 253, 168, 55, 201, 1, 211, 37, 253, 168, 55, 201, - 1, 226, 150, 254, 225, 55, 201, 1, 211, 37, 254, 225, 55, 201, 1, 226, - 150, 254, 236, 55, 201, 1, 211, 37, 254, 236, 55, 201, 1, 226, 150, 226, - 234, 55, 201, 1, 211, 37, 226, 234, 55, 201, 1, 226, 150, 254, 179, 55, - 201, 1, 211, 37, 254, 179, 55, 201, 1, 226, 150, 254, 235, 55, 201, 1, - 226, 150, 245, 162, 55, 201, 1, 226, 150, 245, 160, 55, 201, 1, 226, 150, - 254, 124, 55, 201, 1, 226, 150, 254, 233, 55, 201, 1, 211, 37, 254, 233, - 55, 201, 1, 226, 150, 245, 132, 55, 201, 1, 211, 37, 245, 132, 55, 201, - 1, 226, 150, 245, 148, 55, 201, 1, 211, 37, 245, 148, 55, 201, 1, 226, - 150, 245, 119, 55, 201, 1, 211, 37, 245, 119, 55, 201, 1, 211, 37, 254, - 116, 55, 201, 1, 226, 150, 245, 139, 55, 201, 1, 211, 37, 254, 232, 55, - 201, 1, 226, 150, 245, 109, 55, 201, 1, 226, 150, 226, 176, 55, 201, 1, - 226, 150, 240, 114, 55, 201, 1, 226, 150, 245, 216, 55, 201, 1, 211, 37, - 245, 216, 55, 201, 1, 226, 150, 254, 46, 55, 201, 1, 211, 37, 254, 46, - 55, 201, 1, 226, 150, 235, 182, 55, 201, 1, 211, 37, 235, 182, 55, 201, - 1, 226, 150, 226, 160, 55, 201, 1, 211, 37, 226, 160, 55, 201, 1, 226, - 150, 254, 42, 55, 201, 1, 211, 37, 254, 42, 55, 201, 1, 226, 150, 254, - 231, 55, 201, 1, 226, 150, 253, 238, 55, 201, 1, 226, 150, 254, 229, 55, - 201, 1, 226, 150, 253, 232, 55, 201, 1, 211, 37, 253, 232, 55, 201, 1, - 226, 150, 245, 76, 55, 201, 1, 211, 37, 245, 76, 55, 201, 1, 226, 150, - 253, 207, 55, 201, 1, 211, 37, 253, 207, 55, 201, 1, 226, 150, 254, 226, - 55, 201, 1, 211, 37, 254, 226, 55, 201, 1, 226, 150, 226, 141, 55, 201, - 1, 226, 150, 252, 126, 222, 128, 21, 110, 222, 128, 21, 105, 222, 128, - 21, 158, 222, 128, 21, 161, 222, 128, 21, 189, 222, 128, 21, 194, 222, - 128, 21, 198, 222, 128, 21, 195, 222, 128, 21, 200, 222, 128, 54, 216, - 248, 222, 128, 54, 215, 73, 222, 128, 54, 216, 163, 222, 128, 54, 244, - 16, 222, 128, 54, 244, 115, 222, 128, 54, 219, 112, 222, 128, 54, 220, - 117, 222, 128, 54, 245, 185, 222, 128, 54, 228, 196, 222, 128, 54, 123, - 240, 211, 222, 128, 54, 113, 240, 211, 222, 128, 54, 134, 240, 211, 222, - 128, 54, 244, 12, 240, 211, 222, 128, 54, 244, 82, 240, 211, 222, 128, - 54, 219, 126, 240, 211, 222, 128, 54, 220, 123, 240, 211, 222, 128, 54, - 245, 194, 240, 211, 222, 128, 54, 228, 201, 240, 211, 222, 128, 244, 3, - 123, 242, 28, 222, 128, 244, 3, 123, 224, 22, 222, 128, 244, 3, 123, 216, - 169, 222, 128, 244, 3, 113, 216, 167, 118, 5, 251, 0, 118, 5, 254, 76, - 118, 5, 213, 147, 118, 5, 235, 103, 118, 5, 214, 161, 118, 1, 61, 118, 1, - 255, 74, 118, 1, 73, 118, 1, 236, 34, 118, 1, 70, 118, 1, 214, 118, 118, - 1, 149, 153, 118, 1, 149, 222, 181, 118, 1, 149, 156, 118, 1, 149, 232, - 186, 118, 1, 75, 118, 1, 254, 202, 118, 1, 76, 118, 1, 253, 193, 118, 1, - 176, 118, 1, 234, 133, 118, 1, 243, 136, 118, 1, 242, 250, 118, 1, 229, - 78, 118, 1, 251, 34, 118, 1, 250, 158, 118, 1, 235, 142, 118, 1, 235, - 115, 118, 1, 227, 166, 118, 1, 215, 157, 118, 1, 215, 145, 118, 1, 248, - 136, 118, 1, 248, 120, 118, 1, 228, 111, 118, 1, 217, 106, 118, 1, 216, - 209, 118, 1, 248, 222, 118, 1, 248, 26, 118, 1, 197, 118, 1, 190, 118, 1, - 225, 148, 118, 1, 252, 192, 118, 1, 252, 19, 118, 1, 185, 118, 1, 191, - 118, 1, 205, 118, 1, 233, 136, 118, 1, 214, 27, 118, 1, 220, 103, 118, 1, - 218, 224, 118, 1, 206, 118, 1, 162, 118, 1, 232, 185, 118, 1, 55, 36, - 232, 176, 118, 1, 55, 36, 222, 180, 118, 1, 55, 36, 228, 93, 118, 25, 5, - 255, 74, 118, 25, 5, 252, 16, 255, 74, 118, 25, 5, 73, 118, 25, 5, 236, - 34, 118, 25, 5, 70, 118, 25, 5, 214, 118, 118, 25, 5, 149, 153, 118, 25, - 5, 149, 222, 181, 118, 25, 5, 149, 156, 118, 25, 5, 149, 232, 186, 118, - 25, 5, 75, 118, 25, 5, 254, 202, 118, 25, 5, 76, 118, 25, 5, 253, 193, - 118, 213, 152, 118, 248, 179, 118, 52, 248, 179, 118, 224, 142, 247, 121, - 118, 224, 142, 52, 247, 121, 118, 224, 142, 232, 214, 118, 224, 142, 249, - 138, 130, 118, 224, 142, 232, 116, 118, 54, 110, 118, 54, 105, 118, 54, - 158, 118, 54, 161, 118, 54, 189, 118, 54, 194, 118, 54, 198, 118, 54, - 195, 118, 54, 200, 118, 54, 216, 248, 118, 54, 215, 73, 118, 54, 216, - 163, 118, 54, 244, 16, 118, 54, 244, 115, 118, 54, 219, 112, 118, 54, - 220, 117, 118, 54, 245, 185, 118, 54, 228, 196, 118, 54, 123, 240, 211, - 118, 54, 123, 216, 148, 118, 21, 210, 86, 118, 21, 110, 118, 21, 105, - 118, 21, 158, 118, 21, 161, 118, 21, 189, 118, 21, 194, 118, 21, 198, - 118, 21, 195, 118, 21, 200, 234, 245, 5, 251, 0, 234, 245, 5, 254, 76, - 234, 245, 5, 213, 147, 234, 245, 1, 61, 234, 245, 1, 255, 74, 234, 245, - 1, 73, 234, 245, 1, 236, 34, 234, 245, 1, 70, 234, 245, 1, 214, 118, 234, - 245, 1, 75, 234, 245, 1, 254, 202, 234, 245, 1, 76, 234, 245, 1, 253, - 193, 234, 245, 1, 176, 234, 245, 1, 234, 133, 234, 245, 1, 243, 136, 234, - 245, 1, 242, 250, 234, 245, 1, 229, 78, 234, 245, 1, 251, 34, 234, 245, - 1, 250, 158, 234, 245, 1, 235, 142, 234, 245, 1, 235, 115, 234, 245, 1, - 227, 166, 234, 245, 1, 215, 157, 234, 245, 1, 215, 145, 234, 245, 1, 248, - 136, 234, 245, 1, 248, 125, 234, 245, 1, 248, 120, 234, 245, 1, 223, 40, - 234, 245, 1, 228, 111, 234, 245, 1, 217, 106, 234, 245, 1, 216, 209, 234, - 245, 1, 248, 222, 234, 245, 1, 248, 26, 234, 245, 1, 197, 234, 245, 1, - 190, 234, 245, 1, 225, 148, 234, 245, 1, 252, 192, 234, 245, 1, 252, 19, - 234, 245, 1, 185, 234, 245, 1, 191, 234, 245, 1, 205, 234, 245, 1, 233, - 136, 234, 245, 1, 214, 27, 234, 245, 1, 220, 103, 234, 245, 1, 218, 224, - 234, 245, 1, 206, 234, 245, 1, 162, 234, 245, 25, 5, 255, 74, 234, 245, - 25, 5, 73, 234, 245, 25, 5, 236, 34, 234, 245, 25, 5, 70, 234, 245, 25, - 5, 214, 118, 234, 245, 25, 5, 75, 234, 245, 25, 5, 254, 202, 234, 245, - 25, 5, 76, 234, 245, 25, 5, 253, 193, 234, 245, 5, 213, 152, 234, 245, 5, - 227, 206, 234, 245, 255, 22, 50, 234, 245, 245, 122, 50, 234, 245, 54, - 50, 234, 245, 221, 174, 78, 234, 245, 52, 221, 174, 78, 234, 245, 248, - 179, 234, 245, 52, 248, 179, 219, 37, 219, 45, 1, 222, 19, 219, 37, 219, - 45, 1, 217, 81, 219, 37, 219, 45, 1, 252, 169, 219, 37, 219, 45, 1, 251, - 24, 219, 37, 219, 45, 1, 248, 204, 219, 37, 219, 45, 1, 243, 121, 219, - 37, 219, 45, 1, 231, 211, 219, 37, 219, 45, 1, 229, 75, 219, 37, 219, 45, - 1, 233, 113, 219, 37, 219, 45, 1, 229, 214, 219, 37, 219, 45, 1, 214, 24, - 219, 37, 219, 45, 1, 226, 74, 219, 37, 219, 45, 1, 211, 84, 219, 37, 219, - 45, 1, 223, 169, 219, 37, 219, 45, 1, 242, 38, 219, 37, 219, 45, 1, 234, - 249, 219, 37, 219, 45, 1, 235, 137, 219, 37, 219, 45, 1, 227, 163, 219, - 37, 219, 45, 1, 254, 210, 219, 37, 219, 45, 1, 245, 208, 219, 37, 219, - 45, 1, 236, 35, 219, 37, 219, 45, 1, 214, 208, 219, 37, 219, 45, 1, 226, - 223, 219, 37, 219, 45, 1, 245, 198, 219, 37, 219, 45, 1, 231, 224, 219, - 37, 219, 45, 21, 210, 86, 219, 37, 219, 45, 21, 110, 219, 37, 219, 45, - 21, 105, 219, 37, 219, 45, 21, 158, 219, 37, 219, 45, 21, 161, 219, 37, - 219, 45, 21, 189, 219, 37, 219, 45, 21, 194, 219, 37, 219, 45, 21, 198, - 219, 37, 219, 45, 21, 195, 219, 37, 219, 45, 21, 200, 250, 152, 5, 251, - 0, 250, 152, 5, 254, 76, 250, 152, 5, 213, 147, 250, 152, 1, 255, 74, - 250, 152, 1, 73, 250, 152, 1, 70, 250, 152, 1, 75, 250, 152, 1, 235, 11, - 250, 152, 1, 234, 132, 250, 152, 1, 243, 133, 250, 152, 1, 242, 249, 250, - 152, 1, 229, 77, 250, 152, 1, 251, 33, 250, 152, 1, 250, 157, 250, 152, - 1, 235, 141, 250, 152, 1, 235, 114, 250, 152, 1, 227, 165, 250, 152, 1, - 215, 156, 250, 152, 1, 215, 144, 250, 152, 1, 248, 135, 250, 152, 1, 248, - 119, 250, 152, 1, 228, 110, 250, 152, 1, 217, 102, 250, 152, 1, 216, 208, - 250, 152, 1, 248, 221, 250, 152, 1, 248, 25, 250, 152, 1, 229, 226, 250, - 152, 1, 226, 90, 250, 152, 1, 225, 147, 250, 152, 1, 252, 190, 250, 152, - 1, 252, 18, 250, 152, 1, 231, 238, 250, 152, 1, 210, 167, 250, 152, 1, - 211, 103, 250, 152, 1, 223, 185, 250, 152, 1, 233, 135, 250, 152, 1, 212, - 64, 250, 152, 1, 222, 32, 250, 152, 1, 242, 47, 250, 152, 25, 5, 61, 250, - 152, 25, 5, 73, 250, 152, 25, 5, 236, 34, 250, 152, 25, 5, 70, 250, 152, - 25, 5, 214, 118, 250, 152, 25, 5, 75, 250, 152, 25, 5, 254, 202, 250, - 152, 25, 5, 76, 250, 152, 25, 5, 253, 193, 250, 152, 25, 5, 226, 220, - 250, 152, 144, 78, 250, 152, 253, 194, 78, 250, 152, 213, 152, 250, 152, - 231, 236, 250, 152, 21, 210, 86, 250, 152, 21, 110, 250, 152, 21, 105, - 250, 152, 21, 158, 250, 152, 21, 161, 250, 152, 21, 189, 250, 152, 21, - 194, 250, 152, 21, 198, 250, 152, 21, 195, 250, 152, 21, 200, 250, 152, - 221, 174, 78, 250, 152, 248, 179, 250, 152, 52, 248, 179, 250, 152, 224, - 14, 78, 174, 5, 251, 0, 174, 5, 254, 76, 174, 5, 213, 147, 174, 1, 61, - 174, 1, 255, 74, 174, 1, 73, 174, 1, 236, 34, 174, 1, 70, 174, 1, 214, - 118, 174, 1, 149, 153, 174, 1, 149, 222, 181, 174, 1, 149, 156, 174, 1, - 149, 232, 186, 174, 1, 75, 174, 1, 254, 202, 174, 1, 76, 174, 1, 253, - 193, 174, 1, 176, 174, 1, 234, 133, 174, 1, 243, 136, 174, 1, 242, 250, - 174, 1, 229, 78, 174, 1, 251, 34, 174, 1, 250, 158, 174, 1, 235, 142, - 174, 1, 235, 115, 174, 1, 227, 166, 174, 1, 215, 157, 174, 1, 215, 145, - 174, 1, 248, 136, 174, 1, 248, 120, 174, 1, 228, 111, 174, 1, 217, 106, - 174, 1, 216, 209, 174, 1, 248, 222, 174, 1, 248, 26, 174, 1, 197, 174, 1, - 190, 174, 1, 225, 148, 174, 1, 252, 192, 174, 1, 252, 19, 174, 1, 185, - 174, 1, 191, 174, 1, 205, 174, 1, 233, 136, 174, 1, 232, 185, 174, 1, - 214, 27, 174, 1, 220, 103, 174, 1, 218, 224, 174, 1, 206, 174, 1, 162, - 174, 25, 5, 255, 74, 174, 25, 5, 73, 174, 25, 5, 236, 34, 174, 25, 5, 70, - 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, 5, 149, 222, 181, - 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 186, 174, 25, 5, 75, 174, 25, - 5, 254, 202, 174, 25, 5, 76, 174, 25, 5, 253, 193, 174, 5, 213, 152, 174, - 5, 253, 176, 174, 5, 235, 103, 174, 5, 214, 161, 174, 226, 205, 174, 248, - 179, 174, 52, 248, 179, 174, 255, 22, 50, 174, 220, 138, 174, 21, 210, - 86, 174, 21, 110, 174, 21, 105, 174, 21, 158, 174, 21, 161, 174, 21, 189, - 174, 21, 194, 174, 21, 198, 174, 21, 195, 174, 21, 200, 217, 70, 1, 61, - 217, 70, 1, 255, 74, 217, 70, 1, 73, 217, 70, 1, 236, 34, 217, 70, 1, 70, - 217, 70, 1, 214, 118, 217, 70, 1, 75, 217, 70, 1, 254, 202, 217, 70, 1, - 76, 217, 70, 1, 253, 193, 217, 70, 1, 176, 217, 70, 1, 234, 133, 217, 70, - 1, 243, 136, 217, 70, 1, 242, 250, 217, 70, 1, 229, 78, 217, 70, 1, 251, - 34, 217, 70, 1, 250, 158, 217, 70, 1, 235, 142, 217, 70, 1, 235, 115, - 217, 70, 1, 227, 166, 217, 70, 1, 215, 157, 217, 70, 1, 215, 145, 217, - 70, 1, 248, 136, 217, 70, 1, 248, 120, 217, 70, 1, 228, 111, 217, 70, 1, - 217, 106, 217, 70, 1, 216, 209, 217, 70, 1, 248, 222, 217, 70, 1, 248, - 26, 217, 70, 1, 197, 217, 70, 1, 190, 217, 70, 1, 225, 148, 217, 70, 1, - 252, 192, 217, 70, 1, 252, 19, 217, 70, 1, 185, 217, 70, 1, 191, 217, 70, - 1, 205, 217, 70, 1, 233, 136, 217, 70, 1, 214, 27, 217, 70, 1, 220, 103, - 217, 70, 1, 206, 217, 70, 1, 162, 217, 70, 1, 222, 180, 217, 70, 5, 254, - 76, 217, 70, 5, 213, 147, 217, 70, 25, 5, 255, 74, 217, 70, 25, 5, 73, - 217, 70, 25, 5, 236, 34, 217, 70, 25, 5, 70, 217, 70, 25, 5, 214, 118, - 217, 70, 25, 5, 75, 217, 70, 25, 5, 254, 202, 217, 70, 25, 5, 76, 217, - 70, 25, 5, 253, 193, 217, 70, 5, 213, 152, 217, 70, 5, 227, 206, 217, 70, - 21, 210, 86, 217, 70, 21, 110, 217, 70, 21, 105, 217, 70, 21, 158, 217, - 70, 21, 161, 217, 70, 21, 189, 217, 70, 21, 194, 217, 70, 21, 198, 217, - 70, 21, 195, 217, 70, 21, 200, 15, 5, 61, 15, 5, 115, 30, 61, 15, 5, 115, - 30, 252, 177, 15, 5, 115, 30, 243, 106, 216, 240, 15, 5, 115, 30, 162, - 15, 5, 115, 30, 236, 36, 15, 5, 115, 30, 233, 117, 242, 95, 15, 5, 115, - 30, 230, 62, 15, 5, 115, 30, 222, 22, 15, 5, 255, 76, 15, 5, 255, 26, 15, - 5, 255, 27, 30, 253, 230, 15, 5, 255, 27, 30, 246, 68, 242, 95, 15, 5, - 255, 27, 30, 243, 119, 15, 5, 255, 27, 30, 243, 106, 216, 240, 15, 5, - 255, 27, 30, 162, 15, 5, 255, 27, 30, 236, 37, 242, 95, 15, 5, 255, 27, - 30, 236, 10, 15, 5, 255, 27, 30, 233, 118, 15, 5, 255, 27, 30, 220, 49, - 15, 5, 255, 27, 30, 104, 96, 104, 96, 70, 15, 5, 255, 27, 242, 95, 15, 5, - 255, 24, 15, 5, 255, 25, 30, 252, 161, 15, 5, 255, 25, 30, 243, 106, 216, - 240, 15, 5, 255, 25, 30, 231, 93, 96, 245, 151, 15, 5, 255, 25, 30, 220, - 101, 15, 5, 255, 25, 30, 217, 73, 15, 5, 255, 0, 15, 5, 254, 187, 15, 5, - 254, 188, 30, 245, 88, 15, 5, 254, 188, 30, 220, 11, 96, 242, 191, 15, 5, - 254, 179, 15, 5, 254, 180, 30, 254, 179, 15, 5, 254, 180, 30, 247, 217, - 15, 5, 254, 180, 30, 242, 191, 15, 5, 254, 180, 30, 162, 15, 5, 254, 180, - 30, 235, 0, 15, 5, 254, 180, 30, 234, 93, 15, 5, 254, 180, 30, 220, 64, - 15, 5, 254, 180, 30, 214, 126, 15, 5, 254, 176, 15, 5, 254, 169, 15, 5, - 254, 133, 15, 5, 254, 134, 30, 220, 64, 15, 5, 254, 124, 15, 5, 254, 125, - 117, 254, 124, 15, 5, 254, 125, 134, 216, 86, 15, 5, 254, 125, 96, 229, - 218, 226, 165, 254, 125, 96, 229, 217, 15, 5, 254, 125, 96, 229, 218, - 218, 234, 15, 5, 254, 95, 15, 5, 254, 68, 15, 5, 254, 36, 15, 5, 254, 37, - 30, 233, 197, 15, 5, 254, 9, 15, 5, 253, 237, 15, 5, 253, 232, 15, 5, - 253, 233, 210, 40, 216, 240, 15, 5, 253, 233, 235, 4, 216, 240, 15, 5, - 253, 233, 117, 253, 233, 215, 115, 117, 215, 115, 215, 115, 117, 215, - 115, 226, 22, 15, 5, 253, 233, 117, 253, 233, 117, 253, 232, 15, 5, 253, - 233, 117, 253, 233, 117, 253, 233, 249, 126, 253, 233, 117, 253, 233, - 117, 253, 232, 15, 5, 253, 230, 15, 5, 253, 227, 15, 5, 252, 192, 15, 5, - 252, 177, 15, 5, 252, 172, 15, 5, 252, 168, 15, 5, 252, 162, 15, 5, 252, - 163, 117, 252, 162, 15, 5, 252, 161, 15, 5, 130, 15, 5, 252, 141, 15, 5, - 252, 7, 15, 5, 252, 8, 30, 61, 15, 5, 252, 8, 30, 243, 97, 15, 5, 252, 8, - 30, 236, 37, 242, 95, 15, 5, 251, 126, 15, 5, 251, 127, 117, 251, 127, - 255, 26, 15, 5, 251, 127, 117, 251, 127, 214, 190, 15, 5, 251, 127, 249, - 126, 251, 126, 15, 5, 251, 110, 15, 5, 251, 111, 117, 251, 110, 15, 5, - 251, 99, 15, 5, 251, 98, 15, 5, 248, 222, 15, 5, 248, 213, 15, 5, 248, - 214, 234, 67, 30, 115, 96, 231, 148, 15, 5, 248, 214, 234, 67, 30, 254, - 133, 15, 5, 248, 214, 234, 67, 30, 252, 161, 15, 5, 248, 214, 234, 67, - 30, 252, 7, 15, 5, 248, 214, 234, 67, 30, 243, 136, 15, 5, 248, 214, 234, - 67, 30, 243, 137, 96, 231, 148, 15, 5, 248, 214, 234, 67, 30, 242, 215, - 15, 5, 248, 214, 234, 67, 30, 242, 198, 15, 5, 248, 214, 234, 67, 30, - 242, 104, 15, 5, 248, 214, 234, 67, 30, 162, 15, 5, 248, 214, 234, 67, - 30, 235, 180, 15, 5, 248, 214, 234, 67, 30, 235, 181, 96, 232, 99, 15, 5, - 248, 214, 234, 67, 30, 234, 243, 15, 5, 248, 214, 234, 67, 30, 233, 136, - 15, 5, 248, 214, 234, 67, 30, 232, 99, 15, 5, 248, 214, 234, 67, 30, 232, - 100, 96, 231, 147, 15, 5, 248, 214, 234, 67, 30, 232, 85, 15, 5, 248, - 214, 234, 67, 30, 229, 108, 15, 5, 248, 214, 234, 67, 30, 226, 23, 96, - 226, 22, 15, 5, 248, 214, 234, 67, 30, 219, 192, 15, 5, 248, 214, 234, - 67, 30, 217, 73, 15, 5, 248, 214, 234, 67, 30, 214, 231, 96, 242, 198, - 15, 5, 248, 214, 234, 67, 30, 214, 126, 15, 5, 248, 188, 15, 5, 248, 167, - 15, 5, 248, 166, 15, 5, 248, 165, 15, 5, 248, 4, 15, 5, 247, 243, 15, 5, - 247, 218, 15, 5, 247, 219, 30, 220, 64, 15, 5, 247, 217, 15, 5, 247, 207, - 15, 5, 247, 208, 234, 209, 104, 242, 96, 247, 188, 15, 5, 247, 188, 15, - 5, 246, 79, 15, 5, 246, 80, 117, 246, 79, 15, 5, 246, 80, 242, 95, 15, 5, - 246, 80, 220, 46, 15, 5, 246, 77, 15, 5, 246, 78, 30, 245, 73, 15, 5, - 246, 76, 15, 5, 246, 75, 15, 5, 246, 74, 15, 5, 246, 73, 15, 5, 246, 69, - 15, 5, 246, 67, 15, 5, 246, 68, 242, 95, 15, 5, 246, 68, 242, 96, 242, - 95, 15, 5, 246, 66, 15, 5, 246, 59, 15, 5, 75, 15, 5, 160, 30, 226, 22, - 15, 5, 160, 117, 160, 227, 196, 117, 227, 195, 15, 5, 245, 235, 15, 5, - 245, 236, 30, 115, 96, 242, 50, 96, 248, 222, 15, 5, 245, 236, 30, 243, - 97, 15, 5, 245, 236, 30, 230, 231, 15, 5, 245, 236, 30, 222, 9, 15, 5, - 245, 236, 30, 220, 64, 15, 5, 245, 236, 30, 70, 15, 5, 245, 212, 15, 5, - 245, 201, 15, 5, 245, 175, 15, 5, 245, 151, 15, 5, 245, 152, 30, 243, - 105, 15, 5, 245, 152, 30, 243, 106, 216, 240, 15, 5, 245, 152, 30, 231, - 92, 15, 5, 245, 152, 249, 126, 245, 151, 15, 5, 245, 152, 226, 165, 245, - 151, 15, 5, 245, 152, 218, 234, 15, 5, 245, 90, 15, 5, 245, 88, 15, 5, - 245, 73, 15, 5, 245, 11, 15, 5, 245, 12, 30, 61, 15, 5, 245, 12, 30, 115, - 96, 233, 105, 15, 5, 245, 12, 30, 115, 96, 233, 106, 30, 233, 105, 15, 5, - 245, 12, 30, 254, 124, 15, 5, 245, 12, 30, 252, 177, 15, 5, 245, 12, 30, - 246, 68, 242, 95, 15, 5, 245, 12, 30, 246, 68, 242, 96, 242, 95, 15, 5, - 245, 12, 30, 162, 15, 5, 245, 12, 30, 242, 50, 242, 95, 15, 5, 245, 12, - 30, 236, 37, 242, 95, 15, 5, 245, 12, 30, 234, 208, 15, 5, 245, 12, 30, - 234, 209, 218, 234, 15, 5, 245, 12, 30, 233, 216, 15, 5, 245, 12, 30, - 233, 136, 15, 5, 245, 12, 30, 233, 106, 30, 233, 105, 15, 5, 245, 12, 30, - 232, 242, 15, 5, 245, 12, 30, 232, 99, 15, 5, 245, 12, 30, 214, 230, 15, - 5, 245, 12, 30, 214, 219, 15, 5, 243, 136, 15, 5, 243, 137, 242, 95, 15, - 5, 243, 134, 15, 5, 243, 135, 30, 115, 96, 248, 223, 96, 162, 15, 5, 243, - 135, 30, 115, 96, 162, 15, 5, 243, 135, 30, 115, 96, 236, 36, 15, 5, 243, - 135, 30, 255, 25, 216, 241, 96, 217, 94, 15, 5, 243, 135, 30, 254, 124, - 15, 5, 243, 135, 30, 253, 232, 15, 5, 243, 135, 30, 253, 231, 96, 243, - 119, 15, 5, 243, 135, 30, 252, 177, 15, 5, 243, 135, 30, 252, 142, 96, - 205, 15, 5, 243, 135, 30, 251, 99, 15, 5, 243, 135, 30, 251, 100, 96, - 205, 15, 5, 243, 135, 30, 248, 222, 15, 5, 243, 135, 30, 248, 4, 15, 5, - 243, 135, 30, 247, 219, 30, 220, 64, 15, 5, 243, 135, 30, 246, 77, 15, 5, - 243, 135, 30, 245, 175, 15, 5, 243, 135, 30, 245, 176, 96, 233, 136, 15, - 5, 243, 135, 30, 245, 151, 15, 5, 243, 135, 30, 245, 152, 30, 243, 106, - 216, 240, 15, 5, 243, 135, 30, 243, 106, 216, 240, 15, 5, 243, 135, 30, - 243, 97, 15, 5, 243, 135, 30, 242, 215, 15, 5, 243, 135, 30, 242, 213, - 15, 5, 243, 135, 30, 242, 214, 96, 61, 15, 5, 243, 135, 30, 242, 199, 96, - 218, 84, 15, 5, 243, 135, 30, 242, 50, 96, 232, 100, 96, 245, 73, 15, 5, - 243, 135, 30, 242, 31, 15, 5, 243, 135, 30, 242, 32, 96, 233, 136, 15, 5, - 243, 135, 30, 241, 182, 96, 232, 242, 15, 5, 243, 135, 30, 240, 219, 15, - 5, 243, 135, 30, 236, 37, 242, 95, 15, 5, 243, 135, 30, 235, 167, 96, - 240, 224, 96, 253, 232, 15, 5, 243, 135, 30, 234, 243, 15, 5, 243, 135, - 30, 234, 208, 15, 5, 243, 135, 30, 234, 90, 15, 5, 243, 135, 30, 234, 91, - 96, 233, 105, 15, 5, 243, 135, 30, 233, 217, 96, 254, 124, 15, 5, 243, - 135, 30, 233, 136, 15, 5, 243, 135, 30, 231, 93, 96, 245, 151, 15, 5, - 243, 135, 30, 230, 231, 15, 5, 243, 135, 30, 227, 195, 15, 5, 243, 135, - 30, 227, 196, 117, 227, 195, 15, 5, 243, 135, 30, 190, 15, 5, 243, 135, - 30, 222, 9, 15, 5, 243, 135, 30, 221, 232, 15, 5, 243, 135, 30, 220, 64, - 15, 5, 243, 135, 30, 220, 65, 96, 215, 99, 15, 5, 243, 135, 30, 220, 31, - 15, 5, 243, 135, 30, 218, 44, 15, 5, 243, 135, 30, 217, 73, 15, 5, 243, - 135, 30, 70, 15, 5, 243, 135, 30, 214, 219, 15, 5, 243, 135, 30, 214, - 220, 96, 246, 79, 15, 5, 243, 135, 117, 243, 134, 15, 5, 243, 129, 15, 5, - 243, 130, 249, 126, 243, 129, 15, 5, 243, 127, 15, 5, 243, 128, 117, 243, - 128, 243, 98, 117, 243, 97, 15, 5, 243, 119, 15, 5, 243, 120, 243, 128, - 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 243, 118, 15, 5, 243, 116, - 15, 5, 243, 107, 15, 5, 243, 105, 15, 5, 243, 106, 216, 240, 15, 5, 243, - 106, 117, 243, 105, 15, 5, 243, 106, 249, 126, 243, 105, 15, 5, 243, 97, - 15, 5, 243, 96, 15, 5, 243, 91, 15, 5, 243, 37, 15, 5, 243, 38, 30, 233, - 197, 15, 5, 242, 215, 15, 5, 242, 216, 30, 75, 15, 5, 242, 216, 30, 70, - 15, 5, 242, 216, 249, 126, 242, 215, 15, 5, 242, 213, 15, 5, 242, 214, - 117, 242, 213, 15, 5, 242, 214, 249, 126, 242, 213, 15, 5, 242, 210, 15, - 5, 242, 198, 15, 5, 242, 199, 242, 95, 15, 5, 242, 196, 15, 5, 242, 197, - 30, 115, 96, 236, 36, 15, 5, 242, 197, 30, 243, 106, 216, 240, 15, 5, - 242, 197, 30, 236, 36, 15, 5, 242, 197, 30, 232, 100, 96, 236, 36, 15, 5, - 242, 197, 30, 190, 15, 5, 242, 193, 15, 5, 242, 191, 15, 5, 242, 192, - 249, 126, 242, 191, 15, 5, 242, 192, 30, 252, 177, 15, 5, 242, 192, 30, - 217, 73, 15, 5, 242, 192, 216, 240, 15, 5, 242, 114, 15, 5, 242, 115, - 249, 126, 242, 114, 15, 5, 242, 112, 15, 5, 242, 113, 30, 234, 243, 15, - 5, 242, 113, 30, 234, 244, 30, 236, 37, 242, 95, 15, 5, 242, 113, 30, - 227, 195, 15, 5, 242, 113, 30, 222, 10, 96, 215, 114, 15, 5, 242, 113, - 242, 95, 15, 5, 242, 104, 15, 5, 242, 105, 30, 115, 96, 233, 197, 15, 5, - 242, 105, 30, 233, 197, 15, 5, 242, 105, 117, 242, 105, 232, 92, 15, 5, - 242, 99, 15, 5, 242, 97, 15, 5, 242, 98, 30, 220, 64, 15, 5, 242, 89, 15, - 5, 242, 88, 15, 5, 242, 85, 15, 5, 242, 84, 15, 5, 162, 15, 5, 242, 50, - 216, 240, 15, 5, 242, 50, 242, 95, 15, 5, 242, 31, 15, 5, 241, 181, 15, - 5, 241, 182, 30, 253, 232, 15, 5, 241, 182, 30, 253, 230, 15, 5, 241, - 182, 30, 252, 177, 15, 5, 241, 182, 30, 247, 188, 15, 5, 241, 182, 30, - 243, 127, 15, 5, 241, 182, 30, 234, 82, 15, 5, 241, 182, 30, 227, 195, - 15, 5, 241, 182, 30, 220, 64, 15, 5, 241, 182, 30, 70, 15, 5, 240, 223, - 15, 5, 240, 219, 15, 5, 240, 220, 30, 254, 124, 15, 5, 240, 220, 30, 242, - 31, 15, 5, 240, 220, 30, 234, 208, 15, 5, 240, 220, 30, 232, 198, 15, 5, - 240, 220, 30, 214, 219, 15, 5, 240, 216, 15, 5, 73, 15, 5, 240, 155, 61, - 15, 5, 240, 116, 15, 5, 236, 64, 15, 5, 236, 65, 117, 236, 65, 251, 99, - 15, 5, 236, 65, 117, 236, 65, 218, 234, 15, 5, 236, 39, 15, 5, 236, 36, - 15, 5, 236, 37, 247, 243, 15, 5, 236, 37, 223, 36, 15, 5, 236, 37, 117, - 236, 37, 220, 15, 117, 220, 15, 214, 220, 117, 214, 219, 15, 5, 236, 37, - 242, 95, 15, 5, 236, 28, 15, 5, 236, 29, 30, 243, 106, 216, 240, 15, 5, - 236, 27, 15, 5, 236, 17, 15, 5, 236, 18, 30, 217, 73, 15, 5, 236, 18, - 249, 126, 236, 17, 15, 5, 236, 18, 226, 165, 236, 17, 15, 5, 236, 18, - 218, 234, 15, 5, 236, 10, 15, 5, 236, 0, 15, 5, 235, 180, 15, 5, 235, - 166, 15, 5, 176, 15, 5, 235, 14, 30, 61, 15, 5, 235, 14, 30, 255, 0, 15, - 5, 235, 14, 30, 255, 1, 96, 233, 216, 15, 5, 235, 14, 30, 253, 230, 15, - 5, 235, 14, 30, 252, 177, 15, 5, 235, 14, 30, 252, 161, 15, 5, 235, 14, - 30, 130, 15, 5, 235, 14, 30, 252, 7, 15, 5, 235, 14, 30, 245, 88, 15, 5, - 235, 14, 30, 245, 73, 15, 5, 235, 14, 30, 243, 136, 15, 5, 235, 14, 30, - 243, 119, 15, 5, 235, 14, 30, 243, 106, 216, 240, 15, 5, 235, 14, 30, - 243, 97, 15, 5, 235, 14, 30, 243, 98, 96, 220, 102, 96, 61, 15, 5, 235, - 14, 30, 242, 215, 15, 5, 235, 14, 30, 242, 198, 15, 5, 235, 14, 30, 242, - 192, 96, 221, 232, 15, 5, 235, 14, 30, 242, 192, 249, 126, 242, 191, 15, - 5, 235, 14, 30, 242, 114, 15, 5, 235, 14, 30, 242, 88, 15, 5, 235, 14, - 30, 236, 36, 15, 5, 235, 14, 30, 236, 17, 15, 5, 235, 14, 30, 234, 243, - 15, 5, 235, 14, 30, 234, 93, 15, 5, 235, 14, 30, 234, 90, 15, 5, 235, 14, - 30, 232, 242, 15, 5, 235, 14, 30, 232, 99, 15, 5, 235, 14, 30, 231, 92, - 15, 5, 235, 14, 30, 231, 93, 96, 246, 79, 15, 5, 235, 14, 30, 231, 93, - 96, 242, 215, 15, 5, 235, 14, 30, 231, 93, 96, 217, 23, 15, 5, 235, 14, - 30, 230, 231, 15, 5, 235, 14, 30, 230, 232, 96, 227, 190, 15, 5, 235, 14, - 30, 229, 108, 15, 5, 235, 14, 30, 227, 195, 15, 5, 235, 14, 30, 225, 109, - 15, 5, 235, 14, 30, 222, 141, 15, 5, 235, 14, 30, 206, 15, 5, 235, 14, - 30, 221, 232, 15, 5, 235, 14, 30, 220, 103, 15, 5, 235, 14, 30, 220, 64, - 15, 5, 235, 14, 30, 220, 31, 15, 5, 235, 14, 30, 219, 226, 15, 5, 235, - 14, 30, 219, 183, 15, 5, 235, 14, 30, 218, 52, 15, 5, 235, 14, 30, 217, - 51, 15, 5, 235, 14, 30, 70, 15, 5, 235, 14, 30, 214, 230, 15, 5, 235, 14, - 30, 214, 219, 15, 5, 235, 14, 30, 214, 193, 30, 190, 15, 5, 235, 14, 30, - 214, 126, 15, 5, 235, 14, 30, 210, 44, 15, 5, 235, 12, 15, 5, 235, 13, - 249, 126, 235, 12, 15, 5, 235, 5, 15, 5, 235, 2, 15, 5, 235, 0, 15, 5, - 234, 255, 15, 5, 234, 253, 15, 5, 234, 254, 117, 234, 253, 15, 5, 234, - 243, 15, 5, 234, 244, 30, 236, 37, 242, 95, 15, 5, 234, 239, 15, 5, 234, - 240, 30, 252, 177, 15, 5, 234, 240, 249, 126, 234, 239, 15, 5, 234, 237, - 15, 5, 234, 236, 15, 5, 234, 208, 15, 5, 234, 209, 233, 119, 30, 104, - 117, 233, 119, 30, 70, 15, 5, 234, 209, 117, 234, 209, 233, 119, 30, 104, - 117, 233, 119, 30, 70, 15, 5, 234, 158, 15, 5, 234, 93, 15, 5, 234, 94, - 30, 252, 177, 15, 5, 234, 94, 30, 70, 15, 5, 234, 94, 30, 214, 219, 15, - 5, 234, 90, 15, 5, 234, 82, 15, 5, 234, 69, 15, 5, 234, 68, 15, 5, 234, - 66, 15, 5, 234, 67, 117, 234, 66, 15, 5, 233, 218, 15, 5, 233, 219, 117, - 241, 182, 30, 253, 231, 233, 219, 117, 241, 182, 30, 253, 230, 15, 5, - 233, 216, 15, 5, 233, 214, 15, 5, 233, 215, 214, 12, 17, 15, 5, 233, 213, - 15, 5, 233, 210, 15, 5, 233, 211, 242, 95, 15, 5, 233, 209, 15, 5, 233, - 197, 15, 5, 233, 198, 226, 165, 233, 197, 15, 5, 233, 192, 15, 5, 233, - 173, 15, 5, 233, 136, 15, 5, 233, 118, 15, 5, 233, 119, 30, 61, 15, 5, - 233, 119, 30, 115, 96, 248, 223, 96, 162, 15, 5, 233, 119, 30, 115, 96, - 243, 97, 15, 5, 233, 119, 30, 115, 96, 233, 105, 15, 5, 233, 119, 30, - 254, 179, 15, 5, 233, 119, 30, 254, 124, 15, 5, 233, 119, 30, 253, 233, - 210, 40, 216, 240, 15, 5, 233, 119, 30, 252, 177, 15, 5, 233, 119, 30, - 252, 7, 15, 5, 233, 119, 30, 248, 167, 15, 5, 233, 119, 30, 245, 151, 15, - 5, 233, 119, 30, 243, 136, 15, 5, 233, 119, 30, 243, 97, 15, 5, 233, 119, - 30, 242, 104, 15, 5, 233, 119, 30, 242, 105, 96, 242, 104, 15, 5, 233, - 119, 30, 162, 15, 5, 233, 119, 30, 242, 31, 15, 5, 233, 119, 30, 241, - 182, 30, 227, 195, 15, 5, 233, 119, 30, 236, 37, 242, 95, 15, 5, 233, - 119, 30, 236, 17, 15, 5, 233, 119, 30, 236, 18, 96, 162, 15, 5, 233, 119, - 30, 236, 18, 96, 232, 99, 15, 5, 233, 119, 30, 234, 93, 15, 5, 233, 119, - 30, 234, 82, 15, 5, 233, 119, 30, 233, 216, 15, 5, 233, 119, 30, 233, - 210, 15, 5, 233, 119, 30, 233, 211, 96, 241, 182, 96, 61, 15, 5, 233, - 119, 30, 233, 118, 15, 5, 233, 119, 30, 232, 198, 15, 5, 233, 119, 30, - 232, 99, 15, 5, 233, 119, 30, 232, 87, 15, 5, 233, 119, 30, 231, 92, 15, - 5, 233, 119, 30, 231, 93, 96, 245, 151, 15, 5, 233, 119, 30, 230, 62, 15, - 5, 233, 119, 30, 229, 108, 15, 5, 233, 119, 30, 220, 65, 96, 218, 44, 15, - 5, 233, 119, 30, 220, 11, 96, 242, 192, 96, 245, 88, 15, 5, 233, 119, 30, - 220, 11, 96, 242, 192, 216, 240, 15, 5, 233, 119, 30, 219, 224, 15, 5, - 233, 119, 30, 219, 225, 96, 219, 224, 15, 5, 233, 119, 30, 218, 44, 15, - 5, 233, 119, 30, 217, 85, 15, 5, 233, 119, 30, 217, 73, 15, 5, 233, 119, - 30, 217, 24, 96, 115, 96, 218, 85, 96, 197, 15, 5, 233, 119, 30, 70, 15, - 5, 233, 119, 30, 104, 96, 61, 15, 5, 233, 119, 30, 104, 96, 104, 96, 70, - 15, 5, 233, 119, 30, 214, 231, 96, 253, 232, 15, 5, 233, 119, 30, 214, - 219, 15, 5, 233, 119, 30, 214, 126, 15, 5, 233, 119, 218, 234, 15, 5, - 233, 116, 15, 5, 233, 117, 30, 220, 64, 15, 5, 233, 117, 30, 220, 65, 96, - 218, 44, 15, 5, 233, 117, 242, 95, 15, 5, 233, 117, 242, 96, 117, 233, - 117, 242, 96, 220, 64, 15, 5, 233, 112, 15, 5, 233, 105, 15, 5, 233, 106, - 30, 233, 105, 15, 5, 233, 103, 15, 5, 233, 104, 30, 233, 197, 15, 5, 233, - 104, 30, 233, 198, 96, 222, 141, 15, 5, 232, 242, 15, 5, 232, 227, 15, 5, - 232, 217, 15, 5, 232, 198, 15, 5, 232, 99, 15, 5, 232, 100, 30, 252, 177, - 15, 5, 232, 97, 15, 5, 232, 98, 30, 254, 179, 15, 5, 232, 98, 30, 252, - 177, 15, 5, 232, 98, 30, 245, 73, 15, 5, 232, 98, 30, 245, 74, 216, 240, - 15, 5, 232, 98, 30, 243, 106, 216, 240, 15, 5, 232, 98, 30, 241, 182, 30, - 252, 177, 15, 5, 232, 98, 30, 236, 17, 15, 5, 232, 98, 30, 235, 2, 15, 5, - 232, 98, 30, 235, 0, 15, 5, 232, 98, 30, 235, 1, 96, 253, 232, 15, 5, - 232, 98, 30, 234, 93, 15, 5, 232, 98, 30, 233, 137, 96, 253, 232, 15, 5, - 232, 98, 30, 233, 118, 15, 5, 232, 98, 30, 231, 93, 96, 245, 151, 15, 5, - 232, 98, 30, 229, 108, 15, 5, 232, 98, 30, 227, 238, 15, 5, 232, 98, 30, - 219, 193, 96, 253, 232, 15, 5, 232, 98, 30, 219, 175, 96, 251, 126, 15, - 5, 232, 98, 30, 215, 114, 15, 5, 232, 98, 216, 240, 15, 5, 232, 98, 249, - 126, 232, 97, 15, 5, 232, 98, 226, 165, 232, 97, 15, 5, 232, 98, 218, - 234, 15, 5, 232, 98, 220, 46, 15, 5, 232, 96, 15, 5, 232, 92, 15, 5, 232, - 93, 117, 232, 92, 15, 5, 232, 93, 226, 165, 232, 92, 15, 5, 232, 93, 220, - 46, 15, 5, 232, 90, 15, 5, 232, 87, 15, 5, 232, 85, 15, 5, 232, 86, 117, - 232, 85, 15, 5, 232, 86, 117, 232, 86, 243, 98, 117, 243, 97, 15, 5, 185, - 15, 5, 231, 240, 30, 217, 73, 15, 5, 231, 240, 242, 95, 15, 5, 231, 239, - 15, 5, 231, 211, 15, 5, 231, 167, 15, 5, 231, 148, 15, 5, 231, 147, 15, - 5, 231, 92, 15, 5, 231, 48, 15, 5, 230, 231, 15, 5, 230, 189, 15, 5, 230, - 103, 15, 5, 230, 104, 117, 230, 103, 15, 5, 230, 94, 15, 5, 230, 95, 242, - 95, 15, 5, 230, 79, 15, 5, 230, 65, 15, 5, 230, 62, 15, 5, 230, 63, 30, - 61, 15, 5, 230, 63, 30, 233, 197, 15, 5, 230, 63, 30, 210, 116, 15, 5, - 230, 63, 117, 230, 62, 15, 5, 230, 63, 117, 230, 63, 30, 115, 96, 197, - 15, 5, 230, 63, 249, 126, 230, 62, 15, 5, 230, 60, 15, 5, 230, 61, 30, - 61, 15, 5, 230, 61, 30, 115, 96, 248, 4, 15, 5, 230, 61, 30, 248, 4, 15, - 5, 230, 61, 242, 95, 15, 5, 197, 15, 5, 229, 228, 15, 5, 229, 217, 15, 5, - 229, 218, 235, 193, 15, 5, 229, 218, 30, 219, 227, 216, 240, 15, 5, 229, - 218, 226, 165, 229, 217, 15, 5, 229, 216, 15, 5, 229, 209, 227, 181, 15, - 5, 229, 208, 15, 5, 229, 207, 15, 5, 229, 108, 15, 5, 229, 109, 30, 61, - 15, 5, 229, 109, 30, 214, 219, 15, 5, 229, 109, 220, 46, 15, 5, 228, 234, - 15, 5, 228, 235, 30, 75, 15, 5, 228, 233, 15, 5, 228, 204, 15, 5, 228, - 205, 30, 243, 106, 216, 240, 15, 5, 228, 205, 30, 243, 98, 96, 243, 106, - 216, 240, 15, 5, 228, 202, 15, 5, 228, 203, 30, 254, 124, 15, 5, 228, - 203, 30, 253, 232, 15, 5, 228, 203, 30, 253, 233, 96, 253, 232, 15, 5, - 228, 203, 30, 242, 104, 15, 5, 228, 203, 30, 231, 93, 96, 243, 106, 216, - 240, 15, 5, 228, 203, 30, 229, 108, 15, 5, 228, 203, 30, 227, 195, 15, 5, - 228, 203, 30, 220, 64, 15, 5, 228, 203, 30, 220, 65, 96, 115, 254, 124, - 15, 5, 228, 203, 30, 220, 65, 96, 253, 232, 15, 5, 228, 203, 30, 220, 65, - 96, 253, 233, 96, 253, 232, 15, 5, 228, 203, 30, 214, 231, 96, 253, 232, - 15, 5, 228, 203, 30, 214, 126, 15, 5, 228, 191, 15, 5, 227, 238, 15, 5, - 227, 211, 15, 5, 227, 195, 15, 5, 227, 196, 233, 117, 30, 243, 97, 15, 5, - 227, 196, 233, 117, 30, 231, 148, 15, 5, 227, 196, 233, 117, 30, 222, 9, - 15, 5, 227, 196, 233, 117, 30, 222, 10, 117, 227, 196, 233, 117, 30, 222, - 9, 15, 5, 227, 196, 233, 117, 30, 214, 126, 15, 5, 227, 196, 216, 240, - 15, 5, 227, 196, 117, 227, 195, 15, 5, 227, 196, 249, 126, 227, 195, 15, - 5, 227, 196, 249, 126, 227, 196, 233, 117, 117, 233, 116, 15, 5, 227, - 190, 15, 5, 227, 191, 255, 25, 30, 253, 227, 15, 5, 227, 191, 255, 25, - 30, 252, 7, 15, 5, 227, 191, 255, 25, 30, 246, 75, 15, 5, 227, 191, 255, - 25, 30, 242, 104, 15, 5, 227, 191, 255, 25, 30, 236, 37, 242, 95, 15, 5, - 227, 191, 255, 25, 30, 235, 0, 15, 5, 227, 191, 255, 25, 30, 233, 136, - 15, 5, 227, 191, 255, 25, 30, 229, 108, 15, 5, 227, 191, 255, 25, 30, - 219, 172, 15, 5, 227, 191, 255, 25, 30, 214, 230, 15, 5, 227, 191, 234, - 67, 30, 252, 7, 15, 5, 227, 191, 234, 67, 30, 252, 8, 70, 15, 5, 190, 15, - 5, 226, 81, 15, 5, 226, 48, 15, 5, 226, 22, 15, 5, 225, 162, 15, 5, 225, - 109, 15, 5, 225, 110, 30, 61, 15, 5, 225, 110, 30, 255, 26, 15, 5, 225, - 110, 30, 252, 7, 15, 5, 225, 110, 30, 251, 126, 15, 5, 225, 110, 30, 75, - 15, 5, 225, 110, 30, 73, 15, 5, 225, 110, 30, 240, 116, 15, 5, 225, 110, - 30, 70, 15, 5, 225, 110, 30, 214, 230, 15, 5, 225, 110, 249, 126, 225, - 109, 15, 5, 225, 54, 15, 5, 225, 55, 30, 234, 239, 15, 5, 225, 55, 30, - 214, 219, 15, 5, 225, 55, 30, 210, 116, 15, 5, 225, 55, 226, 165, 225, - 54, 15, 5, 205, 15, 5, 223, 183, 15, 5, 223, 36, 15, 5, 222, 141, 15, 5, - 206, 15, 5, 222, 23, 227, 181, 15, 5, 222, 22, 15, 5, 222, 23, 30, 61, - 15, 5, 222, 23, 30, 246, 79, 15, 5, 222, 23, 30, 246, 77, 15, 5, 222, 23, - 30, 162, 15, 5, 222, 23, 30, 234, 243, 15, 5, 222, 23, 30, 233, 197, 15, - 5, 222, 23, 30, 232, 85, 15, 5, 222, 23, 30, 230, 231, 15, 5, 222, 23, - 30, 227, 195, 15, 5, 222, 23, 30, 222, 9, 15, 5, 222, 23, 30, 220, 31, - 15, 5, 222, 23, 30, 217, 94, 15, 5, 222, 23, 30, 214, 230, 15, 5, 222, - 23, 30, 214, 225, 15, 5, 222, 23, 30, 214, 197, 15, 5, 222, 23, 30, 214, - 150, 15, 5, 222, 23, 30, 214, 126, 15, 5, 222, 23, 117, 222, 22, 15, 5, - 222, 23, 242, 95, 15, 5, 222, 9, 15, 5, 222, 10, 233, 119, 30, 253, 230, - 15, 5, 221, 240, 15, 5, 221, 232, 15, 5, 220, 103, 15, 5, 220, 101, 15, - 5, 220, 102, 30, 61, 15, 5, 220, 102, 30, 252, 177, 15, 5, 220, 102, 30, - 242, 191, 15, 5, 220, 102, 30, 229, 108, 15, 5, 220, 102, 30, 219, 224, - 15, 5, 220, 102, 30, 215, 99, 15, 5, 220, 102, 30, 70, 15, 5, 220, 102, - 30, 104, 96, 61, 15, 5, 220, 100, 15, 5, 220, 98, 15, 5, 220, 79, 15, 5, - 220, 64, 15, 5, 220, 65, 240, 223, 15, 5, 220, 65, 117, 220, 65, 243, - 128, 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 220, 65, 117, 220, 65, - 217, 95, 117, 217, 95, 243, 98, 117, 243, 97, 15, 5, 220, 57, 15, 5, 220, - 52, 15, 5, 220, 49, 15, 5, 220, 48, 15, 5, 220, 45, 15, 5, 220, 31, 15, - 5, 220, 32, 30, 61, 15, 5, 220, 32, 30, 236, 17, 15, 5, 220, 25, 15, 5, - 220, 26, 30, 61, 15, 5, 220, 26, 30, 252, 162, 15, 5, 220, 26, 30, 251, - 110, 15, 5, 220, 26, 30, 247, 207, 15, 5, 220, 26, 30, 243, 97, 15, 5, - 220, 26, 30, 236, 36, 15, 5, 220, 26, 30, 236, 37, 242, 95, 15, 5, 220, - 26, 30, 233, 192, 15, 5, 220, 26, 30, 232, 87, 15, 5, 220, 26, 30, 230, - 94, 15, 5, 220, 26, 30, 222, 9, 15, 5, 220, 19, 15, 5, 220, 14, 15, 5, - 220, 15, 216, 240, 15, 5, 220, 15, 117, 220, 15, 251, 100, 117, 251, 99, - 15, 5, 220, 10, 15, 5, 219, 226, 15, 5, 219, 227, 117, 235, 194, 219, - 226, 15, 5, 219, 224, 15, 5, 219, 223, 15, 5, 219, 192, 15, 5, 219, 193, - 242, 95, 15, 5, 219, 183, 15, 5, 219, 181, 15, 5, 219, 182, 117, 219, - 182, 219, 224, 15, 5, 219, 174, 15, 5, 219, 172, 15, 5, 218, 84, 15, 5, - 218, 85, 117, 218, 84, 15, 5, 218, 55, 15, 5, 218, 54, 15, 5, 218, 52, - 15, 5, 218, 44, 15, 5, 218, 43, 15, 5, 218, 18, 15, 5, 218, 17, 15, 5, - 217, 106, 15, 5, 217, 107, 253, 217, 15, 5, 217, 107, 30, 241, 181, 15, - 5, 217, 107, 30, 230, 231, 15, 5, 217, 107, 242, 95, 15, 5, 217, 94, 15, - 5, 217, 95, 117, 217, 95, 228, 235, 117, 228, 235, 247, 189, 117, 247, - 188, 15, 5, 217, 95, 218, 234, 15, 5, 217, 85, 15, 5, 129, 30, 252, 7, - 15, 5, 129, 30, 242, 104, 15, 5, 129, 30, 220, 64, 15, 5, 129, 30, 219, - 226, 15, 5, 129, 30, 215, 114, 15, 5, 129, 30, 214, 219, 15, 5, 217, 73, - 15, 5, 217, 51, 15, 5, 217, 23, 15, 5, 217, 24, 242, 95, 15, 5, 216, 118, - 15, 5, 216, 119, 216, 240, 15, 5, 216, 91, 15, 5, 216, 73, 15, 5, 216, - 74, 30, 217, 73, 15, 5, 216, 74, 117, 216, 73, 15, 5, 216, 74, 117, 216, - 74, 243, 128, 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 215, 119, 15, - 5, 215, 114, 15, 5, 215, 112, 15, 5, 215, 109, 15, 5, 215, 99, 15, 5, - 215, 100, 117, 215, 100, 210, 117, 117, 210, 116, 15, 5, 70, 15, 5, 104, - 242, 104, 15, 5, 104, 104, 70, 15, 5, 104, 117, 104, 226, 91, 117, 226, - 91, 243, 98, 117, 243, 97, 15, 5, 104, 117, 104, 218, 19, 117, 218, 18, - 15, 5, 104, 117, 104, 104, 223, 50, 117, 104, 223, 49, 15, 5, 214, 230, - 15, 5, 214, 225, 15, 5, 214, 219, 15, 5, 214, 220, 233, 192, 15, 5, 214, - 220, 30, 252, 177, 15, 5, 214, 220, 30, 230, 231, 15, 5, 214, 220, 30, - 104, 96, 104, 96, 70, 15, 5, 214, 220, 30, 104, 96, 104, 96, 104, 242, - 95, 15, 5, 214, 220, 242, 95, 15, 5, 214, 220, 220, 46, 15, 5, 214, 220, - 220, 47, 30, 252, 177, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5, 214, 198, - 30, 233, 118, 15, 5, 214, 198, 30, 231, 93, 96, 248, 222, 15, 5, 214, - 198, 30, 220, 101, 15, 5, 214, 198, 30, 70, 15, 5, 214, 196, 15, 5, 214, - 192, 15, 5, 214, 193, 30, 234, 208, 15, 5, 214, 193, 30, 190, 15, 5, 214, - 190, 15, 5, 214, 191, 242, 95, 15, 5, 214, 150, 15, 5, 214, 151, 249, - 126, 214, 150, 15, 5, 214, 151, 220, 46, 15, 5, 214, 148, 15, 5, 214, - 149, 30, 115, 96, 162, 15, 5, 214, 149, 30, 115, 96, 197, 15, 5, 214, - 149, 30, 254, 179, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30, 227, - 195, 15, 5, 214, 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231, 96, - 253, 232, 15, 5, 214, 149, 30, 214, 231, 96, 252, 7, 15, 5, 214, 147, 15, - 5, 214, 144, 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30, 61, - 15, 5, 214, 140, 30, 253, 227, 15, 5, 214, 140, 30, 130, 15, 5, 214, 140, - 30, 246, 69, 15, 5, 214, 140, 30, 243, 136, 15, 5, 214, 140, 30, 243, - 119, 15, 5, 214, 140, 30, 243, 106, 216, 240, 15, 5, 214, 140, 30, 243, - 97, 15, 5, 214, 140, 30, 242, 114, 15, 5, 214, 140, 30, 162, 15, 5, 214, - 140, 30, 236, 36, 15, 5, 214, 140, 30, 236, 17, 15, 5, 214, 140, 30, 235, - 166, 15, 5, 214, 140, 30, 234, 93, 15, 5, 214, 140, 30, 232, 85, 15, 5, - 214, 140, 30, 230, 189, 15, 5, 214, 140, 30, 190, 15, 5, 214, 140, 30, - 220, 64, 15, 5, 214, 140, 30, 219, 181, 15, 5, 214, 140, 30, 215, 119, - 15, 5, 214, 140, 30, 104, 96, 242, 104, 15, 5, 214, 140, 30, 214, 219, - 15, 5, 214, 140, 30, 214, 137, 15, 5, 214, 137, 15, 5, 214, 138, 30, 70, - 15, 5, 214, 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 218, - 15, 5, 214, 127, 30, 233, 197, 15, 5, 214, 127, 30, 217, 73, 15, 5, 214, - 122, 15, 5, 214, 125, 15, 5, 214, 123, 15, 5, 214, 119, 15, 5, 214, 108, - 15, 5, 214, 109, 30, 234, 208, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5, - 210, 117, 216, 240, 15, 5, 210, 117, 92, 30, 233, 197, 15, 5, 210, 113, - 15, 5, 210, 106, 15, 5, 210, 93, 15, 5, 210, 44, 15, 5, 210, 45, 117, - 210, 44, 15, 5, 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 4, 216, - 240, 15, 5, 210, 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15, - 5, 210, 12, 30, 61, 15, 5, 210, 10, 15, 5, 210, 9, 15, 132, 5, 113, 253, - 232, 15, 132, 5, 134, 253, 232, 15, 132, 5, 244, 12, 253, 232, 15, 132, - 5, 244, 82, 253, 232, 15, 132, 5, 219, 126, 253, 232, 15, 132, 5, 220, - 123, 253, 232, 15, 132, 5, 245, 194, 253, 232, 15, 132, 5, 228, 201, 253, - 232, 15, 132, 5, 134, 247, 188, 15, 132, 5, 244, 12, 247, 188, 15, 132, - 5, 244, 82, 247, 188, 15, 132, 5, 219, 126, 247, 188, 15, 132, 5, 220, - 123, 247, 188, 15, 132, 5, 245, 194, 247, 188, 15, 132, 5, 228, 201, 247, - 188, 15, 132, 5, 244, 12, 70, 15, 132, 5, 244, 82, 70, 15, 132, 5, 219, - 126, 70, 15, 132, 5, 220, 123, 70, 15, 132, 5, 245, 194, 70, 15, 132, 5, - 228, 201, 70, 15, 132, 5, 123, 243, 39, 15, 132, 5, 113, 243, 39, 15, - 132, 5, 134, 243, 39, 15, 132, 5, 244, 12, 243, 39, 15, 132, 5, 244, 82, - 243, 39, 15, 132, 5, 219, 126, 243, 39, 15, 132, 5, 220, 123, 243, 39, - 15, 132, 5, 245, 194, 243, 39, 15, 132, 5, 228, 201, 243, 39, 15, 132, 5, - 123, 243, 36, 15, 132, 5, 113, 243, 36, 15, 132, 5, 134, 243, 36, 15, - 132, 5, 244, 12, 243, 36, 15, 132, 5, 244, 82, 243, 36, 15, 132, 5, 113, - 220, 79, 15, 132, 5, 134, 220, 79, 15, 132, 5, 134, 220, 80, 214, 12, 17, - 15, 132, 5, 244, 12, 220, 79, 15, 132, 5, 244, 82, 220, 79, 15, 132, 5, - 219, 126, 220, 79, 15, 132, 5, 220, 123, 220, 79, 15, 132, 5, 245, 194, - 220, 79, 15, 132, 5, 228, 201, 220, 79, 15, 132, 5, 123, 220, 74, 15, - 132, 5, 113, 220, 74, 15, 132, 5, 134, 220, 74, 15, 132, 5, 134, 220, 75, - 214, 12, 17, 15, 132, 5, 244, 12, 220, 74, 15, 132, 5, 244, 82, 220, 74, - 15, 132, 5, 220, 80, 30, 243, 120, 96, 247, 188, 15, 132, 5, 220, 80, 30, - 243, 120, 96, 230, 189, 15, 132, 5, 123, 251, 96, 15, 132, 5, 113, 251, - 96, 15, 132, 5, 134, 251, 96, 15, 132, 5, 134, 251, 97, 214, 12, 17, 15, - 132, 5, 244, 12, 251, 96, 15, 132, 5, 244, 82, 251, 96, 15, 132, 5, 134, - 214, 12, 244, 21, 245, 75, 15, 132, 5, 134, 214, 12, 244, 21, 245, 72, - 15, 132, 5, 244, 12, 214, 12, 244, 21, 232, 218, 15, 132, 5, 244, 12, - 214, 12, 244, 21, 232, 216, 15, 132, 5, 244, 12, 214, 12, 244, 21, 232, - 219, 61, 15, 132, 5, 244, 12, 214, 12, 244, 21, 232, 219, 253, 159, 15, - 132, 5, 219, 126, 214, 12, 244, 21, 253, 229, 15, 132, 5, 220, 123, 214, - 12, 244, 21, 236, 9, 15, 132, 5, 220, 123, 214, 12, 244, 21, 236, 11, 61, - 15, 132, 5, 220, 123, 214, 12, 244, 21, 236, 11, 253, 159, 15, 132, 5, - 245, 194, 214, 12, 244, 21, 214, 121, 15, 132, 5, 245, 194, 214, 12, 244, - 21, 214, 120, 15, 132, 5, 228, 201, 214, 12, 244, 21, 236, 25, 15, 132, - 5, 228, 201, 214, 12, 244, 21, 236, 24, 15, 132, 5, 228, 201, 214, 12, - 244, 21, 236, 23, 15, 132, 5, 228, 201, 214, 12, 244, 21, 236, 26, 61, - 15, 132, 5, 113, 253, 233, 216, 240, 15, 132, 5, 134, 253, 233, 216, 240, - 15, 132, 5, 244, 12, 253, 233, 216, 240, 15, 132, 5, 244, 82, 253, 233, - 216, 240, 15, 132, 5, 219, 126, 253, 233, 216, 240, 15, 132, 5, 123, 252, - 151, 15, 132, 5, 113, 252, 151, 15, 132, 5, 134, 252, 151, 15, 132, 5, - 244, 12, 252, 151, 15, 132, 5, 244, 12, 252, 152, 214, 12, 17, 15, 132, - 5, 244, 82, 252, 151, 15, 132, 5, 244, 82, 252, 152, 214, 12, 17, 15, - 132, 5, 228, 211, 15, 132, 5, 228, 212, 15, 132, 5, 123, 245, 71, 15, - 132, 5, 113, 245, 71, 15, 132, 5, 123, 216, 170, 247, 188, 15, 132, 5, - 113, 216, 168, 247, 188, 15, 132, 5, 244, 82, 219, 115, 247, 188, 15, - 132, 5, 123, 216, 170, 214, 12, 244, 21, 61, 15, 132, 5, 113, 216, 168, - 214, 12, 244, 21, 61, 15, 132, 5, 123, 245, 190, 253, 232, 15, 132, 5, - 123, 224, 23, 253, 232, 15, 132, 5, 55, 253, 220, 123, 219, 116, 15, 132, - 5, 55, 253, 220, 123, 224, 22, 15, 224, 142, 5, 55, 253, 220, 211, 209, - 247, 173, 15, 224, 142, 5, 67, 249, 227, 15, 224, 142, 5, 248, 0, 249, - 227, 15, 224, 142, 5, 248, 0, 215, 222, 12, 13, 255, 156, 12, 13, 255, - 155, 12, 13, 255, 154, 12, 13, 255, 153, 12, 13, 255, 152, 12, 13, 255, - 151, 12, 13, 255, 150, 12, 13, 255, 149, 12, 13, 255, 148, 12, 13, 255, - 147, 12, 13, 255, 146, 12, 13, 255, 145, 12, 13, 255, 144, 12, 13, 255, - 143, 12, 13, 255, 142, 12, 13, 255, 141, 12, 13, 255, 140, 12, 13, 255, - 139, 12, 13, 255, 138, 12, 13, 255, 137, 12, 13, 255, 136, 12, 13, 255, - 135, 12, 13, 255, 134, 12, 13, 255, 133, 12, 13, 255, 132, 12, 13, 255, - 131, 12, 13, 255, 130, 12, 13, 255, 129, 12, 13, 255, 128, 12, 13, 255, - 127, 12, 13, 255, 126, 12, 13, 255, 125, 12, 13, 255, 124, 12, 13, 255, - 123, 12, 13, 255, 122, 12, 13, 255, 121, 12, 13, 255, 120, 12, 13, 255, - 119, 12, 13, 255, 118, 12, 13, 255, 117, 12, 13, 255, 116, 12, 13, 255, - 115, 12, 13, 255, 114, 12, 13, 255, 113, 12, 13, 255, 112, 12, 13, 255, - 111, 12, 13, 255, 110, 12, 13, 255, 109, 12, 13, 255, 108, 12, 13, 255, - 107, 12, 13, 255, 106, 12, 13, 255, 105, 12, 13, 255, 104, 12, 13, 255, - 103, 12, 13, 255, 102, 12, 13, 255, 101, 12, 13, 255, 100, 12, 13, 255, - 99, 12, 13, 255, 98, 12, 13, 255, 97, 12, 13, 255, 96, 12, 13, 255, 95, - 12, 13, 255, 94, 12, 13, 255, 93, 12, 13, 255, 92, 12, 13, 255, 91, 12, - 13, 255, 90, 12, 13, 255, 89, 12, 13, 255, 88, 12, 13, 255, 87, 12, 13, - 255, 86, 12, 13, 255, 85, 12, 13, 255, 84, 12, 13, 255, 83, 12, 13, 255, - 82, 12, 13, 255, 81, 12, 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78, - 12, 13, 255, 77, 12, 13, 253, 157, 12, 13, 253, 155, 12, 13, 253, 153, - 12, 13, 253, 151, 12, 13, 253, 149, 12, 13, 253, 148, 12, 13, 253, 146, - 12, 13, 253, 144, 12, 13, 253, 142, 12, 13, 253, 140, 12, 13, 251, 63, - 12, 13, 251, 62, 12, 13, 251, 61, 12, 13, 251, 60, 12, 13, 251, 59, 12, - 13, 251, 58, 12, 13, 251, 57, 12, 13, 251, 56, 12, 13, 251, 55, 12, 13, - 251, 54, 12, 13, 251, 53, 12, 13, 251, 52, 12, 13, 251, 51, 12, 13, 251, - 50, 12, 13, 251, 49, 12, 13, 251, 48, 12, 13, 251, 47, 12, 13, 251, 46, - 12, 13, 251, 45, 12, 13, 251, 44, 12, 13, 251, 43, 12, 13, 251, 42, 12, - 13, 251, 41, 12, 13, 251, 40, 12, 13, 251, 39, 12, 13, 251, 38, 12, 13, - 251, 37, 12, 13, 251, 36, 12, 13, 249, 60, 12, 13, 249, 59, 12, 13, 249, - 58, 12, 13, 249, 57, 12, 13, 249, 56, 12, 13, 249, 55, 12, 13, 249, 54, - 12, 13, 249, 53, 12, 13, 249, 52, 12, 13, 249, 51, 12, 13, 249, 50, 12, - 13, 249, 49, 12, 13, 249, 48, 12, 13, 249, 47, 12, 13, 249, 46, 12, 13, - 249, 45, 12, 13, 249, 44, 12, 13, 249, 43, 12, 13, 249, 42, 12, 13, 249, - 41, 12, 13, 249, 40, 12, 13, 249, 39, 12, 13, 249, 38, 12, 13, 249, 37, - 12, 13, 249, 36, 12, 13, 249, 35, 12, 13, 249, 34, 12, 13, 249, 33, 12, - 13, 249, 32, 12, 13, 249, 31, 12, 13, 249, 30, 12, 13, 249, 29, 12, 13, - 249, 28, 12, 13, 249, 27, 12, 13, 249, 26, 12, 13, 249, 25, 12, 13, 249, - 24, 12, 13, 249, 23, 12, 13, 249, 22, 12, 13, 249, 21, 12, 13, 249, 20, - 12, 13, 249, 19, 12, 13, 249, 18, 12, 13, 249, 17, 12, 13, 249, 16, 12, - 13, 249, 15, 12, 13, 249, 14, 12, 13, 249, 13, 12, 13, 249, 12, 12, 13, - 249, 11, 12, 13, 249, 10, 12, 13, 249, 9, 12, 13, 249, 8, 12, 13, 249, 7, - 12, 13, 249, 6, 12, 13, 249, 5, 12, 13, 249, 4, 12, 13, 249, 3, 12, 13, - 249, 2, 12, 13, 249, 1, 12, 13, 249, 0, 12, 13, 248, 255, 12, 13, 248, - 254, 12, 13, 248, 253, 12, 13, 248, 252, 12, 13, 248, 251, 12, 13, 248, - 250, 12, 13, 248, 249, 12, 13, 248, 248, 12, 13, 248, 247, 12, 13, 248, - 246, 12, 13, 248, 245, 12, 13, 248, 244, 12, 13, 248, 243, 12, 13, 248, - 242, 12, 13, 248, 241, 12, 13, 248, 240, 12, 13, 248, 239, 12, 13, 248, - 238, 12, 13, 248, 237, 12, 13, 248, 236, 12, 13, 248, 235, 12, 13, 248, - 234, 12, 13, 248, 233, 12, 13, 248, 232, 12, 13, 248, 231, 12, 13, 248, - 230, 12, 13, 248, 229, 12, 13, 248, 228, 12, 13, 248, 227, 12, 13, 248, - 226, 12, 13, 248, 225, 12, 13, 246, 24, 12, 13, 246, 23, 12, 13, 246, 22, - 12, 13, 246, 21, 12, 13, 246, 20, 12, 13, 246, 19, 12, 13, 246, 18, 12, - 13, 246, 17, 12, 13, 246, 16, 12, 13, 246, 15, 12, 13, 246, 14, 12, 13, - 246, 13, 12, 13, 246, 12, 12, 13, 246, 11, 12, 13, 246, 10, 12, 13, 246, - 9, 12, 13, 246, 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, 13, 246, 5, 12, - 13, 246, 4, 12, 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, 1, 12, 13, 246, - 0, 12, 13, 245, 255, 12, 13, 245, 254, 12, 13, 245, 253, 12, 13, 245, - 252, 12, 13, 245, 251, 12, 13, 245, 250, 12, 13, 245, 249, 12, 13, 245, - 248, 12, 13, 245, 247, 12, 13, 245, 246, 12, 13, 245, 245, 12, 13, 245, - 244, 12, 13, 245, 243, 12, 13, 245, 242, 12, 13, 245, 241, 12, 13, 245, - 240, 12, 13, 245, 239, 12, 13, 245, 238, 12, 13, 245, 237, 12, 13, 245, + 34, 224, 36, 8, 34, 232, 247, 8, 34, 234, 67, 8, 34, 227, 145, 8, 34, + 249, 77, 8, 34, 218, 194, 8, 34, 243, 19, 8, 34, 243, 51, 8, 34, 230, + 235, 8, 34, 240, 187, 8, 34, 232, 61, 8, 34, 252, 91, 8, 34, 230, 131, 8, + 34, 210, 244, 8, 34, 224, 124, 8, 34, 240, 181, 8, 34, 217, 47, 8, 34, + 243, 142, 8, 34, 210, 5, 8, 34, 249, 71, 8, 34, 248, 103, 8, 34, 251, + 106, 8, 34, 243, 15, 8, 34, 227, 135, 8, 34, 215, 119, 8, 34, 226, 179, + 8, 34, 235, 80, 8, 34, 210, 19, 8, 34, 224, 103, 8, 34, 241, 115, 8, 34, + 210, 250, 8, 34, 212, 112, 8, 34, 219, 202, 8, 34, 213, 244, 8, 34, 210, + 116, 8, 34, 235, 74, 8, 34, 227, 100, 8, 34, 235, 78, 8, 34, 242, 161, 8, + 34, 235, 98, 8, 34, 211, 227, 8, 34, 246, 86, 8, 34, 219, 215, 8, 34, + 232, 242, 8, 34, 249, 81, 8, 34, 249, 113, 8, 34, 250, 45, 8, 34, 240, + 184, 8, 34, 220, 74, 8, 34, 210, 4, 8, 34, 220, 0, 8, 34, 250, 139, 8, + 34, 209, 231, 8, 34, 229, 178, 8, 34, 234, 188, 232, 202, 1, 252, 199, + 232, 202, 1, 191, 232, 202, 1, 225, 150, 232, 202, 1, 248, 229, 232, 202, + 1, 217, 106, 232, 202, 1, 216, 209, 232, 202, 1, 243, 142, 232, 202, 1, + 176, 232, 202, 1, 234, 138, 232, 202, 1, 235, 147, 232, 202, 1, 251, 41, + 232, 202, 1, 250, 165, 232, 202, 1, 246, 46, 232, 202, 1, 215, 184, 232, + 202, 1, 215, 176, 232, 202, 1, 186, 232, 202, 1, 198, 232, 202, 1, 233, + 141, 232, 202, 1, 206, 232, 202, 1, 210, 82, 232, 202, 1, 210, 116, 232, + 202, 1, 229, 82, 232, 202, 1, 162, 232, 202, 1, 211, 165, 232, 202, 1, + 241, 196, 232, 202, 1, 244, 204, 232, 202, 1, 212, 65, 232, 202, 1, 220, + 104, 232, 202, 1, 192, 232, 202, 1, 243, 0, 232, 202, 1, 61, 232, 202, 1, + 254, 252, 232, 202, 1, 76, 232, 202, 1, 245, 63, 232, 202, 1, 74, 232, + 202, 1, 78, 232, 202, 1, 69, 232, 202, 1, 214, 214, 232, 202, 1, 214, + 208, 232, 202, 1, 226, 238, 232, 202, 1, 138, 230, 37, 216, 118, 232, + 202, 1, 138, 229, 234, 225, 19, 232, 202, 1, 138, 230, 37, 249, 80, 232, + 202, 1, 138, 230, 37, 251, 213, 232, 202, 1, 138, 230, 37, 198, 232, 202, + 1, 138, 230, 37, 235, 121, 232, 202, 224, 144, 249, 227, 232, 202, 224, + 144, 243, 236, 218, 131, 41, 3, 245, 217, 41, 3, 245, 213, 41, 3, 241, + 227, 41, 3, 212, 17, 41, 3, 212, 16, 41, 3, 225, 214, 41, 3, 252, 21, 41, + 3, 252, 74, 41, 3, 231, 121, 41, 3, 233, 253, 41, 3, 231, 11, 41, 3, 243, + 82, 41, 3, 244, 155, 41, 3, 213, 250, 41, 3, 217, 12, 41, 3, 216, 195, + 41, 3, 248, 24, 41, 3, 248, 21, 41, 3, 233, 56, 41, 3, 223, 111, 41, 3, + 248, 85, 41, 3, 229, 144, 41, 3, 221, 172, 41, 3, 220, 63, 41, 3, 210, + 92, 41, 3, 210, 73, 41, 3, 250, 190, 41, 3, 235, 130, 41, 3, 228, 181, + 41, 3, 211, 44, 41, 3, 234, 187, 41, 3, 229, 56, 41, 3, 243, 62, 41, 3, + 231, 85, 41, 3, 229, 108, 41, 3, 227, 159, 41, 3, 74, 41, 3, 236, 6, 41, + 3, 241, 187, 41, 3, 241, 167, 41, 3, 211, 250, 41, 3, 211, 241, 41, 3, + 225, 111, 41, 3, 252, 19, 41, 3, 252, 14, 41, 3, 231, 114, 41, 3, 233, + 250, 41, 3, 231, 8, 41, 3, 243, 78, 41, 3, 244, 129, 41, 3, 213, 176, 41, + 3, 216, 118, 41, 3, 216, 176, 41, 3, 248, 16, 41, 3, 248, 20, 41, 3, 232, + 247, 41, 3, 223, 38, 41, 3, 248, 11, 41, 3, 229, 138, 41, 3, 219, 193, + 41, 3, 220, 34, 41, 3, 210, 44, 41, 3, 210, 69, 41, 3, 250, 59, 41, 3, + 235, 114, 41, 3, 228, 174, 41, 3, 211, 8, 41, 3, 234, 98, 41, 3, 229, 48, + 41, 3, 242, 221, 41, 3, 230, 235, 41, 3, 228, 238, 41, 3, 227, 152, 41, + 3, 61, 41, 3, 254, 131, 41, 3, 229, 77, 41, 3, 162, 41, 3, 242, 25, 41, + 3, 212, 65, 41, 3, 212, 55, 41, 3, 191, 41, 3, 252, 26, 41, 3, 252, 199, + 41, 3, 231, 129, 41, 3, 234, 1, 41, 3, 234, 0, 41, 3, 231, 15, 41, 3, + 243, 86, 41, 3, 244, 204, 41, 3, 214, 27, 41, 3, 217, 106, 41, 3, 216, + 209, 41, 3, 248, 33, 41, 3, 248, 23, 41, 3, 233, 141, 41, 3, 205, 41, 3, + 248, 229, 41, 3, 229, 153, 41, 3, 206, 41, 3, 220, 104, 41, 3, 210, 116, + 41, 3, 210, 82, 41, 3, 251, 41, 41, 3, 235, 147, 41, 3, 228, 190, 41, 3, + 192, 41, 3, 176, 41, 3, 234, 240, 41, 3, 229, 61, 41, 3, 243, 142, 41, 3, + 186, 41, 3, 198, 41, 3, 227, 169, 41, 3, 226, 187, 41, 3, 226, 183, 41, + 3, 241, 60, 41, 3, 211, 215, 41, 3, 211, 211, 41, 3, 224, 252, 41, 3, + 252, 17, 41, 3, 251, 201, 41, 3, 231, 109, 41, 3, 233, 248, 41, 3, 231, + 4, 41, 3, 243, 74, 41, 3, 244, 42, 41, 3, 213, 127, 41, 3, 216, 18, 41, + 3, 216, 154, 41, 3, 248, 14, 41, 3, 248, 18, 41, 3, 232, 133, 41, 3, 222, + 199, 41, 3, 247, 133, 41, 3, 229, 125, 41, 3, 219, 42, 41, 3, 220, 3, 41, + 3, 210, 21, 41, 3, 210, 66, 41, 3, 249, 182, 41, 3, 235, 65, 41, 3, 228, + 164, 41, 3, 210, 229, 41, 3, 234, 16, 41, 3, 229, 46, 41, 3, 242, 171, + 41, 3, 230, 137, 41, 3, 228, 69, 41, 3, 227, 136, 41, 3, 69, 41, 3, 214, + 190, 41, 3, 240, 229, 41, 3, 240, 219, 41, 3, 211, 195, 41, 3, 211, 189, + 41, 3, 224, 153, 41, 3, 252, 16, 41, 3, 251, 133, 41, 3, 231, 108, 41, 3, + 233, 246, 41, 3, 231, 3, 41, 3, 243, 73, 41, 3, 243, 241, 41, 3, 212, + 116, 41, 3, 215, 119, 41, 3, 216, 137, 41, 3, 248, 12, 41, 3, 248, 17, + 41, 3, 232, 103, 41, 3, 222, 142, 41, 3, 246, 86, 41, 3, 229, 120, 41, 3, + 218, 84, 41, 3, 219, 227, 41, 3, 210, 13, 41, 3, 210, 62, 41, 3, 249, + 120, 41, 3, 235, 57, 41, 3, 228, 160, 41, 3, 210, 212, 41, 3, 233, 223, + 41, 3, 229, 45, 41, 3, 242, 120, 41, 3, 230, 107, 41, 3, 227, 242, 41, 3, + 227, 132, 41, 3, 78, 41, 3, 226, 200, 41, 3, 229, 5, 41, 3, 241, 75, 41, + 3, 241, 63, 41, 3, 211, 227, 41, 3, 211, 216, 41, 3, 225, 19, 41, 3, 252, + 18, 41, 3, 251, 213, 41, 3, 231, 110, 41, 3, 233, 249, 41, 3, 231, 6, 41, + 3, 243, 76, 41, 3, 243, 75, 41, 3, 244, 51, 41, 3, 213, 138, 41, 3, 112, + 41, 3, 216, 157, 41, 3, 248, 15, 41, 3, 248, 19, 41, 3, 232, 162, 41, 3, + 222, 213, 41, 3, 247, 153, 41, 3, 229, 129, 41, 3, 219, 60, 41, 3, 220, + 9, 41, 3, 210, 23, 41, 3, 210, 67, 41, 3, 249, 246, 41, 3, 235, 74, 41, + 3, 228, 165, 41, 3, 210, 244, 41, 3, 234, 34, 41, 3, 229, 47, 41, 3, 242, + 181, 41, 3, 230, 166, 41, 3, 228, 79, 41, 3, 227, 138, 41, 3, 76, 41, 3, + 245, 158, 41, 3, 229, 66, 41, 3, 241, 245, 41, 3, 241, 216, 41, 3, 212, + 22, 41, 3, 212, 12, 41, 3, 225, 224, 41, 3, 252, 22, 41, 3, 252, 83, 41, + 3, 231, 122, 41, 3, 233, 254, 41, 3, 233, 252, 41, 3, 231, 12, 41, 3, + 243, 83, 41, 3, 243, 81, 41, 3, 244, 162, 41, 3, 213, 255, 41, 3, 217, + 23, 41, 3, 216, 196, 41, 3, 248, 25, 41, 3, 248, 22, 41, 3, 233, 64, 41, + 3, 223, 131, 41, 3, 248, 98, 41, 3, 229, 145, 41, 3, 221, 183, 41, 3, + 220, 65, 41, 3, 210, 94, 41, 3, 210, 74, 41, 3, 250, 198, 41, 3, 235, + 132, 41, 3, 228, 183, 41, 3, 211, 47, 41, 3, 234, 188, 41, 3, 229, 57, + 41, 3, 229, 53, 41, 3, 243, 69, 41, 3, 243, 58, 41, 3, 231, 96, 41, 3, + 229, 112, 41, 3, 227, 160, 41, 3, 229, 84, 41, 3, 233, 28, 41, 249, 227, + 41, 243, 236, 218, 131, 41, 224, 16, 79, 41, 3, 229, 128, 244, 204, 41, + 3, 229, 128, 176, 41, 3, 229, 128, 219, 42, 41, 16, 244, 152, 41, 16, + 234, 186, 41, 16, 216, 82, 41, 16, 228, 213, 41, 16, 252, 155, 41, 16, + 244, 203, 41, 16, 217, 102, 41, 16, 248, 184, 41, 16, 247, 132, 41, 16, + 233, 212, 41, 16, 216, 22, 41, 16, 247, 152, 41, 16, 235, 66, 41, 21, + 210, 86, 41, 21, 111, 41, 21, 105, 41, 21, 158, 41, 21, 161, 41, 21, 190, + 41, 21, 195, 41, 21, 199, 41, 21, 196, 41, 21, 201, 41, 3, 229, 128, 186, + 41, 3, 229, 128, 247, 153, 33, 6, 1, 210, 90, 33, 4, 1, 210, 90, 33, 6, + 1, 246, 42, 33, 4, 1, 246, 42, 33, 6, 1, 223, 52, 246, 44, 33, 4, 1, 223, + 52, 246, 44, 33, 6, 1, 235, 192, 33, 4, 1, 235, 192, 33, 6, 1, 247, 169, + 33, 4, 1, 247, 169, 33, 6, 1, 230, 145, 214, 205, 33, 4, 1, 230, 145, + 214, 205, 33, 6, 1, 251, 144, 226, 205, 33, 4, 1, 251, 144, 226, 205, 33, + 6, 1, 229, 92, 211, 31, 33, 4, 1, 229, 92, 211, 31, 33, 6, 1, 211, 28, 2, + 252, 193, 211, 31, 33, 4, 1, 211, 28, 2, 252, 193, 211, 31, 33, 6, 1, + 235, 190, 211, 59, 33, 4, 1, 235, 190, 211, 59, 33, 6, 1, 223, 52, 210, + 212, 33, 4, 1, 223, 52, 210, 212, 33, 6, 1, 235, 190, 61, 33, 4, 1, 235, + 190, 61, 33, 6, 1, 250, 8, 232, 198, 210, 183, 33, 4, 1, 250, 8, 232, + 198, 210, 183, 33, 6, 1, 251, 222, 210, 183, 33, 4, 1, 251, 222, 210, + 183, 33, 6, 1, 235, 190, 250, 8, 232, 198, 210, 183, 33, 4, 1, 235, 190, + 250, 8, 232, 198, 210, 183, 33, 6, 1, 210, 246, 33, 4, 1, 210, 246, 33, + 6, 1, 223, 52, 215, 179, 33, 4, 1, 223, 52, 215, 179, 33, 6, 1, 219, 54, + 248, 98, 33, 4, 1, 219, 54, 248, 98, 33, 6, 1, 219, 54, 245, 182, 33, 4, + 1, 219, 54, 245, 182, 33, 6, 1, 219, 54, 245, 167, 33, 4, 1, 219, 54, + 245, 167, 33, 6, 1, 230, 149, 78, 33, 4, 1, 230, 149, 78, 33, 6, 1, 251, + 248, 78, 33, 4, 1, 251, 248, 78, 33, 6, 1, 52, 230, 149, 78, 33, 4, 1, + 52, 230, 149, 78, 33, 1, 230, 91, 78, 38, 33, 212, 100, 38, 33, 216, 249, + 230, 196, 50, 38, 33, 240, 218, 230, 196, 50, 38, 33, 216, 149, 230, 196, + 50, 219, 95, 253, 224, 38, 33, 1, 214, 202, 236, 67, 38, 33, 1, 74, 38, + 33, 1, 211, 8, 38, 33, 1, 69, 38, 33, 1, 242, 10, 50, 38, 33, 1, 211, 27, + 38, 33, 1, 219, 54, 50, 38, 33, 1, 226, 205, 38, 33, 234, 198, 38, 33, + 225, 231, 33, 234, 198, 33, 225, 231, 33, 6, 1, 246, 54, 33, 4, 1, 246, + 54, 33, 6, 1, 246, 35, 33, 4, 1, 246, 35, 33, 6, 1, 210, 52, 33, 4, 1, + 210, 52, 33, 6, 1, 250, 214, 33, 4, 1, 250, 214, 33, 6, 1, 246, 33, 33, + 4, 1, 246, 33, 33, 6, 1, 217, 24, 2, 230, 229, 103, 33, 4, 1, 217, 24, 2, + 230, 229, 103, 33, 6, 1, 215, 78, 33, 4, 1, 215, 78, 33, 6, 1, 215, 161, + 33, 4, 1, 215, 161, 33, 6, 1, 215, 165, 33, 4, 1, 215, 165, 33, 6, 1, + 217, 29, 33, 4, 1, 217, 29, 33, 6, 1, 240, 205, 33, 4, 1, 240, 205, 33, + 6, 1, 219, 208, 33, 4, 1, 219, 208, 38, 33, 1, 235, 190, 76, 20, 1, 61, + 20, 1, 176, 20, 1, 69, 20, 1, 233, 223, 20, 1, 245, 217, 20, 1, 223, 111, + 20, 1, 217, 87, 20, 1, 78, 20, 1, 227, 152, 20, 1, 74, 20, 1, 233, 141, + 20, 1, 191, 20, 1, 222, 242, 20, 1, 223, 32, 20, 1, 233, 55, 20, 1, 231, + 84, 20, 1, 217, 102, 20, 1, 229, 151, 20, 1, 228, 188, 20, 1, 194, 20, 1, + 218, 5, 20, 1, 230, 107, 20, 1, 220, 29, 20, 1, 219, 193, 20, 1, 220, 39, + 20, 1, 220, 125, 20, 1, 233, 161, 20, 1, 234, 162, 20, 1, 227, 213, 20, + 1, 227, 242, 20, 1, 228, 159, 20, 1, 210, 226, 20, 1, 219, 227, 20, 1, + 210, 187, 20, 1, 192, 20, 1, 228, 14, 20, 1, 234, 148, 20, 1, 225, 154, + 20, 1, 228, 181, 20, 1, 227, 251, 20, 1, 224, 147, 20, 1, 211, 192, 20, + 1, 225, 214, 20, 1, 244, 155, 20, 1, 222, 142, 20, 1, 232, 103, 20, 1, + 230, 235, 20, 1, 228, 238, 20, 1, 223, 54, 20, 1, 223, 174, 20, 1, 234, + 171, 20, 1, 229, 12, 20, 1, 229, 61, 20, 1, 229, 82, 20, 1, 220, 9, 20, + 1, 224, 150, 20, 1, 243, 241, 20, 1, 244, 45, 20, 1, 212, 65, 20, 1, 198, + 20, 1, 232, 247, 20, 1, 225, 111, 20, 1, 232, 125, 20, 1, 234, 34, 20, 1, + 231, 119, 20, 1, 223, 86, 20, 1, 231, 63, 20, 1, 186, 20, 1, 216, 118, + 20, 1, 234, 98, 20, 1, 230, 166, 20, 1, 231, 127, 20, 1, 216, 231, 20, 1, + 234, 1, 20, 1, 216, 248, 20, 1, 227, 243, 20, 1, 221, 253, 20, 1, 244, + 200, 20, 1, 234, 3, 20, 1, 234, 30, 20, 38, 164, 234, 11, 20, 38, 164, + 215, 111, 20, 228, 187, 20, 243, 236, 218, 131, 20, 249, 234, 20, 249, + 227, 20, 220, 152, 20, 224, 16, 79, 58, 1, 250, 104, 138, 210, 254, 225, + 64, 58, 1, 250, 104, 138, 211, 70, 225, 64, 58, 1, 250, 104, 138, 210, + 254, 220, 86, 58, 1, 250, 104, 138, 211, 70, 220, 86, 58, 1, 250, 104, + 138, 210, 254, 224, 33, 58, 1, 250, 104, 138, 211, 70, 224, 33, 58, 1, + 250, 104, 138, 210, 254, 222, 142, 58, 1, 250, 104, 138, 211, 70, 222, + 142, 58, 1, 245, 28, 246, 126, 138, 130, 58, 1, 125, 246, 126, 138, 130, + 58, 1, 230, 230, 246, 126, 138, 130, 58, 1, 121, 246, 126, 138, 130, 58, + 1, 245, 27, 246, 126, 138, 130, 58, 1, 245, 28, 246, 126, 233, 45, 138, + 130, 58, 1, 125, 246, 126, 233, 45, 138, 130, 58, 1, 230, 230, 246, 126, + 233, 45, 138, 130, 58, 1, 121, 246, 126, 233, 45, 138, 130, 58, 1, 245, + 27, 246, 126, 233, 45, 138, 130, 58, 1, 245, 28, 233, 45, 138, 130, 58, + 1, 125, 233, 45, 138, 130, 58, 1, 230, 230, 233, 45, 138, 130, 58, 1, + 121, 233, 45, 138, 130, 58, 1, 245, 27, 233, 45, 138, 130, 58, 1, 59, 67, + 130, 58, 1, 59, 219, 97, 58, 1, 59, 203, 130, 58, 1, 232, 114, 44, 249, + 169, 254, 117, 58, 1, 223, 160, 120, 75, 58, 1, 223, 160, 124, 75, 58, 1, + 223, 160, 245, 39, 79, 58, 1, 223, 160, 235, 200, 245, 39, 79, 58, 1, + 121, 235, 200, 245, 39, 79, 58, 1, 218, 113, 22, 125, 216, 31, 58, 1, + 218, 113, 22, 121, 216, 31, 7, 6, 1, 245, 207, 254, 179, 7, 4, 1, 245, + 207, 254, 179, 7, 6, 1, 245, 207, 254, 205, 7, 4, 1, 245, 207, 254, 205, + 7, 6, 1, 241, 214, 7, 4, 1, 241, 214, 7, 6, 1, 215, 40, 7, 4, 1, 215, 40, + 7, 6, 1, 215, 230, 7, 4, 1, 215, 230, 7, 6, 1, 249, 118, 7, 4, 1, 249, + 118, 7, 6, 1, 249, 119, 2, 249, 227, 7, 4, 1, 249, 119, 2, 249, 227, 7, + 1, 4, 6, 245, 14, 7, 1, 4, 6, 222, 93, 7, 6, 1, 255, 82, 7, 4, 1, 255, + 82, 7, 6, 1, 254, 81, 7, 4, 1, 254, 81, 7, 6, 1, 253, 200, 7, 4, 1, 253, + 200, 7, 6, 1, 253, 184, 7, 4, 1, 253, 184, 7, 6, 1, 253, 185, 2, 203, + 130, 7, 4, 1, 253, 185, 2, 203, 130, 7, 6, 1, 253, 175, 7, 4, 1, 253, + 175, 7, 6, 1, 223, 52, 251, 75, 2, 247, 128, 7, 4, 1, 223, 52, 251, 75, + 2, 247, 128, 7, 6, 1, 235, 30, 2, 91, 7, 4, 1, 235, 30, 2, 91, 7, 6, 1, + 235, 30, 2, 248, 7, 91, 7, 4, 1, 235, 30, 2, 248, 7, 91, 7, 6, 1, 235, + 30, 2, 218, 105, 22, 248, 7, 91, 7, 4, 1, 235, 30, 2, 218, 105, 22, 248, + 7, 91, 7, 6, 1, 251, 143, 156, 7, 4, 1, 251, 143, 156, 7, 6, 1, 233, 155, + 2, 125, 91, 7, 4, 1, 233, 155, 2, 125, 91, 7, 6, 1, 144, 2, 200, 218, + 105, 226, 124, 7, 4, 1, 144, 2, 200, 218, 105, 226, 124, 7, 6, 1, 144, 2, + 232, 129, 7, 4, 1, 144, 2, 232, 129, 7, 6, 1, 226, 187, 7, 4, 1, 226, + 187, 7, 6, 1, 226, 110, 2, 218, 105, 216, 140, 248, 47, 7, 4, 1, 226, + 110, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, 226, 110, 2, 244, 61, 7, 4, + 1, 226, 110, 2, 244, 61, 7, 6, 1, 226, 110, 2, 218, 231, 217, 78, 7, 4, + 1, 226, 110, 2, 218, 231, 217, 78, 7, 6, 1, 224, 100, 2, 218, 105, 216, + 140, 248, 47, 7, 4, 1, 224, 100, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, + 224, 100, 2, 248, 7, 91, 7, 4, 1, 224, 100, 2, 248, 7, 91, 7, 6, 1, 223, + 227, 222, 188, 7, 4, 1, 223, 227, 222, 188, 7, 6, 1, 222, 132, 222, 188, + 7, 4, 1, 222, 132, 222, 188, 7, 6, 1, 214, 106, 2, 248, 7, 91, 7, 4, 1, + 214, 106, 2, 248, 7, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212, 106, 7, 6, 1, + 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1, 216, 153, 2, + 91, 7, 4, 1, 216, 153, 2, 91, 7, 6, 1, 216, 153, 2, 218, 105, 216, 140, + 248, 47, 7, 4, 1, 216, 153, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, 213, + 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 73, 7, 4, 1, 245, 73, 7, 6, 1, 235, + 178, 7, 4, 1, 235, 178, 7, 6, 1, 249, 215, 7, 4, 1, 249, 215, 58, 1, 214, + 133, 7, 4, 1, 246, 77, 7, 4, 1, 232, 89, 7, 4, 1, 230, 85, 7, 4, 1, 227, + 205, 7, 4, 1, 222, 131, 7, 1, 4, 6, 222, 131, 7, 4, 1, 215, 109, 7, 4, 1, + 214, 197, 7, 6, 1, 235, 220, 249, 68, 7, 4, 1, 235, 220, 249, 68, 7, 6, + 1, 235, 220, 245, 14, 7, 4, 1, 235, 220, 245, 14, 7, 6, 1, 235, 220, 243, + 209, 7, 6, 1, 215, 94, 235, 220, 243, 209, 7, 4, 1, 215, 94, 235, 220, + 243, 209, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94, 156, 7, 6, 1, 235, + 220, 153, 7, 4, 1, 235, 220, 153, 7, 6, 1, 235, 220, 222, 93, 7, 4, 1, + 235, 220, 222, 93, 7, 6, 1, 235, 220, 217, 153, 7, 4, 1, 235, 220, 217, + 153, 58, 1, 121, 250, 39, 255, 23, 58, 1, 249, 234, 58, 1, 219, 253, 245, + 106, 50, 7, 6, 1, 222, 1, 7, 4, 1, 222, 1, 7, 6, 1, 215, 94, 242, 67, 7, + 4, 1, 233, 155, 2, 223, 58, 241, 59, 22, 252, 49, 7, 6, 1, 230, 31, 2, + 248, 47, 7, 4, 1, 230, 31, 2, 248, 47, 7, 6, 1, 251, 75, 2, 130, 7, 4, 1, + 251, 75, 2, 130, 7, 6, 1, 243, 210, 2, 226, 252, 91, 7, 4, 1, 243, 210, + 2, 226, 252, 91, 7, 6, 1, 235, 30, 2, 226, 252, 91, 7, 4, 1, 235, 30, 2, + 226, 252, 91, 7, 6, 1, 230, 31, 2, 226, 252, 91, 7, 4, 1, 230, 31, 2, + 226, 252, 91, 7, 6, 1, 223, 227, 2, 226, 252, 91, 7, 4, 1, 223, 227, 2, + 226, 252, 91, 7, 6, 1, 222, 94, 2, 226, 252, 91, 7, 4, 1, 222, 94, 2, + 226, 252, 91, 7, 6, 1, 242, 68, 2, 103, 58, 1, 6, 242, 68, 2, 91, 58, 1, + 4, 27, 226, 238, 7, 1, 4, 6, 215, 94, 194, 7, 245, 111, 1, 223, 52, 245, + 14, 7, 245, 111, 1, 223, 52, 226, 109, 7, 245, 111, 1, 235, 200, 194, 7, + 245, 111, 1, 240, 161, 232, 135, 7, 245, 111, 1, 254, 31, 194, 217, 231, + 229, 219, 1, 61, 217, 231, 229, 219, 1, 74, 217, 231, 229, 219, 5, 246, + 56, 217, 231, 229, 219, 1, 69, 217, 231, 229, 219, 1, 76, 217, 231, 229, + 219, 1, 78, 217, 231, 229, 219, 5, 242, 4, 217, 231, 229, 219, 1, 234, + 34, 217, 231, 229, 219, 1, 234, 111, 217, 231, 229, 219, 1, 242, 181, + 217, 231, 229, 219, 1, 242, 231, 217, 231, 229, 219, 5, 254, 83, 217, + 231, 229, 219, 1, 249, 246, 217, 231, 229, 219, 1, 250, 94, 217, 231, + 229, 219, 1, 235, 74, 217, 231, 229, 219, 1, 235, 115, 217, 231, 229, + 219, 1, 215, 134, 217, 231, 229, 219, 1, 215, 140, 217, 231, 229, 219, 1, + 248, 113, 217, 231, 229, 219, 1, 248, 122, 217, 231, 229, 219, 1, 112, + 217, 231, 229, 219, 1, 216, 157, 217, 231, 229, 219, 1, 247, 153, 217, + 231, 229, 219, 1, 248, 15, 217, 231, 229, 219, 1, 228, 79, 217, 231, 229, + 219, 1, 225, 19, 217, 231, 229, 219, 1, 225, 124, 217, 231, 229, 219, 1, + 251, 213, 217, 231, 229, 219, 1, 252, 18, 217, 231, 229, 219, 1, 230, + 166, 217, 231, 229, 219, 1, 222, 213, 217, 231, 229, 219, 1, 232, 162, + 217, 231, 229, 219, 1, 222, 167, 217, 231, 229, 219, 1, 219, 60, 217, + 231, 229, 219, 1, 241, 75, 217, 231, 229, 219, 25, 5, 61, 217, 231, 229, + 219, 25, 5, 74, 217, 231, 229, 219, 25, 5, 69, 217, 231, 229, 219, 25, 5, + 76, 217, 231, 229, 219, 25, 5, 226, 187, 217, 231, 229, 219, 225, 15, + 231, 163, 217, 231, 229, 219, 225, 15, 231, 162, 217, 231, 229, 219, 225, + 15, 231, 161, 217, 231, 229, 219, 225, 15, 231, 160, 228, 61, 235, 247, + 244, 10, 123, 224, 24, 228, 61, 235, 247, 244, 10, 123, 242, 34, 228, 61, + 235, 247, 244, 10, 134, 224, 22, 228, 61, 235, 247, 244, 10, 123, 219, + 119, 228, 61, 235, 247, 244, 10, 123, 245, 196, 228, 61, 235, 247, 244, + 10, 134, 219, 118, 228, 61, 235, 247, 224, 25, 79, 228, 61, 235, 247, + 225, 43, 79, 228, 61, 235, 247, 222, 120, 79, 228, 61, 235, 247, 224, 26, + 79, 225, 147, 1, 176, 225, 147, 1, 234, 138, 225, 147, 1, 243, 142, 225, + 147, 1, 229, 82, 225, 147, 1, 251, 41, 225, 147, 1, 250, 165, 225, 147, + 1, 235, 147, 225, 147, 1, 227, 169, 225, 147, 1, 217, 106, 225, 147, 1, + 216, 209, 225, 147, 1, 248, 229, 225, 147, 1, 198, 225, 147, 1, 191, 225, + 147, 1, 225, 150, 225, 147, 1, 252, 199, 225, 147, 1, 186, 225, 147, 1, + 215, 184, 225, 147, 1, 215, 176, 225, 147, 1, 246, 46, 225, 147, 1, 212, + 65, 225, 147, 1, 210, 82, 225, 147, 1, 210, 116, 225, 147, 1, 4, 61, 225, + 147, 1, 192, 225, 147, 1, 205, 225, 147, 1, 233, 141, 225, 147, 1, 220, + 104, 225, 147, 1, 206, 225, 147, 1, 162, 225, 147, 1, 61, 225, 147, 1, + 74, 225, 147, 1, 69, 225, 147, 1, 76, 225, 147, 1, 78, 225, 147, 1, 224, + 91, 225, 147, 1, 211, 165, 225, 147, 1, 244, 204, 225, 147, 1, 243, 36, + 225, 147, 1, 245, 217, 225, 147, 218, 74, 1, 212, 65, 225, 147, 218, 74, + 1, 192, 225, 147, 1, 215, 157, 225, 147, 1, 215, 145, 225, 147, 1, 248, + 143, 225, 147, 1, 228, 115, 225, 147, 1, 254, 149, 192, 225, 147, 1, 213, + 134, 220, 104, 225, 147, 1, 213, 135, 162, 225, 147, 1, 253, 231, 244, + 204, 225, 147, 218, 74, 1, 205, 225, 147, 218, 26, 1, 205, 225, 147, 1, + 251, 7, 225, 147, 219, 157, 241, 243, 79, 225, 147, 52, 241, 243, 79, + 225, 147, 164, 220, 97, 225, 147, 164, 52, 220, 97, 179, 5, 254, 83, 179, + 5, 213, 147, 179, 1, 61, 179, 1, 255, 82, 179, 1, 74, 179, 1, 236, 40, + 179, 1, 69, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 182, + 179, 1, 149, 156, 179, 1, 149, 232, 191, 179, 1, 76, 179, 1, 245, 217, + 179, 1, 254, 210, 179, 1, 78, 179, 1, 226, 187, 179, 1, 253, 200, 179, 1, + 176, 179, 1, 234, 138, 179, 1, 243, 142, 179, 1, 243, 0, 179, 1, 229, 82, + 179, 1, 251, 41, 179, 1, 250, 165, 179, 1, 235, 147, 179, 1, 235, 120, + 179, 1, 227, 169, 179, 1, 215, 157, 179, 1, 215, 145, 179, 1, 248, 143, + 179, 1, 248, 127, 179, 1, 228, 115, 179, 1, 217, 106, 179, 1, 216, 209, + 179, 1, 248, 229, 179, 1, 248, 33, 179, 1, 198, 179, 1, 191, 179, 1, 225, + 150, 179, 1, 252, 199, 179, 1, 252, 26, 179, 1, 186, 179, 1, 192, 179, 1, + 205, 179, 1, 233, 141, 179, 1, 214, 27, 179, 1, 220, 104, 179, 1, 218, + 225, 179, 1, 206, 179, 1, 162, 179, 1, 232, 190, 179, 117, 5, 242, 51, + 179, 25, 5, 255, 82, 179, 25, 5, 74, 179, 25, 5, 236, 40, 179, 25, 5, 69, + 179, 25, 5, 214, 118, 179, 25, 5, 149, 153, 179, 25, 5, 149, 222, 182, + 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 191, 179, 25, 5, 76, 179, 25, + 5, 245, 217, 179, 25, 5, 254, 210, 179, 25, 5, 78, 179, 25, 5, 226, 187, + 179, 25, 5, 253, 200, 179, 5, 213, 152, 179, 248, 186, 179, 52, 248, 186, + 179, 21, 210, 86, 179, 21, 111, 179, 21, 105, 179, 21, 158, 179, 21, 161, + 179, 21, 190, 179, 21, 195, 179, 21, 199, 179, 21, 196, 179, 21, 201, 38, + 84, 21, 210, 86, 38, 84, 21, 111, 38, 84, 21, 105, 38, 84, 21, 158, 38, + 84, 21, 161, 38, 84, 21, 190, 38, 84, 21, 195, 38, 84, 21, 199, 38, 84, + 21, 196, 38, 84, 21, 201, 38, 84, 1, 61, 38, 84, 1, 69, 38, 84, 1, 176, + 38, 84, 1, 198, 38, 84, 1, 191, 38, 84, 1, 205, 38, 84, 1, 213, 176, 38, + 84, 5, 253, 183, 84, 5, 219, 19, 251, 7, 84, 5, 251, 8, 213, 152, 84, 5, + 52, 251, 8, 213, 152, 84, 5, 251, 8, 105, 84, 5, 251, 8, 158, 84, 5, 251, + 8, 253, 183, 84, 5, 224, 127, 84, 243, 107, 244, 111, 84, 250, 246, 84, + 241, 237, 234, 194, 232, 248, 21, 210, 86, 234, 194, 232, 248, 21, 111, + 234, 194, 232, 248, 21, 105, 234, 194, 232, 248, 21, 158, 234, 194, 232, + 248, 21, 161, 234, 194, 232, 248, 21, 190, 234, 194, 232, 248, 21, 195, + 234, 194, 232, 248, 21, 199, 234, 194, 232, 248, 21, 196, 234, 194, 232, + 248, 21, 201, 234, 194, 232, 248, 1, 176, 234, 194, 232, 248, 1, 234, + 138, 234, 194, 232, 248, 1, 243, 142, 234, 194, 232, 248, 1, 229, 82, + 234, 194, 232, 248, 1, 206, 234, 194, 232, 248, 1, 220, 104, 234, 194, + 232, 248, 1, 210, 116, 234, 194, 232, 248, 1, 227, 169, 234, 194, 232, + 248, 1, 217, 106, 234, 194, 232, 248, 1, 240, 233, 234, 194, 232, 248, 1, + 198, 234, 194, 232, 248, 1, 191, 234, 194, 232, 248, 1, 225, 150, 234, + 194, 232, 248, 1, 186, 234, 194, 232, 248, 1, 248, 229, 234, 194, 232, + 248, 1, 252, 199, 234, 194, 232, 248, 1, 205, 234, 194, 232, 248, 1, 192, + 234, 194, 232, 248, 1, 233, 141, 234, 194, 232, 248, 1, 212, 65, 234, + 194, 232, 248, 1, 216, 209, 234, 194, 232, 248, 1, 162, 234, 194, 232, + 248, 1, 214, 27, 234, 194, 232, 248, 1, 251, 41, 234, 194, 232, 248, 1, + 61, 234, 194, 232, 248, 1, 226, 238, 234, 194, 232, 248, 1, 74, 234, 194, + 232, 248, 1, 226, 187, 234, 194, 232, 248, 25, 214, 214, 234, 194, 232, + 248, 25, 76, 234, 194, 232, 248, 25, 69, 234, 194, 232, 248, 25, 245, + 217, 234, 194, 232, 248, 25, 78, 234, 194, 232, 248, 138, 225, 33, 234, + 194, 232, 248, 138, 251, 20, 234, 194, 232, 248, 138, 251, 21, 225, 33, + 234, 194, 232, 248, 5, 249, 85, 234, 194, 232, 248, 5, 219, 201, 223, 96, + 1, 176, 223, 96, 1, 243, 142, 223, 96, 1, 229, 82, 223, 96, 1, 217, 106, + 223, 96, 1, 248, 229, 223, 96, 1, 198, 223, 96, 1, 191, 223, 96, 1, 252, + 199, 223, 96, 1, 186, 223, 96, 1, 251, 41, 223, 96, 1, 235, 147, 223, 96, + 1, 227, 169, 223, 96, 1, 206, 223, 96, 1, 205, 223, 96, 1, 233, 141, 223, + 96, 1, 192, 223, 96, 1, 212, 65, 223, 96, 1, 162, 223, 96, 1, 231, 129, + 223, 96, 1, 229, 61, 223, 96, 1, 229, 153, 223, 96, 1, 227, 139, 223, 96, + 1, 61, 223, 96, 25, 5, 74, 223, 96, 25, 5, 69, 223, 96, 25, 5, 76, 223, + 96, 25, 5, 254, 210, 223, 96, 25, 5, 78, 223, 96, 25, 5, 253, 200, 223, + 96, 25, 5, 245, 63, 223, 96, 25, 5, 245, 241, 223, 96, 117, 5, 229, 84, + 223, 96, 117, 5, 230, 30, 223, 96, 117, 5, 153, 223, 96, 117, 5, 242, 67, + 223, 96, 213, 152, 223, 96, 221, 175, 79, 24, 100, 216, 98, 24, 100, 216, + 97, 24, 100, 216, 95, 24, 100, 216, 100, 24, 100, 223, 24, 24, 100, 223, + 8, 24, 100, 223, 3, 24, 100, 223, 5, 24, 100, 223, 21, 24, 100, 223, 14, + 24, 100, 223, 7, 24, 100, 223, 26, 24, 100, 223, 9, 24, 100, 223, 28, 24, + 100, 223, 25, 24, 100, 230, 218, 24, 100, 230, 209, 24, 100, 230, 212, + 24, 100, 225, 83, 24, 100, 225, 94, 24, 100, 225, 95, 24, 100, 218, 209, + 24, 100, 236, 53, 24, 100, 236, 60, 24, 100, 218, 220, 24, 100, 218, 207, + 24, 100, 225, 133, 24, 100, 241, 174, 24, 100, 218, 204, 155, 5, 226, 31, + 155, 5, 250, 195, 155, 5, 233, 72, 155, 5, 211, 243, 155, 1, 61, 155, 1, + 240, 161, 234, 197, 155, 1, 74, 155, 1, 236, 40, 155, 1, 69, 155, 1, 226, + 94, 250, 171, 155, 1, 229, 83, 233, 34, 155, 1, 229, 83, 233, 35, 223, + 145, 155, 1, 76, 155, 1, 254, 210, 155, 1, 78, 155, 1, 176, 155, 1, 235, + 19, 221, 230, 155, 1, 235, 19, 230, 71, 155, 1, 243, 142, 155, 1, 243, + 143, 230, 71, 155, 1, 229, 82, 155, 1, 251, 41, 155, 1, 251, 42, 230, 71, + 155, 1, 235, 147, 155, 1, 227, 170, 230, 71, 155, 1, 235, 148, 231, 212, + 155, 1, 227, 169, 155, 1, 215, 157, 155, 1, 215, 158, 231, 212, 155, 1, + 248, 143, 155, 1, 248, 144, 231, 212, 155, 1, 229, 234, 230, 71, 155, 1, + 217, 106, 155, 1, 217, 107, 230, 71, 155, 1, 248, 229, 155, 1, 248, 230, + 231, 212, 155, 1, 198, 155, 1, 191, 155, 1, 226, 94, 230, 71, 155, 1, + 252, 199, 155, 1, 252, 200, 230, 71, 155, 1, 186, 155, 1, 192, 155, 1, + 205, 155, 1, 223, 191, 254, 219, 155, 1, 233, 141, 155, 1, 212, 65, 155, + 1, 222, 36, 230, 71, 155, 1, 222, 36, 231, 212, 155, 1, 206, 155, 1, 162, + 155, 5, 250, 196, 216, 251, 155, 25, 5, 217, 48, 155, 25, 5, 216, 36, + 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 74, 155, 25, 5, 218, 48, + 155, 25, 5, 218, 49, 231, 62, 155, 25, 5, 217, 66, 155, 25, 5, 247, 202, + 230, 70, 155, 25, 5, 225, 187, 155, 117, 5, 234, 164, 155, 117, 5, 225, + 199, 155, 117, 5, 251, 27, 155, 226, 44, 155, 43, 223, 72, 155, 44, 223, + 72, 155, 226, 83, 254, 125, 155, 226, 83, 231, 229, 155, 226, 83, 232, + 93, 155, 226, 83, 211, 238, 155, 226, 83, 226, 45, 155, 226, 83, 232, + 211, 155, 226, 83, 232, 87, 155, 226, 83, 255, 2, 155, 226, 83, 255, 3, + 255, 2, 155, 226, 83, 225, 54, 155, 215, 94, 226, 83, 225, 54, 155, 226, + 40, 155, 21, 210, 86, 155, 21, 111, 155, 21, 105, 155, 21, 158, 155, 21, + 161, 155, 21, 190, 155, 21, 195, 155, 21, 199, 155, 21, 196, 155, 21, + 201, 155, 226, 83, 216, 70, 215, 107, 155, 226, 83, 235, 174, 172, 1, 61, + 172, 1, 74, 172, 1, 69, 172, 1, 76, 172, 1, 254, 210, 172, 1, 78, 172, 1, + 176, 172, 1, 234, 138, 172, 1, 243, 142, 172, 1, 243, 0, 172, 1, 228, + 250, 172, 1, 229, 82, 172, 1, 250, 165, 172, 1, 250, 120, 172, 1, 235, + 147, 172, 1, 235, 120, 172, 1, 228, 240, 172, 1, 228, 242, 172, 1, 228, + 241, 172, 1, 217, 106, 172, 1, 216, 209, 172, 1, 248, 229, 172, 1, 248, + 33, 172, 1, 227, 211, 172, 1, 198, 172, 1, 248, 143, 172, 1, 191, 172, 1, + 224, 223, 172, 1, 225, 150, 172, 1, 252, 199, 172, 1, 252, 26, 172, 1, + 230, 100, 172, 1, 186, 172, 1, 252, 119, 172, 1, 192, 172, 1, 205, 172, + 1, 233, 141, 172, 1, 214, 27, 172, 1, 218, 225, 172, 1, 206, 172, 1, 162, + 172, 25, 5, 255, 82, 172, 25, 5, 74, 172, 25, 5, 236, 40, 172, 25, 5, + 245, 203, 172, 25, 5, 69, 172, 25, 5, 226, 238, 172, 25, 5, 78, 172, 25, + 5, 254, 210, 172, 25, 5, 253, 200, 172, 25, 5, 214, 214, 172, 117, 5, + 192, 172, 117, 5, 205, 172, 117, 5, 233, 141, 172, 117, 5, 212, 65, 172, + 1, 40, 235, 29, 172, 1, 40, 243, 209, 172, 1, 40, 229, 84, 172, 117, 5, + 40, 229, 84, 172, 1, 40, 250, 166, 172, 1, 40, 217, 153, 172, 1, 40, 230, + 30, 172, 1, 40, 226, 109, 172, 1, 40, 211, 117, 172, 1, 40, 153, 172, 1, + 40, 156, 172, 1, 40, 218, 228, 172, 117, 5, 40, 194, 172, 117, 5, 40, + 242, 67, 172, 21, 210, 86, 172, 21, 111, 172, 21, 105, 172, 21, 158, 172, + 21, 161, 172, 21, 190, 172, 21, 195, 172, 21, 199, 172, 21, 196, 172, 21, + 201, 172, 224, 144, 218, 253, 172, 224, 144, 248, 186, 172, 224, 144, 52, + 248, 186, 172, 224, 144, 215, 212, 248, 186, 68, 1, 234, 132, 243, 142, + 68, 1, 234, 132, 251, 41, 68, 1, 234, 132, 250, 165, 68, 1, 234, 132, + 235, 147, 68, 1, 234, 132, 235, 120, 68, 1, 234, 132, 227, 169, 68, 1, + 234, 132, 215, 157, 68, 1, 234, 132, 215, 145, 68, 1, 234, 132, 248, 143, + 68, 1, 234, 132, 248, 127, 68, 1, 234, 132, 248, 33, 68, 1, 234, 132, + 198, 68, 1, 234, 132, 206, 68, 1, 234, 132, 162, 68, 1, 234, 132, 241, + 196, 68, 1, 234, 132, 244, 204, 68, 58, 1, 234, 132, 223, 112, 68, 1, + 234, 132, 211, 165, 68, 1, 234, 132, 210, 116, 68, 1, 234, 132, 205, 68, + 232, 151, 234, 132, 227, 1, 68, 232, 151, 234, 132, 224, 46, 68, 232, + 151, 234, 132, 241, 128, 68, 16, 254, 199, 245, 38, 68, 16, 254, 199, + 111, 68, 16, 254, 199, 105, 68, 1, 254, 199, 205, 68, 5, 226, 27, 234, + 219, 216, 31, 39, 208, 1, 121, 234, 34, 39, 208, 1, 125, 234, 34, 39, + 208, 1, 121, 234, 111, 39, 208, 1, 125, 234, 111, 39, 208, 1, 121, 234, + 120, 39, 208, 1, 125, 234, 120, 39, 208, 1, 121, 242, 181, 39, 208, 1, + 125, 242, 181, 39, 208, 1, 121, 229, 9, 39, 208, 1, 125, 229, 9, 39, 208, + 1, 121, 249, 246, 39, 208, 1, 125, 249, 246, 39, 208, 1, 121, 250, 94, + 39, 208, 1, 125, 250, 94, 39, 208, 1, 121, 219, 60, 39, 208, 1, 125, 219, + 60, 39, 208, 1, 121, 227, 138, 39, 208, 1, 125, 227, 138, 39, 208, 1, + 121, 247, 153, 39, 208, 1, 125, 247, 153, 39, 208, 1, 121, 112, 39, 208, + 1, 125, 112, 39, 208, 1, 121, 216, 157, 39, 208, 1, 125, 216, 157, 39, + 208, 1, 121, 228, 79, 39, 208, 1, 125, 228, 79, 39, 208, 1, 121, 251, + 213, 39, 208, 1, 125, 251, 213, 39, 208, 1, 121, 225, 19, 39, 208, 1, + 125, 225, 19, 39, 208, 1, 121, 225, 124, 39, 208, 1, 125, 225, 124, 39, + 208, 1, 121, 244, 51, 39, 208, 1, 125, 244, 51, 39, 208, 1, 121, 230, + 166, 39, 208, 1, 125, 230, 166, 39, 208, 1, 121, 210, 244, 39, 208, 1, + 125, 210, 244, 39, 208, 1, 121, 222, 213, 39, 208, 1, 125, 222, 213, 39, + 208, 1, 121, 232, 162, 39, 208, 1, 125, 232, 162, 39, 208, 1, 121, 213, + 138, 39, 208, 1, 125, 213, 138, 39, 208, 1, 121, 241, 75, 39, 208, 1, + 125, 241, 75, 39, 208, 1, 121, 78, 39, 208, 1, 125, 78, 39, 208, 231, + 209, 234, 236, 39, 208, 25, 255, 82, 39, 208, 25, 74, 39, 208, 25, 214, + 214, 39, 208, 25, 69, 39, 208, 25, 76, 39, 208, 25, 78, 39, 208, 231, + 209, 234, 114, 39, 208, 25, 240, 126, 39, 208, 25, 214, 213, 39, 208, 25, + 214, 229, 39, 208, 25, 253, 198, 39, 208, 25, 253, 175, 39, 208, 25, 254, + 131, 39, 208, 25, 254, 144, 39, 208, 138, 231, 209, 245, 188, 39, 208, + 138, 231, 209, 227, 210, 39, 208, 138, 231, 209, 216, 157, 39, 208, 138, + 231, 209, 219, 44, 39, 208, 16, 234, 19, 39, 208, 16, 227, 210, 39, 208, + 16, 221, 255, 39, 208, 16, 241, 76, 241, 71, 39, 208, 16, 234, 28, 234, + 27, 188, 187, 1, 76, 188, 187, 1, 78, 188, 187, 1, 250, 165, 188, 187, 1, + 227, 169, 188, 187, 1, 215, 157, 188, 187, 1, 215, 145, 188, 187, 1, 248, + 143, 188, 187, 1, 248, 127, 188, 187, 1, 228, 115, 188, 187, 1, 220, 104, + 188, 187, 1, 218, 225, 188, 187, 25, 5, 236, 40, 188, 187, 25, 5, 214, + 118, 188, 187, 25, 5, 255, 46, 188, 187, 25, 5, 253, 200, 188, 187, 25, + 5, 255, 39, 188, 187, 250, 133, 188, 187, 254, 215, 234, 104, 188, 187, + 254, 111, 188, 187, 3, 223, 77, 79, 188, 187, 211, 209, 223, 77, 79, 188, + 187, 25, 5, 213, 147, 188, 187, 213, 152, 29, 3, 215, 138, 29, 3, 215, + 141, 29, 3, 215, 144, 29, 3, 215, 142, 29, 3, 215, 143, 29, 3, 215, 140, + 29, 3, 248, 121, 29, 3, 248, 123, 29, 3, 248, 126, 29, 3, 248, 124, 29, + 3, 248, 125, 29, 3, 248, 122, 29, 3, 246, 36, 29, 3, 246, 39, 29, 3, 246, + 45, 29, 3, 246, 43, 29, 3, 246, 44, 29, 3, 246, 37, 29, 3, 250, 212, 29, + 3, 250, 206, 29, 3, 250, 208, 29, 3, 250, 211, 29, 3, 250, 209, 29, 3, + 250, 210, 29, 3, 250, 207, 29, 3, 252, 119, 29, 3, 252, 98, 29, 3, 252, + 110, 29, 3, 252, 118, 29, 3, 252, 113, 29, 3, 252, 114, 29, 3, 252, 102, + 188, 187, 1, 234, 25, 188, 187, 1, 221, 255, 188, 187, 1, 233, 115, 188, + 187, 1, 230, 177, 188, 187, 1, 191, 188, 187, 1, 198, 188, 187, 1, 250, + 110, 188, 187, 1, 216, 91, 188, 187, 1, 234, 107, 188, 187, 1, 228, 255, + 188, 187, 1, 216, 151, 188, 187, 1, 212, 60, 188, 187, 1, 211, 69, 188, + 187, 1, 240, 223, 188, 187, 1, 214, 190, 188, 187, 1, 74, 188, 187, 1, + 225, 145, 188, 187, 1, 253, 210, 188, 187, 1, 242, 174, 188, 187, 1, 235, + 118, 188, 187, 1, 223, 169, 188, 187, 1, 252, 199, 188, 187, 1, 235, 106, + 188, 187, 1, 247, 227, 188, 187, 1, 242, 228, 188, 187, 1, 248, 13, 188, + 187, 1, 252, 24, 188, 187, 1, 234, 26, 232, 134, 188, 187, 1, 233, 116, + 232, 134, 188, 187, 1, 230, 178, 232, 134, 188, 187, 1, 226, 94, 232, + 134, 188, 187, 1, 229, 234, 232, 134, 188, 187, 1, 216, 92, 232, 134, + 188, 187, 1, 229, 0, 232, 134, 188, 187, 1, 240, 161, 232, 134, 188, 187, + 25, 5, 226, 199, 188, 187, 25, 5, 236, 4, 188, 187, 25, 5, 254, 130, 188, + 187, 25, 5, 211, 38, 188, 187, 25, 5, 219, 34, 188, 187, 25, 5, 214, 187, + 188, 187, 25, 5, 250, 131, 188, 187, 25, 5, 227, 195, 188, 187, 250, 132, + 188, 187, 232, 90, 235, 156, 188, 187, 254, 54, 235, 156, 188, 187, 21, + 210, 86, 188, 187, 21, 111, 188, 187, 21, 105, 188, 187, 21, 158, 188, + 187, 21, 161, 188, 187, 21, 190, 188, 187, 21, 195, 188, 187, 21, 199, + 188, 187, 21, 196, 188, 187, 21, 201, 24, 143, 227, 81, 24, 143, 227, 86, + 24, 143, 210, 243, 24, 143, 210, 242, 24, 143, 210, 241, 24, 143, 215, + 23, 24, 143, 215, 26, 24, 143, 210, 210, 24, 143, 210, 206, 24, 143, 245, + 62, 24, 143, 245, 60, 24, 143, 245, 61, 24, 143, 245, 58, 24, 143, 240, + 151, 24, 143, 240, 150, 24, 143, 240, 148, 24, 143, 240, 149, 24, 143, + 240, 154, 24, 143, 240, 147, 24, 143, 240, 146, 24, 143, 240, 156, 24, + 143, 254, 41, 24, 143, 254, 40, 24, 90, 228, 224, 24, 90, 228, 230, 24, + 90, 218, 206, 24, 90, 218, 205, 24, 90, 216, 97, 24, 90, 216, 95, 24, 90, + 216, 94, 24, 90, 216, 100, 24, 90, 216, 101, 24, 90, 216, 93, 24, 90, + 223, 8, 24, 90, 223, 23, 24, 90, 218, 212, 24, 90, 223, 20, 24, 90, 223, + 10, 24, 90, 223, 12, 24, 90, 222, 255, 24, 90, 223, 0, 24, 90, 234, 224, + 24, 90, 230, 217, 24, 90, 230, 211, 24, 90, 218, 216, 24, 90, 230, 214, + 24, 90, 230, 220, 24, 90, 225, 79, 24, 90, 225, 88, 24, 90, 225, 92, 24, + 90, 218, 214, 24, 90, 225, 82, 24, 90, 225, 96, 24, 90, 225, 97, 24, 90, + 219, 142, 24, 90, 219, 145, 24, 90, 218, 210, 24, 90, 218, 208, 24, 90, + 219, 140, 24, 90, 219, 148, 24, 90, 219, 149, 24, 90, 219, 134, 24, 90, + 219, 147, 24, 90, 226, 34, 24, 90, 226, 35, 24, 90, 211, 24, 24, 90, 211, + 25, 24, 90, 250, 52, 24, 90, 250, 51, 24, 90, 218, 221, 24, 90, 225, 131, + 24, 90, 225, 130, 10, 14, 238, 31, 10, 14, 238, 30, 10, 14, 238, 29, 10, + 14, 238, 28, 10, 14, 238, 27, 10, 14, 238, 26, 10, 14, 238, 25, 10, 14, + 238, 24, 10, 14, 238, 23, 10, 14, 238, 22, 10, 14, 238, 21, 10, 14, 238, + 20, 10, 14, 238, 19, 10, 14, 238, 18, 10, 14, 238, 17, 10, 14, 238, 16, + 10, 14, 238, 15, 10, 14, 238, 14, 10, 14, 238, 13, 10, 14, 238, 12, 10, + 14, 238, 11, 10, 14, 238, 10, 10, 14, 238, 9, 10, 14, 238, 8, 10, 14, + 238, 7, 10, 14, 238, 6, 10, 14, 238, 5, 10, 14, 238, 4, 10, 14, 238, 3, + 10, 14, 238, 2, 10, 14, 238, 1, 10, 14, 238, 0, 10, 14, 237, 255, 10, 14, + 237, 254, 10, 14, 237, 253, 10, 14, 237, 252, 10, 14, 237, 251, 10, 14, + 237, 250, 10, 14, 237, 249, 10, 14, 237, 248, 10, 14, 237, 247, 10, 14, + 237, 246, 10, 14, 237, 245, 10, 14, 237, 244, 10, 14, 237, 243, 10, 14, + 237, 242, 10, 14, 237, 241, 10, 14, 237, 240, 10, 14, 237, 239, 10, 14, + 237, 238, 10, 14, 237, 237, 10, 14, 237, 236, 10, 14, 237, 235, 10, 14, + 237, 234, 10, 14, 237, 233, 10, 14, 237, 232, 10, 14, 237, 231, 10, 14, + 237, 230, 10, 14, 237, 229, 10, 14, 237, 228, 10, 14, 237, 227, 10, 14, + 237, 226, 10, 14, 237, 225, 10, 14, 237, 224, 10, 14, 237, 223, 10, 14, + 237, 222, 10, 14, 237, 221, 10, 14, 237, 220, 10, 14, 237, 219, 10, 14, + 237, 218, 10, 14, 237, 217, 10, 14, 237, 216, 10, 14, 237, 215, 10, 14, + 237, 214, 10, 14, 237, 213, 10, 14, 237, 212, 10, 14, 237, 211, 10, 14, + 237, 210, 10, 14, 237, 209, 10, 14, 237, 208, 10, 14, 237, 207, 10, 14, + 237, 206, 10, 14, 237, 205, 10, 14, 237, 204, 10, 14, 237, 203, 10, 14, + 237, 202, 10, 14, 237, 201, 10, 14, 237, 200, 10, 14, 237, 199, 10, 14, + 237, 198, 10, 14, 237, 197, 10, 14, 237, 196, 10, 14, 237, 195, 10, 14, + 237, 194, 10, 14, 237, 193, 10, 14, 237, 192, 10, 14, 237, 191, 10, 14, + 237, 190, 10, 14, 237, 189, 10, 14, 237, 188, 10, 14, 237, 187, 10, 14, + 237, 186, 10, 14, 237, 185, 10, 14, 237, 184, 10, 14, 237, 183, 10, 14, + 237, 182, 10, 14, 237, 181, 10, 14, 237, 180, 10, 14, 237, 179, 10, 14, + 237, 178, 10, 14, 237, 177, 10, 14, 237, 176, 10, 14, 237, 175, 10, 14, + 237, 174, 10, 14, 237, 173, 10, 14, 237, 172, 10, 14, 237, 171, 10, 14, + 237, 170, 10, 14, 237, 169, 10, 14, 237, 168, 10, 14, 237, 167, 10, 14, + 237, 166, 10, 14, 237, 165, 10, 14, 237, 164, 10, 14, 237, 163, 10, 14, + 237, 162, 10, 14, 237, 161, 10, 14, 237, 160, 10, 14, 237, 159, 10, 14, + 237, 158, 10, 14, 237, 157, 10, 14, 237, 156, 10, 14, 237, 155, 10, 14, + 237, 154, 10, 14, 237, 153, 10, 14, 237, 152, 10, 14, 237, 151, 10, 14, + 237, 150, 10, 14, 237, 149, 10, 14, 237, 148, 10, 14, 237, 147, 10, 14, + 237, 146, 10, 14, 237, 145, 10, 14, 237, 144, 10, 14, 237, 143, 10, 14, + 237, 142, 10, 14, 237, 141, 10, 14, 237, 140, 10, 14, 237, 139, 10, 14, + 237, 138, 10, 14, 237, 137, 10, 14, 237, 136, 10, 14, 237, 135, 10, 14, + 237, 134, 10, 14, 237, 133, 10, 14, 237, 132, 10, 14, 237, 131, 10, 14, + 237, 130, 10, 14, 237, 129, 10, 14, 237, 128, 10, 14, 237, 127, 10, 14, + 237, 126, 10, 14, 237, 125, 10, 14, 237, 124, 10, 14, 237, 123, 10, 14, + 237, 122, 10, 14, 237, 121, 10, 14, 237, 120, 10, 14, 237, 119, 10, 14, + 237, 118, 10, 14, 237, 117, 10, 14, 237, 116, 10, 14, 237, 115, 10, 14, + 237, 114, 10, 14, 237, 113, 10, 14, 237, 112, 10, 14, 237, 111, 10, 14, + 237, 110, 10, 14, 237, 109, 10, 14, 237, 108, 10, 14, 237, 107, 10, 14, + 237, 106, 10, 14, 237, 105, 10, 14, 237, 104, 10, 14, 237, 103, 10, 14, + 237, 102, 10, 14, 237, 101, 10, 14, 237, 100, 10, 14, 237, 99, 10, 14, + 237, 98, 10, 14, 237, 97, 10, 14, 237, 96, 10, 14, 237, 95, 10, 14, 237, + 94, 10, 14, 237, 93, 10, 14, 237, 92, 10, 14, 237, 91, 10, 14, 237, 90, + 10, 14, 237, 89, 10, 14, 237, 88, 10, 14, 237, 87, 10, 14, 237, 86, 10, + 14, 237, 85, 10, 14, 237, 84, 10, 14, 237, 83, 10, 14, 237, 82, 10, 14, + 237, 81, 10, 14, 237, 80, 10, 14, 237, 79, 10, 14, 237, 78, 10, 14, 237, + 77, 10, 14, 237, 76, 10, 14, 237, 75, 10, 14, 237, 74, 10, 14, 237, 73, + 10, 14, 237, 72, 10, 14, 237, 71, 10, 14, 237, 70, 10, 14, 237, 69, 10, + 14, 237, 68, 10, 14, 237, 67, 10, 14, 237, 66, 10, 14, 237, 65, 10, 14, + 237, 64, 10, 14, 237, 63, 10, 14, 237, 62, 10, 14, 237, 61, 10, 14, 237, + 60, 10, 14, 237, 59, 10, 14, 237, 58, 10, 14, 237, 57, 10, 14, 237, 56, + 10, 14, 237, 55, 10, 14, 237, 54, 10, 14, 237, 53, 10, 14, 237, 52, 10, + 14, 237, 51, 10, 14, 237, 50, 10, 14, 237, 49, 10, 14, 237, 48, 10, 14, + 237, 47, 10, 14, 237, 46, 10, 14, 237, 45, 10, 14, 237, 44, 10, 14, 237, + 43, 10, 14, 237, 42, 10, 14, 237, 41, 10, 14, 237, 40, 10, 14, 237, 39, + 10, 14, 237, 38, 10, 14, 237, 37, 10, 14, 237, 36, 10, 14, 237, 35, 10, + 14, 237, 34, 10, 14, 237, 33, 10, 14, 237, 32, 10, 14, 237, 31, 10, 14, + 237, 30, 10, 14, 237, 29, 10, 14, 237, 28, 10, 14, 237, 27, 10, 14, 237, + 26, 10, 14, 237, 25, 10, 14, 237, 24, 10, 14, 237, 23, 10, 14, 237, 22, + 10, 14, 237, 21, 10, 14, 237, 20, 10, 14, 237, 19, 10, 14, 237, 18, 10, + 14, 237, 17, 10, 14, 237, 16, 10, 14, 237, 15, 10, 14, 237, 14, 10, 14, + 237, 13, 10, 14, 237, 12, 10, 14, 237, 11, 10, 14, 237, 10, 10, 14, 237, + 9, 10, 14, 237, 8, 10, 14, 237, 7, 10, 14, 237, 6, 10, 14, 237, 5, 10, + 14, 237, 4, 10, 14, 237, 3, 10, 14, 237, 2, 10, 14, 237, 1, 10, 14, 237, + 0, 10, 14, 236, 255, 10, 14, 236, 254, 10, 14, 236, 253, 10, 14, 236, + 252, 10, 14, 236, 251, 10, 14, 236, 250, 10, 14, 236, 249, 10, 14, 236, + 248, 10, 14, 236, 247, 10, 14, 236, 246, 10, 14, 236, 245, 10, 14, 236, + 244, 10, 14, 236, 243, 10, 14, 236, 242, 10, 14, 236, 241, 10, 14, 236, + 240, 10, 14, 236, 239, 10, 14, 236, 238, 10, 14, 236, 237, 10, 14, 236, + 236, 10, 14, 236, 235, 10, 14, 236, 234, 10, 14, 236, 233, 10, 14, 236, + 232, 10, 14, 236, 231, 10, 14, 236, 230, 10, 14, 236, 229, 10, 14, 236, + 228, 10, 14, 236, 227, 10, 14, 236, 226, 10, 14, 236, 225, 10, 14, 236, + 224, 10, 14, 236, 223, 10, 14, 236, 222, 10, 14, 236, 221, 10, 14, 236, + 220, 10, 14, 236, 219, 10, 14, 236, 218, 10, 14, 236, 217, 10, 14, 236, + 216, 10, 14, 236, 215, 10, 14, 236, 214, 10, 14, 236, 213, 10, 14, 236, + 212, 10, 14, 236, 211, 10, 14, 236, 210, 10, 14, 236, 209, 10, 14, 236, + 208, 10, 14, 236, 207, 10, 14, 236, 206, 10, 14, 236, 205, 10, 14, 236, + 204, 10, 14, 236, 203, 10, 14, 236, 202, 10, 14, 236, 201, 10, 14, 236, + 200, 10, 14, 236, 199, 10, 14, 236, 198, 10, 14, 236, 197, 10, 14, 236, + 196, 10, 14, 236, 195, 10, 14, 236, 194, 10, 14, 236, 193, 10, 14, 236, + 192, 10, 14, 236, 191, 10, 14, 236, 190, 10, 14, 236, 189, 10, 14, 236, + 188, 10, 14, 236, 187, 10, 14, 236, 186, 10, 14, 236, 185, 10, 14, 236, + 184, 10, 14, 236, 183, 10, 14, 236, 182, 10, 14, 236, 181, 10, 14, 236, + 180, 10, 14, 236, 179, 10, 14, 236, 178, 10, 14, 236, 177, 10, 14, 236, + 176, 10, 14, 236, 175, 10, 14, 236, 174, 10, 14, 236, 173, 10, 14, 236, + 172, 10, 14, 236, 171, 10, 14, 236, 170, 10, 14, 236, 169, 10, 14, 236, + 168, 10, 14, 236, 167, 10, 14, 236, 166, 10, 14, 236, 165, 10, 14, 236, + 164, 10, 14, 236, 163, 10, 14, 236, 162, 10, 14, 236, 161, 10, 14, 236, + 160, 10, 14, 236, 159, 10, 14, 236, 158, 10, 14, 236, 157, 10, 14, 236, + 156, 10, 14, 236, 155, 10, 14, 236, 154, 10, 14, 236, 153, 10, 14, 236, + 152, 10, 14, 236, 151, 10, 14, 236, 150, 10, 14, 236, 149, 10, 14, 236, + 148, 10, 14, 236, 147, 10, 14, 236, 146, 10, 14, 236, 145, 10, 14, 236, + 144, 10, 14, 236, 143, 10, 14, 236, 142, 10, 14, 236, 141, 10, 14, 236, + 140, 10, 14, 236, 139, 10, 14, 236, 138, 10, 14, 236, 137, 10, 14, 236, + 136, 10, 14, 236, 135, 10, 14, 236, 134, 10, 14, 236, 133, 10, 14, 236, + 132, 10, 14, 236, 131, 10, 14, 236, 130, 10, 14, 236, 129, 10, 14, 236, + 128, 10, 14, 236, 127, 10, 14, 236, 126, 10, 14, 236, 125, 10, 14, 236, + 124, 10, 14, 236, 123, 10, 14, 236, 122, 10, 14, 236, 121, 10, 14, 236, + 120, 10, 14, 236, 119, 10, 14, 236, 118, 10, 14, 236, 117, 10, 14, 236, + 116, 10, 14, 236, 115, 10, 14, 236, 114, 10, 14, 236, 113, 10, 14, 236, + 112, 10, 14, 236, 111, 10, 14, 236, 110, 10, 14, 236, 109, 10, 14, 236, + 108, 10, 14, 236, 107, 10, 14, 236, 106, 10, 14, 236, 105, 10, 14, 236, + 104, 10, 14, 236, 103, 10, 14, 236, 102, 10, 14, 236, 101, 10, 14, 236, + 100, 10, 14, 236, 99, 10, 14, 236, 98, 10, 14, 236, 97, 10, 14, 236, 96, + 10, 14, 236, 95, 10, 14, 236, 94, 10, 14, 236, 93, 10, 14, 236, 92, 10, + 14, 236, 91, 10, 14, 236, 90, 10, 14, 236, 89, 10, 14, 236, 88, 10, 14, + 236, 87, 10, 14, 236, 86, 10, 14, 236, 85, 10, 14, 236, 84, 10, 14, 236, + 83, 10, 14, 236, 82, 10, 14, 236, 81, 10, 14, 236, 80, 10, 14, 236, 79, + 10, 14, 236, 78, 10, 14, 236, 77, 10, 14, 236, 76, 10, 14, 236, 75, 10, + 14, 236, 74, 10, 14, 236, 73, 10, 14, 236, 72, 7, 4, 27, 244, 133, 7, 4, + 27, 244, 129, 7, 4, 27, 244, 84, 7, 4, 27, 244, 132, 7, 4, 27, 244, 131, + 7, 4, 27, 200, 222, 94, 217, 153, 7, 4, 27, 218, 170, 150, 4, 27, 231, + 64, 228, 44, 150, 4, 27, 231, 64, 245, 221, 150, 4, 27, 231, 64, 235, + 234, 150, 4, 27, 213, 180, 228, 44, 150, 4, 27, 231, 64, 211, 160, 94, 1, + 210, 234, 2, 241, 165, 94, 225, 14, 235, 56, 214, 11, 94, 27, 211, 6, + 210, 234, 210, 234, 225, 243, 94, 1, 254, 147, 253, 170, 94, 1, 211, 247, + 254, 179, 94, 1, 211, 247, 248, 197, 94, 1, 211, 247, 241, 245, 94, 1, + 211, 247, 235, 0, 94, 1, 211, 247, 233, 100, 94, 1, 211, 247, 40, 231, + 70, 94, 1, 211, 247, 223, 70, 94, 1, 211, 247, 217, 39, 94, 1, 254, 147, + 96, 50, 94, 1, 220, 23, 2, 220, 23, 247, 128, 94, 1, 220, 23, 2, 219, + 161, 247, 128, 94, 1, 220, 23, 2, 248, 216, 22, 220, 23, 247, 128, 94, 1, + 220, 23, 2, 248, 216, 22, 219, 161, 247, 128, 94, 1, 109, 2, 225, 243, + 94, 1, 109, 2, 224, 79, 94, 1, 109, 2, 231, 176, 94, 1, 252, 37, 2, 248, + 215, 94, 1, 242, 209, 2, 248, 215, 94, 1, 248, 198, 2, 248, 215, 94, 1, + 241, 246, 2, 231, 176, 94, 1, 214, 4, 2, 248, 215, 94, 1, 210, 98, 2, + 248, 215, 94, 1, 216, 232, 2, 248, 215, 94, 1, 210, 234, 2, 248, 215, 94, + 1, 40, 235, 1, 2, 248, 215, 94, 1, 235, 1, 2, 248, 215, 94, 1, 233, 101, + 2, 248, 215, 94, 1, 231, 71, 2, 248, 215, 94, 1, 227, 199, 2, 248, 215, + 94, 1, 221, 252, 2, 248, 215, 94, 1, 40, 225, 225, 2, 248, 215, 94, 1, + 225, 225, 2, 248, 215, 94, 1, 215, 181, 2, 248, 215, 94, 1, 224, 43, 2, + 248, 215, 94, 1, 223, 71, 2, 248, 215, 94, 1, 220, 23, 2, 248, 215, 94, + 1, 217, 40, 2, 248, 215, 94, 1, 214, 4, 2, 241, 68, 94, 1, 252, 37, 2, + 223, 172, 94, 1, 235, 1, 2, 223, 172, 94, 1, 225, 225, 2, 223, 172, 94, + 27, 109, 233, 100, 9, 1, 109, 212, 47, 53, 17, 9, 1, 109, 212, 47, 40, + 17, 9, 1, 252, 73, 53, 17, 9, 1, 252, 73, 40, 17, 9, 1, 252, 73, 65, 17, + 9, 1, 252, 73, 147, 17, 9, 1, 225, 209, 53, 17, 9, 1, 225, 209, 40, 17, + 9, 1, 225, 209, 65, 17, 9, 1, 225, 209, 147, 17, 9, 1, 252, 61, 53, 17, + 9, 1, 252, 61, 40, 17, 9, 1, 252, 61, 65, 17, 9, 1, 252, 61, 147, 17, 9, + 1, 215, 148, 53, 17, 9, 1, 215, 148, 40, 17, 9, 1, 215, 148, 65, 17, 9, + 1, 215, 148, 147, 17, 9, 1, 217, 7, 53, 17, 9, 1, 217, 7, 40, 17, 9, 1, + 217, 7, 65, 17, 9, 1, 217, 7, 147, 17, 9, 1, 215, 150, 53, 17, 9, 1, 215, + 150, 40, 17, 9, 1, 215, 150, 65, 17, 9, 1, 215, 150, 147, 17, 9, 1, 213, + 249, 53, 17, 9, 1, 213, 249, 40, 17, 9, 1, 213, 249, 65, 17, 9, 1, 213, + 249, 147, 17, 9, 1, 225, 207, 53, 17, 9, 1, 225, 207, 40, 17, 9, 1, 225, + 207, 65, 17, 9, 1, 225, 207, 147, 17, 9, 1, 246, 52, 53, 17, 9, 1, 246, + 52, 40, 17, 9, 1, 246, 52, 65, 17, 9, 1, 246, 52, 147, 17, 9, 1, 227, + 158, 53, 17, 9, 1, 227, 158, 40, 17, 9, 1, 227, 158, 65, 17, 9, 1, 227, + 158, 147, 17, 9, 1, 217, 28, 53, 17, 9, 1, 217, 28, 40, 17, 9, 1, 217, + 28, 65, 17, 9, 1, 217, 28, 147, 17, 9, 1, 217, 26, 53, 17, 9, 1, 217, 26, + 40, 17, 9, 1, 217, 26, 65, 17, 9, 1, 217, 26, 147, 17, 9, 1, 248, 141, + 53, 17, 9, 1, 248, 141, 40, 17, 9, 1, 248, 210, 53, 17, 9, 1, 248, 210, + 40, 17, 9, 1, 246, 79, 53, 17, 9, 1, 246, 79, 40, 17, 9, 1, 248, 139, 53, + 17, 9, 1, 248, 139, 40, 17, 9, 1, 235, 127, 53, 17, 9, 1, 235, 127, 40, + 17, 9, 1, 222, 174, 53, 17, 9, 1, 222, 174, 40, 17, 9, 1, 234, 181, 53, + 17, 9, 1, 234, 181, 40, 17, 9, 1, 234, 181, 65, 17, 9, 1, 234, 181, 147, + 17, 9, 1, 243, 130, 53, 17, 9, 1, 243, 130, 40, 17, 9, 1, 243, 130, 65, + 17, 9, 1, 243, 130, 147, 17, 9, 1, 242, 109, 53, 17, 9, 1, 242, 109, 40, + 17, 9, 1, 242, 109, 65, 17, 9, 1, 242, 109, 147, 17, 9, 1, 229, 8, 53, + 17, 9, 1, 229, 8, 40, 17, 9, 1, 229, 8, 65, 17, 9, 1, 229, 8, 147, 17, 9, + 1, 228, 68, 242, 226, 53, 17, 9, 1, 228, 68, 242, 226, 40, 17, 9, 1, 222, + 217, 53, 17, 9, 1, 222, 217, 40, 17, 9, 1, 222, 217, 65, 17, 9, 1, 222, + 217, 147, 17, 9, 1, 241, 226, 2, 77, 72, 53, 17, 9, 1, 241, 226, 2, 77, + 72, 40, 17, 9, 1, 241, 226, 242, 179, 53, 17, 9, 1, 241, 226, 242, 179, + 40, 17, 9, 1, 241, 226, 242, 179, 65, 17, 9, 1, 241, 226, 242, 179, 147, + 17, 9, 1, 241, 226, 247, 150, 53, 17, 9, 1, 241, 226, 247, 150, 40, 17, + 9, 1, 241, 226, 247, 150, 65, 17, 9, 1, 241, 226, 247, 150, 147, 17, 9, + 1, 77, 252, 141, 53, 17, 9, 1, 77, 252, 141, 40, 17, 9, 1, 77, 252, 141, + 2, 182, 72, 53, 17, 9, 1, 77, 252, 141, 2, 182, 72, 40, 17, 9, 16, 59, + 48, 9, 16, 59, 51, 9, 16, 113, 170, 48, 9, 16, 113, 170, 51, 9, 16, 134, + 170, 48, 9, 16, 134, 170, 51, 9, 16, 134, 170, 225, 10, 246, 112, 48, 9, + 16, 134, 170, 225, 10, 246, 112, 51, 9, 16, 244, 19, 170, 48, 9, 16, 244, + 19, 170, 51, 9, 16, 52, 67, 252, 149, 51, 9, 16, 113, 170, 213, 189, 48, + 9, 16, 113, 170, 213, 189, 51, 9, 16, 222, 236, 9, 16, 4, 217, 82, 48, 9, + 16, 4, 217, 82, 51, 9, 1, 229, 85, 53, 17, 9, 1, 229, 85, 40, 17, 9, 1, + 229, 85, 65, 17, 9, 1, 229, 85, 147, 17, 9, 1, 104, 53, 17, 9, 1, 104, + 40, 17, 9, 1, 226, 239, 53, 17, 9, 1, 226, 239, 40, 17, 9, 1, 210, 213, + 53, 17, 9, 1, 210, 213, 40, 17, 9, 1, 104, 2, 182, 72, 53, 17, 9, 1, 214, + 0, 53, 17, 9, 1, 214, 0, 40, 17, 9, 1, 234, 79, 226, 239, 53, 17, 9, 1, + 234, 79, 226, 239, 40, 17, 9, 1, 234, 79, 210, 213, 53, 17, 9, 1, 234, + 79, 210, 213, 40, 17, 9, 1, 160, 53, 17, 9, 1, 160, 40, 17, 9, 1, 160, + 65, 17, 9, 1, 160, 147, 17, 9, 1, 214, 207, 234, 192, 234, 79, 109, 231, + 198, 65, 17, 9, 1, 214, 207, 234, 192, 234, 79, 109, 231, 198, 147, 17, + 9, 27, 77, 2, 182, 72, 2, 109, 53, 17, 9, 27, 77, 2, 182, 72, 2, 109, 40, + 17, 9, 27, 77, 2, 182, 72, 2, 254, 253, 53, 17, 9, 27, 77, 2, 182, 72, 2, + 254, 253, 40, 17, 9, 27, 77, 2, 182, 72, 2, 212, 31, 53, 17, 9, 27, 77, + 2, 182, 72, 2, 212, 31, 40, 17, 9, 27, 77, 2, 182, 72, 2, 104, 53, 17, 9, + 27, 77, 2, 182, 72, 2, 104, 40, 17, 9, 27, 77, 2, 182, 72, 2, 226, 239, + 53, 17, 9, 27, 77, 2, 182, 72, 2, 226, 239, 40, 17, 9, 27, 77, 2, 182, + 72, 2, 210, 213, 53, 17, 9, 27, 77, 2, 182, 72, 2, 210, 213, 40, 17, 9, + 27, 77, 2, 182, 72, 2, 160, 53, 17, 9, 27, 77, 2, 182, 72, 2, 160, 40, + 17, 9, 27, 77, 2, 182, 72, 2, 160, 65, 17, 9, 27, 214, 207, 234, 79, 77, + 2, 182, 72, 2, 109, 231, 198, 53, 17, 9, 27, 214, 207, 234, 79, 77, 2, + 182, 72, 2, 109, 231, 198, 40, 17, 9, 27, 214, 207, 234, 79, 77, 2, 182, + 72, 2, 109, 231, 198, 65, 17, 9, 1, 244, 176, 77, 53, 17, 9, 1, 244, 176, + 77, 40, 17, 9, 1, 244, 176, 77, 65, 17, 9, 1, 244, 176, 77, 147, 17, 9, + 27, 77, 2, 182, 72, 2, 151, 53, 17, 9, 27, 77, 2, 182, 72, 2, 122, 53, + 17, 9, 27, 77, 2, 182, 72, 2, 66, 53, 17, 9, 27, 77, 2, 182, 72, 2, 109, + 231, 198, 53, 17, 9, 27, 77, 2, 182, 72, 2, 77, 53, 17, 9, 27, 252, 63, + 2, 151, 53, 17, 9, 27, 252, 63, 2, 122, 53, 17, 9, 27, 252, 63, 2, 234, + 136, 53, 17, 9, 27, 252, 63, 2, 66, 53, 17, 9, 27, 252, 63, 2, 109, 231, + 198, 53, 17, 9, 27, 252, 63, 2, 77, 53, 17, 9, 27, 217, 9, 2, 151, 53, + 17, 9, 27, 217, 9, 2, 122, 53, 17, 9, 27, 217, 9, 2, 234, 136, 53, 17, 9, + 27, 217, 9, 2, 66, 53, 17, 9, 27, 217, 9, 2, 109, 231, 198, 53, 17, 9, + 27, 217, 9, 2, 77, 53, 17, 9, 27, 216, 194, 2, 151, 53, 17, 9, 27, 216, + 194, 2, 66, 53, 17, 9, 27, 216, 194, 2, 109, 231, 198, 53, 17, 9, 27, + 216, 194, 2, 77, 53, 17, 9, 27, 151, 2, 122, 53, 17, 9, 27, 151, 2, 66, + 53, 17, 9, 27, 122, 2, 151, 53, 17, 9, 27, 122, 2, 66, 53, 17, 9, 27, + 234, 136, 2, 151, 53, 17, 9, 27, 234, 136, 2, 122, 53, 17, 9, 27, 234, + 136, 2, 66, 53, 17, 9, 27, 221, 169, 2, 151, 53, 17, 9, 27, 221, 169, 2, + 122, 53, 17, 9, 27, 221, 169, 2, 234, 136, 53, 17, 9, 27, 221, 169, 2, + 66, 53, 17, 9, 27, 222, 29, 2, 122, 53, 17, 9, 27, 222, 29, 2, 66, 53, + 17, 9, 27, 248, 225, 2, 151, 53, 17, 9, 27, 248, 225, 2, 122, 53, 17, 9, + 27, 248, 225, 2, 234, 136, 53, 17, 9, 27, 248, 225, 2, 66, 53, 17, 9, 27, + 217, 82, 2, 122, 53, 17, 9, 27, 217, 82, 2, 66, 53, 17, 9, 27, 210, 112, + 2, 66, 53, 17, 9, 27, 254, 206, 2, 151, 53, 17, 9, 27, 254, 206, 2, 66, + 53, 17, 9, 27, 242, 252, 2, 151, 53, 17, 9, 27, 242, 252, 2, 66, 53, 17, + 9, 27, 244, 151, 2, 151, 53, 17, 9, 27, 244, 151, 2, 122, 53, 17, 9, 27, + 244, 151, 2, 234, 136, 53, 17, 9, 27, 244, 151, 2, 66, 53, 17, 9, 27, + 244, 151, 2, 109, 231, 198, 53, 17, 9, 27, 244, 151, 2, 77, 53, 17, 9, + 27, 224, 85, 2, 122, 53, 17, 9, 27, 224, 85, 2, 66, 53, 17, 9, 27, 224, + 85, 2, 109, 231, 198, 53, 17, 9, 27, 224, 85, 2, 77, 53, 17, 9, 27, 235, + 1, 2, 109, 53, 17, 9, 27, 235, 1, 2, 151, 53, 17, 9, 27, 235, 1, 2, 122, + 53, 17, 9, 27, 235, 1, 2, 234, 136, 53, 17, 9, 27, 235, 1, 2, 233, 109, + 53, 17, 9, 27, 235, 1, 2, 66, 53, 17, 9, 27, 235, 1, 2, 109, 231, 198, + 53, 17, 9, 27, 235, 1, 2, 77, 53, 17, 9, 27, 233, 109, 2, 151, 53, 17, 9, + 27, 233, 109, 2, 122, 53, 17, 9, 27, 233, 109, 2, 234, 136, 53, 17, 9, + 27, 233, 109, 2, 66, 53, 17, 9, 27, 233, 109, 2, 109, 231, 198, 53, 17, + 9, 27, 233, 109, 2, 77, 53, 17, 9, 27, 66, 2, 151, 53, 17, 9, 27, 66, 2, + 122, 53, 17, 9, 27, 66, 2, 234, 136, 53, 17, 9, 27, 66, 2, 66, 53, 17, 9, + 27, 66, 2, 109, 231, 198, 53, 17, 9, 27, 66, 2, 77, 53, 17, 9, 27, 228, + 68, 2, 151, 53, 17, 9, 27, 228, 68, 2, 122, 53, 17, 9, 27, 228, 68, 2, + 234, 136, 53, 17, 9, 27, 228, 68, 2, 66, 53, 17, 9, 27, 228, 68, 2, 109, + 231, 198, 53, 17, 9, 27, 228, 68, 2, 77, 53, 17, 9, 27, 241, 226, 2, 151, + 53, 17, 9, 27, 241, 226, 2, 66, 53, 17, 9, 27, 241, 226, 2, 109, 231, + 198, 53, 17, 9, 27, 241, 226, 2, 77, 53, 17, 9, 27, 77, 2, 151, 53, 17, + 9, 27, 77, 2, 122, 53, 17, 9, 27, 77, 2, 234, 136, 53, 17, 9, 27, 77, 2, + 66, 53, 17, 9, 27, 77, 2, 109, 231, 198, 53, 17, 9, 27, 77, 2, 77, 53, + 17, 9, 27, 216, 204, 2, 218, 24, 109, 53, 17, 9, 27, 223, 99, 2, 218, 24, + 109, 53, 17, 9, 27, 109, 231, 198, 2, 218, 24, 109, 53, 17, 9, 27, 220, + 96, 2, 248, 191, 53, 17, 9, 27, 220, 96, 2, 234, 210, 53, 17, 9, 27, 220, + 96, 2, 244, 174, 53, 17, 9, 27, 220, 96, 2, 248, 193, 53, 17, 9, 27, 220, + 96, 2, 234, 212, 53, 17, 9, 27, 220, 96, 2, 218, 24, 109, 53, 17, 9, 27, + 77, 2, 182, 72, 2, 223, 99, 40, 17, 9, 27, 77, 2, 182, 72, 2, 210, 109, + 40, 17, 9, 27, 77, 2, 182, 72, 2, 66, 40, 17, 9, 27, 77, 2, 182, 72, 2, + 228, 68, 40, 17, 9, 27, 77, 2, 182, 72, 2, 109, 231, 198, 40, 17, 9, 27, + 77, 2, 182, 72, 2, 77, 40, 17, 9, 27, 252, 63, 2, 223, 99, 40, 17, 9, 27, + 252, 63, 2, 210, 109, 40, 17, 9, 27, 252, 63, 2, 66, 40, 17, 9, 27, 252, + 63, 2, 228, 68, 40, 17, 9, 27, 252, 63, 2, 109, 231, 198, 40, 17, 9, 27, + 252, 63, 2, 77, 40, 17, 9, 27, 217, 9, 2, 223, 99, 40, 17, 9, 27, 217, 9, + 2, 210, 109, 40, 17, 9, 27, 217, 9, 2, 66, 40, 17, 9, 27, 217, 9, 2, 228, + 68, 40, 17, 9, 27, 217, 9, 2, 109, 231, 198, 40, 17, 9, 27, 217, 9, 2, + 77, 40, 17, 9, 27, 216, 194, 2, 223, 99, 40, 17, 9, 27, 216, 194, 2, 210, + 109, 40, 17, 9, 27, 216, 194, 2, 66, 40, 17, 9, 27, 216, 194, 2, 228, 68, + 40, 17, 9, 27, 216, 194, 2, 109, 231, 198, 40, 17, 9, 27, 216, 194, 2, + 77, 40, 17, 9, 27, 244, 151, 2, 109, 231, 198, 40, 17, 9, 27, 244, 151, + 2, 77, 40, 17, 9, 27, 224, 85, 2, 109, 231, 198, 40, 17, 9, 27, 224, 85, + 2, 77, 40, 17, 9, 27, 235, 1, 2, 109, 40, 17, 9, 27, 235, 1, 2, 233, 109, + 40, 17, 9, 27, 235, 1, 2, 66, 40, 17, 9, 27, 235, 1, 2, 109, 231, 198, + 40, 17, 9, 27, 235, 1, 2, 77, 40, 17, 9, 27, 233, 109, 2, 66, 40, 17, 9, + 27, 233, 109, 2, 109, 231, 198, 40, 17, 9, 27, 233, 109, 2, 77, 40, 17, + 9, 27, 66, 2, 109, 40, 17, 9, 27, 66, 2, 66, 40, 17, 9, 27, 228, 68, 2, + 223, 99, 40, 17, 9, 27, 228, 68, 2, 210, 109, 40, 17, 9, 27, 228, 68, 2, + 66, 40, 17, 9, 27, 228, 68, 2, 228, 68, 40, 17, 9, 27, 228, 68, 2, 109, + 231, 198, 40, 17, 9, 27, 228, 68, 2, 77, 40, 17, 9, 27, 109, 231, 198, 2, + 218, 24, 109, 40, 17, 9, 27, 77, 2, 223, 99, 40, 17, 9, 27, 77, 2, 210, + 109, 40, 17, 9, 27, 77, 2, 66, 40, 17, 9, 27, 77, 2, 228, 68, 40, 17, 9, + 27, 77, 2, 109, 231, 198, 40, 17, 9, 27, 77, 2, 77, 40, 17, 9, 27, 77, 2, + 182, 72, 2, 151, 65, 17, 9, 27, 77, 2, 182, 72, 2, 122, 65, 17, 9, 27, + 77, 2, 182, 72, 2, 234, 136, 65, 17, 9, 27, 77, 2, 182, 72, 2, 66, 65, + 17, 9, 27, 77, 2, 182, 72, 2, 241, 226, 65, 17, 9, 27, 252, 63, 2, 151, + 65, 17, 9, 27, 252, 63, 2, 122, 65, 17, 9, 27, 252, 63, 2, 234, 136, 65, + 17, 9, 27, 252, 63, 2, 66, 65, 17, 9, 27, 252, 63, 2, 241, 226, 65, 17, + 9, 27, 217, 9, 2, 151, 65, 17, 9, 27, 217, 9, 2, 122, 65, 17, 9, 27, 217, + 9, 2, 234, 136, 65, 17, 9, 27, 217, 9, 2, 66, 65, 17, 9, 27, 217, 9, 2, + 241, 226, 65, 17, 9, 27, 216, 194, 2, 66, 65, 17, 9, 27, 151, 2, 122, 65, + 17, 9, 27, 151, 2, 66, 65, 17, 9, 27, 122, 2, 151, 65, 17, 9, 27, 122, 2, + 66, 65, 17, 9, 27, 234, 136, 2, 151, 65, 17, 9, 27, 234, 136, 2, 66, 65, + 17, 9, 27, 221, 169, 2, 151, 65, 17, 9, 27, 221, 169, 2, 122, 65, 17, 9, + 27, 221, 169, 2, 234, 136, 65, 17, 9, 27, 221, 169, 2, 66, 65, 17, 9, 27, + 222, 29, 2, 122, 65, 17, 9, 27, 222, 29, 2, 234, 136, 65, 17, 9, 27, 222, + 29, 2, 66, 65, 17, 9, 27, 248, 225, 2, 151, 65, 17, 9, 27, 248, 225, 2, + 122, 65, 17, 9, 27, 248, 225, 2, 234, 136, 65, 17, 9, 27, 248, 225, 2, + 66, 65, 17, 9, 27, 217, 82, 2, 122, 65, 17, 9, 27, 210, 112, 2, 66, 65, + 17, 9, 27, 254, 206, 2, 151, 65, 17, 9, 27, 254, 206, 2, 66, 65, 17, 9, + 27, 242, 252, 2, 151, 65, 17, 9, 27, 242, 252, 2, 66, 65, 17, 9, 27, 244, + 151, 2, 151, 65, 17, 9, 27, 244, 151, 2, 122, 65, 17, 9, 27, 244, 151, 2, + 234, 136, 65, 17, 9, 27, 244, 151, 2, 66, 65, 17, 9, 27, 224, 85, 2, 122, + 65, 17, 9, 27, 224, 85, 2, 66, 65, 17, 9, 27, 235, 1, 2, 151, 65, 17, 9, + 27, 235, 1, 2, 122, 65, 17, 9, 27, 235, 1, 2, 234, 136, 65, 17, 9, 27, + 235, 1, 2, 233, 109, 65, 17, 9, 27, 235, 1, 2, 66, 65, 17, 9, 27, 233, + 109, 2, 151, 65, 17, 9, 27, 233, 109, 2, 122, 65, 17, 9, 27, 233, 109, 2, + 234, 136, 65, 17, 9, 27, 233, 109, 2, 66, 65, 17, 9, 27, 233, 109, 2, + 241, 226, 65, 17, 9, 27, 66, 2, 151, 65, 17, 9, 27, 66, 2, 122, 65, 17, + 9, 27, 66, 2, 234, 136, 65, 17, 9, 27, 66, 2, 66, 65, 17, 9, 27, 228, 68, + 2, 151, 65, 17, 9, 27, 228, 68, 2, 122, 65, 17, 9, 27, 228, 68, 2, 234, + 136, 65, 17, 9, 27, 228, 68, 2, 66, 65, 17, 9, 27, 228, 68, 2, 241, 226, + 65, 17, 9, 27, 241, 226, 2, 151, 65, 17, 9, 27, 241, 226, 2, 66, 65, 17, + 9, 27, 241, 226, 2, 218, 24, 109, 65, 17, 9, 27, 77, 2, 151, 65, 17, 9, + 27, 77, 2, 122, 65, 17, 9, 27, 77, 2, 234, 136, 65, 17, 9, 27, 77, 2, 66, + 65, 17, 9, 27, 77, 2, 241, 226, 65, 17, 9, 27, 77, 2, 182, 72, 2, 66, + 147, 17, 9, 27, 77, 2, 182, 72, 2, 241, 226, 147, 17, 9, 27, 252, 63, 2, + 66, 147, 17, 9, 27, 252, 63, 2, 241, 226, 147, 17, 9, 27, 217, 9, 2, 66, + 147, 17, 9, 27, 217, 9, 2, 241, 226, 147, 17, 9, 27, 216, 194, 2, 66, + 147, 17, 9, 27, 216, 194, 2, 241, 226, 147, 17, 9, 27, 221, 169, 2, 66, + 147, 17, 9, 27, 221, 169, 2, 241, 226, 147, 17, 9, 27, 220, 62, 2, 66, + 147, 17, 9, 27, 220, 62, 2, 241, 226, 147, 17, 9, 27, 235, 1, 2, 233, + 109, 147, 17, 9, 27, 235, 1, 2, 66, 147, 17, 9, 27, 233, 109, 2, 66, 147, + 17, 9, 27, 228, 68, 2, 66, 147, 17, 9, 27, 228, 68, 2, 241, 226, 147, 17, + 9, 27, 77, 2, 66, 147, 17, 9, 27, 77, 2, 241, 226, 147, 17, 9, 27, 220, + 96, 2, 244, 174, 147, 17, 9, 27, 220, 96, 2, 248, 193, 147, 17, 9, 27, + 220, 96, 2, 234, 212, 147, 17, 9, 27, 217, 82, 2, 109, 231, 198, 53, 17, + 9, 27, 217, 82, 2, 77, 53, 17, 9, 27, 254, 206, 2, 109, 231, 198, 53, 17, + 9, 27, 254, 206, 2, 77, 53, 17, 9, 27, 242, 252, 2, 109, 231, 198, 53, + 17, 9, 27, 242, 252, 2, 77, 53, 17, 9, 27, 221, 169, 2, 109, 231, 198, + 53, 17, 9, 27, 221, 169, 2, 77, 53, 17, 9, 27, 220, 62, 2, 109, 231, 198, + 53, 17, 9, 27, 220, 62, 2, 77, 53, 17, 9, 27, 122, 2, 109, 231, 198, 53, + 17, 9, 27, 122, 2, 77, 53, 17, 9, 27, 151, 2, 109, 231, 198, 53, 17, 9, + 27, 151, 2, 77, 53, 17, 9, 27, 234, 136, 2, 109, 231, 198, 53, 17, 9, 27, + 234, 136, 2, 77, 53, 17, 9, 27, 222, 29, 2, 109, 231, 198, 53, 17, 9, 27, + 222, 29, 2, 77, 53, 17, 9, 27, 248, 225, 2, 109, 231, 198, 53, 17, 9, 27, + 248, 225, 2, 77, 53, 17, 9, 27, 220, 62, 2, 151, 53, 17, 9, 27, 220, 62, + 2, 122, 53, 17, 9, 27, 220, 62, 2, 234, 136, 53, 17, 9, 27, 220, 62, 2, + 66, 53, 17, 9, 27, 220, 62, 2, 223, 99, 53, 17, 9, 27, 221, 169, 2, 223, + 99, 53, 17, 9, 27, 222, 29, 2, 223, 99, 53, 17, 9, 27, 248, 225, 2, 223, + 99, 53, 17, 9, 27, 217, 82, 2, 109, 231, 198, 40, 17, 9, 27, 217, 82, 2, + 77, 40, 17, 9, 27, 254, 206, 2, 109, 231, 198, 40, 17, 9, 27, 254, 206, + 2, 77, 40, 17, 9, 27, 242, 252, 2, 109, 231, 198, 40, 17, 9, 27, 242, + 252, 2, 77, 40, 17, 9, 27, 221, 169, 2, 109, 231, 198, 40, 17, 9, 27, + 221, 169, 2, 77, 40, 17, 9, 27, 220, 62, 2, 109, 231, 198, 40, 17, 9, 27, + 220, 62, 2, 77, 40, 17, 9, 27, 122, 2, 109, 231, 198, 40, 17, 9, 27, 122, + 2, 77, 40, 17, 9, 27, 151, 2, 109, 231, 198, 40, 17, 9, 27, 151, 2, 77, + 40, 17, 9, 27, 234, 136, 2, 109, 231, 198, 40, 17, 9, 27, 234, 136, 2, + 77, 40, 17, 9, 27, 222, 29, 2, 109, 231, 198, 40, 17, 9, 27, 222, 29, 2, + 77, 40, 17, 9, 27, 248, 225, 2, 109, 231, 198, 40, 17, 9, 27, 248, 225, + 2, 77, 40, 17, 9, 27, 220, 62, 2, 151, 40, 17, 9, 27, 220, 62, 2, 122, + 40, 17, 9, 27, 220, 62, 2, 234, 136, 40, 17, 9, 27, 220, 62, 2, 66, 40, + 17, 9, 27, 220, 62, 2, 223, 99, 40, 17, 9, 27, 221, 169, 2, 223, 99, 40, + 17, 9, 27, 222, 29, 2, 223, 99, 40, 17, 9, 27, 248, 225, 2, 223, 99, 40, + 17, 9, 27, 220, 62, 2, 151, 65, 17, 9, 27, 220, 62, 2, 122, 65, 17, 9, + 27, 220, 62, 2, 234, 136, 65, 17, 9, 27, 220, 62, 2, 66, 65, 17, 9, 27, + 221, 169, 2, 241, 226, 65, 17, 9, 27, 220, 62, 2, 241, 226, 65, 17, 9, + 27, 217, 82, 2, 66, 65, 17, 9, 27, 221, 169, 2, 151, 147, 17, 9, 27, 221, + 169, 2, 122, 147, 17, 9, 27, 221, 169, 2, 234, 136, 147, 17, 9, 27, 220, + 62, 2, 151, 147, 17, 9, 27, 220, 62, 2, 122, 147, 17, 9, 27, 220, 62, 2, + 234, 136, 147, 17, 9, 27, 217, 82, 2, 66, 147, 17, 9, 27, 210, 112, 2, + 66, 147, 17, 9, 27, 109, 2, 244, 172, 40, 17, 9, 27, 109, 2, 244, 172, + 53, 17, 226, 150, 43, 226, 7, 226, 150, 44, 226, 7, 9, 27, 217, 9, 2, + 151, 2, 66, 65, 17, 9, 27, 217, 9, 2, 122, 2, 151, 40, 17, 9, 27, 217, 9, + 2, 122, 2, 151, 65, 17, 9, 27, 217, 9, 2, 122, 2, 66, 65, 17, 9, 27, 217, + 9, 2, 234, 136, 2, 66, 65, 17, 9, 27, 217, 9, 2, 66, 2, 151, 65, 17, 9, + 27, 217, 9, 2, 66, 2, 122, 65, 17, 9, 27, 217, 9, 2, 66, 2, 234, 136, 65, + 17, 9, 27, 151, 2, 66, 2, 122, 40, 17, 9, 27, 151, 2, 66, 2, 122, 65, 17, + 9, 27, 122, 2, 66, 2, 77, 40, 17, 9, 27, 122, 2, 66, 2, 109, 231, 198, + 40, 17, 9, 27, 221, 169, 2, 122, 2, 151, 65, 17, 9, 27, 221, 169, 2, 151, + 2, 122, 65, 17, 9, 27, 221, 169, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, + 221, 169, 2, 66, 2, 122, 40, 17, 9, 27, 221, 169, 2, 66, 2, 122, 65, 17, + 9, 27, 221, 169, 2, 66, 2, 151, 65, 17, 9, 27, 221, 169, 2, 66, 2, 66, + 40, 17, 9, 27, 221, 169, 2, 66, 2, 66, 65, 17, 9, 27, 222, 29, 2, 122, 2, + 122, 40, 17, 9, 27, 222, 29, 2, 122, 2, 122, 65, 17, 9, 27, 222, 29, 2, + 66, 2, 66, 40, 17, 9, 27, 220, 62, 2, 122, 2, 66, 40, 17, 9, 27, 220, 62, + 2, 122, 2, 66, 65, 17, 9, 27, 220, 62, 2, 151, 2, 77, 40, 17, 9, 27, 220, + 62, 2, 66, 2, 234, 136, 40, 17, 9, 27, 220, 62, 2, 66, 2, 234, 136, 65, + 17, 9, 27, 220, 62, 2, 66, 2, 66, 40, 17, 9, 27, 220, 62, 2, 66, 2, 66, + 65, 17, 9, 27, 248, 225, 2, 122, 2, 109, 231, 198, 40, 17, 9, 27, 248, + 225, 2, 234, 136, 2, 66, 40, 17, 9, 27, 248, 225, 2, 234, 136, 2, 66, 65, + 17, 9, 27, 217, 82, 2, 66, 2, 122, 40, 17, 9, 27, 217, 82, 2, 66, 2, 122, + 65, 17, 9, 27, 217, 82, 2, 66, 2, 66, 65, 17, 9, 27, 217, 82, 2, 66, 2, + 77, 40, 17, 9, 27, 254, 206, 2, 151, 2, 66, 40, 17, 9, 27, 254, 206, 2, + 66, 2, 66, 40, 17, 9, 27, 254, 206, 2, 66, 2, 66, 65, 17, 9, 27, 254, + 206, 2, 66, 2, 109, 231, 198, 40, 17, 9, 27, 242, 252, 2, 66, 2, 66, 40, + 17, 9, 27, 242, 252, 2, 66, 2, 77, 40, 17, 9, 27, 242, 252, 2, 66, 2, + 109, 231, 198, 40, 17, 9, 27, 244, 151, 2, 234, 136, 2, 66, 40, 17, 9, + 27, 244, 151, 2, 234, 136, 2, 66, 65, 17, 9, 27, 224, 85, 2, 66, 2, 122, + 40, 17, 9, 27, 224, 85, 2, 66, 2, 66, 40, 17, 9, 27, 233, 109, 2, 122, 2, + 66, 40, 17, 9, 27, 233, 109, 2, 122, 2, 77, 40, 17, 9, 27, 233, 109, 2, + 122, 2, 109, 231, 198, 40, 17, 9, 27, 233, 109, 2, 151, 2, 151, 65, 17, + 9, 27, 233, 109, 2, 151, 2, 151, 40, 17, 9, 27, 233, 109, 2, 234, 136, 2, + 66, 40, 17, 9, 27, 233, 109, 2, 234, 136, 2, 66, 65, 17, 9, 27, 233, 109, + 2, 66, 2, 122, 40, 17, 9, 27, 233, 109, 2, 66, 2, 122, 65, 17, 9, 27, 66, + 2, 122, 2, 151, 65, 17, 9, 27, 66, 2, 122, 2, 66, 65, 17, 9, 27, 66, 2, + 122, 2, 77, 40, 17, 9, 27, 66, 2, 151, 2, 122, 65, 17, 9, 27, 66, 2, 151, + 2, 66, 65, 17, 9, 27, 66, 2, 234, 136, 2, 151, 65, 17, 9, 27, 66, 2, 234, + 136, 2, 66, 65, 17, 9, 27, 66, 2, 151, 2, 234, 136, 65, 17, 9, 27, 241, + 226, 2, 66, 2, 151, 65, 17, 9, 27, 241, 226, 2, 66, 2, 66, 65, 17, 9, 27, + 228, 68, 2, 122, 2, 66, 65, 17, 9, 27, 228, 68, 2, 122, 2, 109, 231, 198, + 40, 17, 9, 27, 228, 68, 2, 151, 2, 66, 40, 17, 9, 27, 228, 68, 2, 151, 2, + 66, 65, 17, 9, 27, 228, 68, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, 228, + 68, 2, 66, 2, 77, 40, 17, 9, 27, 228, 68, 2, 66, 2, 109, 231, 198, 40, + 17, 9, 27, 77, 2, 66, 2, 66, 40, 17, 9, 27, 77, 2, 66, 2, 66, 65, 17, 9, + 27, 252, 63, 2, 234, 136, 2, 77, 40, 17, 9, 27, 217, 9, 2, 151, 2, 77, + 40, 17, 9, 27, 217, 9, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, 217, 9, + 2, 234, 136, 2, 77, 40, 17, 9, 27, 217, 9, 2, 234, 136, 2, 109, 231, 198, + 40, 17, 9, 27, 217, 9, 2, 66, 2, 77, 40, 17, 9, 27, 217, 9, 2, 66, 2, + 109, 231, 198, 40, 17, 9, 27, 151, 2, 66, 2, 77, 40, 17, 9, 27, 151, 2, + 122, 2, 109, 231, 198, 40, 17, 9, 27, 151, 2, 66, 2, 109, 231, 198, 40, + 17, 9, 27, 221, 169, 2, 234, 136, 2, 109, 231, 198, 40, 17, 9, 27, 222, + 29, 2, 122, 2, 77, 40, 17, 9, 27, 220, 62, 2, 122, 2, 77, 40, 17, 9, 27, + 248, 225, 2, 122, 2, 77, 40, 17, 9, 27, 233, 109, 2, 151, 2, 77, 40, 17, + 9, 27, 233, 109, 2, 66, 2, 77, 40, 17, 9, 27, 77, 2, 122, 2, 77, 40, 17, + 9, 27, 77, 2, 151, 2, 77, 40, 17, 9, 27, 77, 2, 66, 2, 77, 40, 17, 9, 27, + 66, 2, 66, 2, 77, 40, 17, 9, 27, 224, 85, 2, 66, 2, 77, 40, 17, 9, 27, + 228, 68, 2, 122, 2, 77, 40, 17, 9, 27, 224, 85, 2, 66, 2, 122, 65, 17, 9, + 27, 233, 109, 2, 122, 2, 66, 65, 17, 9, 27, 254, 206, 2, 66, 2, 77, 40, + 17, 9, 27, 235, 1, 2, 66, 2, 77, 40, 17, 9, 27, 228, 68, 2, 151, 2, 122, + 65, 17, 9, 27, 66, 2, 234, 136, 2, 77, 40, 17, 9, 27, 233, 109, 2, 151, + 2, 66, 65, 17, 9, 27, 235, 1, 2, 66, 2, 66, 40, 17, 9, 27, 233, 109, 2, + 151, 2, 66, 40, 17, 9, 27, 228, 68, 2, 151, 2, 122, 40, 17, 9, 27, 151, + 2, 122, 2, 77, 40, 17, 9, 27, 122, 2, 151, 2, 77, 40, 17, 9, 27, 66, 2, + 151, 2, 77, 40, 17, 9, 27, 244, 151, 2, 66, 2, 77, 40, 17, 9, 27, 252, + 63, 2, 122, 2, 77, 40, 17, 9, 27, 235, 1, 2, 66, 2, 66, 65, 17, 9, 27, + 254, 206, 2, 151, 2, 66, 65, 17, 9, 27, 222, 29, 2, 66, 2, 66, 65, 17, 9, + 27, 221, 169, 2, 234, 136, 2, 77, 40, 17, 9, 27, 228, 68, 2, 151, 2, 77, + 40, 17, 9, 27, 222, 6, 214, 128, 253, 246, 234, 10, 218, 132, 5, 53, 17, + 9, 27, 224, 81, 214, 128, 253, 246, 234, 10, 218, 132, 5, 53, 17, 9, 27, + 254, 162, 53, 17, 9, 27, 254, 192, 53, 17, 9, 27, 230, 158, 53, 17, 9, + 27, 222, 7, 53, 17, 9, 27, 223, 146, 53, 17, 9, 27, 254, 181, 53, 17, 9, + 27, 212, 49, 53, 17, 9, 27, 222, 6, 53, 17, 9, 27, 222, 5, 254, 181, 212, + 48, 9, 27, 235, 140, 223, 37, 50, 9, 27, 251, 238, 254, 47, 254, 48, 45, + 221, 158, 45, 221, 47, 45, 220, 235, 45, 220, 224, 45, 220, 213, 45, 220, + 202, 45, 220, 191, 45, 220, 180, 45, 220, 169, 45, 221, 157, 45, 221, + 146, 45, 221, 135, 45, 221, 124, 45, 221, 113, 45, 221, 102, 45, 221, 91, + 224, 197, 244, 28, 31, 67, 249, 227, 224, 197, 244, 28, 31, 67, 110, 249, + 227, 224, 197, 244, 28, 31, 67, 110, 243, 236, 218, 131, 224, 197, 244, + 28, 31, 67, 249, 234, 224, 197, 244, 28, 31, 67, 220, 152, 224, 197, 244, + 28, 31, 67, 245, 39, 79, 224, 197, 244, 28, 31, 67, 224, 16, 79, 224, + 197, 244, 28, 31, 67, 43, 71, 233, 26, 127, 224, 197, 244, 28, 31, 67, + 44, 71, 233, 26, 251, 164, 224, 197, 244, 28, 31, 67, 203, 245, 171, 38, + 27, 43, 242, 34, 38, 27, 44, 242, 34, 38, 52, 216, 90, 43, 242, 34, 38, + 52, 216, 90, 44, 242, 34, 38, 231, 238, 43, 242, 34, 38, 231, 238, 44, + 242, 34, 38, 249, 205, 231, 237, 224, 197, 244, 28, 31, 67, 113, 59, 233, + 62, 224, 197, 244, 28, 31, 67, 245, 168, 248, 164, 224, 197, 244, 28, 31, + 67, 245, 159, 248, 164, 224, 197, 244, 28, 31, 67, 121, 232, 219, 224, + 197, 244, 28, 31, 67, 212, 32, 121, 232, 219, 224, 197, 244, 28, 31, 67, + 43, 226, 7, 224, 197, 244, 28, 31, 67, 44, 226, 7, 224, 197, 244, 28, 31, + 67, 43, 249, 107, 127, 224, 197, 244, 28, 31, 67, 44, 249, 107, 127, 224, + 197, 244, 28, 31, 67, 43, 216, 7, 220, 55, 127, 224, 197, 244, 28, 31, + 67, 44, 216, 7, 220, 55, 127, 224, 197, 244, 28, 31, 67, 43, 85, 233, 26, + 127, 224, 197, 244, 28, 31, 67, 44, 85, 233, 26, 127, 224, 197, 244, 28, + 31, 67, 43, 52, 254, 118, 127, 224, 197, 244, 28, 31, 67, 44, 52, 254, + 118, 127, 224, 197, 244, 28, 31, 67, 43, 254, 118, 127, 224, 197, 244, + 28, 31, 67, 44, 254, 118, 127, 224, 197, 244, 28, 31, 67, 43, 249, 169, + 127, 224, 197, 244, 28, 31, 67, 44, 249, 169, 127, 224, 197, 244, 28, 31, + 67, 43, 71, 249, 169, 127, 224, 197, 244, 28, 31, 67, 44, 71, 249, 169, + 127, 220, 133, 247, 128, 71, 220, 133, 247, 128, 224, 197, 244, 28, 31, + 67, 43, 42, 127, 224, 197, 244, 28, 31, 67, 44, 42, 127, 248, 163, 226, + 123, 250, 180, 226, 123, 212, 32, 226, 123, 52, 212, 32, 226, 123, 248, + 163, 121, 232, 219, 250, 180, 121, 232, 219, 212, 32, 121, 232, 219, 4, + 249, 227, 4, 110, 249, 227, 4, 243, 236, 218, 131, 4, 220, 152, 4, 249, + 234, 4, 224, 16, 79, 4, 245, 39, 79, 4, 245, 168, 248, 164, 4, 43, 226, + 7, 4, 44, 226, 7, 4, 43, 249, 107, 127, 4, 44, 249, 107, 127, 4, 43, 216, + 7, 220, 55, 127, 4, 44, 216, 7, 220, 55, 127, 4, 54, 50, 4, 254, 134, 4, + 253, 224, 4, 96, 50, 4, 240, 174, 4, 233, 21, 50, 4, 242, 137, 50, 4, + 245, 106, 50, 4, 223, 53, 219, 48, 4, 247, 140, 50, 4, 225, 185, 50, 4, + 249, 225, 253, 214, 9, 244, 172, 53, 17, 9, 217, 45, 2, 244, 172, 48, 9, + 248, 191, 53, 17, 9, 217, 79, 244, 9, 9, 234, 210, 53, 17, 9, 244, 174, + 53, 17, 9, 244, 174, 147, 17, 9, 248, 193, 53, 17, 9, 248, 193, 147, 17, + 9, 234, 212, 53, 17, 9, 234, 212, 147, 17, 9, 220, 96, 53, 17, 9, 220, + 96, 147, 17, 9, 218, 47, 53, 17, 9, 218, 47, 147, 17, 9, 1, 182, 53, 17, + 9, 1, 109, 2, 231, 233, 72, 53, 17, 9, 1, 109, 2, 231, 233, 72, 40, 17, + 9, 1, 109, 2, 182, 72, 53, 17, 9, 1, 109, 2, 182, 72, 40, 17, 9, 1, 212, + 31, 2, 182, 72, 53, 17, 9, 1, 212, 31, 2, 182, 72, 40, 17, 9, 1, 109, 2, + 182, 252, 51, 53, 17, 9, 1, 109, 2, 182, 252, 51, 40, 17, 9, 1, 77, 2, + 182, 72, 53, 17, 9, 1, 77, 2, 182, 72, 40, 17, 9, 1, 77, 2, 182, 72, 65, + 17, 9, 1, 77, 2, 182, 72, 147, 17, 9, 1, 109, 53, 17, 9, 1, 109, 40, 17, + 9, 1, 252, 63, 53, 17, 9, 1, 252, 63, 40, 17, 9, 1, 252, 63, 65, 17, 9, + 1, 252, 63, 147, 17, 9, 1, 217, 9, 231, 170, 53, 17, 9, 1, 217, 9, 231, + 170, 40, 17, 9, 1, 217, 9, 53, 17, 9, 1, 217, 9, 40, 17, 9, 1, 217, 9, + 65, 17, 9, 1, 217, 9, 147, 17, 9, 1, 216, 194, 53, 17, 9, 1, 216, 194, + 40, 17, 9, 1, 216, 194, 65, 17, 9, 1, 216, 194, 147, 17, 9, 1, 151, 53, + 17, 9, 1, 151, 40, 17, 9, 1, 151, 65, 17, 9, 1, 151, 147, 17, 9, 1, 122, + 53, 17, 9, 1, 122, 40, 17, 9, 1, 122, 65, 17, 9, 1, 122, 147, 17, 9, 1, + 234, 136, 53, 17, 9, 1, 234, 136, 40, 17, 9, 1, 234, 136, 65, 17, 9, 1, + 234, 136, 147, 17, 9, 1, 248, 204, 53, 17, 9, 1, 248, 204, 40, 17, 9, 1, + 216, 204, 53, 17, 9, 1, 216, 204, 40, 17, 9, 1, 223, 99, 53, 17, 9, 1, + 223, 99, 40, 17, 9, 1, 210, 109, 53, 17, 9, 1, 210, 109, 40, 17, 9, 1, + 221, 169, 53, 17, 9, 1, 221, 169, 40, 17, 9, 1, 221, 169, 65, 17, 9, 1, + 221, 169, 147, 17, 9, 1, 220, 62, 53, 17, 9, 1, 220, 62, 40, 17, 9, 1, + 220, 62, 65, 17, 9, 1, 220, 62, 147, 17, 9, 1, 222, 29, 53, 17, 9, 1, + 222, 29, 40, 17, 9, 1, 222, 29, 65, 17, 9, 1, 222, 29, 147, 17, 9, 1, + 248, 225, 53, 17, 9, 1, 248, 225, 40, 17, 9, 1, 248, 225, 65, 17, 9, 1, + 248, 225, 147, 17, 9, 1, 217, 82, 53, 17, 9, 1, 217, 82, 40, 17, 9, 1, + 217, 82, 65, 17, 9, 1, 217, 82, 147, 17, 9, 1, 210, 112, 53, 17, 9, 1, + 210, 112, 40, 17, 9, 1, 210, 112, 65, 17, 9, 1, 210, 112, 147, 17, 9, 1, + 254, 206, 53, 17, 9, 1, 254, 206, 40, 17, 9, 1, 254, 206, 65, 17, 9, 1, + 254, 206, 147, 17, 9, 1, 242, 252, 53, 17, 9, 1, 242, 252, 40, 17, 9, 1, + 242, 252, 65, 17, 9, 1, 242, 252, 147, 17, 9, 1, 244, 151, 53, 17, 9, 1, + 244, 151, 40, 17, 9, 1, 244, 151, 65, 17, 9, 1, 244, 151, 147, 17, 9, 1, + 224, 85, 53, 17, 9, 1, 224, 85, 40, 17, 9, 1, 224, 85, 65, 17, 9, 1, 224, + 85, 147, 17, 9, 1, 235, 1, 53, 17, 9, 1, 235, 1, 40, 17, 9, 1, 235, 1, + 65, 17, 9, 1, 235, 1, 147, 17, 9, 1, 233, 109, 53, 17, 9, 1, 233, 109, + 40, 17, 9, 1, 233, 109, 65, 17, 9, 1, 233, 109, 147, 17, 9, 1, 66, 53, + 17, 9, 1, 66, 40, 17, 9, 1, 66, 65, 17, 9, 1, 66, 147, 17, 9, 1, 228, 68, + 53, 17, 9, 1, 228, 68, 40, 17, 9, 1, 228, 68, 65, 17, 9, 1, 228, 68, 147, + 17, 9, 1, 241, 226, 53, 17, 9, 1, 241, 226, 40, 17, 9, 1, 241, 226, 65, + 17, 9, 1, 241, 226, 147, 17, 9, 1, 212, 31, 53, 17, 9, 1, 212, 31, 40, + 17, 9, 1, 109, 231, 198, 53, 17, 9, 1, 109, 231, 198, 40, 17, 9, 1, 77, + 53, 17, 9, 1, 77, 40, 17, 9, 1, 77, 65, 17, 9, 1, 77, 147, 17, 9, 27, + 233, 109, 2, 109, 2, 231, 233, 72, 53, 17, 9, 27, 233, 109, 2, 109, 2, + 231, 233, 72, 40, 17, 9, 27, 233, 109, 2, 109, 2, 182, 72, 53, 17, 9, 27, + 233, 109, 2, 109, 2, 182, 72, 40, 17, 9, 27, 233, 109, 2, 109, 2, 182, + 252, 51, 53, 17, 9, 27, 233, 109, 2, 109, 2, 182, 252, 51, 40, 17, 9, 27, + 233, 109, 2, 109, 53, 17, 9, 27, 233, 109, 2, 109, 40, 17, 210, 87, 211, + 245, 228, 78, 219, 20, 126, 245, 39, 79, 126, 224, 1, 79, 126, 54, 50, + 126, 247, 140, 50, 126, 225, 185, 50, 126, 254, 134, 126, 254, 65, 126, + 43, 226, 7, 126, 44, 226, 7, 126, 253, 224, 126, 96, 50, 126, 249, 227, + 126, 240, 174, 126, 243, 236, 218, 131, 126, 219, 48, 126, 21, 210, 86, + 126, 21, 111, 126, 21, 105, 126, 21, 158, 126, 21, 161, 126, 21, 190, + 126, 21, 195, 126, 21, 199, 126, 21, 196, 126, 21, 201, 126, 249, 234, + 126, 220, 152, 126, 233, 21, 50, 126, 245, 106, 50, 126, 242, 137, 50, + 126, 224, 16, 79, 126, 249, 225, 253, 214, 126, 7, 6, 1, 61, 126, 7, 6, + 1, 253, 166, 126, 7, 6, 1, 251, 74, 126, 7, 6, 1, 249, 68, 126, 7, 6, 1, + 76, 126, 7, 6, 1, 245, 14, 126, 7, 6, 1, 243, 209, 126, 7, 6, 1, 242, 67, + 126, 7, 6, 1, 74, 126, 7, 6, 1, 235, 150, 126, 7, 6, 1, 235, 29, 126, 7, + 6, 1, 156, 126, 7, 6, 1, 194, 126, 7, 6, 1, 230, 30, 126, 7, 6, 1, 78, + 126, 7, 6, 1, 226, 109, 126, 7, 6, 1, 224, 99, 126, 7, 6, 1, 153, 126, 7, + 6, 1, 222, 93, 126, 7, 6, 1, 217, 153, 126, 7, 6, 1, 69, 126, 7, 6, 1, + 214, 105, 126, 7, 6, 1, 212, 98, 126, 7, 6, 1, 211, 178, 126, 7, 6, 1, + 211, 117, 126, 7, 6, 1, 210, 159, 126, 43, 42, 127, 126, 223, 53, 219, + 48, 126, 44, 42, 127, 126, 250, 39, 255, 23, 126, 121, 232, 219, 126, + 242, 144, 255, 23, 126, 7, 4, 1, 61, 126, 7, 4, 1, 253, 166, 126, 7, 4, + 1, 251, 74, 126, 7, 4, 1, 249, 68, 126, 7, 4, 1, 76, 126, 7, 4, 1, 245, + 14, 126, 7, 4, 1, 243, 209, 126, 7, 4, 1, 242, 67, 126, 7, 4, 1, 74, 126, + 7, 4, 1, 235, 150, 126, 7, 4, 1, 235, 29, 126, 7, 4, 1, 156, 126, 7, 4, + 1, 194, 126, 7, 4, 1, 230, 30, 126, 7, 4, 1, 78, 126, 7, 4, 1, 226, 109, + 126, 7, 4, 1, 224, 99, 126, 7, 4, 1, 153, 126, 7, 4, 1, 222, 93, 126, 7, + 4, 1, 217, 153, 126, 7, 4, 1, 69, 126, 7, 4, 1, 214, 105, 126, 7, 4, 1, + 212, 98, 126, 7, 4, 1, 211, 178, 126, 7, 4, 1, 211, 117, 126, 7, 4, 1, + 210, 159, 126, 43, 249, 107, 127, 126, 67, 232, 219, 126, 44, 249, 107, + 127, 126, 184, 126, 43, 71, 226, 7, 126, 44, 71, 226, 7, 101, 110, 243, + 236, 218, 131, 101, 43, 249, 169, 127, 101, 44, 249, 169, 127, 101, 110, + 249, 227, 101, 56, 230, 229, 247, 128, 101, 56, 1, 211, 227, 101, 56, 1, + 4, 61, 101, 56, 1, 4, 74, 101, 56, 1, 4, 69, 101, 56, 1, 4, 76, 101, 56, + 1, 4, 78, 101, 56, 1, 4, 192, 101, 56, 1, 4, 210, 212, 101, 56, 1, 4, + 210, 244, 101, 56, 1, 4, 215, 119, 101, 234, 207, 224, 176, 219, 33, 79, + 101, 56, 1, 61, 101, 56, 1, 74, 101, 56, 1, 69, 101, 56, 1, 76, 101, 56, + 1, 78, 101, 56, 1, 176, 101, 56, 1, 234, 98, 101, 56, 1, 233, 223, 101, + 56, 1, 234, 188, 101, 56, 1, 234, 34, 101, 56, 1, 206, 101, 56, 1, 219, + 193, 101, 56, 1, 218, 84, 101, 56, 1, 221, 183, 101, 56, 1, 219, 60, 101, + 56, 1, 217, 106, 101, 56, 1, 216, 118, 101, 56, 1, 215, 119, 101, 56, 1, + 217, 23, 101, 56, 1, 112, 101, 56, 1, 198, 101, 56, 1, 228, 238, 101, 56, + 1, 227, 242, 101, 56, 1, 229, 112, 101, 56, 1, 228, 79, 101, 56, 1, 162, + 101, 56, 1, 241, 187, 101, 56, 1, 240, 229, 101, 56, 1, 241, 245, 101, + 56, 1, 241, 75, 101, 56, 1, 186, 101, 56, 1, 230, 235, 101, 56, 1, 230, + 107, 101, 56, 1, 231, 96, 101, 56, 1, 230, 166, 101, 56, 1, 192, 101, 56, + 1, 210, 212, 101, 56, 1, 210, 244, 101, 56, 1, 205, 101, 56, 1, 223, 38, + 101, 56, 1, 222, 142, 101, 56, 1, 223, 131, 101, 56, 1, 222, 213, 101, + 56, 1, 212, 65, 101, 56, 1, 230, 30, 101, 56, 213, 135, 219, 33, 79, 101, + 56, 220, 157, 219, 33, 79, 101, 24, 244, 111, 101, 24, 1, 234, 64, 101, + 24, 1, 218, 217, 101, 24, 1, 234, 57, 101, 24, 1, 228, 231, 101, 24, 1, + 228, 229, 101, 24, 1, 228, 228, 101, 24, 1, 216, 102, 101, 24, 1, 218, + 206, 101, 24, 1, 223, 29, 101, 24, 1, 223, 24, 101, 24, 1, 223, 21, 101, + 24, 1, 223, 14, 101, 24, 1, 223, 9, 101, 24, 1, 223, 4, 101, 24, 1, 223, + 15, 101, 24, 1, 223, 27, 101, 24, 1, 230, 222, 101, 24, 1, 225, 98, 101, + 24, 1, 218, 214, 101, 24, 1, 225, 87, 101, 24, 1, 219, 150, 101, 24, 1, + 218, 211, 101, 24, 1, 236, 63, 101, 24, 1, 250, 54, 101, 24, 1, 218, 221, + 101, 24, 1, 250, 114, 101, 24, 1, 234, 116, 101, 24, 1, 216, 174, 101, + 24, 1, 225, 134, 101, 24, 1, 241, 179, 101, 24, 1, 61, 101, 24, 1, 254, + 252, 101, 24, 1, 192, 101, 24, 1, 211, 92, 101, 24, 1, 245, 125, 101, 24, + 1, 76, 101, 24, 1, 211, 36, 101, 24, 1, 211, 47, 101, 24, 1, 78, 101, 24, + 1, 212, 65, 101, 24, 1, 212, 62, 101, 24, 1, 226, 238, 101, 24, 1, 210, + 244, 101, 24, 1, 69, 101, 24, 1, 212, 11, 101, 24, 1, 212, 22, 101, 24, + 1, 211, 250, 101, 24, 1, 210, 212, 101, 24, 1, 245, 63, 101, 24, 1, 211, + 8, 101, 24, 1, 74, 126, 250, 184, 50, 126, 224, 231, 50, 126, 228, 57, + 50, 126, 231, 237, 126, 251, 143, 130, 126, 211, 40, 50, 126, 211, 217, + 50, 101, 244, 26, 193, 213, 239, 101, 140, 75, 101, 214, 153, 75, 101, + 97, 75, 101, 246, 112, 75, 101, 85, 218, 236, 101, 71, 250, 43, 235, 211, + 254, 107, 254, 128, 235, 211, 254, 107, 220, 139, 235, 211, 254, 107, + 216, 237, 226, 253, 223, 75, 250, 150, 223, 75, 250, 150, 62, 57, 3, 253, + 150, 61, 62, 57, 3, 253, 119, 76, 62, 57, 3, 253, 128, 74, 62, 57, 3, + 253, 96, 78, 62, 57, 3, 253, 146, 69, 62, 57, 3, 253, 165, 248, 229, 62, + 57, 3, 253, 112, 248, 98, 62, 57, 3, 253, 152, 248, 11, 62, 57, 3, 253, + 142, 247, 153, 62, 57, 3, 253, 106, 246, 86, 62, 57, 3, 253, 100, 235, + 147, 62, 57, 3, 253, 111, 235, 132, 62, 57, 3, 253, 121, 235, 74, 62, 57, + 3, 253, 92, 235, 57, 62, 57, 3, 253, 80, 176, 62, 57, 3, 253, 113, 234, + 188, 62, 57, 3, 253, 90, 234, 98, 62, 57, 3, 253, 87, 234, 34, 62, 57, 3, + 253, 76, 233, 223, 62, 57, 3, 253, 77, 186, 62, 57, 3, 253, 143, 231, 96, + 62, 57, 3, 253, 84, 230, 235, 62, 57, 3, 253, 141, 230, 166, 62, 57, 3, + 253, 133, 230, 107, 62, 57, 3, 253, 154, 198, 62, 57, 3, 253, 132, 229, + 112, 62, 57, 3, 253, 126, 228, 238, 62, 57, 3, 253, 105, 228, 79, 62, 57, + 3, 253, 102, 227, 242, 62, 57, 3, 253, 161, 191, 62, 57, 3, 253, 85, 225, + 224, 62, 57, 3, 253, 118, 225, 111, 62, 57, 3, 253, 145, 225, 19, 62, 57, + 3, 253, 107, 224, 153, 62, 57, 3, 253, 140, 224, 91, 62, 57, 3, 253, 79, + 224, 72, 62, 57, 3, 253, 135, 224, 56, 62, 57, 3, 253, 124, 224, 45, 62, + 57, 3, 253, 97, 205, 62, 57, 3, 253, 129, 223, 131, 62, 57, 3, 253, 104, + 223, 38, 62, 57, 3, 253, 163, 222, 213, 62, 57, 3, 253, 130, 222, 142, + 62, 57, 3, 253, 125, 206, 62, 57, 3, 253, 148, 221, 183, 62, 57, 3, 253, + 116, 219, 193, 62, 57, 3, 253, 144, 219, 60, 62, 57, 3, 253, 99, 218, 84, + 62, 57, 3, 253, 98, 217, 106, 62, 57, 3, 253, 159, 217, 23, 62, 57, 3, + 253, 120, 216, 118, 62, 57, 3, 253, 157, 112, 62, 57, 3, 253, 88, 215, + 119, 62, 57, 3, 253, 103, 212, 65, 62, 57, 3, 253, 82, 212, 22, 62, 57, + 3, 253, 117, 211, 250, 62, 57, 3, 253, 115, 211, 227, 62, 57, 3, 253, + 139, 210, 116, 62, 57, 3, 253, 83, 210, 94, 62, 57, 3, 253, 136, 210, 23, + 62, 57, 3, 253, 131, 255, 84, 62, 57, 3, 253, 114, 255, 83, 62, 57, 3, + 253, 73, 253, 200, 62, 57, 3, 253, 86, 246, 54, 62, 57, 3, 253, 69, 246, + 53, 62, 57, 3, 253, 109, 227, 178, 62, 57, 3, 253, 127, 224, 151, 62, 57, + 3, 253, 95, 224, 155, 62, 57, 3, 253, 81, 223, 189, 62, 57, 3, 253, 123, + 223, 188, 62, 57, 3, 253, 89, 222, 212, 62, 57, 3, 253, 91, 217, 103, 62, + 57, 3, 253, 71, 215, 78, 62, 57, 3, 253, 68, 105, 62, 57, 16, 253, 138, + 62, 57, 16, 253, 137, 62, 57, 16, 253, 134, 62, 57, 16, 253, 122, 62, 57, + 16, 253, 110, 62, 57, 16, 253, 108, 62, 57, 16, 253, 101, 62, 57, 16, + 253, 94, 62, 57, 16, 253, 93, 62, 57, 16, 253, 78, 62, 57, 16, 253, 75, + 62, 57, 16, 253, 74, 62, 57, 16, 253, 72, 62, 57, 16, 253, 70, 62, 57, + 106, 253, 67, 231, 190, 62, 57, 106, 253, 66, 211, 221, 62, 57, 106, 253, + 65, 248, 82, 62, 57, 106, 253, 64, 245, 103, 62, 57, 106, 253, 63, 231, + 164, 62, 57, 106, 253, 62, 218, 164, 62, 57, 106, 253, 61, 245, 45, 62, + 57, 106, 253, 60, 223, 156, 62, 57, 106, 253, 59, 220, 64, 62, 57, 106, + 253, 58, 241, 244, 62, 57, 106, 253, 57, 219, 27, 62, 57, 106, 253, 56, + 251, 211, 62, 57, 106, 253, 55, 249, 153, 62, 57, 106, 253, 54, 251, 123, + 62, 57, 106, 253, 53, 212, 2, 62, 57, 106, 253, 52, 252, 144, 62, 57, + 106, 253, 51, 226, 209, 62, 57, 106, 253, 50, 219, 0, 62, 57, 106, 253, + 49, 249, 76, 62, 57, 230, 147, 253, 48, 234, 230, 62, 57, 230, 147, 253, + 47, 234, 238, 62, 57, 106, 253, 46, 226, 222, 62, 57, 106, 253, 45, 211, + 236, 62, 57, 106, 253, 44, 62, 57, 230, 147, 253, 43, 254, 25, 62, 57, + 230, 147, 253, 42, 231, 57, 62, 57, 106, 253, 41, 251, 142, 62, 57, 106, + 253, 40, 242, 173, 62, 57, 106, 253, 39, 62, 57, 106, 253, 38, 211, 212, + 62, 57, 106, 253, 37, 62, 57, 106, 253, 36, 62, 57, 106, 253, 35, 240, + 255, 62, 57, 106, 253, 34, 62, 57, 106, 253, 33, 62, 57, 106, 253, 32, + 62, 57, 230, 147, 253, 30, 215, 92, 62, 57, 106, 253, 29, 62, 57, 106, + 253, 28, 62, 57, 106, 253, 27, 250, 2, 62, 57, 106, 253, 26, 62, 57, 106, + 253, 25, 62, 57, 106, 253, 24, 243, 100, 62, 57, 106, 253, 23, 254, 12, + 62, 57, 106, 253, 22, 62, 57, 106, 253, 21, 62, 57, 106, 253, 20, 62, 57, + 106, 253, 19, 62, 57, 106, 253, 18, 62, 57, 106, 253, 17, 62, 57, 106, + 253, 16, 62, 57, 106, 253, 15, 62, 57, 106, 253, 14, 62, 57, 106, 253, + 13, 230, 139, 62, 57, 106, 253, 12, 62, 57, 106, 253, 11, 215, 236, 62, + 57, 106, 253, 10, 62, 57, 106, 253, 9, 62, 57, 106, 253, 8, 62, 57, 106, + 253, 7, 62, 57, 106, 253, 6, 62, 57, 106, 253, 5, 62, 57, 106, 253, 4, + 62, 57, 106, 253, 3, 62, 57, 106, 253, 2, 62, 57, 106, 253, 1, 62, 57, + 106, 253, 0, 62, 57, 106, 252, 255, 241, 218, 62, 57, 106, 252, 234, 244, + 36, 62, 57, 106, 252, 231, 252, 124, 62, 57, 106, 252, 226, 219, 7, 62, + 57, 106, 252, 225, 75, 62, 57, 106, 252, 224, 62, 57, 106, 252, 223, 217, + 237, 62, 57, 106, 252, 222, 62, 57, 106, 252, 221, 62, 57, 106, 252, 220, + 211, 254, 250, 147, 62, 57, 106, 252, 219, 250, 147, 62, 57, 106, 252, + 218, 250, 148, 244, 7, 62, 57, 106, 252, 217, 212, 0, 62, 57, 106, 252, + 216, 62, 57, 106, 252, 215, 62, 57, 230, 147, 252, 214, 247, 206, 62, 57, + 106, 252, 213, 62, 57, 106, 252, 212, 62, 57, 106, 252, 210, 62, 57, 106, + 252, 209, 62, 57, 106, 252, 208, 62, 57, 106, 252, 207, 248, 167, 62, 57, + 106, 252, 206, 62, 57, 106, 252, 205, 62, 57, 106, 252, 204, 62, 57, 106, + 252, 203, 62, 57, 106, 252, 202, 62, 57, 106, 213, 186, 253, 31, 62, 57, + 106, 213, 186, 252, 254, 62, 57, 106, 213, 186, 252, 253, 62, 57, 106, + 213, 186, 252, 252, 62, 57, 106, 213, 186, 252, 251, 62, 57, 106, 213, + 186, 252, 250, 62, 57, 106, 213, 186, 252, 249, 62, 57, 106, 213, 186, + 252, 248, 62, 57, 106, 213, 186, 252, 247, 62, 57, 106, 213, 186, 252, + 246, 62, 57, 106, 213, 186, 252, 245, 62, 57, 106, 213, 186, 252, 244, + 62, 57, 106, 213, 186, 252, 243, 62, 57, 106, 213, 186, 252, 242, 62, 57, + 106, 213, 186, 252, 241, 62, 57, 106, 213, 186, 252, 240, 62, 57, 106, + 213, 186, 252, 239, 62, 57, 106, 213, 186, 252, 238, 62, 57, 106, 213, + 186, 252, 237, 62, 57, 106, 213, 186, 252, 236, 62, 57, 106, 213, 186, + 252, 235, 62, 57, 106, 213, 186, 252, 233, 62, 57, 106, 213, 186, 252, + 232, 62, 57, 106, 213, 186, 252, 230, 62, 57, 106, 213, 186, 252, 229, + 62, 57, 106, 213, 186, 252, 228, 62, 57, 106, 213, 186, 252, 227, 62, 57, + 106, 213, 186, 252, 211, 62, 57, 106, 213, 186, 252, 201, 254, 245, 211, + 209, 220, 140, 232, 219, 254, 245, 211, 209, 220, 140, 247, 128, 254, + 245, 250, 138, 79, 254, 245, 54, 111, 254, 245, 54, 105, 254, 245, 54, + 158, 254, 245, 54, 161, 254, 245, 54, 190, 254, 245, 54, 195, 254, 245, + 54, 199, 254, 245, 54, 196, 254, 245, 54, 201, 254, 245, 54, 216, 248, + 254, 245, 54, 215, 73, 254, 245, 54, 216, 163, 254, 245, 54, 244, 23, + 254, 245, 54, 244, 122, 254, 245, 54, 219, 113, 254, 245, 54, 220, 118, + 254, 245, 54, 245, 192, 254, 245, 54, 228, 200, 254, 245, 54, 123, 240, + 217, 254, 245, 54, 113, 240, 217, 254, 245, 54, 134, 240, 217, 254, 245, + 54, 244, 19, 240, 217, 254, 245, 54, 244, 89, 240, 217, 254, 245, 54, + 219, 127, 240, 217, 254, 245, 54, 220, 124, 240, 217, 254, 245, 54, 245, + 201, 240, 217, 254, 245, 54, 228, 205, 240, 217, 254, 245, 54, 123, 216, + 148, 254, 245, 54, 113, 216, 148, 254, 245, 54, 134, 216, 148, 254, 245, + 54, 244, 19, 216, 148, 254, 245, 54, 244, 89, 216, 148, 254, 245, 54, + 219, 127, 216, 148, 254, 245, 54, 220, 124, 216, 148, 254, 245, 54, 245, + 201, 216, 148, 254, 245, 54, 228, 205, 216, 148, 254, 245, 54, 216, 249, + 216, 148, 254, 245, 54, 215, 74, 216, 148, 254, 245, 54, 216, 164, 216, + 148, 254, 245, 54, 244, 24, 216, 148, 254, 245, 54, 244, 123, 216, 148, + 254, 245, 54, 219, 114, 216, 148, 254, 245, 54, 220, 119, 216, 148, 254, + 245, 54, 245, 193, 216, 148, 254, 245, 54, 228, 201, 216, 148, 254, 245, + 212, 14, 252, 136, 214, 173, 254, 245, 212, 14, 244, 100, 218, 60, 254, + 245, 212, 14, 221, 178, 218, 60, 254, 245, 212, 14, 216, 170, 218, 60, + 254, 245, 212, 14, 244, 12, 218, 60, 254, 245, 246, 89, 231, 95, 244, + 100, 218, 60, 254, 245, 232, 205, 231, 95, 244, 100, 218, 60, 254, 245, + 231, 95, 221, 178, 218, 60, 254, 245, 231, 95, 216, 170, 218, 60, 26, + 255, 15, 253, 202, 123, 224, 24, 26, 255, 15, 253, 202, 123, 242, 34, 26, + 255, 15, 253, 202, 123, 246, 108, 26, 255, 15, 253, 202, 190, 26, 255, + 15, 253, 202, 244, 122, 26, 255, 15, 253, 202, 244, 89, 240, 217, 26, + 255, 15, 253, 202, 244, 89, 216, 148, 26, 255, 15, 253, 202, 244, 123, + 216, 148, 26, 255, 15, 253, 202, 244, 89, 217, 68, 26, 255, 15, 253, 202, + 216, 249, 217, 68, 26, 255, 15, 253, 202, 244, 123, 217, 68, 26, 255, 15, + 253, 202, 123, 240, 218, 217, 68, 26, 255, 15, 253, 202, 244, 89, 240, + 218, 217, 68, 26, 255, 15, 253, 202, 123, 216, 149, 217, 68, 26, 255, 15, + 253, 202, 244, 89, 216, 149, 217, 68, 26, 255, 15, 253, 202, 244, 89, + 218, 152, 26, 255, 15, 253, 202, 216, 249, 218, 152, 26, 255, 15, 253, + 202, 244, 123, 218, 152, 26, 255, 15, 253, 202, 123, 240, 218, 218, 152, + 26, 255, 15, 253, 202, 244, 89, 240, 218, 218, 152, 26, 255, 15, 253, + 202, 123, 216, 149, 218, 152, 26, 255, 15, 253, 202, 216, 249, 216, 149, + 218, 152, 26, 255, 15, 253, 202, 244, 123, 216, 149, 218, 152, 26, 255, + 15, 253, 202, 216, 249, 230, 169, 26, 255, 15, 241, 212, 123, 225, 34, + 26, 255, 15, 216, 182, 111, 26, 255, 15, 241, 208, 111, 26, 255, 15, 245, + 112, 105, 26, 255, 15, 216, 182, 105, 26, 255, 15, 249, 73, 113, 246, + 107, 26, 255, 15, 245, 112, 113, 246, 107, 26, 255, 15, 215, 204, 190, + 26, 255, 15, 215, 204, 216, 248, 26, 255, 15, 215, 204, 216, 249, 254, + 149, 17, 26, 255, 15, 241, 208, 216, 248, 26, 255, 15, 231, 46, 216, 248, + 26, 255, 15, 216, 182, 216, 248, 26, 255, 15, 216, 182, 216, 163, 26, + 255, 15, 215, 204, 244, 122, 26, 255, 15, 215, 204, 244, 123, 254, 149, + 17, 26, 255, 15, 241, 208, 244, 122, 26, 255, 15, 216, 182, 244, 122, 26, + 255, 15, 216, 182, 123, 240, 217, 26, 255, 15, 216, 182, 134, 240, 217, + 26, 255, 15, 245, 112, 244, 89, 240, 217, 26, 255, 15, 215, 204, 244, 89, + 240, 217, 26, 255, 15, 216, 182, 244, 89, 240, 217, 26, 255, 15, 250, + 235, 244, 89, 240, 217, 26, 255, 15, 229, 187, 244, 89, 240, 217, 26, + 255, 15, 216, 182, 123, 216, 148, 26, 255, 15, 216, 182, 244, 89, 216, + 148, 26, 255, 15, 248, 65, 244, 89, 230, 169, 26, 255, 15, 218, 120, 244, + 123, 230, 169, 26, 123, 163, 50, 26, 123, 163, 5, 254, 149, 17, 26, 113, + 216, 168, 50, 26, 134, 224, 23, 50, 26, 211, 45, 50, 26, 217, 69, 50, 26, + 246, 109, 50, 26, 226, 250, 50, 26, 113, 226, 249, 50, 26, 134, 226, 249, + 50, 26, 244, 19, 226, 249, 50, 26, 244, 89, 226, 249, 50, 26, 231, 40, + 50, 26, 233, 163, 252, 136, 50, 26, 232, 200, 50, 26, 226, 135, 50, 26, + 211, 159, 50, 26, 253, 251, 50, 26, 254, 8, 50, 26, 242, 151, 50, 26, + 215, 187, 252, 136, 50, 26, 210, 87, 50, 222, 200, 220, 115, 50, 222, + 200, 214, 185, 50, 222, 200, 220, 144, 50, 222, 200, 220, 113, 50, 222, + 200, 247, 221, 220, 113, 50, 222, 200, 219, 170, 50, 222, 200, 248, 61, + 50, 222, 200, 224, 9, 50, 222, 200, 220, 131, 50, 222, 200, 246, 68, 50, + 222, 200, 253, 246, 50, 222, 200, 250, 179, 50, 225, 146, 247, 199, 5, + 225, 216, 225, 146, 247, 199, 5, 225, 27, 241, 242, 225, 146, 247, 199, + 5, 217, 46, 241, 242, 225, 146, 247, 199, 5, 250, 255, 225, 146, 247, + 199, 5, 250, 109, 225, 146, 247, 199, 5, 211, 221, 225, 146, 247, 199, 5, + 241, 218, 225, 146, 247, 199, 5, 243, 92, 225, 146, 247, 199, 5, 216, + 117, 225, 146, 247, 199, 5, 75, 225, 146, 247, 199, 5, 251, 177, 225, + 146, 247, 199, 5, 220, 31, 225, 146, 247, 199, 5, 249, 252, 225, 146, + 247, 199, 5, 231, 189, 225, 146, 247, 199, 5, 231, 141, 225, 146, 247, + 199, 5, 221, 218, 225, 146, 247, 199, 5, 232, 243, 225, 146, 247, 199, 5, + 251, 196, 225, 146, 247, 199, 5, 250, 239, 225, 38, 225, 146, 247, 199, + 5, 247, 141, 225, 146, 247, 199, 5, 249, 231, 225, 146, 247, 199, 5, 219, + 89, 225, 146, 247, 199, 5, 249, 232, 225, 146, 247, 199, 5, 252, 71, 225, + 146, 247, 199, 5, 220, 18, 225, 146, 247, 199, 5, 240, 255, 225, 146, + 247, 199, 5, 241, 185, 225, 146, 247, 199, 5, 251, 120, 233, 42, 225, + 146, 247, 199, 5, 250, 232, 225, 146, 247, 199, 5, 223, 156, 225, 146, + 247, 199, 5, 245, 238, 225, 146, 247, 199, 5, 246, 115, 225, 146, 247, + 199, 5, 215, 106, 225, 146, 247, 199, 5, 252, 74, 225, 146, 247, 199, 5, + 225, 39, 215, 236, 225, 146, 247, 199, 5, 213, 159, 225, 146, 247, 199, + 5, 226, 22, 225, 146, 247, 199, 5, 222, 192, 225, 146, 247, 199, 5, 232, + 230, 225, 146, 247, 199, 5, 226, 119, 252, 192, 225, 146, 247, 199, 5, + 244, 56, 225, 146, 247, 199, 5, 242, 145, 225, 146, 247, 199, 5, 218, + 121, 225, 146, 247, 199, 5, 4, 253, 176, 225, 146, 247, 199, 5, 212, 32, + 252, 156, 225, 146, 247, 199, 5, 38, 226, 252, 91, 232, 65, 1, 61, 232, + 65, 1, 76, 232, 65, 1, 253, 166, 232, 65, 1, 252, 27, 232, 65, 1, 243, + 209, 232, 65, 1, 249, 68, 232, 65, 1, 74, 232, 65, 1, 212, 98, 232, 65, + 1, 210, 159, 232, 65, 1, 216, 211, 232, 65, 1, 235, 150, 232, 65, 1, 235, + 29, 232, 65, 1, 224, 99, 232, 65, 1, 156, 232, 65, 1, 194, 232, 65, 1, + 230, 30, 232, 65, 1, 230, 171, 232, 65, 1, 228, 116, 232, 65, 1, 69, 232, + 65, 1, 226, 109, 232, 65, 1, 234, 53, 232, 65, 1, 153, 232, 65, 1, 222, + 93, 232, 65, 1, 217, 153, 232, 65, 1, 215, 160, 232, 65, 1, 254, 131, + 232, 65, 1, 245, 158, 232, 65, 1, 242, 67, 232, 65, 1, 211, 178, 250, + 245, 1, 61, 250, 245, 1, 226, 95, 250, 245, 1, 249, 68, 250, 245, 1, 156, + 250, 245, 1, 214, 116, 250, 245, 1, 153, 250, 245, 1, 233, 68, 250, 245, + 1, 255, 84, 250, 245, 1, 224, 99, 250, 245, 1, 253, 166, 250, 245, 1, + 194, 250, 245, 1, 78, 250, 245, 1, 248, 231, 250, 245, 1, 217, 153, 250, + 245, 1, 220, 106, 250, 245, 1, 220, 105, 250, 245, 1, 222, 93, 250, 245, + 1, 251, 73, 250, 245, 1, 69, 250, 245, 1, 228, 116, 250, 245, 1, 211, + 178, 250, 245, 1, 230, 30, 250, 245, 1, 215, 159, 250, 245, 1, 226, 109, + 250, 245, 1, 218, 228, 250, 245, 1, 74, 250, 245, 1, 76, 250, 245, 1, + 214, 113, 250, 245, 1, 235, 29, 250, 245, 1, 235, 20, 250, 245, 1, 229, + 155, 250, 245, 1, 214, 118, 250, 245, 1, 243, 209, 250, 245, 1, 243, 144, + 250, 245, 1, 218, 170, 250, 245, 1, 218, 169, 250, 245, 1, 229, 84, 250, + 245, 1, 236, 40, 250, 245, 1, 251, 72, 250, 245, 1, 215, 160, 250, 245, + 1, 214, 115, 250, 245, 1, 222, 182, 250, 245, 1, 231, 134, 250, 245, 1, + 231, 133, 250, 245, 1, 231, 132, 250, 245, 1, 231, 131, 250, 245, 1, 233, + 67, 250, 245, 1, 245, 242, 250, 245, 1, 214, 114, 55, 32, 1, 61, 55, 32, + 1, 252, 83, 55, 32, 1, 234, 188, 55, 32, 1, 248, 98, 55, 32, 1, 76, 55, + 32, 1, 213, 255, 55, 32, 1, 210, 94, 55, 32, 1, 241, 245, 55, 32, 1, 216, + 196, 55, 32, 1, 74, 55, 32, 1, 176, 55, 32, 1, 245, 182, 55, 32, 1, 245, + 167, 55, 32, 1, 245, 158, 55, 32, 1, 245, 83, 55, 32, 1, 78, 55, 32, 1, + 225, 224, 55, 32, 1, 220, 65, 55, 32, 1, 233, 223, 55, 32, 1, 245, 100, + 55, 32, 1, 245, 90, 55, 32, 1, 217, 23, 55, 32, 1, 69, 55, 32, 1, 245, + 185, 55, 32, 1, 225, 139, 55, 32, 1, 234, 125, 55, 32, 1, 245, 210, 55, + 32, 1, 245, 92, 55, 32, 1, 250, 139, 55, 32, 1, 236, 40, 55, 32, 1, 214, + 118, 55, 32, 227, 202, 111, 55, 32, 227, 202, 190, 55, 32, 227, 202, 216, + 248, 55, 32, 227, 202, 244, 122, 242, 160, 1, 254, 213, 242, 160, 1, 252, + 171, 242, 160, 1, 242, 218, 242, 160, 1, 248, 212, 242, 160, 1, 254, 209, + 242, 160, 1, 224, 82, 242, 160, 1, 235, 161, 242, 160, 1, 242, 46, 242, + 160, 1, 216, 159, 242, 160, 1, 245, 191, 242, 160, 1, 233, 196, 242, 160, + 1, 233, 119, 242, 160, 1, 231, 184, 242, 160, 1, 229, 189, 242, 160, 1, + 235, 125, 242, 160, 1, 214, 136, 242, 160, 1, 226, 73, 242, 160, 1, 228, + 200, 242, 160, 1, 223, 168, 242, 160, 1, 221, 220, 242, 160, 1, 217, 5, + 242, 160, 1, 211, 234, 242, 160, 1, 244, 186, 242, 160, 1, 236, 44, 242, + 160, 1, 240, 206, 242, 160, 1, 226, 143, 242, 160, 1, 228, 205, 240, 217, + 214, 209, 1, 254, 155, 214, 209, 1, 252, 34, 214, 209, 1, 243, 115, 214, + 209, 1, 234, 138, 214, 209, 1, 248, 62, 214, 209, 1, 241, 75, 214, 209, + 1, 211, 227, 214, 209, 1, 210, 85, 214, 209, 1, 240, 248, 214, 209, 1, + 216, 231, 214, 209, 1, 210, 233, 214, 209, 1, 235, 0, 214, 209, 1, 220, + 22, 214, 209, 1, 233, 104, 214, 209, 1, 231, 70, 214, 209, 1, 248, 29, + 214, 209, 1, 227, 198, 214, 209, 1, 210, 13, 214, 209, 1, 221, 250, 214, + 209, 1, 254, 205, 214, 209, 1, 224, 153, 214, 209, 1, 222, 27, 214, 209, + 1, 224, 38, 214, 209, 1, 223, 147, 214, 209, 1, 216, 200, 214, 209, 1, + 242, 251, 214, 209, 1, 112, 214, 209, 1, 74, 214, 209, 1, 69, 214, 209, + 1, 218, 181, 214, 209, 211, 209, 247, 180, 55, 225, 172, 5, 61, 55, 225, + 172, 5, 74, 55, 225, 172, 5, 69, 55, 225, 172, 5, 176, 55, 225, 172, 5, + 233, 223, 55, 225, 172, 5, 243, 142, 55, 225, 172, 5, 242, 120, 55, 225, + 172, 5, 211, 165, 55, 225, 172, 5, 251, 41, 55, 225, 172, 5, 235, 147, + 55, 225, 172, 5, 235, 114, 55, 225, 172, 5, 217, 106, 55, 225, 172, 5, + 215, 119, 55, 225, 172, 5, 248, 229, 55, 225, 172, 5, 248, 11, 55, 225, + 172, 5, 246, 86, 55, 225, 172, 5, 216, 209, 55, 225, 172, 5, 191, 55, + 225, 172, 5, 252, 199, 55, 225, 172, 5, 244, 204, 55, 225, 172, 5, 198, + 55, 225, 172, 5, 227, 242, 55, 225, 172, 5, 186, 55, 225, 172, 5, 230, + 235, 55, 225, 172, 5, 230, 107, 55, 225, 172, 5, 192, 55, 225, 172, 5, + 214, 27, 55, 225, 172, 5, 213, 176, 55, 225, 172, 5, 205, 55, 225, 172, + 5, 222, 142, 55, 225, 172, 5, 233, 141, 55, 225, 172, 5, 206, 55, 225, + 172, 5, 210, 116, 55, 225, 172, 5, 220, 104, 55, 225, 172, 5, 218, 225, + 55, 225, 172, 5, 162, 55, 225, 172, 5, 253, 194, 55, 225, 172, 5, 253, + 193, 55, 225, 172, 5, 253, 192, 55, 225, 172, 5, 211, 142, 55, 225, 172, + 5, 248, 208, 55, 225, 172, 5, 248, 207, 55, 225, 172, 5, 252, 178, 55, + 225, 172, 5, 251, 93, 55, 225, 172, 211, 209, 247, 180, 55, 225, 172, 54, + 111, 55, 225, 172, 54, 105, 55, 225, 172, 54, 216, 248, 55, 225, 172, 54, + 215, 73, 55, 225, 172, 54, 240, 217, 181, 6, 1, 200, 74, 181, 6, 1, 200, + 76, 181, 6, 1, 200, 61, 181, 6, 1, 200, 254, 218, 181, 6, 1, 200, 78, + 181, 6, 1, 200, 226, 187, 181, 6, 1, 219, 253, 74, 181, 6, 1, 219, 253, + 76, 181, 6, 1, 219, 253, 61, 181, 6, 1, 219, 253, 254, 218, 181, 6, 1, + 219, 253, 78, 181, 6, 1, 219, 253, 226, 187, 181, 6, 1, 253, 175, 181, 6, + 1, 226, 120, 181, 6, 1, 211, 195, 181, 6, 1, 211, 44, 181, 6, 1, 242, 67, + 181, 6, 1, 225, 214, 181, 6, 1, 252, 74, 181, 6, 1, 217, 12, 181, 6, 1, + 248, 85, 181, 6, 1, 250, 136, 181, 6, 1, 235, 130, 181, 6, 1, 234, 195, + 181, 6, 1, 243, 90, 181, 6, 1, 245, 210, 181, 6, 1, 213, 250, 181, 6, 1, + 245, 67, 181, 6, 1, 216, 195, 181, 6, 1, 245, 90, 181, 6, 1, 210, 92, + 181, 6, 1, 245, 83, 181, 6, 1, 210, 73, 181, 6, 1, 245, 100, 181, 6, 1, + 245, 182, 181, 6, 1, 245, 167, 181, 6, 1, 245, 158, 181, 6, 1, 245, 146, + 181, 6, 1, 226, 223, 181, 6, 1, 245, 46, 181, 4, 1, 200, 74, 181, 4, 1, + 200, 76, 181, 4, 1, 200, 61, 181, 4, 1, 200, 254, 218, 181, 4, 1, 200, + 78, 181, 4, 1, 200, 226, 187, 181, 4, 1, 219, 253, 74, 181, 4, 1, 219, + 253, 76, 181, 4, 1, 219, 253, 61, 181, 4, 1, 219, 253, 254, 218, 181, 4, + 1, 219, 253, 78, 181, 4, 1, 219, 253, 226, 187, 181, 4, 1, 253, 175, 181, + 4, 1, 226, 120, 181, 4, 1, 211, 195, 181, 4, 1, 211, 44, 181, 4, 1, 242, + 67, 181, 4, 1, 225, 214, 181, 4, 1, 252, 74, 181, 4, 1, 217, 12, 181, 4, + 1, 248, 85, 181, 4, 1, 250, 136, 181, 4, 1, 235, 130, 181, 4, 1, 234, + 195, 181, 4, 1, 243, 90, 181, 4, 1, 245, 210, 181, 4, 1, 213, 250, 181, + 4, 1, 245, 67, 181, 4, 1, 216, 195, 181, 4, 1, 245, 90, 181, 4, 1, 210, + 92, 181, 4, 1, 245, 83, 181, 4, 1, 210, 73, 181, 4, 1, 245, 100, 181, 4, + 1, 245, 182, 181, 4, 1, 245, 167, 181, 4, 1, 245, 158, 181, 4, 1, 245, + 146, 181, 4, 1, 226, 223, 181, 4, 1, 245, 46, 220, 71, 1, 225, 212, 220, + 71, 1, 216, 6, 220, 71, 1, 234, 97, 220, 71, 1, 244, 155, 220, 71, 1, + 216, 173, 220, 71, 1, 219, 60, 220, 71, 1, 218, 15, 220, 71, 1, 250, 69, + 220, 71, 1, 211, 46, 220, 71, 1, 240, 216, 220, 71, 1, 252, 13, 220, 71, + 1, 248, 97, 220, 71, 1, 243, 128, 220, 71, 1, 213, 123, 220, 71, 1, 216, + 177, 220, 71, 1, 210, 21, 220, 71, 1, 231, 94, 220, 71, 1, 235, 55, 220, + 71, 1, 211, 225, 220, 71, 1, 242, 55, 220, 71, 1, 232, 148, 220, 71, 1, + 230, 194, 220, 71, 1, 236, 47, 220, 71, 1, 245, 209, 220, 71, 1, 253, + 239, 220, 71, 1, 255, 0, 220, 71, 1, 226, 200, 220, 71, 1, 211, 212, 220, + 71, 1, 226, 134, 220, 71, 1, 254, 218, 220, 71, 1, 222, 210, 220, 71, 1, + 227, 198, 220, 71, 1, 245, 225, 220, 71, 1, 254, 223, 220, 71, 1, 240, + 118, 220, 71, 1, 214, 163, 220, 71, 1, 227, 2, 220, 71, 1, 226, 180, 220, + 71, 1, 226, 222, 220, 71, 1, 253, 178, 220, 71, 1, 254, 27, 220, 71, 1, + 226, 162, 220, 71, 1, 254, 201, 220, 71, 1, 245, 94, 220, 71, 1, 254, 5, + 220, 71, 1, 245, 235, 220, 71, 1, 240, 125, 220, 71, 1, 211, 13, 226, + 145, 1, 254, 179, 226, 145, 1, 252, 199, 226, 145, 1, 217, 106, 226, 145, + 1, 235, 147, 226, 145, 1, 211, 165, 226, 145, 1, 234, 138, 226, 145, 1, + 248, 84, 226, 145, 1, 205, 226, 145, 1, 206, 226, 145, 1, 220, 28, 226, + 145, 1, 248, 33, 226, 145, 1, 250, 223, 226, 145, 1, 243, 142, 226, 145, + 1, 244, 204, 226, 145, 1, 224, 89, 226, 145, 1, 235, 15, 226, 145, 1, + 233, 136, 226, 145, 1, 230, 205, 226, 145, 1, 227, 182, 226, 145, 1, 212, + 30, 226, 145, 1, 162, 226, 145, 1, 192, 226, 145, 1, 61, 226, 145, 1, 76, + 226, 145, 1, 74, 226, 145, 1, 78, 226, 145, 1, 69, 226, 145, 1, 255, 82, + 226, 145, 1, 245, 217, 226, 145, 1, 226, 187, 226, 145, 21, 210, 86, 226, + 145, 21, 111, 226, 145, 21, 105, 226, 145, 21, 158, 226, 145, 21, 161, + 226, 145, 21, 190, 226, 145, 21, 195, 226, 145, 21, 199, 226, 145, 21, + 196, 226, 145, 21, 201, 249, 75, 3, 61, 249, 75, 3, 76, 249, 75, 3, 74, + 249, 75, 3, 78, 249, 75, 3, 69, 249, 75, 3, 235, 147, 249, 75, 3, 235, + 74, 249, 75, 3, 176, 249, 75, 3, 234, 188, 249, 75, 3, 234, 98, 249, 75, + 3, 234, 34, 249, 75, 3, 233, 223, 249, 75, 3, 233, 141, 249, 75, 3, 233, + 64, 249, 75, 3, 232, 247, 249, 75, 3, 232, 162, 249, 75, 3, 232, 103, + 249, 75, 3, 186, 249, 75, 3, 231, 96, 249, 75, 3, 230, 235, 249, 75, 3, + 230, 166, 249, 75, 3, 230, 107, 249, 75, 3, 198, 249, 75, 3, 229, 112, + 249, 75, 3, 228, 238, 249, 75, 3, 228, 79, 249, 75, 3, 227, 242, 249, 75, + 3, 191, 249, 75, 3, 225, 224, 249, 75, 3, 225, 111, 249, 75, 3, 225, 19, + 249, 75, 3, 224, 153, 249, 75, 3, 205, 249, 75, 3, 223, 131, 249, 75, 3, + 223, 38, 249, 75, 3, 222, 213, 249, 75, 3, 222, 142, 249, 75, 3, 206, + 249, 75, 3, 221, 183, 249, 75, 3, 219, 193, 249, 75, 3, 219, 60, 249, 75, + 3, 218, 84, 249, 75, 3, 217, 106, 249, 75, 3, 217, 23, 249, 75, 3, 216, + 118, 249, 75, 3, 112, 249, 75, 3, 215, 119, 249, 75, 3, 212, 65, 249, 75, + 3, 212, 22, 249, 75, 3, 211, 250, 249, 75, 3, 211, 227, 249, 75, 3, 211, + 165, 249, 75, 3, 211, 162, 249, 75, 3, 210, 116, 249, 75, 3, 210, 23, + 236, 8, 254, 35, 1, 254, 177, 236, 8, 254, 35, 1, 252, 33, 236, 8, 254, + 35, 1, 242, 208, 236, 8, 254, 35, 1, 248, 196, 236, 8, 254, 35, 1, 241, + 245, 236, 8, 254, 35, 1, 212, 30, 236, 8, 254, 35, 1, 210, 97, 236, 8, + 254, 35, 1, 241, 202, 236, 8, 254, 35, 1, 216, 227, 236, 8, 254, 35, 1, + 210, 232, 236, 8, 254, 35, 1, 234, 231, 236, 8, 254, 35, 1, 233, 99, 236, + 8, 254, 35, 1, 231, 70, 236, 8, 254, 35, 1, 227, 198, 236, 8, 254, 35, 1, + 221, 251, 236, 8, 254, 35, 1, 253, 170, 236, 8, 254, 35, 1, 225, 224, + 236, 8, 254, 35, 1, 222, 26, 236, 8, 254, 35, 1, 224, 37, 236, 8, 254, + 35, 1, 223, 70, 236, 8, 254, 35, 1, 220, 22, 236, 8, 254, 35, 1, 217, 37, + 236, 8, 254, 35, 221, 175, 50, 236, 8, 254, 35, 54, 111, 236, 8, 254, 35, + 54, 105, 236, 8, 254, 35, 54, 158, 236, 8, 254, 35, 54, 216, 248, 236, 8, + 254, 35, 54, 215, 73, 236, 8, 254, 35, 54, 123, 240, 217, 236, 8, 254, + 35, 54, 123, 216, 148, 236, 8, 254, 35, 54, 216, 249, 216, 148, 225, 122, + 1, 254, 174, 225, 122, 1, 252, 36, 225, 122, 1, 243, 116, 225, 122, 1, + 248, 64, 225, 122, 1, 241, 245, 225, 122, 1, 212, 37, 225, 122, 1, 210, + 110, 225, 122, 1, 241, 204, 225, 122, 1, 216, 231, 225, 122, 1, 210, 233, + 225, 122, 1, 235, 0, 225, 122, 1, 233, 105, 225, 122, 1, 231, 70, 225, + 122, 1, 227, 198, 225, 122, 1, 220, 146, 225, 122, 1, 254, 205, 225, 122, + 1, 225, 224, 225, 122, 1, 222, 27, 225, 122, 1, 224, 42, 225, 122, 1, + 222, 191, 225, 122, 1, 220, 22, 225, 122, 1, 217, 42, 225, 122, 54, 111, + 225, 122, 54, 216, 248, 225, 122, 54, 215, 73, 225, 122, 54, 123, 240, + 217, 225, 122, 54, 105, 225, 122, 54, 158, 225, 122, 211, 209, 220, 139, + 232, 64, 1, 61, 232, 64, 1, 253, 166, 232, 64, 1, 243, 209, 232, 64, 1, + 249, 68, 232, 64, 1, 76, 232, 64, 1, 214, 105, 232, 64, 1, 74, 232, 64, + 1, 211, 117, 232, 64, 1, 235, 29, 232, 64, 1, 156, 232, 64, 1, 194, 232, + 64, 1, 230, 30, 232, 64, 1, 78, 232, 64, 1, 153, 232, 64, 1, 218, 228, + 232, 64, 1, 217, 153, 232, 64, 1, 69, 232, 64, 1, 245, 14, 232, 64, 1, + 224, 99, 232, 64, 1, 222, 93, 232, 64, 1, 215, 160, 232, 64, 1, 254, 131, + 232, 64, 1, 245, 158, 232, 64, 1, 232, 67, 232, 64, 1, 228, 116, 232, 64, + 1, 251, 74, 232, 64, 215, 223, 79, 231, 53, 241, 181, 1, 61, 231, 53, + 241, 181, 1, 76, 231, 53, 241, 181, 1, 74, 231, 53, 241, 181, 1, 78, 231, + 53, 241, 181, 1, 192, 231, 53, 241, 181, 1, 212, 65, 231, 53, 241, 181, + 1, 252, 199, 231, 53, 241, 181, 1, 252, 198, 231, 53, 241, 181, 1, 191, + 231, 53, 241, 181, 1, 186, 231, 53, 241, 181, 1, 198, 231, 53, 241, 181, + 1, 229, 233, 231, 53, 241, 181, 1, 229, 112, 231, 53, 241, 181, 1, 229, + 111, 231, 53, 241, 181, 1, 205, 231, 53, 241, 181, 1, 223, 190, 231, 53, + 241, 181, 1, 233, 141, 231, 53, 241, 181, 1, 234, 138, 231, 53, 241, 181, + 1, 241, 196, 231, 53, 241, 181, 1, 206, 231, 53, 241, 181, 1, 222, 35, + 231, 53, 241, 181, 1, 221, 183, 231, 53, 241, 181, 1, 176, 231, 53, 241, + 181, 1, 224, 91, 231, 53, 241, 181, 1, 217, 106, 231, 53, 241, 181, 1, + 217, 105, 231, 53, 241, 181, 1, 217, 23, 231, 53, 241, 181, 1, 217, 22, + 231, 53, 241, 181, 1, 112, 231, 53, 241, 181, 1, 248, 229, 231, 53, 241, + 181, 16, 213, 170, 231, 53, 241, 181, 16, 213, 169, 231, 53, 249, 102, 1, + 61, 231, 53, 249, 102, 1, 76, 231, 53, 249, 102, 1, 74, 231, 53, 249, + 102, 1, 78, 231, 53, 249, 102, 1, 192, 231, 53, 249, 102, 1, 212, 65, + 231, 53, 249, 102, 1, 252, 199, 231, 53, 249, 102, 1, 191, 231, 53, 249, + 102, 1, 186, 231, 53, 249, 102, 1, 198, 231, 53, 249, 102, 1, 229, 112, + 231, 53, 249, 102, 1, 205, 231, 53, 249, 102, 1, 233, 141, 231, 53, 249, + 102, 1, 234, 138, 231, 53, 249, 102, 1, 241, 196, 231, 53, 249, 102, 1, + 206, 231, 53, 249, 102, 1, 254, 31, 206, 231, 53, 249, 102, 1, 221, 183, + 231, 53, 249, 102, 1, 176, 231, 53, 249, 102, 1, 224, 91, 231, 53, 249, + 102, 1, 217, 106, 231, 53, 249, 102, 1, 217, 23, 231, 53, 249, 102, 1, + 112, 231, 53, 249, 102, 1, 248, 229, 231, 53, 249, 102, 232, 151, 222, + 219, 231, 53, 249, 102, 232, 151, 236, 13, 234, 126, 1, 61, 234, 126, 25, + 5, 74, 234, 126, 25, 5, 69, 234, 126, 25, 5, 149, 153, 234, 126, 25, 5, + 76, 234, 126, 25, 5, 78, 234, 126, 25, 233, 29, 79, 234, 126, 5, 52, 222, + 237, 51, 234, 126, 5, 254, 83, 234, 126, 5, 213, 147, 234, 126, 1, 176, + 234, 126, 1, 234, 138, 234, 126, 1, 243, 142, 234, 126, 1, 243, 0, 234, + 126, 1, 251, 41, 234, 126, 1, 250, 165, 234, 126, 1, 235, 147, 234, 126, + 1, 227, 169, 234, 126, 1, 215, 157, 234, 126, 1, 215, 145, 234, 126, 1, + 248, 143, 234, 126, 1, 248, 127, 234, 126, 1, 228, 115, 234, 126, 1, 217, + 106, 234, 126, 1, 216, 209, 234, 126, 1, 248, 229, 234, 126, 1, 248, 33, + 234, 126, 1, 198, 234, 126, 1, 191, 234, 126, 1, 225, 150, 234, 126, 1, + 252, 199, 234, 126, 1, 252, 26, 234, 126, 1, 186, 234, 126, 1, 192, 234, + 126, 1, 205, 234, 126, 1, 233, 141, 234, 126, 1, 214, 27, 234, 126, 1, + 220, 104, 234, 126, 1, 218, 225, 234, 126, 1, 206, 234, 126, 1, 210, 116, + 234, 126, 1, 162, 234, 126, 1, 234, 52, 234, 126, 1, 215, 125, 234, 126, + 5, 252, 149, 48, 234, 126, 5, 250, 229, 234, 126, 5, 59, 51, 234, 126, + 213, 152, 234, 126, 21, 111, 234, 126, 21, 105, 234, 126, 21, 158, 234, + 126, 21, 161, 234, 126, 54, 216, 248, 234, 126, 54, 215, 73, 234, 126, + 54, 123, 240, 217, 234, 126, 54, 123, 216, 148, 234, 126, 224, 144, 247, + 128, 234, 126, 224, 144, 4, 250, 43, 234, 126, 224, 144, 250, 43, 234, + 126, 224, 144, 249, 145, 130, 234, 126, 224, 144, 231, 185, 234, 126, + 224, 144, 232, 121, 234, 126, 224, 144, 248, 186, 234, 126, 224, 144, 52, + 248, 186, 234, 126, 224, 144, 232, 213, 55, 219, 30, 254, 46, 1, 241, + 245, 55, 219, 30, 254, 46, 1, 233, 99, 55, 219, 30, 254, 46, 1, 241, 202, + 55, 219, 30, 254, 46, 1, 231, 70, 55, 219, 30, 254, 46, 1, 224, 37, 55, + 219, 30, 254, 46, 1, 212, 30, 55, 219, 30, 254, 46, 1, 220, 22, 55, 219, + 30, 254, 46, 1, 223, 70, 55, 219, 30, 254, 46, 1, 252, 33, 55, 219, 30, + 254, 46, 1, 217, 37, 55, 219, 30, 254, 46, 1, 221, 228, 55, 219, 30, 254, + 46, 1, 234, 231, 55, 219, 30, 254, 46, 1, 227, 198, 55, 219, 30, 254, 46, + 1, 234, 122, 55, 219, 30, 254, 46, 1, 222, 26, 55, 219, 30, 254, 46, 1, + 221, 251, 55, 219, 30, 254, 46, 1, 244, 162, 55, 219, 30, 254, 46, 1, + 254, 179, 55, 219, 30, 254, 46, 1, 253, 169, 55, 219, 30, 254, 46, 1, + 248, 30, 55, 219, 30, 254, 46, 1, 242, 208, 55, 219, 30, 254, 46, 1, 248, + 196, 55, 219, 30, 254, 46, 1, 242, 245, 55, 219, 30, 254, 46, 1, 216, + 227, 55, 219, 30, 254, 46, 1, 210, 96, 55, 219, 30, 254, 46, 1, 248, 27, + 55, 219, 30, 254, 46, 1, 210, 232, 55, 219, 30, 254, 46, 1, 216, 198, 55, + 219, 30, 254, 46, 1, 216, 179, 55, 219, 30, 254, 46, 54, 111, 55, 219, + 30, 254, 46, 54, 244, 122, 55, 219, 30, 254, 46, 132, 235, 245, 253, 180, + 1, 61, 253, 180, 1, 255, 82, 253, 180, 1, 254, 81, 253, 180, 1, 255, 41, + 253, 180, 1, 254, 131, 253, 180, 1, 255, 42, 253, 180, 1, 254, 252, 253, + 180, 1, 254, 248, 253, 180, 1, 76, 253, 180, 1, 245, 217, 253, 180, 1, + 78, 253, 180, 1, 226, 187, 253, 180, 1, 74, 253, 180, 1, 236, 40, 253, + 180, 1, 69, 253, 180, 1, 214, 118, 253, 180, 1, 234, 188, 253, 180, 1, + 211, 162, 253, 180, 1, 211, 128, 253, 180, 1, 211, 137, 253, 180, 1, 243, + 69, 253, 180, 1, 243, 31, 253, 180, 1, 242, 243, 253, 180, 1, 250, 198, + 253, 180, 1, 235, 132, 253, 180, 1, 217, 23, 253, 180, 1, 216, 196, 253, + 180, 1, 248, 98, 253, 180, 1, 248, 25, 253, 180, 1, 215, 152, 253, 180, + 1, 225, 224, 253, 180, 1, 244, 162, 253, 180, 1, 252, 83, 253, 180, 1, + 252, 22, 253, 180, 1, 229, 69, 253, 180, 1, 228, 244, 253, 180, 1, 228, + 245, 253, 180, 1, 229, 112, 253, 180, 1, 227, 160, 253, 180, 1, 228, 110, + 253, 180, 1, 231, 96, 253, 180, 1, 241, 123, 253, 180, 1, 210, 166, 253, + 180, 1, 211, 47, 253, 180, 1, 213, 255, 253, 180, 1, 223, 131, 253, 180, + 1, 233, 64, 253, 180, 1, 221, 183, 253, 180, 1, 210, 94, 253, 180, 1, + 220, 65, 253, 180, 1, 210, 74, 253, 180, 1, 219, 200, 253, 180, 1, 218, + 195, 253, 180, 1, 241, 245, 253, 180, 255, 30, 79, 216, 80, 113, 170, + 115, 123, 59, 224, 143, 4, 113, 170, 115, 123, 59, 224, 143, 233, 91, + 113, 170, 115, 123, 59, 224, 143, 233, 91, 123, 59, 115, 113, 170, 224, + 143, 233, 91, 113, 222, 235, 115, 123, 222, 237, 224, 143, 233, 91, 123, + 222, 237, 115, 113, 222, 235, 224, 143, 235, 225, 226, 2, 1, 254, 177, + 235, 225, 226, 2, 1, 252, 33, 235, 225, 226, 2, 1, 242, 208, 235, 225, + 226, 2, 1, 248, 196, 235, 225, 226, 2, 1, 241, 245, 235, 225, 226, 2, 1, + 212, 30, 235, 225, 226, 2, 1, 210, 97, 235, 225, 226, 2, 1, 241, 202, + 235, 225, 226, 2, 1, 216, 227, 235, 225, 226, 2, 1, 210, 232, 235, 225, + 226, 2, 1, 234, 231, 235, 225, 226, 2, 1, 233, 99, 235, 225, 226, 2, 1, + 231, 70, 235, 225, 226, 2, 1, 227, 198, 235, 225, 226, 2, 1, 221, 251, + 235, 225, 226, 2, 1, 253, 170, 235, 225, 226, 2, 1, 225, 224, 235, 225, + 226, 2, 1, 222, 26, 235, 225, 226, 2, 1, 224, 37, 235, 225, 226, 2, 1, + 223, 70, 235, 225, 226, 2, 1, 220, 22, 235, 225, 226, 2, 1, 217, 37, 235, + 225, 226, 2, 54, 111, 235, 225, 226, 2, 54, 105, 235, 225, 226, 2, 54, + 158, 235, 225, 226, 2, 54, 161, 235, 225, 226, 2, 54, 216, 248, 235, 225, + 226, 2, 54, 215, 73, 235, 225, 226, 2, 54, 123, 240, 217, 235, 225, 226, + 2, 54, 123, 216, 148, 235, 225, 226, 76, 1, 254, 177, 235, 225, 226, 76, + 1, 252, 33, 235, 225, 226, 76, 1, 242, 208, 235, 225, 226, 76, 1, 248, + 196, 235, 225, 226, 76, 1, 241, 245, 235, 225, 226, 76, 1, 212, 29, 235, + 225, 226, 76, 1, 210, 97, 235, 225, 226, 76, 1, 241, 202, 235, 225, 226, + 76, 1, 216, 227, 235, 225, 226, 76, 1, 210, 232, 235, 225, 226, 76, 1, + 234, 231, 235, 225, 226, 76, 1, 233, 99, 235, 225, 226, 76, 1, 231, 69, + 235, 225, 226, 76, 1, 227, 198, 235, 225, 226, 76, 1, 221, 251, 235, 225, + 226, 76, 1, 225, 224, 235, 225, 226, 76, 1, 222, 26, 235, 225, 226, 76, + 1, 220, 22, 235, 225, 226, 76, 1, 217, 37, 235, 225, 226, 76, 54, 111, + 235, 225, 226, 76, 54, 105, 235, 225, 226, 76, 54, 158, 235, 225, 226, + 76, 54, 161, 235, 225, 226, 76, 54, 216, 248, 235, 225, 226, 76, 54, 215, + 73, 235, 225, 226, 76, 54, 123, 240, 217, 235, 225, 226, 76, 54, 123, + 216, 148, 55, 202, 1, 226, 153, 61, 55, 202, 1, 211, 37, 61, 55, 202, 1, + 211, 37, 254, 252, 55, 202, 1, 226, 153, 74, 55, 202, 1, 211, 37, 74, 55, + 202, 1, 211, 37, 76, 55, 202, 1, 226, 153, 78, 55, 202, 1, 226, 153, 226, + 238, 55, 202, 1, 211, 37, 226, 238, 55, 202, 1, 226, 153, 255, 34, 55, + 202, 1, 211, 37, 255, 34, 55, 202, 1, 226, 153, 254, 251, 55, 202, 1, + 211, 37, 254, 251, 55, 202, 1, 226, 153, 254, 225, 55, 202, 1, 211, 37, + 254, 225, 55, 202, 1, 226, 153, 254, 246, 55, 202, 1, 211, 37, 254, 246, + 55, 202, 1, 226, 153, 255, 8, 55, 202, 1, 211, 37, 255, 8, 55, 202, 1, + 226, 153, 254, 250, 55, 202, 1, 226, 153, 245, 20, 55, 202, 1, 211, 37, + 245, 20, 55, 202, 1, 226, 153, 253, 175, 55, 202, 1, 211, 37, 253, 175, + 55, 202, 1, 226, 153, 254, 233, 55, 202, 1, 211, 37, 254, 233, 55, 202, + 1, 226, 153, 254, 244, 55, 202, 1, 211, 37, 254, 244, 55, 202, 1, 226, + 153, 226, 237, 55, 202, 1, 211, 37, 226, 237, 55, 202, 1, 226, 153, 254, + 187, 55, 202, 1, 211, 37, 254, 187, 55, 202, 1, 226, 153, 254, 243, 55, + 202, 1, 226, 153, 245, 169, 55, 202, 1, 226, 153, 245, 167, 55, 202, 1, + 226, 153, 254, 131, 55, 202, 1, 226, 153, 254, 241, 55, 202, 1, 211, 37, + 254, 241, 55, 202, 1, 226, 153, 245, 139, 55, 202, 1, 211, 37, 245, 139, + 55, 202, 1, 226, 153, 245, 155, 55, 202, 1, 211, 37, 245, 155, 55, 202, + 1, 226, 153, 245, 126, 55, 202, 1, 211, 37, 245, 126, 55, 202, 1, 211, + 37, 254, 123, 55, 202, 1, 226, 153, 245, 146, 55, 202, 1, 211, 37, 254, + 240, 55, 202, 1, 226, 153, 245, 116, 55, 202, 1, 226, 153, 226, 179, 55, + 202, 1, 226, 153, 240, 120, 55, 202, 1, 226, 153, 245, 223, 55, 202, 1, + 211, 37, 245, 223, 55, 202, 1, 226, 153, 254, 53, 55, 202, 1, 211, 37, + 254, 53, 55, 202, 1, 226, 153, 235, 188, 55, 202, 1, 211, 37, 235, 188, + 55, 202, 1, 226, 153, 226, 163, 55, 202, 1, 211, 37, 226, 163, 55, 202, + 1, 226, 153, 254, 49, 55, 202, 1, 211, 37, 254, 49, 55, 202, 1, 226, 153, + 254, 239, 55, 202, 1, 226, 153, 253, 245, 55, 202, 1, 226, 153, 254, 237, + 55, 202, 1, 226, 153, 253, 239, 55, 202, 1, 211, 37, 253, 239, 55, 202, + 1, 226, 153, 245, 83, 55, 202, 1, 211, 37, 245, 83, 55, 202, 1, 226, 153, + 253, 214, 55, 202, 1, 211, 37, 253, 214, 55, 202, 1, 226, 153, 254, 234, + 55, 202, 1, 211, 37, 254, 234, 55, 202, 1, 226, 153, 226, 144, 55, 202, + 1, 226, 153, 252, 133, 222, 129, 21, 111, 222, 129, 21, 105, 222, 129, + 21, 158, 222, 129, 21, 161, 222, 129, 21, 190, 222, 129, 21, 195, 222, + 129, 21, 199, 222, 129, 21, 196, 222, 129, 21, 201, 222, 129, 54, 216, + 248, 222, 129, 54, 215, 73, 222, 129, 54, 216, 163, 222, 129, 54, 244, + 23, 222, 129, 54, 244, 122, 222, 129, 54, 219, 113, 222, 129, 54, 220, + 118, 222, 129, 54, 245, 192, 222, 129, 54, 228, 200, 222, 129, 54, 123, + 240, 217, 222, 129, 54, 113, 240, 217, 222, 129, 54, 134, 240, 217, 222, + 129, 54, 244, 19, 240, 217, 222, 129, 54, 244, 89, 240, 217, 222, 129, + 54, 219, 127, 240, 217, 222, 129, 54, 220, 124, 240, 217, 222, 129, 54, + 245, 201, 240, 217, 222, 129, 54, 228, 205, 240, 217, 222, 129, 244, 10, + 123, 242, 34, 222, 129, 244, 10, 123, 224, 24, 222, 129, 244, 10, 123, + 216, 169, 222, 129, 244, 10, 113, 216, 167, 118, 5, 251, 7, 118, 5, 254, + 83, 118, 5, 213, 147, 118, 5, 235, 108, 118, 5, 214, 161, 118, 1, 61, + 118, 1, 255, 82, 118, 1, 74, 118, 1, 236, 40, 118, 1, 69, 118, 1, 214, + 118, 118, 1, 149, 153, 118, 1, 149, 222, 182, 118, 1, 149, 156, 118, 1, + 149, 232, 191, 118, 1, 76, 118, 1, 254, 210, 118, 1, 78, 118, 1, 253, + 200, 118, 1, 176, 118, 1, 234, 138, 118, 1, 243, 142, 118, 1, 243, 0, + 118, 1, 229, 82, 118, 1, 251, 41, 118, 1, 250, 165, 118, 1, 235, 147, + 118, 1, 235, 120, 118, 1, 227, 169, 118, 1, 215, 157, 118, 1, 215, 145, + 118, 1, 248, 143, 118, 1, 248, 127, 118, 1, 228, 115, 118, 1, 217, 106, + 118, 1, 216, 209, 118, 1, 248, 229, 118, 1, 248, 33, 118, 1, 198, 118, 1, + 191, 118, 1, 225, 150, 118, 1, 252, 199, 118, 1, 252, 26, 118, 1, 186, + 118, 1, 192, 118, 1, 205, 118, 1, 233, 141, 118, 1, 214, 27, 118, 1, 220, + 104, 118, 1, 218, 225, 118, 1, 206, 118, 1, 162, 118, 1, 232, 190, 118, + 1, 55, 36, 232, 181, 118, 1, 55, 36, 222, 181, 118, 1, 55, 36, 228, 97, + 118, 25, 5, 255, 82, 118, 25, 5, 252, 23, 255, 82, 118, 25, 5, 74, 118, + 25, 5, 236, 40, 118, 25, 5, 69, 118, 25, 5, 214, 118, 118, 25, 5, 149, + 153, 118, 25, 5, 149, 222, 182, 118, 25, 5, 149, 156, 118, 25, 5, 149, + 232, 191, 118, 25, 5, 76, 118, 25, 5, 254, 210, 118, 25, 5, 78, 118, 25, + 5, 253, 200, 118, 213, 152, 118, 248, 186, 118, 52, 248, 186, 118, 224, + 144, 247, 128, 118, 224, 144, 52, 247, 128, 118, 224, 144, 232, 219, 118, + 224, 144, 249, 145, 130, 118, 224, 144, 232, 121, 118, 54, 111, 118, 54, + 105, 118, 54, 158, 118, 54, 161, 118, 54, 190, 118, 54, 195, 118, 54, + 199, 118, 54, 196, 118, 54, 201, 118, 54, 216, 248, 118, 54, 215, 73, + 118, 54, 216, 163, 118, 54, 244, 23, 118, 54, 244, 122, 118, 54, 219, + 113, 118, 54, 220, 118, 118, 54, 245, 192, 118, 54, 228, 200, 118, 54, + 123, 240, 217, 118, 54, 123, 216, 148, 118, 21, 210, 86, 118, 21, 111, + 118, 21, 105, 118, 21, 158, 118, 21, 161, 118, 21, 190, 118, 21, 195, + 118, 21, 199, 118, 21, 196, 118, 21, 201, 234, 250, 5, 251, 7, 234, 250, + 5, 254, 83, 234, 250, 5, 213, 147, 234, 250, 1, 61, 234, 250, 1, 255, 82, + 234, 250, 1, 74, 234, 250, 1, 236, 40, 234, 250, 1, 69, 234, 250, 1, 214, + 118, 234, 250, 1, 76, 234, 250, 1, 254, 210, 234, 250, 1, 78, 234, 250, + 1, 253, 200, 234, 250, 1, 176, 234, 250, 1, 234, 138, 234, 250, 1, 243, + 142, 234, 250, 1, 243, 0, 234, 250, 1, 229, 82, 234, 250, 1, 251, 41, + 234, 250, 1, 250, 165, 234, 250, 1, 235, 147, 234, 250, 1, 235, 120, 234, + 250, 1, 227, 169, 234, 250, 1, 215, 157, 234, 250, 1, 215, 145, 234, 250, + 1, 248, 143, 234, 250, 1, 248, 132, 234, 250, 1, 248, 127, 234, 250, 1, + 223, 42, 234, 250, 1, 228, 115, 234, 250, 1, 217, 106, 234, 250, 1, 216, + 209, 234, 250, 1, 248, 229, 234, 250, 1, 248, 33, 234, 250, 1, 198, 234, + 250, 1, 191, 234, 250, 1, 225, 150, 234, 250, 1, 252, 199, 234, 250, 1, + 252, 26, 234, 250, 1, 186, 234, 250, 1, 192, 234, 250, 1, 205, 234, 250, + 1, 233, 141, 234, 250, 1, 214, 27, 234, 250, 1, 220, 104, 234, 250, 1, + 218, 225, 234, 250, 1, 206, 234, 250, 1, 162, 234, 250, 25, 5, 255, 82, + 234, 250, 25, 5, 74, 234, 250, 25, 5, 236, 40, 234, 250, 25, 5, 69, 234, + 250, 25, 5, 214, 118, 234, 250, 25, 5, 76, 234, 250, 25, 5, 254, 210, + 234, 250, 25, 5, 78, 234, 250, 25, 5, 253, 200, 234, 250, 5, 213, 152, + 234, 250, 5, 227, 209, 234, 250, 255, 30, 50, 234, 250, 245, 129, 50, + 234, 250, 54, 50, 234, 250, 221, 175, 79, 234, 250, 52, 221, 175, 79, + 234, 250, 248, 186, 234, 250, 52, 248, 186, 219, 38, 219, 46, 1, 222, 20, + 219, 38, 219, 46, 1, 217, 81, 219, 38, 219, 46, 1, 252, 176, 219, 38, + 219, 46, 1, 251, 31, 219, 38, 219, 46, 1, 248, 211, 219, 38, 219, 46, 1, + 243, 127, 219, 38, 219, 46, 1, 231, 215, 219, 38, 219, 46, 1, 229, 79, + 219, 38, 219, 46, 1, 233, 118, 219, 38, 219, 46, 1, 229, 218, 219, 38, + 219, 46, 1, 214, 24, 219, 38, 219, 46, 1, 226, 77, 219, 38, 219, 46, 1, + 211, 84, 219, 38, 219, 46, 1, 223, 171, 219, 38, 219, 46, 1, 242, 44, + 219, 38, 219, 46, 1, 234, 254, 219, 38, 219, 46, 1, 235, 142, 219, 38, + 219, 46, 1, 227, 166, 219, 38, 219, 46, 1, 254, 218, 219, 38, 219, 46, 1, + 245, 215, 219, 38, 219, 46, 1, 236, 41, 219, 38, 219, 46, 1, 214, 208, + 219, 38, 219, 46, 1, 226, 226, 219, 38, 219, 46, 1, 245, 205, 219, 38, + 219, 46, 1, 231, 228, 219, 38, 219, 46, 21, 210, 86, 219, 38, 219, 46, + 21, 111, 219, 38, 219, 46, 21, 105, 219, 38, 219, 46, 21, 158, 219, 38, + 219, 46, 21, 161, 219, 38, 219, 46, 21, 190, 219, 38, 219, 46, 21, 195, + 219, 38, 219, 46, 21, 199, 219, 38, 219, 46, 21, 196, 219, 38, 219, 46, + 21, 201, 250, 159, 5, 251, 7, 250, 159, 5, 254, 83, 250, 159, 5, 213, + 147, 250, 159, 1, 255, 82, 250, 159, 1, 74, 250, 159, 1, 69, 250, 159, 1, + 76, 250, 159, 1, 235, 16, 250, 159, 1, 234, 137, 250, 159, 1, 243, 139, + 250, 159, 1, 242, 255, 250, 159, 1, 229, 81, 250, 159, 1, 251, 40, 250, + 159, 1, 250, 164, 250, 159, 1, 235, 146, 250, 159, 1, 235, 119, 250, 159, + 1, 227, 168, 250, 159, 1, 215, 156, 250, 159, 1, 215, 144, 250, 159, 1, + 248, 142, 250, 159, 1, 248, 126, 250, 159, 1, 228, 114, 250, 159, 1, 217, + 102, 250, 159, 1, 216, 208, 250, 159, 1, 248, 228, 250, 159, 1, 248, 32, + 250, 159, 1, 229, 230, 250, 159, 1, 226, 93, 250, 159, 1, 225, 149, 250, + 159, 1, 252, 197, 250, 159, 1, 252, 25, 250, 159, 1, 231, 242, 250, 159, + 1, 210, 167, 250, 159, 1, 211, 103, 250, 159, 1, 223, 187, 250, 159, 1, + 233, 140, 250, 159, 1, 212, 64, 250, 159, 1, 222, 33, 250, 159, 1, 242, + 53, 250, 159, 25, 5, 61, 250, 159, 25, 5, 74, 250, 159, 25, 5, 236, 40, + 250, 159, 25, 5, 69, 250, 159, 25, 5, 214, 118, 250, 159, 25, 5, 76, 250, + 159, 25, 5, 254, 210, 250, 159, 25, 5, 78, 250, 159, 25, 5, 253, 200, + 250, 159, 25, 5, 226, 223, 250, 159, 144, 79, 250, 159, 253, 201, 79, + 250, 159, 213, 152, 250, 159, 231, 240, 250, 159, 21, 210, 86, 250, 159, + 21, 111, 250, 159, 21, 105, 250, 159, 21, 158, 250, 159, 21, 161, 250, + 159, 21, 190, 250, 159, 21, 195, 250, 159, 21, 199, 250, 159, 21, 196, + 250, 159, 21, 201, 250, 159, 221, 175, 79, 250, 159, 248, 186, 250, 159, + 52, 248, 186, 250, 159, 224, 16, 79, 174, 5, 251, 7, 174, 5, 254, 83, + 174, 5, 213, 147, 174, 1, 61, 174, 1, 255, 82, 174, 1, 74, 174, 1, 236, + 40, 174, 1, 69, 174, 1, 214, 118, 174, 1, 149, 153, 174, 1, 149, 222, + 182, 174, 1, 149, 156, 174, 1, 149, 232, 191, 174, 1, 76, 174, 1, 254, + 210, 174, 1, 78, 174, 1, 253, 200, 174, 1, 176, 174, 1, 234, 138, 174, 1, + 243, 142, 174, 1, 243, 0, 174, 1, 229, 82, 174, 1, 251, 41, 174, 1, 250, + 165, 174, 1, 235, 147, 174, 1, 235, 120, 174, 1, 227, 169, 174, 1, 215, + 157, 174, 1, 215, 145, 174, 1, 248, 143, 174, 1, 248, 127, 174, 1, 228, + 115, 174, 1, 217, 106, 174, 1, 216, 209, 174, 1, 248, 229, 174, 1, 248, + 33, 174, 1, 198, 174, 1, 191, 174, 1, 225, 150, 174, 1, 252, 199, 174, 1, + 252, 26, 174, 1, 186, 174, 1, 192, 174, 1, 205, 174, 1, 233, 141, 174, 1, + 232, 190, 174, 1, 214, 27, 174, 1, 220, 104, 174, 1, 218, 225, 174, 1, + 206, 174, 1, 162, 174, 25, 5, 255, 82, 174, 25, 5, 74, 174, 25, 5, 236, + 40, 174, 25, 5, 69, 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, + 5, 149, 222, 182, 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 191, 174, + 25, 5, 76, 174, 25, 5, 254, 210, 174, 25, 5, 78, 174, 25, 5, 253, 200, + 174, 5, 213, 152, 174, 5, 253, 183, 174, 5, 235, 108, 174, 5, 214, 161, + 174, 226, 208, 174, 248, 186, 174, 52, 248, 186, 174, 255, 30, 50, 174, + 220, 139, 174, 21, 210, 86, 174, 21, 111, 174, 21, 105, 174, 21, 158, + 174, 21, 161, 174, 21, 190, 174, 21, 195, 174, 21, 199, 174, 21, 196, + 174, 21, 201, 217, 70, 1, 61, 217, 70, 1, 255, 82, 217, 70, 1, 74, 217, + 70, 1, 236, 40, 217, 70, 1, 69, 217, 70, 1, 214, 118, 217, 70, 1, 76, + 217, 70, 1, 254, 210, 217, 70, 1, 78, 217, 70, 1, 253, 200, 217, 70, 1, + 176, 217, 70, 1, 234, 138, 217, 70, 1, 243, 142, 217, 70, 1, 243, 0, 217, + 70, 1, 229, 82, 217, 70, 1, 251, 41, 217, 70, 1, 250, 165, 217, 70, 1, + 235, 147, 217, 70, 1, 235, 120, 217, 70, 1, 227, 169, 217, 70, 1, 215, + 157, 217, 70, 1, 215, 145, 217, 70, 1, 248, 143, 217, 70, 1, 248, 127, + 217, 70, 1, 228, 115, 217, 70, 1, 217, 106, 217, 70, 1, 216, 209, 217, + 70, 1, 248, 229, 217, 70, 1, 248, 33, 217, 70, 1, 198, 217, 70, 1, 191, + 217, 70, 1, 225, 150, 217, 70, 1, 252, 199, 217, 70, 1, 252, 26, 217, 70, + 1, 186, 217, 70, 1, 192, 217, 70, 1, 205, 217, 70, 1, 233, 141, 217, 70, + 1, 214, 27, 217, 70, 1, 220, 104, 217, 70, 1, 206, 217, 70, 1, 162, 217, + 70, 1, 222, 181, 217, 70, 5, 254, 83, 217, 70, 5, 213, 147, 217, 70, 25, + 5, 255, 82, 217, 70, 25, 5, 74, 217, 70, 25, 5, 236, 40, 217, 70, 25, 5, + 69, 217, 70, 25, 5, 214, 118, 217, 70, 25, 5, 76, 217, 70, 25, 5, 254, + 210, 217, 70, 25, 5, 78, 217, 70, 25, 5, 253, 200, 217, 70, 5, 213, 152, + 217, 70, 5, 227, 209, 217, 70, 21, 210, 86, 217, 70, 21, 111, 217, 70, + 21, 105, 217, 70, 21, 158, 217, 70, 21, 161, 217, 70, 21, 190, 217, 70, + 21, 195, 217, 70, 21, 199, 217, 70, 21, 196, 217, 70, 21, 201, 15, 5, 61, + 15, 5, 116, 30, 61, 15, 5, 116, 30, 252, 184, 15, 5, 116, 30, 243, 112, + 216, 240, 15, 5, 116, 30, 162, 15, 5, 116, 30, 236, 42, 15, 5, 116, 30, + 233, 122, 242, 101, 15, 5, 116, 30, 230, 66, 15, 5, 116, 30, 222, 23, 15, + 5, 255, 84, 15, 5, 255, 34, 15, 5, 255, 35, 30, 253, 237, 15, 5, 255, 35, + 30, 246, 75, 242, 101, 15, 5, 255, 35, 30, 243, 125, 15, 5, 255, 35, 30, + 243, 112, 216, 240, 15, 5, 255, 35, 30, 162, 15, 5, 255, 35, 30, 236, 43, + 242, 101, 15, 5, 255, 35, 30, 236, 16, 15, 5, 255, 35, 30, 233, 123, 15, + 5, 255, 35, 30, 220, 50, 15, 5, 255, 35, 30, 104, 96, 104, 96, 69, 15, 5, + 255, 35, 242, 101, 15, 5, 255, 32, 15, 5, 255, 33, 30, 252, 168, 15, 5, + 255, 33, 30, 243, 112, 216, 240, 15, 5, 255, 33, 30, 231, 97, 96, 245, + 158, 15, 5, 255, 33, 30, 220, 102, 15, 5, 255, 33, 30, 217, 73, 15, 5, + 255, 8, 15, 5, 254, 195, 15, 5, 254, 196, 30, 245, 95, 15, 5, 254, 196, + 30, 220, 12, 96, 242, 197, 15, 5, 254, 187, 15, 5, 254, 188, 30, 254, + 187, 15, 5, 254, 188, 30, 247, 224, 15, 5, 254, 188, 30, 242, 197, 15, 5, + 254, 188, 30, 162, 15, 5, 254, 188, 30, 235, 5, 15, 5, 254, 188, 30, 234, + 98, 15, 5, 254, 188, 30, 220, 65, 15, 5, 254, 188, 30, 214, 126, 15, 5, + 254, 184, 15, 5, 254, 177, 15, 5, 254, 140, 15, 5, 254, 141, 30, 220, 65, + 15, 5, 254, 131, 15, 5, 254, 132, 115, 254, 131, 15, 5, 254, 132, 134, + 216, 86, 15, 5, 254, 132, 96, 229, 222, 226, 168, 254, 132, 96, 229, 221, + 15, 5, 254, 132, 96, 229, 222, 218, 235, 15, 5, 254, 102, 15, 5, 254, 75, + 15, 5, 254, 43, 15, 5, 254, 44, 30, 233, 202, 15, 5, 254, 16, 15, 5, 253, + 244, 15, 5, 253, 239, 15, 5, 253, 240, 210, 40, 216, 240, 15, 5, 253, + 240, 235, 9, 216, 240, 15, 5, 253, 240, 115, 253, 240, 215, 115, 115, + 215, 115, 215, 115, 115, 215, 115, 226, 25, 15, 5, 253, 240, 115, 253, + 240, 115, 253, 239, 15, 5, 253, 240, 115, 253, 240, 115, 253, 240, 249, + 133, 253, 240, 115, 253, 240, 115, 253, 239, 15, 5, 253, 237, 15, 5, 253, + 234, 15, 5, 252, 199, 15, 5, 252, 184, 15, 5, 252, 179, 15, 5, 252, 175, + 15, 5, 252, 169, 15, 5, 252, 170, 115, 252, 169, 15, 5, 252, 168, 15, 5, + 130, 15, 5, 252, 148, 15, 5, 252, 14, 15, 5, 252, 15, 30, 61, 15, 5, 252, + 15, 30, 243, 103, 15, 5, 252, 15, 30, 236, 43, 242, 101, 15, 5, 251, 133, + 15, 5, 251, 134, 115, 251, 134, 255, 34, 15, 5, 251, 134, 115, 251, 134, + 214, 190, 15, 5, 251, 134, 249, 133, 251, 133, 15, 5, 251, 117, 15, 5, + 251, 118, 115, 251, 117, 15, 5, 251, 106, 15, 5, 251, 105, 15, 5, 248, + 229, 15, 5, 248, 220, 15, 5, 248, 221, 234, 72, 30, 116, 96, 231, 152, + 15, 5, 248, 221, 234, 72, 30, 254, 140, 15, 5, 248, 221, 234, 72, 30, + 252, 168, 15, 5, 248, 221, 234, 72, 30, 252, 14, 15, 5, 248, 221, 234, + 72, 30, 243, 142, 15, 5, 248, 221, 234, 72, 30, 243, 143, 96, 231, 152, + 15, 5, 248, 221, 234, 72, 30, 242, 221, 15, 5, 248, 221, 234, 72, 30, + 242, 204, 15, 5, 248, 221, 234, 72, 30, 242, 110, 15, 5, 248, 221, 234, + 72, 30, 162, 15, 5, 248, 221, 234, 72, 30, 235, 186, 15, 5, 248, 221, + 234, 72, 30, 235, 187, 96, 232, 103, 15, 5, 248, 221, 234, 72, 30, 234, + 248, 15, 5, 248, 221, 234, 72, 30, 233, 141, 15, 5, 248, 221, 234, 72, + 30, 232, 103, 15, 5, 248, 221, 234, 72, 30, 232, 104, 96, 231, 151, 15, + 5, 248, 221, 234, 72, 30, 232, 89, 15, 5, 248, 221, 234, 72, 30, 229, + 112, 15, 5, 248, 221, 234, 72, 30, 226, 26, 96, 226, 25, 15, 5, 248, 221, + 234, 72, 30, 219, 193, 15, 5, 248, 221, 234, 72, 30, 217, 73, 15, 5, 248, + 221, 234, 72, 30, 214, 231, 96, 242, 204, 15, 5, 248, 221, 234, 72, 30, + 214, 126, 15, 5, 248, 195, 15, 5, 248, 174, 15, 5, 248, 173, 15, 5, 248, + 172, 15, 5, 248, 11, 15, 5, 247, 250, 15, 5, 247, 225, 15, 5, 247, 226, + 30, 220, 65, 15, 5, 247, 224, 15, 5, 247, 214, 15, 5, 247, 215, 234, 214, + 104, 242, 102, 247, 195, 15, 5, 247, 195, 15, 5, 246, 86, 15, 5, 246, 87, + 115, 246, 86, 15, 5, 246, 87, 242, 101, 15, 5, 246, 87, 220, 47, 15, 5, + 246, 84, 15, 5, 246, 85, 30, 245, 80, 15, 5, 246, 83, 15, 5, 246, 82, 15, + 5, 246, 81, 15, 5, 246, 80, 15, 5, 246, 76, 15, 5, 246, 74, 15, 5, 246, + 75, 242, 101, 15, 5, 246, 75, 242, 102, 242, 101, 15, 5, 246, 73, 15, 5, + 246, 66, 15, 5, 76, 15, 5, 160, 30, 226, 25, 15, 5, 160, 115, 160, 227, + 199, 115, 227, 198, 15, 5, 245, 242, 15, 5, 245, 243, 30, 116, 96, 242, + 56, 96, 248, 229, 15, 5, 245, 243, 30, 243, 103, 15, 5, 245, 243, 30, + 230, 235, 15, 5, 245, 243, 30, 222, 10, 15, 5, 245, 243, 30, 220, 65, 15, + 5, 245, 243, 30, 69, 15, 5, 245, 219, 15, 5, 245, 208, 15, 5, 245, 182, + 15, 5, 245, 158, 15, 5, 245, 159, 30, 243, 111, 15, 5, 245, 159, 30, 243, + 112, 216, 240, 15, 5, 245, 159, 30, 231, 96, 15, 5, 245, 159, 249, 133, + 245, 158, 15, 5, 245, 159, 226, 168, 245, 158, 15, 5, 245, 159, 218, 235, + 15, 5, 245, 97, 15, 5, 245, 95, 15, 5, 245, 80, 15, 5, 245, 18, 15, 5, + 245, 19, 30, 61, 15, 5, 245, 19, 30, 116, 96, 233, 110, 15, 5, 245, 19, + 30, 116, 96, 233, 111, 30, 233, 110, 15, 5, 245, 19, 30, 254, 131, 15, 5, + 245, 19, 30, 252, 184, 15, 5, 245, 19, 30, 246, 75, 242, 101, 15, 5, 245, + 19, 30, 246, 75, 242, 102, 242, 101, 15, 5, 245, 19, 30, 162, 15, 5, 245, + 19, 30, 242, 56, 242, 101, 15, 5, 245, 19, 30, 236, 43, 242, 101, 15, 5, + 245, 19, 30, 234, 213, 15, 5, 245, 19, 30, 234, 214, 218, 235, 15, 5, + 245, 19, 30, 233, 221, 15, 5, 245, 19, 30, 233, 141, 15, 5, 245, 19, 30, + 233, 111, 30, 233, 110, 15, 5, 245, 19, 30, 232, 247, 15, 5, 245, 19, 30, + 232, 103, 15, 5, 245, 19, 30, 214, 230, 15, 5, 245, 19, 30, 214, 219, 15, + 5, 243, 142, 15, 5, 243, 143, 242, 101, 15, 5, 243, 140, 15, 5, 243, 141, + 30, 116, 96, 248, 230, 96, 162, 15, 5, 243, 141, 30, 116, 96, 162, 15, 5, + 243, 141, 30, 116, 96, 236, 42, 15, 5, 243, 141, 30, 255, 33, 216, 241, + 96, 217, 94, 15, 5, 243, 141, 30, 254, 131, 15, 5, 243, 141, 30, 253, + 239, 15, 5, 243, 141, 30, 253, 238, 96, 243, 125, 15, 5, 243, 141, 30, + 252, 184, 15, 5, 243, 141, 30, 252, 149, 96, 205, 15, 5, 243, 141, 30, + 251, 106, 15, 5, 243, 141, 30, 251, 107, 96, 205, 15, 5, 243, 141, 30, + 248, 229, 15, 5, 243, 141, 30, 248, 11, 15, 5, 243, 141, 30, 247, 226, + 30, 220, 65, 15, 5, 243, 141, 30, 246, 84, 15, 5, 243, 141, 30, 245, 182, + 15, 5, 243, 141, 30, 245, 183, 96, 233, 141, 15, 5, 243, 141, 30, 245, + 158, 15, 5, 243, 141, 30, 245, 159, 30, 243, 112, 216, 240, 15, 5, 243, + 141, 30, 243, 112, 216, 240, 15, 5, 243, 141, 30, 243, 103, 15, 5, 243, + 141, 30, 242, 221, 15, 5, 243, 141, 30, 242, 219, 15, 5, 243, 141, 30, + 242, 220, 96, 61, 15, 5, 243, 141, 30, 242, 205, 96, 218, 84, 15, 5, 243, + 141, 30, 242, 56, 96, 232, 104, 96, 245, 80, 15, 5, 243, 141, 30, 242, + 37, 15, 5, 243, 141, 30, 242, 38, 96, 233, 141, 15, 5, 243, 141, 30, 241, + 188, 96, 232, 247, 15, 5, 243, 141, 30, 240, 225, 15, 5, 243, 141, 30, + 236, 43, 242, 101, 15, 5, 243, 141, 30, 235, 173, 96, 240, 230, 96, 253, + 239, 15, 5, 243, 141, 30, 234, 248, 15, 5, 243, 141, 30, 234, 213, 15, 5, + 243, 141, 30, 234, 95, 15, 5, 243, 141, 30, 234, 96, 96, 233, 110, 15, 5, + 243, 141, 30, 233, 222, 96, 254, 131, 15, 5, 243, 141, 30, 233, 141, 15, + 5, 243, 141, 30, 231, 97, 96, 245, 158, 15, 5, 243, 141, 30, 230, 235, + 15, 5, 243, 141, 30, 227, 198, 15, 5, 243, 141, 30, 227, 199, 115, 227, + 198, 15, 5, 243, 141, 30, 191, 15, 5, 243, 141, 30, 222, 10, 15, 5, 243, + 141, 30, 221, 233, 15, 5, 243, 141, 30, 220, 65, 15, 5, 243, 141, 30, + 220, 66, 96, 215, 99, 15, 5, 243, 141, 30, 220, 32, 15, 5, 243, 141, 30, + 218, 44, 15, 5, 243, 141, 30, 217, 73, 15, 5, 243, 141, 30, 69, 15, 5, + 243, 141, 30, 214, 219, 15, 5, 243, 141, 30, 214, 220, 96, 246, 86, 15, + 5, 243, 141, 115, 243, 140, 15, 5, 243, 135, 15, 5, 243, 136, 249, 133, + 243, 135, 15, 5, 243, 133, 15, 5, 243, 134, 115, 243, 134, 243, 104, 115, + 243, 103, 15, 5, 243, 125, 15, 5, 243, 126, 243, 134, 115, 243, 134, 243, + 104, 115, 243, 103, 15, 5, 243, 124, 15, 5, 243, 122, 15, 5, 243, 113, + 15, 5, 243, 111, 15, 5, 243, 112, 216, 240, 15, 5, 243, 112, 115, 243, + 111, 15, 5, 243, 112, 249, 133, 243, 111, 15, 5, 243, 103, 15, 5, 243, + 102, 15, 5, 243, 97, 15, 5, 243, 43, 15, 5, 243, 44, 30, 233, 202, 15, 5, + 242, 221, 15, 5, 242, 222, 30, 76, 15, 5, 242, 222, 30, 69, 15, 5, 242, + 222, 249, 133, 242, 221, 15, 5, 242, 219, 15, 5, 242, 220, 115, 242, 219, + 15, 5, 242, 220, 249, 133, 242, 219, 15, 5, 242, 216, 15, 5, 242, 204, + 15, 5, 242, 205, 242, 101, 15, 5, 242, 202, 15, 5, 242, 203, 30, 116, 96, + 236, 42, 15, 5, 242, 203, 30, 243, 112, 216, 240, 15, 5, 242, 203, 30, + 236, 42, 15, 5, 242, 203, 30, 232, 104, 96, 236, 42, 15, 5, 242, 203, 30, + 191, 15, 5, 242, 199, 15, 5, 242, 197, 15, 5, 242, 198, 249, 133, 242, + 197, 15, 5, 242, 198, 30, 252, 184, 15, 5, 242, 198, 30, 217, 73, 15, 5, + 242, 198, 216, 240, 15, 5, 242, 120, 15, 5, 242, 121, 249, 133, 242, 120, + 15, 5, 242, 118, 15, 5, 242, 119, 30, 234, 248, 15, 5, 242, 119, 30, 234, + 249, 30, 236, 43, 242, 101, 15, 5, 242, 119, 30, 227, 198, 15, 5, 242, + 119, 30, 222, 11, 96, 215, 114, 15, 5, 242, 119, 242, 101, 15, 5, 242, + 110, 15, 5, 242, 111, 30, 116, 96, 233, 202, 15, 5, 242, 111, 30, 233, + 202, 15, 5, 242, 111, 115, 242, 111, 232, 96, 15, 5, 242, 105, 15, 5, + 242, 103, 15, 5, 242, 104, 30, 220, 65, 15, 5, 242, 95, 15, 5, 242, 94, + 15, 5, 242, 91, 15, 5, 242, 90, 15, 5, 162, 15, 5, 242, 56, 216, 240, 15, + 5, 242, 56, 242, 101, 15, 5, 242, 37, 15, 5, 241, 187, 15, 5, 241, 188, + 30, 253, 239, 15, 5, 241, 188, 30, 253, 237, 15, 5, 241, 188, 30, 252, + 184, 15, 5, 241, 188, 30, 247, 195, 15, 5, 241, 188, 30, 243, 133, 15, 5, + 241, 188, 30, 234, 87, 15, 5, 241, 188, 30, 227, 198, 15, 5, 241, 188, + 30, 220, 65, 15, 5, 241, 188, 30, 69, 15, 5, 240, 229, 15, 5, 240, 225, + 15, 5, 240, 226, 30, 254, 131, 15, 5, 240, 226, 30, 242, 37, 15, 5, 240, + 226, 30, 234, 213, 15, 5, 240, 226, 30, 232, 203, 15, 5, 240, 226, 30, + 214, 219, 15, 5, 240, 222, 15, 5, 74, 15, 5, 240, 161, 61, 15, 5, 240, + 122, 15, 5, 236, 70, 15, 5, 236, 71, 115, 236, 71, 251, 106, 15, 5, 236, + 71, 115, 236, 71, 218, 235, 15, 5, 236, 45, 15, 5, 236, 42, 15, 5, 236, + 43, 247, 250, 15, 5, 236, 43, 223, 38, 15, 5, 236, 43, 115, 236, 43, 220, + 16, 115, 220, 16, 214, 220, 115, 214, 219, 15, 5, 236, 43, 242, 101, 15, + 5, 236, 34, 15, 5, 236, 35, 30, 243, 112, 216, 240, 15, 5, 236, 33, 15, + 5, 236, 23, 15, 5, 236, 24, 30, 217, 73, 15, 5, 236, 24, 249, 133, 236, + 23, 15, 5, 236, 24, 226, 168, 236, 23, 15, 5, 236, 24, 218, 235, 15, 5, + 236, 16, 15, 5, 236, 6, 15, 5, 235, 186, 15, 5, 235, 172, 15, 5, 176, 15, + 5, 235, 19, 30, 61, 15, 5, 235, 19, 30, 255, 8, 15, 5, 235, 19, 30, 255, + 9, 96, 233, 221, 15, 5, 235, 19, 30, 253, 237, 15, 5, 235, 19, 30, 252, + 184, 15, 5, 235, 19, 30, 252, 168, 15, 5, 235, 19, 30, 130, 15, 5, 235, + 19, 30, 252, 14, 15, 5, 235, 19, 30, 245, 95, 15, 5, 235, 19, 30, 245, + 80, 15, 5, 235, 19, 30, 243, 142, 15, 5, 235, 19, 30, 243, 125, 15, 5, + 235, 19, 30, 243, 112, 216, 240, 15, 5, 235, 19, 30, 243, 103, 15, 5, + 235, 19, 30, 243, 104, 96, 220, 103, 96, 61, 15, 5, 235, 19, 30, 242, + 221, 15, 5, 235, 19, 30, 242, 204, 15, 5, 235, 19, 30, 242, 198, 96, 221, + 233, 15, 5, 235, 19, 30, 242, 198, 249, 133, 242, 197, 15, 5, 235, 19, + 30, 242, 120, 15, 5, 235, 19, 30, 242, 94, 15, 5, 235, 19, 30, 236, 42, + 15, 5, 235, 19, 30, 236, 23, 15, 5, 235, 19, 30, 234, 248, 15, 5, 235, + 19, 30, 234, 98, 15, 5, 235, 19, 30, 234, 95, 15, 5, 235, 19, 30, 232, + 247, 15, 5, 235, 19, 30, 232, 103, 15, 5, 235, 19, 30, 231, 96, 15, 5, + 235, 19, 30, 231, 97, 96, 246, 86, 15, 5, 235, 19, 30, 231, 97, 96, 242, + 221, 15, 5, 235, 19, 30, 231, 97, 96, 217, 23, 15, 5, 235, 19, 30, 230, + 235, 15, 5, 235, 19, 30, 230, 236, 96, 227, 193, 15, 5, 235, 19, 30, 229, + 112, 15, 5, 235, 19, 30, 227, 198, 15, 5, 235, 19, 30, 225, 111, 15, 5, + 235, 19, 30, 222, 142, 15, 5, 235, 19, 30, 206, 15, 5, 235, 19, 30, 221, + 233, 15, 5, 235, 19, 30, 220, 104, 15, 5, 235, 19, 30, 220, 65, 15, 5, + 235, 19, 30, 220, 32, 15, 5, 235, 19, 30, 219, 227, 15, 5, 235, 19, 30, + 219, 184, 15, 5, 235, 19, 30, 218, 52, 15, 5, 235, 19, 30, 217, 51, 15, + 5, 235, 19, 30, 69, 15, 5, 235, 19, 30, 214, 230, 15, 5, 235, 19, 30, + 214, 219, 15, 5, 235, 19, 30, 214, 193, 30, 191, 15, 5, 235, 19, 30, 214, + 126, 15, 5, 235, 19, 30, 210, 44, 15, 5, 235, 17, 15, 5, 235, 18, 249, + 133, 235, 17, 15, 5, 235, 10, 15, 5, 235, 7, 15, 5, 235, 5, 15, 5, 235, + 4, 15, 5, 235, 2, 15, 5, 235, 3, 115, 235, 2, 15, 5, 234, 248, 15, 5, + 234, 249, 30, 236, 43, 242, 101, 15, 5, 234, 244, 15, 5, 234, 245, 30, + 252, 184, 15, 5, 234, 245, 249, 133, 234, 244, 15, 5, 234, 242, 15, 5, + 234, 241, 15, 5, 234, 213, 15, 5, 234, 214, 233, 124, 30, 104, 115, 233, + 124, 30, 69, 15, 5, 234, 214, 115, 234, 214, 233, 124, 30, 104, 115, 233, + 124, 30, 69, 15, 5, 234, 163, 15, 5, 234, 98, 15, 5, 234, 99, 30, 252, + 184, 15, 5, 234, 99, 30, 69, 15, 5, 234, 99, 30, 214, 219, 15, 5, 234, + 95, 15, 5, 234, 87, 15, 5, 234, 74, 15, 5, 234, 73, 15, 5, 234, 71, 15, + 5, 234, 72, 115, 234, 71, 15, 5, 233, 223, 15, 5, 233, 224, 115, 241, + 188, 30, 253, 238, 233, 224, 115, 241, 188, 30, 253, 237, 15, 5, 233, + 221, 15, 5, 233, 219, 15, 5, 233, 220, 214, 12, 17, 15, 5, 233, 218, 15, + 5, 233, 215, 15, 5, 233, 216, 242, 101, 15, 5, 233, 214, 15, 5, 233, 202, + 15, 5, 233, 203, 226, 168, 233, 202, 15, 5, 233, 197, 15, 5, 233, 178, + 15, 5, 233, 141, 15, 5, 233, 123, 15, 5, 233, 124, 30, 61, 15, 5, 233, + 124, 30, 116, 96, 248, 230, 96, 162, 15, 5, 233, 124, 30, 116, 96, 243, + 103, 15, 5, 233, 124, 30, 116, 96, 233, 110, 15, 5, 233, 124, 30, 254, + 187, 15, 5, 233, 124, 30, 254, 131, 15, 5, 233, 124, 30, 253, 240, 210, + 40, 216, 240, 15, 5, 233, 124, 30, 252, 184, 15, 5, 233, 124, 30, 252, + 14, 15, 5, 233, 124, 30, 248, 174, 15, 5, 233, 124, 30, 245, 158, 15, 5, + 233, 124, 30, 243, 142, 15, 5, 233, 124, 30, 243, 103, 15, 5, 233, 124, + 30, 242, 110, 15, 5, 233, 124, 30, 242, 111, 96, 242, 110, 15, 5, 233, + 124, 30, 162, 15, 5, 233, 124, 30, 242, 37, 15, 5, 233, 124, 30, 241, + 188, 30, 227, 198, 15, 5, 233, 124, 30, 236, 43, 242, 101, 15, 5, 233, + 124, 30, 236, 23, 15, 5, 233, 124, 30, 236, 24, 96, 162, 15, 5, 233, 124, + 30, 236, 24, 96, 232, 103, 15, 5, 233, 124, 30, 234, 98, 15, 5, 233, 124, + 30, 234, 87, 15, 5, 233, 124, 30, 233, 221, 15, 5, 233, 124, 30, 233, + 215, 15, 5, 233, 124, 30, 233, 216, 96, 241, 188, 96, 61, 15, 5, 233, + 124, 30, 233, 123, 15, 5, 233, 124, 30, 232, 203, 15, 5, 233, 124, 30, + 232, 103, 15, 5, 233, 124, 30, 232, 91, 15, 5, 233, 124, 30, 231, 96, 15, + 5, 233, 124, 30, 231, 97, 96, 245, 158, 15, 5, 233, 124, 30, 230, 66, 15, + 5, 233, 124, 30, 229, 112, 15, 5, 233, 124, 30, 220, 66, 96, 218, 44, 15, + 5, 233, 124, 30, 220, 12, 96, 242, 198, 96, 245, 95, 15, 5, 233, 124, 30, + 220, 12, 96, 242, 198, 216, 240, 15, 5, 233, 124, 30, 219, 225, 15, 5, + 233, 124, 30, 219, 226, 96, 219, 225, 15, 5, 233, 124, 30, 218, 44, 15, + 5, 233, 124, 30, 217, 85, 15, 5, 233, 124, 30, 217, 73, 15, 5, 233, 124, + 30, 217, 24, 96, 116, 96, 218, 85, 96, 198, 15, 5, 233, 124, 30, 69, 15, + 5, 233, 124, 30, 104, 96, 61, 15, 5, 233, 124, 30, 104, 96, 104, 96, 69, + 15, 5, 233, 124, 30, 214, 231, 96, 253, 239, 15, 5, 233, 124, 30, 214, + 219, 15, 5, 233, 124, 30, 214, 126, 15, 5, 233, 124, 218, 235, 15, 5, + 233, 121, 15, 5, 233, 122, 30, 220, 65, 15, 5, 233, 122, 30, 220, 66, 96, + 218, 44, 15, 5, 233, 122, 242, 101, 15, 5, 233, 122, 242, 102, 115, 233, + 122, 242, 102, 220, 65, 15, 5, 233, 117, 15, 5, 233, 110, 15, 5, 233, + 111, 30, 233, 110, 15, 5, 233, 108, 15, 5, 233, 109, 30, 233, 202, 15, 5, + 233, 109, 30, 233, 203, 96, 222, 142, 15, 5, 232, 247, 15, 5, 232, 232, + 15, 5, 232, 222, 15, 5, 232, 203, 15, 5, 232, 103, 15, 5, 232, 104, 30, + 252, 184, 15, 5, 232, 101, 15, 5, 232, 102, 30, 254, 187, 15, 5, 232, + 102, 30, 252, 184, 15, 5, 232, 102, 30, 245, 80, 15, 5, 232, 102, 30, + 245, 81, 216, 240, 15, 5, 232, 102, 30, 243, 112, 216, 240, 15, 5, 232, + 102, 30, 241, 188, 30, 252, 184, 15, 5, 232, 102, 30, 236, 23, 15, 5, + 232, 102, 30, 235, 7, 15, 5, 232, 102, 30, 235, 5, 15, 5, 232, 102, 30, + 235, 6, 96, 253, 239, 15, 5, 232, 102, 30, 234, 98, 15, 5, 232, 102, 30, + 233, 142, 96, 253, 239, 15, 5, 232, 102, 30, 233, 123, 15, 5, 232, 102, + 30, 231, 97, 96, 245, 158, 15, 5, 232, 102, 30, 229, 112, 15, 5, 232, + 102, 30, 227, 242, 15, 5, 232, 102, 30, 219, 194, 96, 253, 239, 15, 5, + 232, 102, 30, 219, 176, 96, 251, 133, 15, 5, 232, 102, 30, 215, 114, 15, + 5, 232, 102, 216, 240, 15, 5, 232, 102, 249, 133, 232, 101, 15, 5, 232, + 102, 226, 168, 232, 101, 15, 5, 232, 102, 218, 235, 15, 5, 232, 102, 220, + 47, 15, 5, 232, 100, 15, 5, 232, 96, 15, 5, 232, 97, 115, 232, 96, 15, 5, + 232, 97, 226, 168, 232, 96, 15, 5, 232, 97, 220, 47, 15, 5, 232, 94, 15, + 5, 232, 91, 15, 5, 232, 89, 15, 5, 232, 90, 115, 232, 89, 15, 5, 232, 90, + 115, 232, 90, 243, 104, 115, 243, 103, 15, 5, 186, 15, 5, 231, 244, 30, + 217, 73, 15, 5, 231, 244, 242, 101, 15, 5, 231, 243, 15, 5, 231, 215, 15, + 5, 231, 171, 15, 5, 231, 152, 15, 5, 231, 151, 15, 5, 231, 96, 15, 5, + 231, 52, 15, 5, 230, 235, 15, 5, 230, 193, 15, 5, 230, 107, 15, 5, 230, + 108, 115, 230, 107, 15, 5, 230, 98, 15, 5, 230, 99, 242, 101, 15, 5, 230, + 83, 15, 5, 230, 69, 15, 5, 230, 66, 15, 5, 230, 67, 30, 61, 15, 5, 230, + 67, 30, 233, 202, 15, 5, 230, 67, 30, 210, 116, 15, 5, 230, 67, 115, 230, + 66, 15, 5, 230, 67, 115, 230, 67, 30, 116, 96, 198, 15, 5, 230, 67, 249, + 133, 230, 66, 15, 5, 230, 64, 15, 5, 230, 65, 30, 61, 15, 5, 230, 65, 30, + 116, 96, 248, 11, 15, 5, 230, 65, 30, 248, 11, 15, 5, 230, 65, 242, 101, + 15, 5, 198, 15, 5, 229, 232, 15, 5, 229, 221, 15, 5, 229, 222, 235, 199, + 15, 5, 229, 222, 30, 219, 228, 216, 240, 15, 5, 229, 222, 226, 168, 229, + 221, 15, 5, 229, 220, 15, 5, 229, 213, 227, 184, 15, 5, 229, 212, 15, 5, + 229, 211, 15, 5, 229, 112, 15, 5, 229, 113, 30, 61, 15, 5, 229, 113, 30, + 214, 219, 15, 5, 229, 113, 220, 47, 15, 5, 228, 238, 15, 5, 228, 239, 30, + 76, 15, 5, 228, 237, 15, 5, 228, 208, 15, 5, 228, 209, 30, 243, 112, 216, + 240, 15, 5, 228, 209, 30, 243, 104, 96, 243, 112, 216, 240, 15, 5, 228, + 206, 15, 5, 228, 207, 30, 254, 131, 15, 5, 228, 207, 30, 253, 239, 15, 5, + 228, 207, 30, 253, 240, 96, 253, 239, 15, 5, 228, 207, 30, 242, 110, 15, + 5, 228, 207, 30, 231, 97, 96, 243, 112, 216, 240, 15, 5, 228, 207, 30, + 229, 112, 15, 5, 228, 207, 30, 227, 198, 15, 5, 228, 207, 30, 220, 65, + 15, 5, 228, 207, 30, 220, 66, 96, 116, 254, 131, 15, 5, 228, 207, 30, + 220, 66, 96, 253, 239, 15, 5, 228, 207, 30, 220, 66, 96, 253, 240, 96, + 253, 239, 15, 5, 228, 207, 30, 214, 231, 96, 253, 239, 15, 5, 228, 207, + 30, 214, 126, 15, 5, 228, 195, 15, 5, 227, 242, 15, 5, 227, 214, 15, 5, + 227, 198, 15, 5, 227, 199, 233, 122, 30, 243, 103, 15, 5, 227, 199, 233, + 122, 30, 231, 152, 15, 5, 227, 199, 233, 122, 30, 222, 10, 15, 5, 227, + 199, 233, 122, 30, 222, 11, 115, 227, 199, 233, 122, 30, 222, 10, 15, 5, + 227, 199, 233, 122, 30, 214, 126, 15, 5, 227, 199, 216, 240, 15, 5, 227, + 199, 115, 227, 198, 15, 5, 227, 199, 249, 133, 227, 198, 15, 5, 227, 199, + 249, 133, 227, 199, 233, 122, 115, 233, 121, 15, 5, 227, 193, 15, 5, 227, + 194, 255, 33, 30, 253, 234, 15, 5, 227, 194, 255, 33, 30, 252, 14, 15, 5, + 227, 194, 255, 33, 30, 246, 82, 15, 5, 227, 194, 255, 33, 30, 242, 110, + 15, 5, 227, 194, 255, 33, 30, 236, 43, 242, 101, 15, 5, 227, 194, 255, + 33, 30, 235, 5, 15, 5, 227, 194, 255, 33, 30, 233, 141, 15, 5, 227, 194, + 255, 33, 30, 229, 112, 15, 5, 227, 194, 255, 33, 30, 219, 173, 15, 5, + 227, 194, 255, 33, 30, 214, 230, 15, 5, 227, 194, 234, 72, 30, 252, 14, + 15, 5, 227, 194, 234, 72, 30, 252, 15, 69, 15, 5, 191, 15, 5, 226, 84, + 15, 5, 226, 51, 15, 5, 226, 25, 15, 5, 225, 164, 15, 5, 225, 111, 15, 5, + 225, 112, 30, 61, 15, 5, 225, 112, 30, 255, 34, 15, 5, 225, 112, 30, 252, + 14, 15, 5, 225, 112, 30, 251, 133, 15, 5, 225, 112, 30, 76, 15, 5, 225, + 112, 30, 74, 15, 5, 225, 112, 30, 240, 122, 15, 5, 225, 112, 30, 69, 15, + 5, 225, 112, 30, 214, 230, 15, 5, 225, 112, 249, 133, 225, 111, 15, 5, + 225, 56, 15, 5, 225, 57, 30, 234, 244, 15, 5, 225, 57, 30, 214, 219, 15, + 5, 225, 57, 30, 210, 116, 15, 5, 225, 57, 226, 168, 225, 56, 15, 5, 205, + 15, 5, 223, 185, 15, 5, 223, 38, 15, 5, 222, 142, 15, 5, 206, 15, 5, 222, + 24, 227, 184, 15, 5, 222, 23, 15, 5, 222, 24, 30, 61, 15, 5, 222, 24, 30, + 246, 86, 15, 5, 222, 24, 30, 246, 84, 15, 5, 222, 24, 30, 162, 15, 5, + 222, 24, 30, 234, 248, 15, 5, 222, 24, 30, 233, 202, 15, 5, 222, 24, 30, + 232, 89, 15, 5, 222, 24, 30, 230, 235, 15, 5, 222, 24, 30, 227, 198, 15, + 5, 222, 24, 30, 222, 10, 15, 5, 222, 24, 30, 220, 32, 15, 5, 222, 24, 30, + 217, 94, 15, 5, 222, 24, 30, 214, 230, 15, 5, 222, 24, 30, 214, 225, 15, + 5, 222, 24, 30, 214, 197, 15, 5, 222, 24, 30, 214, 150, 15, 5, 222, 24, + 30, 214, 126, 15, 5, 222, 24, 115, 222, 23, 15, 5, 222, 24, 242, 101, 15, + 5, 222, 10, 15, 5, 222, 11, 233, 124, 30, 253, 237, 15, 5, 221, 241, 15, + 5, 221, 233, 15, 5, 220, 104, 15, 5, 220, 102, 15, 5, 220, 103, 30, 61, + 15, 5, 220, 103, 30, 252, 184, 15, 5, 220, 103, 30, 242, 197, 15, 5, 220, + 103, 30, 229, 112, 15, 5, 220, 103, 30, 219, 225, 15, 5, 220, 103, 30, + 215, 99, 15, 5, 220, 103, 30, 69, 15, 5, 220, 103, 30, 104, 96, 61, 15, + 5, 220, 101, 15, 5, 220, 99, 15, 5, 220, 80, 15, 5, 220, 65, 15, 5, 220, + 66, 240, 229, 15, 5, 220, 66, 115, 220, 66, 243, 134, 115, 243, 134, 243, + 104, 115, 243, 103, 15, 5, 220, 66, 115, 220, 66, 217, 95, 115, 217, 95, + 243, 104, 115, 243, 103, 15, 5, 220, 58, 15, 5, 220, 53, 15, 5, 220, 50, + 15, 5, 220, 49, 15, 5, 220, 46, 15, 5, 220, 32, 15, 5, 220, 33, 30, 61, + 15, 5, 220, 33, 30, 236, 23, 15, 5, 220, 26, 15, 5, 220, 27, 30, 61, 15, + 5, 220, 27, 30, 252, 169, 15, 5, 220, 27, 30, 251, 117, 15, 5, 220, 27, + 30, 247, 214, 15, 5, 220, 27, 30, 243, 103, 15, 5, 220, 27, 30, 236, 42, + 15, 5, 220, 27, 30, 236, 43, 242, 101, 15, 5, 220, 27, 30, 233, 197, 15, + 5, 220, 27, 30, 232, 91, 15, 5, 220, 27, 30, 230, 98, 15, 5, 220, 27, 30, + 222, 10, 15, 5, 220, 20, 15, 5, 220, 15, 15, 5, 220, 16, 216, 240, 15, 5, + 220, 16, 115, 220, 16, 251, 107, 115, 251, 106, 15, 5, 220, 11, 15, 5, + 219, 227, 15, 5, 219, 228, 115, 235, 200, 219, 227, 15, 5, 219, 225, 15, + 5, 219, 224, 15, 5, 219, 193, 15, 5, 219, 194, 242, 101, 15, 5, 219, 184, + 15, 5, 219, 182, 15, 5, 219, 183, 115, 219, 183, 219, 225, 15, 5, 219, + 175, 15, 5, 219, 173, 15, 5, 218, 84, 15, 5, 218, 85, 115, 218, 84, 15, + 5, 218, 55, 15, 5, 218, 54, 15, 5, 218, 52, 15, 5, 218, 44, 15, 5, 218, + 43, 15, 5, 218, 18, 15, 5, 218, 17, 15, 5, 217, 106, 15, 5, 217, 107, + 253, 224, 15, 5, 217, 107, 30, 241, 187, 15, 5, 217, 107, 30, 230, 235, + 15, 5, 217, 107, 242, 101, 15, 5, 217, 94, 15, 5, 217, 95, 115, 217, 95, + 228, 239, 115, 228, 239, 247, 196, 115, 247, 195, 15, 5, 217, 95, 218, + 235, 15, 5, 217, 85, 15, 5, 129, 30, 252, 14, 15, 5, 129, 30, 242, 110, + 15, 5, 129, 30, 220, 65, 15, 5, 129, 30, 219, 227, 15, 5, 129, 30, 215, + 114, 15, 5, 129, 30, 214, 219, 15, 5, 217, 73, 15, 5, 217, 51, 15, 5, + 217, 23, 15, 5, 217, 24, 242, 101, 15, 5, 216, 118, 15, 5, 216, 119, 216, + 240, 15, 5, 216, 91, 15, 5, 216, 73, 15, 5, 216, 74, 30, 217, 73, 15, 5, + 216, 74, 115, 216, 73, 15, 5, 216, 74, 115, 216, 74, 243, 134, 115, 243, + 134, 243, 104, 115, 243, 103, 15, 5, 215, 119, 15, 5, 215, 114, 15, 5, + 215, 112, 15, 5, 215, 109, 15, 5, 215, 99, 15, 5, 215, 100, 115, 215, + 100, 210, 117, 115, 210, 116, 15, 5, 69, 15, 5, 104, 242, 110, 15, 5, + 104, 104, 69, 15, 5, 104, 115, 104, 226, 94, 115, 226, 94, 243, 104, 115, + 243, 103, 15, 5, 104, 115, 104, 218, 19, 115, 218, 18, 15, 5, 104, 115, + 104, 104, 223, 52, 115, 104, 223, 51, 15, 5, 214, 230, 15, 5, 214, 225, + 15, 5, 214, 219, 15, 5, 214, 220, 233, 197, 15, 5, 214, 220, 30, 252, + 184, 15, 5, 214, 220, 30, 230, 235, 15, 5, 214, 220, 30, 104, 96, 104, + 96, 69, 15, 5, 214, 220, 30, 104, 96, 104, 96, 104, 242, 101, 15, 5, 214, + 220, 242, 101, 15, 5, 214, 220, 220, 47, 15, 5, 214, 220, 220, 48, 30, + 252, 184, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5, 214, 198, 30, 233, + 123, 15, 5, 214, 198, 30, 231, 97, 96, 248, 229, 15, 5, 214, 198, 30, + 220, 102, 15, 5, 214, 198, 30, 69, 15, 5, 214, 196, 15, 5, 214, 192, 15, + 5, 214, 193, 30, 234, 213, 15, 5, 214, 193, 30, 191, 15, 5, 214, 190, 15, + 5, 214, 191, 242, 101, 15, 5, 214, 150, 15, 5, 214, 151, 249, 133, 214, + 150, 15, 5, 214, 151, 220, 47, 15, 5, 214, 148, 15, 5, 214, 149, 30, 116, + 96, 162, 15, 5, 214, 149, 30, 116, 96, 198, 15, 5, 214, 149, 30, 254, + 187, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30, 227, 198, 15, 5, 214, + 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231, 96, 253, 239, 15, 5, + 214, 149, 30, 214, 231, 96, 252, 14, 15, 5, 214, 147, 15, 5, 214, 144, + 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30, 61, 15, 5, 214, + 140, 30, 253, 234, 15, 5, 214, 140, 30, 130, 15, 5, 214, 140, 30, 246, + 76, 15, 5, 214, 140, 30, 243, 142, 15, 5, 214, 140, 30, 243, 125, 15, 5, + 214, 140, 30, 243, 112, 216, 240, 15, 5, 214, 140, 30, 243, 103, 15, 5, + 214, 140, 30, 242, 120, 15, 5, 214, 140, 30, 162, 15, 5, 214, 140, 30, + 236, 42, 15, 5, 214, 140, 30, 236, 23, 15, 5, 214, 140, 30, 235, 172, 15, + 5, 214, 140, 30, 234, 98, 15, 5, 214, 140, 30, 232, 89, 15, 5, 214, 140, + 30, 230, 193, 15, 5, 214, 140, 30, 191, 15, 5, 214, 140, 30, 220, 65, 15, + 5, 214, 140, 30, 219, 182, 15, 5, 214, 140, 30, 215, 119, 15, 5, 214, + 140, 30, 104, 96, 242, 110, 15, 5, 214, 140, 30, 214, 219, 15, 5, 214, + 140, 30, 214, 137, 15, 5, 214, 137, 15, 5, 214, 138, 30, 69, 15, 5, 214, + 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 223, 15, 5, 214, + 127, 30, 233, 202, 15, 5, 214, 127, 30, 217, 73, 15, 5, 214, 122, 15, 5, + 214, 125, 15, 5, 214, 123, 15, 5, 214, 119, 15, 5, 214, 108, 15, 5, 214, + 109, 30, 234, 213, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5, 210, 117, + 216, 240, 15, 5, 210, 117, 92, 30, 233, 202, 15, 5, 210, 113, 15, 5, 210, + 106, 15, 5, 210, 93, 15, 5, 210, 44, 15, 5, 210, 45, 115, 210, 44, 15, 5, + 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 9, 216, 240, 15, 5, 210, + 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15, 5, 210, 12, 30, + 61, 15, 5, 210, 10, 15, 5, 210, 9, 15, 132, 5, 113, 253, 239, 15, 132, 5, + 134, 253, 239, 15, 132, 5, 244, 19, 253, 239, 15, 132, 5, 244, 89, 253, + 239, 15, 132, 5, 219, 127, 253, 239, 15, 132, 5, 220, 124, 253, 239, 15, + 132, 5, 245, 201, 253, 239, 15, 132, 5, 228, 205, 253, 239, 15, 132, 5, + 134, 247, 195, 15, 132, 5, 244, 19, 247, 195, 15, 132, 5, 244, 89, 247, + 195, 15, 132, 5, 219, 127, 247, 195, 15, 132, 5, 220, 124, 247, 195, 15, + 132, 5, 245, 201, 247, 195, 15, 132, 5, 228, 205, 247, 195, 15, 132, 5, + 244, 19, 69, 15, 132, 5, 244, 89, 69, 15, 132, 5, 219, 127, 69, 15, 132, + 5, 220, 124, 69, 15, 132, 5, 245, 201, 69, 15, 132, 5, 228, 205, 69, 15, + 132, 5, 123, 243, 45, 15, 132, 5, 113, 243, 45, 15, 132, 5, 134, 243, 45, + 15, 132, 5, 244, 19, 243, 45, 15, 132, 5, 244, 89, 243, 45, 15, 132, 5, + 219, 127, 243, 45, 15, 132, 5, 220, 124, 243, 45, 15, 132, 5, 245, 201, + 243, 45, 15, 132, 5, 228, 205, 243, 45, 15, 132, 5, 123, 243, 42, 15, + 132, 5, 113, 243, 42, 15, 132, 5, 134, 243, 42, 15, 132, 5, 244, 19, 243, + 42, 15, 132, 5, 244, 89, 243, 42, 15, 132, 5, 113, 220, 80, 15, 132, 5, + 134, 220, 80, 15, 132, 5, 134, 220, 81, 214, 12, 17, 15, 132, 5, 244, 19, + 220, 80, 15, 132, 5, 244, 89, 220, 80, 15, 132, 5, 219, 127, 220, 80, 15, + 132, 5, 220, 124, 220, 80, 15, 132, 5, 245, 201, 220, 80, 15, 132, 5, + 228, 205, 220, 80, 15, 132, 5, 123, 220, 75, 15, 132, 5, 113, 220, 75, + 15, 132, 5, 134, 220, 75, 15, 132, 5, 134, 220, 76, 214, 12, 17, 15, 132, + 5, 244, 19, 220, 75, 15, 132, 5, 244, 89, 220, 75, 15, 132, 5, 220, 81, + 30, 243, 126, 96, 247, 195, 15, 132, 5, 220, 81, 30, 243, 126, 96, 230, + 193, 15, 132, 5, 123, 251, 103, 15, 132, 5, 113, 251, 103, 15, 132, 5, + 134, 251, 103, 15, 132, 5, 134, 251, 104, 214, 12, 17, 15, 132, 5, 244, + 19, 251, 103, 15, 132, 5, 244, 89, 251, 103, 15, 132, 5, 134, 214, 12, + 244, 28, 245, 82, 15, 132, 5, 134, 214, 12, 244, 28, 245, 79, 15, 132, 5, + 244, 19, 214, 12, 244, 28, 232, 223, 15, 132, 5, 244, 19, 214, 12, 244, + 28, 232, 221, 15, 132, 5, 244, 19, 214, 12, 244, 28, 232, 224, 61, 15, + 132, 5, 244, 19, 214, 12, 244, 28, 232, 224, 253, 166, 15, 132, 5, 219, + 127, 214, 12, 244, 28, 253, 236, 15, 132, 5, 220, 124, 214, 12, 244, 28, + 236, 15, 15, 132, 5, 220, 124, 214, 12, 244, 28, 236, 17, 61, 15, 132, 5, + 220, 124, 214, 12, 244, 28, 236, 17, 253, 166, 15, 132, 5, 245, 201, 214, + 12, 244, 28, 214, 121, 15, 132, 5, 245, 201, 214, 12, 244, 28, 214, 120, + 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, 31, 15, 132, 5, 228, 205, + 214, 12, 244, 28, 236, 30, 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, + 29, 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, 32, 61, 15, 132, 5, 113, + 253, 240, 216, 240, 15, 132, 5, 134, 253, 240, 216, 240, 15, 132, 5, 244, + 19, 253, 240, 216, 240, 15, 132, 5, 244, 89, 253, 240, 216, 240, 15, 132, + 5, 219, 127, 253, 240, 216, 240, 15, 132, 5, 123, 252, 158, 15, 132, 5, + 113, 252, 158, 15, 132, 5, 134, 252, 158, 15, 132, 5, 244, 19, 252, 158, + 15, 132, 5, 244, 19, 252, 159, 214, 12, 17, 15, 132, 5, 244, 89, 252, + 158, 15, 132, 5, 244, 89, 252, 159, 214, 12, 17, 15, 132, 5, 228, 215, + 15, 132, 5, 228, 216, 15, 132, 5, 123, 245, 78, 15, 132, 5, 113, 245, 78, + 15, 132, 5, 123, 216, 170, 247, 195, 15, 132, 5, 113, 216, 168, 247, 195, + 15, 132, 5, 244, 89, 219, 116, 247, 195, 15, 132, 5, 123, 216, 170, 214, + 12, 244, 28, 61, 15, 132, 5, 113, 216, 168, 214, 12, 244, 28, 61, 15, + 132, 5, 123, 245, 197, 253, 239, 15, 132, 5, 123, 224, 25, 253, 239, 15, + 132, 5, 55, 253, 227, 123, 219, 117, 15, 132, 5, 55, 253, 227, 123, 224, + 24, 15, 224, 144, 5, 55, 253, 227, 211, 209, 247, 180, 15, 224, 144, 5, + 67, 249, 234, 15, 224, 144, 5, 248, 7, 249, 234, 15, 224, 144, 5, 248, 7, + 215, 222, 12, 13, 255, 164, 12, 13, 255, 163, 12, 13, 255, 162, 12, 13, + 255, 161, 12, 13, 255, 160, 12, 13, 255, 159, 12, 13, 255, 158, 12, 13, + 255, 157, 12, 13, 255, 156, 12, 13, 255, 155, 12, 13, 255, 154, 12, 13, + 255, 153, 12, 13, 255, 152, 12, 13, 255, 151, 12, 13, 255, 150, 12, 13, + 255, 149, 12, 13, 255, 148, 12, 13, 255, 147, 12, 13, 255, 146, 12, 13, + 255, 145, 12, 13, 255, 144, 12, 13, 255, 143, 12, 13, 255, 142, 12, 13, + 255, 141, 12, 13, 255, 140, 12, 13, 255, 139, 12, 13, 255, 138, 12, 13, + 255, 137, 12, 13, 255, 136, 12, 13, 255, 135, 12, 13, 255, 134, 12, 13, + 255, 133, 12, 13, 255, 132, 12, 13, 255, 131, 12, 13, 255, 130, 12, 13, + 255, 129, 12, 13, 255, 128, 12, 13, 255, 127, 12, 13, 255, 126, 12, 13, + 255, 125, 12, 13, 255, 124, 12, 13, 255, 123, 12, 13, 255, 122, 12, 13, + 255, 121, 12, 13, 255, 120, 12, 13, 255, 119, 12, 13, 255, 118, 12, 13, + 255, 117, 12, 13, 255, 116, 12, 13, 255, 115, 12, 13, 255, 114, 12, 13, + 255, 113, 12, 13, 255, 112, 12, 13, 255, 111, 12, 13, 255, 110, 12, 13, + 255, 109, 12, 13, 255, 108, 12, 13, 255, 107, 12, 13, 255, 106, 12, 13, + 255, 105, 12, 13, 255, 104, 12, 13, 255, 103, 12, 13, 255, 102, 12, 13, + 255, 101, 12, 13, 255, 100, 12, 13, 255, 99, 12, 13, 255, 98, 12, 13, + 255, 97, 12, 13, 255, 96, 12, 13, 255, 95, 12, 13, 255, 94, 12, 13, 255, + 93, 12, 13, 255, 92, 12, 13, 255, 91, 12, 13, 255, 90, 12, 13, 255, 89, + 12, 13, 255, 88, 12, 13, 255, 87, 12, 13, 255, 86, 12, 13, 255, 85, 12, + 13, 253, 164, 12, 13, 253, 162, 12, 13, 253, 160, 12, 13, 253, 158, 12, + 13, 253, 156, 12, 13, 253, 155, 12, 13, 253, 153, 12, 13, 253, 151, 12, + 13, 253, 149, 12, 13, 253, 147, 12, 13, 251, 70, 12, 13, 251, 69, 12, 13, + 251, 68, 12, 13, 251, 67, 12, 13, 251, 66, 12, 13, 251, 65, 12, 13, 251, + 64, 12, 13, 251, 63, 12, 13, 251, 62, 12, 13, 251, 61, 12, 13, 251, 60, + 12, 13, 251, 59, 12, 13, 251, 58, 12, 13, 251, 57, 12, 13, 251, 56, 12, + 13, 251, 55, 12, 13, 251, 54, 12, 13, 251, 53, 12, 13, 251, 52, 12, 13, + 251, 51, 12, 13, 251, 50, 12, 13, 251, 49, 12, 13, 251, 48, 12, 13, 251, + 47, 12, 13, 251, 46, 12, 13, 251, 45, 12, 13, 251, 44, 12, 13, 251, 43, + 12, 13, 249, 67, 12, 13, 249, 66, 12, 13, 249, 65, 12, 13, 249, 64, 12, + 13, 249, 63, 12, 13, 249, 62, 12, 13, 249, 61, 12, 13, 249, 60, 12, 13, + 249, 59, 12, 13, 249, 58, 12, 13, 249, 57, 12, 13, 249, 56, 12, 13, 249, + 55, 12, 13, 249, 54, 12, 13, 249, 53, 12, 13, 249, 52, 12, 13, 249, 51, + 12, 13, 249, 50, 12, 13, 249, 49, 12, 13, 249, 48, 12, 13, 249, 47, 12, + 13, 249, 46, 12, 13, 249, 45, 12, 13, 249, 44, 12, 13, 249, 43, 12, 13, + 249, 42, 12, 13, 249, 41, 12, 13, 249, 40, 12, 13, 249, 39, 12, 13, 249, + 38, 12, 13, 249, 37, 12, 13, 249, 36, 12, 13, 249, 35, 12, 13, 249, 34, + 12, 13, 249, 33, 12, 13, 249, 32, 12, 13, 249, 31, 12, 13, 249, 30, 12, + 13, 249, 29, 12, 13, 249, 28, 12, 13, 249, 27, 12, 13, 249, 26, 12, 13, + 249, 25, 12, 13, 249, 24, 12, 13, 249, 23, 12, 13, 249, 22, 12, 13, 249, + 21, 12, 13, 249, 20, 12, 13, 249, 19, 12, 13, 249, 18, 12, 13, 249, 17, + 12, 13, 249, 16, 12, 13, 249, 15, 12, 13, 249, 14, 12, 13, 249, 13, 12, + 13, 249, 12, 12, 13, 249, 11, 12, 13, 249, 10, 12, 13, 249, 9, 12, 13, + 249, 8, 12, 13, 249, 7, 12, 13, 249, 6, 12, 13, 249, 5, 12, 13, 249, 4, + 12, 13, 249, 3, 12, 13, 249, 2, 12, 13, 249, 1, 12, 13, 249, 0, 12, 13, + 248, 255, 12, 13, 248, 254, 12, 13, 248, 253, 12, 13, 248, 252, 12, 13, + 248, 251, 12, 13, 248, 250, 12, 13, 248, 249, 12, 13, 248, 248, 12, 13, + 248, 247, 12, 13, 248, 246, 12, 13, 248, 245, 12, 13, 248, 244, 12, 13, + 248, 243, 12, 13, 248, 242, 12, 13, 248, 241, 12, 13, 248, 240, 12, 13, + 248, 239, 12, 13, 248, 238, 12, 13, 248, 237, 12, 13, 248, 236, 12, 13, + 248, 235, 12, 13, 248, 234, 12, 13, 248, 233, 12, 13, 248, 232, 12, 13, + 246, 31, 12, 13, 246, 30, 12, 13, 246, 29, 12, 13, 246, 28, 12, 13, 246, + 27, 12, 13, 246, 26, 12, 13, 246, 25, 12, 13, 246, 24, 12, 13, 246, 23, + 12, 13, 246, 22, 12, 13, 246, 21, 12, 13, 246, 20, 12, 13, 246, 19, 12, + 13, 246, 18, 12, 13, 246, 17, 12, 13, 246, 16, 12, 13, 246, 15, 12, 13, + 246, 14, 12, 13, 246, 13, 12, 13, 246, 12, 12, 13, 246, 11, 12, 13, 246, + 10, 12, 13, 246, 9, 12, 13, 246, 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, + 13, 246, 5, 12, 13, 246, 4, 12, 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, + 1, 12, 13, 246, 0, 12, 13, 245, 255, 12, 13, 245, 254, 12, 13, 245, 253, + 12, 13, 245, 252, 12, 13, 245, 251, 12, 13, 245, 250, 12, 13, 245, 249, + 12, 13, 245, 248, 12, 13, 245, 247, 12, 13, 245, 246, 12, 13, 245, 245, + 12, 13, 245, 244, 12, 13, 245, 13, 12, 13, 245, 12, 12, 13, 245, 11, 12, + 13, 245, 10, 12, 13, 245, 9, 12, 13, 245, 8, 12, 13, 245, 7, 12, 13, 245, 6, 12, 13, 245, 5, 12, 13, 245, 4, 12, 13, 245, 3, 12, 13, 245, 2, 12, 13, 245, 1, 12, 13, 245, 0, 12, 13, 244, 255, 12, 13, 244, 254, 12, 13, 244, 253, 12, 13, 244, 252, 12, 13, 244, 251, 12, 13, 244, 250, 12, 13, @@ -12000,1825 +12000,1840 @@ 244, 217, 12, 13, 244, 216, 12, 13, 244, 215, 12, 13, 244, 214, 12, 13, 244, 213, 12, 13, 244, 212, 12, 13, 244, 211, 12, 13, 244, 210, 12, 13, 244, 209, 12, 13, 244, 208, 12, 13, 244, 207, 12, 13, 244, 206, 12, 13, - 244, 205, 12, 13, 244, 204, 12, 13, 244, 203, 12, 13, 244, 202, 12, 13, - 244, 201, 12, 13, 244, 200, 12, 13, 244, 199, 12, 13, 244, 198, 12, 13, - 243, 202, 12, 13, 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13, - 243, 198, 12, 13, 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13, - 243, 194, 12, 13, 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13, - 243, 190, 12, 13, 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13, - 243, 186, 12, 13, 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13, - 243, 182, 12, 13, 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13, - 243, 178, 12, 13, 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13, - 243, 174, 12, 13, 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13, - 243, 170, 12, 13, 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13, - 243, 166, 12, 13, 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13, - 243, 162, 12, 13, 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13, - 243, 158, 12, 13, 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13, - 243, 154, 12, 13, 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13, - 243, 150, 12, 13, 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13, - 243, 146, 12, 13, 243, 145, 12, 13, 243, 144, 12, 13, 243, 143, 12, 13, - 243, 142, 12, 13, 243, 141, 12, 13, 243, 140, 12, 13, 243, 139, 12, 13, - 242, 59, 12, 13, 242, 58, 12, 13, 242, 57, 12, 13, 242, 56, 12, 13, 242, - 55, 12, 13, 242, 54, 12, 13, 242, 53, 12, 13, 242, 52, 12, 13, 242, 51, - 12, 13, 240, 139, 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136, - 12, 13, 240, 135, 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132, - 12, 13, 240, 131, 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128, - 12, 13, 240, 127, 12, 13, 240, 126, 12, 13, 240, 125, 12, 13, 240, 124, - 12, 13, 240, 123, 12, 13, 240, 122, 12, 13, 240, 121, 12, 13, 235, 23, - 12, 13, 235, 22, 12, 13, 235, 21, 12, 13, 235, 20, 12, 13, 235, 19, 12, - 13, 235, 18, 12, 13, 235, 17, 12, 13, 235, 16, 12, 13, 233, 147, 12, 13, - 233, 146, 12, 13, 233, 145, 12, 13, 233, 144, 12, 13, 233, 143, 12, 13, - 233, 142, 12, 13, 233, 141, 12, 13, 233, 140, 12, 13, 233, 139, 12, 13, - 233, 138, 12, 13, 232, 50, 12, 13, 232, 49, 12, 13, 232, 48, 12, 13, 232, - 47, 12, 13, 232, 46, 12, 13, 232, 45, 12, 13, 232, 44, 12, 13, 232, 43, - 12, 13, 232, 42, 12, 13, 232, 41, 12, 13, 232, 40, 12, 13, 232, 39, 12, - 13, 232, 38, 12, 13, 232, 37, 12, 13, 232, 36, 12, 13, 232, 35, 12, 13, - 232, 34, 12, 13, 232, 33, 12, 13, 232, 32, 12, 13, 232, 31, 12, 13, 232, - 30, 12, 13, 232, 29, 12, 13, 232, 28, 12, 13, 232, 27, 12, 13, 232, 26, - 12, 13, 232, 25, 12, 13, 232, 24, 12, 13, 232, 23, 12, 13, 232, 22, 12, - 13, 232, 21, 12, 13, 232, 20, 12, 13, 232, 19, 12, 13, 232, 18, 12, 13, - 232, 17, 12, 13, 232, 16, 12, 13, 232, 15, 12, 13, 232, 14, 12, 13, 232, - 13, 12, 13, 232, 12, 12, 13, 232, 11, 12, 13, 232, 10, 12, 13, 232, 9, - 12, 13, 232, 8, 12, 13, 232, 7, 12, 13, 232, 6, 12, 13, 232, 5, 12, 13, - 232, 4, 12, 13, 232, 3, 12, 13, 232, 2, 12, 13, 232, 1, 12, 13, 232, 0, - 12, 13, 231, 255, 12, 13, 231, 254, 12, 13, 231, 253, 12, 13, 231, 252, - 12, 13, 231, 251, 12, 13, 231, 250, 12, 13, 231, 249, 12, 13, 231, 248, - 12, 13, 231, 247, 12, 13, 231, 246, 12, 13, 231, 245, 12, 13, 231, 244, - 12, 13, 231, 243, 12, 13, 231, 242, 12, 13, 231, 241, 12, 13, 230, 23, - 12, 13, 230, 22, 12, 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, 19, 12, - 13, 230, 18, 12, 13, 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, 12, 13, - 230, 14, 12, 13, 230, 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, 13, 230, - 10, 12, 13, 230, 9, 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, 6, 12, - 13, 230, 5, 12, 13, 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, 13, 230, - 1, 12, 13, 230, 0, 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, 229, 253, - 12, 13, 229, 252, 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, 229, 249, - 12, 13, 229, 248, 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, 229, 245, - 12, 13, 229, 244, 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, 229, 241, - 12, 13, 229, 240, 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, 229, 237, - 12, 13, 229, 236, 12, 13, 229, 235, 12, 13, 229, 234, 12, 13, 229, 233, - 12, 13, 229, 232, 12, 13, 229, 231, 12, 13, 228, 135, 12, 13, 228, 134, - 12, 13, 228, 133, 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, 228, 130, - 12, 13, 228, 129, 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, 228, 126, - 12, 13, 228, 125, 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, 228, 122, - 12, 13, 228, 121, 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, 228, 118, - 12, 13, 228, 117, 12, 13, 228, 116, 12, 13, 228, 115, 12, 13, 228, 114, - 12, 13, 227, 237, 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, 227, 234, - 12, 13, 227, 233, 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, 227, 230, - 12, 13, 227, 229, 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, 227, 226, - 12, 13, 227, 225, 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, 227, 222, - 12, 13, 227, 221, 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, 227, 218, - 12, 13, 227, 217, 12, 13, 227, 216, 12, 13, 227, 215, 12, 13, 227, 214, - 12, 13, 227, 213, 12, 13, 227, 212, 12, 13, 227, 77, 12, 13, 227, 76, 12, - 13, 227, 75, 12, 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13, - 227, 71, 12, 13, 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227, - 67, 12, 13, 227, 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63, - 12, 13, 227, 62, 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12, - 13, 227, 58, 12, 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13, - 227, 54, 12, 13, 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227, - 50, 12, 13, 227, 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46, - 12, 13, 227, 45, 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12, - 13, 227, 41, 12, 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13, - 227, 37, 12, 13, 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227, - 33, 12, 13, 227, 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29, - 12, 13, 227, 28, 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12, - 13, 227, 24, 12, 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13, - 227, 20, 12, 13, 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227, - 16, 12, 13, 227, 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12, - 12, 13, 227, 11, 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13, - 227, 7, 12, 13, 227, 6, 12, 13, 227, 5, 12, 13, 227, 4, 12, 13, 227, 3, - 12, 13, 226, 105, 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102, - 12, 13, 226, 101, 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12, - 13, 226, 97, 12, 13, 226, 96, 12, 13, 226, 95, 12, 13, 226, 94, 12, 13, - 226, 93, 12, 13, 224, 96, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224, - 93, 12, 13, 224, 92, 12, 13, 224, 91, 12, 13, 224, 90, 12, 13, 223, 223, - 12, 13, 223, 222, 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219, - 12, 13, 223, 218, 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215, - 12, 13, 223, 214, 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, - 12, 13, 223, 210, 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, - 12, 13, 223, 206, 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, - 12, 13, 223, 202, 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, - 12, 13, 223, 198, 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, - 12, 13, 223, 194, 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 223, 191, - 12, 13, 223, 190, 12, 13, 222, 89, 12, 13, 222, 88, 12, 13, 222, 87, 12, - 13, 222, 86, 12, 13, 222, 85, 12, 13, 222, 84, 12, 13, 222, 83, 12, 13, - 222, 82, 12, 13, 222, 81, 12, 13, 222, 80, 12, 13, 222, 79, 12, 13, 222, - 78, 12, 13, 222, 77, 12, 13, 222, 76, 12, 13, 222, 75, 12, 13, 222, 74, - 12, 13, 222, 73, 12, 13, 222, 72, 12, 13, 222, 71, 12, 13, 222, 70, 12, - 13, 222, 69, 12, 13, 222, 68, 12, 13, 222, 67, 12, 13, 222, 66, 12, 13, - 222, 65, 12, 13, 222, 64, 12, 13, 222, 63, 12, 13, 222, 62, 12, 13, 222, - 61, 12, 13, 222, 60, 12, 13, 222, 59, 12, 13, 222, 58, 12, 13, 222, 57, - 12, 13, 222, 56, 12, 13, 222, 55, 12, 13, 222, 54, 12, 13, 222, 53, 12, - 13, 222, 52, 12, 13, 222, 51, 12, 13, 222, 50, 12, 13, 222, 49, 12, 13, - 222, 48, 12, 13, 222, 47, 12, 13, 222, 46, 12, 13, 222, 45, 12, 13, 222, - 44, 12, 13, 222, 43, 12, 13, 222, 42, 12, 13, 222, 41, 12, 13, 222, 40, - 12, 13, 222, 39, 12, 13, 222, 38, 12, 13, 222, 37, 12, 13, 222, 36, 12, - 13, 217, 151, 12, 13, 217, 150, 12, 13, 217, 149, 12, 13, 217, 148, 12, - 13, 217, 147, 12, 13, 217, 146, 12, 13, 217, 145, 12, 13, 217, 144, 12, - 13, 217, 143, 12, 13, 217, 142, 12, 13, 217, 141, 12, 13, 217, 140, 12, - 13, 217, 139, 12, 13, 217, 138, 12, 13, 217, 137, 12, 13, 217, 136, 12, - 13, 217, 135, 12, 13, 217, 134, 12, 13, 217, 133, 12, 13, 217, 132, 12, - 13, 217, 131, 12, 13, 217, 130, 12, 13, 217, 129, 12, 13, 217, 128, 12, - 13, 217, 127, 12, 13, 217, 126, 12, 13, 217, 125, 12, 13, 217, 124, 12, - 13, 217, 123, 12, 13, 217, 122, 12, 13, 217, 121, 12, 13, 217, 120, 12, - 13, 217, 119, 12, 13, 217, 118, 12, 13, 217, 117, 12, 13, 217, 116, 12, - 13, 217, 115, 12, 13, 217, 114, 12, 13, 217, 113, 12, 13, 217, 112, 12, - 13, 217, 111, 12, 13, 217, 110, 12, 13, 217, 109, 12, 13, 217, 108, 12, - 13, 215, 22, 12, 13, 215, 21, 12, 13, 215, 20, 12, 13, 215, 19, 12, 13, - 215, 18, 12, 13, 215, 17, 12, 13, 215, 16, 12, 13, 215, 15, 12, 13, 215, - 14, 12, 13, 215, 13, 12, 13, 215, 12, 12, 13, 215, 11, 12, 13, 215, 10, - 12, 13, 215, 9, 12, 13, 215, 8, 12, 13, 215, 7, 12, 13, 215, 6, 12, 13, - 215, 5, 12, 13, 215, 4, 12, 13, 215, 3, 12, 13, 215, 2, 12, 13, 215, 1, - 12, 13, 215, 0, 12, 13, 214, 255, 12, 13, 214, 254, 12, 13, 214, 253, 12, - 13, 214, 252, 12, 13, 214, 251, 12, 13, 214, 250, 12, 13, 214, 249, 12, - 13, 214, 248, 12, 13, 214, 247, 12, 13, 214, 246, 12, 13, 214, 245, 12, - 13, 214, 244, 12, 13, 214, 243, 12, 13, 214, 242, 12, 13, 214, 241, 12, - 13, 214, 240, 12, 13, 214, 239, 12, 13, 214, 238, 12, 13, 214, 237, 12, - 13, 214, 236, 12, 13, 214, 235, 12, 13, 214, 234, 12, 13, 214, 233, 12, - 13, 214, 232, 12, 13, 214, 104, 12, 13, 214, 103, 12, 13, 214, 102, 12, - 13, 214, 101, 12, 13, 214, 100, 12, 13, 214, 99, 12, 13, 214, 98, 12, 13, - 214, 97, 12, 13, 214, 96, 12, 13, 214, 95, 12, 13, 214, 94, 12, 13, 214, - 93, 12, 13, 214, 92, 12, 13, 214, 91, 12, 13, 214, 90, 12, 13, 214, 89, - 12, 13, 214, 88, 12, 13, 214, 87, 12, 13, 214, 86, 12, 13, 214, 85, 12, - 13, 214, 84, 12, 13, 214, 83, 12, 13, 214, 82, 12, 13, 214, 81, 12, 13, - 214, 80, 12, 13, 214, 79, 12, 13, 214, 78, 12, 13, 214, 77, 12, 13, 214, - 76, 12, 13, 214, 75, 12, 13, 214, 74, 12, 13, 214, 73, 12, 13, 214, 72, - 12, 13, 214, 71, 12, 13, 214, 70, 12, 13, 214, 69, 12, 13, 214, 68, 12, - 13, 214, 67, 12, 13, 214, 66, 12, 13, 214, 65, 12, 13, 214, 64, 12, 13, - 214, 63, 12, 13, 214, 62, 12, 13, 214, 61, 12, 13, 214, 60, 12, 13, 214, - 59, 12, 13, 214, 58, 12, 13, 214, 57, 12, 13, 214, 56, 12, 13, 214, 55, - 12, 13, 214, 54, 12, 13, 214, 53, 12, 13, 214, 52, 12, 13, 214, 51, 12, - 13, 214, 50, 12, 13, 214, 49, 12, 13, 214, 48, 12, 13, 214, 47, 12, 13, - 214, 46, 12, 13, 214, 45, 12, 13, 214, 44, 12, 13, 214, 43, 12, 13, 214, - 42, 12, 13, 214, 41, 12, 13, 214, 40, 12, 13, 214, 39, 12, 13, 214, 38, - 12, 13, 214, 37, 12, 13, 214, 36, 12, 13, 214, 35, 12, 13, 214, 34, 12, - 13, 214, 33, 12, 13, 214, 32, 12, 13, 214, 31, 12, 13, 214, 30, 12, 13, - 214, 29, 12, 13, 214, 28, 12, 13, 212, 97, 12, 13, 212, 96, 12, 13, 212, - 95, 12, 13, 212, 94, 12, 13, 212, 93, 12, 13, 212, 92, 12, 13, 212, 91, - 12, 13, 212, 90, 12, 13, 212, 89, 12, 13, 212, 88, 12, 13, 212, 87, 12, - 13, 212, 86, 12, 13, 212, 85, 12, 13, 212, 84, 12, 13, 212, 83, 12, 13, - 212, 82, 12, 13, 212, 81, 12, 13, 212, 80, 12, 13, 212, 79, 12, 13, 212, - 78, 12, 13, 212, 77, 12, 13, 212, 76, 12, 13, 212, 75, 12, 13, 212, 74, - 12, 13, 212, 73, 12, 13, 212, 72, 12, 13, 212, 71, 12, 13, 212, 70, 12, - 13, 212, 69, 12, 13, 212, 68, 12, 13, 212, 67, 12, 13, 212, 66, 12, 13, - 211, 177, 12, 13, 211, 176, 12, 13, 211, 175, 12, 13, 211, 174, 12, 13, - 211, 173, 12, 13, 211, 172, 12, 13, 211, 171, 12, 13, 211, 170, 12, 13, - 211, 169, 12, 13, 211, 168, 12, 13, 211, 167, 12, 13, 211, 166, 12, 13, - 211, 115, 12, 13, 211, 114, 12, 13, 211, 113, 12, 13, 211, 112, 12, 13, - 211, 111, 12, 13, 211, 110, 12, 13, 211, 109, 12, 13, 211, 108, 12, 13, - 211, 107, 12, 13, 210, 158, 12, 13, 210, 157, 12, 13, 210, 156, 12, 13, - 210, 155, 12, 13, 210, 154, 12, 13, 210, 153, 12, 13, 210, 152, 12, 13, - 210, 151, 12, 13, 210, 150, 12, 13, 210, 149, 12, 13, 210, 148, 12, 13, - 210, 147, 12, 13, 210, 146, 12, 13, 210, 145, 12, 13, 210, 144, 12, 13, - 210, 143, 12, 13, 210, 142, 12, 13, 210, 141, 12, 13, 210, 140, 12, 13, - 210, 139, 12, 13, 210, 138, 12, 13, 210, 137, 12, 13, 210, 136, 12, 13, - 210, 135, 12, 13, 210, 134, 12, 13, 210, 133, 12, 13, 210, 132, 12, 13, - 210, 131, 12, 13, 210, 130, 12, 13, 210, 129, 12, 13, 210, 128, 12, 13, - 210, 127, 12, 13, 210, 126, 12, 13, 210, 125, 12, 13, 210, 124, 12, 13, - 210, 123, 12, 13, 210, 122, 12, 13, 210, 121, 12, 13, 210, 120, 12, 13, - 210, 119, 12, 13, 210, 118, 12, 13, 255, 73, 12, 13, 255, 72, 12, 13, - 255, 71, 12, 13, 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, 12, 13, 255, - 67, 12, 13, 255, 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, 13, 255, 63, - 12, 13, 255, 62, 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, 255, 59, 12, - 13, 255, 58, 12, 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, 55, 12, 13, - 255, 54, 12, 13, 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, 12, 13, 255, - 50, 12, 13, 255, 49, 12, 13, 255, 48, 12, 13, 255, 47, 12, 13, 255, 46, - 12, 13, 255, 45, 12, 13, 255, 44, 12, 13, 255, 43, 12, 13, 255, 42, 12, - 13, 255, 41, 12, 13, 255, 40, 20, 1, 167, 229, 13, 231, 17, 20, 1, 167, - 243, 71, 244, 37, 20, 1, 167, 224, 252, 231, 18, 225, 58, 20, 1, 167, - 224, 252, 231, 18, 225, 59, 20, 1, 167, 229, 227, 231, 17, 20, 1, 167, - 219, 222, 20, 1, 167, 216, 67, 231, 17, 20, 1, 167, 227, 119, 231, 17, - 20, 1, 167, 220, 20, 226, 91, 228, 170, 20, 1, 167, 224, 252, 226, 91, - 228, 171, 225, 58, 20, 1, 167, 224, 252, 226, 91, 228, 171, 225, 59, 20, - 1, 167, 231, 219, 20, 1, 167, 215, 120, 231, 220, 20, 1, 167, 229, 72, - 20, 1, 167, 231, 216, 20, 1, 167, 231, 177, 20, 1, 167, 230, 49, 20, 1, - 167, 220, 125, 20, 1, 167, 227, 242, 20, 1, 167, 234, 150, 20, 1, 167, - 228, 139, 20, 1, 167, 218, 5, 20, 1, 167, 229, 12, 20, 1, 167, 233, 88, - 20, 1, 167, 233, 13, 233, 190, 20, 1, 167, 227, 249, 231, 25, 20, 1, 167, - 231, 223, 20, 1, 167, 225, 247, 20, 1, 167, 242, 232, 20, 1, 167, 226, - 51, 20, 1, 167, 230, 152, 229, 46, 20, 1, 167, 227, 100, 231, 28, 20, 1, - 167, 104, 210, 188, 229, 221, 20, 1, 167, 242, 233, 20, 1, 167, 227, 249, - 227, 250, 20, 1, 167, 219, 129, 20, 1, 167, 231, 10, 20, 1, 167, 231, 31, - 20, 1, 167, 230, 131, 20, 1, 167, 234, 250, 20, 1, 167, 226, 91, 233, 48, - 20, 1, 167, 229, 150, 233, 48, 20, 1, 167, 225, 159, 20, 1, 167, 231, - 217, 20, 1, 167, 228, 208, 20, 1, 167, 224, 135, 20, 1, 167, 215, 117, - 20, 1, 167, 232, 95, 20, 1, 167, 219, 42, 20, 1, 167, 216, 217, 20, 1, - 167, 231, 214, 20, 1, 167, 234, 157, 20, 1, 167, 229, 146, 20, 1, 167, - 233, 202, 20, 1, 167, 230, 132, 20, 1, 167, 219, 219, 20, 1, 167, 232, - 139, 20, 1, 167, 244, 94, 20, 1, 167, 222, 200, 20, 1, 167, 233, 242, 20, - 1, 167, 219, 38, 20, 1, 167, 231, 174, 225, 100, 20, 1, 167, 220, 13, 20, - 1, 167, 227, 248, 20, 1, 167, 219, 254, 228, 3, 210, 196, 20, 1, 167, - 227, 139, 230, 149, 20, 1, 167, 226, 86, 20, 1, 167, 228, 140, 20, 1, - 167, 214, 170, 20, 1, 167, 229, 49, 20, 1, 167, 231, 213, 20, 1, 167, - 228, 182, 20, 1, 167, 231, 120, 20, 1, 167, 227, 152, 20, 1, 167, 216, - 221, 20, 1, 167, 219, 35, 20, 1, 167, 226, 87, 20, 1, 167, 228, 7, 20, 1, - 167, 231, 221, 20, 1, 167, 227, 149, 20, 1, 167, 234, 217, 20, 1, 167, - 228, 10, 20, 1, 167, 213, 250, 20, 1, 167, 232, 99, 20, 1, 167, 229, 99, - 20, 1, 167, 229, 197, 20, 1, 167, 231, 119, 20, 1, 225, 139, 228, 5, 20, - 1, 225, 139, 215, 120, 231, 218, 20, 1, 225, 139, 219, 186, 20, 1, 225, - 139, 220, 129, 215, 119, 20, 1, 225, 139, 232, 141, 227, 245, 20, 1, 225, - 139, 231, 126, 231, 222, 20, 1, 225, 139, 234, 88, 20, 1, 225, 139, 211, - 15, 20, 1, 225, 139, 231, 121, 20, 1, 225, 139, 234, 238, 20, 1, 225, - 139, 225, 209, 20, 1, 225, 139, 211, 89, 233, 48, 20, 1, 225, 139, 233, - 104, 228, 3, 227, 161, 20, 1, 225, 139, 227, 243, 220, 39, 20, 1, 225, - 139, 229, 117, 228, 185, 20, 1, 225, 139, 242, 230, 20, 1, 225, 139, 225, - 50, 20, 1, 225, 139, 215, 120, 228, 1, 20, 1, 225, 139, 220, 44, 228, - 180, 20, 1, 225, 139, 220, 40, 20, 1, 225, 139, 231, 18, 216, 220, 20, 1, - 225, 139, 231, 108, 231, 122, 20, 1, 225, 139, 227, 150, 227, 245, 20, 1, - 225, 139, 234, 146, 20, 1, 225, 139, 242, 231, 20, 1, 225, 139, 234, 142, - 20, 1, 225, 139, 233, 130, 20, 1, 225, 139, 225, 250, 20, 1, 225, 139, - 213, 182, 20, 1, 225, 139, 229, 14, 230, 47, 20, 1, 225, 139, 229, 48, - 231, 104, 20, 1, 225, 139, 211, 193, 20, 1, 225, 139, 222, 12, 20, 1, - 225, 139, 217, 98, 20, 1, 225, 139, 231, 30, 20, 1, 225, 139, 229, 33, - 20, 1, 225, 139, 229, 34, 233, 85, 20, 1, 225, 139, 231, 20, 20, 1, 225, - 139, 218, 53, 20, 1, 225, 139, 231, 112, 20, 1, 225, 139, 230, 134, 20, - 1, 225, 139, 227, 164, 20, 1, 225, 139, 224, 139, 20, 1, 225, 139, 231, - 29, 229, 50, 20, 1, 225, 139, 244, 127, 20, 1, 225, 139, 231, 99, 20, 1, - 225, 139, 244, 148, 20, 1, 225, 139, 234, 154, 20, 1, 225, 139, 231, 240, - 228, 174, 20, 1, 225, 139, 231, 240, 228, 150, 20, 1, 225, 139, 233, 12, - 20, 1, 225, 139, 229, 56, 20, 1, 225, 139, 228, 12, 20, 1, 225, 139, 185, - 20, 1, 225, 139, 234, 75, 20, 1, 225, 139, 229, 2, 20, 1, 137, 229, 13, - 231, 220, 20, 1, 137, 227, 118, 20, 1, 137, 210, 196, 20, 1, 137, 212, - 53, 20, 1, 137, 229, 49, 20, 1, 137, 229, 138, 20, 1, 137, 229, 20, 20, - 1, 137, 242, 240, 20, 1, 137, 231, 116, 20, 1, 137, 243, 78, 20, 1, 137, - 227, 141, 230, 171, 231, 32, 20, 1, 137, 227, 241, 231, 107, 20, 1, 137, - 231, 113, 20, 1, 137, 225, 56, 20, 1, 137, 229, 123, 20, 1, 137, 231, - 124, 251, 30, 20, 1, 137, 234, 144, 20, 1, 137, 242, 241, 20, 1, 137, - 234, 151, 20, 1, 137, 210, 213, 230, 77, 20, 1, 137, 227, 112, 20, 1, - 137, 231, 101, 20, 1, 137, 228, 11, 20, 1, 137, 231, 107, 20, 1, 137, - 211, 16, 20, 1, 137, 233, 250, 20, 1, 137, 235, 11, 20, 1, 137, 220, 124, - 20, 1, 137, 229, 132, 20, 1, 137, 217, 96, 20, 1, 137, 228, 154, 20, 1, - 137, 216, 67, 210, 198, 20, 1, 137, 218, 80, 20, 1, 137, 229, 40, 227, - 161, 20, 1, 137, 213, 181, 20, 1, 137, 229, 200, 20, 1, 137, 231, 240, - 234, 153, 20, 1, 137, 227, 250, 20, 1, 137, 229, 35, 20, 1, 137, 233, 89, - 20, 1, 137, 231, 109, 20, 1, 137, 231, 9, 20, 1, 137, 227, 244, 20, 1, - 137, 216, 216, 20, 1, 137, 229, 37, 20, 1, 137, 243, 234, 20, 1, 137, - 229, 137, 20, 1, 137, 228, 13, 20, 1, 137, 228, 9, 20, 1, 137, 251, 108, - 20, 1, 137, 213, 183, 20, 1, 137, 231, 114, 20, 1, 137, 222, 141, 20, 1, - 137, 228, 184, 20, 1, 137, 233, 103, 20, 1, 137, 216, 65, 20, 1, 137, - 227, 251, 229, 2, 20, 1, 137, 228, 176, 20, 1, 137, 234, 157, 20, 1, 137, - 229, 41, 20, 1, 137, 231, 213, 20, 1, 137, 231, 102, 20, 1, 137, 232, 99, - 20, 1, 137, 233, 190, 20, 1, 137, 228, 182, 20, 1, 137, 229, 2, 20, 1, - 137, 211, 184, 20, 1, 137, 229, 38, 20, 1, 137, 227, 254, 20, 1, 137, - 227, 246, 20, 1, 137, 233, 204, 228, 140, 20, 1, 137, 227, 252, 20, 1, - 137, 229, 145, 20, 1, 137, 231, 240, 228, 1, 20, 1, 137, 211, 103, 20, 1, - 137, 229, 144, 20, 1, 137, 219, 221, 20, 1, 137, 220, 127, 20, 1, 137, - 231, 110, 20, 1, 137, 231, 220, 20, 1, 137, 231, 120, 20, 1, 137, 234, - 145, 20, 1, 137, 231, 111, 20, 1, 137, 234, 149, 20, 1, 137, 231, 124, - 225, 104, 20, 1, 137, 210, 179, 20, 1, 137, 228, 172, 20, 1, 137, 230, - 221, 20, 1, 137, 230, 101, 20, 1, 137, 220, 16, 20, 1, 137, 234, 167, - 233, 71, 20, 1, 137, 234, 167, 244, 161, 20, 1, 137, 229, 70, 20, 1, 137, - 229, 197, 20, 1, 137, 232, 201, 20, 1, 137, 225, 66, 20, 1, 137, 225, - 200, 20, 1, 137, 216, 231, 20, 1, 107, 231, 100, 20, 1, 107, 212, 51, 20, - 1, 107, 228, 170, 20, 1, 107, 231, 17, 20, 1, 107, 228, 168, 20, 1, 107, - 232, 236, 20, 1, 107, 228, 173, 20, 1, 107, 228, 8, 20, 1, 107, 229, 55, - 20, 1, 107, 227, 161, 20, 1, 107, 211, 194, 20, 1, 107, 229, 10, 20, 1, - 107, 220, 62, 20, 1, 107, 229, 21, 20, 1, 107, 234, 152, 20, 1, 107, 216, - 218, 20, 1, 107, 220, 42, 20, 1, 107, 228, 181, 20, 1, 107, 218, 53, 20, - 1, 107, 234, 157, 20, 1, 107, 211, 91, 20, 1, 107, 233, 205, 20, 1, 107, - 221, 235, 20, 1, 107, 231, 22, 20, 1, 107, 229, 136, 20, 1, 107, 231, - 189, 20, 1, 107, 231, 28, 20, 1, 107, 220, 126, 20, 1, 107, 211, 39, 20, - 1, 107, 228, 175, 20, 1, 107, 234, 148, 231, 103, 20, 1, 107, 229, 17, - 20, 1, 107, 215, 119, 20, 1, 107, 242, 249, 20, 1, 107, 229, 7, 20, 1, - 107, 244, 128, 20, 1, 107, 229, 140, 20, 1, 107, 231, 1, 20, 1, 107, 233, - 6, 20, 1, 107, 229, 122, 20, 1, 107, 230, 148, 20, 1, 107, 231, 5, 20, 1, - 107, 224, 119, 20, 1, 107, 231, 3, 20, 1, 107, 231, 19, 20, 1, 107, 232, - 85, 20, 1, 107, 228, 0, 20, 1, 107, 231, 123, 20, 1, 107, 233, 181, 20, - 1, 107, 227, 152, 20, 1, 107, 216, 221, 20, 1, 107, 219, 35, 20, 1, 107, - 210, 179, 20, 1, 107, 234, 149, 20, 1, 107, 223, 171, 20, 1, 107, 217, - 11, 20, 1, 107, 229, 18, 20, 1, 107, 231, 24, 20, 1, 107, 227, 255, 20, - 1, 107, 234, 147, 20, 1, 107, 225, 60, 20, 1, 107, 225, 153, 20, 1, 107, - 227, 128, 20, 1, 107, 233, 12, 20, 1, 107, 229, 56, 20, 1, 107, 231, 21, - 20, 1, 107, 229, 30, 20, 1, 107, 210, 193, 20, 1, 107, 226, 22, 20, 1, - 107, 210, 192, 20, 1, 107, 229, 145, 20, 1, 107, 227, 245, 20, 1, 107, - 218, 82, 20, 1, 107, 233, 209, 20, 1, 107, 229, 45, 20, 1, 107, 229, 15, - 20, 1, 107, 215, 103, 20, 1, 107, 231, 32, 20, 1, 107, 233, 199, 20, 1, - 107, 227, 253, 20, 1, 107, 216, 219, 20, 1, 107, 231, 215, 20, 1, 107, - 229, 54, 20, 1, 107, 233, 5, 20, 1, 107, 229, 36, 20, 1, 107, 228, 2, 20, - 1, 107, 228, 154, 20, 1, 107, 242, 234, 20, 1, 107, 233, 218, 20, 1, 107, - 223, 85, 226, 210, 20, 1, 107, 217, 87, 20, 1, 107, 216, 11, 20, 1, 107, - 227, 149, 20, 1, 107, 222, 240, 20, 1, 107, 233, 50, 20, 1, 107, 231, 80, - 20, 1, 107, 193, 20, 1, 107, 218, 5, 20, 1, 107, 230, 103, 20, 1, 107, - 220, 28, 20, 1, 107, 220, 38, 20, 1, 107, 233, 156, 20, 1, 107, 227, 238, - 20, 1, 107, 219, 226, 20, 1, 107, 227, 247, 20, 1, 107, 225, 212, 20, 1, - 107, 228, 234, 20, 1, 107, 219, 253, 20, 1, 107, 224, 134, 20, 1, 107, - 230, 47, 20, 1, 107, 232, 120, 20, 1, 107, 223, 85, 230, 97, 20, 1, 107, - 216, 118, 20, 1, 107, 227, 239, 20, 1, 107, 231, 124, 198, 20, 1, 107, - 221, 233, 20, 1, 107, 244, 196, 20, 1, 82, 229, 144, 20, 1, 82, 216, 17, - 20, 1, 82, 231, 113, 20, 1, 82, 233, 89, 20, 1, 82, 213, 128, 20, 1, 82, - 232, 126, 20, 1, 82, 226, 90, 20, 1, 82, 219, 46, 20, 1, 82, 223, 146, - 20, 1, 82, 228, 4, 20, 1, 82, 229, 115, 20, 1, 82, 224, 148, 20, 1, 82, - 217, 63, 20, 1, 82, 229, 23, 20, 1, 82, 233, 246, 20, 1, 82, 211, 187, - 20, 1, 82, 221, 171, 20, 1, 82, 229, 46, 20, 1, 82, 226, 87, 20, 1, 82, - 216, 18, 20, 1, 82, 233, 203, 20, 1, 82, 232, 140, 20, 1, 82, 228, 7, 20, - 1, 82, 228, 255, 20, 1, 82, 231, 221, 20, 1, 82, 229, 16, 20, 1, 82, 228, - 254, 20, 1, 82, 228, 6, 20, 1, 82, 222, 238, 20, 1, 82, 228, 172, 20, 1, - 82, 225, 211, 20, 1, 82, 222, 32, 20, 1, 82, 229, 31, 20, 1, 82, 231, 11, - 20, 1, 82, 242, 228, 20, 1, 82, 229, 19, 20, 1, 82, 228, 183, 20, 1, 82, - 231, 173, 20, 1, 82, 232, 122, 20, 1, 82, 229, 51, 20, 1, 82, 229, 128, - 20, 1, 82, 217, 86, 227, 245, 20, 1, 82, 220, 128, 20, 1, 82, 224, 144, - 20, 1, 82, 229, 148, 219, 52, 20, 1, 82, 229, 39, 227, 161, 20, 1, 82, - 211, 4, 20, 1, 82, 242, 229, 20, 1, 82, 215, 118, 20, 1, 82, 211, 19, 20, - 1, 82, 225, 17, 20, 1, 82, 215, 108, 20, 1, 82, 234, 155, 20, 1, 82, 218, - 81, 20, 1, 82, 216, 220, 20, 1, 82, 213, 184, 20, 1, 82, 212, 6, 20, 1, - 82, 233, 133, 20, 1, 82, 224, 151, 20, 1, 82, 217, 97, 20, 1, 82, 242, - 248, 20, 1, 82, 229, 60, 20, 1, 82, 220, 41, 20, 1, 82, 231, 6, 20, 1, - 82, 231, 117, 20, 1, 82, 227, 116, 20, 1, 82, 228, 137, 20, 1, 82, 243, - 74, 20, 1, 82, 215, 109, 20, 1, 82, 233, 212, 20, 1, 82, 211, 67, 20, 1, - 82, 227, 150, 250, 17, 20, 1, 82, 210, 250, 20, 1, 82, 231, 23, 20, 1, - 82, 229, 133, 20, 1, 82, 225, 101, 20, 1, 82, 210, 197, 20, 1, 82, 233, - 7, 20, 1, 82, 243, 234, 20, 1, 82, 243, 73, 20, 1, 82, 229, 9, 20, 1, 82, - 234, 157, 20, 1, 82, 231, 224, 20, 1, 82, 229, 22, 20, 1, 82, 242, 235, - 20, 1, 82, 244, 197, 20, 1, 82, 227, 240, 20, 1, 82, 225, 154, 20, 1, 82, - 211, 17, 20, 1, 82, 229, 47, 20, 1, 82, 227, 150, 252, 24, 20, 1, 82, - 227, 96, 20, 1, 82, 224, 248, 20, 1, 82, 230, 221, 20, 1, 82, 243, 232, - 20, 1, 82, 229, 221, 20, 1, 82, 230, 101, 20, 1, 82, 242, 234, 20, 1, 82, - 243, 236, 73, 20, 1, 82, 230, 48, 20, 1, 82, 224, 147, 20, 1, 82, 229, - 11, 20, 1, 82, 233, 190, 20, 1, 82, 225, 98, 20, 1, 82, 227, 248, 20, 1, - 82, 211, 18, 20, 1, 82, 229, 32, 20, 1, 82, 226, 91, 225, 188, 20, 1, 82, - 243, 236, 251, 16, 20, 1, 82, 244, 38, 20, 1, 82, 228, 177, 20, 1, 82, - 61, 20, 1, 82, 216, 11, 20, 1, 82, 76, 20, 1, 82, 73, 20, 1, 82, 233, 87, - 20, 1, 82, 226, 91, 225, 24, 20, 1, 82, 217, 102, 20, 1, 82, 217, 52, 20, - 1, 82, 229, 148, 230, 35, 240, 235, 20, 1, 82, 220, 16, 20, 1, 82, 211, - 14, 20, 1, 82, 228, 248, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217, - 241, 20, 1, 82, 210, 227, 249, 148, 20, 1, 82, 210, 187, 20, 1, 82, 210, - 195, 20, 1, 82, 234, 143, 20, 1, 82, 225, 152, 20, 1, 82, 228, 178, 245, - 103, 20, 1, 82, 224, 145, 20, 1, 82, 211, 192, 20, 1, 82, 244, 148, 20, - 1, 82, 213, 250, 20, 1, 82, 232, 99, 20, 1, 82, 230, 231, 20, 1, 82, 223, - 52, 20, 1, 82, 223, 172, 20, 1, 82, 228, 247, 20, 1, 82, 229, 78, 20, 1, - 82, 220, 8, 20, 1, 82, 219, 253, 20, 1, 82, 243, 236, 223, 87, 20, 1, 82, - 197, 20, 1, 82, 225, 109, 20, 1, 82, 232, 120, 20, 1, 82, 234, 29, 20, 1, - 82, 231, 59, 20, 1, 82, 185, 20, 1, 82, 231, 170, 20, 1, 82, 216, 222, - 20, 1, 82, 234, 93, 20, 1, 82, 230, 151, 20, 1, 82, 216, 248, 20, 1, 82, - 244, 170, 20, 1, 82, 242, 224, 20, 1, 225, 138, 176, 20, 1, 225, 138, 70, - 20, 1, 225, 138, 233, 218, 20, 1, 225, 138, 245, 210, 20, 1, 225, 138, - 223, 109, 20, 1, 225, 138, 217, 87, 20, 1, 225, 138, 227, 149, 20, 1, - 225, 138, 233, 136, 20, 1, 225, 138, 222, 240, 20, 1, 225, 138, 223, 30, - 20, 1, 225, 138, 231, 80, 20, 1, 225, 138, 217, 102, 20, 1, 225, 138, - 229, 147, 20, 1, 225, 138, 228, 184, 20, 1, 225, 138, 193, 20, 1, 225, - 138, 218, 5, 20, 1, 225, 138, 220, 28, 20, 1, 225, 138, 219, 192, 20, 1, - 225, 138, 220, 124, 20, 1, 225, 138, 233, 156, 20, 1, 225, 138, 234, 157, - 20, 1, 225, 138, 227, 210, 20, 1, 225, 138, 227, 238, 20, 1, 225, 138, - 228, 155, 20, 1, 225, 138, 210, 226, 20, 1, 225, 138, 219, 226, 20, 1, - 225, 138, 191, 20, 1, 225, 138, 228, 10, 20, 1, 225, 138, 225, 152, 20, - 1, 225, 138, 227, 247, 20, 1, 225, 138, 211, 192, 20, 1, 225, 138, 225, - 212, 20, 1, 225, 138, 222, 141, 20, 1, 225, 138, 228, 234, 20, 1, 225, - 138, 223, 52, 20, 1, 225, 138, 234, 166, 20, 1, 225, 138, 229, 8, 20, 1, - 225, 138, 229, 57, 20, 1, 225, 138, 220, 8, 20, 1, 225, 138, 224, 148, - 20, 1, 225, 138, 244, 38, 20, 1, 225, 138, 212, 65, 20, 1, 225, 138, 232, - 242, 20, 1, 225, 138, 232, 120, 20, 1, 225, 138, 234, 29, 20, 1, 225, - 138, 231, 115, 20, 1, 225, 138, 223, 84, 20, 1, 225, 138, 185, 20, 1, - 225, 138, 230, 162, 20, 1, 225, 138, 231, 123, 20, 1, 225, 138, 216, 231, - 20, 1, 225, 138, 233, 252, 20, 1, 225, 138, 221, 252, 20, 1, 225, 138, - 212, 115, 95, 1, 190, 95, 1, 252, 192, 95, 1, 8, 190, 95, 1, 225, 43, 95, - 1, 185, 95, 1, 230, 234, 95, 1, 254, 24, 185, 95, 1, 244, 197, 95, 1, - 214, 27, 95, 1, 213, 177, 95, 1, 217, 106, 95, 1, 248, 222, 95, 1, 8, - 215, 157, 95, 1, 8, 217, 106, 95, 1, 215, 157, 95, 1, 248, 136, 95, 1, - 197, 95, 1, 228, 238, 95, 1, 8, 228, 111, 95, 1, 254, 24, 197, 95, 1, - 228, 111, 95, 1, 228, 97, 95, 1, 233, 136, 95, 1, 232, 62, 95, 1, 232, - 255, 95, 1, 232, 244, 95, 1, 216, 57, 95, 1, 247, 154, 95, 1, 216, 49, - 95, 1, 247, 153, 95, 1, 176, 95, 1, 243, 136, 95, 1, 8, 176, 95, 1, 224, - 89, 95, 1, 224, 67, 95, 1, 229, 78, 95, 1, 229, 29, 95, 1, 254, 24, 229, - 78, 95, 1, 162, 95, 1, 211, 165, 95, 1, 242, 250, 95, 1, 242, 227, 95, 1, - 215, 166, 95, 1, 246, 27, 95, 1, 227, 166, 95, 1, 227, 151, 95, 1, 215, - 176, 95, 1, 246, 34, 95, 1, 8, 215, 176, 95, 1, 8, 246, 34, 95, 1, 223, - 107, 215, 176, 95, 1, 220, 103, 95, 1, 218, 224, 95, 1, 210, 82, 95, 1, - 210, 14, 95, 1, 215, 184, 95, 1, 246, 39, 95, 1, 8, 215, 184, 95, 1, 206, - 95, 1, 210, 116, 95, 1, 210, 15, 95, 1, 209, 243, 95, 1, 209, 223, 95, 1, - 254, 24, 209, 243, 95, 1, 209, 215, 95, 1, 209, 222, 95, 1, 212, 65, 95, - 1, 254, 210, 95, 1, 241, 190, 95, 1, 229, 193, 95, 5, 253, 223, 95, 5, - 223, 107, 213, 133, 95, 5, 223, 107, 253, 223, 95, 25, 5, 61, 95, 25, 5, - 255, 74, 95, 25, 5, 254, 206, 95, 25, 5, 254, 124, 95, 25, 5, 254, 116, - 95, 25, 5, 76, 95, 25, 5, 226, 184, 95, 25, 5, 211, 227, 95, 25, 5, 212, - 98, 95, 25, 5, 75, 95, 25, 5, 245, 151, 95, 25, 5, 245, 139, 95, 25, 5, - 226, 233, 95, 25, 5, 73, 95, 25, 5, 240, 120, 95, 25, 5, 240, 119, 95, - 25, 5, 240, 118, 95, 25, 5, 235, 190, 95, 25, 5, 236, 61, 95, 25, 5, 236, - 34, 95, 25, 5, 235, 157, 95, 25, 5, 235, 232, 95, 25, 5, 70, 95, 25, 5, - 214, 229, 95, 25, 5, 214, 228, 95, 25, 5, 214, 227, 95, 25, 5, 214, 118, - 95, 25, 5, 214, 211, 95, 25, 5, 214, 178, 95, 25, 5, 211, 117, 95, 25, 5, - 211, 8, 95, 25, 5, 254, 244, 95, 25, 5, 254, 240, 95, 25, 5, 245, 87, 95, - 25, 5, 222, 184, 245, 87, 95, 25, 5, 245, 93, 95, 25, 5, 222, 184, 245, - 93, 95, 25, 5, 254, 202, 95, 25, 5, 245, 196, 95, 25, 5, 253, 193, 95, - 25, 5, 226, 135, 95, 25, 5, 230, 26, 95, 25, 5, 229, 80, 95, 138, 222, - 252, 95, 138, 216, 15, 222, 252, 95, 138, 48, 95, 138, 51, 95, 1, 216, - 29, 95, 1, 216, 28, 95, 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95, - 1, 216, 24, 95, 1, 216, 23, 95, 1, 223, 107, 216, 30, 95, 1, 223, 107, - 216, 29, 95, 1, 223, 107, 216, 27, 95, 1, 223, 107, 216, 26, 95, 1, 223, - 107, 216, 25, 95, 1, 223, 107, 216, 23, 56, 1, 254, 24, 75, 141, 1, 254, - 24, 211, 47, 49, 28, 16, 224, 155, 49, 28, 16, 248, 159, 49, 28, 16, 225, - 176, 49, 28, 16, 226, 114, 245, 179, 49, 28, 16, 226, 114, 247, 202, 49, - 28, 16, 214, 16, 245, 179, 49, 28, 16, 214, 16, 247, 202, 49, 28, 16, - 234, 198, 49, 28, 16, 217, 170, 49, 28, 16, 226, 10, 49, 28, 16, 210, - 217, 49, 28, 16, 210, 218, 247, 202, 49, 28, 16, 233, 235, 49, 28, 16, - 254, 69, 245, 179, 49, 28, 16, 245, 27, 245, 179, 49, 28, 16, 217, 3, 49, - 28, 16, 234, 162, 49, 28, 16, 254, 59, 49, 28, 16, 254, 60, 247, 202, 49, - 28, 16, 217, 176, 49, 28, 16, 216, 160, 49, 28, 16, 226, 207, 254, 22, - 49, 28, 16, 242, 160, 254, 22, 49, 28, 16, 224, 154, 49, 28, 16, 250, - 150, 49, 28, 16, 214, 6, 49, 28, 16, 235, 165, 254, 22, 49, 28, 16, 234, - 164, 254, 22, 49, 28, 16, 234, 163, 254, 22, 49, 28, 16, 221, 214, 49, - 28, 16, 226, 1, 49, 28, 16, 218, 147, 254, 62, 49, 28, 16, 226, 113, 254, - 22, 49, 28, 16, 214, 15, 254, 22, 49, 28, 16, 254, 63, 254, 22, 49, 28, - 16, 254, 57, 49, 28, 16, 234, 38, 49, 28, 16, 223, 47, 49, 28, 16, 225, - 107, 254, 22, 49, 28, 16, 216, 84, 49, 28, 16, 254, 122, 49, 28, 16, 221, - 160, 49, 28, 16, 217, 179, 254, 22, 49, 28, 16, 217, 179, 231, 41, 218, - 145, 49, 28, 16, 226, 108, 254, 22, 49, 28, 16, 216, 191, 49, 28, 16, - 233, 28, 49, 28, 16, 246, 42, 49, 28, 16, 215, 228, 49, 28, 16, 216, 233, - 49, 28, 16, 233, 238, 49, 28, 16, 254, 69, 245, 27, 229, 96, 49, 28, 16, - 243, 237, 254, 22, 49, 28, 16, 236, 13, 49, 28, 16, 215, 200, 254, 22, - 49, 28, 16, 234, 201, 215, 199, 49, 28, 16, 225, 201, 49, 28, 16, 224, - 159, 49, 28, 16, 234, 12, 49, 28, 16, 250, 81, 254, 22, 49, 28, 16, 223, - 147, 49, 28, 16, 226, 13, 254, 22, 49, 28, 16, 226, 11, 254, 22, 49, 28, - 16, 240, 110, 49, 28, 16, 229, 204, 49, 28, 16, 225, 157, 49, 28, 16, - 234, 13, 254, 150, 49, 28, 16, 215, 200, 254, 150, 49, 28, 16, 218, 124, - 49, 28, 16, 242, 124, 49, 28, 16, 235, 165, 229, 96, 49, 28, 16, 226, - 207, 229, 96, 49, 28, 16, 226, 114, 229, 96, 49, 28, 16, 225, 156, 49, - 28, 16, 233, 255, 49, 28, 16, 225, 155, 49, 28, 16, 233, 237, 49, 28, 16, - 225, 202, 229, 96, 49, 28, 16, 234, 163, 229, 97, 254, 97, 49, 28, 16, - 234, 164, 229, 97, 254, 97, 49, 28, 16, 210, 215, 49, 28, 16, 254, 60, - 229, 96, 49, 28, 16, 254, 61, 217, 177, 229, 96, 49, 28, 16, 210, 216, - 49, 28, 16, 233, 236, 49, 28, 16, 245, 174, 49, 28, 16, 250, 151, 49, 28, - 16, 230, 199, 235, 164, 49, 28, 16, 214, 16, 229, 96, 49, 28, 16, 225, - 107, 229, 96, 49, 28, 16, 224, 160, 229, 96, 49, 28, 16, 226, 204, 49, - 28, 16, 254, 85, 49, 28, 16, 232, 59, 49, 28, 16, 226, 11, 229, 96, 49, - 28, 16, 226, 13, 229, 96, 49, 28, 16, 245, 61, 226, 12, 49, 28, 16, 233, - 154, 49, 28, 16, 254, 86, 49, 28, 16, 215, 200, 229, 96, 49, 28, 16, 245, - 177, 49, 28, 16, 217, 179, 229, 96, 49, 28, 16, 217, 171, 49, 28, 16, - 250, 81, 229, 96, 49, 28, 16, 245, 107, 49, 28, 16, 221, 161, 229, 96, - 49, 28, 16, 211, 151, 234, 38, 49, 28, 16, 215, 197, 49, 28, 16, 224, - 161, 49, 28, 16, 215, 201, 49, 28, 16, 215, 198, 49, 28, 16, 224, 158, - 49, 28, 16, 215, 196, 49, 28, 16, 224, 157, 49, 28, 16, 242, 159, 49, 28, - 16, 254, 15, 49, 28, 16, 245, 61, 254, 15, 49, 28, 16, 226, 108, 229, 96, - 49, 28, 16, 216, 190, 245, 70, 49, 28, 16, 216, 190, 245, 26, 49, 28, 16, - 216, 192, 254, 64, 49, 28, 16, 216, 185, 234, 248, 254, 56, 49, 28, 16, - 234, 200, 49, 28, 16, 245, 140, 49, 28, 16, 211, 11, 234, 197, 49, 28, - 16, 211, 11, 254, 97, 49, 28, 16, 218, 146, 49, 28, 16, 234, 39, 254, 97, - 49, 28, 16, 247, 203, 254, 22, 49, 28, 16, 233, 239, 254, 22, 49, 28, 16, - 233, 239, 254, 150, 49, 28, 16, 233, 239, 229, 96, 49, 28, 16, 254, 63, - 229, 96, 49, 28, 16, 254, 65, 49, 28, 16, 247, 202, 49, 28, 16, 215, 211, - 49, 28, 16, 216, 225, 49, 28, 16, 234, 3, 49, 28, 16, 233, 33, 245, 135, - 250, 72, 49, 28, 16, 233, 33, 246, 43, 250, 73, 49, 28, 16, 233, 33, 215, - 213, 250, 73, 49, 28, 16, 233, 33, 216, 235, 250, 73, 49, 28, 16, 233, - 33, 236, 8, 250, 72, 49, 28, 16, 242, 160, 229, 97, 254, 97, 49, 28, 16, - 242, 160, 226, 2, 254, 11, 49, 28, 16, 242, 160, 226, 2, 248, 30, 49, 28, - 16, 247, 226, 49, 28, 16, 247, 227, 226, 2, 254, 12, 234, 197, 49, 28, - 16, 247, 227, 226, 2, 254, 12, 254, 97, 49, 28, 16, 247, 227, 226, 2, - 248, 30, 49, 28, 16, 215, 217, 49, 28, 16, 254, 16, 49, 28, 16, 236, 15, - 49, 28, 16, 247, 247, 49, 28, 16, 254, 212, 225, 1, 254, 17, 49, 28, 16, - 254, 212, 254, 14, 49, 28, 16, 254, 212, 254, 17, 49, 28, 16, 254, 212, - 231, 35, 49, 28, 16, 254, 212, 231, 46, 49, 28, 16, 254, 212, 242, 161, - 49, 28, 16, 254, 212, 242, 158, 49, 28, 16, 254, 212, 225, 1, 242, 161, - 49, 28, 16, 231, 152, 224, 166, 240, 108, 49, 28, 16, 231, 152, 254, 152, - 224, 166, 240, 108, 49, 28, 16, 231, 152, 248, 29, 240, 108, 49, 28, 16, - 231, 152, 254, 152, 248, 29, 240, 108, 49, 28, 16, 231, 152, 215, 206, - 240, 108, 49, 28, 16, 231, 152, 215, 218, 49, 28, 16, 231, 152, 216, 229, - 240, 108, 49, 28, 16, 231, 152, 216, 229, 233, 36, 240, 108, 49, 28, 16, - 231, 152, 233, 36, 240, 108, 49, 28, 16, 231, 152, 225, 40, 240, 108, 49, - 28, 16, 235, 170, 216, 252, 240, 109, 49, 28, 16, 254, 61, 216, 252, 240, - 109, 49, 28, 16, 244, 173, 216, 226, 49, 28, 16, 244, 173, 230, 144, 49, - 28, 16, 244, 173, 247, 231, 49, 28, 16, 231, 152, 214, 10, 240, 108, 49, - 28, 16, 231, 152, 224, 165, 240, 108, 49, 28, 16, 231, 152, 225, 40, 216, - 229, 240, 108, 49, 28, 16, 242, 156, 230, 27, 254, 64, 49, 28, 16, 242, - 156, 230, 27, 247, 201, 49, 28, 16, 245, 149, 234, 248, 243, 237, 213, - 124, 49, 28, 16, 236, 14, 49, 28, 16, 236, 12, 49, 28, 16, 243, 237, 254, - 23, 248, 28, 240, 107, 49, 28, 16, 243, 237, 247, 245, 190, 49, 28, 16, - 243, 237, 247, 245, 229, 204, 49, 28, 16, 243, 237, 229, 199, 240, 108, - 49, 28, 16, 243, 237, 247, 245, 248, 4, 49, 28, 16, 243, 237, 219, 103, - 247, 244, 248, 4, 49, 28, 16, 243, 237, 247, 245, 234, 183, 49, 28, 16, - 243, 237, 247, 245, 210, 23, 49, 28, 16, 243, 237, 247, 245, 228, 235, - 234, 197, 49, 28, 16, 243, 237, 247, 245, 228, 235, 254, 97, 49, 28, 16, - 243, 237, 231, 192, 250, 74, 247, 231, 49, 28, 16, 243, 237, 231, 192, - 250, 74, 230, 144, 49, 28, 16, 244, 123, 219, 103, 250, 74, 214, 9, 49, - 28, 16, 243, 237, 219, 103, 250, 74, 217, 180, 49, 28, 16, 243, 237, 229, - 98, 49, 28, 16, 250, 75, 209, 249, 49, 28, 16, 250, 75, 234, 37, 49, 28, - 16, 250, 75, 219, 10, 49, 28, 16, 243, 237, 240, 155, 211, 10, 216, 230, - 49, 28, 16, 243, 237, 245, 150, 254, 87, 49, 28, 16, 211, 10, 215, 207, - 49, 28, 16, 247, 239, 215, 207, 49, 28, 16, 247, 239, 216, 230, 49, 28, - 16, 247, 239, 254, 66, 246, 43, 247, 140, 49, 28, 16, 247, 239, 230, 142, - 216, 234, 247, 140, 49, 28, 16, 247, 239, 247, 223, 245, 37, 247, 140, - 49, 28, 16, 247, 239, 215, 215, 226, 212, 247, 140, 49, 28, 16, 211, 10, - 254, 66, 246, 43, 247, 140, 49, 28, 16, 211, 10, 230, 142, 216, 234, 247, - 140, 49, 28, 16, 211, 10, 247, 223, 245, 37, 247, 140, 49, 28, 16, 211, - 10, 215, 215, 226, 212, 247, 140, 49, 28, 16, 243, 50, 247, 238, 49, 28, - 16, 243, 50, 211, 9, 49, 28, 16, 247, 246, 254, 66, 230, 200, 49, 28, 16, - 247, 246, 254, 66, 231, 74, 49, 28, 16, 247, 246, 247, 202, 49, 28, 16, - 247, 246, 216, 183, 49, 28, 16, 219, 164, 216, 183, 49, 28, 16, 219, 164, - 216, 184, 247, 187, 49, 28, 16, 219, 164, 216, 184, 215, 208, 49, 28, 16, - 219, 164, 216, 184, 216, 223, 49, 28, 16, 219, 164, 253, 245, 49, 28, 16, - 219, 164, 253, 246, 247, 187, 49, 28, 16, 219, 164, 253, 246, 215, 208, - 49, 28, 16, 219, 164, 253, 246, 216, 223, 49, 28, 16, 247, 224, 243, 31, - 49, 28, 16, 247, 230, 226, 135, 49, 28, 16, 218, 138, 49, 28, 16, 254, 8, - 190, 49, 28, 16, 254, 8, 213, 124, 49, 28, 16, 254, 8, 243, 136, 49, 28, - 16, 254, 8, 248, 4, 49, 28, 16, 254, 8, 234, 183, 49, 28, 16, 254, 8, - 210, 23, 49, 28, 16, 254, 8, 228, 234, 49, 28, 16, 234, 163, 229, 97, - 231, 45, 49, 28, 16, 234, 164, 229, 97, 231, 45, 49, 28, 16, 234, 163, - 229, 97, 234, 197, 49, 28, 16, 234, 164, 229, 97, 234, 197, 49, 28, 16, - 234, 39, 234, 197, 49, 28, 16, 242, 160, 229, 97, 234, 197, 28, 16, 219, - 156, 252, 136, 28, 16, 52, 252, 136, 28, 16, 40, 252, 136, 28, 16, 223, - 51, 40, 252, 136, 28, 16, 248, 156, 252, 136, 28, 16, 219, 252, 252, 136, - 28, 16, 43, 223, 78, 50, 28, 16, 44, 223, 78, 50, 28, 16, 223, 78, 247, - 119, 28, 16, 248, 197, 221, 164, 28, 16, 248, 223, 250, 250, 28, 16, 221, - 164, 28, 16, 249, 235, 28, 16, 223, 76, 244, 112, 28, 16, 223, 76, 244, - 111, 28, 16, 223, 76, 244, 110, 28, 16, 244, 132, 28, 16, 244, 133, 51, - 28, 16, 251, 149, 78, 28, 16, 251, 25, 28, 16, 251, 160, 28, 16, 127, 28, - 16, 226, 194, 218, 164, 28, 16, 215, 57, 218, 164, 28, 16, 216, 143, 218, - 164, 28, 16, 244, 11, 218, 164, 28, 16, 244, 81, 218, 164, 28, 16, 219, - 125, 218, 164, 28, 16, 219, 123, 243, 251, 28, 16, 244, 9, 243, 251, 28, - 16, 243, 204, 250, 15, 28, 16, 243, 204, 250, 16, 226, 137, 254, 143, 28, - 16, 243, 204, 250, 16, 226, 137, 252, 123, 28, 16, 251, 68, 250, 15, 28, - 16, 245, 8, 250, 15, 28, 16, 245, 8, 250, 16, 226, 137, 254, 143, 28, 16, - 245, 8, 250, 16, 226, 137, 252, 123, 28, 16, 246, 84, 250, 14, 28, 16, - 246, 84, 250, 13, 28, 16, 230, 86, 231, 91, 223, 62, 28, 16, 52, 220, 76, - 28, 16, 52, 244, 66, 28, 16, 244, 67, 214, 163, 28, 16, 244, 67, 246, - 107, 28, 16, 229, 189, 214, 163, 28, 16, 229, 189, 246, 107, 28, 16, 220, - 77, 214, 163, 28, 16, 220, 77, 246, 107, 28, 16, 224, 23, 138, 220, 76, - 28, 16, 224, 23, 138, 244, 66, 28, 16, 249, 217, 216, 88, 28, 16, 249, - 86, 216, 88, 28, 16, 226, 137, 254, 143, 28, 16, 226, 137, 252, 123, 28, - 16, 224, 5, 254, 143, 28, 16, 224, 5, 252, 123, 28, 16, 230, 89, 223, 62, - 28, 16, 211, 251, 223, 62, 28, 16, 163, 223, 62, 28, 16, 224, 23, 223, - 62, 28, 16, 245, 190, 223, 62, 28, 16, 219, 119, 223, 62, 28, 16, 216, - 161, 223, 62, 28, 16, 219, 111, 223, 62, 28, 16, 123, 240, 212, 215, 71, - 223, 62, 28, 16, 211, 179, 228, 44, 28, 16, 96, 228, 44, 28, 16, 250, 37, - 211, 179, 228, 44, 28, 16, 42, 228, 45, 211, 253, 28, 16, 42, 228, 45, - 251, 222, 28, 16, 215, 227, 228, 45, 120, 211, 253, 28, 16, 215, 227, - 228, 45, 120, 251, 222, 28, 16, 215, 227, 228, 45, 43, 211, 253, 28, 16, - 215, 227, 228, 45, 43, 251, 222, 28, 16, 215, 227, 228, 45, 44, 211, 253, - 28, 16, 215, 227, 228, 45, 44, 251, 222, 28, 16, 215, 227, 228, 45, 124, - 211, 253, 28, 16, 215, 227, 228, 45, 124, 251, 222, 28, 16, 215, 227, - 228, 45, 120, 44, 211, 253, 28, 16, 215, 227, 228, 45, 120, 44, 251, 222, - 28, 16, 230, 130, 228, 45, 211, 253, 28, 16, 230, 130, 228, 45, 251, 222, - 28, 16, 215, 224, 228, 45, 124, 211, 253, 28, 16, 215, 224, 228, 45, 124, - 251, 222, 28, 16, 226, 5, 228, 44, 28, 16, 213, 132, 228, 44, 28, 16, - 228, 45, 251, 222, 28, 16, 227, 204, 228, 44, 28, 16, 249, 242, 228, 45, - 211, 253, 28, 16, 249, 242, 228, 45, 251, 222, 28, 16, 251, 147, 28, 16, - 211, 251, 228, 48, 28, 16, 163, 228, 48, 28, 16, 224, 23, 228, 48, 28, - 16, 245, 190, 228, 48, 28, 16, 219, 119, 228, 48, 28, 16, 216, 161, 228, - 48, 28, 16, 219, 111, 228, 48, 28, 16, 123, 240, 212, 215, 71, 228, 48, - 28, 16, 38, 218, 140, 28, 16, 38, 218, 241, 218, 140, 28, 16, 38, 215, - 235, 28, 16, 38, 215, 234, 28, 16, 38, 215, 233, 28, 16, 244, 102, 215, - 235, 28, 16, 244, 102, 215, 234, 28, 16, 244, 102, 215, 233, 28, 16, 38, - 253, 190, 247, 121, 28, 16, 38, 244, 73, 28, 16, 38, 244, 72, 28, 16, 38, - 244, 71, 28, 16, 38, 244, 70, 28, 16, 38, 244, 69, 28, 16, 252, 59, 252, - 75, 28, 16, 245, 144, 252, 75, 28, 16, 252, 59, 216, 112, 28, 16, 245, - 144, 216, 112, 28, 16, 252, 59, 219, 81, 28, 16, 245, 144, 219, 81, 28, - 16, 252, 59, 225, 116, 28, 16, 245, 144, 225, 116, 28, 16, 38, 255, 15, - 28, 16, 38, 218, 166, 28, 16, 38, 216, 239, 28, 16, 38, 218, 167, 28, 16, - 38, 231, 163, 28, 16, 38, 231, 162, 28, 16, 38, 255, 14, 28, 16, 38, 232, - 113, 28, 16, 253, 255, 214, 163, 28, 16, 253, 255, 246, 107, 28, 16, 38, - 247, 136, 28, 16, 38, 222, 232, 28, 16, 38, 244, 59, 28, 16, 38, 219, 77, - 28, 16, 38, 252, 39, 28, 16, 38, 52, 216, 20, 28, 16, 38, 215, 212, 216, - 20, 28, 16, 222, 236, 28, 16, 218, 76, 28, 16, 210, 159, 28, 16, 225, - 108, 28, 16, 231, 26, 28, 16, 244, 18, 28, 16, 249, 139, 28, 16, 248, 79, - 28, 16, 242, 151, 228, 49, 219, 96, 28, 16, 242, 151, 228, 49, 228, 76, - 219, 96, 28, 16, 216, 1, 28, 16, 215, 95, 28, 16, 235, 194, 215, 95, 28, - 16, 215, 96, 219, 96, 28, 16, 215, 96, 214, 163, 28, 16, 226, 149, 218, - 103, 28, 16, 226, 149, 218, 100, 28, 16, 226, 149, 218, 99, 28, 16, 226, - 149, 218, 98, 28, 16, 226, 149, 218, 97, 28, 16, 226, 149, 218, 96, 28, - 16, 226, 149, 218, 95, 28, 16, 226, 149, 218, 94, 28, 16, 226, 149, 218, - 93, 28, 16, 226, 149, 218, 102, 28, 16, 226, 149, 218, 101, 28, 16, 241, - 246, 28, 16, 229, 106, 28, 16, 245, 144, 64, 218, 134, 28, 16, 248, 72, - 219, 96, 28, 16, 38, 124, 251, 170, 28, 16, 38, 120, 251, 170, 28, 16, - 38, 242, 1, 28, 16, 38, 219, 68, 225, 44, 28, 16, 225, 217, 78, 28, 16, - 225, 217, 120, 78, 28, 16, 163, 225, 217, 78, 28, 16, 242, 183, 214, 163, - 28, 16, 242, 183, 246, 107, 28, 16, 2, 244, 101, 28, 16, 248, 181, 28, - 16, 248, 182, 254, 155, 28, 16, 231, 134, 28, 16, 232, 130, 28, 16, 251, - 144, 28, 16, 220, 155, 211, 253, 28, 16, 220, 155, 251, 222, 28, 16, 230, - 185, 28, 16, 230, 186, 251, 222, 28, 16, 220, 149, 211, 253, 28, 16, 220, - 149, 251, 222, 28, 16, 243, 221, 211, 253, 28, 16, 243, 221, 251, 222, - 28, 16, 232, 131, 225, 181, 223, 62, 28, 16, 232, 131, 236, 5, 223, 62, - 28, 16, 251, 145, 223, 62, 28, 16, 220, 155, 223, 62, 28, 16, 230, 186, - 223, 62, 28, 16, 220, 149, 223, 62, 28, 16, 216, 250, 225, 179, 249, 108, - 224, 175, 225, 180, 28, 16, 216, 250, 225, 179, 249, 108, 224, 175, 236, - 4, 28, 16, 216, 250, 225, 179, 249, 108, 224, 175, 225, 181, 247, 212, - 28, 16, 216, 250, 236, 3, 249, 108, 224, 175, 225, 180, 28, 16, 216, 250, - 236, 3, 249, 108, 224, 175, 236, 4, 28, 16, 216, 250, 236, 3, 249, 108, - 224, 175, 236, 5, 247, 212, 28, 16, 216, 250, 236, 3, 249, 108, 224, 175, - 236, 5, 247, 211, 28, 16, 216, 250, 236, 3, 249, 108, 224, 175, 236, 5, - 247, 210, 28, 16, 249, 134, 28, 16, 242, 127, 251, 68, 250, 15, 28, 16, - 242, 127, 245, 8, 250, 15, 28, 16, 42, 253, 159, 28, 16, 213, 151, 28, - 16, 225, 15, 28, 16, 250, 6, 28, 16, 221, 204, 28, 16, 250, 10, 28, 16, - 216, 8, 28, 16, 224, 243, 28, 16, 224, 244, 244, 61, 28, 16, 221, 205, - 244, 61, 28, 16, 216, 9, 223, 59, 28, 16, 225, 164, 218, 67, 26, 213, - 137, 188, 217, 230, 26, 213, 137, 188, 217, 219, 26, 213, 137, 188, 217, - 209, 26, 213, 137, 188, 217, 202, 26, 213, 137, 188, 217, 194, 26, 213, - 137, 188, 217, 188, 26, 213, 137, 188, 217, 187, 26, 213, 137, 188, 217, - 186, 26, 213, 137, 188, 217, 185, 26, 213, 137, 188, 217, 229, 26, 213, - 137, 188, 217, 228, 26, 213, 137, 188, 217, 227, 26, 213, 137, 188, 217, - 226, 26, 213, 137, 188, 217, 225, 26, 213, 137, 188, 217, 224, 26, 213, - 137, 188, 217, 223, 26, 213, 137, 188, 217, 222, 26, 213, 137, 188, 217, - 221, 26, 213, 137, 188, 217, 220, 26, 213, 137, 188, 217, 218, 26, 213, - 137, 188, 217, 217, 26, 213, 137, 188, 217, 216, 26, 213, 137, 188, 217, - 215, 26, 213, 137, 188, 217, 214, 26, 213, 137, 188, 217, 193, 26, 213, - 137, 188, 217, 192, 26, 213, 137, 188, 217, 191, 26, 213, 137, 188, 217, - 190, 26, 213, 137, 188, 217, 189, 26, 235, 215, 188, 217, 230, 26, 235, - 215, 188, 217, 219, 26, 235, 215, 188, 217, 202, 26, 235, 215, 188, 217, - 194, 26, 235, 215, 188, 217, 187, 26, 235, 215, 188, 217, 186, 26, 235, - 215, 188, 217, 228, 26, 235, 215, 188, 217, 227, 26, 235, 215, 188, 217, - 226, 26, 235, 215, 188, 217, 225, 26, 235, 215, 188, 217, 222, 26, 235, - 215, 188, 217, 221, 26, 235, 215, 188, 217, 220, 26, 235, 215, 188, 217, - 215, 26, 235, 215, 188, 217, 214, 26, 235, 215, 188, 217, 213, 26, 235, - 215, 188, 217, 212, 26, 235, 215, 188, 217, 211, 26, 235, 215, 188, 217, - 210, 26, 235, 215, 188, 217, 208, 26, 235, 215, 188, 217, 207, 26, 235, - 215, 188, 217, 206, 26, 235, 215, 188, 217, 205, 26, 235, 215, 188, 217, - 204, 26, 235, 215, 188, 217, 203, 26, 235, 215, 188, 217, 201, 26, 235, - 215, 188, 217, 200, 26, 235, 215, 188, 217, 199, 26, 235, 215, 188, 217, - 198, 26, 235, 215, 188, 217, 197, 26, 235, 215, 188, 217, 196, 26, 235, - 215, 188, 217, 195, 26, 235, 215, 188, 217, 193, 26, 235, 215, 188, 217, - 192, 26, 235, 215, 188, 217, 191, 26, 235, 215, 188, 217, 190, 26, 235, - 215, 188, 217, 189, 38, 26, 28, 215, 209, 38, 26, 28, 216, 224, 38, 26, - 28, 225, 189, 26, 28, 233, 32, 230, 143, 31, 245, 224, 247, 225, 31, 241, - 223, 245, 224, 247, 225, 31, 240, 215, 245, 224, 247, 225, 31, 245, 223, - 241, 224, 247, 225, 31, 245, 223, 240, 214, 247, 225, 31, 245, 224, 180, - 31, 250, 175, 180, 31, 243, 230, 250, 36, 180, 31, 230, 178, 180, 31, - 252, 131, 180, 31, 234, 180, 219, 80, 180, 31, 249, 180, 180, 31, 253, - 234, 180, 31, 226, 164, 180, 31, 251, 154, 226, 131, 180, 31, 248, 74, - 177, 247, 180, 180, 31, 247, 177, 180, 31, 210, 222, 180, 31, 235, 248, - 180, 31, 225, 198, 180, 31, 223, 128, 180, 31, 249, 190, 180, 31, 241, - 61, 252, 185, 180, 31, 212, 59, 180, 31, 244, 40, 180, 31, 254, 247, 180, - 31, 223, 90, 180, 31, 223, 66, 180, 31, 245, 222, 180, 31, 235, 54, 180, - 31, 249, 185, 180, 31, 245, 143, 180, 31, 246, 53, 180, 31, 250, 146, - 180, 31, 248, 83, 180, 31, 23, 223, 65, 180, 31, 226, 82, 180, 31, 233, - 35, 180, 31, 249, 255, 180, 31, 234, 78, 180, 31, 243, 87, 180, 31, 218, - 113, 180, 31, 224, 131, 180, 31, 243, 229, 180, 31, 223, 67, 180, 31, - 233, 72, 177, 230, 158, 180, 31, 223, 63, 180, 31, 242, 169, 216, 43, - 231, 77, 180, 31, 245, 145, 180, 31, 218, 125, 180, 31, 242, 129, 180, - 31, 245, 137, 180, 31, 225, 236, 180, 31, 222, 226, 180, 31, 244, 60, - 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 194, 180, 31, 231, 90, 180, - 31, 245, 62, 180, 31, 214, 172, 180, 31, 247, 213, 180, 31, 250, 1, 230, - 111, 180, 31, 242, 107, 180, 31, 243, 88, 236, 0, 180, 31, 231, 142, 180, - 31, 255, 11, 180, 31, 245, 158, 180, 31, 246, 110, 180, 31, 212, 42, 180, - 31, 219, 151, 180, 31, 235, 223, 180, 31, 248, 43, 180, 31, 248, 161, - 180, 31, 247, 209, 180, 31, 245, 30, 180, 31, 220, 116, 180, 31, 218, - 129, 180, 31, 242, 3, 180, 31, 249, 213, 180, 31, 249, 252, 180, 31, 244, - 178, 180, 31, 254, 213, 180, 31, 249, 212, 180, 31, 226, 198, 216, 197, - 213, 242, 180, 31, 247, 233, 180, 31, 233, 125, 180, 31, 244, 14, 249, - 150, 222, 203, 214, 174, 21, 110, 249, 150, 222, 203, 214, 174, 21, 105, - 249, 150, 222, 203, 214, 174, 21, 158, 249, 150, 222, 203, 214, 174, 21, - 161, 249, 150, 222, 203, 214, 174, 21, 189, 249, 150, 222, 203, 214, 174, - 21, 194, 249, 150, 222, 203, 214, 174, 21, 198, 249, 150, 222, 203, 214, - 174, 21, 195, 249, 150, 222, 203, 214, 174, 21, 200, 249, 150, 222, 203, - 216, 244, 21, 110, 249, 150, 222, 203, 216, 244, 21, 105, 249, 150, 222, - 203, 216, 244, 21, 158, 249, 150, 222, 203, 216, 244, 21, 161, 249, 150, - 222, 203, 216, 244, 21, 189, 249, 150, 222, 203, 216, 244, 21, 194, 249, - 150, 222, 203, 216, 244, 21, 198, 249, 150, 222, 203, 216, 244, 21, 195, - 249, 150, 222, 203, 216, 244, 21, 200, 11, 23, 6, 61, 11, 23, 6, 253, - 159, 11, 23, 6, 251, 67, 11, 23, 6, 249, 61, 11, 23, 6, 75, 11, 23, 6, - 245, 7, 11, 23, 6, 243, 203, 11, 23, 6, 242, 61, 11, 23, 6, 73, 11, 23, - 6, 235, 145, 11, 23, 6, 235, 24, 11, 23, 6, 156, 11, 23, 6, 193, 11, 23, - 6, 230, 26, 11, 23, 6, 76, 11, 23, 6, 226, 106, 11, 23, 6, 224, 97, 11, - 23, 6, 153, 11, 23, 6, 222, 92, 11, 23, 6, 217, 153, 11, 23, 6, 70, 11, + 244, 205, 12, 13, 243, 208, 12, 13, 243, 207, 12, 13, 243, 206, 12, 13, + 243, 205, 12, 13, 243, 204, 12, 13, 243, 203, 12, 13, 243, 202, 12, 13, + 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13, 243, 198, 12, 13, + 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13, 243, 194, 12, 13, + 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13, 243, 190, 12, 13, + 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13, 243, 186, 12, 13, + 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13, 243, 182, 12, 13, + 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13, 243, 178, 12, 13, + 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13, 243, 174, 12, 13, + 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13, 243, 170, 12, 13, + 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13, 243, 166, 12, 13, + 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13, 243, 162, 12, 13, + 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13, 243, 158, 12, 13, + 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13, 243, 154, 12, 13, + 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13, 243, 150, 12, 13, + 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13, 243, 146, 12, 13, + 243, 145, 12, 13, 242, 65, 12, 13, 242, 64, 12, 13, 242, 63, 12, 13, 242, + 62, 12, 13, 242, 61, 12, 13, 242, 60, 12, 13, 242, 59, 12, 13, 242, 58, + 12, 13, 242, 57, 12, 13, 240, 145, 12, 13, 240, 144, 12, 13, 240, 143, + 12, 13, 240, 142, 12, 13, 240, 141, 12, 13, 240, 140, 12, 13, 240, 139, + 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136, 12, 13, 240, 135, + 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132, 12, 13, 240, 131, + 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128, 12, 13, 240, 127, + 12, 13, 235, 28, 12, 13, 235, 27, 12, 13, 235, 26, 12, 13, 235, 25, 12, + 13, 235, 24, 12, 13, 235, 23, 12, 13, 235, 22, 12, 13, 235, 21, 12, 13, + 233, 152, 12, 13, 233, 151, 12, 13, 233, 150, 12, 13, 233, 149, 12, 13, + 233, 148, 12, 13, 233, 147, 12, 13, 233, 146, 12, 13, 233, 145, 12, 13, + 233, 144, 12, 13, 233, 143, 12, 13, 232, 54, 12, 13, 232, 53, 12, 13, + 232, 52, 12, 13, 232, 51, 12, 13, 232, 50, 12, 13, 232, 49, 12, 13, 232, + 48, 12, 13, 232, 47, 12, 13, 232, 46, 12, 13, 232, 45, 12, 13, 232, 44, + 12, 13, 232, 43, 12, 13, 232, 42, 12, 13, 232, 41, 12, 13, 232, 40, 12, + 13, 232, 39, 12, 13, 232, 38, 12, 13, 232, 37, 12, 13, 232, 36, 12, 13, + 232, 35, 12, 13, 232, 34, 12, 13, 232, 33, 12, 13, 232, 32, 12, 13, 232, + 31, 12, 13, 232, 30, 12, 13, 232, 29, 12, 13, 232, 28, 12, 13, 232, 27, + 12, 13, 232, 26, 12, 13, 232, 25, 12, 13, 232, 24, 12, 13, 232, 23, 12, + 13, 232, 22, 12, 13, 232, 21, 12, 13, 232, 20, 12, 13, 232, 19, 12, 13, + 232, 18, 12, 13, 232, 17, 12, 13, 232, 16, 12, 13, 232, 15, 12, 13, 232, + 14, 12, 13, 232, 13, 12, 13, 232, 12, 12, 13, 232, 11, 12, 13, 232, 10, + 12, 13, 232, 9, 12, 13, 232, 8, 12, 13, 232, 7, 12, 13, 232, 6, 12, 13, + 232, 5, 12, 13, 232, 4, 12, 13, 232, 3, 12, 13, 232, 2, 12, 13, 232, 1, + 12, 13, 232, 0, 12, 13, 231, 255, 12, 13, 231, 254, 12, 13, 231, 253, 12, + 13, 231, 252, 12, 13, 231, 251, 12, 13, 231, 250, 12, 13, 231, 249, 12, + 13, 231, 248, 12, 13, 231, 247, 12, 13, 231, 246, 12, 13, 231, 245, 12, + 13, 230, 27, 12, 13, 230, 26, 12, 13, 230, 25, 12, 13, 230, 24, 12, 13, + 230, 23, 12, 13, 230, 22, 12, 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, + 19, 12, 13, 230, 18, 12, 13, 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, + 12, 13, 230, 14, 12, 13, 230, 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, + 13, 230, 10, 12, 13, 230, 9, 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, + 6, 12, 13, 230, 5, 12, 13, 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, + 13, 230, 1, 12, 13, 230, 0, 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, + 229, 253, 12, 13, 229, 252, 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, + 229, 249, 12, 13, 229, 248, 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, + 229, 245, 12, 13, 229, 244, 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, + 229, 241, 12, 13, 229, 240, 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, + 229, 237, 12, 13, 229, 236, 12, 13, 229, 235, 12, 13, 228, 139, 12, 13, + 228, 138, 12, 13, 228, 137, 12, 13, 228, 136, 12, 13, 228, 135, 12, 13, + 228, 134, 12, 13, 228, 133, 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, + 228, 130, 12, 13, 228, 129, 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, + 228, 126, 12, 13, 228, 125, 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, + 228, 122, 12, 13, 228, 121, 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, + 228, 118, 12, 13, 227, 241, 12, 13, 227, 240, 12, 13, 227, 239, 12, 13, + 227, 238, 12, 13, 227, 237, 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, + 227, 234, 12, 13, 227, 233, 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, + 227, 230, 12, 13, 227, 229, 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, + 227, 226, 12, 13, 227, 225, 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, + 227, 222, 12, 13, 227, 221, 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, + 227, 218, 12, 13, 227, 217, 12, 13, 227, 216, 12, 13, 227, 80, 12, 13, + 227, 79, 12, 13, 227, 78, 12, 13, 227, 77, 12, 13, 227, 76, 12, 13, 227, + 75, 12, 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13, 227, 71, + 12, 13, 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227, 67, 12, + 13, 227, 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63, 12, 13, + 227, 62, 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12, 13, 227, + 58, 12, 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13, 227, 54, + 12, 13, 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227, 50, 12, + 13, 227, 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46, 12, 13, + 227, 45, 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12, 13, 227, + 41, 12, 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13, 227, 37, + 12, 13, 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227, 33, 12, + 13, 227, 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29, 12, 13, + 227, 28, 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12, 13, 227, + 24, 12, 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13, 227, 20, + 12, 13, 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227, 16, 12, + 13, 227, 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12, 12, 13, + 227, 11, 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13, 227, 7, + 12, 13, 227, 6, 12, 13, 226, 108, 12, 13, 226, 107, 12, 13, 226, 106, 12, + 13, 226, 105, 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102, 12, + 13, 226, 101, 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12, 13, + 226, 97, 12, 13, 226, 96, 12, 13, 224, 98, 12, 13, 224, 97, 12, 13, 224, + 96, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224, 93, 12, 13, 224, 92, + 12, 13, 223, 225, 12, 13, 223, 224, 12, 13, 223, 223, 12, 13, 223, 222, + 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219, 12, 13, 223, 218, + 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215, 12, 13, 223, 214, + 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, 12, 13, 223, 210, + 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, 12, 13, 223, 206, + 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, 12, 13, 223, 202, + 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, 12, 13, 223, 198, + 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, 12, 13, 223, 194, + 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 222, 90, 12, 13, 222, 89, 12, + 13, 222, 88, 12, 13, 222, 87, 12, 13, 222, 86, 12, 13, 222, 85, 12, 13, + 222, 84, 12, 13, 222, 83, 12, 13, 222, 82, 12, 13, 222, 81, 12, 13, 222, + 80, 12, 13, 222, 79, 12, 13, 222, 78, 12, 13, 222, 77, 12, 13, 222, 76, + 12, 13, 222, 75, 12, 13, 222, 74, 12, 13, 222, 73, 12, 13, 222, 72, 12, + 13, 222, 71, 12, 13, 222, 70, 12, 13, 222, 69, 12, 13, 222, 68, 12, 13, + 222, 67, 12, 13, 222, 66, 12, 13, 222, 65, 12, 13, 222, 64, 12, 13, 222, + 63, 12, 13, 222, 62, 12, 13, 222, 61, 12, 13, 222, 60, 12, 13, 222, 59, + 12, 13, 222, 58, 12, 13, 222, 57, 12, 13, 222, 56, 12, 13, 222, 55, 12, + 13, 222, 54, 12, 13, 222, 53, 12, 13, 222, 52, 12, 13, 222, 51, 12, 13, + 222, 50, 12, 13, 222, 49, 12, 13, 222, 48, 12, 13, 222, 47, 12, 13, 222, + 46, 12, 13, 222, 45, 12, 13, 222, 44, 12, 13, 222, 43, 12, 13, 222, 42, + 12, 13, 222, 41, 12, 13, 222, 40, 12, 13, 222, 39, 12, 13, 222, 38, 12, + 13, 222, 37, 12, 13, 217, 151, 12, 13, 217, 150, 12, 13, 217, 149, 12, + 13, 217, 148, 12, 13, 217, 147, 12, 13, 217, 146, 12, 13, 217, 145, 12, + 13, 217, 144, 12, 13, 217, 143, 12, 13, 217, 142, 12, 13, 217, 141, 12, + 13, 217, 140, 12, 13, 217, 139, 12, 13, 217, 138, 12, 13, 217, 137, 12, + 13, 217, 136, 12, 13, 217, 135, 12, 13, 217, 134, 12, 13, 217, 133, 12, + 13, 217, 132, 12, 13, 217, 131, 12, 13, 217, 130, 12, 13, 217, 129, 12, + 13, 217, 128, 12, 13, 217, 127, 12, 13, 217, 126, 12, 13, 217, 125, 12, + 13, 217, 124, 12, 13, 217, 123, 12, 13, 217, 122, 12, 13, 217, 121, 12, + 13, 217, 120, 12, 13, 217, 119, 12, 13, 217, 118, 12, 13, 217, 117, 12, + 13, 217, 116, 12, 13, 217, 115, 12, 13, 217, 114, 12, 13, 217, 113, 12, + 13, 217, 112, 12, 13, 217, 111, 12, 13, 217, 110, 12, 13, 217, 109, 12, + 13, 217, 108, 12, 13, 215, 22, 12, 13, 215, 21, 12, 13, 215, 20, 12, 13, + 215, 19, 12, 13, 215, 18, 12, 13, 215, 17, 12, 13, 215, 16, 12, 13, 215, + 15, 12, 13, 215, 14, 12, 13, 215, 13, 12, 13, 215, 12, 12, 13, 215, 11, + 12, 13, 215, 10, 12, 13, 215, 9, 12, 13, 215, 8, 12, 13, 215, 7, 12, 13, + 215, 6, 12, 13, 215, 5, 12, 13, 215, 4, 12, 13, 215, 3, 12, 13, 215, 2, + 12, 13, 215, 1, 12, 13, 215, 0, 12, 13, 214, 255, 12, 13, 214, 254, 12, + 13, 214, 253, 12, 13, 214, 252, 12, 13, 214, 251, 12, 13, 214, 250, 12, + 13, 214, 249, 12, 13, 214, 248, 12, 13, 214, 247, 12, 13, 214, 246, 12, + 13, 214, 245, 12, 13, 214, 244, 12, 13, 214, 243, 12, 13, 214, 242, 12, + 13, 214, 241, 12, 13, 214, 240, 12, 13, 214, 239, 12, 13, 214, 238, 12, + 13, 214, 237, 12, 13, 214, 236, 12, 13, 214, 235, 12, 13, 214, 234, 12, + 13, 214, 233, 12, 13, 214, 232, 12, 13, 214, 104, 12, 13, 214, 103, 12, + 13, 214, 102, 12, 13, 214, 101, 12, 13, 214, 100, 12, 13, 214, 99, 12, + 13, 214, 98, 12, 13, 214, 97, 12, 13, 214, 96, 12, 13, 214, 95, 12, 13, + 214, 94, 12, 13, 214, 93, 12, 13, 214, 92, 12, 13, 214, 91, 12, 13, 214, + 90, 12, 13, 214, 89, 12, 13, 214, 88, 12, 13, 214, 87, 12, 13, 214, 86, + 12, 13, 214, 85, 12, 13, 214, 84, 12, 13, 214, 83, 12, 13, 214, 82, 12, + 13, 214, 81, 12, 13, 214, 80, 12, 13, 214, 79, 12, 13, 214, 78, 12, 13, + 214, 77, 12, 13, 214, 76, 12, 13, 214, 75, 12, 13, 214, 74, 12, 13, 214, + 73, 12, 13, 214, 72, 12, 13, 214, 71, 12, 13, 214, 70, 12, 13, 214, 69, + 12, 13, 214, 68, 12, 13, 214, 67, 12, 13, 214, 66, 12, 13, 214, 65, 12, + 13, 214, 64, 12, 13, 214, 63, 12, 13, 214, 62, 12, 13, 214, 61, 12, 13, + 214, 60, 12, 13, 214, 59, 12, 13, 214, 58, 12, 13, 214, 57, 12, 13, 214, + 56, 12, 13, 214, 55, 12, 13, 214, 54, 12, 13, 214, 53, 12, 13, 214, 52, + 12, 13, 214, 51, 12, 13, 214, 50, 12, 13, 214, 49, 12, 13, 214, 48, 12, + 13, 214, 47, 12, 13, 214, 46, 12, 13, 214, 45, 12, 13, 214, 44, 12, 13, + 214, 43, 12, 13, 214, 42, 12, 13, 214, 41, 12, 13, 214, 40, 12, 13, 214, + 39, 12, 13, 214, 38, 12, 13, 214, 37, 12, 13, 214, 36, 12, 13, 214, 35, + 12, 13, 214, 34, 12, 13, 214, 33, 12, 13, 214, 32, 12, 13, 214, 31, 12, + 13, 214, 30, 12, 13, 214, 29, 12, 13, 214, 28, 12, 13, 212, 97, 12, 13, + 212, 96, 12, 13, 212, 95, 12, 13, 212, 94, 12, 13, 212, 93, 12, 13, 212, + 92, 12, 13, 212, 91, 12, 13, 212, 90, 12, 13, 212, 89, 12, 13, 212, 88, + 12, 13, 212, 87, 12, 13, 212, 86, 12, 13, 212, 85, 12, 13, 212, 84, 12, + 13, 212, 83, 12, 13, 212, 82, 12, 13, 212, 81, 12, 13, 212, 80, 12, 13, + 212, 79, 12, 13, 212, 78, 12, 13, 212, 77, 12, 13, 212, 76, 12, 13, 212, + 75, 12, 13, 212, 74, 12, 13, 212, 73, 12, 13, 212, 72, 12, 13, 212, 71, + 12, 13, 212, 70, 12, 13, 212, 69, 12, 13, 212, 68, 12, 13, 212, 67, 12, + 13, 212, 66, 12, 13, 211, 177, 12, 13, 211, 176, 12, 13, 211, 175, 12, + 13, 211, 174, 12, 13, 211, 173, 12, 13, 211, 172, 12, 13, 211, 171, 12, + 13, 211, 170, 12, 13, 211, 169, 12, 13, 211, 168, 12, 13, 211, 167, 12, + 13, 211, 166, 12, 13, 211, 115, 12, 13, 211, 114, 12, 13, 211, 113, 12, + 13, 211, 112, 12, 13, 211, 111, 12, 13, 211, 110, 12, 13, 211, 109, 12, + 13, 211, 108, 12, 13, 211, 107, 12, 13, 210, 158, 12, 13, 210, 157, 12, + 13, 210, 156, 12, 13, 210, 155, 12, 13, 210, 154, 12, 13, 210, 153, 12, + 13, 210, 152, 12, 13, 210, 151, 12, 13, 210, 150, 12, 13, 210, 149, 12, + 13, 210, 148, 12, 13, 210, 147, 12, 13, 210, 146, 12, 13, 210, 145, 12, + 13, 210, 144, 12, 13, 210, 143, 12, 13, 210, 142, 12, 13, 210, 141, 12, + 13, 210, 140, 12, 13, 210, 139, 12, 13, 210, 138, 12, 13, 210, 137, 12, + 13, 210, 136, 12, 13, 210, 135, 12, 13, 210, 134, 12, 13, 210, 133, 12, + 13, 210, 132, 12, 13, 210, 131, 12, 13, 210, 130, 12, 13, 210, 129, 12, + 13, 210, 128, 12, 13, 210, 127, 12, 13, 210, 126, 12, 13, 210, 125, 12, + 13, 210, 124, 12, 13, 210, 123, 12, 13, 210, 122, 12, 13, 210, 121, 12, + 13, 210, 120, 12, 13, 210, 119, 12, 13, 210, 118, 12, 13, 255, 81, 12, + 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78, 12, 13, 255, 77, 12, 13, + 255, 76, 12, 13, 255, 75, 12, 13, 255, 74, 12, 13, 255, 73, 12, 13, 255, + 72, 12, 13, 255, 71, 12, 13, 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, + 12, 13, 255, 67, 12, 13, 255, 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, + 13, 255, 63, 12, 13, 255, 62, 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, + 255, 59, 12, 13, 255, 58, 12, 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, + 55, 12, 13, 255, 54, 12, 13, 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, + 12, 13, 255, 50, 12, 13, 255, 49, 12, 13, 255, 48, 20, 1, 167, 229, 17, + 231, 21, 20, 1, 167, 243, 77, 244, 44, 20, 1, 167, 224, 254, 231, 22, + 225, 60, 20, 1, 167, 224, 254, 231, 22, 225, 61, 20, 1, 167, 229, 231, + 231, 21, 20, 1, 167, 219, 223, 20, 1, 167, 216, 67, 231, 21, 20, 1, 167, + 227, 122, 231, 21, 20, 1, 167, 220, 21, 226, 94, 228, 174, 20, 1, 167, + 224, 254, 226, 94, 228, 175, 225, 60, 20, 1, 167, 224, 254, 226, 94, 228, + 175, 225, 61, 20, 1, 167, 231, 223, 20, 1, 167, 215, 120, 231, 224, 20, + 1, 167, 229, 76, 20, 1, 167, 231, 220, 20, 1, 167, 231, 181, 20, 1, 167, + 230, 53, 20, 1, 167, 220, 126, 20, 1, 167, 227, 246, 20, 1, 167, 234, + 155, 20, 1, 167, 228, 143, 20, 1, 167, 218, 5, 20, 1, 167, 229, 16, 20, + 1, 167, 233, 93, 20, 1, 167, 233, 18, 233, 195, 20, 1, 167, 227, 253, + 231, 29, 20, 1, 167, 231, 227, 20, 1, 167, 225, 250, 20, 1, 167, 242, + 238, 20, 1, 167, 226, 54, 20, 1, 167, 230, 156, 229, 50, 20, 1, 167, 227, + 103, 231, 32, 20, 1, 167, 104, 210, 188, 229, 225, 20, 1, 167, 242, 239, + 20, 1, 167, 227, 253, 227, 254, 20, 1, 167, 219, 130, 20, 1, 167, 231, + 14, 20, 1, 167, 231, 35, 20, 1, 167, 230, 135, 20, 1, 167, 234, 255, 20, + 1, 167, 226, 94, 233, 53, 20, 1, 167, 229, 154, 233, 53, 20, 1, 167, 225, + 161, 20, 1, 167, 231, 221, 20, 1, 167, 228, 212, 20, 1, 167, 224, 137, + 20, 1, 167, 215, 117, 20, 1, 167, 232, 99, 20, 1, 167, 219, 43, 20, 1, + 167, 216, 217, 20, 1, 167, 231, 218, 20, 1, 167, 234, 162, 20, 1, 167, + 229, 150, 20, 1, 167, 233, 207, 20, 1, 167, 230, 136, 20, 1, 167, 219, + 220, 20, 1, 167, 232, 144, 20, 1, 167, 244, 101, 20, 1, 167, 222, 201, + 20, 1, 167, 233, 247, 20, 1, 167, 219, 39, 20, 1, 167, 231, 178, 225, + 102, 20, 1, 167, 220, 14, 20, 1, 167, 227, 252, 20, 1, 167, 219, 255, + 228, 7, 210, 196, 20, 1, 167, 227, 142, 230, 153, 20, 1, 167, 226, 89, + 20, 1, 167, 228, 144, 20, 1, 167, 214, 170, 20, 1, 167, 229, 53, 20, 1, + 167, 231, 217, 20, 1, 167, 228, 186, 20, 1, 167, 231, 124, 20, 1, 167, + 227, 155, 20, 1, 167, 216, 221, 20, 1, 167, 219, 36, 20, 1, 167, 226, 90, + 20, 1, 167, 228, 11, 20, 1, 167, 231, 225, 20, 1, 167, 227, 152, 20, 1, + 167, 234, 222, 20, 1, 167, 228, 14, 20, 1, 167, 213, 250, 20, 1, 167, + 232, 103, 20, 1, 167, 229, 103, 20, 1, 167, 229, 201, 20, 1, 167, 231, + 123, 20, 1, 225, 141, 228, 9, 20, 1, 225, 141, 215, 120, 231, 222, 20, 1, + 225, 141, 219, 187, 20, 1, 225, 141, 220, 130, 215, 119, 20, 1, 225, 141, + 232, 146, 227, 249, 20, 1, 225, 141, 231, 130, 231, 226, 20, 1, 225, 141, + 234, 93, 20, 1, 225, 141, 211, 15, 20, 1, 225, 141, 231, 125, 20, 1, 225, + 141, 234, 243, 20, 1, 225, 141, 225, 211, 20, 1, 225, 141, 211, 89, 233, + 53, 20, 1, 225, 141, 233, 109, 228, 7, 227, 164, 20, 1, 225, 141, 227, + 247, 220, 40, 20, 1, 225, 141, 229, 121, 228, 189, 20, 1, 225, 141, 242, + 236, 20, 1, 225, 141, 225, 52, 20, 1, 225, 141, 215, 120, 228, 5, 20, 1, + 225, 141, 220, 45, 228, 184, 20, 1, 225, 141, 220, 41, 20, 1, 225, 141, + 231, 22, 216, 220, 20, 1, 225, 141, 231, 112, 231, 126, 20, 1, 225, 141, + 227, 153, 227, 249, 20, 1, 225, 141, 234, 151, 20, 1, 225, 141, 242, 237, + 20, 1, 225, 141, 234, 147, 20, 1, 225, 141, 233, 135, 20, 1, 225, 141, + 225, 253, 20, 1, 225, 141, 213, 182, 20, 1, 225, 141, 229, 18, 230, 51, + 20, 1, 225, 141, 229, 52, 231, 108, 20, 1, 225, 141, 211, 193, 20, 1, + 225, 141, 222, 13, 20, 1, 225, 141, 217, 98, 20, 1, 225, 141, 231, 34, + 20, 1, 225, 141, 229, 37, 20, 1, 225, 141, 229, 38, 233, 90, 20, 1, 225, + 141, 231, 24, 20, 1, 225, 141, 218, 53, 20, 1, 225, 141, 231, 116, 20, 1, + 225, 141, 230, 138, 20, 1, 225, 141, 227, 167, 20, 1, 225, 141, 224, 141, + 20, 1, 225, 141, 231, 33, 229, 54, 20, 1, 225, 141, 244, 134, 20, 1, 225, + 141, 231, 103, 20, 1, 225, 141, 244, 155, 20, 1, 225, 141, 234, 159, 20, + 1, 225, 141, 231, 244, 228, 178, 20, 1, 225, 141, 231, 244, 228, 154, 20, + 1, 225, 141, 233, 17, 20, 1, 225, 141, 229, 60, 20, 1, 225, 141, 228, 16, + 20, 1, 225, 141, 186, 20, 1, 225, 141, 234, 80, 20, 1, 225, 141, 229, 6, + 20, 1, 137, 229, 17, 231, 224, 20, 1, 137, 227, 121, 20, 1, 137, 210, + 196, 20, 1, 137, 212, 53, 20, 1, 137, 229, 53, 20, 1, 137, 229, 142, 20, + 1, 137, 229, 24, 20, 1, 137, 242, 246, 20, 1, 137, 231, 120, 20, 1, 137, + 243, 84, 20, 1, 137, 227, 144, 230, 175, 231, 36, 20, 1, 137, 227, 245, + 231, 111, 20, 1, 137, 231, 117, 20, 1, 137, 225, 58, 20, 1, 137, 229, + 127, 20, 1, 137, 231, 128, 251, 37, 20, 1, 137, 234, 149, 20, 1, 137, + 242, 247, 20, 1, 137, 234, 156, 20, 1, 137, 210, 213, 230, 81, 20, 1, + 137, 227, 115, 20, 1, 137, 231, 105, 20, 1, 137, 228, 15, 20, 1, 137, + 231, 111, 20, 1, 137, 211, 16, 20, 1, 137, 233, 255, 20, 1, 137, 235, 16, + 20, 1, 137, 220, 125, 20, 1, 137, 229, 136, 20, 1, 137, 217, 96, 20, 1, + 137, 228, 158, 20, 1, 137, 216, 67, 210, 198, 20, 1, 137, 218, 80, 20, 1, + 137, 229, 44, 227, 164, 20, 1, 137, 213, 181, 20, 1, 137, 229, 204, 20, + 1, 137, 231, 244, 234, 158, 20, 1, 137, 227, 254, 20, 1, 137, 229, 39, + 20, 1, 137, 233, 94, 20, 1, 137, 231, 113, 20, 1, 137, 231, 13, 20, 1, + 137, 227, 248, 20, 1, 137, 216, 216, 20, 1, 137, 229, 41, 20, 1, 137, + 243, 240, 20, 1, 137, 229, 141, 20, 1, 137, 228, 17, 20, 1, 137, 228, 13, + 20, 1, 137, 251, 115, 20, 1, 137, 213, 183, 20, 1, 137, 231, 118, 20, 1, + 137, 222, 142, 20, 1, 137, 228, 188, 20, 1, 137, 233, 108, 20, 1, 137, + 216, 65, 20, 1, 137, 227, 255, 229, 6, 20, 1, 137, 228, 180, 20, 1, 137, + 234, 162, 20, 1, 137, 229, 45, 20, 1, 137, 231, 217, 20, 1, 137, 231, + 106, 20, 1, 137, 232, 103, 20, 1, 137, 233, 195, 20, 1, 137, 228, 186, + 20, 1, 137, 229, 6, 20, 1, 137, 211, 184, 20, 1, 137, 229, 42, 20, 1, + 137, 228, 2, 20, 1, 137, 227, 250, 20, 1, 137, 233, 209, 228, 144, 20, 1, + 137, 228, 0, 20, 1, 137, 229, 149, 20, 1, 137, 231, 244, 228, 5, 20, 1, + 137, 211, 103, 20, 1, 137, 229, 148, 20, 1, 137, 219, 222, 20, 1, 137, + 220, 128, 20, 1, 137, 231, 114, 20, 1, 137, 231, 224, 20, 1, 137, 231, + 124, 20, 1, 137, 234, 150, 20, 1, 137, 231, 115, 20, 1, 137, 234, 154, + 20, 1, 137, 231, 128, 225, 106, 20, 1, 137, 210, 179, 20, 1, 137, 228, + 176, 20, 1, 137, 230, 225, 20, 1, 137, 230, 105, 20, 1, 137, 220, 17, 20, + 1, 137, 234, 172, 233, 76, 20, 1, 137, 234, 172, 244, 168, 20, 1, 137, + 229, 74, 20, 1, 137, 229, 201, 20, 1, 137, 232, 206, 20, 1, 137, 225, 68, + 20, 1, 137, 225, 202, 20, 1, 137, 216, 231, 20, 1, 107, 231, 104, 20, 1, + 107, 212, 51, 20, 1, 107, 228, 174, 20, 1, 107, 231, 21, 20, 1, 107, 228, + 172, 20, 1, 107, 232, 241, 20, 1, 107, 228, 177, 20, 1, 107, 228, 12, 20, + 1, 107, 229, 59, 20, 1, 107, 227, 164, 20, 1, 107, 211, 194, 20, 1, 107, + 229, 14, 20, 1, 107, 220, 63, 20, 1, 107, 229, 25, 20, 1, 107, 234, 157, + 20, 1, 107, 216, 218, 20, 1, 107, 220, 43, 20, 1, 107, 228, 185, 20, 1, + 107, 218, 53, 20, 1, 107, 234, 162, 20, 1, 107, 211, 91, 20, 1, 107, 233, + 210, 20, 1, 107, 221, 236, 20, 1, 107, 231, 26, 20, 1, 107, 229, 140, 20, + 1, 107, 231, 193, 20, 1, 107, 231, 32, 20, 1, 107, 220, 127, 20, 1, 107, + 211, 39, 20, 1, 107, 228, 179, 20, 1, 107, 234, 153, 231, 107, 20, 1, + 107, 229, 21, 20, 1, 107, 215, 119, 20, 1, 107, 242, 255, 20, 1, 107, + 229, 11, 20, 1, 107, 244, 135, 20, 1, 107, 229, 144, 20, 1, 107, 231, 5, + 20, 1, 107, 233, 11, 20, 1, 107, 229, 126, 20, 1, 107, 230, 152, 20, 1, + 107, 231, 9, 20, 1, 107, 224, 121, 20, 1, 107, 231, 7, 20, 1, 107, 231, + 23, 20, 1, 107, 232, 89, 20, 1, 107, 228, 4, 20, 1, 107, 231, 127, 20, 1, + 107, 233, 186, 20, 1, 107, 227, 155, 20, 1, 107, 216, 221, 20, 1, 107, + 219, 36, 20, 1, 107, 210, 179, 20, 1, 107, 234, 154, 20, 1, 107, 223, + 173, 20, 1, 107, 217, 11, 20, 1, 107, 229, 22, 20, 1, 107, 231, 28, 20, + 1, 107, 228, 3, 20, 1, 107, 234, 152, 20, 1, 107, 225, 62, 20, 1, 107, + 225, 155, 20, 1, 107, 227, 131, 20, 1, 107, 233, 17, 20, 1, 107, 229, 60, + 20, 1, 107, 231, 25, 20, 1, 107, 229, 34, 20, 1, 107, 210, 193, 20, 1, + 107, 226, 25, 20, 1, 107, 210, 192, 20, 1, 107, 229, 149, 20, 1, 107, + 227, 249, 20, 1, 107, 218, 82, 20, 1, 107, 233, 214, 20, 1, 107, 229, 49, + 20, 1, 107, 229, 19, 20, 1, 107, 215, 103, 20, 1, 107, 231, 36, 20, 1, + 107, 233, 204, 20, 1, 107, 228, 1, 20, 1, 107, 216, 219, 20, 1, 107, 231, + 219, 20, 1, 107, 229, 58, 20, 1, 107, 233, 10, 20, 1, 107, 229, 40, 20, + 1, 107, 228, 6, 20, 1, 107, 228, 158, 20, 1, 107, 242, 240, 20, 1, 107, + 233, 223, 20, 1, 107, 223, 87, 226, 213, 20, 1, 107, 217, 87, 20, 1, 107, + 216, 11, 20, 1, 107, 227, 152, 20, 1, 107, 222, 242, 20, 1, 107, 233, 55, + 20, 1, 107, 231, 84, 20, 1, 107, 194, 20, 1, 107, 218, 5, 20, 1, 107, + 230, 107, 20, 1, 107, 220, 29, 20, 1, 107, 220, 39, 20, 1, 107, 233, 161, + 20, 1, 107, 227, 242, 20, 1, 107, 219, 227, 20, 1, 107, 227, 251, 20, 1, + 107, 225, 214, 20, 1, 107, 228, 238, 20, 1, 107, 219, 254, 20, 1, 107, + 224, 136, 20, 1, 107, 230, 51, 20, 1, 107, 232, 125, 20, 1, 107, 223, 87, + 230, 101, 20, 1, 107, 216, 118, 20, 1, 107, 227, 243, 20, 1, 107, 231, + 128, 199, 20, 1, 107, 221, 234, 20, 1, 107, 244, 203, 20, 1, 82, 229, + 148, 20, 1, 82, 216, 17, 20, 1, 82, 231, 117, 20, 1, 82, 233, 94, 20, 1, + 82, 213, 128, 20, 1, 82, 232, 131, 20, 1, 82, 226, 93, 20, 1, 82, 219, + 47, 20, 1, 82, 223, 148, 20, 1, 82, 228, 8, 20, 1, 82, 229, 119, 20, 1, + 82, 224, 150, 20, 1, 82, 217, 63, 20, 1, 82, 229, 27, 20, 1, 82, 233, + 251, 20, 1, 82, 211, 187, 20, 1, 82, 221, 172, 20, 1, 82, 229, 50, 20, 1, + 82, 226, 90, 20, 1, 82, 216, 18, 20, 1, 82, 233, 208, 20, 1, 82, 232, + 145, 20, 1, 82, 228, 11, 20, 1, 82, 229, 3, 20, 1, 82, 231, 225, 20, 1, + 82, 229, 20, 20, 1, 82, 229, 2, 20, 1, 82, 228, 10, 20, 1, 82, 222, 240, + 20, 1, 82, 228, 176, 20, 1, 82, 225, 213, 20, 1, 82, 222, 33, 20, 1, 82, + 229, 35, 20, 1, 82, 231, 15, 20, 1, 82, 242, 234, 20, 1, 82, 229, 23, 20, + 1, 82, 228, 187, 20, 1, 82, 231, 177, 20, 1, 82, 232, 127, 20, 1, 82, + 229, 55, 20, 1, 82, 229, 132, 20, 1, 82, 217, 86, 227, 249, 20, 1, 82, + 220, 129, 20, 1, 82, 224, 146, 20, 1, 82, 229, 152, 219, 53, 20, 1, 82, + 229, 43, 227, 164, 20, 1, 82, 211, 4, 20, 1, 82, 242, 235, 20, 1, 82, + 215, 118, 20, 1, 82, 211, 19, 20, 1, 82, 225, 19, 20, 1, 82, 215, 108, + 20, 1, 82, 234, 160, 20, 1, 82, 218, 81, 20, 1, 82, 216, 220, 20, 1, 82, + 213, 184, 20, 1, 82, 212, 6, 20, 1, 82, 233, 138, 20, 1, 82, 224, 153, + 20, 1, 82, 217, 97, 20, 1, 82, 242, 254, 20, 1, 82, 229, 64, 20, 1, 82, + 220, 42, 20, 1, 82, 231, 10, 20, 1, 82, 231, 121, 20, 1, 82, 227, 119, + 20, 1, 82, 228, 141, 20, 1, 82, 243, 80, 20, 1, 82, 215, 109, 20, 1, 82, + 233, 217, 20, 1, 82, 211, 67, 20, 1, 82, 227, 153, 250, 24, 20, 1, 82, + 210, 250, 20, 1, 82, 231, 27, 20, 1, 82, 229, 137, 20, 1, 82, 225, 103, + 20, 1, 82, 210, 197, 20, 1, 82, 233, 12, 20, 1, 82, 243, 240, 20, 1, 82, + 243, 79, 20, 1, 82, 229, 13, 20, 1, 82, 234, 162, 20, 1, 82, 231, 228, + 20, 1, 82, 229, 26, 20, 1, 82, 242, 241, 20, 1, 82, 244, 204, 20, 1, 82, + 227, 244, 20, 1, 82, 225, 156, 20, 1, 82, 211, 17, 20, 1, 82, 229, 51, + 20, 1, 82, 227, 153, 252, 31, 20, 1, 82, 227, 99, 20, 1, 82, 224, 250, + 20, 1, 82, 230, 225, 20, 1, 82, 243, 238, 20, 1, 82, 229, 225, 20, 1, 82, + 230, 105, 20, 1, 82, 242, 240, 20, 1, 82, 243, 242, 74, 20, 1, 82, 230, + 52, 20, 1, 82, 224, 149, 20, 1, 82, 229, 15, 20, 1, 82, 233, 195, 20, 1, + 82, 225, 100, 20, 1, 82, 227, 252, 20, 1, 82, 211, 18, 20, 1, 82, 229, + 36, 20, 1, 82, 226, 94, 225, 190, 20, 1, 82, 243, 242, 251, 23, 20, 1, + 82, 244, 45, 20, 1, 82, 228, 181, 20, 1, 82, 61, 20, 1, 82, 216, 11, 20, + 1, 82, 78, 20, 1, 82, 74, 20, 1, 82, 233, 92, 20, 1, 82, 226, 94, 225, + 26, 20, 1, 82, 217, 102, 20, 1, 82, 217, 52, 20, 1, 82, 229, 152, 230, + 39, 240, 241, 20, 1, 82, 220, 17, 20, 1, 82, 211, 14, 20, 1, 82, 228, + 252, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217, 241, 20, 1, 82, 210, + 227, 249, 155, 20, 1, 82, 210, 187, 20, 1, 82, 210, 195, 20, 1, 82, 234, + 148, 20, 1, 82, 225, 154, 20, 1, 82, 228, 182, 245, 110, 20, 1, 82, 224, + 147, 20, 1, 82, 211, 192, 20, 1, 82, 244, 155, 20, 1, 82, 213, 250, 20, + 1, 82, 232, 103, 20, 1, 82, 230, 235, 20, 1, 82, 223, 54, 20, 1, 82, 223, + 174, 20, 1, 82, 228, 251, 20, 1, 82, 229, 82, 20, 1, 82, 220, 9, 20, 1, + 82, 219, 254, 20, 1, 82, 243, 242, 223, 89, 20, 1, 82, 198, 20, 1, 82, + 225, 111, 20, 1, 82, 232, 125, 20, 1, 82, 234, 34, 20, 1, 82, 231, 63, + 20, 1, 82, 186, 20, 1, 82, 231, 174, 20, 1, 82, 216, 222, 20, 1, 82, 234, + 98, 20, 1, 82, 230, 155, 20, 1, 82, 216, 248, 20, 1, 82, 244, 177, 20, 1, + 82, 242, 230, 20, 1, 225, 140, 176, 20, 1, 225, 140, 69, 20, 1, 225, 140, + 233, 223, 20, 1, 225, 140, 245, 217, 20, 1, 225, 140, 223, 111, 20, 1, + 225, 140, 217, 87, 20, 1, 225, 140, 227, 152, 20, 1, 225, 140, 233, 141, + 20, 1, 225, 140, 222, 242, 20, 1, 225, 140, 223, 32, 20, 1, 225, 140, + 231, 84, 20, 1, 225, 140, 217, 102, 20, 1, 225, 140, 229, 151, 20, 1, + 225, 140, 228, 188, 20, 1, 225, 140, 194, 20, 1, 225, 140, 218, 5, 20, 1, + 225, 140, 220, 29, 20, 1, 225, 140, 219, 193, 20, 1, 225, 140, 220, 125, + 20, 1, 225, 140, 233, 161, 20, 1, 225, 140, 234, 162, 20, 1, 225, 140, + 227, 213, 20, 1, 225, 140, 227, 242, 20, 1, 225, 140, 228, 159, 20, 1, + 225, 140, 210, 226, 20, 1, 225, 140, 219, 227, 20, 1, 225, 140, 192, 20, + 1, 225, 140, 228, 14, 20, 1, 225, 140, 225, 154, 20, 1, 225, 140, 227, + 251, 20, 1, 225, 140, 211, 192, 20, 1, 225, 140, 225, 214, 20, 1, 225, + 140, 222, 142, 20, 1, 225, 140, 228, 238, 20, 1, 225, 140, 223, 54, 20, + 1, 225, 140, 234, 171, 20, 1, 225, 140, 229, 12, 20, 1, 225, 140, 229, + 61, 20, 1, 225, 140, 220, 9, 20, 1, 225, 140, 224, 150, 20, 1, 225, 140, + 244, 45, 20, 1, 225, 140, 212, 65, 20, 1, 225, 140, 232, 247, 20, 1, 225, + 140, 232, 125, 20, 1, 225, 140, 234, 34, 20, 1, 225, 140, 231, 119, 20, + 1, 225, 140, 223, 86, 20, 1, 225, 140, 186, 20, 1, 225, 140, 230, 166, + 20, 1, 225, 140, 231, 127, 20, 1, 225, 140, 216, 231, 20, 1, 225, 140, + 234, 1, 20, 1, 225, 140, 221, 253, 20, 1, 225, 140, 212, 115, 95, 1, 191, + 95, 1, 252, 199, 95, 1, 8, 191, 95, 1, 225, 45, 95, 1, 186, 95, 1, 230, + 238, 95, 1, 254, 31, 186, 95, 1, 244, 204, 95, 1, 214, 27, 95, 1, 213, + 177, 95, 1, 217, 106, 95, 1, 248, 229, 95, 1, 8, 215, 157, 95, 1, 8, 217, + 106, 95, 1, 215, 157, 95, 1, 248, 143, 95, 1, 198, 95, 1, 228, 242, 95, + 1, 8, 228, 115, 95, 1, 254, 31, 198, 95, 1, 228, 115, 95, 1, 228, 101, + 95, 1, 233, 141, 95, 1, 232, 66, 95, 1, 233, 4, 95, 1, 232, 249, 95, 1, + 216, 57, 95, 1, 247, 161, 95, 1, 216, 49, 95, 1, 247, 160, 95, 1, 176, + 95, 1, 243, 142, 95, 1, 8, 176, 95, 1, 224, 91, 95, 1, 224, 69, 95, 1, + 229, 82, 95, 1, 229, 33, 95, 1, 254, 31, 229, 82, 95, 1, 162, 95, 1, 211, + 165, 95, 1, 243, 0, 95, 1, 242, 233, 95, 1, 215, 166, 95, 1, 246, 34, 95, + 1, 227, 169, 95, 1, 227, 154, 95, 1, 215, 176, 95, 1, 246, 41, 95, 1, 8, + 215, 176, 95, 1, 8, 246, 41, 95, 1, 223, 109, 215, 176, 95, 1, 220, 104, + 95, 1, 218, 225, 95, 1, 210, 82, 95, 1, 210, 14, 95, 1, 215, 184, 95, 1, + 246, 46, 95, 1, 8, 215, 184, 95, 1, 206, 95, 1, 210, 116, 95, 1, 210, 15, + 95, 1, 209, 243, 95, 1, 209, 223, 95, 1, 254, 31, 209, 243, 95, 1, 209, + 215, 95, 1, 209, 222, 95, 1, 212, 65, 95, 1, 254, 218, 95, 1, 241, 196, + 95, 1, 229, 197, 95, 5, 253, 230, 95, 5, 223, 109, 213, 133, 95, 5, 223, + 109, 253, 230, 95, 25, 5, 61, 95, 25, 5, 255, 82, 95, 25, 5, 254, 214, + 95, 25, 5, 254, 131, 95, 25, 5, 254, 123, 95, 25, 5, 78, 95, 25, 5, 226, + 187, 95, 25, 5, 211, 227, 95, 25, 5, 212, 98, 95, 25, 5, 76, 95, 25, 5, + 245, 158, 95, 25, 5, 245, 146, 95, 25, 5, 226, 236, 95, 25, 5, 74, 95, + 25, 5, 240, 126, 95, 25, 5, 240, 125, 95, 25, 5, 240, 124, 95, 25, 5, + 235, 196, 95, 25, 5, 236, 67, 95, 25, 5, 236, 40, 95, 25, 5, 235, 162, + 95, 25, 5, 235, 238, 95, 25, 5, 69, 95, 25, 5, 214, 229, 95, 25, 5, 214, + 228, 95, 25, 5, 214, 227, 95, 25, 5, 214, 118, 95, 25, 5, 214, 211, 95, + 25, 5, 214, 178, 95, 25, 5, 211, 117, 95, 25, 5, 211, 8, 95, 25, 5, 254, + 252, 95, 25, 5, 254, 248, 95, 25, 5, 245, 94, 95, 25, 5, 222, 185, 245, + 94, 95, 25, 5, 245, 100, 95, 25, 5, 222, 185, 245, 100, 95, 25, 5, 254, + 210, 95, 25, 5, 245, 203, 95, 25, 5, 253, 200, 95, 25, 5, 226, 138, 95, + 25, 5, 230, 30, 95, 25, 5, 229, 84, 95, 138, 222, 254, 95, 138, 216, 15, + 222, 254, 95, 138, 48, 95, 138, 51, 95, 1, 216, 29, 95, 1, 216, 28, 95, + 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95, 1, 216, 24, 95, 1, 216, + 23, 95, 1, 223, 109, 216, 30, 95, 1, 223, 109, 216, 29, 95, 1, 223, 109, + 216, 27, 95, 1, 223, 109, 216, 26, 95, 1, 223, 109, 216, 25, 95, 1, 223, + 109, 216, 23, 56, 1, 254, 31, 76, 141, 1, 254, 31, 211, 47, 49, 28, 16, + 224, 157, 49, 28, 16, 248, 166, 49, 28, 16, 225, 178, 49, 28, 16, 226, + 117, 245, 186, 49, 28, 16, 226, 117, 247, 209, 49, 28, 16, 214, 16, 245, + 186, 49, 28, 16, 214, 16, 247, 209, 49, 28, 16, 234, 203, 49, 28, 16, + 217, 170, 49, 28, 16, 226, 13, 49, 28, 16, 210, 217, 49, 28, 16, 210, + 218, 247, 209, 49, 28, 16, 233, 240, 49, 28, 16, 254, 76, 245, 186, 49, + 28, 16, 245, 34, 245, 186, 49, 28, 16, 217, 3, 49, 28, 16, 234, 167, 49, + 28, 16, 254, 66, 49, 28, 16, 254, 67, 247, 209, 49, 28, 16, 217, 176, 49, + 28, 16, 216, 160, 49, 28, 16, 226, 210, 254, 29, 49, 28, 16, 242, 166, + 254, 29, 49, 28, 16, 224, 156, 49, 28, 16, 250, 157, 49, 28, 16, 214, 6, + 49, 28, 16, 235, 170, 254, 29, 49, 28, 16, 234, 169, 254, 29, 49, 28, 16, + 234, 168, 254, 29, 49, 28, 16, 221, 215, 49, 28, 16, 226, 4, 49, 28, 16, + 218, 148, 254, 69, 49, 28, 16, 226, 116, 254, 29, 49, 28, 16, 214, 15, + 254, 29, 49, 28, 16, 254, 70, 254, 29, 49, 28, 16, 254, 64, 49, 28, 16, + 234, 43, 49, 28, 16, 223, 49, 49, 28, 16, 225, 109, 254, 29, 49, 28, 16, + 216, 84, 49, 28, 16, 254, 129, 49, 28, 16, 221, 161, 49, 28, 16, 217, + 179, 254, 29, 49, 28, 16, 217, 179, 231, 45, 218, 146, 49, 28, 16, 226, + 111, 254, 29, 49, 28, 16, 216, 191, 49, 28, 16, 233, 33, 49, 28, 16, 246, + 49, 49, 28, 16, 215, 228, 49, 28, 16, 216, 233, 49, 28, 16, 233, 243, 49, + 28, 16, 254, 76, 245, 34, 229, 100, 49, 28, 16, 243, 243, 254, 29, 49, + 28, 16, 236, 19, 49, 28, 16, 215, 200, 254, 29, 49, 28, 16, 234, 206, + 215, 199, 49, 28, 16, 225, 203, 49, 28, 16, 224, 161, 49, 28, 16, 234, + 17, 49, 28, 16, 250, 88, 254, 29, 49, 28, 16, 223, 149, 49, 28, 16, 226, + 16, 254, 29, 49, 28, 16, 226, 14, 254, 29, 49, 28, 16, 240, 116, 49, 28, + 16, 229, 208, 49, 28, 16, 225, 159, 49, 28, 16, 234, 18, 254, 158, 49, + 28, 16, 215, 200, 254, 158, 49, 28, 16, 218, 125, 49, 28, 16, 242, 130, + 49, 28, 16, 235, 170, 229, 100, 49, 28, 16, 226, 210, 229, 100, 49, 28, + 16, 226, 117, 229, 100, 49, 28, 16, 225, 158, 49, 28, 16, 234, 4, 49, 28, + 16, 225, 157, 49, 28, 16, 233, 242, 49, 28, 16, 225, 204, 229, 100, 49, + 28, 16, 234, 168, 229, 101, 254, 104, 49, 28, 16, 234, 169, 229, 101, + 254, 104, 49, 28, 16, 210, 215, 49, 28, 16, 254, 67, 229, 100, 49, 28, + 16, 254, 68, 217, 177, 229, 100, 49, 28, 16, 210, 216, 49, 28, 16, 233, + 241, 49, 28, 16, 245, 181, 49, 28, 16, 250, 158, 49, 28, 16, 230, 203, + 235, 169, 49, 28, 16, 214, 16, 229, 100, 49, 28, 16, 225, 109, 229, 100, + 49, 28, 16, 224, 162, 229, 100, 49, 28, 16, 226, 207, 49, 28, 16, 254, + 92, 49, 28, 16, 232, 63, 49, 28, 16, 226, 14, 229, 100, 49, 28, 16, 226, + 16, 229, 100, 49, 28, 16, 245, 68, 226, 15, 49, 28, 16, 233, 159, 49, 28, + 16, 254, 93, 49, 28, 16, 215, 200, 229, 100, 49, 28, 16, 245, 184, 49, + 28, 16, 217, 179, 229, 100, 49, 28, 16, 217, 171, 49, 28, 16, 250, 88, + 229, 100, 49, 28, 16, 245, 114, 49, 28, 16, 221, 162, 229, 100, 49, 28, + 16, 211, 151, 234, 43, 49, 28, 16, 215, 197, 49, 28, 16, 224, 163, 49, + 28, 16, 215, 201, 49, 28, 16, 215, 198, 49, 28, 16, 224, 160, 49, 28, 16, + 215, 196, 49, 28, 16, 224, 159, 49, 28, 16, 242, 165, 49, 28, 16, 254, + 22, 49, 28, 16, 245, 68, 254, 22, 49, 28, 16, 226, 111, 229, 100, 49, 28, + 16, 216, 190, 245, 77, 49, 28, 16, 216, 190, 245, 33, 49, 28, 16, 216, + 192, 254, 71, 49, 28, 16, 216, 185, 234, 253, 254, 63, 49, 28, 16, 234, + 205, 49, 28, 16, 245, 147, 49, 28, 16, 211, 11, 234, 202, 49, 28, 16, + 211, 11, 254, 104, 49, 28, 16, 218, 147, 49, 28, 16, 234, 44, 254, 104, + 49, 28, 16, 247, 210, 254, 29, 49, 28, 16, 233, 244, 254, 29, 49, 28, 16, + 233, 244, 254, 158, 49, 28, 16, 233, 244, 229, 100, 49, 28, 16, 254, 70, + 229, 100, 49, 28, 16, 254, 72, 49, 28, 16, 247, 209, 49, 28, 16, 215, + 211, 49, 28, 16, 216, 225, 49, 28, 16, 234, 8, 49, 28, 16, 233, 38, 245, + 142, 250, 79, 49, 28, 16, 233, 38, 246, 50, 250, 80, 49, 28, 16, 233, 38, + 215, 213, 250, 80, 49, 28, 16, 233, 38, 216, 235, 250, 80, 49, 28, 16, + 233, 38, 236, 14, 250, 79, 49, 28, 16, 242, 166, 229, 101, 254, 104, 49, + 28, 16, 242, 166, 226, 5, 254, 18, 49, 28, 16, 242, 166, 226, 5, 248, 37, + 49, 28, 16, 247, 233, 49, 28, 16, 247, 234, 226, 5, 254, 19, 234, 202, + 49, 28, 16, 247, 234, 226, 5, 254, 19, 254, 104, 49, 28, 16, 247, 234, + 226, 5, 248, 37, 49, 28, 16, 215, 217, 49, 28, 16, 254, 23, 49, 28, 16, + 236, 21, 49, 28, 16, 247, 254, 49, 28, 16, 254, 220, 225, 3, 254, 24, 49, + 28, 16, 254, 220, 254, 21, 49, 28, 16, 254, 220, 254, 24, 49, 28, 16, + 254, 220, 231, 39, 49, 28, 16, 254, 220, 231, 50, 49, 28, 16, 254, 220, + 242, 167, 49, 28, 16, 254, 220, 242, 164, 49, 28, 16, 254, 220, 225, 3, + 242, 167, 49, 28, 16, 231, 156, 224, 168, 240, 114, 49, 28, 16, 231, 156, + 254, 160, 224, 168, 240, 114, 49, 28, 16, 231, 156, 248, 36, 240, 114, + 49, 28, 16, 231, 156, 254, 160, 248, 36, 240, 114, 49, 28, 16, 231, 156, + 215, 206, 240, 114, 49, 28, 16, 231, 156, 215, 218, 49, 28, 16, 231, 156, + 216, 229, 240, 114, 49, 28, 16, 231, 156, 216, 229, 233, 41, 240, 114, + 49, 28, 16, 231, 156, 233, 41, 240, 114, 49, 28, 16, 231, 156, 225, 42, + 240, 114, 49, 28, 16, 235, 176, 216, 252, 240, 115, 49, 28, 16, 254, 68, + 216, 252, 240, 115, 49, 28, 16, 244, 180, 216, 226, 49, 28, 16, 244, 180, + 230, 148, 49, 28, 16, 244, 180, 247, 238, 49, 28, 16, 231, 156, 214, 10, + 240, 114, 49, 28, 16, 231, 156, 224, 167, 240, 114, 49, 28, 16, 231, 156, + 225, 42, 216, 229, 240, 114, 49, 28, 16, 242, 162, 230, 31, 254, 71, 49, + 28, 16, 242, 162, 230, 31, 247, 208, 49, 28, 16, 245, 156, 234, 253, 243, + 243, 213, 124, 49, 28, 16, 236, 20, 49, 28, 16, 236, 18, 49, 28, 16, 243, + 243, 254, 30, 248, 35, 240, 113, 49, 28, 16, 243, 243, 247, 252, 191, 49, + 28, 16, 243, 243, 247, 252, 229, 208, 49, 28, 16, 243, 243, 229, 203, + 240, 114, 49, 28, 16, 243, 243, 247, 252, 248, 11, 49, 28, 16, 243, 243, + 219, 104, 247, 251, 248, 11, 49, 28, 16, 243, 243, 247, 252, 234, 188, + 49, 28, 16, 243, 243, 247, 252, 210, 23, 49, 28, 16, 243, 243, 247, 252, + 228, 239, 234, 202, 49, 28, 16, 243, 243, 247, 252, 228, 239, 254, 104, + 49, 28, 16, 243, 243, 231, 196, 250, 81, 247, 238, 49, 28, 16, 243, 243, + 231, 196, 250, 81, 230, 148, 49, 28, 16, 244, 130, 219, 104, 250, 81, + 214, 9, 49, 28, 16, 243, 243, 219, 104, 250, 81, 217, 180, 49, 28, 16, + 243, 243, 229, 102, 49, 28, 16, 250, 82, 209, 249, 49, 28, 16, 250, 82, + 234, 42, 49, 28, 16, 250, 82, 219, 11, 49, 28, 16, 243, 243, 240, 161, + 211, 10, 216, 230, 49, 28, 16, 243, 243, 245, 157, 254, 94, 49, 28, 16, + 211, 10, 215, 207, 49, 28, 16, 247, 246, 215, 207, 49, 28, 16, 247, 246, + 216, 230, 49, 28, 16, 247, 246, 254, 73, 246, 50, 247, 147, 49, 28, 16, + 247, 246, 230, 146, 216, 234, 247, 147, 49, 28, 16, 247, 246, 247, 230, + 245, 44, 247, 147, 49, 28, 16, 247, 246, 215, 215, 226, 215, 247, 147, + 49, 28, 16, 211, 10, 254, 73, 246, 50, 247, 147, 49, 28, 16, 211, 10, + 230, 146, 216, 234, 247, 147, 49, 28, 16, 211, 10, 247, 230, 245, 44, + 247, 147, 49, 28, 16, 211, 10, 215, 215, 226, 215, 247, 147, 49, 28, 16, + 243, 56, 247, 245, 49, 28, 16, 243, 56, 211, 9, 49, 28, 16, 247, 253, + 254, 73, 230, 204, 49, 28, 16, 247, 253, 254, 73, 231, 78, 49, 28, 16, + 247, 253, 247, 209, 49, 28, 16, 247, 253, 216, 183, 49, 28, 16, 219, 165, + 216, 183, 49, 28, 16, 219, 165, 216, 184, 247, 194, 49, 28, 16, 219, 165, + 216, 184, 215, 208, 49, 28, 16, 219, 165, 216, 184, 216, 223, 49, 28, 16, + 219, 165, 253, 252, 49, 28, 16, 219, 165, 253, 253, 247, 194, 49, 28, 16, + 219, 165, 253, 253, 215, 208, 49, 28, 16, 219, 165, 253, 253, 216, 223, + 49, 28, 16, 247, 231, 243, 37, 49, 28, 16, 247, 237, 226, 138, 49, 28, + 16, 218, 139, 49, 28, 16, 254, 15, 191, 49, 28, 16, 254, 15, 213, 124, + 49, 28, 16, 254, 15, 243, 142, 49, 28, 16, 254, 15, 248, 11, 49, 28, 16, + 254, 15, 234, 188, 49, 28, 16, 254, 15, 210, 23, 49, 28, 16, 254, 15, + 228, 238, 49, 28, 16, 234, 168, 229, 101, 231, 49, 49, 28, 16, 234, 169, + 229, 101, 231, 49, 49, 28, 16, 234, 168, 229, 101, 234, 202, 49, 28, 16, + 234, 169, 229, 101, 234, 202, 49, 28, 16, 234, 44, 234, 202, 49, 28, 16, + 242, 166, 229, 101, 234, 202, 28, 16, 219, 157, 252, 143, 28, 16, 52, + 252, 143, 28, 16, 40, 252, 143, 28, 16, 223, 53, 40, 252, 143, 28, 16, + 248, 163, 252, 143, 28, 16, 219, 253, 252, 143, 28, 16, 43, 223, 80, 50, + 28, 16, 44, 223, 80, 50, 28, 16, 223, 80, 247, 126, 28, 16, 248, 204, + 221, 165, 28, 16, 248, 230, 251, 1, 28, 16, 221, 165, 28, 16, 249, 242, + 28, 16, 223, 78, 244, 119, 28, 16, 223, 78, 244, 118, 28, 16, 223, 78, + 244, 117, 28, 16, 244, 139, 28, 16, 244, 140, 51, 28, 16, 251, 156, 79, + 28, 16, 251, 32, 28, 16, 251, 167, 28, 16, 127, 28, 16, 226, 197, 218, + 165, 28, 16, 215, 57, 218, 165, 28, 16, 216, 143, 218, 165, 28, 16, 244, + 18, 218, 165, 28, 16, 244, 88, 218, 165, 28, 16, 219, 126, 218, 165, 28, + 16, 219, 124, 244, 2, 28, 16, 244, 16, 244, 2, 28, 16, 243, 210, 250, 22, + 28, 16, 243, 210, 250, 23, 226, 140, 254, 150, 28, 16, 243, 210, 250, 23, + 226, 140, 252, 130, 28, 16, 251, 75, 250, 22, 28, 16, 245, 15, 250, 22, + 28, 16, 245, 15, 250, 23, 226, 140, 254, 150, 28, 16, 245, 15, 250, 23, + 226, 140, 252, 130, 28, 16, 246, 91, 250, 21, 28, 16, 246, 91, 250, 20, + 28, 16, 230, 90, 231, 95, 223, 64, 28, 16, 52, 220, 77, 28, 16, 52, 244, + 73, 28, 16, 244, 74, 214, 163, 28, 16, 244, 74, 246, 114, 28, 16, 229, + 193, 214, 163, 28, 16, 229, 193, 246, 114, 28, 16, 220, 78, 214, 163, 28, + 16, 220, 78, 246, 114, 28, 16, 224, 25, 138, 220, 77, 28, 16, 224, 25, + 138, 244, 73, 28, 16, 249, 224, 216, 88, 28, 16, 249, 93, 216, 88, 28, + 16, 226, 140, 254, 150, 28, 16, 226, 140, 252, 130, 28, 16, 224, 7, 254, + 150, 28, 16, 224, 7, 252, 130, 28, 16, 230, 93, 223, 64, 28, 16, 211, + 251, 223, 64, 28, 16, 163, 223, 64, 28, 16, 224, 25, 223, 64, 28, 16, + 245, 197, 223, 64, 28, 16, 219, 120, 223, 64, 28, 16, 216, 161, 223, 64, + 28, 16, 219, 112, 223, 64, 28, 16, 123, 240, 218, 215, 71, 223, 64, 28, + 16, 211, 179, 228, 48, 28, 16, 96, 228, 48, 28, 16, 250, 44, 211, 179, + 228, 48, 28, 16, 42, 228, 49, 211, 253, 28, 16, 42, 228, 49, 251, 229, + 28, 16, 215, 227, 228, 49, 120, 211, 253, 28, 16, 215, 227, 228, 49, 120, + 251, 229, 28, 16, 215, 227, 228, 49, 43, 211, 253, 28, 16, 215, 227, 228, + 49, 43, 251, 229, 28, 16, 215, 227, 228, 49, 44, 211, 253, 28, 16, 215, + 227, 228, 49, 44, 251, 229, 28, 16, 215, 227, 228, 49, 124, 211, 253, 28, + 16, 215, 227, 228, 49, 124, 251, 229, 28, 16, 215, 227, 228, 49, 120, 44, + 211, 253, 28, 16, 215, 227, 228, 49, 120, 44, 251, 229, 28, 16, 230, 134, + 228, 49, 211, 253, 28, 16, 230, 134, 228, 49, 251, 229, 28, 16, 215, 224, + 228, 49, 124, 211, 253, 28, 16, 215, 224, 228, 49, 124, 251, 229, 28, 16, + 226, 8, 228, 48, 28, 16, 213, 132, 228, 48, 28, 16, 228, 49, 251, 229, + 28, 16, 227, 207, 228, 48, 28, 16, 249, 249, 228, 49, 211, 253, 28, 16, + 249, 249, 228, 49, 251, 229, 28, 16, 251, 154, 28, 16, 211, 251, 228, 52, + 28, 16, 163, 228, 52, 28, 16, 224, 25, 228, 52, 28, 16, 245, 197, 228, + 52, 28, 16, 219, 120, 228, 52, 28, 16, 216, 161, 228, 52, 28, 16, 219, + 112, 228, 52, 28, 16, 123, 240, 218, 215, 71, 228, 52, 28, 16, 38, 218, + 141, 28, 16, 38, 218, 242, 218, 141, 28, 16, 38, 215, 235, 28, 16, 38, + 215, 234, 28, 16, 38, 215, 233, 28, 16, 244, 109, 215, 235, 28, 16, 244, + 109, 215, 234, 28, 16, 244, 109, 215, 233, 28, 16, 38, 253, 197, 247, + 128, 28, 16, 38, 244, 80, 28, 16, 38, 244, 79, 28, 16, 38, 244, 78, 28, + 16, 38, 244, 77, 28, 16, 38, 244, 76, 28, 16, 252, 66, 252, 82, 28, 16, + 245, 151, 252, 82, 28, 16, 252, 66, 216, 112, 28, 16, 245, 151, 216, 112, + 28, 16, 252, 66, 219, 82, 28, 16, 245, 151, 219, 82, 28, 16, 252, 66, + 225, 118, 28, 16, 245, 151, 225, 118, 28, 16, 38, 255, 23, 28, 16, 38, + 218, 167, 28, 16, 38, 216, 239, 28, 16, 38, 218, 168, 28, 16, 38, 231, + 167, 28, 16, 38, 231, 166, 28, 16, 38, 255, 22, 28, 16, 38, 232, 118, 28, + 16, 254, 6, 214, 163, 28, 16, 254, 6, 246, 114, 28, 16, 38, 247, 143, 28, + 16, 38, 222, 234, 28, 16, 38, 244, 66, 28, 16, 38, 219, 78, 28, 16, 38, + 252, 46, 28, 16, 38, 52, 216, 20, 28, 16, 38, 215, 212, 216, 20, 28, 16, + 222, 238, 28, 16, 218, 76, 28, 16, 210, 159, 28, 16, 225, 110, 28, 16, + 231, 30, 28, 16, 244, 25, 28, 16, 249, 146, 28, 16, 248, 86, 28, 16, 242, + 157, 228, 53, 219, 97, 28, 16, 242, 157, 228, 53, 228, 80, 219, 97, 28, + 16, 216, 1, 28, 16, 215, 95, 28, 16, 235, 200, 215, 95, 28, 16, 215, 96, + 219, 97, 28, 16, 215, 96, 214, 163, 28, 16, 226, 152, 218, 104, 28, 16, + 226, 152, 218, 101, 28, 16, 226, 152, 218, 100, 28, 16, 226, 152, 218, + 99, 28, 16, 226, 152, 218, 98, 28, 16, 226, 152, 218, 97, 28, 16, 226, + 152, 218, 96, 28, 16, 226, 152, 218, 95, 28, 16, 226, 152, 218, 94, 28, + 16, 226, 152, 218, 103, 28, 16, 226, 152, 218, 102, 28, 16, 241, 252, 28, + 16, 229, 110, 28, 16, 245, 151, 64, 218, 135, 28, 16, 248, 79, 219, 97, + 28, 16, 38, 124, 251, 177, 28, 16, 38, 120, 251, 177, 28, 16, 38, 242, 7, + 28, 16, 38, 219, 69, 225, 46, 28, 16, 225, 219, 79, 28, 16, 225, 219, + 120, 79, 28, 16, 163, 225, 219, 79, 28, 16, 242, 189, 214, 163, 28, 16, + 242, 189, 246, 114, 28, 16, 2, 244, 108, 28, 16, 248, 188, 28, 16, 248, + 189, 254, 163, 28, 16, 231, 138, 28, 16, 232, 135, 28, 16, 251, 151, 28, + 16, 220, 156, 211, 253, 28, 16, 220, 156, 251, 229, 28, 16, 230, 189, 28, + 16, 230, 190, 251, 229, 28, 16, 220, 150, 211, 253, 28, 16, 220, 150, + 251, 229, 28, 16, 243, 227, 211, 253, 28, 16, 243, 227, 251, 229, 28, 16, + 232, 136, 225, 183, 223, 64, 28, 16, 232, 136, 236, 11, 223, 64, 28, 16, + 251, 152, 223, 64, 28, 16, 220, 156, 223, 64, 28, 16, 230, 190, 223, 64, + 28, 16, 220, 150, 223, 64, 28, 16, 216, 250, 225, 181, 249, 115, 224, + 177, 225, 182, 28, 16, 216, 250, 225, 181, 249, 115, 224, 177, 236, 10, + 28, 16, 216, 250, 225, 181, 249, 115, 224, 177, 225, 183, 247, 219, 28, + 16, 216, 250, 236, 9, 249, 115, 224, 177, 225, 182, 28, 16, 216, 250, + 236, 9, 249, 115, 224, 177, 236, 10, 28, 16, 216, 250, 236, 9, 249, 115, + 224, 177, 236, 11, 247, 219, 28, 16, 216, 250, 236, 9, 249, 115, 224, + 177, 236, 11, 247, 218, 28, 16, 216, 250, 236, 9, 249, 115, 224, 177, + 236, 11, 247, 217, 28, 16, 249, 141, 28, 16, 242, 133, 251, 75, 250, 22, + 28, 16, 242, 133, 245, 15, 250, 22, 28, 16, 42, 253, 166, 28, 16, 213, + 151, 28, 16, 225, 17, 28, 16, 250, 13, 28, 16, 221, 205, 28, 16, 250, 17, + 28, 16, 216, 8, 28, 16, 224, 245, 28, 16, 224, 246, 244, 68, 28, 16, 221, + 206, 244, 68, 28, 16, 216, 9, 223, 61, 28, 16, 225, 166, 218, 67, 26, + 213, 137, 189, 217, 230, 26, 213, 137, 189, 217, 219, 26, 213, 137, 189, + 217, 209, 26, 213, 137, 189, 217, 202, 26, 213, 137, 189, 217, 194, 26, + 213, 137, 189, 217, 188, 26, 213, 137, 189, 217, 187, 26, 213, 137, 189, + 217, 186, 26, 213, 137, 189, 217, 185, 26, 213, 137, 189, 217, 229, 26, + 213, 137, 189, 217, 228, 26, 213, 137, 189, 217, 227, 26, 213, 137, 189, + 217, 226, 26, 213, 137, 189, 217, 225, 26, 213, 137, 189, 217, 224, 26, + 213, 137, 189, 217, 223, 26, 213, 137, 189, 217, 222, 26, 213, 137, 189, + 217, 221, 26, 213, 137, 189, 217, 220, 26, 213, 137, 189, 217, 218, 26, + 213, 137, 189, 217, 217, 26, 213, 137, 189, 217, 216, 26, 213, 137, 189, + 217, 215, 26, 213, 137, 189, 217, 214, 26, 213, 137, 189, 217, 193, 26, + 213, 137, 189, 217, 192, 26, 213, 137, 189, 217, 191, 26, 213, 137, 189, + 217, 190, 26, 213, 137, 189, 217, 189, 26, 235, 221, 189, 217, 230, 26, + 235, 221, 189, 217, 219, 26, 235, 221, 189, 217, 202, 26, 235, 221, 189, + 217, 194, 26, 235, 221, 189, 217, 187, 26, 235, 221, 189, 217, 186, 26, + 235, 221, 189, 217, 228, 26, 235, 221, 189, 217, 227, 26, 235, 221, 189, + 217, 226, 26, 235, 221, 189, 217, 225, 26, 235, 221, 189, 217, 222, 26, + 235, 221, 189, 217, 221, 26, 235, 221, 189, 217, 220, 26, 235, 221, 189, + 217, 215, 26, 235, 221, 189, 217, 214, 26, 235, 221, 189, 217, 213, 26, + 235, 221, 189, 217, 212, 26, 235, 221, 189, 217, 211, 26, 235, 221, 189, + 217, 210, 26, 235, 221, 189, 217, 208, 26, 235, 221, 189, 217, 207, 26, + 235, 221, 189, 217, 206, 26, 235, 221, 189, 217, 205, 26, 235, 221, 189, + 217, 204, 26, 235, 221, 189, 217, 203, 26, 235, 221, 189, 217, 201, 26, + 235, 221, 189, 217, 200, 26, 235, 221, 189, 217, 199, 26, 235, 221, 189, + 217, 198, 26, 235, 221, 189, 217, 197, 26, 235, 221, 189, 217, 196, 26, + 235, 221, 189, 217, 195, 26, 235, 221, 189, 217, 193, 26, 235, 221, 189, + 217, 192, 26, 235, 221, 189, 217, 191, 26, 235, 221, 189, 217, 190, 26, + 235, 221, 189, 217, 189, 38, 26, 28, 215, 209, 38, 26, 28, 216, 224, 38, + 26, 28, 225, 191, 26, 28, 233, 37, 230, 147, 31, 245, 231, 247, 232, 31, + 241, 229, 245, 231, 247, 232, 31, 240, 221, 245, 231, 247, 232, 31, 245, + 230, 241, 230, 247, 232, 31, 245, 230, 240, 220, 247, 232, 31, 245, 231, + 180, 31, 250, 182, 180, 31, 243, 236, 250, 43, 180, 31, 230, 182, 180, + 31, 252, 138, 180, 31, 234, 185, 219, 81, 180, 31, 249, 187, 180, 31, + 253, 241, 180, 31, 226, 167, 180, 31, 251, 161, 226, 134, 180, 31, 248, + 81, 177, 247, 187, 180, 31, 247, 184, 180, 31, 210, 222, 180, 31, 235, + 254, 180, 31, 225, 200, 180, 31, 223, 130, 180, 31, 249, 197, 180, 31, + 241, 67, 252, 192, 180, 31, 212, 59, 180, 31, 244, 47, 180, 31, 254, 255, + 180, 31, 223, 92, 180, 31, 223, 68, 180, 31, 245, 229, 180, 31, 235, 59, + 180, 31, 249, 192, 180, 31, 245, 150, 180, 31, 246, 60, 180, 31, 250, + 153, 180, 31, 248, 90, 180, 31, 23, 223, 67, 180, 31, 226, 85, 180, 31, + 233, 40, 180, 31, 250, 6, 180, 31, 234, 83, 180, 31, 243, 93, 180, 31, + 218, 114, 180, 31, 224, 133, 180, 31, 243, 235, 180, 31, 223, 69, 180, + 31, 233, 77, 177, 230, 162, 180, 31, 223, 65, 180, 31, 242, 175, 216, 43, + 231, 81, 180, 31, 245, 152, 180, 31, 218, 126, 180, 31, 242, 135, 180, + 31, 245, 144, 180, 31, 225, 239, 180, 31, 222, 228, 180, 31, 244, 67, + 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 201, 180, 31, 231, 94, 180, + 31, 245, 69, 180, 31, 214, 172, 180, 31, 247, 220, 180, 31, 250, 8, 230, + 115, 180, 31, 242, 113, 180, 31, 243, 94, 236, 6, 180, 31, 231, 146, 180, + 31, 255, 19, 180, 31, 245, 165, 180, 31, 246, 117, 180, 31, 212, 42, 180, + 31, 219, 152, 180, 31, 235, 229, 180, 31, 248, 50, 180, 31, 248, 168, + 180, 31, 247, 216, 180, 31, 245, 37, 180, 31, 220, 117, 180, 31, 218, + 130, 180, 31, 242, 9, 180, 31, 249, 220, 180, 31, 250, 3, 180, 31, 244, + 185, 180, 31, 254, 221, 180, 31, 249, 219, 180, 31, 226, 201, 216, 197, + 213, 242, 180, 31, 247, 240, 180, 31, 233, 130, 180, 31, 244, 21, 249, + 157, 222, 204, 214, 174, 21, 111, 249, 157, 222, 204, 214, 174, 21, 105, + 249, 157, 222, 204, 214, 174, 21, 158, 249, 157, 222, 204, 214, 174, 21, + 161, 249, 157, 222, 204, 214, 174, 21, 190, 249, 157, 222, 204, 214, 174, + 21, 195, 249, 157, 222, 204, 214, 174, 21, 199, 249, 157, 222, 204, 214, + 174, 21, 196, 249, 157, 222, 204, 214, 174, 21, 201, 249, 157, 222, 204, + 216, 244, 21, 111, 249, 157, 222, 204, 216, 244, 21, 105, 249, 157, 222, + 204, 216, 244, 21, 158, 249, 157, 222, 204, 216, 244, 21, 161, 249, 157, + 222, 204, 216, 244, 21, 190, 249, 157, 222, 204, 216, 244, 21, 195, 249, + 157, 222, 204, 216, 244, 21, 199, 249, 157, 222, 204, 216, 244, 21, 196, + 249, 157, 222, 204, 216, 244, 21, 201, 11, 23, 6, 61, 11, 23, 6, 253, + 166, 11, 23, 6, 251, 74, 11, 23, 6, 249, 68, 11, 23, 6, 76, 11, 23, 6, + 245, 14, 11, 23, 6, 243, 209, 11, 23, 6, 242, 67, 11, 23, 6, 74, 11, 23, + 6, 235, 150, 11, 23, 6, 235, 29, 11, 23, 6, 156, 11, 23, 6, 194, 11, 23, + 6, 230, 30, 11, 23, 6, 78, 11, 23, 6, 226, 109, 11, 23, 6, 224, 99, 11, + 23, 6, 153, 11, 23, 6, 222, 93, 11, 23, 6, 217, 153, 11, 23, 6, 69, 11, 23, 6, 214, 105, 11, 23, 6, 212, 98, 11, 23, 6, 211, 178, 11, 23, 6, 211, - 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 159, 11, 23, 4, - 251, 67, 11, 23, 4, 249, 61, 11, 23, 4, 75, 11, 23, 4, 245, 7, 11, 23, 4, - 243, 203, 11, 23, 4, 242, 61, 11, 23, 4, 73, 11, 23, 4, 235, 145, 11, 23, - 4, 235, 24, 11, 23, 4, 156, 11, 23, 4, 193, 11, 23, 4, 230, 26, 11, 23, - 4, 76, 11, 23, 4, 226, 106, 11, 23, 4, 224, 97, 11, 23, 4, 153, 11, 23, - 4, 222, 92, 11, 23, 4, 217, 153, 11, 23, 4, 70, 11, 23, 4, 214, 105, 11, - 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11, 23, 4, 210, - 159, 11, 32, 6, 61, 11, 32, 6, 253, 159, 11, 32, 6, 251, 67, 11, 32, 6, - 249, 61, 11, 32, 6, 75, 11, 32, 6, 245, 7, 11, 32, 6, 243, 203, 11, 32, - 6, 242, 61, 11, 32, 6, 73, 11, 32, 6, 235, 145, 11, 32, 6, 235, 24, 11, - 32, 6, 156, 11, 32, 6, 193, 11, 32, 6, 230, 26, 11, 32, 6, 76, 11, 32, 6, - 226, 106, 11, 32, 6, 224, 97, 11, 32, 6, 153, 11, 32, 6, 222, 92, 11, 32, - 6, 217, 153, 11, 32, 6, 70, 11, 32, 6, 214, 105, 11, 32, 6, 212, 98, 11, - 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210, 159, 11, 32, 4, 61, - 11, 32, 4, 253, 159, 11, 32, 4, 251, 67, 11, 32, 4, 249, 61, 11, 32, 4, - 75, 11, 32, 4, 245, 7, 11, 32, 4, 243, 203, 11, 32, 4, 73, 11, 32, 4, - 235, 145, 11, 32, 4, 235, 24, 11, 32, 4, 156, 11, 32, 4, 193, 11, 32, 4, - 230, 26, 11, 32, 4, 76, 11, 32, 4, 226, 106, 11, 32, 4, 224, 97, 11, 32, - 4, 153, 11, 32, 4, 222, 92, 11, 32, 4, 217, 153, 11, 32, 4, 70, 11, 32, - 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178, 11, 32, 4, 211, - 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32, 6, 253, 159, 11, - 23, 32, 6, 251, 67, 11, 23, 32, 6, 249, 61, 11, 23, 32, 6, 75, 11, 23, - 32, 6, 245, 7, 11, 23, 32, 6, 243, 203, 11, 23, 32, 6, 242, 61, 11, 23, - 32, 6, 73, 11, 23, 32, 6, 235, 145, 11, 23, 32, 6, 235, 24, 11, 23, 32, - 6, 156, 11, 23, 32, 6, 193, 11, 23, 32, 6, 230, 26, 11, 23, 32, 6, 76, - 11, 23, 32, 6, 226, 106, 11, 23, 32, 6, 224, 97, 11, 23, 32, 6, 153, 11, - 23, 32, 6, 222, 92, 11, 23, 32, 6, 217, 153, 11, 23, 32, 6, 70, 11, 23, - 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6, 211, 178, 11, 23, - 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32, 4, 61, 11, 23, 32, - 4, 253, 159, 11, 23, 32, 4, 251, 67, 11, 23, 32, 4, 249, 61, 11, 23, 32, - 4, 75, 11, 23, 32, 4, 245, 7, 11, 23, 32, 4, 243, 203, 11, 23, 32, 4, - 242, 61, 11, 23, 32, 4, 73, 11, 23, 32, 4, 235, 145, 11, 23, 32, 4, 235, - 24, 11, 23, 32, 4, 156, 11, 23, 32, 4, 193, 11, 23, 32, 4, 230, 26, 11, - 23, 32, 4, 76, 11, 23, 32, 4, 226, 106, 11, 23, 32, 4, 224, 97, 11, 23, - 32, 4, 153, 11, 23, 32, 4, 222, 92, 11, 23, 32, 4, 217, 153, 11, 23, 32, - 4, 70, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212, 98, 11, 23, 32, 4, - 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210, 159, 11, 119, 6, - 61, 11, 119, 6, 251, 67, 11, 119, 6, 249, 61, 11, 119, 6, 243, 203, 11, - 119, 6, 235, 145, 11, 119, 6, 235, 24, 11, 119, 6, 230, 26, 11, 119, 6, - 76, 11, 119, 6, 226, 106, 11, 119, 6, 224, 97, 11, 119, 6, 222, 92, 11, - 119, 6, 217, 153, 11, 119, 6, 70, 11, 119, 6, 214, 105, 11, 119, 6, 212, - 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119, 6, 210, 159, 11, - 119, 4, 61, 11, 119, 4, 253, 159, 11, 119, 4, 251, 67, 11, 119, 4, 249, - 61, 11, 119, 4, 245, 7, 11, 119, 4, 242, 61, 11, 119, 4, 73, 11, 119, 4, - 235, 145, 11, 119, 4, 235, 24, 11, 119, 4, 156, 11, 119, 4, 193, 11, 119, - 4, 230, 26, 11, 119, 4, 226, 106, 11, 119, 4, 224, 97, 11, 119, 4, 153, - 11, 119, 4, 222, 92, 11, 119, 4, 217, 153, 11, 119, 4, 70, 11, 119, 4, - 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11, 119, 4, 211, - 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119, 6, 253, 159, - 11, 23, 119, 6, 251, 67, 11, 23, 119, 6, 249, 61, 11, 23, 119, 6, 75, 11, - 23, 119, 6, 245, 7, 11, 23, 119, 6, 243, 203, 11, 23, 119, 6, 242, 61, - 11, 23, 119, 6, 73, 11, 23, 119, 6, 235, 145, 11, 23, 119, 6, 235, 24, - 11, 23, 119, 6, 156, 11, 23, 119, 6, 193, 11, 23, 119, 6, 230, 26, 11, - 23, 119, 6, 76, 11, 23, 119, 6, 226, 106, 11, 23, 119, 6, 224, 97, 11, - 23, 119, 6, 153, 11, 23, 119, 6, 222, 92, 11, 23, 119, 6, 217, 153, 11, - 23, 119, 6, 70, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6, 212, 98, 11, - 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119, 6, 210, 159, - 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 159, 11, 23, 119, 4, 251, 67, - 11, 23, 119, 4, 249, 61, 11, 23, 119, 4, 75, 11, 23, 119, 4, 245, 7, 11, - 23, 119, 4, 243, 203, 11, 23, 119, 4, 242, 61, 11, 23, 119, 4, 73, 11, - 23, 119, 4, 235, 145, 11, 23, 119, 4, 235, 24, 11, 23, 119, 4, 156, 11, - 23, 119, 4, 193, 11, 23, 119, 4, 230, 26, 11, 23, 119, 4, 76, 11, 23, - 119, 4, 226, 106, 11, 23, 119, 4, 224, 97, 11, 23, 119, 4, 153, 11, 23, - 119, 4, 222, 92, 11, 23, 119, 4, 217, 153, 11, 23, 119, 4, 70, 11, 23, - 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211, 178, 11, - 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61, 11, 133, - 6, 253, 159, 11, 133, 6, 249, 61, 11, 133, 6, 75, 11, 133, 6, 245, 7, 11, - 133, 6, 243, 203, 11, 133, 6, 235, 145, 11, 133, 6, 235, 24, 11, 133, 6, - 156, 11, 133, 6, 193, 11, 133, 6, 230, 26, 11, 133, 6, 76, 11, 133, 6, - 226, 106, 11, 133, 6, 224, 97, 11, 133, 6, 222, 92, 11, 133, 6, 217, 153, - 11, 133, 6, 70, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98, 11, 133, 6, - 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4, 253, 159, 11, - 133, 4, 251, 67, 11, 133, 4, 249, 61, 11, 133, 4, 75, 11, 133, 4, 245, 7, - 11, 133, 4, 243, 203, 11, 133, 4, 242, 61, 11, 133, 4, 73, 11, 133, 4, - 235, 145, 11, 133, 4, 235, 24, 11, 133, 4, 156, 11, 133, 4, 193, 11, 133, - 4, 230, 26, 11, 133, 4, 76, 11, 133, 4, 226, 106, 11, 133, 4, 224, 97, - 11, 133, 4, 153, 11, 133, 4, 222, 92, 11, 133, 4, 217, 153, 11, 133, 4, - 70, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133, 4, 211, 178, 11, - 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61, 11, 139, 6, 253, - 159, 11, 139, 6, 249, 61, 11, 139, 6, 75, 11, 139, 6, 245, 7, 11, 139, 6, - 243, 203, 11, 139, 6, 73, 11, 139, 6, 235, 145, 11, 139, 6, 235, 24, 11, - 139, 6, 156, 11, 139, 6, 193, 11, 139, 6, 76, 11, 139, 6, 222, 92, 11, - 139, 6, 217, 153, 11, 139, 6, 70, 11, 139, 6, 214, 105, 11, 139, 6, 212, - 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11, 139, 4, 61, 11, 139, - 4, 253, 159, 11, 139, 4, 251, 67, 11, 139, 4, 249, 61, 11, 139, 4, 75, - 11, 139, 4, 245, 7, 11, 139, 4, 243, 203, 11, 139, 4, 242, 61, 11, 139, - 4, 73, 11, 139, 4, 235, 145, 11, 139, 4, 235, 24, 11, 139, 4, 156, 11, - 139, 4, 193, 11, 139, 4, 230, 26, 11, 139, 4, 76, 11, 139, 4, 226, 106, - 11, 139, 4, 224, 97, 11, 139, 4, 153, 11, 139, 4, 222, 92, 11, 139, 4, - 217, 153, 11, 139, 4, 70, 11, 139, 4, 214, 105, 11, 139, 4, 212, 98, 11, - 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, 210, 159, 11, 23, - 133, 6, 61, 11, 23, 133, 6, 253, 159, 11, 23, 133, 6, 251, 67, 11, 23, - 133, 6, 249, 61, 11, 23, 133, 6, 75, 11, 23, 133, 6, 245, 7, 11, 23, 133, - 6, 243, 203, 11, 23, 133, 6, 242, 61, 11, 23, 133, 6, 73, 11, 23, 133, 6, - 235, 145, 11, 23, 133, 6, 235, 24, 11, 23, 133, 6, 156, 11, 23, 133, 6, - 193, 11, 23, 133, 6, 230, 26, 11, 23, 133, 6, 76, 11, 23, 133, 6, 226, - 106, 11, 23, 133, 6, 224, 97, 11, 23, 133, 6, 153, 11, 23, 133, 6, 222, - 92, 11, 23, 133, 6, 217, 153, 11, 23, 133, 6, 70, 11, 23, 133, 6, 214, - 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, 178, 11, 23, 133, 6, - 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, 61, 11, 23, 133, 4, - 253, 159, 11, 23, 133, 4, 251, 67, 11, 23, 133, 4, 249, 61, 11, 23, 133, - 4, 75, 11, 23, 133, 4, 245, 7, 11, 23, 133, 4, 243, 203, 11, 23, 133, 4, - 242, 61, 11, 23, 133, 4, 73, 11, 23, 133, 4, 235, 145, 11, 23, 133, 4, - 235, 24, 11, 23, 133, 4, 156, 11, 23, 133, 4, 193, 11, 23, 133, 4, 230, - 26, 11, 23, 133, 4, 76, 11, 23, 133, 4, 226, 106, 11, 23, 133, 4, 224, - 97, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, 92, 11, 23, 133, 4, 217, - 153, 11, 23, 133, 4, 70, 11, 23, 133, 4, 214, 105, 11, 23, 133, 4, 212, - 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, 211, 117, 11, 23, 133, 4, - 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 159, 11, 35, 6, 251, 67, 11, 35, - 6, 249, 61, 11, 35, 6, 75, 11, 35, 6, 245, 7, 11, 35, 6, 243, 203, 11, - 35, 6, 242, 61, 11, 35, 6, 73, 11, 35, 6, 235, 145, 11, 35, 6, 235, 24, - 11, 35, 6, 156, 11, 35, 6, 193, 11, 35, 6, 230, 26, 11, 35, 6, 76, 11, - 35, 6, 226, 106, 11, 35, 6, 224, 97, 11, 35, 6, 153, 11, 35, 6, 222, 92, - 11, 35, 6, 217, 153, 11, 35, 6, 70, 11, 35, 6, 214, 105, 11, 35, 6, 212, - 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, 117, 11, 35, 6, 210, 159, 11, - 35, 4, 61, 11, 35, 4, 253, 159, 11, 35, 4, 251, 67, 11, 35, 4, 249, 61, - 11, 35, 4, 75, 11, 35, 4, 245, 7, 11, 35, 4, 243, 203, 11, 35, 4, 242, - 61, 11, 35, 4, 73, 11, 35, 4, 235, 145, 11, 35, 4, 235, 24, 11, 35, 4, - 156, 11, 35, 4, 193, 11, 35, 4, 230, 26, 11, 35, 4, 76, 11, 35, 4, 226, - 106, 11, 35, 4, 224, 97, 11, 35, 4, 153, 11, 35, 4, 222, 92, 11, 35, 4, - 217, 153, 11, 35, 4, 70, 11, 35, 4, 214, 105, 11, 35, 4, 212, 98, 11, 35, - 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, 210, 159, 11, 35, 23, 6, 61, - 11, 35, 23, 6, 253, 159, 11, 35, 23, 6, 251, 67, 11, 35, 23, 6, 249, 61, - 11, 35, 23, 6, 75, 11, 35, 23, 6, 245, 7, 11, 35, 23, 6, 243, 203, 11, - 35, 23, 6, 242, 61, 11, 35, 23, 6, 73, 11, 35, 23, 6, 235, 145, 11, 35, - 23, 6, 235, 24, 11, 35, 23, 6, 156, 11, 35, 23, 6, 193, 11, 35, 23, 6, - 230, 26, 11, 35, 23, 6, 76, 11, 35, 23, 6, 226, 106, 11, 35, 23, 6, 224, - 97, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, 92, 11, 35, 23, 6, 217, 153, - 11, 35, 23, 6, 70, 11, 35, 23, 6, 214, 105, 11, 35, 23, 6, 212, 98, 11, - 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, 11, 35, 23, 6, 210, 159, - 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 159, 11, 35, 23, 4, 251, 67, 11, - 35, 23, 4, 249, 61, 11, 35, 23, 4, 75, 11, 35, 23, 4, 245, 7, 11, 35, 23, - 4, 243, 203, 11, 35, 23, 4, 242, 61, 11, 35, 23, 4, 73, 11, 35, 23, 4, - 235, 145, 11, 35, 23, 4, 235, 24, 11, 35, 23, 4, 156, 11, 35, 23, 4, 193, - 11, 35, 23, 4, 230, 26, 11, 35, 23, 4, 76, 11, 35, 23, 4, 226, 106, 11, - 35, 23, 4, 224, 97, 11, 35, 23, 4, 153, 11, 35, 23, 4, 222, 92, 11, 35, - 23, 4, 217, 153, 11, 35, 23, 4, 70, 11, 35, 23, 4, 214, 105, 11, 35, 23, - 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, 23, 4, 211, 117, 11, 35, 23, - 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, 6, 253, 159, 11, 35, 32, 6, - 251, 67, 11, 35, 32, 6, 249, 61, 11, 35, 32, 6, 75, 11, 35, 32, 6, 245, - 7, 11, 35, 32, 6, 243, 203, 11, 35, 32, 6, 242, 61, 11, 35, 32, 6, 73, - 11, 35, 32, 6, 235, 145, 11, 35, 32, 6, 235, 24, 11, 35, 32, 6, 156, 11, - 35, 32, 6, 193, 11, 35, 32, 6, 230, 26, 11, 35, 32, 6, 76, 11, 35, 32, 6, - 226, 106, 11, 35, 32, 6, 224, 97, 11, 35, 32, 6, 153, 11, 35, 32, 6, 222, - 92, 11, 35, 32, 6, 217, 153, 11, 35, 32, 6, 70, 11, 35, 32, 6, 214, 105, - 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, 211, 178, 11, 35, 32, 6, 211, 117, - 11, 35, 32, 6, 210, 159, 11, 35, 32, 4, 61, 11, 35, 32, 4, 253, 159, 11, - 35, 32, 4, 251, 67, 11, 35, 32, 4, 249, 61, 11, 35, 32, 4, 75, 11, 35, - 32, 4, 245, 7, 11, 35, 32, 4, 243, 203, 11, 35, 32, 4, 242, 61, 11, 35, - 32, 4, 73, 11, 35, 32, 4, 235, 145, 11, 35, 32, 4, 235, 24, 11, 35, 32, - 4, 156, 11, 35, 32, 4, 193, 11, 35, 32, 4, 230, 26, 11, 35, 32, 4, 76, - 11, 35, 32, 4, 226, 106, 11, 35, 32, 4, 224, 97, 11, 35, 32, 4, 153, 11, - 35, 32, 4, 222, 92, 11, 35, 32, 4, 217, 153, 11, 35, 32, 4, 70, 11, 35, - 32, 4, 214, 105, 11, 35, 32, 4, 212, 98, 11, 35, 32, 4, 211, 178, 11, 35, - 32, 4, 211, 117, 11, 35, 32, 4, 210, 159, 11, 35, 23, 32, 6, 61, 11, 35, - 23, 32, 6, 253, 159, 11, 35, 23, 32, 6, 251, 67, 11, 35, 23, 32, 6, 249, - 61, 11, 35, 23, 32, 6, 75, 11, 35, 23, 32, 6, 245, 7, 11, 35, 23, 32, 6, - 243, 203, 11, 35, 23, 32, 6, 242, 61, 11, 35, 23, 32, 6, 73, 11, 35, 23, - 32, 6, 235, 145, 11, 35, 23, 32, 6, 235, 24, 11, 35, 23, 32, 6, 156, 11, - 35, 23, 32, 6, 193, 11, 35, 23, 32, 6, 230, 26, 11, 35, 23, 32, 6, 76, - 11, 35, 23, 32, 6, 226, 106, 11, 35, 23, 32, 6, 224, 97, 11, 35, 23, 32, - 6, 153, 11, 35, 23, 32, 6, 222, 92, 11, 35, 23, 32, 6, 217, 153, 11, 35, - 23, 32, 6, 70, 11, 35, 23, 32, 6, 214, 105, 11, 35, 23, 32, 6, 212, 98, - 11, 35, 23, 32, 6, 211, 178, 11, 35, 23, 32, 6, 211, 117, 11, 35, 23, 32, - 6, 210, 159, 11, 35, 23, 32, 4, 61, 11, 35, 23, 32, 4, 253, 159, 11, 35, - 23, 32, 4, 251, 67, 11, 35, 23, 32, 4, 249, 61, 11, 35, 23, 32, 4, 75, - 11, 35, 23, 32, 4, 245, 7, 11, 35, 23, 32, 4, 243, 203, 11, 35, 23, 32, - 4, 242, 61, 11, 35, 23, 32, 4, 73, 11, 35, 23, 32, 4, 235, 145, 11, 35, - 23, 32, 4, 235, 24, 11, 35, 23, 32, 4, 156, 11, 35, 23, 32, 4, 193, 11, - 35, 23, 32, 4, 230, 26, 11, 35, 23, 32, 4, 76, 11, 35, 23, 32, 4, 226, - 106, 11, 35, 23, 32, 4, 224, 97, 11, 35, 23, 32, 4, 153, 11, 35, 23, 32, - 4, 222, 92, 11, 35, 23, 32, 4, 217, 153, 11, 35, 23, 32, 4, 70, 11, 35, - 23, 32, 4, 214, 105, 11, 35, 23, 32, 4, 212, 98, 11, 35, 23, 32, 4, 211, - 178, 11, 35, 23, 32, 4, 211, 117, 11, 35, 23, 32, 4, 210, 159, 11, 230, - 139, 6, 61, 11, 230, 139, 6, 253, 159, 11, 230, 139, 6, 251, 67, 11, 230, - 139, 6, 249, 61, 11, 230, 139, 6, 75, 11, 230, 139, 6, 245, 7, 11, 230, - 139, 6, 243, 203, 11, 230, 139, 6, 242, 61, 11, 230, 139, 6, 73, 11, 230, - 139, 6, 235, 145, 11, 230, 139, 6, 235, 24, 11, 230, 139, 6, 156, 11, - 230, 139, 6, 193, 11, 230, 139, 6, 230, 26, 11, 230, 139, 6, 76, 11, 230, - 139, 6, 226, 106, 11, 230, 139, 6, 224, 97, 11, 230, 139, 6, 153, 11, - 230, 139, 6, 222, 92, 11, 230, 139, 6, 217, 153, 11, 230, 139, 6, 70, 11, - 230, 139, 6, 214, 105, 11, 230, 139, 6, 212, 98, 11, 230, 139, 6, 211, - 178, 11, 230, 139, 6, 211, 117, 11, 230, 139, 6, 210, 159, 11, 230, 139, - 4, 61, 11, 230, 139, 4, 253, 159, 11, 230, 139, 4, 251, 67, 11, 230, 139, - 4, 249, 61, 11, 230, 139, 4, 75, 11, 230, 139, 4, 245, 7, 11, 230, 139, - 4, 243, 203, 11, 230, 139, 4, 242, 61, 11, 230, 139, 4, 73, 11, 230, 139, - 4, 235, 145, 11, 230, 139, 4, 235, 24, 11, 230, 139, 4, 156, 11, 230, - 139, 4, 193, 11, 230, 139, 4, 230, 26, 11, 230, 139, 4, 76, 11, 230, 139, - 4, 226, 106, 11, 230, 139, 4, 224, 97, 11, 230, 139, 4, 153, 11, 230, - 139, 4, 222, 92, 11, 230, 139, 4, 217, 153, 11, 230, 139, 4, 70, 11, 230, - 139, 4, 214, 105, 11, 230, 139, 4, 212, 98, 11, 230, 139, 4, 211, 178, - 11, 230, 139, 4, 211, 117, 11, 230, 139, 4, 210, 159, 11, 32, 4, 247, - 120, 73, 11, 32, 4, 247, 120, 235, 145, 11, 23, 6, 254, 144, 11, 23, 6, - 252, 27, 11, 23, 6, 243, 108, 11, 23, 6, 248, 55, 11, 23, 6, 245, 101, - 11, 23, 6, 210, 85, 11, 23, 6, 245, 64, 11, 23, 6, 216, 180, 11, 23, 6, - 235, 186, 11, 23, 6, 234, 223, 11, 23, 6, 233, 99, 11, 23, 6, 230, 103, - 11, 23, 6, 227, 238, 11, 23, 6, 211, 157, 11, 23, 6, 226, 200, 11, 23, 6, - 225, 109, 11, 23, 6, 223, 38, 11, 23, 6, 216, 181, 87, 11, 23, 6, 219, - 178, 11, 23, 6, 217, 42, 11, 23, 6, 214, 157, 11, 23, 6, 225, 134, 11, - 23, 6, 250, 111, 11, 23, 6, 224, 162, 11, 23, 6, 226, 202, 11, 23, 229, - 222, 11, 23, 4, 254, 144, 11, 23, 4, 252, 27, 11, 23, 4, 243, 108, 11, - 23, 4, 248, 55, 11, 23, 4, 245, 101, 11, 23, 4, 210, 85, 11, 23, 4, 245, - 64, 11, 23, 4, 216, 180, 11, 23, 4, 235, 186, 11, 23, 4, 234, 223, 11, - 23, 4, 233, 99, 11, 23, 4, 230, 103, 11, 23, 4, 227, 238, 11, 23, 4, 211, - 157, 11, 23, 4, 226, 200, 11, 23, 4, 225, 109, 11, 23, 4, 223, 38, 11, - 23, 4, 40, 219, 178, 11, 23, 4, 219, 178, 11, 23, 4, 217, 42, 11, 23, 4, - 214, 157, 11, 23, 4, 225, 134, 11, 23, 4, 250, 111, 11, 23, 4, 224, 162, - 11, 23, 4, 226, 202, 11, 23, 225, 254, 247, 234, 11, 23, 245, 102, 87, - 11, 23, 216, 181, 87, 11, 23, 234, 224, 87, 11, 23, 225, 135, 87, 11, 23, - 223, 39, 87, 11, 23, 225, 110, 87, 11, 32, 6, 254, 144, 11, 32, 6, 252, - 27, 11, 32, 6, 243, 108, 11, 32, 6, 248, 55, 11, 32, 6, 245, 101, 11, 32, - 6, 210, 85, 11, 32, 6, 245, 64, 11, 32, 6, 216, 180, 11, 32, 6, 235, 186, - 11, 32, 6, 234, 223, 11, 32, 6, 233, 99, 11, 32, 6, 230, 103, 11, 32, 6, - 227, 238, 11, 32, 6, 211, 157, 11, 32, 6, 226, 200, 11, 32, 6, 225, 109, - 11, 32, 6, 223, 38, 11, 32, 6, 216, 181, 87, 11, 32, 6, 219, 178, 11, 32, - 6, 217, 42, 11, 32, 6, 214, 157, 11, 32, 6, 225, 134, 11, 32, 6, 250, - 111, 11, 32, 6, 224, 162, 11, 32, 6, 226, 202, 11, 32, 229, 222, 11, 32, - 4, 254, 144, 11, 32, 4, 252, 27, 11, 32, 4, 243, 108, 11, 32, 4, 248, 55, - 11, 32, 4, 245, 101, 11, 32, 4, 210, 85, 11, 32, 4, 245, 64, 11, 32, 4, - 216, 180, 11, 32, 4, 235, 186, 11, 32, 4, 234, 223, 11, 32, 4, 233, 99, - 11, 32, 4, 230, 103, 11, 32, 4, 227, 238, 11, 32, 4, 211, 157, 11, 32, 4, - 226, 200, 11, 32, 4, 225, 109, 11, 32, 4, 223, 38, 11, 32, 4, 40, 219, - 178, 11, 32, 4, 219, 178, 11, 32, 4, 217, 42, 11, 32, 4, 214, 157, 11, - 32, 4, 225, 134, 11, 32, 4, 250, 111, 11, 32, 4, 224, 162, 11, 32, 4, - 226, 202, 11, 32, 225, 254, 247, 234, 11, 32, 245, 102, 87, 11, 32, 216, - 181, 87, 11, 32, 234, 224, 87, 11, 32, 225, 135, 87, 11, 32, 223, 39, 87, - 11, 32, 225, 110, 87, 11, 23, 32, 6, 254, 144, 11, 23, 32, 6, 252, 27, - 11, 23, 32, 6, 243, 108, 11, 23, 32, 6, 248, 55, 11, 23, 32, 6, 245, 101, - 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, 245, 64, 11, 23, 32, 6, 216, 180, - 11, 23, 32, 6, 235, 186, 11, 23, 32, 6, 234, 223, 11, 23, 32, 6, 233, 99, - 11, 23, 32, 6, 230, 103, 11, 23, 32, 6, 227, 238, 11, 23, 32, 6, 211, - 157, 11, 23, 32, 6, 226, 200, 11, 23, 32, 6, 225, 109, 11, 23, 32, 6, - 223, 38, 11, 23, 32, 6, 216, 181, 87, 11, 23, 32, 6, 219, 178, 11, 23, - 32, 6, 217, 42, 11, 23, 32, 6, 214, 157, 11, 23, 32, 6, 225, 134, 11, 23, - 32, 6, 250, 111, 11, 23, 32, 6, 224, 162, 11, 23, 32, 6, 226, 202, 11, - 23, 32, 229, 222, 11, 23, 32, 4, 254, 144, 11, 23, 32, 4, 252, 27, 11, - 23, 32, 4, 243, 108, 11, 23, 32, 4, 248, 55, 11, 23, 32, 4, 245, 101, 11, - 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 64, 11, 23, 32, 4, 216, 180, 11, - 23, 32, 4, 235, 186, 11, 23, 32, 4, 234, 223, 11, 23, 32, 4, 233, 99, 11, - 23, 32, 4, 230, 103, 11, 23, 32, 4, 227, 238, 11, 23, 32, 4, 211, 157, - 11, 23, 32, 4, 226, 200, 11, 23, 32, 4, 225, 109, 11, 23, 32, 4, 223, 38, - 11, 23, 32, 4, 40, 219, 178, 11, 23, 32, 4, 219, 178, 11, 23, 32, 4, 217, - 42, 11, 23, 32, 4, 214, 157, 11, 23, 32, 4, 225, 134, 11, 23, 32, 4, 250, - 111, 11, 23, 32, 4, 224, 162, 11, 23, 32, 4, 226, 202, 11, 23, 32, 225, - 254, 247, 234, 11, 23, 32, 245, 102, 87, 11, 23, 32, 216, 181, 87, 11, - 23, 32, 234, 224, 87, 11, 23, 32, 225, 135, 87, 11, 23, 32, 223, 39, 87, - 11, 23, 32, 225, 110, 87, 11, 35, 23, 6, 254, 144, 11, 35, 23, 6, 252, - 27, 11, 35, 23, 6, 243, 108, 11, 35, 23, 6, 248, 55, 11, 35, 23, 6, 245, - 101, 11, 35, 23, 6, 210, 85, 11, 35, 23, 6, 245, 64, 11, 35, 23, 6, 216, - 180, 11, 35, 23, 6, 235, 186, 11, 35, 23, 6, 234, 223, 11, 35, 23, 6, - 233, 99, 11, 35, 23, 6, 230, 103, 11, 35, 23, 6, 227, 238, 11, 35, 23, 6, - 211, 157, 11, 35, 23, 6, 226, 200, 11, 35, 23, 6, 225, 109, 11, 35, 23, - 6, 223, 38, 11, 35, 23, 6, 216, 181, 87, 11, 35, 23, 6, 219, 178, 11, 35, - 23, 6, 217, 42, 11, 35, 23, 6, 214, 157, 11, 35, 23, 6, 225, 134, 11, 35, - 23, 6, 250, 111, 11, 35, 23, 6, 224, 162, 11, 35, 23, 6, 226, 202, 11, - 35, 23, 229, 222, 11, 35, 23, 4, 254, 144, 11, 35, 23, 4, 252, 27, 11, - 35, 23, 4, 243, 108, 11, 35, 23, 4, 248, 55, 11, 35, 23, 4, 245, 101, 11, - 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, 64, 11, 35, 23, 4, 216, 180, 11, - 35, 23, 4, 235, 186, 11, 35, 23, 4, 234, 223, 11, 35, 23, 4, 233, 99, 11, - 35, 23, 4, 230, 103, 11, 35, 23, 4, 227, 238, 11, 35, 23, 4, 211, 157, - 11, 35, 23, 4, 226, 200, 11, 35, 23, 4, 225, 109, 11, 35, 23, 4, 223, 38, - 11, 35, 23, 4, 40, 219, 178, 11, 35, 23, 4, 219, 178, 11, 35, 23, 4, 217, - 42, 11, 35, 23, 4, 214, 157, 11, 35, 23, 4, 225, 134, 11, 35, 23, 4, 250, - 111, 11, 35, 23, 4, 224, 162, 11, 35, 23, 4, 226, 202, 11, 35, 23, 225, - 254, 247, 234, 11, 35, 23, 245, 102, 87, 11, 35, 23, 216, 181, 87, 11, - 35, 23, 234, 224, 87, 11, 35, 23, 225, 135, 87, 11, 35, 23, 223, 39, 87, - 11, 35, 23, 225, 110, 87, 11, 35, 23, 32, 6, 254, 144, 11, 35, 23, 32, 6, - 252, 27, 11, 35, 23, 32, 6, 243, 108, 11, 35, 23, 32, 6, 248, 55, 11, 35, - 23, 32, 6, 245, 101, 11, 35, 23, 32, 6, 210, 85, 11, 35, 23, 32, 6, 245, - 64, 11, 35, 23, 32, 6, 216, 180, 11, 35, 23, 32, 6, 235, 186, 11, 35, 23, - 32, 6, 234, 223, 11, 35, 23, 32, 6, 233, 99, 11, 35, 23, 32, 6, 230, 103, - 11, 35, 23, 32, 6, 227, 238, 11, 35, 23, 32, 6, 211, 157, 11, 35, 23, 32, - 6, 226, 200, 11, 35, 23, 32, 6, 225, 109, 11, 35, 23, 32, 6, 223, 38, 11, - 35, 23, 32, 6, 216, 181, 87, 11, 35, 23, 32, 6, 219, 178, 11, 35, 23, 32, - 6, 217, 42, 11, 35, 23, 32, 6, 214, 157, 11, 35, 23, 32, 6, 225, 134, 11, - 35, 23, 32, 6, 250, 111, 11, 35, 23, 32, 6, 224, 162, 11, 35, 23, 32, 6, - 226, 202, 11, 35, 23, 32, 229, 222, 11, 35, 23, 32, 4, 254, 144, 11, 35, - 23, 32, 4, 252, 27, 11, 35, 23, 32, 4, 243, 108, 11, 35, 23, 32, 4, 248, - 55, 11, 35, 23, 32, 4, 245, 101, 11, 35, 23, 32, 4, 210, 85, 11, 35, 23, - 32, 4, 245, 64, 11, 35, 23, 32, 4, 216, 180, 11, 35, 23, 32, 4, 235, 186, - 11, 35, 23, 32, 4, 234, 223, 11, 35, 23, 32, 4, 233, 99, 11, 35, 23, 32, - 4, 230, 103, 11, 35, 23, 32, 4, 227, 238, 11, 35, 23, 32, 4, 211, 157, - 11, 35, 23, 32, 4, 226, 200, 11, 35, 23, 32, 4, 225, 109, 11, 35, 23, 32, - 4, 223, 38, 11, 35, 23, 32, 4, 40, 219, 178, 11, 35, 23, 32, 4, 219, 178, - 11, 35, 23, 32, 4, 217, 42, 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32, - 4, 225, 134, 11, 35, 23, 32, 4, 250, 111, 11, 35, 23, 32, 4, 224, 162, - 11, 35, 23, 32, 4, 226, 202, 11, 35, 23, 32, 225, 254, 247, 234, 11, 35, - 23, 32, 245, 102, 87, 11, 35, 23, 32, 216, 181, 87, 11, 35, 23, 32, 234, - 224, 87, 11, 35, 23, 32, 225, 135, 87, 11, 35, 23, 32, 223, 39, 87, 11, - 35, 23, 32, 225, 110, 87, 11, 23, 6, 247, 228, 11, 23, 4, 247, 228, 11, - 23, 21, 210, 86, 11, 23, 21, 110, 11, 23, 21, 105, 11, 23, 21, 158, 11, - 23, 21, 161, 11, 23, 21, 189, 11, 23, 21, 194, 11, 23, 21, 198, 11, 23, - 21, 195, 11, 23, 21, 200, 11, 139, 21, 210, 86, 11, 139, 21, 110, 11, - 139, 21, 105, 11, 139, 21, 158, 11, 139, 21, 161, 11, 139, 21, 189, 11, - 139, 21, 194, 11, 139, 21, 198, 11, 139, 21, 195, 11, 139, 21, 200, 11, - 35, 21, 210, 86, 11, 35, 21, 110, 11, 35, 21, 105, 11, 35, 21, 158, 11, - 35, 21, 161, 11, 35, 21, 189, 11, 35, 21, 194, 11, 35, 21, 198, 11, 35, - 21, 195, 11, 35, 21, 200, 11, 35, 23, 21, 210, 86, 11, 35, 23, 21, 110, - 11, 35, 23, 21, 105, 11, 35, 23, 21, 158, 11, 35, 23, 21, 161, 11, 35, - 23, 21, 189, 11, 35, 23, 21, 194, 11, 35, 23, 21, 198, 11, 35, 23, 21, - 195, 11, 35, 23, 21, 200, 11, 230, 139, 21, 210, 86, 11, 230, 139, 21, - 110, 11, 230, 139, 21, 105, 11, 230, 139, 21, 158, 11, 230, 139, 21, 161, - 11, 230, 139, 21, 189, 11, 230, 139, 21, 194, 11, 230, 139, 21, 198, 11, - 230, 139, 21, 195, 11, 230, 139, 21, 200, 10, 11, 254, 171, 10, 11, 252, - 55, 10, 11, 235, 124, 10, 11, 248, 196, 10, 11, 212, 30, 10, 11, 210, - 108, 10, 11, 242, 38, 10, 11, 217, 81, 10, 11, 211, 43, 10, 11, 234, 251, - 10, 11, 233, 103, 10, 11, 231, 79, 10, 11, 228, 63, 10, 11, 221, 167, 10, - 11, 254, 197, 10, 11, 244, 143, 10, 11, 222, 27, 10, 11, 224, 82, 10, 11, - 223, 96, 10, 11, 220, 60, 10, 11, 217, 8, 10, 11, 216, 193, 10, 11, 234, - 130, 10, 11, 216, 203, 10, 11, 248, 217, 10, 11, 210, 111, 10, 11, 242, - 245, 10, 11, 247, 120, 252, 55, 10, 11, 247, 120, 228, 63, 10, 11, 247, - 120, 244, 143, 10, 11, 247, 120, 224, 82, 10, 11, 65, 252, 55, 10, 11, - 65, 235, 124, 10, 11, 65, 241, 219, 10, 11, 65, 242, 38, 10, 11, 65, 211, - 43, 10, 11, 65, 234, 251, 10, 11, 65, 233, 103, 10, 11, 65, 231, 79, 10, - 11, 65, 228, 63, 10, 11, 65, 221, 167, 10, 11, 65, 254, 197, 10, 11, 65, - 244, 143, 10, 11, 65, 222, 27, 10, 11, 65, 224, 82, 10, 11, 65, 220, 60, - 10, 11, 65, 217, 8, 10, 11, 65, 216, 193, 10, 11, 65, 234, 130, 10, 11, - 65, 248, 217, 10, 11, 65, 242, 245, 10, 11, 217, 77, 235, 124, 10, 11, - 217, 77, 242, 38, 10, 11, 217, 77, 211, 43, 10, 11, 217, 77, 233, 103, - 10, 11, 217, 77, 228, 63, 10, 11, 217, 77, 221, 167, 10, 11, 217, 77, - 254, 197, 10, 11, 217, 77, 222, 27, 10, 11, 217, 77, 224, 82, 10, 11, - 217, 77, 220, 60, 10, 11, 217, 77, 234, 130, 10, 11, 217, 77, 248, 217, - 10, 11, 217, 77, 242, 245, 10, 11, 217, 77, 247, 120, 228, 63, 10, 11, - 217, 77, 247, 120, 224, 82, 10, 11, 218, 111, 252, 55, 10, 11, 218, 111, - 235, 124, 10, 11, 218, 111, 241, 219, 10, 11, 218, 111, 242, 38, 10, 11, - 218, 111, 217, 81, 10, 11, 218, 111, 211, 43, 10, 11, 218, 111, 234, 251, - 10, 11, 218, 111, 231, 79, 10, 11, 218, 111, 228, 63, 10, 11, 218, 111, - 221, 167, 10, 11, 218, 111, 254, 197, 10, 11, 218, 111, 244, 143, 10, 11, - 218, 111, 222, 27, 10, 11, 218, 111, 224, 82, 10, 11, 218, 111, 220, 60, - 10, 11, 218, 111, 217, 8, 10, 11, 218, 111, 216, 193, 10, 11, 218, 111, - 234, 130, 10, 11, 218, 111, 248, 217, 10, 11, 218, 111, 210, 111, 10, 11, - 218, 111, 242, 245, 10, 11, 218, 111, 247, 120, 252, 55, 10, 11, 218, - 111, 247, 120, 244, 143, 10, 11, 232, 123, 254, 171, 10, 11, 232, 123, - 252, 55, 10, 11, 232, 123, 235, 124, 10, 11, 232, 123, 248, 196, 10, 11, - 232, 123, 241, 219, 10, 11, 232, 123, 212, 30, 10, 11, 232, 123, 210, - 108, 10, 11, 232, 123, 242, 38, 10, 11, 232, 123, 217, 81, 10, 11, 232, - 123, 211, 43, 10, 11, 232, 123, 233, 103, 10, 11, 232, 123, 231, 79, 10, - 11, 232, 123, 228, 63, 10, 11, 232, 123, 221, 167, 10, 11, 232, 123, 254, - 197, 10, 11, 232, 123, 244, 143, 10, 11, 232, 123, 222, 27, 10, 11, 232, - 123, 224, 82, 10, 11, 232, 123, 223, 96, 10, 11, 232, 123, 220, 60, 10, - 11, 232, 123, 217, 8, 10, 11, 232, 123, 216, 193, 10, 11, 232, 123, 234, - 130, 10, 11, 232, 123, 216, 203, 10, 11, 232, 123, 248, 217, 10, 11, 232, - 123, 210, 111, 10, 11, 232, 123, 242, 245, 10, 11, 139, 252, 55, 10, 11, - 139, 235, 124, 10, 11, 139, 248, 196, 10, 11, 139, 212, 30, 10, 11, 139, - 210, 108, 10, 11, 139, 242, 38, 10, 11, 139, 217, 81, 10, 11, 139, 211, - 43, 10, 11, 139, 233, 103, 10, 11, 139, 231, 79, 10, 11, 139, 228, 63, - 10, 11, 139, 221, 167, 10, 11, 139, 254, 197, 10, 11, 139, 244, 143, 10, - 11, 139, 222, 27, 10, 11, 139, 224, 82, 10, 11, 139, 223, 96, 10, 11, - 139, 220, 60, 10, 11, 139, 217, 8, 10, 11, 139, 216, 193, 10, 11, 139, - 234, 130, 10, 11, 139, 216, 203, 10, 11, 139, 248, 217, 10, 11, 139, 210, - 111, 10, 11, 139, 242, 245, 10, 11, 226, 169, 66, 2, 122, 2, 217, 44, 10, - 11, 226, 169, 122, 2, 248, 196, 231, 206, 86, 245, 221, 211, 239, 231, - 206, 86, 219, 29, 211, 239, 231, 206, 86, 212, 9, 211, 239, 231, 206, 86, - 228, 57, 211, 239, 231, 206, 86, 223, 112, 246, 97, 231, 206, 86, 242, - 128, 246, 97, 231, 206, 86, 71, 246, 97, 231, 206, 86, 123, 64, 250, 142, - 231, 206, 86, 113, 64, 250, 142, 231, 206, 86, 134, 64, 250, 142, 231, - 206, 86, 244, 12, 64, 250, 142, 231, 206, 86, 244, 82, 64, 250, 142, 231, - 206, 86, 219, 126, 64, 250, 142, 231, 206, 86, 220, 123, 64, 250, 142, - 231, 206, 86, 245, 194, 64, 250, 142, 231, 206, 86, 228, 201, 64, 250, - 142, 231, 206, 86, 123, 64, 252, 154, 231, 206, 86, 113, 64, 252, 154, - 231, 206, 86, 134, 64, 252, 154, 231, 206, 86, 244, 12, 64, 252, 154, - 231, 206, 86, 244, 82, 64, 252, 154, 231, 206, 86, 219, 126, 64, 252, - 154, 231, 206, 86, 220, 123, 64, 252, 154, 231, 206, 86, 245, 194, 64, - 252, 154, 231, 206, 86, 228, 201, 64, 252, 154, 231, 206, 86, 123, 64, - 250, 35, 231, 206, 86, 113, 64, 250, 35, 231, 206, 86, 134, 64, 250, 35, - 231, 206, 86, 244, 12, 64, 250, 35, 231, 206, 86, 244, 82, 64, 250, 35, - 231, 206, 86, 219, 126, 64, 250, 35, 231, 206, 86, 220, 123, 64, 250, 35, - 231, 206, 86, 245, 194, 64, 250, 35, 231, 206, 86, 228, 201, 64, 250, 35, - 231, 206, 86, 225, 26, 231, 206, 86, 226, 157, 231, 206, 86, 252, 155, - 231, 206, 86, 250, 71, 231, 206, 86, 218, 240, 231, 206, 86, 218, 40, - 231, 206, 86, 253, 180, 231, 206, 86, 211, 232, 231, 206, 86, 235, 63, - 231, 206, 86, 252, 185, 131, 86, 203, 252, 185, 131, 86, 241, 44, 131, - 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, 131, 86, 241, 40, 131, - 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, 131, 86, 241, 36, 131, - 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, 131, 86, 241, 32, 131, - 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, 131, 86, 241, 28, 131, - 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, 131, 86, 241, 24, 131, - 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, 131, 86, 241, 20, 131, - 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, 131, 86, 241, 16, 131, - 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, 131, 86, 241, 12, 131, - 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, 131, 86, 241, 8, 131, 86, - 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, 86, 241, 4, 131, 86, 241, - 3, 131, 86, 241, 2, 131, 86, 241, 1, 131, 86, 241, 0, 131, 86, 240, 255, - 131, 86, 240, 254, 131, 86, 240, 253, 131, 86, 240, 252, 131, 86, 67, - 252, 185, 131, 86, 213, 238, 131, 86, 213, 237, 131, 86, 213, 236, 131, - 86, 213, 235, 131, 86, 213, 234, 131, 86, 213, 233, 131, 86, 213, 232, - 131, 86, 213, 231, 131, 86, 213, 230, 131, 86, 213, 229, 131, 86, 213, - 228, 131, 86, 213, 227, 131, 86, 213, 226, 131, 86, 213, 225, 131, 86, - 213, 224, 131, 86, 213, 223, 131, 86, 213, 222, 131, 86, 213, 221, 131, - 86, 213, 220, 131, 86, 213, 219, 131, 86, 213, 218, 131, 86, 213, 217, - 131, 86, 213, 216, 131, 86, 213, 215, 131, 86, 213, 214, 131, 86, 213, - 213, 131, 86, 213, 212, 131, 86, 213, 211, 131, 86, 213, 210, 131, 86, - 213, 209, 131, 86, 213, 208, 131, 86, 213, 207, 131, 86, 213, 206, 131, - 86, 213, 205, 131, 86, 213, 204, 131, 86, 213, 203, 131, 86, 213, 202, - 131, 86, 213, 201, 131, 86, 213, 200, 131, 86, 213, 199, 131, 86, 213, - 198, 131, 86, 213, 197, 131, 86, 213, 196, 131, 86, 213, 195, 131, 86, - 213, 194, 131, 86, 213, 193, 131, 86, 213, 192, 131, 86, 213, 191, 131, - 86, 213, 190, 225, 34, 250, 244, 252, 185, 225, 34, 250, 244, 255, 10, - 64, 219, 16, 225, 34, 250, 244, 113, 64, 219, 16, 225, 34, 250, 244, 134, - 64, 219, 16, 225, 34, 250, 244, 244, 12, 64, 219, 16, 225, 34, 250, 244, - 244, 82, 64, 219, 16, 225, 34, 250, 244, 219, 126, 64, 219, 16, 225, 34, - 250, 244, 220, 123, 64, 219, 16, 225, 34, 250, 244, 245, 194, 64, 219, - 16, 225, 34, 250, 244, 228, 201, 64, 219, 16, 225, 34, 250, 244, 216, - 249, 64, 219, 16, 225, 34, 250, 244, 235, 140, 64, 219, 16, 225, 34, 250, - 244, 234, 32, 64, 219, 16, 225, 34, 250, 244, 224, 16, 64, 219, 16, 225, - 34, 250, 244, 234, 80, 64, 219, 16, 225, 34, 250, 244, 255, 10, 64, 241, - 226, 225, 34, 250, 244, 113, 64, 241, 226, 225, 34, 250, 244, 134, 64, - 241, 226, 225, 34, 250, 244, 244, 12, 64, 241, 226, 225, 34, 250, 244, - 244, 82, 64, 241, 226, 225, 34, 250, 244, 219, 126, 64, 241, 226, 225, - 34, 250, 244, 220, 123, 64, 241, 226, 225, 34, 250, 244, 245, 194, 64, - 241, 226, 225, 34, 250, 244, 228, 201, 64, 241, 226, 225, 34, 250, 244, - 216, 249, 64, 241, 226, 225, 34, 250, 244, 235, 140, 64, 241, 226, 225, - 34, 250, 244, 234, 32, 64, 241, 226, 225, 34, 250, 244, 224, 16, 64, 241, - 226, 225, 34, 250, 244, 234, 80, 64, 241, 226, 225, 34, 250, 244, 255, - 10, 64, 247, 248, 225, 34, 250, 244, 113, 64, 247, 248, 225, 34, 250, - 244, 134, 64, 247, 248, 225, 34, 250, 244, 244, 12, 64, 247, 248, 225, - 34, 250, 244, 244, 82, 64, 247, 248, 225, 34, 250, 244, 219, 126, 64, - 247, 248, 225, 34, 250, 244, 220, 123, 64, 247, 248, 225, 34, 250, 244, - 245, 194, 64, 247, 248, 225, 34, 250, 244, 228, 201, 64, 247, 248, 225, - 34, 250, 244, 216, 249, 64, 247, 248, 225, 34, 250, 244, 235, 140, 64, - 247, 248, 225, 34, 250, 244, 234, 32, 64, 247, 248, 225, 34, 250, 244, - 224, 16, 64, 247, 248, 225, 34, 250, 244, 234, 80, 64, 247, 248, 225, 34, - 250, 244, 85, 235, 63, 225, 34, 250, 244, 255, 10, 64, 249, 243, 225, 34, - 250, 244, 113, 64, 249, 243, 225, 34, 250, 244, 134, 64, 249, 243, 225, - 34, 250, 244, 244, 12, 64, 249, 243, 225, 34, 250, 244, 244, 82, 64, 249, - 243, 225, 34, 250, 244, 219, 126, 64, 249, 243, 225, 34, 250, 244, 220, - 123, 64, 249, 243, 225, 34, 250, 244, 245, 194, 64, 249, 243, 225, 34, - 250, 244, 228, 201, 64, 249, 243, 225, 34, 250, 244, 216, 249, 64, 249, - 243, 225, 34, 250, 244, 235, 140, 64, 249, 243, 225, 34, 250, 244, 234, - 32, 64, 249, 243, 225, 34, 250, 244, 224, 16, 64, 249, 243, 225, 34, 250, - 244, 234, 80, 64, 249, 243, 225, 34, 250, 244, 71, 235, 63, 21, 210, 87, - 243, 230, 218, 130, 21, 210, 87, 249, 220, 21, 123, 249, 220, 21, 113, - 249, 220, 21, 134, 249, 220, 21, 244, 12, 249, 220, 21, 244, 82, 249, - 220, 21, 219, 126, 249, 220, 21, 220, 123, 249, 220, 21, 245, 194, 249, - 220, 21, 228, 201, 249, 220, 88, 7, 6, 1, 61, 88, 7, 6, 1, 253, 159, 88, - 7, 6, 1, 251, 67, 88, 7, 6, 1, 249, 61, 88, 7, 6, 1, 75, 88, 7, 6, 1, - 245, 7, 88, 7, 6, 1, 243, 203, 88, 7, 6, 1, 242, 61, 88, 7, 6, 1, 73, 88, - 7, 6, 1, 235, 145, 88, 7, 6, 1, 235, 24, 88, 7, 6, 1, 156, 88, 7, 6, 1, - 193, 88, 7, 6, 1, 230, 26, 88, 7, 6, 1, 76, 88, 7, 6, 1, 226, 106, 88, 7, - 6, 1, 224, 97, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222, 92, 88, 7, 6, 1, 217, - 153, 88, 7, 6, 1, 70, 88, 7, 6, 1, 214, 105, 88, 7, 6, 1, 212, 98, 88, 7, - 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1, 210, 159, 216, 7, - 220, 54, 251, 158, 7, 6, 1, 222, 92, 37, 32, 7, 6, 1, 251, 67, 37, 32, 7, - 6, 1, 153, 37, 250, 192, 37, 211, 180, 92, 7, 6, 1, 61, 92, 7, 6, 1, 253, - 159, 92, 7, 6, 1, 251, 67, 92, 7, 6, 1, 249, 61, 92, 7, 6, 1, 75, 92, 7, - 6, 1, 245, 7, 92, 7, 6, 1, 243, 203, 92, 7, 6, 1, 242, 61, 92, 7, 6, 1, - 73, 92, 7, 6, 1, 235, 145, 92, 7, 6, 1, 235, 24, 92, 7, 6, 1, 156, 92, 7, - 6, 1, 193, 92, 7, 6, 1, 230, 26, 92, 7, 6, 1, 76, 92, 7, 6, 1, 226, 106, - 92, 7, 6, 1, 224, 97, 92, 7, 6, 1, 153, 92, 7, 6, 1, 222, 92, 92, 7, 6, - 1, 217, 153, 92, 7, 6, 1, 70, 92, 7, 6, 1, 214, 105, 92, 7, 6, 1, 212, - 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117, 92, 7, 6, 1, 210, 159, - 92, 240, 202, 92, 230, 50, 92, 221, 184, 92, 218, 227, 92, 224, 219, 92, - 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1, 253, 159, 152, 37, 7, 6, - 1, 251, 67, 152, 37, 7, 6, 1, 249, 61, 152, 37, 7, 6, 1, 75, 152, 37, 7, - 6, 1, 245, 7, 152, 37, 7, 6, 1, 243, 203, 152, 37, 7, 6, 1, 242, 61, 152, - 37, 7, 6, 1, 73, 152, 37, 7, 6, 1, 235, 145, 152, 37, 7, 6, 1, 235, 24, - 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 193, 152, 37, 7, 6, 1, 230, 26, - 152, 37, 7, 6, 1, 76, 152, 37, 7, 6, 1, 226, 106, 152, 37, 7, 6, 1, 224, - 97, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1, 222, 92, 152, 37, 7, 6, 1, - 217, 153, 152, 37, 7, 6, 1, 70, 152, 37, 7, 6, 1, 214, 105, 152, 37, 7, - 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152, 37, 7, 6, 1, 211, 117, - 152, 37, 7, 6, 1, 210, 159, 223, 158, 231, 98, 50, 223, 158, 231, 95, 50, - 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 159, 152, 92, 7, 6, 1, 251, - 67, 152, 92, 7, 6, 1, 249, 61, 152, 92, 7, 6, 1, 75, 152, 92, 7, 6, 1, - 245, 7, 152, 92, 7, 6, 1, 243, 203, 152, 92, 7, 6, 1, 242, 61, 152, 92, - 7, 6, 1, 73, 152, 92, 7, 6, 1, 235, 145, 152, 92, 7, 6, 1, 235, 24, 152, - 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 193, 152, 92, 7, 6, 1, 230, 26, 152, - 92, 7, 6, 1, 76, 152, 92, 7, 6, 1, 226, 106, 152, 92, 7, 6, 1, 224, 97, - 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 92, 152, 92, 7, 6, 1, 217, - 153, 152, 92, 7, 6, 1, 70, 152, 92, 7, 6, 1, 214, 105, 152, 92, 7, 6, 1, - 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1, 211, 117, 152, 92, - 7, 6, 1, 210, 159, 249, 129, 152, 92, 7, 6, 1, 226, 106, 152, 92, 240, - 114, 152, 92, 190, 152, 92, 206, 152, 92, 255, 26, 152, 92, 212, 23, 42, - 247, 165, 92, 250, 24, 92, 249, 171, 92, 243, 253, 92, 240, 106, 92, 229, - 87, 92, 229, 80, 92, 226, 215, 92, 219, 36, 92, 120, 2, 245, 32, 78, 92, - 213, 119, 223, 104, 235, 240, 16, 1, 61, 223, 104, 235, 240, 16, 1, 253, - 159, 223, 104, 235, 240, 16, 1, 251, 67, 223, 104, 235, 240, 16, 1, 249, - 61, 223, 104, 235, 240, 16, 1, 75, 223, 104, 235, 240, 16, 1, 245, 7, - 223, 104, 235, 240, 16, 1, 243, 203, 223, 104, 235, 240, 16, 1, 242, 61, - 223, 104, 235, 240, 16, 1, 73, 223, 104, 235, 240, 16, 1, 235, 145, 223, - 104, 235, 240, 16, 1, 235, 24, 223, 104, 235, 240, 16, 1, 156, 223, 104, - 235, 240, 16, 1, 193, 223, 104, 235, 240, 16, 1, 230, 26, 223, 104, 235, - 240, 16, 1, 76, 223, 104, 235, 240, 16, 1, 226, 106, 223, 104, 235, 240, - 16, 1, 224, 97, 223, 104, 235, 240, 16, 1, 153, 223, 104, 235, 240, 16, - 1, 222, 92, 223, 104, 235, 240, 16, 1, 217, 153, 223, 104, 235, 240, 16, - 1, 70, 223, 104, 235, 240, 16, 1, 214, 105, 223, 104, 235, 240, 16, 1, - 212, 98, 223, 104, 235, 240, 16, 1, 211, 178, 223, 104, 235, 240, 16, 1, - 211, 117, 223, 104, 235, 240, 16, 1, 210, 159, 42, 141, 241, 64, 92, 56, - 234, 19, 92, 56, 206, 92, 9, 214, 177, 238, 51, 92, 9, 214, 177, 238, 55, - 92, 9, 214, 177, 238, 63, 92, 56, 248, 91, 92, 9, 214, 177, 238, 70, 92, - 9, 214, 177, 238, 57, 92, 9, 214, 177, 238, 29, 92, 9, 214, 177, 238, 56, - 92, 9, 214, 177, 238, 69, 92, 9, 214, 177, 238, 43, 92, 9, 214, 177, 238, - 36, 92, 9, 214, 177, 238, 45, 92, 9, 214, 177, 238, 66, 92, 9, 214, 177, - 238, 52, 92, 9, 214, 177, 238, 68, 92, 9, 214, 177, 238, 44, 92, 9, 214, - 177, 238, 67, 92, 9, 214, 177, 238, 30, 92, 9, 214, 177, 238, 35, 92, 9, - 214, 177, 238, 28, 92, 9, 214, 177, 238, 58, 92, 9, 214, 177, 238, 60, - 92, 9, 214, 177, 238, 38, 92, 9, 214, 177, 238, 49, 92, 9, 214, 177, 238, - 47, 92, 9, 214, 177, 238, 73, 92, 9, 214, 177, 238, 72, 92, 9, 214, 177, - 238, 26, 92, 9, 214, 177, 238, 53, 92, 9, 214, 177, 238, 71, 92, 9, 214, - 177, 238, 62, 92, 9, 214, 177, 238, 48, 92, 9, 214, 177, 238, 27, 92, 9, - 214, 177, 238, 50, 92, 9, 214, 177, 238, 32, 92, 9, 214, 177, 238, 31, - 92, 9, 214, 177, 238, 61, 92, 9, 214, 177, 238, 39, 92, 9, 214, 177, 238, - 41, 92, 9, 214, 177, 238, 42, 92, 9, 214, 177, 238, 34, 92, 9, 214, 177, - 238, 65, 92, 9, 214, 177, 238, 59, 216, 7, 220, 54, 251, 158, 9, 214, - 177, 238, 40, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 72, 216, 7, - 220, 54, 251, 158, 9, 214, 177, 238, 70, 216, 7, 220, 54, 251, 158, 9, - 214, 177, 238, 54, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 37, 216, - 7, 220, 54, 251, 158, 9, 214, 177, 238, 50, 216, 7, 220, 54, 251, 158, 9, - 214, 177, 238, 33, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 64, 216, - 7, 220, 54, 251, 158, 9, 214, 177, 238, 46, 37, 154, 254, 246, 37, 154, - 255, 13, 249, 72, 244, 43, 250, 1, 214, 194, 228, 214, 2, 218, 154, 218, - 34, 117, 230, 115, 218, 33, 250, 27, 253, 208, 246, 55, 218, 32, 117, - 251, 119, 223, 159, 251, 141, 253, 208, 228, 213, 212, 41, 212, 35, 213, - 131, 230, 196, 212, 25, 245, 225, 242, 182, 245, 46, 245, 225, 242, 182, - 254, 129, 245, 225, 242, 182, 253, 226, 242, 182, 2, 231, 52, 166, 230, - 130, 87, 212, 27, 249, 138, 230, 130, 87, 244, 93, 224, 23, 230, 130, 87, - 212, 27, 242, 211, 230, 130, 87, 243, 230, 230, 130, 87, 212, 52, 242, - 211, 230, 130, 87, 233, 81, 224, 23, 230, 130, 87, 212, 52, 249, 138, - 230, 130, 87, 249, 138, 230, 129, 166, 230, 130, 2, 244, 191, 244, 93, - 224, 23, 230, 130, 2, 244, 191, 233, 81, 224, 23, 230, 130, 2, 244, 191, - 243, 230, 230, 130, 2, 244, 191, 218, 39, 2, 244, 191, 242, 180, 218, - 157, 220, 0, 218, 157, 250, 117, 221, 169, 245, 40, 215, 236, 248, 85, - 215, 236, 226, 60, 215, 236, 251, 28, 215, 110, 250, 119, 251, 211, 222, - 192, 241, 180, 218, 37, 251, 211, 245, 229, 64, 231, 195, 245, 229, 64, - 223, 32, 241, 205, 244, 12, 233, 55, 249, 247, 231, 171, 233, 54, 244, - 177, 233, 54, 233, 55, 244, 48, 236, 1, 211, 239, 230, 59, 216, 35, 253, - 192, 242, 144, 231, 68, 212, 39, 217, 58, 233, 27, 252, 150, 225, 63, - 223, 112, 254, 55, 242, 128, 254, 55, 225, 218, 225, 219, 250, 120, 218, - 115, 242, 24, 219, 91, 64, 225, 45, 231, 88, 226, 198, 251, 195, 224, - 230, 233, 37, 223, 33, 249, 143, 223, 33, 252, 160, 249, 174, 223, 32, - 249, 96, 22, 223, 32, 218, 142, 251, 168, 219, 15, 251, 152, 243, 252, - 243, 248, 222, 208, 217, 247, 224, 232, 248, 176, 226, 237, 218, 8, 243, - 249, 219, 231, 244, 92, 251, 22, 2, 217, 240, 248, 36, 219, 53, 240, 113, - 249, 142, 220, 71, 240, 112, 240, 113, 249, 142, 246, 109, 249, 173, 250, - 85, 130, 250, 255, 232, 142, 249, 89, 241, 56, 224, 234, 219, 241, 252, - 37, 251, 164, 224, 235, 64, 244, 34, 249, 172, 244, 25, 22, 234, 33, 217, - 20, 211, 230, 242, 14, 222, 13, 251, 178, 22, 249, 103, 211, 237, 242, - 185, 249, 236, 242, 185, 215, 194, 246, 91, 252, 63, 230, 94, 250, 8, - 252, 63, 230, 93, 252, 188, 251, 177, 223, 34, 211, 201, 224, 196, 251, - 236, 251, 21, 235, 139, 250, 78, 215, 236, 244, 163, 250, 77, 244, 95, - 244, 96, 219, 13, 252, 159, 225, 251, 224, 245, 249, 205, 252, 160, 217, - 60, 215, 236, 249, 129, 244, 68, 225, 64, 248, 82, 235, 132, 247, 132, - 250, 233, 218, 114, 211, 240, 250, 99, 230, 130, 213, 164, 250, 163, 221, - 200, 221, 225, 242, 149, 250, 252, 250, 234, 240, 246, 244, 131, 212, 0, - 222, 201, 249, 237, 244, 87, 225, 3, 22, 244, 91, 230, 228, 230, 109, - 251, 11, 250, 40, 241, 233, 253, 242, 226, 63, 216, 15, 241, 252, 250, - 30, 216, 243, 216, 114, 250, 21, 251, 203, 225, 178, 253, 241, 213, 172, - 243, 111, 247, 198, 241, 157, 219, 85, 231, 235, 251, 246, 243, 112, 247, - 241, 251, 167, 244, 53, 225, 34, 250, 242, 28, 228, 48, 230, 86, 28, 228, - 43, 221, 213, 242, 100, 28, 234, 138, 215, 191, 213, 154, 28, 221, 193, - 222, 125, 220, 12, 2, 221, 228, 216, 245, 223, 179, 22, 252, 160, 219, - 106, 22, 219, 106, 251, 188, 252, 124, 22, 241, 50, 250, 121, 244, 74, - 219, 64, 222, 126, 218, 13, 215, 195, 240, 247, 223, 180, 254, 130, 244, - 32, 222, 137, 244, 32, 217, 242, 240, 236, 251, 120, 240, 236, 2, 243, - 95, 226, 230, 251, 120, 235, 132, 224, 240, 226, 229, 245, 45, 224, 240, - 226, 229, 240, 245, 252, 146, 253, 182, 216, 253, 231, 235, 240, 241, - 232, 112, 240, 241, 249, 177, 218, 126, 221, 199, 248, 44, 218, 126, 244, - 181, 235, 150, 233, 90, 235, 132, 250, 227, 245, 45, 250, 227, 223, 142, - 230, 113, 226, 115, 212, 41, 251, 124, 249, 146, 216, 107, 233, 19, 223, - 181, 250, 225, 246, 97, 249, 136, 212, 3, 219, 71, 219, 69, 240, 246, - 223, 154, 242, 171, 220, 58, 230, 146, 222, 195, 250, 109, 247, 137, 225, - 74, 251, 204, 245, 170, 226, 239, 218, 253, 220, 53, 251, 123, 254, 93, - 241, 55, 233, 122, 252, 61, 244, 91, 215, 194, 244, 91, 251, 210, 215, - 91, 241, 250, 250, 110, 252, 188, 250, 110, 243, 243, 252, 188, 250, 110, - 251, 238, 225, 196, 234, 27, 224, 249, 246, 88, 251, 12, 252, 178, 251, - 12, 247, 131, 230, 114, 244, 191, 249, 147, 244, 191, 216, 108, 244, 191, - 223, 182, 244, 191, 250, 226, 244, 191, 246, 98, 244, 191, 218, 242, 212, - 3, 240, 247, 244, 191, 230, 147, 244, 191, 247, 138, 244, 191, 225, 75, - 244, 191, 243, 246, 244, 191, 242, 21, 244, 191, 211, 224, 244, 191, 252, - 72, 244, 191, 226, 46, 244, 191, 225, 75, 228, 54, 225, 233, 224, 187, - 245, 14, 245, 228, 228, 54, 230, 111, 216, 20, 71, 120, 225, 8, 252, 183, - 235, 243, 71, 124, 225, 8, 252, 183, 235, 243, 71, 43, 225, 8, 252, 183, - 235, 243, 71, 44, 225, 8, 252, 183, 235, 243, 244, 85, 242, 17, 50, 212, - 33, 242, 17, 50, 226, 216, 242, 17, 50, 216, 136, 120, 50, 216, 136, 124, - 50, 250, 20, 242, 12, 50, 204, 242, 12, 50, 249, 124, 211, 220, 241, 252, - 245, 15, 229, 105, 217, 152, 235, 126, 246, 93, 234, 83, 251, 248, 211, - 220, 249, 250, 224, 128, 242, 15, 224, 231, 231, 178, 220, 5, 253, 204, - 220, 5, 241, 165, 220, 5, 211, 220, 221, 241, 211, 220, 251, 187, 244, - 30, 251, 91, 236, 1, 219, 170, 251, 90, 236, 1, 219, 170, 251, 163, 242, - 195, 231, 186, 211, 221, 244, 175, 231, 187, 22, 211, 222, 241, 61, 242, - 11, 113, 231, 60, 241, 61, 242, 11, 113, 211, 219, 241, 61, 242, 11, 225, - 0, 226, 228, 211, 222, 2, 251, 107, 245, 226, 251, 142, 2, 213, 246, 225, - 169, 2, 251, 213, 242, 35, 231, 187, 2, 242, 111, 225, 110, 231, 175, - 231, 187, 2, 215, 98, 226, 209, 231, 186, 226, 209, 211, 221, 252, 187, - 249, 191, 211, 205, 224, 190, 235, 132, 226, 224, 235, 132, 242, 170, - 242, 223, 252, 188, 254, 114, 245, 19, 254, 161, 254, 162, 230, 137, 236, - 6, 219, 101, 235, 233, 248, 35, 225, 168, 242, 106, 248, 180, 232, 202, - 229, 212, 224, 255, 244, 192, 231, 143, 242, 34, 252, 139, 225, 2, 217, - 172, 225, 67, 234, 65, 78, 232, 112, 233, 11, 222, 234, 243, 55, 218, - 132, 234, 64, 251, 172, 249, 149, 2, 241, 228, 212, 19, 252, 70, 241, - 228, 251, 136, 241, 228, 113, 241, 226, 219, 11, 241, 228, 242, 121, 241, - 228, 241, 229, 2, 74, 251, 209, 241, 228, 242, 128, 241, 228, 211, 42, - 241, 228, 224, 129, 241, 228, 241, 229, 2, 223, 34, 223, 45, 241, 226, - 241, 229, 248, 82, 247, 250, 220, 83, 2, 115, 59, 235, 216, 245, 173, - 192, 251, 117, 254, 113, 87, 251, 196, 219, 93, 87, 249, 229, 87, 218, - 247, 217, 249, 87, 246, 86, 248, 158, 87, 225, 68, 64, 224, 250, 244, 62, - 252, 4, 247, 166, 87, 219, 4, 252, 159, 216, 150, 252, 159, 71, 244, 52, - 240, 212, 225, 6, 87, 230, 150, 252, 173, 249, 99, 245, 33, 114, 247, - 133, 50, 249, 140, 250, 243, 252, 145, 2, 211, 40, 50, 252, 145, 2, 247, - 133, 50, 252, 145, 2, 245, 48, 50, 252, 145, 2, 224, 229, 50, 230, 150, - 2, 211, 235, 250, 139, 2, 214, 153, 215, 232, 22, 211, 40, 50, 221, 179, - 225, 167, 249, 209, 251, 140, 230, 187, 244, 57, 247, 186, 226, 162, 247, - 191, 246, 50, 244, 108, 244, 41, 204, 244, 108, 244, 41, 226, 77, 2, 249, - 101, 226, 77, 244, 184, 214, 163, 251, 17, 217, 19, 251, 17, 250, 244, - 235, 243, 250, 139, 2, 214, 153, 215, 231, 250, 139, 2, 246, 105, 215, - 231, 252, 142, 250, 138, 250, 7, 224, 124, 222, 186, 224, 124, 226, 20, - 218, 122, 222, 132, 215, 223, 222, 132, 251, 192, 217, 92, 233, 52, 228, - 46, 228, 47, 2, 248, 81, 249, 148, 250, 1, 251, 193, 204, 251, 193, 242, - 128, 251, 193, 251, 209, 251, 193, 226, 158, 251, 193, 251, 190, 229, - 206, 252, 176, 221, 187, 231, 61, 217, 2, 223, 124, 226, 75, 244, 160, - 231, 235, 221, 224, 254, 90, 224, 146, 254, 253, 232, 114, 250, 128, 231, - 73, 226, 130, 215, 239, 235, 253, 215, 239, 226, 83, 246, 25, 87, 235, - 250, 245, 120, 245, 121, 2, 246, 105, 80, 48, 250, 1, 231, 201, 2, 232, - 108, 244, 74, 250, 1, 231, 201, 2, 223, 158, 244, 74, 204, 231, 201, 2, - 223, 158, 244, 74, 204, 231, 201, 2, 232, 108, 244, 74, 224, 237, 224, - 238, 240, 249, 229, 85, 230, 160, 225, 118, 230, 160, 225, 119, 2, 97, - 80, 253, 208, 233, 47, 213, 175, 230, 159, 230, 160, 225, 119, 226, 231, - 228, 76, 230, 160, 225, 117, 254, 91, 2, 252, 130, 251, 11, 213, 172, - 251, 11, 216, 255, 223, 174, 213, 171, 215, 60, 97, 253, 248, 250, 3, 97, - 22, 140, 204, 250, 37, 253, 248, 250, 3, 97, 22, 140, 204, 250, 37, 253, - 249, 2, 37, 123, 226, 121, 250, 3, 246, 105, 22, 214, 153, 204, 250, 37, - 253, 248, 254, 89, 246, 105, 22, 214, 153, 204, 250, 37, 253, 248, 121, - 251, 139, 87, 125, 251, 139, 87, 219, 8, 2, 251, 5, 91, 219, 7, 219, 8, - 2, 123, 219, 32, 212, 35, 219, 8, 2, 134, 219, 32, 212, 34, 252, 116, - 245, 173, 225, 28, 233, 43, 231, 212, 242, 185, 222, 248, 231, 212, 242, - 185, 232, 153, 2, 235, 226, 225, 200, 250, 1, 232, 153, 2, 234, 139, 234, - 139, 232, 152, 204, 232, 152, 252, 45, 252, 46, 2, 251, 5, 91, 251, 191, - 232, 205, 87, 223, 175, 251, 87, 252, 186, 2, 140, 80, 48, 245, 144, 2, - 140, 80, 48, 226, 198, 2, 245, 32, 164, 2, 43, 44, 80, 48, 219, 40, 2, - 97, 80, 48, 216, 15, 2, 214, 153, 80, 48, 228, 76, 123, 214, 184, 245, - 192, 87, 234, 137, 216, 248, 235, 220, 16, 31, 7, 6, 233, 10, 235, 220, - 16, 31, 7, 4, 233, 10, 235, 220, 16, 31, 227, 200, 235, 220, 16, 31, 217, - 184, 235, 220, 16, 31, 7, 233, 10, 244, 97, 245, 173, 216, 10, 211, 199, - 242, 22, 227, 183, 22, 251, 198, 241, 67, 225, 51, 230, 227, 217, 0, 249, - 115, 252, 160, 219, 126, 225, 10, 218, 158, 2, 230, 225, 247, 121, 235, - 132, 16, 31, 252, 58, 215, 221, 245, 157, 85, 42, 251, 87, 71, 42, 251, - 87, 233, 86, 223, 112, 250, 36, 233, 86, 251, 209, 250, 36, 233, 86, 226, - 158, 247, 249, 233, 86, 251, 209, 247, 249, 4, 226, 158, 247, 249, 4, - 251, 209, 247, 249, 214, 162, 223, 112, 215, 226, 246, 106, 223, 112, - 215, 226, 214, 162, 4, 223, 112, 215, 226, 246, 106, 4, 223, 112, 215, - 226, 37, 249, 132, 224, 253, 249, 132, 224, 254, 2, 242, 27, 51, 249, - 132, 224, 253, 228, 50, 43, 220, 154, 2, 134, 247, 119, 250, 5, 244, 192, - 123, 226, 243, 250, 5, 244, 192, 113, 226, 243, 250, 5, 244, 192, 134, - 226, 243, 250, 5, 244, 192, 244, 12, 226, 243, 250, 5, 244, 192, 244, 82, - 226, 243, 250, 5, 244, 192, 219, 126, 226, 243, 250, 5, 244, 192, 220, - 123, 226, 243, 250, 5, 244, 192, 245, 194, 226, 243, 250, 5, 244, 192, - 228, 201, 226, 243, 250, 5, 244, 192, 216, 249, 226, 243, 250, 5, 244, - 192, 245, 169, 226, 243, 250, 5, 244, 192, 215, 77, 226, 243, 250, 5, - 244, 192, 226, 193, 250, 5, 244, 192, 215, 56, 250, 5, 244, 192, 216, - 141, 250, 5, 244, 192, 244, 8, 250, 5, 244, 192, 244, 80, 250, 5, 244, - 192, 219, 122, 250, 5, 244, 192, 220, 122, 250, 5, 244, 192, 245, 193, - 250, 5, 244, 192, 228, 200, 250, 5, 244, 192, 216, 247, 250, 5, 244, 192, - 245, 167, 250, 5, 244, 192, 215, 75, 230, 118, 243, 231, 216, 37, 216, 3, - 218, 149, 64, 232, 240, 219, 171, 64, 235, 133, 230, 107, 242, 125, 244, - 191, 242, 125, 244, 192, 2, 219, 75, 245, 14, 244, 192, 2, 217, 15, 64, - 235, 54, 219, 75, 244, 192, 2, 204, 230, 111, 219, 75, 244, 192, 2, 204, - 230, 112, 22, 219, 75, 245, 14, 219, 75, 244, 192, 2, 204, 230, 112, 22, - 249, 231, 217, 248, 219, 75, 244, 192, 2, 204, 230, 112, 22, 216, 105, - 245, 14, 219, 75, 244, 192, 2, 242, 26, 219, 75, 244, 192, 2, 240, 248, - 211, 233, 244, 191, 219, 75, 244, 192, 2, 219, 75, 245, 14, 244, 192, - 221, 218, 248, 63, 244, 34, 223, 89, 244, 191, 219, 75, 244, 192, 2, 241, - 227, 245, 14, 219, 75, 244, 192, 2, 218, 35, 219, 74, 244, 191, 229, 88, - 244, 191, 245, 24, 244, 191, 214, 188, 244, 191, 244, 192, 2, 249, 231, - 217, 248, 225, 193, 244, 191, 249, 202, 244, 191, 249, 203, 244, 191, - 234, 63, 244, 191, 244, 192, 216, 138, 115, 234, 64, 234, 63, 244, 192, - 2, 219, 75, 245, 14, 234, 63, 244, 192, 2, 250, 1, 245, 14, 244, 192, 2, - 218, 89, 216, 20, 244, 192, 2, 218, 89, 216, 21, 22, 211, 233, 245, 16, - 244, 192, 2, 218, 89, 216, 21, 22, 216, 105, 245, 14, 247, 193, 244, 191, - 211, 204, 244, 191, 254, 109, 244, 191, 224, 228, 244, 191, 249, 117, - 244, 191, 225, 171, 244, 191, 244, 192, 2, 232, 127, 64, 215, 205, 247, - 193, 251, 89, 223, 89, 244, 191, 243, 240, 244, 192, 2, 204, 230, 111, - 254, 107, 244, 191, 244, 153, 244, 191, 212, 20, 244, 191, 219, 92, 244, - 191, 216, 72, 244, 191, 242, 126, 244, 191, 232, 115, 249, 117, 244, 191, - 244, 192, 2, 204, 230, 111, 240, 204, 244, 191, 244, 192, 2, 204, 230, - 112, 22, 249, 231, 217, 248, 244, 192, 221, 191, 236, 1, 244, 154, 253, - 214, 244, 191, 244, 50, 244, 191, 219, 93, 244, 191, 247, 166, 244, 191, - 244, 192, 211, 230, 230, 111, 244, 192, 2, 231, 85, 231, 145, 242, 125, - 250, 226, 244, 192, 2, 219, 75, 245, 14, 250, 226, 244, 192, 2, 217, 15, - 64, 235, 54, 219, 75, 250, 226, 244, 192, 2, 204, 230, 111, 219, 75, 250, - 226, 244, 192, 2, 241, 227, 245, 14, 250, 226, 244, 192, 2, 211, 196, - 219, 76, 234, 63, 250, 226, 244, 192, 2, 250, 1, 245, 14, 224, 228, 250, - 226, 244, 191, 249, 117, 250, 226, 244, 191, 212, 20, 250, 226, 244, 191, - 244, 192, 2, 228, 76, 242, 164, 243, 35, 244, 192, 2, 226, 216, 243, 35, - 225, 169, 251, 169, 248, 76, 221, 170, 230, 146, 241, 230, 230, 146, 219, - 9, 230, 146, 242, 6, 225, 169, 223, 157, 123, 242, 16, 225, 169, 223, - 157, 251, 179, 242, 12, 236, 1, 250, 180, 225, 169, 243, 239, 225, 169, - 2, 224, 228, 244, 191, 225, 169, 2, 244, 42, 242, 11, 222, 204, 241, 215, - 218, 144, 232, 150, 223, 163, 250, 245, 241, 163, 215, 249, 241, 163, - 215, 250, 2, 251, 115, 228, 54, 215, 249, 231, 33, 192, 223, 164, 218, - 150, 215, 247, 215, 248, 250, 245, 251, 93, 226, 195, 251, 93, 215, 202, - 251, 94, 218, 130, 230, 188, 254, 131, 244, 98, 245, 138, 225, 0, 250, - 245, 226, 195, 225, 0, 250, 245, 217, 33, 226, 195, 217, 33, 253, 181, - 226, 195, 253, 181, 223, 119, 213, 247, 248, 59, 215, 193, 253, 243, 232, - 118, 215, 255, 230, 140, 230, 117, 223, 162, 218, 7, 223, 162, 230, 117, - 251, 29, 254, 230, 215, 246, 220, 17, 222, 183, 219, 2, 203, 215, 253, - 232, 231, 67, 215, 253, 232, 231, 249, 191, 50, 225, 0, 250, 230, 223, - 45, 232, 231, 215, 223, 244, 75, 226, 198, 224, 239, 247, 124, 228, 76, - 245, 126, 50, 219, 73, 87, 228, 76, 219, 73, 87, 224, 123, 232, 194, 236, - 1, 235, 158, 225, 42, 87, 247, 147, 228, 53, 232, 194, 87, 224, 233, 212, - 41, 87, 228, 67, 212, 41, 87, 252, 3, 228, 76, 252, 2, 252, 1, 230, 117, - 252, 1, 225, 214, 228, 76, 225, 213, 250, 101, 249, 125, 231, 57, 87, - 211, 218, 87, 223, 60, 252, 188, 87, 216, 38, 212, 41, 249, 254, 219, - 235, 252, 119, 252, 117, 225, 243, 249, 178, 249, 87, 252, 170, 250, 23, - 43, 232, 91, 108, 16, 31, 224, 4, 108, 16, 31, 254, 193, 108, 16, 31, - 244, 97, 108, 16, 31, 245, 224, 108, 16, 31, 212, 40, 108, 16, 31, 254, - 44, 108, 16, 31, 254, 45, 223, 106, 108, 16, 31, 254, 45, 223, 105, 108, - 16, 31, 254, 45, 213, 143, 108, 16, 31, 254, 45, 213, 142, 108, 16, 31, + 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 166, 11, 23, 4, + 251, 74, 11, 23, 4, 249, 68, 11, 23, 4, 76, 11, 23, 4, 245, 14, 11, 23, + 4, 243, 209, 11, 23, 4, 242, 67, 11, 23, 4, 74, 11, 23, 4, 235, 150, 11, + 23, 4, 235, 29, 11, 23, 4, 156, 11, 23, 4, 194, 11, 23, 4, 230, 30, 11, + 23, 4, 78, 11, 23, 4, 226, 109, 11, 23, 4, 224, 99, 11, 23, 4, 153, 11, + 23, 4, 222, 93, 11, 23, 4, 217, 153, 11, 23, 4, 69, 11, 23, 4, 214, 105, + 11, 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11, 23, 4, + 210, 159, 11, 32, 6, 61, 11, 32, 6, 253, 166, 11, 32, 6, 251, 74, 11, 32, + 6, 249, 68, 11, 32, 6, 76, 11, 32, 6, 245, 14, 11, 32, 6, 243, 209, 11, + 32, 6, 242, 67, 11, 32, 6, 74, 11, 32, 6, 235, 150, 11, 32, 6, 235, 29, + 11, 32, 6, 156, 11, 32, 6, 194, 11, 32, 6, 230, 30, 11, 32, 6, 78, 11, + 32, 6, 226, 109, 11, 32, 6, 224, 99, 11, 32, 6, 153, 11, 32, 6, 222, 93, + 11, 32, 6, 217, 153, 11, 32, 6, 69, 11, 32, 6, 214, 105, 11, 32, 6, 212, + 98, 11, 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210, 159, 11, + 32, 4, 61, 11, 32, 4, 253, 166, 11, 32, 4, 251, 74, 11, 32, 4, 249, 68, + 11, 32, 4, 76, 11, 32, 4, 245, 14, 11, 32, 4, 243, 209, 11, 32, 4, 74, + 11, 32, 4, 235, 150, 11, 32, 4, 235, 29, 11, 32, 4, 156, 11, 32, 4, 194, + 11, 32, 4, 230, 30, 11, 32, 4, 78, 11, 32, 4, 226, 109, 11, 32, 4, 224, + 99, 11, 32, 4, 153, 11, 32, 4, 222, 93, 11, 32, 4, 217, 153, 11, 32, 4, + 69, 11, 32, 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178, 11, 32, + 4, 211, 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32, 6, 253, + 166, 11, 23, 32, 6, 251, 74, 11, 23, 32, 6, 249, 68, 11, 23, 32, 6, 76, + 11, 23, 32, 6, 245, 14, 11, 23, 32, 6, 243, 209, 11, 23, 32, 6, 242, 67, + 11, 23, 32, 6, 74, 11, 23, 32, 6, 235, 150, 11, 23, 32, 6, 235, 29, 11, + 23, 32, 6, 156, 11, 23, 32, 6, 194, 11, 23, 32, 6, 230, 30, 11, 23, 32, + 6, 78, 11, 23, 32, 6, 226, 109, 11, 23, 32, 6, 224, 99, 11, 23, 32, 6, + 153, 11, 23, 32, 6, 222, 93, 11, 23, 32, 6, 217, 153, 11, 23, 32, 6, 69, + 11, 23, 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6, 211, 178, + 11, 23, 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32, 4, 61, 11, + 23, 32, 4, 253, 166, 11, 23, 32, 4, 251, 74, 11, 23, 32, 4, 249, 68, 11, + 23, 32, 4, 76, 11, 23, 32, 4, 245, 14, 11, 23, 32, 4, 243, 209, 11, 23, + 32, 4, 242, 67, 11, 23, 32, 4, 74, 11, 23, 32, 4, 235, 150, 11, 23, 32, + 4, 235, 29, 11, 23, 32, 4, 156, 11, 23, 32, 4, 194, 11, 23, 32, 4, 230, + 30, 11, 23, 32, 4, 78, 11, 23, 32, 4, 226, 109, 11, 23, 32, 4, 224, 99, + 11, 23, 32, 4, 153, 11, 23, 32, 4, 222, 93, 11, 23, 32, 4, 217, 153, 11, + 23, 32, 4, 69, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212, 98, 11, 23, + 32, 4, 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210, 159, 11, + 119, 6, 61, 11, 119, 6, 251, 74, 11, 119, 6, 249, 68, 11, 119, 6, 243, + 209, 11, 119, 6, 235, 150, 11, 119, 6, 235, 29, 11, 119, 6, 230, 30, 11, + 119, 6, 78, 11, 119, 6, 226, 109, 11, 119, 6, 224, 99, 11, 119, 6, 222, + 93, 11, 119, 6, 217, 153, 11, 119, 6, 69, 11, 119, 6, 214, 105, 11, 119, + 6, 212, 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119, 6, 210, + 159, 11, 119, 4, 61, 11, 119, 4, 253, 166, 11, 119, 4, 251, 74, 11, 119, + 4, 249, 68, 11, 119, 4, 245, 14, 11, 119, 4, 242, 67, 11, 119, 4, 74, 11, + 119, 4, 235, 150, 11, 119, 4, 235, 29, 11, 119, 4, 156, 11, 119, 4, 194, + 11, 119, 4, 230, 30, 11, 119, 4, 226, 109, 11, 119, 4, 224, 99, 11, 119, + 4, 153, 11, 119, 4, 222, 93, 11, 119, 4, 217, 153, 11, 119, 4, 69, 11, + 119, 4, 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11, 119, 4, + 211, 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119, 6, 253, + 166, 11, 23, 119, 6, 251, 74, 11, 23, 119, 6, 249, 68, 11, 23, 119, 6, + 76, 11, 23, 119, 6, 245, 14, 11, 23, 119, 6, 243, 209, 11, 23, 119, 6, + 242, 67, 11, 23, 119, 6, 74, 11, 23, 119, 6, 235, 150, 11, 23, 119, 6, + 235, 29, 11, 23, 119, 6, 156, 11, 23, 119, 6, 194, 11, 23, 119, 6, 230, + 30, 11, 23, 119, 6, 78, 11, 23, 119, 6, 226, 109, 11, 23, 119, 6, 224, + 99, 11, 23, 119, 6, 153, 11, 23, 119, 6, 222, 93, 11, 23, 119, 6, 217, + 153, 11, 23, 119, 6, 69, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6, 212, + 98, 11, 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119, 6, + 210, 159, 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 166, 11, 23, 119, 4, + 251, 74, 11, 23, 119, 4, 249, 68, 11, 23, 119, 4, 76, 11, 23, 119, 4, + 245, 14, 11, 23, 119, 4, 243, 209, 11, 23, 119, 4, 242, 67, 11, 23, 119, + 4, 74, 11, 23, 119, 4, 235, 150, 11, 23, 119, 4, 235, 29, 11, 23, 119, 4, + 156, 11, 23, 119, 4, 194, 11, 23, 119, 4, 230, 30, 11, 23, 119, 4, 78, + 11, 23, 119, 4, 226, 109, 11, 23, 119, 4, 224, 99, 11, 23, 119, 4, 153, + 11, 23, 119, 4, 222, 93, 11, 23, 119, 4, 217, 153, 11, 23, 119, 4, 69, + 11, 23, 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211, + 178, 11, 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61, + 11, 133, 6, 253, 166, 11, 133, 6, 249, 68, 11, 133, 6, 76, 11, 133, 6, + 245, 14, 11, 133, 6, 243, 209, 11, 133, 6, 235, 150, 11, 133, 6, 235, 29, + 11, 133, 6, 156, 11, 133, 6, 194, 11, 133, 6, 230, 30, 11, 133, 6, 78, + 11, 133, 6, 226, 109, 11, 133, 6, 224, 99, 11, 133, 6, 222, 93, 11, 133, + 6, 217, 153, 11, 133, 6, 69, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98, + 11, 133, 6, 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4, + 253, 166, 11, 133, 4, 251, 74, 11, 133, 4, 249, 68, 11, 133, 4, 76, 11, + 133, 4, 245, 14, 11, 133, 4, 243, 209, 11, 133, 4, 242, 67, 11, 133, 4, + 74, 11, 133, 4, 235, 150, 11, 133, 4, 235, 29, 11, 133, 4, 156, 11, 133, + 4, 194, 11, 133, 4, 230, 30, 11, 133, 4, 78, 11, 133, 4, 226, 109, 11, + 133, 4, 224, 99, 11, 133, 4, 153, 11, 133, 4, 222, 93, 11, 133, 4, 217, + 153, 11, 133, 4, 69, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133, + 4, 211, 178, 11, 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61, + 11, 139, 6, 253, 166, 11, 139, 6, 249, 68, 11, 139, 6, 76, 11, 139, 6, + 245, 14, 11, 139, 6, 243, 209, 11, 139, 6, 74, 11, 139, 6, 235, 150, 11, + 139, 6, 235, 29, 11, 139, 6, 156, 11, 139, 6, 194, 11, 139, 6, 78, 11, + 139, 6, 222, 93, 11, 139, 6, 217, 153, 11, 139, 6, 69, 11, 139, 6, 214, + 105, 11, 139, 6, 212, 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11, + 139, 4, 61, 11, 139, 4, 253, 166, 11, 139, 4, 251, 74, 11, 139, 4, 249, + 68, 11, 139, 4, 76, 11, 139, 4, 245, 14, 11, 139, 4, 243, 209, 11, 139, + 4, 242, 67, 11, 139, 4, 74, 11, 139, 4, 235, 150, 11, 139, 4, 235, 29, + 11, 139, 4, 156, 11, 139, 4, 194, 11, 139, 4, 230, 30, 11, 139, 4, 78, + 11, 139, 4, 226, 109, 11, 139, 4, 224, 99, 11, 139, 4, 153, 11, 139, 4, + 222, 93, 11, 139, 4, 217, 153, 11, 139, 4, 69, 11, 139, 4, 214, 105, 11, + 139, 4, 212, 98, 11, 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, + 210, 159, 11, 23, 133, 6, 61, 11, 23, 133, 6, 253, 166, 11, 23, 133, 6, + 251, 74, 11, 23, 133, 6, 249, 68, 11, 23, 133, 6, 76, 11, 23, 133, 6, + 245, 14, 11, 23, 133, 6, 243, 209, 11, 23, 133, 6, 242, 67, 11, 23, 133, + 6, 74, 11, 23, 133, 6, 235, 150, 11, 23, 133, 6, 235, 29, 11, 23, 133, 6, + 156, 11, 23, 133, 6, 194, 11, 23, 133, 6, 230, 30, 11, 23, 133, 6, 78, + 11, 23, 133, 6, 226, 109, 11, 23, 133, 6, 224, 99, 11, 23, 133, 6, 153, + 11, 23, 133, 6, 222, 93, 11, 23, 133, 6, 217, 153, 11, 23, 133, 6, 69, + 11, 23, 133, 6, 214, 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, + 178, 11, 23, 133, 6, 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, + 61, 11, 23, 133, 4, 253, 166, 11, 23, 133, 4, 251, 74, 11, 23, 133, 4, + 249, 68, 11, 23, 133, 4, 76, 11, 23, 133, 4, 245, 14, 11, 23, 133, 4, + 243, 209, 11, 23, 133, 4, 242, 67, 11, 23, 133, 4, 74, 11, 23, 133, 4, + 235, 150, 11, 23, 133, 4, 235, 29, 11, 23, 133, 4, 156, 11, 23, 133, 4, + 194, 11, 23, 133, 4, 230, 30, 11, 23, 133, 4, 78, 11, 23, 133, 4, 226, + 109, 11, 23, 133, 4, 224, 99, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, + 93, 11, 23, 133, 4, 217, 153, 11, 23, 133, 4, 69, 11, 23, 133, 4, 214, + 105, 11, 23, 133, 4, 212, 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, + 211, 117, 11, 23, 133, 4, 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 166, + 11, 35, 6, 251, 74, 11, 35, 6, 249, 68, 11, 35, 6, 76, 11, 35, 6, 245, + 14, 11, 35, 6, 243, 209, 11, 35, 6, 242, 67, 11, 35, 6, 74, 11, 35, 6, + 235, 150, 11, 35, 6, 235, 29, 11, 35, 6, 156, 11, 35, 6, 194, 11, 35, 6, + 230, 30, 11, 35, 6, 78, 11, 35, 6, 226, 109, 11, 35, 6, 224, 99, 11, 35, + 6, 153, 11, 35, 6, 222, 93, 11, 35, 6, 217, 153, 11, 35, 6, 69, 11, 35, + 6, 214, 105, 11, 35, 6, 212, 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, + 117, 11, 35, 6, 210, 159, 11, 35, 4, 61, 11, 35, 4, 253, 166, 11, 35, 4, + 251, 74, 11, 35, 4, 249, 68, 11, 35, 4, 76, 11, 35, 4, 245, 14, 11, 35, + 4, 243, 209, 11, 35, 4, 242, 67, 11, 35, 4, 74, 11, 35, 4, 235, 150, 11, + 35, 4, 235, 29, 11, 35, 4, 156, 11, 35, 4, 194, 11, 35, 4, 230, 30, 11, + 35, 4, 78, 11, 35, 4, 226, 109, 11, 35, 4, 224, 99, 11, 35, 4, 153, 11, + 35, 4, 222, 93, 11, 35, 4, 217, 153, 11, 35, 4, 69, 11, 35, 4, 214, 105, + 11, 35, 4, 212, 98, 11, 35, 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, + 210, 159, 11, 35, 23, 6, 61, 11, 35, 23, 6, 253, 166, 11, 35, 23, 6, 251, + 74, 11, 35, 23, 6, 249, 68, 11, 35, 23, 6, 76, 11, 35, 23, 6, 245, 14, + 11, 35, 23, 6, 243, 209, 11, 35, 23, 6, 242, 67, 11, 35, 23, 6, 74, 11, + 35, 23, 6, 235, 150, 11, 35, 23, 6, 235, 29, 11, 35, 23, 6, 156, 11, 35, + 23, 6, 194, 11, 35, 23, 6, 230, 30, 11, 35, 23, 6, 78, 11, 35, 23, 6, + 226, 109, 11, 35, 23, 6, 224, 99, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, + 93, 11, 35, 23, 6, 217, 153, 11, 35, 23, 6, 69, 11, 35, 23, 6, 214, 105, + 11, 35, 23, 6, 212, 98, 11, 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, + 11, 35, 23, 6, 210, 159, 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 166, 11, + 35, 23, 4, 251, 74, 11, 35, 23, 4, 249, 68, 11, 35, 23, 4, 76, 11, 35, + 23, 4, 245, 14, 11, 35, 23, 4, 243, 209, 11, 35, 23, 4, 242, 67, 11, 35, + 23, 4, 74, 11, 35, 23, 4, 235, 150, 11, 35, 23, 4, 235, 29, 11, 35, 23, + 4, 156, 11, 35, 23, 4, 194, 11, 35, 23, 4, 230, 30, 11, 35, 23, 4, 78, + 11, 35, 23, 4, 226, 109, 11, 35, 23, 4, 224, 99, 11, 35, 23, 4, 153, 11, + 35, 23, 4, 222, 93, 11, 35, 23, 4, 217, 153, 11, 35, 23, 4, 69, 11, 35, + 23, 4, 214, 105, 11, 35, 23, 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, + 23, 4, 211, 117, 11, 35, 23, 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, + 6, 253, 166, 11, 35, 32, 6, 251, 74, 11, 35, 32, 6, 249, 68, 11, 35, 32, + 6, 76, 11, 35, 32, 6, 245, 14, 11, 35, 32, 6, 243, 209, 11, 35, 32, 6, + 242, 67, 11, 35, 32, 6, 74, 11, 35, 32, 6, 235, 150, 11, 35, 32, 6, 235, + 29, 11, 35, 32, 6, 156, 11, 35, 32, 6, 194, 11, 35, 32, 6, 230, 30, 11, + 35, 32, 6, 78, 11, 35, 32, 6, 226, 109, 11, 35, 32, 6, 224, 99, 11, 35, + 32, 6, 153, 11, 35, 32, 6, 222, 93, 11, 35, 32, 6, 217, 153, 11, 35, 32, + 6, 69, 11, 35, 32, 6, 214, 105, 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, + 211, 178, 11, 35, 32, 6, 211, 117, 11, 35, 32, 6, 210, 159, 11, 35, 32, + 4, 61, 11, 35, 32, 4, 253, 166, 11, 35, 32, 4, 251, 74, 11, 35, 32, 4, + 249, 68, 11, 35, 32, 4, 76, 11, 35, 32, 4, 245, 14, 11, 35, 32, 4, 243, + 209, 11, 35, 32, 4, 242, 67, 11, 35, 32, 4, 74, 11, 35, 32, 4, 235, 150, + 11, 35, 32, 4, 235, 29, 11, 35, 32, 4, 156, 11, 35, 32, 4, 194, 11, 35, + 32, 4, 230, 30, 11, 35, 32, 4, 78, 11, 35, 32, 4, 226, 109, 11, 35, 32, + 4, 224, 99, 11, 35, 32, 4, 153, 11, 35, 32, 4, 222, 93, 11, 35, 32, 4, + 217, 153, 11, 35, 32, 4, 69, 11, 35, 32, 4, 214, 105, 11, 35, 32, 4, 212, + 98, 11, 35, 32, 4, 211, 178, 11, 35, 32, 4, 211, 117, 11, 35, 32, 4, 210, + 159, 11, 35, 23, 32, 6, 61, 11, 35, 23, 32, 6, 253, 166, 11, 35, 23, 32, + 6, 251, 74, 11, 35, 23, 32, 6, 249, 68, 11, 35, 23, 32, 6, 76, 11, 35, + 23, 32, 6, 245, 14, 11, 35, 23, 32, 6, 243, 209, 11, 35, 23, 32, 6, 242, + 67, 11, 35, 23, 32, 6, 74, 11, 35, 23, 32, 6, 235, 150, 11, 35, 23, 32, + 6, 235, 29, 11, 35, 23, 32, 6, 156, 11, 35, 23, 32, 6, 194, 11, 35, 23, + 32, 6, 230, 30, 11, 35, 23, 32, 6, 78, 11, 35, 23, 32, 6, 226, 109, 11, + 35, 23, 32, 6, 224, 99, 11, 35, 23, 32, 6, 153, 11, 35, 23, 32, 6, 222, + 93, 11, 35, 23, 32, 6, 217, 153, 11, 35, 23, 32, 6, 69, 11, 35, 23, 32, + 6, 214, 105, 11, 35, 23, 32, 6, 212, 98, 11, 35, 23, 32, 6, 211, 178, 11, + 35, 23, 32, 6, 211, 117, 11, 35, 23, 32, 6, 210, 159, 11, 35, 23, 32, 4, + 61, 11, 35, 23, 32, 4, 253, 166, 11, 35, 23, 32, 4, 251, 74, 11, 35, 23, + 32, 4, 249, 68, 11, 35, 23, 32, 4, 76, 11, 35, 23, 32, 4, 245, 14, 11, + 35, 23, 32, 4, 243, 209, 11, 35, 23, 32, 4, 242, 67, 11, 35, 23, 32, 4, + 74, 11, 35, 23, 32, 4, 235, 150, 11, 35, 23, 32, 4, 235, 29, 11, 35, 23, + 32, 4, 156, 11, 35, 23, 32, 4, 194, 11, 35, 23, 32, 4, 230, 30, 11, 35, + 23, 32, 4, 78, 11, 35, 23, 32, 4, 226, 109, 11, 35, 23, 32, 4, 224, 99, + 11, 35, 23, 32, 4, 153, 11, 35, 23, 32, 4, 222, 93, 11, 35, 23, 32, 4, + 217, 153, 11, 35, 23, 32, 4, 69, 11, 35, 23, 32, 4, 214, 105, 11, 35, 23, + 32, 4, 212, 98, 11, 35, 23, 32, 4, 211, 178, 11, 35, 23, 32, 4, 211, 117, + 11, 35, 23, 32, 4, 210, 159, 11, 230, 143, 6, 61, 11, 230, 143, 6, 253, + 166, 11, 230, 143, 6, 251, 74, 11, 230, 143, 6, 249, 68, 11, 230, 143, 6, + 76, 11, 230, 143, 6, 245, 14, 11, 230, 143, 6, 243, 209, 11, 230, 143, 6, + 242, 67, 11, 230, 143, 6, 74, 11, 230, 143, 6, 235, 150, 11, 230, 143, 6, + 235, 29, 11, 230, 143, 6, 156, 11, 230, 143, 6, 194, 11, 230, 143, 6, + 230, 30, 11, 230, 143, 6, 78, 11, 230, 143, 6, 226, 109, 11, 230, 143, 6, + 224, 99, 11, 230, 143, 6, 153, 11, 230, 143, 6, 222, 93, 11, 230, 143, 6, + 217, 153, 11, 230, 143, 6, 69, 11, 230, 143, 6, 214, 105, 11, 230, 143, + 6, 212, 98, 11, 230, 143, 6, 211, 178, 11, 230, 143, 6, 211, 117, 11, + 230, 143, 6, 210, 159, 11, 230, 143, 4, 61, 11, 230, 143, 4, 253, 166, + 11, 230, 143, 4, 251, 74, 11, 230, 143, 4, 249, 68, 11, 230, 143, 4, 76, + 11, 230, 143, 4, 245, 14, 11, 230, 143, 4, 243, 209, 11, 230, 143, 4, + 242, 67, 11, 230, 143, 4, 74, 11, 230, 143, 4, 235, 150, 11, 230, 143, 4, + 235, 29, 11, 230, 143, 4, 156, 11, 230, 143, 4, 194, 11, 230, 143, 4, + 230, 30, 11, 230, 143, 4, 78, 11, 230, 143, 4, 226, 109, 11, 230, 143, 4, + 224, 99, 11, 230, 143, 4, 153, 11, 230, 143, 4, 222, 93, 11, 230, 143, 4, + 217, 153, 11, 230, 143, 4, 69, 11, 230, 143, 4, 214, 105, 11, 230, 143, + 4, 212, 98, 11, 230, 143, 4, 211, 178, 11, 230, 143, 4, 211, 117, 11, + 230, 143, 4, 210, 159, 11, 32, 4, 247, 127, 74, 11, 32, 4, 247, 127, 235, + 150, 11, 23, 6, 254, 151, 11, 23, 6, 252, 34, 11, 23, 6, 243, 114, 11, + 23, 6, 248, 62, 11, 23, 6, 245, 108, 11, 23, 6, 210, 85, 11, 23, 6, 245, + 71, 11, 23, 6, 216, 180, 11, 23, 6, 235, 192, 11, 23, 6, 234, 228, 11, + 23, 6, 233, 104, 11, 23, 6, 230, 107, 11, 23, 6, 227, 242, 11, 23, 6, + 211, 157, 11, 23, 6, 226, 203, 11, 23, 6, 225, 111, 11, 23, 6, 223, 40, + 11, 23, 6, 216, 181, 87, 11, 23, 6, 219, 179, 11, 23, 6, 217, 42, 11, 23, + 6, 214, 157, 11, 23, 6, 225, 136, 11, 23, 6, 250, 118, 11, 23, 6, 224, + 164, 11, 23, 6, 226, 205, 11, 23, 229, 226, 11, 23, 4, 254, 151, 11, 23, + 4, 252, 34, 11, 23, 4, 243, 114, 11, 23, 4, 248, 62, 11, 23, 4, 245, 108, + 11, 23, 4, 210, 85, 11, 23, 4, 245, 71, 11, 23, 4, 216, 180, 11, 23, 4, + 235, 192, 11, 23, 4, 234, 228, 11, 23, 4, 233, 104, 11, 23, 4, 230, 107, + 11, 23, 4, 227, 242, 11, 23, 4, 211, 157, 11, 23, 4, 226, 203, 11, 23, 4, + 225, 111, 11, 23, 4, 223, 40, 11, 23, 4, 40, 219, 179, 11, 23, 4, 219, + 179, 11, 23, 4, 217, 42, 11, 23, 4, 214, 157, 11, 23, 4, 225, 136, 11, + 23, 4, 250, 118, 11, 23, 4, 224, 164, 11, 23, 4, 226, 205, 11, 23, 226, + 1, 247, 241, 11, 23, 245, 109, 87, 11, 23, 216, 181, 87, 11, 23, 234, + 229, 87, 11, 23, 225, 137, 87, 11, 23, 223, 41, 87, 11, 23, 225, 112, 87, + 11, 32, 6, 254, 151, 11, 32, 6, 252, 34, 11, 32, 6, 243, 114, 11, 32, 6, + 248, 62, 11, 32, 6, 245, 108, 11, 32, 6, 210, 85, 11, 32, 6, 245, 71, 11, + 32, 6, 216, 180, 11, 32, 6, 235, 192, 11, 32, 6, 234, 228, 11, 32, 6, + 233, 104, 11, 32, 6, 230, 107, 11, 32, 6, 227, 242, 11, 32, 6, 211, 157, + 11, 32, 6, 226, 203, 11, 32, 6, 225, 111, 11, 32, 6, 223, 40, 11, 32, 6, + 216, 181, 87, 11, 32, 6, 219, 179, 11, 32, 6, 217, 42, 11, 32, 6, 214, + 157, 11, 32, 6, 225, 136, 11, 32, 6, 250, 118, 11, 32, 6, 224, 164, 11, + 32, 6, 226, 205, 11, 32, 229, 226, 11, 32, 4, 254, 151, 11, 32, 4, 252, + 34, 11, 32, 4, 243, 114, 11, 32, 4, 248, 62, 11, 32, 4, 245, 108, 11, 32, + 4, 210, 85, 11, 32, 4, 245, 71, 11, 32, 4, 216, 180, 11, 32, 4, 235, 192, + 11, 32, 4, 234, 228, 11, 32, 4, 233, 104, 11, 32, 4, 230, 107, 11, 32, 4, + 227, 242, 11, 32, 4, 211, 157, 11, 32, 4, 226, 203, 11, 32, 4, 225, 111, + 11, 32, 4, 223, 40, 11, 32, 4, 40, 219, 179, 11, 32, 4, 219, 179, 11, 32, + 4, 217, 42, 11, 32, 4, 214, 157, 11, 32, 4, 225, 136, 11, 32, 4, 250, + 118, 11, 32, 4, 224, 164, 11, 32, 4, 226, 205, 11, 32, 226, 1, 247, 241, + 11, 32, 245, 109, 87, 11, 32, 216, 181, 87, 11, 32, 234, 229, 87, 11, 32, + 225, 137, 87, 11, 32, 223, 41, 87, 11, 32, 225, 112, 87, 11, 23, 32, 6, + 254, 151, 11, 23, 32, 6, 252, 34, 11, 23, 32, 6, 243, 114, 11, 23, 32, 6, + 248, 62, 11, 23, 32, 6, 245, 108, 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, + 245, 71, 11, 23, 32, 6, 216, 180, 11, 23, 32, 6, 235, 192, 11, 23, 32, 6, + 234, 228, 11, 23, 32, 6, 233, 104, 11, 23, 32, 6, 230, 107, 11, 23, 32, + 6, 227, 242, 11, 23, 32, 6, 211, 157, 11, 23, 32, 6, 226, 203, 11, 23, + 32, 6, 225, 111, 11, 23, 32, 6, 223, 40, 11, 23, 32, 6, 216, 181, 87, 11, + 23, 32, 6, 219, 179, 11, 23, 32, 6, 217, 42, 11, 23, 32, 6, 214, 157, 11, + 23, 32, 6, 225, 136, 11, 23, 32, 6, 250, 118, 11, 23, 32, 6, 224, 164, + 11, 23, 32, 6, 226, 205, 11, 23, 32, 229, 226, 11, 23, 32, 4, 254, 151, + 11, 23, 32, 4, 252, 34, 11, 23, 32, 4, 243, 114, 11, 23, 32, 4, 248, 62, + 11, 23, 32, 4, 245, 108, 11, 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 71, + 11, 23, 32, 4, 216, 180, 11, 23, 32, 4, 235, 192, 11, 23, 32, 4, 234, + 228, 11, 23, 32, 4, 233, 104, 11, 23, 32, 4, 230, 107, 11, 23, 32, 4, + 227, 242, 11, 23, 32, 4, 211, 157, 11, 23, 32, 4, 226, 203, 11, 23, 32, + 4, 225, 111, 11, 23, 32, 4, 223, 40, 11, 23, 32, 4, 40, 219, 179, 11, 23, + 32, 4, 219, 179, 11, 23, 32, 4, 217, 42, 11, 23, 32, 4, 214, 157, 11, 23, + 32, 4, 225, 136, 11, 23, 32, 4, 250, 118, 11, 23, 32, 4, 224, 164, 11, + 23, 32, 4, 226, 205, 11, 23, 32, 226, 1, 247, 241, 11, 23, 32, 245, 109, + 87, 11, 23, 32, 216, 181, 87, 11, 23, 32, 234, 229, 87, 11, 23, 32, 225, + 137, 87, 11, 23, 32, 223, 41, 87, 11, 23, 32, 225, 112, 87, 11, 35, 23, + 6, 254, 151, 11, 35, 23, 6, 252, 34, 11, 35, 23, 6, 243, 114, 11, 35, 23, + 6, 248, 62, 11, 35, 23, 6, 245, 108, 11, 35, 23, 6, 210, 85, 11, 35, 23, + 6, 245, 71, 11, 35, 23, 6, 216, 180, 11, 35, 23, 6, 235, 192, 11, 35, 23, + 6, 234, 228, 11, 35, 23, 6, 233, 104, 11, 35, 23, 6, 230, 107, 11, 35, + 23, 6, 227, 242, 11, 35, 23, 6, 211, 157, 11, 35, 23, 6, 226, 203, 11, + 35, 23, 6, 225, 111, 11, 35, 23, 6, 223, 40, 11, 35, 23, 6, 216, 181, 87, + 11, 35, 23, 6, 219, 179, 11, 35, 23, 6, 217, 42, 11, 35, 23, 6, 214, 157, + 11, 35, 23, 6, 225, 136, 11, 35, 23, 6, 250, 118, 11, 35, 23, 6, 224, + 164, 11, 35, 23, 6, 226, 205, 11, 35, 23, 229, 226, 11, 35, 23, 4, 254, + 151, 11, 35, 23, 4, 252, 34, 11, 35, 23, 4, 243, 114, 11, 35, 23, 4, 248, + 62, 11, 35, 23, 4, 245, 108, 11, 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, + 71, 11, 35, 23, 4, 216, 180, 11, 35, 23, 4, 235, 192, 11, 35, 23, 4, 234, + 228, 11, 35, 23, 4, 233, 104, 11, 35, 23, 4, 230, 107, 11, 35, 23, 4, + 227, 242, 11, 35, 23, 4, 211, 157, 11, 35, 23, 4, 226, 203, 11, 35, 23, + 4, 225, 111, 11, 35, 23, 4, 223, 40, 11, 35, 23, 4, 40, 219, 179, 11, 35, + 23, 4, 219, 179, 11, 35, 23, 4, 217, 42, 11, 35, 23, 4, 214, 157, 11, 35, + 23, 4, 225, 136, 11, 35, 23, 4, 250, 118, 11, 35, 23, 4, 224, 164, 11, + 35, 23, 4, 226, 205, 11, 35, 23, 226, 1, 247, 241, 11, 35, 23, 245, 109, + 87, 11, 35, 23, 216, 181, 87, 11, 35, 23, 234, 229, 87, 11, 35, 23, 225, + 137, 87, 11, 35, 23, 223, 41, 87, 11, 35, 23, 225, 112, 87, 11, 35, 23, + 32, 6, 254, 151, 11, 35, 23, 32, 6, 252, 34, 11, 35, 23, 32, 6, 243, 114, + 11, 35, 23, 32, 6, 248, 62, 11, 35, 23, 32, 6, 245, 108, 11, 35, 23, 32, + 6, 210, 85, 11, 35, 23, 32, 6, 245, 71, 11, 35, 23, 32, 6, 216, 180, 11, + 35, 23, 32, 6, 235, 192, 11, 35, 23, 32, 6, 234, 228, 11, 35, 23, 32, 6, + 233, 104, 11, 35, 23, 32, 6, 230, 107, 11, 35, 23, 32, 6, 227, 242, 11, + 35, 23, 32, 6, 211, 157, 11, 35, 23, 32, 6, 226, 203, 11, 35, 23, 32, 6, + 225, 111, 11, 35, 23, 32, 6, 223, 40, 11, 35, 23, 32, 6, 216, 181, 87, + 11, 35, 23, 32, 6, 219, 179, 11, 35, 23, 32, 6, 217, 42, 11, 35, 23, 32, + 6, 214, 157, 11, 35, 23, 32, 6, 225, 136, 11, 35, 23, 32, 6, 250, 118, + 11, 35, 23, 32, 6, 224, 164, 11, 35, 23, 32, 6, 226, 205, 11, 35, 23, 32, + 229, 226, 11, 35, 23, 32, 4, 254, 151, 11, 35, 23, 32, 4, 252, 34, 11, + 35, 23, 32, 4, 243, 114, 11, 35, 23, 32, 4, 248, 62, 11, 35, 23, 32, 4, + 245, 108, 11, 35, 23, 32, 4, 210, 85, 11, 35, 23, 32, 4, 245, 71, 11, 35, + 23, 32, 4, 216, 180, 11, 35, 23, 32, 4, 235, 192, 11, 35, 23, 32, 4, 234, + 228, 11, 35, 23, 32, 4, 233, 104, 11, 35, 23, 32, 4, 230, 107, 11, 35, + 23, 32, 4, 227, 242, 11, 35, 23, 32, 4, 211, 157, 11, 35, 23, 32, 4, 226, + 203, 11, 35, 23, 32, 4, 225, 111, 11, 35, 23, 32, 4, 223, 40, 11, 35, 23, + 32, 4, 40, 219, 179, 11, 35, 23, 32, 4, 219, 179, 11, 35, 23, 32, 4, 217, + 42, 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32, 4, 225, 136, 11, 35, 23, + 32, 4, 250, 118, 11, 35, 23, 32, 4, 224, 164, 11, 35, 23, 32, 4, 226, + 205, 11, 35, 23, 32, 226, 1, 247, 241, 11, 35, 23, 32, 245, 109, 87, 11, + 35, 23, 32, 216, 181, 87, 11, 35, 23, 32, 234, 229, 87, 11, 35, 23, 32, + 225, 137, 87, 11, 35, 23, 32, 223, 41, 87, 11, 35, 23, 32, 225, 112, 87, + 11, 23, 6, 247, 235, 11, 23, 4, 247, 235, 11, 23, 21, 210, 86, 11, 23, + 21, 111, 11, 23, 21, 105, 11, 23, 21, 158, 11, 23, 21, 161, 11, 23, 21, + 190, 11, 23, 21, 195, 11, 23, 21, 199, 11, 23, 21, 196, 11, 23, 21, 201, + 11, 139, 21, 210, 86, 11, 139, 21, 111, 11, 139, 21, 105, 11, 139, 21, + 158, 11, 139, 21, 161, 11, 139, 21, 190, 11, 139, 21, 195, 11, 139, 21, + 199, 11, 139, 21, 196, 11, 139, 21, 201, 11, 35, 21, 210, 86, 11, 35, 21, + 111, 11, 35, 21, 105, 11, 35, 21, 158, 11, 35, 21, 161, 11, 35, 21, 190, + 11, 35, 21, 195, 11, 35, 21, 199, 11, 35, 21, 196, 11, 35, 21, 201, 11, + 35, 23, 21, 210, 86, 11, 35, 23, 21, 111, 11, 35, 23, 21, 105, 11, 35, + 23, 21, 158, 11, 35, 23, 21, 161, 11, 35, 23, 21, 190, 11, 35, 23, 21, + 195, 11, 35, 23, 21, 199, 11, 35, 23, 21, 196, 11, 35, 23, 21, 201, 11, + 230, 143, 21, 210, 86, 11, 230, 143, 21, 111, 11, 230, 143, 21, 105, 11, + 230, 143, 21, 158, 11, 230, 143, 21, 161, 11, 230, 143, 21, 190, 11, 230, + 143, 21, 195, 11, 230, 143, 21, 199, 11, 230, 143, 21, 196, 11, 230, 143, + 21, 201, 9, 11, 254, 179, 9, 11, 252, 62, 9, 11, 235, 129, 9, 11, 248, + 203, 9, 11, 212, 30, 9, 11, 210, 108, 9, 11, 242, 44, 9, 11, 217, 81, 9, + 11, 211, 43, 9, 11, 235, 0, 9, 11, 233, 108, 9, 11, 231, 83, 9, 11, 228, + 67, 9, 11, 221, 168, 9, 11, 254, 205, 9, 11, 244, 150, 9, 11, 222, 28, 9, + 11, 224, 84, 9, 11, 223, 98, 9, 11, 220, 61, 9, 11, 217, 8, 9, 11, 216, + 193, 9, 11, 234, 135, 9, 11, 216, 203, 9, 11, 248, 224, 9, 11, 210, 111, + 9, 11, 242, 251, 9, 11, 247, 127, 252, 62, 9, 11, 247, 127, 228, 67, 9, + 11, 247, 127, 244, 150, 9, 11, 247, 127, 224, 84, 9, 11, 65, 252, 62, 9, + 11, 65, 235, 129, 9, 11, 65, 241, 225, 9, 11, 65, 242, 44, 9, 11, 65, + 211, 43, 9, 11, 65, 235, 0, 9, 11, 65, 233, 108, 9, 11, 65, 231, 83, 9, + 11, 65, 228, 67, 9, 11, 65, 221, 168, 9, 11, 65, 254, 205, 9, 11, 65, + 244, 150, 9, 11, 65, 222, 28, 9, 11, 65, 224, 84, 9, 11, 65, 220, 61, 9, + 11, 65, 217, 8, 9, 11, 65, 216, 193, 9, 11, 65, 234, 135, 9, 11, 65, 248, + 224, 9, 11, 65, 242, 251, 9, 11, 217, 77, 235, 129, 9, 11, 217, 77, 242, + 44, 9, 11, 217, 77, 211, 43, 9, 11, 217, 77, 233, 108, 9, 11, 217, 77, + 228, 67, 9, 11, 217, 77, 221, 168, 9, 11, 217, 77, 254, 205, 9, 11, 217, + 77, 222, 28, 9, 11, 217, 77, 224, 84, 9, 11, 217, 77, 220, 61, 9, 11, + 217, 77, 234, 135, 9, 11, 217, 77, 248, 224, 9, 11, 217, 77, 242, 251, 9, + 11, 217, 77, 247, 127, 228, 67, 9, 11, 217, 77, 247, 127, 224, 84, 9, 11, + 218, 112, 252, 62, 9, 11, 218, 112, 235, 129, 9, 11, 218, 112, 241, 225, + 9, 11, 218, 112, 242, 44, 9, 11, 218, 112, 217, 81, 9, 11, 218, 112, 211, + 43, 9, 11, 218, 112, 235, 0, 9, 11, 218, 112, 231, 83, 9, 11, 218, 112, + 228, 67, 9, 11, 218, 112, 221, 168, 9, 11, 218, 112, 254, 205, 9, 11, + 218, 112, 244, 150, 9, 11, 218, 112, 222, 28, 9, 11, 218, 112, 224, 84, + 9, 11, 218, 112, 220, 61, 9, 11, 218, 112, 217, 8, 9, 11, 218, 112, 216, + 193, 9, 11, 218, 112, 234, 135, 9, 11, 218, 112, 248, 224, 9, 11, 218, + 112, 210, 111, 9, 11, 218, 112, 242, 251, 9, 11, 218, 112, 247, 127, 252, + 62, 9, 11, 218, 112, 247, 127, 244, 150, 9, 11, 232, 128, 254, 179, 9, + 11, 232, 128, 252, 62, 9, 11, 232, 128, 235, 129, 9, 11, 232, 128, 248, + 203, 9, 11, 232, 128, 241, 225, 9, 11, 232, 128, 212, 30, 9, 11, 232, + 128, 210, 108, 9, 11, 232, 128, 242, 44, 9, 11, 232, 128, 217, 81, 9, 11, + 232, 128, 211, 43, 9, 11, 232, 128, 233, 108, 9, 11, 232, 128, 231, 83, + 9, 11, 232, 128, 228, 67, 9, 11, 232, 128, 221, 168, 9, 11, 232, 128, + 254, 205, 9, 11, 232, 128, 244, 150, 9, 11, 232, 128, 222, 28, 9, 11, + 232, 128, 224, 84, 9, 11, 232, 128, 223, 98, 9, 11, 232, 128, 220, 61, 9, + 11, 232, 128, 217, 8, 9, 11, 232, 128, 216, 193, 9, 11, 232, 128, 234, + 135, 9, 11, 232, 128, 216, 203, 9, 11, 232, 128, 248, 224, 9, 11, 232, + 128, 210, 111, 9, 11, 232, 128, 242, 251, 9, 11, 139, 252, 62, 9, 11, + 139, 235, 129, 9, 11, 139, 248, 203, 9, 11, 139, 212, 30, 9, 11, 139, + 210, 108, 9, 11, 139, 242, 44, 9, 11, 139, 217, 81, 9, 11, 139, 211, 43, + 9, 11, 139, 233, 108, 9, 11, 139, 231, 83, 9, 11, 139, 228, 67, 9, 11, + 139, 221, 168, 9, 11, 139, 254, 205, 9, 11, 139, 244, 150, 9, 11, 139, + 222, 28, 9, 11, 139, 224, 84, 9, 11, 139, 223, 98, 9, 11, 139, 220, 61, + 9, 11, 139, 217, 8, 9, 11, 139, 216, 193, 9, 11, 139, 234, 135, 9, 11, + 139, 216, 203, 9, 11, 139, 248, 224, 9, 11, 139, 210, 111, 9, 11, 139, + 242, 251, 9, 11, 226, 172, 66, 2, 122, 2, 217, 44, 9, 11, 226, 172, 122, + 2, 248, 203, 231, 210, 86, 245, 228, 211, 239, 231, 210, 86, 219, 30, + 211, 239, 231, 210, 86, 212, 9, 211, 239, 231, 210, 86, 228, 61, 211, + 239, 231, 210, 86, 223, 114, 246, 104, 231, 210, 86, 242, 134, 246, 104, + 231, 210, 86, 71, 246, 104, 231, 210, 86, 123, 64, 250, 149, 231, 210, + 86, 113, 64, 250, 149, 231, 210, 86, 134, 64, 250, 149, 231, 210, 86, + 244, 19, 64, 250, 149, 231, 210, 86, 244, 89, 64, 250, 149, 231, 210, 86, + 219, 127, 64, 250, 149, 231, 210, 86, 220, 124, 64, 250, 149, 231, 210, + 86, 245, 201, 64, 250, 149, 231, 210, 86, 228, 205, 64, 250, 149, 231, + 210, 86, 123, 64, 252, 161, 231, 210, 86, 113, 64, 252, 161, 231, 210, + 86, 134, 64, 252, 161, 231, 210, 86, 244, 19, 64, 252, 161, 231, 210, 86, + 244, 89, 64, 252, 161, 231, 210, 86, 219, 127, 64, 252, 161, 231, 210, + 86, 220, 124, 64, 252, 161, 231, 210, 86, 245, 201, 64, 252, 161, 231, + 210, 86, 228, 205, 64, 252, 161, 231, 210, 86, 123, 64, 250, 42, 231, + 210, 86, 113, 64, 250, 42, 231, 210, 86, 134, 64, 250, 42, 231, 210, 86, + 244, 19, 64, 250, 42, 231, 210, 86, 244, 89, 64, 250, 42, 231, 210, 86, + 219, 127, 64, 250, 42, 231, 210, 86, 220, 124, 64, 250, 42, 231, 210, 86, + 245, 201, 64, 250, 42, 231, 210, 86, 228, 205, 64, 250, 42, 231, 210, 86, + 225, 28, 231, 210, 86, 226, 160, 231, 210, 86, 252, 162, 231, 210, 86, + 250, 78, 231, 210, 86, 218, 241, 231, 210, 86, 218, 40, 231, 210, 86, + 253, 187, 231, 210, 86, 211, 232, 231, 210, 86, 235, 68, 231, 210, 86, + 252, 192, 131, 86, 203, 252, 192, 131, 86, 241, 50, 131, 86, 241, 49, + 131, 86, 241, 48, 131, 86, 241, 47, 131, 86, 241, 46, 131, 86, 241, 45, + 131, 86, 241, 44, 131, 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, + 131, 86, 241, 40, 131, 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, + 131, 86, 241, 36, 131, 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, + 131, 86, 241, 32, 131, 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, + 131, 86, 241, 28, 131, 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, + 131, 86, 241, 24, 131, 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, + 131, 86, 241, 20, 131, 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, + 131, 86, 241, 16, 131, 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, + 131, 86, 241, 12, 131, 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, + 131, 86, 241, 8, 131, 86, 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, + 86, 241, 4, 131, 86, 241, 3, 131, 86, 241, 2, 131, 86, 67, 252, 192, 131, + 86, 213, 238, 131, 86, 213, 237, 131, 86, 213, 236, 131, 86, 213, 235, + 131, 86, 213, 234, 131, 86, 213, 233, 131, 86, 213, 232, 131, 86, 213, + 231, 131, 86, 213, 230, 131, 86, 213, 229, 131, 86, 213, 228, 131, 86, + 213, 227, 131, 86, 213, 226, 131, 86, 213, 225, 131, 86, 213, 224, 131, + 86, 213, 223, 131, 86, 213, 222, 131, 86, 213, 221, 131, 86, 213, 220, + 131, 86, 213, 219, 131, 86, 213, 218, 131, 86, 213, 217, 131, 86, 213, + 216, 131, 86, 213, 215, 131, 86, 213, 214, 131, 86, 213, 213, 131, 86, + 213, 212, 131, 86, 213, 211, 131, 86, 213, 210, 131, 86, 213, 209, 131, + 86, 213, 208, 131, 86, 213, 207, 131, 86, 213, 206, 131, 86, 213, 205, + 131, 86, 213, 204, 131, 86, 213, 203, 131, 86, 213, 202, 131, 86, 213, + 201, 131, 86, 213, 200, 131, 86, 213, 199, 131, 86, 213, 198, 131, 86, + 213, 197, 131, 86, 213, 196, 131, 86, 213, 195, 131, 86, 213, 194, 131, + 86, 213, 193, 131, 86, 213, 192, 131, 86, 213, 191, 131, 86, 213, 190, + 225, 36, 250, 251, 252, 192, 225, 36, 250, 251, 255, 18, 64, 219, 17, + 225, 36, 250, 251, 113, 64, 219, 17, 225, 36, 250, 251, 134, 64, 219, 17, + 225, 36, 250, 251, 244, 19, 64, 219, 17, 225, 36, 250, 251, 244, 89, 64, + 219, 17, 225, 36, 250, 251, 219, 127, 64, 219, 17, 225, 36, 250, 251, + 220, 124, 64, 219, 17, 225, 36, 250, 251, 245, 201, 64, 219, 17, 225, 36, + 250, 251, 228, 205, 64, 219, 17, 225, 36, 250, 251, 216, 249, 64, 219, + 17, 225, 36, 250, 251, 235, 145, 64, 219, 17, 225, 36, 250, 251, 234, 37, + 64, 219, 17, 225, 36, 250, 251, 224, 18, 64, 219, 17, 225, 36, 250, 251, + 234, 85, 64, 219, 17, 225, 36, 250, 251, 255, 18, 64, 241, 232, 225, 36, + 250, 251, 113, 64, 241, 232, 225, 36, 250, 251, 134, 64, 241, 232, 225, + 36, 250, 251, 244, 19, 64, 241, 232, 225, 36, 250, 251, 244, 89, 64, 241, + 232, 225, 36, 250, 251, 219, 127, 64, 241, 232, 225, 36, 250, 251, 220, + 124, 64, 241, 232, 225, 36, 250, 251, 245, 201, 64, 241, 232, 225, 36, + 250, 251, 228, 205, 64, 241, 232, 225, 36, 250, 251, 216, 249, 64, 241, + 232, 225, 36, 250, 251, 235, 145, 64, 241, 232, 225, 36, 250, 251, 234, + 37, 64, 241, 232, 225, 36, 250, 251, 224, 18, 64, 241, 232, 225, 36, 250, + 251, 234, 85, 64, 241, 232, 225, 36, 250, 251, 255, 18, 64, 247, 255, + 225, 36, 250, 251, 113, 64, 247, 255, 225, 36, 250, 251, 134, 64, 247, + 255, 225, 36, 250, 251, 244, 19, 64, 247, 255, 225, 36, 250, 251, 244, + 89, 64, 247, 255, 225, 36, 250, 251, 219, 127, 64, 247, 255, 225, 36, + 250, 251, 220, 124, 64, 247, 255, 225, 36, 250, 251, 245, 201, 64, 247, + 255, 225, 36, 250, 251, 228, 205, 64, 247, 255, 225, 36, 250, 251, 216, + 249, 64, 247, 255, 225, 36, 250, 251, 235, 145, 64, 247, 255, 225, 36, + 250, 251, 234, 37, 64, 247, 255, 225, 36, 250, 251, 224, 18, 64, 247, + 255, 225, 36, 250, 251, 234, 85, 64, 247, 255, 225, 36, 250, 251, 85, + 235, 68, 225, 36, 250, 251, 255, 18, 64, 249, 250, 225, 36, 250, 251, + 113, 64, 249, 250, 225, 36, 250, 251, 134, 64, 249, 250, 225, 36, 250, + 251, 244, 19, 64, 249, 250, 225, 36, 250, 251, 244, 89, 64, 249, 250, + 225, 36, 250, 251, 219, 127, 64, 249, 250, 225, 36, 250, 251, 220, 124, + 64, 249, 250, 225, 36, 250, 251, 245, 201, 64, 249, 250, 225, 36, 250, + 251, 228, 205, 64, 249, 250, 225, 36, 250, 251, 216, 249, 64, 249, 250, + 225, 36, 250, 251, 235, 145, 64, 249, 250, 225, 36, 250, 251, 234, 37, + 64, 249, 250, 225, 36, 250, 251, 224, 18, 64, 249, 250, 225, 36, 250, + 251, 234, 85, 64, 249, 250, 225, 36, 250, 251, 71, 235, 68, 21, 210, 87, + 243, 236, 218, 131, 21, 210, 87, 249, 227, 21, 123, 249, 227, 21, 113, + 249, 227, 21, 134, 249, 227, 21, 244, 19, 249, 227, 21, 244, 89, 249, + 227, 21, 219, 127, 249, 227, 21, 220, 124, 249, 227, 21, 245, 201, 249, + 227, 21, 228, 205, 249, 227, 88, 7, 6, 1, 61, 88, 7, 6, 1, 253, 166, 88, + 7, 6, 1, 251, 74, 88, 7, 6, 1, 249, 68, 88, 7, 6, 1, 76, 88, 7, 6, 1, + 245, 14, 88, 7, 6, 1, 243, 209, 88, 7, 6, 1, 242, 67, 88, 7, 6, 1, 74, + 88, 7, 6, 1, 235, 150, 88, 7, 6, 1, 235, 29, 88, 7, 6, 1, 156, 88, 7, 6, + 1, 194, 88, 7, 6, 1, 230, 30, 88, 7, 6, 1, 78, 88, 7, 6, 1, 226, 109, 88, + 7, 6, 1, 224, 99, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222, 93, 88, 7, 6, 1, + 217, 153, 88, 7, 6, 1, 69, 88, 7, 6, 1, 214, 105, 88, 7, 6, 1, 212, 98, + 88, 7, 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1, 210, 159, 216, + 7, 220, 55, 251, 165, 7, 6, 1, 222, 93, 37, 32, 7, 6, 1, 251, 74, 37, 32, + 7, 6, 1, 153, 37, 250, 199, 37, 211, 180, 92, 7, 6, 1, 61, 92, 7, 6, 1, + 253, 166, 92, 7, 6, 1, 251, 74, 92, 7, 6, 1, 249, 68, 92, 7, 6, 1, 76, + 92, 7, 6, 1, 245, 14, 92, 7, 6, 1, 243, 209, 92, 7, 6, 1, 242, 67, 92, 7, + 6, 1, 74, 92, 7, 6, 1, 235, 150, 92, 7, 6, 1, 235, 29, 92, 7, 6, 1, 156, + 92, 7, 6, 1, 194, 92, 7, 6, 1, 230, 30, 92, 7, 6, 1, 78, 92, 7, 6, 1, + 226, 109, 92, 7, 6, 1, 224, 99, 92, 7, 6, 1, 153, 92, 7, 6, 1, 222, 93, + 92, 7, 6, 1, 217, 153, 92, 7, 6, 1, 69, 92, 7, 6, 1, 214, 105, 92, 7, 6, + 1, 212, 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117, 92, 7, 6, 1, + 210, 159, 92, 240, 208, 92, 230, 54, 92, 221, 185, 92, 218, 228, 92, 224, + 221, 92, 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1, 253, 166, 152, + 37, 7, 6, 1, 251, 74, 152, 37, 7, 6, 1, 249, 68, 152, 37, 7, 6, 1, 76, + 152, 37, 7, 6, 1, 245, 14, 152, 37, 7, 6, 1, 243, 209, 152, 37, 7, 6, 1, + 242, 67, 152, 37, 7, 6, 1, 74, 152, 37, 7, 6, 1, 235, 150, 152, 37, 7, 6, + 1, 235, 29, 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 194, 152, 37, 7, 6, + 1, 230, 30, 152, 37, 7, 6, 1, 78, 152, 37, 7, 6, 1, 226, 109, 152, 37, 7, + 6, 1, 224, 99, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1, 222, 93, 152, 37, + 7, 6, 1, 217, 153, 152, 37, 7, 6, 1, 69, 152, 37, 7, 6, 1, 214, 105, 152, + 37, 7, 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152, 37, 7, 6, 1, 211, + 117, 152, 37, 7, 6, 1, 210, 159, 223, 160, 231, 102, 50, 223, 160, 231, + 99, 50, 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 166, 152, 92, 7, 6, + 1, 251, 74, 152, 92, 7, 6, 1, 249, 68, 152, 92, 7, 6, 1, 76, 152, 92, 7, + 6, 1, 245, 14, 152, 92, 7, 6, 1, 243, 209, 152, 92, 7, 6, 1, 242, 67, + 152, 92, 7, 6, 1, 74, 152, 92, 7, 6, 1, 235, 150, 152, 92, 7, 6, 1, 235, + 29, 152, 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 194, 152, 92, 7, 6, 1, 230, + 30, 152, 92, 7, 6, 1, 78, 152, 92, 7, 6, 1, 226, 109, 152, 92, 7, 6, 1, + 224, 99, 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 93, 152, 92, 7, 6, + 1, 217, 153, 152, 92, 7, 6, 1, 69, 152, 92, 7, 6, 1, 214, 105, 152, 92, + 7, 6, 1, 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1, 211, 117, + 152, 92, 7, 6, 1, 210, 159, 249, 136, 152, 92, 7, 6, 1, 226, 109, 152, + 92, 240, 120, 152, 92, 191, 152, 92, 206, 152, 92, 255, 34, 152, 92, 212, + 23, 42, 247, 172, 92, 250, 31, 92, 249, 178, 92, 244, 4, 92, 240, 112, + 92, 229, 91, 92, 229, 84, 92, 226, 218, 92, 219, 37, 92, 120, 2, 245, 39, + 79, 92, 213, 119, 223, 106, 235, 246, 16, 1, 61, 223, 106, 235, 246, 16, + 1, 253, 166, 223, 106, 235, 246, 16, 1, 251, 74, 223, 106, 235, 246, 16, + 1, 249, 68, 223, 106, 235, 246, 16, 1, 76, 223, 106, 235, 246, 16, 1, + 245, 14, 223, 106, 235, 246, 16, 1, 243, 209, 223, 106, 235, 246, 16, 1, + 242, 67, 223, 106, 235, 246, 16, 1, 74, 223, 106, 235, 246, 16, 1, 235, + 150, 223, 106, 235, 246, 16, 1, 235, 29, 223, 106, 235, 246, 16, 1, 156, + 223, 106, 235, 246, 16, 1, 194, 223, 106, 235, 246, 16, 1, 230, 30, 223, + 106, 235, 246, 16, 1, 78, 223, 106, 235, 246, 16, 1, 226, 109, 223, 106, + 235, 246, 16, 1, 224, 99, 223, 106, 235, 246, 16, 1, 153, 223, 106, 235, + 246, 16, 1, 222, 93, 223, 106, 235, 246, 16, 1, 217, 153, 223, 106, 235, + 246, 16, 1, 69, 223, 106, 235, 246, 16, 1, 214, 105, 223, 106, 235, 246, + 16, 1, 212, 98, 223, 106, 235, 246, 16, 1, 211, 178, 223, 106, 235, 246, + 16, 1, 211, 117, 223, 106, 235, 246, 16, 1, 210, 159, 42, 141, 241, 70, + 92, 56, 234, 24, 92, 56, 206, 92, 10, 214, 177, 238, 57, 92, 10, 214, + 177, 238, 61, 92, 10, 214, 177, 238, 69, 92, 56, 248, 98, 92, 10, 214, + 177, 238, 76, 92, 10, 214, 177, 238, 63, 92, 10, 214, 177, 238, 35, 92, + 10, 214, 177, 238, 62, 92, 10, 214, 177, 238, 75, 92, 10, 214, 177, 238, + 49, 92, 10, 214, 177, 238, 42, 92, 10, 214, 177, 238, 51, 92, 10, 214, + 177, 238, 72, 92, 10, 214, 177, 238, 58, 92, 10, 214, 177, 238, 74, 92, + 10, 214, 177, 238, 50, 92, 10, 214, 177, 238, 73, 92, 10, 214, 177, 238, + 36, 92, 10, 214, 177, 238, 41, 92, 10, 214, 177, 238, 34, 92, 10, 214, + 177, 238, 64, 92, 10, 214, 177, 238, 66, 92, 10, 214, 177, 238, 44, 92, + 10, 214, 177, 238, 55, 92, 10, 214, 177, 238, 53, 92, 10, 214, 177, 238, + 79, 92, 10, 214, 177, 238, 78, 92, 10, 214, 177, 238, 32, 92, 10, 214, + 177, 238, 59, 92, 10, 214, 177, 238, 77, 92, 10, 214, 177, 238, 68, 92, + 10, 214, 177, 238, 54, 92, 10, 214, 177, 238, 33, 92, 10, 214, 177, 238, + 56, 92, 10, 214, 177, 238, 38, 92, 10, 214, 177, 238, 37, 92, 10, 214, + 177, 238, 67, 92, 10, 214, 177, 238, 45, 92, 10, 214, 177, 238, 47, 92, + 10, 214, 177, 238, 48, 92, 10, 214, 177, 238, 40, 92, 10, 214, 177, 238, + 71, 92, 10, 214, 177, 238, 65, 216, 7, 220, 55, 251, 165, 10, 214, 177, + 238, 46, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 78, 216, 7, 220, + 55, 251, 165, 10, 214, 177, 238, 76, 216, 7, 220, 55, 251, 165, 10, 214, + 177, 238, 60, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 43, 216, 7, + 220, 55, 251, 165, 10, 214, 177, 238, 56, 216, 7, 220, 55, 251, 165, 10, + 214, 177, 238, 39, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 70, 216, + 7, 220, 55, 251, 165, 10, 214, 177, 238, 52, 37, 154, 254, 254, 37, 154, + 255, 21, 249, 79, 244, 50, 250, 8, 214, 194, 228, 218, 2, 218, 155, 218, + 34, 115, 230, 119, 218, 33, 250, 34, 253, 215, 246, 62, 218, 32, 115, + 251, 126, 223, 161, 251, 148, 253, 215, 228, 217, 212, 41, 212, 35, 213, + 131, 230, 200, 212, 25, 245, 232, 242, 188, 245, 53, 245, 232, 242, 188, + 254, 136, 245, 232, 242, 188, 253, 233, 242, 188, 2, 231, 56, 166, 230, + 134, 87, 212, 27, 249, 145, 230, 134, 87, 244, 100, 224, 25, 230, 134, + 87, 212, 27, 242, 217, 230, 134, 87, 243, 236, 230, 134, 87, 212, 52, + 242, 217, 230, 134, 87, 233, 86, 224, 25, 230, 134, 87, 212, 52, 249, + 145, 230, 134, 87, 249, 145, 230, 133, 166, 230, 134, 2, 244, 198, 244, + 100, 224, 25, 230, 134, 2, 244, 198, 233, 86, 224, 25, 230, 134, 2, 244, + 198, 243, 236, 230, 134, 2, 244, 198, 218, 39, 2, 244, 198, 242, 186, + 218, 158, 220, 1, 218, 158, 250, 124, 221, 170, 245, 47, 215, 236, 248, + 92, 215, 236, 226, 63, 215, 236, 251, 35, 215, 110, 250, 126, 251, 218, + 222, 193, 241, 186, 218, 37, 251, 218, 245, 236, 64, 231, 199, 245, 236, + 64, 223, 34, 241, 211, 244, 19, 233, 60, 249, 254, 231, 175, 233, 59, + 244, 184, 233, 59, 233, 60, 244, 55, 236, 7, 211, 239, 230, 63, 216, 35, + 253, 199, 242, 150, 231, 72, 212, 39, 217, 58, 233, 32, 252, 157, 225, + 65, 223, 114, 254, 62, 242, 134, 254, 62, 225, 220, 225, 221, 250, 127, + 218, 116, 242, 30, 219, 92, 64, 225, 47, 231, 92, 226, 201, 251, 202, + 224, 232, 233, 42, 223, 35, 249, 150, 223, 35, 252, 167, 249, 181, 223, + 34, 249, 103, 22, 223, 34, 218, 143, 251, 175, 219, 16, 251, 159, 244, 3, + 243, 255, 222, 209, 217, 247, 224, 234, 248, 183, 226, 240, 218, 8, 244, + 0, 219, 232, 244, 99, 251, 29, 2, 217, 240, 248, 43, 219, 54, 240, 119, + 249, 149, 220, 72, 240, 118, 240, 119, 249, 149, 246, 116, 249, 180, 250, + 92, 130, 251, 6, 232, 147, 249, 96, 241, 62, 224, 236, 219, 242, 252, 44, + 251, 171, 224, 237, 64, 244, 41, 249, 179, 244, 32, 22, 234, 38, 217, 20, + 211, 230, 242, 20, 222, 14, 251, 185, 22, 249, 110, 211, 237, 242, 191, + 249, 243, 242, 191, 215, 194, 246, 98, 252, 70, 230, 98, 250, 15, 252, + 70, 230, 97, 252, 195, 251, 184, 223, 36, 211, 201, 224, 198, 251, 243, + 251, 28, 235, 144, 250, 85, 215, 236, 244, 170, 250, 84, 244, 102, 244, + 103, 219, 14, 252, 166, 225, 254, 224, 247, 249, 212, 252, 167, 217, 60, + 215, 236, 249, 136, 244, 75, 225, 66, 248, 89, 235, 137, 247, 139, 250, + 240, 218, 115, 211, 240, 250, 106, 230, 134, 213, 164, 250, 170, 221, + 201, 221, 226, 242, 155, 251, 3, 250, 241, 240, 252, 244, 138, 212, 0, + 222, 202, 249, 244, 244, 94, 225, 5, 22, 244, 98, 230, 232, 230, 113, + 251, 18, 250, 47, 241, 239, 253, 249, 226, 66, 216, 15, 242, 2, 250, 37, + 216, 243, 216, 114, 250, 28, 251, 210, 225, 180, 253, 248, 213, 172, 243, + 117, 247, 205, 241, 163, 219, 86, 231, 239, 251, 253, 243, 118, 247, 248, + 251, 174, 244, 60, 225, 36, 250, 249, 28, 228, 52, 230, 90, 28, 228, 47, + 221, 214, 242, 106, 28, 234, 143, 215, 191, 213, 154, 28, 221, 194, 222, + 126, 220, 13, 2, 221, 229, 216, 245, 223, 181, 22, 252, 167, 219, 107, + 22, 219, 107, 251, 195, 252, 131, 22, 241, 56, 250, 128, 244, 81, 219, + 65, 222, 127, 218, 13, 215, 195, 240, 253, 223, 182, 254, 137, 244, 39, + 222, 138, 244, 39, 217, 242, 240, 242, 251, 127, 240, 242, 2, 243, 101, + 226, 233, 251, 127, 235, 137, 224, 242, 226, 232, 245, 52, 224, 242, 226, + 232, 240, 251, 252, 153, 253, 189, 216, 253, 231, 239, 240, 247, 232, + 117, 240, 247, 249, 184, 218, 127, 221, 200, 248, 51, 218, 127, 244, 188, + 235, 155, 233, 95, 235, 137, 250, 234, 245, 52, 250, 234, 223, 144, 230, + 117, 226, 118, 212, 41, 251, 131, 249, 153, 216, 107, 233, 24, 223, 183, + 250, 232, 246, 104, 249, 143, 212, 3, 219, 72, 219, 70, 240, 252, 223, + 156, 242, 177, 220, 59, 230, 150, 222, 196, 250, 116, 247, 144, 225, 76, + 251, 211, 245, 177, 226, 242, 218, 254, 220, 54, 251, 130, 254, 100, 241, + 61, 233, 127, 252, 68, 244, 98, 215, 194, 244, 98, 251, 217, 215, 91, + 242, 0, 250, 117, 252, 195, 250, 117, 243, 250, 252, 195, 250, 117, 251, + 245, 225, 198, 234, 32, 224, 251, 246, 95, 251, 19, 252, 185, 251, 19, + 247, 138, 230, 118, 244, 198, 249, 154, 244, 198, 216, 108, 244, 198, + 223, 184, 244, 198, 250, 233, 244, 198, 246, 105, 244, 198, 218, 243, + 212, 3, 240, 253, 244, 198, 230, 151, 244, 198, 247, 145, 244, 198, 225, + 77, 244, 198, 243, 253, 244, 198, 242, 27, 244, 198, 211, 224, 244, 198, + 252, 79, 244, 198, 226, 49, 244, 198, 225, 77, 228, 58, 225, 236, 224, + 189, 245, 21, 245, 235, 228, 58, 230, 115, 216, 20, 71, 120, 225, 10, + 252, 190, 235, 249, 71, 124, 225, 10, 252, 190, 235, 249, 71, 43, 225, + 10, 252, 190, 235, 249, 71, 44, 225, 10, 252, 190, 235, 249, 244, 92, + 242, 23, 50, 212, 33, 242, 23, 50, 226, 219, 242, 23, 50, 216, 136, 120, + 50, 216, 136, 124, 50, 250, 27, 242, 18, 50, 204, 242, 18, 50, 249, 131, + 211, 220, 242, 2, 245, 22, 229, 109, 217, 152, 235, 131, 246, 100, 234, + 88, 251, 255, 211, 220, 250, 1, 224, 130, 242, 21, 224, 233, 231, 182, + 220, 6, 253, 211, 220, 6, 241, 171, 220, 6, 211, 220, 221, 242, 211, 220, + 251, 194, 244, 37, 251, 98, 236, 7, 219, 171, 251, 97, 236, 7, 219, 171, + 251, 170, 242, 201, 231, 190, 211, 221, 244, 182, 231, 191, 22, 211, 222, + 241, 67, 242, 17, 113, 231, 64, 241, 67, 242, 17, 113, 211, 219, 241, 67, + 242, 17, 225, 2, 226, 231, 211, 222, 2, 251, 114, 245, 233, 251, 149, 2, + 213, 246, 225, 171, 2, 251, 220, 242, 41, 231, 191, 2, 242, 117, 225, + 112, 231, 179, 231, 191, 2, 215, 98, 226, 212, 231, 190, 226, 212, 211, + 221, 252, 194, 249, 198, 211, 205, 224, 192, 235, 137, 226, 227, 235, + 137, 242, 176, 242, 229, 252, 195, 254, 121, 245, 26, 254, 169, 254, 170, + 230, 141, 236, 12, 219, 102, 235, 239, 248, 42, 225, 170, 242, 112, 248, + 187, 232, 207, 229, 216, 225, 1, 244, 199, 231, 147, 242, 40, 252, 146, + 225, 4, 217, 172, 225, 69, 234, 70, 79, 232, 117, 233, 16, 222, 236, 243, + 61, 218, 133, 234, 69, 251, 179, 249, 156, 2, 241, 234, 212, 19, 252, 77, + 241, 234, 251, 143, 241, 234, 113, 241, 232, 219, 12, 241, 234, 242, 127, + 241, 234, 241, 235, 2, 75, 251, 216, 241, 234, 242, 134, 241, 234, 211, + 42, 241, 234, 224, 131, 241, 234, 241, 235, 2, 223, 36, 223, 47, 241, + 232, 241, 235, 248, 89, 248, 1, 220, 84, 2, 116, 59, 235, 222, 245, 180, + 193, 251, 124, 254, 120, 87, 251, 203, 219, 94, 87, 249, 236, 87, 218, + 248, 217, 249, 87, 246, 93, 248, 165, 87, 225, 70, 64, 224, 252, 244, 69, + 252, 11, 247, 173, 87, 219, 5, 252, 166, 216, 150, 252, 166, 71, 244, 59, + 240, 218, 225, 8, 87, 230, 154, 252, 180, 249, 106, 245, 40, 114, 247, + 140, 50, 249, 147, 250, 250, 252, 152, 2, 211, 40, 50, 252, 152, 2, 247, + 140, 50, 252, 152, 2, 245, 55, 50, 252, 152, 2, 224, 231, 50, 230, 154, + 2, 211, 235, 250, 146, 2, 214, 153, 215, 232, 22, 211, 40, 50, 221, 180, + 225, 169, 249, 216, 251, 147, 230, 191, 244, 64, 247, 193, 226, 165, 247, + 198, 246, 57, 244, 115, 244, 48, 204, 244, 115, 244, 48, 226, 80, 2, 249, + 108, 226, 80, 244, 191, 214, 163, 251, 24, 217, 19, 251, 24, 250, 251, + 235, 249, 250, 146, 2, 214, 153, 215, 231, 250, 146, 2, 246, 112, 215, + 231, 252, 149, 250, 145, 250, 14, 224, 126, 222, 187, 224, 126, 226, 23, + 218, 123, 222, 133, 215, 223, 222, 133, 251, 199, 217, 92, 233, 57, 228, + 50, 228, 51, 2, 248, 88, 249, 155, 250, 8, 251, 200, 204, 251, 200, 242, + 134, 251, 200, 251, 216, 251, 200, 226, 161, 251, 200, 251, 197, 229, + 210, 252, 183, 221, 188, 231, 65, 217, 2, 223, 126, 226, 78, 244, 167, + 231, 239, 221, 225, 254, 97, 224, 148, 255, 5, 232, 119, 250, 135, 231, + 77, 226, 133, 215, 239, 236, 3, 215, 239, 226, 86, 246, 32, 87, 236, 0, + 245, 127, 245, 128, 2, 246, 112, 80, 48, 250, 8, 231, 205, 2, 232, 113, + 244, 81, 250, 8, 231, 205, 2, 223, 160, 244, 81, 204, 231, 205, 2, 223, + 160, 244, 81, 204, 231, 205, 2, 232, 113, 244, 81, 224, 239, 224, 240, + 240, 255, 229, 89, 230, 164, 225, 120, 230, 164, 225, 121, 2, 97, 80, + 253, 215, 233, 52, 213, 175, 230, 163, 230, 164, 225, 121, 226, 234, 228, + 80, 230, 164, 225, 119, 254, 98, 2, 252, 137, 251, 18, 213, 172, 251, 18, + 216, 255, 223, 176, 213, 171, 215, 60, 97, 253, 255, 250, 10, 97, 22, + 140, 204, 250, 44, 253, 255, 250, 10, 97, 22, 140, 204, 250, 44, 254, 0, + 2, 37, 123, 226, 124, 250, 10, 246, 112, 22, 214, 153, 204, 250, 44, 253, + 255, 254, 96, 246, 112, 22, 214, 153, 204, 250, 44, 253, 255, 121, 251, + 146, 87, 125, 251, 146, 87, 219, 9, 2, 251, 12, 91, 219, 8, 219, 9, 2, + 123, 219, 33, 212, 35, 219, 9, 2, 134, 219, 33, 212, 34, 252, 123, 245, + 180, 225, 30, 233, 48, 231, 216, 242, 191, 222, 250, 231, 216, 242, 191, + 232, 158, 2, 235, 232, 225, 202, 250, 8, 232, 158, 2, 234, 144, 234, 144, + 232, 157, 204, 232, 157, 252, 52, 252, 53, 2, 251, 12, 91, 251, 198, 232, + 210, 87, 223, 177, 251, 94, 252, 193, 2, 140, 80, 48, 245, 151, 2, 140, + 80, 48, 226, 201, 2, 245, 39, 164, 2, 43, 44, 80, 48, 219, 41, 2, 97, 80, + 48, 216, 15, 2, 214, 153, 80, 48, 228, 80, 123, 214, 184, 245, 199, 87, + 234, 142, 216, 248, 235, 226, 16, 31, 7, 6, 233, 15, 235, 226, 16, 31, 7, + 4, 233, 15, 235, 226, 16, 31, 227, 203, 235, 226, 16, 31, 217, 184, 235, + 226, 16, 31, 7, 233, 15, 244, 104, 245, 180, 216, 10, 211, 199, 242, 28, + 227, 186, 22, 251, 205, 241, 73, 225, 53, 230, 231, 217, 0, 249, 122, + 252, 167, 219, 127, 225, 12, 218, 159, 2, 230, 229, 247, 128, 235, 137, + 16, 31, 252, 65, 215, 221, 245, 164, 85, 42, 251, 94, 71, 42, 251, 94, + 233, 91, 223, 114, 250, 43, 233, 91, 251, 216, 250, 43, 233, 91, 226, + 161, 248, 0, 233, 91, 251, 216, 248, 0, 4, 226, 161, 248, 0, 4, 251, 216, + 248, 0, 214, 162, 223, 114, 215, 226, 246, 113, 223, 114, 215, 226, 214, + 162, 4, 223, 114, 215, 226, 246, 113, 4, 223, 114, 215, 226, 37, 249, + 139, 224, 255, 249, 139, 225, 0, 2, 242, 33, 51, 249, 139, 224, 255, 228, + 54, 43, 220, 155, 2, 134, 247, 126, 250, 12, 244, 199, 123, 226, 246, + 250, 12, 244, 199, 113, 226, 246, 250, 12, 244, 199, 134, 226, 246, 250, + 12, 244, 199, 244, 19, 226, 246, 250, 12, 244, 199, 244, 89, 226, 246, + 250, 12, 244, 199, 219, 127, 226, 246, 250, 12, 244, 199, 220, 124, 226, + 246, 250, 12, 244, 199, 245, 201, 226, 246, 250, 12, 244, 199, 228, 205, + 226, 246, 250, 12, 244, 199, 216, 249, 226, 246, 250, 12, 244, 199, 245, + 176, 226, 246, 250, 12, 244, 199, 215, 77, 226, 246, 250, 12, 244, 199, + 226, 196, 250, 12, 244, 199, 215, 56, 250, 12, 244, 199, 216, 141, 250, + 12, 244, 199, 244, 15, 250, 12, 244, 199, 244, 87, 250, 12, 244, 199, + 219, 123, 250, 12, 244, 199, 220, 123, 250, 12, 244, 199, 245, 200, 250, + 12, 244, 199, 228, 204, 250, 12, 244, 199, 216, 247, 250, 12, 244, 199, + 245, 174, 250, 12, 244, 199, 215, 75, 230, 122, 243, 237, 216, 37, 216, + 3, 218, 150, 64, 232, 245, 219, 172, 64, 235, 138, 230, 111, 242, 131, + 244, 198, 242, 131, 244, 199, 2, 219, 76, 245, 21, 244, 199, 2, 217, 15, + 64, 235, 59, 219, 76, 244, 199, 2, 204, 230, 115, 219, 76, 244, 199, 2, + 204, 230, 116, 22, 219, 76, 245, 21, 219, 76, 244, 199, 2, 204, 230, 116, + 22, 249, 238, 217, 248, 219, 76, 244, 199, 2, 204, 230, 116, 22, 216, + 105, 245, 21, 219, 76, 244, 199, 2, 242, 32, 219, 76, 244, 199, 2, 240, + 254, 211, 233, 244, 198, 219, 76, 244, 199, 2, 219, 76, 245, 21, 244, + 199, 221, 219, 248, 70, 244, 41, 223, 91, 244, 198, 219, 76, 244, 199, 2, + 241, 233, 245, 21, 219, 76, 244, 199, 2, 218, 35, 219, 75, 244, 198, 229, + 92, 244, 198, 245, 31, 244, 198, 214, 188, 244, 198, 244, 199, 2, 249, + 238, 217, 248, 225, 195, 244, 198, 249, 209, 244, 198, 249, 210, 244, + 198, 234, 68, 244, 198, 244, 199, 216, 138, 116, 234, 69, 234, 68, 244, + 199, 2, 219, 76, 245, 21, 234, 68, 244, 199, 2, 250, 8, 245, 21, 244, + 199, 2, 218, 89, 216, 20, 244, 199, 2, 218, 89, 216, 21, 22, 211, 233, + 245, 23, 244, 199, 2, 218, 89, 216, 21, 22, 216, 105, 245, 21, 247, 200, + 244, 198, 211, 204, 244, 198, 254, 116, 244, 198, 224, 230, 244, 198, + 249, 124, 244, 198, 225, 173, 244, 198, 244, 199, 2, 232, 132, 64, 215, + 205, 247, 200, 251, 96, 223, 91, 244, 198, 243, 247, 244, 199, 2, 204, + 230, 115, 254, 114, 244, 198, 244, 160, 244, 198, 212, 20, 244, 198, 219, + 93, 244, 198, 216, 72, 244, 198, 242, 132, 244, 198, 232, 120, 249, 124, + 244, 198, 244, 199, 2, 204, 230, 115, 240, 210, 244, 198, 244, 199, 2, + 204, 230, 116, 22, 249, 238, 217, 248, 244, 199, 221, 192, 236, 7, 244, + 161, 253, 221, 244, 198, 244, 57, 244, 198, 219, 94, 244, 198, 247, 173, + 244, 198, 244, 199, 211, 230, 230, 115, 244, 199, 2, 231, 89, 231, 149, + 242, 131, 250, 233, 244, 199, 2, 219, 76, 245, 21, 250, 233, 244, 199, 2, + 217, 15, 64, 235, 59, 219, 76, 250, 233, 244, 199, 2, 204, 230, 115, 219, + 76, 250, 233, 244, 199, 2, 241, 233, 245, 21, 250, 233, 244, 199, 2, 211, + 196, 219, 77, 234, 68, 250, 233, 244, 199, 2, 250, 8, 245, 21, 224, 230, + 250, 233, 244, 198, 249, 124, 250, 233, 244, 198, 212, 20, 250, 233, 244, + 198, 244, 199, 2, 228, 80, 242, 170, 243, 41, 244, 199, 2, 226, 219, 243, + 41, 225, 171, 251, 176, 248, 83, 221, 171, 230, 150, 241, 236, 230, 150, + 219, 10, 230, 150, 242, 12, 225, 171, 223, 159, 123, 242, 22, 225, 171, + 223, 159, 251, 186, 242, 18, 236, 7, 250, 187, 225, 171, 243, 246, 225, + 171, 2, 224, 230, 244, 198, 225, 171, 2, 244, 49, 242, 17, 222, 205, 241, + 221, 218, 145, 232, 155, 223, 165, 250, 252, 241, 169, 215, 249, 241, + 169, 215, 250, 2, 251, 122, 228, 58, 215, 249, 231, 37, 193, 223, 166, + 218, 151, 215, 247, 215, 248, 250, 252, 251, 100, 226, 198, 251, 100, + 215, 202, 251, 101, 218, 131, 230, 192, 254, 138, 244, 105, 245, 145, + 225, 2, 250, 252, 226, 198, 225, 2, 250, 252, 217, 33, 226, 198, 217, 33, + 253, 188, 226, 198, 253, 188, 223, 121, 213, 247, 248, 66, 215, 193, 253, + 250, 232, 123, 215, 255, 230, 144, 230, 121, 223, 164, 218, 7, 223, 164, + 230, 121, 251, 36, 254, 238, 215, 246, 220, 18, 222, 184, 219, 3, 203, + 215, 253, 232, 236, 67, 215, 253, 232, 236, 249, 198, 50, 225, 2, 250, + 237, 223, 47, 232, 236, 215, 223, 244, 82, 226, 201, 224, 241, 247, 131, + 228, 80, 245, 133, 50, 219, 74, 87, 228, 80, 219, 74, 87, 224, 125, 232, + 199, 236, 7, 235, 163, 225, 44, 87, 247, 154, 228, 57, 232, 199, 87, 224, + 235, 212, 41, 87, 228, 71, 212, 41, 87, 252, 10, 228, 80, 252, 9, 252, 8, + 230, 121, 252, 8, 225, 216, 228, 80, 225, 215, 250, 108, 249, 132, 231, + 61, 87, 211, 218, 87, 223, 62, 252, 195, 87, 216, 38, 212, 41, 250, 5, + 219, 236, 252, 126, 252, 124, 225, 246, 249, 185, 249, 94, 252, 177, 250, + 30, 43, 232, 95, 108, 16, 31, 224, 6, 108, 16, 31, 254, 201, 108, 16, 31, + 244, 104, 108, 16, 31, 245, 231, 108, 16, 31, 212, 40, 108, 16, 31, 254, + 51, 108, 16, 31, 254, 52, 223, 108, 108, 16, 31, 254, 52, 223, 107, 108, + 16, 31, 254, 52, 213, 143, 108, 16, 31, 254, 52, 213, 142, 108, 16, 31, 213, 157, 108, 16, 31, 213, 156, 108, 16, 31, 213, 155, 108, 16, 31, 218, - 45, 108, 16, 31, 225, 126, 218, 45, 108, 16, 31, 85, 218, 45, 108, 16, - 31, 231, 56, 218, 72, 108, 16, 31, 231, 56, 218, 71, 108, 16, 31, 231, - 56, 218, 70, 108, 16, 31, 250, 39, 108, 16, 31, 222, 2, 108, 16, 31, 228, - 189, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 205, - 222, 2, 108, 16, 31, 222, 205, 222, 1, 108, 16, 31, 242, 167, 108, 16, - 31, 219, 167, 108, 16, 31, 235, 178, 226, 154, 108, 16, 31, 235, 178, - 226, 153, 108, 16, 31, 249, 135, 64, 235, 177, 108, 16, 31, 223, 102, 64, - 235, 177, 108, 16, 31, 249, 169, 226, 154, 108, 16, 31, 235, 176, 226, - 154, 108, 16, 31, 218, 73, 64, 249, 168, 108, 16, 31, 249, 135, 64, 249, - 168, 108, 16, 31, 249, 135, 64, 249, 167, 108, 16, 31, 249, 169, 254, 84, - 108, 16, 31, 222, 3, 64, 249, 169, 254, 84, 108, 16, 31, 218, 73, 64, - 222, 3, 64, 249, 168, 108, 16, 31, 213, 243, 108, 16, 31, 216, 85, 226, - 154, 108, 16, 31, 233, 58, 226, 154, 108, 16, 31, 254, 83, 226, 154, 108, - 16, 31, 218, 73, 64, 254, 82, 108, 16, 31, 222, 3, 64, 254, 82, 108, 16, - 31, 218, 73, 64, 222, 3, 64, 254, 82, 108, 16, 31, 213, 158, 64, 254, 82, - 108, 16, 31, 223, 102, 64, 254, 82, 108, 16, 31, 223, 102, 64, 254, 81, - 108, 16, 31, 223, 101, 108, 16, 31, 223, 100, 108, 16, 31, 223, 99, 108, - 16, 31, 223, 98, 108, 16, 31, 254, 158, 108, 16, 31, 254, 157, 108, 16, - 31, 231, 164, 108, 16, 31, 222, 8, 108, 16, 31, 253, 247, 108, 16, 31, - 223, 126, 108, 16, 31, 223, 125, 108, 16, 31, 253, 184, 108, 16, 31, 251, - 230, 226, 154, 108, 16, 31, 217, 50, 108, 16, 31, 217, 49, 108, 16, 31, - 224, 9, 232, 223, 108, 16, 31, 251, 184, 108, 16, 31, 251, 183, 108, 16, - 31, 251, 182, 108, 16, 31, 254, 139, 108, 16, 31, 226, 219, 108, 16, 31, - 218, 249, 108, 16, 31, 216, 83, 108, 16, 31, 242, 97, 108, 16, 31, 212, - 28, 108, 16, 31, 224, 227, 108, 16, 31, 251, 15, 108, 16, 31, 215, 86, - 108, 16, 31, 250, 247, 230, 123, 108, 16, 31, 221, 203, 64, 235, 56, 108, - 16, 31, 251, 26, 108, 16, 31, 215, 220, 108, 16, 31, 218, 155, 215, 220, - 108, 16, 31, 232, 149, 108, 16, 31, 219, 57, 108, 16, 31, 214, 142, 108, - 16, 31, 240, 247, 246, 65, 108, 16, 31, 253, 228, 108, 16, 31, 224, 235, - 253, 228, 108, 16, 31, 251, 143, 108, 16, 31, 224, 226, 251, 143, 108, - 16, 31, 254, 136, 108, 16, 31, 218, 118, 218, 27, 218, 117, 108, 16, 31, - 218, 118, 218, 27, 218, 116, 108, 16, 31, 218, 69, 108, 16, 31, 224, 201, - 108, 16, 31, 247, 182, 108, 16, 31, 247, 184, 108, 16, 31, 247, 183, 108, - 16, 31, 224, 132, 108, 16, 31, 224, 121, 108, 16, 31, 249, 123, 108, 16, - 31, 249, 122, 108, 16, 31, 249, 121, 108, 16, 31, 249, 120, 108, 16, 31, - 249, 119, 108, 16, 31, 254, 170, 108, 16, 31, 252, 120, 64, 231, 150, - 108, 16, 31, 252, 120, 64, 214, 17, 108, 16, 31, 223, 58, 108, 16, 31, - 240, 239, 108, 16, 31, 228, 213, 108, 16, 31, 248, 146, 108, 16, 31, 230, - 135, 108, 16, 31, 163, 246, 95, 108, 16, 31, 163, 226, 133, 9, 14, 240, - 103, 9, 14, 240, 102, 9, 14, 240, 101, 9, 14, 240, 100, 9, 14, 240, 99, - 9, 14, 240, 98, 9, 14, 240, 97, 9, 14, 240, 96, 9, 14, 240, 95, 9, 14, - 240, 94, 9, 14, 240, 93, 9, 14, 240, 92, 9, 14, 240, 91, 9, 14, 240, 90, - 9, 14, 240, 89, 9, 14, 240, 88, 9, 14, 240, 87, 9, 14, 240, 86, 9, 14, - 240, 85, 9, 14, 240, 84, 9, 14, 240, 83, 9, 14, 240, 82, 9, 14, 240, 81, - 9, 14, 240, 80, 9, 14, 240, 79, 9, 14, 240, 78, 9, 14, 240, 77, 9, 14, - 240, 76, 9, 14, 240, 75, 9, 14, 240, 74, 9, 14, 240, 73, 9, 14, 240, 72, - 9, 14, 240, 71, 9, 14, 240, 70, 9, 14, 240, 69, 9, 14, 240, 68, 9, 14, - 240, 67, 9, 14, 240, 66, 9, 14, 240, 65, 9, 14, 240, 64, 9, 14, 240, 63, - 9, 14, 240, 62, 9, 14, 240, 61, 9, 14, 240, 60, 9, 14, 240, 59, 9, 14, - 240, 58, 9, 14, 240, 57, 9, 14, 240, 56, 9, 14, 240, 55, 9, 14, 240, 54, - 9, 14, 240, 53, 9, 14, 240, 52, 9, 14, 240, 51, 9, 14, 240, 50, 9, 14, - 240, 49, 9, 14, 240, 48, 9, 14, 240, 47, 9, 14, 240, 46, 9, 14, 240, 45, - 9, 14, 240, 44, 9, 14, 240, 43, 9, 14, 240, 42, 9, 14, 240, 41, 9, 14, - 240, 40, 9, 14, 240, 39, 9, 14, 240, 38, 9, 14, 240, 37, 9, 14, 240, 36, - 9, 14, 240, 35, 9, 14, 240, 34, 9, 14, 240, 33, 9, 14, 240, 32, 9, 14, - 240, 31, 9, 14, 240, 30, 9, 14, 240, 29, 9, 14, 240, 28, 9, 14, 240, 27, - 9, 14, 240, 26, 9, 14, 240, 25, 9, 14, 240, 24, 9, 14, 240, 23, 9, 14, - 240, 22, 9, 14, 240, 21, 9, 14, 240, 20, 9, 14, 240, 19, 9, 14, 240, 18, - 9, 14, 240, 17, 9, 14, 240, 16, 9, 14, 240, 15, 9, 14, 240, 14, 9, 14, - 240, 13, 9, 14, 240, 12, 9, 14, 240, 11, 9, 14, 240, 10, 9, 14, 240, 9, - 9, 14, 240, 8, 9, 14, 240, 7, 9, 14, 240, 6, 9, 14, 240, 5, 9, 14, 240, - 4, 9, 14, 240, 3, 9, 14, 240, 2, 9, 14, 240, 1, 9, 14, 240, 0, 9, 14, - 239, 255, 9, 14, 239, 254, 9, 14, 239, 253, 9, 14, 239, 252, 9, 14, 239, - 251, 9, 14, 239, 250, 9, 14, 239, 249, 9, 14, 239, 248, 9, 14, 239, 247, - 9, 14, 239, 246, 9, 14, 239, 245, 9, 14, 239, 244, 9, 14, 239, 243, 9, - 14, 239, 242, 9, 14, 239, 241, 9, 14, 239, 240, 9, 14, 239, 239, 9, 14, - 239, 238, 9, 14, 239, 237, 9, 14, 239, 236, 9, 14, 239, 235, 9, 14, 239, - 234, 9, 14, 239, 233, 9, 14, 239, 232, 9, 14, 239, 231, 9, 14, 239, 230, - 9, 14, 239, 229, 9, 14, 239, 228, 9, 14, 239, 227, 9, 14, 239, 226, 9, - 14, 239, 225, 9, 14, 239, 224, 9, 14, 239, 223, 9, 14, 239, 222, 9, 14, - 239, 221, 9, 14, 239, 220, 9, 14, 239, 219, 9, 14, 239, 218, 9, 14, 239, - 217, 9, 14, 239, 216, 9, 14, 239, 215, 9, 14, 239, 214, 9, 14, 239, 213, - 9, 14, 239, 212, 9, 14, 239, 211, 9, 14, 239, 210, 9, 14, 239, 209, 9, - 14, 239, 208, 9, 14, 239, 207, 9, 14, 239, 206, 9, 14, 239, 205, 9, 14, - 239, 204, 9, 14, 239, 203, 9, 14, 239, 202, 9, 14, 239, 201, 9, 14, 239, - 200, 9, 14, 239, 199, 9, 14, 239, 198, 9, 14, 239, 197, 9, 14, 239, 196, - 9, 14, 239, 195, 9, 14, 239, 194, 9, 14, 239, 193, 9, 14, 239, 192, 9, - 14, 239, 191, 9, 14, 239, 190, 9, 14, 239, 189, 9, 14, 239, 188, 9, 14, - 239, 187, 9, 14, 239, 186, 9, 14, 239, 185, 9, 14, 239, 184, 9, 14, 239, - 183, 9, 14, 239, 182, 9, 14, 239, 181, 9, 14, 239, 180, 9, 14, 239, 179, - 9, 14, 239, 178, 9, 14, 239, 177, 9, 14, 239, 176, 9, 14, 239, 175, 9, - 14, 239, 174, 9, 14, 239, 173, 9, 14, 239, 172, 9, 14, 239, 171, 9, 14, - 239, 170, 9, 14, 239, 169, 9, 14, 239, 168, 9, 14, 239, 167, 9, 14, 239, - 166, 9, 14, 239, 165, 9, 14, 239, 164, 9, 14, 239, 163, 9, 14, 239, 162, - 9, 14, 239, 161, 9, 14, 239, 160, 9, 14, 239, 159, 9, 14, 239, 158, 9, - 14, 239, 157, 9, 14, 239, 156, 9, 14, 239, 155, 9, 14, 239, 154, 9, 14, - 239, 153, 9, 14, 239, 152, 9, 14, 239, 151, 9, 14, 239, 150, 9, 14, 239, - 149, 9, 14, 239, 148, 9, 14, 239, 147, 9, 14, 239, 146, 9, 14, 239, 145, - 9, 14, 239, 144, 9, 14, 239, 143, 9, 14, 239, 142, 9, 14, 239, 141, 9, - 14, 239, 140, 9, 14, 239, 139, 9, 14, 239, 138, 9, 14, 239, 137, 9, 14, - 239, 136, 9, 14, 239, 135, 9, 14, 239, 134, 9, 14, 239, 133, 9, 14, 239, - 132, 9, 14, 239, 131, 9, 14, 239, 130, 9, 14, 239, 129, 9, 14, 239, 128, - 9, 14, 239, 127, 9, 14, 239, 126, 9, 14, 239, 125, 9, 14, 239, 124, 9, - 14, 239, 123, 9, 14, 239, 122, 9, 14, 239, 121, 9, 14, 239, 120, 9, 14, - 239, 119, 9, 14, 239, 118, 9, 14, 239, 117, 9, 14, 239, 116, 9, 14, 239, - 115, 9, 14, 239, 114, 9, 14, 239, 113, 9, 14, 239, 112, 9, 14, 239, 111, - 9, 14, 239, 110, 9, 14, 239, 109, 9, 14, 239, 108, 9, 14, 239, 107, 9, - 14, 239, 106, 9, 14, 239, 105, 9, 14, 239, 104, 9, 14, 239, 103, 9, 14, - 239, 102, 9, 14, 239, 101, 9, 14, 239, 100, 9, 14, 239, 99, 9, 14, 239, - 98, 9, 14, 239, 97, 9, 14, 239, 96, 9, 14, 239, 95, 9, 14, 239, 94, 9, - 14, 239, 93, 9, 14, 239, 92, 9, 14, 239, 91, 9, 14, 239, 90, 9, 14, 239, - 89, 9, 14, 239, 88, 9, 14, 239, 87, 9, 14, 239, 86, 9, 14, 239, 85, 9, - 14, 239, 84, 9, 14, 239, 83, 9, 14, 239, 82, 9, 14, 239, 81, 9, 14, 239, - 80, 9, 14, 239, 79, 9, 14, 239, 78, 9, 14, 239, 77, 9, 14, 239, 76, 9, - 14, 239, 75, 9, 14, 239, 74, 9, 14, 239, 73, 9, 14, 239, 72, 9, 14, 239, - 71, 9, 14, 239, 70, 9, 14, 239, 69, 9, 14, 239, 68, 9, 14, 239, 67, 9, - 14, 239, 66, 9, 14, 239, 65, 9, 14, 239, 64, 9, 14, 239, 63, 9, 14, 239, - 62, 9, 14, 239, 61, 9, 14, 239, 60, 9, 14, 239, 59, 9, 14, 239, 58, 9, - 14, 239, 57, 9, 14, 239, 56, 9, 14, 239, 55, 9, 14, 239, 54, 9, 14, 239, - 53, 9, 14, 239, 52, 9, 14, 239, 51, 9, 14, 239, 50, 9, 14, 239, 49, 9, - 14, 239, 48, 9, 14, 239, 47, 9, 14, 239, 46, 9, 14, 239, 45, 9, 14, 239, - 44, 9, 14, 239, 43, 9, 14, 239, 42, 9, 14, 239, 41, 9, 14, 239, 40, 9, - 14, 239, 39, 9, 14, 239, 38, 9, 14, 239, 37, 9, 14, 239, 36, 9, 14, 239, - 35, 9, 14, 239, 34, 9, 14, 239, 33, 9, 14, 239, 32, 9, 14, 239, 31, 9, - 14, 239, 30, 9, 14, 239, 29, 9, 14, 239, 28, 9, 14, 239, 27, 9, 14, 239, - 26, 9, 14, 239, 25, 9, 14, 239, 24, 9, 14, 239, 23, 9, 14, 239, 22, 9, - 14, 239, 21, 9, 14, 239, 20, 9, 14, 239, 19, 9, 14, 239, 18, 9, 14, 239, - 17, 9, 14, 239, 16, 9, 14, 239, 15, 9, 14, 239, 14, 9, 14, 239, 13, 9, - 14, 239, 12, 9, 14, 239, 11, 9, 14, 239, 10, 9, 14, 239, 9, 9, 14, 239, - 8, 9, 14, 239, 7, 9, 14, 239, 6, 9, 14, 239, 5, 9, 14, 239, 4, 9, 14, - 239, 3, 9, 14, 239, 2, 9, 14, 239, 1, 9, 14, 239, 0, 9, 14, 238, 255, 9, - 14, 238, 254, 9, 14, 238, 253, 9, 14, 238, 252, 9, 14, 238, 251, 9, 14, - 238, 250, 9, 14, 238, 249, 9, 14, 238, 248, 9, 14, 238, 247, 9, 14, 238, - 246, 9, 14, 238, 245, 9, 14, 238, 244, 9, 14, 238, 243, 9, 14, 238, 242, - 9, 14, 238, 241, 9, 14, 238, 240, 9, 14, 238, 239, 9, 14, 238, 238, 9, - 14, 238, 237, 9, 14, 238, 236, 9, 14, 238, 235, 9, 14, 238, 234, 9, 14, - 238, 233, 9, 14, 238, 232, 9, 14, 238, 231, 9, 14, 238, 230, 9, 14, 238, - 229, 9, 14, 238, 228, 9, 14, 238, 227, 9, 14, 238, 226, 9, 14, 238, 225, - 9, 14, 238, 224, 9, 14, 238, 223, 9, 14, 238, 222, 9, 14, 238, 221, 9, - 14, 238, 220, 9, 14, 238, 219, 9, 14, 238, 218, 9, 14, 238, 217, 9, 14, - 238, 216, 9, 14, 238, 215, 9, 14, 238, 214, 9, 14, 238, 213, 9, 14, 238, - 212, 9, 14, 238, 211, 9, 14, 238, 210, 9, 14, 238, 209, 9, 14, 238, 208, - 9, 14, 238, 207, 9, 14, 238, 206, 9, 14, 238, 205, 9, 14, 238, 204, 9, - 14, 238, 203, 9, 14, 238, 202, 9, 14, 238, 201, 9, 14, 238, 200, 9, 14, - 238, 199, 9, 14, 238, 198, 9, 14, 238, 197, 9, 14, 238, 196, 9, 14, 238, - 195, 9, 14, 238, 194, 9, 14, 238, 193, 9, 14, 238, 192, 9, 14, 238, 191, - 9, 14, 238, 190, 9, 14, 238, 189, 9, 14, 238, 188, 9, 14, 238, 187, 9, - 14, 238, 186, 9, 14, 238, 185, 9, 14, 238, 184, 9, 14, 238, 183, 9, 14, - 238, 182, 9, 14, 238, 181, 9, 14, 238, 180, 9, 14, 238, 179, 9, 14, 238, - 178, 9, 14, 238, 177, 9, 14, 238, 176, 9, 14, 238, 175, 9, 14, 238, 174, - 9, 14, 238, 173, 9, 14, 238, 172, 9, 14, 238, 171, 9, 14, 238, 170, 9, - 14, 238, 169, 9, 14, 238, 168, 9, 14, 238, 167, 9, 14, 238, 166, 9, 14, - 238, 165, 9, 14, 238, 164, 9, 14, 238, 163, 9, 14, 238, 162, 9, 14, 238, - 161, 9, 14, 238, 160, 9, 14, 238, 159, 9, 14, 238, 158, 9, 14, 238, 157, - 9, 14, 238, 156, 9, 14, 238, 155, 9, 14, 238, 154, 9, 14, 238, 153, 9, - 14, 238, 152, 9, 14, 238, 151, 9, 14, 238, 150, 9, 14, 238, 149, 9, 14, - 238, 148, 9, 14, 238, 147, 9, 14, 238, 146, 9, 14, 238, 145, 9, 14, 238, - 144, 9, 14, 238, 143, 9, 14, 238, 142, 9, 14, 238, 141, 9, 14, 238, 140, - 9, 14, 238, 139, 9, 14, 238, 138, 9, 14, 238, 137, 9, 14, 238, 136, 9, - 14, 238, 135, 9, 14, 238, 134, 9, 14, 238, 133, 9, 14, 238, 132, 9, 14, - 238, 131, 9, 14, 238, 130, 9, 14, 238, 129, 9, 14, 238, 128, 9, 14, 238, - 127, 9, 14, 238, 126, 9, 14, 238, 125, 9, 14, 238, 124, 9, 14, 238, 123, - 9, 14, 238, 122, 9, 14, 238, 121, 9, 14, 238, 120, 9, 14, 238, 119, 9, - 14, 238, 118, 9, 14, 238, 117, 9, 14, 238, 116, 9, 14, 238, 115, 9, 14, - 238, 114, 9, 14, 238, 113, 9, 14, 238, 112, 9, 14, 238, 111, 9, 14, 238, - 110, 9, 14, 238, 109, 9, 14, 238, 108, 9, 14, 238, 107, 9, 14, 238, 106, - 9, 14, 238, 105, 9, 14, 238, 104, 9, 14, 238, 103, 9, 14, 238, 102, 9, - 14, 238, 101, 9, 14, 238, 100, 9, 14, 238, 99, 9, 14, 238, 98, 9, 14, - 238, 97, 9, 14, 238, 96, 9, 14, 238, 95, 9, 14, 238, 94, 9, 14, 238, 93, - 9, 14, 238, 92, 9, 14, 238, 91, 9, 14, 238, 90, 9, 14, 238, 89, 9, 14, - 238, 88, 9, 14, 238, 87, 9, 14, 238, 86, 9, 14, 238, 85, 9, 14, 238, 84, - 9, 14, 238, 83, 9, 14, 238, 82, 9, 14, 238, 81, 9, 14, 238, 80, 9, 14, - 238, 79, 9, 14, 238, 78, 9, 14, 238, 77, 9, 14, 238, 76, 9, 14, 238, 75, - 9, 14, 238, 74, 233, 91, 217, 85, 129, 219, 19, 129, 245, 32, 78, 129, - 223, 255, 78, 129, 54, 50, 129, 247, 133, 50, 129, 225, 183, 50, 129, - 254, 127, 129, 254, 58, 129, 43, 226, 4, 129, 44, 226, 4, 129, 253, 217, - 129, 96, 50, 129, 249, 220, 129, 240, 168, 129, 243, 230, 218, 130, 129, - 219, 47, 129, 21, 210, 86, 129, 21, 110, 129, 21, 105, 129, 21, 158, 129, - 21, 161, 129, 21, 189, 129, 21, 194, 129, 21, 198, 129, 21, 195, 129, 21, - 200, 129, 249, 227, 129, 220, 151, 129, 233, 16, 50, 129, 245, 99, 50, - 129, 242, 131, 50, 129, 224, 14, 78, 129, 249, 218, 253, 207, 129, 7, 6, - 1, 61, 129, 7, 6, 1, 253, 159, 129, 7, 6, 1, 251, 67, 129, 7, 6, 1, 249, - 61, 129, 7, 6, 1, 75, 129, 7, 6, 1, 245, 7, 129, 7, 6, 1, 243, 203, 129, - 7, 6, 1, 242, 61, 129, 7, 6, 1, 73, 129, 7, 6, 1, 235, 145, 129, 7, 6, 1, - 235, 24, 129, 7, 6, 1, 156, 129, 7, 6, 1, 193, 129, 7, 6, 1, 230, 26, - 129, 7, 6, 1, 76, 129, 7, 6, 1, 226, 106, 129, 7, 6, 1, 224, 97, 129, 7, - 6, 1, 153, 129, 7, 6, 1, 222, 92, 129, 7, 6, 1, 217, 153, 129, 7, 6, 1, - 70, 129, 7, 6, 1, 214, 105, 129, 7, 6, 1, 212, 98, 129, 7, 6, 1, 211, - 178, 129, 7, 6, 1, 211, 117, 129, 7, 6, 1, 210, 159, 129, 43, 42, 127, - 129, 223, 51, 219, 47, 129, 44, 42, 127, 129, 250, 32, 255, 15, 129, 121, - 232, 214, 129, 242, 138, 255, 15, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253, - 159, 129, 7, 4, 1, 251, 67, 129, 7, 4, 1, 249, 61, 129, 7, 4, 1, 75, 129, - 7, 4, 1, 245, 7, 129, 7, 4, 1, 243, 203, 129, 7, 4, 1, 242, 61, 129, 7, - 4, 1, 73, 129, 7, 4, 1, 235, 145, 129, 7, 4, 1, 235, 24, 129, 7, 4, 1, - 156, 129, 7, 4, 1, 193, 129, 7, 4, 1, 230, 26, 129, 7, 4, 1, 76, 129, 7, - 4, 1, 226, 106, 129, 7, 4, 1, 224, 97, 129, 7, 4, 1, 153, 129, 7, 4, 1, - 222, 92, 129, 7, 4, 1, 217, 153, 129, 7, 4, 1, 70, 129, 7, 4, 1, 214, - 105, 129, 7, 4, 1, 212, 98, 129, 7, 4, 1, 211, 178, 129, 7, 4, 1, 211, - 117, 129, 7, 4, 1, 210, 159, 129, 43, 249, 100, 127, 129, 67, 232, 214, - 129, 44, 249, 100, 127, 129, 183, 251, 7, 217, 85, 45, 221, 79, 45, 221, - 68, 45, 221, 57, 45, 221, 45, 45, 221, 34, 45, 221, 23, 45, 221, 12, 45, - 221, 1, 45, 220, 246, 45, 220, 238, 45, 220, 237, 45, 220, 236, 45, 220, - 235, 45, 220, 233, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220, + 45, 108, 16, 31, 225, 128, 218, 45, 108, 16, 31, 85, 218, 45, 108, 16, + 31, 231, 60, 218, 72, 108, 16, 31, 231, 60, 218, 71, 108, 16, 31, 231, + 60, 218, 70, 108, 16, 31, 250, 46, 108, 16, 31, 222, 3, 108, 16, 31, 228, + 193, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 206, + 222, 3, 108, 16, 31, 222, 206, 222, 2, 108, 16, 31, 242, 173, 108, 16, + 31, 219, 168, 108, 16, 31, 235, 184, 226, 157, 108, 16, 31, 235, 184, + 226, 156, 108, 16, 31, 249, 142, 64, 235, 183, 108, 16, 31, 223, 104, 64, + 235, 183, 108, 16, 31, 249, 176, 226, 157, 108, 16, 31, 235, 182, 226, + 157, 108, 16, 31, 218, 73, 64, 249, 175, 108, 16, 31, 249, 142, 64, 249, + 175, 108, 16, 31, 249, 142, 64, 249, 174, 108, 16, 31, 249, 176, 254, 91, + 108, 16, 31, 222, 4, 64, 249, 176, 254, 91, 108, 16, 31, 218, 73, 64, + 222, 4, 64, 249, 175, 108, 16, 31, 213, 243, 108, 16, 31, 216, 85, 226, + 157, 108, 16, 31, 233, 63, 226, 157, 108, 16, 31, 254, 90, 226, 157, 108, + 16, 31, 218, 73, 64, 254, 89, 108, 16, 31, 222, 4, 64, 254, 89, 108, 16, + 31, 218, 73, 64, 222, 4, 64, 254, 89, 108, 16, 31, 213, 158, 64, 254, 89, + 108, 16, 31, 223, 104, 64, 254, 89, 108, 16, 31, 223, 104, 64, 254, 88, + 108, 16, 31, 223, 103, 108, 16, 31, 223, 102, 108, 16, 31, 223, 101, 108, + 16, 31, 223, 100, 108, 16, 31, 254, 166, 108, 16, 31, 254, 165, 108, 16, + 31, 231, 168, 108, 16, 31, 222, 9, 108, 16, 31, 253, 254, 108, 16, 31, + 223, 128, 108, 16, 31, 223, 127, 108, 16, 31, 253, 191, 108, 16, 31, 251, + 237, 226, 157, 108, 16, 31, 217, 50, 108, 16, 31, 217, 49, 108, 16, 31, + 224, 11, 232, 228, 108, 16, 31, 251, 191, 108, 16, 31, 251, 190, 108, 16, + 31, 251, 189, 108, 16, 31, 254, 146, 108, 16, 31, 226, 222, 108, 16, 31, + 218, 250, 108, 16, 31, 216, 83, 108, 16, 31, 242, 103, 108, 16, 31, 212, + 28, 108, 16, 31, 224, 229, 108, 16, 31, 251, 22, 108, 16, 31, 215, 86, + 108, 16, 31, 250, 254, 230, 127, 108, 16, 31, 221, 204, 64, 235, 61, 108, + 16, 31, 251, 33, 108, 16, 31, 215, 220, 108, 16, 31, 218, 156, 215, 220, + 108, 16, 31, 232, 154, 108, 16, 31, 219, 58, 108, 16, 31, 214, 142, 108, + 16, 31, 240, 253, 246, 72, 108, 16, 31, 253, 235, 108, 16, 31, 224, 237, + 253, 235, 108, 16, 31, 251, 150, 108, 16, 31, 224, 228, 251, 150, 108, + 16, 31, 254, 143, 108, 16, 31, 218, 119, 218, 27, 218, 118, 108, 16, 31, + 218, 119, 218, 27, 218, 117, 108, 16, 31, 218, 69, 108, 16, 31, 224, 203, + 108, 16, 31, 247, 189, 108, 16, 31, 247, 191, 108, 16, 31, 247, 190, 108, + 16, 31, 224, 134, 108, 16, 31, 224, 123, 108, 16, 31, 249, 130, 108, 16, + 31, 249, 129, 108, 16, 31, 249, 128, 108, 16, 31, 249, 127, 108, 16, 31, + 249, 126, 108, 16, 31, 254, 178, 108, 16, 31, 252, 127, 64, 231, 154, + 108, 16, 31, 252, 127, 64, 214, 17, 108, 16, 31, 223, 60, 108, 16, 31, + 240, 245, 108, 16, 31, 228, 217, 108, 16, 31, 248, 153, 108, 16, 31, 230, + 139, 108, 16, 31, 163, 246, 102, 108, 16, 31, 163, 226, 136, 10, 14, 240, + 109, 10, 14, 240, 108, 10, 14, 240, 107, 10, 14, 240, 106, 10, 14, 240, + 105, 10, 14, 240, 104, 10, 14, 240, 103, 10, 14, 240, 102, 10, 14, 240, + 101, 10, 14, 240, 100, 10, 14, 240, 99, 10, 14, 240, 98, 10, 14, 240, 97, + 10, 14, 240, 96, 10, 14, 240, 95, 10, 14, 240, 94, 10, 14, 240, 93, 10, + 14, 240, 92, 10, 14, 240, 91, 10, 14, 240, 90, 10, 14, 240, 89, 10, 14, + 240, 88, 10, 14, 240, 87, 10, 14, 240, 86, 10, 14, 240, 85, 10, 14, 240, + 84, 10, 14, 240, 83, 10, 14, 240, 82, 10, 14, 240, 81, 10, 14, 240, 80, + 10, 14, 240, 79, 10, 14, 240, 78, 10, 14, 240, 77, 10, 14, 240, 76, 10, + 14, 240, 75, 10, 14, 240, 74, 10, 14, 240, 73, 10, 14, 240, 72, 10, 14, + 240, 71, 10, 14, 240, 70, 10, 14, 240, 69, 10, 14, 240, 68, 10, 14, 240, + 67, 10, 14, 240, 66, 10, 14, 240, 65, 10, 14, 240, 64, 10, 14, 240, 63, + 10, 14, 240, 62, 10, 14, 240, 61, 10, 14, 240, 60, 10, 14, 240, 59, 10, + 14, 240, 58, 10, 14, 240, 57, 10, 14, 240, 56, 10, 14, 240, 55, 10, 14, + 240, 54, 10, 14, 240, 53, 10, 14, 240, 52, 10, 14, 240, 51, 10, 14, 240, + 50, 10, 14, 240, 49, 10, 14, 240, 48, 10, 14, 240, 47, 10, 14, 240, 46, + 10, 14, 240, 45, 10, 14, 240, 44, 10, 14, 240, 43, 10, 14, 240, 42, 10, + 14, 240, 41, 10, 14, 240, 40, 10, 14, 240, 39, 10, 14, 240, 38, 10, 14, + 240, 37, 10, 14, 240, 36, 10, 14, 240, 35, 10, 14, 240, 34, 10, 14, 240, + 33, 10, 14, 240, 32, 10, 14, 240, 31, 10, 14, 240, 30, 10, 14, 240, 29, + 10, 14, 240, 28, 10, 14, 240, 27, 10, 14, 240, 26, 10, 14, 240, 25, 10, + 14, 240, 24, 10, 14, 240, 23, 10, 14, 240, 22, 10, 14, 240, 21, 10, 14, + 240, 20, 10, 14, 240, 19, 10, 14, 240, 18, 10, 14, 240, 17, 10, 14, 240, + 16, 10, 14, 240, 15, 10, 14, 240, 14, 10, 14, 240, 13, 10, 14, 240, 12, + 10, 14, 240, 11, 10, 14, 240, 10, 10, 14, 240, 9, 10, 14, 240, 8, 10, 14, + 240, 7, 10, 14, 240, 6, 10, 14, 240, 5, 10, 14, 240, 4, 10, 14, 240, 3, + 10, 14, 240, 2, 10, 14, 240, 1, 10, 14, 240, 0, 10, 14, 239, 255, 10, 14, + 239, 254, 10, 14, 239, 253, 10, 14, 239, 252, 10, 14, 239, 251, 10, 14, + 239, 250, 10, 14, 239, 249, 10, 14, 239, 248, 10, 14, 239, 247, 10, 14, + 239, 246, 10, 14, 239, 245, 10, 14, 239, 244, 10, 14, 239, 243, 10, 14, + 239, 242, 10, 14, 239, 241, 10, 14, 239, 240, 10, 14, 239, 239, 10, 14, + 239, 238, 10, 14, 239, 237, 10, 14, 239, 236, 10, 14, 239, 235, 10, 14, + 239, 234, 10, 14, 239, 233, 10, 14, 239, 232, 10, 14, 239, 231, 10, 14, + 239, 230, 10, 14, 239, 229, 10, 14, 239, 228, 10, 14, 239, 227, 10, 14, + 239, 226, 10, 14, 239, 225, 10, 14, 239, 224, 10, 14, 239, 223, 10, 14, + 239, 222, 10, 14, 239, 221, 10, 14, 239, 220, 10, 14, 239, 219, 10, 14, + 239, 218, 10, 14, 239, 217, 10, 14, 239, 216, 10, 14, 239, 215, 10, 14, + 239, 214, 10, 14, 239, 213, 10, 14, 239, 212, 10, 14, 239, 211, 10, 14, + 239, 210, 10, 14, 239, 209, 10, 14, 239, 208, 10, 14, 239, 207, 10, 14, + 239, 206, 10, 14, 239, 205, 10, 14, 239, 204, 10, 14, 239, 203, 10, 14, + 239, 202, 10, 14, 239, 201, 10, 14, 239, 200, 10, 14, 239, 199, 10, 14, + 239, 198, 10, 14, 239, 197, 10, 14, 239, 196, 10, 14, 239, 195, 10, 14, + 239, 194, 10, 14, 239, 193, 10, 14, 239, 192, 10, 14, 239, 191, 10, 14, + 239, 190, 10, 14, 239, 189, 10, 14, 239, 188, 10, 14, 239, 187, 10, 14, + 239, 186, 10, 14, 239, 185, 10, 14, 239, 184, 10, 14, 239, 183, 10, 14, + 239, 182, 10, 14, 239, 181, 10, 14, 239, 180, 10, 14, 239, 179, 10, 14, + 239, 178, 10, 14, 239, 177, 10, 14, 239, 176, 10, 14, 239, 175, 10, 14, + 239, 174, 10, 14, 239, 173, 10, 14, 239, 172, 10, 14, 239, 171, 10, 14, + 239, 170, 10, 14, 239, 169, 10, 14, 239, 168, 10, 14, 239, 167, 10, 14, + 239, 166, 10, 14, 239, 165, 10, 14, 239, 164, 10, 14, 239, 163, 10, 14, + 239, 162, 10, 14, 239, 161, 10, 14, 239, 160, 10, 14, 239, 159, 10, 14, + 239, 158, 10, 14, 239, 157, 10, 14, 239, 156, 10, 14, 239, 155, 10, 14, + 239, 154, 10, 14, 239, 153, 10, 14, 239, 152, 10, 14, 239, 151, 10, 14, + 239, 150, 10, 14, 239, 149, 10, 14, 239, 148, 10, 14, 239, 147, 10, 14, + 239, 146, 10, 14, 239, 145, 10, 14, 239, 144, 10, 14, 239, 143, 10, 14, + 239, 142, 10, 14, 239, 141, 10, 14, 239, 140, 10, 14, 239, 139, 10, 14, + 239, 138, 10, 14, 239, 137, 10, 14, 239, 136, 10, 14, 239, 135, 10, 14, + 239, 134, 10, 14, 239, 133, 10, 14, 239, 132, 10, 14, 239, 131, 10, 14, + 239, 130, 10, 14, 239, 129, 10, 14, 239, 128, 10, 14, 239, 127, 10, 14, + 239, 126, 10, 14, 239, 125, 10, 14, 239, 124, 10, 14, 239, 123, 10, 14, + 239, 122, 10, 14, 239, 121, 10, 14, 239, 120, 10, 14, 239, 119, 10, 14, + 239, 118, 10, 14, 239, 117, 10, 14, 239, 116, 10, 14, 239, 115, 10, 14, + 239, 114, 10, 14, 239, 113, 10, 14, 239, 112, 10, 14, 239, 111, 10, 14, + 239, 110, 10, 14, 239, 109, 10, 14, 239, 108, 10, 14, 239, 107, 10, 14, + 239, 106, 10, 14, 239, 105, 10, 14, 239, 104, 10, 14, 239, 103, 10, 14, + 239, 102, 10, 14, 239, 101, 10, 14, 239, 100, 10, 14, 239, 99, 10, 14, + 239, 98, 10, 14, 239, 97, 10, 14, 239, 96, 10, 14, 239, 95, 10, 14, 239, + 94, 10, 14, 239, 93, 10, 14, 239, 92, 10, 14, 239, 91, 10, 14, 239, 90, + 10, 14, 239, 89, 10, 14, 239, 88, 10, 14, 239, 87, 10, 14, 239, 86, 10, + 14, 239, 85, 10, 14, 239, 84, 10, 14, 239, 83, 10, 14, 239, 82, 10, 14, + 239, 81, 10, 14, 239, 80, 10, 14, 239, 79, 10, 14, 239, 78, 10, 14, 239, + 77, 10, 14, 239, 76, 10, 14, 239, 75, 10, 14, 239, 74, 10, 14, 239, 73, + 10, 14, 239, 72, 10, 14, 239, 71, 10, 14, 239, 70, 10, 14, 239, 69, 10, + 14, 239, 68, 10, 14, 239, 67, 10, 14, 239, 66, 10, 14, 239, 65, 10, 14, + 239, 64, 10, 14, 239, 63, 10, 14, 239, 62, 10, 14, 239, 61, 10, 14, 239, + 60, 10, 14, 239, 59, 10, 14, 239, 58, 10, 14, 239, 57, 10, 14, 239, 56, + 10, 14, 239, 55, 10, 14, 239, 54, 10, 14, 239, 53, 10, 14, 239, 52, 10, + 14, 239, 51, 10, 14, 239, 50, 10, 14, 239, 49, 10, 14, 239, 48, 10, 14, + 239, 47, 10, 14, 239, 46, 10, 14, 239, 45, 10, 14, 239, 44, 10, 14, 239, + 43, 10, 14, 239, 42, 10, 14, 239, 41, 10, 14, 239, 40, 10, 14, 239, 39, + 10, 14, 239, 38, 10, 14, 239, 37, 10, 14, 239, 36, 10, 14, 239, 35, 10, + 14, 239, 34, 10, 14, 239, 33, 10, 14, 239, 32, 10, 14, 239, 31, 10, 14, + 239, 30, 10, 14, 239, 29, 10, 14, 239, 28, 10, 14, 239, 27, 10, 14, 239, + 26, 10, 14, 239, 25, 10, 14, 239, 24, 10, 14, 239, 23, 10, 14, 239, 22, + 10, 14, 239, 21, 10, 14, 239, 20, 10, 14, 239, 19, 10, 14, 239, 18, 10, + 14, 239, 17, 10, 14, 239, 16, 10, 14, 239, 15, 10, 14, 239, 14, 10, 14, + 239, 13, 10, 14, 239, 12, 10, 14, 239, 11, 10, 14, 239, 10, 10, 14, 239, + 9, 10, 14, 239, 8, 10, 14, 239, 7, 10, 14, 239, 6, 10, 14, 239, 5, 10, + 14, 239, 4, 10, 14, 239, 3, 10, 14, 239, 2, 10, 14, 239, 1, 10, 14, 239, + 0, 10, 14, 238, 255, 10, 14, 238, 254, 10, 14, 238, 253, 10, 14, 238, + 252, 10, 14, 238, 251, 10, 14, 238, 250, 10, 14, 238, 249, 10, 14, 238, + 248, 10, 14, 238, 247, 10, 14, 238, 246, 10, 14, 238, 245, 10, 14, 238, + 244, 10, 14, 238, 243, 10, 14, 238, 242, 10, 14, 238, 241, 10, 14, 238, + 240, 10, 14, 238, 239, 10, 14, 238, 238, 10, 14, 238, 237, 10, 14, 238, + 236, 10, 14, 238, 235, 10, 14, 238, 234, 10, 14, 238, 233, 10, 14, 238, + 232, 10, 14, 238, 231, 10, 14, 238, 230, 10, 14, 238, 229, 10, 14, 238, + 228, 10, 14, 238, 227, 10, 14, 238, 226, 10, 14, 238, 225, 10, 14, 238, + 224, 10, 14, 238, 223, 10, 14, 238, 222, 10, 14, 238, 221, 10, 14, 238, + 220, 10, 14, 238, 219, 10, 14, 238, 218, 10, 14, 238, 217, 10, 14, 238, + 216, 10, 14, 238, 215, 10, 14, 238, 214, 10, 14, 238, 213, 10, 14, 238, + 212, 10, 14, 238, 211, 10, 14, 238, 210, 10, 14, 238, 209, 10, 14, 238, + 208, 10, 14, 238, 207, 10, 14, 238, 206, 10, 14, 238, 205, 10, 14, 238, + 204, 10, 14, 238, 203, 10, 14, 238, 202, 10, 14, 238, 201, 10, 14, 238, + 200, 10, 14, 238, 199, 10, 14, 238, 198, 10, 14, 238, 197, 10, 14, 238, + 196, 10, 14, 238, 195, 10, 14, 238, 194, 10, 14, 238, 193, 10, 14, 238, + 192, 10, 14, 238, 191, 10, 14, 238, 190, 10, 14, 238, 189, 10, 14, 238, + 188, 10, 14, 238, 187, 10, 14, 238, 186, 10, 14, 238, 185, 10, 14, 238, + 184, 10, 14, 238, 183, 10, 14, 238, 182, 10, 14, 238, 181, 10, 14, 238, + 180, 10, 14, 238, 179, 10, 14, 238, 178, 10, 14, 238, 177, 10, 14, 238, + 176, 10, 14, 238, 175, 10, 14, 238, 174, 10, 14, 238, 173, 10, 14, 238, + 172, 10, 14, 238, 171, 10, 14, 238, 170, 10, 14, 238, 169, 10, 14, 238, + 168, 10, 14, 238, 167, 10, 14, 238, 166, 10, 14, 238, 165, 10, 14, 238, + 164, 10, 14, 238, 163, 10, 14, 238, 162, 10, 14, 238, 161, 10, 14, 238, + 160, 10, 14, 238, 159, 10, 14, 238, 158, 10, 14, 238, 157, 10, 14, 238, + 156, 10, 14, 238, 155, 10, 14, 238, 154, 10, 14, 238, 153, 10, 14, 238, + 152, 10, 14, 238, 151, 10, 14, 238, 150, 10, 14, 238, 149, 10, 14, 238, + 148, 10, 14, 238, 147, 10, 14, 238, 146, 10, 14, 238, 145, 10, 14, 238, + 144, 10, 14, 238, 143, 10, 14, 238, 142, 10, 14, 238, 141, 10, 14, 238, + 140, 10, 14, 238, 139, 10, 14, 238, 138, 10, 14, 238, 137, 10, 14, 238, + 136, 10, 14, 238, 135, 10, 14, 238, 134, 10, 14, 238, 133, 10, 14, 238, + 132, 10, 14, 238, 131, 10, 14, 238, 130, 10, 14, 238, 129, 10, 14, 238, + 128, 10, 14, 238, 127, 10, 14, 238, 126, 10, 14, 238, 125, 10, 14, 238, + 124, 10, 14, 238, 123, 10, 14, 238, 122, 10, 14, 238, 121, 10, 14, 238, + 120, 10, 14, 238, 119, 10, 14, 238, 118, 10, 14, 238, 117, 10, 14, 238, + 116, 10, 14, 238, 115, 10, 14, 238, 114, 10, 14, 238, 113, 10, 14, 238, + 112, 10, 14, 238, 111, 10, 14, 238, 110, 10, 14, 238, 109, 10, 14, 238, + 108, 10, 14, 238, 107, 10, 14, 238, 106, 10, 14, 238, 105, 10, 14, 238, + 104, 10, 14, 238, 103, 10, 14, 238, 102, 10, 14, 238, 101, 10, 14, 238, + 100, 10, 14, 238, 99, 10, 14, 238, 98, 10, 14, 238, 97, 10, 14, 238, 96, + 10, 14, 238, 95, 10, 14, 238, 94, 10, 14, 238, 93, 10, 14, 238, 92, 10, + 14, 238, 91, 10, 14, 238, 90, 10, 14, 238, 89, 10, 14, 238, 88, 10, 14, + 238, 87, 10, 14, 238, 86, 10, 14, 238, 85, 10, 14, 238, 84, 10, 14, 238, + 83, 10, 14, 238, 82, 10, 14, 238, 81, 10, 14, 238, 80, 233, 96, 217, 85, + 129, 219, 20, 129, 245, 39, 79, 129, 224, 1, 79, 129, 54, 50, 129, 247, + 140, 50, 129, 225, 185, 50, 129, 254, 134, 129, 254, 65, 129, 43, 226, 7, + 129, 44, 226, 7, 129, 253, 224, 129, 96, 50, 129, 249, 227, 129, 240, + 174, 129, 243, 236, 218, 131, 129, 219, 48, 129, 21, 210, 86, 129, 21, + 111, 129, 21, 105, 129, 21, 158, 129, 21, 161, 129, 21, 190, 129, 21, + 195, 129, 21, 199, 129, 21, 196, 129, 21, 201, 129, 249, 234, 129, 220, + 152, 129, 233, 21, 50, 129, 245, 106, 50, 129, 242, 137, 50, 129, 224, + 16, 79, 129, 249, 225, 253, 214, 129, 7, 6, 1, 61, 129, 7, 6, 1, 253, + 166, 129, 7, 6, 1, 251, 74, 129, 7, 6, 1, 249, 68, 129, 7, 6, 1, 76, 129, + 7, 6, 1, 245, 14, 129, 7, 6, 1, 243, 209, 129, 7, 6, 1, 242, 67, 129, 7, + 6, 1, 74, 129, 7, 6, 1, 235, 150, 129, 7, 6, 1, 235, 29, 129, 7, 6, 1, + 156, 129, 7, 6, 1, 194, 129, 7, 6, 1, 230, 30, 129, 7, 6, 1, 78, 129, 7, + 6, 1, 226, 109, 129, 7, 6, 1, 224, 99, 129, 7, 6, 1, 153, 129, 7, 6, 1, + 222, 93, 129, 7, 6, 1, 217, 153, 129, 7, 6, 1, 69, 129, 7, 6, 1, 214, + 105, 129, 7, 6, 1, 212, 98, 129, 7, 6, 1, 211, 178, 129, 7, 6, 1, 211, + 117, 129, 7, 6, 1, 210, 159, 129, 43, 42, 127, 129, 223, 53, 219, 48, + 129, 44, 42, 127, 129, 250, 39, 255, 23, 129, 121, 232, 219, 129, 242, + 144, 255, 23, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253, 166, 129, 7, 4, 1, + 251, 74, 129, 7, 4, 1, 249, 68, 129, 7, 4, 1, 76, 129, 7, 4, 1, 245, 14, + 129, 7, 4, 1, 243, 209, 129, 7, 4, 1, 242, 67, 129, 7, 4, 1, 74, 129, 7, + 4, 1, 235, 150, 129, 7, 4, 1, 235, 29, 129, 7, 4, 1, 156, 129, 7, 4, 1, + 194, 129, 7, 4, 1, 230, 30, 129, 7, 4, 1, 78, 129, 7, 4, 1, 226, 109, + 129, 7, 4, 1, 224, 99, 129, 7, 4, 1, 153, 129, 7, 4, 1, 222, 93, 129, 7, + 4, 1, 217, 153, 129, 7, 4, 1, 69, 129, 7, 4, 1, 214, 105, 129, 7, 4, 1, + 212, 98, 129, 7, 4, 1, 211, 178, 129, 7, 4, 1, 211, 117, 129, 7, 4, 1, + 210, 159, 129, 43, 249, 107, 127, 129, 67, 232, 219, 129, 44, 249, 107, + 127, 129, 184, 251, 14, 217, 85, 45, 221, 80, 45, 221, 69, 45, 221, 58, + 45, 221, 46, 45, 221, 35, 45, 221, 24, 45, 221, 13, 45, 221, 2, 45, 220, + 247, 45, 220, 239, 45, 220, 238, 45, 220, 237, 45, 220, 236, 45, 220, + 234, 45, 220, 233, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220, 229, 45, 220, 228, 45, 220, 227, 45, 220, 226, 45, 220, 225, 45, 220, - 224, 45, 220, 222, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220, + 223, 45, 220, 222, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220, 218, 45, 220, 217, 45, 220, 216, 45, 220, 215, 45, 220, 214, 45, 220, - 213, 45, 220, 211, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220, + 212, 45, 220, 211, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220, 207, 45, 220, 206, 45, 220, 205, 45, 220, 204, 45, 220, 203, 45, 220, - 202, 45, 220, 200, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220, + 201, 45, 220, 200, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220, 196, 45, 220, 195, 45, 220, 194, 45, 220, 193, 45, 220, 192, 45, 220, - 191, 45, 220, 189, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220, + 190, 45, 220, 189, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220, 185, 45, 220, 184, 45, 220, 183, 45, 220, 182, 45, 220, 181, 45, 220, - 180, 45, 220, 178, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220, + 179, 45, 220, 178, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220, 174, 45, 220, 173, 45, 220, 172, 45, 220, 171, 45, 220, 170, 45, 220, - 169, 45, 220, 167, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220, - 163, 45, 220, 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 220, - 158, 45, 221, 155, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221, + 168, 45, 220, 167, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220, + 163, 45, 220, 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 221, + 156, 45, 221, 155, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221, 151, 45, 221, 150, 45, 221, 149, 45, 221, 148, 45, 221, 147, 45, 221, - 146, 45, 221, 144, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221, + 145, 45, 221, 144, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221, 140, 45, 221, 139, 45, 221, 138, 45, 221, 137, 45, 221, 136, 45, 221, - 135, 45, 221, 133, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221, + 134, 45, 221, 133, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221, 129, 45, 221, 128, 45, 221, 127, 45, 221, 126, 45, 221, 125, 45, 221, - 124, 45, 221, 122, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221, + 123, 45, 221, 122, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221, 118, 45, 221, 117, 45, 221, 116, 45, 221, 115, 45, 221, 114, 45, 221, - 113, 45, 221, 111, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221, + 112, 45, 221, 111, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221, 107, 45, 221, 106, 45, 221, 105, 45, 221, 104, 45, 221, 103, 45, 221, - 102, 45, 221, 100, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96, - 45, 221, 95, 45, 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 91, 45, 221, + 101, 45, 221, 100, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96, + 45, 221, 95, 45, 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 90, 45, 221, 89, 45, 221, 88, 45, 221, 87, 45, 221, 86, 45, 221, 85, 45, 221, 84, 45, - 221, 83, 45, 221, 82, 45, 221, 81, 45, 221, 80, 45, 221, 78, 45, 221, 77, + 221, 83, 45, 221, 82, 45, 221, 81, 45, 221, 79, 45, 221, 78, 45, 221, 77, 45, 221, 76, 45, 221, 75, 45, 221, 74, 45, 221, 73, 45, 221, 72, 45, 221, - 71, 45, 221, 70, 45, 221, 69, 45, 221, 67, 45, 221, 66, 45, 221, 65, 45, + 71, 45, 221, 70, 45, 221, 68, 45, 221, 67, 45, 221, 66, 45, 221, 65, 45, 221, 64, 45, 221, 63, 45, 221, 62, 45, 221, 61, 45, 221, 60, 45, 221, 59, - 45, 221, 58, 45, 221, 56, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221, - 52, 45, 221, 51, 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 47, 45, + 45, 221, 57, 45, 221, 56, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221, + 52, 45, 221, 51, 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 45, 45, 221, 44, 45, 221, 43, 45, 221, 42, 45, 221, 41, 45, 221, 40, 45, 221, 39, - 45, 221, 38, 45, 221, 37, 45, 221, 36, 45, 221, 35, 45, 221, 33, 45, 221, + 45, 221, 38, 45, 221, 37, 45, 221, 36, 45, 221, 34, 45, 221, 33, 45, 221, 32, 45, 221, 31, 45, 221, 30, 45, 221, 29, 45, 221, 28, 45, 221, 27, 45, - 221, 26, 45, 221, 25, 45, 221, 24, 45, 221, 22, 45, 221, 21, 45, 221, 20, + 221, 26, 45, 221, 25, 45, 221, 23, 45, 221, 22, 45, 221, 21, 45, 221, 20, 45, 221, 19, 45, 221, 18, 45, 221, 17, 45, 221, 16, 45, 221, 15, 45, 221, - 14, 45, 221, 13, 45, 221, 11, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45, - 221, 7, 45, 221, 6, 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 2, 45, + 14, 45, 221, 12, 45, 221, 11, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45, + 221, 7, 45, 221, 6, 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 1, 45, 221, 0, 45, 220, 255, 45, 220, 254, 45, 220, 253, 45, 220, 252, 45, 220, - 251, 45, 220, 250, 45, 220, 249, 45, 220, 248, 45, 220, 247, 45, 220, + 251, 45, 220, 250, 45, 220, 249, 45, 220, 248, 45, 220, 246, 45, 220, 245, 45, 220, 244, 45, 220, 243, 45, 220, 242, 45, 220, 241, 45, 220, - 240, 45, 220, 239, 227, 203, 227, 205, 218, 153, 64, 241, 234, 219, 49, - 218, 153, 64, 216, 213, 218, 86, 245, 144, 64, 216, 213, 245, 57, 245, - 144, 64, 215, 244, 245, 110, 245, 133, 245, 134, 255, 8, 255, 9, 254, - 168, 252, 48, 252, 180, 251, 132, 135, 217, 90, 203, 217, 90, 240, 228, - 217, 94, 232, 215, 244, 146, 166, 232, 214, 245, 144, 64, 232, 214, 233, - 1, 228, 136, 245, 113, 232, 215, 217, 90, 67, 217, 90, 212, 118, 244, 21, - 244, 146, 244, 126, 250, 231, 223, 54, 249, 144, 220, 29, 226, 131, 232, - 151, 110, 219, 59, 220, 29, 236, 0, 232, 151, 210, 86, 219, 192, 248, - 152, 232, 205, 245, 78, 247, 156, 248, 32, 249, 179, 110, 248, 142, 248, - 32, 249, 179, 105, 248, 141, 248, 32, 249, 179, 158, 248, 140, 248, 32, - 249, 179, 161, 248, 139, 152, 255, 8, 229, 210, 217, 178, 236, 63, 217, - 181, 245, 144, 64, 215, 245, 251, 214, 245, 63, 251, 6, 251, 8, 245, 144, - 64, 231, 82, 245, 111, 218, 62, 218, 79, 245, 78, 245, 79, 235, 233, 220, - 139, 161, 244, 108, 220, 138, 243, 238, 235, 233, 220, 139, 158, 242, - 122, 220, 138, 242, 119, 235, 233, 220, 139, 105, 223, 122, 220, 138, - 222, 146, 235, 233, 220, 139, 110, 214, 174, 220, 138, 214, 133, 219, 22, - 248, 64, 248, 66, 226, 79, 250, 143, 226, 81, 125, 226, 241, 224, 194, - 241, 48, 251, 151, 225, 174, 241, 204, 251, 162, 228, 76, 251, 151, 241, - 204, 229, 176, 235, 243, 235, 245, 229, 83, 232, 214, 229, 100, 218, 153, - 64, 221, 159, 254, 19, 218, 224, 245, 144, 64, 221, 159, 254, 19, 245, - 81, 135, 217, 91, 220, 128, 203, 217, 91, 220, 128, 240, 225, 135, 217, - 91, 2, 235, 36, 203, 217, 91, 2, 235, 36, 240, 226, 232, 215, 217, 91, - 220, 128, 67, 217, 91, 220, 128, 212, 117, 225, 254, 232, 215, 244, 15, - 225, 254, 232, 215, 246, 107, 225, 33, 225, 254, 232, 215, 252, 179, 225, - 254, 232, 215, 214, 163, 225, 29, 223, 51, 232, 215, 244, 146, 223, 51, - 235, 243, 223, 36, 219, 156, 220, 29, 105, 219, 153, 218, 226, 219, 156, - 220, 29, 158, 219, 152, 218, 225, 248, 32, 249, 179, 218, 106, 248, 138, - 224, 184, 214, 132, 110, 224, 184, 214, 130, 224, 150, 224, 184, 214, - 132, 105, 224, 184, 214, 129, 224, 149, 220, 129, 215, 243, 218, 152, - 218, 90, 251, 7, 250, 143, 250, 210, 231, 44, 212, 59, 230, 44, 218, 153, - 64, 242, 108, 254, 19, 218, 153, 64, 224, 167, 254, 19, 219, 21, 245, - 144, 64, 242, 108, 254, 19, 245, 144, 64, 224, 167, 254, 19, 245, 108, - 218, 153, 64, 218, 106, 219, 36, 219, 156, 242, 142, 135, 235, 196, 220, - 108, 219, 156, 135, 235, 196, 221, 195, 249, 179, 220, 136, 235, 196, - 249, 114, 218, 107, 216, 237, 218, 169, 226, 170, 217, 168, 249, 219, - 226, 143, 224, 185, 231, 43, 225, 20, 254, 54, 224, 179, 249, 219, 254, - 70, 229, 164, 219, 201, 7, 6, 1, 242, 250, 7, 4, 1, 242, 250, 250, 160, - 182, 218, 68, 249, 228, 219, 107, 233, 47, 165, 1, 232, 176, 209, 209, 1, - 244, 45, 244, 37, 209, 209, 1, 244, 45, 244, 158, 209, 209, 1, 222, 212, - 209, 209, 1, 232, 157, 63, 164, 251, 224, 220, 4, 242, 216, 230, 249, - 223, 42, 243, 217, 243, 216, 243, 215, 230, 46, 209, 251, 209, 252, 209, - 254, 232, 103, 222, 220, 232, 104, 222, 221, 225, 224, 232, 102, 222, - 219, 228, 107, 230, 166, 211, 229, 212, 15, 245, 163, 243, 227, 230, 230, - 226, 198, 214, 134, 87, 230, 230, 248, 158, 87, 8, 3, 235, 159, 78, 224, - 195, 244, 21, 31, 67, 44, 71, 233, 21, 127, 213, 118, 213, 7, 212, 195, - 212, 184, 212, 173, 212, 162, 212, 151, 212, 140, 212, 129, 213, 117, - 213, 106, 213, 95, 213, 84, 213, 73, 213, 62, 213, 51, 251, 72, 226, 156, - 78, 251, 197, 209, 253, 49, 28, 16, 243, 237, 219, 103, 250, 74, 214, 9, - 213, 40, 213, 29, 213, 18, 213, 6, 212, 251, 212, 240, 212, 229, 212, - 218, 212, 207, 212, 199, 212, 198, 212, 197, 212, 196, 212, 194, 212, - 193, 212, 192, 212, 191, 212, 190, 212, 189, 212, 188, 212, 187, 212, - 186, 212, 185, 212, 183, 212, 182, 212, 181, 212, 180, 212, 179, 212, - 178, 212, 177, 212, 176, 212, 175, 212, 174, 212, 172, 212, 171, 212, - 170, 212, 169, 212, 168, 212, 167, 212, 166, 212, 165, 212, 164, 212, - 163, 212, 161, 212, 160, 212, 159, 212, 158, 212, 157, 212, 156, 212, - 155, 212, 154, 212, 153, 212, 152, 212, 150, 212, 149, 212, 148, 212, - 147, 212, 146, 212, 145, 212, 144, 212, 143, 212, 142, 212, 141, 212, - 139, 212, 138, 212, 137, 212, 136, 212, 135, 212, 134, 212, 133, 212, - 132, 212, 131, 212, 130, 212, 128, 212, 127, 212, 126, 212, 125, 212, - 124, 212, 123, 212, 122, 212, 121, 212, 120, 212, 119, 213, 116, 213, - 115, 213, 114, 213, 113, 213, 112, 213, 111, 213, 110, 213, 109, 213, - 108, 213, 107, 213, 105, 213, 104, 213, 103, 213, 102, 213, 101, 213, - 100, 213, 99, 213, 98, 213, 97, 213, 96, 213, 94, 213, 93, 213, 92, 213, - 91, 213, 90, 213, 89, 213, 88, 213, 87, 213, 86, 213, 85, 213, 83, 213, - 82, 213, 81, 213, 80, 213, 79, 213, 78, 213, 77, 213, 76, 213, 75, 213, - 74, 213, 72, 213, 71, 213, 70, 213, 69, 213, 68, 213, 67, 213, 66, 213, - 65, 213, 64, 213, 63, 213, 61, 213, 60, 213, 59, 213, 58, 213, 57, 213, - 56, 213, 55, 213, 54, 213, 53, 213, 52, 213, 50, 213, 49, 213, 48, 213, - 47, 213, 46, 213, 45, 213, 44, 213, 43, 213, 42, 213, 41, 213, 39, 213, - 38, 213, 37, 213, 36, 213, 35, 213, 34, 213, 33, 213, 32, 213, 31, 213, - 30, 213, 28, 213, 27, 213, 26, 213, 25, 213, 24, 213, 23, 213, 22, 213, - 21, 213, 20, 213, 19, 213, 17, 213, 16, 213, 15, 213, 14, 213, 13, 213, - 12, 213, 11, 213, 10, 213, 9, 213, 8, 213, 5, 213, 4, 213, 3, 213, 2, - 213, 1, 213, 0, 212, 255, 212, 254, 212, 253, 212, 252, 212, 250, 212, - 249, 212, 248, 212, 247, 212, 246, 212, 245, 212, 244, 212, 243, 212, - 242, 212, 241, 212, 239, 212, 238, 212, 237, 212, 236, 212, 235, 212, - 234, 212, 233, 212, 232, 212, 231, 212, 230, 212, 228, 212, 227, 212, - 226, 212, 225, 212, 224, 212, 223, 212, 222, 212, 221, 212, 220, 212, - 219, 212, 217, 212, 216, 212, 215, 212, 214, 212, 213, 212, 212, 212, - 211, 212, 210, 212, 209, 212, 208, 212, 206, 212, 205, 212, 204, 212, - 203, 212, 202, 212, 201, 212, 200, 7, 6, 1, 115, 2, 231, 234, 22, 242, - 137, 7, 4, 1, 115, 2, 231, 234, 22, 242, 137, 7, 6, 1, 160, 2, 67, 232, - 215, 51, 7, 4, 1, 160, 2, 67, 232, 215, 51, 7, 6, 1, 160, 2, 67, 232, - 215, 252, 44, 22, 242, 137, 7, 4, 1, 160, 2, 67, 232, 215, 252, 44, 22, - 242, 137, 7, 6, 1, 160, 2, 67, 232, 215, 252, 44, 22, 142, 7, 4, 1, 160, - 2, 67, 232, 215, 252, 44, 22, 142, 7, 6, 1, 160, 2, 250, 32, 22, 231, - 233, 7, 4, 1, 160, 2, 250, 32, 22, 231, 233, 7, 6, 1, 160, 2, 250, 32, - 22, 250, 235, 7, 4, 1, 160, 2, 250, 32, 22, 250, 235, 7, 6, 1, 240, 155, - 2, 231, 234, 22, 242, 137, 7, 4, 1, 240, 155, 2, 231, 234, 22, 242, 137, - 7, 4, 1, 240, 155, 2, 59, 77, 22, 142, 7, 4, 1, 229, 81, 2, 216, 90, 48, - 7, 6, 1, 144, 2, 67, 232, 215, 51, 7, 4, 1, 144, 2, 67, 232, 215, 51, 7, - 6, 1, 144, 2, 67, 232, 215, 252, 44, 22, 242, 137, 7, 4, 1, 144, 2, 67, - 232, 215, 252, 44, 22, 242, 137, 7, 6, 1, 144, 2, 67, 232, 215, 252, 44, - 22, 142, 7, 4, 1, 144, 2, 67, 232, 215, 252, 44, 22, 142, 7, 6, 1, 222, - 93, 2, 67, 232, 215, 51, 7, 4, 1, 222, 93, 2, 67, 232, 215, 51, 7, 6, 1, - 104, 2, 231, 234, 22, 242, 137, 7, 4, 1, 104, 2, 231, 234, 22, 242, 137, - 7, 6, 1, 115, 2, 226, 226, 22, 142, 7, 4, 1, 115, 2, 226, 226, 22, 142, - 7, 6, 1, 115, 2, 226, 226, 22, 183, 7, 4, 1, 115, 2, 226, 226, 22, 183, - 7, 6, 1, 160, 2, 226, 226, 22, 142, 7, 4, 1, 160, 2, 226, 226, 22, 142, - 7, 6, 1, 160, 2, 226, 226, 22, 183, 7, 4, 1, 160, 2, 226, 226, 22, 183, - 7, 6, 1, 160, 2, 59, 77, 22, 142, 7, 4, 1, 160, 2, 59, 77, 22, 142, 7, 6, - 1, 160, 2, 59, 77, 22, 183, 7, 4, 1, 160, 2, 59, 77, 22, 183, 7, 4, 1, - 240, 155, 2, 59, 77, 22, 242, 137, 7, 4, 1, 240, 155, 2, 59, 77, 22, 183, - 7, 6, 1, 240, 155, 2, 226, 226, 22, 142, 7, 4, 1, 240, 155, 2, 226, 226, - 22, 59, 77, 22, 142, 7, 6, 1, 240, 155, 2, 226, 226, 22, 183, 7, 4, 1, - 240, 155, 2, 226, 226, 22, 59, 77, 22, 183, 7, 6, 1, 235, 146, 2, 183, 7, - 4, 1, 235, 146, 2, 59, 77, 22, 183, 7, 6, 1, 233, 150, 2, 183, 7, 4, 1, - 233, 150, 2, 183, 7, 6, 1, 232, 51, 2, 183, 7, 4, 1, 232, 51, 2, 183, 7, - 6, 1, 223, 225, 2, 183, 7, 4, 1, 223, 225, 2, 183, 7, 6, 1, 104, 2, 226, - 226, 22, 142, 7, 4, 1, 104, 2, 226, 226, 22, 142, 7, 6, 1, 104, 2, 226, - 226, 22, 183, 7, 4, 1, 104, 2, 226, 226, 22, 183, 7, 6, 1, 104, 2, 231, - 234, 22, 142, 7, 4, 1, 104, 2, 231, 234, 22, 142, 7, 6, 1, 104, 2, 231, - 234, 22, 183, 7, 4, 1, 104, 2, 231, 234, 22, 183, 7, 4, 1, 254, 245, 2, - 242, 137, 7, 4, 1, 204, 144, 2, 242, 137, 7, 4, 1, 204, 144, 2, 142, 7, - 4, 1, 215, 94, 214, 106, 2, 242, 137, 7, 4, 1, 215, 94, 214, 106, 2, 142, - 7, 4, 1, 221, 197, 2, 242, 137, 7, 4, 1, 221, 197, 2, 142, 7, 4, 1, 241, - 52, 221, 197, 2, 242, 137, 7, 4, 1, 241, 52, 221, 197, 2, 142, 146, 1, - 234, 110, 36, 116, 235, 24, 36, 116, 229, 80, 36, 116, 251, 67, 36, 116, - 227, 168, 36, 116, 215, 160, 36, 116, 228, 112, 36, 116, 217, 153, 36, - 116, 230, 26, 36, 116, 226, 106, 36, 116, 193, 36, 116, 211, 117, 36, - 116, 153, 36, 116, 156, 36, 116, 214, 105, 36, 116, 232, 177, 36, 116, - 232, 186, 36, 116, 222, 181, 36, 116, 228, 94, 36, 116, 235, 145, 36, - 116, 220, 105, 36, 116, 218, 227, 36, 116, 222, 92, 36, 116, 242, 61, 36, - 116, 233, 233, 36, 3, 235, 11, 36, 3, 234, 93, 36, 3, 234, 84, 36, 3, - 233, 218, 36, 3, 233, 189, 36, 3, 234, 183, 36, 3, 234, 182, 36, 3, 234, - 247, 36, 3, 234, 29, 36, 3, 234, 11, 36, 3, 234, 196, 36, 3, 229, 77, 36, - 3, 229, 28, 36, 3, 229, 24, 36, 3, 228, 249, 36, 3, 228, 242, 36, 3, 229, - 65, 36, 3, 229, 63, 36, 3, 229, 74, 36, 3, 229, 5, 36, 3, 229, 0, 36, 3, - 229, 67, 36, 3, 251, 33, 36, 3, 250, 52, 36, 3, 250, 42, 36, 3, 249, 113, - 36, 3, 249, 84, 36, 3, 250, 191, 36, 3, 250, 183, 36, 3, 251, 23, 36, 3, - 249, 239, 36, 3, 249, 175, 36, 3, 250, 223, 36, 3, 227, 165, 36, 3, 227, - 149, 36, 3, 227, 144, 36, 3, 227, 129, 36, 3, 227, 122, 36, 3, 227, 157, - 36, 3, 227, 156, 36, 3, 227, 162, 36, 3, 227, 135, 36, 3, 227, 133, 36, - 3, 227, 160, 36, 3, 215, 156, 36, 3, 215, 136, 36, 3, 215, 135, 36, 3, - 215, 124, 36, 3, 215, 121, 36, 3, 215, 152, 36, 3, 215, 151, 36, 3, 215, - 155, 36, 3, 215, 134, 36, 3, 215, 133, 36, 3, 215, 154, 36, 3, 228, 110, - 36, 3, 228, 96, 36, 3, 228, 95, 36, 3, 228, 79, 36, 3, 228, 78, 36, 3, - 228, 106, 36, 3, 228, 105, 36, 3, 228, 109, 36, 3, 228, 81, 36, 3, 228, - 80, 36, 3, 228, 108, 36, 3, 217, 102, 36, 3, 216, 118, 36, 3, 216, 104, - 36, 3, 215, 119, 36, 3, 215, 85, 36, 3, 217, 23, 36, 3, 217, 12, 36, 3, - 217, 80, 36, 3, 111, 36, 3, 216, 18, 36, 3, 217, 42, 36, 3, 229, 226, 36, - 3, 228, 234, 36, 3, 228, 209, 36, 3, 227, 238, 36, 3, 227, 180, 36, 3, - 229, 108, 36, 3, 229, 104, 36, 3, 229, 213, 36, 3, 228, 75, 36, 3, 228, - 65, 36, 3, 229, 188, 36, 3, 226, 90, 36, 3, 225, 109, 36, 3, 225, 72, 36, - 3, 224, 151, 36, 3, 224, 120, 36, 3, 225, 222, 36, 3, 225, 212, 36, 3, - 226, 72, 36, 3, 225, 17, 36, 3, 224, 250, 36, 3, 225, 235, 36, 3, 231, - 238, 36, 3, 230, 231, 36, 3, 230, 202, 36, 3, 230, 103, 36, 3, 230, 55, - 36, 3, 231, 92, 36, 3, 231, 81, 36, 3, 231, 204, 36, 3, 230, 162, 36, 3, - 230, 133, 36, 3, 231, 136, 36, 3, 211, 103, 36, 3, 211, 8, 36, 3, 210, - 255, 36, 3, 210, 212, 36, 3, 210, 181, 36, 3, 211, 47, 36, 3, 211, 44, - 36, 3, 211, 82, 36, 3, 210, 244, 36, 3, 210, 229, 36, 3, 211, 55, 36, 3, - 223, 185, 36, 3, 223, 36, 36, 3, 222, 240, 36, 3, 222, 141, 36, 3, 222, - 113, 36, 3, 223, 129, 36, 3, 223, 109, 36, 3, 223, 167, 36, 3, 222, 212, - 36, 3, 222, 198, 36, 3, 223, 137, 36, 3, 233, 135, 36, 3, 232, 242, 36, - 3, 232, 228, 36, 3, 232, 99, 36, 3, 232, 74, 36, 3, 233, 59, 36, 3, 233, - 51, 36, 3, 233, 110, 36, 3, 232, 157, 36, 3, 232, 128, 36, 3, 233, 75, - 36, 3, 214, 26, 36, 3, 213, 176, 36, 3, 213, 162, 36, 3, 212, 116, 36, 3, - 212, 109, 36, 3, 213, 255, 36, 3, 213, 250, 36, 3, 214, 23, 36, 3, 213, - 138, 36, 3, 213, 127, 36, 3, 214, 5, 36, 3, 232, 175, 36, 3, 232, 170, - 36, 3, 232, 169, 36, 3, 232, 166, 36, 3, 232, 165, 36, 3, 232, 172, 36, - 3, 232, 171, 36, 3, 232, 174, 36, 3, 232, 168, 36, 3, 232, 167, 36, 3, - 232, 173, 36, 3, 232, 184, 36, 3, 232, 179, 36, 3, 232, 178, 36, 3, 232, - 162, 36, 3, 232, 161, 36, 3, 232, 181, 36, 3, 232, 180, 36, 3, 232, 183, - 36, 3, 232, 164, 36, 3, 232, 163, 36, 3, 232, 182, 36, 3, 222, 179, 36, - 3, 222, 168, 36, 3, 222, 167, 36, 3, 222, 161, 36, 3, 222, 154, 36, 3, - 222, 175, 36, 3, 222, 174, 36, 3, 222, 178, 36, 3, 222, 166, 36, 3, 222, - 165, 36, 3, 222, 177, 36, 3, 228, 92, 36, 3, 228, 87, 36, 3, 228, 86, 36, - 3, 228, 83, 36, 3, 228, 82, 36, 3, 228, 89, 36, 3, 228, 88, 36, 3, 228, - 91, 36, 3, 228, 85, 36, 3, 228, 84, 36, 3, 228, 90, 36, 3, 235, 141, 36, - 3, 235, 109, 36, 3, 235, 102, 36, 3, 235, 52, 36, 3, 235, 34, 36, 3, 235, - 127, 36, 3, 235, 125, 36, 3, 235, 136, 36, 3, 235, 69, 36, 3, 235, 60, - 36, 3, 235, 130, 36, 3, 220, 99, 36, 3, 220, 33, 36, 3, 220, 28, 36, 3, - 219, 226, 36, 3, 219, 211, 36, 3, 220, 64, 36, 3, 220, 62, 36, 3, 220, - 91, 36, 3, 220, 8, 36, 3, 220, 2, 36, 3, 220, 72, 36, 3, 218, 223, 36, 3, - 218, 193, 36, 3, 218, 189, 36, 3, 218, 180, 36, 3, 218, 177, 36, 3, 218, - 198, 36, 3, 218, 197, 36, 3, 218, 222, 36, 3, 218, 185, 36, 3, 218, 184, - 36, 3, 218, 200, 36, 3, 222, 32, 36, 3, 219, 192, 36, 3, 219, 176, 36, 3, - 218, 84, 36, 3, 218, 5, 36, 3, 221, 182, 36, 3, 221, 171, 36, 3, 222, 18, - 36, 3, 219, 59, 36, 3, 219, 41, 36, 3, 221, 220, 36, 3, 242, 47, 36, 3, - 241, 181, 36, 3, 241, 162, 36, 3, 240, 223, 36, 3, 240, 203, 36, 3, 241, - 239, 36, 3, 241, 221, 36, 3, 242, 37, 36, 3, 241, 69, 36, 3, 241, 54, 36, - 3, 241, 247, 36, 3, 233, 232, 36, 3, 233, 231, 36, 3, 233, 226, 36, 3, - 233, 225, 36, 3, 233, 222, 36, 3, 233, 221, 36, 3, 233, 228, 36, 3, 233, - 227, 36, 3, 233, 230, 36, 3, 233, 224, 36, 3, 233, 223, 36, 3, 233, 229, - 36, 3, 219, 232, 175, 116, 5, 211, 68, 175, 116, 5, 223, 156, 175, 116, - 5, 223, 79, 98, 1, 215, 28, 69, 116, 5, 249, 234, 176, 69, 116, 5, 249, - 234, 234, 133, 69, 116, 5, 249, 234, 234, 29, 69, 116, 5, 249, 234, 234, - 106, 69, 116, 5, 249, 234, 229, 5, 69, 116, 5, 249, 234, 251, 34, 69, - 116, 5, 249, 234, 250, 158, 69, 116, 5, 249, 234, 249, 239, 69, 116, 5, - 249, 234, 250, 87, 69, 116, 5, 249, 234, 227, 135, 69, 116, 5, 249, 234, - 248, 222, 69, 116, 5, 249, 234, 215, 145, 69, 116, 5, 249, 234, 247, 146, - 69, 116, 5, 249, 234, 215, 140, 69, 116, 5, 249, 234, 197, 69, 116, 5, - 249, 234, 217, 106, 69, 116, 5, 249, 234, 216, 209, 69, 116, 5, 249, 234, - 111, 69, 116, 5, 249, 234, 216, 157, 69, 116, 5, 249, 234, 228, 75, 69, - 116, 5, 249, 234, 252, 192, 69, 116, 5, 249, 234, 225, 148, 69, 116, 5, - 249, 234, 225, 17, 69, 116, 5, 249, 234, 225, 122, 69, 116, 5, 249, 234, - 230, 162, 69, 116, 5, 249, 234, 210, 244, 69, 116, 5, 249, 234, 222, 212, - 69, 116, 5, 249, 234, 232, 157, 69, 116, 5, 249, 234, 213, 138, 69, 116, - 5, 249, 234, 220, 103, 69, 116, 5, 249, 234, 218, 224, 69, 116, 5, 249, - 234, 206, 69, 116, 5, 249, 234, 162, 69, 116, 5, 249, 234, 233, 136, 69, - 25, 5, 249, 234, 224, 89, 69, 235, 244, 25, 5, 249, 234, 224, 31, 69, - 235, 244, 25, 5, 249, 234, 222, 101, 69, 235, 244, 25, 5, 249, 234, 222, - 94, 69, 235, 244, 25, 5, 249, 234, 224, 70, 69, 25, 5, 226, 205, 69, 25, - 5, 255, 35, 141, 1, 252, 0, 229, 78, 141, 1, 252, 0, 229, 28, 141, 1, - 252, 0, 228, 249, 141, 1, 252, 0, 229, 65, 141, 1, 252, 0, 229, 5, 56, 1, - 252, 0, 229, 78, 56, 1, 252, 0, 229, 28, 56, 1, 252, 0, 228, 249, 56, 1, - 252, 0, 229, 65, 56, 1, 252, 0, 229, 5, 56, 1, 254, 195, 250, 191, 56, 1, - 254, 195, 215, 119, 56, 1, 254, 195, 111, 56, 1, 254, 195, 226, 106, 58, - 1, 245, 21, 245, 20, 249, 183, 138, 130, 58, 1, 245, 20, 245, 21, 249, - 183, 138, 130, + 240, 227, 206, 227, 208, 218, 154, 64, 241, 240, 219, 50, 218, 154, 64, + 216, 213, 218, 86, 245, 151, 64, 216, 213, 245, 64, 245, 151, 64, 215, + 244, 245, 117, 245, 140, 245, 141, 255, 16, 255, 17, 254, 176, 252, 55, + 252, 187, 251, 139, 135, 217, 90, 203, 217, 90, 240, 234, 217, 94, 232, + 220, 244, 153, 166, 232, 219, 245, 151, 64, 232, 219, 233, 6, 228, 140, + 245, 120, 232, 220, 217, 90, 67, 217, 90, 212, 118, 244, 28, 244, 153, + 244, 133, 250, 238, 223, 56, 249, 151, 220, 30, 226, 134, 232, 156, 111, + 219, 60, 220, 30, 236, 6, 232, 156, 210, 86, 219, 193, 248, 159, 232, + 210, 245, 85, 247, 163, 248, 39, 249, 186, 111, 248, 149, 248, 39, 249, + 186, 105, 248, 148, 248, 39, 249, 186, 158, 248, 147, 248, 39, 249, 186, + 161, 248, 146, 152, 255, 16, 229, 214, 217, 178, 236, 69, 217, 181, 245, + 151, 64, 215, 245, 251, 221, 245, 70, 251, 13, 251, 15, 245, 151, 64, + 231, 86, 245, 118, 218, 62, 218, 79, 245, 85, 245, 86, 235, 239, 220, + 140, 161, 244, 115, 220, 139, 243, 245, 235, 239, 220, 140, 158, 242, + 128, 220, 139, 242, 125, 235, 239, 220, 140, 105, 223, 124, 220, 139, + 222, 147, 235, 239, 220, 140, 111, 214, 174, 220, 139, 214, 133, 219, 23, + 248, 71, 248, 73, 226, 82, 250, 150, 226, 84, 125, 226, 244, 224, 196, + 241, 54, 251, 158, 225, 176, 241, 210, 251, 169, 228, 80, 251, 158, 241, + 210, 229, 180, 235, 249, 235, 251, 229, 87, 232, 219, 229, 104, 218, 154, + 64, 221, 160, 254, 26, 218, 225, 245, 151, 64, 221, 160, 254, 26, 245, + 88, 135, 217, 91, 220, 129, 203, 217, 91, 220, 129, 240, 231, 135, 217, + 91, 2, 235, 41, 203, 217, 91, 2, 235, 41, 240, 232, 232, 220, 217, 91, + 220, 129, 67, 217, 91, 220, 129, 212, 117, 226, 1, 232, 220, 244, 22, + 226, 1, 232, 220, 246, 114, 225, 35, 226, 1, 232, 220, 252, 186, 226, 1, + 232, 220, 214, 163, 225, 31, 223, 53, 232, 220, 244, 153, 223, 53, 235, + 249, 223, 38, 219, 157, 220, 30, 105, 219, 154, 218, 227, 219, 157, 220, + 30, 158, 219, 153, 218, 226, 248, 39, 249, 186, 218, 107, 248, 145, 224, + 186, 214, 132, 111, 224, 186, 214, 130, 224, 152, 224, 186, 214, 132, + 105, 224, 186, 214, 129, 224, 151, 220, 130, 215, 243, 218, 153, 218, 90, + 251, 14, 250, 150, 250, 217, 231, 48, 212, 59, 230, 48, 218, 154, 64, + 242, 114, 254, 26, 218, 154, 64, 224, 169, 254, 26, 219, 22, 245, 151, + 64, 242, 114, 254, 26, 245, 151, 64, 224, 169, 254, 26, 245, 115, 218, + 154, 64, 218, 107, 219, 37, 219, 157, 242, 148, 135, 235, 202, 220, 109, + 219, 157, 135, 235, 202, 221, 196, 249, 186, 220, 137, 235, 202, 249, + 121, 218, 108, 216, 237, 218, 170, 226, 173, 217, 168, 249, 226, 226, + 146, 224, 187, 231, 47, 225, 22, 254, 61, 224, 181, 249, 226, 254, 77, + 229, 168, 219, 202, 7, 6, 1, 243, 0, 7, 4, 1, 243, 0, 250, 167, 254, 157, + 183, 218, 68, 249, 235, 219, 108, 233, 52, 165, 1, 232, 181, 209, 209, 1, + 244, 52, 244, 44, 209, 209, 1, 244, 52, 244, 165, 209, 209, 1, 222, 213, + 209, 209, 1, 232, 162, 63, 164, 251, 231, 220, 5, 242, 222, 230, 253, + 223, 44, 243, 223, 243, 222, 243, 221, 230, 50, 209, 251, 209, 252, 209, + 254, 232, 107, 222, 221, 232, 109, 222, 223, 225, 227, 232, 106, 222, + 220, 228, 111, 230, 170, 211, 229, 232, 108, 222, 222, 243, 244, 225, + 226, 212, 15, 245, 170, 243, 233, 230, 234, 226, 201, 214, 134, 87, 230, + 234, 248, 165, 87, 8, 3, 235, 164, 79, 224, 197, 244, 28, 31, 67, 44, 71, + 233, 26, 127, 213, 118, 213, 7, 212, 195, 212, 184, 212, 173, 212, 162, + 212, 151, 212, 140, 212, 129, 213, 117, 213, 106, 213, 95, 213, 84, 213, + 73, 213, 62, 213, 51, 251, 79, 226, 159, 79, 251, 204, 209, 253, 15, 5, + 227, 215, 216, 240, 15, 5, 227, 215, 115, 227, 215, 251, 107, 115, 251, + 106, 49, 28, 16, 243, 243, 219, 104, 250, 81, 214, 9, 213, 40, 213, 29, + 213, 18, 213, 6, 212, 251, 212, 240, 212, 229, 212, 218, 212, 207, 212, + 199, 212, 198, 212, 197, 212, 196, 212, 194, 212, 193, 212, 192, 212, + 191, 212, 190, 212, 189, 212, 188, 212, 187, 212, 186, 212, 185, 212, + 183, 212, 182, 212, 181, 212, 180, 212, 179, 212, 178, 212, 177, 212, + 176, 212, 175, 212, 174, 212, 172, 212, 171, 212, 170, 212, 169, 212, + 168, 212, 167, 212, 166, 212, 165, 212, 164, 212, 163, 212, 161, 212, + 160, 212, 159, 212, 158, 212, 157, 212, 156, 212, 155, 212, 154, 212, + 153, 212, 152, 212, 150, 212, 149, 212, 148, 212, 147, 212, 146, 212, + 145, 212, 144, 212, 143, 212, 142, 212, 141, 212, 139, 212, 138, 212, + 137, 212, 136, 212, 135, 212, 134, 212, 133, 212, 132, 212, 131, 212, + 130, 212, 128, 212, 127, 212, 126, 212, 125, 212, 124, 212, 123, 212, + 122, 212, 121, 212, 120, 212, 119, 213, 116, 213, 115, 213, 114, 213, + 113, 213, 112, 213, 111, 213, 110, 213, 109, 213, 108, 213, 107, 213, + 105, 213, 104, 213, 103, 213, 102, 213, 101, 213, 100, 213, 99, 213, 98, + 213, 97, 213, 96, 213, 94, 213, 93, 213, 92, 213, 91, 213, 90, 213, 89, + 213, 88, 213, 87, 213, 86, 213, 85, 213, 83, 213, 82, 213, 81, 213, 80, + 213, 79, 213, 78, 213, 77, 213, 76, 213, 75, 213, 74, 213, 72, 213, 71, + 213, 70, 213, 69, 213, 68, 213, 67, 213, 66, 213, 65, 213, 64, 213, 63, + 213, 61, 213, 60, 213, 59, 213, 58, 213, 57, 213, 56, 213, 55, 213, 54, + 213, 53, 213, 52, 213, 50, 213, 49, 213, 48, 213, 47, 213, 46, 213, 45, + 213, 44, 213, 43, 213, 42, 213, 41, 213, 39, 213, 38, 213, 37, 213, 36, + 213, 35, 213, 34, 213, 33, 213, 32, 213, 31, 213, 30, 213, 28, 213, 27, + 213, 26, 213, 25, 213, 24, 213, 23, 213, 22, 213, 21, 213, 20, 213, 19, + 213, 17, 213, 16, 213, 15, 213, 14, 213, 13, 213, 12, 213, 11, 213, 10, + 213, 9, 213, 8, 213, 5, 213, 4, 213, 3, 213, 2, 213, 1, 213, 0, 212, 255, + 212, 254, 212, 253, 212, 252, 212, 250, 212, 249, 212, 248, 212, 247, + 212, 246, 212, 245, 212, 244, 212, 243, 212, 242, 212, 241, 212, 239, + 212, 238, 212, 237, 212, 236, 212, 235, 212, 234, 212, 233, 212, 232, + 212, 231, 212, 230, 212, 228, 212, 227, 212, 226, 212, 225, 212, 224, + 212, 223, 212, 222, 212, 221, 212, 220, 212, 219, 212, 217, 212, 216, + 212, 215, 212, 214, 212, 213, 212, 212, 212, 211, 212, 210, 212, 209, + 212, 208, 212, 206, 212, 205, 212, 204, 212, 203, 212, 202, 212, 201, + 212, 200, 7, 6, 1, 116, 2, 231, 238, 22, 242, 143, 7, 4, 1, 116, 2, 231, + 238, 22, 242, 143, 7, 6, 1, 160, 2, 67, 232, 220, 51, 7, 4, 1, 160, 2, + 67, 232, 220, 51, 7, 6, 1, 160, 2, 67, 232, 220, 252, 51, 22, 242, 143, + 7, 4, 1, 160, 2, 67, 232, 220, 252, 51, 22, 242, 143, 7, 6, 1, 160, 2, + 67, 232, 220, 252, 51, 22, 142, 7, 4, 1, 160, 2, 67, 232, 220, 252, 51, + 22, 142, 7, 6, 1, 160, 2, 250, 39, 22, 231, 237, 7, 4, 1, 160, 2, 250, + 39, 22, 231, 237, 7, 6, 1, 160, 2, 250, 39, 22, 250, 242, 7, 4, 1, 160, + 2, 250, 39, 22, 250, 242, 7, 6, 1, 240, 161, 2, 231, 238, 22, 242, 143, + 7, 4, 1, 240, 161, 2, 231, 238, 22, 242, 143, 7, 4, 1, 240, 161, 2, 59, + 72, 22, 142, 7, 4, 1, 229, 85, 2, 216, 90, 48, 7, 6, 1, 144, 2, 67, 232, + 220, 51, 7, 4, 1, 144, 2, 67, 232, 220, 51, 7, 6, 1, 144, 2, 67, 232, + 220, 252, 51, 22, 242, 143, 7, 4, 1, 144, 2, 67, 232, 220, 252, 51, 22, + 242, 143, 7, 6, 1, 144, 2, 67, 232, 220, 252, 51, 22, 142, 7, 4, 1, 144, + 2, 67, 232, 220, 252, 51, 22, 142, 7, 6, 1, 222, 94, 2, 67, 232, 220, 51, + 7, 4, 1, 222, 94, 2, 67, 232, 220, 51, 7, 6, 1, 104, 2, 231, 238, 22, + 242, 143, 7, 4, 1, 104, 2, 231, 238, 22, 242, 143, 7, 6, 1, 116, 2, 226, + 229, 22, 142, 7, 4, 1, 116, 2, 226, 229, 22, 142, 7, 6, 1, 116, 2, 226, + 229, 22, 184, 7, 4, 1, 116, 2, 226, 229, 22, 184, 7, 6, 1, 160, 2, 226, + 229, 22, 142, 7, 4, 1, 160, 2, 226, 229, 22, 142, 7, 6, 1, 160, 2, 226, + 229, 22, 184, 7, 4, 1, 160, 2, 226, 229, 22, 184, 7, 6, 1, 160, 2, 59, + 72, 22, 142, 7, 4, 1, 160, 2, 59, 72, 22, 142, 7, 6, 1, 160, 2, 59, 72, + 22, 184, 7, 4, 1, 160, 2, 59, 72, 22, 184, 7, 4, 1, 240, 161, 2, 59, 72, + 22, 242, 143, 7, 4, 1, 240, 161, 2, 59, 72, 22, 184, 7, 6, 1, 240, 161, + 2, 226, 229, 22, 142, 7, 4, 1, 240, 161, 2, 226, 229, 22, 59, 72, 22, + 142, 7, 6, 1, 240, 161, 2, 226, 229, 22, 184, 7, 4, 1, 240, 161, 2, 226, + 229, 22, 59, 72, 22, 184, 7, 6, 1, 235, 151, 2, 184, 7, 4, 1, 235, 151, + 2, 59, 72, 22, 184, 7, 6, 1, 233, 155, 2, 184, 7, 4, 1, 233, 155, 2, 184, + 7, 6, 1, 232, 55, 2, 184, 7, 4, 1, 232, 55, 2, 184, 7, 6, 1, 223, 227, 2, + 184, 7, 4, 1, 223, 227, 2, 184, 7, 6, 1, 104, 2, 226, 229, 22, 142, 7, 4, + 1, 104, 2, 226, 229, 22, 142, 7, 6, 1, 104, 2, 226, 229, 22, 184, 7, 4, + 1, 104, 2, 226, 229, 22, 184, 7, 6, 1, 104, 2, 231, 238, 22, 142, 7, 4, + 1, 104, 2, 231, 238, 22, 142, 7, 6, 1, 104, 2, 231, 238, 22, 184, 7, 4, + 1, 104, 2, 231, 238, 22, 184, 7, 4, 1, 254, 253, 2, 242, 143, 7, 4, 1, + 204, 144, 2, 242, 143, 7, 4, 1, 204, 144, 2, 142, 7, 4, 1, 215, 94, 214, + 106, 2, 242, 143, 7, 4, 1, 215, 94, 214, 106, 2, 142, 7, 4, 1, 221, 198, + 2, 242, 143, 7, 4, 1, 221, 198, 2, 142, 7, 4, 1, 241, 58, 221, 198, 2, + 242, 143, 7, 4, 1, 241, 58, 221, 198, 2, 142, 9, 220, 137, 77, 2, 182, + 72, 2, 254, 179, 9, 220, 137, 77, 2, 182, 72, 2, 212, 30, 9, 220, 137, + 77, 2, 182, 72, 2, 109, 231, 197, 9, 220, 137, 77, 2, 182, 72, 2, 226, + 238, 9, 220, 137, 77, 2, 182, 72, 2, 69, 9, 220, 137, 77, 2, 182, 72, 2, + 210, 212, 9, 220, 137, 77, 2, 182, 72, 2, 76, 9, 220, 137, 77, 2, 182, + 72, 2, 254, 252, 9, 220, 137, 228, 68, 2, 234, 180, 146, 1, 234, 115, 36, + 117, 235, 29, 36, 117, 229, 84, 36, 117, 251, 74, 36, 117, 227, 171, 36, + 117, 215, 160, 36, 117, 228, 116, 36, 117, 217, 153, 36, 117, 230, 30, + 36, 117, 226, 109, 36, 117, 194, 36, 117, 211, 117, 36, 117, 153, 36, + 117, 156, 36, 117, 214, 105, 36, 117, 232, 182, 36, 117, 232, 191, 36, + 117, 222, 182, 36, 117, 228, 98, 36, 117, 235, 150, 36, 117, 220, 106, + 36, 117, 218, 228, 36, 117, 222, 93, 36, 117, 242, 67, 36, 117, 233, 238, + 36, 3, 235, 16, 36, 3, 234, 98, 36, 3, 234, 89, 36, 3, 233, 223, 36, 3, + 233, 194, 36, 3, 234, 188, 36, 3, 234, 187, 36, 3, 234, 252, 36, 3, 234, + 34, 36, 3, 234, 16, 36, 3, 234, 201, 36, 3, 229, 81, 36, 3, 229, 32, 36, + 3, 229, 28, 36, 3, 228, 253, 36, 3, 228, 246, 36, 3, 229, 69, 36, 3, 229, + 67, 36, 3, 229, 78, 36, 3, 229, 9, 36, 3, 229, 4, 36, 3, 229, 71, 36, 3, + 251, 40, 36, 3, 250, 59, 36, 3, 250, 49, 36, 3, 249, 120, 36, 3, 249, 91, + 36, 3, 250, 198, 36, 3, 250, 190, 36, 3, 251, 30, 36, 3, 249, 246, 36, 3, + 249, 182, 36, 3, 250, 230, 36, 3, 227, 168, 36, 3, 227, 152, 36, 3, 227, + 147, 36, 3, 227, 132, 36, 3, 227, 125, 36, 3, 227, 160, 36, 3, 227, 159, + 36, 3, 227, 165, 36, 3, 227, 138, 36, 3, 227, 136, 36, 3, 227, 163, 36, + 3, 215, 156, 36, 3, 215, 136, 36, 3, 215, 135, 36, 3, 215, 124, 36, 3, + 215, 121, 36, 3, 215, 152, 36, 3, 215, 151, 36, 3, 215, 155, 36, 3, 215, + 134, 36, 3, 215, 133, 36, 3, 215, 154, 36, 3, 228, 114, 36, 3, 228, 100, + 36, 3, 228, 99, 36, 3, 228, 83, 36, 3, 228, 82, 36, 3, 228, 110, 36, 3, + 228, 109, 36, 3, 228, 113, 36, 3, 228, 85, 36, 3, 228, 84, 36, 3, 228, + 112, 36, 3, 217, 102, 36, 3, 216, 118, 36, 3, 216, 104, 36, 3, 215, 119, + 36, 3, 215, 85, 36, 3, 217, 23, 36, 3, 217, 12, 36, 3, 217, 80, 36, 3, + 112, 36, 3, 216, 18, 36, 3, 217, 42, 36, 3, 229, 230, 36, 3, 228, 238, + 36, 3, 228, 213, 36, 3, 227, 242, 36, 3, 227, 183, 36, 3, 229, 112, 36, + 3, 229, 108, 36, 3, 229, 217, 36, 3, 228, 79, 36, 3, 228, 69, 36, 3, 229, + 192, 36, 3, 226, 93, 36, 3, 225, 111, 36, 3, 225, 74, 36, 3, 224, 153, + 36, 3, 224, 122, 36, 3, 225, 224, 36, 3, 225, 214, 36, 3, 226, 75, 36, 3, + 225, 19, 36, 3, 224, 252, 36, 3, 225, 238, 36, 3, 231, 242, 36, 3, 230, + 235, 36, 3, 230, 206, 36, 3, 230, 107, 36, 3, 230, 59, 36, 3, 231, 96, + 36, 3, 231, 85, 36, 3, 231, 208, 36, 3, 230, 166, 36, 3, 230, 137, 36, 3, + 231, 140, 36, 3, 211, 103, 36, 3, 211, 8, 36, 3, 210, 255, 36, 3, 210, + 212, 36, 3, 210, 181, 36, 3, 211, 47, 36, 3, 211, 44, 36, 3, 211, 82, 36, + 3, 210, 244, 36, 3, 210, 229, 36, 3, 211, 55, 36, 3, 223, 187, 36, 3, + 223, 38, 36, 3, 222, 242, 36, 3, 222, 142, 36, 3, 222, 114, 36, 3, 223, + 131, 36, 3, 223, 111, 36, 3, 223, 169, 36, 3, 222, 213, 36, 3, 222, 199, + 36, 3, 223, 139, 36, 3, 233, 140, 36, 3, 232, 247, 36, 3, 232, 233, 36, + 3, 232, 103, 36, 3, 232, 78, 36, 3, 233, 64, 36, 3, 233, 56, 36, 3, 233, + 115, 36, 3, 232, 162, 36, 3, 232, 133, 36, 3, 233, 80, 36, 3, 214, 26, + 36, 3, 213, 176, 36, 3, 213, 162, 36, 3, 212, 116, 36, 3, 212, 109, 36, + 3, 213, 255, 36, 3, 213, 250, 36, 3, 214, 23, 36, 3, 213, 138, 36, 3, + 213, 127, 36, 3, 214, 5, 36, 3, 232, 180, 36, 3, 232, 175, 36, 3, 232, + 174, 36, 3, 232, 171, 36, 3, 232, 170, 36, 3, 232, 177, 36, 3, 232, 176, + 36, 3, 232, 179, 36, 3, 232, 173, 36, 3, 232, 172, 36, 3, 232, 178, 36, + 3, 232, 189, 36, 3, 232, 184, 36, 3, 232, 183, 36, 3, 232, 167, 36, 3, + 232, 166, 36, 3, 232, 186, 36, 3, 232, 185, 36, 3, 232, 188, 36, 3, 232, + 169, 36, 3, 232, 168, 36, 3, 232, 187, 36, 3, 222, 180, 36, 3, 222, 169, + 36, 3, 222, 168, 36, 3, 222, 162, 36, 3, 222, 155, 36, 3, 222, 176, 36, + 3, 222, 175, 36, 3, 222, 179, 36, 3, 222, 167, 36, 3, 222, 166, 36, 3, + 222, 178, 36, 3, 228, 96, 36, 3, 228, 91, 36, 3, 228, 90, 36, 3, 228, 87, + 36, 3, 228, 86, 36, 3, 228, 93, 36, 3, 228, 92, 36, 3, 228, 95, 36, 3, + 228, 89, 36, 3, 228, 88, 36, 3, 228, 94, 36, 3, 235, 146, 36, 3, 235, + 114, 36, 3, 235, 107, 36, 3, 235, 57, 36, 3, 235, 39, 36, 3, 235, 132, + 36, 3, 235, 130, 36, 3, 235, 141, 36, 3, 235, 74, 36, 3, 235, 65, 36, 3, + 235, 135, 36, 3, 220, 100, 36, 3, 220, 34, 36, 3, 220, 29, 36, 3, 219, + 227, 36, 3, 219, 212, 36, 3, 220, 65, 36, 3, 220, 63, 36, 3, 220, 92, 36, + 3, 220, 9, 36, 3, 220, 3, 36, 3, 220, 73, 36, 3, 218, 224, 36, 3, 218, + 194, 36, 3, 218, 190, 36, 3, 218, 181, 36, 3, 218, 178, 36, 3, 218, 199, + 36, 3, 218, 198, 36, 3, 218, 223, 36, 3, 218, 186, 36, 3, 218, 185, 36, + 3, 218, 201, 36, 3, 222, 33, 36, 3, 219, 193, 36, 3, 219, 177, 36, 3, + 218, 84, 36, 3, 218, 5, 36, 3, 221, 183, 36, 3, 221, 172, 36, 3, 222, 19, + 36, 3, 219, 60, 36, 3, 219, 42, 36, 3, 221, 221, 36, 3, 242, 53, 36, 3, + 241, 187, 36, 3, 241, 168, 36, 3, 240, 229, 36, 3, 240, 209, 36, 3, 241, + 245, 36, 3, 241, 227, 36, 3, 242, 43, 36, 3, 241, 75, 36, 3, 241, 60, 36, + 3, 241, 253, 36, 3, 233, 237, 36, 3, 233, 236, 36, 3, 233, 231, 36, 3, + 233, 230, 36, 3, 233, 227, 36, 3, 233, 226, 36, 3, 233, 233, 36, 3, 233, + 232, 36, 3, 233, 235, 36, 3, 233, 229, 36, 3, 233, 228, 36, 3, 233, 234, + 36, 3, 219, 233, 175, 117, 5, 211, 68, 175, 117, 5, 223, 158, 175, 117, + 5, 223, 81, 98, 1, 215, 28, 70, 117, 5, 249, 241, 176, 70, 117, 5, 249, + 241, 234, 138, 70, 117, 5, 249, 241, 234, 34, 70, 117, 5, 249, 241, 234, + 111, 70, 117, 5, 249, 241, 229, 9, 70, 117, 5, 249, 241, 251, 41, 70, + 117, 5, 249, 241, 250, 165, 70, 117, 5, 249, 241, 249, 246, 70, 117, 5, + 249, 241, 250, 94, 70, 117, 5, 249, 241, 227, 138, 70, 117, 5, 249, 241, + 248, 229, 70, 117, 5, 249, 241, 215, 145, 70, 117, 5, 249, 241, 247, 153, + 70, 117, 5, 249, 241, 215, 140, 70, 117, 5, 249, 241, 198, 70, 117, 5, + 249, 241, 217, 106, 70, 117, 5, 249, 241, 216, 209, 70, 117, 5, 249, 241, + 112, 70, 117, 5, 249, 241, 216, 157, 70, 117, 5, 249, 241, 228, 79, 70, + 117, 5, 249, 241, 252, 199, 70, 117, 5, 249, 241, 225, 150, 70, 117, 5, + 249, 241, 225, 19, 70, 117, 5, 249, 241, 225, 124, 70, 117, 5, 249, 241, + 230, 166, 70, 117, 5, 249, 241, 210, 244, 70, 117, 5, 249, 241, 222, 213, + 70, 117, 5, 249, 241, 232, 162, 70, 117, 5, 249, 241, 213, 138, 70, 117, + 5, 249, 241, 220, 104, 70, 117, 5, 249, 241, 218, 225, 70, 117, 5, 249, + 241, 206, 70, 117, 5, 249, 241, 162, 70, 117, 5, 249, 241, 233, 141, 70, + 25, 5, 249, 241, 224, 91, 70, 235, 250, 25, 5, 249, 241, 224, 33, 70, + 235, 250, 25, 5, 249, 241, 222, 102, 70, 235, 250, 25, 5, 249, 241, 222, + 95, 70, 235, 250, 25, 5, 249, 241, 224, 72, 70, 25, 5, 226, 208, 70, 25, + 5, 255, 43, 141, 1, 252, 7, 229, 82, 141, 1, 252, 7, 229, 32, 141, 1, + 252, 7, 228, 253, 141, 1, 252, 7, 229, 69, 141, 1, 252, 7, 229, 9, 56, 1, + 252, 7, 229, 82, 56, 1, 252, 7, 229, 32, 56, 1, 252, 7, 228, 253, 56, 1, + 252, 7, 229, 69, 56, 1, 252, 7, 229, 9, 56, 1, 254, 203, 250, 198, 56, 1, + 254, 203, 215, 119, 56, 1, 254, 203, 112, 56, 1, 254, 203, 226, 109, 58, + 1, 245, 28, 245, 27, 249, 190, 138, 130, 58, 1, 245, 27, 245, 28, 249, + 190, 138, 130, }; static unsigned char phrasebook_offset1[] = { @@ -14433,2681 +14448,2683 @@ 8647, 0, 0, 0, 0, 0, 8651, 8658, 8666, 8673, 8678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8683, 8686, 8690, 8695, 8699, 0, 8703, 8709, 8715, 8718, 8725, 8734, 8737, 8740, 8745, 8751, 8755, 8763, 8769, 8775, 8783, 8787, - 8792, 8803, 8808, 8812, 8816, 8820, 0, 0, 8823, 8830, 8834, 8840, 8844, - 8851, 8857, 8864, 8870, 8876, 8880, 8884, 8890, 8894, 8898, 8902, 8906, - 8910, 8914, 8918, 8922, 8926, 8930, 8934, 8938, 8942, 8946, 8950, 8954, - 8958, 8966, 8974, 8984, 8993, 9002, 9005, 9009, 9013, 9017, 9021, 9025, - 9029, 9033, 9037, 9042, 9046, 9049, 9052, 9055, 9058, 9061, 9064, 9067, - 9070, 9074, 9077, 9080, 9085, 9090, 9096, 9099, 9106, 9115, 9120, 9125, - 9132, 9137, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, 9178, - 9182, 9187, 9192, 9199, 9205, 9211, 9217, 9222, 9230, 9238, 9243, 9249, - 9255, 9261, 9267, 9271, 9275, 9279, 9286, 9296, 9300, 9304, 9308, 9314, - 9322, 9326, 9330, 9337, 9341, 9345, 9349, 9356, 9363, 9375, 9379, 9383, - 9387, 9397, 9406, 9410, 9418, 9425, 9432, 9441, 9452, 9460, 9464, 9473, - 9484, 9492, 9505, 9513, 9521, 9529, 9537, 9543, 9552, 9559, 9563, 9571, - 9575, 9582, 9590, 9594, 9600, 9607, 9614, 9618, 9626, 9630, 9637, 9641, - 9649, 9653, 9661, 9669, 9676, 9684, 9692, 9699, 9705, 9709, 9716, 9724, - 9730, 9737, 9744, 9750, 9759, 9767, 9774, 9780, 9784, 9787, 9791, 9797, - 9805, 9809, 9815, 9821, 9828, 9835, 9838, 9845, 9850, 9858, 9863, 9867, - 9880, 9893, 9899, 9906, 9911, 9917, 9922, 9928, 9938, 9945, 9954, 9964, - 9970, 9975, 9980, 9984, 9988, 9993, 9998, 10004, 10012, 10020, 10031, - 10036, 10045, 10054, 10061, 10067, 10073, 10079, 10085, 10091, 10097, - 10103, 10109, 10115, 10122, 10129, 10136, 10142, 10150, 10159, 10165, - 10172, 10179, 10184, 10189, 10193, 10200, 10207, 10216, 10225, 10228, - 10233, 10238, 0, 10243, 10247, 10251, 10257, 10261, 10265, 10271, 10275, - 10283, 10287, 10291, 10295, 10299, 10303, 10309, 10313, 10319, 10323, - 10327, 10331, 10335, 10339, 10344, 10347, 10351, 10357, 10361, 10365, - 10369, 10373, 10377, 10383, 10389, 10395, 10399, 10403, 10408, 10412, - 10416, 10421, 10425, 10429, 10436, 10443, 10447, 10451, 10456, 10460, - 10464, 10467, 10472, 10475, 10478, 10483, 10488, 10492, 10496, 10502, - 10508, 10511, 0, 0, 10514, 10520, 10526, 10532, 10542, 10554, 10566, - 10583, 10595, 10606, 10614, 10621, 10632, 10647, 10658, 10664, 10673, - 10681, 10693, 10703, 10711, 10723, 10730, 10738, 10750, 10756, 10762, - 10770, 10778, 10786, 10792, 10802, 10809, 10819, 10829, 10842, 10856, - 10870, 10880, 10891, 10902, 10915, 10928, 10942, 10954, 10966, 10979, - 10992, 11004, 11017, 11026, 11034, 11039, 11044, 11049, 11054, 11059, - 11064, 11069, 11074, 11079, 11084, 11089, 11094, 11099, 11104, 11109, - 11114, 11119, 11124, 11129, 11134, 11139, 11144, 11149, 11154, 11159, - 11164, 11169, 11174, 11179, 11184, 11189, 11194, 11198, 11203, 11208, - 11213, 11218, 11223, 11227, 11231, 11235, 11239, 11243, 11247, 11251, - 11255, 11259, 11263, 11267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11272, 11277, 11281, 11285, 11289, 11293, 11297, 11301, 11305, 11309, - 11313, 11317, 11322, 11326, 11330, 11334, 11339, 11343, 11348, 11353, - 11358, 11362, 11367, 11372, 11377, 11382, 11386, 11391, 11395, 11400, - 11405, 11409, 11414, 11421, 11425, 11430, 11434, 11438, 11443, 11447, - 11454, 11461, 11468, 11474, 11482, 11490, 11499, 11507, 11514, 11521, - 11529, 11535, 11541, 11547, 11553, 11560, 11565, 11569, 11574, 0, 0, 0, - 0, 0, 11578, 11583, 11588, 11593, 11598, 11603, 11608, 11613, 11618, - 11623, 11628, 11633, 11638, 11643, 11648, 11653, 11658, 11663, 11668, - 11673, 11678, 11683, 11688, 11693, 11698, 11703, 11708, 11716, 11723, - 11729, 11734, 11742, 11749, 11755, 11762, 11768, 11773, 11780, 11787, - 11793, 11798, 11803, 11809, 11814, 11819, 11825, 0, 0, 11830, 11836, - 11842, 11848, 11854, 11860, 11866, 11871, 11879, 11885, 11891, 11897, - 11903, 11909, 11917, 0, 11923, 11928, 11933, 11938, 11943, 11948, 11953, - 11958, 11963, 11968, 11973, 11978, 11983, 11988, 11993, 11998, 12003, - 12008, 12013, 12018, 12023, 12028, 12033, 12038, 12043, 12048, 12053, - 12058, 0, 0, 12063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8792, 8803, 8808, 8812, 8816, 8820, 8823, 0, 8826, 8833, 8837, 8843, + 8847, 8854, 8860, 8867, 8873, 8879, 8883, 8887, 8893, 8897, 8901, 8905, + 8909, 8913, 8917, 8921, 8925, 8929, 8933, 8937, 8941, 8945, 8949, 8953, + 8957, 8961, 8969, 8977, 8987, 8996, 9005, 9008, 9012, 9016, 9020, 9024, + 9028, 9032, 9036, 9040, 9045, 9049, 9052, 9055, 9058, 9061, 9064, 9067, + 9070, 9073, 9077, 9080, 9083, 9088, 9093, 9099, 9102, 9109, 9118, 9123, + 9128, 9135, 9140, 9145, 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, + 9181, 9185, 9190, 9195, 9202, 9208, 9214, 9220, 9225, 9233, 9241, 9246, + 9252, 9258, 9264, 9270, 9274, 9278, 9282, 9289, 9299, 9303, 9307, 9311, + 9317, 9325, 9329, 9333, 9340, 9344, 9348, 9352, 9359, 9366, 9378, 9382, + 9386, 9390, 9400, 9409, 9413, 9421, 9428, 9435, 9444, 9455, 9463, 9467, + 9476, 9487, 9495, 9508, 9516, 9524, 9532, 9540, 9546, 9555, 9562, 9566, + 9574, 9578, 9585, 9593, 9597, 9603, 9610, 9617, 9621, 9629, 9633, 9640, + 9644, 9652, 9656, 9664, 9672, 9679, 9687, 9695, 9702, 9708, 9712, 9719, + 9727, 9733, 9740, 9747, 9753, 9762, 9770, 9777, 9783, 9787, 9790, 9794, + 9800, 9808, 9812, 9818, 9824, 9831, 9838, 9841, 9848, 9853, 9861, 9866, + 9870, 9883, 9896, 9902, 9909, 9914, 9920, 9925, 9931, 9941, 9948, 9957, + 9967, 9973, 9978, 9983, 9987, 9991, 9996, 10001, 10007, 10015, 10023, + 10034, 10039, 10048, 10057, 10064, 10070, 10076, 10082, 10088, 10094, + 10100, 10106, 10112, 10118, 10125, 10132, 10139, 10145, 10153, 10162, + 10168, 10175, 10182, 10187, 10192, 10196, 10203, 10210, 10219, 10228, + 10231, 10236, 10241, 0, 10246, 10250, 10254, 10260, 10264, 10268, 10274, + 10278, 10286, 10290, 10294, 10298, 10302, 10306, 10312, 10316, 10322, + 10326, 10330, 10334, 10338, 10342, 10347, 10350, 10354, 10360, 10364, + 10368, 10372, 10376, 10380, 10386, 10392, 10398, 10402, 10406, 10411, + 10415, 10419, 10424, 10428, 10432, 10439, 10446, 10450, 10454, 10459, + 10463, 10467, 10470, 10475, 10478, 10481, 10486, 10491, 10495, 10499, + 10505, 10511, 10514, 0, 0, 10517, 10523, 10529, 10535, 10545, 10557, + 10569, 10586, 10598, 10609, 10617, 10624, 10635, 10650, 10661, 10667, + 10676, 10684, 10696, 10706, 10714, 10726, 10733, 10741, 10753, 10759, + 10765, 10773, 10781, 10789, 10795, 10805, 10812, 10822, 10832, 10845, + 10859, 10873, 10883, 10894, 10905, 10918, 10931, 10945, 10957, 10969, + 10982, 10995, 11007, 11020, 11029, 11037, 11042, 11047, 11052, 11057, + 11062, 11067, 11072, 11077, 11082, 11087, 11092, 11097, 11102, 11107, + 11112, 11117, 11122, 11127, 11132, 11137, 11142, 11147, 11152, 11157, + 11162, 11167, 11172, 11177, 11182, 11187, 11192, 11197, 11201, 11206, + 11211, 11216, 11221, 11226, 11230, 11234, 11238, 11242, 11246, 11250, + 11254, 11258, 11262, 11266, 11270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11275, 11280, 11284, 11288, 11292, 11296, 11300, 11304, 11308, 11312, + 11316, 11320, 11325, 11329, 11333, 11337, 11342, 11346, 11351, 11356, + 11361, 11365, 11370, 11375, 11380, 11385, 11389, 11394, 11398, 11403, + 11408, 11412, 11417, 11424, 11428, 11433, 11437, 11441, 11446, 11450, + 11457, 11464, 11471, 11477, 11485, 11493, 11502, 11510, 11517, 11524, + 11532, 11538, 11544, 11550, 11556, 11563, 11568, 11572, 11577, 0, 0, 0, + 0, 0, 11581, 11586, 11591, 11596, 11601, 11606, 11611, 11616, 11621, + 11626, 11631, 11636, 11641, 11646, 11651, 11656, 11661, 11666, 11671, + 11676, 11681, 11686, 11691, 11696, 11701, 11706, 11711, 11719, 11726, + 11732, 11737, 11745, 11752, 11758, 11765, 11771, 11776, 11783, 11790, + 11796, 11801, 11806, 11812, 11817, 11822, 11828, 0, 0, 11833, 11839, + 11845, 11851, 11857, 11863, 11869, 11874, 11882, 11888, 11894, 11900, + 11906, 11912, 11920, 0, 11926, 11931, 11936, 11941, 11946, 11951, 11956, + 11961, 11966, 11971, 11976, 11981, 11986, 11991, 11996, 12001, 12006, + 12011, 12016, 12021, 12026, 12031, 12036, 12041, 12046, 12051, 12056, + 12061, 0, 0, 12066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12067, 0, 12076, 12083, 12091, 12103, 12110, 12117, 12124, 12135, 12146, - 12153, 12161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12167, 12172, 12177, 12182, 12187, - 12192, 12197, 12202, 12207, 12212, 12217, 12222, 12227, 12231, 12235, - 12239, 12244, 12250, 12256, 12262, 12267, 12272, 12277, 12282, 12288, - 12297, 12305, 0, 12311, 12317, 12321, 12325, 12329, 12334, 12337, 12341, - 12344, 12348, 12351, 12355, 12359, 12363, 12368, 12373, 12376, 12380, - 12385, 12390, 12393, 12397, 12400, 12404, 12408, 12412, 12416, 12420, - 12424, 12428, 12432, 12436, 12440, 12444, 12448, 12452, 12456, 12460, - 12464, 12468, 12472, 12475, 12479, 12482, 12486, 12490, 12494, 12497, - 12500, 12503, 12507, 12511, 12515, 12519, 12523, 12527, 12531, 12534, - 12537, 12542, 12547, 12551, 12555, 12560, 12564, 12569, 12573, 12578, - 12583, 12589, 12595, 12601, 12605, 12610, 12616, 12622, 12626, 12631, - 12635, 12641, 12646, 12649, 12655, 12661, 12666, 12671, 12678, 12683, - 12688, 12692, 12696, 12700, 12704, 12708, 12712, 12716, 12720, 12725, - 12730, 12735, 12741, 12744, 12748, 12752, 12755, 12758, 12761, 12764, - 12767, 12770, 12773, 12776, 12779, 12783, 12790, 12795, 12799, 12803, - 12807, 12811, 0, 12815, 12819, 12823, 12827, 12831, 12837, 12841, 0, - 12845, 12849, 12853, 0, 12857, 12860, 12864, 12867, 12871, 12874, 12878, - 12882, 0, 0, 12886, 12889, 0, 0, 12893, 12896, 12900, 12903, 12907, - 12911, 12915, 12919, 12923, 12927, 12931, 12935, 12939, 12943, 12947, - 12951, 12955, 12959, 12963, 12967, 12971, 12975, 0, 12978, 12981, 12985, - 12989, 12993, 12996, 12999, 0, 13002, 0, 0, 0, 13006, 13010, 13014, - 13017, 0, 0, 13020, 13024, 13028, 13033, 13037, 13042, 13046, 13051, - 13056, 0, 0, 13062, 13066, 0, 0, 13071, 13075, 13080, 13084, 0, 0, 0, 0, - 0, 0, 0, 0, 13090, 0, 0, 0, 0, 13096, 13100, 0, 13104, 13108, 13113, - 13118, 13123, 0, 0, 13129, 13133, 13136, 13139, 13142, 13145, 13148, - 13151, 13154, 13157, 13160, 13169, 13178, 13182, 13186, 13192, 13198, - 13204, 13210, 13224, 13231, 13234, 0, 0, 0, 0, 0, 13238, 13244, 13248, 0, - 13252, 13255, 13259, 13262, 13266, 13269, 0, 0, 0, 0, 13273, 13277, 0, 0, - 13281, 13285, 13289, 13292, 13296, 13300, 13304, 13308, 13312, 13316, - 13320, 13324, 13328, 13332, 13336, 13340, 13344, 13348, 13352, 13356, - 13360, 13364, 0, 13367, 13370, 13374, 13378, 13382, 13385, 13388, 0, - 13391, 13395, 0, 13399, 13403, 0, 13407, 13410, 0, 0, 13413, 0, 13417, - 13422, 13426, 13431, 13435, 0, 0, 0, 0, 13440, 13445, 0, 0, 13450, 13455, - 13460, 0, 0, 0, 13464, 0, 0, 0, 0, 0, 0, 0, 13468, 13472, 13476, 13480, - 0, 13484, 0, 0, 0, 0, 0, 0, 0, 13488, 13492, 13495, 13498, 13501, 13504, - 13507, 13510, 13513, 13516, 13519, 13522, 13525, 13528, 13531, 13536, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13540, 13544, 13548, 0, 13552, 13555, - 13559, 13562, 13566, 13569, 13573, 13577, 13581, 0, 13586, 13589, 13593, - 0, 13598, 13601, 13605, 13608, 13612, 13616, 13620, 13624, 13628, 13632, - 13636, 13640, 13644, 13648, 13652, 13656, 13660, 13664, 13668, 13672, - 13676, 13680, 0, 13683, 13686, 13690, 13694, 13698, 13701, 13704, 0, - 13707, 13711, 0, 13715, 13719, 13723, 13727, 13730, 0, 0, 13733, 13737, - 13741, 13746, 13750, 13755, 13759, 13764, 13769, 13775, 0, 13781, 13785, - 13790, 0, 13796, 13800, 13805, 0, 0, 13809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13812, 13817, 13822, 13827, 0, 0, 13833, 13837, 13840, - 13843, 13846, 13849, 13852, 13855, 13858, 13861, 13864, 13868, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13872, 13876, 13880, 0, 13884, 13887, - 13891, 13894, 13898, 13901, 13905, 13909, 0, 0, 13913, 13916, 0, 0, - 13920, 13923, 13927, 13930, 13934, 13938, 13942, 13946, 13950, 13954, - 13958, 13962, 13966, 13970, 13974, 13978, 13982, 13986, 13990, 13994, - 13998, 14002, 0, 14005, 14008, 14012, 14016, 14020, 14023, 14026, 0, - 14029, 14033, 0, 14037, 14041, 14045, 14049, 14052, 0, 0, 14055, 14059, - 14063, 14068, 14072, 14077, 14081, 14086, 14091, 0, 0, 14097, 14101, 0, - 0, 14106, 14110, 14115, 0, 0, 0, 0, 0, 0, 0, 0, 14119, 14125, 0, 0, 0, 0, - 14131, 14135, 0, 14139, 14143, 14148, 14153, 14158, 0, 0, 14164, 14168, - 14171, 14174, 14177, 14180, 14183, 14186, 14189, 14192, 14195, 14198, - 14202, 14208, 14214, 14220, 14226, 14232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 14238, 14242, 0, 14246, 14249, 14253, 14256, 14260, 14263, 0, 0, 0, - 14267, 14270, 14274, 0, 14278, 14281, 14285, 14289, 0, 0, 0, 14292, - 14296, 0, 14300, 0, 14304, 14308, 0, 0, 0, 14312, 14316, 0, 0, 0, 14320, - 14323, 14327, 0, 0, 0, 14330, 14333, 14336, 14339, 14343, 14347, 14351, - 14355, 14359, 14363, 14367, 14370, 0, 0, 0, 0, 14373, 14378, 14382, - 14387, 14391, 0, 0, 0, 14396, 14400, 14405, 0, 14410, 14414, 14419, - 14424, 0, 0, 14428, 0, 0, 0, 0, 0, 0, 14431, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14437, 14441, 14444, 14447, 14450, 14453, 14456, 14459, - 14462, 14465, 14468, 14472, 14477, 14482, 14486, 14490, 14494, 14498, - 14502, 14507, 14511, 0, 0, 0, 0, 0, 0, 14514, 14518, 14522, 0, 14526, - 14529, 14533, 14536, 14540, 14543, 14547, 14551, 0, 14555, 14558, 14562, - 0, 14566, 14569, 14573, 14577, 14580, 14584, 14588, 14592, 14596, 14600, - 14604, 14608, 14612, 14616, 14620, 14624, 14628, 14632, 14636, 14640, - 14644, 14648, 14652, 0, 14655, 14658, 14662, 14666, 14670, 14673, 14676, - 14679, 14683, 14687, 0, 14691, 14695, 14699, 14703, 14706, 0, 0, 0, - 14709, 14713, 14718, 14722, 14727, 14731, 14736, 14741, 0, 14747, 14751, - 14756, 0, 14761, 14765, 14770, 14775, 0, 0, 0, 0, 0, 0, 0, 14779, 14783, - 0, 14789, 14793, 0, 0, 0, 0, 0, 0, 14797, 14802, 14807, 14812, 0, 0, - 14818, 14822, 14825, 14828, 14831, 14834, 14837, 14840, 14843, 14846, 0, - 0, 0, 0, 0, 0, 0, 0, 14849, 14862, 14874, 14886, 14898, 14910, 14922, - 14934, 0, 0, 14938, 14942, 0, 14946, 14949, 14953, 14956, 14960, 14963, - 14967, 14971, 0, 14975, 14978, 14982, 0, 14986, 14989, 14993, 14997, - 15000, 15004, 15008, 15012, 15016, 15020, 15024, 15028, 15032, 15036, - 15040, 15044, 15048, 15052, 15056, 15060, 15064, 15068, 15072, 0, 15075, - 15078, 15082, 15086, 15090, 15093, 15096, 15099, 15103, 15107, 0, 15111, - 15115, 15119, 15123, 15126, 0, 0, 15129, 15133, 15137, 15142, 15146, - 15151, 15155, 15160, 15165, 0, 15171, 15175, 15180, 0, 15185, 15189, - 15194, 15199, 0, 0, 0, 0, 0, 0, 0, 15203, 15207, 0, 0, 0, 0, 0, 0, 0, - 15213, 0, 15217, 15222, 15227, 15232, 0, 0, 15238, 15242, 15245, 15248, - 15251, 15254, 15257, 15260, 15263, 15266, 0, 15269, 15273, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15277, 15281, 0, 15285, 15288, 15292, - 15295, 15299, 15302, 15306, 15310, 0, 15314, 15317, 15321, 0, 15325, - 15328, 15332, 15336, 15339, 15343, 15347, 15351, 15355, 15359, 15363, - 15367, 15371, 15375, 15379, 15383, 15387, 15391, 15395, 15399, 15403, - 15407, 15411, 15414, 15418, 15421, 15425, 15429, 15433, 15436, 15439, - 15442, 15446, 15450, 15454, 15458, 15462, 15466, 15470, 15473, 15476, 0, - 0, 15480, 15484, 15489, 15493, 15498, 15502, 15507, 15512, 0, 15518, - 15522, 15527, 0, 15532, 15536, 15541, 15546, 15550, 0, 0, 0, 0, 0, 0, 0, - 0, 15555, 0, 0, 0, 0, 0, 0, 0, 0, 15561, 15566, 15571, 15576, 0, 0, - 15582, 15586, 15589, 15592, 15595, 15598, 15601, 15604, 15607, 15610, - 15613, 15617, 15622, 15627, 15633, 15639, 0, 0, 0, 15645, 15649, 15655, - 15661, 15667, 15672, 15678, 0, 0, 15684, 15688, 0, 15692, 15696, 15700, - 15704, 15708, 15712, 15716, 15720, 15724, 15728, 15732, 15736, 15740, - 15744, 15748, 15752, 15756, 15760, 0, 0, 0, 15764, 15770, 15776, 15782, - 15788, 15794, 15800, 15806, 15812, 15818, 15824, 15830, 15838, 15844, - 15850, 15856, 15862, 15868, 15874, 15880, 15886, 15892, 15898, 15904, 0, - 15910, 15916, 15922, 15928, 15934, 15940, 15944, 15950, 15954, 0, 15958, - 0, 0, 15964, 15968, 15974, 15980, 15986, 15990, 15996, 0, 0, 0, 16000, 0, - 0, 0, 0, 16004, 16009, 16016, 16023, 16030, 16037, 0, 16044, 0, 16051, - 16056, 16061, 16068, 16075, 16084, 16095, 16104, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16109, 16116, 16123, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16128, 16134, 16140, 16146, 16152, 16158, 16164, 16170, - 16176, 16182, 16188, 16194, 16200, 16206, 16212, 16218, 16224, 16230, - 16236, 16242, 16248, 16254, 16260, 16266, 16272, 16278, 16284, 16290, - 16296, 16302, 16308, 16314, 16320, 16325, 16331, 16337, 16341, 16347, - 16351, 16357, 16363, 16369, 16375, 16381, 16387, 16392, 16398, 16402, - 16407, 16413, 16419, 16425, 16430, 16436, 16442, 16448, 16453, 16459, 0, - 0, 0, 0, 16463, 16469, 16474, 16480, 16485, 16493, 16501, 16505, 16509, - 16513, 16519, 16525, 16531, 16537, 16541, 16545, 16549, 16553, 16557, - 16560, 16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16588, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16592, 16597, 0, 16604, 0, 0, 16611, - 16616, 0, 16621, 0, 0, 16628, 0, 0, 0, 0, 0, 0, 16633, 16638, 16642, - 16649, 0, 16656, 16661, 16666, 16671, 16678, 16685, 16692, 0, 16699, - 16704, 16709, 0, 16716, 0, 16723, 0, 0, 16728, 16735, 0, 16742, 16746, - 16753, 16757, 16762, 16770, 16776, 16782, 16787, 16793, 16799, 16805, - 16810, 0, 16816, 16824, 16831, 0, 0, 16838, 16843, 16849, 16854, 16860, - 0, 16866, 0, 16872, 16879, 16886, 16893, 16900, 16905, 0, 0, 16909, - 16914, 16918, 16922, 16926, 16930, 16934, 16938, 16942, 16946, 0, 0, - 16950, 16956, 16962, 16969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16976, 16980, 16991, - 17006, 17021, 17031, 17042, 17055, 17066, 17072, 17080, 17090, 17096, - 17104, 17108, 17114, 17120, 17128, 17138, 17146, 17159, 17165, 17173, - 17181, 17193, 17200, 17208, 17216, 17224, 17232, 17240, 17248, 17258, - 17262, 17265, 17268, 17271, 17274, 17277, 17280, 17283, 17286, 17289, - 17293, 17297, 17301, 17305, 17309, 17313, 17317, 17321, 17325, 17330, - 17336, 17346, 17360, 17370, 17376, 17382, 17390, 17398, 17406, 17414, - 17420, 17426, 17429, 17433, 17437, 17441, 17445, 17449, 17453, 0, 17457, - 17461, 17465, 17469, 17473, 17477, 17481, 17485, 17489, 17493, 17497, - 17500, 17503, 17507, 17511, 17515, 17518, 17522, 17526, 17530, 17534, - 17538, 17542, 17546, 17550, 17553, 17556, 17560, 17564, 17568, 17571, - 17574, 17577, 17581, 17586, 17590, 0, 0, 0, 0, 17594, 17599, 17603, - 17608, 17612, 17617, 17622, 17628, 17633, 17639, 17643, 17648, 17652, - 17657, 17667, 17673, 17679, 17686, 17696, 17702, 17706, 17710, 17716, - 17722, 17730, 17736, 17744, 17752, 17760, 17770, 17778, 17788, 17793, - 17799, 17805, 17811, 17817, 17823, 17829, 0, 17835, 17841, 17847, 17853, - 17859, 17865, 17871, 17877, 17883, 17889, 17895, 17900, 17905, 17911, - 17917, 17923, 17928, 17934, 17940, 17946, 17952, 17958, 17964, 17970, - 17976, 17981, 17986, 17992, 17998, 18004, 18009, 18014, 18019, 18025, - 18033, 18040, 0, 18047, 18054, 18067, 18074, 18081, 18089, 18097, 18103, - 18109, 18115, 18125, 18130, 18136, 18146, 18156, 0, 18166, 18176, 18184, - 18196, 18208, 18214, 18228, 18243, 18248, 18253, 18261, 18269, 18277, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18285, 18288, 18292, 18296, 18300, - 18304, 18308, 18312, 18316, 18320, 18324, 18328, 18332, 18336, 18340, - 18344, 18348, 18352, 18356, 18360, 18364, 18367, 18370, 18374, 18378, - 18382, 18385, 18388, 18391, 18395, 18399, 18402, 18405, 18409, 18412, - 18417, 18420, 18424, 18427, 18431, 18434, 18439, 18442, 18446, 18453, - 18458, 18462, 18467, 18471, 18476, 18480, 18485, 18492, 18498, 18503, - 18507, 18511, 18515, 18519, 18523, 18528, 18533, 18539, 18544, 18549, - 18553, 18556, 18559, 18562, 18565, 18568, 18571, 18574, 18577, 18580, - 18586, 18590, 18594, 18598, 18602, 18606, 18610, 18614, 18618, 18623, - 18627, 18632, 18637, 18643, 18648, 18654, 18660, 18666, 18672, 18678, - 18685, 18692, 18700, 18708, 18717, 18726, 18737, 18747, 18757, 18768, - 18779, 18789, 18799, 18809, 18819, 18829, 18839, 18849, 18859, 18867, - 18874, 18880, 18887, 18892, 18898, 18904, 18910, 18916, 18922, 18928, - 18933, 18939, 18945, 18951, 18957, 18962, 18970, 18977, 18983, 18990, - 18998, 19004, 19010, 19016, 19022, 19030, 19038, 19048, 19056, 19064, - 19070, 19075, 19080, 19085, 19090, 19095, 19100, 19105, 19110, 19115, - 19121, 19127, 19133, 19140, 19145, 19151, 19156, 19161, 19166, 19171, - 19176, 19181, 19186, 19191, 19196, 19201, 19206, 19211, 19216, 19221, - 19226, 19231, 19236, 19241, 19246, 19251, 19256, 19261, 19266, 19271, - 19276, 19281, 19286, 19291, 19296, 19301, 19306, 19311, 19316, 19321, - 19326, 19331, 19336, 0, 19341, 0, 0, 0, 0, 0, 19346, 0, 0, 19351, 19355, - 19359, 19363, 19367, 19371, 19375, 19379, 19383, 19387, 19391, 19395, - 19399, 19403, 19407, 19411, 19415, 19419, 19423, 19427, 19431, 19435, - 19439, 19443, 19447, 19451, 19455, 19459, 19463, 19467, 19471, 19475, - 19479, 19483, 19487, 19491, 19495, 19499, 19503, 19507, 19511, 19515, - 19521, 19525, 19530, 19535, 19539, 19544, 19549, 19553, 19557, 19561, - 19565, 19569, 19573, 19577, 19581, 19585, 19589, 19593, 19597, 19601, - 19605, 19609, 19613, 19617, 19621, 19625, 19629, 19633, 19637, 19641, - 19645, 19649, 19653, 19657, 19661, 19665, 19669, 19673, 19677, 19681, - 19685, 19689, 19693, 19697, 19701, 19705, 19709, 19713, 19717, 19721, - 19725, 19729, 19733, 19737, 19741, 19745, 19749, 19753, 19757, 19761, - 19765, 19769, 19773, 19777, 19781, 19785, 19789, 19793, 19797, 19801, - 19805, 19809, 19813, 19817, 19821, 19825, 19829, 19833, 19837, 19841, - 19845, 19849, 19853, 19857, 19861, 19865, 19869, 19873, 19877, 19881, - 19885, 19889, 19893, 19897, 19901, 19905, 19909, 19913, 19917, 19921, - 19925, 19929, 19933, 19937, 19940, 19944, 19947, 19951, 19955, 19958, - 19962, 19966, 19969, 19973, 19977, 19981, 19985, 19988, 19992, 19996, - 20000, 20004, 20008, 20012, 20015, 20019, 20023, 20027, 20031, 20035, - 20039, 20043, 20047, 20051, 20055, 20059, 20063, 20067, 20071, 20075, - 20079, 20083, 20087, 20091, 20095, 20099, 20103, 20107, 20111, 20115, - 20119, 20123, 20127, 20131, 20135, 20139, 20143, 20147, 20151, 20155, - 20159, 20163, 20167, 20171, 20175, 20179, 20183, 20187, 20191, 20195, - 20199, 20203, 20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235, - 20239, 20243, 20247, 20251, 20255, 20259, 20263, 20267, 20271, 20275, - 20279, 20283, 20287, 20291, 20295, 20299, 20303, 20307, 20311, 20315, - 20319, 20323, 20327, 20331, 20335, 20339, 20343, 20347, 20351, 20355, - 20359, 20363, 20367, 20371, 20375, 20379, 20383, 20387, 20391, 20395, - 20399, 20403, 20407, 20411, 20415, 20419, 20423, 20427, 20431, 20435, - 20439, 20443, 20447, 20451, 20455, 20459, 20463, 20467, 20471, 20475, - 20479, 20483, 20487, 20491, 20495, 20499, 20503, 20507, 20511, 20515, - 20519, 20523, 20527, 20531, 20535, 20539, 20543, 20547, 20551, 20555, - 20559, 20563, 20567, 20570, 20574, 20578, 20582, 20586, 20590, 20594, - 20598, 20602, 20606, 20610, 20614, 20618, 20622, 20626, 20630, 20634, - 20638, 20642, 20646, 20650, 20654, 20658, 20662, 20665, 20669, 20673, - 20677, 20681, 20685, 20689, 20693, 20697, 20701, 20705, 20709, 20713, - 20717, 20721, 20725, 20728, 20732, 20736, 20740, 20744, 20748, 20752, - 20756, 20759, 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791, - 20795, 20799, 20803, 20807, 20811, 20815, 20819, 20823, 20827, 20831, - 20835, 20839, 20843, 20847, 20851, 0, 20855, 20859, 20863, 20867, 0, 0, - 20871, 20875, 20879, 20883, 20887, 20891, 20895, 0, 20899, 0, 20903, - 20907, 20911, 20915, 0, 0, 20919, 20923, 20927, 20931, 20935, 20939, - 20943, 20947, 20951, 20955, 20959, 20963, 20967, 20971, 20975, 20979, - 20983, 20987, 20991, 20995, 20999, 21003, 21007, 21010, 21014, 21018, - 21022, 21026, 21030, 21034, 21038, 21042, 21046, 21050, 21054, 21058, - 21062, 21066, 21070, 21074, 21078, 0, 21082, 21086, 21090, 21094, 0, 0, - 21098, 21101, 21105, 21109, 21113, 21117, 21121, 21125, 21129, 21133, - 21137, 21141, 21145, 21149, 21153, 21157, 21161, 21166, 21171, 21176, - 21182, 21188, 21193, 21198, 21204, 21207, 21211, 21215, 21219, 21223, - 21227, 21231, 21235, 0, 21239, 21243, 21247, 21251, 0, 0, 21255, 21259, - 21263, 21267, 21271, 21275, 21279, 0, 21283, 0, 21287, 21291, 21295, - 21299, 0, 0, 21303, 21307, 21311, 21315, 21319, 21323, 21327, 21331, - 21335, 21340, 21345, 21350, 21356, 21362, 21367, 0, 21372, 21376, 21380, - 21384, 21388, 21392, 21396, 21400, 21404, 21408, 21412, 21416, 21420, - 21424, 21428, 21432, 21436, 21439, 21443, 21447, 21451, 21455, 21459, - 21463, 21467, 21471, 21475, 21479, 21483, 21487, 21491, 21495, 21499, - 21503, 21507, 21511, 21515, 21519, 21523, 21527, 21531, 21535, 21539, - 21543, 21547, 21551, 21555, 21559, 21563, 21567, 21571, 21575, 21579, - 21583, 21587, 21591, 21595, 0, 21599, 21603, 21607, 21611, 0, 0, 21615, - 21619, 21623, 21627, 21631, 21635, 21639, 21643, 21647, 21651, 21655, - 21659, 21663, 21667, 21671, 21675, 21679, 21683, 21687, 21691, 21695, - 21699, 21703, 21707, 21711, 21715, 21719, 21723, 21727, 21731, 21735, - 21739, 21743, 21747, 21751, 21755, 21759, 21763, 21767, 21771, 21775, - 21779, 21783, 21787, 21791, 21795, 21799, 21803, 21807, 21811, 21815, - 21819, 21823, 21827, 21831, 21835, 21839, 21842, 21846, 21850, 21854, - 21858, 21862, 21866, 21870, 21874, 21878, 0, 0, 21882, 21891, 21897, - 21902, 21906, 21909, 21914, 21917, 21920, 21923, 21928, 21932, 21937, - 21940, 21943, 21946, 21949, 21952, 21955, 21958, 21961, 21964, 21968, - 21972, 21976, 21980, 21984, 21988, 21992, 21996, 22000, 22004, 0, 0, 0, - 22010, 22016, 22020, 22024, 22028, 22034, 22038, 22042, 22046, 22052, - 22056, 22060, 22064, 22070, 22074, 22078, 22082, 22088, 22094, 22100, - 22108, 22114, 22120, 22126, 22132, 22138, 0, 0, 0, 0, 0, 0, 22144, 22147, - 22150, 22153, 22156, 22159, 22163, 22167, 22170, 22174, 22178, 22182, - 22186, 22190, 22193, 22197, 22201, 22205, 22209, 22213, 22217, 22221, - 22225, 22229, 22233, 22237, 22240, 22244, 22248, 22252, 22256, 22259, - 22263, 22267, 22271, 22275, 22279, 22283, 22287, 22291, 22295, 22299, - 22303, 22307, 22311, 22314, 22318, 22322, 22326, 22330, 22334, 22338, - 22342, 22346, 22350, 22354, 22358, 22362, 22366, 22370, 22374, 22378, - 22382, 22386, 22390, 22394, 22398, 22402, 22406, 22410, 22414, 22418, - 22422, 22426, 22430, 22434, 22438, 22442, 22446, 22450, 22453, 22457, - 22461, 22465, 22469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22473, 22477, - 22480, 22484, 22487, 22491, 22494, 22498, 22504, 22509, 22513, 22516, - 22520, 22524, 22529, 22533, 22538, 22542, 22547, 22551, 22556, 22560, - 22565, 22571, 22575, 22580, 22584, 22589, 22595, 22599, 22605, 22611, - 22615, 22620, 22628, 22636, 22643, 22648, 22653, 22662, 22669, 22676, - 22681, 22687, 22691, 22695, 22699, 22703, 22707, 22711, 22715, 22719, - 22723, 22727, 22733, 22738, 22743, 22746, 22750, 22754, 22759, 22763, - 22768, 22772, 22777, 22781, 22786, 22790, 22795, 22799, 22804, 22808, - 22813, 22819, 22823, 22828, 22833, 22837, 22841, 22845, 22849, 22852, - 22856, 22862, 22867, 22872, 22876, 22880, 22884, 22889, 22893, 22898, - 22902, 22907, 22910, 22914, 22918, 22923, 22927, 22932, 22936, 22941, - 22947, 22951, 22955, 22959, 22963, 22967, 22971, 22975, 22979, 22983, - 22987, 22991, 22997, 23000, 23004, 23008, 23013, 23017, 23022, 23026, - 23031, 23035, 23040, 23044, 23049, 23053, 23058, 23062, 23067, 23073, - 23077, 23081, 23087, 23093, 23099, 23105, 23109, 23113, 23117, 23121, - 23125, 23129, 23135, 23139, 23143, 23147, 23152, 23156, 23161, 23165, - 23170, 23174, 23179, 23183, 23188, 23192, 23197, 23201, 23206, 23212, - 23216, 23222, 23226, 23230, 23234, 23238, 23242, 23246, 23252, 23255, - 23259, 23263, 23268, 23272, 23277, 23281, 23286, 23290, 23295, 23299, - 23304, 23308, 23313, 23317, 23322, 23328, 23331, 23335, 23339, 23344, - 23349, 23353, 23357, 23361, 23365, 23369, 23373, 23379, 23382, 23386, - 23390, 23395, 23399, 23404, 23408, 23413, 23419, 23423, 23428, 23432, - 23436, 23440, 23444, 23448, 23452, 23456, 23462, 23466, 23470, 23474, - 23479, 23483, 23488, 23492, 23497, 23501, 23506, 23510, 23515, 23519, - 23524, 23528, 23533, 23536, 23540, 23544, 23548, 23552, 23556, 23560, - 23564, 23568, 23574, 23577, 23581, 23585, 23590, 23594, 23599, 23603, - 23608, 23612, 23617, 23621, 23626, 23630, 23635, 23639, 23644, 23650, - 23654, 23660, 23664, 23670, 23676, 23682, 23688, 23694, 23700, 23706, - 23712, 23716, 23720, 23724, 23728, 23732, 23736, 23740, 23744, 23749, - 23753, 23758, 23762, 23767, 23771, 23776, 23780, 23785, 23789, 23794, - 23798, 23803, 23807, 23811, 23815, 23819, 23823, 23827, 23831, 23837, - 23840, 23844, 23848, 23853, 23857, 23862, 23866, 23871, 23875, 23880, - 23884, 23889, 23893, 23898, 23902, 23907, 23913, 23917, 23923, 23928, - 23934, 23938, 23944, 23949, 23953, 23957, 23961, 23965, 23969, 23974, - 23977, 23981, 23986, 23990, 23995, 23998, 24002, 24006, 24010, 24014, - 24018, 24022, 24026, 24030, 24034, 24038, 24042, 24047, 24051, 24055, - 24061, 24065, 24071, 24075, 24081, 24085, 24089, 24093, 24097, 24101, - 24106, 24110, 24114, 24118, 24122, 24126, 24130, 24134, 24138, 24142, - 24146, 24152, 24158, 24164, 24170, 24176, 24181, 24187, 24193, 24199, - 24203, 24207, 24211, 24215, 24219, 24223, 24227, 24231, 24235, 24239, - 24243, 24247, 24251, 24256, 24261, 24266, 24270, 24274, 24278, 24282, - 24286, 24290, 24294, 24298, 24302, 24306, 24312, 24318, 24324, 24330, - 24336, 24342, 24348, 24354, 24360, 24364, 24368, 24372, 24376, 24380, - 24384, 24388, 24394, 24400, 24406, 24412, 24418, 24424, 24430, 24436, - 24442, 24447, 24452, 24457, 24462, 24468, 24474, 24480, 24486, 24492, - 24498, 24504, 24509, 24515, 24521, 24527, 24532, 24538, 24544, 24550, - 24555, 24560, 24565, 24570, 24575, 24580, 24585, 24590, 24595, 24600, - 24605, 24610, 24614, 24619, 24624, 24629, 24634, 24639, 24644, 24649, - 24654, 24659, 24664, 24669, 24674, 24679, 24684, 24689, 24694, 24699, - 24704, 24709, 24714, 24719, 24724, 24729, 24734, 24739, 24744, 24749, - 24754, 24759, 24763, 24768, 24773, 24778, 24783, 24788, 24793, 24798, - 24803, 24808, 24813, 24818, 24823, 24828, 24833, 24838, 24843, 24848, - 24853, 24858, 24863, 24868, 24873, 24878, 24883, 24888, 24892, 24897, - 24902, 24907, 24912, 24917, 24921, 24926, 24931, 24936, 24941, 24946, - 24950, 24955, 24961, 24966, 24971, 24976, 24981, 24987, 24992, 24997, - 25002, 25007, 25012, 25017, 25022, 25027, 25032, 25037, 25042, 25047, - 25052, 25057, 25062, 25067, 25072, 25077, 25082, 25087, 25092, 25097, - 25102, 25107, 25112, 25117, 25122, 25127, 25132, 25137, 25142, 25147, - 25152, 25157, 25162, 25167, 25172, 25177, 25182, 25187, 25192, 25197, - 25202, 25207, 25213, 25218, 25223, 25228, 25233, 25238, 25243, 25248, - 25253, 25258, 25263, 25268, 25272, 25277, 25282, 25287, 25292, 25297, - 25302, 25307, 25312, 25317, 25322, 25327, 25332, 25337, 25342, 25347, - 25352, 25357, 25362, 25367, 25372, 25377, 25382, 25387, 25392, 25397, - 25402, 25408, 25412, 25416, 25420, 25424, 25428, 25432, 25436, 25440, - 25446, 25452, 25458, 25464, 25470, 25476, 25482, 25489, 25495, 25500, - 25505, 25510, 25515, 25520, 25525, 25530, 25535, 25540, 25545, 25550, - 25555, 25560, 25565, 25570, 25575, 25580, 25585, 25590, 25595, 25600, - 25605, 25610, 25615, 25620, 25625, 25630, 25635, 0, 0, 0, 25642, 25652, - 25656, 25663, 25667, 25671, 25675, 25683, 25687, 25692, 25697, 25702, - 25706, 25711, 25716, 25719, 25723, 25727, 25736, 25740, 25744, 25750, - 25754, 25758, 25766, 25770, 25778, 25784, 25790, 25796, 25802, 25812, - 25818, 25822, 25831, 25834, 25840, 25844, 25850, 25855, 25861, 25869, - 25875, 25881, 25889, 25895, 25899, 25903, 25913, 25919, 25923, 25933, - 25939, 25943, 25947, 25954, 25961, 25966, 25971, 25980, 25984, 25988, - 25992, 26000, 26007, 26011, 26015, 26019, 26023, 26027, 26031, 26035, - 26039, 26043, 26047, 26051, 26056, 26061, 26066, 26070, 26074, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26078, 26082, 26086, 26090, 26094, - 26099, 26104, 26109, 26114, 26118, 26122, 26127, 26131, 0, 26135, 26140, - 26145, 26149, 26153, 26158, 26163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26168, 26172, 26176, 26180, 26184, 26189, 26194, 26199, 26204, 26208, - 26212, 26217, 26221, 26225, 26229, 26234, 26239, 26243, 26247, 26252, - 26257, 26262, 26268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26273, 26277, 26281, - 26285, 26289, 26294, 26299, 26304, 26309, 26313, 26317, 26322, 26326, - 26330, 26334, 26339, 26344, 26348, 26352, 26357, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26362, 26366, 26370, 26374, 26378, 26383, 26388, 26393, - 26398, 26402, 26406, 26411, 26415, 0, 26419, 26424, 26429, 0, 26433, - 26438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26443, 26446, 26450, 26454, - 26458, 26462, 26466, 26470, 26474, 26478, 26482, 26486, 26490, 26494, - 26498, 26502, 26506, 26510, 26513, 26517, 26521, 26525, 26529, 26533, - 26537, 26541, 26545, 26549, 26553, 26557, 26561, 26565, 26568, 26571, - 26575, 26579, 26585, 26591, 26597, 26603, 26609, 26615, 26621, 26627, - 26633, 26639, 26645, 26651, 26657, 26663, 26672, 26681, 26687, 26693, - 26699, 26704, 26708, 26713, 26718, 26723, 26727, 26732, 26737, 26742, - 26746, 26751, 26755, 26760, 26765, 26770, 26775, 26779, 26783, 26787, - 26791, 26795, 26799, 26803, 26807, 26811, 26815, 26821, 26825, 26829, - 26833, 26837, 26841, 26849, 26855, 26859, 26865, 26869, 26875, 26879, 0, - 0, 26883, 26887, 26890, 26893, 26896, 26899, 26902, 26905, 26908, 26911, - 0, 0, 0, 0, 0, 0, 26914, 26922, 26930, 26938, 26946, 26954, 26962, 26970, - 26978, 26986, 0, 0, 0, 0, 0, 0, 26994, 26997, 27000, 27003, 27008, 27011, - 27016, 27023, 27031, 27036, 27043, 27046, 27053, 27060, 27067, 0, 27071, - 27075, 27078, 27081, 27084, 27087, 27090, 27093, 27096, 27099, 0, 0, 0, - 0, 0, 0, 27102, 27105, 27108, 27111, 27114, 27117, 27121, 27125, 27129, - 27132, 27136, 27140, 27143, 27147, 27151, 27154, 27158, 27161, 27165, - 27169, 27173, 27177, 27181, 27184, 27187, 27191, 27195, 27198, 27202, - 27206, 27210, 27214, 27218, 27222, 27226, 27230, 27237, 27242, 27247, - 27252, 27257, 27263, 27269, 27275, 27281, 27286, 27292, 27298, 27303, - 27309, 27315, 27321, 27327, 27333, 27338, 27344, 27349, 27355, 27361, - 27367, 27373, 27379, 27384, 27389, 27395, 27401, 27406, 27412, 27417, - 27423, 27428, 27433, 27439, 27445, 27451, 27457, 27463, 27469, 27475, - 27481, 27487, 27493, 27499, 27505, 27510, 27515, 27520, 27526, 0, 0, 0, - 0, 0, 0, 0, 0, 27532, 27541, 27550, 27558, 27566, 27576, 27584, 27593, - 27600, 27607, 27614, 27622, 27630, 27638, 27646, 27654, 27662, 27670, - 27678, 27685, 27693, 27701, 27709, 27717, 27725, 27735, 27745, 27755, - 27765, 27775, 27785, 27795, 27805, 27815, 27825, 27835, 27845, 27855, - 27865, 27873, 27881, 27891, 27899, 0, 0, 0, 0, 0, 27909, 27913, 27917, - 27921, 27925, 27929, 27933, 27937, 27941, 27945, 27949, 27953, 27957, - 27961, 27965, 27969, 27973, 27977, 27981, 27985, 27989, 27993, 27997, - 28001, 28007, 28011, 28017, 28021, 28027, 28031, 28037, 28041, 28045, - 28049, 28053, 28057, 28061, 28067, 28073, 28079, 28085, 28090, 28096, - 28102, 28108, 28114, 28120, 28126, 28133, 28139, 28144, 28149, 28153, - 28157, 28161, 28165, 28169, 28173, 28177, 28183, 28189, 28195, 28200, - 28207, 28212, 28217, 28223, 28228, 28235, 28242, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28249, 28255, 28259, 28264, 28269, 28274, 28279, 28284, 28289, - 28294, 28299, 28304, 28309, 28314, 28319, 28324, 28328, 28332, 28337, - 28342, 28347, 28351, 28355, 28359, 28364, 28369, 28374, 28379, 28383, 0, - 0, 0, 28387, 28392, 28397, 28402, 28408, 28414, 28420, 28426, 28431, - 28436, 28442, 28448, 0, 0, 0, 0, 28455, 28460, 28466, 28472, 28478, - 28483, 28488, 28493, 28498, 28504, 28509, 28514, 0, 0, 0, 0, 28519, 0, 0, - 0, 28524, 28529, 28534, 28539, 28543, 28547, 28551, 28555, 28559, 28563, - 28567, 28571, 28575, 28580, 28586, 28592, 28598, 28603, 28608, 28614, - 28620, 28626, 28631, 28637, 28642, 28648, 28654, 28659, 28665, 28671, - 28677, 28682, 28687, 28692, 28698, 28704, 28709, 28715, 28720, 28726, - 28731, 28737, 0, 0, 28743, 28749, 28755, 28761, 28767, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28773, 28780, 28787, 28793, 28800, 28807, 28813, 28820, - 28827, 28834, 28840, 28846, 28853, 28859, 28865, 28872, 28879, 28885, - 28892, 28899, 28905, 28911, 28918, 28924, 28930, 28937, 28943, 28950, - 28957, 28964, 28971, 28978, 28985, 28991, 28998, 29005, 29011, 29018, - 29025, 29032, 29039, 29046, 29053, 29060, 0, 0, 0, 0, 29067, 29075, - 29082, 29089, 29095, 29102, 29108, 29115, 29121, 29128, 29135, 29142, - 29149, 29156, 29163, 29170, 29177, 29184, 29191, 29198, 29205, 29211, - 29218, 29225, 29232, 29238, 0, 0, 0, 0, 0, 0, 29244, 29250, 29255, 29260, - 29265, 29270, 29275, 29280, 29285, 29290, 29295, 0, 0, 0, 29301, 29307, - 29313, 29317, 29323, 29329, 29335, 29341, 29347, 29353, 29359, 29365, - 29371, 29377, 29383, 29389, 29395, 29401, 29407, 29411, 29417, 29423, - 29429, 29435, 29441, 29447, 29453, 29459, 29465, 29471, 29477, 29483, - 29489, 29495, 29501, 29505, 29510, 29515, 29520, 29524, 29529, 29533, - 29538, 29543, 29548, 29552, 29557, 29562, 29567, 29572, 29577, 29581, - 29585, 29590, 29595, 29599, 29603, 29607, 29612, 29617, 29622, 29627, 0, - 0, 29633, 29637, 29644, 29649, 29655, 29661, 29666, 29672, 29678, 29683, - 29689, 29695, 29701, 29706, 29712, 29717, 29722, 29728, 29733, 29739, - 29744, 29750, 29756, 29762, 29768, 29772, 29777, 29782, 29788, 29794, - 29799, 29805, 29811, 29815, 29820, 29825, 29829, 29834, 29839, 29844, - 29849, 29855, 29861, 29866, 29871, 29876, 29880, 29885, 29889, 29894, - 29898, 29903, 29908, 29913, 29918, 29924, 29930, 29937, 29947, 29956, - 29963, 29969, 29979, 29984, 29990, 0, 29995, 30000, 30005, 30013, 30019, - 30027, 30032, 30038, 30044, 30050, 30055, 30061, 30066, 30073, 30079, - 30084, 30090, 30096, 30102, 30109, 30116, 30123, 30128, 30133, 30140, - 30147, 30154, 30161, 30168, 0, 0, 30175, 30182, 30189, 30195, 30201, - 30207, 30213, 30219, 30225, 30231, 30237, 0, 0, 0, 0, 0, 0, 30243, 30249, - 30254, 30259, 30264, 30269, 30274, 30279, 30284, 30289, 0, 0, 0, 0, 0, 0, - 30294, 30299, 30304, 30309, 30314, 30319, 30324, 30333, 30340, 30345, - 30350, 30355, 30360, 30365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30370, 30376, - 30382, 30386, 30390, 30394, 30398, 30404, 30408, 30414, 30418, 30424, - 30430, 30438, 30444, 30452, 30456, 30460, 30464, 30470, 30473, 30479, - 30483, 30489, 30493, 30497, 30503, 30507, 30513, 30517, 30523, 30531, - 30539, 30547, 30553, 30557, 30563, 30567, 30573, 30576, 30579, 30585, - 30589, 30595, 30598, 30601, 30604, 30608, 30612, 30618, 30624, 30627, - 30630, 30634, 30639, 30644, 30651, 30656, 30663, 30670, 30679, 30686, - 30695, 30700, 30707, 30714, 30723, 30728, 30735, 30740, 30746, 30752, - 30758, 30764, 30770, 30776, 0, 0, 0, 0, 30782, 30786, 30789, 30792, - 30795, 30798, 30801, 30804, 30807, 30810, 30813, 30816, 30819, 30822, - 30827, 30832, 30837, 30840, 30845, 30850, 30855, 30860, 30867, 30872, - 30877, 30882, 30887, 30894, 30900, 30906, 30912, 30918, 30924, 30933, - 30942, 30948, 30954, 30962, 30970, 30979, 30988, 30996, 31004, 31013, - 31022, 0, 0, 0, 31030, 31034, 31038, 31042, 31045, 31048, 31051, 31055, - 31058, 31061, 31065, 31068, 31072, 31076, 31080, 31084, 31088, 31092, - 31096, 31100, 31104, 31107, 31110, 31114, 31118, 31122, 31125, 31128, - 31131, 31135, 31139, 31142, 31146, 31149, 31154, 31159, 31164, 31169, - 31174, 31179, 31184, 31189, 31194, 31198, 31202, 31208, 31215, 31219, - 31223, 31227, 31230, 31233, 31236, 31239, 31242, 31245, 31248, 31251, - 31254, 31257, 31261, 31265, 31269, 31274, 31278, 31282, 31288, 31292, - 31298, 31304, 31309, 31316, 31320, 31326, 31330, 31336, 31341, 31348, - 31355, 31360, 31367, 31372, 31377, 31381, 31387, 31391, 31397, 31404, - 31411, 31415, 31421, 31427, 31431, 31437, 31442, 31447, 31454, 31459, - 31464, 31469, 31474, 31478, 31482, 31487, 31492, 31499, 31505, 31510, - 31517, 31522, 31529, 31534, 31543, 31549, 31555, 31559, 0, 0, 0, 0, 0, 0, - 0, 0, 31563, 31572, 31579, 31586, 31593, 31596, 31600, 31604, 31608, - 31612, 31616, 31620, 31624, 31628, 31632, 31636, 31640, 31644, 31647, - 31650, 31654, 31658, 31662, 31666, 31670, 31674, 31677, 31681, 31685, - 31689, 31693, 31696, 31699, 31703, 31706, 31710, 31714, 31717, 31721, - 31725, 31728, 31733, 31738, 31743, 31747, 31751, 31756, 31760, 31765, - 31769, 31774, 31778, 31782, 31787, 31792, 31796, 31801, 31806, 31811, - 31815, 0, 0, 0, 31819, 31824, 31833, 31838, 31845, 31850, 31854, 31857, - 31860, 31863, 31866, 31869, 31872, 31875, 31878, 0, 0, 0, 31881, 31885, - 31889, 31893, 31900, 31906, 31912, 31918, 31924, 31930, 31936, 31942, - 31948, 31954, 31961, 31968, 31975, 31982, 31989, 31996, 32003, 32010, - 32017, 32024, 32031, 32038, 32045, 32052, 32059, 32066, 32073, 32080, - 32087, 32094, 32101, 32108, 32115, 32122, 32129, 32136, 32143, 32150, - 32157, 32164, 32172, 32180, 32188, 32194, 32200, 32206, 32214, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32223, 32230, 32237, 32244, 32251, - 32260, 32269, 32278, 0, 0, 0, 0, 0, 0, 0, 0, 32287, 32292, 32297, 32302, - 32307, 32316, 32327, 32336, 32347, 32353, 32366, 32372, 32379, 32386, - 32391, 32397, 32403, 32414, 32423, 32430, 32437, 32446, 32453, 32462, - 32472, 32482, 32489, 32496, 32503, 32513, 32518, 32526, 32532, 32540, - 32549, 32554, 32561, 32567, 32572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32577, - 32582, 32588, 32595, 32603, 32609, 32615, 32621, 32626, 32633, 32639, - 32645, 32651, 32659, 32664, 32672, 32677, 32683, 32689, 32696, 32704, - 32711, 32717, 32724, 32731, 32737, 32744, 32751, 32757, 32762, 32768, - 32776, 32784, 32790, 32796, 32802, 32808, 32816, 32820, 32826, 32832, - 32838, 32844, 32850, 32856, 32860, 32865, 32870, 32877, 32882, 32886, - 32892, 32897, 32902, 32906, 32911, 32916, 32920, 32924, 32929, 32936, - 32940, 32945, 32950, 32954, 32959, 32963, 32968, 32972, 32978, 32983, - 32990, 32995, 33000, 33004, 33009, 33014, 33021, 33026, 33032, 33037, - 33041, 33046, 33050, 33055, 33062, 33069, 33074, 33079, 33083, 33089, - 33095, 33100, 33105, 33110, 33116, 33121, 33127, 33132, 33138, 33144, - 33150, 33157, 33164, 33171, 33178, 33185, 33192, 33197, 33205, 33214, - 33223, 33232, 33241, 33250, 33259, 33271, 33280, 33289, 33298, 33305, - 33310, 33317, 33325, 33333, 33340, 33347, 33354, 33361, 33369, 33378, - 33387, 33396, 33405, 33414, 33423, 33432, 33441, 33450, 33459, 33468, - 33477, 33486, 33495, 33503, 33512, 33523, 33531, 33540, 33551, 33560, - 33569, 33578, 33587, 33595, 33604, 33611, 33616, 33624, 33629, 33636, - 33641, 33650, 33656, 33663, 33670, 33675, 33680, 33688, 33696, 33705, - 33714, 33719, 33726, 33737, 33745, 33754, 33760, 33766, 33771, 33778, - 33783, 33792, 33797, 33802, 33807, 33814, 33821, 33826, 33835, 33843, - 33848, 33853, 33860, 33867, 33871, 33875, 33878, 33881, 33884, 33887, - 33890, 33893, 33900, 33903, 33906, 33911, 33915, 33919, 33923, 33927, - 33931, 33940, 33946, 33952, 33958, 33966, 33974, 33980, 33986, 33993, - 33999, 34004, 34010, 34016, 34022, 34029, 34035, 34043, 34049, 34056, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34062, 34069, - 34076, 34081, 34090, 34098, 34106, 34113, 34120, 34127, 34134, 34142, - 34150, 34160, 34170, 34178, 34186, 34194, 34202, 34211, 34220, 34228, - 34236, 34245, 34254, 34264, 34274, 34283, 34292, 34300, 34308, 34316, - 34324, 34334, 34344, 34352, 34360, 34368, 34376, 34384, 34392, 34400, - 34408, 34416, 34424, 34432, 34440, 34449, 34458, 34467, 34476, 34486, - 34496, 34503, 34510, 34518, 34526, 34535, 34544, 34552, 34560, 34572, - 34584, 34593, 34602, 34611, 34620, 34627, 34634, 34642, 34650, 34658, - 34666, 34674, 34682, 34690, 34698, 34707, 34716, 34725, 34734, 34743, - 34752, 34762, 34772, 34782, 34792, 34801, 34810, 34817, 34824, 34832, - 34840, 34848, 34856, 34864, 34872, 34884, 34896, 34905, 34914, 34922, - 34930, 34938, 34946, 34957, 34968, 34979, 34990, 35002, 35014, 35022, - 35030, 35038, 35046, 35055, 35064, 35073, 35082, 35090, 35098, 35106, - 35114, 35122, 35130, 35139, 35148, 35158, 35168, 35175, 35182, 35190, - 35198, 35206, 35214, 35221, 35228, 35236, 35244, 35252, 35260, 35268, - 35276, 35284, 35292, 35300, 35308, 35316, 35324, 35332, 35340, 35348, - 35356, 35365, 35374, 35383, 35391, 35400, 35409, 35418, 35427, 35437, - 35446, 35453, 35458, 35465, 35472, 35480, 35488, 35497, 35506, 35516, - 35526, 35537, 35548, 35557, 35566, 35576, 35586, 35595, 35604, 35614, - 35624, 35635, 35646, 35655, 35664, 35674, 35684, 35691, 35698, 35706, - 35714, 35720, 35726, 35735, 35744, 35754, 35764, 35775, 35786, 35795, - 35804, 35814, 35824, 35833, 35842, 35850, 35858, 35865, 35872, 35880, - 35888, 35897, 35906, 35916, 35926, 35937, 35948, 35957, 35966, 35976, - 35986, 35995, 36004, 36014, 36024, 36035, 36046, 36055, 36064, 36074, - 36084, 36091, 36098, 36106, 36114, 36123, 36132, 36142, 36152, 36163, - 36174, 36183, 36192, 36202, 36212, 36220, 36228, 36236, 36244, 36253, - 36262, 36269, 36276, 36283, 36290, 36297, 36304, 36312, 36320, 36328, - 36336, 36347, 36358, 36369, 36380, 36391, 36402, 36410, 36418, 36429, - 36440, 36451, 36462, 36473, 36484, 36492, 36500, 36511, 36522, 36533, 0, - 0, 36544, 36552, 36560, 36571, 36582, 36593, 0, 0, 36604, 36612, 36620, - 36631, 36642, 36653, 36664, 36675, 36686, 36694, 36702, 36713, 36724, - 36735, 36746, 36757, 36768, 36776, 36784, 36795, 36806, 36817, 36828, - 36839, 36850, 36858, 36866, 36877, 36888, 36899, 36910, 36921, 36932, - 36940, 36948, 36959, 36970, 36981, 0, 0, 36992, 37000, 37008, 37019, - 37030, 37041, 0, 0, 37052, 37060, 37068, 37079, 37090, 37101, 37112, - 37123, 0, 37134, 0, 37142, 0, 37153, 0, 37164, 37175, 37183, 37191, - 37202, 37213, 37224, 37235, 37246, 37257, 37265, 37273, 37284, 37295, - 37306, 37317, 37328, 37339, 37347, 37355, 37363, 37371, 37379, 37387, - 37395, 37403, 37411, 37419, 37427, 37435, 37443, 0, 0, 37451, 37462, - 37473, 37487, 37501, 37515, 37529, 37543, 37557, 37568, 37579, 37593, - 37607, 37621, 37635, 37649, 37663, 37674, 37685, 37699, 37713, 37727, - 37741, 37755, 37769, 37780, 37791, 37805, 37819, 37833, 37847, 37861, - 37875, 37886, 37897, 37911, 37925, 37939, 37953, 37967, 37981, 37992, - 38003, 38017, 38031, 38045, 38059, 38073, 38087, 38095, 38103, 38114, - 38122, 0, 38133, 38141, 38152, 38160, 38168, 38176, 38184, 38192, 38195, - 38198, 38201, 38204, 38210, 38221, 38229, 0, 38240, 38248, 38259, 38267, - 38275, 38283, 38291, 38299, 38305, 38311, 38317, 38325, 38333, 38344, 0, - 0, 38355, 38363, 38374, 38382, 38390, 38398, 0, 38406, 38412, 38418, - 38424, 38432, 38440, 38451, 38462, 38470, 38478, 38486, 38497, 38505, - 38513, 38521, 38529, 38537, 38543, 38549, 0, 0, 38552, 38563, 38571, 0, - 38582, 38590, 38601, 38609, 38617, 38625, 38633, 38641, 38644, 0, 38647, - 38651, 38655, 38659, 38663, 38667, 38671, 38675, 38679, 38683, 38687, - 38691, 38697, 38703, 38709, 38712, 38715, 38717, 38721, 38725, 38729, - 38733, 38735, 38739, 38743, 38749, 38755, 38762, 38769, 38774, 38779, - 38785, 38791, 38793, 38796, 38798, 38802, 38806, 38810, 38813, 38817, - 38821, 38825, 38829, 38833, 38839, 38843, 38847, 38853, 38858, 38865, - 38867, 38870, 38874, 38878, 38883, 38889, 38891, 38900, 38909, 38912, - 38916, 38918, 38920, 38922, 38925, 38931, 38933, 38937, 38941, 38948, - 38955, 38959, 38964, 38969, 38974, 38979, 38983, 38987, 38990, 38994, - 38998, 39005, 39010, 39014, 39018, 39023, 39027, 39031, 39036, 39041, - 39045, 39049, 39053, 39055, 39060, 39065, 39069, 39073, 39077, 39081, 0, - 0, 0, 0, 0, 39085, 39091, 39097, 39104, 39111, 39116, 39121, 39125, 0, 0, - 39131, 39134, 39137, 39140, 39143, 39146, 39149, 39153, 39157, 39162, - 39167, 39172, 39179, 39183, 39186, 39189, 39192, 39195, 39198, 39201, - 39204, 39207, 39210, 39214, 39218, 39223, 39228, 0, 39233, 39239, 39245, - 39251, 39258, 39265, 39272, 39279, 39285, 39291, 39298, 39305, 39312, 0, - 0, 0, 39319, 39322, 39325, 39328, 39333, 39336, 39339, 39342, 39345, - 39348, 39351, 39355, 39358, 39361, 39364, 39367, 39370, 39375, 39378, - 39381, 39384, 39387, 39390, 39395, 39398, 39401, 39406, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39411, 39416, 39421, 39428, - 39436, 39441, 39446, 39450, 39454, 39459, 39466, 39473, 39477, 39482, - 39487, 39492, 39497, 39504, 39509, 39514, 39519, 39528, 39535, 39542, - 39546, 39551, 39557, 39562, 39569, 39578, 39587, 39591, 39595, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39599, 39603, 39611, 39615, 39619, - 39624, 39628, 39632, 39636, 39638, 39642, 39646, 39650, 39655, 39659, - 39663, 39671, 39674, 39678, 39681, 39684, 39690, 39694, 39697, 39703, - 39707, 39711, 39715, 39718, 39722, 39725, 39729, 39731, 39734, 39737, - 39741, 39743, 39747, 39750, 39753, 39758, 39763, 39770, 39773, 39776, - 39780, 39785, 39788, 39791, 39794, 39798, 39803, 39806, 39809, 39811, - 39814, 39817, 39820, 39824, 39829, 39832, 39836, 39840, 39844, 39848, - 39853, 39859, 39864, 39869, 39875, 39880, 39885, 39889, 39893, 39898, - 39902, 39906, 39909, 39911, 39916, 39922, 39929, 39936, 39943, 39950, - 39957, 39964, 39971, 39978, 39986, 39993, 40001, 40008, 40015, 40023, - 40031, 40036, 40041, 40046, 40051, 40056, 40061, 40066, 40071, 40076, - 40081, 40087, 40093, 40099, 40105, 40112, 40120, 40127, 40133, 40139, - 40145, 40151, 40157, 40163, 40169, 40175, 40181, 40188, 40195, 40202, - 40209, 40217, 40226, 40234, 40245, 40253, 40261, 40270, 40277, 40286, - 40295, 40303, 40312, 0, 0, 0, 0, 0, 0, 40320, 40322, 40325, 40327, 40330, - 40333, 40336, 40341, 40346, 40351, 40356, 40360, 40364, 40368, 40372, - 40377, 40383, 40388, 40394, 40399, 40404, 40409, 40415, 40420, 40426, - 40432, 40436, 40440, 40445, 40450, 40455, 40460, 40465, 40473, 40481, - 40489, 40497, 40504, 40512, 40519, 40526, 40535, 40547, 40553, 40559, - 40567, 40575, 40584, 40593, 40601, 40609, 40618, 40627, 40632, 40640, - 40645, 40650, 40656, 40661, 40667, 40674, 40681, 40686, 40692, 40697, - 40700, 40704, 40707, 40711, 40715, 40719, 40725, 40731, 40737, 40743, - 40747, 40751, 40755, 40759, 40765, 40771, 40775, 40780, 40784, 40789, - 40794, 40799, 40802, 40806, 40809, 40813, 40820, 40828, 40839, 40850, - 40855, 40864, 40871, 40880, 40889, 40893, 40899, 40907, 40911, 40916, - 40921, 40927, 40933, 40939, 40946, 40950, 40954, 40959, 40962, 40964, - 40968, 40972, 40980, 40984, 40986, 40988, 40992, 41000, 41005, 41011, - 41021, 41028, 41033, 41037, 41041, 41045, 41048, 41051, 41054, 41058, - 41062, 41066, 41070, 41074, 41077, 41081, 41085, 41088, 41090, 41093, - 41095, 41099, 41103, 41105, 41111, 41114, 41119, 41123, 41127, 41129, - 41131, 41133, 41136, 41140, 41144, 41148, 41152, 41156, 41162, 41168, - 41170, 41172, 41174, 41176, 41179, 41181, 41185, 41187, 41191, 41194, - 41200, 41204, 41208, 41211, 41214, 41218, 41224, 41228, 41238, 41248, - 41252, 41258, 41264, 41267, 41271, 41274, 41279, 41283, 41289, 41293, - 41305, 41313, 41317, 41321, 41327, 41331, 41334, 41336, 41339, 41343, - 41347, 41354, 41358, 41362, 41366, 41369, 41374, 41379, 41384, 41389, - 41394, 41399, 41407, 41415, 41419, 41423, 41425, 41430, 41434, 41438, - 41446, 41454, 41460, 41466, 41475, 41484, 41489, 41494, 41502, 41510, - 41512, 41514, 41519, 41524, 41530, 41536, 41542, 41548, 41552, 41556, - 41563, 41570, 41576, 41582, 41592, 41602, 41610, 41618, 41620, 41624, - 41628, 41633, 41638, 41645, 41652, 41655, 41658, 41661, 41664, 41667, - 41672, 41676, 41681, 41686, 41689, 41692, 41695, 41698, 41701, 41705, - 41708, 41711, 41714, 41717, 41719, 41721, 41723, 41725, 41733, 41741, - 41747, 41751, 41757, 41767, 41773, 41779, 41785, 41793, 41801, 41812, - 41816, 41820, 41822, 41828, 41830, 41832, 41834, 41836, 41842, 41845, - 41851, 41857, 41861, 41865, 41869, 41872, 41876, 41880, 41882, 41891, - 41900, 41905, 41910, 41916, 41922, 41928, 41931, 41934, 41937, 41940, - 41942, 41947, 41952, 41957, 41963, 41969, 41977, 41985, 41991, 41997, - 42003, 42009, 42018, 42027, 42036, 42045, 42054, 42063, 42072, 42081, - 42090, 42099, 42107, 42119, 42129, 42144, 42147, 42152, 42158, 42164, - 42171, 42185, 42200, 42206, 42212, 42219, 42225, 42233, 42239, 42252, - 42266, 42271, 42277, 42284, 42287, 42290, 42292, 42295, 42298, 42300, - 42302, 42306, 42309, 42312, 42315, 42318, 42323, 42328, 42333, 42338, - 42343, 42346, 42348, 42350, 42352, 42356, 42360, 42364, 42370, 42375, - 42377, 42379, 42384, 42389, 42394, 42399, 42404, 42409, 42411, 42413, - 42422, 42426, 42434, 42443, 42445, 42450, 42455, 42463, 42467, 42469, - 42473, 42475, 42479, 42483, 42487, 42489, 42491, 42493, 42500, 42509, - 42518, 42527, 42536, 42545, 42554, 42563, 42572, 42580, 42588, 42597, - 42606, 42615, 42624, 42632, 42640, 42649, 42658, 42667, 42677, 42686, - 42696, 42705, 42715, 42724, 42734, 42744, 42753, 42763, 42772, 42782, - 42791, 42801, 42810, 42819, 42828, 42837, 42846, 42856, 42865, 42874, - 42883, 42893, 42902, 42911, 42920, 42929, 42939, 42949, 42958, 42967, - 42975, 42983, 42990, 42998, 43007, 43018, 43027, 43036, 43045, 43052, - 43059, 43066, 43075, 43084, 43093, 43102, 43109, 43114, 43123, 43128, - 43131, 43139, 43142, 43147, 43152, 43155, 43158, 43166, 43169, 43174, - 43177, 43184, 43189, 43197, 43200, 43203, 43206, 43211, 43216, 43219, - 43222, 43230, 43233, 43240, 43247, 43251, 43255, 43260, 43265, 43271, - 43276, 43282, 43288, 43293, 43299, 43307, 43313, 43321, 43329, 43335, - 43343, 43351, 43360, 43368, 43374, 43382, 43391, 43399, 43403, 43408, - 43421, 43434, 43438, 43442, 43446, 43450, 43460, 43464, 43469, 43474, - 43479, 43484, 43489, 43494, 43504, 43514, 43522, 43532, 43542, 43550, - 43560, 43570, 43578, 43588, 43598, 43606, 43614, 43624, 43634, 43637, - 43640, 43643, 43648, 43652, 43658, 43665, 43672, 43680, 43687, 43691, - 43695, 43699, 43703, 43705, 43709, 43713, 43718, 43723, 43730, 43737, - 43740, 43747, 43749, 43751, 43755, 43759, 43764, 43770, 43776, 43782, - 43788, 43797, 43806, 43815, 43819, 43821, 43825, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43832, 43836, 43843, 43850, 43857, 43864, 43868, 43872, - 43876, 43880, 43885, 43891, 43896, 43902, 43908, 43914, 43920, 43928, - 43935, 43942, 43949, 43956, 43961, 43967, 43976, 43980, 43987, 43991, - 43995, 44001, 44007, 44013, 44019, 44023, 44027, 44030, 44033, 44037, - 44044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 44051, 44054, 44058, 44062, 44068, 44074, 44080, 44088, 44095, - 44099, 44107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 44112, 44115, 44118, 44121, 44124, 44127, 44130, 44133, 44136, 44139, - 44143, 44147, 44151, 44155, 44159, 44163, 44167, 44171, 44175, 44179, - 44183, 44186, 44189, 44192, 44195, 44198, 44201, 44204, 44207, 44210, - 44214, 44218, 44222, 44226, 44230, 44234, 44238, 44242, 44246, 44250, - 44254, 44260, 44266, 44272, 44279, 44286, 44293, 44300, 44307, 44314, - 44321, 44328, 44335, 44342, 44349, 44356, 44363, 44370, 44377, 44384, - 44391, 44396, 44402, 44408, 44414, 44419, 44425, 44431, 44437, 44442, - 44448, 44454, 44459, 44464, 44470, 44475, 44481, 44487, 44492, 44498, - 44504, 44509, 44515, 44521, 44527, 44533, 44539, 44544, 44550, 44556, - 44562, 44567, 44573, 44579, 44585, 44590, 44596, 44602, 44607, 44612, - 44618, 44623, 44629, 44635, 44640, 44646, 44652, 44657, 44663, 44669, - 44675, 44681, 44687, 44692, 44698, 44704, 44710, 44715, 44721, 44727, - 44733, 44738, 44744, 44750, 44755, 44760, 44766, 44771, 44777, 44783, - 44788, 44794, 44800, 44805, 44811, 44817, 44823, 44829, 44835, 44839, - 44844, 44849, 44854, 44859, 44864, 44869, 44874, 44879, 44884, 44889, - 44893, 44897, 44901, 44905, 44909, 44913, 44917, 44921, 44925, 44930, - 44935, 44940, 44945, 44950, 44955, 44964, 44973, 44982, 44991, 45000, - 45009, 45018, 45027, 45034, 45042, 45050, 45057, 45064, 45072, 45080, - 45087, 45094, 45102, 45110, 45117, 45124, 45132, 45140, 45147, 45154, - 45162, 45171, 45180, 45188, 45197, 45206, 45213, 45220, 45228, 45237, - 45246, 45254, 45263, 45272, 45279, 45286, 45295, 45304, 45312, 45320, - 45329, 45338, 45345, 45352, 45361, 45370, 45378, 45386, 45395, 45404, - 45411, 45418, 45427, 45436, 45444, 45453, 45462, 45470, 45480, 45490, - 45500, 45510, 45519, 45528, 45537, 45546, 45553, 45561, 45569, 45577, - 45585, 45590, 45595, 45604, 45612, 45619, 45628, 45636, 45643, 45652, - 45660, 45667, 45676, 45684, 45691, 45700, 45708, 45715, 45724, 45732, - 45739, 45748, 45756, 45763, 45772, 45780, 45787, 45796, 45804, 45811, - 45820, 45829, 45838, 45847, 45861, 45875, 45882, 45887, 45892, 45897, - 45902, 45907, 45912, 45917, 45922, 45930, 45938, 45946, 45954, 45959, - 45966, 45973, 45980, 45985, 45993, 46000, 46008, 46012, 46019, 46025, - 46032, 46036, 46042, 46048, 46054, 46058, 46061, 46065, 46069, 46076, - 46082, 46088, 46094, 46100, 46114, 46124, 46138, 46152, 46158, 46168, - 46182, 46185, 46188, 46195, 46203, 46208, 46213, 46221, 46233, 46245, - 46253, 46257, 46261, 46264, 46267, 46271, 46275, 46278, 46281, 46286, - 46291, 46297, 46303, 46308, 46313, 46319, 46325, 46330, 46335, 46340, - 46345, 46351, 46357, 46362, 46367, 46373, 46379, 46384, 46389, 46392, - 46395, 46404, 46406, 46408, 46411, 46415, 46421, 46423, 46426, 46433, - 46440, 46448, 46456, 46466, 46480, 46485, 46490, 46494, 46499, 46507, - 46515, 46524, 46533, 46542, 46551, 46556, 46561, 46567, 46573, 46579, - 46585, 46588, 46594, 46600, 46610, 46620, 46628, 46636, 46645, 46654, - 46658, 46666, 46674, 46682, 46690, 46699, 46708, 46717, 46726, 46731, - 46736, 46741, 46746, 46751, 46757, 46763, 46768, 46774, 46776, 46778, - 46780, 46782, 46785, 46788, 46790, 46792, 46794, 46798, 46802, 46804, - 46806, 46809, 46812, 46816, 46822, 46828, 46830, 46837, 46841, 46846, - 46851, 46853, 46863, 46869, 46875, 46881, 46887, 46893, 46899, 46904, - 46907, 46910, 46913, 46915, 46917, 46921, 46925, 46930, 46935, 46940, - 46943, 46947, 46952, 46955, 46959, 46964, 46969, 46974, 46979, 46984, - 46989, 46994, 46999, 47004, 47009, 47014, 47019, 47025, 47031, 47037, - 47039, 47042, 47044, 47047, 47049, 47051, 47053, 47055, 47057, 47059, - 47061, 47063, 47065, 47067, 47069, 47071, 47073, 47075, 47077, 47079, - 47081, 47086, 47091, 47096, 47101, 47106, 47111, 47116, 47121, 47126, - 47131, 47136, 47141, 47146, 47151, 47156, 47161, 47166, 47171, 47176, - 47181, 47185, 47189, 47193, 47199, 47205, 47210, 47215, 47220, 47225, - 47230, 47235, 47243, 47251, 47259, 47267, 47275, 47283, 47291, 47299, - 47305, 47310, 47315, 47320, 47323, 47327, 47331, 47335, 47339, 47343, - 47347, 47354, 47361, 47369, 47377, 47382, 47387, 47394, 47401, 47408, - 47415, 47418, 47421, 47426, 47428, 47432, 47437, 47439, 47441, 47443, - 47445, 47450, 47453, 47455, 47460, 47467, 47474, 47477, 47481, 47486, - 47491, 47499, 47505, 47511, 47523, 47530, 47537, 47542, 47547, 47553, - 47556, 47559, 47564, 47566, 47570, 47572, 47574, 47576, 47578, 47580, - 47582, 47587, 47589, 47591, 47593, 47595, 47599, 47601, 47604, 47609, - 47614, 47619, 47624, 47630, 47636, 47638, 47641, 47648, 47655, 47662, - 47669, 47673, 47677, 47679, 47681, 47685, 47691, 47696, 47698, 47702, - 47711, 47719, 47727, 47733, 47739, 47744, 47750, 47755, 47758, 47772, - 47775, 47780, 47785, 47791, 47801, 47803, 47809, 47815, 47819, 47826, - 47830, 47832, 47834, 47838, 47844, 47849, 47855, 47857, 47863, 47865, - 47871, 47873, 47875, 47880, 47882, 47886, 47891, 47893, 47898, 47903, - 47907, 47914, 0, 47924, 47930, 47933, 47939, 47942, 47947, 47952, 47956, - 47958, 47960, 47964, 47968, 47972, 47976, 47981, 47983, 47988, 47991, - 47994, 47997, 48001, 48005, 48010, 48014, 48019, 48024, 48028, 48033, - 48039, 48042, 48048, 48053, 48057, 48062, 48068, 48074, 48081, 48087, - 48094, 48101, 48103, 48110, 48114, 48120, 48126, 48131, 48137, 48141, - 48146, 48149, 48154, 48160, 48167, 48175, 48182, 48191, 48201, 48208, - 48214, 48218, 48225, 48230, 48239, 48242, 48245, 48254, 48264, 48271, - 48273, 48279, 48284, 48286, 48289, 48293, 48301, 48310, 48313, 48318, - 48323, 48331, 48339, 48347, 48355, 48361, 48367, 48373, 48381, 48386, - 48389, 48393, 48396, 48408, 48418, 48429, 48438, 48449, 48459, 48468, - 48474, 48482, 48486, 48494, 48498, 48506, 48513, 48520, 48529, 48538, - 48548, 48558, 48568, 48578, 48587, 48596, 48606, 48616, 48625, 48634, - 48640, 48646, 48652, 48658, 48664, 48670, 48676, 48682, 48688, 48695, - 48701, 48707, 48713, 48719, 48725, 48731, 48737, 48743, 48749, 48756, - 48763, 48770, 48777, 48784, 48791, 48798, 48805, 48812, 48819, 48827, - 48832, 48835, 48839, 48843, 48849, 48852, 48858, 48864, 48869, 48873, - 48878, 48884, 48891, 48894, 48901, 48908, 48912, 48921, 48930, 48935, - 48941, 48946, 48951, 48958, 48965, 48973, 48981, 48990, 48994, 49003, - 49008, 49012, 49019, 49023, 49030, 49038, 49043, 49051, 49055, 49060, - 49064, 49069, 49073, 49078, 49083, 49092, 49094, 49097, 49100, 49107, - 49114, 49119, 49127, 49133, 49139, 49144, 49147, 49152, 49157, 49162, - 49170, 49174, 49181, 49189, 49197, 49202, 49207, 49213, 49218, 49223, - 49229, 49234, 49237, 49241, 49245, 49252, 49261, 49266, 49275, 49284, - 49290, 49296, 49301, 49306, 49311, 49316, 49322, 49328, 49336, 49344, - 49350, 49356, 49361, 49366, 49373, 49380, 49386, 49389, 49392, 49396, - 49400, 49404, 49409, 49415, 49421, 49428, 49435, 49440, 49444, 49448, - 49452, 49456, 49460, 49464, 49468, 49472, 49476, 49480, 49484, 49488, - 49492, 49496, 49500, 49504, 49508, 49512, 49516, 49520, 49524, 49528, - 49532, 49536, 49540, 49544, 49548, 49552, 49556, 49560, 49564, 49568, - 49572, 49576, 49580, 49584, 49588, 49592, 49596, 49600, 49604, 49608, - 49612, 49616, 49620, 49624, 49628, 49632, 49636, 49640, 49644, 49648, - 49652, 49656, 49660, 49664, 49668, 49672, 49676, 49680, 49684, 49688, - 49692, 49696, 49700, 49704, 49708, 49712, 49716, 49720, 49724, 49728, - 49732, 49736, 49740, 49744, 49748, 49752, 49756, 49760, 49764, 49768, - 49772, 49776, 49780, 49784, 49788, 49792, 49796, 49800, 49804, 49808, - 49812, 49816, 49820, 49824, 49828, 49832, 49836, 49840, 49844, 49848, - 49852, 49856, 49860, 49864, 49868, 49872, 49876, 49880, 49884, 49888, - 49892, 49896, 49900, 49904, 49908, 49912, 49916, 49920, 49924, 49928, - 49932, 49936, 49940, 49944, 49948, 49952, 49956, 49960, 49964, 49968, - 49972, 49976, 49980, 49984, 49988, 49992, 49996, 50000, 50004, 50008, - 50012, 50016, 50020, 50024, 50028, 50032, 50036, 50040, 50044, 50048, - 50052, 50056, 50060, 50064, 50068, 50072, 50076, 50080, 50084, 50088, - 50092, 50096, 50100, 50104, 50108, 50112, 50116, 50120, 50124, 50128, - 50132, 50136, 50140, 50144, 50148, 50152, 50156, 50160, 50164, 50168, - 50172, 50176, 50180, 50184, 50188, 50192, 50196, 50200, 50204, 50208, - 50212, 50216, 50220, 50224, 50228, 50232, 50236, 50240, 50244, 50248, - 50252, 50256, 50260, 50264, 50268, 50272, 50276, 50280, 50284, 50288, - 50292, 50296, 50300, 50304, 50308, 50312, 50316, 50320, 50324, 50328, - 50332, 50336, 50340, 50344, 50348, 50352, 50356, 50360, 50364, 50368, - 50372, 50376, 50380, 50384, 50388, 50392, 50396, 50400, 50404, 50408, - 50412, 50416, 50420, 50424, 50428, 50432, 50436, 50440, 50444, 50448, - 50452, 50456, 50460, 50464, 50471, 50479, 50485, 50491, 50498, 50505, - 50511, 50517, 50523, 50529, 50534, 50539, 50544, 50549, 50555, 50561, - 50569, 50576, 50582, 50588, 50596, 50605, 50612, 50622, 50633, 50636, - 50639, 50643, 50647, 50654, 50661, 50672, 50683, 50693, 50703, 50710, - 50717, 50724, 50731, 50742, 50753, 50764, 50775, 50785, 50795, 50807, - 50819, 50830, 50841, 50853, 50865, 50874, 50884, 50894, 50905, 50916, - 50923, 50930, 50937, 50944, 50954, 50964, 50972, 50980, 50987, 50994, - 51001, 51008, 51015, 51020, 51025, 51031, 51039, 51049, 51059, 51069, - 51079, 51089, 51099, 51109, 51119, 51129, 51139, 51149, 51160, 51171, - 51181, 51191, 51202, 51213, 51223, 51233, 51244, 51255, 51265, 51275, - 51286, 51297, 51313, 51332, 51348, 51367, 51383, 51399, 51415, 51431, - 51442, 51454, 51465, 51477, 51496, 51515, 51523, 51529, 51536, 51543, - 51550, 51557, 51562, 51568, 51573, 51578, 51584, 51589, 51594, 51599, - 51604, 51609, 51616, 51621, 51628, 51633, 51638, 51642, 51646, 51653, - 51660, 51667, 51674, 51681, 51688, 51701, 51714, 51727, 51740, 51748, - 51756, 51762, 51768, 51775, 51782, 51789, 51796, 51800, 51805, 51813, - 51821, 51829, 51836, 51840, 51848, 51856, 51860, 51864, 51869, 51876, - 51884, 51892, 51911, 51930, 51949, 51968, 51987, 52006, 52025, 52044, - 52050, 52057, 52066, 52074, 52082, 52087, 52090, 52093, 52098, 52101, - 52120, 52127, 52133, 52139, 52143, 52146, 52149, 52152, 52164, 52177, - 52184, 52191, 52194, 52198, 52201, 52206, 52211, 52216, 52222, 52231, - 52238, 52245, 52253, 52260, 52267, 52270, 52276, 52282, 52285, 52288, - 52293, 52298, 52304, 52310, 52314, 52319, 52326, 52330, 52336, 52340, - 52344, 52352, 52364, 52373, 52377, 52379, 52388, 52397, 52403, 52406, - 52412, 52418, 52423, 52428, 52433, 52438, 52443, 52448, 52450, 52456, - 52461, 52468, 52472, 52478, 52481, 52485, 52492, 52499, 52501, 52503, - 52509, 52515, 52521, 52530, 52539, 52546, 52553, 52559, 52565, 52570, - 52575, 52580, 52586, 52592, 52597, 52604, 52608, 52612, 52625, 52638, - 52650, 52659, 52665, 52672, 52677, 52682, 52687, 52692, 52697, 52699, - 52706, 52713, 52720, 52727, 52734, 52742, 52748, 52753, 52759, 52765, - 52771, 52778, 52784, 52792, 52800, 52808, 52816, 52823, 52829, 52835, - 52844, 52848, 52857, 52866, 52875, 52883, 52887, 52893, 52900, 52907, - 52911, 52917, 52924, 52929, 52934, 52940, 52945, 52950, 52957, 52964, - 52969, 52974, 52982, 52990, 53000, 53010, 53017, 53024, 53028, 53032, - 53044, 53050, 53056, 53061, 53066, 53073, 53080, 53086, 53092, 53101, - 53109, 53117, 53124, 53131, 53138, 53144, 53151, 53157, 53164, 53171, - 53178, 53185, 53191, 53196, 53205, 53215, 53222, 53231, 53237, 53242, - 53247, 53257, 53263, 53269, 53275, 53283, 53288, 53295, 53302, 53313, - 53320, 53327, 53334, 53341, 53348, 53355, 53362, 53374, 53386, 53397, - 53408, 53421, 53434, 53439, 53444, 53453, 53462, 53469, 53476, 53485, - 53494, 53502, 53510, 53518, 53526, 53536, 53546, 53560, 53574, 53582, - 53590, 53602, 53614, 53622, 53630, 53640, 53650, 53655, 53660, 53669, - 53678, 53683, 53688, 53696, 53702, 53708, 53716, 53724, 53737, 53750, - 53754, 53758, 53765, 53772, 53779, 53787, 53795, 53804, 53813, 53819, - 53825, 53832, 53839, 53846, 53853, 53862, 53871, 53874, 53877, 53882, - 53887, 53893, 53899, 53906, 53913, 53923, 53933, 53940, 53947, 53955, - 53963, 53971, 53979, 53987, 53995, 54001, 54007, 54011, 54015, 54022, - 54029, 54034, 54039, 54044, 54049, 54055, 54069, 54076, 54083, 54087, - 54089, 54091, 54096, 54101, 54106, 54111, 54119, 54126, 54133, 54141, - 54153, 54161, 54169, 54180, 54184, 54188, 54194, 54202, 54215, 54222, - 54229, 54236, 54241, 54248, 54257, 54265, 54271, 54277, 54283, 54292, - 54301, 54309, 54318, 54323, 54326, 54331, 54337, 54343, 54349, 54355, - 54359, 54362, 54366, 54370, 54376, 54382, 54388, 54394, 54398, 54402, - 54409, 54416, 54423, 54430, 54437, 54444, 54454, 54464, 54471, 54478, - 54486, 54494, 54498, 54503, 54508, 54514, 54520, 54523, 54526, 54529, - 54532, 54536, 54541, 54546, 54551, 54556, 54561, 54565, 54569, 54573, - 54577, 54581, 54585, 54589, 54595, 54599, 54605, 54610, 54617, 54625, - 54632, 54640, 54647, 54655, 54664, 54671, 54681, 54692, 54698, 54707, - 54713, 54722, 54731, 54737, 54743, 54747, 54751, 54760, 54769, 54776, - 54783, 54792, 0, 0, 0, 54801, 54806, 54810, 54814, 54819, 54824, 54829, - 54837, 54845, 54848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54852, 54857, 54862, 54867, 54872, 54877, 54882, 54887, - 54892, 54897, 54902, 54908, 54912, 54917, 54922, 54927, 54932, 54937, - 54942, 54947, 54952, 54957, 54962, 54967, 54972, 54977, 54982, 54987, - 54992, 54997, 55002, 55007, 55012, 55017, 55022, 55028, 55033, 55039, - 55048, 55053, 55061, 55068, 55077, 55082, 55087, 55092, 55098, 0, 55105, - 55110, 55115, 55120, 55125, 55130, 55135, 55140, 55145, 55150, 55155, - 55161, 55165, 55170, 55175, 55180, 55185, 55190, 55195, 55200, 55205, - 55210, 55215, 55220, 55225, 55230, 55235, 55240, 55245, 55250, 55255, - 55260, 55265, 55270, 55275, 55281, 55286, 55292, 55301, 55306, 55314, - 55321, 55330, 55335, 55340, 55345, 55351, 0, 55358, 55366, 55374, 55383, - 55390, 55398, 55404, 55413, 55421, 55429, 55437, 55445, 55453, 55461, - 55466, 55473, 55479, 55486, 55494, 55501, 55508, 55516, 55522, 55528, - 55535, 55542, 55552, 55562, 55569, 55576, 55581, 55591, 55601, 55606, - 55611, 55616, 55621, 55626, 55631, 55636, 55641, 55646, 55651, 55656, - 55661, 55666, 55671, 55676, 55681, 55686, 55691, 55696, 55701, 55706, - 55711, 55716, 55721, 55726, 55731, 55736, 55741, 55746, 55751, 55755, - 55759, 55764, 55769, 55774, 55779, 55784, 55789, 55794, 55799, 55804, - 55809, 55814, 55819, 55824, 55829, 55834, 55839, 55844, 55849, 55856, - 55863, 55870, 55877, 55884, 55891, 55898, 55905, 55912, 55919, 55926, - 55933, 55940, 55947, 55952, 55957, 55964, 55971, 55978, 55985, 55992, - 55999, 56006, 56013, 56020, 56027, 56034, 56041, 56047, 56053, 56059, - 56065, 56072, 56079, 56086, 56093, 56100, 56107, 56114, 56121, 56128, - 56135, 56143, 56151, 56159, 56167, 56175, 56183, 56191, 56199, 56203, - 56209, 56215, 56219, 56225, 56231, 56237, 56244, 56251, 56258, 56265, - 56270, 56276, 56282, 56289, 0, 0, 0, 0, 0, 56296, 56304, 56313, 56322, - 56330, 56336, 56341, 56346, 56351, 56356, 56361, 56366, 56371, 56376, - 56381, 56386, 56391, 56396, 56401, 56406, 56411, 56416, 56421, 56426, - 56431, 56436, 56441, 56446, 56451, 56456, 56461, 56466, 56471, 56476, - 56481, 56486, 56491, 56496, 56501, 56506, 56511, 56516, 56521, 56526, - 56531, 0, 56536, 0, 0, 0, 0, 0, 56541, 0, 0, 56546, 56550, 56555, 56560, - 56565, 56570, 56579, 56584, 56589, 56594, 56599, 56604, 56609, 56614, - 56619, 56626, 56631, 56636, 56645, 56652, 56657, 56662, 56667, 56674, - 56679, 56686, 56691, 56696, 56703, 56710, 56715, 56720, 56725, 56732, - 56739, 56744, 56749, 56754, 56759, 56764, 56771, 56778, 56783, 56788, - 56793, 56798, 56803, 56808, 56813, 56818, 56823, 56828, 56833, 56840, - 56845, 56850, 0, 0, 0, 0, 0, 0, 0, 56855, 56862, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56867, 56872, 56876, 56880, 56884, 56888, 56892, 56896, - 56900, 56904, 56908, 56912, 56918, 56922, 56926, 56930, 56934, 56938, - 56942, 56946, 56950, 56954, 56958, 56962, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56966, 56970, 56974, 56978, 56982, 56986, 56990, 0, 56994, 56998, 57002, - 57006, 57010, 57014, 57018, 0, 57022, 57026, 57030, 57034, 57038, 57042, - 57046, 0, 57050, 57054, 57058, 57062, 57066, 57070, 57074, 0, 57078, - 57082, 57086, 57090, 57094, 57098, 57102, 0, 57106, 57110, 57114, 57118, - 57122, 57126, 57130, 0, 57134, 57138, 57142, 57146, 57150, 57154, 57158, - 0, 57162, 57166, 57170, 57174, 57178, 57182, 57186, 0, 57190, 57195, - 57200, 57205, 57210, 57215, 57220, 57224, 57229, 57234, 57239, 57243, - 57248, 57253, 57258, 57263, 57267, 57272, 57277, 57282, 57287, 57292, - 57297, 57301, 57306, 57311, 57318, 57323, 57328, 57334, 57341, 57348, - 57357, 57364, 57373, 57377, 57381, 57387, 57393, 57399, 57407, 57413, - 57417, 57421, 57425, 57431, 57437, 57441, 57443, 57447, 57453, 57455, - 57459, 57463, 57467, 57473, 57478, 57482, 57486, 57491, 57497, 57502, - 57507, 57512, 57517, 57524, 57531, 57536, 57541, 57546, 57551, 57556, - 57561, 57565, 57569, 57576, 57583, 57589, 57593, 57598, 57600, 57604, - 57612, 57616, 57620, 57624, 57628, 57634, 57640, 57644, 57650, 57654, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57658, 57662, - 57666, 57671, 57676, 57681, 57685, 57689, 57693, 57698, 57703, 57707, - 57711, 57715, 57719, 57724, 57729, 57734, 57739, 57743, 57747, 57752, - 57757, 57762, 57767, 57771, 0, 57775, 57779, 57783, 57787, 57791, 57795, - 57799, 57804, 57809, 57813, 57818, 57823, 57832, 57836, 57840, 57844, - 57851, 57855, 57860, 57865, 57869, 57873, 57879, 57884, 57889, 57894, - 57899, 57903, 57907, 57911, 57915, 57919, 57924, 57929, 57933, 57937, - 57942, 57947, 57952, 57956, 57960, 57965, 57970, 57976, 57982, 57986, - 57992, 57998, 58002, 58008, 58014, 58019, 58024, 58028, 58034, 58038, - 58042, 58048, 58054, 58059, 58064, 58068, 58072, 58080, 58086, 58092, - 58098, 58103, 58108, 58113, 58119, 58123, 58129, 58133, 58137, 58143, - 58149, 58155, 58161, 58167, 58173, 58179, 58185, 58191, 58197, 58203, - 58209, 58213, 58219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58225, 58228, - 58232, 58236, 58240, 58244, 58247, 58250, 58254, 58258, 58262, 58266, - 58269, 58274, 58278, 58282, 58286, 58291, 58295, 58299, 58303, 58307, - 58313, 58319, 58323, 58327, 58331, 58335, 58339, 58343, 58347, 58351, - 58355, 58359, 58363, 58369, 58373, 58377, 58381, 58385, 58389, 58393, - 58397, 58401, 58405, 58409, 58413, 58417, 58421, 58425, 58429, 58433, - 58439, 58445, 58450, 58455, 58459, 58463, 58467, 58471, 58475, 58479, - 58483, 58487, 58491, 58495, 58499, 58503, 58507, 58511, 58515, 58519, - 58523, 58527, 58531, 58535, 58539, 58543, 58547, 58551, 58557, 58561, - 58565, 58569, 58573, 58577, 58581, 58585, 58589, 58594, 58601, 58605, - 58609, 58613, 58617, 58621, 58625, 58629, 58633, 58637, 58641, 58645, - 58649, 58656, 58660, 58666, 58670, 58674, 58678, 58682, 58686, 58689, - 58693, 58697, 58701, 58705, 58709, 58713, 58717, 58721, 58725, 58729, - 58733, 58737, 58741, 58745, 58749, 58753, 58757, 58761, 58765, 58769, - 58773, 58777, 58781, 58785, 58789, 58793, 58797, 58801, 58805, 58809, - 58813, 58817, 58823, 58827, 58831, 58835, 58839, 58843, 58847, 58851, - 58855, 58859, 58863, 58867, 58871, 58875, 58879, 58883, 58887, 58891, - 58895, 58899, 58903, 58907, 58911, 58915, 58919, 58923, 58927, 58931, - 58939, 58943, 58947, 58951, 58955, 58959, 58965, 58969, 58973, 58977, - 58981, 58985, 58989, 58993, 58997, 59001, 59005, 59009, 59013, 59017, - 59023, 59027, 59031, 59035, 59039, 59043, 59047, 59051, 59055, 59059, - 59063, 59067, 59071, 59075, 59079, 59083, 59087, 59091, 59095, 59099, - 59103, 59107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 59111, 59120, 59128, 59140, 59151, 59159, 59168, 59177, - 59187, 59199, 59211, 59223, 0, 0, 0, 0, 59229, 59232, 59235, 59240, - 59243, 59250, 59254, 59258, 59262, 59266, 59270, 59275, 59280, 59284, - 59288, 59293, 59298, 59303, 59308, 59311, 59314, 59320, 59326, 59331, - 59336, 59343, 59350, 59354, 59358, 59362, 59370, 59376, 59383, 59388, - 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433, 59438, - 59443, 59448, 59453, 59459, 59464, 59468, 59474, 59485, 59495, 59510, - 59520, 59524, 59534, 59540, 59546, 59552, 59557, 59560, 59565, 59569, 0, - 59575, 59579, 59582, 59586, 59589, 59593, 59596, 59600, 59603, 59607, - 59610, 59613, 59617, 59621, 59625, 59629, 59633, 59637, 59641, 59645, - 59649, 59652, 59656, 59660, 59664, 59668, 59672, 59676, 59680, 59684, - 59688, 59692, 59696, 59700, 59704, 59709, 59713, 59717, 59721, 59725, - 59728, 59732, 59735, 59739, 59743, 59747, 59751, 59754, 59758, 59761, - 59765, 59769, 59773, 59777, 59781, 59785, 59789, 59793, 59797, 59801, - 59805, 59809, 59812, 59816, 59820, 59824, 59828, 59832, 59835, 59840, - 59844, 59849, 59853, 59856, 59860, 59864, 59868, 59872, 59877, 59881, - 59885, 59889, 59893, 59897, 59901, 59905, 0, 0, 59910, 59918, 59926, - 59933, 59940, 59944, 59950, 59955, 59960, 59964, 59967, 59971, 59974, - 59978, 59981, 59985, 59988, 59992, 59995, 59998, 60002, 60006, 60010, - 60014, 60018, 60022, 60026, 60030, 60034, 60037, 60041, 60045, 60049, - 60053, 60057, 60061, 60065, 60069, 60073, 60077, 60081, 60085, 60089, - 60094, 60098, 60102, 60106, 60110, 60113, 60117, 60120, 60124, 60128, - 60132, 60136, 60139, 60143, 60146, 60150, 60154, 60158, 60162, 60166, - 60170, 60174, 60178, 60182, 60186, 60190, 60194, 60197, 60201, 60205, - 60209, 60213, 60217, 60220, 60225, 60229, 60234, 60238, 60241, 60245, - 60249, 60253, 60257, 60262, 60266, 60270, 60274, 60278, 60282, 60286, - 60290, 60295, 60299, 60303, 60307, 60311, 60316, 60323, 60327, 60333, 0, - 0, 0, 0, 0, 60338, 60343, 60348, 60352, 60357, 60362, 60367, 60372, - 60376, 60381, 60386, 60391, 60396, 60401, 60406, 60411, 60416, 60421, - 60425, 60430, 60435, 60440, 60444, 60448, 60452, 60457, 60462, 60467, - 60472, 60477, 60482, 60487, 60492, 60497, 60502, 60506, 60510, 60515, - 60520, 60525, 60530, 0, 0, 0, 60535, 60539, 60543, 60547, 60551, 60555, - 60559, 60563, 60567, 60571, 60575, 60579, 60583, 60587, 60591, 60595, - 60599, 60603, 60607, 60611, 60615, 60619, 60623, 60627, 60631, 60635, - 60639, 60643, 60647, 60651, 60655, 60658, 60662, 60665, 60669, 60673, - 60676, 60680, 60684, 60687, 60691, 60695, 60699, 60703, 60706, 60710, - 60714, 60718, 60722, 60726, 60730, 60733, 60736, 60740, 60744, 60748, - 60752, 60756, 60760, 60764, 60768, 60772, 60776, 60780, 60784, 60788, - 60792, 60796, 60800, 60804, 60808, 60812, 60816, 60820, 60824, 60828, - 60832, 60836, 60840, 60844, 60848, 60852, 60856, 60860, 60864, 60868, - 60872, 60876, 60880, 60884, 60888, 60892, 60896, 60900, 0, 60904, 60910, - 60916, 60921, 60926, 60931, 60937, 60943, 60949, 60955, 60961, 60967, - 60973, 60979, 60985, 60991, 60997, 61002, 61007, 61012, 61017, 61022, - 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61062, 61067, 61072, - 61077, 61082, 61087, 61092, 61097, 61103, 61109, 61115, 61121, 61126, - 61131, 0, 0, 0, 0, 0, 61136, 61141, 61146, 61151, 61156, 61161, 61166, - 61171, 61176, 61181, 61186, 61191, 61196, 61201, 61206, 61211, 61216, - 61221, 61226, 61231, 61236, 61241, 61246, 61251, 61256, 61261, 61266, - 61271, 61276, 61281, 61286, 61291, 61296, 61301, 61306, 61311, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 61316, 61321, 61326, 61331, 61335, 61340, - 61344, 61349, 61354, 61359, 61364, 61369, 61373, 61378, 61383, 61388, - 61393, 61397, 61401, 61405, 61409, 61413, 61417, 61421, 61425, 61429, - 61433, 61437, 61441, 61445, 61449, 61454, 61459, 61464, 61469, 61474, - 61479, 61484, 61489, 61494, 61499, 61504, 61509, 61514, 61519, 61524, - 61530, 0, 61537, 61540, 61543, 61546, 61549, 61552, 61555, 61558, 61561, - 61564, 61568, 61572, 61576, 61580, 61584, 61588, 61592, 61596, 61600, - 61604, 61608, 61612, 61616, 61620, 61624, 61628, 61632, 61636, 61640, - 61644, 61648, 61652, 61656, 61660, 61664, 61668, 61672, 61676, 61680, - 61684, 61688, 61697, 61706, 61715, 61724, 61733, 61742, 61751, 61760, - 61763, 61768, 61773, 61778, 61783, 61788, 61793, 61798, 61803, 61808, - 61812, 61817, 61822, 61827, 61832, 61837, 61841, 61845, 61849, 61853, - 61857, 61861, 61865, 61869, 61873, 61877, 61881, 61885, 61889, 61893, - 61898, 61903, 61908, 61913, 61918, 61923, 61928, 61933, 61938, 61943, - 61948, 61953, 61958, 61963, 61969, 61975, 61980, 61985, 61988, 61991, - 61994, 61997, 62000, 62003, 62006, 62009, 62012, 62016, 62020, 62024, - 62028, 62032, 62036, 62040, 62044, 62048, 62052, 62056, 62060, 62064, - 62068, 62072, 62076, 62080, 62084, 62088, 62092, 62096, 62100, 62104, - 62108, 62112, 62116, 62120, 62124, 62128, 62132, 62136, 62140, 62144, - 62148, 62152, 62156, 62160, 62164, 62168, 62172, 62177, 62182, 62187, - 62192, 62196, 62201, 62206, 62211, 62216, 62221, 62226, 62231, 62236, - 62241, 62245, 62252, 62259, 62266, 62273, 62280, 62287, 62294, 62301, - 62308, 62315, 62322, 62329, 62332, 62335, 62338, 62343, 62346, 62349, - 62352, 62355, 62358, 62361, 62365, 62369, 62373, 62377, 62380, 62384, - 62388, 62392, 62396, 62400, 62404, 62408, 62412, 62415, 62418, 62422, - 62426, 62430, 62434, 62437, 62441, 62445, 62449, 62453, 62456, 62460, - 62464, 62468, 62472, 62475, 62479, 62483, 62486, 62490, 62494, 62498, - 62502, 62506, 62510, 62514, 0, 62518, 62521, 62524, 62527, 62530, 62533, - 62536, 62539, 62542, 62545, 62548, 62551, 62554, 62557, 62560, 62563, - 62566, 62569, 62572, 62575, 62578, 62581, 62584, 62587, 62590, 62593, - 62596, 62599, 62602, 62605, 62608, 62611, 62614, 62617, 62620, 62623, - 62626, 62629, 62632, 62635, 62638, 62641, 62644, 62647, 62650, 62653, - 62656, 62659, 62662, 62665, 62668, 62671, 62674, 62677, 62680, 62683, - 62686, 62689, 62692, 62695, 62698, 62701, 62704, 62707, 62710, 62713, - 62716, 62719, 62722, 62725, 62728, 62731, 62734, 62737, 62740, 62743, - 62746, 62749, 62752, 62755, 62758, 62761, 62764, 62767, 62770, 62773, - 62776, 62779, 62782, 62791, 62799, 62807, 62815, 62823, 62831, 62839, - 62847, 62855, 62863, 62872, 62881, 62890, 62899, 62908, 62917, 62926, - 62935, 62944, 62953, 62962, 62971, 62980, 62989, 62998, 63001, 63004, - 63007, 63009, 63012, 63015, 63018, 63023, 63028, 63031, 63038, 63045, - 63052, 63059, 63062, 63067, 63069, 63073, 63075, 63077, 63080, 63083, - 63086, 63089, 63092, 63095, 63098, 63103, 63108, 63111, 63114, 63117, - 63120, 63123, 63126, 63129, 63133, 63136, 63139, 63142, 63145, 63148, - 63152, 63155, 63158, 63161, 63166, 63171, 63176, 63181, 63186, 63191, - 63196, 63201, 63207, 63215, 63217, 63220, 63223, 63226, 63229, 63235, - 63243, 63246, 63249, 63254, 63257, 63260, 63263, 63268, 63271, 63274, - 63279, 63282, 63285, 63290, 63293, 63296, 63301, 63306, 63311, 63314, - 63317, 63320, 63323, 63329, 63332, 63335, 63338, 63340, 63343, 63346, - 63349, 63354, 63357, 63360, 63363, 63366, 63369, 63374, 63377, 63380, - 63383, 63386, 63389, 63392, 63395, 63398, 63401, 63406, 63410, 63418, - 63426, 63434, 63442, 63450, 63458, 63466, 63474, 63482, 63491, 63500, - 63509, 63518, 63527, 63536, 63545, 63554, 63563, 63572, 63581, 63590, - 63599, 63608, 63617, 63626, 63635, 63644, 63653, 63662, 63671, 63680, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63683, 63692, 63701, 63712, - 63719, 63724, 63729, 63736, 63743, 63749, 63754, 63759, 63764, 63769, - 63776, 63781, 63786, 63791, 63802, 63807, 63812, 63819, 63824, 63831, - 63836, 63841, 63848, 63855, 63862, 63871, 63880, 63885, 63890, 63895, - 63902, 63907, 63917, 63924, 63929, 63934, 63939, 63944, 63949, 63954, - 63963, 63970, 63977, 63982, 63989, 63994, 64001, 64010, 64021, 64026, - 64035, 64040, 64047, 64056, 64065, 64070, 64075, 64082, 64088, 64095, - 64102, 64106, 64110, 64113, 64117, 64121, 64125, 64129, 64133, 64137, - 64141, 64144, 64148, 64152, 64156, 64160, 64164, 64168, 64171, 64175, - 64179, 64182, 64186, 64190, 64194, 64198, 64202, 64206, 64210, 64214, - 64218, 64222, 64226, 64230, 64234, 64238, 64242, 64246, 64250, 64254, - 64258, 64262, 64266, 64270, 64274, 64278, 64282, 64286, 64290, 64294, - 64298, 64302, 64306, 64310, 64314, 64318, 64322, 64326, 64330, 64334, - 64338, 64342, 64346, 64350, 64354, 64358, 64361, 64365, 64369, 64373, - 64377, 64381, 64385, 64389, 64393, 64397, 64401, 64405, 64409, 64413, - 64417, 64421, 64425, 64429, 64433, 64437, 64441, 64445, 64449, 64453, - 64457, 64461, 64465, 64469, 64473, 64477, 64481, 64485, 64489, 64493, - 64497, 64501, 64505, 64509, 64513, 64517, 64521, 64525, 64529, 64533, - 64537, 64541, 64545, 64549, 64553, 64557, 64561, 64565, 64569, 64573, - 64577, 64581, 64585, 64589, 64593, 64597, 64601, 64605, 64609, 64613, - 64617, 64621, 64625, 64629, 64633, 64637, 64641, 64645, 64649, 64653, - 64657, 64661, 64665, 64669, 64673, 64677, 64681, 64685, 64689, 64693, - 64697, 64701, 64705, 64709, 64713, 64717, 64721, 64725, 64729, 64733, - 64737, 64741, 64745, 64749, 64753, 64757, 64761, 64765, 64769, 64773, - 64777, 64781, 64785, 64789, 64793, 64797, 64801, 64805, 64809, 64813, - 64817, 64821, 64825, 64829, 64832, 64836, 64840, 64844, 64848, 64852, - 64856, 64860, 64864, 64868, 64872, 64876, 64880, 64884, 64888, 64892, - 64896, 64900, 64904, 64908, 64912, 64916, 64920, 64924, 64928, 64932, - 64936, 64940, 64944, 64948, 64952, 64956, 64960, 64964, 64968, 64972, - 64976, 64980, 64984, 64988, 64992, 64996, 65000, 65004, 65008, 65012, - 65016, 65020, 65024, 65028, 65032, 65036, 65040, 65044, 65048, 65052, - 65056, 65060, 65064, 65068, 65072, 65076, 65080, 65084, 65088, 65092, - 65096, 65100, 65104, 65108, 65112, 65116, 65120, 65124, 65128, 65132, - 65136, 65140, 65144, 65148, 65152, 65156, 65160, 65164, 65168, 65172, - 65176, 65180, 65184, 65188, 65192, 65196, 65200, 65204, 65208, 65212, - 65216, 65220, 65224, 65228, 65232, 65236, 65240, 65244, 65248, 65252, - 65256, 65260, 65264, 65268, 65272, 65276, 65280, 65284, 65288, 65292, - 65295, 65299, 65303, 65307, 65311, 65315, 65319, 65323, 65327, 65331, - 65335, 65339, 65343, 65347, 65351, 65355, 65359, 65363, 65367, 65371, - 65375, 65379, 65383, 65387, 65391, 65395, 65399, 65403, 65407, 65411, - 65415, 65419, 65423, 65427, 65431, 65435, 65439, 65443, 65447, 65451, - 65455, 65459, 65463, 65467, 65471, 65475, 65479, 65483, 65487, 65491, - 65495, 65499, 65503, 65507, 65511, 65515, 65519, 65523, 65527, 65531, - 65535, 65539, 65543, 65547, 65551, 65555, 65559, 65563, 65567, 65571, - 65575, 65579, 65583, 65587, 65591, 65595, 65599, 65603, 65607, 65611, - 65615, 65619, 65623, 65627, 65631, 65635, 65639, 65643, 65647, 65651, - 65654, 65658, 65662, 65666, 65670, 65674, 65678, 65682, 65686, 65690, - 65694, 65698, 65702, 65706, 65710, 65714, 65718, 65722, 65726, 65730, - 65734, 65738, 65742, 65746, 65750, 65754, 65758, 65762, 65766, 65770, - 65774, 65778, 65782, 65786, 65790, 65794, 65798, 65802, 65806, 65810, - 65814, 65818, 65822, 65826, 65830, 65834, 65838, 65842, 65846, 65850, - 65854, 65858, 65862, 65866, 65870, 65874, 65878, 65882, 65886, 65890, - 65894, 65898, 65902, 65906, 65910, 65914, 65918, 65922, 65926, 65930, - 65934, 65938, 65942, 65946, 65950, 65954, 65958, 65962, 65966, 65970, - 65974, 65978, 65982, 65986, 65990, 65994, 65998, 66002, 66006, 66010, - 66014, 66018, 66022, 66026, 66030, 66034, 66038, 66042, 66046, 66050, - 66054, 66058, 66062, 66066, 66070, 66074, 66078, 66082, 66086, 66090, - 66094, 66098, 66102, 66106, 66110, 66114, 66118, 66122, 66126, 66130, - 66134, 66138, 66142, 66146, 66149, 66153, 66157, 66161, 66165, 66169, - 66173, 66177, 66181, 66185, 66189, 66193, 66197, 66201, 66205, 66209, - 66213, 66217, 66221, 66225, 66229, 66233, 66237, 66241, 66245, 66249, - 66253, 66257, 66261, 66265, 66269, 66273, 66277, 66281, 66285, 66289, - 66293, 66297, 66301, 66305, 66309, 66313, 66317, 66321, 66325, 66329, - 66333, 66337, 66341, 66345, 66349, 66353, 66357, 66361, 66365, 66369, - 66373, 66377, 66381, 66385, 66389, 66393, 66397, 66401, 66405, 66409, - 66413, 66417, 66421, 66425, 66429, 66433, 66437, 66441, 66445, 66449, - 66453, 66457, 66461, 66465, 66469, 66473, 66477, 66481, 66485, 66489, - 66493, 66497, 66501, 66505, 66509, 66513, 66517, 66521, 66525, 66529, - 66533, 66537, 66541, 66545, 66549, 66553, 66557, 66561, 66565, 66569, - 66573, 66577, 66581, 66585, 66589, 66593, 66597, 66601, 66604, 66608, - 66612, 66616, 66620, 66624, 66628, 66632, 66636, 66640, 66644, 66648, - 66652, 66656, 66660, 66664, 66668, 66672, 66676, 66680, 66684, 66688, - 66692, 66696, 66700, 66704, 66708, 66712, 66716, 66720, 66724, 66728, - 66732, 66736, 66740, 66744, 66748, 66752, 66756, 66760, 66764, 66768, - 66772, 66776, 66780, 66784, 66788, 66792, 66796, 66800, 66804, 66808, - 66812, 66816, 66820, 66824, 66828, 66832, 66836, 66840, 66844, 66848, - 66852, 66856, 66860, 66864, 66868, 66872, 66876, 66880, 66884, 66888, - 66892, 66896, 66900, 66904, 66908, 66912, 66916, 66920, 66924, 66928, - 66932, 66936, 66940, 66944, 66948, 66952, 66956, 66960, 66964, 66968, - 66972, 66976, 66980, 66984, 66988, 66992, 66996, 67000, 67004, 67008, - 67012, 67016, 67020, 67024, 67028, 67032, 67036, 67040, 67044, 67048, - 67052, 67056, 67060, 67064, 67068, 67072, 67076, 67080, 67084, 67088, - 67092, 67096, 67100, 67104, 67108, 67112, 67116, 67120, 67124, 67128, - 67132, 67136, 67140, 67144, 67148, 67152, 67156, 67160, 67164, 67168, - 67172, 67176, 67180, 67184, 67188, 67192, 67196, 67200, 67204, 67207, - 67211, 67215, 67219, 67223, 67227, 67231, 67235, 67238, 67242, 67246, - 67250, 67254, 67258, 67262, 67266, 67270, 67274, 67278, 67282, 67286, - 67290, 67294, 67298, 67302, 67306, 67310, 67314, 67318, 67322, 67326, - 67330, 67334, 67338, 67342, 67346, 67350, 67354, 67358, 67362, 67366, - 67370, 67374, 67378, 67382, 67386, 67390, 67394, 67398, 67402, 67406, - 67410, 67414, 67418, 67422, 67426, 67430, 67434, 67438, 67442, 67446, - 67450, 67454, 67458, 67462, 67466, 67470, 67474, 67478, 67482, 67486, - 67490, 67494, 67498, 67502, 67506, 67510, 67514, 67518, 67522, 67526, - 67530, 67534, 67538, 67542, 67546, 67550, 67554, 67558, 67562, 67566, - 67570, 67574, 67578, 67582, 67586, 67590, 67594, 67598, 67602, 67606, - 67610, 67614, 67618, 67622, 67626, 67630, 67634, 67638, 67642, 67646, - 67650, 67654, 67658, 67662, 67666, 67670, 67674, 67678, 67682, 67686, - 67690, 67694, 67698, 67702, 67706, 67710, 67714, 67718, 67722, 67726, - 67730, 67734, 67738, 67742, 67746, 67750, 67754, 67758, 67762, 67766, - 67770, 67774, 67778, 67782, 67786, 67790, 67794, 67798, 67802, 67806, - 67810, 67814, 67818, 67822, 67826, 67830, 67834, 67838, 67842, 67846, - 67850, 67854, 67858, 67862, 67866, 67870, 67874, 67878, 67882, 67886, - 67890, 67894, 67898, 67902, 67906, 67910, 67914, 67918, 67922, 67926, - 67930, 67934, 67938, 67942, 67946, 67950, 67954, 67958, 67962, 67965, - 67969, 67973, 67977, 67981, 67985, 67989, 67993, 67997, 68001, 68005, - 68009, 68013, 68017, 68021, 68025, 68029, 68033, 68037, 68041, 68045, - 68049, 68053, 68057, 68061, 68065, 68069, 68073, 68077, 68081, 68085, - 68089, 68093, 68097, 68101, 68105, 68109, 68113, 68117, 68121, 68125, - 68129, 68133, 68137, 68141, 68145, 68149, 68153, 68157, 68161, 68165, - 68169, 68173, 68177, 68181, 68185, 68189, 68193, 68197, 68201, 68205, - 68209, 68213, 68217, 68221, 68225, 68229, 68233, 68237, 68241, 68245, - 68249, 68253, 68257, 68261, 68265, 68269, 68273, 68277, 68281, 68285, - 68289, 68293, 68297, 68301, 68305, 68309, 68313, 68317, 68321, 68325, - 68329, 68333, 68337, 68341, 68345, 68349, 68353, 68357, 68361, 68365, - 68369, 68373, 68377, 68381, 68385, 68389, 68393, 68397, 68401, 68405, - 68409, 68413, 68417, 68421, 68425, 68429, 68433, 68437, 68441, 68445, - 68449, 68453, 68457, 68461, 68465, 68469, 68473, 68477, 68481, 68485, - 68489, 68493, 68497, 68501, 68505, 68509, 68513, 68517, 68521, 68525, - 68529, 68533, 68537, 68541, 68545, 68549, 68553, 68557, 68561, 68565, - 68569, 68573, 68577, 68581, 68585, 68589, 68593, 68597, 68601, 68605, - 68609, 68613, 68617, 68621, 68625, 68629, 68633, 68637, 68641, 68645, - 68649, 68653, 68657, 68661, 68665, 68669, 68673, 68677, 68681, 68685, - 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, 68721, 68725, - 68729, 68733, 68737, 68741, 68745, 0, 0, 0, 68749, 68753, 68757, 68761, - 68765, 68769, 68773, 68777, 68781, 68785, 68789, 68793, 68797, 68801, - 68805, 68809, 68813, 68817, 68821, 68825, 68829, 68833, 68837, 68841, - 68845, 68849, 68853, 68857, 68861, 68865, 68869, 68873, 68877, 68881, - 68885, 68889, 68893, 68897, 68901, 68905, 68909, 68913, 68917, 68921, - 68925, 68929, 68933, 68937, 68941, 68945, 68949, 68953, 68957, 68961, - 68965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68969, 68974, 68978, 68983, 68988, - 68993, 68998, 69003, 69007, 69012, 69017, 69022, 69027, 69032, 69037, - 69042, 69046, 69050, 69055, 69059, 69064, 69069, 69074, 69078, 69083, - 69088, 69093, 69098, 69103, 69107, 69112, 69116, 69121, 69125, 69130, - 69134, 69138, 69142, 69147, 69152, 69157, 69165, 69173, 69181, 69189, - 69196, 69204, 69210, 69218, 69222, 69226, 69230, 69234, 69238, 69242, - 69246, 69250, 69254, 69258, 69262, 69266, 69270, 69274, 69278, 69282, - 69286, 69290, 69294, 69298, 69302, 69306, 69310, 69314, 69318, 69322, - 69326, 69330, 69334, 69338, 69342, 69346, 69350, 69354, 69358, 69362, - 69365, 69369, 69373, 69377, 69381, 69385, 69389, 69393, 69397, 69401, - 69405, 69409, 69413, 69417, 69421, 69425, 69429, 69433, 69437, 69441, - 69445, 69449, 69453, 69457, 69461, 69465, 69469, 69473, 69477, 69481, - 69485, 69489, 69493, 69497, 69501, 69505, 69509, 69512, 69516, 69520, - 69523, 69527, 69531, 69535, 69538, 69542, 69546, 69550, 69554, 69558, - 69562, 69566, 69570, 69574, 69578, 69582, 69586, 69590, 69594, 69597, - 69601, 69605, 69608, 69612, 69616, 69620, 69624, 69628, 69632, 69635, - 69638, 69642, 69646, 69650, 69653, 69656, 69660, 69664, 69668, 69672, - 69676, 69680, 69684, 69688, 69692, 69696, 69700, 69704, 69708, 69712, - 69716, 69720, 69724, 69728, 69732, 69736, 69740, 69744, 69748, 69752, - 69756, 69760, 69764, 69768, 69772, 69776, 69780, 69784, 69788, 69792, - 69796, 69800, 69804, 69807, 69811, 69815, 69819, 69823, 69827, 69831, - 69835, 69839, 69843, 69847, 69851, 69855, 69859, 69863, 69867, 69871, - 69875, 69879, 69883, 69887, 69891, 69895, 69899, 69903, 69907, 69911, - 69915, 69919, 69923, 69927, 69931, 69935, 69939, 69943, 69947, 69951, - 69954, 69958, 69962, 69966, 69970, 69974, 69978, 69982, 69986, 69990, - 69994, 69998, 70002, 70006, 70010, 70014, 70018, 70021, 70025, 70029, - 70033, 70037, 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069, - 70073, 70077, 70081, 70085, 70089, 70093, 70097, 70101, 70105, 70108, - 70112, 70116, 70120, 70124, 70128, 70132, 70136, 70140, 70144, 70148, - 70152, 70156, 70160, 70164, 70168, 70172, 70176, 70180, 70184, 70188, - 70192, 70196, 70200, 70204, 70208, 70212, 70216, 70220, 70224, 70228, - 70232, 70236, 70240, 70244, 70248, 70252, 70256, 70260, 70264, 70268, - 70272, 70276, 70280, 70283, 70288, 70292, 70298, 70303, 70309, 70313, - 70317, 70321, 70325, 70329, 70333, 70337, 70341, 70345, 70349, 70353, - 70357, 70361, 70365, 70368, 70371, 70374, 70377, 70380, 70383, 70386, - 70389, 70392, 70397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70403, 70408, 70413, 70418, 70423, 70430, 70437, 70442, 70447, - 70452, 70457, 70464, 70471, 70478, 70485, 70492, 70499, 70509, 70519, - 70526, 70533, 70540, 70547, 70553, 70559, 70568, 70577, 70584, 70591, - 70602, 70613, 70618, 70623, 70630, 70637, 70644, 70651, 70658, 70665, - 70672, 70679, 70685, 70691, 70697, 70703, 70710, 70717, 70722, 70726, - 70733, 70740, 70747, 70751, 70758, 70762, 70767, 70771, 70777, 70782, - 70788, 70793, 70797, 70801, 70804, 70807, 70812, 70817, 70822, 70827, - 70832, 70837, 70842, 70847, 70852, 70857, 70866, 70875, 70880, 70885, - 70890, 70895, 70900, 70905, 70910, 70915, 70920, 70925, 70930, 0, 0, 0, - 0, 0, 0, 0, 70935, 70941, 70944, 70947, 70950, 70954, 70958, 70962, - 70966, 70969, 70973, 70976, 70980, 70983, 70987, 70991, 70995, 70999, - 71003, 71007, 71011, 71014, 71018, 71022, 71026, 71030, 71034, 71038, - 71042, 71046, 71050, 71054, 71058, 71062, 71066, 71070, 71073, 71077, - 71081, 71085, 71089, 71093, 71097, 71101, 71105, 71109, 71113, 71117, - 71121, 71125, 71129, 71133, 71137, 71141, 71145, 71149, 71153, 71157, - 71161, 71165, 71169, 71172, 71176, 71180, 71184, 71188, 71192, 71196, - 71200, 71203, 71207, 71211, 71215, 71219, 71223, 71227, 71231, 71235, - 71239, 71243, 71247, 71251, 71256, 71261, 71264, 71269, 71272, 71275, - 71278, 0, 0, 0, 0, 0, 0, 0, 0, 71282, 71291, 71300, 71309, 71318, 71327, - 71336, 71345, 71354, 71362, 71369, 71377, 71384, 71392, 71402, 71411, - 71421, 71430, 71440, 71448, 71455, 71463, 71470, 71478, 71483, 71488, - 71493, 71502, 71508, 71514, 71521, 71530, 71538, 71546, 71554, 71561, - 71568, 71575, 71582, 71587, 71592, 71597, 71602, 71607, 71612, 71617, - 71622, 71630, 71638, 71644, 71650, 71655, 71660, 71665, 71670, 71675, - 71680, 71685, 71690, 71698, 71706, 71711, 71716, 71726, 71736, 71743, - 71750, 71759, 71768, 71780, 71792, 71798, 71804, 71812, 71820, 71830, - 71840, 71847, 71854, 71859, 71864, 71876, 71888, 71896, 71904, 71914, - 71924, 71936, 71948, 71957, 71966, 71973, 71980, 71987, 71994, 72003, - 72012, 72017, 72022, 72029, 72036, 72043, 72050, 72062, 72074, 72079, - 72084, 72089, 72094, 72099, 72104, 72109, 72114, 72118, 72123, 72128, - 72133, 72138, 72143, 72149, 72154, 72159, 72166, 72173, 72180, 72187, - 72194, 72203, 72212, 72218, 72224, 72230, 72236, 72243, 72250, 72257, - 72264, 72271, 72275, 72282, 72287, 72292, 72299, 0, 72312, 72320, 72328, - 72335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72342, 72351, 72360, 72369, - 72378, 72387, 72396, 72405, 72414, 72423, 72432, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72439, - 72446, 72452, 72459, 72467, 72475, 72482, 72490, 72497, 72503, 72509, - 72516, 72522, 72528, 72534, 72541, 72548, 72555, 72562, 72569, 72576, - 72583, 72590, 72597, 72604, 72611, 72618, 72625, 72632, 72638, 72645, - 72652, 72659, 72666, 72673, 72680, 72687, 72694, 72701, 72708, 72715, - 72722, 72729, 72736, 72743, 72750, 72757, 72764, 72772, 72780, 72788, - 72796, 0, 0, 0, 0, 72804, 72813, 72822, 72831, 72840, 72849, 72858, - 72865, 72872, 72879, 0, 0, 0, 0, 0, 0, 72886, 72890, 72895, 72900, 72905, - 72910, 72915, 72920, 72925, 72930, 72935, 72940, 72944, 72948, 72953, - 72958, 72962, 72967, 72972, 72977, 72982, 72987, 72992, 72997, 73001, - 73005, 73010, 73015, 73019, 73023, 73027, 73031, 73035, 73039, 73043, - 73048, 73053, 73058, 73063, 73068, 73075, 73081, 73086, 73091, 73096, - 73101, 73107, 73114, 73120, 73127, 73133, 73139, 73144, 73151, 73157, - 73162, 0, 0, 0, 0, 0, 0, 0, 0, 73168, 73172, 73176, 73179, 73183, 73186, - 73190, 73193, 73197, 73201, 73206, 73210, 73215, 73218, 73222, 73226, - 73229, 73233, 73237, 73240, 73244, 73248, 73252, 73256, 73260, 73264, - 73268, 73272, 73276, 73280, 73284, 73288, 73292, 73296, 73300, 73304, - 73308, 73312, 73315, 73318, 73322, 73326, 73330, 73333, 73336, 73339, - 73343, 73347, 73351, 73355, 73358, 73361, 73365, 73370, 73375, 73379, - 73384, 73388, 73393, 73398, 73404, 73409, 73415, 73419, 73424, 73429, - 73433, 73438, 73443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73447, 73450, 73454, - 73458, 73461, 73464, 73467, 73470, 73473, 73476, 73479, 73482, 0, 0, 0, - 0, 0, 0, 73485, 73490, 73494, 73498, 73502, 73506, 73510, 73514, 73518, - 73522, 73526, 73530, 73534, 73538, 73542, 73546, 73550, 73555, 73560, - 73566, 73572, 73579, 73584, 73589, 73595, 73599, 73604, 73607, 0, 0, 0, - 0, 73610, 73617, 73623, 73629, 73635, 73641, 73647, 73653, 73659, 73665, - 73671, 73677, 73684, 73691, 73698, 73704, 73711, 73718, 73725, 73732, - 73739, 73745, 73751, 73758, 73764, 73771, 73778, 73784, 73790, 73797, - 73804, 73811, 73817, 73824, 73831, 73837, 73844, 73850, 73857, 73864, - 73870, 73876, 73883, 73889, 73896, 73903, 73912, 73919, 73926, 73930, - 73935, 73940, 73945, 73950, 73954, 73958, 73963, 73967, 73972, 73977, - 73982, 73986, 73990, 73995, 73999, 74004, 74008, 74013, 74018, 74023, - 74028, 74032, 74037, 74042, 74047, 74053, 74058, 74064, 74070, 74076, - 74082, 74088, 74093, 74099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74103, - 74108, 74112, 74116, 74120, 74124, 74128, 74132, 74136, 74140, 74144, - 74148, 74152, 74156, 74160, 74164, 74168, 74172, 74176, 74180, 74184, - 74188, 74192, 74196, 74200, 74204, 74208, 74212, 74216, 74220, 0, 0, 0, - 74224, 74228, 74232, 74236, 74240, 74243, 74249, 74252, 74256, 74259, - 74265, 74271, 74279, 74282, 74286, 74289, 74292, 74298, 74304, 74308, - 74314, 74318, 74322, 74328, 74332, 74338, 74344, 74348, 74352, 74358, - 74362, 74368, 74374, 74378, 74384, 74388, 74394, 74397, 74400, 74406, - 74410, 74416, 74419, 74422, 74425, 74431, 74435, 74439, 74445, 74451, - 74454, 74457, 74463, 74468, 74473, 74478, 74485, 74490, 74497, 74502, - 74509, 74514, 74519, 74524, 74529, 74532, 74536, 74540, 74545, 74550, - 74555, 74560, 74565, 74570, 74575, 74580, 74587, 74592, 0, 74599, 74602, - 74606, 74609, 74612, 74615, 74618, 74621, 74624, 74627, 74630, 0, 0, 0, - 0, 74633, 74640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74645, 74648, 74651, 74654, 74657, - 74661, 74664, 74667, 74671, 74675, 74679, 74683, 74687, 74691, 74695, - 74699, 74703, 74707, 74711, 74715, 74719, 74723, 74727, 74731, 74735, - 74738, 74742, 74745, 74749, 74753, 74757, 74761, 74765, 74768, 74772, - 74775, 74778, 74782, 74786, 74790, 74793, 74796, 74801, 74805, 74810, - 74815, 74819, 74824, 74828, 74833, 74838, 74843, 74847, 74851, 74856, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 74861, 74866, 74871, 74876, 74882, 74887, 74892, - 74897, 74902, 74907, 74911, 74915, 74920, 74925, 0, 0, 74931, 74935, - 74938, 74941, 74944, 74947, 74950, 74953, 74956, 74959, 0, 0, 74962, - 74967, 74972, 74978, 74985, 74991, 74997, 75003, 75009, 75015, 75021, - 75027, 75033, 75039, 75045, 75051, 75056, 75061, 75066, 75072, 75078, - 75085, 75091, 75097, 75102, 75109, 75116, 75123, 75129, 75134, 75139, - 75144, 0, 0, 0, 0, 75152, 75158, 75164, 75170, 75176, 75182, 75188, - 75194, 75200, 75206, 75212, 75218, 75224, 75230, 75236, 75242, 75248, - 75254, 75260, 75266, 75272, 75277, 75282, 75288, 75294, 75300, 75306, - 75312, 75318, 75324, 75330, 75336, 75342, 75348, 75354, 75360, 75366, - 75372, 75378, 75384, 75390, 75396, 75402, 75408, 75414, 75420, 75426, - 75431, 75436, 75442, 75447, 75451, 75456, 75460, 75464, 75468, 75474, - 75479, 75484, 75489, 75494, 75499, 75504, 75509, 75516, 75523, 75530, 0, + 12070, 0, 12079, 12086, 12094, 12106, 12113, 12120, 12127, 12138, 12149, + 12156, 12164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12170, 12175, 12180, 12185, 12190, + 12195, 12200, 12205, 12210, 12215, 12220, 12225, 12230, 12234, 12238, + 12242, 12247, 12253, 12259, 12265, 12270, 12275, 12280, 12285, 12291, + 12300, 12308, 0, 12314, 12320, 12324, 12328, 12332, 12337, 12340, 12344, + 12347, 12351, 12354, 12358, 12362, 12366, 12371, 12376, 12379, 12383, + 12388, 12393, 12396, 12400, 12403, 12407, 12411, 12415, 12419, 12423, + 12427, 12431, 12435, 12439, 12443, 12447, 12451, 12455, 12459, 12463, + 12467, 12471, 12475, 12478, 12482, 12485, 12489, 12493, 12497, 12500, + 12503, 12506, 12510, 12514, 12518, 12522, 12526, 12530, 12534, 12537, + 12540, 12545, 12550, 12554, 12558, 12563, 12567, 12572, 12576, 12581, + 12586, 12592, 12598, 12604, 12608, 12613, 12619, 12625, 12629, 12634, + 12638, 12644, 12649, 12652, 12658, 12664, 12669, 12674, 12681, 12686, + 12691, 12695, 12699, 12703, 12707, 12711, 12715, 12719, 12723, 12728, + 12733, 12738, 12744, 12747, 12751, 12755, 12758, 12761, 12764, 12767, + 12770, 12773, 12776, 12779, 12782, 12786, 12793, 12798, 12802, 12806, + 12810, 12814, 0, 12818, 12822, 12826, 12830, 12834, 12840, 12844, 0, + 12848, 12852, 12856, 0, 12860, 12863, 12867, 12870, 12874, 12877, 12881, + 12885, 0, 0, 12889, 12892, 0, 0, 12896, 12899, 12903, 12906, 12910, + 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 12950, + 12954, 12958, 12962, 12966, 12970, 12974, 12978, 0, 12981, 12984, 12988, + 12992, 12996, 12999, 13002, 0, 13005, 0, 0, 0, 13009, 13013, 13017, + 13020, 0, 0, 13023, 13027, 13031, 13036, 13040, 13045, 13049, 13054, + 13059, 0, 0, 13065, 13069, 0, 0, 13074, 13078, 13083, 13087, 0, 0, 0, 0, + 0, 0, 0, 0, 13093, 0, 0, 0, 0, 13099, 13103, 0, 13107, 13111, 13116, + 13121, 13126, 0, 0, 13132, 13136, 13139, 13142, 13145, 13148, 13151, + 13154, 13157, 13160, 13163, 13172, 13181, 13185, 13189, 13195, 13201, + 13207, 13213, 13227, 13234, 13237, 0, 0, 0, 0, 0, 13241, 13247, 13251, 0, + 13255, 13258, 13262, 13265, 13269, 13272, 0, 0, 0, 0, 13276, 13280, 0, 0, + 13284, 13288, 13292, 13295, 13299, 13303, 13307, 13311, 13315, 13319, + 13323, 13327, 13331, 13335, 13339, 13343, 13347, 13351, 13355, 13359, + 13363, 13367, 0, 13370, 13373, 13377, 13381, 13385, 13388, 13391, 0, + 13394, 13398, 0, 13402, 13406, 0, 13410, 13413, 0, 0, 13416, 0, 13420, + 13425, 13429, 13434, 13438, 0, 0, 0, 0, 13443, 13448, 0, 0, 13453, 13458, + 13463, 0, 0, 0, 13467, 0, 0, 0, 0, 0, 0, 0, 13471, 13475, 13479, 13483, + 0, 13487, 0, 0, 0, 0, 0, 0, 0, 13491, 13495, 13498, 13501, 13504, 13507, + 13510, 13513, 13516, 13519, 13522, 13525, 13528, 13531, 13534, 13539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13543, 13547, 13551, 0, 13555, 13558, + 13562, 13565, 13569, 13572, 13576, 13580, 13584, 0, 13589, 13592, 13596, + 0, 13601, 13604, 13608, 13611, 13615, 13619, 13623, 13627, 13631, 13635, + 13639, 13643, 13647, 13651, 13655, 13659, 13663, 13667, 13671, 13675, + 13679, 13683, 0, 13686, 13689, 13693, 13697, 13701, 13704, 13707, 0, + 13710, 13714, 0, 13718, 13722, 13726, 13730, 13733, 0, 0, 13736, 13740, + 13744, 13749, 13753, 13758, 13762, 13767, 13772, 13778, 0, 13784, 13788, + 13793, 0, 13799, 13803, 13808, 0, 0, 13812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13815, 13820, 13825, 13830, 0, 0, 13836, 13840, 13843, + 13846, 13849, 13852, 13855, 13858, 13861, 13864, 13867, 13871, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13875, 13879, 13883, 0, 13887, 13890, + 13894, 13897, 13901, 13904, 13908, 13912, 0, 0, 13916, 13919, 0, 0, + 13923, 13926, 13930, 13933, 13937, 13941, 13945, 13949, 13953, 13957, + 13961, 13965, 13969, 13973, 13977, 13981, 13985, 13989, 13993, 13997, + 14001, 14005, 0, 14008, 14011, 14015, 14019, 14023, 14026, 14029, 0, + 14032, 14036, 0, 14040, 14044, 14048, 14052, 14055, 0, 0, 14058, 14062, + 14066, 14071, 14075, 14080, 14084, 14089, 14094, 0, 0, 14100, 14104, 0, + 0, 14109, 14113, 14118, 0, 0, 0, 0, 0, 0, 0, 0, 14122, 14128, 0, 0, 0, 0, + 14134, 14138, 0, 14142, 14146, 14151, 14156, 14161, 0, 0, 14167, 14171, + 14174, 14177, 14180, 14183, 14186, 14189, 14192, 14195, 14198, 14201, + 14205, 14211, 14217, 14223, 14229, 14235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14241, 14245, 0, 14249, 14252, 14256, 14259, 14263, 14266, 0, 0, 0, + 14270, 14273, 14277, 0, 14281, 14284, 14288, 14292, 0, 0, 0, 14295, + 14299, 0, 14303, 0, 14307, 14311, 0, 0, 0, 14315, 14319, 0, 0, 0, 14323, + 14326, 14330, 0, 0, 0, 14333, 14336, 14339, 14342, 14346, 14350, 14354, + 14358, 14362, 14366, 14370, 14373, 0, 0, 0, 0, 14376, 14381, 14385, + 14390, 14394, 0, 0, 0, 14399, 14403, 14408, 0, 14413, 14417, 14422, + 14427, 0, 0, 14431, 0, 0, 0, 0, 0, 0, 14434, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14440, 14444, 14447, 14450, 14453, 14456, 14459, 14462, + 14465, 14468, 14471, 14475, 14480, 14485, 14489, 14493, 14497, 14501, + 14505, 14510, 14514, 0, 0, 0, 0, 0, 0, 14517, 14521, 14525, 0, 14529, + 14532, 14536, 14539, 14543, 14546, 14550, 14554, 0, 14558, 14561, 14565, + 0, 14569, 14572, 14576, 14580, 14583, 14587, 14591, 14595, 14599, 14603, + 14607, 14611, 14615, 14619, 14623, 14627, 14631, 14635, 14639, 14643, + 14647, 14651, 14655, 0, 14658, 14661, 14665, 14669, 14673, 14676, 14679, + 14682, 14686, 14690, 0, 14694, 14698, 14702, 14706, 14709, 0, 0, 0, + 14712, 14716, 14721, 14725, 14730, 14734, 14739, 14744, 0, 14750, 14754, + 14759, 0, 14764, 14768, 14773, 14778, 0, 0, 0, 0, 0, 0, 0, 14782, 14786, + 0, 14792, 14796, 0, 0, 0, 0, 0, 0, 14800, 14805, 14810, 14815, 0, 0, + 14821, 14825, 14828, 14831, 14834, 14837, 14840, 14843, 14846, 14849, 0, + 0, 0, 0, 0, 0, 0, 0, 14852, 14865, 14877, 14889, 14901, 14913, 14925, + 14937, 0, 0, 14941, 14945, 0, 14949, 14952, 14956, 14959, 14963, 14966, + 14970, 14974, 0, 14978, 14981, 14985, 0, 14989, 14992, 14996, 15000, + 15003, 15007, 15011, 15015, 15019, 15023, 15027, 15031, 15035, 15039, + 15043, 15047, 15051, 15055, 15059, 15063, 15067, 15071, 15075, 0, 15078, + 15081, 15085, 15089, 15093, 15096, 15099, 15102, 15106, 15110, 0, 15114, + 15118, 15122, 15126, 15129, 0, 0, 15132, 15136, 15140, 15145, 15149, + 15154, 15158, 15163, 15168, 0, 15174, 15178, 15183, 0, 15188, 15192, + 15197, 15202, 0, 0, 0, 0, 0, 0, 0, 15206, 15210, 0, 0, 0, 0, 0, 0, 0, + 15216, 0, 15220, 15225, 15230, 15235, 0, 0, 15241, 15245, 15248, 15251, + 15254, 15257, 15260, 15263, 15266, 15269, 0, 15272, 15276, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15280, 15284, 0, 15288, 15291, 15295, + 15298, 15302, 15305, 15309, 15313, 0, 15317, 15320, 15324, 0, 15328, + 15331, 15335, 15339, 15342, 15346, 15350, 15354, 15358, 15362, 15366, + 15370, 15374, 15378, 15382, 15386, 15390, 15394, 15398, 15402, 15406, + 15410, 15414, 15417, 15421, 15424, 15428, 15432, 15436, 15439, 15442, + 15445, 15449, 15453, 15457, 15461, 15465, 15469, 15473, 15476, 15479, 0, + 0, 15483, 15487, 15492, 15496, 15501, 15505, 15510, 15515, 0, 15521, + 15525, 15530, 0, 15535, 15539, 15544, 15549, 15553, 0, 0, 0, 0, 0, 0, 0, + 0, 15558, 0, 0, 0, 0, 0, 0, 0, 0, 15564, 15569, 15574, 15579, 0, 0, + 15585, 15589, 15592, 15595, 15598, 15601, 15604, 15607, 15610, 15613, + 15616, 15620, 15625, 15630, 15636, 15642, 0, 0, 0, 15648, 15652, 15658, + 15664, 15670, 15675, 15681, 0, 0, 15687, 15691, 0, 15695, 15699, 15703, + 15707, 15711, 15715, 15719, 15723, 15727, 15731, 15735, 15739, 15743, + 15747, 15751, 15755, 15759, 15763, 0, 0, 0, 15767, 15773, 15779, 15785, + 15791, 15797, 15803, 15809, 15815, 15821, 15827, 15833, 15841, 15847, + 15853, 15859, 15865, 15871, 15877, 15883, 15889, 15895, 15901, 15907, 0, + 15913, 15919, 15925, 15931, 15937, 15943, 15947, 15953, 15957, 0, 15961, + 0, 0, 15967, 15971, 15977, 15983, 15989, 15993, 15999, 0, 0, 0, 16003, 0, + 0, 0, 0, 16007, 16012, 16019, 16026, 16033, 16040, 0, 16047, 0, 16054, + 16059, 16064, 16071, 16078, 16087, 16098, 16107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16112, 16119, 16126, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16131, 16137, 16143, 16149, 16155, 16161, 16167, 16173, + 16179, 16185, 16191, 16197, 16203, 16209, 16215, 16221, 16227, 16233, + 16239, 16245, 16251, 16257, 16263, 16269, 16275, 16281, 16287, 16293, + 16299, 16305, 16311, 16317, 16323, 16328, 16334, 16340, 16344, 16350, + 16354, 16360, 16366, 16372, 16378, 16384, 16390, 16395, 16401, 16405, + 16410, 16416, 16422, 16428, 16433, 16439, 16445, 16451, 16456, 16462, 0, + 0, 0, 0, 16466, 16472, 16477, 16483, 16488, 16496, 16504, 16508, 16512, + 16516, 16522, 16528, 16534, 16540, 16544, 16548, 16552, 16556, 16560, + 16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16587, 16591, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16595, 16600, 0, 16607, 0, 0, 16614, + 16619, 0, 16624, 0, 0, 16631, 0, 0, 0, 0, 0, 0, 16636, 16641, 16645, + 16652, 0, 16659, 16664, 16669, 16674, 16681, 16688, 16695, 0, 16702, + 16707, 16712, 0, 16719, 0, 16726, 0, 0, 16731, 16738, 0, 16745, 16749, + 16756, 16760, 16765, 16773, 16779, 16785, 16790, 16796, 16802, 16808, + 16813, 0, 16819, 16827, 16834, 0, 0, 16841, 16846, 16852, 16857, 16863, + 0, 16869, 0, 16875, 16882, 16889, 16896, 16903, 16908, 0, 0, 16912, + 16917, 16921, 16925, 16929, 16933, 16937, 16941, 16945, 16949, 0, 0, + 16953, 16959, 16965, 16972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16979, 16983, 16994, + 17009, 17024, 17034, 17045, 17058, 17069, 17075, 17083, 17093, 17099, + 17107, 17111, 17117, 17123, 17131, 17141, 17149, 17162, 17168, 17176, + 17184, 17196, 17203, 17211, 17219, 17227, 17235, 17243, 17251, 17261, + 17265, 17268, 17271, 17274, 17277, 17280, 17283, 17286, 17289, 17292, + 17296, 17300, 17304, 17308, 17312, 17316, 17320, 17324, 17328, 17333, + 17339, 17349, 17363, 17373, 17379, 17385, 17393, 17401, 17409, 17417, + 17423, 17429, 17432, 17436, 17440, 17444, 17448, 17452, 17456, 0, 17460, + 17464, 17468, 17472, 17476, 17480, 17484, 17488, 17492, 17496, 17500, + 17503, 17506, 17510, 17514, 17518, 17521, 17525, 17529, 17533, 17537, + 17541, 17545, 17549, 17553, 17556, 17559, 17563, 17567, 17571, 17574, + 17577, 17580, 17584, 17589, 17593, 0, 0, 0, 0, 17597, 17602, 17606, + 17611, 17615, 17620, 17625, 17631, 17636, 17642, 17646, 17651, 17655, + 17660, 17670, 17676, 17682, 17689, 17699, 17705, 17709, 17713, 17719, + 17725, 17733, 17739, 17747, 17755, 17763, 17773, 17781, 17791, 17796, + 17802, 17808, 17814, 17820, 17826, 17832, 0, 17838, 17844, 17850, 17856, + 17862, 17868, 17874, 17880, 17886, 17892, 17898, 17903, 17908, 17914, + 17920, 17926, 17931, 17937, 17943, 17949, 17955, 17961, 17967, 17973, + 17979, 17984, 17989, 17995, 18001, 18007, 18012, 18017, 18022, 18028, + 18036, 18043, 0, 18050, 18057, 18070, 18077, 18084, 18092, 18100, 18106, + 18112, 18118, 18128, 18133, 18139, 18149, 18159, 0, 18169, 18179, 18187, + 18199, 18211, 18217, 18231, 18246, 18251, 18256, 18264, 18272, 18280, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18288, 18291, 18295, 18299, 18303, + 18307, 18311, 18315, 18319, 18323, 18327, 18331, 18335, 18339, 18343, + 18347, 18351, 18355, 18359, 18363, 18367, 18370, 18373, 18377, 18381, + 18385, 18388, 18391, 18394, 18398, 18402, 18405, 18408, 18412, 18415, + 18420, 18423, 18427, 18430, 18434, 18437, 18442, 18445, 18449, 18456, + 18461, 18465, 18470, 18474, 18479, 18483, 18488, 18495, 18501, 18506, + 18510, 18514, 18518, 18522, 18526, 18531, 18536, 18542, 18547, 18552, + 18556, 18559, 18562, 18565, 18568, 18571, 18574, 18577, 18580, 18583, + 18589, 18593, 18597, 18601, 18605, 18609, 18613, 18617, 18621, 18626, + 18630, 18635, 18640, 18646, 18651, 18657, 18663, 18669, 18675, 18681, + 18688, 18695, 18703, 18711, 18720, 18729, 18740, 18750, 18760, 18771, + 18782, 18792, 18802, 18812, 18822, 18832, 18842, 18852, 18862, 18870, + 18877, 18883, 18890, 18895, 18901, 18907, 18913, 18919, 18925, 18931, + 18936, 18942, 18948, 18954, 18960, 18965, 18973, 18980, 18986, 18993, + 19001, 19007, 19013, 19019, 19025, 19033, 19041, 19051, 19059, 19067, + 19073, 19078, 19083, 19088, 19093, 19098, 19103, 19108, 19113, 19118, + 19124, 19130, 19136, 19143, 19148, 19154, 19159, 19164, 19169, 19174, + 19179, 19184, 19189, 19194, 19199, 19204, 19209, 19214, 19219, 19224, + 19229, 19234, 19239, 19244, 19249, 19254, 19259, 19264, 19269, 19274, + 19279, 19284, 19289, 19294, 19299, 19304, 19309, 19314, 19319, 19324, + 19329, 19334, 19339, 0, 19344, 0, 0, 0, 0, 0, 19349, 0, 0, 19354, 19358, + 19362, 19366, 19370, 19374, 19378, 19382, 19386, 19390, 19394, 19398, + 19402, 19406, 19410, 19414, 19418, 19422, 19426, 19430, 19434, 19438, + 19442, 19446, 19450, 19454, 19458, 19462, 19466, 19470, 19474, 19478, + 19482, 19486, 19490, 19494, 19498, 19502, 19506, 19510, 19514, 19518, + 19524, 19528, 19533, 19538, 19542, 19547, 19552, 19556, 19560, 19564, + 19568, 19572, 19576, 19580, 19584, 19588, 19592, 19596, 19600, 19604, + 19608, 19612, 19616, 19620, 19624, 19628, 19632, 19636, 19640, 19644, + 19648, 19652, 19656, 19660, 19664, 19668, 19672, 19676, 19680, 19684, + 19688, 19692, 19696, 19700, 19704, 19708, 19712, 19716, 19720, 19724, + 19728, 19732, 19736, 19740, 19744, 19748, 19752, 19756, 19760, 19764, + 19768, 19772, 19776, 19780, 19784, 19788, 19792, 19796, 19800, 19804, + 19808, 19812, 19816, 19820, 19824, 19828, 19832, 19836, 19840, 19844, + 19848, 19852, 19856, 19860, 19864, 19868, 19872, 19876, 19880, 19884, + 19888, 19892, 19896, 19900, 19904, 19908, 19912, 19916, 19920, 19924, + 19928, 19932, 19936, 19940, 19943, 19947, 19950, 19954, 19958, 19961, + 19965, 19969, 19972, 19976, 19980, 19984, 19988, 19991, 19995, 19999, + 20003, 20007, 20011, 20015, 20018, 20022, 20026, 20030, 20034, 20038, + 20042, 20046, 20050, 20054, 20058, 20062, 20066, 20070, 20074, 20078, + 20082, 20086, 20090, 20094, 20098, 20102, 20106, 20110, 20114, 20118, + 20122, 20126, 20130, 20134, 20138, 20142, 20146, 20150, 20154, 20158, + 20162, 20166, 20170, 20174, 20178, 20182, 20186, 20190, 20194, 20198, + 20202, 20206, 20210, 20214, 20218, 20222, 20226, 20230, 20234, 20238, + 20242, 20246, 20250, 20254, 20258, 20262, 20266, 20270, 20274, 20278, + 20282, 20286, 20290, 20294, 20298, 20302, 20306, 20310, 20314, 20318, + 20322, 20326, 20330, 20334, 20338, 20342, 20346, 20350, 20354, 20358, + 20362, 20366, 20370, 20374, 20378, 20382, 20386, 20390, 20394, 20398, + 20402, 20406, 20410, 20414, 20418, 20422, 20426, 20430, 20434, 20438, + 20442, 20446, 20450, 20454, 20458, 20462, 20466, 20470, 20474, 20478, + 20482, 20486, 20490, 20494, 20498, 20502, 20506, 20510, 20514, 20518, + 20522, 20526, 20530, 20534, 20538, 20542, 20546, 20550, 20554, 20558, + 20562, 20566, 20570, 20573, 20577, 20581, 20585, 20589, 20593, 20597, + 20601, 20605, 20609, 20613, 20617, 20621, 20625, 20629, 20633, 20637, + 20641, 20645, 20649, 20653, 20657, 20661, 20665, 20668, 20672, 20676, + 20680, 20684, 20688, 20692, 20696, 20700, 20704, 20708, 20712, 20716, + 20720, 20724, 20728, 20731, 20735, 20739, 20743, 20747, 20751, 20755, + 20759, 20762, 20766, 20770, 20774, 20778, 20782, 20786, 20790, 20794, + 20798, 20802, 20806, 20810, 20814, 20818, 20822, 20826, 20830, 20834, + 20838, 20842, 20846, 20850, 20854, 0, 20858, 20862, 20866, 20870, 0, 0, + 20874, 20878, 20882, 20886, 20890, 20894, 20898, 0, 20902, 0, 20906, + 20910, 20914, 20918, 0, 0, 20922, 20926, 20930, 20934, 20938, 20942, + 20946, 20950, 20954, 20958, 20962, 20966, 20970, 20974, 20978, 20982, + 20986, 20990, 20994, 20998, 21002, 21006, 21010, 21013, 21017, 21021, + 21025, 21029, 21033, 21037, 21041, 21045, 21049, 21053, 21057, 21061, + 21065, 21069, 21073, 21077, 21081, 0, 21085, 21089, 21093, 21097, 0, 0, + 21101, 21104, 21108, 21112, 21116, 21120, 21124, 21128, 21132, 21136, + 21140, 21144, 21148, 21152, 21156, 21160, 21164, 21169, 21174, 21179, + 21185, 21191, 21196, 21201, 21207, 21210, 21214, 21218, 21222, 21226, + 21230, 21234, 21238, 0, 21242, 21246, 21250, 21254, 0, 0, 21258, 21262, + 21266, 21270, 21274, 21278, 21282, 0, 21286, 0, 21290, 21294, 21298, + 21302, 0, 0, 21306, 21310, 21314, 21318, 21322, 21326, 21330, 21334, + 21338, 21343, 21348, 21353, 21359, 21365, 21370, 0, 21375, 21379, 21383, + 21387, 21391, 21395, 21399, 21403, 21407, 21411, 21415, 21419, 21423, + 21427, 21431, 21435, 21439, 21442, 21446, 21450, 21454, 21458, 21462, + 21466, 21470, 21474, 21478, 21482, 21486, 21490, 21494, 21498, 21502, + 21506, 21510, 21514, 21518, 21522, 21526, 21530, 21534, 21538, 21542, + 21546, 21550, 21554, 21558, 21562, 21566, 21570, 21574, 21578, 21582, + 21586, 21590, 21594, 21598, 0, 21602, 21606, 21610, 21614, 0, 0, 21618, + 21622, 21626, 21630, 21634, 21638, 21642, 21646, 21650, 21654, 21658, + 21662, 21666, 21670, 21674, 21678, 21682, 21686, 21690, 21694, 21698, + 21702, 21706, 21710, 21714, 21718, 21722, 21726, 21730, 21734, 21738, + 21742, 21746, 21750, 21754, 21758, 21762, 21766, 21770, 21774, 21778, + 21782, 21786, 21790, 21794, 21798, 21802, 21806, 21810, 21814, 21818, + 21822, 21826, 21830, 21834, 21838, 21842, 21845, 21849, 21853, 21857, + 21861, 21865, 21869, 21873, 21877, 21881, 0, 0, 21885, 21894, 21900, + 21905, 21909, 21912, 21917, 21920, 21923, 21926, 21931, 21935, 21940, + 21943, 21946, 21949, 21952, 21955, 21958, 21961, 21964, 21967, 21971, + 21975, 21979, 21983, 21987, 21991, 21995, 21999, 22003, 22007, 0, 0, 0, + 22013, 22019, 22023, 22027, 22031, 22037, 22041, 22045, 22049, 22055, + 22059, 22063, 22067, 22073, 22077, 22081, 22085, 22091, 22097, 22103, + 22111, 22117, 22123, 22129, 22135, 22141, 0, 0, 0, 0, 0, 0, 22147, 22150, + 22153, 22156, 22159, 22162, 22166, 22170, 22173, 22177, 22181, 22185, + 22189, 22193, 22196, 22200, 22204, 22208, 22212, 22216, 22220, 22224, + 22228, 22232, 22236, 22240, 22243, 22247, 22251, 22255, 22259, 22262, + 22266, 22270, 22274, 22278, 22282, 22286, 22290, 22294, 22298, 22302, + 22306, 22310, 22314, 22317, 22321, 22325, 22329, 22333, 22337, 22341, + 22345, 22349, 22353, 22357, 22361, 22365, 22369, 22373, 22377, 22381, + 22385, 22389, 22393, 22397, 22401, 22405, 22409, 22413, 22417, 22421, + 22425, 22429, 22433, 22437, 22441, 22445, 22449, 22453, 22456, 22460, + 22464, 22468, 22472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22476, 22480, + 22483, 22487, 22490, 22494, 22497, 22501, 22507, 22512, 22516, 22519, + 22523, 22527, 22532, 22536, 22541, 22545, 22550, 22554, 22559, 22563, + 22568, 22574, 22578, 22583, 22587, 22592, 22598, 22602, 22608, 22614, + 22618, 22623, 22631, 22639, 22646, 22651, 22656, 22665, 22672, 22679, + 22684, 22690, 22694, 22698, 22702, 22706, 22710, 22714, 22718, 22722, + 22726, 22730, 22736, 22741, 22746, 22749, 22753, 22757, 22762, 22766, + 22771, 22775, 22780, 22784, 22789, 22793, 22798, 22802, 22807, 22811, + 22816, 22822, 22826, 22831, 22836, 22840, 22844, 22848, 22852, 22855, + 22859, 22865, 22870, 22875, 22879, 22883, 22887, 22892, 22896, 22901, + 22905, 22910, 22913, 22917, 22921, 22926, 22930, 22935, 22939, 22944, + 22950, 22954, 22958, 22962, 22966, 22970, 22974, 22978, 22982, 22986, + 22990, 22994, 23000, 23003, 23007, 23011, 23016, 23020, 23025, 23029, + 23034, 23038, 23043, 23047, 23052, 23056, 23061, 23065, 23070, 23076, + 23080, 23084, 23090, 23096, 23102, 23108, 23112, 23116, 23120, 23124, + 23128, 23132, 23138, 23142, 23146, 23150, 23155, 23159, 23164, 23168, + 23173, 23177, 23182, 23186, 23191, 23195, 23200, 23204, 23209, 23215, + 23219, 23225, 23229, 23233, 23237, 23241, 23245, 23249, 23255, 23258, + 23262, 23266, 23271, 23275, 23280, 23284, 23289, 23293, 23298, 23302, + 23307, 23311, 23316, 23320, 23325, 23331, 23334, 23338, 23342, 23347, + 23352, 23356, 23360, 23364, 23368, 23372, 23376, 23382, 23385, 23389, + 23393, 23398, 23402, 23407, 23411, 23416, 23422, 23426, 23431, 23435, + 23439, 23443, 23447, 23451, 23455, 23459, 23465, 23469, 23473, 23477, + 23482, 23486, 23491, 23495, 23500, 23504, 23509, 23513, 23518, 23522, + 23527, 23531, 23536, 23539, 23543, 23547, 23551, 23555, 23559, 23563, + 23567, 23571, 23577, 23580, 23584, 23588, 23593, 23597, 23602, 23606, + 23611, 23615, 23620, 23624, 23629, 23633, 23638, 23642, 23647, 23653, + 23657, 23663, 23667, 23673, 23679, 23685, 23691, 23697, 23703, 23709, + 23715, 23719, 23723, 23727, 23731, 23735, 23739, 23743, 23747, 23752, + 23756, 23761, 23765, 23770, 23774, 23779, 23783, 23788, 23792, 23797, + 23801, 23806, 23810, 23814, 23818, 23822, 23826, 23830, 23834, 23840, + 23843, 23847, 23851, 23856, 23860, 23865, 23869, 23874, 23878, 23883, + 23887, 23892, 23896, 23901, 23905, 23910, 23916, 23920, 23926, 23931, + 23937, 23941, 23947, 23952, 23956, 23960, 23964, 23968, 23972, 23977, + 23980, 23984, 23989, 23993, 23998, 24001, 24005, 24009, 24013, 24017, + 24021, 24025, 24029, 24033, 24037, 24041, 24045, 24050, 24054, 24058, + 24064, 24068, 24074, 24078, 24084, 24088, 24092, 24096, 24100, 24104, + 24109, 24113, 24117, 24121, 24125, 24129, 24133, 24137, 24141, 24145, + 24149, 24155, 24161, 24167, 24173, 24179, 24184, 24190, 24196, 24202, + 24206, 24210, 24214, 24218, 24222, 24226, 24230, 24234, 24238, 24242, + 24246, 24250, 24254, 24259, 24264, 24269, 24273, 24277, 24281, 24285, + 24289, 24293, 24297, 24301, 24305, 24309, 24315, 24321, 24327, 24333, + 24339, 24345, 24351, 24357, 24363, 24367, 24371, 24375, 24379, 24383, + 24387, 24391, 24397, 24403, 24409, 24415, 24421, 24427, 24433, 24439, + 24445, 24450, 24455, 24460, 24465, 24471, 24477, 24483, 24489, 24495, + 24501, 24507, 24512, 24518, 24524, 24530, 24535, 24541, 24547, 24553, + 24558, 24563, 24568, 24573, 24578, 24583, 24588, 24593, 24598, 24603, + 24608, 24613, 24617, 24622, 24627, 24632, 24637, 24642, 24647, 24652, + 24657, 24662, 24667, 24672, 24677, 24682, 24687, 24692, 24697, 24702, + 24707, 24712, 24717, 24722, 24727, 24732, 24737, 24742, 24747, 24752, + 24757, 24762, 24766, 24771, 24776, 24781, 24786, 24791, 24796, 24801, + 24806, 24811, 24816, 24821, 24826, 24831, 24836, 24841, 24846, 24851, + 24856, 24861, 24866, 24871, 24876, 24881, 24886, 24891, 24895, 24900, + 24905, 24910, 24915, 24920, 24924, 24929, 24934, 24939, 24944, 24949, + 24953, 24958, 24964, 24969, 24974, 24979, 24984, 24990, 24995, 25000, + 25005, 25010, 25015, 25020, 25025, 25030, 25035, 25040, 25045, 25050, + 25055, 25060, 25065, 25070, 25075, 25080, 25085, 25090, 25095, 25100, + 25105, 25110, 25115, 25120, 25125, 25130, 25135, 25140, 25145, 25150, + 25155, 25160, 25165, 25170, 25175, 25180, 25185, 25190, 25195, 25200, + 25205, 25210, 25216, 25221, 25226, 25231, 25236, 25241, 25246, 25251, + 25256, 25261, 25266, 25271, 25275, 25280, 25285, 25290, 25295, 25300, + 25305, 25310, 25315, 25320, 25325, 25330, 25335, 25340, 25345, 25350, + 25355, 25360, 25365, 25370, 25375, 25380, 25385, 25390, 25395, 25400, + 25405, 25411, 25415, 25419, 25423, 25427, 25431, 25435, 25439, 25443, + 25449, 25455, 25461, 25467, 25473, 25479, 25485, 25492, 25498, 25503, + 25508, 25513, 25518, 25523, 25528, 25533, 25538, 25543, 25548, 25553, + 25558, 25563, 25568, 25573, 25578, 25583, 25588, 25593, 25598, 25603, + 25608, 25613, 25618, 25623, 25628, 25633, 25638, 0, 0, 0, 25645, 25655, + 25659, 25666, 25670, 25674, 25678, 25686, 25690, 25695, 25700, 25705, + 25709, 25714, 25719, 25722, 25726, 25730, 25739, 25743, 25747, 25753, + 25757, 25761, 25769, 25773, 25781, 25787, 25793, 25799, 25805, 25815, + 25821, 25825, 25834, 25837, 25843, 25847, 25853, 25858, 25864, 25872, + 25878, 25884, 25892, 25898, 25902, 25906, 25916, 25922, 25926, 25936, + 25942, 25946, 25950, 25957, 25964, 25969, 25974, 25983, 25987, 25991, + 25995, 26003, 26010, 26014, 26018, 26022, 26026, 26030, 26034, 26038, + 26042, 26046, 26050, 26054, 26059, 26064, 26069, 26073, 26077, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26081, 26085, 26089, 26093, 26097, + 26102, 26107, 26112, 26117, 26121, 26125, 26130, 26134, 0, 26138, 26143, + 26148, 26152, 26156, 26161, 26166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26171, 26175, 26179, 26183, 26187, 26192, 26197, 26202, 26207, 26211, + 26215, 26220, 26224, 26228, 26232, 26237, 26242, 26246, 26250, 26255, + 26260, 26265, 26271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26276, 26280, 26284, + 26288, 26292, 26297, 26302, 26307, 26312, 26316, 26320, 26325, 26329, + 26333, 26337, 26342, 26347, 26351, 26355, 26360, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26365, 26369, 26373, 26377, 26381, 26386, 26391, 26396, + 26401, 26405, 26409, 26414, 26418, 0, 26422, 26427, 26432, 0, 26436, + 26441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26446, 26449, 26453, 26457, + 26461, 26465, 26469, 26473, 26477, 26481, 26485, 26489, 26493, 26497, + 26501, 26505, 26509, 26513, 26516, 26520, 26524, 26528, 26532, 26536, + 26540, 26544, 26548, 26552, 26556, 26560, 26564, 26568, 26571, 26574, + 26578, 26582, 26588, 26594, 26600, 26606, 26612, 26618, 26624, 26630, + 26636, 26642, 26648, 26654, 26660, 26666, 26675, 26684, 26690, 26696, + 26702, 26707, 26711, 26716, 26721, 26726, 26730, 26735, 26740, 26745, + 26749, 26754, 26758, 26763, 26768, 26773, 26778, 26782, 26786, 26790, + 26794, 26798, 26802, 26806, 26810, 26814, 26818, 26824, 26828, 26832, + 26836, 26840, 26844, 26852, 26858, 26862, 26868, 26872, 26878, 26882, 0, + 0, 26886, 26890, 26893, 26896, 26899, 26902, 26905, 26908, 26911, 26914, + 0, 0, 0, 0, 0, 0, 26917, 26925, 26933, 26941, 26949, 26957, 26965, 26973, + 26981, 26989, 0, 0, 0, 0, 0, 0, 26997, 27000, 27003, 27006, 27011, 27014, + 27019, 27026, 27034, 27039, 27046, 27049, 27056, 27063, 27070, 0, 27074, + 27078, 27081, 27084, 27087, 27090, 27093, 27096, 27099, 27102, 0, 0, 0, + 0, 0, 0, 27105, 27108, 27111, 27114, 27117, 27120, 27124, 27128, 27132, + 27135, 27139, 27143, 27146, 27150, 27154, 27157, 27161, 27164, 27168, + 27172, 27176, 27180, 27184, 27187, 27190, 27194, 27198, 27201, 27205, + 27209, 27213, 27217, 27221, 27225, 27229, 27233, 27240, 27245, 27250, + 27255, 27260, 27266, 27272, 27278, 27284, 27289, 27295, 27301, 27306, + 27312, 27318, 27324, 27330, 27336, 27341, 27347, 27352, 27358, 27364, + 27370, 27376, 27382, 27387, 27392, 27398, 27404, 27409, 27415, 27420, + 27426, 27431, 27436, 27442, 27448, 27454, 27460, 27466, 27472, 27478, + 27484, 27490, 27496, 27502, 27508, 27513, 27518, 27523, 27529, 0, 0, 0, + 0, 0, 0, 0, 0, 27535, 27544, 27553, 27561, 27569, 27579, 27587, 27596, + 27603, 27610, 27617, 27625, 27633, 27641, 27649, 27657, 27665, 27673, + 27681, 27688, 27696, 27704, 27712, 27720, 27728, 27738, 27748, 27758, + 27768, 27778, 27788, 27798, 27808, 27818, 27828, 27838, 27848, 27858, + 27868, 27876, 27884, 27894, 27902, 0, 0, 0, 0, 0, 27912, 27916, 27920, + 27924, 27928, 27932, 27936, 27940, 27944, 27948, 27952, 27956, 27960, + 27964, 27968, 27972, 27976, 27980, 27984, 27988, 27992, 27996, 28000, + 28004, 28010, 28014, 28020, 28024, 28030, 28034, 28040, 28044, 28048, + 28052, 28056, 28060, 28064, 28070, 28076, 28082, 28088, 28093, 28099, + 28105, 28111, 28117, 28123, 28129, 28136, 28142, 28147, 28152, 28156, + 28160, 28164, 28168, 28172, 28176, 28180, 28186, 28192, 28198, 28203, + 28210, 28215, 28220, 28226, 28231, 28238, 28245, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28252, 28258, 28262, 28267, 28272, 28277, 28282, 28287, 28292, + 28297, 28302, 28307, 28312, 28317, 28322, 28327, 28331, 28335, 28340, + 28345, 28350, 28354, 28358, 28362, 28367, 28372, 28377, 28382, 28386, 0, + 0, 0, 28390, 28395, 28400, 28405, 28411, 28417, 28423, 28429, 28434, + 28439, 28445, 28451, 0, 0, 0, 0, 28458, 28463, 28469, 28475, 28481, + 28486, 28491, 28496, 28501, 28507, 28512, 28517, 0, 0, 0, 0, 28522, 0, 0, + 0, 28527, 28532, 28537, 28542, 28546, 28550, 28554, 28558, 28562, 28566, + 28570, 28574, 28578, 28583, 28589, 28595, 28601, 28606, 28611, 28617, + 28623, 28629, 28634, 28640, 28645, 28651, 28657, 28662, 28668, 28674, + 28680, 28685, 28690, 28695, 28701, 28707, 28712, 28718, 28723, 28729, + 28734, 28740, 0, 0, 28746, 28752, 28758, 28764, 28770, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28776, 28783, 28790, 28796, 28803, 28810, 28816, 28823, + 28830, 28837, 28843, 28849, 28856, 28862, 28868, 28875, 28882, 28888, + 28895, 28902, 28908, 28914, 28921, 28927, 28933, 28940, 28946, 28953, + 28960, 28967, 28974, 28981, 28988, 28994, 29001, 29008, 29014, 29021, + 29028, 29035, 29042, 29049, 29056, 29063, 0, 0, 0, 0, 29070, 29078, + 29085, 29092, 29098, 29105, 29111, 29118, 29124, 29131, 29138, 29145, + 29152, 29159, 29166, 29173, 29180, 29187, 29194, 29201, 29208, 29214, + 29221, 29228, 29235, 29241, 0, 0, 0, 0, 0, 0, 29247, 29253, 29258, 29263, + 29268, 29273, 29278, 29283, 29288, 29293, 29298, 0, 0, 0, 29304, 29310, + 29316, 29320, 29326, 29332, 29338, 29344, 29350, 29356, 29362, 29368, + 29374, 29380, 29386, 29392, 29398, 29404, 29410, 29414, 29420, 29426, + 29432, 29438, 29444, 29450, 29456, 29462, 29468, 29474, 29480, 29486, + 29492, 29498, 29504, 29508, 29513, 29518, 29523, 29527, 29532, 29536, + 29541, 29546, 29551, 29555, 29560, 29565, 29570, 29575, 29580, 29584, + 29588, 29593, 29598, 29602, 29606, 29610, 29615, 29620, 29625, 29630, 0, + 0, 29636, 29640, 29647, 29652, 29658, 29664, 29669, 29675, 29681, 29686, + 29692, 29698, 29704, 29709, 29715, 29720, 29725, 29731, 29736, 29742, + 29747, 29753, 29759, 29765, 29771, 29775, 29780, 29785, 29791, 29797, + 29802, 29808, 29814, 29818, 29823, 29828, 29832, 29837, 29842, 29847, + 29852, 29858, 29864, 29869, 29874, 29879, 29883, 29888, 29892, 29897, + 29901, 29906, 29911, 29916, 29921, 29927, 29933, 29940, 29950, 29959, + 29966, 29972, 29982, 29987, 29993, 0, 29998, 30003, 30008, 30016, 30022, + 30030, 30035, 30041, 30047, 30053, 30058, 30064, 30069, 30076, 30082, + 30087, 30093, 30099, 30105, 30112, 30119, 30126, 30131, 30136, 30143, + 30150, 30157, 30164, 30171, 0, 0, 30178, 30185, 30192, 30198, 30204, + 30210, 30216, 30222, 30228, 30234, 30240, 0, 0, 0, 0, 0, 0, 30246, 30252, + 30257, 30262, 30267, 30272, 30277, 30282, 30287, 30292, 0, 0, 0, 0, 0, 0, + 30297, 30302, 30307, 30312, 30317, 30322, 30327, 30336, 30343, 30348, + 30353, 30358, 30363, 30368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30373, 30379, + 30385, 30389, 30393, 30397, 30401, 30407, 30411, 30417, 30421, 30427, + 30433, 30441, 30447, 30455, 30459, 30463, 30467, 30473, 30476, 30482, + 30486, 30492, 30496, 30500, 30506, 30510, 30516, 30520, 30526, 30534, + 30542, 30550, 30556, 30560, 30566, 30570, 30576, 30579, 30582, 30588, + 30592, 30598, 30601, 30604, 30607, 30611, 30615, 30621, 30627, 30630, + 30633, 30637, 30642, 30647, 30654, 30659, 30666, 30673, 30682, 30689, + 30698, 30703, 30710, 30717, 30726, 30731, 30738, 30743, 30749, 30755, + 30761, 30767, 30773, 30779, 0, 0, 0, 0, 30785, 30789, 30792, 30795, + 30798, 30801, 30804, 30807, 30810, 30813, 30816, 30819, 30822, 30825, + 30830, 30835, 30840, 30843, 30848, 30853, 30858, 30863, 30870, 30875, + 30880, 30885, 30890, 30897, 30903, 30909, 30915, 30921, 30927, 30936, + 30945, 30951, 30957, 30965, 30973, 30982, 30991, 30999, 31007, 31016, + 31025, 0, 0, 0, 31033, 31037, 31041, 31045, 31048, 31051, 31054, 31058, + 31061, 31064, 31068, 31071, 31075, 31079, 31083, 31087, 31091, 31095, + 31099, 31103, 31107, 31110, 31113, 31117, 31121, 31125, 31128, 31131, + 31134, 31138, 31142, 31145, 31149, 31152, 31157, 31162, 31167, 31172, + 31177, 31182, 31187, 31192, 31197, 31201, 31205, 31211, 31218, 31222, + 31226, 31230, 31233, 31236, 31239, 31242, 31245, 31248, 31251, 31254, + 31257, 31260, 31264, 31268, 31272, 31277, 31281, 31285, 31291, 31295, + 31301, 31307, 31312, 31319, 31323, 31329, 31333, 31339, 31344, 31351, + 31358, 31363, 31370, 31375, 31380, 31384, 31390, 31394, 31400, 31407, + 31414, 31418, 31424, 31430, 31434, 31440, 31445, 31450, 31457, 31462, + 31467, 31472, 31477, 31481, 31485, 31490, 31495, 31502, 31508, 31513, + 31520, 31525, 31532, 31537, 31546, 31552, 31558, 31562, 0, 0, 0, 0, 0, 0, + 0, 0, 31566, 31575, 31582, 31589, 31596, 31599, 31603, 31607, 31611, + 31615, 31619, 31623, 31627, 31631, 31635, 31639, 31643, 31647, 31650, + 31653, 31657, 31661, 31665, 31669, 31673, 31677, 31680, 31684, 31688, + 31692, 31696, 31699, 31702, 31706, 31709, 31713, 31717, 31720, 31724, + 31728, 31731, 31736, 31741, 31746, 31750, 31754, 31759, 31763, 31768, + 31772, 31777, 31781, 31785, 31790, 31795, 31799, 31804, 31809, 31814, + 31818, 0, 0, 0, 31822, 31827, 31836, 31841, 31848, 31853, 31857, 31860, + 31863, 31866, 31869, 31872, 31875, 31878, 31881, 0, 0, 0, 31884, 31888, + 31892, 31896, 31903, 31909, 31915, 31921, 31927, 31933, 31939, 31945, + 31951, 31957, 31964, 31971, 31978, 31985, 31992, 31999, 32006, 32013, + 32020, 32027, 32034, 32041, 32048, 32055, 32062, 32069, 32076, 32083, + 32090, 32097, 32104, 32111, 32118, 32125, 32132, 32139, 32146, 32153, + 32160, 32167, 32175, 32183, 32191, 32197, 32203, 32209, 32217, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32226, 32233, 32240, 32247, 32254, + 32263, 32272, 32281, 0, 0, 0, 0, 0, 0, 0, 0, 32290, 32295, 32300, 32305, + 32310, 32319, 32330, 32339, 32350, 32356, 32369, 32375, 32382, 32389, + 32394, 32400, 32406, 32417, 32426, 32433, 32440, 32449, 32456, 32465, + 32475, 32485, 32492, 32499, 32506, 32516, 32521, 32529, 32535, 32543, + 32552, 32557, 32564, 32570, 32575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32580, + 32585, 32591, 32598, 32606, 32612, 32618, 32624, 32629, 32636, 32642, + 32648, 32654, 32662, 32667, 32675, 32680, 32686, 32692, 32699, 32707, + 32714, 32720, 32727, 32734, 32740, 32747, 32754, 32760, 32765, 32771, + 32779, 32787, 32793, 32799, 32805, 32811, 32819, 32823, 32829, 32835, + 32841, 32847, 32853, 32859, 32863, 32868, 32873, 32880, 32885, 32889, + 32895, 32900, 32905, 32909, 32914, 32919, 32923, 32927, 32932, 32939, + 32943, 32948, 32953, 32957, 32962, 32966, 32971, 32975, 32981, 32986, + 32993, 32998, 33003, 33007, 33012, 33017, 33024, 33029, 33035, 33040, + 33044, 33049, 33053, 33058, 33065, 33072, 33077, 33082, 33086, 33092, + 33098, 33103, 33108, 33113, 33119, 33124, 33130, 33135, 33141, 33147, + 33153, 33160, 33167, 33174, 33181, 33188, 33195, 33200, 33208, 33217, + 33226, 33235, 33244, 33253, 33262, 33274, 33283, 33292, 33301, 33308, + 33313, 33320, 33328, 33336, 33343, 33350, 33357, 33364, 33372, 33381, + 33390, 33399, 33408, 33417, 33426, 33435, 33444, 33453, 33462, 33471, + 33480, 33489, 33498, 33506, 33515, 33526, 33534, 33543, 33554, 33563, + 33572, 33581, 33590, 33598, 33607, 33614, 33619, 33627, 33632, 33639, + 33644, 33653, 33659, 33666, 33673, 33678, 33683, 33691, 33699, 33708, + 33717, 33722, 33729, 33740, 33748, 33757, 33763, 33769, 33774, 33781, + 33786, 33795, 33800, 33805, 33810, 33817, 33824, 33829, 33838, 33846, + 33851, 33856, 33863, 33870, 33874, 33878, 33881, 33884, 33887, 33890, + 33893, 33896, 33903, 33906, 33909, 33914, 33918, 33922, 33926, 33930, + 33934, 33943, 33949, 33955, 33961, 33969, 33977, 33983, 33989, 33996, + 34002, 34007, 34013, 34019, 34025, 34032, 34038, 34046, 34052, 34059, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34065, 34072, + 34079, 34084, 34093, 34101, 34109, 34116, 34123, 34130, 34137, 34145, + 34153, 34163, 34173, 34181, 34189, 34197, 34205, 34214, 34223, 34231, + 34239, 34248, 34257, 34267, 34277, 34286, 34295, 34303, 34311, 34319, + 34327, 34337, 34347, 34355, 34363, 34371, 34379, 34387, 34395, 34403, + 34411, 34419, 34427, 34435, 34443, 34452, 34461, 34470, 34479, 34489, + 34499, 34506, 34513, 34521, 34529, 34538, 34547, 34555, 34563, 34575, + 34587, 34596, 34605, 34614, 34623, 34630, 34637, 34645, 34653, 34661, + 34669, 34677, 34685, 34693, 34701, 34710, 34719, 34728, 34737, 34746, + 34755, 34765, 34775, 34785, 34795, 34804, 34813, 34820, 34827, 34835, + 34843, 34851, 34859, 34867, 34875, 34887, 34899, 34908, 34917, 34925, + 34933, 34941, 34949, 34960, 34971, 34982, 34993, 35005, 35017, 35025, + 35033, 35041, 35049, 35058, 35067, 35076, 35085, 35093, 35101, 35109, + 35117, 35125, 35133, 35142, 35151, 35161, 35171, 35178, 35185, 35193, + 35201, 35209, 35217, 35224, 35231, 35239, 35247, 35255, 35263, 35271, + 35279, 35287, 35295, 35303, 35311, 35319, 35327, 35335, 35343, 35351, + 35359, 35368, 35377, 35386, 35394, 35403, 35412, 35421, 35430, 35440, + 35449, 35456, 35461, 35468, 35475, 35483, 35491, 35500, 35509, 35519, + 35529, 35540, 35551, 35560, 35569, 35579, 35589, 35598, 35607, 35617, + 35627, 35638, 35649, 35658, 35667, 35677, 35687, 35694, 35701, 35709, + 35717, 35723, 35729, 35738, 35747, 35757, 35767, 35778, 35789, 35798, + 35807, 35817, 35827, 35836, 35845, 35853, 35861, 35868, 35875, 35883, + 35891, 35900, 35909, 35919, 35929, 35940, 35951, 35960, 35969, 35979, + 35989, 35998, 36007, 36017, 36027, 36038, 36049, 36058, 36067, 36077, + 36087, 36094, 36101, 36109, 36117, 36126, 36135, 36145, 36155, 36166, + 36177, 36186, 36195, 36205, 36215, 36223, 36231, 36239, 36247, 36256, + 36265, 36272, 36279, 36286, 36293, 36300, 36307, 36315, 36323, 36331, + 36339, 36350, 36361, 36372, 36383, 36394, 36405, 36413, 36421, 36432, + 36443, 36454, 36465, 36476, 36487, 36495, 36503, 36514, 36525, 36536, 0, + 0, 36547, 36555, 36563, 36574, 36585, 36596, 0, 0, 36607, 36615, 36623, + 36634, 36645, 36656, 36667, 36678, 36689, 36697, 36705, 36716, 36727, + 36738, 36749, 36760, 36771, 36779, 36787, 36798, 36809, 36820, 36831, + 36842, 36853, 36861, 36869, 36880, 36891, 36902, 36913, 36924, 36935, + 36943, 36951, 36962, 36973, 36984, 0, 0, 36995, 37003, 37011, 37022, + 37033, 37044, 0, 0, 37055, 37063, 37071, 37082, 37093, 37104, 37115, + 37126, 0, 37137, 0, 37145, 0, 37156, 0, 37167, 37178, 37186, 37194, + 37205, 37216, 37227, 37238, 37249, 37260, 37268, 37276, 37287, 37298, + 37309, 37320, 37331, 37342, 37350, 37358, 37366, 37374, 37382, 37390, + 37398, 37406, 37414, 37422, 37430, 37438, 37446, 0, 0, 37454, 37465, + 37476, 37490, 37504, 37518, 37532, 37546, 37560, 37571, 37582, 37596, + 37610, 37624, 37638, 37652, 37666, 37677, 37688, 37702, 37716, 37730, + 37744, 37758, 37772, 37783, 37794, 37808, 37822, 37836, 37850, 37864, + 37878, 37889, 37900, 37914, 37928, 37942, 37956, 37970, 37984, 37995, + 38006, 38020, 38034, 38048, 38062, 38076, 38090, 38098, 38106, 38117, + 38125, 0, 38136, 38144, 38155, 38163, 38171, 38179, 38187, 38195, 38198, + 38201, 38204, 38207, 38213, 38224, 38232, 0, 38243, 38251, 38262, 38270, + 38278, 38286, 38294, 38302, 38308, 38314, 38320, 38328, 38336, 38347, 0, + 0, 38358, 38366, 38377, 38385, 38393, 38401, 0, 38409, 38415, 38421, + 38427, 38435, 38443, 38454, 38465, 38473, 38481, 38489, 38500, 38508, + 38516, 38524, 38532, 38540, 38546, 38552, 0, 0, 38555, 38566, 38574, 0, + 38585, 38593, 38604, 38612, 38620, 38628, 38636, 38644, 38647, 0, 38650, + 38654, 38658, 38662, 38666, 38670, 38674, 38678, 38682, 38686, 38690, + 38694, 38700, 38706, 38712, 38715, 38718, 38720, 38724, 38728, 38732, + 38736, 38738, 38742, 38746, 38752, 38758, 38765, 38772, 38777, 38782, + 38788, 38794, 38796, 38799, 38801, 38805, 38809, 38813, 38816, 38820, + 38824, 38828, 38832, 38836, 38842, 38846, 38850, 38856, 38861, 38868, + 38870, 38873, 38877, 38881, 38886, 38892, 38894, 38903, 38912, 38915, + 38919, 38921, 38923, 38925, 38928, 38934, 38936, 38940, 38944, 38951, + 38958, 38962, 38967, 38972, 38977, 38982, 38986, 38990, 38993, 38997, + 39001, 39008, 39013, 39017, 39021, 39026, 39030, 39034, 39039, 39044, + 39048, 39052, 39056, 39058, 39063, 39068, 39072, 39076, 39080, 39084, 0, + 39088, 39092, 39096, 39102, 39108, 39114, 39120, 39127, 39134, 39139, + 39144, 39148, 0, 0, 39154, 39157, 39160, 39163, 39166, 39169, 39172, + 39176, 39180, 39185, 39190, 39195, 39202, 39206, 39209, 39212, 39215, + 39218, 39221, 39224, 39227, 39230, 39233, 39237, 39241, 39246, 39251, 0, + 39256, 39262, 39268, 39274, 39281, 39288, 39295, 39302, 39308, 39314, + 39321, 39328, 39335, 0, 0, 0, 39342, 39345, 39348, 39351, 39356, 39359, + 39362, 39365, 39368, 39371, 39374, 39378, 39381, 39384, 39387, 39390, + 39393, 39398, 39401, 39404, 39407, 39410, 39413, 39418, 39421, 39424, + 39429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39434, 39439, 39444, 39451, 39459, 39464, 39469, 39473, 39477, 39482, + 39489, 39496, 39500, 39505, 39510, 39515, 39520, 39527, 39532, 39537, + 39542, 39551, 39558, 39565, 39569, 39574, 39580, 39585, 39592, 39601, + 39610, 39614, 39618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39622, + 39626, 39634, 39638, 39642, 39647, 39651, 39655, 39659, 39661, 39665, + 39669, 39673, 39678, 39682, 39686, 39694, 39697, 39701, 39704, 39707, + 39713, 39717, 39720, 39726, 39730, 39734, 39738, 39741, 39745, 39748, + 39752, 39754, 39757, 39760, 39764, 39766, 39770, 39773, 39776, 39781, + 39786, 39793, 39796, 39799, 39803, 39808, 39811, 39814, 39817, 39821, + 39826, 39829, 39832, 39834, 39837, 39840, 39843, 39847, 39852, 39855, + 39859, 39863, 39867, 39871, 39876, 39882, 39887, 39892, 39898, 39903, + 39908, 39912, 39916, 39921, 39925, 39929, 39932, 39934, 39939, 39945, + 39952, 39959, 39966, 39973, 39980, 39987, 39994, 40001, 40009, 40016, + 40024, 40031, 40038, 40046, 40054, 40059, 40064, 40069, 40074, 40079, + 40084, 40089, 40094, 40099, 40104, 40110, 40116, 40122, 40128, 40135, + 40143, 40150, 40156, 40162, 40168, 40174, 40180, 40186, 40192, 40198, + 40204, 40211, 40218, 40225, 40232, 40240, 40249, 40257, 40268, 40276, + 40284, 40293, 40300, 40309, 40318, 40326, 40335, 0, 0, 0, 0, 0, 0, 40343, + 40345, 40348, 40350, 40353, 40356, 40359, 40364, 40369, 40374, 40379, + 40383, 40387, 40391, 40395, 40400, 40406, 40411, 40417, 40422, 40427, + 40432, 40438, 40443, 40449, 40455, 40459, 40463, 40468, 40473, 40478, + 40483, 40488, 40496, 40504, 40512, 40520, 40527, 40535, 40542, 40549, + 40558, 40570, 40576, 40582, 40590, 40598, 40607, 40616, 40624, 40632, + 40641, 40650, 40655, 40663, 40668, 40673, 40679, 40684, 40690, 40697, + 40704, 40709, 40715, 40720, 40723, 40727, 40730, 40734, 40738, 40742, + 40748, 40754, 40760, 40766, 40770, 40774, 40778, 40782, 40788, 40794, + 40798, 40803, 40807, 40812, 40817, 40822, 40825, 40829, 40832, 40836, + 40843, 40851, 40862, 40873, 40878, 40887, 40894, 40903, 40912, 40916, + 40922, 40930, 40934, 40939, 40944, 40950, 40956, 40962, 40969, 40973, + 40977, 40982, 40985, 40987, 40991, 40995, 41003, 41007, 41009, 41011, + 41015, 41023, 41028, 41034, 41044, 41051, 41056, 41060, 41064, 41068, + 41071, 41074, 41077, 41081, 41085, 41089, 41093, 41097, 41100, 41104, + 41108, 41111, 41113, 41116, 41118, 41122, 41126, 41128, 41134, 41137, + 41142, 41146, 41150, 41152, 41154, 41156, 41159, 41163, 41167, 41171, + 41175, 41179, 41185, 41191, 41193, 41195, 41197, 41199, 41202, 41204, + 41208, 41210, 41214, 41217, 41223, 41227, 41231, 41234, 41237, 41241, + 41247, 41251, 41261, 41271, 41275, 41281, 41287, 41290, 41294, 41297, + 41302, 41306, 41312, 41316, 41328, 41336, 41340, 41344, 41350, 41354, + 41357, 41359, 41362, 41366, 41370, 41377, 41381, 41385, 41389, 41392, + 41397, 41402, 41407, 41412, 41417, 41422, 41430, 41438, 41442, 41446, + 41448, 41453, 41457, 41461, 41469, 41477, 41483, 41489, 41498, 41507, + 41512, 41517, 41525, 41533, 41535, 41537, 41542, 41547, 41553, 41559, + 41565, 41571, 41575, 41579, 41586, 41593, 41599, 41605, 41615, 41625, + 41633, 41641, 41643, 41647, 41651, 41656, 41661, 41668, 41675, 41678, + 41681, 41684, 41687, 41690, 41695, 41699, 41704, 41709, 41712, 41715, + 41718, 41721, 41724, 41728, 41731, 41734, 41737, 41740, 41742, 41744, + 41746, 41748, 41756, 41764, 41770, 41774, 41780, 41790, 41796, 41802, + 41808, 41816, 41824, 41835, 41839, 41843, 41845, 41851, 41853, 41855, + 41857, 41859, 41865, 41868, 41874, 41880, 41884, 41888, 41892, 41895, + 41899, 41903, 41905, 41914, 41923, 41928, 41933, 41939, 41945, 41951, + 41954, 41957, 41960, 41963, 41965, 41970, 41975, 41980, 41986, 41992, + 42000, 42008, 42014, 42020, 42026, 42032, 42041, 42050, 42059, 42068, + 42077, 42086, 42095, 42104, 42113, 42122, 42130, 42142, 42152, 42167, + 42170, 42175, 42181, 42187, 42194, 42208, 42223, 42229, 42235, 42242, + 42248, 42256, 42262, 42275, 42289, 42294, 42300, 42307, 42310, 42313, + 42315, 42318, 42321, 42323, 42325, 42329, 42332, 42335, 42338, 42341, + 42346, 42351, 42356, 42361, 42366, 42369, 42371, 42373, 42375, 42379, + 42383, 42387, 42393, 42398, 42400, 42402, 42407, 42412, 42417, 42422, + 42427, 42432, 42434, 42436, 42445, 42449, 42457, 42466, 42468, 42473, + 42478, 42486, 42490, 42492, 42496, 42498, 42502, 42506, 42510, 42512, + 42514, 42516, 42523, 42532, 42541, 42550, 42559, 42568, 42577, 42586, + 42595, 42603, 42611, 42620, 42629, 42638, 42647, 42655, 42663, 42672, + 42681, 42690, 42700, 42709, 42719, 42728, 42738, 42747, 42757, 42767, + 42776, 42786, 42795, 42805, 42814, 42824, 42833, 42842, 42851, 42860, + 42869, 42879, 42888, 42897, 42906, 42916, 42925, 42934, 42943, 42952, + 42962, 42972, 42981, 42990, 42998, 43006, 43013, 43021, 43030, 43041, + 43050, 43059, 43068, 43075, 43082, 43089, 43098, 43107, 43116, 43125, + 43132, 43137, 43146, 43151, 43154, 43162, 43165, 43170, 43175, 43178, + 43181, 43189, 43192, 43197, 43200, 43207, 43212, 43220, 43223, 43226, + 43229, 43234, 43239, 43242, 43245, 43253, 43256, 43263, 43270, 43274, + 43278, 43283, 43288, 43294, 43299, 43305, 43311, 43316, 43322, 43330, + 43336, 43344, 43352, 43358, 43366, 43374, 43383, 43391, 43397, 43405, + 43414, 43422, 43426, 43431, 43444, 43457, 43461, 43465, 43469, 43473, + 43483, 43487, 43492, 43497, 43502, 43507, 43512, 43517, 43527, 43537, + 43545, 43555, 43565, 43573, 43583, 43593, 43601, 43611, 43621, 43629, + 43637, 43647, 43657, 43660, 43663, 43666, 43671, 43675, 43681, 43688, + 43695, 43703, 43710, 43714, 43718, 43722, 43726, 43728, 43732, 43736, + 43741, 43746, 43753, 43760, 43763, 43770, 43772, 43774, 43778, 43782, + 43787, 43793, 43799, 43805, 43811, 43820, 43829, 43838, 43842, 43844, + 43848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43855, 43859, 43866, 43873, + 43880, 43887, 43891, 43895, 43899, 43903, 43908, 43914, 43919, 43925, + 43931, 43937, 43943, 43951, 43958, 43965, 43972, 43979, 43984, 43990, + 43999, 44003, 44010, 44014, 44018, 44024, 44030, 44036, 44042, 44046, + 44050, 44053, 44056, 44060, 44067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44074, 44077, 44081, 44085, 44091, + 44097, 44103, 44111, 44118, 44122, 44130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44135, 44138, 44141, 44144, 44147, + 44150, 44153, 44156, 44159, 44162, 44166, 44170, 44174, 44178, 44182, + 44186, 44190, 44194, 44198, 44202, 44206, 44209, 44212, 44215, 44218, + 44221, 44224, 44227, 44230, 44233, 44237, 44241, 44245, 44249, 44253, + 44257, 44261, 44265, 44269, 44273, 44277, 44283, 44289, 44295, 44302, + 44309, 44316, 44323, 44330, 44337, 44344, 44351, 44358, 44365, 44372, + 44379, 44386, 44393, 44400, 44407, 44414, 44419, 44425, 44431, 44437, + 44442, 44448, 44454, 44460, 44465, 44471, 44477, 44482, 44487, 44493, + 44498, 44504, 44510, 44515, 44521, 44527, 44532, 44538, 44544, 44550, + 44556, 44562, 44567, 44573, 44579, 44585, 44590, 44596, 44602, 44608, + 44613, 44619, 44625, 44630, 44635, 44641, 44646, 44652, 44658, 44663, + 44669, 44675, 44680, 44686, 44692, 44698, 44704, 44710, 44715, 44721, + 44727, 44733, 44738, 44744, 44750, 44756, 44761, 44767, 44773, 44778, + 44783, 44789, 44794, 44800, 44806, 44811, 44817, 44823, 44828, 44834, + 44840, 44846, 44852, 44858, 44862, 44867, 44872, 44877, 44882, 44887, + 44892, 44897, 44902, 44907, 44912, 44916, 44920, 44924, 44928, 44932, + 44936, 44940, 44944, 44948, 44953, 44958, 44963, 44968, 44973, 44978, + 44987, 44996, 45005, 45014, 45023, 45032, 45041, 45050, 45057, 45065, + 45073, 45080, 45087, 45095, 45103, 45110, 45117, 45125, 45133, 45140, + 45147, 45155, 45163, 45170, 45177, 45185, 45194, 45203, 45211, 45220, + 45229, 45236, 45243, 45251, 45260, 45269, 45277, 45286, 45295, 45302, + 45309, 45318, 45327, 45335, 45343, 45352, 45361, 45368, 45375, 45384, + 45393, 45401, 45409, 45418, 45427, 45434, 45441, 45450, 45459, 45467, + 45476, 45485, 45493, 45503, 45513, 45523, 45533, 45542, 45551, 45560, + 45569, 45576, 45584, 45592, 45600, 45608, 45613, 45618, 45627, 45635, + 45642, 45651, 45659, 45666, 45675, 45683, 45690, 45699, 45707, 45714, + 45723, 45731, 45738, 45747, 45755, 45762, 45771, 45779, 45786, 45795, + 45803, 45810, 45819, 45827, 45834, 45843, 45852, 45861, 45870, 45884, + 45898, 45905, 45910, 45915, 45920, 45925, 45930, 45935, 45940, 45945, + 45953, 45961, 45969, 45977, 45982, 45989, 45996, 46003, 46008, 46016, + 46023, 46031, 46035, 46042, 46048, 46055, 46059, 46065, 46071, 46077, + 46081, 46084, 46088, 46092, 46099, 46105, 46111, 46117, 46123, 46137, + 46147, 46161, 46175, 46181, 46191, 46205, 46208, 46211, 46218, 46226, + 46231, 46236, 46244, 46256, 46268, 46276, 46280, 46284, 46287, 46290, + 46294, 46298, 46301, 46304, 46309, 46314, 46320, 46326, 46331, 46336, + 46342, 46348, 46353, 46358, 46363, 46368, 46374, 46380, 46385, 46390, + 46396, 46402, 46407, 46412, 46415, 46418, 46427, 46429, 46431, 46434, + 46438, 46444, 46446, 46449, 46456, 46463, 46471, 46479, 46489, 46503, + 46508, 46513, 46517, 46522, 46530, 46538, 46547, 46556, 46565, 46574, + 46579, 46584, 46590, 46596, 46602, 46608, 46611, 46617, 46623, 46633, + 46643, 46651, 46659, 46668, 46677, 46681, 46689, 46697, 46705, 46713, + 46722, 46731, 46740, 46749, 46754, 46759, 46764, 46769, 46774, 46780, + 46786, 46791, 46797, 46799, 46801, 46803, 46805, 46808, 46811, 46813, + 46815, 46817, 46821, 46825, 46827, 46829, 46832, 46835, 46839, 46845, + 46851, 46853, 46860, 46864, 46869, 46874, 46876, 46886, 46892, 46898, + 46904, 46910, 46916, 46922, 46927, 46930, 46933, 46936, 46938, 46940, + 46944, 46948, 46953, 46958, 46963, 46966, 46970, 46975, 46978, 46982, + 46987, 46992, 46997, 47002, 47007, 47012, 47017, 47022, 47027, 47032, + 47037, 47042, 47048, 47054, 47060, 47062, 47065, 47067, 47070, 47072, + 47074, 47076, 47078, 47080, 47082, 47084, 47086, 47088, 47090, 47092, + 47094, 47096, 47098, 47100, 47102, 47104, 47109, 47114, 47119, 47124, + 47129, 47134, 47139, 47144, 47149, 47154, 47159, 47164, 47169, 47174, + 47179, 47184, 47189, 47194, 47199, 47204, 47208, 47212, 47216, 47222, + 47228, 47233, 47238, 47243, 47248, 47253, 47258, 47266, 47274, 47282, + 47290, 47298, 47306, 47314, 47322, 47328, 47333, 47338, 47343, 47346, + 47350, 47354, 47358, 47362, 47366, 47370, 47377, 47384, 47392, 47400, + 47405, 47410, 47417, 47424, 47431, 47438, 47441, 47444, 47449, 47451, + 47455, 47460, 47462, 47464, 47466, 47468, 47473, 47476, 47478, 47483, + 47490, 47497, 47500, 47504, 47509, 47514, 47522, 47528, 47534, 47546, + 47553, 47560, 47565, 47570, 47576, 47579, 47582, 47587, 47589, 47593, + 47595, 47597, 47599, 47601, 47603, 47605, 47610, 47612, 47614, 47616, + 47618, 47622, 47624, 47627, 47632, 47637, 47642, 47647, 47653, 47659, + 47661, 47664, 47671, 47678, 47685, 47692, 47696, 47700, 47702, 47704, + 47708, 47714, 47719, 47721, 47725, 47734, 47742, 47750, 47756, 47762, + 47767, 47773, 47778, 47781, 47795, 47798, 47803, 47808, 47814, 47824, + 47826, 47832, 47838, 47842, 47849, 47853, 47855, 47857, 47861, 47867, + 47872, 47878, 47880, 47886, 47888, 47894, 47896, 47898, 47903, 47905, + 47909, 47914, 47916, 47921, 47926, 47930, 47937, 0, 47947, 47953, 47956, + 47962, 47965, 47970, 47975, 47979, 47981, 47983, 47987, 47991, 47995, + 47999, 48004, 48006, 48011, 48014, 48017, 48020, 48024, 48028, 48033, + 48037, 48042, 48047, 48051, 48056, 48062, 48065, 48071, 48076, 48080, + 48085, 48091, 48097, 48104, 48110, 48117, 48124, 48126, 48133, 48137, + 48143, 48149, 48154, 48160, 48164, 48169, 48172, 48177, 48183, 48190, + 48198, 48205, 48214, 48224, 48231, 48237, 48241, 48248, 48253, 48262, + 48265, 48268, 48277, 48287, 48294, 48296, 48302, 48307, 48309, 48312, + 48316, 48324, 48333, 48336, 48341, 48346, 48354, 48362, 48370, 48378, + 48384, 48390, 48396, 48404, 48409, 48412, 48416, 48419, 48431, 48441, + 48452, 48461, 48472, 48482, 48491, 48497, 48505, 48509, 48517, 48521, + 48529, 48536, 48543, 48552, 48561, 48571, 48581, 48591, 48601, 48610, + 48619, 48629, 48639, 48648, 48657, 48663, 48669, 48675, 48681, 48687, + 48693, 48699, 48705, 48711, 48718, 48724, 48730, 48736, 48742, 48748, + 48754, 48760, 48766, 48772, 48779, 48786, 48793, 48800, 48807, 48814, + 48821, 48828, 48835, 48842, 48850, 48855, 48858, 48862, 48866, 48872, + 48875, 48881, 48887, 48892, 48896, 48901, 48907, 48914, 48917, 48924, + 48931, 48935, 48944, 48953, 48958, 48964, 48969, 48974, 48981, 48988, + 48996, 49004, 49013, 49017, 49026, 49031, 49035, 49042, 49046, 49053, + 49061, 49066, 49074, 49078, 49083, 49087, 49092, 49096, 49101, 49106, + 49115, 49117, 49120, 49123, 49130, 49137, 49142, 49150, 49156, 49162, + 49167, 49170, 49175, 49180, 49185, 49193, 49197, 49204, 49212, 49220, + 49225, 49230, 49236, 49241, 49246, 49252, 49257, 49260, 49264, 49268, + 49275, 49284, 49289, 49298, 49307, 49313, 49319, 49324, 49329, 49334, + 49339, 49345, 49351, 49359, 49367, 49373, 49379, 49384, 49389, 49396, + 49403, 49409, 49412, 49415, 49419, 49423, 49427, 49432, 49438, 49444, + 49451, 49458, 49463, 49467, 49471, 49475, 49479, 49483, 49487, 49491, + 49495, 49499, 49503, 49507, 49511, 49515, 49519, 49523, 49527, 49531, + 49535, 49539, 49543, 49547, 49551, 49555, 49559, 49563, 49567, 49571, + 49575, 49579, 49583, 49587, 49591, 49595, 49599, 49603, 49607, 49611, + 49615, 49619, 49623, 49627, 49631, 49635, 49639, 49643, 49647, 49651, + 49655, 49659, 49663, 49667, 49671, 49675, 49679, 49683, 49687, 49691, + 49695, 49699, 49703, 49707, 49711, 49715, 49719, 49723, 49727, 49731, + 49735, 49739, 49743, 49747, 49751, 49755, 49759, 49763, 49767, 49771, + 49775, 49779, 49783, 49787, 49791, 49795, 49799, 49803, 49807, 49811, + 49815, 49819, 49823, 49827, 49831, 49835, 49839, 49843, 49847, 49851, + 49855, 49859, 49863, 49867, 49871, 49875, 49879, 49883, 49887, 49891, + 49895, 49899, 49903, 49907, 49911, 49915, 49919, 49923, 49927, 49931, + 49935, 49939, 49943, 49947, 49951, 49955, 49959, 49963, 49967, 49971, + 49975, 49979, 49983, 49987, 49991, 49995, 49999, 50003, 50007, 50011, + 50015, 50019, 50023, 50027, 50031, 50035, 50039, 50043, 50047, 50051, + 50055, 50059, 50063, 50067, 50071, 50075, 50079, 50083, 50087, 50091, + 50095, 50099, 50103, 50107, 50111, 50115, 50119, 50123, 50127, 50131, + 50135, 50139, 50143, 50147, 50151, 50155, 50159, 50163, 50167, 50171, + 50175, 50179, 50183, 50187, 50191, 50195, 50199, 50203, 50207, 50211, + 50215, 50219, 50223, 50227, 50231, 50235, 50239, 50243, 50247, 50251, + 50255, 50259, 50263, 50267, 50271, 50275, 50279, 50283, 50287, 50291, + 50295, 50299, 50303, 50307, 50311, 50315, 50319, 50323, 50327, 50331, + 50335, 50339, 50343, 50347, 50351, 50355, 50359, 50363, 50367, 50371, + 50375, 50379, 50383, 50387, 50391, 50395, 50399, 50403, 50407, 50411, + 50415, 50419, 50423, 50427, 50431, 50435, 50439, 50443, 50447, 50451, + 50455, 50459, 50463, 50467, 50471, 50475, 50479, 50483, 50487, 50494, + 50502, 50508, 50514, 50521, 50528, 50534, 50540, 50546, 50552, 50557, + 50562, 50567, 50572, 50578, 50584, 50592, 50599, 50605, 50611, 50619, + 50628, 50635, 50645, 50656, 50659, 50662, 50666, 50670, 50677, 50684, + 50695, 50706, 50716, 50726, 50733, 50740, 50747, 50754, 50765, 50776, + 50787, 50798, 50808, 50818, 50830, 50842, 50853, 50864, 50876, 50888, + 50897, 50907, 50917, 50928, 50939, 50946, 50953, 50960, 50967, 50977, + 50987, 50995, 51003, 51010, 51017, 51024, 51031, 51038, 51043, 51048, + 51054, 51062, 51072, 51082, 51092, 51102, 51112, 51122, 51132, 51142, + 51152, 51162, 51172, 51183, 51194, 51204, 51214, 51225, 51236, 51246, + 51256, 51267, 51278, 51288, 51298, 51309, 51320, 51336, 51355, 51371, + 51390, 51406, 51422, 51438, 51454, 51465, 51477, 51488, 51500, 51519, + 51538, 51546, 51552, 51559, 51566, 51573, 51580, 51585, 51591, 51596, + 51601, 51607, 51612, 51617, 51622, 51627, 51632, 51639, 51644, 51651, + 51656, 51661, 51665, 51669, 51676, 51683, 51690, 51697, 51704, 51711, + 51724, 51737, 51750, 51763, 51771, 51779, 51785, 51791, 51798, 51805, + 51812, 51819, 51823, 51828, 51836, 51844, 51852, 51859, 51863, 51871, + 51879, 51883, 51887, 51892, 51899, 51907, 51915, 51934, 51953, 51972, + 51991, 52010, 52029, 52048, 52067, 52073, 52080, 52089, 52097, 52105, + 52110, 52113, 52116, 52121, 52124, 52143, 52150, 52156, 52162, 52166, + 52169, 52172, 52175, 52187, 52200, 52207, 52214, 52217, 52221, 52224, + 52229, 52234, 52239, 52245, 52254, 52261, 52268, 52276, 52283, 52290, + 52293, 52299, 52305, 52308, 52311, 52316, 52321, 52327, 52333, 52337, + 52342, 52349, 52353, 52359, 52363, 52367, 52375, 52387, 52396, 52400, + 52402, 52411, 52420, 52426, 52429, 52435, 52441, 52446, 52451, 52456, + 52461, 52466, 52471, 52473, 52479, 52484, 52491, 52495, 52501, 52504, + 52508, 52515, 52522, 52524, 52526, 52532, 52538, 52544, 52553, 52562, + 52569, 52576, 52582, 52588, 52593, 52598, 52603, 52609, 52615, 52620, + 52627, 52631, 52635, 52648, 52661, 52673, 52682, 52688, 52695, 52700, + 52705, 52710, 52715, 52720, 52722, 52729, 52736, 52743, 52750, 52757, + 52765, 52771, 52776, 52782, 52788, 52794, 52801, 52807, 52815, 52823, + 52831, 52839, 52846, 52852, 52858, 52867, 52871, 52880, 52889, 52898, + 52906, 52910, 52916, 52923, 52930, 52934, 52940, 52947, 52952, 52957, + 52963, 52968, 52973, 52980, 52987, 52992, 52997, 53005, 53013, 53023, + 53033, 53040, 53047, 53051, 53055, 53067, 53073, 53079, 53084, 53089, + 53096, 53103, 53109, 53115, 53124, 53132, 53140, 53147, 53154, 53161, + 53167, 53174, 53180, 53187, 53194, 53201, 53208, 53214, 53219, 53228, + 53238, 53245, 53254, 53260, 53265, 53270, 53280, 53286, 53292, 53298, + 53306, 53311, 53318, 53325, 53336, 53343, 53350, 53357, 53364, 53371, + 53378, 53385, 53397, 53409, 53420, 53431, 53444, 53457, 53462, 53467, + 53476, 53485, 53492, 53499, 53508, 53517, 53525, 53533, 53541, 53549, + 53559, 53569, 53583, 53597, 53605, 53613, 53625, 53637, 53645, 53653, + 53663, 53673, 53678, 53683, 53692, 53701, 53706, 53711, 53719, 53725, + 53731, 53739, 53747, 53760, 53773, 53777, 53781, 53788, 53795, 53802, + 53810, 53818, 53827, 53836, 53842, 53848, 53855, 53862, 53869, 53876, + 53885, 53894, 53897, 53900, 53905, 53910, 53916, 53922, 53929, 53936, + 53946, 53956, 53963, 53970, 53978, 53986, 53994, 54002, 54010, 54018, + 54024, 54030, 54034, 54038, 54045, 54052, 54057, 54062, 54067, 54072, + 54078, 54092, 54099, 54106, 54110, 54112, 54114, 54119, 54124, 54129, + 54134, 54142, 54149, 54156, 54164, 54176, 54184, 54192, 54203, 54207, + 54211, 54217, 54225, 54238, 54245, 54252, 54259, 54264, 54271, 54280, + 54288, 54294, 54300, 54306, 54315, 54324, 54332, 54341, 54346, 54349, + 54354, 54360, 54366, 54372, 54378, 54382, 54385, 54389, 54393, 54399, + 54405, 54411, 54417, 54421, 54425, 54432, 54439, 54446, 54453, 54460, + 54467, 54477, 54487, 54494, 54501, 54509, 54517, 54521, 54526, 54531, + 54537, 54543, 54546, 54549, 54552, 54555, 54559, 54564, 54569, 54574, + 54579, 54584, 54588, 54592, 54596, 54600, 54604, 54608, 54612, 54618, + 54622, 54628, 54633, 54640, 54648, 54655, 54663, 54670, 54678, 54687, + 54694, 54704, 54715, 54721, 54730, 54736, 54745, 54754, 54760, 54766, + 54770, 54774, 54783, 54792, 54799, 54806, 54815, 0, 0, 0, 54824, 54829, + 54833, 54837, 54842, 54847, 54852, 54860, 54868, 54871, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54875, 54880, 54885, + 54890, 54895, 54900, 54905, 54910, 54915, 54920, 54925, 54931, 54935, + 54940, 54945, 54950, 54955, 54960, 54965, 54970, 54975, 54980, 54985, + 54990, 54995, 55000, 55005, 55010, 55015, 55020, 55025, 55030, 55035, + 55040, 55045, 55051, 55056, 55062, 55071, 55076, 55084, 55091, 55100, + 55105, 55110, 55115, 55121, 0, 55128, 55133, 55138, 55143, 55148, 55153, + 55158, 55163, 55168, 55173, 55178, 55184, 55188, 55193, 55198, 55203, + 55208, 55213, 55218, 55223, 55228, 55233, 55238, 55243, 55248, 55253, + 55258, 55263, 55268, 55273, 55278, 55283, 55288, 55293, 55298, 55304, + 55309, 55315, 55324, 55329, 55337, 55344, 55353, 55358, 55363, 55368, + 55374, 0, 55381, 55389, 55397, 55406, 55413, 55421, 55427, 55436, 55444, + 55452, 55460, 55468, 55476, 55484, 55489, 55496, 55502, 55509, 55517, + 55524, 55531, 55539, 55545, 55551, 55558, 55565, 55575, 55585, 55592, + 55599, 55604, 55614, 55624, 55629, 55634, 55639, 55644, 55649, 55654, + 55659, 55664, 55669, 55674, 55679, 55684, 55689, 55694, 55699, 55704, + 55709, 55714, 55719, 55724, 55729, 55734, 55739, 55744, 55749, 55754, + 55759, 55764, 55769, 55774, 55778, 55782, 55787, 55792, 55797, 55802, + 55807, 55812, 55817, 55822, 55827, 55832, 55837, 55842, 55847, 55852, + 55857, 55862, 55867, 55872, 55879, 55886, 55893, 55900, 55907, 55914, + 55921, 55928, 55935, 55942, 55949, 55956, 55963, 55970, 55975, 55980, + 55987, 55994, 56001, 56008, 56015, 56022, 56029, 56036, 56043, 56050, + 56057, 56064, 56070, 56076, 56082, 56088, 56095, 56102, 56109, 56116, + 56123, 56130, 56137, 56144, 56151, 56158, 56166, 56174, 56182, 56190, + 56198, 56206, 56214, 56222, 56226, 56232, 56238, 56242, 56248, 56254, + 56260, 56267, 56274, 56281, 56288, 56293, 56299, 56305, 56312, 0, 0, 0, + 0, 0, 56319, 56327, 56336, 56345, 56353, 56359, 56364, 56369, 56374, + 56379, 56384, 56389, 56394, 56399, 56404, 56409, 56414, 56419, 56424, + 56429, 56434, 56439, 56444, 56449, 56454, 56459, 56464, 56469, 56474, + 56479, 56484, 56489, 56494, 56499, 56504, 56509, 56514, 56519, 56524, + 56529, 56534, 56539, 56544, 56549, 56554, 0, 56559, 0, 0, 0, 0, 0, 56564, + 0, 0, 56569, 56573, 56578, 56583, 56588, 56593, 56602, 56607, 56612, + 56617, 56622, 56627, 56632, 56637, 56642, 56649, 56654, 56659, 56668, + 56675, 56680, 56685, 56690, 56697, 56702, 56709, 56714, 56719, 56726, + 56733, 56738, 56743, 56748, 56755, 56762, 56767, 56772, 56777, 56782, + 56787, 56794, 56801, 56806, 56811, 56816, 56821, 56826, 56831, 56836, + 56841, 56846, 56851, 56856, 56863, 56868, 56873, 0, 0, 0, 0, 0, 0, 0, + 56878, 56885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56890, 56895, + 56899, 56903, 56907, 56911, 56915, 56919, 56923, 56927, 56931, 56935, + 56941, 56945, 56949, 56953, 56957, 56961, 56965, 56969, 56973, 56977, + 56981, 56985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56989, 56993, 56997, 57001, + 57005, 57009, 57013, 0, 57017, 57021, 57025, 57029, 57033, 57037, 57041, + 0, 57045, 57049, 57053, 57057, 57061, 57065, 57069, 0, 57073, 57077, + 57081, 57085, 57089, 57093, 57097, 0, 57101, 57105, 57109, 57113, 57117, + 57121, 57125, 0, 57129, 57133, 57137, 57141, 57145, 57149, 57153, 0, + 57157, 57161, 57165, 57169, 57173, 57177, 57181, 0, 57185, 57189, 57193, + 57197, 57201, 57205, 57209, 0, 57213, 57218, 57223, 57228, 57233, 57238, + 57243, 57247, 57252, 57257, 57262, 57266, 57271, 57276, 57281, 57286, + 57290, 57295, 57300, 57305, 57310, 57315, 57320, 57324, 57329, 57334, + 57341, 57346, 57351, 57357, 57364, 57371, 57380, 57387, 57396, 57400, + 57404, 57410, 57416, 57422, 57430, 57436, 57440, 57444, 57448, 57454, + 57460, 57464, 57466, 57470, 57476, 57478, 57482, 57486, 57490, 57496, + 57501, 57505, 57509, 57514, 57520, 57525, 57530, 57535, 57540, 57547, + 57554, 57559, 57564, 57569, 57574, 57579, 57584, 57588, 57592, 57599, + 57606, 57612, 57616, 57621, 57623, 57627, 57635, 57639, 57643, 57647, + 57651, 57657, 57663, 57667, 57673, 57677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57681, 57685, 57689, 57694, 57699, 57704, + 57708, 57712, 57716, 57721, 57726, 57730, 57734, 57738, 57742, 57747, + 57752, 57757, 57762, 57766, 57770, 57775, 57780, 57785, 57790, 57794, 0, + 57798, 57802, 57806, 57810, 57814, 57818, 57822, 57827, 57832, 57836, + 57841, 57846, 57855, 57859, 57863, 57867, 57874, 57878, 57883, 57888, + 57892, 57896, 57902, 57907, 57912, 57917, 57922, 57926, 57930, 57934, + 57938, 57942, 57947, 57952, 57956, 57960, 57965, 57970, 57975, 57979, + 57983, 57988, 57993, 57999, 58005, 58009, 58015, 58021, 58025, 58031, + 58037, 58042, 58047, 58051, 58057, 58061, 58065, 58071, 58077, 58082, + 58087, 58091, 58095, 58103, 58109, 58115, 58121, 58126, 58131, 58136, + 58142, 58146, 58152, 58156, 58160, 58166, 58172, 58178, 58184, 58190, + 58196, 58202, 58208, 58214, 58220, 58226, 58232, 58236, 58242, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58248, 58251, 58255, 58259, 58263, 58267, + 58270, 58273, 58277, 58281, 58285, 58289, 58292, 58297, 58301, 58305, + 58309, 58314, 58318, 58322, 58326, 58330, 58336, 58342, 58346, 58350, + 58354, 58358, 58362, 58366, 58370, 58374, 58378, 58382, 58386, 58392, + 58396, 58400, 58404, 58408, 58412, 58416, 58420, 58424, 58428, 58432, + 58436, 58440, 58444, 58448, 58452, 58456, 58462, 58468, 58473, 58478, + 58482, 58486, 58490, 58494, 58498, 58502, 58506, 58510, 58514, 58518, + 58522, 58526, 58530, 58534, 58538, 58542, 58546, 58550, 58554, 58558, + 58562, 58566, 58570, 58574, 58580, 58584, 58588, 58592, 58596, 58600, + 58604, 58608, 58612, 58617, 58624, 58628, 58632, 58636, 58640, 58644, + 58648, 58652, 58656, 58660, 58664, 58668, 58672, 58679, 58683, 58689, + 58693, 58697, 58701, 58705, 58709, 58712, 58716, 58720, 58724, 58728, + 58732, 58736, 58740, 58744, 58748, 58752, 58756, 58760, 58764, 58768, + 58772, 58776, 58780, 58784, 58788, 58792, 58796, 58800, 58804, 58808, + 58812, 58816, 58820, 58824, 58828, 58832, 58836, 58840, 58846, 58850, + 58854, 58858, 58862, 58866, 58870, 58874, 58878, 58882, 58886, 58890, + 58894, 58898, 58902, 58906, 58910, 58914, 58918, 58922, 58926, 58930, + 58934, 58938, 58942, 58946, 58950, 58954, 58962, 58966, 58970, 58974, + 58978, 58982, 58988, 58992, 58996, 59000, 59004, 59008, 59012, 59016, + 59020, 59024, 59028, 59032, 59036, 59040, 59046, 59050, 59054, 59058, + 59062, 59066, 59070, 59074, 59078, 59082, 59086, 59090, 59094, 59098, + 59102, 59106, 59110, 59114, 59118, 59122, 59126, 59130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59134, 59143, + 59151, 59163, 59174, 59182, 59191, 59200, 59210, 59222, 59234, 59246, 0, + 0, 0, 0, 59252, 59255, 59258, 59263, 59266, 59273, 59277, 59281, 59285, + 59289, 59293, 59298, 59303, 59307, 59311, 59316, 59321, 59326, 59331, + 59334, 59337, 59343, 59349, 59354, 59359, 59366, 59373, 59377, 59381, + 59385, 59393, 59399, 59406, 59411, 59416, 59421, 59426, 59431, 59436, + 59441, 59446, 59451, 59456, 59461, 59466, 59471, 59476, 59482, 59487, + 59491, 59497, 59508, 59518, 59533, 59543, 59547, 59557, 59563, 59569, + 59575, 59580, 59583, 59588, 59592, 0, 59598, 59602, 59605, 59609, 59612, + 59616, 59619, 59623, 59626, 59630, 59633, 59636, 59640, 59644, 59648, + 59652, 59656, 59660, 59664, 59668, 59672, 59675, 59679, 59683, 59687, + 59691, 59695, 59699, 59703, 59707, 59711, 59715, 59719, 59723, 59727, + 59732, 59736, 59740, 59744, 59748, 59751, 59755, 59758, 59762, 59766, + 59770, 59774, 59777, 59781, 59784, 59788, 59792, 59796, 59800, 59804, + 59808, 59812, 59816, 59820, 59824, 59828, 59832, 59835, 59839, 59843, + 59847, 59851, 59855, 59858, 59863, 59867, 59872, 59876, 59879, 59883, + 59887, 59891, 59895, 59900, 59904, 59908, 59912, 59916, 59920, 59924, + 59928, 0, 0, 59933, 59941, 59949, 59956, 59963, 59967, 59973, 59978, + 59983, 59987, 59990, 59994, 59997, 60001, 60004, 60008, 60011, 60015, + 60018, 60021, 60025, 60029, 60033, 60037, 60041, 60045, 60049, 60053, + 60057, 60060, 60064, 60068, 60072, 60076, 60080, 60084, 60088, 60092, + 60096, 60100, 60104, 60108, 60112, 60117, 60121, 60125, 60129, 60133, + 60136, 60140, 60143, 60147, 60151, 60155, 60159, 60162, 60166, 60169, + 60173, 60177, 60181, 60185, 60189, 60193, 60197, 60201, 60205, 60209, + 60213, 60217, 60220, 60224, 60228, 60232, 60236, 60240, 60243, 60248, + 60252, 60257, 60261, 60264, 60268, 60272, 60276, 60280, 60285, 60289, + 60293, 60297, 60301, 60305, 60309, 60313, 60318, 60322, 60326, 60330, + 60334, 60339, 60346, 60350, 60356, 0, 0, 0, 0, 0, 60361, 60366, 60371, + 60375, 60380, 60385, 60390, 60395, 60399, 60404, 60409, 60414, 60419, + 60424, 60429, 60434, 60439, 60444, 60448, 60453, 60458, 60463, 60467, + 60471, 60475, 60480, 60485, 60490, 60495, 60500, 60505, 60510, 60515, + 60520, 60525, 60529, 60533, 60538, 60543, 60548, 60553, 0, 0, 0, 60558, + 60562, 60566, 60570, 60574, 60578, 60582, 60586, 60590, 60594, 60598, + 60602, 60606, 60610, 60614, 60618, 60622, 60626, 60630, 60634, 60638, + 60642, 60646, 60650, 60654, 60658, 60662, 60666, 60670, 60674, 60678, + 60681, 60685, 60688, 60692, 60696, 60699, 60703, 60707, 60710, 60714, + 60718, 60722, 60726, 60729, 60733, 60737, 60741, 60745, 60749, 60753, + 60756, 60759, 60763, 60767, 60771, 60775, 60779, 60783, 60787, 60791, + 60795, 60799, 60803, 60807, 60811, 60815, 60819, 60823, 60827, 60831, + 60835, 60839, 60843, 60847, 60851, 60855, 60859, 60863, 60867, 60871, + 60875, 60879, 60883, 60887, 60891, 60895, 60899, 60903, 60907, 60911, + 60915, 60919, 60923, 0, 60927, 60933, 60939, 60944, 60949, 60954, 60960, + 60966, 60972, 60978, 60984, 60990, 60996, 61002, 61008, 61014, 61020, + 61025, 61030, 61035, 61040, 61045, 61050, 61055, 61060, 61065, 61070, + 61075, 61080, 61085, 61090, 61095, 61100, 61105, 61110, 61115, 61120, + 61126, 61132, 61138, 61144, 61149, 61154, 0, 0, 0, 0, 0, 61159, 61164, + 61169, 61174, 61179, 61184, 61189, 61194, 61199, 61204, 61209, 61214, + 61219, 61224, 61229, 61234, 61239, 61244, 61249, 61254, 61259, 61264, + 61269, 61274, 61279, 61284, 61289, 61294, 61299, 61304, 61309, 61314, + 61319, 61324, 61329, 61334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61339, + 61344, 61349, 61354, 61358, 61363, 61367, 61372, 61377, 61382, 61387, + 61392, 61396, 61401, 61406, 61411, 61416, 61420, 61424, 61428, 61432, + 61436, 61440, 61444, 61448, 61452, 61456, 61460, 61464, 61468, 61472, + 61477, 61482, 61487, 61492, 61497, 61502, 61507, 61512, 61517, 61522, + 61527, 61532, 61537, 61542, 61547, 61553, 0, 61560, 61563, 61566, 61569, + 61572, 61575, 61578, 61581, 61584, 61587, 61591, 61595, 61599, 61603, + 61607, 61611, 61615, 61619, 61623, 61627, 61631, 61635, 61639, 61643, + 61647, 61651, 61655, 61659, 61663, 61667, 61671, 61675, 61679, 61683, + 61687, 61691, 61695, 61699, 61703, 61707, 61711, 61720, 61729, 61738, + 61747, 61756, 61765, 61774, 61783, 61786, 61791, 61796, 61801, 61806, + 61811, 61816, 61821, 61826, 61831, 61835, 61840, 61845, 61850, 61855, + 61860, 61864, 61868, 61872, 61876, 61880, 61884, 61888, 61892, 61896, + 61900, 61904, 61908, 61912, 61916, 61921, 61926, 61931, 61936, 61941, + 61946, 61951, 61956, 61961, 61966, 61971, 61976, 61981, 61986, 61992, + 61998, 62003, 62008, 62011, 62014, 62017, 62020, 62023, 62026, 62029, + 62032, 62035, 62039, 62043, 62047, 62051, 62055, 62059, 62063, 62067, + 62071, 62075, 62079, 62083, 62087, 62091, 62095, 62099, 62103, 62107, + 62111, 62115, 62119, 62123, 62127, 62131, 62135, 62139, 62143, 62147, + 62151, 62155, 62159, 62163, 62167, 62171, 62175, 62179, 62183, 62187, + 62191, 62195, 62200, 62205, 62210, 62215, 62219, 62224, 62229, 62234, + 62239, 62244, 62249, 62254, 62259, 62264, 62268, 62275, 62282, 62289, + 62296, 62303, 62310, 62317, 62324, 62331, 62338, 62345, 62352, 62355, + 62358, 62361, 62366, 62369, 62372, 62375, 62378, 62381, 62384, 62388, + 62392, 62396, 62400, 62403, 62407, 62411, 62415, 62419, 62423, 62427, + 62431, 62435, 62438, 62441, 62445, 62449, 62453, 62457, 62460, 62464, + 62468, 62472, 62476, 62479, 62483, 62487, 62491, 62495, 62498, 62502, + 62506, 62509, 62513, 62517, 62521, 62525, 62529, 62533, 62537, 0, 62541, + 62544, 62547, 62550, 62553, 62556, 62559, 62562, 62565, 62568, 62571, + 62574, 62577, 62580, 62583, 62586, 62589, 62592, 62595, 62598, 62601, + 62604, 62607, 62610, 62613, 62616, 62619, 62622, 62625, 62628, 62631, + 62634, 62637, 62640, 62643, 62646, 62649, 62652, 62655, 62658, 62661, + 62664, 62667, 62670, 62673, 62676, 62679, 62682, 62685, 62688, 62691, + 62694, 62697, 62700, 62703, 62706, 62709, 62712, 62715, 62718, 62721, + 62724, 62727, 62730, 62733, 62736, 62739, 62742, 62745, 62748, 62751, + 62754, 62757, 62760, 62763, 62766, 62769, 62772, 62775, 62778, 62781, + 62784, 62787, 62790, 62793, 62796, 62799, 62802, 62805, 62814, 62822, + 62830, 62838, 62846, 62854, 62862, 62870, 62878, 62886, 62895, 62904, + 62913, 62922, 62931, 62940, 62949, 62958, 62967, 62976, 62985, 62994, + 63003, 63012, 63021, 63024, 63027, 63030, 63032, 63035, 63038, 63041, + 63046, 63051, 63054, 63061, 63068, 63075, 63082, 63085, 63090, 63092, + 63096, 63098, 63100, 63103, 63106, 63109, 63112, 63115, 63118, 63121, + 63126, 63131, 63134, 63137, 63140, 63143, 63146, 63149, 63152, 63156, + 63159, 63162, 63165, 63168, 63171, 63175, 63178, 63181, 63184, 63189, + 63194, 63199, 63204, 63209, 63214, 63219, 63224, 63230, 63238, 63240, + 63243, 63246, 63249, 63252, 63258, 63266, 63269, 63272, 63277, 63280, + 63283, 63286, 63291, 63294, 63297, 63302, 63305, 63308, 63313, 63316, + 63319, 63324, 63329, 63334, 63337, 63340, 63343, 63346, 63352, 63355, + 63358, 63361, 63363, 63366, 63369, 63372, 63377, 63380, 63383, 63386, + 63389, 63392, 63397, 63400, 63403, 63406, 63409, 63412, 63415, 63418, + 63421, 63424, 63429, 63433, 63441, 63449, 63457, 63465, 63473, 63481, + 63489, 63497, 63505, 63514, 63523, 63532, 63541, 63550, 63559, 63568, + 63577, 63586, 63595, 63604, 63613, 63622, 63631, 63640, 63649, 63658, + 63667, 63676, 63685, 63694, 63703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63706, 63715, 63724, 63735, 63742, 63747, 63752, 63759, 63766, + 63772, 63777, 63782, 63787, 63792, 63799, 63804, 63809, 63814, 63825, + 63830, 63835, 63842, 63847, 63854, 63859, 63864, 63871, 63878, 63885, + 63894, 63903, 63908, 63913, 63918, 63925, 63930, 63940, 63947, 63952, + 63957, 63962, 63967, 63972, 63977, 63986, 63993, 64000, 64005, 64012, + 64017, 64024, 64033, 64044, 64049, 64058, 64063, 64070, 64079, 64088, + 64093, 64098, 64105, 64111, 64118, 64125, 64129, 64133, 64136, 64140, + 64144, 64148, 64152, 64156, 64160, 64164, 64167, 64171, 64175, 64179, + 64183, 64187, 64191, 64194, 64198, 64202, 64205, 64209, 64213, 64217, + 64221, 64225, 64229, 64233, 64237, 64241, 64245, 64249, 64253, 64257, + 64261, 64265, 64269, 64273, 64277, 64281, 64285, 64289, 64293, 64297, + 64301, 64305, 64309, 64313, 64317, 64321, 64325, 64329, 64333, 64337, + 64341, 64345, 64349, 64353, 64357, 64361, 64365, 64369, 64373, 64377, + 64381, 64384, 64388, 64392, 64396, 64400, 64404, 64408, 64412, 64416, + 64420, 64424, 64428, 64432, 64436, 64440, 64444, 64448, 64452, 64456, + 64460, 64464, 64468, 64472, 64476, 64480, 64484, 64488, 64492, 64496, + 64500, 64504, 64508, 64512, 64516, 64520, 64524, 64528, 64532, 64536, + 64540, 64544, 64548, 64552, 64556, 64560, 64564, 64568, 64572, 64576, + 64580, 64584, 64588, 64592, 64596, 64600, 64604, 64608, 64612, 64616, + 64620, 64624, 64628, 64632, 64636, 64640, 64644, 64648, 64652, 64656, + 64660, 64664, 64668, 64672, 64676, 64680, 64684, 64688, 64692, 64696, + 64700, 64704, 64708, 64712, 64716, 64720, 64724, 64728, 64732, 64736, + 64740, 64744, 64748, 64752, 64756, 64760, 64764, 64768, 64772, 64776, + 64780, 64784, 64788, 64792, 64796, 64800, 64804, 64808, 64812, 64816, + 64820, 64824, 64828, 64832, 64836, 64840, 64844, 64848, 64852, 64855, + 64859, 64863, 64867, 64871, 64875, 64879, 64883, 64887, 64891, 64895, + 64899, 64903, 64907, 64911, 64915, 64919, 64923, 64927, 64931, 64935, + 64939, 64943, 64947, 64951, 64955, 64959, 64963, 64967, 64971, 64975, + 64979, 64983, 64987, 64991, 64995, 64999, 65003, 65007, 65011, 65015, + 65019, 65023, 65027, 65031, 65035, 65039, 65043, 65047, 65051, 65055, + 65059, 65063, 65067, 65071, 65075, 65079, 65083, 65087, 65091, 65095, + 65099, 65103, 65107, 65111, 65115, 65119, 65123, 65127, 65131, 65135, + 65139, 65143, 65147, 65151, 65155, 65159, 65163, 65167, 65171, 65175, + 65179, 65183, 65187, 65191, 65195, 65199, 65203, 65207, 65211, 65215, + 65219, 65223, 65227, 65231, 65235, 65239, 65243, 65247, 65251, 65255, + 65259, 65263, 65267, 65271, 65275, 65279, 65283, 65287, 65291, 65295, + 65299, 65303, 65307, 65311, 65315, 65318, 65322, 65326, 65330, 65334, + 65338, 65342, 65346, 65350, 65354, 65358, 65362, 65366, 65370, 65374, + 65378, 65382, 65386, 65390, 65394, 65398, 65402, 65406, 65410, 65414, + 65418, 65422, 65426, 65430, 65434, 65438, 65442, 65446, 65450, 65454, + 65458, 65462, 65466, 65470, 65474, 65478, 65482, 65486, 65490, 65494, + 65498, 65502, 65506, 65510, 65514, 65518, 65522, 65526, 65530, 65534, + 65538, 65542, 65546, 65550, 65554, 65558, 65562, 65566, 65570, 65574, + 65578, 65582, 65586, 65590, 65594, 65598, 65602, 65606, 65610, 65614, + 65618, 65622, 65626, 65630, 65634, 65638, 65642, 65646, 65650, 65654, + 65658, 65662, 65666, 65670, 65674, 65677, 65681, 65685, 65689, 65693, + 65697, 65701, 65705, 65709, 65713, 65717, 65721, 65725, 65729, 65733, + 65737, 65741, 65745, 65749, 65753, 65757, 65761, 65765, 65769, 65773, + 65777, 65781, 65785, 65789, 65793, 65797, 65801, 65805, 65809, 65813, + 65817, 65821, 65825, 65829, 65833, 65837, 65841, 65845, 65849, 65853, + 65857, 65861, 65865, 65869, 65873, 65877, 65881, 65885, 65889, 65893, + 65897, 65901, 65905, 65909, 65913, 65917, 65921, 65925, 65929, 65933, + 65937, 65941, 65945, 65949, 65953, 65957, 65961, 65965, 65969, 65973, + 65977, 65981, 65985, 65989, 65993, 65997, 66001, 66005, 66009, 66013, + 66017, 66021, 66025, 66029, 66033, 66037, 66041, 66045, 66049, 66053, + 66057, 66061, 66065, 66069, 66073, 66077, 66081, 66085, 66089, 66093, + 66097, 66101, 66105, 66109, 66113, 66117, 66121, 66125, 66129, 66133, + 66137, 66141, 66145, 66149, 66153, 66157, 66161, 66165, 66169, 66172, + 66176, 66180, 66184, 66188, 66192, 66196, 66200, 66204, 66208, 66212, + 66216, 66220, 66224, 66228, 66232, 66236, 66240, 66244, 66248, 66252, + 66256, 66260, 66264, 66268, 66272, 66276, 66280, 66284, 66288, 66292, + 66296, 66300, 66304, 66308, 66312, 66316, 66320, 66324, 66328, 66332, + 66336, 66340, 66344, 66348, 66352, 66356, 66360, 66364, 66368, 66372, + 66376, 66380, 66384, 66388, 66392, 66396, 66400, 66404, 66408, 66412, + 66416, 66420, 66424, 66428, 66432, 66436, 66440, 66444, 66448, 66452, + 66456, 66460, 66464, 66468, 66472, 66476, 66480, 66484, 66488, 66492, + 66496, 66500, 66504, 66508, 66512, 66516, 66520, 66524, 66528, 66532, + 66536, 66540, 66544, 66548, 66552, 66556, 66560, 66564, 66568, 66572, + 66576, 66580, 66584, 66588, 66592, 66596, 66600, 66604, 66608, 66612, + 66616, 66620, 66624, 66627, 66631, 66635, 66639, 66643, 66647, 66651, + 66655, 66659, 66663, 66667, 66671, 66675, 66679, 66683, 66687, 66691, + 66695, 66699, 66703, 66707, 66711, 66715, 66719, 66723, 66727, 66731, + 66735, 66739, 66743, 66747, 66751, 66755, 66759, 66763, 66767, 66771, + 66775, 66779, 66783, 66787, 66791, 66795, 66799, 66803, 66807, 66811, + 66815, 66819, 66823, 66827, 66831, 66835, 66839, 66843, 66847, 66851, + 66855, 66859, 66863, 66867, 66871, 66875, 66879, 66883, 66887, 66891, + 66895, 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 66931, + 66935, 66939, 66943, 66947, 66951, 66955, 66959, 66963, 66967, 66971, + 66975, 66979, 66983, 66987, 66991, 66995, 66999, 67003, 67007, 67011, + 67015, 67019, 67023, 67027, 67031, 67035, 67039, 67043, 67047, 67051, + 67055, 67059, 67063, 67067, 67071, 67075, 67079, 67083, 67087, 67091, + 67095, 67099, 67103, 67107, 67111, 67115, 67119, 67123, 67127, 67131, + 67135, 67139, 67143, 67147, 67151, 67155, 67159, 67163, 67167, 67171, + 67175, 67179, 67183, 67187, 67191, 67195, 67199, 67203, 67207, 67211, + 67215, 67219, 67223, 67227, 67230, 67234, 67238, 67242, 67246, 67250, + 67254, 67258, 67261, 67265, 67269, 67273, 67277, 67281, 67285, 67289, + 67293, 67297, 67301, 67305, 67309, 67313, 67317, 67321, 67325, 67329, + 67333, 67337, 67341, 67345, 67349, 67353, 67357, 67361, 67365, 67369, + 67373, 67377, 67381, 67385, 67389, 67393, 67397, 67401, 67405, 67409, + 67413, 67417, 67421, 67425, 67429, 67433, 67437, 67441, 67445, 67449, + 67453, 67457, 67461, 67465, 67469, 67473, 67477, 67481, 67485, 67489, + 67493, 67497, 67501, 67505, 67509, 67513, 67517, 67521, 67525, 67529, + 67533, 67537, 67541, 67545, 67549, 67553, 67557, 67561, 67565, 67569, + 67573, 67577, 67581, 67585, 67589, 67593, 67597, 67601, 67605, 67609, + 67613, 67617, 67621, 67625, 67629, 67633, 67637, 67641, 67645, 67649, + 67653, 67657, 67661, 67665, 67669, 67673, 67677, 67681, 67685, 67689, + 67693, 67697, 67701, 67705, 67709, 67713, 67717, 67721, 67725, 67729, + 67733, 67737, 67741, 67745, 67749, 67753, 67757, 67761, 67765, 67769, + 67773, 67777, 67781, 67785, 67789, 67793, 67797, 67801, 67805, 67809, + 67813, 67817, 67821, 67825, 67829, 67833, 67837, 67841, 67845, 67849, + 67853, 67857, 67861, 67865, 67869, 67873, 67877, 67881, 67885, 67889, + 67893, 67897, 67901, 67905, 67909, 67913, 67917, 67921, 67925, 67929, + 67933, 67937, 67941, 67945, 67949, 67953, 67957, 67961, 67965, 67969, + 67973, 67977, 67981, 67985, 67988, 67992, 67996, 68000, 68004, 68008, + 68012, 68016, 68020, 68024, 68028, 68032, 68036, 68040, 68044, 68048, + 68052, 68056, 68060, 68064, 68068, 68072, 68076, 68080, 68084, 68088, + 68092, 68096, 68100, 68104, 68108, 68112, 68116, 68120, 68124, 68128, + 68132, 68136, 68140, 68144, 68148, 68152, 68156, 68160, 68164, 68168, + 68172, 68176, 68180, 68184, 68188, 68192, 68196, 68200, 68204, 68208, + 68212, 68216, 68220, 68224, 68228, 68232, 68236, 68240, 68244, 68248, + 68252, 68256, 68260, 68264, 68268, 68272, 68276, 68280, 68284, 68288, + 68292, 68296, 68300, 68304, 68308, 68312, 68316, 68320, 68324, 68328, + 68332, 68336, 68340, 68344, 68348, 68352, 68356, 68360, 68364, 68368, + 68372, 68376, 68380, 68384, 68388, 68392, 68396, 68400, 68404, 68408, + 68412, 68416, 68420, 68424, 68428, 68432, 68436, 68440, 68444, 68448, + 68452, 68456, 68460, 68464, 68468, 68472, 68476, 68480, 68484, 68488, + 68492, 68496, 68500, 68504, 68508, 68512, 68516, 68520, 68524, 68528, + 68532, 68536, 68540, 68544, 68548, 68552, 68556, 68560, 68564, 68568, + 68572, 68576, 68580, 68584, 68588, 68592, 68596, 68600, 68604, 68608, + 68612, 68616, 68620, 68624, 68628, 68632, 68636, 68640, 68644, 68648, + 68652, 68656, 68660, 68664, 68668, 68672, 68676, 68680, 68684, 68688, + 68692, 68696, 68700, 68704, 68708, 68712, 68716, 68720, 68724, 68728, + 68732, 68736, 68740, 68744, 68748, 68752, 68756, 68760, 68764, 68768, 0, + 0, 0, 68772, 68776, 68780, 68784, 68788, 68792, 68796, 68800, 68804, + 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836, 68840, 68844, + 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, 68884, + 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, 68924, + 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, 68964, + 68968, 68972, 68976, 68980, 68984, 68988, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68992, 68997, 69001, 69006, 69011, 69016, 69021, 69026, 69030, 69035, + 69040, 69045, 69050, 69055, 69060, 69065, 69069, 69073, 69078, 69082, + 69087, 69092, 69097, 69101, 69106, 69111, 69116, 69121, 69126, 69130, + 69135, 69139, 69144, 69148, 69153, 69157, 69161, 69165, 69170, 69175, + 69180, 69188, 69196, 69204, 69212, 69219, 69227, 69233, 69241, 69245, + 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277, 69281, 69285, + 69289, 69293, 69297, 69301, 69305, 69309, 69313, 69317, 69321, 69325, + 69329, 69333, 69337, 69341, 69345, 69349, 69353, 69357, 69361, 69365, + 69369, 69373, 69377, 69381, 69385, 69388, 69392, 69396, 69400, 69404, + 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, 69440, 69444, + 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476, 69480, 69484, + 69488, 69492, 69496, 69500, 69504, 69508, 69512, 69516, 69520, 69524, + 69528, 69532, 69535, 69539, 69543, 69546, 69550, 69554, 69558, 69561, + 69565, 69569, 69573, 69577, 69581, 69585, 69589, 69593, 69597, 69601, + 69605, 69609, 69613, 69617, 69620, 69624, 69628, 69631, 69635, 69639, + 69643, 69647, 69651, 69655, 69658, 69661, 69665, 69669, 69673, 69676, + 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707, 69711, 69715, + 69719, 69723, 69727, 69731, 69735, 69739, 69743, 69747, 69751, 69755, + 69759, 69763, 69767, 69771, 69775, 69779, 69783, 69787, 69791, 69795, + 69799, 69803, 69807, 69811, 69815, 69819, 69823, 69827, 69830, 69834, + 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866, 69870, 69874, + 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906, 69910, 69914, + 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946, 69950, 69954, + 69958, 69962, 69966, 69970, 69974, 69977, 69981, 69985, 69989, 69993, + 69997, 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, + 70037, 70041, 70044, 70048, 70052, 70056, 70060, 70064, 70068, 70072, + 70076, 70080, 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, + 70116, 70120, 70124, 70128, 70131, 70135, 70139, 70143, 70147, 70151, + 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183, 70187, 70191, + 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223, 70227, 70231, + 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263, 70267, 70271, + 70275, 70279, 70283, 70287, 70291, 70295, 70299, 70303, 70306, 70311, + 70315, 70321, 70326, 70332, 70336, 70340, 70344, 70348, 70352, 70356, + 70360, 70364, 70368, 70372, 70376, 70380, 70384, 70388, 70391, 70394, + 70397, 70400, 70403, 70406, 70409, 70412, 70415, 70420, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70426, 70431, 70436, 70441, + 70446, 70453, 70460, 70465, 70470, 70475, 70480, 70487, 70494, 70501, + 70508, 70515, 70522, 70532, 70542, 70549, 70556, 70563, 70570, 70576, + 70582, 70591, 70600, 70607, 70614, 70625, 70636, 70641, 70646, 70653, + 70660, 70667, 70674, 70681, 70688, 70695, 70702, 70708, 70714, 70720, + 70726, 70733, 70740, 70745, 70749, 70756, 70763, 70770, 70774, 70781, + 70785, 70790, 70794, 70800, 70805, 70811, 70816, 70820, 70824, 70827, + 70830, 70835, 70840, 70845, 70850, 70855, 70860, 70865, 70870, 70875, + 70880, 70889, 70898, 70903, 70908, 70913, 70918, 70923, 70928, 70933, + 70938, 70943, 70948, 70953, 0, 0, 0, 0, 0, 0, 0, 70958, 70964, 70967, + 70970, 70973, 70977, 70981, 70985, 70989, 70992, 70996, 70999, 71003, + 71006, 71010, 71014, 71018, 71022, 71026, 71030, 71034, 71037, 71041, + 71045, 71049, 71053, 71057, 71061, 71065, 71069, 71073, 71077, 71081, + 71085, 71089, 71093, 71096, 71100, 71104, 71108, 71112, 71116, 71120, + 71124, 71128, 71132, 71136, 71140, 71144, 71148, 71152, 71156, 71160, + 71164, 71168, 71172, 71176, 71180, 71184, 71188, 71192, 71195, 71199, + 71203, 71207, 71211, 71215, 71219, 71223, 71226, 71230, 71234, 71238, + 71242, 71246, 71250, 71254, 71258, 71262, 71266, 71270, 71274, 71279, + 71284, 71287, 71292, 71295, 71298, 71301, 0, 0, 0, 0, 0, 0, 0, 0, 71305, + 71314, 71323, 71332, 71341, 71350, 71359, 71368, 71377, 71385, 71392, + 71400, 71407, 71415, 71425, 71434, 71444, 71453, 71463, 71471, 71478, + 71486, 71493, 71501, 71506, 71511, 71516, 71525, 71531, 71537, 71544, + 71553, 71561, 71569, 71577, 71584, 71591, 71598, 71605, 71610, 71615, + 71620, 71625, 71630, 71635, 71640, 71645, 71653, 71661, 71667, 71673, + 71678, 71683, 71688, 71693, 71698, 71703, 71708, 71713, 71721, 71729, + 71734, 71739, 71749, 71759, 71766, 71773, 71782, 71791, 71803, 71815, + 71821, 71827, 71835, 71843, 71853, 71863, 71870, 71877, 71882, 71887, + 71899, 71911, 71919, 71927, 71937, 71947, 71959, 71971, 71980, 71989, + 71996, 72003, 72010, 72017, 72026, 72035, 72040, 72045, 72052, 72059, + 72066, 72073, 72085, 72097, 72102, 72107, 72112, 72117, 72122, 72127, + 72132, 72137, 72141, 72146, 72151, 72156, 72161, 72166, 72172, 72177, + 72182, 72189, 72196, 72203, 72210, 72217, 72226, 72235, 72241, 72247, + 72253, 72259, 72266, 72273, 72280, 72287, 72294, 72298, 72305, 72310, + 72315, 72322, 0, 72335, 72343, 72351, 72358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 72365, 72374, 72383, 72392, 72401, 72410, 72419, 72428, 72437, + 72446, 72455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 72462, 72469, 72475, 72482, 72490, 72498, + 72505, 72513, 72520, 72526, 72532, 72539, 72545, 72551, 72557, 72564, + 72571, 72578, 72585, 72592, 72599, 72606, 72613, 72620, 72627, 72634, + 72641, 72648, 72655, 72661, 72668, 72675, 72682, 72689, 72696, 72703, + 72710, 72717, 72724, 72731, 72738, 72745, 72752, 72759, 72766, 72773, + 72780, 72787, 72795, 72803, 72811, 72819, 0, 0, 0, 0, 72827, 72836, + 72845, 72854, 72863, 72872, 72881, 72888, 72895, 72902, 0, 0, 0, 0, 0, 0, + 72909, 72913, 72918, 72923, 72928, 72933, 72938, 72943, 72948, 72953, + 72958, 72963, 72967, 72971, 72976, 72981, 72985, 72990, 72995, 73000, + 73005, 73010, 73015, 73020, 73024, 73028, 73033, 73038, 73042, 73046, + 73050, 73054, 73058, 73062, 73066, 73071, 73076, 73081, 73086, 73091, + 73098, 73104, 73109, 73114, 73119, 73124, 73130, 73137, 73143, 73150, + 73156, 73162, 73167, 73174, 73180, 73185, 0, 0, 0, 0, 0, 0, 0, 0, 73191, + 73195, 73199, 73202, 73206, 73209, 73213, 73216, 73220, 73224, 73229, + 73233, 73238, 73241, 73245, 73249, 73252, 73256, 73260, 73263, 73267, + 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299, 73303, 73307, + 73311, 73315, 73319, 73323, 73327, 73331, 73335, 73338, 73341, 73345, + 73349, 73353, 73356, 73359, 73362, 73366, 73370, 73374, 73378, 73381, + 73384, 73388, 73393, 73398, 73402, 73407, 73411, 73416, 73421, 73427, + 73432, 73438, 73442, 73447, 73452, 73456, 73461, 73466, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 73470, 73473, 73477, 73481, 73484, 73487, 73490, 73493, 73496, + 73499, 73502, 73505, 0, 0, 0, 0, 0, 0, 73508, 73513, 73517, 73521, 73525, + 73529, 73533, 73537, 73541, 73545, 73549, 73553, 73557, 73561, 73565, + 73569, 73573, 73578, 73583, 73589, 73595, 73602, 73607, 73612, 73618, + 73622, 73627, 73630, 0, 0, 0, 0, 73633, 73640, 73646, 73652, 73658, + 73664, 73670, 73676, 73682, 73688, 73694, 73700, 73707, 73714, 73721, + 73727, 73734, 73741, 73748, 73755, 73762, 73768, 73774, 73781, 73787, + 73794, 73801, 73807, 73813, 73820, 73827, 73834, 73840, 73847, 73854, + 73860, 73867, 73873, 73880, 73887, 73893, 73899, 73906, 73912, 73919, + 73926, 73935, 73942, 73949, 73953, 73958, 73963, 73968, 73973, 73977, + 73981, 73986, 73990, 73995, 74000, 74005, 74009, 74013, 74018, 74022, + 74027, 74031, 74036, 74041, 74046, 74051, 74055, 74060, 74065, 74070, + 74076, 74081, 74087, 74093, 74099, 74105, 74111, 74116, 74122, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74126, 74131, 74135, 74139, 74143, 74147, 74151, + 74155, 74159, 74163, 74167, 74171, 74175, 74179, 74183, 74187, 74191, + 74195, 74199, 74203, 74207, 74211, 74215, 74219, 74223, 74227, 74231, + 74235, 74239, 74243, 0, 0, 0, 74247, 74251, 74255, 74259, 74263, 74266, + 74272, 74275, 74279, 74282, 74288, 74294, 74302, 74305, 74309, 74312, + 74315, 74321, 74327, 74331, 74337, 74341, 74345, 74351, 74355, 74361, + 74367, 74371, 74375, 74381, 74385, 74391, 74397, 74401, 74407, 74411, + 74417, 74420, 74423, 74429, 74433, 74439, 74442, 74445, 74448, 74454, + 74458, 74462, 74468, 74474, 74477, 74480, 74486, 74491, 74496, 74501, + 74508, 74513, 74520, 74525, 74532, 74537, 74542, 74547, 74552, 74555, + 74559, 74563, 74568, 74573, 74578, 74583, 74588, 74593, 74598, 74603, + 74610, 74615, 0, 74622, 74625, 74629, 74632, 74635, 74638, 74641, 74644, + 74647, 74650, 74653, 0, 0, 0, 0, 74656, 74663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 75537, 75542, 75547, 75552, 75559, 75566, 75570, 75574, 75579, 75584, - 75589, 75594, 75599, 75604, 75609, 75614, 75619, 75625, 75631, 75637, - 75643, 75649, 75653, 75659, 75663, 75669, 75676, 75682, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 75686, 75690, 75694, 75698, 75702, 75706, 0, 0, 75710, 75714, - 75718, 75722, 75726, 75730, 0, 0, 75734, 75738, 75742, 75746, 75750, - 75754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75758, 75762, 75766, 75770, 75774, - 75778, 75782, 0, 75786, 75790, 75794, 75798, 75802, 75806, 75810, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74668, 74671, 74674, 74677, 74680, 74684, 74687, 74690, 74694, 74698, + 74702, 74706, 74710, 74714, 74718, 74722, 74726, 74730, 74734, 74738, + 74742, 74746, 74750, 74754, 74758, 74761, 74765, 74768, 74772, 74776, + 74780, 74784, 74788, 74791, 74795, 74798, 74801, 74805, 74809, 74813, + 74816, 74819, 74824, 74828, 74833, 74838, 74842, 74847, 74851, 74856, + 74861, 74866, 74870, 74874, 74879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74884, + 74889, 74894, 74899, 74905, 74910, 74915, 74920, 74925, 74930, 74934, + 74938, 74943, 74948, 0, 0, 74954, 74958, 74961, 74964, 74967, 74970, + 74973, 74976, 74979, 74982, 0, 0, 74985, 74990, 74995, 75001, 75008, + 75014, 75020, 75026, 75032, 75038, 75044, 75050, 75056, 75062, 75068, + 75074, 75079, 75084, 75089, 75095, 75101, 75108, 75114, 75120, 75125, + 75132, 75139, 75146, 75152, 75157, 75162, 75167, 0, 0, 0, 0, 75175, + 75181, 75187, 75193, 75199, 75205, 75211, 75217, 75223, 75229, 75235, + 75241, 75247, 75253, 75259, 75265, 75271, 75277, 75283, 75289, 75295, + 75300, 75305, 75311, 75317, 75323, 75329, 75335, 75341, 75347, 75353, + 75359, 75365, 75371, 75377, 75383, 75389, 75395, 75401, 75407, 75413, + 75419, 75425, 75431, 75437, 75443, 75449, 75454, 75459, 75465, 75470, + 75474, 75479, 75483, 75487, 75491, 75497, 75502, 75507, 75512, 75517, + 75522, 75527, 75532, 75539, 75546, 75553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75560, 75565, 75570, 75575, + 75582, 75589, 75593, 75597, 75602, 75607, 75612, 75617, 75622, 75627, + 75632, 75637, 75642, 75648, 75654, 75660, 75666, 75672, 75676, 75682, + 75686, 75692, 75699, 75705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75709, 75713, + 75717, 75721, 75725, 75729, 0, 0, 75733, 75737, 75741, 75745, 75749, + 75753, 0, 0, 75757, 75761, 75765, 75769, 75773, 75777, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 75781, 75785, 75789, 75793, 75797, 75801, 75805, 0, 75809, + 75813, 75817, 75821, 75825, 75829, 75833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75837, 75842, 75847, 75852, + 75857, 75861, 75865, 75870, 75875, 75880, 75885, 75890, 75895, 75900, + 75905, 75910, 75914, 75919, 75924, 75929, 75934, 75939, 75944, 75949, + 75954, 75959, 75964, 75969, 75976, 75983, 75990, 75997, 76004, 76011, + 76018, 76025, 76031, 76037, 76043, 76049, 76055, 76061, 76067, 76073, + 76077, 76083, 0, 0, 76089, 76094, 76098, 76102, 76106, 76110, 76114, + 76118, 76122, 76126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76130, 76134, 76138, 76142, 76146, + 76150, 76154, 76158, 76162, 76166, 76170, 76174, 76178, 76182, 76186, + 76190, 76194, 76198, 76202, 76206, 76210, 76214, 76218, 0, 0, 0, 0, + 76222, 76226, 76230, 76234, 76238, 76242, 76246, 76250, 76254, 76258, + 76262, 76266, 76270, 76274, 76278, 76282, 76286, 76290, 76294, 76298, + 76302, 76306, 76310, 76314, 76318, 76322, 76326, 76330, 76334, 76338, + 76342, 76346, 76350, 76354, 76358, 76362, 76366, 76370, 76374, 76378, + 76382, 76386, 76390, 76394, 76398, 76402, 76406, 76410, 76414, 0, 0, 0, + 0, 76418, 76422, 76426, 76430, 76434, 76438, 76442, 76446, 76450, 76454, + 76458, 76462, 76466, 76470, 76474, 76478, 76482, 76486, 76490, 76494, + 76498, 76502, 76506, 76510, 76514, 76518, 76522, 76526, 76530, 76534, + 76538, 76542, 76546, 76550, 76554, 76558, 76562, 76566, 76570, 76574, + 76578, 76582, 76586, 76590, 76594, 76598, 76602, 76606, 76610, 76614, + 76618, 76622, 76626, 76630, 76634, 76638, 76642, 76646, 76650, 76654, + 76658, 76662, 76666, 76670, 76674, 76678, 76682, 76686, 76690, 76694, + 76698, 76702, 76706, 76710, 76714, 76718, 76722, 76726, 76730, 76734, + 76738, 76742, 76746, 76750, 76754, 76758, 76762, 76766, 76770, 76774, + 76778, 76782, 76786, 76790, 76794, 76798, 76802, 76806, 76810, 76814, + 76818, 76822, 76826, 76830, 76834, 76838, 76842, 76846, 76850, 76854, + 76858, 76862, 76866, 76870, 76874, 76878, 76882, 76886, 76890, 76894, + 76898, 76902, 76906, 76910, 76914, 76918, 76922, 76926, 76930, 76934, + 76938, 76942, 76946, 76950, 76954, 76958, 76962, 76966, 76970, 76974, + 76978, 76982, 76986, 76990, 76994, 76998, 77002, 77006, 77010, 77014, + 77018, 77022, 77026, 77030, 77034, 77038, 77042, 77046, 77050, 77054, + 77058, 77062, 77066, 77070, 77074, 77078, 77082, 77086, 77090, 77094, + 77098, 77102, 77106, 77110, 77114, 77118, 77122, 77126, 77130, 77134, + 77138, 77142, 77146, 77150, 77154, 77158, 77162, 77166, 77170, 77174, + 77178, 77182, 77186, 77190, 77194, 77198, 77202, 77206, 77210, 77214, + 77218, 77222, 77226, 77230, 77234, 77238, 77242, 77246, 77250, 77254, + 77258, 77262, 77266, 77270, 77274, 77278, 77282, 77286, 77290, 77294, + 77298, 77302, 77306, 77310, 77314, 77318, 77322, 77326, 77330, 77334, + 77338, 77342, 77346, 77350, 77354, 77358, 77362, 77366, 77370, 77374, + 77378, 77382, 77386, 77390, 77394, 77398, 77402, 77406, 77410, 77414, + 77418, 77422, 77426, 77430, 77434, 77438, 77442, 77446, 77450, 77454, + 77458, 77462, 77466, 77470, 77474, 77478, 77482, 77486, 77490, 77494, + 77498, 77502, 77506, 77510, 77514, 77518, 77522, 77526, 77530, 77534, + 77538, 77542, 77546, 77550, 77554, 77558, 77562, 77566, 77570, 77574, + 77578, 77582, 77586, 77590, 77594, 77598, 77602, 77606, 77610, 77614, + 77618, 77622, 77626, 77630, 77634, 77638, 77642, 77646, 77650, 77654, + 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686, 77690, 77694, + 77698, 77702, 77706, 77710, 77714, 77718, 77722, 77726, 77730, 77734, + 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77766, 77770, 77774, + 77778, 77782, 77786, 77790, 77794, 77798, 77802, 77806, 77810, 77814, + 77818, 77822, 77826, 77830, 77834, 77838, 77842, 77846, 77850, 77854, + 77858, 77862, 77866, 77870, 77874, 77878, 0, 0, 77882, 77886, 77890, + 77894, 77898, 77902, 77906, 77910, 77914, 77918, 77922, 77926, 77930, + 77934, 77938, 77942, 77946, 77950, 77954, 77958, 77962, 77966, 77970, + 77974, 77978, 77982, 77986, 77990, 77994, 77998, 78002, 78006, 78010, + 78014, 78018, 78022, 78026, 78030, 78034, 78038, 78042, 78046, 78050, + 78054, 78058, 78062, 78066, 78070, 78074, 78078, 78082, 78086, 78090, + 78094, 78098, 78102, 78106, 78110, 78114, 78118, 78122, 78126, 78130, + 78134, 78138, 78142, 78146, 78150, 78154, 78158, 78162, 78166, 78170, + 78174, 78178, 78182, 78186, 78190, 78194, 78198, 78202, 78206, 78210, + 78214, 78218, 78222, 78226, 78230, 78234, 78238, 78242, 78246, 78250, + 78254, 78258, 78262, 78266, 78270, 78274, 78278, 78282, 78286, 78290, + 78294, 78298, 78302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78306, + 78311, 78316, 78321, 78326, 78331, 78339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 78344, 78351, 78358, 78365, 78372, 0, 0, 0, 0, 0, 78379, 78386, + 78393, 78403, 78409, 78415, 78421, 78427, 78433, 78439, 78446, 78452, + 78458, 78464, 78473, 78482, 78494, 78506, 78512, 78518, 78524, 78531, + 78538, 78545, 78552, 78559, 0, 78566, 78573, 78580, 78588, 78595, 0, + 78602, 0, 78609, 78616, 0, 78623, 78631, 0, 78638, 78645, 78652, 78659, + 78666, 78673, 78680, 78687, 78694, 78701, 78706, 78713, 78720, 78726, + 78732, 78738, 78744, 78750, 78756, 78762, 78768, 78774, 78780, 78786, + 78792, 78798, 78804, 78810, 78816, 78822, 78828, 78834, 78840, 78846, + 78852, 78858, 78864, 78870, 78876, 78882, 78888, 78894, 78900, 78906, + 78912, 78918, 78924, 78930, 78936, 78942, 78948, 78954, 78960, 78966, + 78972, 78978, 78984, 78990, 78996, 79002, 79008, 79014, 79020, 79026, + 79032, 79038, 79044, 79050, 79056, 79062, 79068, 79074, 79080, 79086, + 79092, 79098, 79104, 79110, 79116, 79122, 79128, 79134, 79140, 79146, + 79152, 79158, 79164, 79170, 79176, 79184, 79192, 79198, 79204, 79210, + 79216, 79225, 79234, 79242, 79250, 79258, 79266, 79274, 79282, 79290, + 79298, 79305, 79312, 79322, 79332, 79336, 79340, 79345, 79350, 79355, + 79360, 79369, 79378, 79384, 79390, 79397, 79404, 79411, 79415, 79421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79427, 79433, 79439, + 79445, 79451, 79456, 79461, 79467, 79473, 79479, 79485, 79493, 79499, + 79505, 79513, 79521, 79529, 79537, 79542, 79547, 79552, 79557, 79570, + 79583, 79593, 79603, 79614, 79625, 79636, 79647, 79657, 79667, 79678, + 79689, 79700, 79711, 79721, 79731, 79741, 79757, 79773, 79789, 79796, + 79803, 79810, 79817, 79827, 79837, 79847, 79859, 79869, 79877, 79885, + 79894, 79902, 79912, 79920, 79928, 79936, 79945, 79953, 79963, 79971, + 79979, 79987, 79997, 80005, 80012, 80019, 80026, 80033, 80041, 80049, + 80057, 80065, 80073, 80082, 80090, 80098, 80106, 80114, 80122, 80131, + 80139, 80147, 80155, 80163, 80171, 80179, 80187, 80195, 80203, 80211, + 80220, 80228, 80238, 80246, 80254, 80262, 80272, 80280, 80288, 80296, + 80304, 80313, 80322, 80330, 80340, 80348, 80356, 80364, 80373, 80381, + 80391, 80399, 80406, 80413, 80421, 80428, 80437, 80444, 80452, 80460, + 80469, 80477, 80487, 80495, 80503, 80511, 80521, 80529, 80536, 80543, + 80551, 80558, 80567, 80574, 80584, 80594, 80605, 80614, 80623, 80632, + 80641, 80650, 80660, 80671, 80682, 80692, 80703, 80715, 80725, 80734, + 80743, 80751, 80760, 80770, 80778, 80787, 80796, 80804, 80813, 80823, + 80831, 80840, 80849, 80857, 80866, 80876, 80884, 80894, 80902, 80912, + 80920, 80928, 80937, 80945, 80955, 80963, 80971, 80981, 80989, 80996, + 81003, 81012, 81021, 81029, 81038, 81048, 81056, 81067, 81075, 81083, + 81090, 81098, 81107, 81114, 81124, 81134, 81145, 81155, 81166, 81174, + 81182, 81191, 81199, 81208, 81216, 81224, 81233, 81241, 81250, 81258, + 81265, 81272, 81279, 81286, 81294, 81302, 81310, 81318, 81327, 81335, + 81343, 81352, 81360, 81368, 81376, 81385, 81393, 81401, 81409, 81417, + 81425, 81433, 81441, 81449, 81457, 81466, 81474, 81482, 81490, 81498, + 81506, 81515, 81524, 81532, 81540, 81548, 81557, 81565, 81574, 81581, + 81588, 81596, 81603, 81611, 81619, 81628, 81636, 81645, 81653, 81661, + 81671, 81678, 81685, 81693, 81700, 81708, 81718, 81729, 81737, 81746, + 81754, 81763, 81771, 81780, 81788, 81797, 81805, 81814, 81823, 81831, + 81839, 81847, 81856, 81863, 81871, 81880, 81889, 81898, 81908, 81916, + 81926, 81934, 81944, 81952, 81962, 81970, 81980, 81988, 81997, 82004, + 82013, 82020, 82030, 82038, 82048, 82056, 82066, 82074, 82082, 82090, + 82099, 82107, 82116, 82125, 82134, 82143, 82153, 82161, 82171, 82179, + 82189, 82197, 82207, 82215, 82225, 82233, 82242, 82249, 82258, 82265, + 82275, 82283, 82293, 82301, 82311, 82319, 82327, 82335, 82344, 82352, + 82361, 82370, 82379, 82388, 82396, 82404, 82413, 82421, 82430, 82439, + 82447, 82455, 82463, 82472, 82480, 82488, 82497, 82505, 82513, 82521, + 82529, 82534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82539, + 82549, 82559, 82569, 82579, 82590, 82600, 82610, 82621, 82630, 82639, + 82648, 82659, 82669, 82679, 82691, 82701, 82711, 82721, 82731, 82741, + 82751, 82761, 82771, 82781, 82791, 82801, 82812, 82823, 82833, 82843, + 82855, 82866, 82877, 82887, 82897, 82907, 82917, 82927, 82937, 82947, + 82959, 82969, 82979, 82991, 83002, 83013, 83023, 83033, 83043, 83053, + 83065, 83075, 83085, 83096, 83107, 83117, 83127, 83136, 83145, 83154, + 83163, 83172, 83182, 0, 0, 83192, 83202, 83212, 83222, 83232, 83244, + 83254, 83264, 83276, 83286, 83298, 83307, 83316, 83327, 83337, 83349, + 83360, 83373, 83383, 83395, 83404, 83415, 83426, 83439, 83449, 83459, + 83469, 83479, 83489, 83498, 83507, 83516, 83525, 83535, 83545, 83555, + 83565, 83575, 83585, 83595, 83605, 83615, 83625, 83635, 83645, 83654, + 83663, 83672, 83682, 83692, 83702, 83712, 83722, 83733, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83743, 83758, 83773, 83779, 83785, 83791, + 83797, 83803, 83809, 83815, 83821, 83829, 83833, 83836, 0, 0, 83844, + 83847, 83850, 83853, 83856, 83859, 83862, 83865, 83868, 83871, 83874, + 83877, 83880, 83883, 83886, 83889, 83892, 83900, 83909, 83920, 83928, + 83936, 83945, 83954, 83965, 83977, 0, 0, 0, 0, 0, 0, 83986, 83991, 83996, + 84003, 84010, 84016, 84022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84027, 84037, + 84047, 84057, 84066, 84077, 84086, 84095, 84105, 84115, 84127, 84139, + 84150, 84161, 84172, 84183, 84193, 84203, 84213, 84223, 84234, 84245, + 84249, 84254, 84263, 84272, 84276, 84280, 84284, 84289, 84294, 84299, + 84304, 84307, 84311, 0, 84316, 84319, 84322, 84326, 84330, 84335, 84339, + 84343, 84348, 84353, 84360, 84367, 84370, 84373, 84376, 84379, 84382, + 84386, 84390, 0, 84394, 84399, 84403, 84407, 0, 0, 0, 0, 84412, 84417, + 84424, 84429, 84434, 0, 84439, 84444, 84449, 84454, 84459, 84464, 84469, + 84474, 84479, 84484, 84489, 84494, 84503, 84512, 84520, 84528, 84537, + 84546, 84555, 84564, 84572, 84580, 84588, 84596, 84601, 84606, 84612, + 84618, 84624, 84630, 84638, 84646, 84652, 84658, 84664, 84670, 84676, + 84682, 84688, 84694, 84699, 84704, 84709, 84714, 84719, 84724, 84729, + 84734, 84740, 84746, 84752, 84758, 84764, 84770, 84776, 84782, 84788, + 84794, 84800, 84806, 84812, 84818, 84824, 84830, 84836, 84842, 84848, + 84854, 84860, 84866, 84872, 84878, 84884, 84890, 84896, 84902, 84908, + 84914, 84920, 84926, 84932, 84938, 84944, 84950, 84956, 84962, 84968, + 84974, 84980, 84986, 84992, 84998, 85004, 85010, 85016, 85022, 85028, + 85034, 85040, 85046, 85052, 85058, 85064, 85070, 85076, 85082, 85088, + 85094, 85099, 85104, 85109, 85114, 85120, 85126, 85132, 85138, 85144, + 85150, 85156, 85162, 85168, 85174, 85181, 85188, 85193, 85198, 85203, + 85208, 85220, 85232, 85243, 85254, 85266, 85278, 85286, 0, 0, 85294, 0, + 85302, 85306, 85310, 85313, 85317, 85321, 85324, 85327, 85331, 85335, + 85338, 85341, 85344, 85347, 85352, 85355, 85359, 85362, 85365, 85368, + 85371, 85374, 85377, 85380, 85383, 85386, 85389, 85392, 85396, 85400, + 85404, 85408, 85413, 85418, 85424, 85430, 85436, 85441, 85447, 85453, + 85459, 85464, 85470, 85476, 85481, 85486, 85492, 85497, 85503, 85509, + 85514, 85520, 85526, 85531, 85537, 85543, 85549, 85555, 85561, 85565, + 85570, 85574, 85579, 85583, 85588, 85593, 85599, 85605, 85611, 85616, + 85622, 85628, 85634, 85639, 85645, 85651, 85656, 85661, 85667, 85672, + 85678, 85684, 85689, 85695, 85701, 85706, 85712, 85718, 85724, 85730, + 85736, 85741, 85745, 85750, 85752, 85757, 85762, 85768, 85773, 85778, + 85782, 85788, 85793, 85798, 85803, 85808, 85813, 85818, 85823, 85829, + 85835, 85841, 85849, 85853, 85857, 85861, 85865, 85869, 85873, 85878, + 85883, 85888, 85893, 85897, 85902, 85907, 85912, 85917, 85922, 85927, + 85932, 85937, 85941, 85945, 85950, 85955, 85960, 85965, 85969, 85974, + 85979, 85984, 85989, 85993, 85998, 86003, 86008, 86013, 86017, 86022, + 86027, 86031, 86036, 86041, 86046, 86051, 86056, 86061, 86068, 86075, + 86079, 86084, 86089, 86094, 86099, 86104, 86109, 86114, 86119, 86124, + 86129, 86134, 86139, 86144, 86149, 86154, 86159, 86164, 86169, 86174, + 86179, 86184, 86189, 86194, 86199, 86204, 86209, 86214, 86219, 86224, 0, + 0, 0, 86229, 86233, 86238, 86242, 86247, 86252, 0, 0, 86256, 86261, + 86266, 86270, 86275, 86280, 0, 0, 86285, 86290, 86294, 86299, 86304, + 86309, 0, 0, 86314, 86319, 86324, 0, 0, 0, 86328, 86332, 86336, 86340, + 86343, 86347, 86351, 0, 86355, 86361, 86364, 86368, 86371, 86375, 86379, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86383, 86389, 86395, 86401, 86407, 0, 0, + 86411, 86417, 86423, 86429, 86435, 86441, 86448, 86455, 86462, 86469, + 86476, 86483, 0, 86490, 86497, 86504, 86510, 86517, 86524, 86531, 86538, + 86544, 86551, 86558, 86565, 86572, 86578, 86585, 86592, 86599, 86606, + 86612, 86619, 86626, 86633, 86640, 86647, 86654, 86661, 0, 86668, 86674, + 86681, 86688, 86695, 86702, 86708, 86715, 86722, 86729, 86736, 86743, + 86750, 86757, 86763, 86770, 86777, 86784, 86791, 0, 86798, 86805, 0, + 86812, 86819, 86826, 86833, 86840, 86847, 86854, 86861, 86868, 86875, + 86882, 86889, 86896, 86903, 86910, 0, 0, 86916, 86921, 86926, 86931, + 86936, 86941, 86946, 86951, 86956, 86961, 86966, 86971, 86976, 86981, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 86986, 86993, 87000, 87007, 87014, 87021, + 87028, 87035, 87042, 87049, 87056, 87063, 87070, 87077, 87084, 87091, + 87098, 87105, 87112, 87119, 87127, 87135, 87142, 87149, 87154, 87162, + 87170, 87177, 87184, 87189, 87196, 87201, 87206, 87213, 87218, 87223, + 87228, 87236, 87241, 87246, 87253, 87258, 87263, 87270, 87277, 87282, + 87287, 87292, 87297, 87302, 87307, 87312, 87317, 87322, 87329, 87334, + 87341, 87346, 87351, 87356, 87361, 87366, 87371, 87376, 87381, 87386, + 87391, 87396, 87403, 87410, 87417, 87424, 87430, 87435, 87442, 87447, + 87452, 87461, 87468, 87477, 87484, 87489, 87494, 87502, 87507, 87512, + 87517, 87522, 87527, 87534, 87539, 87544, 87549, 87554, 87559, 87566, + 87573, 87580, 87587, 87594, 87601, 87608, 87615, 87622, 87629, 87636, + 87643, 87650, 87657, 87664, 87671, 87678, 87685, 87692, 87699, 87706, + 87713, 87720, 87727, 87734, 87741, 87748, 87755, 0, 0, 0, 0, 0, 87762, + 87770, 87778, 0, 0, 0, 0, 87783, 87787, 87791, 87795, 87799, 87803, + 87807, 87811, 87815, 87819, 87824, 87829, 87834, 87839, 87844, 87849, + 87854, 87859, 87864, 87870, 87876, 87882, 87889, 87896, 87903, 87910, + 87917, 87924, 87930, 87936, 87942, 87949, 87956, 87963, 87970, 87977, + 87984, 87991, 87998, 88005, 88012, 88019, 88026, 88033, 88040, 0, 0, 0, + 88047, 88055, 88063, 88071, 88079, 88087, 88097, 88107, 88115, 88123, + 88131, 88139, 88147, 88153, 88160, 88169, 88178, 88187, 88196, 88205, + 88214, 88224, 88235, 88245, 88256, 88265, 88274, 88283, 88293, 88304, + 88314, 88325, 88336, 88345, 88353, 88359, 88365, 88371, 88377, 88385, + 88393, 88399, 88406, 88416, 88423, 88430, 88437, 88444, 88451, 88461, + 88468, 88475, 88483, 88491, 88500, 88509, 88518, 88527, 88536, 88544, + 88553, 88562, 88571, 88575, 88582, 88587, 88592, 88596, 88600, 88604, + 88608, 88613, 88618, 88624, 88630, 88634, 88640, 88644, 88648, 88652, + 88656, 88660, 88664, 88670, 0, 0, 0, 0, 0, 88674, 88679, 88684, 88689, + 88694, 88701, 88706, 88711, 88716, 88721, 88726, 88731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88736, + 88743, 88752, 88761, 88768, 88775, 88782, 88789, 88796, 88803, 88809, + 88816, 88823, 88830, 88837, 88844, 88851, 88858, 88865, 88874, 88881, + 88888, 88895, 88902, 88909, 88916, 88923, 88930, 88939, 88946, 88953, + 88960, 88967, 88974, 88981, 88990, 88997, 89004, 89011, 89018, 89027, + 89034, 89041, 89048, 89056, 89065, 0, 0, 89074, 89078, 89082, 89087, + 89092, 89097, 89102, 89106, 89111, 89116, 89121, 89126, 89131, 89136, + 89140, 89144, 89149, 89154, 89159, 89163, 89168, 89173, 89177, 89182, + 89187, 89192, 89197, 89202, 89207, 0, 0, 0, 89212, 89216, 89221, 89226, + 89230, 89235, 89239, 89244, 89249, 89254, 89259, 89263, 89267, 89272, + 89277, 89282, 89287, 89292, 89297, 89301, 89306, 89311, 89316, 89321, + 89326, 89331, 89335, 89339, 89344, 89349, 89354, 89359, 89364, 89369, + 89374, 89379, 89384, 89389, 89394, 89399, 89404, 89409, 89414, 89419, + 89424, 89429, 89434, 89439, 89444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89449, 89453, 89458, 89463, 89468, 89472, + 89477, 89482, 89487, 89492, 89496, 89500, 89505, 89510, 89515, 89520, + 89524, 89529, 89534, 89539, 89544, 89549, 89554, 89558, 89563, 89568, + 89573, 89578, 89583, 89588, 89593, 0, 89598, 89603, 89608, 89614, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89620, 89625, 89630, 89635, 89640, 89645, + 89650, 89655, 89660, 89665, 89670, 89675, 89680, 89685, 89690, 89695, + 89700, 89705, 89710, 89715, 89720, 89725, 89730, 89735, 89740, 89745, + 89750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89757, 89762, 89767, 89772, 89777, 89782, 89787, + 89792, 89797, 89802, 89807, 89812, 89817, 89822, 89827, 89832, 89837, + 89842, 89847, 89852, 89857, 89862, 89867, 89872, 89877, 89882, 89887, + 89891, 89895, 89899, 0, 89904, 89910, 89915, 89920, 89925, 89930, 89936, + 89942, 89948, 89954, 89960, 89966, 89972, 89978, 89984, 89990, 89996, + 90002, 90008, 90013, 90019, 90025, 90030, 90036, 90041, 90047, 90053, + 90058, 90064, 90070, 90075, 90081, 90087, 90092, 90098, 90104, 90110, 0, + 0, 0, 0, 90115, 90121, 90127, 90133, 90139, 90145, 90151, 90157, 90163, + 90170, 90175, 90180, 90186, 90192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90198, 90203, 90208, 90213, 90219, 90224, 90230, 90236, + 90242, 90248, 90255, 90261, 90268, 90273, 90278, 90283, 90288, 90293, + 90298, 90303, 90308, 90313, 90318, 90323, 90328, 90333, 90338, 90343, + 90348, 90353, 90358, 90363, 90368, 90373, 90378, 90383, 90388, 90393, + 90398, 90403, 90408, 90413, 90418, 90423, 90429, 90434, 90440, 90446, + 90452, 90458, 90465, 90471, 90478, 90483, 90488, 90493, 90498, 90503, + 90508, 90513, 90518, 90523, 90528, 90533, 90538, 90543, 90548, 90553, + 90558, 90563, 90568, 90573, 90578, 90583, 90588, 90593, 90598, 90603, + 90608, 90613, 90618, 90623, 90628, 90633, 90638, 90643, 90648, 90653, + 90658, 90663, 90668, 90673, 90678, 90683, 90688, 90693, 90698, 90703, + 90708, 90713, 90718, 90723, 90728, 90733, 90738, 90743, 90748, 90753, + 90758, 90763, 90768, 90773, 90778, 90783, 90788, 90793, 90798, 90803, + 90808, 90813, 90818, 90823, 90828, 90833, 90838, 90843, 90848, 90853, + 90858, 90863, 90868, 90873, 90878, 90883, 90888, 90893, 90897, 90901, + 90906, 90911, 90916, 90921, 90926, 90931, 90936, 90941, 90946, 90951, + 90956, 90960, 90964, 90968, 90972, 90976, 90980, 90984, 90989, 90994, 0, + 0, 90999, 91004, 91008, 91012, 91016, 91020, 91024, 91028, 91032, 91036, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91040, 91044, 91048, 91052, + 91056, 91060, 0, 0, 91065, 0, 91070, 91074, 91079, 91084, 91089, 91094, + 91099, 91104, 91109, 91114, 91119, 91123, 91128, 91133, 91138, 91143, + 91147, 91152, 91157, 91162, 91167, 91171, 91176, 91181, 91186, 91191, + 91195, 91200, 91205, 91210, 91215, 91219, 91224, 91229, 91234, 91239, + 91244, 91249, 91254, 91258, 91263, 91268, 91273, 91278, 0, 91283, 91288, + 0, 0, 0, 91293, 0, 0, 91298, 91303, 91310, 91317, 91324, 91331, 91338, + 91345, 91352, 91359, 91366, 91373, 91380, 91387, 91394, 91401, 91408, + 91415, 91422, 91429, 91436, 91443, 91450, 0, 91457, 91464, 91470, 91476, + 91482, 91489, 91496, 91504, 91512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91521, 91526, + 91531, 91536, 91541, 91546, 91551, 91556, 91561, 91566, 91571, 91576, + 91581, 91586, 91591, 91596, 91601, 91606, 91611, 91616, 91621, 91626, + 91631, 91635, 91640, 91645, 91651, 91655, 0, 0, 0, 91659, 91665, 91669, + 91674, 91679, 91684, 91688, 91693, 91697, 91702, 91707, 91711, 91715, + 91720, 91724, 91728, 91733, 91738, 91742, 91747, 91752, 91757, 91762, + 91767, 91772, 91777, 91782, 0, 0, 0, 0, 0, 91787, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91792, 91798, 91804, 91810, 91816, 91822, 91829, + 91836, 91843, 91849, 91855, 91861, 91868, 91875, 91882, 91888, 91895, + 91902, 91909, 91916, 91922, 91929, 91936, 91942, 91949, 91956, 91963, + 91970, 91977, 91983, 91990, 91997, 92004, 92010, 92016, 92022, 92028, + 92034, 92041, 92048, 92054, 92060, 92066, 92073, 92079, 92086, 92093, + 92100, 92106, 92114, 92121, 92127, 92134, 92141, 92148, 92154, 0, 0, 0, + 0, 0, 0, 92161, 92169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 75814, 75819, 75824, 75829, 75834, 75838, 75842, 75847, 75852, 75857, - 75862, 75867, 75872, 75877, 75882, 75887, 75891, 75896, 75901, 75906, - 75911, 75916, 75921, 75926, 75931, 75936, 75941, 75946, 75953, 75960, - 75967, 75974, 75981, 75988, 75995, 76002, 76008, 76014, 76020, 76026, - 76032, 76038, 76044, 76050, 76054, 76060, 0, 0, 76066, 76071, 76075, - 76079, 76083, 76087, 76091, 76095, 76099, 76103, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76107, - 76111, 76115, 76119, 76123, 76127, 76131, 76135, 76139, 76143, 76147, - 76151, 76155, 76159, 76163, 76167, 76171, 76175, 76179, 76183, 76187, - 76191, 76195, 0, 0, 0, 0, 76199, 76203, 76207, 76211, 76215, 76219, - 76223, 76227, 76231, 76235, 76239, 76243, 76247, 76251, 76255, 76259, - 76263, 76267, 76271, 76275, 76279, 76283, 76287, 76291, 76295, 76299, - 76303, 76307, 76311, 76315, 76319, 76323, 76327, 76331, 76335, 76339, - 76343, 76347, 76351, 76355, 76359, 76363, 76367, 76371, 76375, 76379, - 76383, 76387, 76391, 0, 0, 0, 0, 76395, 76399, 76403, 76407, 76411, - 76415, 76419, 76423, 76427, 76431, 76435, 76439, 76443, 76447, 76451, - 76455, 76459, 76463, 76467, 76471, 76475, 76479, 76483, 76487, 76491, - 76495, 76499, 76503, 76507, 76511, 76515, 76519, 76523, 76527, 76531, - 76535, 76539, 76543, 76547, 76551, 76555, 76559, 76563, 76567, 76571, - 76575, 76579, 76583, 76587, 76591, 76595, 76599, 76603, 76607, 76611, - 76615, 76619, 76623, 76627, 76631, 76635, 76639, 76643, 76647, 76651, - 76655, 76659, 76663, 76667, 76671, 76675, 76679, 76683, 76687, 76691, - 76695, 76699, 76703, 76707, 76711, 76715, 76719, 76723, 76727, 76731, - 76735, 76739, 76743, 76747, 76751, 76755, 76759, 76763, 76767, 76771, - 76775, 76779, 76783, 76787, 76791, 76795, 76799, 76803, 76807, 76811, - 76815, 76819, 76823, 76827, 76831, 76835, 76839, 76843, 76847, 76851, - 76855, 76859, 76863, 76867, 76871, 76875, 76879, 76883, 76887, 76891, - 76895, 76899, 76903, 76907, 76911, 76915, 76919, 76923, 76927, 76931, - 76935, 76939, 76943, 76947, 76951, 76955, 76959, 76963, 76967, 76971, - 76975, 76979, 76983, 76987, 76991, 76995, 76999, 77003, 77007, 77011, - 77015, 77019, 77023, 77027, 77031, 77035, 77039, 77043, 77047, 77051, - 77055, 77059, 77063, 77067, 77071, 77075, 77079, 77083, 77087, 77091, - 77095, 77099, 77103, 77107, 77111, 77115, 77119, 77123, 77127, 77131, - 77135, 77139, 77143, 77147, 77151, 77155, 77159, 77163, 77167, 77171, - 77175, 77179, 77183, 77187, 77191, 77195, 77199, 77203, 77207, 77211, - 77215, 77219, 77223, 77227, 77231, 77235, 77239, 77243, 77247, 77251, - 77255, 77259, 77263, 77267, 77271, 77275, 77279, 77283, 77287, 77291, - 77295, 77299, 77303, 77307, 77311, 77315, 77319, 77323, 77327, 77331, - 77335, 77339, 77343, 77347, 77351, 77355, 77359, 77363, 77367, 77371, - 77375, 77379, 77383, 77387, 77391, 77395, 77399, 77403, 77407, 77411, - 77415, 77419, 77423, 77427, 77431, 77435, 77439, 77443, 77447, 77451, - 77455, 77459, 77463, 77467, 77471, 77475, 77479, 77483, 77487, 77491, - 77495, 77499, 77503, 77507, 77511, 77515, 77519, 77523, 77527, 77531, - 77535, 77539, 77543, 77547, 77551, 77555, 77559, 77563, 77567, 77571, - 77575, 77579, 77583, 77587, 77591, 77595, 77599, 77603, 77607, 77611, - 77615, 77619, 77623, 77627, 77631, 77635, 77639, 77643, 77647, 77651, - 77655, 77659, 77663, 77667, 77671, 77675, 77679, 77683, 77687, 77691, - 77695, 77699, 77703, 77707, 77711, 77715, 77719, 77723, 77727, 77731, - 77735, 77739, 77743, 77747, 77751, 77755, 77759, 77763, 77767, 77771, - 77775, 77779, 77783, 77787, 77791, 77795, 77799, 77803, 77807, 77811, - 77815, 77819, 77823, 77827, 77831, 77835, 77839, 77843, 77847, 77851, - 77855, 0, 0, 77859, 77863, 77867, 77871, 77875, 77879, 77883, 77887, - 77891, 77895, 77899, 77903, 77907, 77911, 77915, 77919, 77923, 77927, - 77931, 77935, 77939, 77943, 77947, 77951, 77955, 77959, 77963, 77967, - 77971, 77975, 77979, 77983, 77987, 77991, 77995, 77999, 78003, 78007, - 78011, 78015, 78019, 78023, 78027, 78031, 78035, 78039, 78043, 78047, - 78051, 78055, 78059, 78063, 78067, 78071, 78075, 78079, 78083, 78087, - 78091, 78095, 78099, 78103, 78107, 78111, 78115, 78119, 78123, 78127, - 78131, 78135, 78139, 78143, 78147, 78151, 78155, 78159, 78163, 78167, - 78171, 78175, 78179, 78183, 78187, 78191, 78195, 78199, 78203, 78207, - 78211, 78215, 78219, 78223, 78227, 78231, 78235, 78239, 78243, 78247, - 78251, 78255, 78259, 78263, 78267, 78271, 78275, 78279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78283, 78288, 78293, 78298, 78303, 78308, 78316, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78321, 78328, 78335, 78342, 78349, 0, - 0, 0, 0, 0, 78356, 78363, 78370, 78380, 78386, 78392, 78398, 78404, - 78410, 78416, 78423, 78429, 78435, 78441, 78450, 78459, 78471, 78483, - 78489, 78495, 78501, 78508, 78515, 78522, 78529, 78536, 0, 78543, 78550, - 78557, 78565, 78572, 0, 78579, 0, 78586, 78593, 0, 78600, 78608, 0, - 78615, 78622, 78629, 78636, 78643, 78650, 78657, 78664, 78671, 78678, - 78683, 78690, 78697, 78703, 78709, 78715, 78721, 78727, 78733, 78739, - 78745, 78751, 78757, 78763, 78769, 78775, 78781, 78787, 78793, 78799, - 78805, 78811, 78817, 78823, 78829, 78835, 78841, 78847, 78853, 78859, - 78865, 78871, 78877, 78883, 78889, 78895, 78901, 78907, 78913, 78919, - 78925, 78931, 78937, 78943, 78949, 78955, 78961, 78967, 78973, 78979, - 78985, 78991, 78997, 79003, 79009, 79015, 79021, 79027, 79033, 79039, - 79045, 79051, 79057, 79063, 79069, 79075, 79081, 79087, 79093, 79099, - 79105, 79111, 79117, 79123, 79129, 79135, 79141, 79147, 79153, 79161, - 79169, 79175, 79181, 79187, 79193, 79202, 79211, 79219, 79227, 79235, - 79243, 79251, 79259, 79267, 79275, 79282, 79289, 79299, 79309, 79313, - 79317, 79322, 79327, 79332, 79337, 79346, 79355, 79361, 79367, 79374, - 79381, 79388, 79392, 79398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 79404, 79410, 79416, 79422, 79428, 79433, 79438, 79444, 79450, - 79456, 79462, 79470, 79476, 79482, 79490, 79498, 79506, 79514, 79519, - 79524, 79529, 79534, 79547, 79560, 79570, 79580, 79591, 79602, 79613, - 79624, 79634, 79644, 79655, 79666, 79677, 79688, 79698, 79708, 79718, - 79734, 79750, 79766, 79773, 79780, 79787, 79794, 79804, 79814, 79824, - 79836, 79846, 79854, 79862, 79871, 79879, 79889, 79897, 79905, 79913, - 79922, 79930, 79940, 79948, 79956, 79964, 79974, 79982, 79989, 79996, - 80003, 80010, 80018, 80026, 80034, 80042, 80050, 80059, 80067, 80075, - 80083, 80091, 80099, 80108, 80116, 80124, 80132, 80140, 80148, 80156, - 80164, 80172, 80180, 80188, 80197, 80205, 80215, 80223, 80231, 80239, - 80249, 80257, 80265, 80273, 80281, 80290, 80299, 80307, 80317, 80325, - 80333, 80341, 80350, 80358, 80368, 80376, 80383, 80390, 80398, 80405, - 80414, 80421, 80429, 80437, 80446, 80454, 80464, 80472, 80480, 80488, - 80498, 80506, 80513, 80520, 80528, 80535, 80544, 80551, 80561, 80571, - 80582, 80591, 80600, 80609, 80618, 80627, 80637, 80648, 80659, 80669, - 80680, 80692, 80702, 80711, 80720, 80728, 80737, 80747, 80755, 80764, - 80773, 80781, 80790, 80800, 80808, 80817, 80826, 80834, 80843, 80853, - 80861, 80871, 80879, 80889, 80897, 80905, 80914, 80922, 80932, 80940, - 80948, 80958, 80966, 80973, 80980, 80989, 80998, 81006, 81015, 81025, - 81033, 81044, 81052, 81060, 81067, 81075, 81084, 81091, 81101, 81111, - 81122, 81132, 81143, 81151, 81159, 81168, 81176, 81185, 81193, 81201, - 81210, 81218, 81227, 81235, 81242, 81249, 81256, 81263, 81271, 81279, - 81287, 81295, 81304, 81312, 81320, 81329, 81337, 81345, 81353, 81362, - 81370, 81378, 81386, 81394, 81402, 81410, 81418, 81426, 81434, 81443, - 81451, 81459, 81467, 81475, 81483, 81492, 81501, 81509, 81517, 81525, - 81534, 81542, 81551, 81558, 81565, 81573, 81580, 81588, 81596, 81605, - 81613, 81622, 81630, 81638, 81648, 81655, 81662, 81670, 81677, 81685, - 81695, 81706, 81714, 81723, 81731, 81740, 81748, 81757, 81765, 81774, - 81782, 81791, 81800, 81808, 81816, 81824, 81833, 81840, 81848, 81857, - 81866, 81875, 81885, 81893, 81903, 81911, 81921, 81929, 81939, 81947, - 81957, 81965, 81974, 81981, 81990, 81997, 82007, 82015, 82025, 82033, - 82043, 82051, 82059, 82067, 82076, 82084, 82093, 82102, 82111, 82120, - 82130, 82138, 82148, 82156, 82166, 82174, 82184, 82192, 82202, 82210, - 82219, 82226, 82235, 82242, 82252, 82260, 82270, 82278, 82288, 82296, - 82304, 82312, 82321, 82329, 82338, 82347, 82356, 82365, 82373, 82381, - 82390, 82398, 82407, 82416, 82424, 82432, 82440, 82449, 82457, 82465, - 82474, 82482, 82490, 82498, 82506, 82511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82516, 82526, 82536, 82546, 82556, 82567, 82577, 82587, - 82598, 82607, 82616, 82625, 82636, 82646, 82656, 82668, 82678, 82688, - 82698, 82708, 82718, 82728, 82738, 82748, 82758, 82768, 82778, 82789, - 82800, 82810, 82820, 82832, 82843, 82854, 82864, 82874, 82884, 82894, - 82904, 82914, 82924, 82936, 82946, 82956, 82968, 82979, 82990, 83000, - 83010, 83020, 83030, 83042, 83052, 83062, 83073, 83084, 83094, 83104, - 83113, 83122, 83131, 83140, 83149, 83159, 0, 0, 83169, 83179, 83189, - 83199, 83209, 83221, 83231, 83241, 83253, 83263, 83275, 83284, 83293, - 83304, 83314, 83326, 83337, 83350, 83360, 83372, 83381, 83392, 83403, - 83416, 83426, 83436, 83446, 83456, 83466, 83475, 83484, 83493, 83502, - 83512, 83522, 83532, 83542, 83552, 83562, 83572, 83582, 83592, 83602, - 83612, 83622, 83631, 83640, 83649, 83659, 83669, 83679, 83689, 83699, - 83710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83720, 83735, - 83750, 83756, 83762, 83768, 83774, 83780, 83786, 83792, 83798, 83806, - 83810, 83813, 0, 0, 83821, 83824, 83827, 83830, 83833, 83836, 83839, - 83842, 83845, 83848, 83851, 83854, 83857, 83860, 83863, 83866, 83869, - 83877, 83886, 83897, 83905, 83913, 83922, 83931, 83942, 83954, 0, 0, 0, - 0, 0, 0, 83963, 83968, 83973, 83980, 83987, 83993, 83999, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84004, 84014, 84024, 84034, 84043, 84054, 84063, 84072, - 84082, 84092, 84104, 84116, 84127, 84138, 84149, 84160, 84170, 84180, - 84190, 84200, 84211, 84222, 84226, 84231, 84240, 84249, 84253, 84257, - 84261, 84266, 84271, 84276, 84281, 84284, 84288, 0, 84293, 84296, 84299, - 84303, 84307, 84312, 84316, 84320, 84325, 84330, 84337, 84344, 84347, - 84350, 84353, 84356, 84359, 84363, 84367, 0, 84371, 84376, 84380, 84384, - 0, 0, 0, 0, 84389, 84394, 84401, 84406, 84411, 0, 84416, 84421, 84426, - 84431, 84436, 84441, 84446, 84451, 84456, 84461, 84466, 84471, 84480, - 84489, 84497, 84505, 84514, 84523, 84532, 84541, 84549, 84557, 84565, - 84573, 84578, 84583, 84589, 84595, 84601, 84607, 84615, 84623, 84629, - 84635, 84641, 84647, 84653, 84659, 84665, 84671, 84676, 84681, 84686, - 84691, 84696, 84701, 84706, 84711, 84717, 84723, 84729, 84735, 84741, - 84747, 84753, 84759, 84765, 84771, 84777, 84783, 84789, 84795, 84801, - 84807, 84813, 84819, 84825, 84831, 84837, 84843, 84849, 84855, 84861, - 84867, 84873, 84879, 84885, 84891, 84897, 84903, 84909, 84915, 84921, - 84927, 84933, 84939, 84945, 84951, 84957, 84963, 84969, 84975, 84981, - 84987, 84993, 84999, 85005, 85011, 85017, 85023, 85029, 85035, 85041, - 85047, 85053, 85059, 85065, 85071, 85076, 85081, 85086, 85091, 85097, - 85103, 85109, 85115, 85121, 85127, 85133, 85139, 85145, 85151, 85158, - 85165, 85170, 85175, 85180, 85185, 85197, 85209, 85220, 85231, 85243, - 85255, 85263, 0, 0, 85271, 0, 85279, 85283, 85287, 85290, 85294, 85298, - 85301, 85304, 85308, 85312, 85315, 85318, 85321, 85324, 85329, 85332, - 85336, 85339, 85342, 85345, 85348, 85351, 85354, 85357, 85360, 85363, - 85366, 85369, 85373, 85377, 85381, 85385, 85390, 85395, 85401, 85407, - 85413, 85418, 85424, 85430, 85436, 85441, 85447, 85453, 85458, 85463, - 85469, 85474, 85480, 85486, 85491, 85497, 85503, 85508, 85514, 85520, - 85526, 85532, 85538, 85542, 85547, 85551, 85556, 85560, 85565, 85570, - 85576, 85582, 85588, 85593, 85599, 85605, 85611, 85616, 85622, 85628, - 85633, 85638, 85644, 85649, 85655, 85661, 85666, 85672, 85678, 85683, - 85689, 85695, 85701, 85707, 85713, 85718, 85722, 85727, 85729, 85734, - 85739, 85745, 85750, 85755, 85759, 85765, 85770, 85775, 85780, 85785, - 85790, 85795, 85800, 85806, 85812, 85818, 85826, 85830, 85834, 85838, - 85842, 85846, 85850, 85855, 85860, 85865, 85870, 85874, 85879, 85884, - 85889, 85894, 85899, 85904, 85909, 85914, 85918, 85922, 85927, 85932, - 85937, 85942, 85946, 85951, 85956, 85961, 85966, 85970, 85975, 85980, - 85985, 85990, 85994, 85999, 86004, 86008, 86013, 86018, 86023, 86028, - 86033, 86038, 86045, 86052, 86056, 86061, 86066, 86071, 86076, 86081, - 86086, 86091, 86096, 86101, 86106, 86111, 86116, 86121, 86126, 86131, - 86136, 86141, 86146, 86151, 86156, 86161, 86166, 86171, 86176, 86181, - 86186, 86191, 86196, 86201, 0, 0, 0, 86206, 86210, 86215, 86219, 86224, - 86229, 0, 0, 86233, 86238, 86243, 86247, 86252, 86257, 0, 0, 86262, - 86267, 86271, 86276, 86281, 86286, 0, 0, 86291, 86296, 86301, 0, 0, 0, - 86305, 86309, 86313, 86317, 86320, 86324, 86328, 0, 86332, 86338, 86341, - 86345, 86348, 86352, 86356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86360, 86366, - 86372, 86378, 86384, 0, 0, 86388, 86394, 86400, 86406, 86412, 86418, - 86425, 86432, 86439, 86446, 86453, 86460, 0, 86467, 86474, 86481, 86487, - 86494, 86501, 86508, 86515, 86521, 86528, 86535, 86542, 86549, 86555, - 86562, 86569, 86576, 86583, 86589, 86596, 86603, 86610, 86617, 86624, - 86631, 86638, 0, 86645, 86651, 86658, 86665, 86672, 86679, 86685, 86692, - 86699, 86706, 86713, 86720, 86727, 86734, 86740, 86747, 86754, 86761, - 86768, 0, 86775, 86782, 0, 86789, 86796, 86803, 86810, 86817, 86824, - 86831, 86838, 86845, 86852, 86859, 86866, 86873, 86880, 86887, 0, 0, - 86893, 86898, 86903, 86908, 86913, 86918, 86923, 86928, 86933, 86938, - 86943, 86948, 86953, 86958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86963, 86970, - 86977, 86984, 86991, 86998, 87005, 87012, 87019, 87026, 87033, 87040, - 87047, 87054, 87061, 87068, 87075, 87082, 87089, 87096, 87104, 87112, - 87119, 87126, 87131, 87139, 87147, 87154, 87161, 87166, 87173, 87178, - 87183, 87190, 87195, 87200, 87205, 87213, 87218, 87223, 87230, 87235, - 87240, 87247, 87254, 87259, 87264, 87269, 87274, 87279, 87284, 87289, - 87294, 87299, 87306, 87311, 87318, 87323, 87328, 87333, 87338, 87343, - 87348, 87353, 87358, 87363, 87368, 87373, 87380, 87387, 87394, 87401, - 87407, 87412, 87419, 87424, 87429, 87438, 87445, 87454, 87461, 87466, - 87471, 87479, 87484, 87489, 87494, 87499, 87504, 87511, 87516, 87521, - 87526, 87531, 87536, 87543, 87550, 87557, 87564, 87571, 87578, 87585, - 87592, 87599, 87606, 87613, 87620, 87627, 87634, 87641, 87648, 87655, - 87662, 87669, 87676, 87683, 87690, 87697, 87704, 87711, 87718, 87725, - 87732, 0, 0, 0, 0, 0, 87739, 87747, 87755, 0, 0, 0, 0, 87760, 87764, - 87768, 87772, 87776, 87780, 87784, 87788, 87792, 87796, 87801, 87806, - 87811, 87816, 87821, 87826, 87831, 87836, 87841, 87847, 87853, 87859, - 87866, 87873, 87880, 87887, 87894, 87901, 87907, 87913, 87919, 87926, - 87933, 87940, 87947, 87954, 87961, 87968, 87975, 87982, 87989, 87996, - 88003, 88010, 88017, 0, 0, 0, 88024, 88032, 88040, 88048, 88056, 88064, - 88074, 88084, 88092, 88100, 88108, 88116, 88124, 88130, 88137, 88146, - 88155, 88164, 88173, 88182, 88191, 88201, 88212, 88222, 88233, 88242, - 88251, 88260, 88270, 88281, 88291, 88302, 88313, 88322, 88330, 88336, - 88342, 88348, 88354, 88362, 88370, 88376, 88383, 88393, 88400, 88407, - 88414, 88421, 88428, 88438, 88445, 88452, 88460, 88468, 88477, 88486, - 88495, 88504, 88513, 88521, 88530, 88539, 88548, 88552, 88559, 88564, - 88569, 88573, 88577, 88581, 88585, 88590, 88595, 88601, 88607, 88611, - 88617, 88621, 88625, 88629, 88633, 88637, 88641, 88647, 0, 0, 0, 0, 0, - 88651, 88656, 88661, 88666, 88671, 88678, 88683, 88688, 88693, 88698, - 88703, 88708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88713, 88720, 88729, 88738, 88745, 88752, 88759, - 88766, 88773, 88780, 88786, 88793, 88800, 88807, 88814, 88821, 88828, - 88835, 88842, 88851, 88858, 88865, 88872, 88879, 88886, 88893, 88900, - 88907, 88916, 88923, 88930, 88937, 88944, 88951, 88958, 88967, 88974, - 88981, 88988, 88995, 89004, 89011, 89018, 89025, 89033, 89042, 0, 0, - 89051, 89055, 89059, 89064, 89069, 89074, 89079, 89083, 89088, 89093, - 89098, 89103, 89108, 89113, 89117, 89121, 89126, 89131, 89136, 89140, - 89145, 89150, 89154, 89159, 89164, 89169, 89174, 89179, 89184, 0, 0, 0, - 89189, 89193, 89198, 89203, 89207, 89212, 89216, 89221, 89226, 89231, - 89236, 89240, 89244, 89249, 89254, 89259, 89264, 89269, 89274, 89278, - 89283, 89288, 89293, 89298, 89303, 89308, 89312, 89316, 89321, 89326, - 89331, 89336, 89341, 89346, 89351, 89356, 89361, 89366, 89371, 89376, - 89381, 89386, 89391, 89396, 89401, 89406, 89411, 89416, 89421, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89426, 89430, - 89435, 89440, 89445, 89449, 89454, 89459, 89464, 89469, 89473, 89477, - 89482, 89487, 89492, 89497, 89501, 89506, 89511, 89516, 89521, 89526, - 89531, 89535, 89540, 89545, 89550, 89555, 89560, 89565, 89570, 0, 89575, - 89580, 89585, 89591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89597, 89602, - 89607, 89612, 89617, 89622, 89627, 89632, 89637, 89642, 89647, 89652, - 89657, 89662, 89667, 89672, 89677, 89682, 89687, 89692, 89697, 89702, - 89707, 89712, 89717, 89722, 89727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89734, 89739, 89744, - 89749, 89754, 89759, 89764, 89769, 89774, 89779, 89784, 89789, 89794, - 89799, 89804, 89809, 89814, 89819, 89824, 89829, 89834, 89839, 89844, - 89849, 89854, 89859, 89864, 89868, 89872, 89876, 0, 89881, 89887, 89892, - 89897, 89902, 89907, 89913, 89919, 89925, 89931, 89937, 89943, 89949, - 89955, 89961, 89967, 89973, 89979, 89985, 89990, 89996, 90002, 90007, - 90013, 90018, 90024, 90030, 90035, 90041, 90047, 90052, 90058, 90064, - 90069, 90075, 90081, 90087, 0, 0, 0, 0, 90092, 90098, 90104, 90110, - 90116, 90122, 90128, 90134, 90140, 90147, 90152, 90157, 90163, 90169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90175, 90180, 90185, - 90190, 90196, 90201, 90207, 90213, 90219, 90225, 90232, 90238, 90245, - 90250, 90255, 90260, 90265, 90270, 90275, 90280, 90285, 90290, 90295, - 90300, 90305, 90310, 90315, 90320, 90325, 90330, 90335, 90340, 90345, - 90350, 90355, 90360, 90365, 90370, 90375, 90380, 90385, 90390, 90395, - 90400, 90406, 90411, 90417, 90423, 90429, 90435, 90442, 90448, 90455, - 90460, 90465, 90470, 90475, 90480, 90485, 90490, 90495, 90500, 90505, - 90510, 90515, 90520, 90525, 90530, 90535, 90540, 90545, 90550, 90555, - 90560, 90565, 90570, 90575, 90580, 90585, 90590, 90595, 90600, 90605, - 90610, 90615, 90620, 90625, 90630, 90635, 90640, 90645, 90650, 90655, - 90660, 90665, 90670, 90675, 90680, 90685, 90690, 90695, 90700, 90705, - 90710, 90715, 90720, 90725, 90730, 90735, 90740, 90745, 90750, 90755, - 90760, 90765, 90770, 90775, 90780, 90785, 90790, 90795, 90800, 90805, - 90810, 90815, 90820, 90825, 90830, 90835, 90840, 90845, 90850, 90855, - 90860, 90865, 90870, 90874, 90878, 90883, 90888, 90893, 90898, 90903, - 90908, 90913, 90918, 90923, 90928, 90933, 90937, 90941, 90945, 90949, - 90953, 90957, 90961, 90966, 90971, 0, 0, 90976, 90981, 90985, 90989, - 90993, 90997, 91001, 91005, 91009, 91013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91017, 91021, 91025, 91029, 91033, 91037, 0, 0, 91042, 0, - 91047, 91051, 91056, 91061, 91066, 91071, 91076, 91081, 91086, 91091, - 91096, 91100, 91105, 91110, 91115, 91120, 91124, 91129, 91134, 91139, - 91144, 91148, 91153, 91158, 91163, 91168, 91172, 91177, 91182, 91187, - 91192, 91196, 91201, 91206, 91211, 91216, 91221, 91226, 91231, 91235, - 91240, 91245, 91250, 91255, 0, 91260, 91265, 0, 0, 0, 91270, 0, 0, 91275, - 91280, 91287, 91294, 91301, 91308, 91315, 91322, 91329, 91336, 91343, - 91350, 91357, 91364, 91371, 91378, 91385, 91392, 91399, 91406, 91413, - 91420, 91427, 0, 91434, 91441, 91447, 91453, 91459, 91466, 91473, 91481, - 91489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91498, 91503, 91508, 91513, 91518, 91523, - 91528, 91533, 91538, 91543, 91548, 91553, 91558, 91563, 91568, 91573, - 91578, 91583, 91588, 91593, 91598, 91603, 91608, 91612, 91617, 91622, - 91628, 91632, 0, 0, 0, 91636, 91642, 91646, 91651, 91656, 91661, 91665, - 91670, 91674, 91679, 91684, 91688, 91692, 91697, 91701, 91705, 91710, - 91715, 91719, 91724, 91729, 91734, 91739, 91744, 91749, 91754, 91759, 0, - 0, 0, 0, 0, 91764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91769, - 91775, 91781, 91787, 91793, 91799, 91806, 91813, 91820, 91826, 91832, - 91838, 91845, 91852, 91859, 91865, 91872, 91879, 91886, 91893, 91899, - 91906, 91913, 91919, 91926, 91933, 91940, 91947, 91954, 91960, 91967, - 91974, 91981, 91987, 91993, 91999, 92005, 92011, 92018, 92025, 92031, - 92037, 92043, 92050, 92056, 92063, 92070, 92077, 92083, 92091, 92098, - 92104, 92111, 92118, 92125, 92131, 0, 0, 0, 0, 0, 0, 92138, 92146, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92154, 92158, 92163, 92168, 0, - 92174, 92179, 0, 0, 0, 0, 0, 92184, 92190, 92197, 92202, 92207, 92211, - 92216, 92221, 0, 92226, 92231, 92236, 0, 92241, 92246, 92251, 92256, - 92261, 92266, 92271, 92276, 92281, 92286, 92291, 92295, 92299, 92304, - 92309, 92314, 92318, 92322, 92326, 92331, 92336, 92341, 92346, 92350, - 92355, 92359, 92364, 0, 0, 0, 0, 92369, 92375, 92380, 0, 0, 0, 0, 92385, - 92389, 92393, 92397, 92401, 92405, 92410, 92415, 92421, 0, 0, 0, 0, 0, 0, - 0, 0, 92427, 92433, 92440, 92446, 92453, 92459, 92465, 92471, 92478, 0, - 0, 0, 0, 0, 0, 0, 92484, 92492, 92500, 92508, 92516, 92524, 92532, 92540, - 92548, 92556, 92564, 92572, 92580, 92588, 92596, 92604, 92612, 92620, - 92628, 92636, 92644, 92652, 92660, 92668, 92676, 92684, 92692, 92700, - 92708, 92716, 92723, 92731, 92739, 92743, 92748, 92753, 92758, 92763, - 92768, 92773, 92778, 92782, 92787, 92791, 92796, 92800, 92805, 92809, - 92814, 92819, 92824, 92829, 92834, 92839, 92844, 92849, 92854, 92859, - 92864, 92869, 92874, 92879, 92884, 92889, 92894, 92899, 92904, 92909, - 92914, 92919, 92924, 92929, 92934, 92939, 92944, 92949, 92954, 92959, - 92964, 92969, 92974, 92979, 92984, 92989, 92994, 92999, 0, 0, 0, 93004, - 93009, 93018, 93026, 93035, 93044, 93055, 93066, 93073, 93080, 93087, - 93094, 93101, 93108, 93115, 93122, 93129, 93136, 93143, 93150, 93157, - 93164, 93171, 93178, 93185, 93192, 93199, 93206, 93213, 0, 0, 93220, - 93226, 93232, 93238, 93244, 93251, 93258, 93266, 93274, 93281, 93288, - 93295, 93302, 93309, 93316, 93323, 93330, 93337, 93344, 93351, 93358, - 93365, 93372, 93379, 93386, 93393, 93400, 0, 0, 0, 0, 0, 93407, 93413, - 93419, 93425, 93431, 93438, 93445, 93453, 93461, 93467, 93473, 93480, - 93486, 93492, 93498, 93504, 93511, 93518, 93525, 93532, 93539, 93546, - 93553, 93560, 93567, 93574, 93581, 93588, 93595, 93602, 93609, 93616, - 93623, 93630, 93637, 93644, 93651, 93658, 93665, 93672, 93679, 93686, - 93693, 93700, 93707, 93714, 93721, 93728, 93735, 93742, 93749, 93756, - 93763, 93770, 93777, 93784, 93791, 93798, 93805, 93812, 93819, 93826, - 93833, 93840, 93847, 93854, 93861, 93868, 93875, 93882, 93889, 93896, - 93903, 93910, 93917, 93924, 93931, 93938, 93945, 93952, 93959, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 93966, 93970, 93974, 93978, 93982, 93986, 93990, 93994, - 93998, 94002, 94007, 94012, 94017, 94022, 94027, 94032, 94037, 94042, - 94047, 94053, 94059, 94065, 94072, 94079, 94086, 94093, 94100, 94107, - 94114, 94121, 94128, 0, 94135, 94139, 94143, 94147, 94151, 94155, 94158, - 94162, 94165, 94169, 94172, 94176, 94180, 94185, 94189, 94194, 94197, - 94201, 94204, 94208, 94211, 94215, 94219, 94223, 94227, 94231, 94235, - 94239, 94243, 94247, 94251, 94255, 94259, 94263, 94267, 94271, 94275, - 94279, 94283, 94286, 94289, 94293, 94297, 94301, 94304, 94307, 94310, - 94314, 94318, 94322, 94326, 94329, 94332, 94336, 94342, 94348, 94354, - 94359, 94366, 94370, 94375, 94379, 94384, 94389, 94395, 94400, 94406, - 94410, 94415, 94419, 94424, 94427, 94430, 94434, 94439, 94445, 94450, - 94456, 0, 0, 0, 0, 94461, 94464, 94467, 94470, 94473, 94476, 94479, - 94482, 94485, 94488, 94492, 94496, 94500, 94504, 94508, 94512, 94516, - 94520, 94524, 94529, 94534, 94538, 94541, 94544, 94547, 94550, 94553, - 94556, 94559, 94562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94565, 94570, 94575, 94580, 94584, 94589, 94593, 94598, 94602, 94607, - 94611, 94616, 94620, 94625, 94629, 94634, 94639, 94644, 94649, 94654, - 94659, 94664, 94669, 94674, 94679, 94684, 94689, 94694, 94699, 94704, - 94709, 94714, 94719, 94724, 94729, 94733, 94737, 94742, 94747, 94752, - 94756, 94760, 94764, 94769, 94774, 94779, 94784, 94788, 94792, 94798, - 94803, 94809, 94814, 94820, 94825, 94831, 94836, 94842, 94847, 94852, - 94857, 94862, 94866, 94871, 94877, 94881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 94886, 94893, 94900, 94907, 94914, 94921, 94928, 94935, - 94942, 94949, 94956, 94963, 94970, 94977, 94984, 94991, 94998, 95005, - 95012, 95019, 95026, 95033, 95040, 95047, 95054, 0, 0, 0, 0, 0, 0, 0, - 95061, 95068, 95074, 95080, 95086, 95092, 95098, 95104, 95110, 95116, 0, - 0, 0, 0, 0, 0, 95122, 95127, 95132, 95137, 95142, 95146, 95150, 95154, - 95159, 95164, 95169, 95174, 95179, 95184, 95189, 95194, 95199, 95204, - 95209, 95214, 95219, 95224, 95229, 95234, 95239, 95244, 95249, 95254, - 95259, 95264, 95269, 95274, 95279, 95284, 95289, 95294, 95299, 95304, - 95309, 95314, 95319, 95324, 95330, 95335, 95341, 95346, 95352, 95357, - 95363, 95369, 95373, 95378, 95382, 0, 95386, 95391, 95395, 95399, 95403, - 95407, 95411, 95415, 95419, 95423, 95427, 95432, 95436, 95441, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 95446, 95450, 95454, 95458, 95461, 95465, - 95468, 95472, 95475, 95479, 95483, 95488, 95492, 95497, 95500, 95504, - 95507, 95511, 95514, 95518, 95522, 95526, 95530, 95534, 95538, 95542, - 95546, 95550, 95554, 95558, 95562, 95566, 95570, 95574, 95578, 95582, - 95586, 95589, 95592, 95596, 95600, 95604, 95607, 95610, 95613, 95617, - 95621, 95625, 95629, 95633, 95636, 95639, 95644, 95648, 95653, 95657, - 95662, 95667, 95673, 95678, 95684, 95688, 95693, 95697, 95702, 95706, - 95710, 95714, 95718, 95721, 95724, 95728, 95732, 0, 0, 0, 0, 0, 0, 0, - 95735, 95739, 95742, 95745, 95748, 95751, 95754, 95757, 95760, 95763, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95766, 95770, 95775, 95779, 95784, - 95788, 95793, 95797, 95802, 95806, 95811, 95815, 95820, 95825, 95830, - 95835, 95840, 95845, 95850, 95855, 95860, 95865, 95870, 95875, 95880, - 95885, 95890, 95895, 95900, 95905, 95909, 95913, 95918, 95923, 95928, - 95932, 95936, 95940, 95945, 95950, 95955, 95959, 95963, 95968, 95973, - 95978, 95984, 95989, 95995, 96000, 96006, 96011, 96017, 96022, 96028, - 96033, 0, 0, 0, 0, 0, 0, 0, 0, 96038, 96043, 96047, 96051, 96055, 96059, - 96063, 96067, 96071, 96075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96079, 96082, 96087, 96093, - 96101, 96106, 96112, 96120, 96126, 96132, 96136, 96140, 96147, 96156, - 96163, 96172, 96178, 96187, 96194, 96201, 96208, 96218, 96224, 96228, - 96235, 96244, 96254, 96261, 96268, 96272, 96276, 96283, 96293, 96297, - 96304, 96311, 96318, 96324, 96331, 96338, 96345, 96352, 96356, 96360, - 96364, 96371, 96375, 96382, 96389, 96403, 96412, 96416, 96420, 96424, - 96431, 96435, 96439, 96443, 96451, 96459, 96478, 96488, 96508, 96512, - 96516, 96520, 96524, 96528, 96532, 96536, 96543, 96547, 96550, 96554, - 96558, 96564, 96571, 96580, 96584, 96593, 96602, 96610, 96614, 96621, - 96625, 96629, 96633, 96637, 96648, 96657, 96666, 96675, 96684, 96696, - 96705, 96714, 96723, 96731, 96740, 96752, 96761, 96770, 96779, 96791, - 96800, 96809, 96821, 96830, 96839, 96851, 96860, 96864, 96868, 96872, - 96876, 96880, 96884, 96888, 96895, 96899, 96903, 96914, 96918, 96922, - 96929, 96935, 96941, 96945, 96952, 96956, 96960, 96964, 96968, 96972, - 96976, 96982, 96990, 96994, 96998, 97001, 97007, 97017, 97021, 97033, - 97040, 97047, 97054, 97061, 97067, 97071, 97075, 97079, 97083, 97090, - 97099, 97106, 97114, 97122, 97128, 97132, 97136, 97140, 97144, 97150, - 97159, 97171, 97178, 97185, 97194, 97205, 97211, 97220, 97229, 97236, - 97245, 97252, 97259, 97269, 97276, 97283, 97290, 97297, 97301, 97307, - 97311, 97322, 97330, 97339, 97351, 97358, 97365, 97375, 97382, 97391, - 97398, 97407, 97414, 97421, 97431, 97438, 97445, 97455, 97462, 97474, - 97483, 97490, 97497, 97504, 97513, 97523, 97536, 97543, 97553, 97563, - 97570, 97579, 97592, 97599, 97606, 97613, 97623, 97633, 97640, 97650, - 97657, 97664, 97674, 97680, 97687, 97694, 97701, 97711, 97718, 97725, - 97732, 97738, 97745, 97755, 97762, 97766, 97774, 97778, 97790, 97794, - 97808, 97812, 97816, 97820, 97824, 97830, 97837, 97845, 97849, 97853, - 97857, 97861, 97868, 97872, 97878, 97884, 97892, 97896, 97903, 97911, - 97915, 97919, 97925, 97929, 97938, 97947, 97954, 97964, 97970, 97974, - 97978, 97986, 97993, 98000, 98006, 98010, 98018, 98022, 98029, 98041, - 98048, 98058, 98064, 98068, 98077, 98084, 98093, 98097, 98101, 98108, - 98112, 98116, 98120, 98124, 98127, 98133, 98139, 98143, 98147, 98154, - 98161, 98168, 98175, 98182, 98189, 98196, 98203, 98209, 98213, 98217, - 98224, 98231, 98238, 98245, 98252, 98256, 98259, 98264, 98268, 98272, - 98281, 98290, 98294, 98298, 98304, 98310, 98327, 98333, 98337, 98346, - 98350, 98354, 98361, 98369, 98377, 98383, 98387, 98391, 98395, 98399, - 98402, 98408, 98415, 98425, 98432, 98439, 98446, 98452, 98459, 98466, - 98473, 98480, 98487, 98496, 98503, 98515, 98522, 98529, 98539, 98550, - 98557, 98564, 98571, 98578, 98585, 98592, 98599, 98606, 98613, 98620, - 98630, 98640, 98650, 98657, 98667, 98674, 98681, 98688, 98695, 98701, - 98708, 98715, 98722, 98729, 98736, 98743, 98750, 98757, 98763, 98770, - 98777, 98786, 98793, 98800, 98804, 98812, 98816, 98820, 98824, 98828, - 98832, 98839, 98843, 98852, 98856, 98863, 98871, 98875, 98879, 98883, - 98896, 98912, 98916, 98920, 98927, 98933, 98940, 98944, 98948, 98952, - 98956, 98960, 98967, 98971, 98989, 98993, 98997, 99004, 99008, 99012, - 99018, 99022, 99026, 99034, 99038, 99042, 99046, 99050, 99056, 99067, - 99076, 99085, 99092, 99099, 99110, 99117, 99124, 99131, 99138, 99145, - 99152, 99159, 99169, 99175, 99182, 99192, 99201, 99208, 99217, 99227, - 99234, 99241, 99248, 99255, 99267, 99274, 99281, 99288, 99295, 99302, - 99312, 99319, 99326, 99336, 99349, 99361, 99368, 99378, 99385, 99392, - 99399, 99413, 99419, 99427, 99437, 99447, 99454, 99461, 99467, 99471, - 99478, 99488, 99494, 99507, 99511, 99515, 99522, 99526, 99533, 99543, - 99547, 99551, 99555, 99559, 99563, 99570, 99574, 99581, 99588, 99595, - 99604, 99613, 99623, 99630, 99637, 99644, 99654, 99661, 99671, 99678, - 99688, 99695, 99702, 99712, 99722, 99729, 99735, 99743, 99751, 99757, - 99763, 99767, 99771, 99778, 99786, 99792, 99796, 99800, 99804, 99811, - 99823, 99826, 99833, 99839, 99843, 99847, 99851, 99855, 99859, 99863, - 99867, 99871, 99875, 99879, 99886, 99890, 99896, 99900, 99904, 99908, - 99914, 99921, 99928, 99935, 99946, 99954, 99958, 99964, 99973, 99980, - 99986, 99989, 99993, 99997, 100003, 100012, 100020, 100024, 100030, - 100034, 100038, 100042, 100048, 100055, 100061, 100065, 100071, 100075, - 100079, 100088, 100100, 100104, 100111, 100118, 100128, 100135, 100147, - 100154, 100161, 100168, 100179, 100189, 100202, 100212, 100219, 100223, - 100227, 100231, 100235, 100244, 100253, 100262, 100279, 100288, 100294, - 100301, 100309, 100322, 100326, 100335, 100344, 100353, 100362, 100373, - 100382, 100391, 100400, 100409, 100418, 100427, 100437, 100440, 100444, - 100448, 100452, 100456, 100460, 100466, 100473, 100480, 100487, 100493, - 100499, 100506, 100512, 100519, 100527, 100531, 100538, 100545, 100552, - 100560, 100563, 100567, 100571, 100575, 100578, 100584, 100588, 100594, - 100601, 100608, 100614, 100621, 100628, 100635, 100642, 100649, 100656, - 100663, 100670, 100677, 100684, 100691, 100698, 100705, 100712, 100718, - 100722, 100731, 100735, 100739, 100743, 100747, 100753, 100760, 100767, - 100774, 100781, 100788, 100794, 100802, 100806, 100810, 100814, 100818, - 100824, 100841, 100858, 100862, 100866, 100870, 100874, 100878, 100882, - 100888, 100895, 100899, 100905, 100912, 100919, 100926, 100933, 100940, - 100949, 100956, 100963, 100970, 100977, 100981, 100985, 100991, 101003, - 101007, 101011, 101020, 101024, 101028, 101032, 101038, 101042, 101046, - 101055, 101059, 101063, 101067, 101074, 101078, 101082, 101086, 101090, - 101094, 101098, 101102, 101106, 101112, 101119, 101126, 101132, 101136, - 101153, 101159, 101163, 101169, 101175, 101181, 101187, 101193, 101199, - 101203, 101207, 101211, 101217, 101221, 101227, 101231, 101235, 101242, - 101249, 101266, 101270, 101274, 101278, 101282, 101286, 101298, 101301, - 101306, 101311, 101326, 101336, 101348, 101352, 101356, 101360, 101366, - 101373, 101380, 101390, 101402, 101408, 101414, 101423, 101427, 101431, - 101438, 101448, 101455, 101461, 101465, 101469, 101476, 101482, 101486, - 101492, 101496, 101504, 101510, 101514, 101522, 101530, 101537, 101543, - 101550, 101557, 101567, 101577, 101581, 101585, 101589, 101593, 101599, - 101606, 101612, 101619, 101626, 101633, 101642, 101649, 101656, 101662, - 101669, 101676, 101683, 101690, 101697, 101704, 101710, 101717, 101724, - 101731, 101740, 101747, 101754, 101758, 101764, 101768, 101774, 101781, - 101788, 101795, 101799, 101803, 101807, 101811, 101815, 101822, 101826, - 101830, 101836, 101844, 101848, 101852, 101856, 101860, 101867, 101871, - 101875, 101883, 101887, 101891, 101895, 101899, 101905, 101909, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101913, 101919, 101925, 101932, - 101939, 101946, 101953, 101960, 101967, 101973, 101980, 101987, 101994, - 102001, 102008, 102015, 102021, 102027, 102033, 102039, 102045, 102051, - 102057, 102063, 102069, 102076, 102083, 102090, 102097, 102104, 102111, - 102117, 102123, 102129, 102136, 102143, 102149, 102155, 102164, 102171, - 102178, 102185, 102192, 102199, 102206, 102212, 102218, 102224, 102233, - 102240, 102247, 102258, 102269, 102275, 102281, 102287, 102296, 102303, - 102310, 102320, 102330, 102341, 102352, 102364, 102377, 102388, 102399, - 102411, 102424, 102435, 102446, 102457, 102468, 102479, 102491, 102499, - 102507, 102516, 102525, 102534, 102540, 102546, 102552, 102559, 102569, - 102576, 102586, 102591, 102596, 102602, 102608, 102616, 102624, 102633, - 102644, 102655, 102663, 102671, 102680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 102689, 102700, 102707, 102715, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 102723, 102727, 102731, 102735, 102739, 102743, 102747, 102751, 102755, - 102759, 102763, 102767, 102771, 102775, 102779, 102783, 102787, 102791, - 102795, 102799, 102803, 102807, 102811, 102815, 102819, 102823, 102827, - 102831, 102835, 102839, 102843, 102847, 102851, 102855, 102859, 102863, - 102867, 102871, 102875, 102879, 102883, 102887, 102891, 102895, 102899, - 102903, 102907, 102911, 102915, 102919, 102923, 102927, 102931, 102935, - 102939, 102943, 102947, 102951, 102955, 102959, 102963, 102967, 102971, - 102975, 102979, 102983, 102987, 102991, 102995, 102999, 103003, 103007, - 103011, 103015, 103019, 103023, 103027, 103031, 103035, 103039, 103043, - 103047, 103051, 103055, 103059, 103063, 103067, 103071, 103075, 103079, - 103083, 103087, 103091, 103095, 103099, 103103, 103107, 103111, 103115, - 103119, 103123, 103127, 103131, 103135, 103139, 103143, 103147, 103151, - 103155, 103159, 103163, 103167, 103171, 103175, 103179, 103183, 103187, - 103191, 103195, 103199, 103203, 103207, 103211, 103215, 103219, 103223, - 103227, 103231, 103235, 103239, 103243, 103247, 103251, 103255, 103259, - 103263, 103267, 103271, 103275, 103279, 103283, 103287, 103291, 103295, - 103299, 103303, 103307, 103311, 103315, 103319, 103323, 103327, 103331, - 103335, 103339, 103343, 103347, 103351, 103355, 103359, 103363, 103367, - 103371, 103375, 103379, 103383, 103387, 103391, 103395, 103399, 103403, - 103407, 103411, 103415, 103419, 103423, 103427, 103431, 103435, 103439, - 103443, 103447, 103451, 103455, 103459, 103463, 103467, 103471, 103475, - 103479, 103483, 103487, 103491, 103495, 103499, 103503, 103507, 103511, - 103515, 103519, 103523, 103527, 103531, 103535, 103539, 103543, 103547, - 103551, 103555, 103559, 103563, 103567, 103571, 103575, 103579, 103583, - 103587, 103591, 103595, 103599, 103603, 103607, 103611, 103615, 103619, - 103623, 103627, 103631, 103635, 103639, 103643, 103647, 103651, 103655, - 103659, 103663, 103667, 103671, 103675, 103679, 103683, 103687, 103691, - 103695, 103699, 103703, 103707, 103711, 103715, 103719, 103723, 103727, - 103731, 103735, 103739, 103743, 103747, 103751, 103755, 103759, 103763, - 103767, 103771, 103775, 103779, 103783, 103787, 103791, 103795, 103799, - 103803, 103807, 103811, 103815, 103819, 103823, 103827, 103831, 103835, - 103839, 103843, 103847, 103851, 103855, 103859, 103863, 103867, 103871, - 103875, 103879, 103883, 103887, 103891, 103895, 103899, 103903, 103907, - 103911, 103915, 103919, 103923, 103927, 103931, 103935, 103939, 103943, - 103947, 103951, 103955, 103959, 103963, 103967, 103971, 103975, 103979, - 103983, 103987, 103991, 103995, 103999, 104003, 104007, 104011, 104015, - 104019, 104023, 104027, 104031, 104035, 104039, 104043, 104047, 104051, - 104055, 104059, 104063, 104067, 104071, 104075, 104079, 104083, 104087, - 104091, 104095, 104099, 104103, 104107, 104111, 104115, 104119, 104123, - 104127, 104131, 104135, 104139, 104143, 104147, 104151, 104155, 104159, - 104163, 104167, 104171, 104175, 104179, 104183, 104187, 104191, 104195, - 104199, 104203, 104207, 104211, 104215, 104219, 104223, 104227, 104231, - 104235, 104239, 104243, 104247, 104251, 104255, 104259, 104263, 104267, - 104271, 104275, 104279, 104283, 104287, 104291, 104295, 104299, 104303, - 104307, 104311, 104315, 104319, 104323, 104327, 104331, 104335, 104339, - 104343, 104347, 104351, 104355, 104359, 104363, 104367, 104371, 104375, - 104379, 104383, 104387, 104391, 104395, 104399, 104403, 104407, 104411, - 104415, 104419, 104423, 104427, 104431, 104435, 104439, 104443, 104447, - 104451, 104455, 104459, 104463, 104467, 104471, 104475, 104479, 104483, - 104487, 104491, 104495, 104499, 104503, 104507, 104511, 104515, 104519, - 104523, 104527, 104531, 104535, 104539, 104543, 104547, 104551, 104555, - 104559, 104563, 104567, 104571, 104575, 104579, 104583, 104587, 104591, - 104595, 104599, 104603, 104607, 104611, 104615, 104619, 104623, 104627, - 104631, 104635, 104639, 104643, 104647, 104651, 104655, 104659, 104663, - 104667, 104671, 104675, 104679, 104683, 104687, 104691, 104695, 104699, - 104703, 104707, 104711, 104715, 104719, 104723, 104727, 104731, 104735, - 104739, 104743, 104747, 104751, 104755, 104759, 104763, 104767, 104771, - 104775, 104779, 104783, 104787, 104791, 104795, 104799, 104803, 104807, - 104811, 104815, 104819, 104823, 104827, 104831, 104835, 104839, 104843, - 104847, 104851, 104855, 104859, 104863, 104867, 104871, 104875, 104879, - 104883, 104887, 104891, 104895, 104899, 104903, 104907, 104911, 104915, - 104919, 104923, 104927, 104931, 104935, 104939, 104943, 104947, 104951, - 104955, 104959, 104963, 104967, 104971, 104975, 104979, 104983, 104987, - 104991, 104995, 104999, 105003, 105007, 105011, 105015, 105019, 105023, - 105027, 105031, 105035, 105039, 105043, 105047, 105051, 105055, 105059, - 105063, 105067, 105071, 105075, 105079, 105083, 105087, 105091, 105095, - 105099, 105103, 105107, 105111, 105115, 105119, 105123, 105127, 105131, - 105135, 105139, 105143, 105147, 105151, 105155, 105159, 105163, 105167, - 105171, 105175, 105179, 105183, 105187, 105191, 105195, 105199, 105203, - 105207, 105211, 105215, 105219, 105223, 105227, 105231, 105235, 105239, - 105243, 105247, 105251, 105255, 105259, 105263, 105267, 105271, 105275, - 105279, 105283, 105287, 105291, 105295, 105299, 105303, 105307, 105311, - 105315, 105319, 105323, 105327, 105331, 105335, 105339, 105343, 105347, - 105351, 105355, 105359, 105363, 105367, 105371, 105375, 105379, 105383, - 105387, 105391, 105395, 105399, 105403, 105407, 105411, 105415, 105419, - 105423, 105427, 105431, 105435, 105439, 105443, 105447, 105451, 105455, - 105459, 105463, 105467, 105471, 105475, 105479, 105483, 105487, 105491, - 105495, 105499, 105503, 105507, 105511, 105515, 105519, 105523, 105527, - 105531, 105535, 105539, 105543, 105547, 105551, 105555, 105559, 105563, - 105567, 105571, 105575, 105579, 105583, 105587, 105591, 105595, 105599, - 105603, 105607, 105611, 105615, 105619, 105623, 105627, 105631, 105635, - 105639, 105643, 105647, 105651, 105655, 105659, 105663, 105667, 105671, - 105675, 105679, 105683, 105687, 105691, 105695, 105699, 105703, 105707, - 105711, 105715, 105719, 105723, 105727, 105731, 105735, 105739, 105743, - 105747, 105751, 105755, 105759, 105763, 105767, 105771, 105775, 105779, - 105783, 105787, 105791, 105795, 105799, 105803, 105807, 105811, 105815, - 105819, 105823, 105827, 105831, 105835, 105839, 105843, 105847, 105851, - 105855, 105859, 105863, 105867, 105871, 105875, 105879, 105883, 105887, - 105891, 105895, 105899, 105903, 105907, 105911, 105915, 105919, 105923, - 105927, 105931, 105935, 105939, 105943, 105947, 105951, 105955, 105959, - 105963, 105967, 105971, 105975, 105979, 105983, 105987, 105991, 105995, - 105999, 106003, 106007, 106011, 106015, 106019, 106023, 106027, 106031, - 106035, 106039, 106043, 106047, 106051, 106055, 106059, 106063, 106067, - 106071, 106075, 106079, 106083, 106087, 106091, 106095, 106099, 106103, - 106107, 106111, 106115, 106119, 106123, 106127, 106131, 106135, 106139, - 106143, 106147, 106151, 106155, 106159, 106163, 106167, 106171, 106175, - 106179, 106183, 106187, 106191, 106195, 106199, 106203, 106207, 106211, - 106215, 106219, 106223, 106227, 106231, 106235, 106239, 106243, 106247, - 106251, 106255, 106259, 106263, 106267, 106271, 106275, 106279, 106283, - 106287, 106291, 106295, 106299, 106303, 106307, 106311, 106315, 106319, - 106323, 106327, 106331, 106335, 106339, 106343, 106347, 106351, 106355, - 106359, 106363, 106367, 106371, 106375, 106379, 106383, 106387, 106391, - 106395, 106399, 106403, 106407, 106411, 106415, 106419, 106423, 106427, - 106431, 106435, 106439, 106443, 106447, 106451, 106455, 106459, 106463, - 106467, 106471, 106475, 106479, 106483, 106487, 106491, 106495, 106499, - 106503, 106507, 106511, 106515, 106519, 106523, 106527, 106531, 106535, - 106539, 106543, 106547, 106551, 106555, 106559, 106563, 106567, 106571, - 106575, 106579, 106583, 106587, 106591, 106595, 106599, 106603, 106607, - 106611, 106615, 106619, 106623, 106627, 106631, 106635, 106639, 106643, - 106647, 106651, 106655, 106659, 106663, 106667, 106671, 106675, 106679, - 106683, 106687, 106691, 106695, 106699, 106703, 106707, 106711, 106715, - 106719, 106723, 106727, 106731, 106735, 106739, 106743, 106747, 106751, - 106755, 106759, 106763, 106767, 106771, 106775, 106779, 106783, 106787, - 106791, 106795, 106799, 106803, 106807, 106811, 106815, 106819, 106823, - 106827, 106831, 106835, 106839, 106843, 106847, 106851, 106855, 106859, - 106863, 106867, 106871, 106875, 106879, 106883, 106887, 106891, 106895, - 106899, 106903, 106907, 106911, 106915, 106919, 106923, 106927, 106931, - 106935, 106939, 106943, 106947, 106951, 106955, 106959, 106963, 106967, - 106971, 106975, 106979, 106983, 106987, 106991, 106995, 106999, 107003, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 107007, 107014, 107021, 107030, 107039, - 107046, 107051, 107058, 107065, 107074, 107085, 107096, 107101, 107108, - 107113, 107118, 107123, 107128, 107133, 107138, 107143, 107148, 107153, - 107158, 107163, 107170, 107177, 107182, 107187, 107192, 107197, 107204, - 107211, 107219, 107224, 107231, 107236, 107241, 107246, 107251, 107256, - 107263, 107270, 107275, 107280, 107285, 107290, 107295, 107300, 107305, - 107310, 107315, 107320, 107325, 107330, 107335, 107340, 107345, 107350, - 107355, 107360, 107365, 107372, 107377, 107382, 107391, 107398, 107403, - 107408, 107413, 107418, 107423, 107428, 107433, 107438, 107443, 107448, - 107453, 107458, 107463, 107468, 107473, 107478, 107483, 107488, 107493, - 107498, 107503, 107509, 107517, 107523, 107531, 107539, 107547, 107553, - 107559, 107565, 107571, 107577, 107585, 107595, 107603, 107611, 107617, - 107623, 107631, 107639, 107645, 107653, 107661, 107669, 107675, 107681, - 107687, 107693, 107699, 107705, 107713, 107721, 107727, 107733, 107739, - 107745, 107751, 107759, 107765, 107771, 107777, 107783, 107789, 107795, - 107803, 107809, 107815, 107821, 107827, 107835, 107843, 107849, 107855, - 107861, 107866, 107872, 107878, 107885, 107890, 107895, 107900, 107905, - 107910, 107915, 107920, 107925, 107930, 107939, 107946, 107951, 107956, - 107961, 107968, 107973, 107978, 107983, 107990, 107995, 108000, 108005, - 108010, 108015, 108020, 108025, 108030, 108035, 108040, 108045, 108052, - 108057, 108064, 108069, 108074, 108081, 108086, 108091, 108096, 108101, - 108106, 108111, 108116, 108121, 108126, 108131, 108136, 108141, 108146, - 108151, 108156, 108161, 108166, 108171, 108176, 108183, 108188, 108193, - 108198, 108203, 108208, 108213, 108218, 108223, 108228, 108233, 108238, - 108243, 108248, 108255, 108260, 108265, 108272, 108277, 108282, 108287, - 108292, 108297, 108302, 108307, 108312, 108317, 108322, 108329, 108334, - 108339, 108344, 108349, 108354, 108361, 108368, 108373, 108378, 108383, - 108388, 108393, 108398, 108403, 108408, 108413, 108418, 108423, 108428, - 108433, 108438, 108443, 108448, 108453, 108458, 108463, 108468, 108473, - 108478, 108483, 108488, 108493, 108498, 108503, 108508, 108513, 108518, - 108523, 108528, 108533, 108538, 108543, 108548, 108555, 108560, 108565, - 108570, 108575, 108580, 108585, 108590, 108595, 108600, 108605, 108610, - 108615, 108620, 108625, 108630, 108635, 108640, 108645, 108650, 108655, - 108660, 108665, 108670, 108675, 108680, 108685, 108690, 108695, 108700, - 108705, 108710, 108715, 108720, 108725, 108730, 108735, 108740, 108745, - 108750, 108755, 108760, 108765, 108770, 108775, 108780, 108785, 108790, - 108795, 108800, 108805, 108810, 108815, 108820, 108825, 108830, 108835, - 108840, 108845, 108852, 108857, 108862, 108867, 108872, 108877, 108882, - 108886, 108891, 108896, 108901, 108906, 108911, 108916, 108921, 108926, - 108931, 108936, 108941, 108946, 108951, 108956, 108963, 108968, 108973, - 108979, 108984, 108989, 108994, 108999, 109004, 109009, 109014, 109019, - 109024, 109029, 109034, 109039, 109044, 109049, 109054, 109059, 109064, - 109069, 109074, 109079, 109084, 109089, 109094, 109099, 109104, 109109, - 109114, 109119, 109124, 109129, 109134, 109139, 109144, 109149, 109154, - 109159, 109164, 109169, 109174, 109179, 109184, 109189, 109194, 109201, - 109206, 109211, 109218, 109225, 109230, 109235, 109240, 109245, 109250, - 109255, 109260, 109265, 109270, 109275, 109280, 109285, 109290, 109295, - 109300, 109305, 109310, 109315, 109320, 109325, 109330, 109335, 109340, - 109345, 109350, 109357, 109362, 109367, 109372, 109377, 109382, 109387, - 109392, 109397, 109402, 109407, 109412, 109417, 109422, 109427, 109432, - 109437, 109442, 109447, 109454, 109459, 109464, 109469, 109474, 109479, - 109484, 109489, 109495, 109500, 109505, 109510, 109515, 109520, 109525, - 109530, 109535, 109542, 109549, 109554, 109559, 109563, 109568, 109572, - 109576, 109581, 109588, 109593, 109598, 109607, 109612, 109617, 109622, - 109627, 109634, 109641, 109646, 109651, 109656, 109661, 109668, 109673, - 109678, 109683, 109688, 109693, 109698, 109703, 109708, 109713, 109718, - 109723, 109728, 109735, 109739, 109744, 109749, 109754, 109759, 109763, - 109768, 109773, 109778, 109783, 109788, 109793, 109798, 109803, 109808, - 109814, 109820, 109826, 109832, 109838, 109844, 109850, 109856, 109862, - 109868, 109874, 109880, 109885, 109891, 109897, 109903, 109909, 109915, - 109921, 109927, 109933, 109939, 109945, 109951, 109956, 109962, 109968, - 109974, 109980, 109986, 109992, 109998, 110004, 110010, 110016, 110022, - 110028, 110034, 110040, 110046, 110052, 110058, 110064, 110070, 110076, - 110081, 110087, 110093, 110099, 110105, 110111, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110117, 110120, 110124, - 110128, 110132, 110135, 110139, 110144, 110148, 110152, 110156, 110160, - 110164, 110169, 110174, 110178, 110182, 110185, 110189, 110194, 110199, - 110203, 110207, 110211, 110215, 110219, 110223, 110227, 110231, 110235, - 110239, 110242, 110246, 110250, 110254, 110258, 110262, 110266, 110272, - 110275, 110279, 110283, 110287, 110291, 110295, 110299, 110303, 110307, - 110311, 110316, 110321, 110327, 110331, 110335, 110339, 110343, 110347, - 110351, 110356, 110359, 110363, 110367, 110371, 110375, 110381, 110385, - 110389, 110393, 110397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110401, 110405, - 110409, 110415, 110421, 110425, 110430, 110435, 110440, 110445, 110449, - 110454, 110459, 110464, 110468, 110473, 110478, 110483, 110487, 110492, - 110497, 110502, 110507, 110512, 110517, 110522, 110527, 110531, 110536, - 110541, 110546, 110551, 110556, 110561, 110566, 110571, 110576, 110581, - 110586, 110593, 110598, 110605, 110610, 110615, 110620, 110625, 110630, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110635, 110639, 110645, - 110648, 110651, 110655, 110659, 110663, 110667, 110671, 110675, 110679, - 110685, 110691, 110697, 110703, 110709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110715, 110720, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 110726, 110731, 110736, 110741, 110748, 110755, 110762, 110769, 110774, - 110779, 110784, 110789, 110796, 110801, 110808, 110815, 110820, 110825, - 110830, 110837, 110842, 110847, 110854, 110861, 110866, 110871, 110876, - 110883, 110890, 110897, 110902, 110907, 110914, 110921, 110928, 110935, - 110940, 110945, 110950, 110957, 110962, 110967, 110972, 110979, 110988, - 110995, 111000, 111005, 111010, 111015, 111020, 111025, 111034, 111041, - 111046, 111053, 111060, 111065, 111070, 111075, 111082, 111087, 111094, - 111101, 111106, 111111, 111116, 111123, 111130, 111135, 111140, 111147, - 111154, 111161, 111166, 111171, 111176, 111181, 111188, 111197, 111206, - 111211, 111218, 111227, 111232, 111237, 111242, 111247, 111254, 111261, - 111268, 111275, 111280, 111285, 111290, 111297, 111304, 111311, 111316, - 111321, 111328, 111333, 111340, 111345, 111352, 111357, 111364, 111371, - 111376, 111381, 111386, 111391, 111396, 111401, 111406, 111411, 111416, - 111423, 111430, 111437, 111444, 111451, 111460, 111465, 111470, 111477, - 111484, 111489, 111496, 111503, 111510, 111517, 111524, 111531, 111536, - 111541, 111546, 111551, 111556, 111565, 111574, 111583, 111592, 111601, - 111610, 111619, 111628, 111633, 111644, 111655, 111664, 111669, 111674, - 111679, 111684, 111693, 111700, 111707, 111714, 111721, 111728, 111735, - 111744, 111753, 111764, 111773, 111784, 111793, 111800, 111809, 111820, - 111829, 111838, 111847, 111856, 111863, 111870, 111877, 111886, 111895, - 111906, 111915, 111924, 111935, 111940, 111945, 111956, 111964, 111973, - 111982, 111991, 112002, 112011, 112020, 112031, 112042, 112053, 112064, - 112075, 112086, 112093, 112100, 112107, 112114, 112125, 112134, 112141, - 112148, 112155, 112166, 112177, 112188, 112199, 112210, 112221, 112232, - 112243, 112250, 112257, 112266, 112275, 112282, 112289, 112296, 112305, - 112314, 112323, 112330, 112339, 112348, 112357, 112364, 112371, 112376, - 112382, 112389, 112396, 112403, 112410, 112417, 112424, 112433, 112442, - 112451, 112460, 112467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112476, 112482, - 112487, 112492, 112499, 112505, 112511, 112517, 112523, 112529, 112535, - 112541, 112545, 112549, 112555, 112561, 112567, 112571, 112576, 112581, - 112585, 112589, 112592, 112598, 112604, 112610, 112616, 112622, 112628, - 112634, 112640, 112646, 112656, 112666, 112672, 112678, 112688, 112698, - 112704, 0, 0, 112710, 112718, 112723, 112728, 112734, 112740, 112746, - 112752, 112758, 112764, 112771, 112778, 112784, 112790, 112796, 112802, - 112808, 112814, 112820, 112826, 112831, 112837, 112843, 112849, 112855, - 112861, 112870, 112876, 112881, 112889, 112896, 112903, 112912, 112921, - 112930, 112939, 112948, 112957, 112966, 112975, 112985, 112995, 113003, - 113011, 113020, 113029, 113035, 113041, 113047, 113053, 113061, 113069, - 113073, 113079, 113084, 113090, 113096, 113102, 113108, 113114, 113123, - 113128, 113135, 113140, 113145, 113150, 113156, 113162, 113168, 113175, - 113180, 113185, 113190, 113195, 113200, 113206, 113212, 113218, 113224, - 113230, 113236, 113242, 113248, 113253, 113258, 113263, 113268, 113273, - 113278, 113283, 113288, 113294, 113300, 113305, 113310, 113315, 113320, - 113325, 113331, 113338, 113342, 113346, 113350, 113354, 113358, 113362, - 113366, 113370, 113378, 113388, 113392, 113396, 113402, 113408, 113414, - 113420, 113426, 113432, 113438, 113444, 113450, 113456, 113462, 113468, - 113474, 113480, 113484, 113488, 113495, 113501, 113507, 113513, 113518, - 113525, 113530, 113536, 113542, 113548, 113554, 113559, 113563, 113569, - 113573, 113577, 113581, 113587, 113593, 113597, 113603, 113609, 113615, - 113621, 113627, 113635, 113643, 113649, 113655, 113661, 113667, 113679, - 113691, 113705, 113717, 113729, 113743, 113757, 113771, 113775, 113783, - 113791, 113796, 113800, 113804, 113808, 113812, 113816, 113820, 113824, - 113830, 113836, 113842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113848, 113854, - 113860, 113866, 113872, 113878, 113884, 113890, 113896, 113902, 113908, - 113914, 113920, 113926, 113932, 113938, 113944, 113950, 113956, 113962, - 113968, 113974, 113980, 113986, 113992, 113998, 114004, 114010, 114016, - 114022, 114028, 114034, 114040, 114046, 114052, 114058, 114064, 114070, - 114076, 114082, 114088, 114094, 114100, 114106, 114112, 114118, 114124, - 114130, 114136, 114142, 114148, 114154, 114160, 114166, 114172, 114178, - 114184, 114190, 114196, 114202, 114208, 114214, 114220, 114226, 114232, - 114238, 114244, 114249, 114254, 114259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114263, 114268, 114275, 114282, 114289, 114296, 114301, 114305, 114311, - 114315, 114319, 114325, 114329, 114333, 114337, 114343, 114350, 114354, - 114358, 114362, 114366, 114370, 114374, 114380, 114384, 114388, 114392, - 114396, 114400, 114404, 114408, 114412, 114416, 114420, 114424, 114428, - 114433, 114437, 114441, 114445, 114449, 114453, 114457, 114461, 114465, - 114469, 114476, 114480, 114488, 114492, 114496, 114500, 114504, 114508, - 114512, 114516, 114523, 114527, 114531, 114535, 114539, 114543, 114549, - 114553, 114559, 114563, 114567, 114571, 114575, 114579, 114583, 114587, - 114591, 114595, 114599, 114603, 114607, 114611, 114615, 114619, 114623, - 114627, 114631, 114635, 114643, 114647, 114651, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 114655, 114663, 114671, 114679, 114687, 114695, 114703, 114711, - 114719, 114727, 114735, 114743, 114751, 114759, 114767, 114775, 114783, - 114791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114799, 114803, 114808, - 114813, 114818, 114822, 114827, 114832, 114837, 114841, 114846, 114851, - 114855, 114859, 114864, 114868, 114873, 114878, 114882, 114887, 114892, - 114896, 114901, 114906, 114911, 114916, 114921, 114925, 114930, 114935, - 114940, 114944, 114949, 114954, 114959, 114963, 114968, 114973, 114977, - 114981, 114986, 114990, 114995, 115000, 115004, 115009, 115014, 115018, - 115023, 115028, 115033, 115038, 115043, 115047, 115052, 115057, 115062, - 115066, 115071, 115076, 115081, 115085, 115090, 115095, 115099, 115103, - 115108, 115112, 115117, 115122, 115126, 115131, 115136, 115140, 115145, - 115150, 115155, 115160, 115165, 115169, 115174, 115179, 115184, 115188, - 115193, 0, 115198, 115202, 115207, 115212, 115216, 115220, 115225, - 115229, 115234, 115239, 115243, 115248, 115253, 115257, 115262, 115267, - 115272, 115277, 115282, 115287, 115293, 115299, 115305, 115310, 115316, - 115322, 115328, 115333, 115339, 115345, 115350, 115355, 115361, 115366, - 115372, 115378, 115383, 115389, 115395, 115400, 115406, 115412, 115418, - 115424, 115430, 115435, 115441, 115447, 115453, 115458, 115464, 115470, - 115476, 115481, 115487, 115493, 115498, 115503, 115509, 115514, 115520, - 115526, 115531, 115537, 115543, 115548, 115554, 115560, 115566, 115572, - 115578, 0, 115582, 115587, 0, 0, 115592, 0, 0, 115597, 115602, 0, 0, - 115607, 115612, 115616, 115621, 0, 115626, 115631, 115636, 115640, - 115645, 115650, 115655, 115660, 115665, 115669, 115674, 115679, 0, - 115684, 0, 115689, 115694, 115698, 115703, 115708, 115712, 115716, 0, - 115721, 115726, 115731, 115735, 115740, 115745, 115749, 115754, 115759, - 115764, 115769, 115774, 115779, 115785, 115791, 115797, 115802, 115808, - 115814, 115820, 115825, 115831, 115837, 115842, 115847, 115853, 115858, - 115864, 115870, 115875, 115881, 115887, 115892, 115898, 115904, 115910, - 115916, 115922, 115927, 115933, 115939, 115945, 115950, 115956, 115962, - 115968, 115973, 115979, 115985, 115990, 115995, 116001, 116006, 116012, - 116018, 116023, 116029, 116035, 116040, 116046, 116052, 116058, 116064, - 116070, 116074, 0, 116079, 116084, 116088, 116093, 0, 0, 116098, 116103, - 116108, 116112, 116116, 116121, 116125, 116130, 0, 116135, 116140, - 116145, 116149, 116154, 116159, 116164, 0, 116169, 116173, 116178, - 116183, 116188, 116192, 116197, 116202, 116207, 116211, 116216, 116221, - 116225, 116229, 116234, 116238, 116243, 116248, 116252, 116257, 116262, - 116266, 116271, 116276, 116281, 116286, 116291, 116295, 0, 116300, - 116305, 116309, 116314, 0, 116319, 116323, 116328, 116333, 116337, 0, - 116341, 0, 0, 0, 116345, 116350, 116355, 116359, 116364, 116369, 116374, - 0, 116379, 116383, 116388, 116393, 116398, 116402, 116407, 116412, - 116417, 116421, 116426, 116431, 116435, 116439, 116444, 116448, 116453, - 116458, 116462, 116467, 116472, 116476, 116481, 116486, 116491, 116496, - 116501, 116506, 116512, 116518, 116524, 116529, 116535, 116541, 116547, - 116552, 116558, 116564, 116569, 116574, 116580, 116585, 116591, 116597, - 116602, 116608, 116614, 116619, 116625, 116631, 116637, 116643, 116649, - 116654, 116660, 116666, 116672, 116677, 116683, 116689, 116695, 116700, - 116706, 116712, 116717, 116722, 116728, 116733, 116739, 116745, 116750, - 116756, 116762, 116767, 116773, 116779, 116785, 116791, 116797, 116801, - 116806, 116811, 116816, 116820, 116825, 116830, 116835, 116839, 116844, - 116849, 116853, 116857, 116862, 116866, 116871, 116876, 116880, 116885, - 116890, 116894, 116899, 116904, 116909, 116914, 116919, 116923, 116928, - 116933, 116938, 116942, 116947, 116952, 116957, 116961, 116966, 116971, - 116975, 116979, 116984, 116988, 116993, 116998, 117002, 117007, 117012, - 117016, 117021, 117026, 117031, 117036, 117041, 117046, 117052, 117058, - 117064, 117069, 117075, 117081, 117087, 117092, 117098, 117104, 117109, - 117114, 117120, 117125, 117131, 117137, 117142, 117148, 117154, 117159, - 117165, 117171, 117177, 117183, 117189, 117194, 117200, 117206, 117212, - 117217, 117223, 117229, 117235, 117240, 117246, 117252, 117257, 117262, - 117268, 117273, 117279, 117285, 117290, 117296, 117302, 117307, 117313, - 117319, 117325, 117331, 117337, 117342, 117348, 117354, 117360, 117365, - 117371, 117377, 117383, 117388, 117394, 117400, 117405, 117410, 117416, - 117421, 117427, 117433, 117438, 117444, 117450, 117455, 117461, 117467, - 117473, 117479, 117485, 117490, 117496, 117502, 117508, 117513, 117519, - 117525, 117531, 117536, 117542, 117548, 117553, 117558, 117564, 117569, - 117575, 117581, 117586, 117592, 117598, 117603, 117609, 117615, 117621, - 117627, 117633, 117639, 117646, 117653, 117660, 117666, 117673, 117680, - 117687, 117693, 117700, 117707, 117713, 117719, 117726, 117732, 117739, - 117746, 117752, 117759, 117766, 117772, 117779, 117786, 117793, 117800, - 117807, 117813, 117820, 117827, 117834, 117840, 117847, 117854, 117861, - 117867, 117874, 117881, 117887, 117893, 117900, 117906, 117913, 117920, - 117926, 117933, 117940, 117946, 117953, 117960, 117967, 117974, 117981, - 117986, 117992, 117998, 118004, 118009, 118015, 118021, 118027, 118032, - 118038, 118044, 118049, 118054, 118060, 118065, 118071, 118077, 118082, - 118088, 118094, 118099, 118105, 118111, 118117, 118123, 118129, 118134, - 118140, 118146, 118152, 118157, 118163, 118169, 118175, 118180, 118186, - 118192, 118197, 118202, 118208, 118213, 118219, 118225, 118230, 118236, - 118242, 118247, 118253, 118259, 118265, 118271, 118277, 118283, 0, 0, - 118290, 118295, 118300, 118305, 118310, 118315, 118320, 118325, 118330, - 118335, 118340, 118345, 118350, 118355, 118360, 118365, 118370, 118375, - 118381, 118386, 118391, 118396, 118401, 118406, 118411, 118416, 118420, - 118425, 118430, 118435, 118440, 118445, 118450, 118455, 118460, 118465, - 118470, 118475, 118480, 118485, 118490, 118495, 118500, 118505, 118511, - 118516, 118521, 118526, 118531, 118536, 118541, 118546, 118552, 118557, - 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597, 118602, - 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642, 118647, - 118652, 118657, 118662, 118667, 118673, 118678, 118683, 118688, 118693, - 118698, 118703, 118708, 118712, 118717, 118722, 118727, 118732, 118737, - 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777, 118782, - 118787, 118792, 118797, 118803, 118808, 118813, 118818, 118823, 118828, - 118833, 118838, 118844, 118849, 118854, 118859, 118864, 118869, 118874, - 118880, 118886, 118892, 118898, 118904, 118910, 118916, 118922, 118928, - 118934, 118940, 118946, 118952, 118958, 118964, 118970, 118976, 118983, - 118989, 118995, 119001, 119007, 119013, 119019, 119025, 119030, 119036, - 119042, 119048, 119054, 119060, 119066, 119072, 119078, 119084, 119090, - 119096, 119102, 119108, 119114, 119120, 119126, 119132, 119139, 119145, - 119151, 119157, 119163, 119169, 119175, 119181, 119188, 119194, 119200, - 119206, 119212, 119218, 119224, 119230, 119236, 119242, 119248, 119254, - 119260, 119266, 119272, 119278, 119284, 119290, 119296, 119302, 119308, - 119314, 119320, 119326, 119333, 119339, 119345, 119351, 119357, 119363, - 119369, 119375, 119380, 119386, 119392, 119398, 119404, 119410, 119416, - 119422, 119428, 119434, 119440, 119446, 119452, 119458, 119464, 119470, - 119476, 119482, 119489, 119495, 119501, 119507, 119513, 119519, 119525, - 119531, 119538, 119544, 119550, 119556, 119562, 119568, 119574, 119581, - 119588, 119595, 119602, 119609, 119616, 119623, 119630, 119637, 119644, - 119651, 119658, 119665, 119672, 119679, 119686, 119693, 119701, 119708, - 119715, 119722, 119729, 119736, 119743, 119750, 119756, 119763, 119770, - 119777, 119784, 119791, 119798, 119805, 119812, 119819, 119826, 119833, - 119840, 119847, 119854, 119861, 119868, 119875, 119883, 119890, 119897, - 119904, 119911, 119918, 119925, 119932, 119940, 119947, 119954, 119961, - 119968, 119975, 119982, 119987, 0, 0, 119992, 119997, 120001, 120005, - 120009, 120013, 120017, 120021, 120025, 120029, 120033, 120038, 120042, - 120046, 120050, 120054, 120058, 120062, 120066, 120070, 120074, 120079, - 120083, 120087, 120091, 120095, 120099, 120103, 120107, 120111, 120115, - 120121, 120126, 120131, 120136, 120141, 120146, 120151, 120156, 120161, - 120166, 120172, 120177, 120182, 120187, 120192, 120197, 120202, 120207, - 120212, 120217, 120221, 120225, 120229, 0, 120233, 120237, 120241, - 120245, 120249, 120253, 120257, 120261, 120265, 120269, 120273, 120277, - 120281, 120285, 120289, 120293, 120297, 120301, 120305, 120309, 120313, - 120317, 120321, 120325, 120331, 120337, 120343, 0, 120349, 120354, 0, - 120359, 0, 0, 120364, 0, 120369, 120374, 120379, 120384, 120389, 120394, - 120399, 120404, 120409, 120414, 0, 120419, 120424, 120429, 120434, 0, - 120439, 0, 120444, 0, 0, 0, 0, 0, 0, 120449, 0, 0, 0, 0, 120455, 0, - 120461, 0, 120467, 0, 120473, 120479, 120485, 0, 120491, 120497, 0, - 120503, 0, 0, 120509, 0, 120515, 0, 120521, 0, 120527, 0, 120535, 0, - 120543, 120549, 0, 120555, 0, 0, 120561, 120567, 120573, 120579, 0, - 120585, 120591, 120597, 120603, 120609, 120615, 120621, 0, 120627, - 120633, 120639, 120645, 0, 120651, 120657, 120663, 120669, 0, 120677, 0, - 120685, 120691, 120697, 120703, 120709, 120715, 120721, 120727, 120733, - 120739, 0, 120745, 120751, 120757, 120763, 120769, 120775, 120781, - 120787, 120793, 120799, 120805, 120811, 120817, 120823, 120829, 120835, - 120841, 0, 0, 0, 0, 0, 120847, 120852, 120857, 0, 120862, 120867, 120872, - 120877, 120882, 0, 120887, 120892, 120897, 120902, 120907, 120912, - 120917, 120922, 120927, 120932, 120937, 120942, 120947, 120952, 120957, - 120962, 120967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 120972, 120982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 120990, 120997, 121004, 121011, 121018, 121025, 121032, - 121038, 121045, 121052, 121059, 121067, 121075, 121083, 121091, 121099, - 121107, 121114, 121121, 121128, 121136, 121144, 121152, 121160, 121168, - 121176, 121183, 121190, 121197, 121205, 121213, 121221, 121229, 121237, - 121245, 121250, 121255, 121260, 121265, 121270, 121275, 121280, 121285, - 121290, 0, 0, 0, 0, 121295, 121300, 121304, 121308, 121312, 121316, - 121320, 121324, 121328, 121332, 121336, 121340, 121344, 121348, 121352, - 121356, 121360, 121364, 121368, 121372, 121376, 121380, 121384, 121388, - 121392, 121396, 121400, 121404, 121408, 121412, 121416, 121420, 121424, - 121428, 121432, 121436, 121440, 121444, 121448, 121452, 121456, 121460, - 121464, 121468, 121472, 121476, 121480, 121484, 121488, 121492, 121496, - 121501, 121505, 121509, 121513, 121517, 121521, 121525, 121529, 121533, - 121537, 121541, 121545, 121549, 121553, 121557, 121561, 121565, 121569, - 121573, 121577, 121581, 121585, 121589, 121593, 121597, 121601, 121605, - 121609, 121613, 121617, 121621, 121625, 121629, 121633, 121637, 121641, - 121645, 121649, 121653, 121657, 121661, 121665, 121669, 121673, 121677, - 121681, 121685, 121689, 121693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 121697, 121703, 121712, 121720, 121728, 121737, 121746, 121755, 121764, - 121773, 121782, 121791, 121800, 121809, 121818, 0, 0, 121827, 121836, - 121844, 121852, 121861, 121870, 121879, 121888, 121897, 121906, 121915, - 121924, 121933, 121942, 0, 0, 121951, 121960, 121968, 121976, 121985, - 121994, 122003, 122012, 122021, 122030, 122039, 122048, 122057, 122066, - 122075, 0, 122082, 122091, 122099, 122107, 122116, 122125, 122134, - 122143, 122152, 122161, 122170, 122179, 122188, 122197, 122206, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122213, 122220, 122225, 122229, 122233, 122237, 122242, - 122247, 122252, 122257, 122262, 0, 0, 0, 0, 0, 122267, 122272, 122278, - 122284, 122290, 122295, 122301, 122307, 122313, 122318, 122324, 122330, - 122335, 122340, 122346, 122351, 122357, 122363, 122368, 122374, 122380, - 122385, 122391, 122397, 122403, 122409, 122415, 122426, 122433, 122439, - 122442, 0, 122445, 122450, 122456, 122462, 122468, 122473, 122479, - 122485, 122491, 122496, 122502, 122508, 122513, 122518, 122524, 122529, - 122535, 122541, 122546, 122552, 122558, 122563, 122569, 122575, 122581, - 122587, 122593, 122596, 122599, 122602, 122605, 122608, 122611, 122617, - 122624, 122631, 122638, 122644, 122651, 122658, 122665, 122671, 122678, - 122685, 122691, 122697, 122704, 122710, 122717, 122724, 122730, 122737, - 122744, 122750, 122757, 122764, 122771, 122778, 122785, 122790, 0, 0, 0, - 0, 122795, 122801, 122808, 122815, 122822, 122828, 122835, 122842, - 122849, 122855, 122862, 122869, 122875, 122881, 122888, 122894, 122901, - 122908, 122914, 122921, 122928, 122934, 122941, 122948, 122955, 122962, - 122969, 122978, 122982, 122985, 122988, 122992, 122996, 122999, 123002, - 123005, 123008, 123011, 123014, 123017, 123020, 123023, 123029, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 123032, 123039, 123047, 123055, 123063, 123070, 123078, 123086, 123094, - 123101, 123109, 123117, 123124, 123131, 123139, 123146, 123154, 123162, - 123169, 123177, 123185, 123192, 123200, 123208, 123216, 123224, 123232, - 123236, 123240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123243, 123249, - 123255, 123261, 123265, 123271, 123277, 123283, 123289, 123295, 123301, - 123307, 123313, 123319, 123325, 123331, 123337, 123343, 123349, 123355, - 123361, 123367, 123373, 123379, 123385, 123391, 123397, 123403, 123409, - 123415, 123421, 123427, 123433, 123439, 123445, 123451, 123457, 123463, - 123469, 123475, 123481, 123487, 123493, 0, 0, 0, 0, 0, 123499, 123510, - 123521, 123532, 123543, 123554, 123565, 123576, 123587, 0, 0, 0, 0, 0, 0, - 0, 123598, 123602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 123606, 123608, 123610, 123614, 123619, 123624, 123626, - 123632, 123637, 123639, 123645, 123649, 123651, 123655, 123661, 123667, - 123673, 123678, 123682, 123689, 123696, 123703, 123708, 123715, 123722, - 123729, 123733, 123739, 123748, 123757, 123764, 123769, 123773, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123777, 123779, 123781, 123785, - 123789, 123793, 0, 123795, 123797, 123801, 123803, 123805, 123807, - 123809, 123814, 123819, 123821, 123827, 123831, 123835, 123843, 123845, - 123847, 123849, 123851, 123853, 123855, 123857, 123859, 123861, 123863, - 123867, 123871, 123873, 123875, 123877, 123879, 123881, 123886, 123892, - 123896, 123900, 123904, 123908, 123913, 123917, 123919, 123921, 123925, - 123931, 123933, 123935, 123937, 123941, 123950, 123956, 123960, 123964, - 123966, 123968, 123971, 123973, 123975, 123977, 123981, 123983, 123987, - 123992, 123994, 123999, 124005, 124012, 124016, 124020, 124024, 124028, - 124034, 0, 0, 0, 124038, 124040, 124044, 124048, 124050, 124054, 124058, - 124060, 124064, 124066, 124070, 124074, 124078, 124082, 124086, 124090, - 124094, 124098, 124104, 124108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124112, 124116, 124120, 124124, 124131, 124133, 124137, 124139, 124141, - 124145, 124149, 124153, 124155, 124159, 124163, 124167, 124171, 124175, - 124177, 124181, 124183, 124189, 124192, 124197, 124199, 124201, 124204, - 124206, 124208, 124211, 124218, 124225, 124232, 124237, 124241, 124243, - 124245, 0, 124247, 124249, 124253, 124257, 124261, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124263, 124267, 124272, 124276, - 124282, 124288, 124290, 124292, 124298, 124300, 124304, 124308, 124310, - 124314, 124316, 124320, 124324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 124328, 124330, 124332, 124334, 124338, 124340, 124342, 124344, - 124346, 124348, 124350, 124352, 124354, 124356, 124358, 124360, 124362, - 124364, 124366, 124368, 124370, 124372, 124374, 124376, 124378, 124380, - 124382, 124386, 124388, 124390, 124392, 124396, 124398, 124402, 124404, - 124406, 124410, 124414, 124420, 124422, 124424, 124426, 124428, 124432, - 124436, 124438, 124442, 124446, 124450, 124454, 124458, 124462, 124466, - 124470, 124474, 124478, 124482, 124486, 124490, 124494, 124498, 124502, - 124506, 0, 124510, 0, 124512, 124514, 124516, 124518, 124520, 124528, - 124536, 124544, 124552, 124557, 124562, 124567, 124571, 124575, 124580, - 124584, 124586, 124590, 124592, 124594, 124596, 124598, 124600, 124602, - 124604, 124608, 124610, 124612, 124614, 124618, 124622, 124626, 124630, - 124634, 124636, 124642, 124648, 124650, 124652, 124654, 124656, 124658, - 124667, 124674, 124681, 124685, 124692, 124697, 124704, 124713, 124718, - 124722, 124726, 124728, 124732, 124734, 124738, 124742, 124744, 124748, - 124752, 124756, 124758, 124760, 124766, 124768, 124770, 124772, 124776, - 124780, 124782, 124786, 124788, 124790, 124793, 124797, 124799, 124803, - 124805, 124807, 124812, 124814, 124818, 124822, 124825, 124829, 124833, - 124837, 124841, 124845, 124849, 124853, 124858, 124862, 124866, 124875, - 124880, 124883, 124885, 124888, 124891, 124896, 124898, 124901, 124906, - 124910, 124913, 124917, 124921, 124924, 124929, 124933, 124937, 124941, - 124945, 124951, 124957, 124963, 124969, 124974, 124985, 124987, 124991, - 124993, 124995, 124999, 125003, 125005, 125009, 125014, 125019, 125025, - 125027, 125031, 125035, 125042, 125049, 125053, 125055, 125057, 125061, - 125063, 125067, 125071, 125075, 125077, 125079, 125086, 125090, 125093, - 125097, 125101, 125105, 125107, 125111, 125113, 125115, 125119, 125121, - 125125, 125129, 125135, 125139, 125143, 125147, 125149, 125152, 125156, - 125163, 125172, 125181, 125189, 125197, 125199, 125203, 125205, 125209, - 125220, 125224, 125230, 125236, 125241, 0, 125243, 125247, 125249, - 125251, 0, 0, 0, 125253, 125258, 125268, 125283, 125295, 125307, 125311, - 125315, 125321, 125323, 125331, 125339, 125341, 125345, 125351, 125357, - 125364, 125371, 125373, 125375, 125378, 125380, 125386, 125388, 125391, - 125395, 125401, 125407, 125418, 125424, 125431, 125439, 125443, 125451, - 125459, 125465, 125471, 125478, 125480, 125484, 125486, 125488, 125493, - 125495, 125497, 125499, 125501, 125505, 125516, 125522, 125526, 125530, - 125534, 125540, 125546, 125552, 125558, 125563, 125568, 125574, 125580, - 125587, 0, 0, 125594, 125599, 125607, 125611, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 125620, 125627, 125634, 125641, 125649, 125657, 125665, 125673, - 125681, 125689, 125697, 125705, 125713, 125719, 125725, 125731, 125737, - 125743, 125749, 125755, 125761, 125767, 125773, 125779, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125785, - 125789, 125793, 125798, 125803, 125805, 125809, 125818, 125826, 125834, - 125847, 125860, 125873, 125880, 125887, 125891, 125900, 125908, 125912, - 125921, 125928, 125932, 125936, 125940, 125944, 125951, 125955, 125959, - 125963, 125967, 125974, 125983, 125992, 125999, 126011, 126023, 126027, - 126031, 126035, 126039, 126043, 126047, 126055, 126063, 126071, 126075, - 126079, 126083, 126087, 126091, 126095, 126101, 126107, 126111, 126122, - 126130, 126134, 126138, 126142, 126146, 126152, 126159, 126170, 126180, - 126190, 126201, 126210, 126221, 126227, 126233, 0, 0, 0, 0, 126239, - 126248, 126255, 126261, 126265, 126269, 126273, 126282, 126294, 126298, - 126305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 126312, 126314, 126316, 126320, 126324, 126328, 126337, 126339, - 126341, 126344, 126346, 126348, 126352, 126354, 126358, 126360, 126364, - 126366, 126368, 126372, 126376, 126382, 126384, 126388, 126390, 126394, - 126398, 126402, 126406, 126408, 126410, 126414, 126418, 126422, 126426, - 126428, 126430, 126432, 126437, 126442, 126445, 126453, 126461, 126463, - 126468, 126471, 126476, 126487, 126494, 126499, 126504, 126506, 126510, - 126512, 126516, 126518, 126522, 126526, 126529, 126532, 126534, 126537, - 126539, 126543, 126545, 126547, 126549, 126553, 126555, 126559, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 126562, 126567, 126572, 126577, 126582, 126587, - 126592, 126599, 126606, 126613, 126620, 126625, 126630, 126635, 126640, - 126647, 126653, 126660, 126667, 126674, 126679, 126684, 126689, 126694, - 126699, 126706, 126713, 126718, 126723, 126730, 126737, 126745, 126753, - 126760, 126767, 126775, 126783, 126791, 126798, 126808, 126819, 126824, - 126831, 126838, 126845, 126853, 126861, 126872, 126880, 126888, 126896, - 126901, 126906, 126911, 126916, 126921, 126926, 126931, 126936, 126941, - 126946, 126951, 126956, 126963, 126968, 126973, 126980, 126985, 126990, - 126995, 127000, 127005, 127010, 127015, 127020, 127025, 127030, 127035, - 127040, 127047, 127055, 127060, 127065, 127072, 127077, 127082, 127087, - 127094, 127099, 127106, 127111, 127118, 127123, 127132, 127141, 127146, - 127151, 127156, 127161, 127166, 127171, 127176, 127181, 127186, 127191, - 127196, 127201, 127206, 127214, 127222, 127227, 127232, 127237, 127242, - 127247, 127253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127259, 127263, - 127267, 127271, 127275, 127279, 127283, 127287, 127291, 127295, 127299, - 127303, 127307, 127311, 127315, 127319, 127323, 127327, 127331, 127335, - 127339, 127343, 127347, 127351, 127355, 127359, 127363, 127367, 127371, - 127375, 127379, 127383, 127387, 127391, 127395, 127399, 127403, 127407, - 127411, 127415, 127419, 127423, 127427, 127431, 127435, 127439, 127443, - 127447, 127451, 127455, 127459, 127463, 127467, 127471, 127475, 127479, - 127483, 127487, 127491, 127495, 127499, 127503, 127507, 127511, 127515, - 127519, 127523, 127527, 127531, 127535, 127539, 127543, 127547, 127551, - 127555, 127559, 127563, 127567, 127571, 127575, 127579, 127583, 127587, - 127591, 127595, 127599, 127603, 127607, 127611, 127615, 127619, 127623, - 127627, 127631, 127635, 127639, 127643, 127647, 127651, 127655, 127659, - 127663, 127667, 127671, 127675, 127679, 127683, 127687, 127691, 127695, - 127699, 127703, 127707, 127711, 127715, 127719, 127723, 127727, 127731, - 127735, 127739, 127743, 127747, 127751, 127755, 127759, 127763, 127767, - 127771, 127775, 127779, 127783, 127787, 127791, 127795, 127799, 127803, - 127807, 127811, 127815, 127819, 127823, 127827, 127831, 127835, 127839, - 127843, 127847, 127851, 127855, 127859, 127863, 127867, 127871, 127875, - 127879, 127883, 127887, 127891, 127895, 127899, 127903, 127907, 127911, - 127915, 127919, 127923, 127927, 127931, 127935, 127939, 127943, 127947, - 127951, 127955, 127959, 127963, 127967, 127971, 127975, 127979, 127983, - 127987, 127991, 127995, 127999, 128003, 128007, 128011, 128015, 128019, - 128023, 128027, 128031, 128035, 128039, 128043, 128047, 128051, 128055, - 128059, 128063, 128067, 128071, 128075, 128079, 128083, 128087, 128091, - 128095, 128099, 128103, 128107, 128111, 128115, 128119, 128123, 128127, - 128131, 128135, 128139, 128143, 128147, 128151, 128155, 128159, 128163, - 128167, 128171, 128175, 128179, 128183, 128187, 128191, 128195, 128199, - 128203, 128207, 128211, 128215, 128219, 128223, 128227, 128231, 128235, - 128239, 128243, 128247, 128251, 128255, 128259, 128263, 128267, 128271, - 128275, 128279, 128283, 128287, 128291, 128295, 128299, 128303, 128307, - 128311, 128315, 128319, 128323, 128327, 128331, 128335, 128339, 128343, - 128347, 128351, 128355, 128359, 128363, 128367, 128371, 128375, 128379, - 128383, 128387, 128391, 128395, 128399, 128403, 128407, 128411, 128415, - 128419, 128423, 128427, 128431, 128435, 128439, 128443, 128447, 128451, - 128455, 128459, 128463, 128467, 128471, 128475, 128479, 128483, 128487, - 128491, 128495, 128499, 128503, 128507, 128511, 128515, 128519, 128523, - 128527, 128531, 128535, 128539, 128543, 128547, 128551, 128555, 128559, - 128563, 128567, 128571, 128575, 128579, 128583, 128587, 128591, 128595, - 128599, 128603, 128607, 128611, 128615, 128619, 128623, 128627, 128631, - 128635, 128639, 128643, 128647, 128651, 128655, 128659, 128663, 128667, - 128671, 128675, 128679, 128683, 128687, 128691, 128695, 128699, 128703, - 128707, 128711, 128715, 128719, 128723, 128727, 128731, 128735, 128739, - 128743, 128747, 128751, 128755, 128759, 128763, 128767, 128771, 128775, - 128779, 128783, 128787, 128791, 128795, 128799, 128803, 128807, 128811, - 128815, 128819, 128823, 128827, 128831, 128835, 128839, 128843, 128847, - 128851, 128855, 128859, 128863, 128867, 128871, 128875, 128879, 128883, - 128887, 128891, 128895, 128899, 128903, 128907, 128911, 128915, 128919, - 128923, 128927, 128931, 128935, 128939, 128943, 128947, 128951, 128955, - 128959, 128963, 128967, 128971, 128975, 128979, 128983, 128987, 128991, - 128995, 128999, 129003, 129007, 129011, 129015, 129019, 129023, 129027, - 129031, 129035, 129039, 129043, 129047, 129051, 129055, 129059, 129063, - 129067, 129071, 129075, 129079, 129083, 129087, 129091, 129095, 129099, - 129103, 129107, 129111, 129115, 129119, 129123, 129127, 129131, 129135, - 129139, 129143, 129147, 129151, 129155, 129159, 129163, 129167, 129171, - 129175, 129179, 129183, 129187, 129191, 129195, 129199, 129203, 129207, - 129211, 129215, 129219, 129223, 129227, 129231, 129235, 129239, 129243, - 129247, 129251, 129255, 129259, 129263, 129267, 129271, 129275, 129279, - 129283, 129287, 129291, 129295, 129299, 129303, 129307, 129311, 129315, - 129319, 129323, 129327, 129331, 129335, 129339, 129343, 129347, 129351, - 129355, 129359, 129363, 129367, 129371, 129375, 129379, 129383, 129387, - 129391, 129395, 129399, 129403, 129407, 129411, 129415, 129419, 129423, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 129427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129431, 129434, 129438, 129442, 129445, - 129449, 129453, 129456, 129459, 129463, 129467, 129470, 129473, 129476, - 129479, 129484, 129487, 129491, 129494, 129497, 129500, 129503, 129506, - 129509, 129512, 129515, 129518, 129521, 129524, 129528, 129532, 129536, - 129540, 129545, 129550, 129556, 129562, 129568, 129573, 129579, 129585, - 129591, 129596, 129602, 129608, 129613, 129618, 129624, 129629, 129635, - 129641, 129646, 129652, 129658, 129663, 129669, 129675, 129681, 129687, - 129693, 129697, 129702, 129706, 129711, 129715, 129720, 129725, 129731, - 129737, 129743, 129748, 129754, 129760, 129766, 129771, 129777, 129783, - 129788, 129793, 129799, 129804, 129810, 129816, 129821, 129827, 129833, - 129838, 129844, 129850, 129856, 129862, 129868, 129873, 129877, 129882, - 129884, 129888, 129891, 129894, 129897, 129900, 129903, 129906, 129909, - 129912, 129915, 129918, 129921, 129924, 129927, 129930, 129933, 129936, - 129939, 129942, 129945, 129948, 129951, 129954, 129957, 129960, 129963, - 129966, 129969, 129972, 129975, 129978, 129981, 129984, 129987, 129990, - 129993, 129996, 129999, 130002, 130005, 130008, 130011, 130014, 130017, - 130020, 130023, 130026, 130029, 130032, 130035, 130038, 130041, 130044, - 130047, 130050, 130053, 130056, 130059, 130062, 130065, 130068, 130071, - 130074, 130077, 130080, 130083, 130086, 130089, 130092, 130095, 130098, - 130101, 130104, 130107, 130110, 130113, 130116, 130119, 130122, 130125, - 130128, 130131, 130134, 130137, 130140, 130143, 130146, 130149, 130152, - 130155, 130158, 130161, 130164, 130167, 130170, 130173, 130176, 130179, - 130182, 130185, 130188, 130191, 130194, 130197, 130200, 130203, 130206, - 130209, 130212, 130215, 130218, 130221, 130224, 130227, 130230, 130233, - 130236, 130239, 130242, 130245, 130248, 130251, 130254, 130257, 130260, - 130263, 130266, 130269, 130272, 130275, 130278, 130281, 130284, 130287, - 130290, 130293, 130296, 130299, 130302, 130305, 130308, 130311, 130314, - 130317, 130320, 130323, 130326, 130329, 130332, 130335, 130338, 130341, - 130344, 130347, 130350, 130353, 130356, 130359, 130362, 130365, 130368, - 130371, 130374, 130377, 130380, 130383, 130386, 130389, 130392, 130395, - 130398, 130401, 130404, 130407, 130410, 130413, 130416, 130419, 130422, - 130425, 130428, 130431, 130434, 130437, 130440, 130443, 130446, 130449, - 130452, 130455, 130458, 130461, 130464, 130467, 130470, 130473, 130476, - 130479, 130482, 130485, 130488, 130491, 130494, 130497, 130500, 130503, - 130506, 130509, 130512, 130515, 130518, 130521, 130524, 130527, 130530, - 130533, 130536, 130539, 130542, 130545, 130548, 130551, 130554, 130557, - 130560, 130563, 130566, 130569, 130572, 130575, 130578, 130581, 130584, - 130587, 130590, 130593, 130596, 130599, 130602, 130605, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130608, 130610, 130612, 130617, 130619, - 130624, 130626, 130631, 130633, 130638, 130640, 130642, 130644, 130646, - 130648, 130650, 130652, 130654, 130656, 130659, 130662, 130664, 130666, - 130670, 130673, 130678, 130680, 130682, 130684, 130688, 130691, 130693, - 130697, 130699, 130703, 130705, 130709, 130712, 130714, 130718, 130722, - 130724, 130730, 130732, 130737, 130739, 130744, 130746, 130751, 130753, - 130758, 130760, 130763, 130765, 130769, 130771, 130778, 130780, 130782, - 130784, 130789, 130791, 130793, 130795, 130797, 130799, 130804, 130808, - 130810, 130815, 130819, 130821, 130826, 130830, 130832, 130837, 130841, - 130843, 130845, 130847, 130849, 130853, 130855, 130860, 130862, 130868, - 130870, 130876, 130878, 130880, 130882, 130886, 130888, 130895, 130897, - 130904, 130906, 130911, 130916, 130918, 130924, 130930, 130932, 130938, - 130943, 130945, 130951, 130957, 130959, 130965, 130971, 130973, 130979, - 130983, 130985, 130990, 130992, 130994, 130999, 131001, 131003, 131009, - 131011, 131016, 131020, 131022, 131027, 131031, 131033, 131039, 131041, - 131045, 131047, 131051, 131053, 131060, 131067, 131069, 131076, 131083, - 131085, 131090, 131092, 131099, 131101, 131106, 131108, 131114, 131116, - 131120, 131122, 131128, 131130, 131134, 131136, 131142, 131144, 131146, - 131148, 131153, 131158, 131160, 131169, 131173, 131180, 131187, 131192, - 131197, 131209, 131211, 131213, 131215, 131217, 131219, 131221, 131223, - 131225, 131227, 131229, 131231, 131233, 131235, 131237, 131239, 131241, - 131243, 131249, 131256, 131261, 131266, 131277, 131279, 131281, 131283, - 131285, 131287, 131289, 131291, 131293, 131295, 131297, 131299, 131301, - 131303, 131305, 131307, 131309, 131314, 131316, 131318, 131329, 131331, - 131333, 131335, 131337, 131339, 131341, 131343, 131345, 131347, 131349, - 131351, 131353, 131355, 131357, 131359, 131361, 131363, 131365, 131367, - 131369, 131371, 131373, 131375, 131377, 131379, 131381, 131383, 131385, - 131387, 131389, 131391, 131393, 131395, 131397, 131399, 131401, 131403, - 131405, 131407, 131409, 131411, 131413, 131415, 131417, 131419, 131421, - 131423, 131425, 131427, 131429, 131431, 131433, 131435, 131437, 131439, - 131441, 131443, 131445, 131447, 131449, 131451, 131453, 131455, 131457, - 131459, 131461, 131463, 131465, 131467, 131469, 131471, 131473, 131475, - 131477, 131479, 131481, 131483, 131485, 131487, 131489, 131491, 131493, - 131495, 131497, 131499, 131501, 131503, 131505, 131507, 131509, 131511, - 131513, 131515, 131517, 131519, 131521, 131523, 131525, 131527, 131529, - 131531, 131533, 131535, 131537, 131539, 131541, 131543, 131545, 131547, - 131549, 131551, 131553, 131555, 131557, 131559, 131561, 131563, 131565, - 131567, 131569, 131571, 131573, 131575, 131577, 131579, 131581, 131583, - 131585, 131587, 131589, 131591, 131593, 131595, 131597, 131599, 131601, - 131603, 131605, 131607, 131609, 131611, 131613, 131615, 131617, 131619, - 131621, 131623, 131625, 131627, 131629, 131631, 131633, 131635, 131637, - 131639, 131641, 131643, 131645, 131647, 131649, 131651, 131653, 131655, - 131657, 131659, 131661, 131663, 131665, 131667, 131669, 131671, 131673, - 131675, 131677, 131679, 131681, 131683, 131685, 131687, 131689, 131691, - 131693, 131695, 131697, 131699, 131701, 131703, 131705, 131707, 131709, - 131711, 131713, 131715, 131717, 131719, 131721, 131723, 131725, 131727, - 131729, 131731, 131733, 131735, 131737, 131739, 131741, 131743, 131745, - 131747, 131749, 131751, 131753, 131755, 131757, 131759, 131761, 131763, - 131765, 131767, 131769, 131771, 131773, 131775, 131777, 131779, 131781, - 131783, 131785, 131787, 131789, 131791, 131793, 131795, 131797, 131799, - 131801, 131803, 131805, 131807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 131809, 131819, 131829, 131838, 131847, 131860, 131873, 131885, 131897, - 131907, 131917, 131927, 131937, 131948, 131959, 131969, 131978, 131987, - 131996, 132009, 132022, 132034, 132046, 132056, 132066, 132076, 132086, - 132095, 132104, 132113, 132122, 132131, 132140, 132149, 132158, 132167, - 132176, 132185, 132194, 132205, 132215, 132225, 132238, 132248, 132261, - 132268, 132278, 132285, 132292, 132299, 132306, 132313, 132320, 132329, - 132338, 132347, 132356, 132365, 132374, 132383, 132392, 132400, 132408, - 132415, 132425, 132434, 132442, 132449, 132459, 132468, 132472, 132476, - 132480, 132484, 132488, 132492, 132496, 132500, 132504, 132508, 132511, - 132515, 132518, 132521, 132525, 132529, 132533, 132537, 132541, 132545, - 132549, 132553, 132557, 132561, 132565, 132569, 132573, 132577, 132581, - 132585, 132589, 132593, 132597, 132601, 132605, 132609, 132613, 132617, - 132621, 132625, 132629, 132633, 132637, 132641, 132645, 132649, 132653, - 132657, 132661, 132665, 132669, 132673, 132677, 132681, 132685, 132689, - 132693, 132697, 132701, 132705, 132709, 132713, 132717, 132721, 132725, - 132729, 132733, 132737, 132741, 132745, 132749, 132753, 132757, 132761, - 132765, 132769, 132773, 132777, 132781, 132785, 132789, 132793, 132797, - 132801, 132805, 132809, 132813, 132817, 132821, 132825, 132829, 132833, - 132837, 132841, 132845, 132849, 132853, 132857, 132861, 132864, 132868, - 132872, 132876, 132880, 132884, 132888, 132892, 132896, 132900, 132904, - 132908, 132912, 132916, 132920, 132924, 132928, 132932, 132936, 132940, - 132944, 132948, 132952, 132956, 132960, 132964, 132968, 132972, 132976, - 132980, 132984, 132988, 132992, 132996, 133000, 133004, 133008, 133012, - 133016, 133020, 133024, 133028, 133032, 133036, 133040, 133044, 133048, - 133052, 133056, 133060, 133064, 133068, 133072, 133076, 133080, 133084, - 133088, 133092, 133096, 133100, 133104, 133108, 133112, 133116, 133120, - 133124, 133128, 133132, 133136, 133140, 133144, 133148, 133152, 133156, - 133160, 133164, 133168, 133172, 133176, 133180, 133184, 133188, 133192, - 133196, 133200, 133204, 133208, 133212, 133216, 133220, 133224, 133228, - 133232, 133236, 133240, 133244, 133248, 133252, 133256, 133260, 133264, - 133268, 133272, 133276, 133280, 133284, 133288, 133292, 133296, 133300, - 133304, 133308, 133312, 133316, 133320, 133324, 133328, 133332, 133336, - 133340, 133344, 133348, 133352, 133356, 133360, 133364, 133368, 133372, - 133376, 133380, 133384, 133388, 133392, 133396, 133400, 133404, 133408, - 133412, 133416, 133420, 133424, 133428, 133432, 133436, 133440, 133444, - 133448, 133452, 133456, 133460, 133464, 133468, 133472, 133476, 133480, - 133484, 133488, 133492, 133496, 133500, 133504, 133508, 133512, 133516, - 133520, 133524, 133528, 133532, 133536, 133540, 133544, 133548, 133552, - 133556, 133560, 133564, 133568, 133572, 133576, 133580, 133584, 133588, - 133592, 133596, 133600, 133604, 133608, 133612, 133616, 133620, 133624, - 133628, 133633, 133638, 133643, 133647, 133653, 133660, 133667, 133674, - 133681, 133688, 133695, 133702, 133709, 133716, 133723, 133730, 133737, - 133744, 133750, 133757, 133764, 133770, 133777, 133784, 133791, 133798, - 133805, 133812, 133819, 133826, 133833, 133840, 133847, 133854, 133861, - 133867, 133873, 133880, 133887, 133896, 133905, 133914, 133923, 133928, - 133933, 133939, 133945, 133951, 133957, 133963, 133969, 133975, 133981, - 133987, 133993, 133999, 134005, 134010, 134016, 134026, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92177, 92181, 92186, 92191, 0, 92197, 92202, 0, 0, 0, 0, 0, 92207, 92213, + 92220, 92225, 92230, 92234, 92239, 92244, 0, 92249, 92254, 92259, 0, + 92264, 92269, 92274, 92279, 92284, 92289, 92294, 92299, 92304, 92309, + 92314, 92318, 92322, 92327, 92332, 92337, 92341, 92345, 92349, 92354, + 92359, 92364, 92369, 92373, 92378, 92382, 92387, 0, 0, 0, 0, 92392, + 92398, 92403, 0, 0, 0, 0, 92408, 92412, 92416, 92420, 92424, 92428, + 92433, 92438, 92444, 0, 0, 0, 0, 0, 0, 0, 0, 92450, 92456, 92463, 92469, + 92476, 92482, 92488, 92494, 92501, 0, 0, 0, 0, 0, 0, 0, 92507, 92515, + 92523, 92531, 92539, 92547, 92555, 92563, 92571, 92579, 92587, 92595, + 92603, 92611, 92619, 92627, 92635, 92643, 92651, 92659, 92667, 92675, + 92683, 92691, 92699, 92707, 92715, 92723, 92731, 92739, 92746, 92754, + 92762, 92766, 92771, 92776, 92781, 92786, 92791, 92796, 92801, 92805, + 92810, 92814, 92819, 92823, 92828, 92832, 92837, 92842, 92847, 92852, + 92857, 92862, 92867, 92872, 92877, 92882, 92887, 92892, 92897, 92902, + 92907, 92912, 92917, 92922, 92927, 92932, 92937, 92942, 92947, 92952, + 92957, 92962, 92967, 92972, 92977, 92982, 92987, 92992, 92997, 93002, + 93007, 93012, 93017, 93022, 0, 0, 0, 93027, 93032, 93041, 93049, 93058, + 93067, 93078, 93089, 93096, 93103, 93110, 93117, 93124, 93131, 93138, + 93145, 93152, 93159, 93166, 93173, 93180, 93187, 93194, 93201, 93208, + 93215, 93222, 93229, 93236, 0, 0, 93243, 93249, 93255, 93261, 93267, + 93274, 93281, 93289, 93297, 93304, 93311, 93318, 93325, 93332, 93339, + 93346, 93353, 93360, 93367, 93374, 93381, 93388, 93395, 93402, 93409, + 93416, 93423, 0, 0, 0, 0, 0, 93430, 93436, 93442, 93448, 93454, 93461, + 93468, 93476, 93484, 93490, 93496, 93503, 93509, 93515, 93521, 93527, + 93534, 93541, 93548, 93555, 93562, 93569, 93576, 93583, 93590, 93597, + 93604, 93611, 93618, 93625, 93632, 93639, 93646, 93653, 93660, 93667, + 93674, 93681, 93688, 93695, 93702, 93709, 93716, 93723, 93730, 93737, + 93744, 93751, 93758, 93765, 93772, 93779, 93786, 93793, 93800, 93807, + 93814, 93821, 93828, 93835, 93842, 93849, 93856, 93863, 93870, 93877, + 93884, 93891, 93898, 93905, 93912, 93919, 93926, 93933, 93940, 93947, + 93954, 93961, 93968, 93975, 93982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93989, 93993, + 93997, 94001, 94005, 94009, 94013, 94017, 94021, 94025, 94030, 94035, + 94040, 94045, 94050, 94055, 94060, 94065, 94070, 94076, 94082, 94088, + 94095, 94102, 94109, 94116, 94123, 94130, 94137, 94144, 94151, 0, 94158, + 94162, 94166, 94170, 94174, 94178, 94181, 94185, 94188, 94192, 94195, + 94199, 94203, 94208, 94212, 94217, 94220, 94224, 94227, 94231, 94234, + 94238, 94242, 94246, 94250, 94254, 94258, 94262, 94266, 94270, 94274, + 94278, 94282, 94286, 94290, 94294, 94298, 94302, 94306, 94309, 94312, + 94316, 94320, 94324, 94327, 94330, 94333, 94337, 94341, 94345, 94349, + 94352, 94355, 94359, 94365, 94371, 94377, 94382, 94389, 94393, 94398, + 94402, 94407, 94412, 94418, 94423, 94429, 94433, 94438, 94442, 94447, + 94450, 94453, 94457, 94462, 94468, 94473, 94479, 0, 0, 0, 0, 94484, + 94487, 94490, 94493, 94496, 94499, 94502, 94505, 94508, 94511, 94515, + 94519, 94523, 94527, 94531, 94535, 94539, 94543, 94547, 94552, 94557, + 94561, 94564, 94567, 94570, 94573, 94576, 94579, 94582, 94585, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94588, 94593, 94598, 94603, 94607, + 94612, 94616, 94621, 94625, 94630, 94634, 94639, 94643, 94648, 94652, + 94657, 94662, 94667, 94672, 94677, 94682, 94687, 94692, 94697, 94702, + 94707, 94712, 94717, 94722, 94727, 94732, 94737, 94742, 94747, 94752, + 94756, 94760, 94765, 94770, 94775, 94779, 94783, 94787, 94792, 94797, + 94802, 94807, 94811, 94815, 94821, 94826, 94832, 94837, 94843, 94848, + 94854, 94859, 94865, 94870, 94875, 94880, 94885, 94889, 94894, 94900, + 94904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94909, 94916, 94923, + 94930, 94937, 94944, 94951, 94958, 94965, 94972, 94979, 94986, 94993, + 95000, 95007, 95014, 95021, 95028, 95035, 95042, 95049, 95056, 95063, + 95070, 95077, 0, 0, 0, 0, 0, 0, 0, 95084, 95091, 95097, 95103, 95109, + 95115, 95121, 95127, 95133, 95139, 0, 0, 0, 0, 0, 0, 95145, 95150, 95155, + 95160, 95165, 95169, 95173, 95177, 95182, 95187, 95192, 95197, 95202, + 95207, 95212, 95217, 95222, 95227, 95232, 95237, 95242, 95247, 95252, + 95257, 95262, 95267, 95272, 95277, 95282, 95287, 95292, 95297, 95302, + 95307, 95312, 95317, 95322, 95327, 95332, 95337, 95342, 95347, 95353, + 95358, 95364, 95369, 95375, 95380, 95386, 95392, 95396, 95401, 95405, 0, + 95409, 95414, 95418, 95422, 95426, 95430, 95434, 95438, 95442, 95446, + 95450, 95455, 95459, 95464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95469, + 95473, 95477, 95481, 95484, 95488, 95491, 95495, 95498, 95502, 95506, + 95511, 95515, 95520, 95523, 95527, 95530, 95534, 95537, 95541, 95545, + 95549, 95553, 95557, 95561, 95565, 95569, 95573, 95577, 95581, 95585, + 95589, 95593, 95597, 95601, 95605, 95609, 95612, 95615, 95619, 95623, + 95627, 95630, 95633, 95636, 95640, 95644, 95648, 95652, 95656, 95659, + 95662, 95667, 95671, 95676, 95680, 95685, 95690, 95696, 95701, 95707, + 95711, 95716, 95720, 95725, 95729, 95733, 95737, 95741, 95744, 95747, + 95751, 95755, 0, 0, 0, 0, 0, 0, 0, 95758, 95762, 95765, 95768, 95771, + 95774, 95777, 95780, 95783, 95786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 95789, 95793, 95798, 95802, 95807, 95811, 95816, 95820, 95825, 95829, + 95834, 95838, 95843, 95848, 95853, 95858, 95863, 95868, 95873, 95878, + 95883, 95888, 95893, 95898, 95903, 95908, 95913, 95918, 95923, 95928, + 95932, 95936, 95941, 95946, 95951, 95955, 95959, 95963, 95968, 95973, + 95978, 95982, 95986, 95991, 95996, 96001, 96007, 96012, 96018, 96023, + 96029, 96034, 96040, 96045, 96051, 96056, 0, 0, 0, 0, 0, 0, 0, 0, 96061, + 96066, 96070, 96074, 96078, 96082, 96086, 96090, 96094, 96098, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96102, 96105, 96110, 96116, 96124, 96129, 96135, 96143, 96149, + 96155, 96159, 96163, 96170, 96179, 96186, 96195, 96201, 96210, 96217, + 96224, 96231, 96241, 96247, 96251, 96258, 96267, 96277, 96284, 96291, + 96295, 96299, 96306, 96316, 96320, 96327, 96334, 96341, 96347, 96354, + 96361, 96368, 96375, 96379, 96383, 96387, 96394, 96398, 96405, 96412, + 96426, 96435, 96439, 96443, 96447, 96454, 96458, 96462, 96466, 96474, + 96482, 96501, 96511, 96531, 96535, 96539, 96543, 96547, 96551, 96555, + 96559, 96566, 96570, 96573, 96577, 96581, 96587, 96594, 96603, 96607, + 96616, 96625, 96633, 96637, 96644, 96648, 96652, 96656, 96660, 96671, + 96680, 96689, 96698, 96707, 96719, 96728, 96737, 96746, 96754, 96763, + 96775, 96784, 96793, 96802, 96814, 96823, 96832, 96844, 96853, 96862, + 96874, 96883, 96887, 96891, 96895, 96899, 96903, 96907, 96911, 96918, + 96922, 96926, 96937, 96941, 96945, 96952, 96958, 96964, 96968, 96975, + 96979, 96983, 96987, 96991, 96995, 96999, 97005, 97013, 97017, 97021, + 97024, 97030, 97040, 97044, 97056, 97063, 97070, 97077, 97084, 97090, + 97094, 97098, 97102, 97106, 97113, 97122, 97129, 97137, 97145, 97151, + 97155, 97159, 97163, 97167, 97173, 97182, 97194, 97201, 97208, 97217, + 97228, 97234, 97243, 97252, 97259, 97268, 97275, 97282, 97292, 97299, + 97306, 97313, 97320, 97324, 97330, 97334, 97345, 97353, 97362, 97374, + 97381, 97388, 97398, 97405, 97414, 97421, 97430, 97437, 97444, 97454, + 97461, 97468, 97478, 97485, 97497, 97506, 97513, 97520, 97527, 97536, + 97546, 97559, 97566, 97576, 97586, 97593, 97602, 97615, 97622, 97629, + 97636, 97646, 97656, 97663, 97673, 97680, 97687, 97697, 97703, 97710, + 97717, 97724, 97734, 97741, 97748, 97755, 97761, 97768, 97778, 97785, + 97789, 97797, 97801, 97813, 97817, 97831, 97835, 97839, 97843, 97847, + 97853, 97860, 97868, 97872, 97876, 97880, 97884, 97891, 97895, 97901, + 97907, 97915, 97919, 97926, 97934, 97938, 97942, 97948, 97952, 97961, + 97970, 97977, 97987, 97993, 97997, 98001, 98009, 98016, 98023, 98029, + 98033, 98041, 98045, 98052, 98064, 98071, 98081, 98087, 98091, 98100, + 98107, 98116, 98120, 98124, 98131, 98135, 98139, 98143, 98147, 98150, + 98156, 98162, 98166, 98170, 98177, 98184, 98191, 98198, 98205, 98212, + 98219, 98226, 98232, 98236, 98240, 98247, 98254, 98261, 98268, 98275, + 98279, 98282, 98287, 98291, 98295, 98304, 98313, 98317, 98321, 98327, + 98333, 98350, 98356, 98360, 98369, 98373, 98377, 98384, 98392, 98400, + 98406, 98410, 98414, 98418, 98422, 98425, 98431, 98438, 98448, 98455, + 98462, 98469, 98475, 98482, 98489, 98496, 98503, 98510, 98519, 98526, + 98538, 98545, 98552, 98562, 98573, 98580, 98587, 98594, 98601, 98608, + 98615, 98622, 98629, 98636, 98643, 98653, 98663, 98673, 98680, 98690, + 98697, 98704, 98711, 98718, 98724, 98731, 98738, 98745, 98752, 98759, + 98766, 98773, 98780, 98786, 98793, 98800, 98809, 98816, 98823, 98827, + 98835, 98839, 98843, 98847, 98851, 98855, 98862, 98866, 98875, 98879, + 98886, 98894, 98898, 98902, 98906, 98919, 98935, 98939, 98943, 98950, + 98956, 98963, 98967, 98971, 98975, 98979, 98983, 98990, 98994, 99012, + 99016, 99020, 99027, 99031, 99035, 99041, 99045, 99049, 99057, 99061, + 99065, 99069, 99073, 99079, 99090, 99099, 99108, 99115, 99122, 99133, + 99140, 99147, 99154, 99161, 99168, 99175, 99182, 99192, 99198, 99205, + 99215, 99224, 99231, 99240, 99250, 99257, 99264, 99271, 99278, 99290, + 99297, 99304, 99311, 99318, 99325, 99335, 99342, 99349, 99359, 99372, + 99384, 99391, 99401, 99408, 99415, 99422, 99436, 99442, 99450, 99460, + 99470, 99477, 99484, 99490, 99494, 99501, 99511, 99517, 99530, 99534, + 99538, 99545, 99549, 99556, 99566, 99570, 99574, 99578, 99582, 99586, + 99593, 99597, 99604, 99611, 99618, 99627, 99636, 99646, 99653, 99660, + 99667, 99677, 99684, 99694, 99701, 99711, 99718, 99725, 99735, 99745, + 99752, 99758, 99766, 99774, 99780, 99786, 99790, 99794, 99801, 99809, + 99815, 99819, 99823, 99827, 99834, 99846, 99849, 99856, 99862, 99866, + 99870, 99874, 99878, 99882, 99886, 99890, 99894, 99898, 99902, 99909, + 99913, 99919, 99923, 99927, 99931, 99937, 99944, 99951, 99958, 99969, + 99977, 99981, 99987, 99996, 100003, 100009, 100012, 100016, 100020, + 100026, 100035, 100043, 100047, 100053, 100057, 100061, 100065, 100071, + 100078, 100084, 100088, 100094, 100098, 100102, 100111, 100123, 100127, + 100134, 100141, 100151, 100158, 100170, 100177, 100184, 100191, 100202, + 100212, 100225, 100235, 100242, 100246, 100250, 100254, 100258, 100267, + 100276, 100285, 100302, 100311, 100317, 100324, 100332, 100345, 100349, + 100358, 100367, 100376, 100385, 100396, 100405, 100414, 100423, 100432, + 100441, 100450, 100460, 100463, 100467, 100471, 100475, 100479, 100483, + 100489, 100496, 100503, 100510, 100516, 100522, 100529, 100535, 100542, + 100550, 100554, 100561, 100568, 100575, 100583, 100586, 100590, 100594, + 100598, 100601, 100607, 100611, 100617, 100624, 100631, 100637, 100644, + 100651, 100658, 100665, 100672, 100679, 100686, 100693, 100700, 100707, + 100714, 100721, 100728, 100735, 100741, 100745, 100754, 100758, 100762, + 100766, 100770, 100776, 100783, 100790, 100797, 100804, 100811, 100817, + 100825, 100829, 100833, 100837, 100841, 100847, 100864, 100881, 100885, + 100889, 100893, 100897, 100901, 100905, 100911, 100918, 100922, 100928, + 100935, 100942, 100949, 100956, 100963, 100972, 100979, 100986, 100993, + 101000, 101004, 101008, 101014, 101026, 101030, 101034, 101043, 101047, + 101051, 101055, 101061, 101065, 101069, 101078, 101082, 101086, 101090, + 101097, 101101, 101105, 101109, 101113, 101117, 101121, 101125, 101129, + 101135, 101142, 101149, 101155, 101159, 101176, 101182, 101186, 101192, + 101198, 101204, 101210, 101216, 101222, 101226, 101230, 101234, 101240, + 101244, 101250, 101254, 101258, 101265, 101272, 101289, 101293, 101297, + 101301, 101305, 101309, 101321, 101324, 101329, 101334, 101349, 101359, + 101371, 101375, 101379, 101383, 101389, 101396, 101403, 101413, 101425, + 101431, 101437, 101446, 101450, 101454, 101461, 101471, 101478, 101484, + 101488, 101492, 101499, 101505, 101509, 101515, 101519, 101527, 101533, + 101537, 101545, 101553, 101560, 101566, 101573, 101580, 101590, 101600, + 101604, 101608, 101612, 101616, 101622, 101629, 101635, 101642, 101649, + 101656, 101665, 101672, 101679, 101685, 101692, 101699, 101706, 101713, + 101720, 101727, 101733, 101740, 101747, 101754, 101763, 101770, 101777, + 101781, 101787, 101791, 101797, 101804, 101811, 101818, 101822, 101826, + 101830, 101834, 101838, 101845, 101849, 101853, 101859, 101867, 101871, + 101875, 101879, 101883, 101890, 101894, 101898, 101906, 101910, 101914, + 101918, 101922, 101928, 101932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 101936, 101942, 101948, 101955, 101962, 101969, 101976, 101983, + 101990, 101996, 102003, 102010, 102017, 102024, 102031, 102038, 102044, + 102050, 102056, 102062, 102068, 102074, 102080, 102086, 102092, 102099, + 102106, 102113, 102120, 102127, 102134, 102140, 102146, 102152, 102159, + 102166, 102172, 102178, 102187, 102194, 102201, 102208, 102215, 102222, + 102229, 102235, 102241, 102247, 102256, 102263, 102270, 102281, 102292, + 102298, 102304, 102310, 102319, 102326, 102333, 102343, 102353, 102364, + 102375, 102387, 102400, 102411, 102422, 102434, 102447, 102458, 102469, + 102480, 102491, 102502, 102514, 102522, 102530, 102539, 102548, 102557, + 102563, 102569, 102575, 102582, 102592, 102599, 102609, 102614, 102619, + 102625, 102631, 102639, 102647, 102656, 102667, 102678, 102686, 102694, + 102703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102712, 102723, 102730, + 102738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102746, 102750, 102754, + 102758, 102762, 102766, 102770, 102774, 102778, 102782, 102786, 102790, + 102794, 102798, 102802, 102806, 102810, 102814, 102818, 102822, 102826, + 102830, 102834, 102838, 102842, 102846, 102850, 102854, 102858, 102862, + 102866, 102870, 102874, 102878, 102882, 102886, 102890, 102894, 102898, + 102902, 102906, 102910, 102914, 102918, 102922, 102926, 102930, 102934, + 102938, 102942, 102946, 102950, 102954, 102958, 102962, 102966, 102970, + 102974, 102978, 102982, 102986, 102990, 102994, 102998, 103002, 103006, + 103010, 103014, 103018, 103022, 103026, 103030, 103034, 103038, 103042, + 103046, 103050, 103054, 103058, 103062, 103066, 103070, 103074, 103078, + 103082, 103086, 103090, 103094, 103098, 103102, 103106, 103110, 103114, + 103118, 103122, 103126, 103130, 103134, 103138, 103142, 103146, 103150, + 103154, 103158, 103162, 103166, 103170, 103174, 103178, 103182, 103186, + 103190, 103194, 103198, 103202, 103206, 103210, 103214, 103218, 103222, + 103226, 103230, 103234, 103238, 103242, 103246, 103250, 103254, 103258, + 103262, 103266, 103270, 103274, 103278, 103282, 103286, 103290, 103294, + 103298, 103302, 103306, 103310, 103314, 103318, 103322, 103326, 103330, + 103334, 103338, 103342, 103346, 103350, 103354, 103358, 103362, 103366, + 103370, 103374, 103378, 103382, 103386, 103390, 103394, 103398, 103402, + 103406, 103410, 103414, 103418, 103422, 103426, 103430, 103434, 103438, + 103442, 103446, 103450, 103454, 103458, 103462, 103466, 103470, 103474, + 103478, 103482, 103486, 103490, 103494, 103498, 103502, 103506, 103510, + 103514, 103518, 103522, 103526, 103530, 103534, 103538, 103542, 103546, + 103550, 103554, 103558, 103562, 103566, 103570, 103574, 103578, 103582, + 103586, 103590, 103594, 103598, 103602, 103606, 103610, 103614, 103618, + 103622, 103626, 103630, 103634, 103638, 103642, 103646, 103650, 103654, + 103658, 103662, 103666, 103670, 103674, 103678, 103682, 103686, 103690, + 103694, 103698, 103702, 103706, 103710, 103714, 103718, 103722, 103726, + 103730, 103734, 103738, 103742, 103746, 103750, 103754, 103758, 103762, + 103766, 103770, 103774, 103778, 103782, 103786, 103790, 103794, 103798, + 103802, 103806, 103810, 103814, 103818, 103822, 103826, 103830, 103834, + 103838, 103842, 103846, 103850, 103854, 103858, 103862, 103866, 103870, + 103874, 103878, 103882, 103886, 103890, 103894, 103898, 103902, 103906, + 103910, 103914, 103918, 103922, 103926, 103930, 103934, 103938, 103942, + 103946, 103950, 103954, 103958, 103962, 103966, 103970, 103974, 103978, + 103982, 103986, 103990, 103994, 103998, 104002, 104006, 104010, 104014, + 104018, 104022, 104026, 104030, 104034, 104038, 104042, 104046, 104050, + 104054, 104058, 104062, 104066, 104070, 104074, 104078, 104082, 104086, + 104090, 104094, 104098, 104102, 104106, 104110, 104114, 104118, 104122, + 104126, 104130, 104134, 104138, 104142, 104146, 104150, 104154, 104158, + 104162, 104166, 104170, 104174, 104178, 104182, 104186, 104190, 104194, + 104198, 104202, 104206, 104210, 104214, 104218, 104222, 104226, 104230, + 104234, 104238, 104242, 104246, 104250, 104254, 104258, 104262, 104266, + 104270, 104274, 104278, 104282, 104286, 104290, 104294, 104298, 104302, + 104306, 104310, 104314, 104318, 104322, 104326, 104330, 104334, 104338, + 104342, 104346, 104350, 104354, 104358, 104362, 104366, 104370, 104374, + 104378, 104382, 104386, 104390, 104394, 104398, 104402, 104406, 104410, + 104414, 104418, 104422, 104426, 104430, 104434, 104438, 104442, 104446, + 104450, 104454, 104458, 104462, 104466, 104470, 104474, 104478, 104482, + 104486, 104490, 104494, 104498, 104502, 104506, 104510, 104514, 104518, + 104522, 104526, 104530, 104534, 104538, 104542, 104546, 104550, 104554, + 104558, 104562, 104566, 104570, 104574, 104578, 104582, 104586, 104590, + 104594, 104598, 104602, 104606, 104610, 104614, 104618, 104622, 104626, + 104630, 104634, 104638, 104642, 104646, 104650, 104654, 104658, 104662, + 104666, 104670, 104674, 104678, 104682, 104686, 104690, 104694, 104698, + 104702, 104706, 104710, 104714, 104718, 104722, 104726, 104730, 104734, + 104738, 104742, 104746, 104750, 104754, 104758, 104762, 104766, 104770, + 104774, 104778, 104782, 104786, 104790, 104794, 104798, 104802, 104806, + 104810, 104814, 104818, 104822, 104826, 104830, 104834, 104838, 104842, + 104846, 104850, 104854, 104858, 104862, 104866, 104870, 104874, 104878, + 104882, 104886, 104890, 104894, 104898, 104902, 104906, 104910, 104914, + 104918, 104922, 104926, 104930, 104934, 104938, 104942, 104946, 104950, + 104954, 104958, 104962, 104966, 104970, 104974, 104978, 104982, 104986, + 104990, 104994, 104998, 105002, 105006, 105010, 105014, 105018, 105022, + 105026, 105030, 105034, 105038, 105042, 105046, 105050, 105054, 105058, + 105062, 105066, 105070, 105074, 105078, 105082, 105086, 105090, 105094, + 105098, 105102, 105106, 105110, 105114, 105118, 105122, 105126, 105130, + 105134, 105138, 105142, 105146, 105150, 105154, 105158, 105162, 105166, + 105170, 105174, 105178, 105182, 105186, 105190, 105194, 105198, 105202, + 105206, 105210, 105214, 105218, 105222, 105226, 105230, 105234, 105238, + 105242, 105246, 105250, 105254, 105258, 105262, 105266, 105270, 105274, + 105278, 105282, 105286, 105290, 105294, 105298, 105302, 105306, 105310, + 105314, 105318, 105322, 105326, 105330, 105334, 105338, 105342, 105346, + 105350, 105354, 105358, 105362, 105366, 105370, 105374, 105378, 105382, + 105386, 105390, 105394, 105398, 105402, 105406, 105410, 105414, 105418, + 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450, 105454, + 105458, 105462, 105466, 105470, 105474, 105478, 105482, 105486, 105490, + 105494, 105498, 105502, 105506, 105510, 105514, 105518, 105522, 105526, + 105530, 105534, 105538, 105542, 105546, 105550, 105554, 105558, 105562, + 105566, 105570, 105574, 105578, 105582, 105586, 105590, 105594, 105598, + 105602, 105606, 105610, 105614, 105618, 105622, 105626, 105630, 105634, + 105638, 105642, 105646, 105650, 105654, 105658, 105662, 105666, 105670, + 105674, 105678, 105682, 105686, 105690, 105694, 105698, 105702, 105706, + 105710, 105714, 105718, 105722, 105726, 105730, 105734, 105738, 105742, + 105746, 105750, 105754, 105758, 105762, 105766, 105770, 105774, 105778, + 105782, 105786, 105790, 105794, 105798, 105802, 105806, 105810, 105814, + 105818, 105822, 105826, 105830, 105834, 105838, 105842, 105846, 105850, + 105854, 105858, 105862, 105866, 105870, 105874, 105878, 105882, 105886, + 105890, 105894, 105898, 105902, 105906, 105910, 105914, 105918, 105922, + 105926, 105930, 105934, 105938, 105942, 105946, 105950, 105954, 105958, + 105962, 105966, 105970, 105974, 105978, 105982, 105986, 105990, 105994, + 105998, 106002, 106006, 106010, 106014, 106018, 106022, 106026, 106030, + 106034, 106038, 106042, 106046, 106050, 106054, 106058, 106062, 106066, + 106070, 106074, 106078, 106082, 106086, 106090, 106094, 106098, 106102, + 106106, 106110, 106114, 106118, 106122, 106126, 106130, 106134, 106138, + 106142, 106146, 106150, 106154, 106158, 106162, 106166, 106170, 106174, + 106178, 106182, 106186, 106190, 106194, 106198, 106202, 106206, 106210, + 106214, 106218, 106222, 106226, 106230, 106234, 106238, 106242, 106246, + 106250, 106254, 106258, 106262, 106266, 106270, 106274, 106278, 106282, + 106286, 106290, 106294, 106298, 106302, 106306, 106310, 106314, 106318, + 106322, 106326, 106330, 106334, 106338, 106342, 106346, 106350, 106354, + 106358, 106362, 106366, 106370, 106374, 106378, 106382, 106386, 106390, + 106394, 106398, 106402, 106406, 106410, 106414, 106418, 106422, 106426, + 106430, 106434, 106438, 106442, 106446, 106450, 106454, 106458, 106462, + 106466, 106470, 106474, 106478, 106482, 106486, 106490, 106494, 106498, + 106502, 106506, 106510, 106514, 106518, 106522, 106526, 106530, 106534, + 106538, 106542, 106546, 106550, 106554, 106558, 106562, 106566, 106570, + 106574, 106578, 106582, 106586, 106590, 106594, 106598, 106602, 106606, + 106610, 106614, 106618, 106622, 106626, 106630, 106634, 106638, 106642, + 106646, 106650, 106654, 106658, 106662, 106666, 106670, 106674, 106678, + 106682, 106686, 106690, 106694, 106698, 106702, 106706, 106710, 106714, + 106718, 106722, 106726, 106730, 106734, 106738, 106742, 106746, 106750, + 106754, 106758, 106762, 106766, 106770, 106774, 106778, 106782, 106786, + 106790, 106794, 106798, 106802, 106806, 106810, 106814, 106818, 106822, + 106826, 106830, 106834, 106838, 106842, 106846, 106850, 106854, 106858, + 106862, 106866, 106870, 106874, 106878, 106882, 106886, 106890, 106894, + 106898, 106902, 106906, 106910, 106914, 106918, 106922, 106926, 106930, + 106934, 106938, 106942, 106946, 106950, 106954, 106958, 106962, 106966, + 106970, 106974, 106978, 106982, 106986, 106990, 106994, 106998, 107002, + 107006, 107010, 107014, 107018, 107022, 107026, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 107030, 107037, 107044, 107053, 107062, 107069, 107074, 107081, + 107088, 107097, 107108, 107119, 107124, 107131, 107136, 107141, 107146, + 107151, 107156, 107161, 107166, 107171, 107176, 107181, 107186, 107193, + 107200, 107205, 107210, 107215, 107220, 107227, 107234, 107242, 107247, + 107254, 107259, 107264, 107269, 107274, 107279, 107286, 107293, 107298, + 107303, 107308, 107313, 107318, 107323, 107328, 107333, 107338, 107343, + 107348, 107353, 107358, 107363, 107368, 107373, 107378, 107383, 107388, + 107395, 107400, 107405, 107414, 107421, 107426, 107431, 107436, 107441, + 107446, 107451, 107456, 107461, 107466, 107471, 107476, 107481, 107486, + 107491, 107496, 107501, 107506, 107511, 107516, 107521, 107526, 107532, + 107540, 107546, 107554, 107562, 107570, 107576, 107582, 107588, 107594, + 107600, 107608, 107618, 107626, 107634, 107640, 107646, 107654, 107662, + 107668, 107676, 107684, 107692, 107698, 107704, 107710, 107716, 107722, + 107728, 107736, 107744, 107750, 107756, 107762, 107768, 107774, 107782, + 107788, 107794, 107800, 107806, 107812, 107818, 107826, 107832, 107838, + 107844, 107850, 107858, 107866, 107872, 107878, 107884, 107889, 107895, + 107901, 107908, 107913, 107918, 107923, 107928, 107933, 107938, 107943, + 107948, 107953, 107962, 107969, 107974, 107979, 107984, 107991, 107996, + 108001, 108006, 108013, 108018, 108023, 108028, 108033, 108038, 108043, + 108048, 108053, 108058, 108063, 108068, 108075, 108080, 108087, 108092, + 108097, 108104, 108109, 108114, 108119, 108124, 108129, 108134, 108139, + 108144, 108149, 108154, 108159, 108164, 108169, 108174, 108179, 108184, + 108189, 108194, 108199, 108206, 108211, 108216, 108221, 108226, 108231, + 108236, 108241, 108246, 108251, 108256, 108261, 108266, 108271, 108278, + 108283, 108288, 108295, 108300, 108305, 108310, 108315, 108320, 108325, + 108330, 108335, 108340, 108345, 108352, 108357, 108362, 108367, 108372, + 108377, 108384, 108391, 108396, 108401, 108406, 108411, 108416, 108421, + 108426, 108431, 108436, 108441, 108446, 108451, 108456, 108461, 108466, + 108471, 108476, 108481, 108486, 108491, 108496, 108501, 108506, 108511, + 108516, 108521, 108526, 108531, 108536, 108541, 108546, 108551, 108556, + 108561, 108566, 108571, 108578, 108583, 108588, 108593, 108598, 108603, + 108608, 108613, 108618, 108623, 108628, 108633, 108638, 108643, 108648, + 108653, 108658, 108663, 108668, 108673, 108678, 108683, 108688, 108693, + 108698, 108703, 108708, 108713, 108718, 108723, 108728, 108733, 108738, + 108743, 108748, 108753, 108758, 108763, 108768, 108773, 108778, 108783, + 108788, 108793, 108798, 108803, 108808, 108813, 108818, 108823, 108828, + 108833, 108838, 108843, 108848, 108853, 108858, 108863, 108868, 108875, + 108880, 108885, 108890, 108895, 108900, 108905, 108909, 108914, 108919, + 108924, 108929, 108934, 108939, 108944, 108949, 108954, 108959, 108964, + 108969, 108974, 108979, 108986, 108991, 108996, 109002, 109007, 109012, + 109017, 109022, 109027, 109032, 109037, 109042, 109047, 109052, 109057, + 109062, 109067, 109072, 109077, 109082, 109087, 109092, 109097, 109102, + 109107, 109112, 109117, 109122, 109127, 109132, 109137, 109142, 109147, + 109152, 109157, 109162, 109167, 109172, 109177, 109182, 109187, 109192, + 109197, 109202, 109207, 109212, 109217, 109224, 109229, 109234, 109241, + 109248, 109253, 109258, 109263, 109268, 109273, 109278, 109283, 109288, + 109293, 109298, 109303, 109308, 109313, 109318, 109323, 109328, 109333, + 109338, 109343, 109348, 109353, 109358, 109363, 109368, 109373, 109380, + 109385, 109390, 109395, 109400, 109405, 109410, 109415, 109420, 109425, + 109430, 109435, 109440, 109445, 109450, 109455, 109460, 109465, 109470, + 109477, 109482, 109487, 109492, 109497, 109502, 109507, 109512, 109518, + 109523, 109528, 109533, 109538, 109543, 109548, 109553, 109558, 109565, + 109572, 109577, 109582, 109586, 109591, 109595, 109599, 109604, 109611, + 109616, 109621, 109630, 109635, 109640, 109645, 109650, 109657, 109664, + 109669, 109674, 109679, 109684, 109691, 109696, 109701, 109706, 109711, + 109716, 109721, 109726, 109731, 109736, 109741, 109746, 109751, 109758, + 109762, 109767, 109772, 109777, 109782, 109786, 109791, 109796, 109801, + 109806, 109811, 109816, 109821, 109826, 109831, 109837, 109843, 109849, + 109855, 109861, 109867, 109873, 109879, 109885, 109891, 109897, 109903, + 109908, 109914, 109920, 109926, 109932, 109938, 109944, 109950, 109956, + 109962, 109968, 109974, 109979, 109985, 109991, 109997, 110003, 110009, + 110015, 110021, 110027, 110033, 110039, 110045, 110051, 110057, 110063, + 110069, 110075, 110081, 110087, 110093, 110099, 110104, 110110, 110116, + 110122, 110128, 110134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 110140, 110143, 110147, 110151, 110155, 110158, + 110162, 110167, 110171, 110175, 110179, 110183, 110187, 110192, 110197, + 110201, 110205, 110208, 110212, 110217, 110222, 110226, 110230, 110234, + 110238, 110242, 110246, 110250, 110254, 110258, 110262, 110265, 110269, + 110273, 110277, 110281, 110285, 110289, 110295, 110298, 110302, 110306, + 110310, 110314, 110318, 110322, 110326, 110330, 110334, 110339, 110344, + 110350, 110354, 110358, 110362, 110366, 110370, 110374, 110379, 110382, + 110386, 110390, 110394, 110398, 110404, 110408, 110412, 110416, 110420, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110424, 110428, 110432, 110438, 110444, + 110448, 110453, 110458, 110463, 110468, 110472, 110477, 110482, 110487, + 110491, 110496, 110501, 110506, 110510, 110515, 110520, 110525, 110530, + 110535, 110540, 110545, 110550, 110554, 110559, 110564, 110569, 110574, + 110579, 110584, 110589, 110594, 110599, 110604, 110609, 110616, 110621, + 110628, 110633, 110638, 110643, 110648, 110653, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 110658, 110662, 110668, 110671, 110674, 110678, + 110682, 110686, 110690, 110694, 110698, 110702, 110708, 110714, 110720, + 110726, 110732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 110738, 110743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110749, 110754, 110759, + 110764, 110771, 110778, 110785, 110792, 110797, 110802, 110807, 110812, + 110819, 110824, 110831, 110838, 110843, 110848, 110853, 110860, 110865, + 110870, 110877, 110884, 110889, 110894, 110899, 110906, 110913, 110920, + 110925, 110930, 110937, 110944, 110951, 110958, 110963, 110968, 110973, + 110980, 110985, 110990, 110995, 111002, 111011, 111018, 111023, 111028, + 111033, 111038, 111043, 111048, 111057, 111064, 111069, 111076, 111083, + 111088, 111093, 111098, 111105, 111110, 111117, 111124, 111129, 111134, + 111139, 111146, 111153, 111158, 111163, 111170, 111177, 111184, 111189, + 111194, 111199, 111204, 111211, 111220, 111229, 111234, 111241, 111250, + 111255, 111260, 111265, 111270, 111277, 111284, 111291, 111298, 111303, + 111308, 111313, 111320, 111327, 111334, 111339, 111344, 111351, 111356, + 111363, 111368, 111375, 111380, 111387, 111394, 111399, 111404, 111409, + 111414, 111419, 111424, 111429, 111434, 111439, 111446, 111453, 111460, + 111467, 111474, 111483, 111488, 111493, 111500, 111507, 111512, 111519, + 111526, 111533, 111540, 111547, 111554, 111559, 111564, 111569, 111574, + 111579, 111588, 111597, 111606, 111615, 111624, 111633, 111642, 111651, + 111656, 111667, 111678, 111687, 111692, 111697, 111702, 111707, 111716, + 111723, 111730, 111737, 111744, 111751, 111758, 111767, 111776, 111787, + 111796, 111807, 111816, 111823, 111832, 111843, 111852, 111861, 111870, + 111879, 111886, 111893, 111900, 111909, 111918, 111929, 111938, 111947, + 111958, 111963, 111968, 111979, 111987, 111996, 112005, 112014, 112025, + 112034, 112043, 112054, 112065, 112076, 112087, 112098, 112109, 112116, + 112123, 112130, 112137, 112148, 112157, 112164, 112171, 112178, 112189, + 112200, 112211, 112222, 112233, 112244, 112255, 112266, 112273, 112280, + 112289, 112298, 112305, 112312, 112319, 112328, 112337, 112346, 112353, + 112362, 112371, 112380, 112387, 112394, 112399, 112405, 112412, 112419, + 112426, 112433, 112440, 112447, 112456, 112465, 112474, 112483, 112490, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112499, 112505, 112510, 112515, 112522, + 112528, 112534, 112540, 112546, 112552, 112558, 112564, 112568, 112572, + 112578, 112584, 112590, 112594, 112599, 112604, 112608, 112612, 112615, + 112621, 112627, 112633, 112639, 112645, 112651, 112657, 112663, 112669, + 112679, 112689, 112695, 112701, 112711, 112721, 112727, 0, 0, 112733, + 112741, 112746, 112751, 112757, 112763, 112769, 112775, 112781, 112787, + 112794, 112801, 112807, 112813, 112819, 112825, 112831, 112837, 112843, + 112849, 112854, 112860, 112866, 112872, 112878, 112884, 112893, 112899, + 112904, 112912, 112919, 112926, 112935, 112944, 112953, 112962, 112971, + 112980, 112989, 112998, 113008, 113018, 113026, 113034, 113043, 113052, + 113058, 113064, 113070, 113076, 113084, 113092, 113096, 113102, 113107, + 113113, 113119, 113125, 113131, 113137, 113146, 113151, 113158, 113163, + 113168, 113173, 113179, 113185, 113191, 113198, 113203, 113208, 113213, + 113218, 113223, 113229, 113235, 113241, 113247, 113253, 113259, 113265, + 113271, 113276, 113281, 113286, 113291, 113296, 113301, 113306, 113311, + 113317, 113323, 113328, 113333, 113338, 113343, 113348, 113354, 113361, + 113365, 113369, 113373, 113377, 113381, 113385, 113389, 113393, 113401, + 113411, 113415, 113419, 113425, 113431, 113437, 113443, 113449, 113455, + 113461, 113467, 113473, 113479, 113485, 113491, 113497, 113503, 113507, + 113511, 113518, 113524, 113530, 113536, 113541, 113548, 113553, 113559, + 113565, 113571, 113577, 113582, 113586, 113592, 113596, 113600, 113604, + 113610, 113616, 113620, 113626, 113632, 113638, 113644, 113650, 113658, + 113666, 113672, 113678, 113684, 113690, 113702, 113714, 113728, 113740, + 113752, 113766, 113780, 113794, 113798, 113806, 113814, 113819, 113823, + 113827, 113831, 113835, 113839, 113843, 113847, 113853, 113859, 113865, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113871, 113877, 113883, 113889, 113895, + 113901, 113907, 113913, 113919, 113925, 113931, 113937, 113943, 113949, + 113955, 113961, 113967, 113973, 113979, 113985, 113991, 113997, 114003, + 114009, 114015, 114021, 114027, 114033, 114039, 114045, 114051, 114057, + 114063, 114069, 114075, 114081, 114087, 114093, 114099, 114105, 114111, + 114117, 114123, 114129, 114135, 114141, 114147, 114153, 114159, 114165, + 114171, 114177, 114183, 114189, 114195, 114201, 114207, 114213, 114219, + 114225, 114231, 114237, 114243, 114249, 114255, 114261, 114267, 114272, + 114277, 114282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114286, 114291, 114298, + 114305, 114312, 114319, 114324, 114328, 114334, 114338, 114342, 114348, + 114352, 114356, 114360, 114366, 114373, 114377, 114381, 114385, 114389, + 114393, 114397, 114403, 114407, 114411, 114415, 114419, 114423, 114427, + 114431, 114435, 114439, 114443, 114447, 114451, 114456, 114460, 114464, + 114468, 114472, 114476, 114480, 114484, 114488, 114492, 114499, 114503, + 114511, 114515, 114519, 114523, 114527, 114531, 114535, 114539, 114546, + 114550, 114554, 114558, 114562, 114566, 114572, 114576, 114582, 114586, + 114590, 114594, 114598, 114602, 114606, 114610, 114614, 114618, 114622, + 114626, 114630, 114634, 114638, 114642, 114646, 114650, 114654, 114658, + 114666, 114670, 114674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114678, 114686, + 114694, 114702, 114710, 114718, 114726, 114734, 114742, 114750, 114758, + 114766, 114774, 114782, 114790, 114798, 114806, 114814, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 114822, 114826, 114831, 114836, 114841, 114845, + 114850, 114855, 114860, 114864, 114869, 114874, 114878, 114882, 114887, + 114891, 114896, 114901, 114905, 114910, 114915, 114919, 114924, 114929, + 114934, 114939, 114944, 114948, 114953, 114958, 114963, 114967, 114972, + 114977, 114982, 114986, 114991, 114996, 115000, 115004, 115009, 115013, + 115018, 115023, 115027, 115032, 115037, 115041, 115046, 115051, 115056, + 115061, 115066, 115070, 115075, 115080, 115085, 115089, 115094, 115099, + 115104, 115108, 115113, 115118, 115122, 115126, 115131, 115135, 115140, + 115145, 115149, 115154, 115159, 115163, 115168, 115173, 115178, 115183, + 115188, 115192, 115197, 115202, 115207, 115211, 115216, 0, 115221, + 115225, 115230, 115235, 115239, 115243, 115248, 115252, 115257, 115262, + 115266, 115271, 115276, 115280, 115285, 115290, 115295, 115300, 115305, + 115310, 115316, 115322, 115328, 115333, 115339, 115345, 115351, 115356, + 115362, 115368, 115373, 115378, 115384, 115389, 115395, 115401, 115406, + 115412, 115418, 115423, 115429, 115435, 115441, 115447, 115453, 115458, + 115464, 115470, 115476, 115481, 115487, 115493, 115499, 115504, 115510, + 115516, 115521, 115526, 115532, 115537, 115543, 115549, 115554, 115560, + 115566, 115571, 115577, 115583, 115589, 115595, 115601, 0, 115605, + 115610, 0, 0, 115615, 0, 0, 115620, 115625, 0, 0, 115630, 115635, 115639, + 115644, 0, 115649, 115654, 115659, 115663, 115668, 115673, 115678, + 115683, 115688, 115692, 115697, 115702, 0, 115707, 0, 115712, 115717, + 115721, 115726, 115731, 115735, 115739, 0, 115744, 115749, 115754, + 115758, 115763, 115768, 115772, 115777, 115782, 115787, 115792, 115797, + 115802, 115808, 115814, 115820, 115825, 115831, 115837, 115843, 115848, + 115854, 115860, 115865, 115870, 115876, 115881, 115887, 115893, 115898, + 115904, 115910, 115915, 115921, 115927, 115933, 115939, 115945, 115950, + 115956, 115962, 115968, 115973, 115979, 115985, 115991, 115996, 116002, + 116008, 116013, 116018, 116024, 116029, 116035, 116041, 116046, 116052, + 116058, 116063, 116069, 116075, 116081, 116087, 116093, 116097, 0, + 116102, 116107, 116111, 116116, 0, 0, 116121, 116126, 116131, 116135, + 116139, 116144, 116148, 116153, 0, 116158, 116163, 116168, 116172, + 116177, 116182, 116187, 0, 116192, 116196, 116201, 116206, 116211, + 116215, 116220, 116225, 116230, 116234, 116239, 116244, 116248, 116252, + 116257, 116261, 116266, 116271, 116275, 116280, 116285, 116289, 116294, + 116299, 116304, 116309, 116314, 116318, 0, 116323, 116328, 116332, + 116337, 0, 116342, 116346, 116351, 116356, 116360, 0, 116364, 0, 0, 0, + 116368, 116373, 116378, 116382, 116387, 116392, 116397, 0, 116402, + 116406, 116411, 116416, 116421, 116425, 116430, 116435, 116440, 116444, + 116449, 116454, 116458, 116462, 116467, 116471, 116476, 116481, 116485, + 116490, 116495, 116499, 116504, 116509, 116514, 116519, 116524, 116529, + 116535, 116541, 116547, 116552, 116558, 116564, 116570, 116575, 116581, + 116587, 116592, 116597, 116603, 116608, 116614, 116620, 116625, 116631, + 116637, 116642, 116648, 116654, 116660, 116666, 116672, 116677, 116683, + 116689, 116695, 116700, 116706, 116712, 116718, 116723, 116729, 116735, + 116740, 116745, 116751, 116756, 116762, 116768, 116773, 116779, 116785, + 116790, 116796, 116802, 116808, 116814, 116820, 116824, 116829, 116834, + 116839, 116843, 116848, 116853, 116858, 116862, 116867, 116872, 116876, + 116880, 116885, 116889, 116894, 116899, 116903, 116908, 116913, 116917, + 116922, 116927, 116932, 116937, 116942, 116946, 116951, 116956, 116961, + 116965, 116970, 116975, 116980, 116984, 116989, 116994, 116998, 117002, + 117007, 117011, 117016, 117021, 117025, 117030, 117035, 117039, 117044, + 117049, 117054, 117059, 117064, 117069, 117075, 117081, 117087, 117092, + 117098, 117104, 117110, 117115, 117121, 117127, 117132, 117137, 117143, + 117148, 117154, 117160, 117165, 117171, 117177, 117182, 117188, 117194, + 117200, 117206, 117212, 117217, 117223, 117229, 117235, 117240, 117246, + 117252, 117258, 117263, 117269, 117275, 117280, 117285, 117291, 117296, + 117302, 117308, 117313, 117319, 117325, 117330, 117336, 117342, 117348, + 117354, 117360, 117365, 117371, 117377, 117383, 117388, 117394, 117400, + 117406, 117411, 117417, 117423, 117428, 117433, 117439, 117444, 117450, + 117456, 117461, 117467, 117473, 117478, 117484, 117490, 117496, 117502, + 117508, 117513, 117519, 117525, 117531, 117536, 117542, 117548, 117554, + 117559, 117565, 117571, 117576, 117581, 117587, 117592, 117598, 117604, + 117609, 117615, 117621, 117626, 117632, 117638, 117644, 117650, 117656, + 117662, 117669, 117676, 117683, 117689, 117696, 117703, 117710, 117716, + 117723, 117730, 117736, 117742, 117749, 117755, 117762, 117769, 117775, + 117782, 117789, 117795, 117802, 117809, 117816, 117823, 117830, 117836, + 117843, 117850, 117857, 117863, 117870, 117877, 117884, 117890, 117897, + 117904, 117910, 117916, 117923, 117929, 117936, 117943, 117949, 117956, + 117963, 117969, 117976, 117983, 117990, 117997, 118004, 118009, 118015, + 118021, 118027, 118032, 118038, 118044, 118050, 118055, 118061, 118067, + 118072, 118077, 118083, 118088, 118094, 118100, 118105, 118111, 118117, + 118122, 118128, 118134, 118140, 118146, 118152, 118157, 118163, 118169, + 118175, 118180, 118186, 118192, 118198, 118203, 118209, 118215, 118220, + 118225, 118231, 118236, 118242, 118248, 118253, 118259, 118265, 118270, + 118276, 118282, 118288, 118294, 118300, 118306, 0, 0, 118313, 118318, + 118323, 118328, 118333, 118338, 118343, 118348, 118353, 118358, 118363, + 118368, 118373, 118378, 118383, 118388, 118393, 118398, 118404, 118409, + 118414, 118419, 118424, 118429, 118434, 118439, 118443, 118448, 118453, + 118458, 118463, 118468, 118473, 118478, 118483, 118488, 118493, 118498, + 118503, 118508, 118513, 118518, 118523, 118528, 118534, 118539, 118544, + 118549, 118554, 118559, 118564, 118569, 118575, 118580, 118585, 118590, + 118595, 118600, 118605, 118610, 118615, 118620, 118625, 118630, 118635, + 118640, 118645, 118650, 118655, 118660, 118665, 118670, 118675, 118680, + 118685, 118690, 118696, 118701, 118706, 118711, 118716, 118721, 118726, + 118731, 118735, 118740, 118745, 118750, 118755, 118760, 118765, 118770, + 118775, 118780, 118785, 118790, 118795, 118800, 118805, 118810, 118815, + 118820, 118826, 118831, 118836, 118841, 118846, 118851, 118856, 118861, + 118867, 118872, 118877, 118882, 118887, 118892, 118897, 118903, 118909, + 118915, 118921, 118927, 118933, 118939, 118945, 118951, 118957, 118963, + 118969, 118975, 118981, 118987, 118993, 118999, 119006, 119012, 119018, + 119024, 119030, 119036, 119042, 119048, 119053, 119059, 119065, 119071, + 119077, 119083, 119089, 119095, 119101, 119107, 119113, 119119, 119125, + 119131, 119137, 119143, 119149, 119155, 119162, 119168, 119174, 119180, + 119186, 119192, 119198, 119204, 119211, 119217, 119223, 119229, 119235, + 119241, 119247, 119253, 119259, 119265, 119271, 119277, 119283, 119289, + 119295, 119301, 119307, 119313, 119319, 119325, 119331, 119337, 119343, + 119349, 119356, 119362, 119368, 119374, 119380, 119386, 119392, 119398, + 119403, 119409, 119415, 119421, 119427, 119433, 119439, 119445, 119451, + 119457, 119463, 119469, 119475, 119481, 119487, 119493, 119499, 119505, + 119512, 119518, 119524, 119530, 119536, 119542, 119548, 119554, 119561, + 119567, 119573, 119579, 119585, 119591, 119597, 119604, 119611, 119618, + 119625, 119632, 119639, 119646, 119653, 119660, 119667, 119674, 119681, + 119688, 119695, 119702, 119709, 119716, 119724, 119731, 119738, 119745, + 119752, 119759, 119766, 119773, 119779, 119786, 119793, 119800, 119807, + 119814, 119821, 119828, 119835, 119842, 119849, 119856, 119863, 119870, + 119877, 119884, 119891, 119898, 119906, 119913, 119920, 119927, 119934, + 119941, 119948, 119955, 119963, 119970, 119977, 119984, 119991, 119998, + 120005, 120010, 0, 0, 120015, 120020, 120024, 120028, 120032, 120036, + 120040, 120044, 120048, 120052, 120056, 120061, 120065, 120069, 120073, + 120077, 120081, 120085, 120089, 120093, 120097, 120102, 120106, 120110, + 120114, 120118, 120122, 120126, 120130, 120134, 120138, 120144, 120149, + 120154, 120159, 120164, 120169, 120174, 120179, 120184, 120189, 120195, + 120200, 120205, 120210, 120215, 120220, 120225, 120230, 120235, 120240, + 120244, 120248, 120252, 0, 120256, 120260, 120264, 120268, 120272, + 120276, 120280, 120284, 120288, 120292, 120296, 120300, 120304, 120308, + 120312, 120316, 120320, 120324, 120328, 120332, 120336, 120340, 120344, + 120348, 120354, 120360, 120366, 0, 120372, 120377, 0, 120382, 0, 0, + 120387, 0, 120392, 120397, 120402, 120407, 120412, 120417, 120422, + 120427, 120432, 120437, 0, 120442, 120447, 120452, 120457, 0, 120462, 0, + 120467, 0, 0, 0, 0, 0, 0, 120472, 0, 0, 0, 0, 120478, 0, 120484, 0, + 120490, 0, 120496, 120502, 120508, 0, 120514, 120520, 0, 120526, 0, 0, + 120532, 0, 120538, 0, 120544, 0, 120550, 0, 120558, 0, 120566, 120572, 0, + 120578, 0, 0, 120584, 120590, 120596, 120602, 0, 120608, 120614, 120620, + 120626, 120632, 120638, 120644, 0, 120650, 120656, 120662, 120668, 0, + 120674, 120680, 120686, 120692, 0, 120700, 0, 120708, 120714, 120720, + 120726, 120732, 120738, 120744, 120750, 120756, 120762, 0, 120768, + 120774, 120780, 120786, 120792, 120798, 120804, 120810, 120816, 120822, + 120828, 120834, 120840, 120846, 120852, 120858, 120864, 0, 0, 0, 0, 0, + 120870, 120875, 120880, 0, 120885, 120890, 120895, 120900, 120905, 0, + 120910, 120915, 120920, 120925, 120930, 120935, 120940, 120945, 120950, + 120955, 120960, 120965, 120970, 120975, 120980, 120985, 120990, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120995, 121005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121013, + 121020, 121027, 121034, 121041, 121048, 121055, 121061, 121068, 121075, + 121082, 121090, 121098, 121106, 121114, 121122, 121130, 121137, 121144, + 121151, 121159, 121167, 121175, 121183, 121191, 121199, 121206, 121213, + 121220, 121228, 121236, 121244, 121252, 121260, 121268, 121273, 121278, + 121283, 121288, 121293, 121298, 121303, 121308, 121313, 0, 0, 0, 0, + 121318, 121323, 121327, 121331, 121335, 121339, 121343, 121347, 121351, + 121355, 121359, 121363, 121367, 121371, 121375, 121379, 121383, 121387, + 121391, 121395, 121399, 121403, 121407, 121411, 121415, 121419, 121423, + 121427, 121431, 121435, 121439, 121443, 121447, 121451, 121455, 121459, + 121463, 121467, 121471, 121475, 121479, 121483, 121487, 121491, 121495, + 121499, 121503, 121507, 121511, 121515, 121519, 121524, 121528, 121532, + 121536, 121540, 121544, 121548, 121552, 121556, 121560, 121564, 121568, + 121572, 121576, 121580, 121584, 121588, 121592, 121596, 121600, 121604, + 121608, 121612, 121616, 121620, 121624, 121628, 121632, 121636, 121640, + 121644, 121648, 121652, 121656, 121660, 121664, 121668, 121672, 121676, + 121680, 121684, 121688, 121692, 121696, 121700, 121704, 121708, 121712, + 121716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121720, 121726, 121735, + 121743, 121751, 121760, 121769, 121778, 121787, 121796, 121805, 121814, + 121823, 121832, 121841, 0, 0, 121850, 121859, 121867, 121875, 121884, + 121893, 121902, 121911, 121920, 121929, 121938, 121947, 121956, 121965, + 0, 0, 121974, 121983, 121991, 121999, 122008, 122017, 122026, 122035, + 122044, 122053, 122062, 122071, 122080, 122089, 122098, 0, 122105, + 122114, 122122, 122130, 122139, 122148, 122157, 122166, 122175, 122184, + 122193, 122202, 122211, 122220, 122229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122236, + 122243, 122248, 122252, 122256, 122260, 122265, 122270, 122275, 122280, + 122285, 0, 0, 0, 0, 0, 122290, 122295, 122301, 122307, 122313, 122318, + 122324, 122330, 122336, 122341, 122347, 122353, 122358, 122363, 122369, + 122374, 122380, 122386, 122391, 122397, 122403, 122408, 122414, 122420, + 122426, 122432, 122438, 122449, 122456, 122462, 122465, 0, 122468, + 122473, 122479, 122485, 122491, 122496, 122502, 122508, 122514, 122519, + 122525, 122531, 122536, 122541, 122547, 122552, 122558, 122564, 122569, + 122575, 122581, 122586, 122592, 122598, 122604, 122610, 122616, 122619, + 122622, 122625, 122628, 122631, 122634, 122640, 122647, 122654, 122661, + 122667, 122674, 122681, 122688, 122694, 122701, 122708, 122714, 122720, + 122727, 122733, 122740, 122747, 122753, 122760, 122767, 122773, 122780, + 122787, 122794, 122801, 122808, 122813, 0, 0, 0, 0, 122818, 122824, + 122831, 122838, 122845, 122851, 122858, 122865, 122872, 122878, 122885, + 122892, 122898, 122904, 122911, 122917, 122924, 122931, 122937, 122944, + 122951, 122957, 122964, 122971, 122978, 122985, 122992, 123001, 123005, + 123008, 123011, 123015, 123019, 123022, 123025, 123028, 123031, 123034, + 123037, 123040, 123043, 123046, 123052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123055, 123062, 123070, + 123078, 123086, 123093, 123101, 123109, 123117, 123124, 123132, 123140, + 123147, 123154, 123162, 123169, 123177, 123185, 123192, 123200, 123208, + 123215, 123223, 123231, 123239, 123247, 123255, 123259, 123263, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123266, 123272, 123278, 123284, 123288, + 123294, 123300, 123306, 123312, 123318, 123324, 123330, 123336, 123342, + 123348, 123354, 123360, 123366, 123372, 123378, 123384, 123390, 123396, + 123402, 123408, 123414, 123420, 123426, 123432, 123438, 123444, 123450, + 123456, 123462, 123468, 123474, 123480, 123486, 123492, 123498, 123504, + 123510, 123516, 0, 0, 0, 0, 0, 123522, 123533, 123544, 123555, 123566, + 123577, 123588, 123599, 123610, 0, 0, 0, 0, 0, 0, 0, 123621, 123625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123629, + 123631, 123633, 123637, 123642, 123647, 123649, 123655, 123660, 123662, + 123668, 123672, 123674, 123678, 123684, 123690, 123696, 123701, 123705, + 123712, 123719, 123726, 123731, 123738, 123745, 123752, 123756, 123762, + 123771, 123780, 123787, 123792, 123796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 123800, 123802, 123804, 123808, 123812, 123816, 0, 123818, + 123820, 123824, 123826, 123828, 123830, 123832, 123837, 123842, 123844, + 123850, 123854, 123858, 123866, 123868, 123870, 123872, 123874, 123876, + 123878, 123880, 123882, 123884, 123886, 123890, 123894, 123896, 123898, + 123900, 123902, 123904, 123909, 123915, 123919, 123923, 123927, 123931, + 123936, 123940, 123942, 123944, 123948, 123954, 123956, 123958, 123960, + 123964, 123973, 123979, 123983, 123987, 123989, 123991, 123994, 123996, + 123998, 124000, 124004, 124006, 124010, 124015, 124017, 124022, 124028, + 124035, 124039, 124043, 124047, 124051, 124057, 0, 0, 0, 124061, 124063, + 124067, 124071, 124073, 124077, 124081, 124083, 124087, 124089, 124093, + 124097, 124101, 124105, 124109, 124113, 124117, 124121, 124127, 124131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124135, 124139, 124143, 124147, + 124154, 124156, 124160, 124162, 124164, 124168, 124172, 124176, 124178, + 124182, 124186, 124190, 124194, 124198, 124200, 124204, 124206, 124212, + 124215, 124220, 124222, 124224, 124227, 124229, 124231, 124234, 124241, + 124248, 124255, 124260, 124264, 124266, 124268, 0, 124270, 124272, + 124276, 124280, 124284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 124286, 124290, 124295, 124299, 124305, 124311, 124313, + 124315, 124321, 124323, 124327, 124331, 124333, 124337, 124339, 124343, + 124347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124351, 124353, + 124355, 124357, 124361, 124363, 124365, 124367, 124369, 124371, 124373, + 124375, 124377, 124379, 124381, 124383, 124385, 124387, 124389, 124391, + 124393, 124395, 124397, 124399, 124401, 124403, 124405, 124409, 124411, + 124413, 124415, 124419, 124421, 124425, 124427, 124429, 124433, 124437, + 124443, 124445, 124447, 124449, 124451, 124455, 124459, 124461, 124465, + 124469, 124473, 124477, 124481, 124485, 124489, 124493, 124497, 124501, + 124505, 124509, 124513, 124517, 124521, 124525, 124529, 0, 124533, 0, + 124535, 124537, 124539, 124541, 124543, 124551, 124559, 124567, 124575, + 124580, 124585, 124590, 124594, 124598, 124603, 124607, 124609, 124613, + 124615, 124617, 124619, 124621, 124623, 124625, 124627, 124631, 124633, + 124635, 124637, 124641, 124645, 124649, 124653, 124657, 124659, 124665, + 124671, 124673, 124675, 124677, 124679, 124681, 124690, 124697, 124704, + 124708, 124715, 124720, 124727, 124736, 124741, 124745, 124749, 124751, + 124755, 124757, 124761, 124765, 124767, 124771, 124775, 124779, 124781, + 124783, 124789, 124791, 124793, 124795, 124799, 124803, 124805, 124809, + 124811, 124813, 124816, 124820, 124822, 124826, 124828, 124830, 124835, + 124837, 124841, 124845, 124848, 124852, 124856, 124860, 124864, 124868, + 124872, 124876, 124881, 124885, 124889, 124898, 124903, 124906, 124908, + 124911, 124914, 124919, 124921, 124924, 124929, 124933, 124936, 124940, + 124944, 124947, 124952, 124956, 124960, 124964, 124968, 124974, 124980, + 124986, 124992, 124997, 125008, 125010, 125014, 125016, 125018, 125022, + 125026, 125028, 125032, 125037, 125042, 125048, 125050, 125054, 125058, + 125065, 125072, 125076, 125078, 125080, 125084, 125086, 125090, 125094, + 125098, 125100, 125102, 125109, 125113, 125116, 125120, 125124, 125128, + 125130, 125134, 125136, 125138, 125142, 125144, 125148, 125152, 125158, + 125162, 125166, 125170, 125172, 125175, 125179, 125186, 125195, 125204, + 125212, 125220, 125222, 125226, 125228, 125232, 125243, 125247, 125253, + 125259, 125264, 0, 125266, 125270, 125272, 125274, 0, 0, 0, 125276, + 125281, 125291, 125306, 125318, 125330, 125334, 125338, 125344, 125346, + 125354, 125362, 125364, 125368, 125374, 125380, 125387, 125394, 125396, + 125398, 125401, 125403, 125409, 125411, 125414, 125418, 125424, 125430, + 125441, 125447, 125454, 125462, 125466, 125474, 125482, 125488, 125494, + 125501, 125503, 125507, 125509, 125511, 125516, 125518, 125520, 125522, + 125524, 125528, 125539, 125545, 125549, 125553, 125557, 125563, 125569, + 125575, 125581, 125586, 125591, 125597, 125603, 125610, 0, 0, 125617, + 125622, 125630, 125634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125643, + 125650, 125657, 125664, 125672, 125680, 125688, 125696, 125704, 125712, + 125720, 125728, 125736, 125742, 125748, 125754, 125760, 125766, 125772, + 125778, 125784, 125790, 125796, 125802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125808, 125812, 125816, + 125821, 125826, 125828, 125832, 125841, 125849, 125857, 125870, 125883, + 125896, 125903, 125910, 125914, 125923, 125931, 125935, 125944, 125951, + 125955, 125959, 125963, 125967, 125974, 125978, 125982, 125986, 125990, + 125997, 126006, 126015, 126022, 126034, 126046, 126050, 126054, 126058, + 126062, 126066, 126070, 126078, 126086, 126094, 126098, 126102, 126106, + 126110, 126114, 126118, 126124, 126130, 126134, 126145, 126153, 126157, + 126161, 126165, 126169, 126175, 126182, 126193, 126203, 126213, 126224, + 126233, 126244, 126250, 126256, 0, 0, 0, 0, 126262, 126271, 126278, + 126284, 126288, 126292, 126296, 126305, 126317, 126321, 126328, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126335, + 126337, 126339, 126343, 126347, 126351, 126360, 126362, 126364, 126367, + 126369, 126371, 126375, 126377, 126381, 126383, 126387, 126389, 126391, + 126395, 126399, 126405, 126407, 126411, 126413, 126417, 126421, 126425, + 126429, 126431, 126433, 126437, 126441, 126445, 126449, 126451, 126453, + 126455, 126460, 126465, 126468, 126476, 126484, 126486, 126491, 126494, + 126499, 126510, 126517, 126522, 126527, 126529, 126533, 126535, 126539, + 126541, 126545, 126549, 126552, 126555, 126557, 126560, 126562, 126566, + 126568, 126570, 126572, 126576, 126578, 126582, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 126585, 126590, 126595, 126600, 126605, 126610, 126615, 126622, + 126629, 126636, 126643, 126648, 126653, 126658, 126663, 126670, 126676, + 126683, 126690, 126697, 126702, 126707, 126712, 126717, 126722, 126729, + 126736, 126741, 126746, 126753, 126760, 126768, 126776, 126783, 126790, + 126798, 126806, 126814, 126821, 126831, 126842, 126847, 126854, 126861, + 126868, 126876, 126884, 126895, 126903, 126911, 126919, 126924, 126929, + 126934, 126939, 126944, 126949, 126954, 126959, 126964, 126969, 126974, + 126979, 126986, 126991, 126996, 127003, 127008, 127013, 127018, 127023, + 127028, 127033, 127038, 127043, 127048, 127053, 127058, 127063, 127070, + 127078, 127083, 127088, 127095, 127100, 127105, 127110, 127117, 127122, + 127129, 127134, 127141, 127146, 127155, 127164, 127169, 127174, 127179, + 127184, 127189, 127194, 127199, 127204, 127209, 127214, 127219, 127224, + 127229, 127237, 127245, 127250, 127255, 127260, 127265, 127270, 127276, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127282, 127286, 127290, 127294, + 127298, 127302, 127306, 127310, 127314, 127318, 127322, 127326, 127330, + 127334, 127338, 127342, 127346, 127350, 127354, 127358, 127362, 127366, + 127370, 127374, 127378, 127382, 127386, 127390, 127394, 127398, 127402, + 127406, 127410, 127414, 127418, 127422, 127426, 127430, 127434, 127438, + 127442, 127446, 127450, 127454, 127458, 127462, 127466, 127470, 127474, + 127478, 127482, 127486, 127490, 127494, 127498, 127502, 127506, 127510, + 127514, 127518, 127522, 127526, 127530, 127534, 127538, 127542, 127546, + 127550, 127554, 127558, 127562, 127566, 127570, 127574, 127578, 127582, + 127586, 127590, 127594, 127598, 127602, 127606, 127610, 127614, 127618, + 127622, 127626, 127630, 127634, 127638, 127642, 127646, 127650, 127654, + 127658, 127662, 127666, 127670, 127674, 127678, 127682, 127686, 127690, + 127694, 127698, 127702, 127706, 127710, 127714, 127718, 127722, 127726, + 127730, 127734, 127738, 127742, 127746, 127750, 127754, 127758, 127762, + 127766, 127770, 127774, 127778, 127782, 127786, 127790, 127794, 127798, + 127802, 127806, 127810, 127814, 127818, 127822, 127826, 127830, 127834, + 127838, 127842, 127846, 127850, 127854, 127858, 127862, 127866, 127870, + 127874, 127878, 127882, 127886, 127890, 127894, 127898, 127902, 127906, + 127910, 127914, 127918, 127922, 127926, 127930, 127934, 127938, 127942, + 127946, 127950, 127954, 127958, 127962, 127966, 127970, 127974, 127978, + 127982, 127986, 127990, 127994, 127998, 128002, 128006, 128010, 128014, + 128018, 128022, 128026, 128030, 128034, 128038, 128042, 128046, 128050, + 128054, 128058, 128062, 128066, 128070, 128074, 128078, 128082, 128086, + 128090, 128094, 128098, 128102, 128106, 128110, 128114, 128118, 128122, + 128126, 128130, 128134, 128138, 128142, 128146, 128150, 128154, 128158, + 128162, 128166, 128170, 128174, 128178, 128182, 128186, 128190, 128194, + 128198, 128202, 128206, 128210, 128214, 128218, 128222, 128226, 128230, + 128234, 128238, 128242, 128246, 128250, 128254, 128258, 128262, 128266, + 128270, 128274, 128278, 128282, 128286, 128290, 128294, 128298, 128302, + 128306, 128310, 128314, 128318, 128322, 128326, 128330, 128334, 128338, + 128342, 128346, 128350, 128354, 128358, 128362, 128366, 128370, 128374, + 128378, 128382, 128386, 128390, 128394, 128398, 128402, 128406, 128410, + 128414, 128418, 128422, 128426, 128430, 128434, 128438, 128442, 128446, + 128450, 128454, 128458, 128462, 128466, 128470, 128474, 128478, 128482, + 128486, 128490, 128494, 128498, 128502, 128506, 128510, 128514, 128518, + 128522, 128526, 128530, 128534, 128538, 128542, 128546, 128550, 128554, + 128558, 128562, 128566, 128570, 128574, 128578, 128582, 128586, 128590, + 128594, 128598, 128602, 128606, 128610, 128614, 128618, 128622, 128626, + 128630, 128634, 128638, 128642, 128646, 128650, 128654, 128658, 128662, + 128666, 128670, 128674, 128678, 128682, 128686, 128690, 128694, 128698, + 128702, 128706, 128710, 128714, 128718, 128722, 128726, 128730, 128734, + 128738, 128742, 128746, 128750, 128754, 128758, 128762, 128766, 128770, + 128774, 128778, 128782, 128786, 128790, 128794, 128798, 128802, 128806, + 128810, 128814, 128818, 128822, 128826, 128830, 128834, 128838, 128842, + 128846, 128850, 128854, 128858, 128862, 128866, 128870, 128874, 128878, + 128882, 128886, 128890, 128894, 128898, 128902, 128906, 128910, 128914, + 128918, 128922, 128926, 128930, 128934, 128938, 128942, 128946, 128950, + 128954, 128958, 128962, 128966, 128970, 128974, 128978, 128982, 128986, + 128990, 128994, 128998, 129002, 129006, 129010, 129014, 129018, 129022, + 129026, 129030, 129034, 129038, 129042, 129046, 129050, 129054, 129058, + 129062, 129066, 129070, 129074, 129078, 129082, 129086, 129090, 129094, + 129098, 129102, 129106, 129110, 129114, 129118, 129122, 129126, 129130, + 129134, 129138, 129142, 129146, 129150, 129154, 129158, 129162, 129166, + 129170, 129174, 129178, 129182, 129186, 129190, 129194, 129198, 129202, + 129206, 129210, 129214, 129218, 129222, 129226, 129230, 129234, 129238, + 129242, 129246, 129250, 129254, 129258, 129262, 129266, 129270, 129274, + 129278, 129282, 129286, 129290, 129294, 129298, 129302, 129306, 129310, + 129314, 129318, 129322, 129326, 129330, 129334, 129338, 129342, 129346, + 129350, 129354, 129358, 129362, 129366, 129370, 129374, 129378, 129382, + 129386, 129390, 129394, 129398, 129402, 129406, 129410, 129414, 129418, + 129422, 129426, 129430, 129434, 129438, 129442, 129446, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129450, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129454, 129457, 129461, 129465, 129468, 129472, 129476, + 129479, 129482, 129486, 129490, 129493, 129496, 129499, 129502, 129507, + 129510, 129514, 129517, 129520, 129523, 129526, 129529, 129532, 129535, + 129538, 129541, 129544, 129547, 129551, 129555, 129559, 129563, 129568, + 129573, 129579, 129585, 129591, 129596, 129602, 129608, 129614, 129619, + 129625, 129631, 129636, 129641, 129647, 129652, 129658, 129664, 129669, + 129675, 129681, 129686, 129692, 129698, 129704, 129710, 129716, 129720, + 129725, 129729, 129734, 129738, 129743, 129748, 129754, 129760, 129766, + 129771, 129777, 129783, 129789, 129794, 129800, 129806, 129811, 129816, + 129822, 129827, 129833, 129839, 129844, 129850, 129856, 129861, 129867, + 129873, 129879, 129885, 129891, 129896, 129900, 129905, 129907, 129911, + 129914, 129917, 129920, 129923, 129926, 129929, 129932, 129935, 129938, + 129941, 129944, 129947, 129950, 129953, 129956, 129959, 129962, 129965, + 129968, 129971, 129974, 129977, 129980, 129983, 129986, 129989, 129992, + 129995, 129998, 130001, 130004, 130007, 130010, 130013, 130016, 130019, + 130022, 130025, 130028, 130031, 130034, 130037, 130040, 130043, 130046, + 130049, 130052, 130055, 130058, 130061, 130064, 130067, 130070, 130073, + 130076, 130079, 130082, 130085, 130088, 130091, 130094, 130097, 130100, + 130103, 130106, 130109, 130112, 130115, 130118, 130121, 130124, 130127, + 130130, 130133, 130136, 130139, 130142, 130145, 130148, 130151, 130154, + 130157, 130160, 130163, 130166, 130169, 130172, 130175, 130178, 130181, + 130184, 130187, 130190, 130193, 130196, 130199, 130202, 130205, 130208, + 130211, 130214, 130217, 130220, 130223, 130226, 130229, 130232, 130235, + 130238, 130241, 130244, 130247, 130250, 130253, 130256, 130259, 130262, + 130265, 130268, 130271, 130274, 130277, 130280, 130283, 130286, 130289, + 130292, 130295, 130298, 130301, 130304, 130307, 130310, 130313, 130316, + 130319, 130322, 130325, 130328, 130331, 130334, 130337, 130340, 130343, + 130346, 130349, 130352, 130355, 130358, 130361, 130364, 130367, 130370, + 130373, 130376, 130379, 130382, 130385, 130388, 130391, 130394, 130397, + 130400, 130403, 130406, 130409, 130412, 130415, 130418, 130421, 130424, + 130427, 130430, 130433, 130436, 130439, 130442, 130445, 130448, 130451, + 130454, 130457, 130460, 130463, 130466, 130469, 130472, 130475, 130478, + 130481, 130484, 130487, 130490, 130493, 130496, 130499, 130502, 130505, + 130508, 130511, 130514, 130517, 130520, 130523, 130526, 130529, 130532, + 130535, 130538, 130541, 130544, 130547, 130550, 130553, 130556, 130559, + 130562, 130565, 130568, 130571, 130574, 130577, 130580, 130583, 130586, + 130589, 130592, 130595, 130598, 130601, 130604, 130607, 130610, 130613, + 130616, 130619, 130622, 130625, 130628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 130631, 130633, 130635, 130640, 130642, 130647, 130649, + 130654, 130656, 130661, 130663, 130665, 130667, 130669, 130671, 130673, + 130675, 130677, 130679, 130682, 130685, 130687, 130689, 130693, 130696, + 130701, 130703, 130705, 130707, 130711, 130714, 130716, 130720, 130722, + 130726, 130728, 130732, 130735, 130737, 130741, 130745, 130747, 130753, + 130755, 130760, 130762, 130767, 130769, 130774, 130776, 130781, 130783, + 130786, 130788, 130792, 130794, 130801, 130803, 130805, 130807, 130812, + 130814, 130816, 130818, 130820, 130822, 130827, 130831, 130833, 130838, + 130842, 130844, 130849, 130853, 130855, 130860, 130864, 130866, 130868, + 130870, 130872, 130876, 130878, 130883, 130885, 130891, 130893, 130899, + 130901, 130903, 130905, 130909, 130911, 130918, 130920, 130927, 130929, + 130934, 130939, 130941, 130947, 130953, 130955, 130961, 130966, 130968, + 130974, 130980, 130982, 130988, 130994, 130996, 131002, 131006, 131008, + 131013, 131015, 131017, 131022, 131024, 131026, 131032, 131034, 131039, + 131043, 131045, 131050, 131054, 131056, 131062, 131064, 131068, 131070, + 131074, 131076, 131083, 131090, 131092, 131099, 131106, 131108, 131113, + 131115, 131122, 131124, 131129, 131131, 131137, 131139, 131143, 131145, + 131151, 131153, 131157, 131159, 131165, 131167, 131169, 131171, 131176, + 131181, 131183, 131185, 131194, 131198, 131205, 131212, 131217, 131222, + 131234, 131236, 131238, 131240, 131242, 131244, 131246, 131248, 131250, + 131252, 131254, 131256, 131258, 131260, 131262, 131264, 131266, 131268, + 131270, 131272, 131274, 131276, 131282, 131289, 131294, 131299, 131310, + 131312, 131314, 131316, 131318, 131320, 131322, 131324, 131326, 131328, + 131330, 131332, 131334, 131336, 131338, 131340, 131342, 131347, 131349, + 131351, 131357, 131369, 131380, 131382, 131384, 131386, 131388, 131390, + 131392, 131394, 131396, 131398, 131400, 131402, 131404, 131406, 131408, + 131410, 131412, 131414, 131416, 131418, 131420, 131422, 131424, 131426, + 131428, 131430, 131432, 131434, 131436, 131438, 131440, 131442, 131444, + 131446, 131448, 131450, 131452, 131454, 131456, 131458, 131460, 131462, + 131464, 131466, 131468, 131470, 131472, 131474, 131476, 131478, 131480, + 131482, 131484, 131486, 131488, 131490, 131492, 131494, 131496, 131498, + 131500, 131502, 131504, 131506, 131508, 131510, 131512, 131514, 131516, + 131518, 131520, 131522, 131524, 131526, 131528, 131530, 131532, 131534, + 131536, 131538, 131540, 131542, 131544, 131546, 131548, 131550, 131552, + 131554, 131556, 131558, 131560, 131562, 131564, 131566, 131568, 131570, + 131572, 131574, 131576, 131578, 131580, 131582, 131584, 131586, 131588, + 131590, 131592, 131594, 131596, 131598, 131600, 131602, 131604, 131606, + 131608, 131610, 131612, 131614, 131616, 131618, 131620, 131622, 131624, + 131626, 131628, 131630, 131632, 131634, 131636, 131638, 131640, 131642, + 131644, 131646, 131648, 131650, 131652, 131654, 131656, 131658, 131660, + 131662, 131664, 131666, 131668, 131670, 131672, 131674, 131676, 131678, + 131680, 131682, 131684, 131686, 131688, 131690, 131692, 131694, 131696, + 131698, 131700, 131702, 131704, 131706, 131708, 131710, 131712, 131714, + 131716, 131718, 131720, 131722, 131724, 131726, 131728, 131730, 131732, + 131734, 131736, 131738, 131740, 131742, 131744, 131746, 131748, 131750, + 131752, 131754, 131756, 131758, 131760, 131762, 131764, 131766, 131768, + 131770, 131772, 131774, 131776, 131778, 131780, 131782, 131784, 131786, + 131788, 131790, 131792, 131794, 131796, 131798, 131800, 131802, 131804, + 131806, 131808, 131810, 131812, 131814, 131816, 131818, 131820, 131822, + 131824, 131826, 131828, 131830, 131832, 131834, 131836, 131838, 131840, + 131842, 131844, 131846, 131848, 131850, 131852, 131854, 131856, 131858, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 131860, 131870, 131880, 131889, 131898, 131911, + 131924, 131936, 131948, 131958, 131968, 131978, 131988, 131999, 132010, + 132020, 132029, 132038, 132047, 132060, 132073, 132085, 132097, 132107, + 132117, 132127, 132137, 132146, 132155, 132164, 132173, 132182, 132191, + 132200, 132209, 132218, 132227, 132236, 132245, 132256, 132266, 132276, + 132289, 132299, 132312, 132319, 132329, 132336, 132343, 132350, 132357, + 132364, 132371, 132380, 132389, 132398, 132407, 132416, 132425, 132434, + 132443, 132451, 132459, 132466, 132476, 132485, 132493, 132500, 132510, + 132519, 132529, 132539, 132550, 132560, 132569, 132579, 132588, 132598, + 132606, 132610, 132614, 132618, 132622, 132626, 132630, 132634, 132638, + 132642, 132646, 132649, 132653, 132656, 132659, 132663, 132667, 132671, + 132675, 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, + 132711, 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, + 132747, 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, + 132783, 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, + 132819, 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132851, + 132855, 132859, 132863, 132867, 132871, 132875, 132879, 132883, 132887, + 132891, 132895, 132899, 132903, 132907, 132911, 132915, 132919, 132923, + 132927, 132931, 132935, 132939, 132943, 132947, 132951, 132955, 132959, + 132963, 132967, 132971, 132975, 132979, 132983, 132987, 132991, 132995, + 132999, 133002, 133006, 133010, 133014, 133018, 133022, 133026, 133030, + 133034, 133038, 133042, 133046, 133050, 133054, 133058, 133062, 133066, + 133070, 133074, 133078, 133082, 133086, 133090, 133094, 133098, 133102, + 133106, 133110, 133114, 133118, 133122, 133126, 133130, 133134, 133138, + 133142, 133146, 133150, 133154, 133158, 133162, 133166, 133170, 133174, + 133178, 133182, 133186, 133190, 133194, 133198, 133202, 133206, 133210, + 133214, 133218, 133222, 133226, 133230, 133234, 133238, 133242, 133246, + 133250, 133254, 133258, 133262, 133266, 133270, 133274, 133278, 133282, + 133286, 133290, 133294, 133298, 133302, 133306, 133310, 133314, 133318, + 133322, 133326, 133330, 133334, 133338, 133342, 133346, 133350, 133354, + 133358, 133362, 133366, 133370, 133374, 133378, 133382, 133386, 133390, + 133394, 133398, 133402, 133406, 133410, 133414, 133418, 133422, 133426, + 133430, 133434, 133438, 133442, 133446, 133450, 133454, 133458, 133462, + 133466, 133470, 133474, 133478, 133482, 133486, 133490, 133494, 133498, + 133502, 133506, 133510, 133514, 133518, 133522, 133526, 133530, 133534, + 133538, 133542, 133546, 133550, 133554, 133558, 133562, 133566, 133570, + 133574, 133578, 133582, 133586, 133590, 133594, 133598, 133602, 133606, + 133610, 133614, 133618, 133622, 133626, 133630, 133634, 133638, 133642, + 133646, 133650, 133654, 133658, 133662, 133666, 133670, 133674, 133678, + 133682, 133686, 133690, 133694, 133698, 133702, 133706, 133710, 133714, + 133718, 133722, 133726, 133730, 133734, 133738, 133742, 133746, 133750, + 133754, 133758, 133762, 133766, 133771, 133776, 133781, 133785, 133791, + 133798, 133805, 133812, 133819, 133826, 133833, 133840, 133847, 133854, + 133861, 133868, 133875, 133882, 133888, 133895, 133902, 133908, 133915, + 133922, 133929, 133936, 133943, 133950, 133957, 133964, 133971, 133978, + 133985, 133992, 133999, 134005, 134011, 134018, 134025, 134034, 134043, + 134052, 134061, 134066, 134071, 134077, 134083, 134089, 134095, 134101, + 134107, 134113, 134119, 134125, 134131, 134137, 134143, 134148, 134154, + 134164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static unsigned int code_hash[] = { 74224, 4851, 0, 78156, 78499, 128685, 7929, 0, 194682, 127766, 78500, - 66480, 0, 42833, 74529, 12064, 0, 596, 983812, 69850, 13192, 8651, 0, 0, + 66480, 0, 42833, 74529, 12064, 0, 596, 983821, 69850, 13192, 8651, 0, 0, 120218, 12995, 64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 42897, 4233, 4234, 4232, 917836, 74415, 120210, 6384, 917840, 78108, 8851, 0, - 128553, 0, 41601, 8874, 983774, 7748, 0, 0, 0, 127939, 41603, 9784, 0, + 128553, 0, 41601, 8874, 983783, 7748, 0, 0, 0, 127939, 41603, 9784, 0, 9188, 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0, 3404, 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 94014, - 127764, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983851, + 127764, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983860, 65288, 0, 11398, 0, 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824, 3350, 120817, 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830, 78573, 0, 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562, - 2121, 64138, 4043, 8712, 64134, 64133, 11297, 983679, 983152, 11966, - 64128, 128587, 0, 0, 64132, 10867, 64130, 64129, 983835, 43374, 9779, + 2121, 64138, 4043, 8712, 64134, 64133, 11297, 983688, 983152, 11966, + 64128, 128587, 0, 0, 64132, 10867, 64130, 64129, 983844, 43374, 9779, 2764, 66002, 10167, 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 93981, 65282, - 2843, 5355, 127928, 983956, 0, 5194, 11657, 43984, 128292, 0, 983620, 0, + 2843, 5355, 127928, 983965, 0, 5194, 11657, 43984, 128292, 0, 983620, 0, 0, 127027, 10717, 64570, 5630, 5396, 64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, 64146, 64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, 6960, 0, 0, 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, 64108, 8090, 0, 74401, 917811, 587, 0, 128131, - 0, 0, 0, 78214, 2750, 74218, 556, 64158, 64157, 983940, 12213, 194678, + 0, 0, 0, 78214, 2750, 74218, 556, 64158, 64157, 983949, 12213, 194678, 2760, 0, 0, 0, 194794, 64156, 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, 11093, 64153, 64152, 0, 0, 4839, 0, 0, 1874, 119016, 0, 6577, 64125, 64124, 64123, 0, 127531, 92534, 7007, 7590, 65443, 9036, @@ -17116,12 +17133,12 @@ 64102, 7859, 1945, 64099, 0, 10453, 64104, 7188, 7997, 0, 7389, 983161, 8705, 64097, 64096, 9571, 528, 128671, 44017, 11429, 71347, 0, 983077, 917990, 73841, 0, 0, 9056, 64313, 6188, 120019, 6155, 64068, 1823, 64066, - 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, 6639, 64064, 983766, - 128344, 0, 1176, 118959, 127930, 8162, 128667, 983822, 0, 120519, 66376, + 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, 6639, 64064, 983775, + 128344, 0, 1176, 118959, 127930, 8162, 128667, 983831, 0, 120519, 66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222, - 69902, 7768, 0, 4199, 64708, 983414, 0, 0, 8708, 9560, 64077, 64076, + 69902, 7768, 0, 4199, 64708, 983421, 0, 0, 8708, 9560, 64077, 64076, 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 126570, 0, 64615, 41915, - 0, 12075, 70062, 0, 5174, 983216, 0, 127557, 3123, 0, 12685, 127904, + 0, 12075, 70062, 0, 5174, 983217, 0, 127557, 3123, 0, 12685, 127904, 8408, 64704, 0, 0, 9223, 0, 41616, 67999, 73797, 0, 1116, 128204, 43049, 7136, 43050, 8548, 120485, 0, 119061, 917999, 0, 13115, 43675, 64091, 9322, 0, 120595, 64095, 64094, 8111, 66247, 42332, 64089, 64088, 6199, 0, @@ -17129,10 +17146,10 @@ 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114, 0, 42627, 0, 32, 6187, 119052, 11495, 11459, 3665, 983600, 42871, 0, 19923, 74335, 0, 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0, - 983459, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181, + 983466, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181, 65014, 0, 0, 983196, 3639, 119588, 0, 0, 118904, 10073, 120206, 128862, 127186, 68409, 42844, 7498, 1098, 92565, 120205, 0, 983118, 10207, 8789, - 983224, 0, 0, 983465, 9234, 0, 6182, 983467, 65058, 0, 983471, 983468, 0, + 983225, 0, 0, 983472, 9234, 0, 6182, 983474, 65058, 0, 983478, 983475, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 94072, 0, 66238, 12844, 0, 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, 41337, 0, 41631, 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408, 6579, 0, 64618, @@ -17140,10 +17157,10 @@ 9992, 128299, 5057, 0, 0, 74538, 5054, 118951, 194971, 78606, 0, 1437, 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 127878, 0, 128529, 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0, - 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 983947, 127524, 0, 0, 0, - 0, 195083, 0, 983834, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, - 67854, 8125, 120545, 6743, 119175, 917940, 2369, 0, 983963, 983964, - 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 127827, 983848, 264, + 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 983956, 127524, 0, 0, 0, + 0, 195083, 0, 983843, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, + 67854, 8125, 120545, 6743, 119175, 917940, 2369, 0, 983972, 983973, + 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 127827, 983857, 264, 2375, 8060, 6194, 119858, 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839, 0, 8800, 0, 42862, 4463, 65581, 6192, 194676, 42771, 0, 92333, 725, 65042, 118797, 120800, 983040, 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, @@ -17161,634 +17178,634 @@ 126503, 41607, 120115, 1679, 120116, 120180, 120113, 127462, 7005, 41609, 9580, 0, 401, 69949, 43779, 6968, 5761, 342, 8553, 0, 8143, 127115, 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, 0, 5076, 0, - 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 92523, 120102, - 7138, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, 64775, - 5036, 5035, 120590, 42604, 983647, 0, 8074, 275, 13291, 1907, 78838, - 4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546, - 127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409, - 127256, 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, - 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 983177, 5030, 0, - 0, 0, 73869, 9622, 0, 69944, 6787, 0, 0, 0, 983583, 10544, 12919, 0, - 92218, 0, 0, 69906, 120789, 0, 947, 119835, 194586, 194585, 10969, - 119935, 7613, 92562, 119936, 4795, 119930, 7018, 7376, 120181, 120192, - 120268, 0, 43567, 74056, 917910, 11833, 119919, 7216, 65232, 7217, 251, - 7218, 7895, 4395, 43538, 119926, 119929, 119928, 7213, 119922, 7214, - 7215, 983827, 74141, 8880, 7685, 66459, 120173, 65540, 119618, 625, 8187, - 42861, 1113, 7236, 7915, 3630, 120176, 8179, 74264, 67886, 9316, 10980, - 2489, 65624, 8150, 1359, 67652, 127329, 127330, 73756, 5042, 5041, 42769, - 12084, 127324, 127321, 92279, 127319, 127320, 127317, 127318, 127315, - 12283, 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, - 3239, 127311, 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, - 5040, 0, 0, 983436, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184, - 74293, 0, 64648, 0, 9359, 78416, 0, 128770, 65157, 6662, 0, 0, 3863, - 73909, 4835, 55266, 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301, - 0, 42589, 569, 0, 73813, 711, 4389, 7133, 0, 73880, 11610, 11368, 0, - 194570, 41331, 1006, 74240, 0, 1550, 8201, 73737, 7627, 5499, 5031, - 77908, 42738, 65784, 77907, 65267, 3758, 0, 65781, 64734, 70073, 2440, - 65780, 77913, 8449, 0, 5008, 983572, 2118, 0, 12121, 8255, 5512, 73875, - 2128, 2130, 2131, 2126, 2133, 1119, 127068, 2114, 2116, 2455, 0, 2122, - 2123, 2124, 2125, 127486, 8714, 983811, 2113, 0, 2115, 128177, 127907, - 43713, 5052, 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, 42647, - 5050, 302, 388, 41115, 735, 6637, 5907, 65088, 0, 12726, 74594, 9117, - 983181, 12003, 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470, - 78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, 0, 0, 92313, 0, 74497, - 92395, 8089, 6929, 639, 983563, 68179, 64442, 0, 92348, 4599, 41402, - 6674, 43397, 43294, 1476, 648, 0, 65819, 3233, 0, 41782, 6951, 94017, - 983967, 3530, 9750, 128317, 0, 6656, 42618, 0, 5046, 8512, 65856, 74261, - 8967, 0, 5045, 42026, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0, - 7853, 74068, 74004, 9669, 12341, 12703, 8402, 0, 119070, 917600, 41750, - 3586, 64508, 43148, 0, 0, 119606, 67983, 13296, 517, 0, 128534, 194946, - 41528, 123, 65454, 0, 0, 74478, 10531, 7784, 41526, 10829, 73991, 8057, - 1126, 73895, 0, 194591, 0, 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, - 120441, 120452, 43151, 983178, 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, - 6183, 0, 0, 0, 120448, 7623, 118925, 118889, 9235, 12760, 74176, 69662, - 66445, 43540, 10062, 3743, 11514, 11078, 0, 12136, 0, 126597, 120435, 0, - 7726, 0, 19922, 267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, - 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 0, 983341, 0, 3391, - 41075, 2476, 0, 128017, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934, - 127537, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 983335, 0, 983871, - 126638, 9053, 13015, 74523, 0, 704, 66215, 6195, 983819, 6660, 78758, - 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983334, - 74547, 126585, 65448, 78100, 12948, 119001, 195002, 119238, 195004, - 78099, 127085, 0, 128320, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, - 0, 42533, 168, 42845, 4898, 64298, 983141, 0, 4901, 1821, 0, 578, 3653, - 0, 791, 9162, 6977, 0, 78889, 74561, 0, 73731, 8354, 43590, 119303, - 983442, 7557, 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996, - 12811, 65925, 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, - 74599, 78449, 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, - 78083, 128824, 8729, 78456, 0, 7845, 917917, 71302, 4408, 4122, 6772, - 11039, 8723, 194990, 71310, 119302, 731, 119304, 92286, 2438, 64855, - 119300, 119299, 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0, - 0, 0, 41952, 0, 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291, - 19915, 5277, 12963, 127864, 6189, 4125, 1314, 12133, 120340, 118873, - 1271, 983631, 0, 66024, 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, - 4574, 0, 7567, 7459, 983160, 41390, 5384, 41882, 67647, 92548, 5759, - 983903, 0, 41388, 64446, 41392, 64288, 41387, 0, 8706, 5552, 983187, 700, - 0, 5553, 0, 7088, 5356, 7499, 68007, 66596, 74066, 0, 10263, 5554, 0, - 12344, 10311, 78113, 6665, 92626, 0, 7618, 8517, 11455, 78440, 64632, - 64447, 5555, 78088, 78093, 78091, 0, 42803, 65033, 9143, 6668, 195067, - 67995, 195069, 656, 195071, 65037, 4577, 64624, 0, 0, 0, 983640, 4269, - 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895, 66683, 10554, - 917778, 119121, 0, 5098, 917770, 0, 119099, 5097, 4935, 9848, 10381, 0, - 128870, 983692, 3651, 0, 120730, 127556, 5102, 5101, 10269, 12983, 8138, - 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, 5099, 78373, 1441, - 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, 9031, 120790, - 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 126543, 0, 2676, 2277, - 0, 73812, 6190, 8599, 195053, 69918, 10795, 9857, 7014, 9856, 195033, - 92620, 12129, 0, 8481, 0, 6202, 195035, 10920, 128237, 5203, 195039, - 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, 74772, 0, 12613, 5284, - 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 78786, 5103, - 127861, 64348, 41368, 43974, 488, 69811, 0, 71339, 10157, 0, 43034, - 11438, 64674, 0, 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813, - 41367, 5105, 127509, 69720, 6476, 5104, 983740, 304, 3176, 119010, 0, - 932, 120633, 6567, 238, 69656, 195011, 194595, 19905, 120577, 195015, - 78870, 41044, 67640, 194902, 42055, 9912, 65939, 10670, 74093, 13273, 0, - 12552, 195019, 8803, 309, 6622, 8151, 10858, 78706, 67636, 0, 12568, 0, - 12553, 10814, 43275, 6950, 9712, 68680, 43970, 983198, 65165, 92725, 0, - 66466, 0, 0, 0, 66725, 6191, 11351, 10437, 11316, 67634, 43763, 0, 41754, - 67635, 9370, 2720, 194975, 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, - 0, 0, 10834, 0, 0, 65732, 94095, 917547, 92682, 67679, 195020, 0, 7781, - 41383, 64568, 0, 120738, 12077, 0, 64586, 917620, 42396, 55255, 3475, - 128035, 2479, 0, 3632, 120728, 10698, 8376, 3648, 194960, 74844, 67639, - 3636, 67894, 3650, 8837, 65229, 1843, 42283, 43250, 41562, 9100, 74548, - 917630, 3640, 127190, 42321, 7284, 194974, 194973, 194950, 194949, - 194952, 194951, 126649, 194953, 42080, 2529, 0, 0, 0, 42083, 120678, - 68398, 194957, 67619, 66367, 194958, 9634, 92380, 9988, 0, 41068, 0, - 4295, 65264, 68006, 0, 92545, 0, 785, 8236, 128647, 9027, 68160, 67623, - 64383, 120265, 925, 127156, 0, 41985, 41071, 9586, 0, 41984, 9217, 0, 0, - 0, 9186, 2067, 4016, 983794, 0, 381, 12936, 0, 42077, 0, 69880, 5184, - 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, 0, 0, 812, 3615, - 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605, 10692, 1166, - 64429, 42639, 924, 0, 67631, 42616, 120670, 2442, 10703, 78789, 67632, - 917924, 12771, 12736, 12753, 66708, 73933, 67626, 42401, 0, 69872, - 127373, 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626, - 3883, 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, - 2715, 806, 65208, 41884, 917883, 1318, 64731, 126578, 0, 0, 66325, 3465, - 2405, 9240, 0, 12756, 65259, 0, 983772, 12752, 5833, 1432, 0, 41883, - 73912, 9799, 0, 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0, - 194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, 0, 68005, 10622, 983770, 0, - 78654, 6566, 78659, 0, 73780, 119196, 64864, 0, 78660, 0, 8284, 13081, 0, - 3589, 42051, 4035, 6492, 92236, 4265, 6642, 3977, 74186, 41778, 836, - 119216, 2488, 0, 4582, 0, 0, 41777, 12926, 983370, 7528, 10550, 0, 92706, - 0, 10961, 0, 1374, 64878, 119014, 0, 42389, 41374, 2286, 0, 78492, 41377, - 127909, 0, 400, 12597, 120586, 0, 0, 6661, 983145, 64827, 0, 73817, 390, - 0, 71301, 983853, 3473, 7718, 0, 0, 0, 55285, 0, 0, 0, 11969, 983383, - 127841, 6365, 1887, 6763, 983363, 8080, 7006, 0, 983364, 6757, 64351, - 1544, 0, 6766, 64677, 120716, 983365, 6146, 0, 771, 983366, 0, 12812, - 13168, 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0, - 11491, 9724, 10341, 983764, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0, - 471, 7484, 7482, 6753, 7480, 5764, 7478, 7477, 6501, 7475, 6918, 7473, - 7472, 2474, 7470, 7468, 10232, 10615, 10213, 127288, 92357, 10049, 11834, - 3544, 0, 6017, 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 0, - 120544, 0, 0, 92660, 0, 0, 0, 19961, 2472, 42665, 92341, 0, 2139, 4256, - 120776, 74380, 0, 42675, 42658, 12845, 0, 0, 65138, 119355, 67862, 0, - 65671, 7083, 120008, 8066, 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, - 445, 120566, 128308, 0, 0, 8330, 0, 0, 42797, 983150, 120215, 0, 3902, 0, - 1770, 0, 128866, 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866, - 118928, 1118, 71334, 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 69921, 4903, - 0, 41386, 5162, 119189, 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334, - 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, 983732, 12715, 68002, - 983472, 126630, 2018, 66672, 41979, 66685, 119157, 68000, 92464, 0, - 126984, 68001, 9334, 92705, 92315, 70101, 7975, 0, 77957, 0, 66621, 4884, - 66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, 0, 2345, 43697, 463, 0, 0, - 119607, 3117, 5460, 0, 0, 983380, 0, 42279, 194577, 0, 78415, 0, 195008, - 983377, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 1471, 0, 0, - 42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, 983685, 2460, 0, 11944, - 12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024, 127180, 0, - 0, 539, 0, 127765, 94052, 3853, 65180, 127923, 120796, 120245, 92324, 0, - 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, 4162, 0, 4260, 12953, - 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310, 5000, - 0, 983579, 0, 69672, 8213, 74017, 7771, 6161, 68018, 6709, 0, 78885, - 983699, 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0, - 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 983257, 0, - 12210, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, 12516, 4444, 0, - 92271, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, 3591, 41969, 0, - 2453, 128549, 92666, 64705, 0, 0, 10349, 10413, 43591, 41962, 3202, - 74353, 0, 8316, 0, 0, 94060, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883, - 285, 4723, 70099, 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0, - 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, 983336, 43437, - 3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, - 0, 120236, 65221, 63883, 43334, 64852, 0, 65194, 66201, 0, 66578, 5001, - 41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, 73889, 74182, - 127915, 643, 3086, 0, 42448, 42299, 58, 0, 917952, 120083, 63873, 8491, - 0, 0, 0, 4530, 42409, 7126, 194575, 2721, 120074, 119096, 19929, 0, - 194574, 0, 4242, 4264, 120077, 120530, 66179, 42412, 65941, 13114, 64522, - 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, 983233, 55280, 42174, - 194925, 42430, 0, 0, 42355, 66026, 4306, 41380, 68432, 92586, 0, 66667, - 127309, 0, 126521, 42200, 42566, 0, 0, 5088, 6948, 0, 8524, 0, 0, 12385, - 0, 0, 69646, 1386, 64580, 11480, 6116, 65039, 65038, 12392, 65036, 8064, - 0, 12101, 5822, 119004, 2080, 710, 77999, 11663, 1666, 42091, 119657, - 12383, 43671, 42092, 68418, 4289, 0, 63896, 12061, 42096, 43621, 3362, - 12377, 983823, 983825, 68449, 7461, 73901, 1244, 331, 73786, 12683, - 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, 41964, 42208, 63843, - 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, 13032, 0, 584, - 12933, 43177, 12373, 69855, 13000, 1351, 2935, 8698, 12665, 0, 1930, 0, - 78229, 12427, 66514, 69859, 13031, 0, 63901, 0, 3657, 128572, 65202, - 6000, 119206, 12426, 127181, 0, 41740, 12428, 41283, 41916, 119210, 0, 0, - 12429, 6727, 0, 7562, 0, 5170, 0, 41755, 676, 0, 66704, 66664, 9978, - 66491, 3536, 0, 9752, 92397, 6162, 0, 69228, 10113, 41829, 65886, 5159, - 12422, 41832, 439, 43077, 0, 42207, 74549, 11796, 40970, 41830, 0, - 917799, 8308, 917797, 917796, 0, 67864, 917801, 917800, 12336, 4135, - 69805, 341, 2727, 4129, 3539, 0, 63861, 0, 7913, 0, 63859, 4131, 63868, - 0, 63867, 4133, 11371, 210, 4600, 0, 74560, 4137, 8082, 78506, 119062, - 78504, 6704, 4591, 128029, 0, 0, 9680, 0, 120623, 561, 12159, 195, 78508, - 41501, 0, 42031, 5719, 7172, 42687, 8368, 0, 41499, 0, 0, 42242, 41498, - 917794, 42025, 78565, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213, - 73941, 0, 42330, 917784, 3969, 0, 0, 7169, 1992, 9652, 73977, 7246, - 42086, 126615, 2219, 0, 0, 128801, 194837, 0, 327, 0, 9042, 917777, - 917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 983826, - 917782, 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0, - 128014, 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436, - 983240, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, - 11348, 0, 78037, 9194, 983184, 0, 19914, 12179, 983803, 2296, 194923, - 63836, 63832, 917773, 10967, 63816, 2594, 3444, 63817, 64651, 0, 41503, - 127478, 11265, 0, 120756, 194922, 0, 5664, 3972, 0, 0, 0, 128508, 12416, - 917764, 119608, 10816, 917769, 917768, 12418, 74111, 3882, 8532, 917771, - 1573, 128648, 119847, 4596, 66339, 12417, 66001, 65343, 126491, 12414, - 8287, 68219, 195017, 68108, 1143, 119169, 119846, 12415, 6626, 42763, 0, - 118884, 9021, 120783, 0, 11724, 0, 0, 127104, 126619, 0, 0, 8027, 10997, - 9171, 12741, 11400, 71305, 194799, 0, 128239, 0, 128881, 119604, 127523, - 120190, 194773, 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514, - 68651, 0, 983886, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, - 3889, 8521, 5083, 5082, 119859, 120184, 8519, 983236, 3014, 5081, 65853, - 120715, 0, 68014, 69951, 5079, 64802, 42210, 4597, 65532, 11828, 120185, - 12371, 0, 8407, 0, 10805, 8518, 10779, 120188, 71303, 983924, 12367, - 42170, 0, 92557, 629, 1924, 0, 12037, 74366, 5987, 8462, 8005, 12365, - 63933, 69735, 120815, 12369, 10649, 67981, 5077, 120174, 10880, 63927, - 5075, 917881, 0, 65075, 0, 11007, 983696, 66659, 92607, 0, 66684, 0, - 3434, 4954, 1904, 0, 5266, 126980, 5272, 10499, 4507, 9578, 63923, - 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, 4504, 1505, 0, 6325, - 5276, 43021, 120488, 0, 55236, 0, 66461, 5177, 41324, 12055, 8722, 0, - 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, 41325, 0, 721, 10182, 9108, - 71311, 0, 119185, 42229, 194912, 0, 5998, 0, 42353, 74825, 0, 12587, - 94104, 78571, 0, 71328, 194562, 41576, 42215, 78570, 119207, 0, 8578, - 5995, 7573, 41575, 74789, 74752, 63944, 63949, 64767, 2670, 4167, 194796, - 11723, 0, 74120, 0, 65076, 938, 43414, 73854, 11737, 9721, 0, 0, 0, - 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, 10793, 5250, 12407, - 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0, 42002, - 12404, 983553, 0, 4940, 12410, 7683, 1167, 73729, 4983, 120507, 861, 0, - 0, 0, 0, 43757, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, 12816, 43759, - 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 195044, 0, 12577, - 0, 983875, 853, 42693, 195014, 0, 983638, 5016, 43535, 63893, 42835, - 9491, 917913, 0, 917914, 0, 12712, 7105, 127807, 65060, 120797, 9900, - 7750, 0, 194919, 0, 127830, 0, 64778, 12585, 10565, 128151, 12177, 0, 0, - 0, 77824, 0, 4900, 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593, - 43113, 9702, 78594, 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710, - 12397, 77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, - 5010, 1680, 10507, 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 128181, - 5993, 2819, 0, 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, - 63997, 63910, 63996, 3077, 0, 0, 1512, 69929, 12589, 41479, 128313, 0, - 43339, 0, 9836, 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, - 1664, 1850, 128841, 3079, 11340, 42408, 42447, 127140, 120020, 42307, - 12386, 42304, 917555, 0, 12389, 0, 92366, 41996, 11526, 63985, 5864, - 1147, 63992, 42887, 1987, 92718, 5480, 7858, 11653, 4116, 12391, 66193, - 0, 4939, 12384, 0, 0, 41686, 63905, 119601, 194688, 983190, 0, 12649, 0, - 0, 8247, 507, 91, 2042, 120775, 43643, 194689, 66028, 10036, 41844, - 119813, 774, 119829, 0, 119815, 5994, 12539, 0, 78375, 120597, 119833, - 983105, 119600, 0, 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, - 41073, 9687, 41681, 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, - 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, 983652, 0, 43119, 0, - 120753, 12403, 2500, 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103, - 19946, 74112, 77851, 13112, 0, 195012, 12859, 70087, 120148, 66369, 5861, - 127758, 11999, 12400, 0, 983830, 12645, 5146, 11320, 68410, 6748, 65040, - 0, 64184, 12974, 64183, 67613, 120645, 5147, 0, 0, 74524, 0, 1928, 0, - 67649, 5991, 3445, 67609, 4976, 64176, 0, 67610, 8241, 0, 77868, 4206, 0, - 0, 0, 128298, 0, 10138, 0, 0, 8897, 120234, 0, 8357, 4124, 77862, 65836, - 120641, 127926, 77859, 0, 0, 1123, 963, 41553, 10120, 12405, 120150, - 92664, 398, 13278, 9723, 6366, 120311, 7945, 0, 4402, 9970, 12402, - 983136, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, 12969, 120824, - 41465, 983565, 8528, 1575, 0, 63955, 165, 3024, 41467, 119163, 0, 9093, - 0, 9147, 128787, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750, 195018, 0, - 9594, 0, 0, 43527, 0, 727, 194703, 195023, 5805, 0, 6726, 0, 42176, - 12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, 120307, 0, 92343, 0, - 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, 4132, - 120306, 68474, 92473, 0, 983306, 74837, 120155, 1499, 0, 8055, 42740, - 63965, 0, 63962, 74042, 8924, 43123, 5988, 3660, 63969, 11781, 42718, - 8788, 1357, 64851, 65743, 0, 8774, 0, 127086, 9941, 120172, 0, 1933, - 69655, 9564, 0, 92435, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615, - 70081, 78302, 12220, 67616, 120598, 127475, 0, 68200, 6675, 128144, 0, - 67592, 120685, 0, 64771, 1198, 9132, 0, 64619, 510, 64663, 0, 0, 4561, - 2101, 1398, 0, 92554, 74034, 41569, 92684, 11406, 8167, 12127, 0, 840, 0, - 126518, 7101, 6967, 0, 194898, 9796, 0, 333, 69891, 0, 8144, 2117, 0, - 983595, 12406, 0, 19931, 119089, 6678, 7769, 0, 12621, 0, 127366, 10227, - 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, 42202, 12754, 195022, 0, 0, - 94097, 67594, 2048, 12944, 4050, 67595, 917967, 43102, 10581, 12985, - 4533, 195021, 74003, 6490, 0, 12038, 0, 0, 120704, 65461, 9798, 69704, 0, - 1948, 69841, 0, 952, 128235, 0, 0, 120802, 6449, 9494, 120313, 0, 43098, - 4843, 8142, 64160, 4098, 64170, 0, 0, 3436, 119973, 0, 12817, 67597, - 6676, 3930, 42615, 0, 0, 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, - 0, 8500, 42222, 120142, 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, - 67606, 119083, 0, 42217, 13102, 0, 66003, 6672, 0, 0, 0, 983738, 63841, - 9613, 9001, 4526, 11274, 67601, 64520, 64210, 6664, 78704, 42056, 10228, - 64957, 11281, 0, 3807, 1469, 66640, 65381, 42197, 4988, 42372, 0, 9598, - 904, 352, 42225, 1451, 8061, 8453, 4134, 0, 74847, 66576, 127916, 0, - 10520, 8575, 9960, 1201, 127289, 12846, 127291, 127292, 11919, 64962, - 127287, 43739, 127281, 8511, 9460, 823, 11587, 12305, 0, 64695, 127305, - 12387, 1253, 13183, 65766, 500, 42783, 65765, 64208, 64369, 65760, 65761, - 119585, 11606, 64784, 11702, 66498, 9821, 64304, 0, 5152, 11048, 7533, - 68366, 64410, 92305, 0, 4323, 120062, 92669, 71332, 127052, 42587, 42214, - 41394, 0, 4763, 4112, 118935, 0, 5260, 43143, 94038, 326, 120131, 68423, - 0, 10771, 2876, 74074, 92530, 194924, 41398, 7382, 9802, 127077, 127076, - 453, 41396, 120524, 42720, 12140, 9572, 0, 7003, 194883, 42334, 7704, - 126490, 194885, 43144, 4123, 8494, 43146, 9977, 0, 0, 65759, 10765, - 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, 9589, 64755, 0, 64020, - 126604, 10464, 0, 0, 194869, 64514, 11528, 64024, 128072, 679, 64013, 0, - 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 983567, 64005, 4058, - 119019, 126487, 64660, 0, 119050, 0, 983069, 1139, 43298, 64027, 64029, - 8970, 0, 9934, 983094, 10774, 128020, 42201, 12421, 128216, 0, 1852, - 3057, 64046, 73744, 64034, 64039, 0, 0, 0, 194899, 92322, 7645, 12854, - 74338, 3496, 0, 0, 0, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419, - 13309, 11570, 127811, 19960, 11696, 0, 1018, 118970, 194909, 194897, - 1682, 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, 6768, - 10728, 194830, 71316, 118863, 43311, 64966, 11577, 0, 43040, 1833, 11576, - 0, 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, 120387, - 9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, 65693, 0, 0, - 0, 69695, 42240, 0, 126651, 42864, 126498, 64667, 41868, 1184, 0, 815, - 11484, 127535, 67840, 983642, 0, 66197, 0, 10986, 64683, 983776, 0, 3455, - 0, 0, 9879, 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, - 5142, 2407, 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0, - 0, 92390, 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, - 2652, 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562, - 917505, 1828, 74474, 120327, 78620, 8531, 12499, 6280, 12324, 118854, - 65238, 68374, 4832, 65573, 0, 6279, 12508, 12904, 12502, 9161, 0, 1620, - 64436, 3601, 195094, 128073, 983562, 609, 11555, 983099, 12496, 127839, - 74181, 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, - 0, 43565, 71306, 126493, 12696, 128256, 0, 94062, 12929, 0, 712, 0, 4197, - 983205, 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 0, - 12651, 0, 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592, - 118844, 0, 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178, - 0, 69760, 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0, - 9080, 127000, 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488, - 65166, 119112, 0, 0, 0, 0, 71313, 0, 5265, 69235, 0, 11487, 67858, 12464, - 0, 43045, 0, 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0, - 43346, 8116, 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, - 983602, 120811, 0, 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, - 55257, 73771, 1766, 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, - 64595, 127294, 0, 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, - 0, 0, 119060, 64953, 5406, 19920, 69897, 66510, 3590, 194864, 1130, 0, 0, - 42016, 11823, 43023, 0, 118896, 7742, 0, 13280, 71323, 9326, 73826, 5310, - 74812, 78584, 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, - 120803, 983839, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, - 127182, 0, 73917, 7843, 69783, 11689, 5410, 5783, 10468, 8403, 5400, - 11594, 128247, 0, 118990, 10491, 69842, 64412, 0, 0, 5587, 42865, 64404, - 8268, 4923, 65086, 8981, 12382, 42133, 120755, 9706, 69738, 0, 66610, - 10461, 12103, 0, 8642, 0, 42766, 983857, 2210, 9983, 0, 94009, 0, 0, 0, - 7398, 41515, 0, 11802, 8041, 1461, 910, 119133, 0, 6749, 3658, 93964, - 120525, 0, 7617, 194841, 12888, 127983, 67668, 13143, 0, 9193, 11097, - 5703, 0, 41517, 41504, 41519, 10016, 64305, 0, 65864, 623, 781, 670, - 10660, 5769, 613, 7543, 120279, 477, 41083, 92521, 0, 592, 1578, 12459, - 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, 0, 647, 0, 633, 120744, 0, - 126472, 12480, 43243, 0, 39, 12487, 0, 120529, 74199, 12482, 0, 12489, 0, - 3195, 5550, 983554, 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, 0, - 2877, 0, 0, 1675, 69840, 0, 0, 0, 10070, 10595, 0, 119077, 194777, - 983611, 0, 0, 0, 43244, 0, 0, 983907, 119561, 983078, 0, 194921, 128160, - 9939, 0, 983151, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0, - 74038, 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, 9282, - 66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0, - 10732, 68640, 850, 4972, 0, 12890, 2909, 68619, 44008, 68627, 983709, - 11544, 10203, 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311, - 777, 120187, 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 983231, - 9454, 63778, 8658, 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, - 42502, 8280, 74520, 2701, 0, 127002, 5767, 0, 0, 9809, 8353, 63747, - 66701, 63772, 983805, 63745, 1748, 63770, 0, 0, 0, 65542, 63766, 55244, - 3061, 0, 63764, 63787, 9067, 6096, 0, 7694, 0, 7257, 63768, 3485, 12987, - 0, 127522, 120628, 63807, 1591, 0, 6386, 63783, 0, 0, 92535, 0, 0, 0, - 74575, 0, 65719, 13083, 64574, 65012, 0, 1640, 12495, 66691, 7624, 3138, - 10996, 92247, 1922, 0, 12498, 10987, 69936, 69939, 3894, 65543, 0, - 194842, 983588, 493, 0, 43197, 1717, 4228, 479, 10303, 74020, 0, 917935, - 10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002, - 12491, 0, 64911, 92615, 2096, 65120, 0, 78219, 983081, 8378, 11632, - 127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, 8507, - 66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 983552, 7909, - 66234, 11605, 63759, 983645, 66208, 73999, 63799, 63803, 244, 11542, - 12898, 12494, 73761, 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882, - 13040, 0, 8612, 4885, 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0, - 63797, 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, - 470, 78038, 78035, 78036, 70028, 78034, 4579, 128090, 0, 12511, 74453, - 12514, 0, 74579, 7239, 7001, 8623, 94011, 128052, 128048, 7378, 12512, - 11615, 6104, 0, 0, 659, 6098, 0, 12234, 127307, 127067, 8311, 12510, - 41803, 13039, 127072, 12513, 10202, 12471, 0, 8747, 983911, 0, 0, 2323, - 0, 2319, 77917, 12477, 77916, 2311, 0, 4415, 237, 6281, 127280, 0, 0, - 2309, 1312, 8173, 128871, 12469, 0, 78505, 64335, 10609, 0, 128111, 9397, - 11524, 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, - 9386, 9383, 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, - 2313, 128167, 7948, 9236, 92571, 0, 0, 10570, 43473, 6289, 10484, 0, 0, - 11998, 12082, 10924, 3147, 0, 120684, 12524, 119081, 2310, 11818, 9381, - 9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 983769, 9372, - 12444, 0, 0, 13016, 8210, 983949, 42029, 11079, 12331, 43451, 42032, - 8744, 726, 0, 983828, 4155, 0, 0, 42030, 5007, 12522, 43088, 0, 4951, - 127805, 127240, 0, 9922, 43309, 983832, 12525, 983464, 12016, 65770, - 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 92567, 65691, 63998, - 1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0, 12231, 0, 12500, - 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, 78395, - 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, 9076, 8862, - 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, 126514, - 8546, 11553, 63995, 13177, 9043, 6303, 983938, 498, 64471, 120324, - 128567, 12529, 8042, 0, 2344, 12528, 8031, 2414, 0, 69719, 3231, 0, 6422, - 66512, 69653, 12530, 2537, 78405, 41429, 12658, 13036, 65772, 0, 78738, - 41433, 4719, 469, 0, 4363, 3313, 41428, 78407, 2023, 1772, 78224, 78225, - 65706, 10051, 64812, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, - 9607, 0, 9663, 0, 119634, 6503, 41110, 0, 1491, 0, 0, 127304, 41061, 0, - 194838, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, 41108, - 9738, 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717, - 127776, 9940, 127299, 7692, 983824, 8008, 41131, 330, 8566, 65083, 41133, - 9816, 126517, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139, - 78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, 0, 64136, 12536, - 2350, 13029, 78233, 0, 983103, 13030, 6702, 4527, 0, 12538, 128810, - 983636, 65599, 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207, - 0, 6117, 65930, 8412, 0, 7438, 1296, 2325, 41511, 126625, 10149, 74118, - 0, 127286, 12481, 0, 12488, 66713, 0, 41556, 64414, 118802, 2354, 42619, - 73766, 0, 6295, 901, 41510, 7953, 0, 65032, 41513, 983166, 11927, 66584, - 78559, 78560, 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, - 69922, 74031, 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 67973, - 0, 13026, 6762, 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, - 1343, 983814, 0, 9325, 6818, 6283, 11738, 0, 983925, 0, 11741, 0, 0, - 9216, 8263, 11279, 194752, 983816, 194754, 13021, 64494, 3136, 194758, - 194757, 194760, 13022, 42737, 9956, 0, 0, 74552, 10014, 0, 41260, 119340, - 13020, 10024, 194764, 74583, 74340, 69681, 0, 43001, 8029, 0, 0, 983771, - 3335, 0, 0, 9776, 120526, 194748, 5215, 42644, 3333, 1632, 194751, 64849, - 3342, 78582, 5363, 12957, 78581, 4156, 0, 0, 6421, 78591, 1611, 78589, - 13018, 74257, 78588, 74542, 3337, 4537, 67895, 11736, 0, 68608, 6482, - 4214, 73790, 11945, 0, 13046, 8838, 425, 4025, 10709, 78595, 2108, 2392, - 13047, 0, 0, 6819, 13049, 6499, 92243, 12424, 68614, 73944, 13050, 9924, - 194745, 6507, 127919, 94073, 128069, 3277, 8929, 4947, 41055, 0, 194722, - 194721, 194724, 13045, 64626, 66034, 7751, 194727, 8371, 194729, 3997, - 12806, 8768, 13044, 0, 12420, 4024, 194730, 41054, 1078, 9757, 69736, - 41057, 0, 0, 0, 0, 983782, 92210, 92411, 0, 41496, 0, 9165, 1572, 11911, - 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, 43183, 6401, 5831, 0, 0, - 13043, 8056, 92494, 65681, 208, 127382, 41514, 0, 0, 0, 10699, 6408, - 92227, 7825, 5661, 0, 120630, 3603, 41109, 2398, 3548, 126596, 0, 119933, - 0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468, - 983267, 41558, 41471, 73950, 8158, 9944, 41472, 120298, 13051, 78689, - 3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680, 5665, 0, 119071, - 7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382, - 194686, 73924, 1121, 78319, 63959, 0, 9942, 13231, 0, 64752, 4732, - 194666, 11596, 119931, 65187, 1626, 63983, 10110, 64772, 42024, 6420, - 42028, 0, 10509, 2795, 4910, 194728, 69231, 64753, 6275, 93957, 118830, - 63978, 11044, 3229, 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 7085, - 6137, 0, 7524, 0, 917809, 8346, 0, 8338, 128315, 65043, 0, 822, 127984, - 9903, 64721, 42722, 69877, 194659, 78655, 78661, 194660, 78662, 41265, - 5311, 1795, 965, 118791, 10587, 78055, 11278, 78632, 194640, 0, 12946, - 194641, 119341, 120349, 6294, 3144, 194648, 194647, 65019, 194649, 73990, - 0, 983951, 748, 41067, 2330, 535, 3148, 12375, 78799, 194629, 10556, - 2475, 12388, 4889, 8968, 67863, 3593, 0, 0, 2342, 0, 194634, 65206, 4894, - 194635, 4890, 194637, 917804, 581, 4893, 983616, 6571, 65545, 4888, 4157, - 78048, 78049, 78046, 78047, 0, 10119, 6415, 42893, 0, 69702, 0, 0, 11375, - 64746, 2332, 78063, 412, 78061, 64932, 42880, 43587, 0, 0, 0, 0, 65197, - 78066, 12203, 78064, 78065, 8913, 65854, 4875, 65811, 120381, 120389, - 118888, 9344, 8826, 120386, 120395, 13104, 74781, 11997, 120393, 78075, - 0, 3134, 0, 65696, 92331, 0, 66217, 0, 8334, 119344, 0, 3449, 0, 0, - 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, 10734, - 127014, 0, 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367, 0, - 78054, 4917, 74516, 74208, 64285, 4912, 5464, 127836, 118893, 2361, 7971, - 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, 40977, - 10960, 40962, 8305, 12573, 983608, 40980, 983955, 13202, 0, 12582, 78282, - 983048, 69856, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, - 7698, 5658, 74045, 70039, 0, 0, 4913, 0, 983950, 71333, 42326, 128194, - 12728, 92685, 42478, 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, - 6153, 2867, 194708, 66312, 698, 128007, 194606, 10356, 70017, 194713, - 651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851, - 78461, 194697, 74356, 64945, 4716, 43277, 0, 78474, 12340, 120568, 0, - 194700, 55264, 41211, 120676, 8703, 5462, 917629, 983488, 10101, 0, - 70049, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 128654, 0, 119194, - 74050, 92701, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, - 0, 2699, 0, 73845, 2985, 92568, 126475, 917845, 12192, 119314, 0, 119312, - 9827, 119310, 119311, 119308, 119309, 119306, 11481, 41210, 119305, 0, - 35, 78481, 78482, 66694, 68479, 78477, 78478, 43596, 6090, 64257, 7812, - 10534, 0, 78485, 73848, 67975, 4272, 0, 40967, 40964, 917825, 12704, - 78487, 43306, 0, 64497, 12138, 7930, 0, 2292, 68216, 0, 917826, 5244, - 4189, 94108, 67596, 127504, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 2279, - 0, 917827, 65555, 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682, - 12578, 12720, 0, 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0, - 118850, 119141, 128546, 66015, 0, 959, 8885, 12564, 66457, 78808, 9469, - 9632, 92323, 74761, 64323, 127335, 0, 0, 0, 310, 0, 41281, 10976, 0, - 71325, 0, 74266, 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215, - 12730, 65163, 74044, 374, 43195, 816, 120161, 0, 0, 41934, 7465, 0, - 128168, 983261, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307, - 127147, 9585, 5374, 983260, 128059, 0, 0, 126618, 120390, 0, 65567, - 120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, - 5378, 78791, 128679, 41421, 0, 4462, 0, 126599, 128092, 821, 0, 2498, - 5800, 120157, 983115, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, - 1185, 0, 78770, 43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, - 10942, 7713, 2348, 0, 64374, 4380, 194608, 119044, 9982, 64324, 41240, - 862, 65626, 78462, 1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, - 64688, 194593, 194592, 78092, 74357, 194597, 4748, 92228, 194598, 194601, - 42260, 5871, 119075, 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, - 8775, 127945, 0, 2963, 0, 8410, 4454, 723, 127882, 966, 4449, 92330, - 92238, 0, 7819, 2320, 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, - 8047, 0, 78827, 12634, 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, - 983754, 1584, 66645, 6045, 6729, 120640, 65218, 11559, 0, 78062, 7537, 0, - 11370, 0, 10330, 0, 10394, 0, 74194, 0, 127929, 9780, 0, 13092, 194576, - 77950, 194578, 7074, 92648, 194579, 194582, 11414, 128868, 2531, 13034, - 0, 0, 4211, 1259, 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219, - 94034, 194566, 11064, 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153, - 0, 64098, 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 983445, - 64262, 6767, 41407, 0, 0, 6755, 118864, 9046, 127934, 126608, 0, 0, 0, 0, - 67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, 12338, 4651, 69895, - 11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821, - 41905, 0, 0, 10775, 9793, 5009, 0, 42269, 64587, 983063, 42535, 69812, - 64529, 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 983767, - 10236, 65918, 43782, 0, 0, 64506, 69652, 118921, 4747, 128058, 69844, - 43200, 5832, 0, 0, 5141, 42600, 0, 43203, 0, 983790, 43286, 0, 128211, - 43778, 0, 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0, 0, 0, 6059, - 126985, 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 120481, 120786, - 42233, 64140, 9946, 63885, 194792, 11822, 0, 43189, 983889, 0, 1788, - 1579, 120482, 71298, 0, 0, 0, 9028, 119571, 69234, 94055, 0, 1285, 64882, - 41242, 70086, 0, 12640, 0, 7401, 0, 12625, 68198, 0, 70082, 3940, 41597, - 43754, 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, - 120516, 118989, 0, 8815, 66673, 65046, 9285, 913, 42259, 119317, 119318, - 2142, 68454, 42485, 94012, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, - 12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, - 42777, 10139, 980, 43698, 65386, 2208, 0, 43701, 43198, 7184, 120673, - 194797, 917819, 10085, 119992, 0, 119993, 6634, 92373, 0, 119323, 8072, - 119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, 12395, 0, - 126977, 120565, 9914, 2217, 917854, 73975, 6367, 6351, 66688, 0, 78107, - 0, 64735, 41243, 92199, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, 0, - 120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, 9741, - 78329, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 128225, 13213, - 42452, 78331, 120664, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, - 41132, 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, - 12632, 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, - 1091, 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 983146, 126613, 0, - 11693, 126513, 10494, 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, - 73794, 0, 8022, 0, 120462, 74106, 12413, 94069, 917994, 917993, 917995, - 5570, 1881, 7210, 0, 1012, 43752, 0, 120709, 7208, 66442, 5569, 983237, - 42339, 0, 6063, 0, 78383, 119594, 6053, 65602, 0, 92201, 64727, 9160, - 194827, 0, 0, 92180, 10503, 118810, 6055, 3870, 4279, 8490, 120114, 4319, - 64786, 8602, 120110, 11326, 92204, 983116, 0, 120119, 78333, 120117, - 120118, 120099, 120100, 65087, 5571, 3674, 9740, 9121, 5568, 120107, - 120108, 42085, 10107, 42159, 42870, 120101, 589, 7050, 983791, 43281, - 10233, 41263, 66251, 65729, 66253, 126497, 74099, 42645, 0, 194815, 8583, - 0, 5847, 6928, 128074, 0, 0, 0, 0, 66592, 12204, 917962, 19966, 77856, - 42561, 120626, 983246, 0, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0, - 8369, 0, 4551, 194964, 3369, 0, 0, 9673, 66334, 65580, 10478, 118960, - 12517, 557, 9457, 12034, 983662, 6355, 12519, 41004, 0, 195025, 74094, 0, - 0, 77970, 983560, 0, 128175, 12111, 3927, 0, 12515, 1474, 67893, 5492, - 6923, 92281, 10441, 73836, 0, 43990, 5493, 0, 74319, 0, 66635, 12019, 0, - 1618, 0, 120474, 9645, 10430, 917959, 5853, 13063, 10363, 0, 12956, - 128169, 120729, 11314, 917582, 12060, 0, 78392, 12826, 6329, 0, 10514, - 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, 43420, 78396, - 127057, 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693, 12125, 12766, 0, - 1164, 128817, 0, 41918, 983168, 127542, 8687, 66009, 12178, 7053, 128001, - 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, 41126, - 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, 42843, - 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, 8922, - 128068, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, 13262, - 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, 5295, - 917569, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, 41413, - 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, 8070, - 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0, - 67648, 120499, 94001, 4257, 12104, 77942, 6220, 9004, 65561, 0, 77949, 0, - 68135, 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971, 78453, 92556, - 73898, 11979, 70051, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469, - 74227, 0, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0, - 42916, 0, 0, 0, 7282, 78728, 65733, 4445, 127138, 128082, 3494, 74606, - 6555, 0, 77976, 0, 0, 78566, 0, 983189, 65898, 983239, 65312, 5447, 0, - 12895, 65593, 4010, 0, 41106, 0, 64448, 0, 41105, 0, 65820, 6232, 0, - 128280, 0, 43608, 119091, 0, 6538, 4335, 78364, 3941, 41122, 11061, - 78363, 64892, 9113, 1954, 12155, 983665, 42878, 11500, 0, 0, 74578, 0, - 65832, 0, 0, 0, 77975, 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307, - 0, 0, 5133, 0, 0, 9500, 0, 4957, 64741, 2422, 2212, 983080, 0, 0, 2496, - 11516, 944, 118851, 3890, 12168, 1438, 0, 983117, 0, 41947, 1220, 120828, - 128555, 0, 0, 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, - 983935, 0, 78120, 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120, - 65121, 10862, 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986, - 11532, 74073, 127338, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, - 11428, 1730, 2457, 917808, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, - 92230, 0, 6129, 0, 128528, 128268, 0, 7874, 8681, 119092, 0, 13136, 0, 0, - 70102, 63886, 118881, 9605, 71308, 13220, 128776, 120274, 5514, 0, 9228, - 0, 0, 0, 5240, 9811, 10012, 3096, 0, 0, 983344, 66676, 65873, 0, 0, 0, - 9501, 0, 1272, 64536, 65465, 64654, 7467, 0, 1467, 10158, 10040, 0, 9519, - 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, 983346, 19935, 0, 92162, 69676, - 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, 11471, 43554, 65862, 11474, - 66332, 66603, 128138, 2426, 12042, 92194, 983902, 9537, 3961, 12115, - 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, 42686, 77973, - 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, 68215, 917904, 8541, - 78298, 70034, 41866, 0, 0, 0, 0, 69924, 43555, 2823, 9559, 10060, 41940, - 8299, 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0, - 41699, 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 6274, 4494, 0, 4012, - 10395, 983591, 43633, 65447, 126511, 0, 11004, 695, 739, 696, 7611, 0, - 42755, 74802, 9227, 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 3868, - 688, 41847, 690, 2548, 737, 974, 8003, 7406, 917911, 0, 128688, 3985, - 917912, 65860, 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, - 92505, 10879, 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, - 41958, 119176, 917908, 0, 0, 42657, 92468, 7643, 42373, 11714, 67587, - 43568, 983175, 11717, 7650, 10594, 64951, 7647, 7649, 128155, 7646, 0, - 78082, 9651, 0, 3891, 0, 0, 2337, 1735, 74324, 67860, 2363, 983135, 0, - 43561, 0, 0, 74146, 1860, 7495, 7580, 5812, 7497, 7584, 119140, 127853, - 0, 120347, 7727, 0, 8498, 69818, 8949, 3065, 42719, 7135, 1569, 92375, - 12534, 12124, 7690, 0, 12533, 983870, 6418, 4543, 78086, 6969, 0, 74800, - 0, 67974, 11980, 128650, 983792, 63894, 120760, 12282, 66192, 0, 74592, - 8850, 74275, 9238, 10617, 917545, 0, 92625, 0, 12791, 0, 0, 127843, 4447, - 73732, 12793, 12900, 92377, 10950, 0, 78087, 12790, 41400, 119128, 66607, - 12792, 42232, 194938, 1744, 12789, 10366, 12317, 41310, 983860, 41399, 0, - 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, 2974, 9010, 11315, 0, - 278, 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, 0, 6002, 0, - 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, 983186, - 77829, 71360, 0, 6413, 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, - 10044, 128322, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, - 10297, 0, 3742, 0, 3959, 0, 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, - 43758, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361, - 11540, 43546, 6692, 0, 41060, 0, 4668, 9083, 0, 0, 78144, 1559, 63831, - 9677, 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716, - 128236, 0, 120472, 5516, 2845, 7717, 8036, 41717, 73827, 544, 12045, - 6278, 0, 5515, 0, 0, 983051, 65339, 43221, 2211, 0, 5517, 0, 0, 74841, - 67884, 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, - 1902, 67887, 9638, 12976, 126546, 12483, 12368, 41769, 42726, 41765, - 7361, 6667, 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311, - 917966, 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949, - 78162, 0, 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, - 41796, 1269, 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, - 983720, 128675, 41834, 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165, - 66036, 0, 0, 6428, 42270, 0, 983596, 43059, 42666, 5256, 1067, 255, - 12131, 983713, 9493, 983959, 41014, 11793, 194920, 0, 74394, 43460, - 10653, 42723, 983845, 119632, 0, 6560, 7016, 74274, 983615, 43556, 3929, - 67977, 6614, 2768, 92504, 9746, 5135, 11811, 12796, 11953, 0, 69761, - 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, 127753, 74315, 74361, - 8253, 8817, 1136, 0, 43563, 92232, 0, 194750, 7392, 8230, 9365, 0, 0, - 983607, 0, 0, 4041, 0, 2357, 43240, 12786, 229, 119885, 119884, 44004, - 7142, 119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 43795, - 7770, 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, 10470, 0, - 11059, 10791, 917944, 450, 119328, 0, 10432, 12097, 5450, 64691, 1233, 0, - 44009, 78284, 66338, 0, 0, 1839, 118799, 983218, 10927, 1701, 983655, - 2388, 41749, 41761, 5453, 8361, 119865, 41758, 5444, 41763, 64889, 7143, - 92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 983044, 0, 65812, - 917831, 0, 41824, 67985, 120203, 194800, 194803, 42700, 194805, 127980, - 194807, 78676, 92356, 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826, - 119325, 194811, 42439, 64638, 42327, 43528, 4489, 71331, 0, 194793, 1912, - 42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410, - 92671, 983245, 118878, 0, 0, 9919, 120528, 559, 128157, 41825, 127975, - 78188, 4892, 74016, 194781, 6542, 41957, 128865, 5777, 0, 759, 65749, - 2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, 0, 0, 126573, 3668, - 65754, 43560, 12226, 67991, 65149, 2340, 41959, 194786, 194785, 194788, - 43618, 65747, 10937, 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, - 42714, 9951, 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359, - 41820, 2300, 2395, 128563, 9976, 120043, 120050, 120058, 68220, 128143, - 42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, 67976, 41898, - 2360, 41794, 917942, 71314, 127818, 0, 0, 2418, 983098, 2411, 11336, 799, - 63823, 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980, - 55284, 92203, 0, 10384, 983219, 0, 0, 7753, 2351, 6655, 64489, 69931, 0, - 77872, 4443, 42779, 230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896, - 10288, 10320, 0, 855, 7046, 6109, 65045, 63839, 78198, 2049, 10098, 0, - 74145, 127943, 10264, 10280, 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0, - 4862, 9735, 6537, 120591, 74286, 3914, 92178, 93976, 9065, 12961, 0, 0, - 92253, 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 73893, - 42724, 0, 4688, 120454, 0, 0, 67994, 8238, 3110, 120162, 983899, 120163, - 6528, 127553, 43035, 69898, 218, 0, 1520, 0, 4786, 0, 43225, 4602, 0, - 78167, 10088, 6548, 0, 120156, 43978, 8988, 8888, 0, 0, 0, 0, 10666, 0, - 73902, 69740, 0, 0, 9975, 128039, 119902, 4689, 8932, 0, 65560, 119209, - 74441, 78810, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 92613, - 128011, 0, 662, 0, 9244, 194863, 0, 119261, 983421, 0, 0, 0, 41929, 0, 0, - 66674, 41926, 120408, 120443, 10513, 64637, 194862, 68013, 52, 13118, - 6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 67992, 74085, 0, 3978, 0, - 917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 93961, 69782, - 128557, 194860, 11765, 65258, 10369, 0, 1585, 7192, 10249, 422, 1500, - 2036, 986, 194859, 64394, 5781, 5599, 64294, 2494, 120450, 4861, 74021, - 64334, 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 74191, - 120410, 0, 120453, 64821, 9478, 2508, 92683, 0, 202, 128246, 74131, 1242, - 65514, 0, 63940, 128706, 64533, 120129, 0, 67842, 11990, 92430, 63939, - 43375, 65440, 2504, 0, 78671, 64829, 983901, 6943, 917934, 5859, 0, 2858, - 983354, 74294, 983905, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574, + 194609, 0, 8295, 685, 9025, 1524, 12618, 0, 5539, 0, 92523, 120102, 7138, + 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, 64775, 5036, + 5035, 120590, 42604, 983656, 0, 8074, 275, 13291, 1907, 78838, 4432, + 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546, 127262, + 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409, 127256, + 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, 6094, + 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 983177, 5030, 0, 0, 0, + 73869, 9622, 0, 69944, 6787, 0, 0, 0, 983583, 10544, 12919, 0, 92218, 0, + 0, 69906, 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, 7613, + 92562, 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, + 43567, 74056, 917910, 11833, 119919, 7216, 65232, 7217, 251, 7218, 7895, + 4395, 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 983836, + 74141, 8880, 7685, 66459, 120173, 65540, 119618, 625, 8187, 42861, 1113, + 7236, 7915, 3630, 120176, 8179, 74264, 67886, 9316, 10980, 2489, 65624, + 8150, 1359, 67652, 127329, 127330, 73756, 5042, 5041, 42769, 12084, + 127324, 127321, 92279, 127319, 127320, 127317, 127318, 127315, 12283, + 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, + 127311, 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, + 0, 0, 983443, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, + 64648, 0, 9359, 78416, 0, 128770, 65157, 6662, 0, 0, 3863, 73909, 4835, + 55266, 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301, 0, 42589, 569, + 0, 73813, 711, 4389, 7133, 0, 73880, 11610, 11368, 0, 194570, 41331, + 1006, 74240, 0, 1550, 8201, 73737, 7627, 5499, 5031, 77908, 42738, 65784, + 77907, 65267, 3758, 0, 65781, 64734, 70073, 2440, 65780, 77913, 8449, 0, + 5008, 983572, 2118, 0, 12121, 8255, 5512, 73875, 2128, 2130, 2131, 2126, + 2133, 1119, 127068, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 127486, + 8714, 983820, 2113, 0, 2115, 128177, 127907, 43713, 5052, 66220, 5821, + 6186, 65778, 65775, 5051, 65773, 1429, 42647, 5050, 302, 388, 41115, 735, + 6637, 5907, 65088, 0, 12726, 74594, 9117, 983181, 12003, 5513, 6666, + 5053, 74230, 5510, 78451, 0, 78447, 2470, 78437, 0, 1925, 0, 92237, + 74807, 0, 5048, 5047, 0, 0, 0, 92313, 0, 74497, 92395, 8089, 6929, 639, + 983563, 68179, 64442, 0, 92348, 4599, 41402, 6674, 43397, 43294, 1476, + 648, 0, 65819, 3233, 0, 41782, 6951, 94017, 983976, 3530, 9750, 128317, + 0, 6656, 42618, 0, 5046, 8512, 65856, 74261, 8967, 0, 5045, 42026, 1916, + 7986, 5044, 120556, 9006, 13128, 5043, 0, 7853, 74068, 74004, 9669, + 12341, 12703, 8402, 0, 119070, 917600, 41750, 3586, 64508, 43148, 0, 0, + 119606, 67983, 13296, 517, 0, 128534, 194946, 41528, 123, 65454, 0, 0, + 74478, 10531, 7784, 41526, 10829, 73991, 8057, 1126, 73895, 0, 194591, 0, + 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, 120441, 120452, 43151, + 983178, 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, + 7623, 118925, 118889, 9235, 12760, 74176, 69662, 66445, 43540, 10062, + 3743, 11514, 11078, 0, 12136, 0, 126597, 120435, 0, 7726, 0, 19922, 267, + 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, 10652, + 41612, 41077, 3402, 9050, 3398, 0, 983348, 0, 3391, 41075, 2476, 0, + 128017, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, + 13013, 0, 6673, 0, 0, 0, 12438, 0, 983342, 0, 983880, 126638, 9053, + 13015, 74523, 0, 704, 66215, 6195, 983828, 6660, 78758, 917760, 917793, + 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983341, 74547, 126585, + 65448, 78100, 12948, 119001, 195002, 119238, 195004, 78099, 127085, 0, + 128320, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0, 42533, 168, + 42845, 4898, 64298, 983141, 0, 4901, 1821, 0, 578, 3653, 0, 791, 9162, + 6977, 0, 78889, 74561, 0, 73731, 8354, 43590, 119303, 983449, 7557, + 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996, 12811, 65925, + 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449, + 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 128824, + 8729, 78456, 0, 7845, 917917, 71302, 4408, 4122, 6772, 11039, 8723, + 194990, 71310, 119302, 731, 119304, 92286, 2438, 64855, 119300, 119299, + 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0, 0, 0, 41952, 0, + 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, + 12963, 127864, 6189, 4125, 1314, 12133, 120340, 118873, 1271, 983640, 0, + 66024, 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, + 983160, 41390, 5384, 41882, 67647, 92548, 5759, 983912, 0, 41388, 64446, + 41392, 64288, 41387, 0, 8706, 5552, 983187, 700, 0, 5553, 0, 7088, 5356, + 7499, 68007, 66596, 74066, 0, 10263, 5554, 0, 12344, 10311, 78113, 6665, + 92626, 0, 7618, 8517, 11455, 78440, 64632, 64447, 5555, 78088, 78093, + 78091, 0, 42803, 65033, 9143, 6668, 195067, 67995, 195069, 656, 195071, + 65037, 4577, 64624, 0, 0, 0, 983649, 4269, 73885, 917775, 42846, 69644, + 950, 0, 92273, 66580, 118895, 66683, 10554, 917778, 119121, 0, 5098, + 917770, 0, 119099, 5097, 4935, 9848, 10381, 0, 128870, 983701, 3651, 0, + 120730, 127556, 5102, 5101, 10269, 12983, 8138, 4517, 1932, 5100, 1439, + 12093, 1247, 10034, 195064, 5099, 78373, 1441, 42087, 3063, 650, 0, 7838, + 0, 195041, 195040, 119142, 9031, 120790, 128582, 9078, 8545, 66356, + 128799, 0, 9154, 9118, 126543, 0, 2676, 2277, 0, 73812, 6190, 8599, + 195053, 69918, 10795, 9857, 7014, 9856, 195033, 92620, 12129, 0, 8481, 0, + 6202, 195035, 10920, 128237, 5203, 195039, 195038, 5108, 5107, 65818, + 66019, 9762, 0, 5541, 74772, 0, 12613, 5284, 6657, 207, 128806, 4275, + 74819, 854, 68147, 74381, 0, 78786, 5103, 127861, 64348, 41368, 43974, + 488, 69811, 0, 71339, 10157, 0, 43034, 11438, 64674, 0, 92694, 68431, + 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 127509, 69720, 6476, + 5104, 983749, 304, 3176, 119010, 0, 932, 120633, 6567, 238, 69656, + 195011, 194595, 19905, 120577, 195015, 78870, 41044, 67640, 194902, + 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, 309, + 6622, 8151, 10858, 78706, 67636, 0, 12568, 0, 12553, 10814, 43275, 6950, + 9712, 68680, 43970, 983198, 65165, 92725, 0, 66466, 0, 0, 0, 66725, 6191, + 11351, 10437, 11316, 67634, 43763, 0, 41754, 67635, 9370, 2720, 194975, + 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732, + 94095, 917547, 92682, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, + 12077, 0, 64586, 917620, 42396, 55255, 3475, 128035, 2479, 0, 3632, + 120728, 10698, 8376, 3648, 194960, 74844, 67639, 3636, 67894, 3650, 8837, + 65229, 1843, 42283, 43250, 41562, 9100, 74548, 917630, 3640, 127190, + 42321, 7284, 194974, 194973, 194950, 194949, 194952, 194951, 126649, + 194953, 42080, 2529, 0, 0, 0, 42083, 120678, 68398, 194957, 67619, 66367, + 194958, 9634, 92380, 9988, 0, 41068, 0, 4295, 65264, 68006, 0, 92545, 0, + 785, 8236, 128647, 9027, 68160, 67623, 64383, 120265, 925, 127156, 0, + 41985, 41071, 9586, 0, 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 983803, 0, + 381, 12936, 0, 42077, 0, 69880, 5184, 42078, 194947, 10810, 128531, 4585, + 19943, 5860, 67633, 0, 0, 812, 3615, 0, 5178, 44000, 120548, 78807, 5188, + 74287, 67629, 3605, 10692, 1166, 64429, 42639, 924, 0, 67631, 42616, + 120670, 2442, 10703, 78789, 67632, 917924, 12771, 12736, 12753, 66708, + 73933, 67626, 42401, 0, 69872, 127373, 42288, 12751, 0, 8542, 13145, + 194963, 2468, 66706, 41294, 3626, 3883, 64388, 42479, 0, 41117, 0, 92580, + 0, 0, 67624, 0, 1290, 0, 65585, 2715, 806, 65208, 41884, 917883, 1318, + 64731, 126578, 0, 0, 66325, 3465, 2405, 9240, 0, 12756, 65259, 0, 983781, + 12752, 5833, 1432, 0, 41883, 73912, 9799, 0, 41886, 2480, 0, 2062, + 127293, 6494, 5537, 78656, 0, 194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, + 0, 68005, 10622, 983779, 0, 78654, 6566, 78659, 0, 73780, 119196, 64864, + 0, 78660, 0, 8284, 13081, 0, 3589, 42051, 4035, 6492, 92236, 4265, 6642, + 3977, 74186, 41778, 836, 119216, 2488, 0, 4582, 0, 0, 41777, 12926, + 983377, 7528, 10550, 0, 92706, 0, 10961, 0, 1374, 64878, 119014, 0, + 42389, 41374, 2286, 0, 78492, 41377, 127909, 0, 400, 12597, 120586, 0, 0, + 6661, 983145, 64827, 0, 73817, 390, 0, 71301, 983862, 3473, 7718, 0, 0, + 0, 55285, 0, 0, 0, 11969, 983390, 127841, 6365, 1887, 6763, 983370, 8080, + 7006, 0, 983371, 6757, 64351, 1544, 0, 6766, 64677, 120716, 983372, 6146, + 0, 771, 983373, 0, 12812, 13168, 42272, 12200, 917927, 7904, 0, 953, + 12917, 119560, 12300, 0, 11491, 9724, 10341, 983773, 9524, 7490, 11389, + 7489, 3379, 0, 7487, 0, 471, 7484, 7482, 6753, 7480, 5764, 7478, 7477, + 6501, 7475, 6918, 7473, 7472, 2474, 7470, 7468, 10232, 10615, 10213, + 127288, 92357, 10049, 11834, 3544, 0, 6017, 65311, 127481, 120216, 13306, + 10533, 7870, 73949, 7625, 0, 120544, 0, 0, 92660, 0, 0, 0, 19961, 2472, + 42665, 92341, 0, 2139, 4256, 120776, 74380, 0, 42675, 42658, 12845, 0, 0, + 65138, 119355, 67862, 0, 65671, 7083, 120008, 8066, 7678, 74865, 0, 0, 0, + 0, 7186, 0, 120555, 0, 445, 120566, 128308, 0, 0, 8330, 0, 0, 42797, + 983150, 120215, 0, 3902, 0, 1770, 0, 128866, 1560, 120209, 194972, 4584, + 73843, 0, 11712, 10866, 118928, 1118, 71334, 0, 0, 1081, 7436, 68420, + 7252, 0, 5996, 69921, 4903, 0, 41386, 5162, 119189, 1330, 0, 7139, 0, + 12047, 41384, 0, 0, 1848, 4334, 6324, 41975, 64777, 10674, 12308, 12186, + 0, 0, 983741, 12715, 68002, 983479, 126630, 2018, 66672, 41979, 66685, + 119157, 68000, 92464, 0, 126984, 68001, 9334, 92705, 92315, 70101, 7975, + 0, 77957, 0, 66621, 4884, 66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, + 0, 2345, 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 983387, 0, 42279, + 194577, 0, 78415, 0, 195008, 983384, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, + 0, 0, 2482, 1471, 0, 0, 42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, + 983694, 2460, 0, 11944, 12376, 127868, 64679, 0, 12380, 10557, 64473, + 5870, 0, 2024, 127180, 0, 0, 539, 0, 127765, 94052, 3853, 65180, 127923, + 120796, 120245, 92324, 0, 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, + 4162, 0, 4260, 12953, 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, + 10946, 127310, 5000, 0, 983579, 0, 69672, 8213, 74017, 7771, 6161, 68018, + 6709, 0, 78885, 983708, 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, + 0, 73791, 0, 0, 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, + 3893, 983264, 0, 12210, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, + 12516, 4444, 0, 92271, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, + 3591, 41969, 0, 2453, 128549, 92666, 64705, 0, 0, 10349, 10413, 43591, + 41962, 3202, 74353, 0, 8316, 0, 0, 94060, 687, 0, 0, 0, 1840, 0, 68671, + 119809, 4883, 285, 4723, 70099, 92692, 4459, 74577, 42921, 41720, 11089, + 240, 19906, 0, 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, + 983343, 43437, 3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, 2614, 9125, + 119023, 1729, 0, 120236, 65221, 63883, 43334, 64852, 0, 65194, 66201, 0, + 66578, 5001, 41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, + 73889, 74182, 127915, 643, 3086, 0, 42448, 42299, 58, 0, 917952, 120083, + 63873, 8491, 0, 0, 983623, 4530, 42409, 7126, 194575, 2721, 120074, + 119096, 19929, 0, 194574, 0, 4242, 4264, 120077, 120530, 66179, 42412, + 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, + 983238, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026, 4306, 41380, + 68432, 92586, 0, 66667, 127309, 0, 126521, 42200, 42566, 0, 0, 5088, + 6948, 0, 8524, 0, 0, 12385, 0, 0, 69646, 1386, 64580, 11480, 6116, 65039, + 65038, 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710, 77999, + 11663, 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0, 63896, + 12061, 42096, 43621, 3362, 12377, 983832, 983834, 68449, 7461, 73901, + 1244, 331, 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, + 120818, 41964, 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, + 78549, 41220, 13032, 0, 584, 12933, 43177, 12373, 69855, 13000, 1351, + 2935, 8698, 12665, 0, 1930, 0, 78229, 12427, 66514, 69859, 13031, 0, + 63901, 0, 3657, 128572, 65202, 6000, 119206, 12426, 127181, 0, 41740, + 12428, 41283, 41916, 119210, 0, 0, 12429, 6727, 0, 7562, 0, 5170, 0, + 41755, 676, 0, 66704, 66664, 9978, 66491, 3536, 0, 9752, 92397, 6162, 0, + 69228, 10113, 41829, 65886, 5159, 12422, 41832, 439, 43077, 0, 42207, + 74549, 11796, 40970, 41830, 0, 917799, 8308, 917797, 917796, 0, 67864, + 917801, 917800, 12336, 4135, 69805, 341, 2727, 4129, 3539, 0, 63861, 0, + 7913, 0, 63859, 4131, 63868, 0, 63867, 4133, 11371, 210, 4600, 0, 74560, + 4137, 8082, 78506, 119062, 78504, 6704, 4591, 128029, 0, 0, 9680, 0, + 120623, 561, 12159, 195, 78508, 41501, 0, 42031, 5719, 7172, 42687, 8368, + 0, 41499, 0, 0, 42242, 41498, 917794, 42025, 78565, 65805, 42463, 0, + 2924, 0, 120510, 0, 0, 119213, 73941, 0, 42330, 917784, 3969, 0, 0, 7169, + 1992, 9652, 73977, 7246, 42086, 126615, 2219, 0, 0, 128801, 194837, 0, + 327, 0, 9042, 917777, 917776, 65148, 12433, 917781, 127276, 917779, + 12431, 8668, 12434, 983835, 917782, 5999, 0, 7712, 12432, 128243, 43653, + 1726, 1015, 0, 8212, 0, 128014, 42423, 119066, 0, 128108, 66709, 0, 8811, + 927, 0, 0, 12436, 983245, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, + 195016, 0, 78197, 11348, 0, 78037, 9194, 983184, 0, 19914, 12179, 983812, + 2296, 194923, 63836, 63832, 917773, 10967, 63816, 2594, 3444, 63817, + 64651, 0, 41503, 127478, 11265, 0, 120756, 194922, 0, 5664, 3972, 0, 0, + 0, 128508, 12416, 917764, 119608, 10816, 917769, 917768, 12418, 74111, + 3882, 8532, 917771, 1573, 128648, 119847, 4596, 66339, 12417, 66001, + 65343, 126491, 12414, 8287, 68219, 195017, 68108, 1143, 119169, 119846, + 12415, 6626, 42763, 0, 118884, 9021, 120783, 0, 11724, 0, 0, 127104, + 126619, 0, 0, 8027, 10997, 9171, 12741, 11400, 71305, 194799, 0, 128239, + 0, 128881, 119604, 127523, 120190, 194773, 67608, 128214, 42368, 0, 7715, + 3881, 41487, 12118, 42514, 68651, 0, 983895, 3009, 41476, 41489, 69825, + 3007, 1448, 3018, 194809, 3889, 8521, 5083, 5082, 119859, 120184, 8519, + 983241, 3014, 5081, 65853, 120715, 0, 68014, 69951, 5079, 64802, 42210, + 4597, 65532, 11828, 120185, 12371, 0, 8407, 0, 10805, 8518, 10779, + 120188, 71303, 983933, 12367, 42170, 0, 92557, 629, 1924, 0, 12037, + 74366, 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369, 10649, + 67981, 5077, 120174, 10880, 63927, 5075, 917881, 0, 65075, 0, 11007, + 983705, 66659, 92607, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, + 5272, 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, + 9803, 0, 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, 0, 66461, + 5177, 41324, 12055, 8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, + 8948, 41325, 0, 721, 10182, 9108, 71311, 0, 119185, 42229, 194912, 0, + 5998, 0, 42353, 74825, 0, 12587, 94104, 78571, 0, 71328, 194562, 41576, + 42215, 78570, 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, + 63949, 64767, 2670, 4167, 194796, 11723, 0, 74120, 0, 65076, 938, 43414, + 73854, 11737, 9721, 0, 0, 0, 11742, 2419, 0, 11493, 12334, 194913, 4153, + 12302, 10793, 5250, 12407, 11978, 4404, 9189, 12401, 42007, 5775, 6759, + 65806, 43997, 0, 42002, 12404, 983553, 0, 4940, 12410, 7683, 1167, 73729, + 4983, 120507, 861, 0, 0, 0, 0, 43757, 43370, 0, 0, 11956, 0, 0, 0, 9616, + 6631, 0, 12816, 43759, 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, + 7616, 195044, 0, 12577, 0, 983884, 853, 42693, 195014, 0, 983647, 5016, + 43535, 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, 7105, 127807, + 65060, 120797, 9900, 7750, 0, 194919, 0, 127830, 0, 64778, 12585, 10565, + 128151, 12177, 0, 0, 0, 77824, 0, 4900, 127874, 12878, 92630, 8984, 4119, + 74768, 8971, 78593, 43113, 9702, 78594, 11025, 9245, 13048, 4927, 4138, + 74185, 92481, 92710, 12397, 77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, + 3948, 10781, 1546, 0, 5010, 1680, 10507, 78590, 78583, 0, 0, 0, 194915, + 7267, 0, 74833, 128181, 5993, 2819, 0, 12706, 77840, 1893, 7266, 63915, + 7264, 7265, 0, 1363, 0, 63997, 63910, 63996, 3077, 0, 0, 1512, 69929, + 12589, 41479, 128313, 0, 43339, 73776, 9836, 120727, 0, 41481, 43335, + 7832, 42343, 3090, 43337, 817, 1664, 1850, 128841, 3079, 11340, 42408, + 42447, 127140, 120020, 42307, 12386, 42304, 917555, 0, 12389, 0, 92366, + 41996, 11526, 63985, 5864, 1147, 63992, 42887, 1987, 92718, 5480, 7858, + 11653, 4116, 12391, 66193, 0, 4939, 12384, 0, 0, 41686, 63905, 119601, + 194688, 983190, 0, 12649, 0, 0, 8247, 507, 91, 2042, 120775, 43643, + 194689, 66028, 10036, 41844, 119813, 774, 119829, 0, 119815, 5994, 12539, + 0, 78375, 120597, 119833, 983105, 119600, 0, 0, 7719, 6026, 2486, 128312, + 119808, 162, 0, 65219, 41073, 9687, 41681, 6304, 119812, 66196, 194881, + 5262, 0, 55233, 12681, 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, + 983661, 0, 43119, 0, 120753, 12403, 2500, 195013, 0, 4899, 12729, 0, 0, + 74113, 2343, 4103, 19946, 74112, 77851, 13112, 0, 195012, 12859, 70087, + 120148, 66369, 5861, 127758, 11999, 12400, 0, 983839, 12645, 5146, 11320, + 68410, 6748, 65040, 0, 64184, 12974, 64183, 67613, 120645, 5147, 0, 0, + 74524, 0, 1928, 0, 67649, 5991, 3445, 67609, 4976, 64176, 0, 67610, 8241, + 0, 77868, 4206, 0, 0, 0, 128298, 0, 10138, 0, 0, 8897, 120234, 0, 8357, + 4124, 77862, 65836, 120641, 127926, 77859, 0, 0, 1123, 963, 41553, 10120, + 12405, 120150, 92664, 398, 13278, 9723, 6366, 120311, 7945, 0, 4402, + 9970, 12402, 983136, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, + 12969, 120824, 41465, 983565, 8528, 1575, 0, 63955, 165, 3024, 41467, + 119163, 0, 9093, 0, 9147, 128787, 63958, 0, 9148, 9692, 4096, 53, 8296, + 6750, 195018, 0, 9594, 0, 0, 43527, 0, 727, 194703, 195023, 5805, 0, + 6726, 0, 42176, 12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, + 120307, 0, 92343, 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, + 194701, 10803, 4132, 120306, 68474, 92473, 0, 983313, 74837, 120155, + 1499, 0, 8055, 42740, 63965, 0, 63962, 74042, 8924, 43123, 5988, 3660, + 63969, 11781, 42718, 8788, 1357, 64851, 65743, 0, 8774, 0, 127086, 9941, + 120172, 0, 1933, 69655, 9564, 0, 92435, 73866, 0, 0, 2487, 67614, 3121, + 1804, 3311, 67615, 70081, 78302, 12220, 67616, 120598, 127475, 0, 68200, + 6675, 128144, 0, 67592, 120685, 0, 64771, 1198, 9132, 0, 64619, 510, + 64663, 0, 0, 4561, 2101, 1398, 0, 92554, 74034, 41569, 92684, 11406, + 8167, 12127, 0, 840, 0, 126518, 7101, 6967, 0, 194898, 9796, 0, 333, + 69891, 0, 8144, 2117, 0, 983595, 12406, 0, 19931, 119089, 6678, 7769, 0, + 12621, 0, 127366, 10227, 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, + 42202, 12754, 195022, 0, 0, 94097, 67594, 2048, 12944, 4050, 67595, + 917967, 43102, 10581, 12985, 4533, 195021, 74003, 6490, 0, 12038, 0, 0, + 120704, 65461, 9798, 69704, 0, 1948, 69841, 0, 952, 128235, 0, 0, 120802, + 6449, 9494, 120313, 0, 43098, 4843, 8142, 64160, 4098, 64170, 0, 0, 3436, + 119973, 0, 12817, 67597, 6676, 3930, 42615, 0, 0, 67598, 0, 0, 0, 65591, + 41581, 65916, 1453, 0, 0, 0, 8500, 42222, 120142, 73743, 120400, 4317, + 11543, 67676, 64676, 0, 0, 67606, 119083, 0, 42217, 13102, 0, 66003, + 6672, 0, 0, 0, 983747, 63841, 9613, 9001, 4526, 11274, 67601, 64520, + 64210, 6664, 78704, 42056, 10228, 64957, 11281, 0, 3807, 1469, 66640, + 65381, 42197, 4988, 42372, 0, 9598, 904, 352, 42225, 1451, 8061, 8453, + 4134, 0, 74847, 66576, 127916, 0, 10520, 8575, 9960, 1201, 127289, 12846, + 127291, 127292, 11919, 64962, 127287, 43739, 127281, 8511, 9460, 823, + 11587, 12305, 0, 64695, 127305, 12387, 1253, 13183, 65766, 500, 42783, + 65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702, 66498, + 9821, 64304, 0, 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323, 120062, + 92669, 71332, 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, + 5260, 43143, 94038, 326, 120131, 68423, 0, 10771, 2876, 74074, 92530, + 194924, 41398, 7382, 9802, 127077, 127076, 453, 41396, 120524, 42720, + 12140, 9572, 0, 7003, 194883, 42334, 7704, 126490, 194885, 43144, 4123, + 8494, 43146, 9977, 0, 0, 65759, 10765, 64061, 4465, 9808, 64056, 65582, + 4126, 0, 9521, 9589, 64755, 0, 64020, 126604, 10464, 0, 0, 194869, 64514, + 11528, 64024, 128072, 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, + 10693, 64006, 983567, 64005, 4058, 119019, 126487, 64660, 0, 119050, 0, + 983069, 1139, 43298, 64027, 64029, 8970, 0, 9934, 983094, 10774, 128020, + 42201, 12421, 128216, 0, 1852, 3057, 64046, 73744, 64034, 64039, 0, 0, 0, + 194899, 92322, 7645, 12854, 74338, 3496, 0, 0, 0, 9102, 627, 127795, + 6158, 8327, 74553, 66632, 12419, 13309, 11570, 127811, 19960, 11696, 0, + 1018, 118970, 194909, 194897, 1682, 194896, 194911, 42756, 6765, 194906, + 0, 0, 73814, 11412, 6768, 10728, 194830, 71316, 118863, 43311, 64966, + 11577, 0, 43040, 1833, 11576, 0, 74779, 0, 185, 65085, 74533, 64754, + 194848, 7535, 8085, 42525, 120387, 9749, 41701, 6131, 1949, 4117, 7847, + 120489, 194711, 64483, 65693, 0, 0, 0, 69695, 42240, 0, 126651, 42864, + 126498, 64667, 41868, 1184, 0, 815, 11484, 127535, 67840, 983651, 0, + 66197, 0, 10986, 64683, 983785, 0, 3455, 0, 0, 9879, 0, 0, 4158, 128050, + 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, 5142, 2407, 69643, 42199, 0, + 92404, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 92390, 42867, 1834, 0, + 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, 2652, 120527, 7164, + 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562, 917505, 1828, + 74474, 120327, 78620, 8531, 12499, 6280, 12324, 118854, 65238, 68374, + 4832, 65573, 0, 6279, 12508, 12904, 12502, 9161, 0, 1620, 64436, 3601, + 195094, 128073, 983562, 609, 11555, 983099, 12496, 127839, 74181, 4343, + 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, 0, 43565, + 71306, 126493, 12696, 128256, 0, 94062, 12929, 0, 712, 0, 4197, 983206, + 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 0, 12651, 0, + 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592, 118844, 0, + 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178, 0, 69760, + 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0, 9080, 127000, + 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488, 65166, 119112, + 0, 0, 0, 0, 71313, 0, 5265, 69235, 0, 11487, 67858, 12464, 0, 43045, 0, + 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0, 43346, 8116, + 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, 983602, 120811, + 0, 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, 55257, 73771, + 1766, 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, 64595, 127294, + 0, 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, 0, 0, 119060, + 64953, 5406, 19920, 69897, 66510, 3590, 194864, 1130, 0, 0, 42016, 11823, + 43023, 0, 118896, 7742, 0, 13280, 71323, 9326, 73826, 5310, 74812, 78584, + 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, + 983848, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, + 73917, 7843, 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, + 0, 118990, 10491, 69842, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, + 65086, 8981, 12382, 42133, 120755, 9706, 69738, 0, 66610, 10461, 12103, + 0, 8642, 0, 42766, 983866, 2210, 9983, 0, 94009, 0, 0, 0, 7398, 41515, 0, + 11802, 8041, 1461, 910, 119133, 0, 6749, 3658, 93964, 120525, 0, 7617, + 194841, 12888, 127983, 67668, 13143, 0, 9193, 11097, 5703, 0, 41517, + 41504, 41519, 10016, 64305, 0, 65864, 623, 781, 670, 10660, 5769, 613, + 7543, 120279, 477, 41083, 92521, 0, 592, 1578, 12459, 43449, 0, 0, 8225, + 0, 654, 11345, 653, 652, 0, 647, 0, 633, 120744, 0, 126472, 12480, 43243, + 0, 39, 12487, 0, 120529, 74199, 12482, 0, 12489, 0, 3195, 5550, 983554, + 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, 0, 2877, 0, 0, 1675, + 69840, 0, 0, 0, 10070, 10595, 0, 119077, 194777, 983611, 0, 0, 0, 43244, + 0, 0, 983916, 119561, 983078, 0, 194921, 128160, 9939, 0, 983151, 77860, + 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0, 74038, 119558, 6273, 66679, + 364, 9595, 194908, 0, 0, 707, 0, 0, 9282, 66489, 224, 0, 68670, 9332, + 4966, 68677, 0, 68644, 0, 3841, 68634, 0, 10732, 68640, 850, 4972, 0, + 12890, 2909, 68619, 44008, 68627, 983718, 11544, 10203, 9608, 0, 0, + 11962, 194694, 12507, 1196, 128687, 128311, 777, 120187, 4375, 65271, + 67678, 0, 12198, 0, 64824, 119343, 983236, 9454, 63778, 8658, 42528, + 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 74520, 2701, + 0, 127002, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 983814, 63745, + 1748, 63770, 0, 0, 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, + 6096, 0, 7694, 0, 7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, + 1591, 0, 6386, 63783, 0, 0, 92535, 0, 0, 0, 74575, 0, 65719, 13083, + 64574, 65012, 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, 1922, 0, + 12498, 10987, 69936, 69939, 3894, 65543, 0, 194842, 983588, 493, 0, + 43197, 1717, 4228, 479, 10303, 74020, 0, 917935, 10335, 3520, 917932, + 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002, 12491, 0, 64911, + 92615, 2096, 65120, 0, 78219, 983081, 8378, 11632, 127041, 66213, 63864, + 66221, 66226, 66229, 13218, 66231, 66216, 8507, 66236, 66211, 66218, + 92672, 66240, 78041, 66233, 8928, 983552, 7909, 66234, 11605, 63759, + 983654, 66208, 73999, 63799, 63803, 244, 11542, 12898, 12494, 73761, + 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882, 13040, 0, 8612, 4885, + 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0, 63797, 92394, 42358, 0, + 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, 470, 78038, 78035, 78036, + 70028, 78034, 4579, 128090, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, + 8623, 94011, 128052, 128048, 7378, 12512, 11615, 6104, 0, 0, 659, 6098, + 0, 12234, 127307, 127067, 8311, 12510, 41803, 13039, 127072, 12513, + 10202, 12471, 0, 8747, 983920, 0, 0, 2323, 0, 2319, 77917, 12477, 77916, + 2311, 0, 4415, 237, 6281, 127280, 0, 0, 2309, 1312, 8173, 128871, 12469, + 0, 78505, 64335, 10609, 0, 128111, 9397, 11524, 9395, 9396, 9393, 9394, + 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, 9383, 9384, 6740, 0, + 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, 128167, 7948, 9236, + 92571, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082, 10924, 3147, + 0, 120684, 12524, 119081, 2310, 11818, 9381, 9382, 9379, 9380, 9377, + 9378, 9375, 9376, 1683, 9374, 983778, 9372, 12444, 0, 0, 13016, 8210, + 983958, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 983837, 4155, 0, + 0, 42030, 5007, 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, + 983841, 12525, 983471, 12016, 65770, 9548, 67665, 403, 78230, 12503, 0, + 0, 11030, 0, 92567, 65691, 63998, 1819, 10496, 0, 0, 119920, 0, 194668, + 0, 12506, 0, 12231, 0, 12500, 44023, 12509, 64393, 78830, 3389, 10589, + 6608, 41047, 120321, 78395, 78394, 74069, 77995, 78391, 3608, 8281, + 120320, 1107, 0, 9076, 8862, 69743, 41052, 13084, 64766, 43217, 7803, + 13222, 74165, 74782, 126514, 8546, 11553, 63995, 13177, 9043, 6303, + 983947, 498, 64471, 120324, 128567, 12529, 8042, 0, 2344, 12528, 8031, + 2414, 0, 69719, 3231, 0, 6422, 66512, 69653, 12530, 2537, 78405, 41429, + 12658, 13036, 65772, 0, 78738, 41433, 4719, 469, 0, 4363, 3313, 41428, + 78407, 2023, 1772, 78224, 78225, 65706, 10051, 64812, 78220, 0, 9920, + 12215, 0, 4931, 1951, 12497, 119363, 9607, 0, 9663, 983228, 119634, 6503, + 41110, 0, 1491, 0, 0, 127304, 41061, 0, 194838, 127187, 65026, 41993, + 41509, 11045, 65028, 78602, 66476, 41108, 9738, 41995, 1075, 1958, 12535, + 41992, 41506, 0, 41687, 0, 120717, 127776, 9940, 127299, 7692, 983833, + 8008, 41131, 330, 8566, 65083, 41133, 9816, 126517, 12532, 78550, 78546, + 3508, 127058, 43235, 0, 127298, 64139, 78231, 6411, 12910, 78554, 66644, + 13028, 6737, 12537, 0, 0, 64136, 12536, 2350, 13029, 78233, 0, 983103, + 13030, 6702, 4527, 0, 12538, 128810, 983645, 65599, 65717, 9966, 0, 4948, + 12484, 4032, 128149, 12623, 0, 6207, 0, 6117, 65930, 8412, 0, 7438, 1296, + 2325, 41511, 126625, 10149, 74118, 0, 127286, 12481, 0, 12488, 66713, 0, + 41556, 64414, 118802, 2354, 42619, 73766, 0, 6295, 901, 41510, 7953, 0, + 65032, 41513, 983166, 11927, 66584, 78559, 78560, 78557, 78558, 0, 78556, + 848, 9868, 0, 6424, 78568, 119338, 69922, 74031, 78563, 78564, 2352, + 78572, 893, 64576, 11289, 1407, 67973, 0, 13026, 6762, 78579, 78580, + 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 983823, 0, 9325, 6818, + 6283, 11738, 0, 983934, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, + 983825, 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, + 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 10024, 194764, 74583, + 74340, 69681, 0, 43001, 8029, 0, 0, 983780, 3335, 0, 0, 9776, 120526, + 194748, 5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, + 78581, 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 74542, + 3337, 4537, 67895, 11736, 0, 68608, 6482, 4214, 73790, 11945, 0, 13046, + 8838, 425, 4025, 10709, 78595, 2108, 2392, 13047, 0, 0, 6819, 13049, + 6499, 92243, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 127919, + 94073, 128069, 3277, 8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, + 64626, 66034, 7751, 194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, + 12420, 4024, 194730, 41054, 1078, 9757, 69736, 41057, 0, 0, 0, 0, 983791, + 92210, 92411, 0, 41496, 0, 9165, 1572, 11911, 0, 118842, 2346, 13270, + 8958, 0, 9646, 3773, 43183, 6401, 5831, 0, 0, 13043, 8056, 92494, 65681, + 208, 127382, 41514, 0, 0, 0, 10699, 6408, 92227, 7825, 5661, 0, 120630, + 3603, 41109, 2398, 3548, 126596, 0, 119933, 0, 3115, 9918, 0, 8294, + 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468, 983274, 41558, 41471, + 73950, 8158, 9944, 41472, 120298, 13051, 78689, 3143, 194674, 6701, + 41559, 1896, 66256, 13052, 194680, 5665, 0, 119071, 7025, 63974, 0, + 74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382, 1564, 73924, 1121, + 78319, 63959, 0, 9942, 13231, 0, 64752, 4732, 194666, 11596, 119931, + 65187, 1626, 63983, 10110, 64772, 42024, 6420, 42028, 0, 10509, 2795, + 4910, 194728, 69231, 64753, 6275, 93957, 118830, 63978, 11044, 3229, + 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 7085, 6137, 0, 7524, 0, + 917809, 8346, 0, 8338, 128315, 65043, 0, 822, 127984, 9903, 64721, 42722, + 69877, 194659, 78655, 78661, 194660, 78662, 41265, 5311, 1795, 965, + 118791, 10587, 78055, 11278, 78632, 194640, 0, 12946, 194641, 119341, + 120349, 6294, 3144, 194648, 194647, 65019, 194649, 73990, 0, 983960, 748, + 41067, 2330, 535, 3148, 12375, 78799, 194629, 10556, 2475, 12388, 4889, + 8968, 67863, 3593, 0, 0, 2342, 0, 194634, 65206, 4894, 194635, 4890, + 194637, 917804, 581, 4893, 983616, 6571, 65545, 4888, 4157, 78048, 78049, + 78046, 78047, 0, 10119, 6415, 42893, 0, 69702, 0, 0, 11375, 64746, 2332, + 78063, 412, 78061, 64932, 42880, 43587, 0, 0, 0, 0, 65197, 78066, 12203, + 78064, 78065, 8913, 65854, 4875, 65811, 120381, 120389, 118888, 9344, + 8826, 120386, 120395, 13104, 74781, 11997, 120393, 78075, 0, 3134, 0, + 65696, 92331, 0, 66217, 0, 8334, 119344, 0, 3449, 0, 0, 78414, 78413, + 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, 10734, 127014, 0, 127914, + 7804, 78272, 10811, 6250, 11339, 4914, 11367, 0, 78054, 4917, 74516, + 74208, 64285, 4912, 5464, 127836, 118893, 2361, 7971, 78072, 78073, + 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, 40977, 10960, 40962, + 8305, 12573, 983608, 40980, 983964, 13202, 0, 12582, 78282, 983048, + 69856, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, + 74045, 70039, 0, 0, 4913, 0, 983959, 71333, 42326, 128194, 12728, 92685, + 42478, 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, 6153, 2867, + 194708, 66312, 698, 128007, 194606, 10356, 70017, 194713, 651, 12641, 0, + 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851, 78461, 194697, + 74356, 64945, 4716, 43277, 0, 78474, 12340, 120568, 0, 194700, 55264, + 41211, 120676, 8703, 5462, 917629, 983495, 10101, 0, 70049, 8479, 4151, + 41933, 0, 0, 66254, 120821, 0, 0, 128654, 0, 119194, 74050, 92701, 0, 0, + 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, 0, 2699, 0, 73845, + 2985, 92568, 126475, 917845, 12192, 119314, 0, 119312, 9827, 119310, + 119311, 119308, 119309, 119306, 11481, 41210, 119305, 0, 35, 78481, + 78482, 66694, 68479, 78477, 78478, 43596, 6090, 64257, 7812, 10534, 0, + 78485, 73848, 67975, 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, + 0, 64497, 12138, 7930, 0, 2292, 68216, 0, 917826, 5244, 4189, 94108, + 67596, 127504, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 2279, 0, 917827, + 65555, 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682, 12578, + 12720, 0, 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0, 118850, + 119141, 128546, 66015, 0, 959, 8885, 12564, 66457, 78808, 9469, 9632, + 92323, 74761, 64323, 127335, 0, 0, 0, 310, 0, 41281, 10976, 0, 71325, 0, + 74266, 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215, 12730, + 65163, 74044, 374, 43195, 816, 120161, 0, 0, 41934, 7465, 0, 128168, + 983268, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307, 127147, + 9585, 5374, 983267, 128059, 0, 0, 126618, 120390, 0, 65567, 120614, 1929, + 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, 5378, 78791, + 128679, 41421, 0, 4462, 0, 126599, 128092, 821, 0, 2498, 5800, 120157, + 983115, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, + 43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, + 0, 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, + 1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592, + 78092, 74357, 194597, 4748, 92228, 194598, 194601, 42260, 5871, 119075, + 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, 8775, 127945, 0, 2963, + 0, 8410, 4454, 723, 127882, 966, 4449, 92330, 92238, 0, 7819, 2320, + 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, + 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, 983763, 1584, 66645, + 6045, 6729, 120640, 65218, 11559, 0, 78062, 7537, 0, 11370, 0, 10330, 0, + 10394, 0, 74194, 0, 127929, 9780, 0, 13092, 194576, 77950, 194578, 7074, + 92648, 194579, 194582, 11414, 128868, 2531, 13034, 0, 0, 4211, 1259, + 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219, 94034, 194566, 11064, + 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, 65793, 4535, + 194573, 4271, 78417, 128357, 6769, 41410, 983452, 64262, 6767, 41407, 0, + 0, 6755, 118864, 9046, 127934, 126608, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, + 2563, 13033, 247, 118915, 0, 12338, 4651, 69895, 11270, 0, 0, 11933, 0, + 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821, 41905, 0, 0, 10775, + 9793, 5009, 0, 42269, 64587, 983063, 42535, 69812, 64529, 41408, 42853, + 3877, 120795, 42674, 8147, 43566, 119021, 983776, 10236, 65918, 43782, 0, + 0, 64506, 69652, 118921, 4747, 128058, 69844, 43200, 5832, 0, 0, 5141, + 42600, 0, 43203, 0, 983799, 43286, 0, 128211, 43778, 0, 41305, 78776, + 43781, 11303, 65547, 0, 7031, 859, 0, 0, 0, 6059, 126985, 55235, 0, 8535, + 0, 65196, 194787, 66032, 11488, 120481, 120786, 42233, 64140, 9946, + 63885, 194792, 11822, 0, 43189, 983898, 0, 1788, 1579, 120482, 71298, 0, + 0, 0, 9028, 119571, 69234, 94055, 0, 1285, 64882, 41242, 70086, 0, 12640, + 0, 7401, 0, 12625, 68198, 0, 70082, 3940, 41597, 43754, 3396, 12642, + 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516, 118989, 0, 8815, + 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142, 68454, 42485, + 94012, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, 12032, 0, 9725, 0, + 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, 42777, 10139, 980, + 43698, 65386, 2208, 0, 43701, 43198, 7184, 120673, 194797, 917819, 10085, + 119992, 0, 119993, 6634, 92373, 0, 119323, 8072, 119321, 43700, 0, 8872, + 7783, 917992, 12398, 8237, 0, 0, 12395, 0, 126977, 120565, 9914, 2217, + 917854, 73975, 6367, 6351, 66688, 0, 78107, 0, 64735, 41243, 92199, 7808, + 1829, 0, 41937, 4358, 43272, 6353, 0, 0, 120422, 0, 1710, 0, 0, 65607, 0, + 49, 6627, 0, 6258, 10683, 78672, 9741, 78329, 5649, 78441, 43443, 64418, + 1643, 65213, 8405, 3470, 128225, 13213, 42452, 78331, 120664, 78445, 0, + 1072, 78457, 78452, 78454, 6576, 41988, 41132, 65675, 1080, 120002, 9886, + 55225, 1101, 68404, 12309, 55227, 0, 12632, 1086, 1869, 78685, 7680, 0, + 65458, 120714, 12639, 3380, 8123, 1091, 12638, 7977, 4501, 41099, 0, + 66309, 0, 0, 1494, 983146, 126613, 0, 11693, 126513, 10494, 92655, 65872, + 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0, 120462, 74106, + 12413, 94069, 917994, 917993, 917995, 5570, 1881, 7210, 0, 1012, 43752, + 0, 120709, 7208, 66442, 5569, 983242, 42339, 0, 6063, 0, 78383, 119594, + 6053, 65602, 0, 92201, 64727, 9160, 194827, 0, 0, 92180, 10503, 118810, + 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, 92204, + 983116, 0, 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, + 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, + 120101, 589, 7050, 983800, 43281, 10233, 41263, 66251, 65729, 66253, + 126497, 74099, 42645, 0, 194815, 8583, 0, 5847, 6928, 128074, 0, 0, 0, 0, + 66592, 12204, 917962, 19966, 77856, 42561, 120626, 983251, 0, 8120, + 120701, 0, 0, 128012, 41063, 0, 10664, 0, 8369, 0, 4551, 194964, 3369, 0, + 0, 9673, 66334, 65580, 10478, 118960, 12517, 557, 9457, 12034, 983671, + 6355, 12519, 41004, 0, 195025, 74094, 0, 0, 77970, 983560, 0, 128175, + 12111, 3927, 0, 12515, 1474, 67893, 5492, 6923, 92281, 10441, 73836, 0, + 43990, 5493, 0, 74319, 0, 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, + 917959, 5853, 13063, 10363, 0, 12956, 128169, 120729, 11314, 917582, + 12060, 0, 78392, 12826, 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, + 127054, 78398, 43570, 2697, 43420, 78396, 127057, 2695, 42171, 0, 0, 0, + 67617, 118971, 0, 2693, 12125, 12766, 0, 1164, 128817, 0, 41918, 983168, + 127542, 8687, 66009, 12178, 7053, 128001, 7469, 0, 5248, 12218, 120538, + 6427, 42884, 41123, 0, 0, 42873, 41126, 9991, 41128, 74371, 127031, 0, + 9873, 0, 42877, 7994, 64762, 2053, 42843, 6591, 9340, 0, 1589, 0, 296, + 74438, 78852, 0, 67841, 74370, 0, 8922, 128068, 74600, 12700, 74836, 0, + 12579, 0, 12575, 6416, 5656, 2891, 13262, 65590, 5299, 0, 11473, 5449, + 1252, 0, 78404, 41431, 74369, 65373, 5295, 917569, 74114, 1223, 1642, + 174, 78399, 883, 4161, 12691, 42603, 41413, 3212, 41459, 3211, 74810, + 41425, 127029, 78412, 74450, 9728, 3846, 8070, 6150, 6636, 4370, 0, 0, + 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0, 67648, 120499, 94001, 4257, + 12104, 77942, 6220, 9004, 65561, 0, 77949, 0, 68135, 917576, 77946, 0, + 69679, 69684, 9890, 78561, 12971, 78453, 92556, 73898, 11979, 70051, + 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469, 74227, 0, 65304, + 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0, 42916, 0, 0, 0, 7282, + 78728, 65733, 4445, 127138, 128082, 3494, 74606, 6555, 0, 77976, 0, 0, + 78566, 0, 983189, 65898, 983244, 65312, 5447, 0, 12895, 65593, 4010, 0, + 41106, 0, 64448, 0, 41105, 0, 65820, 6232, 0, 128280, 0, 43608, 119091, + 0, 6538, 4335, 78364, 3941, 41122, 11061, 78363, 64892, 9113, 1954, + 12155, 983674, 42878, 11500, 0, 0, 74578, 0, 65832, 0, 0, 0, 77975, + 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307, 0, 0, 5133, 0, 0, 9500, + 0, 4957, 64741, 2422, 2212, 983080, 0, 0, 2496, 11516, 944, 118851, 3890, + 12168, 1438, 0, 983117, 0, 41947, 1220, 120828, 128555, 0, 0, 1571, + 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, 983944, 0, 78120, + 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120, 65121, 10862, + 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986, 11532, 74073, + 127338, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, 11428, 1730, 2457, + 917808, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 92230, 0, 6129, 0, + 128528, 128268, 0, 7874, 8681, 119092, 0, 13136, 0, 0, 70102, 63886, + 118881, 9605, 71308, 13220, 128776, 120274, 5514, 0, 9228, 0, 0, 0, 5240, + 9811, 10012, 3096, 0, 0, 983351, 66676, 65873, 0, 0, 0, 9501, 0, 1272, + 64536, 65465, 64654, 7467, 0, 1467, 10158, 10040, 0, 9519, 0, 917812, 0, + 118899, 12193, 0, 0, 0, 0, 983353, 19935, 0, 92162, 69676, 0, 0, 0, 5275, + 0, 0, 8637, 0, 0, 3789, 63880, 11471, 43554, 65862, 11474, 66332, 66603, + 128138, 2426, 12042, 92194, 983911, 9537, 3961, 12115, 77953, 2605, 4500, + 64561, 55224, 4981, 0, 0, 63876, 11667, 42686, 77973, 42362, 64686, 4499, + 41649, 7589, 0, 0, 3237, 0, 68215, 917904, 8541, 78298, 70034, 41866, 0, + 0, 0, 0, 69924, 43555, 2823, 9559, 10060, 41940, 8299, 41945, 7132, + 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0, 41699, 10762, 43780, + 12999, 0, 0, 8106, 4128, 0, 6274, 4494, 0, 4012, 10395, 983591, 43633, + 65447, 126511, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, 9227, + 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 3868, 688, 41847, 690, + 2548, 737, 974, 8003, 7406, 917911, 0, 128688, 3985, 917912, 65860, + 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, 92505, 10879, 10347, + 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, 41958, 119176, 917908, 0, + 0, 42657, 92468, 7643, 42373, 11714, 67587, 43568, 983175, 11717, 7650, + 10594, 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0, 0, + 2337, 1735, 74324, 67860, 2363, 983135, 0, 43561, 0, 0, 74146, 1860, + 7495, 7580, 5812, 7497, 7584, 119140, 127853, 0, 120347, 7727, 0, 8498, + 69818, 8949, 3065, 42719, 7135, 1569, 92375, 12534, 12124, 7690, 0, + 12533, 983879, 6418, 4543, 78086, 6969, 0, 74800, 0, 67974, 11980, + 128650, 983801, 63894, 120760, 12282, 66192, 0, 74592, 8850, 74275, 9238, + 10617, 917545, 0, 92625, 0, 12791, 0, 0, 127843, 4447, 73732, 12793, + 12900, 92377, 10950, 0, 78087, 12790, 41400, 119128, 66607, 12792, 42232, + 194938, 1744, 12789, 10366, 12317, 41310, 983869, 41399, 0, 0, 55258, 0, + 12690, 0, 0, 43672, 127840, 41652, 2974, 9010, 11315, 0, 278, 0, 41405, + 119254, 0, 10077, 63853, 74557, 42586, 0, 0, 6002, 0, 43553, 0, 67903, 0, + 12787, 41308, 7934, 65306, 0, 0, 0, 8646, 983186, 77829, 71360, 0, 6413, + 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, 10044, 128322, 0, 0, + 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, 10297, 0, 3742, 0, + 3959, 0, 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, 43758, 4182, 78171, + 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361, 11540, 43546, 6692, 0, + 41060, 0, 4668, 9083, 0, 0, 78144, 1559, 63831, 9677, 120260, 0, 65256, + 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716, 128236, 0, 120472, + 5516, 2845, 7717, 8036, 41717, 73827, 544, 12045, 6278, 0, 5515, 0, 0, + 983051, 65339, 43221, 2211, 0, 5517, 0, 0, 74841, 67884, 0, 67890, 67885, + 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, 1902, 67887, 9638, + 12976, 126546, 12483, 12368, 41769, 42726, 41765, 7361, 6667, 67874, + 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311, 917966, 4326, + 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949, 78162, 0, 6148, + 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, 41796, 1269, 6530, 0, + 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 983729, 128675, 41834, 5279, + 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, 0, 0, 6428, 42270, 0, + 983596, 43059, 42666, 5256, 1067, 255, 12131, 983722, 9493, 983968, + 41014, 11793, 194920, 0, 74394, 43460, 10653, 42723, 983854, 119632, 0, + 6560, 7016, 74274, 983615, 43556, 3929, 67977, 6614, 2768, 92504, 9746, + 5135, 11811, 12796, 11953, 0, 69761, 5139, 346, 74303, 6305, 12795, 4675, + 5168, 78552, 127753, 74315, 74361, 8253, 8817, 1136, 0, 43563, 92232, 0, + 194750, 7392, 8230, 9365, 0, 0, 983607, 0, 0, 4041, 0, 2357, 43240, + 12786, 229, 119885, 119884, 44004, 7142, 119881, 12350, 65554, 119882, + 119877, 119876, 12785, 63863, 43795, 7770, 10712, 64853, 12686, 118916, + 42375, 0, 127238, 66352, 10470, 0, 11059, 10791, 917944, 450, 119328, 0, + 10432, 12097, 5450, 64691, 1233, 0, 44009, 78284, 66338, 0, 0, 1839, + 118799, 983219, 10927, 1701, 983664, 2388, 41749, 41761, 5453, 8361, + 119865, 41758, 5444, 41763, 64889, 7143, 92493, 78677, 0, 92429, 78174, + 66432, 8801, 3053, 4340, 983044, 0, 65812, 917831, 0, 41824, 67985, + 120203, 194800, 194803, 42700, 194805, 127980, 194807, 78676, 92356, + 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826, 119325, 194811, 42439, + 64638, 42327, 43528, 4489, 71331, 0, 194793, 1912, 42385, 10306, 10370, + 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410, 92671, 983250, 118878, + 0, 0, 9919, 120528, 559, 128157, 41825, 127975, 78188, 4892, 74016, + 194781, 6542, 41957, 128865, 5777, 0, 759, 65749, 2079, 65248, 12788, + 64487, 64552, 0, 10223, 42062, 0, 0, 126573, 3668, 65754, 43560, 12226, + 67991, 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747, 10937, + 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, 42714, 9951, 43409, + 194770, 2949, 66012, 194775, 194774, 2958, 68359, 41820, 2300, 2395, + 128563, 9976, 120043, 120050, 120058, 68220, 128143, 42809, 42807, 0, + 120046, 10198, 4150, 64371, 8318, 41790, 67976, 41898, 2360, 41794, + 917942, 71314, 127818, 0, 0, 2418, 983098, 2411, 11336, 799, 63823, + 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980, 55284, + 92203, 0, 10384, 983220, 0, 0, 7753, 2351, 6655, 64489, 69931, 0, 77872, + 4443, 42779, 230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896, 10288, + 10320, 0, 855, 7046, 6109, 65045, 63839, 78198, 2049, 10098, 0, 74145, + 127943, 10264, 10280, 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0, 4862, + 9735, 6537, 120591, 74286, 3914, 92178, 93976, 9065, 12961, 0, 0, 92253, + 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 73893, 42724, 0, + 4688, 120454, 0, 0, 67994, 8238, 3110, 120162, 983908, 120163, 6528, + 127553, 43035, 69898, 218, 0, 1520, 0, 4786, 0, 43225, 4602, 0, 78167, + 10088, 6548, 0, 120156, 43978, 8988, 8888, 0, 0, 0, 0, 10666, 0, 73902, + 69740, 0, 0, 9975, 128039, 119902, 4689, 8932, 0, 65560, 119209, 74441, + 78810, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 92613, 128011, 0, + 662, 0, 9244, 194863, 0, 119261, 983428, 0, 0, 0, 41929, 0, 0, 66674, + 41926, 120408, 120443, 10513, 64637, 194862, 68013, 52, 13118, 6475, 0, + 120341, 12095, 10225, 4812, 92578, 0, 67992, 74085, 0, 3978, 0, 917945, + 127823, 11582, 120761, 12281, 0, 6544, 13241, 93961, 69782, 128557, + 194860, 11765, 65258, 10369, 0, 1585, 7192, 10249, 422, 1500, 2036, 986, + 194859, 64394, 5781, 5599, 64294, 2494, 120450, 4861, 74021, 64334, + 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 74191, 120410, + 0, 120453, 64821, 9478, 2508, 92683, 0, 202, 128246, 74131, 1242, 65514, + 0, 63940, 128706, 64533, 120129, 0, 67842, 11990, 92430, 63939, 43375, + 65440, 2504, 0, 78671, 64829, 983910, 6943, 917934, 5859, 0, 2858, + 983361, 74294, 983914, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574, 2751, 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, 74128, 2856, 119910, 47, 69908, 126986, 65858, 0, 0, 0, 7899, 0, 8417, 43798, 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903, @@ -17799,23 +17816,23 @@ 12624, 0, 1673, 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928, 119598, 9820, 0, 12187, 0, 0, 5984, 0, 43308, 4393, 67650, 0, 0, 0, 0, 74826, 64733, 0, 0, 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605, - 92483, 7514, 983360, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, + 92483, 7514, 983367, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, 7147, 9535, 0, 93991, 0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895, 5253, 70025, 5458, 0, 2866, 0, 127860, 65111, 68433, 6700, 120484, 0, - 120583, 0, 8962, 77960, 9641, 43694, 7059, 983668, 0, 9604, 78700, 7441, - 63826, 67970, 118941, 64392, 194735, 983678, 2844, 983932, 41974, 0, - 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983228, + 120583, 0, 8962, 77960, 9641, 43694, 7059, 983677, 0, 9604, 78700, 7441, + 63826, 67970, 118941, 64392, 194735, 983687, 2844, 983941, 41974, 0, + 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983233, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 983070, 0, 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528, 65903, 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163, 65270, 0, 77932, 0, 9112, 74431, 863, 9490, 119898, 128349, 43323, 120513, 119897, 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, 119899, - 66587, 195098, 0, 92401, 983885, 11006, 12927, 7807, 8073, 0, 10629, 0, + 66587, 195098, 0, 92401, 983894, 11006, 12927, 7807, 8073, 0, 10629, 0, 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969, 43193, 10737, 3463, 983065, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 119911, 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, - 6561, 19939, 0, 0, 128535, 119906, 0, 0, 983097, 0, 983658, 119907, + 6561, 19939, 0, 0, 128535, 119906, 0, 0, 983097, 0, 983667, 119907, 64612, 11991, 0, 0, 0, 1502, 917568, 0, 9107, 127316, 5702, 3655, 67661, 8430, 0, 74132, 120758, 0, 74057, 9603, 0, 5254, 120742, 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, 5614, 5893, 92280, 11720, 92496, @@ -17829,17 +17846,17 @@ 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 71345, 586, 74414, 64359, 1267, 128269, 65468, 0, 65731, 0, 127179, 3621, 120473, 66666, 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, - 74406, 127831, 0, 983912, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, + 74406, 127831, 0, 983921, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, 0, 10291, 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999, - 92164, 12206, 5839, 1702, 1240, 74065, 6286, 0, 983960, 65833, 77848, 0, + 92164, 12206, 5839, 1702, 1240, 74065, 6286, 0, 983969, 65833, 77848, 0, 1765, 0, 0, 65588, 0, 0, 0, 8401, 0, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 0, 128586, 917951, 6963, 0, 12667, 64540, 74786, 10147, 12935, 127568, 126483, 0, 0, 0, 78757, 0, 0, 0, 0, 9994, 12467, 2864, 64719, 1148, 10435, 11462, 41675, 7084, 2765, 0, 43382, 0, 120719, 128188, 92516, 66662, 0, 78133, 9364, 194685, 74416, 0, 0, 77988, 263, - 10449, 41288, 0, 41839, 78387, 983733, 77986, 0, 6931, 69722, 64355, + 10449, 41288, 0, 41839, 78387, 983742, 77986, 0, 6931, 69722, 64355, 7177, 70105, 0, 0, 0, 4262, 10285, 10722, 42020, 126575, 6806, 6992, - 42019, 0, 41290, 983707, 750, 0, 71304, 10163, 63913, 71300, 7032, 5954, + 42019, 0, 41290, 983716, 750, 0, 71304, 10163, 63913, 71300, 7032, 5954, 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891, 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, 70026, 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712, 66045, @@ -17847,31 +17864,31 @@ 69669, 43254, 73831, 0, 10293, 5952, 1281, 43747, 0, 0, 10677, 604, 41097, 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374, - 917956, 0, 2822, 68122, 4436, 92519, 983714, 73752, 0, 64872, 92340, + 917956, 0, 2822, 68122, 4436, 92519, 983723, 73752, 0, 64872, 92340, 1331, 0, 0, 0, 12708, 0, 5090, 5089, 127977, 0, 119109, 0, 128681, 319, 118847, 43479, 9477, 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0, 5085, 64286, 92665, 0, 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 126587, 0, 127165, 127241, 6677, 7601, 0, 591, 64419, 118953, 92262, 0, 118923, 70084, 0, 10939, 6106, 6933, 41271, 6760, 71343, 4534, 41270, 128876, 0, 65574, 0, 9224, 69853, 3671, 8976, 126474, 0, 41275, 6372, - 128084, 55261, 7963, 6371, 0, 568, 0, 41273, 983721, 0, 6728, 0, 9715, 0, + 128084, 55261, 7963, 6371, 0, 568, 0, 41273, 983730, 0, 6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42, 0, 43688, 0, 0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254, 42721, 66336, 8045, 11550, 0, 0, 983597, 42858, 11789, 65868, 5557, 10133, 9737, 13109, 0, 9467, 5558, 8878, 128136, 195036, 7451, 6706, 10146, 0, 9086, 64566, 0, 64584, 7437, 7454, 12594, 128690, 68362, 4546, 7731, 0, 70048, 74243, 0, 3805, - 0, 194565, 44001, 41008, 0, 6307, 19949, 983781, 7544, 983045, 43469, 0, + 0, 194565, 44001, 41008, 0, 6307, 19949, 983790, 7544, 983045, 43469, 0, 0, 10152, 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, 42302, 43711, 43523, 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, 9630, 92633, 0, 93998, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0, - 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 983796, 74365, 7552, 0, 0, + 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 983805, 74365, 7552, 0, 0, 65384, 7223, 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077, - 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 983286, - 983783, 0, 4357, 0, 119837, 917863, 74233, 9967, 78884, 42860, 119838, + 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 983293, + 983792, 0, 4357, 0, 119837, 917863, 74233, 9967, 78884, 42860, 119838, 10941, 65721, 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224, 92267, 128536, 11974, 92213, 42772, 127518, 11650, 5013, 92663, 126583, - 66210, 118914, 6613, 92476, 0, 43819, 983761, 0, 64714, 0, 0, 12162, - 12120, 43476, 983757, 11024, 74811, 66228, 10563, 0, 127196, 43522, 2462, + 66210, 118914, 6613, 92476, 0, 43819, 983770, 0, 64714, 0, 0, 12162, + 12120, 43476, 983766, 11024, 74811, 66228, 10563, 0, 127196, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, 120559, 4952, 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005, 127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 127924, 3483, 119593, 1989, 0, 69678, 9104, @@ -17884,7 +17901,7 @@ 41869, 12619, 0, 10154, 983043, 74439, 2039, 0, 7446, 1684, 63979, 10974, 458, 120620, 0, 69791, 127161, 11916, 65016, 0, 69671, 42115, 983133, 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, 13080, 0, 65808, 6610, - 6030, 8059, 7508, 13131, 0, 983424, 0, 8794, 41278, 41629, 12154, 128192, + 6030, 8059, 7508, 13131, 0, 983431, 0, 8794, 41278, 41629, 12154, 128192, 41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0, 0, 65371, 7078, 0, 833, 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, 19916, 6913, 933, 1341, 9842, 6720, 65744, 0, 983592, 128295, 0, 7405, 10105, 65810, 0, 41632, @@ -17899,23 +17916,23 @@ 6741, 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, 10391, 41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, 41751, 69776, 8941, 983556, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, - 11437, 43741, 92163, 120700, 63967, 983476, 41206, 120724, 9049, 41185, + 11437, 43741, 92163, 120700, 63967, 983483, 41206, 120724, 9049, 41185, 43166, 0, 11680, 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0, 92183, 64523, 10343, 10407, 0, 66671, 11466, 0, 128003, 42890, 74013, 12050, 68201, 2860, 0, 0, 0, 42792, 5743, 10424, 12065, 42872, 0, 92342, 0, 8875, 0, 0, 917991, 7531, 12847, 2413, 0, 78635, 962, 0, 12855, 41196, - 42564, 0, 1582, 983706, 5508, 0, 0, 0, 10801, 69876, 92354, 0, 7173, 496, + 42564, 0, 1582, 983715, 5508, 0, 0, 0, 10801, 69876, 92354, 0, 7173, 496, 10439, 4313, 64607, 69638, 7860, 0, 906, 42793, 2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, 92173, 64788, 0, 8054, 9174, 128652, 917976, 9964, 74409, 41611, 4642, 66574, 11556, 917982, 0, 78857, 42089, 78855, 9008, 0, 126592, 195096, 42079, 917981, 77924, 42513, 77927, - 42842, 73985, 65285, 118974, 127003, 983693, 0, 0, 0, 11335, 64069, - 42093, 3920, 0, 0, 0, 0, 4580, 41967, 983723, 64384, 92167, 93984, 3021, + 42842, 73985, 65285, 118974, 127003, 983702, 0, 0, 0, 11335, 64069, + 42093, 3920, 0, 0, 0, 0, 4580, 41967, 983732, 64384, 92167, 93984, 3021, 42004, 0, 0, 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0, 68113, 42690, 9880, 42010, 74824, 64589, 10111, 64875, 127880, 68399, 43998, 11360, 0, 0, 0, 118826, 42149, 0, 0, 0, 64941, 77919, 120421, 128077, 0, 55247, 4110, 66005, 6959, 10929, 119110, 0, 66703, 77921, 8617, 41982, - 6025, 69242, 983176, 0, 0, 0, 9597, 42099, 43172, 983369, 10117, 983169, + 6025, 69242, 983176, 0, 0, 0, 9597, 42099, 43172, 983376, 10117, 983169, 92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0, 127517, 0, 8964, 65676, 7775, 0, 41948, 0, 0, 0, 41942, 65449, 3160, 10081, 13226, 42121, 42475, 42663, 128210, 41766, 119114, 65882, 78849, @@ -17925,20 +17942,20 @@ 3103, 0, 41753, 128540, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756, 43347, 42560, 5391, 41746, 119147, 92591, 41259, 5561, 69930, 2691, 0, 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846, - 41251, 0, 0, 3979, 0, 0, 74813, 983730, 0, 0, 0, 92524, 41266, 0, 66566, + 41251, 0, 0, 3979, 0, 0, 74813, 983739, 0, 0, 0, 92524, 41266, 0, 66566, 128836, 10585, 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 128106, 69932, 916, 769, 41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, 126537, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, - 0, 0, 74260, 0, 42854, 43219, 128709, 983453, 12185, 128879, 70072, - 68355, 68357, 0, 42856, 8634, 0, 983390, 4209, 120702, 0, 65879, 41538, - 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983457, 5678, 11821, 0, - 6711, 460, 0, 0, 983454, 0, 120747, 0, 0, 78050, 119022, 0, 983455, 0, + 0, 0, 74260, 0, 42854, 43219, 128709, 983460, 12185, 128879, 70072, + 68355, 68357, 0, 42856, 8634, 0, 983397, 4209, 120702, 0, 65879, 41538, + 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983464, 5678, 11821, 0, + 6711, 460, 0, 0, 983461, 0, 120747, 0, 0, 78050, 119022, 0, 983462, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 128079, - 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983385, 0, 78119, 1549, 0, 0, + 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983392, 0, 78119, 1549, 0, 0, 120398, 5682, 6206, 8670, 10256, 5680, 69935, 10001, 128512, 69768, 1449, 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 68030, 5567, - 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983249, 128026, 0, 65708, + 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983256, 128026, 0, 65708, 65709, 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468, 120561, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 119903, 8802, 78710, @@ -17952,14 +17969,14 @@ 119570, 42239, 8536, 78740, 78324, 78726, 74432, 724, 0, 1455, 78749, 7183, 64583, 78747, 68443, 4175, 78741, 43614, 69801, 939, 0, 43520, 68613, 74569, 917958, 0, 78763, 78764, 78760, 10788, 6088, 78759, 78755, - 190, 0, 12593, 0, 8188, 64408, 0, 4417, 983212, 92261, 6370, 0, 7827, + 190, 0, 12593, 0, 8188, 64408, 0, 4417, 983213, 92261, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 128205, 69896, 0, 74382, 73781, 7918, 73988, 0, - 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983374, + 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983381, 0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, 0, 0, 0, 13065, 9923, 10806, 0, 11763, 70016, 120688, 6723, 78187, 0, 6993, - 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983308, 69911, 11910, + 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983315, 69911, 11910, 92559, 8278, 8963, 4034, 128560, 0, 65344, 120517, 41747, 0, 0, 8677, 0, - 12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 983741, 0, 7491, + 12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 983750, 0, 7491, 8856, 71361, 0, 43150, 127768, 120404, 65389, 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, 9588, 120248, 1596, 120383, 41994, @@ -17984,27 +18001,27 @@ 116, 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 77931, 1536, 64093, 73970, 77930, 127157, 0, 6020, 12716, 127112, 12744, 475, 120394, - 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983300, 8134, - 128028, 2913, 73870, 127113, 1866, 0, 195095, 0, 8923, 1645, 12059, + 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983307, 8134, + 128028, 2913, 73870, 127113, 1866, 983229, 195095, 0, 8923, 1645, 12059, 66585, 71297, 3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859, 7916, 9861, 9860, 5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0, 128781, 41169, 8939, 41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0, - 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983301, 645, 126616, + 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983308, 645, 126616, 7609, 40973, 69943, 73833, 69948, 5824, 984, 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369, 0, 128140, 68415, 983093, 4538, 120406, - 43141, 0, 983209, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0, + 43141, 0, 983210, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0, 983159, 12997, 0, 0, 0, 0, 2381, 12883, 10994, 10529, 41906, 0, 0, 0, 12425, 10661, 10856, 9614, 2428, 41478, 8582, 10064, 73930, 0, 0, 0, - 64896, 119162, 1952, 92181, 8455, 10082, 11575, 983483, 119566, 0, 12808, + 64896, 119162, 1952, 92181, 8455, 10082, 11575, 983490, 119566, 0, 12808, 12183, 6145, 118955, 64929, 92433, 0, 983193, 43186, 42509, 0, 3922, 9187, 983614, 0, 10191, 119057, 11752, 3353, 9358, 0, 71366, 66680, - 120090, 8248, 7931, 8558, 9795, 68380, 983290, 0, 120082, 120081, 120084, + 120090, 8248, 7931, 8558, 9795, 68380, 983297, 0, 120082, 120081, 120084, 41027, 120086, 0, 120088, 7366, 7019, 120073, 0, 11751, 120078, 78294, 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0, 43154, 41029, 0, 11332, 65380, 7728, 94077, 11294, 0, 66665, 7851, 0, - 8375, 8699, 0, 42524, 0, 9085, 94041, 7504, 9327, 6160, 128095, 983855, + 8375, 8699, 0, 42524, 0, 9085, 94041, 7504, 9327, 6160, 128095, 983864, 0, 8088, 0, 74012, 92500, 0, 4439, 6926, 983047, 12924, 128227, 42369, - 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983276, 0, 0, + 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983283, 0, 0, 65825, 9577, 68199, 0, 64670, 983121, 78056, 6793, 11295, 0, 78053, 73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, 2371, 78069, 120808, 259, 1009, 92171, 2402, 2333, 6440, 194741, 0, 65125, @@ -18012,19 +18029,19 @@ 127070, 41261, 119362, 43640, 8613, 0, 94049, 6736, 195092, 41492, 12005, 69927, 0, 1890, 120056, 0, 0, 0, 7293, 7991, 0, 10578, 0, 78076, 194738, 78077, 69928, 0, 78800, 92653, 64445, 42668, 6635, 0, 6164, 65170, 0, 0, - 7676, 11664, 0, 983649, 69707, 0, 118812, 0, 0, 128045, 9175, 11925, + 7676, 11664, 0, 983658, 69707, 0, 118812, 0, 0, 128045, 9175, 11925, 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 127177, 127835, 4985, 13288, 672, 8098, 43196, 194746, 983096, 128126, 42655, 74043, 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, 128584, 12622, 0, 0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0, 126983, 42731, 67972, 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, 43991, 69687, 66649, - 9510, 66237, 983295, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707, + 9510, 66237, 983302, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, 6686, - 119584, 11613, 120772, 42754, 0, 983299, 92696, 0, 0, 0, 128523, 3225, + 119584, 11613, 120772, 42754, 0, 983306, 92696, 0, 0, 0, 128523, 3225, 917996, 4433, 41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757, 64879, 917949, 917950, 127848, 13227, 0, 10021, 5160, 1387, 0, 917953, 41418, 0, 65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158, - 119257, 4274, 983293, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, + 119257, 4274, 983300, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, 0, 41252, 66682, 0, 119637, 41249, 1366, 64635, 65047, 12466, 0, 0, 4397, 128037, 128336, 41296, 9545, 41291, 128049, 0, 41485, 3511, 41282, 5923, 10400, 0, 128818, 760, 0, 12088, 5786, 0, 42256, 119869, 119860, 417, @@ -18034,15 +18051,15 @@ 119576, 0, 0, 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 69845, 120794, 7840, 0, 43630, 10252, 0, 128104, 43185, 0, 4396, 0, 119880, 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, 6072, 43025, - 10299, 0, 0, 120608, 66326, 983440, 127794, 0, 43811, 9330, 120596, 7222, - 10283, 10315, 10379, 4996, 983773, 13281, 66517, 7865, 10087, 78343, 0, + 10299, 0, 0, 120608, 66326, 983447, 127794, 0, 43811, 9330, 120596, 7222, + 10283, 10315, 10379, 4996, 983782, 13281, 66517, 7865, 10087, 78343, 0, 78347, 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 7414, 77929, 43982, 74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212, 65435, 0, 12071, 9609, 12156, 917983, 917984, 43586, 11035, 10411, 917988, 10255, 6710, 10279, 4194, 10375, 73900, 0, 4315, 12644, 127516, 77937, 43639, 43343, 78777, 917998, 11501, 41177, 128689, 0, 917792, 0, 92413, 8715, 0, 41179, 0, 43313, 0, 41176, 0, 994, 0, 8452, 127103, - 73966, 0, 0, 5921, 0, 2597, 0, 5922, 118903, 77943, 4186, 92531, 127106, + 73966, 0, 0, 5921, 0, 2597, 0, 5922, 118903, 77943, 4186, 92531, 119967, 127105, 6718, 0, 4406, 74601, 8480, 9192, 9747, 126530, 4413, 92196, 42268, 3198, 5924, 5920, 92469, 6921, 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, 10772, 65276, 5937, 1914, 2553, 11682, @@ -18065,7 +18082,7 @@ 7830, 11651, 13093, 64002, 0, 65742, 12874, 119597, 11590, 0, 74048, 128350, 8595, 0, 917947, 43703, 13097, 0, 64643, 13283, 12697, 0, 12381, 3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, 119153, 1955, 0, 5349, - 42538, 0, 0, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983220, 7638, + 42538, 0, 0, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983221, 7638, 41642, 42764, 0, 43109, 7637, 5752, 74037, 0, 73832, 128827, 120635, 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 120798, 291, 0, 0, 2027, 66230, 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431, @@ -18077,17 +18094,17 @@ 78270, 127982, 983172, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671, 195089, 6069, 9219, 128558, 1661, 13120, 63784, 69819, 10140, 9713, 119143, 0, 0, 94050, 2306, 10485, 118943, 6068, 10612, 195099, 119567, - 195101, 92561, 41462, 120470, 195079, 5422, 128234, 0, 0, 0, 10229, + 195101, 92561, 41462, 120470, 195079, 5422, 128234, 983629, 0, 0, 10229, 10635, 826, 128081, 195082, 195085, 195084, 195087, 6483, 92211, 1808, 7848, 0, 8100, 78227, 78669, 78670, 13301, 78667, 9667, 78665, 78872, 0, 11003, 9904, 0, 0, 120690, 9144, 10921, 0, 78680, 9840, 65131, 78678, 77841, 10313, 0, 0, 64320, 10265, 78686, 10962, 78684, 43008, 8945, 78683, 0, 41, 195072, 1792, 120515, 195073, 8655, 195075, 92544, 77951, - 12066, 0, 385, 4152, 2585, 127804, 119068, 3126, 0, 74136, 10957, 983694, + 12066, 0, 385, 4152, 2585, 127804, 119068, 3126, 0, 74136, 10957, 983703, 43258, 119116, 127873, 13157, 0, 917544, 3570, 0, 7443, 0, 44006, 6997, 68004, 126631, 7879, 8739, 11075, 0, 65216, 0, 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, 119912, 9691, 4411, 78802, 0, 0, 43442, - 69851, 65254, 10066, 983880, 0, 0, 0, 13061, 8016, 78687, 19932, 64831, + 69851, 65254, 10066, 983889, 0, 0, 0, 13061, 8016, 78687, 19932, 64831, 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 983574, 119925, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452, 194709, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969, @@ -18102,7 +18119,7 @@ 13244, 120466, 42167, 7435, 78193, 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, 65684, 0, 5601, 65192, 42765, 63752, 0, 7987, 128543, 1172, 69799, 6786, 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0, - 65347, 65346, 65345, 0, 127384, 5347, 69802, 983623, 73868, 118944, + 65347, 65346, 65345, 0, 127384, 5347, 69802, 983632, 73868, 118944, 10588, 0, 0, 63755, 0, 5343, 78422, 120661, 4555, 5341, 0, 70071, 128670, 5351, 78675, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, 74765, 917888, 127510, 6638, 0, 65113, 271, 74180, 65370, 8835, 65368, 12653, @@ -18112,14 +18129,14 @@ 0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096, 73980, 69245, 78254, 917893, 10684, 0, 917896, 0, 7946, 12541, 8182, 67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0, 68011, 8847, 0, - 65876, 5535, 8329, 74590, 983207, 92609, 0, 0, 3127, 2595, 65713, 42013, - 983849, 5607, 41089, 0, 0, 74256, 2665, 11304, 43751, 74200, 4970, 8764, + 65876, 5535, 8329, 74590, 983208, 92609, 0, 0, 3127, 2595, 65713, 42013, + 983858, 5607, 41089, 0, 0, 74256, 2665, 11304, 43751, 74200, 4970, 8764, 120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254, 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 68019, 3572, 10023, 4959, - 13079, 0, 983269, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, - 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983302, 972, - 41453, 983435, 0, 73883, 68022, 73945, 983726, 2288, 19955, 9538, 0, - 69807, 0, 0, 0, 0, 11396, 983433, 11019, 0, 0, 0, 68020, 41078, 71365, + 13079, 0, 983276, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, + 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983309, 972, + 41453, 983442, 0, 73883, 68022, 73945, 983735, 2288, 19955, 9538, 0, + 69807, 0, 0, 0, 0, 11396, 983440, 11019, 0, 0, 0, 68020, 41078, 71365, 261, 5927, 7791, 0, 7362, 0, 10696, 0, 6073, 9838, 118920, 0, 6075, 93995, 282, 126510, 6437, 74078, 128000, 9801, 0, 74177, 0, 0, 3474, 118787, 0, 120655, 6081, 0, 78874, 74076, 78879, 0, 0, 0, 0, 0, 8751, @@ -18140,7 +18157,7 @@ 4564, 0, 0, 74271, 73753, 8374, 983156, 0, 6829, 5225, 128807, 127385, 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 74075, 127236, 128019, 42614, 5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 69942, 6952, - 983265, 120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471, + 983272, 120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471, 120038, 120027, 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400, 5627, 120017, 120018, 120023, 64275, 120021, 8786, 0, 203, 0, 0, 0, 0, 78350, 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, @@ -18152,9 +18169,9 @@ 1168, 9251, 9082, 119964, 64055, 42781, 3866, 12323, 41512, 73805, 68121, 0, 41494, 92316, 4660, 0, 10405, 0, 78803, 0, 0, 42040, 73918, 119627, 7944, 41454, 12605, 0, 42205, 41455, 236, 64051, 78867, 8214, 0, 0, 0, - 41457, 983961, 119589, 1969, 2384, 8097, 917864, 7413, 68012, 78029, + 41457, 983970, 119589, 1969, 2384, 8097, 917864, 7413, 68012, 78029, 8766, 0, 78079, 5854, 127974, 10583, 0, 119989, 0, 10416, 917869, 3872, - 917868, 0, 8429, 0, 118806, 2838, 128802, 0, 917866, 0, 0, 0, 983958, + 917868, 0, 8429, 0, 118806, 2838, 128802, 0, 917866, 0, 0, 0, 983967, 94005, 11096, 120813, 10553, 1662, 8483, 120396, 43605, 5892, 43418, 0, 73742, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 119862, 10357, 7385, 8170, 1704, @@ -18169,7 +18186,7 @@ 12472, 0, 69864, 7699, 12393, 0, 0, 0, 74518, 8223, 0, 4261, 0, 0, 0, 0, 0, 128302, 0, 128046, 43419, 0, 64554, 10574, 3878, 0, 42352, 1752, 73785, 0, 42506, 128541, 10199, 0, 0, 68021, 65919, 0, 6695, 720, 324, 0, - 0, 43406, 983727, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, 64041, + 0, 43406, 983736, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, 64041, 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 119134, 0, 0, 5204, 74774, 43404, 11835, 0, 3995, 68360, 65608, 3714, 92190, 0, 0, 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, 8130, 8672, 10845, @@ -18177,22 +18194,22 @@ 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 983163, 12280, 0, 540, 74564, 119017, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, 64684, 126992, 3359, 7800, 69934, 65177, 6226, 353, 12396, 0, 119612, - 64742, 128682, 120282, 0, 983443, 12412, 19941, 0, 120277, 78847, 1884, + 64742, 128682, 120282, 0, 983450, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418, 70059, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0, 12409, 0, 4360, 127009, 9739, 128550, 69933, 73921, 0, - 42521, 8539, 983716, 0, 118986, 0, 4788, 0, 68023, 65734, 983448, 43790, + 42521, 8539, 983725, 0, 118986, 0, 4788, 0, 68023, 65734, 983455, 43790, 0, 13075, 74429, 94063, 64569, 43532, 10837, 2492, 127197, 118901, 68637, 41136, 43785, 11813, 9649, 41154, 119617, 5128, 4038, 41143, 65604, 64859, 41592, 6771, 1648, 5435, 917837, 6734, 41343, 119848, 65439, 12709, 6986, 92364, 68015, 0, 41349, 70021, 12581, 10374, 5175, 0, 73806, 10254, 0, 10278, 10262, 69858, 41346, 0, 607, 0, 119852, 128846, 12923, 10314, 10282, 65477, 10378, 120297, 40976, 8265, 0, 119834, 40975, 5840, - 42838, 0, 40978, 983888, 119840, 0, 983071, 0, 66444, 10538, 0, 2550, + 42838, 0, 40978, 983897, 119840, 0, 983071, 0, 66444, 10538, 0, 2550, 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619, 65822, 126567, 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0, 120551, 42380, 64895, 43693, 66451, 808, 5455, 11347, 0, 1026, 5620, 194887, 0, 11350, 5617, 0, 9225, 64639, 127073, 9145, 128060, 1338, 120581, 983158, 12739, - 4603, 3084, 983155, 92484, 9858, 6037, 0, 3974, 78213, 10290, 983695, + 4603, 3084, 983155, 92484, 9858, 6037, 0, 3974, 78213, 10290, 983704, 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0, 64700, 10011, 1445, 40961, 0, 119105, 0, 40960, 0, 194891, 0, 40963, 64952, 10402, 0, 0, 92304, 10603, 0, 0, 983113, 0, 6714, 10083, 127069, @@ -18204,9 +18221,9 @@ 41976, 9720, 917606, 11767, 41970, 194596, 5836, 12358, 0, 4355, 9048, 12180, 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362, 12435, 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0, - 3638, 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 983736, 119182, 69244, 0, + 3638, 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 983745, 119182, 69244, 0, 0, 11759, 194903, 6368, 74823, 0, 41423, 8078, 10504, 127558, 41698, - 42237, 0, 7002, 983669, 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, + 42237, 0, 7002, 983678, 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, 10466, 13099, 0, 0, 0, 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625, 78157, 41409, 0, 69639, 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0, 41424, 917598, 120546, 0, 128212, 0, 41417, 1261, 0, 0, 12102, 119662, @@ -18216,9 +18233,9 @@ 41461, 128823, 0, 127912, 0, 8819, 12663, 0, 41184, 74014, 232, 74835, 120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467, 128044, 10115, 19924, 92711, 0, 7862, 64551, 13224, 8516, 41862, 66650, - 7561, 78618, 69793, 1878, 0, 983262, 2911, 0, 41178, 5427, 64823, 0, 0, + 7561, 78618, 69793, 1878, 0, 983269, 2911, 0, 41178, 5427, 64823, 0, 0, 3787, 41174, 0, 41458, 0, 41463, 42413, 11292, 2406, 775, 0, 65584, - 69923, 6074, 9618, 128668, 983943, 43440, 0, 194901, 41436, 3656, 0, + 69923, 6074, 9618, 128668, 983952, 43440, 0, 194901, 41436, 3656, 0, 120600, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, 12598, 983191, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 70029, 9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, 11497, 64687, @@ -18238,21 +18255,21 @@ 41287, 92610, 0, 0, 42219, 128257, 0, 41987, 41676, 983059, 120823, 983144, 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 67988, 11451, 983111, 128822, 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133, - 64368, 983234, 128795, 0, 397, 43622, 42139, 9547, 9590, 128238, 1614, + 64368, 983239, 128795, 0, 397, 43622, 42139, 9547, 9590, 128238, 1614, 43661, 64356, 66307, 6651, 1358, 0, 428, 9620, 1466, 78112, 10982, 118831, 1333, 7104, 407, 6425, 128834, 74253, 0, 0, 0, 5804, 11976, 8554, 92721, 0, 0, 9057, 42294, 41218, 0, 0, 78137, 1883, 10952, 8048, 78142, - 41225, 92621, 42915, 983667, 128684, 0, 4407, 0, 65809, 119074, 194821, + 41225, 92621, 42915, 983676, 128684, 0, 4407, 0, 65809, 119074, 194821, 8448, 7141, 74183, 0, 12675, 12659, 0, 42363, 120624, 194824, 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, 120500, 119158, 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, 8709, 128283, 126477, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897, 577, 0, - 983751, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414, 42643, + 983760, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414, 42643, 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 69945, 66315, 2106, 120222, 11273, 0, 43004, 7541, 0, 0, 961, 64307, 66324, 64906, 128591, 3106, 65917, 41284, 1696, 0, 891, 12105, 0, 42624, 12802, 3264, 8824, 13268, 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322, 120371, - 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983391, 43216, + 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983398, 43216, 6089, 78682, 0, 120578, 4170, 1029, 127761, 127036, 119224, 42374, 0, 744, 0, 0, 0, 65823, 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 983162, 65136, 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, @@ -18262,10 +18279,10 @@ 2308, 0, 74149, 0, 2318, 983183, 66361, 8198, 0, 64360, 12601, 42536, 65266, 120827, 74307, 92462, 6970, 5404, 43332, 3667, 7936, 12925, 126989, 6385, 0, 0, 118949, 10874, 65505, 128083, 0, 42053, 2075, 42057, - 11083, 42052, 0, 0, 67651, 0, 9665, 92300, 983657, 13181, 0, 0, 0, 70088, - 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 94096, 983937, + 11083, 42052, 0, 0, 67651, 0, 9665, 92300, 983666, 13181, 0, 0, 0, 70088, + 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 94096, 983946, 41148, 8683, 7594, 127519, 0, 119090, 10869, 43458, 41146, 92407, 11441, - 0, 3512, 119633, 983700, 8103, 0, 0, 65184, 11780, 41563, 42796, 0, + 0, 3512, 119633, 983709, 8103, 0, 0, 65184, 11780, 41563, 42796, 0, 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0, 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 94064, 0, 0, 3804, 13070, 11557, 42044, 0, 1095, 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, 66697, 0, 11684, 0, @@ -18274,23 +18291,23 @@ 0, 127772, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, 41190, 3973, 119365, 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792, 0, 118968, 6417, 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 128556, 7755, - 0, 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 983659, + 0, 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 983668, 1617, 8050, 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, 69919, 92335, 983125, 0, 0, 0, 127195, 7957, 8689, 64723, 1056, 42896, 74147, 194813, 0, 55286, - 7073, 65850, 12327, 983939, 119028, 0, 0, 0, 2341, 8450, 8484, 8474, - 983253, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451, - 7571, 13073, 0, 0, 681, 983247, 703, 0, 3272, 8781, 12894, 70077, 11709, + 7073, 65850, 12327, 983948, 119028, 0, 0, 0, 2341, 8450, 8484, 8474, + 983260, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451, + 7571, 13073, 0, 0, 681, 983252, 703, 0, 3272, 8781, 12894, 70077, 11709, 92288, 74446, 0, 92532, 0, 11338, 120768, 3276, 0, 0, 65928, 0, 0, 65021, 64795, 74574, 0, 10047, 78814, 3262, 78811, 42711, 0, 0, 68478, 163, 576, 9895, 1655, 78817, 74591, 78815, 78816, 983122, 0, 0, 0, 10039, 0, - 983936, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, 0, 0, + 983945, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, 0, 0, 67848, 0, 0, 0, 8887, 127521, 7295, 11031, 0, 43157, 0, 8946, 10348, - 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 983702, 8810, 74499, 686, + 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 983711, 8810, 74499, 686, 0, 71362, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, - 65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983639, 0, 65455, + 65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983648, 0, 65455, 0, 92246, 0, 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, - 10396, 74135, 983446, 118945, 78118, 73851, 3010, 6441, 78122, 1458, + 10396, 74135, 983453, 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 128672, 93975, 0, 11479, 0, 120356, 6350, 12864, 69674, 78114, 1061, 64780, 2001, 43111, 55230, 128686, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, 43707, 74127, 0, 0, 8486, 0, 73758, 2335, 4362, @@ -18306,8 +18323,8 @@ 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 128285, 66447, 8046, 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 93965, 10487, 69878, 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771, - 983230, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283, - 983232, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0, + 983235, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283, + 983237, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0, 92717, 70074, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033, 126600, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0, 74776, 4281, 4768, 0, 41535, 4099, 9017, 0, 0, 78095, 0, 78096, 0, 0, 0, @@ -18321,10 +18338,10 @@ 7634, 65167, 9845, 0, 0, 5701, 9722, 41490, 983153, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 78067, 0, 78818, 92719, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712, 10744, 0, 990, 5647, 0, 7387, - 78734, 41114, 11477, 5646, 12879, 11018, 983921, 3945, 92589, 0, 0, 0, 0, + 78734, 41114, 11477, 5646, 12879, 11018, 983930, 3945, 92589, 0, 0, 0, 0, 78212, 127746, 1020, 73763, 0, 78731, 5648, 64748, 194910, 78733, 10205, - 3545, 983585, 6984, 0, 74051, 983646, 43242, 120458, 2667, 0, 0, 0, 9911, - 0, 65020, 10097, 119166, 127145, 983653, 118836, 983739, 78427, 1140, + 3545, 983585, 6984, 0, 74051, 983655, 43242, 120458, 2667, 0, 0, 0, 9911, + 0, 65020, 10097, 119166, 127145, 983662, 118836, 983748, 78427, 1140, 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267, 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0, 128347, 0, 0, 0, 19938, 65906, 127819, 0, 0, 3298, 5375, 10142, 0, 8215, @@ -18335,16 +18352,16 @@ 41521, 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, 73734, 0, 0, 0, 66449, 13263, 74281, 69217, 13171, 127796, 0, 0, 92294, 0, 1044, 41276, 0, 0, 0, 42068, 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526, - 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983447, 7098, 0, + 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983454, 7098, 0, 0, 1057, 566, 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472, 92510, 3006, 4620, 127237, 983578, 0, 0, 64659, 0, 127749, 55253, 6357, 6362, 8626, 71337, 2216, 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, 43813, 1053, 0, 78269, 0, 126586, 1052, 1051, 459, 1060, 74349, 66479, 0, 0, 0, 0, 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 0, 12130, - 0, 42337, 64596, 64375, 66481, 127850, 0, 0, 6359, 0, 43471, 983759, 0, + 0, 42337, 64596, 64375, 66481, 127850, 0, 0, 6359, 0, 43471, 983768, 0, 0, 127274, 0, 6358, 6361, 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069, - 5830, 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 983799, 120413, 0, - 127257, 65894, 0, 0, 0, 983914, 0, 0, 119187, 2135, 78868, 0, 0, 78869, + 5830, 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 983808, 120413, 0, + 127257, 65894, 0, 0, 0, 983923, 0, 0, 119187, 2135, 78868, 0, 0, 78869, 42313, 5579, 92412, 0, 983082, 94002, 0, 5578, 41774, 128115, 42023, 6234, 5669, 92275, 0, 0, 0, 127506, 68202, 5583, 0, 0, 42426, 5580, 42276, 2923, 892, 2220, 42465, 41330, 194987, 5795, 65512, 119006, 65702, @@ -18354,7 +18371,7 @@ 64900, 7153, 6095, 41865, 0, 3015, 128023, 126465, 5211, 983083, 6400, 0, 194983, 70054, 8189, 11276, 0, 0, 372, 128829, 0, 118874, 42102, 41585, 128202, 0, 42101, 276, 78402, 0, 33, 74226, 127303, 9007, 118796, 41588, - 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257, 0, 42104, 0, 983971, + 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257, 0, 42104, 0, 983980, 2328, 92409, 1071, 42899, 0, 74848, 0, 983580, 0, 1047, 0, 0, 64790, 0, 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611, 41623, 195001, @@ -18363,119 +18380,119 @@ 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, 0, 8701, 68130, 119616, 120522, 0, 42477, 194994, 12123, 4495, 43569, 0, 0, 0, 64946, 10992, 0, 120009, 0, 0, 9318, 93986, 13249, 65679, 73808, 0, 65457, - 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 983957, + 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 983966, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, 9218, - 1731, 0, 983737, 0, 67990, 0, 0, 0, 120001, 127018, 92492, 5155, 120000, - 5358, 983735, 0, 917767, 64424, 983226, 3840, 64314, 41432, 0, 78315, + 1731, 0, 983746, 0, 67990, 0, 0, 0, 120001, 127018, 92492, 5155, 120000, + 5358, 983744, 0, 917767, 64424, 983231, 3840, 64314, 41432, 0, 78315, 68430, 67980, 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, - 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983277, - 983712, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074, + 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983284, + 983721, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074, 119211, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, 0, 42377, - 0, 0, 0, 983915, 0, 9013, 4054, 0, 983570, 0, 0, 73960, 5585, 65881, + 0, 0, 0, 983924, 0, 9013, 4054, 0, 983570, 983628, 0, 73960, 5585, 65881, 2549, 74469, 0, 0, 5584, 8358, 0, 64215, 92219, 10919, 0, 7980, 126601, - 983775, 2218, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, + 983784, 2218, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 74392, 8135, 6450, 10055, 77996, 0, 0, 119225, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 92573, 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509, - 983843, 5659, 0, 78692, 66729, 5655, 0, 42168, 0, 1055, 917628, 127792, - 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, 10304, - 10368, 42518, 594, 10244, 10248, 7407, 983878, 64870, 0, 3467, 983882, 0, - 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 70036, - 69696, 69769, 64656, 983717, 0, 94020, 70056, 5666, 65227, 5318, 63994, - 0, 9091, 10798, 0, 128166, 10186, 0, 7732, 983715, 64556, 0, 0, 5668, - 74445, 0, 128663, 5670, 126610, 127297, 11820, 2992, 7826, 5667, 19952, - 120807, 0, 12749, 74551, 0, 0, 66496, 4361, 119260, 1306, 9286, 1497, - 128286, 94004, 0, 0, 3571, 13247, 0, 7973, 66353, 68435, 78278, 67896, - 43192, 0, 78265, 553, 120653, 0, 128554, 5829, 0, 4587, 78285, 65912, 0, - 12746, 0, 0, 119924, 5633, 119927, 94101, 94102, 94099, 64905, 94105, - 9512, 94103, 12742, 6443, 983797, 0, 9135, 0, 41564, 0, 55219, 128832, - 983842, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, 127270, - 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 983800, - 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 43760, 5635, - 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, - 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 983676, 78300, - 42227, 0, 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, - 5642, 0, 5486, 0, 4356, 11710, 0, 12051, 69938, 0, 5641, 8259, 0, 1058, - 0, 67630, 0, 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 2800, 0, - 5645, 64964, 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621, - 119934, 9000, 0, 0, 92673, 1865, 0, 5613, 69950, 0, 0, 5610, 0, 0, 65826, - 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 65376, - 2412, 0, 8186, 9807, 74269, 92547, 13130, 65874, 0, 5807, 0, 10030, 5306, - 12364, 128064, 0, 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, 9710, 0, 0, - 0, 413, 65623, 7118, 0, 9133, 74262, 0, 1042, 0, 64779, 12171, 119240, - 6185, 64776, 4984, 0, 708, 11391, 0, 12241, 92720, 983890, 1308, 0, 2534, - 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, 2364, 92443, 74470, 66618, - 65680, 120779, 10027, 0, 128154, 12337, 120722, 127368, 983167, 2980, - 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 92276, 44011, - 8730, 983067, 127854, 78312, 7274, 119250, 0, 7275, 78304, 935, 0, 65840, - 377, 42325, 11649, 127363, 65253, 64301, 128835, 78308, 42341, 65284, - 2417, 0, 12884, 19912, 7907, 10768, 0, 194998, 0, 10673, 119217, 7248, 0, - 128346, 1781, 5496, 3627, 62, 1649, 0, 964, 0, 127876, 78226, 128775, - 127512, 0, 0, 0, 0, 43689, 127911, 13142, 78812, 42415, 66575, 4542, - 69909, 43547, 0, 0, 7677, 2991, 4946, 42454, 11565, 7949, 0, 983909, - 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, 6478, 9898, - 43673, 65237, 6241, 7106, 4877, 983786, 6238, 0, 10548, 127049, 4409, 0, - 0, 64798, 0, 5346, 0, 94047, 6237, 4874, 0, 9176, 0, 126553, 65231, - 65884, 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, - 0, 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, 43635, - 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 126470, 0, 10938, 0, - 118790, 1182, 2542, 4826, 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790, - 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 983929, 11376, - 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, - 120183, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, 41871, - 41338, 3734, 7734, 43683, 8750, 66605, 66011, 92514, 40965, 127937, 0, - 5161, 10572, 0, 0, 0, 64349, 7287, 42162, 127552, 0, 126605, 11948, - 69220, 12359, 43429, 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031, - 0, 9870, 68645, 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, 0, - 43677, 41583, 0, 65799, 92623, 0, 0, 983927, 78169, 66199, 0, 3609, + 983852, 5659, 0, 78692, 66729, 5655, 983626, 42168, 0, 1055, 917628, + 127792, 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, + 10304, 10368, 42518, 594, 10244, 10248, 7407, 983887, 64870, 0, 3467, + 983891, 0, 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, + 70036, 69696, 69769, 64656, 983726, 0, 94020, 70056, 5666, 65227, 5318, + 63994, 0, 9091, 10798, 0, 128166, 10186, 0, 7732, 983724, 64556, 0, 0, + 5668, 74445, 0, 128663, 5670, 126610, 127297, 11820, 2992, 7826, 5667, + 19952, 120807, 0, 12749, 74551, 0, 0, 66496, 4361, 119260, 1306, 9286, + 1497, 128286, 94004, 0, 0, 3571, 13247, 0, 7973, 66353, 68435, 78278, + 67896, 43192, 0, 78265, 553, 120653, 0, 128554, 5829, 0, 4587, 78285, + 65912, 0, 12746, 0, 0, 119924, 5633, 119927, 94101, 94102, 94099, 64905, + 94105, 9512, 94103, 12742, 6443, 983806, 0, 9135, 0, 41564, 0, 55219, + 128832, 983851, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, + 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, + 983809, 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 43760, + 5635, 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, + 0, 0, 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 983685, + 78300, 42227, 0, 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, + 11705, 5642, 0, 5486, 0, 4356, 11710, 0, 12051, 69938, 0, 5641, 8259, 0, + 1058, 0, 67630, 0, 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 2800, + 0, 5645, 64964, 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, + 67621, 119934, 9000, 0, 0, 92673, 1865, 0, 5613, 69950, 0, 0, 5610, 0, 0, + 65826, 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, + 65376, 2412, 0, 8186, 9807, 74269, 92547, 13130, 65874, 0, 5807, 0, + 10030, 5306, 12364, 128064, 0, 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, + 9710, 0, 0, 0, 413, 65623, 7118, 0, 9133, 74262, 0, 1042, 0, 64779, + 12171, 119240, 6185, 64776, 4984, 0, 708, 11391, 0, 12241, 92720, 983899, + 1308, 0, 2534, 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, 2364, 92443, + 74470, 66618, 65680, 120779, 10027, 0, 128154, 12337, 120722, 127368, + 983167, 2980, 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, + 92276, 44011, 8730, 983067, 127854, 78312, 7274, 119250, 0, 7275, 78304, + 935, 0, 65840, 377, 42325, 11649, 127363, 65253, 64301, 128835, 78308, + 42341, 65284, 2417, 0, 12884, 19912, 7907, 10768, 0, 194998, 0, 10673, + 119217, 7248, 0, 128346, 1781, 5496, 3627, 62, 1649, 0, 964, 0, 127876, + 78226, 128775, 127512, 0, 0, 0, 0, 43689, 127911, 13142, 78812, 42415, + 66575, 4542, 69909, 43547, 0, 0, 7677, 2991, 4946, 42454, 11565, 7949, 0, + 983918, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, 6478, + 9898, 43673, 65237, 6241, 7106, 4877, 983795, 6238, 0, 10548, 127049, + 4409, 0, 0, 64798, 0, 5346, 0, 94047, 6237, 4874, 0, 9176, 0, 126553, + 65231, 65884, 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, + 0, 5685, 0, 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, + 43635, 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 126470, 0, + 10938, 0, 118790, 1182, 2542, 4826, 0, 0, 128176, 529, 8580, 0, 0, 10586, + 10790, 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 983938, + 11376, 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, + 78305, 120183, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, + 41871, 41338, 3734, 7734, 43683, 8750, 66605, 66011, 92514, 40965, + 127937, 0, 5161, 10572, 0, 0, 0, 64349, 7287, 42162, 127552, 0, 126605, + 11948, 69220, 12359, 43429, 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, + 10031, 0, 9870, 68645, 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, + 0, 43677, 41583, 0, 65799, 92623, 0, 0, 983936, 78169, 66199, 0, 3609, 68624, 0, 832, 120693, 120770, 78473, 66007, 78471, 65703, 0, 0, 42732, 5180, 92699, 41395, 41530, 11691, 64773, 92214, 74002, 0, 0, 128645, - 6348, 243, 13200, 983804, 6024, 92309, 9979, 10037, 41529, 10648, 8538, + 6348, 243, 13200, 983813, 6024, 92309, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195, 0, 4230, 0, 7367, 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0, 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 128277, 2603, 0, 0, 0, 70047, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, 41121, 3885, 92, 65456, 64608, 0, 74801, 0, - 2074, 0, 78283, 0, 12453, 128128, 983817, 74241, 126568, 6791, 12457, + 2074, 0, 78283, 0, 12453, 128128, 983826, 74241, 126568, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 92358, 66637, 7995, 8759, 43421, 78277, 12449, 128552, 0, 0, 8752, 3197, 4720, 10165, 0, 119249, 0, 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, 4639, 983147, 1990, 66589, 4498, 78664, 119183, 0, 0, 69734, 2960, 73779, 0, 8969, 128117, 43424, 127059, 0, 2950, 119579, 6210, 65753, 370, 0, 0, 0, 4953, - 983673, 0, 0, 0, 69230, 0, 0, 65688, 983241, 5063, 3517, 2964, 43663, + 983682, 0, 0, 0, 69230, 0, 0, 65688, 983246, 5063, 3517, 2964, 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, 66016, 78253, 0, 71317, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, 0, 65883, 0, 917774, 120602, 3761, 0, 0, 70068, 0, 12912, 119012, 3850, 128191, 0, 0, 0, 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978, 120540, 119135, 41586, 10527, 0, 917848, 3848, 78739, 194937, 127536, 65241, 5336, - 983252, 128786, 663, 0, 10780, 0, 0, 78767, 983250, 127163, 68193, 347, + 983259, 128786, 663, 0, 10780, 0, 0, 78767, 983257, 127163, 68193, 347, 0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143, 69657, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681, - 0, 983686, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, - 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983213, 0, 73847, 78761, - 65172, 41728, 41721, 0, 0, 0, 41203, 917612, 13110, 41726, 983846, 0, + 0, 983695, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, + 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983214, 0, 73847, 78761, + 65172, 41728, 41721, 0, 0, 0, 41203, 917612, 13110, 41726, 983855, 0, 1000, 69651, 0, 41140, 1209, 73978, 0, 73750, 1073, 6321, 77878, 41138, 0, 68213, 0, 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237, 78787, 66314, 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0, - 64398, 0, 119970, 12311, 983718, 78796, 78798, 78794, 78795, 68434, + 64398, 0, 119970, 12311, 983727, 78796, 78798, 78794, 78795, 68434, 78793, 66670, 0, 0, 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131, - 0, 9627, 78536, 78542, 78535, 983211, 1944, 1248, 10148, 127755, 119990, + 0, 9627, 78536, 78542, 78535, 983212, 1944, 1248, 10148, 127755, 119990, 119991, 12701, 78376, 11308, 119995, 0, 119997, 119998, 65305, 65100, 4031, 42794, 120003, 7075, 8154, 119985, 120007, 41817, 73934, 42275, 120011, 120012, 78526, 120014, 120015, 6041, 0, 41899, 0, 8002, 0, 4364, 0, 0, 64332, 0, 7813, 9064, 119986, 10124, 7526, 8601, 7281, 78455, 7279, - 12041, 1418, 10885, 12673, 0, 0, 9660, 983273, 13012, 4571, 0, 0, 120164, + 12041, 1418, 10885, 12673, 0, 0, 9660, 983280, 13012, 4571, 0, 0, 120164, 12078, 2970, 0, 10933, 0, 77870, 0, 127015, 0, 41599, 0, 128831, 0, 12950, 92160, 3486, 0, 78311, 4239, 0, 127799, 66511, 0, 2637, 64629, - 8460, 127053, 8476, 983966, 0, 0, 0, 65673, 1019, 78495, 4148, 0, 12289, - 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983202, 41734, + 8460, 127053, 8476, 983975, 0, 0, 0, 65673, 1019, 78495, 4148, 0, 12289, + 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983203, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120, 41736, 92546, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, 127284, 0, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272, 7115, 66030, 73932, 5498, 73942, 41536, 0, 68204, 92587, 3459, 8997, 0, 0, 0, 0, - 92512, 0, 66377, 69781, 0, 983690, 78511, 3161, 295, 120207, 0, 92223, + 92512, 0, 66377, 69781, 0, 983699, 78511, 3161, 295, 120207, 0, 92223, 127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0, 70063, 2952, 78765, 11038, 10901, 63900, 63899, 63898, 94043, 667, 12332, 63887, 6086, - 41722, 0, 5172, 0, 983271, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198, + 41722, 0, 5172, 0, 983278, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198, 8555, 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0, 41723, 63875, 63874, 11460, 7432, 1913, 41913, 63852, 126636, 0, 42348, 73892, 6752, 446, 41911, 127906, 63851, 63850, 41910, 0, 63846, 2972, 12932, @@ -18490,8 +18507,8 @@ 7583, 7679, 2903, 0, 3001, 1158, 8745, 43746, 73748, 63866, 78626, 1915, 4846, 0, 66371, 118984, 42105, 2990, 120128, 805, 69238, 64438, 12070, 8760, 1117, 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, 78240, - 12225, 63838, 63837, 983844, 983795, 63833, 6042, 66360, 8083, 0, 0, - 63821, 63820, 63819, 63818, 983895, 5227, 9047, 63822, 127162, 6091, 0, + 12225, 63838, 63837, 983853, 983804, 63833, 6042, 66360, 8083, 0, 0, + 63821, 63820, 63819, 63818, 983904, 5227, 9047, 63822, 127162, 6091, 0, 10691, 560, 5643, 8226, 119578, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, 1093, 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605, @@ -18509,262 +18526,262 @@ 43659, 12951, 120638, 9906, 2054, 2334, 78515, 63916, 5483, 63914, 69737, 63911, 5484, 63909, 63908, 2539, 0, 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0, 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0, - 118907, 0, 10474, 43426, 13257, 42354, 128099, 983689, 70044, 195065, 0, - 8413, 983807, 0, 5693, 7272, 0, 13209, 64470, 65831, 74350, 195063, 0, 0, - 0, 126639, 0, 0, 94078, 128133, 127767, 66608, 3111, 41863, 8804, 42913, - 92187, 7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, 55226, 128353, - 63982, 7393, 12807, 43413, 63906, 1598, 63904, 0, 0, 41729, 4423, 1307, - 0, 10515, 41589, 128698, 0, 6218, 0, 1430, 0, 0, 120606, 78754, 5413, - 7619, 3255, 3493, 74032, 11549, 10735, 41743, 73937, 6801, 983624, 4518, - 10990, 65073, 5167, 4481, 3771, 120158, 2710, 0, 69243, 41724, 0, 43073, - 41690, 12479, 983626, 0, 0, 983809, 70046, 1628, 127149, 983480, 983722, - 65262, 6333, 10783, 42315, 0, 63855, 94056, 0, 0, 5339, 74323, 0, 13004, - 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, 68464, 12633, - 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, 74251, 0, 120647, - 0, 50, 10558, 9871, 42612, 43655, 0, 0, 0, 66468, 0, 13259, 4448, 0, - 983836, 0, 70043, 67853, 0, 10640, 11539, 1151, 0, 917607, 127544, - 127079, 195050, 127852, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, - 11538, 8673, 12650, 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0, - 0, 0, 4636, 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284, - 12277, 194627, 11995, 92553, 0, 12158, 0, 8741, 10197, 0, 92426, 0, 6531, - 0, 127846, 473, 43415, 0, 983641, 1873, 1087, 0, 0, 0, 78527, 66439, - 43218, 983123, 194716, 7237, 12504, 74282, 0, 983571, 0, 9489, 0, 0, - 4384, 74220, 63845, 2058, 128863, 13295, 43191, 128030, 0, 1154, 3857, - 1205, 0, 0, 13100, 12958, 120706, 74168, 0, 0, 4421, 10592, 0, 495, - 119007, 41712, 7983, 0, 93997, 0, 6347, 120165, 7654, 41710, 4196, 0, - 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, 64306, 0, 0, 4999, - 194642, 0, 126582, 4711, 120769, 0, 2739, 0, 8044, 74834, 194643, 41789, - 128142, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, 642, 64187, 13058, - 120449, 12875, 0, 92186, 13229, 0, 10575, 43399, 0, 0, 41791, 1104, 0, 0, - 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, 69849, 6783, 0, - 12993, 8049, 41548, 44021, 6458, 983798, 128882, 4761, 63828, 4766, - 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, 983603, - 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, 5122, 41527, - 0, 66320, 983802, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, 73857, 10003, - 73859, 65904, 7363, 1686, 0, 78406, 11467, 3664, 65921, 64299, 194664, 0, - 0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744, 194636, 74277, 74302, - 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, 0, 4762, 1103, 0, 0, - 4765, 983485, 13078, 0, 4760, 63827, 2050, 10871, 43199, 1102, 0, 42236, - 128867, 194667, 11546, 74794, 337, 0, 42591, 8627, 12279, 1111, 0, 92161, - 4707, 68206, 10143, 7883, 127081, 7880, 4522, 8645, 5704, 13010, 0, 8304, - 917561, 0, 119575, 2293, 0, 66654, 0, 92676, 0, 13008, 0, 4385, 0, 13011, - 0, 92569, 119161, 13009, 160, 2677, 0, 0, 41793, 65763, 74221, 120141, - 41792, 42770, 94054, 65762, 118829, 43821, 5709, 0, 94053, 43816, 0, 0, - 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, 5705, 8791, 4005, 0, 10237, - 10991, 128816, 43459, 9173, 917581, 917580, 13170, 12540, 917577, 42605, - 120765, 126617, 68647, 917572, 10058, 0, 74867, 194654, 127078, 3339, - 11448, 1106, 917591, 917590, 917593, 3340, 917587, 917586, 917589, - 917588, 120541, 10605, 1309, 63966, 120743, 1754, 92226, 13246, 864, 0, - 118926, 8972, 0, 7849, 120092, 92533, 13240, 195068, 5192, 4338, 67982, - 10948, 917601, 13199, 92575, 1236, 13208, 13261, 13189, 13188, 93993, 0, - 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780, - 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 983906, 92168, - 983763, 917858, 11354, 94071, 0, 42795, 0, 119195, 11394, 194646, 13236, - 13272, 13194, 1334, 69926, 4479, 1178, 65586, 120663, 66681, 119193, - 4601, 0, 0, 983756, 0, 0, 194658, 0, 6809, 63786, 6031, 0, 63791, 63790, - 1145, 63788, 7910, 63785, 43153, 754, 10192, 13105, 8183, 120741, 2037, - 0, 0, 10747, 125, 0, 64890, 0, 983131, 0, 41719, 63758, 3523, 1074, - 13258, 9536, 74077, 0, 4427, 74242, 63757, 43145, 12217, 63754, 41532, - 1349, 63750, 63749, 0, 0, 0, 63753, 63802, 41084, 120622, 68133, 41930, - 63805, 63804, 43632, 63801, 41082, 8140, 63798, 6260, 0, 0, 94074, 63793, - 11988, 3898, 128241, 10201, 12238, 63795, 42194, 10367, 12521, 10431, - 42114, 41932, 1068, 0, 12523, 12945, 983322, 42203, 7950, 10804, 63771, - 42787, 4386, 12224, 6973, 2793, 12475, 0, 0, 63769, 9530, 983119, 12232, - 13135, 8596, 5681, 63762, 4595, 63760, 792, 0, 64803, 0, 8742, 0, 11053, - 128796, 63744, 128107, 0, 7588, 63748, 1693, 63746, 43204, 5055, 68426, - 917853, 1090, 120679, 128356, 11665, 74133, 4558, 65685, 9523, 0, 0, - 78681, 11513, 0, 6157, 63775, 63774, 63773, 13191, 12170, 3500, 3139, 0, - 3170, 12485, 0, 10872, 78271, 13006, 64433, 0, 0, 941, 0, 0, 0, 65541, - 11063, 0, 8228, 0, 42065, 0, 0, 94039, 0, 92455, 7386, 0, 64444, 0, - 119863, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 69915, 2918, 0, 65300, - 119871, 9883, 64726, 2790, 65395, 3793, 0, 127829, 65393, 0, 74138, 0, 0, - 0, 74139, 92712, 65394, 11548, 5270, 0, 65396, 0, 65813, 13256, 1282, - 120771, 0, 0, 10888, 983604, 65242, 0, 3330, 0, 0, 983965, 0, 0, 74259, - 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, 0, - 43094, 70023, 43650, 94037, 0, 9035, 0, 0, 128005, 0, 92207, 68125, 0, - 164, 0, 94067, 94000, 6958, 0, 43116, 0, 70019, 13245, 0, 0, 127376, 0, - 70031, 127756, 12666, 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0, - 65509, 0, 7449, 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0, - 65195, 10164, 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882, - 13275, 128161, 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, - 12229, 41523, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, - 64958, 0, 0, 73989, 68192, 0, 69847, 369, 0, 41784, 0, 64163, 0, 0, 0, - 65474, 4796, 12292, 126595, 65479, 0, 41781, 10486, 41480, 43002, 9899, - 0, 0, 404, 12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 3982, - 0, 4388, 0, 746, 120784, 0, 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, - 3799, 74292, 119357, 0, 74430, 0, 11700, 4374, 0, 128179, 1364, 0, 8038, - 0, 917597, 12868, 69814, 0, 6735, 73979, 13174, 73968, 13225, 0, 69808, - 65835, 0, 2365, 7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785, - 12617, 64172, 13173, 4372, 119354, 0, 983568, 0, 0, 92402, 128062, 12965, - 384, 64512, 10404, 10340, 119352, 1556, 5274, 13210, 120125, 10017, 9733, - 41787, 983238, 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863, - 41371, 11656, 0, 120703, 119883, 12861, 4398, 8543, 65618, 128018, 1096, - 0, 0, 42688, 12441, 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, - 13237, 12719, 126646, 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, - 0, 120785, 119874, 94107, 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, - 119879, 66590, 128123, 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, - 73849, 0, 43638, 78537, 128287, 6261, 119342, 43147, 66570, 1957, 10420, - 982, 2756, 13292, 13206, 128828, 0, 2925, 73809, 13056, 127559, 13212, - 43238, 0, 13190, 13187, 92541, 13198, 118793, 0, 5242, 119179, 64476, - 1694, 8216, 71369, 6770, 43331, 0, 65620, 983719, 43544, 126466, 0, - 41444, 65621, 69955, 9197, 5246, 119106, 13185, 9709, 120323, 120322, - 12314, 65616, 5238, 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, - 128537, 3936, 119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, - 13239, 12692, 7969, 127266, 7219, 127250, 128251, 120509, 0, 66224, 734, - 2979, 120303, 65619, 9872, 957, 64921, 1846, 66631, 41477, 119256, - 120310, 74511, 41770, 1670, 6442, 120317, 42446, 5379, 120318, 41163, - 74832, 120315, 120314, 11506, 0, 42841, 13267, 0, 0, 41775, 0, 7130, - 41773, 0, 10663, 0, 0, 0, 6151, 12110, 42673, 65572, 65293, 65250, 13265, - 13264, 64518, 0, 6100, 0, 92647, 5808, 65922, 0, 12967, 66041, 5612, - 4583, 0, 0, 68097, 64575, 126637, 11965, 0, 68358, 0, 69789, 0, 92260, - 68102, 9698, 7814, 74476, 119651, 128514, 0, 41921, 118858, 9756, 6985, - 119258, 78490, 74219, 0, 0, 118997, 8012, 5674, 12353, 0, 12361, 5677, - 5588, 0, 41925, 128124, 41920, 5673, 120534, 5676, 41923, 12694, 118978, - 5672, 1294, 0, 78059, 0, 42511, 1727, 120725, 42436, 0, 0, 0, 74222, - 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826, 55232, 5813, 0, 120712, - 5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0, 119592, 5793, 0, 5866, - 5797, 41011, 5865, 120091, 7956, 598, 0, 64649, 5806, 42398, 0, 9037, - 5671, 120041, 0, 0, 0, 128855, 0, 847, 128242, 9529, 0, 66657, 6980, - 78483, 120035, 78484, 983484, 0, 120033, 78486, 0, 0, 120039, 42683, 0, - 983055, 7114, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929, - 6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69727, - 68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 94100, 41013, - 10568, 0, 983618, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, - 42608, 78469, 9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908, - 1609, 902, 0, 63936, 128875, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028, - 2554, 5158, 5714, 2213, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, 0, - 42155, 0, 41356, 74110, 118801, 126614, 0, 8676, 983284, 0, 5582, 451, - 63941, 5798, 9349, 42018, 127858, 0, 0, 43609, 5906, 120553, 1440, 0, - 128853, 120016, 74283, 11005, 0, 66656, 66044, 0, 194698, 0, 0, 43393, - 10094, 0, 11529, 10857, 120643, 66436, 6546, 93, 8102, 0, 68405, 0, 0, - 8171, 0, 119097, 127064, 917543, 383, 7154, 41656, 92634, 94040, 0, 5187, - 71296, 127277, 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, - 983818, 8292, 195074, 4980, 8860, 73947, 10028, 65291, 7076, 13182, - 194705, 0, 0, 10631, 66031, 7972, 0, 78785, 0, 7900, 0, 11309, 3806, - 4198, 42725, 0, 67656, 9995, 0, 92552, 0, 12931, 0, 42684, 74285, 2088, - 64213, 64366, 65156, 8814, 42238, 74771, 0, 0, 12836, 0, 0, 74342, 8593, - 0, 0, 68445, 13255, 0, 0, 7464, 0, 65865, 0, 194650, 127144, 0, 9342, - 120464, 0, 64516, 0, 78792, 10129, 41007, 74375, 0, 40995, 12209, 41012, - 119136, 0, 0, 69724, 40992, 92264, 127153, 68653, 43558, 5522, 0, 61, 0, - 74105, 3633, 983891, 65162, 41234, 12089, 78281, 9771, 983896, 13251, - 128701, 0, 6262, 2784, 42743, 0, 8126, 66483, 0, 0, 441, 42621, 0, 0, - 41002, 40999, 119623, 43266, 7108, 194779, 10890, 74481, 65834, 8324, - 119103, 64417, 74817, 127465, 64737, 0, 983650, 8930, 66678, 74249, 1193, - 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0, 0, 77904, 92640, 77905, - 9034, 6039, 0, 10075, 0, 41018, 65683, 10338, 66469, 0, 0, 0, 42815, 0, - 41966, 0, 127471, 0, 11792, 43064, 41025, 911, 7539, 0, 0, 120339, 65159, - 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, 12326, 983847, 0, 42808, - 128337, 9348, 64901, 983852, 0, 0, 0, 0, 0, 917584, 43702, 983576, 5857, - 65342, 92727, 119120, 120079, 8644, 0, 0, 0, 74296, 41909, 0, 120332, - 2791, 69663, 1891, 69824, 0, 41907, 66647, 118939, 8761, 12942, 5748, 0, - 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 127185, 63931, 0, - 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, 0, 983651, 0, 73860, 0, 0, - 64345, 0, 9201, 128314, 194940, 0, 0, 43679, 917585, 65117, 92270, 0, - 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783, - 194935, 0, 0, 983064, 194720, 65056, 3620, 41180, 68378, 4556, 0, 0, - 194933, 74250, 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, - 93958, 9839, 0, 12891, 983746, 983627, 63999, 2016, 41917, 9788, 63928, - 0, 1862, 65800, 9155, 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0, - 66017, 4508, 64883, 92456, 92522, 127814, 0, 64592, 74276, 120080, 6784, - 78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, 66472, 983920, 64289, - 65289, 78151, 66658, 194929, 64509, 78152, 0, 126505, 11051, 983289, 0, - 11355, 65885, 0, 128310, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0, - 9963, 68649, 126609, 4040, 120570, 6167, 0, 63922, 6594, 983731, 0, 0, - 3624, 43036, 0, 6387, 63990, 19947, 63988, 41955, 0, 63993, 10440, 9611, - 65605, 6803, 0, 7738, 63986, 11446, 63984, 92641, 3435, 78164, 43814, - 43810, 7029, 64258, 41292, 118898, 12748, 42742, 9517, 11518, 0, 78790, - 0, 67993, 63956, 42458, 63954, 63953, 63960, 9591, 4516, 10217, 68370, - 11469, 69697, 42306, 2723, 118947, 0, 0, 0, 0, 0, 11397, 2880, 0, 0, - 2872, 0, 0, 3498, 4378, 917539, 4270, 0, 65551, 68205, 6633, 43387, 0, - 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0, 0, 126479, 415, 63964, 63963, - 42345, 92310, 5183, 1877, 42498, 0, 2927, 0, 63961, 4472, 0, 0, 78159, - 69699, 917936, 42340, 4756, 128078, 7081, 10730, 7691, 10331, 63830, - 119625, 42922, 42103, 8628, 9813, 0, 42453, 1604, 9565, 10539, 69701, - 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, 0, 0, 63980, - 11801, 3622, 983124, 64336, 12017, 10463, 63981, 4967, 64189, 1966, - 43628, 0, 983285, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973, - 402, 0, 13147, 128692, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, - 0, 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0, - 92359, 64942, 983559, 194733, 983677, 194732, 0, 74301, 0, 11280, 0, - 69784, 74060, 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379, - 194669, 7402, 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 983910, 0, - 5405, 127875, 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, - 64690, 3254, 0, 0, 128207, 42390, 43678, 194725, 983900, 65077, 0, 6388, - 3355, 9508, 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, - 983753, 42691, 917886, 127198, 74767, 0, 127075, 1379, 246, 0, 983752, - 3788, 983106, 11041, 92549, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, - 983688, 10656, 0, 65214, 119242, 42567, 92217, 13163, 983203, 120831, - 74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755, 74244, 194621, 11443, 0, - 66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483, 74510, 0, 74485, - 42442, 65470, 983898, 64202, 13160, 7759, 42482, 485, 128006, 0, 9828, 0, - 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0, 119631, - 11002, 42470, 0, 118946, 0, 0, 74041, 0, 70045, 43539, 5411, 42196, 0, 0, - 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, 10643, 55271, - 983179, 12166, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, 74310, - 6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, 92560, 2713, 0, 9650, 43330, - 0, 194675, 1406, 0, 0, 92659, 0, 68223, 4143, 194677, 0, 65748, 4141, - 9682, 65287, 1508, 127013, 8779, 10569, 8725, 13299, 66638, 65750, 42263, - 4145, 6380, 65751, 66613, 43994, 65738, 55250, 9185, 9550, 0, 43403, 0, - 0, 0, 65736, 41951, 64816, 65756, 983204, 12955, 10596, 2888, 194645, 0, - 0, 9657, 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 43552, 7501, - 6328, 0, 10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986, - 126542, 10632, 11934, 11452, 1332, 0, 0, 126647, 0, 118887, 1791, 5191, - 9288, 64822, 2892, 0, 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512, - 7289, 74055, 64161, 8854, 64162, 5858, 41927, 10582, 0, 1784, 1361, - 195047, 0, 7905, 0, 64868, 128813, 13158, 92166, 7211, 0, 9371, 73973, - 917553, 6828, 1625, 92302, 0, 1342, 68440, 64171, 126704, 10903, 983487, - 0, 0, 0, 0, 4482, 41606, 0, 128569, 983112, 0, 64381, 0, 0, 195090, - 42245, 126467, 41972, 0, 444, 0, 9127, 66687, 66619, 126489, 78025, 0, - 11349, 40991, 917570, 0, 119599, 120830, 0, 1197, 128282, 1149, 194970, - 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, 0, 12838, 983969, 19948, 0, - 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, 41309, 0, 0, 8152, 0, 41550, - 12227, 983613, 0, 12828, 127511, 0, 0, 120708, 0, 0, 10386, 119574, 0, 0, - 92680, 983780, 68154, 0, 1743, 0, 0, 92239, 65186, 917571, 0, 9606, 0, 0, - 64439, 0, 0, 92686, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, - 64830, 0, 126557, 41091, 3426, 1344, 8870, 0, 0, 4735, 127017, 6119, - 12822, 42699, 0, 983815, 74818, 1423, 0, 42637, 41080, 0, 12039, 10559, - 0, 118892, 0, 9472, 0, 11929, 0, 7170, 9596, 6130, 128826, 43629, 11579, - 78713, 0, 194740, 128691, 92185, 66699, 64440, 1004, 92584, 194737, - 43234, 66008, 12627, 0, 68414, 0, 43619, 43303, 11300, 43304, 9686, 5890, - 11776, 7558, 127158, 65627, 0, 10718, 13154, 3461, 9139, 0, 0, 0, 0, - 65365, 73877, 65628, 78019, 120319, 0, 41708, 12860, 2641, 12069, 10838, - 5403, 10352, 70085, 10061, 43237, 0, 5140, 209, 128847, 41704, 41056, - 43078, 128125, 118809, 0, 10899, 65469, 92362, 0, 0, 2410, 993, 0, - 120589, 120689, 78693, 0, 0, 7232, 0, 119253, 0, 7110, 74462, 2066, - 10489, 42166, 43463, 10659, 3600, 0, 4224, 1336, 41518, 0, 0, 0, 0, - 41139, 64820, 92538, 12966, 41134, 0, 0, 0, 0, 272, 4263, 8793, 0, 0, - 41502, 0, 983, 12549, 0, 0, 1190, 4109, 1335, 841, 5888, 41358, 64863, - 9544, 43481, 0, 194806, 70027, 2099, 5120, 2409, 7799, 0, 74424, 0, 0, - 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, 0, 64914, 917787, - 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, 10842, 41354, 42123, - 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, 0, 9972, 73865, 4519, - 6114, 10898, 43072, 0, 0, 93960, 983315, 126581, 10695, 0, 7540, 0, 881, - 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, 12689, - 0, 194594, 0, 983305, 983872, 68183, 0, 983307, 1287, 5436, 0, 983310, - 74142, 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 983316, 0, - 127242, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, - 1489, 0, 0, 0, 3899, 1007, 42124, 983557, 42122, 92337, 92367, 0, 11985, - 1345, 78600, 0, 0, 8956, 43083, 94057, 42138, 78610, 0, 12151, 78608, - 78604, 78605, 6285, 78603, 78612, 78613, 65942, 492, 8685, 0, 983750, 0, - 78622, 43712, 2582, 11470, 64538, 7444, 78615, 78616, 2297, 0, 73837, - 119823, 2527, 119824, 197, 2799, 92594, 41944, 120276, 9933, 0, 66515, - 767, 5524, 7028, 0, 0, 119827, 119817, 119828, 78633, 10896, 0, 1799, - 120497, 6971, 74336, 128342, 0, 65340, 118979, 41551, 2434, 94018, 0, - 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414, - 0, 93983, 0, 0, 0, 9164, 66612, 93959, 3171, 6623, 4961, 68396, 886, - 55216, 8654, 78832, 9993, 74390, 64603, 70066, 69241, 9599, 78629, 43084, - 78627, 78628, 78625, 2399, 69693, 8994, 10944, 41208, 983704, 41168, - 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634, 1947, 0, 0, - 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, 8017, 119831, - 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 983326, - 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0, - 5398, 0, 127386, 93953, 0, 0, 119015, 0, 0, 9476, 0, 983768, 12763, - 126603, 3629, 0, 13005, 0, 3628, 0, 0, 92502, 3469, 42107, 42116, 917578, - 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, 0, 42583, - 9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, 1251, 7777, 41852, - 11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, 65821, 0, 6018, - 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 983225, 10467, 0, 2443, - 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0, + 118907, 0, 10474, 43426, 13257, 42354, 128099, 983698, 70044, 195065, 0, + 8413, 983816, 0, 5693, 7272, 0, 13209, 64470, 65831, 74350, 195063, 0, 0, + 0, 126639, 120097, 0, 94078, 128133, 127767, 66608, 3111, 41863, 8804, + 42913, 92187, 7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, 55226, + 128353, 63982, 7393, 12807, 43413, 63906, 1598, 63904, 0, 0, 41729, 4423, + 1307, 0, 10515, 41589, 128698, 0, 6218, 0, 1430, 0, 0, 120606, 78754, + 5413, 7619, 3255, 3493, 74032, 11549, 10735, 41743, 73937, 6801, 983633, + 4518, 10990, 65073, 5167, 4481, 3771, 120158, 2710, 0, 69243, 41724, 0, + 43073, 41690, 12479, 983635, 0, 0, 983818, 70046, 1628, 127149, 983487, + 983731, 65262, 6333, 10783, 42315, 0, 63855, 94056, 0, 0, 5339, 74323, 0, + 13004, 0, 4457, 0, 0, 194818, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, + 68464, 12633, 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, + 74251, 0, 120647, 0, 50, 10558, 9871, 42612, 43655, 0, 0, 0, 66468, 0, + 13259, 4448, 0, 983845, 0, 70043, 67853, 0, 10640, 11539, 1151, 0, + 917607, 127544, 127079, 195050, 127852, 0, 0, 0, 12501, 64604, 0, 11527, + 118870, 8812, 0, 11538, 8673, 12650, 11020, 0, 66467, 2105, 8087, 78163, + 69632, 9894, 0, 0, 0, 4636, 55262, 78513, 4515, 2382, 0, 127055, 0, + 120495, 0, 128284, 12277, 194627, 11995, 92553, 0, 12158, 0, 8741, 10197, + 0, 92426, 0, 6531, 0, 127846, 473, 43415, 0, 983650, 1873, 1087, 0, 0, 0, + 78527, 66439, 43218, 983123, 194716, 7237, 12504, 74282, 0, 983571, 0, + 9489, 0, 0, 4384, 74220, 63845, 2058, 128863, 13295, 43191, 128030, 0, + 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, 74168, 0, 0, 4421, 10592, + 0, 495, 119007, 41712, 7983, 0, 93997, 0, 6347, 120165, 7654, 41710, + 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, 64306, 0, 0, + 4999, 194642, 0, 126582, 4711, 120769, 0, 2739, 0, 8044, 74834, 194643, + 41789, 128142, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, 642, 64187, + 13058, 120449, 12875, 0, 92186, 13229, 0, 10575, 43399, 0, 0, 41791, + 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, 69849, + 6783, 0, 12993, 8049, 41548, 44021, 6458, 983807, 128882, 4761, 63828, + 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, + 983603, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, + 5122, 41527, 0, 66320, 983811, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, + 73857, 10003, 73859, 65904, 7363, 1686, 0, 78406, 11467, 3664, 65921, + 64299, 194664, 0, 0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744, + 194636, 74277, 74302, 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, + 0, 4762, 1103, 0, 0, 4765, 983492, 13078, 0, 4760, 63827, 2050, 10871, + 43199, 1102, 0, 42236, 128867, 194667, 11546, 74794, 337, 0, 42591, 8627, + 12279, 1111, 0, 92161, 4707, 68206, 10143, 7883, 127081, 7880, 4522, + 8645, 5704, 13010, 0, 8304, 917561, 0, 119575, 2293, 0, 66654, 0, 92676, + 0, 13008, 0, 4385, 0, 13011, 0, 92569, 119161, 13009, 160, 2677, 0, 0, + 41793, 65763, 74221, 120141, 41792, 42770, 94054, 65762, 118829, 43821, + 5709, 0, 94053, 43816, 0, 0, 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, + 5705, 8791, 4005, 0, 10237, 10991, 128816, 43459, 9173, 917581, 917580, + 13170, 12540, 917577, 42605, 120765, 126617, 68647, 917572, 10058, 0, + 74867, 194654, 127078, 3339, 11448, 1106, 917591, 917590, 917593, 3340, + 917587, 917586, 917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, + 92226, 13246, 864, 0, 118926, 8972, 0, 7849, 120092, 92533, 13240, + 195068, 5192, 4338, 67982, 10948, 917601, 13199, 92575, 1236, 13208, + 13261, 13189, 13188, 93993, 0, 7440, 0, 120153, 9553, 1590, 63777, 63776, + 13178, 63782, 63781, 63780, 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, + 41522, 983915, 92168, 983772, 917858, 11354, 94071, 0, 42795, 0, 119195, + 11394, 194646, 13236, 13272, 13194, 1334, 69926, 4479, 1178, 65586, + 120663, 66681, 119193, 4601, 0, 0, 983765, 0, 0, 194658, 0, 6809, 63786, + 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153, 754, 10192, + 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 983131, 0, + 41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757, + 43145, 12217, 63754, 41532, 1349, 63750, 63749, 0, 0, 0, 63753, 63802, + 41084, 120622, 68133, 41930, 63805, 63804, 43632, 63801, 41082, 8140, + 63798, 6260, 0, 0, 94074, 63793, 11988, 3898, 128241, 10201, 12238, + 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, + 983329, 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, + 0, 0, 63769, 9530, 983119, 12232, 13135, 8596, 5681, 63762, 4595, 63760, + 792, 0, 64803, 0, 8742, 0, 11053, 128796, 63744, 128107, 0, 7588, 63748, + 1693, 63746, 43204, 5055, 68426, 917853, 1090, 120679, 128356, 11665, + 74133, 4558, 65685, 9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, + 63773, 13191, 12170, 3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, + 64433, 0, 0, 941, 0, 0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 94039, + 0, 92455, 7386, 0, 64444, 0, 119863, 43603, 94075, 65397, 288, 0, 0, 0, + 10025, 69915, 2918, 0, 65300, 119871, 9883, 64726, 2790, 65395, 3793, 0, + 127829, 65393, 0, 74138, 0, 0, 0, 74139, 92712, 65394, 11548, 5270, 0, + 65396, 0, 65813, 13256, 1282, 120771, 0, 0, 10888, 983604, 65242, 0, + 3330, 0, 0, 983974, 0, 0, 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, + 5371, 13116, 0, 1826, 118794, 0, 43094, 70023, 43650, 94037, 0, 9035, 0, + 0, 128005, 0, 92207, 68125, 0, 164, 0, 94067, 94000, 6958, 0, 43116, 0, + 70019, 13245, 0, 0, 127376, 0, 70031, 127756, 12666, 13175, 13207, + 120414, 66014, 120428, 7447, 5929, 0, 65509, 0, 7449, 11306, 0, 73920, + 3180, 0, 63808, 9054, 971, 13062, 0, 0, 65195, 10164, 92252, 74428, 0, + 78146, 92611, 0, 0, 0, 10045, 12882, 13275, 128161, 11057, 0, 13276, 0, + 41525, 78150, 7271, 11444, 0, 0, 0, 12229, 41523, 0, 43411, 73751, 0, + 64813, 0, 0, 10476, 3858, 0, 3932, 64958, 0, 0, 73989, 68192, 0, 69847, + 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, 4796, 12292, 126595, 65479, 0, + 41781, 10486, 41480, 43002, 9899, 0, 0, 404, 12821, 3741, 0, 5788, 8092, + 68212, 41222, 1831, 66020, 3982, 0, 4388, 0, 746, 120784, 0, 0, 12018, + 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, 119357, 0, 74430, 0, 11700, + 4374, 0, 128179, 1364, 0, 8038, 0, 917597, 12868, 69814, 0, 6735, 73979, + 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, 7841, 0, 42855, 118856, + 42866, 0, 0, 0, 66438, 41785, 12617, 64172, 13173, 4372, 119354, 0, + 983568, 0, 0, 92402, 128062, 12965, 384, 64512, 10404, 10340, 119352, + 1556, 5274, 13210, 120125, 10017, 9733, 41787, 983243, 126994, 41373, + 78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703, + 119883, 12861, 4398, 8543, 65618, 128018, 1096, 0, 0, 42688, 12441, + 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 126646, + 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, + 94107, 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, + 128123, 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, 73849, 0, 43638, + 78537, 128287, 6261, 119342, 43147, 66570, 1957, 10420, 982, 2756, 13292, + 13206, 128828, 0, 2925, 73809, 13056, 127559, 13212, 43238, 0, 13190, + 13187, 92541, 13198, 118793, 0, 5242, 119179, 64476, 1694, 8216, 71369, + 6770, 43331, 0, 65620, 983728, 43544, 126466, 0, 41444, 65621, 69955, + 9197, 5246, 119106, 13185, 9709, 120323, 120322, 12314, 65616, 5238, + 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, 128537, 3936, 119331, + 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, 13239, 12692, 7969, + 127266, 7219, 127250, 128251, 120509, 0, 66224, 734, 2979, 120303, 65619, + 9872, 957, 64921, 1846, 66631, 41477, 119256, 120310, 74511, 41770, 1670, + 6442, 120317, 42446, 5379, 120318, 41163, 74832, 120315, 120314, 11506, + 0, 42841, 13267, 0, 0, 41775, 0, 7130, 41773, 0, 10663, 0, 0, 0, 6151, + 12110, 42673, 65572, 65293, 65250, 13265, 13264, 64518, 0, 6100, 0, + 92647, 5808, 65922, 0, 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, + 126637, 11965, 0, 68358, 0, 69789, 0, 92260, 68102, 9698, 7814, 74476, + 119651, 128514, 0, 41921, 118858, 9756, 6985, 119258, 78490, 74219, 0, 0, + 118997, 8012, 5674, 12353, 0, 12361, 5677, 5588, 0, 41925, 128124, 41920, + 5673, 120534, 5676, 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, + 1727, 120725, 42436, 0, 0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, + 74090, 5826, 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 12829, + 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, 120091, 7956, + 598, 0, 64649, 5806, 42398, 0, 9037, 5671, 120041, 983255, 0, 0, 128855, + 0, 847, 128242, 9529, 0, 66657, 6980, 78483, 120035, 78484, 983491, 0, + 120033, 78486, 0, 0, 120039, 42683, 0, 983055, 7114, 0, 0, 43190, 65463, + 1554, 0, 42611, 42563, 0, 5651, 2929, 6792, 43201, 0, 19963, 5698, 0, 0, + 0, 0, 5644, 10292, 65546, 69727, 68141, 8372, 0, 65116, 0, 120022, 10175, + 10388, 42799, 94100, 41013, 10568, 0, 983618, 2869, 0, 41015, 194692, + 2785, 4366, 0, 10954, 41802, 0, 42608, 78469, 9884, 4759, 0, 0, 10266, + 41359, 1170, 43365, 69810, 73908, 1609, 902, 0, 63936, 128875, 11661, + 8122, 5818, 0, 0, 3861, 9540, 11028, 2554, 5158, 5714, 2213, 0, 0, 807, + 43079, 0, 78475, 976, 5511, 64553, 0, 42155, 0, 41356, 74110, 118801, + 126614, 0, 8676, 983291, 0, 5582, 451, 63941, 5798, 9349, 42018, 127858, + 0, 0, 43609, 5906, 120553, 1440, 0, 128853, 120016, 74283, 11005, 0, + 66656, 66044, 0, 194698, 0, 0, 43393, 10094, 0, 11529, 10857, 120643, + 66436, 6546, 93, 8102, 0, 68405, 0, 0, 8171, 0, 119097, 127064, 917543, + 383, 7154, 41656, 92634, 94040, 0, 5187, 71296, 127277, 11286, 68620, + 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 983827, 8292, 195074, 4980, + 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, 10631, 66031, 7972, + 0, 78785, 0, 7900, 0, 11309, 3806, 4198, 42725, 0, 67656, 9995, 0, 92552, + 0, 12931, 0, 42684, 74285, 2088, 64213, 64366, 65156, 8814, 42238, 74771, + 0, 0, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, 65865, + 0, 194650, 127144, 0, 9342, 120464, 0, 64516, 0, 78792, 10129, 41007, + 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, 40992, 92264, 127153, + 68653, 43558, 5522, 0, 61, 0, 74105, 3633, 983900, 65162, 41234, 12089, + 78281, 9771, 983905, 13251, 128701, 0, 6262, 2784, 42743, 0, 8126, 66483, + 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, 43266, 7108, 194779, 10890, + 74481, 65834, 8324, 119103, 64417, 74817, 127465, 64737, 0, 983659, 8930, + 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0, 0, + 77904, 92640, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, 10338, 66469, + 0, 0, 0, 42815, 0, 41966, 0, 127471, 0, 11792, 43064, 41025, 911, 7539, + 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, + 12326, 983856, 0, 42808, 128337, 9348, 64901, 983861, 0, 0, 0, 0, 0, + 917584, 43702, 983576, 5857, 65342, 92727, 119120, 120079, 8644, 0, 0, 0, + 74296, 41909, 0, 120332, 2791, 69663, 1891, 69824, 0, 41907, 66647, + 118939, 8761, 12942, 5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, + 13146, 127185, 63931, 0, 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, + 0, 983660, 0, 73860, 0, 0, 64345, 0, 9201, 128314, 194940, 0, 0, 43679, + 917585, 65117, 92270, 0, 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, + 0, 128789, 0, 0, 783, 194935, 0, 0, 983064, 194720, 65056, 3620, 41180, + 68378, 4556, 0, 0, 194933, 74250, 0, 67657, 10510, 4382, 66482, 0, 0, + 127527, 9177, 8902, 93958, 9839, 0, 12891, 983755, 983636, 63999, 2016, + 41917, 9788, 63928, 0, 1862, 65800, 9155, 66623, 9786, 65082, 41919, + 8579, 41914, 7981, 0, 66017, 4508, 64883, 92456, 92522, 127814, 0, 64592, + 74276, 120080, 6784, 78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, + 66472, 983929, 64289, 65289, 78151, 66658, 194929, 64509, 78152, 0, + 126505, 11051, 983296, 0, 11355, 65885, 0, 128310, 41214, 0, 12299, 0, + 7500, 4506, 7773, 0, 0, 9963, 68649, 126609, 4040, 120570, 6167, 0, + 63922, 6594, 983740, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, + 41955, 0, 63993, 10440, 9611, 65605, 6803, 0, 7738, 63986, 11446, 63984, + 92641, 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748, + 42742, 9517, 11518, 0, 78790, 0, 67993, 63956, 42458, 63954, 63953, + 63960, 9591, 4516, 10217, 68370, 11469, 69697, 42306, 2723, 118947, 0, 0, + 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, 4270, 0, + 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0, + 0, 126479, 415, 63964, 63963, 42345, 92310, 5183, 1877, 42498, 0, 2927, + 0, 63961, 4472, 0, 0, 78159, 69699, 917936, 42340, 4756, 128078, 7081, + 10730, 7691, 10331, 63830, 119625, 42922, 42103, 8628, 9813, 0, 42453, + 1604, 9565, 10539, 69701, 65764, 41415, 65767, 0, 8457, 42301, 11372, + 64873, 11992, 0, 0, 63980, 11801, 3622, 983124, 64336, 12017, 10463, + 63981, 4967, 64189, 1966, 43628, 0, 983292, 0, 0, 63971, 4347, 4416, + 42098, 11009, 10694, 63973, 402, 0, 13147, 128692, 42100, 64646, 13228, + 0, 41875, 3515, 74252, 11805, 0, 11302, 6259, 43395, 0, 0, 194670, 0, + 92351, 0, 74425, 11299, 1561, 0, 92359, 64942, 983559, 194733, 983686, + 194732, 0, 74301, 0, 11280, 0, 69784, 74060, 0, 0, 119664, 5145, 12486, + 65018, 66516, 5409, 127379, 194669, 7402, 5399, 9685, 74089, 7952, 5401, + 0, 66616, 68421, 983919, 0, 5405, 127875, 64866, 0, 119583, 128345, + 78784, 74248, 11330, 194723, 64690, 3254, 0, 0, 128207, 42390, 43678, + 194725, 983909, 65077, 0, 6388, 3355, 9508, 9867, 5723, 11520, 5611, 0, + 3377, 0, 0, 0, 0, 78228, 0, 983762, 42691, 917886, 127198, 74767, 0, + 127075, 1379, 246, 0, 983761, 3788, 983106, 11041, 92549, 66304, 0, 0, + 8917, 42403, 301, 0, 0, 0, 0, 0, 983697, 10656, 0, 65214, 119242, 42567, + 92217, 13163, 983204, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, 42169, + 4755, 74244, 194621, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, + 64206, 11483, 74510, 0, 74485, 42442, 65470, 983907, 64202, 13160, 7759, + 42482, 485, 128006, 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, + 42431, 6916, 1208, 0, 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, + 70045, 43539, 5411, 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, + 9337, 12052, 10643, 55271, 983179, 12166, 2546, 194683, 213, 118852, + 65611, 0, 0, 194756, 74310, 6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, + 92560, 2713, 0, 9650, 43330, 0, 194675, 1406, 0, 0, 92659, 0, 68223, + 4143, 194677, 0, 65748, 4141, 9682, 65287, 1508, 127013, 8779, 10569, + 8725, 13299, 66638, 65750, 42263, 4145, 6380, 65751, 66613, 43994, 65738, + 55250, 9185, 9550, 0, 43403, 0, 0, 0, 65736, 41951, 64816, 65756, 983205, + 12955, 10596, 2888, 194645, 0, 0, 9657, 9019, 194766, 0, 2878, 5390, 0, + 194961, 0, 68679, 43552, 7501, 6328, 0, 10429, 10365, 0, 0, 41946, 7503, + 5235, 803, 68381, 0, 0, 8986, 126542, 10632, 11934, 11452, 1332, 0, 0, + 126647, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0, 43394, 555, 0, 0, + 66646, 0, 119002, 13151, 74512, 7289, 74055, 64161, 8854, 64162, 5858, + 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, 128813, 13158, + 92166, 7211, 0, 9371, 73973, 917553, 6828, 1625, 92302, 0, 1342, 68440, + 64171, 126704, 10903, 983494, 0, 0, 0, 0, 4482, 41606, 0, 128569, 983112, + 0, 64381, 0, 0, 195090, 42245, 126467, 41972, 0, 444, 0, 9127, 66687, + 66619, 126489, 78025, 0, 11349, 40991, 917570, 0, 119599, 120830, 0, + 1197, 128282, 1149, 194970, 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, + 0, 12838, 983978, 19948, 0, 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, + 41309, 0, 0, 8152, 0, 41550, 12227, 983613, 0, 12828, 127511, 0, 0, + 120708, 0, 0, 10386, 119574, 0, 0, 92680, 983789, 68154, 0, 1743, 0, 0, + 92239, 65186, 917571, 0, 9606, 0, 0, 64439, 0, 0, 92686, 0, 0, 194967, 0, + 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0, 126557, 41091, 3426, 1344, + 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 983824, 74818, 1423, 0, + 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, 11929, 0, 7170, + 9596, 6130, 128826, 43629, 11579, 78713, 0, 194740, 128691, 92185, 66699, + 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0, 68414, 0, 43619, + 43303, 11300, 43304, 9686, 5890, 11776, 7558, 127158, 65627, 0, 10718, + 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628, 78019, 120319, 0, + 41708, 12860, 2641, 12069, 10838, 5403, 10352, 70085, 10061, 43237, 0, + 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0, 10899, 65469, + 92362, 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232, 0, 119253, + 0, 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 0, 4224, 1336, + 41518, 0, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0, 0, 0, 272, + 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, 1190, 4109, 1335, 841, + 5888, 41358, 64863, 9544, 43481, 0, 194806, 70027, 2099, 5120, 2409, + 7799, 0, 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, + 0, 64914, 917787, 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, + 10842, 41354, 42123, 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, + 0, 9972, 73865, 4519, 6114, 10898, 43072, 0, 0, 93960, 983322, 126581, + 10695, 0, 7540, 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, + 64321, 8359, 0, 12689, 0, 194594, 0, 983312, 983881, 68183, 0, 983314, + 1287, 5436, 0, 983317, 74142, 92328, 74152, 119078, 6051, 10497, 69668, + 8985, 12109, 983323, 0, 127242, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, + 279, 73745, 0, 0, 0, 1489, 0, 0, 0, 3899, 1007, 42124, 983557, 42122, + 92337, 92367, 0, 11985, 1345, 78600, 0, 0, 8956, 43083, 94057, 42138, + 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 65942, + 492, 8685, 0, 983759, 0, 78622, 43712, 2582, 11470, 64538, 7444, 78615, + 78616, 2297, 0, 73837, 119823, 2527, 119824, 197, 2799, 92594, 41944, + 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 119828, + 78633, 10896, 0, 1799, 120497, 6971, 74336, 128342, 0, 65340, 118979, + 41551, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, + 7570, 0, 3192, 0, 8414, 0, 93983, 0, 0, 0, 9164, 66612, 93959, 3171, + 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, 64603, 70066, + 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, 8994, 10944, + 41208, 983713, 41168, 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, + 78634, 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, + 65359, 0, 8017, 119831, 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, + 120696, 4904, 983333, 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, + 119587, 64415, 0, 0, 5398, 0, 127386, 93953, 0, 0, 119015, 0, 0, 9476, 0, + 983777, 12763, 126603, 3629, 0, 13005, 0, 3628, 0, 0, 92502, 3469, 42107, + 42116, 917578, 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, + 0, 42583, 9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, 1251, 7777, + 41852, 11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, 65821, 0, + 6018, 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 983230, 10467, 0, + 2443, 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0, 118828, 120271, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, 518, 65857, 0, 128674, 13204, 4387, 857, 0, 65369, 0, 92336, 43125, 120592, 0, 0, 0, 0, 5136, 1968, 983041, 126627, 1337, 64967, 1629, 0, @@ -18779,44 +18796,44 @@ 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, 10460, 43364, 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489, 42112, 127978, 1875, 10808, 42109, 120284, 41860, 64862, 13305, 64907, - 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983270, + 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983277, 119830, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759, 43100, 69888, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, 65178, 4684, 78701, 119653, 0, 126551, 0, 6048, 74460, 42110, 73965, 10870, 8557, 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, - 6035, 0, 7651, 10296, 64443, 0, 983288, 917987, 0, 118966, 74144, 40997, + 6035, 0, 7651, 10296, 64443, 0, 983295, 917987, 0, 118966, 74144, 40997, 0, 10392, 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 13307, 41000, 0, 119239, 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200, 128583, 4425, 0, 0, 0, 43074, 73799, 983200, 78147, 0, 12173, 78545, 0, 127011, 65338, 0, 0, 119582, 4474, 0, 43093, 128644, 1587, 0, - 127372, 64475, 128098, 1369, 983663, 9959, 7927, 0, 4560, 0, 0, 92277, 0, - 64948, 4430, 74347, 42601, 4514, 66434, 93955, 8194, 65462, 10626, 10965, - 0, 8893, 983294, 12542, 0, 65341, 0, 65829, 7925, 119822, 10475, 0, 0, - 1352, 11069, 7707, 127560, 126486, 65279, 127102, 68207, 127100, 7099, - 6040, 127097, 10071, 0, 9336, 43750, 0, 8899, 7798, 64474, 64259, 69873, - 65188, 7820, 43018, 127082, 0, 7746, 1492, 78551, 10884, 77982, 0, 5127, - 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, 68636, - 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, 194684, 8224, 0, - 8938, 6043, 12738, 0, 983076, 5321, 0, 194798, 0, 2589, 74332, 1689, - 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, 128163, 74513, - 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 71312, 5731, 1381, 2387, - 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668, 9766, 0, - 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0, 3526, - 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895, - 43155, 0, 119849, 3146, 10959, 9483, 0, 77893, 10981, 166, 917841, 8635, - 983606, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, 12717, 0, - 7607, 10639, 43396, 0, 0, 41643, 74134, 983054, 8713, 41640, 10221, - 41645, 66712, 6645, 646, 66726, 66711, 42129, 93994, 77901, 3472, 8697, - 0, 0, 983806, 0, 0, 0, 5809, 1950, 119356, 92432, 74572, 0, 42136, 0, 0, - 0, 0, 3247, 119854, 65017, 983944, 68428, 66668, 0, 0, 10983, 0, 0, 0, - 41567, 0, 0, 0, 194624, 119853, 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, - 40988, 92592, 74809, 41727, 0, 42848, 2396, 917766, 0, 74018, 917538, + 127372, 64475, 128098, 1369, 983672, 9959, 7927, 0, 4560, 0, 0, 92277, + 983621, 64948, 4430, 74347, 42601, 4514, 66434, 93955, 8194, 65462, + 10626, 10965, 0, 8893, 983301, 12542, 0, 65341, 0, 65829, 7925, 119822, + 10475, 0, 0, 1352, 11069, 7707, 127560, 126486, 65279, 127102, 68207, + 127100, 7099, 6040, 127097, 10071, 0, 9336, 43750, 0, 8899, 7798, 64474, + 64259, 69873, 65188, 7820, 43018, 127082, 0, 7746, 1492, 78551, 10884, + 77982, 0, 5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, + 2999, 6342, 68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, + 194684, 8224, 0, 8938, 6043, 12738, 0, 983076, 5321, 0, 194798, 0, 2589, + 74332, 1689, 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, + 128163, 74513, 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 71312, + 5731, 1381, 2387, 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, + 9668, 9766, 0, 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, + 2887, 0, 3526, 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, + 128288, 77895, 43155, 0, 119849, 3146, 10959, 9483, 0, 77893, 10981, 166, + 917841, 8635, 983606, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, + 12717, 0, 7607, 10639, 43396, 0, 0, 41643, 74134, 983054, 8713, 41640, + 10221, 41645, 66712, 6645, 646, 66726, 66711, 42129, 93994, 77901, 3472, + 8697, 0, 0, 983815, 0, 0, 0, 5809, 1950, 119356, 92432, 74572, 0, 42136, + 0, 0, 0, 0, 3247, 119854, 65017, 983953, 68428, 66668, 0, 0, 10983, 0, 0, + 0, 41567, 0, 0, 0, 194624, 119853, 0, 0, 8285, 0, 4509, 0, 66471, 12216, + 0, 40988, 92592, 74809, 41727, 0, 42848, 2396, 917766, 0, 74018, 917538, 64940, 7027, 3886, 0, 42457, 119008, 0, 996, 68123, 94058, 4249, 0, 917594, 11707, 8222, 0, 7939, 92454, 92460, 127801, 917592, 128359, 8534, - 127154, 40983, 0, 983235, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549, + 127154, 40983, 0, 983240, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 128034, 9619, - 983931, 0, 0, 127872, 71363, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0, - 65009, 983933, 12567, 128703, 0, 41412, 0, 0, 3607, 9200, 10046, 9612, + 983940, 0, 0, 127872, 71363, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0, + 65009, 983942, 12567, 128703, 0, 41412, 0, 0, 3607, 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0, 43085, 6057, 508, 93968, 128015, 67968, 0, 92405, 0, 0, 638, 6083, 119072, 0, 0, 2305, 78348, 68096, 0, 6056, 6659, 67969, 0, 6085, 0, 0, 3915, 41634, 0, 41639, @@ -18824,15 +18841,15 @@ 12328, 501, 93985, 10601, 0, 583, 0, 41977, 0, 66004, 119350, 6505, 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, 73764, 0, 92376, 12745, 9678, 0, 120587, 9869, 128815, 1771, 0, 8936, 0, 0, 4208, 78341, - 78567, 78342, 0, 983449, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475, + 78567, 78342, 0, 983456, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475, 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026, - 983248, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138, + 983253, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138, 119361, 983564, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, - 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983670, 10600, 917867, + 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983679, 10600, 917867, 620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, - 69892, 983208, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209, + 69892, 983209, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209, 11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569, - 65275, 8906, 127096, 5755, 2636, 0, 10815, 11619, 2301, 41540, 7815, + 65275, 8906, 127096, 5755, 2636, 983227, 10815, 11619, 2301, 41540, 7815, 11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048, 917763, 829, 0, 92406, 19950, 0, 126482, 6616, 0, 118875, 10953, 391, 0, 69785, 482, 42296, 11588, 0, 43606, 0, 68397, 66370, 74506, 42335, @@ -18841,9 +18858,9 @@ 11337, 78209, 917820, 63989, 3958, 12132, 1849, 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, 78338, 0, 43300, 5156, 92629, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, 66435, 2215, 41662, 94010, 0, - 0, 0, 93952, 4578, 64513, 41664, 983725, 42578, 128794, 41661, 78715, + 0, 0, 93952, 4578, 64513, 41664, 983734, 42578, 128794, 41661, 78715, 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 983127, 42476, 7730, - 983850, 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, + 983859, 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, 917923, 8763, 128304, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, 6915, 42310, 4377, 8559, 0, 74360, 0, 13193, 64350, 11666, 8679, 41924, 1576, 7735, 92398, 0, 73840, 983092, 11374, 78043, 10889, @@ -18861,24 +18878,24 @@ 8244, 362, 92439, 0, 8037, 43777, 11535, 0, 74845, 5185, 7165, 5521, 10334, 2093, 71329, 10302, 128112, 10104, 1027, 5181, 0, 0, 10523, 1446, 42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, 5581, 42898, 3405, - 0, 194644, 5523, 0, 42620, 92447, 983810, 9549, 0, 10549, 55282, 9661, - 43682, 0, 77910, 120026, 78708, 0, 77911, 0, 41991, 983884, 0, 7630, + 0, 194644, 5523, 0, 42620, 92447, 983819, 9549, 0, 10549, 55282, 9661, + 43682, 0, 77910, 120026, 78708, 0, 77911, 0, 41991, 983893, 0, 7630, 9846, 7684, 10350, 0, 1174, 77981, 42733, 77978, 77980, 66485, 77977, 42277, 77974, 42456, 65667, 127037, 12330, 128272, 0, 42417, 42383, 66630, 41344, 6293, 0, 66252, 77984, 74443, 0, 10209, 8313, 4195, 74435, - 1316, 66690, 120032, 6332, 64894, 0, 65871, 78060, 1736, 983675, 3901, + 1316, 66690, 120032, 6332, 64894, 0, 65871, 78060, 1736, 983684, 3901, 12228, 120151, 65200, 3383, 10446, 78841, 693, 9130, 314, 64149, 42420, - 11949, 983660, 120152, 11026, 128788, 5332, 6940, 64154, 12635, 127007, + 11949, 983669, 120152, 11026, 128788, 5332, 6940, 64154, 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 71368, 12824, 0, 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0, 0, 0, - 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 983859, - 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 983862, + 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 983868, + 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 983871, 1023, 474, 0, 119818, 0, 0, 42487, 65556, 0, 127866, 42295, 0, 0, 71322, 92518, 9835, 66499, 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, 128008, 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 92695, 42182, 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583, 65802, 93970, 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, - 983742, 0, 41835, 4047, 41842, 0, 64107, 0, 0, 11017, 120601, 0, 293, + 983751, 0, 41835, 4047, 41842, 0, 64107, 0, 0, 11017, 120601, 0, 293, 77966, 92169, 64791, 41827, 42466, 43422, 10579, 8560, 71350, 65413, 77963, 4803, 12964, 1739, 1941, 3900, 0, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098, 64105, 128080, 42481, 11716, 66473, 7179, @@ -18896,337 +18913,338 @@ 3659, 9533, 184, 1553, 13107, 65484, 69648, 10502, 74457, 0, 0, 41554, 0, 8220, 917943, 41557, 0, 0, 11070, 119221, 5157, 4020, 73858, 41555, 9514, 64818, 65103, 64641, 64303, 78131, 7520, 0, 74377, 11029, 66651, 983068, - 0, 118930, 64527, 0, 7877, 73803, 983789, 127348, 120096, 74602, 9955, + 0, 118930, 64527, 0, 7877, 73803, 983798, 127348, 120096, 74602, 9955, 119557, 4055, 42817, 0, 65212, 11715, 12190, 12319, 78630, 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 127357, 78835, 92410, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, 10477, 0, - 8636, 983918, 8315, 65444, 983784, 0, 74595, 6152, 0, 0, 6629, 127108, + 8636, 983927, 8315, 65444, 983793, 0, 74595, 6152, 0, 0, 6629, 127108, 120171, 0, 74589, 43993, 0, 69790, 64435, 0, 43690, 11046, 11490, 42730, 4485, 127107, 0, 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0, - 12825, 0, 0, 12725, 0, 0, 78642, 223, 0, 69675, 120166, 42444, 0, 64499, - 65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, 78619, - 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, 1213, - 0, 64075, 797, 64074, 8734, 4212, 127369, 64387, 4115, 0, 5005, 64070, - 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0, - 2120, 43302, 1224, 0, 65576, 74192, 10701, 1764, 3101, 127815, 12858, - 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, - 9222, 983729, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, - 0, 0, 1293, 7947, 2132, 983758, 74593, 120308, 2454, 42717, 3613, 128837, - 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304, - 983114, 8822, 0, 1157, 64903, 8638, 0, 0, 0, 0, 69848, 8235, 120316, - 4405, 10086, 120247, 0, 69216, 0, 65430, 71321, 6079, 6817, 10764, - 127910, 64291, 128051, 998, 120312, 11062, 1317, 64327, 1558, 0, 1991, - 7882, 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, 43076, - 4692, 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, 120325, - 66373, 0, 0, 64908, 92691, 6311, 0, 12004, 119192, 12049, 43108, 120326, - 0, 41705, 92188, 6598, 0, 6599, 120334, 0, 42148, 118825, 66027, 0, 6597, - 9412, 8340, 11824, 64745, 2281, 69904, 0, 1988, 5407, 67865, 2430, 41678, - 0, 120243, 2336, 983894, 0, 78871, 120442, 983760, 1921, 10947, 19927, 0, - 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, 9229, 10956, 42285, 41674, - 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, 65403, 983089, 1854, 10794, - 0, 67660, 69846, 0, 78359, 5280, 0, 4344, 12905, 65433, 6076, 64793, - 41610, 768, 12074, 442, 0, 68162, 64081, 12934, 41682, 65432, 41693, 0, - 6071, 65434, 127467, 4804, 4053, 0, 127469, 194653, 41696, 467, 69823, - 127463, 69797, 194652, 127473, 8421, 127472, 69682, 43705, 502, 0, 65431, - 119056, 69954, 12043, 1303, 316, 7364, 2029, 2136, 119246, 11533, 64365, - 43480, 92639, 4860, 126648, 127877, 42488, 0, 9583, 128849, 5546, 8019, - 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543, 77989, 63751, 12137, - 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352, 65452, 0, 11301, - 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410, 0, 0, 78016, - 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621, 92709, - 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, 10545, - 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, 92363, 9996, - 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493, 545, 9575, - 41379, 10050, 12718, 69854, 8859, 6820, 74345, 65110, 120740, 0, 0, 9119, - 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, 78022, 410, - 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, 10126, 12116, - 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, 41345, 120362, - 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, 64858, 361, - 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919, 4569, 74130, 0, - 43487, 194630, 611, 74129, 64871, 118891, 65629, 0, 194858, 0, 0, 127545, - 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, 0, 983581, 74054, - 127754, 195029, 0, 839, 983312, 7695, 8769, 65246, 4829, 194663, 4859, - 64467, 0, 983954, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, - 983854, 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468, - 74245, 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224, - 119229, 11049, 0, 92697, 43239, 8482, 92440, 0, 5032, 69677, 11940, - 67888, 664, 120437, 5034, 0, 0, 127525, 42702, 73888, 983149, 13294, - 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, 120819, 68387, 120168, - 73913, 120170, 41161, 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434, - 41437, 1905, 6034, 41164, 64744, 9528, 118867, 128800, 524, 0, 74029, - 788, 74027, 0, 194638, 0, 1663, 10419, 74025, 42636, 0, 69725, 0, 120656, - 0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, - 0, 10855, 5445, 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, - 4962, 69772, 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 92299, 0, - 120427, 10451, 0, 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, - 8367, 0, 120146, 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, - 6217, 5896, 0, 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, - 74402, 118860, 0, 120419, 92497, 74052, 0, 92378, 120549, 119082, 64295, - 120418, 0, 64765, 73923, 120417, 120662, 69920, 194702, 6216, 0, 10755, - 9455, 0, 8124, 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638, - 0, 0, 0, 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, - 19936, 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0, - 0, 9354, 983164, 128833, 41199, 10121, 2028, 0, 983194, 69715, 0, 3062, - 0, 74447, 12608, 0, 66440, 7545, 9700, 12580, 92205, 120777, 120502, - 41155, 0, 74071, 0, 983450, 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040, - 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, 983970, 1230, 0, 0, 3597, - 4446, 10584, 74235, 92215, 4037, 127938, 8352, 0, 5687, 0, 64515, 0, - 194801, 55265, 67846, 78434, 9704, 0, 0, 70080, 71338, 0, 8660, 126495, - 0, 0, 78773, 74482, 4483, 1709, 69721, 9909, 6080, 0, 120358, 1746, 1315, - 8667, 0, 0, 13140, 65899, 10604, 0, 4480, 11266, 128152, 1226, 6930, - 67979, 983681, 6360, 10897, 41230, 605, 0, 74785, 69875, 0, 0, 41500, 0, - 311, 11453, 6221, 10608, 64943, 74280, 10877, 118868, 64885, 74272, 0, 0, - 128559, 120736, 74312, 345, 0, 74456, 64606, 9917, 0, 92231, 5037, 0, - 1776, 8422, 0, 118814, 41508, 41201, 323, 43328, 0, 42698, 1295, 194853, - 4625, 0, 4630, 13117, 0, 128772, 65123, 11293, 2668, 11288, 0, 42640, - 65666, 2519, 92369, 65420, 92479, 0, 4252, 5049, 42659, 119011, 706, - 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, 66702, 0, 12670, 1013, - 0, 64919, 705, 0, 65422, 127803, 1183, 126519, 7017, 42852, 0, 8157, - 9736, 64503, 65418, 0, 983869, 74035, 0, 11913, 73874, 6696, 0, 8920, - 119298, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, - 1857, 194657, 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, - 119173, 0, 0, 7805, 0, 94007, 6935, 92292, 78325, 78326, 78323, 43327, - 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543, - 78335, 78332, 77832, 65849, 77831, 983952, 0, 12451, 0, 8684, 0, 6102, 0, - 5298, 0, 5294, 0, 0, 983452, 195062, 9949, 119826, 43617, 119215, 0, - 12073, 0, 0, 77863, 13108, 120617, 11439, 41468, 983748, 0, 5292, 55272, - 983874, 1939, 5302, 3970, 917879, 12455, 1793, 0, 0, 0, 6643, 92477, - 65263, 0, 78330, 41293, 78328, 65923, 0, 13219, 9569, 0, 74383, 0, 74197, - 0, 5500, 8813, 0, 0, 74566, 5322, 0, 78340, 43631, 5324, 66443, 3784, - 41614, 65269, 6230, 78349, 78345, 43324, 3360, 78344, 11523, 0, 92488, - 9926, 7197, 0, 68429, 42894, 41821, 1249, 78360, 78361, 78356, 78358, - 78353, 64899, 64763, 41149, 41807, 43162, 41815, 41150, 0, 10571, 10096, - 0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, 41811, - 74466, 93966, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, 128655, - 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 69860, 315, 12813, - 983451, 78432, 78256, 78351, 78352, 0, 983648, 0, 0, 1378, 9509, 0, 0, - 74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379, 194616, - 41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366, 42088, 0, - 195061, 7176, 43756, 10137, 6121, 10995, 78259, 74534, 8119, 64874, - 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0, 74515, 0, - 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, 119100, - 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657, 194600, 0, - 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, 65080, 0, - 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366, 42790, 42006, - 119115, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, - 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, 94045, - 42073, 6785, 64590, 983821, 4371, 7196, 65318, 2035, 65316, 4106, 65314, - 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533, 78459, - 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695, 127752, - 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762, 66455, 64738, - 3219, 68654, 983778, 0, 1037, 0, 2025, 128263, 13098, 78442, 10637, 4568, - 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, 12606, 78433, - 2825, 0, 10825, 8079, 2821, 41046, 92327, 7365, 983744, 120593, 13071, 0, - 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, 64703, - 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, 983378, - 42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065, 5323, - 8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, 127295, - 8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300, 92296, - 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, 11403, - 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 983913, 0, 0, - 64857, 128105, 2855, 127828, 66308, 41621, 68214, 127283, 127817, 10654, - 0, 119226, 12164, 3246, 7906, 43972, 65847, 7182, 0, 13024, 194822, - 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466, - 983575, 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0, - 64634, 128279, 0, 11612, 0, 67600, 2374, 94066, 8475, 11609, 66313, 0, 0, - 5286, 119297, 0, 0, 64925, 120283, 194584, 118982, 194583, 7705, 11942, - 11305, 194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, - 0, 66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491, - 66010, 119552, 6078, 9954, 0, 1475, 119247, 9938, 6084, 917546, 41064, - 41062, 0, 0, 3256, 10189, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0, - 0, 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 71351, 0, - 3635, 64337, 983274, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, - 65613, 77909, 92420, 73997, 0, 0, 119218, 7984, 8600, 74434, 127770, - 4176, 70050, 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860, - 78596, 0, 3649, 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124, - 7866, 0, 11402, 42146, 94032, 74238, 42664, 2849, 127034, 0, 7938, 12960, - 1761, 11812, 65379, 68386, 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0, - 41680, 0, 128203, 11534, 1514, 11668, 67891, 9313, 7015, 0, 67877, - 194567, 12989, 66474, 9368, 12848, 1624, 43270, 0, 74278, 10818, 126644, - 9953, 0, 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551, - 2798, 65176, 4958, 42752, 119025, 0, 67875, 120301, 3495, 66648, 194768, - 0, 68364, 983223, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 194829, - 194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0, - 5271, 92318, 92517, 118882, 1362, 13297, 0, 128094, 0, 983324, 73789, 0, - 6658, 4426, 0, 92628, 983833, 92319, 7276, 42163, 5220, 0, 0, 983323, - 2416, 3310, 42703, 0, 379, 0, 43755, 0, 0, 3223, 65492, 1284, 194771, - 4549, 0, 0, 983154, 127763, 10807, 9558, 194613, 0, 8515, 8688, 12866, - 65308, 3294, 983325, 8529, 128101, 43385, 7564, 0, 43329, 0, 92458, - 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198, 3215, 0, - 7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, 66354, 1501, - 0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, 7476, 74399, 0, - 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, 77979, 0, 126507, - 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, 6805, 8631, - 2545, 70052, 127166, 0, 74190, 0, 0, 983777, 42762, 0, 42914, 1650, 262, - 1637, 0, 7901, 3238, 128173, 41861, 0, 128585, 65158, 10860, 94059, - 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 93989, 0, 119810, 7194, - 5291, 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, - 2620, 0, 0, 0, 983866, 179, 65896, 0, 64756, 2853, 78443, 118813, 983881, - 118996, 119009, 2850, 8084, 983085, 73850, 2801, 92284, 42069, 119839, - 74754, 119841, 42072, 119843, 119842, 10398, 983056, 0, 8377, 127116, - 8245, 68401, 3158, 92396, 3983, 43656, 923, 119857, 119856, 292, 13002, - 119845, 119844, 3221, 1763, 92463, 4612, 119851, 119850, 7253, 127110, - 68391, 0, 10782, 3637, 12996, 43542, 0, 64578, 983666, 3228, 69636, 8783, - 0, 119614, 2731, 0, 0, 78585, 4102, 7696, 73878, 0, 0, 78586, 43316, - 4177, 11283, 9089, 0, 73996, 983173, 64500, 43674, 0, 64947, 1856, 0, 0, - 6379, 0, 0, 0, 3208, 12975, 74775, 127380, 983922, 92389, 74072, 55269, - 0, 0, 983674, 2033, 78577, 78576, 195026, 55254, 7740, 0, 0, 0, 73964, 0, - 93988, 67612, 65674, 128244, 94110, 41689, 0, 74006, 64909, 6646, 11790, - 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, 7230, 8257, 0, - 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903, 66721, - 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, 10723, 967, 983942, - 126469, 11946, 0, 3257, 0, 12307, 1845, 983157, 43526, 0, 0, 1886, 42342, - 10089, 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879, - 43692, 4563, 0, 0, 7591, 65887, 867, 9520, 872, 126607, 868, 873, 7642, - 0, 869, 874, 7644, 120674, 875, 790, 128303, 0, 0, 0, 66182, 983251, - 5429, 195055, 66180, 126480, 66181, 68452, 983282, 983243, 42067, 0, - 5433, 10657, 7911, 194622, 1547, 66176, 42012, 120576, 5425, 4977, 9999, - 5317, 5423, 4611, 0, 67637, 0, 9679, 74122, 0, 0, 0, 66194, 4418, 66184, - 4628, 4245, 119648, 0, 0, 1851, 0, 127189, 11908, 0, 9360, 118897, - 983201, 42776, 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809, - 69881, 0, 983142, 120604, 983052, 983873, 0, 983263, 0, 0, 7427, 9958, - 4588, 43680, 0, 74484, 194968, 2433, 0, 119622, 3352, 74363, 983876, 0, - 793, 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, - 118877, 0, 7837, 917625, 818, 5337, 194628, 917621, 41376, 119978, - 126576, 120594, 74086, 917615, 917614, 917613, 10973, 66359, 1372, - 127172, 917608, 4969, 1254, 917605, 917604, 93967, 917602, 65228, 78221, - 126612, 0, 2840, 0, 119982, 983930, 0, 3245, 9068, 68194, 64725, 0, 0, - 12991, 0, 2651, 68016, 983258, 917611, 127026, 128883, 0, 0, 43648, - 120812, 0, 43322, 92662, 0, 0, 64372, 92698, 3226, 655, 752, 7457, 7456, - 7452, 3285, 128779, 127821, 119988, 65610, 2391, 0, 92248, 671, 250, - 7434, 618, 668, 610, 42800, 7431, 1152, 42801, 640, 120666, 7448, 7439, - 628, 3905, 73810, 0, 128266, 64749, 67850, 2107, 0, 0, 4605, 128174, - 983192, 43372, 65945, 128838, 0, 119590, 0, 0, 0, 987, 6927, 11572, - 42261, 11464, 3365, 9971, 0, 0, 128297, 0, 0, 0, 0, 11334, 43326, 12609, - 11519, 11503, 5530, 5210, 0, 4627, 983883, 5208, 0, 128842, 10332, 5218, - 7976, 9156, 0, 3244, 5529, 69647, 73894, 128852, 5432, 64965, 5527, - 74033, 10516, 7790, 5528, 0, 42140, 120281, 0, 0, 43545, 9887, 0, 4000, - 7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 128566, 917989, 128666, - 211, 2509, 128858, 120573, 68672, 3220, 42235, 0, 10690, 8951, 5214, - 42474, 8118, 0, 7048, 4590, 127258, 5852, 0, 0, 127259, 1708, 0, 983165, - 2623, 11943, 0, 69226, 0, 4698, 66509, 1066, 119921, 4701, 983867, - 120285, 74225, 94111, 8267, 0, 127265, 0, 7516, 0, 2625, 983968, 8034, - 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, 0, 43384, 12660, 0, 0, - 0, 74850, 41069, 0, 128156, 12099, 4310, 10032, 6252, 713, 7990, 0, 3990, - 0, 983255, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, 983120, - 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94, - 1880, 74766, 983829, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, - 126572, 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 120335, 64785, 7394, - 3641, 5419, 128055, 0, 127883, 0, 120344, 43988, 0, 8610, 43062, 7592, - 856, 74299, 936, 13289, 69894, 43171, 1459, 0, 65243, 78638, 19953, 0, - 1504, 70064, 0, 12913, 74206, 7529, 0, 128699, 983948, 120782, 4113, 0, - 2372, 336, 0, 7509, 12152, 0, 682, 66458, 41505, 0, 64743, 10593, 1703, - 0, 983946, 8033, 69953, 0, 9810, 127269, 0, 12970, 0, 42351, 10109, - 917623, 0, 194693, 0, 92690, 0, 0, 74291, 1965, 7069, 43312, 0, 73887, 0, - 2087, 64370, 6314, 41714, 8501, 0, 0, 74239, 41317, 92614, 2091, 74545, - 2090, 0, 9353, 7117, 2077, 77886, 0, 10498, 2083, 77888, 0, 0, 119236, - 634, 0, 0, 0, 69779, 4165, 8746, 0, 9654, 12856, 6924, 0, 7066, 983710, - 0, 128135, 41037, 42692, 7786, 12959, 41039, 127483, 0, 680, 2302, - 128200, 1181, 7056, 3174, 126516, 0, 92668, 65665, 127375, 126506, 6920, - 0, 92295, 0, 118965, 0, 64644, 126981, 74119, 0, 41028, 0, 6231, 2613, - 65302, 40989, 0, 194696, 0, 42760, 0, 983566, 0, 40987, 4667, 0, 983923, - 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, 4744, 0, 12702, - 242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, 74505, 43274, 5313, - 951, 0, 0, 983858, 7604, 983283, 4009, 127816, 983701, 120562, 0, 983711, - 64860, 119138, 119069, 0, 127370, 4048, 983598, 0, 70024, 1646, 77890, - 64534, 73995, 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, - 3441, 119894, 2975, 74442, 9822, 983926, 55220, 10084, 73943, 118840, 0, - 917562, 194610, 3399, 9851, 983708, 11909, 9059, 0, 7687, 0, 6789, 0, 0, - 0, 71367, 0, 0, 1777, 9151, 1137, 69767, 749, 42366, 0, 5385, 128574, - 128218, 0, 0, 5989, 0, 0, 128091, 0, 41685, 69223, 0, 9769, 41684, - 983215, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, 41297, 0, 3666, - 74473, 41300, 74468, 65160, 0, 69688, 69771, 74479, 0, 6558, 0, 0, 69765, - 120750, 252, 0, 41302, 0, 0, 0, 69763, 0, 11729, 8719, 9060, 0, 120139, - 10761, 0, 0, 0, 118792, 11734, 983222, 11730, 0, 9593, 5757, 2403, 64808, - 55275, 0, 11728, 43572, 0, 0, 7764, 983705, 11094, 120825, 0, 0, 4282, - 8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 63854, 8456, 0, 74783, 65670, 0, - 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, - 3458, 4365, 70053, 983703, 3647, 0, 2602, 128341, 0, 194707, 41135, 0, 0, - 0, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, 126476, 92193, 7597, - 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, 9062, 119252, 0, - 0, 0, 64479, 9232, 92596, 0, 0, 194712, 10900, 41531, 1263, 3720, 12048, - 0, 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354, 127345, 299, - 917957, 8525, 127347, 3524, 917565, 8831, 127349, 92564, 3075, 67867, - 127352, 0, 66362, 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200, 65114, - 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680, 7204, - 70065, 2588, 2914, 7011, 55281, 0, 2471, 194631, 2883, 2749, 119563, - 73774, 10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, - 10928, 0, 41153, 41229, 118967, 0, 3738, 94016, 0, 12711, 3181, 66212, - 74289, 68472, 42857, 8262, 983372, 0, 983221, 0, 42347, 12092, 9615, - 7234, 74047, 983088, 0, 43744, 0, 0, 73846, 2934, 12722, 120762, 922, - 43983, 74507, 983126, 74461, 3218, 120471, 74290, 120469, 64562, 120475, - 8569, 11404, 11932, 73728, 3214, 120461, 120468, 12128, 3207, 65486, - 78729, 1901, 78727, 127326, 120460, 7425, 3205, 68003, 78737, 78736, - 78735, 43383, 69940, 65459, 2606, 78730, 73897, 0, 11496, 1173, 0, 41272, - 119661, 0, 0, 983314, 120737, 0, 983962, 983313, 378, 2610, 0, 65079, - 983318, 65695, 126559, 37, 7068, 0, 120480, 120479, 3209, 120477, 0, - 10638, 9768, 69952, 119909, 983392, 0, 0, 0, 0, 65510, 0, 0, 5233, - 983328, 64792, 983327, 0, 126633, 0, 7060, 9847, 120144, 1685, 595, 0, - 73971, 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243, - 9014, 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 128132, 8203, 78488, - 983090, 8458, 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465, - 69901, 8193, 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0, - 92414, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548, - 68650, 92507, 1832, 5604, 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, - 0, 42888, 65712, 983297, 3869, 11937, 5725, 127539, 1783, 68648, 5728, 0, - 0, 0, 11918, 66567, 5724, 0, 5727, 78521, 0, 0, 764, 0, 128116, 43531, 0, - 9033, 0, 42532, 6223, 11042, 120749, 11423, 0, 119861, 71344, 43465, 0, - 128267, 6559, 64557, 71348, 92649, 120648, 43019, 43477, 10238, 74491, 0, - 43377, 92282, 71346, 1478, 9783, 11825, 2607, 64740, 0, 7739, 74543, 0, - 0, 0, 6132, 0, 63765, 0, 70058, 41144, 0, 92438, 43537, 6761, 10093, - 4369, 917791, 0, 983148, 8820, 3947, 0, 0, 11515, 526, 128103, 41295, - 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 983375, - 1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357, 11794, - 42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870, 6553, 7055, - 0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, 12990, 1160, 42084, 119650, - 41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 983170, - 41216, 7844, 2616, 119190, 68461, 65234, 983287, 13076, 3135, 983280, - 78143, 119139, 3142, 92451, 94068, 10819, 119580, 10183, 0, 2608, 1470, - 73967, 94008, 6227, 0, 127173, 69741, 983582, 6163, 983558, 0, 127314, 0, - 0, 8603, 0, 119866, 3306, 10876, 43392, 119573, 127931, 5751, 0, 6222, 0, - 0, 12086, 7403, 1600, 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0, - 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, 6974, 0, 0, 983210, 5002, 0, - 41286, 69946, 127019, 0, 43585, 0, 6551, 983953, 128229, 0, 41289, 0, - 194602, 0, 8977, 602, 120814, 0, 128778, 128661, 0, 983368, 41279, 0, 0, - 0, 11081, 43615, 0, 0, 0, 983612, 12727, 0, 0, 78397, 9475, 7112, 65105, - 0, 9633, 10886, 43592, 7831, 983820, 194571, 0, 73915, 8076, 43048, 8290, - 8291, 43051, 92570, 0, 2596, 43584, 0, 13113, 0, 127757, 2393, 7058, - 9087, 74067, 68673, 41574, 78337, 0, 74058, 6376, 0, 0, 0, 0, 9854, - 127748, 64696, 0, 128220, 0, 6994, 0, 1720, 0, 0, 0, 6529, 7063, 983182, - 3751, 9120, 983478, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, 12430, - 8137, 94098, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 94046, - 6136, 917609, 65677, 8682, 41235, 92595, 42045, 9804, 118963, 432, 3595, - 194945, 65437, 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894, - 8797, 0, 9052, 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, 0, 64640, - 0, 94109, 0, 74137, 70035, 10063, 12652, 12199, 92480, 0, 2566, 11971, - 983728, 0, 1065, 0, 0, 43400, 2576, 66696, 93999, 0, 43604, 0, 0, 74082, - 514, 74502, 70032, 2921, 43215, 64493, 5772, 12968, 70055, 194944, 74580, - 43398, 2580, 983801, 41341, 41223, 6564, 1463, 41342, 0, 5293, 70020, 0, - 3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0, - 127025, 0, 74821, 0, 983724, 119042, 0, 127865, 13090, 66643, 0, 1270, - 1132, 42360, 0, 74096, 66655, 42569, 127824, 0, 64761, 0, 41021, 8510, - 42432, 0, 0, 194782, 0, 64496, 74109, 70030, 9915, 0, 983217, 7061, - 41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067, 68221, 0, - 127383, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0, 74792, - 2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976, 11066, - 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0, 12107, - 7100, 10905, 65010, 194986, 697, 66018, 9284, 4244, 0, 0, 92644, 13121, - 120036, 0, 12010, 128573, 128221, 0, 0, 0, 127193, 65816, 68111, 0, - 127933, 65668, 92257, 6618, 118784, 66365, 0, 42234, 12648, 78110, 7123, - 70038, 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, - 128258, 0, 0, 0, 13122, 0, 191, 70060, 8585, 8000, 64411, 120652, 42889, - 64850, 41072, 41578, 0, 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683, - 396, 41580, 68146, 0, 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0, - 4743, 0, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 71349, - 0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 128113, 1778, 3956, 0, - 42070, 6563, 43075, 9018, 94006, 983389, 12067, 41312, 0, 5547, 74531, - 127969, 0, 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, - 118822, 1750, 0, 4394, 68368, 1807, 983879, 92298, 0, 5889, 0, 7180, 0, - 119145, 0, 917558, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, - 4512, 119360, 65230, 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, - 3975, 0, 74087, 0, 12672, 3798, 2703, 983599, 0, 2109, 9774, 1275, 0, 0, - 41095, 3962, 0, 2932, 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, - 0, 0, 41851, 128230, 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, + 12825, 0, 0, 12725, 0, 127106, 78642, 223, 0, 69675, 120166, 42444, 0, + 64499, 65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, + 78619, 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, + 1213, 0, 64075, 797, 64074, 8734, 4212, 127369, 64387, 4115, 0, 5005, + 64070, 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, + 65436, 0, 2120, 43302, 1224, 0, 65576, 74192, 10701, 1764, 3101, 127815, + 12858, 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, + 2129, 0, 9222, 983738, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, + 42331, 64935, 0, 0, 1293, 7947, 2132, 983767, 74593, 120308, 2454, 42717, + 3613, 128837, 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, + 120304, 983114, 8822, 0, 1157, 64903, 8638, 0, 0, 0, 0, 69848, 8235, + 120316, 4405, 10086, 120247, 0, 69216, 0, 65430, 71321, 6079, 6817, + 10764, 127910, 64291, 128051, 998, 120312, 11062, 1317, 64327, 1558, 0, + 1991, 7882, 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, + 43076, 4692, 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, + 120325, 66373, 0, 0, 64908, 92691, 6311, 0, 12004, 119192, 12049, 43108, + 120326, 0, 41705, 92188, 6598, 0, 6599, 120334, 0, 42148, 118825, 66027, + 0, 6597, 9412, 8340, 11824, 64745, 2281, 69904, 0, 1988, 5407, 67865, + 2430, 41678, 0, 120243, 2336, 983903, 0, 78871, 120442, 983769, 1921, + 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, 9229, + 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, 65403, + 983089, 1854, 10794, 0, 67660, 69846, 0, 78359, 5280, 0, 4344, 12905, + 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, 12934, + 41682, 65432, 41693, 0, 6071, 65434, 127467, 4804, 4053, 0, 127469, + 194653, 41696, 467, 69823, 127463, 69797, 194652, 127473, 8421, 127472, + 69682, 43705, 502, 0, 65431, 119056, 69954, 12043, 1303, 316, 7364, 2029, + 2136, 119246, 11533, 64365, 43480, 92639, 4860, 126648, 127877, 42488, 0, + 9583, 128849, 5546, 8019, 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543, + 77989, 63751, 12137, 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352, + 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410, + 0, 0, 78016, 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621, + 92709, 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, + 10545, 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, + 92363, 9996, 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493, + 545, 9575, 41379, 10050, 12718, 69854, 8859, 6820, 74345, 65110, 120740, + 0, 0, 9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, + 78022, 410, 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, + 10126, 12116, 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, + 41345, 120362, 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, + 64858, 361, 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919, + 4569, 74130, 0, 43487, 194630, 611, 74129, 64871, 118891, 65629, 0, + 194858, 0, 0, 127545, 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, + 0, 983581, 74054, 127754, 195029, 0, 839, 983319, 7695, 8769, 65246, + 4829, 194663, 4859, 64467, 0, 983963, 118998, 7206, 0, 6647, 43986, 0, + 69766, 0, 64764, 4210, 983863, 127936, 804, 0, 0, 12298, 0, 66653, 0, + 64924, 10091, 73931, 9468, 74245, 0, 0, 74246, 92503, 12839, 64669, + 92202, 0, 1279, 1425, 6224, 119229, 11049, 0, 92697, 43239, 8482, 92440, + 0, 5032, 69677, 11940, 67888, 664, 120437, 5034, 0, 0, 127525, 42702, + 73888, 983149, 13294, 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, + 120819, 68387, 120168, 73913, 120170, 41161, 5518, 4174, 10993, 41162, + 120160, 64528, 1169, 434, 41437, 1905, 6034, 41164, 64744, 9528, 118867, + 128800, 524, 0, 74029, 788, 74027, 0, 194638, 0, 1663, 10419, 74025, + 42636, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, + 0, 119107, 43612, 64344, 0, 0, 10855, 5445, 9355, 0, 65198, 7391, 8989, + 221, 65686, 0, 0, 8010, 7191, 4962, 69772, 8855, 0, 0, 64469, 120426, + 10555, 0, 43333, 92299, 0, 120427, 10451, 0, 67653, 7245, 12443, 74405, + 9947, 120149, 78317, 3873, 8367, 0, 120146, 43433, 43649, 11987, 0, 0, + 11010, 12723, 74059, 74062, 6217, 5896, 0, 7682, 74049, 1462, 10235, 0, + 0, 0, 0, 0, 0, 42595, 0, 74402, 118860, 0, 120419, 92497, 74052, 0, + 92378, 120549, 119082, 64295, 120418, 0, 64765, 73923, 120417, 120662, + 69920, 194702, 6216, 0, 10755, 9455, 0, 8124, 127042, 9470, 6944, 127540, + 0, 69680, 2828, 0, 531, 42638, 0, 0, 0, 43428, 8204, 3614, 2827, 9696, 0, + 0, 8728, 4354, 10904, 78562, 19936, 7833, 120691, 0, 42599, 42597, 42709, + 120409, 127044, 0, 8537, 0, 0, 9354, 983164, 128833, 41199, 10121, 2028, + 0, 983194, 69715, 0, 3062, 0, 74447, 12608, 0, 66440, 7545, 9700, 12580, + 92205, 120777, 120502, 41155, 0, 74071, 0, 983457, 12713, 0, 0, 0, 78772, + 0, 1734, 0, 0, 127040, 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, + 983979, 1230, 0, 0, 3597, 4446, 10584, 74235, 92215, 4037, 127938, 8352, + 0, 5687, 0, 64515, 0, 194801, 55265, 67846, 78434, 9704, 0, 0, 70080, + 71338, 0, 8660, 126495, 0, 0, 78773, 74482, 4483, 1709, 69721, 9909, + 6080, 0, 120358, 1746, 1315, 8667, 0, 0, 13140, 65899, 10604, 0, 4480, + 11266, 128152, 1226, 6930, 67979, 983690, 6360, 10897, 41230, 605, 0, + 74785, 69875, 0, 0, 41500, 0, 311, 11453, 6221, 10608, 64943, 74280, + 10877, 118868, 64885, 74272, 0, 0, 128559, 120736, 74312, 345, 0, 74456, + 64606, 9917, 0, 92231, 5037, 0, 1776, 8422, 0, 118814, 41508, 41201, 323, + 43328, 0, 42698, 1295, 194853, 4625, 0, 4630, 13117, 0, 128772, 65123, + 11293, 2668, 11288, 0, 42640, 65666, 2519, 92369, 65420, 92479, 0, 4252, + 5049, 42659, 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, + 0, 66702, 0, 12670, 1013, 0, 64919, 705, 0, 65422, 127803, 1183, 126519, + 7017, 42852, 0, 8157, 9736, 64503, 65418, 0, 983878, 74035, 0, 11913, + 73874, 6696, 0, 8920, 119298, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, + 0, 0, 10177, 73777, 1857, 194657, 4626, 8464, 8472, 0, 4629, 8499, 78321, + 78322, 4624, 7818, 119173, 0, 0, 7805, 0, 94007, 6935, 92292, 78325, + 78326, 78323, 43327, 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, + 0, 78336, 78339, 9543, 78335, 78332, 77832, 65849, 77831, 983961, 0, + 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 983459, 195062, 9949, + 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, 120617, 11439, + 41468, 983757, 0, 5292, 55272, 983883, 1939, 5302, 3970, 917879, 12455, + 1793, 0, 0, 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, 0, + 13219, 9569, 0, 74383, 0, 74197, 0, 5500, 8813, 0, 0, 74566, 5322, 0, + 78340, 43631, 5324, 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, + 3360, 78344, 11523, 0, 92488, 9926, 7197, 0, 68429, 42894, 41821, 1249, + 78360, 78361, 78356, 78358, 78353, 64899, 64763, 41149, 41807, 43162, + 41815, 41150, 0, 10571, 10096, 0, 0, 78074, 6947, 41152, 887, 9249, 6565, + 78510, 41990, 78509, 41811, 74466, 93966, 6670, 77882, 0, 0, 43092, + 43325, 0, 10168, 0, 9781, 128655, 9190, 0, 9666, 8269, 65944, 74005, + 13019, 11670, 69860, 315, 12813, 983458, 78432, 78256, 78351, 78352, 0, + 983657, 0, 0, 1378, 9509, 0, 0, 74475, 3066, 92220, 67847, 0, 92355, 0, + 78365, 8787, 120379, 194616, 41618, 194615, 78261, 194614, 0, 64652, 0, + 194612, 0, 78366, 42088, 0, 195061, 7176, 43756, 10137, 6121, 10995, + 78259, 74534, 8119, 64874, 917816, 127199, 194939, 0, 74525, 0, 0, 12930, + 1394, 74514, 0, 74515, 0, 118804, 2998, 9527, 120659, 65190, 12977, + 42090, 119165, 0, 119100, 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, + 3670, 128657, 194600, 0, 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, + 619, 4635, 65080, 0, 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, + 9366, 42790, 42006, 119115, 65327, 65326, 65325, 10757, 1507, 42216, + 65321, 65320, 65335, 65334, 65333, 65332, 65331, 42059, 65329, 42689, + 92427, 9128, 94045, 42073, 6785, 64590, 983830, 4371, 7196, 65318, 2035, + 65316, 4106, 65314, 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, + 41239, 43533, 78459, 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, + 4615, 12695, 127752, 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, + 69762, 66455, 64738, 3219, 68654, 983787, 0, 1037, 0, 2025, 128263, + 13098, 78442, 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, + 127191, 0, 0, 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 92327, + 7365, 983753, 120593, 13071, 0, 452, 41049, 42840, 6346, 2831, 5461, + 74596, 11465, 5212, 0, 64703, 119191, 42308, 7181, 0, 41332, 0, 12333, 0, + 1668, 0, 0, 0, 1187, 983385, 42628, 78575, 0, 128777, 0, 3240, 128518, + 12194, 0, 11591, 41065, 5323, 8166, 0, 0, 0, 74535, 1623, 65297, 128856, + 571, 0, 4918, 0, 5288, 127295, 8916, 65048, 1909, 8864, 0, 0, 10736, + 92508, 11571, 7615, 127300, 92296, 4237, 92576, 1035, 65815, 0, 7881, + 701, 65936, 3489, 0, 0, 120751, 11403, 0, 0, 127146, 3796, 6800, 0, 3994, + 11421, 0, 195076, 0, 983922, 0, 0, 64857, 128105, 2855, 127828, 66308, + 41621, 68214, 127283, 127817, 10654, 0, 119226, 12164, 3246, 7906, 43972, + 65847, 7182, 0, 13024, 194822, 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, + 2378, 43136, 127905, 8466, 983575, 9320, 8001, 1232, 8139, 11617, 0, 0, + 11409, 68373, 6382, 0, 64634, 128279, 0, 11612, 0, 67600, 2374, 94066, + 8475, 11609, 66313, 0, 0, 5286, 119297, 0, 0, 64925, 120283, 194584, + 118982, 194583, 7705, 11942, 11305, 194581, 3309, 0, 0, 0, 0, 6802, 0, + 41653, 1280, 1241, 7168, 12096, 0, 66615, 42565, 41651, 0, 0, 0, 41650, + 66507, 66470, 0, 12914, 41491, 66010, 119552, 6078, 9954, 0, 1475, + 119247, 9938, 6084, 917546, 41064, 41062, 0, 0, 3256, 10189, 42076, + 43252, 78823, 917906, 8727, 0, 65875, 0, 0, 127762, 10562, 74215, 43065, + 0, 0, 3248, 74297, 3261, 9015, 71351, 0, 3635, 64337, 983281, 0, 0, 7195, + 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613, 77909, 92420, 73997, 0, 0, + 119218, 7984, 8600, 74434, 127770, 4176, 70050, 2034, 92551, 120805, + 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649, 13149, 42145, 42798, + 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402, 42146, 94032, 74238, + 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812, 65379, 68386, 128185, + 1159, 0, 69729, 0, 0, 7178, 194632, 0, 41680, 0, 128203, 11534, 1514, + 11668, 67891, 9313, 7015, 0, 67877, 194567, 12989, 66474, 9368, 12848, + 1624, 43270, 0, 74278, 10818, 126644, 9953, 0, 78421, 1194, 3242, 9761, + 9555, 8598, 120299, 6169, 12871, 1551, 2798, 65176, 4958, 42752, 119025, + 0, 67875, 120301, 3495, 66648, 194768, 0, 68364, 983224, 4891, 0, 10641, + 0, 73746, 0, 68352, 0, 73787, 194829, 194633, 7199, 64955, 0, 0, 0, 0, 0, + 42685, 42679, 193, 0, 0, 0, 42667, 0, 5271, 92318, 92517, 118882, 1362, + 13297, 0, 128094, 0, 983331, 73789, 0, 6658, 4426, 0, 92628, 983842, + 92319, 7276, 42163, 5220, 0, 0, 983330, 2416, 3310, 42703, 0, 379, 0, + 43755, 0, 0, 3223, 65492, 1284, 194771, 4549, 0, 0, 983154, 127763, + 10807, 9558, 194613, 0, 8515, 8688, 12866, 65308, 3294, 983332, 8529, + 128101, 43385, 7564, 0, 43329, 0, 92458, 73757, 66456, 42359, 0, 2031, 0, + 7202, 0, 12676, 42729, 92198, 3215, 0, 7710, 1610, 73801, 0, 0, 65682, 0, + 120537, 65924, 9974, 228, 66354, 1501, 0, 64395, 5179, 7200, 6225, 0, + 65794, 1725, 65533, 8196, 7476, 74399, 0, 0, 7152, 8502, 5762, 1967, + 7483, 0, 0, 8104, 0, 7474, 77979, 0, 126507, 10414, 13001, 8141, 0, + 42537, 1557, 43594, 128642, 6330, 6805, 8631, 2545, 70052, 127166, 0, + 74190, 0, 0, 983786, 42762, 0, 42914, 1650, 262, 1637, 0, 7901, 3238, + 128173, 41861, 0, 128585, 65158, 10860, 94059, 43658, 7527, 0, 43319, + 6419, 0, 45, 0, 64588, 93989, 0, 119810, 7194, 5291, 0, 43666, 13129, 0, + 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620, 0, 0, 0, 983875, + 179, 65896, 0, 64756, 2853, 78443, 118813, 983890, 118996, 119009, 2850, + 8084, 983085, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, + 119843, 119842, 10398, 983056, 0, 8377, 127116, 8245, 68401, 3158, 92396, + 3983, 43656, 923, 119857, 119856, 292, 13002, 119845, 119844, 3221, 1763, + 92463, 4612, 119851, 119850, 7253, 127110, 68391, 0, 10782, 3637, 12996, + 43542, 0, 64578, 983675, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, + 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, + 983173, 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, + 74775, 127380, 983931, 92389, 74072, 55269, 0, 0, 983683, 2033, 78577, + 78576, 195026, 55254, 7740, 0, 0, 0, 73964, 0, 93988, 67612, 65674, + 128244, 94110, 41689, 0, 74006, 64909, 6646, 11790, 74019, 0, 128066, + 128031, 8561, 4573, 0, 5326, 0, 120605, 7230, 8257, 0, 8778, 41688, 0, + 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903, 66721, 11342, 128561, 0, + 0, 128226, 127001, 0, 11810, 13164, 10723, 967, 983951, 126469, 11946, 0, + 3257, 0, 12307, 1845, 983157, 43526, 0, 0, 1886, 42342, 10089, 870, 7648, + 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879, 43692, 4563, 0, 0, + 7591, 65887, 867, 9520, 872, 126607, 868, 873, 7642, 0, 869, 874, 7644, + 120674, 875, 790, 128303, 0, 0, 0, 66182, 983258, 5429, 195055, 66180, + 126480, 66181, 68452, 983289, 983248, 42067, 0, 5433, 10657, 7911, + 194622, 1547, 66176, 42012, 120576, 5425, 4977, 9999, 5317, 5423, 4611, + 0, 67637, 0, 9679, 74122, 0, 0, 0, 66194, 4418, 66184, 4628, 4245, + 119648, 0, 0, 1851, 0, 127189, 11908, 0, 9360, 118897, 983202, 42776, + 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809, 69881, 0, + 983142, 120604, 983052, 983882, 0, 983270, 0, 0, 7427, 9958, 4588, 43680, + 0, 74484, 194968, 2433, 0, 119622, 3352, 74363, 983885, 0, 793, 74404, 0, + 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, 118877, 0, 7837, + 917625, 818, 5337, 194628, 917621, 41376, 119978, 126576, 120594, 74086, + 917615, 917614, 917613, 10973, 66359, 1372, 127172, 917608, 4969, 1254, + 917605, 917604, 93967, 917602, 65228, 78221, 126612, 0, 2840, 0, 119982, + 983939, 0, 3245, 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 68016, 983265, + 917611, 127026, 128883, 0, 0, 43648, 120812, 0, 43322, 92662, 0, 0, + 64372, 92698, 3226, 655, 752, 7457, 7456, 7452, 3285, 128779, 127821, + 119988, 65610, 2391, 0, 92248, 671, 250, 7434, 618, 668, 610, 42800, + 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 0, 128266, + 64749, 67850, 2107, 0, 0, 4605, 128174, 983192, 43372, 65945, 128838, 0, + 119590, 0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0, + 128297, 0, 0, 0, 0, 11334, 43326, 12609, 11519, 11503, 5530, 5210, 0, + 4627, 983892, 5208, 0, 128842, 10332, 5218, 7976, 9156, 0, 3244, 5529, + 69647, 73894, 128852, 5432, 64965, 5527, 74033, 10516, 7790, 5528, 0, + 42140, 120281, 0, 0, 43545, 9887, 0, 4000, 7429, 7428, 665, 7424, 3206, + 120278, 7884, 0, 128566, 917989, 128666, 211, 2509, 128858, 120573, + 68672, 3220, 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, + 127258, 5852, 0, 0, 127259, 1708, 0, 983165, 2623, 11943, 0, 69226, 0, + 4698, 66509, 1066, 119921, 4701, 983876, 120285, 74225, 94111, 8267, 0, + 127265, 0, 7516, 0, 2625, 983977, 8034, 74309, 0, 3631, 10955, 7850, + 120293, 8416, 0, 0, 0, 43384, 12660, 0, 0, 0, 74850, 41069, 0, 128156, + 12099, 4310, 10032, 6252, 713, 7990, 0, 3990, 0, 983262, 66368, 5017, + 64956, 7071, 0, 119144, 1030, 118800, 983120, 9513, 41059, 9357, 0, 1773, + 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94, 1880, 74766, 983838, 8908, + 0, 128707, 65913, 78470, 10752, 13003, 0, 126572, 41307, 8732, 120338, 0, + 1757, 6964, 4696, 0, 120335, 64785, 7394, 3641, 5419, 128055, 0, 127883, + 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, 936, 13289, 69894, + 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 70064, 0, 12913, 74206, + 7529, 0, 128699, 983957, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, + 682, 66458, 41505, 0, 64743, 10593, 1703, 0, 983955, 8033, 69953, 0, + 9810, 127269, 0, 12970, 0, 42351, 10109, 917623, 0, 194693, 0, 92690, 0, + 0, 74291, 1965, 7069, 43312, 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, + 0, 0, 74239, 41317, 92614, 2091, 74545, 2090, 0, 9353, 7117, 2077, 77886, + 0, 10498, 2083, 77888, 0, 0, 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, + 9654, 12856, 6924, 0, 7066, 983719, 0, 128135, 41037, 42692, 7786, 12959, + 41039, 127483, 0, 680, 2302, 128200, 1181, 7056, 3174, 126516, 0, 92668, + 65665, 127375, 126506, 6920, 0, 92295, 0, 118965, 0, 64644, 126981, + 74119, 0, 41028, 0, 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, + 983566, 0, 40987, 4667, 0, 983932, 8828, 0, 0, 1246, 4746, 0, 0, 11021, + 4749, 92675, 0, 921, 4744, 0, 12702, 242, 0, 1566, 8217, 0, 64653, 78386, + 128121, 74036, 74505, 43274, 5313, 951, 0, 0, 983867, 7604, 983290, 4009, + 127816, 983710, 120562, 0, 983720, 64860, 119138, 119069, 0, 127370, + 4048, 983598, 0, 70024, 1646, 77890, 64534, 73995, 120705, 0, 119890, + 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, 2975, 74442, 9822, + 983935, 55220, 10084, 73943, 118840, 0, 917562, 194610, 3399, 9851, + 983717, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 71367, 0, 0, 1777, 9151, + 1137, 69767, 749, 42366, 0, 5385, 128574, 128218, 0, 0, 5989, 0, 0, + 128091, 0, 41685, 69223, 0, 9769, 41684, 983216, 519, 0, 11740, 5766, 0, + 0, 2600, 8848, 120138, 41297, 0, 3666, 74473, 41300, 74468, 65160, 0, + 69688, 69771, 74479, 0, 6558, 0, 0, 69765, 120750, 252, 0, 41302, 0, 0, + 0, 69763, 0, 11729, 8719, 9060, 0, 120139, 10761, 0, 0, 0, 118792, 11734, + 983223, 11730, 0, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, + 7764, 983714, 11094, 120825, 0, 983226, 4282, 8298, 0, 0, 0, 0, 0, 64449, + 0, 126650, 63854, 8456, 0, 74783, 65670, 0, 78250, 0, 7774, 10607, 9792, + 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, 3458, 4365, 70053, 983712, 3647, + 0, 2602, 128341, 0, 194707, 41135, 0, 0, 0, 64631, 172, 4971, 41219, + 41137, 1889, 7238, 6545, 126476, 92193, 7597, 10528, 0, 0, 3732, 73910, + 194588, 5344, 0, 43366, 43363, 9062, 119252, 0, 0, 0, 64479, 9232, 92596, + 0, 0, 194712, 10900, 41531, 1263, 3720, 12048, 0, 64292, 41524, 7227, + 119635, 6099, 41534, 0, 127354, 127345, 299, 917957, 8525, 127347, 3524, + 917565, 8831, 127349, 92564, 3075, 67867, 127352, 0, 66362, 0, 64353, 0, + 0, 5845, 0, 0, 0, 2581, 8200, 65114, 68460, 0, 43283, 5551, 0, 120735, + 983201, 6340, 118855, 0, 78134, 8680, 7204, 70065, 2588, 2914, 7011, + 55281, 0, 2471, 194631, 2883, 2749, 119563, 73774, 10913, 0, 0, 8666, + 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, 10928, 0, 41153, 41229, + 118967, 0, 3738, 94016, 0, 12711, 3181, 66212, 74289, 68472, 42857, 8262, + 983379, 0, 983222, 0, 42347, 12092, 9615, 7234, 74047, 983088, 0, 43744, + 0, 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 983126, 74461, 3218, + 120471, 74290, 120469, 64562, 120475, 8569, 11404, 11932, 73728, 3214, + 120461, 120468, 12128, 3207, 65486, 78729, 1901, 78727, 127326, 120460, + 7425, 3205, 68003, 78737, 78736, 78735, 43383, 69940, 65459, 2606, 78730, + 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 983321, 120737, 0, 983971, + 983320, 378, 2610, 0, 65079, 983325, 65695, 126559, 37, 7068, 0, 120480, + 120479, 3209, 120477, 0, 10638, 9768, 69952, 119909, 983399, 0, 0, 0, 0, + 65510, 0, 0, 5233, 983335, 64792, 983334, 0, 126633, 0, 7060, 9847, + 120144, 1685, 595, 0, 73971, 1292, 8940, 7380, 11088, 0, 10004, 126997, + 0, 6541, 0, 0, 0, 3243, 9014, 5606, 0, 538, 64620, 5602, 8467, 74391, + 6547, 128132, 8203, 78488, 983090, 8458, 65211, 8495, 119904, 0, 917552, + 779, 78314, 64367, 2465, 69901, 8193, 55279, 9730, 9280, 0, 7065, 74155, + 4346, 0, 73798, 504, 0, 92414, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, + 732, 3737, 127253, 1548, 68650, 92507, 1832, 5604, 5735, 41141, 119020, + 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 983304, 3869, 11937, 5725, + 127539, 1783, 68648, 5728, 0, 0, 0, 11918, 66567, 5724, 0, 5727, 78521, + 0, 0, 764, 0, 128116, 43531, 0, 9033, 0, 42532, 6223, 11042, 120749, + 11423, 0, 119861, 71344, 43465, 0, 128267, 6559, 64557, 71348, 92649, + 120648, 43019, 43477, 10238, 74491, 0, 43377, 92282, 71346, 1478, 9783, + 11825, 2607, 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 70058, + 41144, 0, 92438, 43537, 6761, 10093, 4369, 917791, 0, 983148, 8820, 3947, + 0, 0, 11515, 526, 128103, 41295, 194603, 917785, 194932, 0, 7688, 917786, + 7686, 8288, 11815, 0, 0, 983382, 1543, 3713, 41221, 12423, 42281, 917788, + 74024, 12293, 0, 64357, 11794, 42082, 0, 1737, 8987, 42081, 0, 7205, 0, + 9335, 12850, 119870, 6553, 7055, 0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, + 12990, 1160, 42084, 119650, 41217, 119660, 10018, 360, 0, 0, 68176, 5863, + 3137, 0, 4147, 983170, 41216, 7844, 2616, 119190, 68461, 65234, 983294, + 13076, 3135, 983287, 78143, 119139, 3142, 92451, 94068, 10819, 119580, + 10183, 0, 2608, 1470, 73967, 94008, 6227, 0, 127173, 69741, 983582, 6163, + 983558, 0, 127314, 0, 0, 8603, 0, 119866, 3306, 10876, 43392, 119573, + 127931, 5751, 0, 6222, 0, 0, 12086, 7403, 1600, 64309, 64939, 0, 64783, + 92658, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, + 6974, 0, 0, 983211, 5002, 0, 41286, 69946, 127019, 0, 43585, 0, 6551, + 983962, 128229, 0, 41289, 0, 194602, 0, 8977, 602, 120814, 0, 128778, + 128661, 0, 983375, 41279, 0, 0, 0, 11081, 43615, 0, 0, 0, 983612, 12727, + 0, 0, 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, 7831, 983829, + 194571, 0, 73915, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 43584, + 0, 13113, 0, 127757, 2393, 7058, 9087, 74067, 68673, 41574, 78337, 0, + 74058, 6376, 0, 0, 0, 0, 9854, 127748, 64696, 0, 128220, 0, 6994, 0, + 1720, 0, 0, 0, 6529, 7063, 983182, 3751, 9120, 983485, 0, 1798, 709, 0, + 1354, 1876, 13152, 6557, 12430, 8137, 94098, 92642, 0, 0, 245, 128097, + 11456, 41233, 7070, 0, 94046, 6136, 917609, 65677, 8682, 41235, 92595, + 42045, 9804, 118963, 432, 3595, 194945, 65437, 0, 74455, 42399, 0, 0, + 128274, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052, 64888, 7167, 2356, 95, + 74784, 10580, 0, 42286, 0, 64640, 0, 94109, 0, 74137, 70035, 10063, + 12652, 12199, 92480, 0, 2566, 11971, 983737, 0, 1065, 0, 0, 43400, 2576, + 66696, 93999, 0, 43604, 0, 0, 74082, 514, 74502, 70032, 2921, 43215, + 64493, 5772, 12968, 70055, 194944, 74580, 43398, 2580, 983810, 41341, + 41223, 6564, 1463, 41342, 0, 5293, 70020, 0, 3733, 11346, 0, 12054, 0, + 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0, 127025, 0, 74821, 0, 983733, + 119042, 0, 127865, 13090, 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, + 42569, 127824, 0, 64761, 0, 41021, 8510, 42432, 0, 0, 194782, 0, 64496, + 74109, 70030, 9915, 0, 983218, 7061, 41336, 3854, 69700, 13141, 68413, + 43401, 42319, 13082, 0, 7067, 68221, 0, 127383, 127171, 0, 0, 127797, + 9029, 43543, 119315, 2353, 6308, 0, 74792, 2611, 119186, 0, 0, 0, 43664, + 92399, 66627, 0, 4484, 8509, 118976, 11066, 65233, 0, 41224, 41017, 0, + 3747, 10522, 0, 0, 1691, 41226, 0, 12107, 7100, 10905, 65010, 194986, + 697, 66018, 9284, 4244, 0, 0, 92644, 13121, 120036, 0, 12010, 128573, + 128221, 0, 0, 0, 127193, 65816, 68111, 0, 127933, 65668, 92257, 6618, + 118784, 66365, 0, 42234, 12648, 78110, 7123, 70038, 5785, 9198, 9764, + 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, 128258, 0, 0, 0, 13122, 0, + 191, 70060, 8585, 8000, 64411, 120652, 42889, 64850, 41072, 41578, 0, + 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683, 396, 41580, 68146, 0, + 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0, 4743, 0, 0, 74040, + 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 71349, 0, 3964, 6592, 0, + 128693, 66040, 0, 42568, 69806, 128113, 1778, 3956, 0, 42070, 6563, + 43075, 9018, 94006, 983396, 12067, 41312, 0, 5547, 74531, 127969, 0, + 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750, + 0, 4394, 68368, 1807, 983888, 92298, 0, 5889, 0, 7180, 0, 119145, 0, + 917558, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, + 65230, 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, 3975, 0, + 74087, 0, 12672, 3798, 2703, 983599, 0, 2109, 9774, 1275, 0, 0, 41095, + 3962, 0, 2932, 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, + 41851, 128230, 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 128032, 0, 42531, 119108, 1510, 0, 8256, 0, 11393, 0, 8879, 128075, 92474, 8770, 0, 0, 78377, 1910, 8671, 78374, 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, 65106, 42761, 12857, 4581, 8411, @@ -19238,28 +19256,28 @@ 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 126642, 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, 120535, 0, 8630, 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 71336, 0, 0, 0, 64293, - 68098, 2635, 0, 0, 983837, 0, 983632, 7835, 70040, 0, 194988, 92285, + 68098, 2635, 0, 0, 983846, 0, 983641, 7835, 70040, 0, 194988, 92285, 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 983102, 0, 0, 70033, 4011, - 917616, 68101, 0, 7864, 4254, 65095, 983489, 5600, 3903, 127083, 10447, + 917616, 68101, 0, 7864, 4254, 65095, 983496, 5600, 3903, 127083, 10447, 5598, 1207, 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, - 194778, 194772, 9321, 983477, 983474, 983475, 0, 1719, 68356, 68354, - 9671, 1125, 4399, 127479, 917610, 983481, 7631, 5488, 7128, 120532, 0, + 194778, 194772, 9321, 983484, 983481, 983482, 0, 1719, 68356, 68354, + 9671, 1125, 4399, 127479, 917610, 983488, 7631, 5488, 7128, 120532, 0, 5491, 0, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, 11768, 43043, 6300, 0, 7122, 0, 4390, 454, 41397, 0, 9875, 7593, 194791, 92274, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, 120037, 0, 43423, 128683, 11989, 0, 0, 0, 0, 0, 8249, 128172, 0, 78531, 6640, 74806, 2598, - 513, 0, 6586, 8656, 0, 120710, 65008, 0, 194784, 194989, 194795, 983466, - 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983470, - 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983462, - 74486, 983460, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437, + 513, 0, 6586, 8656, 0, 120710, 65008, 0, 194784, 194989, 194795, 983473, + 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983477, + 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983469, + 74486, 983467, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437, 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, 11907, 195000, 5690, 92255, 93992, 0, 43181, 13095, 0, 127857, 64498, 0, 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, 0, 0, 0, 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, 5226, 12602, 94044, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725, 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233, - 127490, 983434, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524, - 41175, 983441, 983438, 983439, 5296, 983437, 42492, 43402, 92466, 3302, + 127490, 983441, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524, + 41175, 983448, 983445, 983446, 5296, 983444, 42492, 43402, 92466, 3302, 0, 0, 6516, 6515, 6514, 6513, 6512, 0, 7856, 8690, 0, 0, 12122, 119602, 43976, 0, 1785, 69925, 68622, 65153, 194810, 5138, 0, 0, 118869, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322, 4643, 5132, 0, 6389, 128533, 5143, 0, @@ -19267,7 +19285,7 @@ 127012, 10270, 10286, 10318, 10382, 43529, 66477, 0, 0, 74170, 0, 3234, 0, 0, 74376, 43139, 118815, 127084, 120627, 8767, 0, 74489, 9695, 120746, 5201, 0, 6215, 12714, 6214, 13101, 0, 194999, 65268, 0, 0, 0, 11027, 0, - 10059, 10511, 42075, 9767, 789, 1749, 78890, 127071, 983661, 320, 0, + 10059, 10511, 42075, 9767, 789, 1749, 78890, 127071, 983670, 320, 0, 8647, 0, 3049, 0, 6471, 42071, 43156, 9925, 127356, 127355, 66478, 4960, 5549, 127359, 127346, 8485, 4671, 5418, 127350, 3351, 127006, 127351, 10610, 5414, 3064, 6212, 4286, 5421, 127344, 9554, 0, 94048, 127109, @@ -19275,9 +19293,9 @@ 12603, 7131, 11430, 4566, 7518, 9317, 3801, 10342, 10406, 0, 119259, 42576, 0, 5200, 126611, 917948, 0, 9183, 127361, 74458, 73825, 395, 5482, 5198, 4349, 10390, 74202, 5196, 43224, 6113, 42009, 5205, 0, 43307, 0, - 118973, 0, 12134, 0, 0, 118843, 9126, 435, 0, 12014, 10377, 8093, 9079, - 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, 128178, 5738, - 983214, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260, + 118973, 0, 12134, 0, 0, 118843, 9126, 435, 983624, 12014, 10377, 8093, + 9079, 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, 128178, 5738, + 983215, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260, 3149, 5359, 120134, 0, 7914, 5357, 92170, 128659, 2624, 5364, 0, 11431, 120030, 9101, 11058, 78288, 0, 78293, 42271, 78289, 42917, 120793, 0, 65566, 6717, 10619, 43360, 78385, 78384, 11832, 78382, 78381, 78380, @@ -19312,30 +19330,30 @@ 55252, 73972, 1442, 0, 5894, 70069, 0, 41171, 92511, 74313, 0, 13162, 0, 3334, 195010, 118803, 77881, 66022, 0, 0, 1651, 128771, 8861, 0, 0, 1142, 0, 8271, 0, 983058, 126645, 12903, 0, 4002, 43626, 10442, 10676, 3344, 0, - 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, 78854, + 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 194686, 78853, 0, 78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, 120359, 11012, 0, 78856, 92400, 77879, 4973, 8784, 77877, 74804, 77874, 77869, 77871, 42440, 0, 43118, 0, 42364, 6774, 6773, 917560, 120369, 10346, 10410, 78859, 9243, 2464, 74263, 6108, 3372, 0, 6247, 43117, 74526, 7121, 74166, 0, 120355, 92537, 0, 0, 195034, 0, 0, 0, 70083, 3354, 195037, 4192, 9289, 118999, 41191, 3876, 0, 70067, 120660, 43696, 43380, 0, 983091, 0, 0, 11603, - 983945, 0, 6589, 128588, 194679, 0, 0, 983691, 0, 0, 42572, 128264, + 983954, 0, 6589, 128588, 194679, 0, 0, 983700, 0, 0, 42572, 128264, 10630, 74827, 1963, 11622, 127098, 11654, 0, 7550, 10686, 5903, 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 5542, 11013, 127927, 128300, - 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 983664, 43367, 64579, + 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 983673, 43367, 64579, 917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416, 12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 983605, - 9532, 66355, 0, 983229, 917925, 64343, 195032, 128281, 195031, 0, 195030, + 9532, 66355, 0, 983234, 917925, 64343, 195032, 128281, 195031, 0, 195030, 195057, 11445, 0, 2112, 195056, 128814, 10185, 1021, 128130, 9507, 10210, 74544, 8023, 1200, 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493, 3343, 4424, 11047, 1885, 43268, 3896, 78444, 66497, 2947, 392, 7894, 4391, 68139, 983062, 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239, - 11791, 0, 0, 8221, 78307, 41864, 0, 0, 0, 0, 167, 983897, 78301, 983644, - 74211, 41897, 68477, 0, 917583, 983625, 94065, 2493, 0, 118811, 0, 0, + 11791, 0, 0, 8221, 78307, 41864, 0, 0, 0, 0, 167, 983906, 78301, 983653, + 74211, 41897, 68477, 0, 917583, 983634, 94065, 2493, 0, 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, 0, 92450, 0, 917573, 43030, 42027, 12114, 0, 917579, 64936, 194695, 0, 120629, 10561, 0, 8365, 120539, - 983765, 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0, + 983774, 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0, 128086, 92566, 69910, 4817, 78446, 194759, 92536, 7043, 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761, 12343, 657, @@ -19345,14 +19363,14 @@ 41406, 43273, 74160, 119983, 73939, 92638, 119984, 119979, 41404, 1165, 119980, 4451, 13087, 0, 11284, 119987, 70097, 65155, 43014, 5439, 9363, 70070, 3375, 128869, 5900, 93990, 7889, 2722, 42262, 0, 0, 128774, 0, - 2282, 0, 127810, 11401, 983813, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, - 127887, 0, 127381, 4868, 119967, 119966, 118798, 0, 0, 43161, 0, 92360, - 0, 5182, 0, 120542, 0, 0, 4226, 119243, 12135, 5732, 4464, 0, 71330, 977, + 2282, 0, 127810, 11401, 983822, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, + 127887, 0, 127381, 4868, 8297, 119966, 118798, 0, 0, 43161, 0, 92360, 0, + 5182, 0, 120542, 0, 0, 4226, 119243, 12135, 5732, 4464, 0, 71330, 977, 4458, 0, 0, 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, 786, 0, 43174, 64340, 0, 194767, 120723, 43026, 7612, 10132, 64413, 65025, 0, 0, 0, 93956, 0, 68444, 0, 92437, 0, 119160, 10204, 92656, 0, - 127809, 983635, 1399, 983643, 65217, 0, 8852, 128571, 241, 128780, 4907, - 0, 983630, 7932, 9727, 128873, 74255, 8748, 0, 0, 983634, 0, 42780, 0, 0, + 127809, 983644, 1399, 983652, 65217, 0, 8852, 128571, 241, 128780, 4907, + 0, 983639, 7932, 9727, 128873, 74255, 8748, 0, 0, 983643, 0, 42780, 0, 0, 0, 4217, 0, 8650, 0, 0, 0, 69900, 118872, 43099, 3965, 119119, 6719, 0, 13300, 78439, 93971, 43057, 66588, 118991, 0, 0, 73815, 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, 43188, 2626, 7762, 0, @@ -19360,45 +19378,45 @@ 66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0, 74311, 78497, 0, 10181, 0, 43624, 0, 7779, 0, 10195, 9479, 6029, 0, 92268, 9689, 0, 65577, 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, 69787, 2030, 0, - 6027, 8370, 4322, 0, 65207, 0, 983332, 983331, 983330, 983329, 2735, + 6027, 8370, 4322, 0, 65207, 0, 983339, 983338, 983337, 983336, 2735, 42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, - 983919, 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, - 7709, 41112, 983132, 66560, 42041, 4572, 12876, 66561, 983749, 6758, - 983917, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983321, 70100, - 983319, 7260, 983317, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616, + 983928, 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, + 7709, 41112, 983132, 66560, 42041, 4572, 12876, 66561, 983758, 6758, + 983926, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983328, 70100, + 983326, 7260, 983324, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, 0, 0, 0, 127060, 65828, 0, 283, 68665, 78813, - 532, 78663, 0, 983787, 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, - 73767, 0, 10741, 0, 2298, 0, 983908, 65495, 64706, 983311, 43344, 983309, - 7144, 9466, 78866, 9824, 983304, 983303, 0, 0, 915, 43425, 0, 0, 0, 0, + 532, 78663, 0, 983796, 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, + 73767, 0, 10741, 0, 2298, 0, 983917, 65495, 64706, 983318, 43344, 983316, + 7144, 9466, 78866, 9824, 983311, 983310, 0, 0, 915, 43425, 0, 0, 0, 0, 127178, 43264, 70096, 0, 0, 43038, 78864, 6730, 78862, 68161, 64550, 5186, 7360, 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, - 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983298, - 11718, 983296, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232, + 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983305, + 11718, 983303, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232, 65483, 0, 12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, 0, 64593, 512, 3376, 68210, 0, 128677, 77892, 632, 12940, 77891, - 42529, 78587, 0, 5957, 110593, 8926, 983292, 983291, 128273, 10745, + 42529, 78587, 0, 5957, 110593, 8926, 983299, 983298, 128273, 10745, 10174, 7379, 64581, 5386, 120686, 11713, 10633, 69708, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 71307, 128038, 0, 0, 127174, 64278, 92370, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, 119029, 0, 73823, 0, - 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 983279, 983278, - 128570, 12106, 983275, 74207, 1755, 10482, 12863, 77898, 1163, 2951, + 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 983286, 983285, + 128570, 12106, 983282, 74207, 1755, 10482, 12863, 77898, 1163, 2951, 9522, 74079, 78266, 66604, 0, 3384, 69227, 10702, 830, 77902, 77899, 77900, 8451, 0, 0, 0, 69739, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0, - 12239, 0, 0, 4441, 0, 983272, 73940, 64352, 127513, 983268, 411, 983266, - 9199, 983264, 4056, 118992, 41890, 0, 2730, 41604, 983928, 5428, 194743, + 12239, 0, 0, 4441, 0, 983279, 73940, 64352, 127513, 983275, 411, 983273, + 9199, 983271, 4056, 118992, 41890, 0, 2730, 41604, 983937, 5428, 194743, 3364, 42265, 64437, 127935, 118816, 194742, 9684, 216, 0, 1401, 128053, 44012, 0, 0, 92585, 9158, 77842, 69905, 5768, 0, 0, 0, 484, 194739, 0, 0, - 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983256, 93962, 2794, + 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983263, 93962, 2794, 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, 77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 78717, 0, 981, 0, 4330, 73929, 120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547, - 128259, 674, 63991, 983244, 2946, 5354, 5251, 5328, 5307, 3759, 11411, + 128259, 674, 63991, 983249, 2946, 5354, 5251, 5328, 5307, 3759, 11411, 8364, 5123, 119628, 5281, 5469, 5121, 119245, 118993, 0, 5130, 0, 0, 77990, 0, 120726, 1221, 2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033, 9230, 5939, 195052, 0, 0, 120677, 68400, 7278, 10321, 10289, 64613, - 10385, 41706, 0, 0, 983406, 0, 11739, 983419, 41981, 0, 5938, 0, 43766, + 10385, 41706, 0, 0, 983413, 0, 11739, 983426, 41981, 0, 5938, 0, 43766, 12448, 7576, 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0, - 41703, 983629, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 92457, 0, + 41703, 983638, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 92457, 0, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 128340, 0, 0, 0, 10970, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 92345, 11468, 64636, 7575, 0, 2724, 0, 0, 12313, 110592, 515, 119947, 42791, 63987, 78286, 119943, @@ -19408,73 +19426,73 @@ 0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, 66198, 41880, 66188, 11623, 78148, 11955, 66190, 66191, 41111, 66189, 73788, 7788, 4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259, - 78158, 128036, 5278, 4945, 42883, 4950, 983431, 68625, 983429, 7269, 0, - 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983422, 443, - 983420, 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, - 194931, 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, 41304, - 824, 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, 119820, - 119819, 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 69947, 119832, - 4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170, - 78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024, - 1855, 983405, 68669, 983403, 92445, 127554, 0, 127339, 119652, 2745, - 11797, 983411, 128159, 9202, 4654, 983407, 983409, 68638, 73993, 10525, - 4649, 65209, 983410, 0, 4648, 43080, 983399, 983400, 983397, 6246, 64950, - 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, 43187, 8669, - 983408, 6821, 65093, 0, 78881, 2716, 0, 983060, 983412, 0, 68369, 120054, - 11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, 4662, 78033, 78032, - 9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, 10130, 68450, 7811, - 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 983404, - 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054, - 194956, 9744, 78860, 7605, 4622, 119656, 983388, 94070, 983386, 983387, - 983384, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883, - 983379, 41732, 4616, 10518, 10423, 10359, 983373, 5958, 0, 983426, 4215, - 9789, 917941, 4321, 4621, 983382, 41313, 522, 5368, 0, 65803, 0, 5366, - 12201, 5372, 0, 983402, 0, 7720, 7390, 2696, 983393, 0, 4638, 983398, - 1790, 78242, 5965, 64363, 66569, 68646, 127833, 5376, 1835, 5335, 194966, - 128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, 42094, - 5331, 4634, 11928, 983594, 5338, 4637, 128170, 5971, 42414, 0, 1268, - 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, - 983367, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, - 74384, 983371, 68377, 6248, 983355, 983356, 983353, 42318, 92582, 5229, + 78158, 128036, 5278, 4945, 42883, 4950, 983438, 68625, 983436, 7269, 0, + 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983429, 443, + 983427, 4944, 5467, 119603, 983254, 65137, 6044, 65392, 0, 4213, 0, + 41303, 0, 194931, 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, + 41304, 824, 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, + 119820, 119819, 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 69947, + 119832, 4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, + 78170, 78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, + 127024, 1855, 983412, 68669, 983410, 92445, 127554, 0, 127339, 119652, + 2745, 11797, 983418, 128159, 9202, 4654, 983414, 983416, 68638, 73993, + 10525, 4649, 65209, 983417, 0, 4648, 43080, 983406, 983407, 983404, 6246, + 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, 43187, + 8669, 983415, 6821, 65093, 0, 78881, 2716, 0, 983060, 983419, 0, 68369, + 120054, 11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, 4662, 78033, + 78032, 9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, 10130, 68450, + 7811, 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, + 983411, 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, + 3054, 194956, 9744, 78860, 7605, 4622, 119656, 983395, 94070, 983393, + 983394, 983391, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, + 78883, 983386, 41732, 4616, 10518, 10423, 10359, 983380, 5958, 0, 983433, + 4215, 9789, 917941, 4321, 4621, 983389, 41313, 522, 5368, 0, 65803, 0, + 5366, 12201, 5372, 0, 983409, 0, 7720, 7390, 2696, 983400, 0, 4638, + 983405, 1790, 78242, 5965, 64363, 66569, 68646, 127833, 5376, 1835, 5335, + 194966, 128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, + 42094, 5331, 4634, 11928, 983594, 5338, 4637, 128170, 5971, 42414, 0, + 1268, 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, + 4758, 983374, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, + 74384, 983378, 68377, 6248, 983362, 983363, 983360, 42318, 92582, 5229, 4757, 0, 0, 2728, 4752, 64563, 65235, 5234, 0, 128145, 0, 10713, 7166, 0, 2622, 7460, 127302, 0, 0, 8954, 74760, 65189, 2632, 42617, 10108, 1011, 5574, 1853, 2709, 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, - 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983413, - 983863, 194907, 44003, 0, 983473, 983416, 120498, 127851, 195009, 983856, - 74022, 983415, 64609, 68643, 120634, 983482, 5721, 983394, 5519, 8632, - 66465, 11267, 73961, 92278, 5720, 983345, 1692, 4219, 4610, 8696, 4305, - 0, 4609, 43478, 4614, 541, 983348, 5287, 5309, 5285, 68389, 5961, 4647, - 56, 4216, 10577, 41381, 601, 4613, 983342, 983339, 77849, 4608, 64260, + 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983420, + 983872, 194907, 44003, 0, 983480, 983423, 120498, 127851, 195009, 983865, + 74022, 983422, 64609, 68643, 120634, 983489, 5721, 983401, 5519, 8632, + 66465, 11267, 73961, 92278, 5720, 983352, 1692, 4219, 4610, 8696, 4305, + 0, 4609, 43478, 4614, 541, 983355, 5287, 5309, 5285, 68389, 5961, 4647, + 56, 4216, 10577, 41381, 601, 4613, 983349, 983346, 77849, 4608, 64260, 41124, 5190, 67628, 0, 68145, 7086, 0, 67998, 67620, 0, 2734, 11074, 0, 67627, 43593, 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114, 119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392, 6239, 119956, 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254, 128047, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724, - 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 983831, 4869, 120563, 0, - 4223, 128201, 6650, 126509, 0, 983456, 127890, 4870, 120445, 68661, 6716, + 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 983840, 4869, 120563, 0, + 4223, 128201, 6650, 126509, 0, 983463, 127890, 4870, 120445, 68661, 6716, 78176, 68667, 68382, 68676, 127925, 10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, 2732, 42734, 745, 0, 195097, 92195, 4777, 7821, 0, 68631, - 42775, 0, 194954, 0, 3097, 0, 5966, 983479, 4778, 0, 10863, 0, 4781, 0, + 42775, 0, 194954, 0, 3097, 0, 5966, 983486, 4778, 0, 10863, 0, 4781, 0, 64407, 0, 128323, 8577, 128562, 68196, 43285, 10216, 4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776, 73818, 11492, 8700, 0, 13176, 68363, 10426, 0, 917599, 10362, 194706, 1715, 4849, 8242, 9561, 73922, 43278, 42635, 0, 0, 5963, 917926, 0, 0, 4850, 0, 1607, 466, 4853, 118995, - 4854, 127918, 5164, 983861, 1350, 5124, 64420, 1993, 5362, 8471, 2708, + 4854, 127918, 5164, 983870, 1350, 5124, 64420, 1993, 5362, 8471, 2708, 92471, 12445, 3785, 234, 3199, 0, 41268, 4848, 2530, 917909, 2068, 1964, 0, 73762, 10458, 0, 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, 4797, - 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 983417, 303, 983101, 92622, - 983418, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441, + 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 983424, 303, 983101, 92622, + 983425, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441, 10739, 65090, 0, 119327, 126541, 2451, 2714, 119326, 0, 43379, 4937, 43376, 753, 5849, 10597, 43089, 11722, 9248, 92555, 42879, 11725, 0, 0, 2726, 3107, 73958, 4941, 64937, 119233, 9140, 1408, 5261, 4607, 0, 181, - 983423, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, + 983430, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, 983601, 0, 4964, 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500, 0, 119024, 78028, 92408, 9830, 43642, 389, 10893, 7521, 127879, 4872, 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, - 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983432, 78714, 64191, + 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983439, 78714, 64191, 64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805, - 41031, 78801, 11960, 6745, 3082, 983430, 78539, 73919, 10573, 41744, + 41031, 78801, 11960, 6745, 3082, 983437, 78539, 73919, 10573, 41744, 7079, 5856, 127043, 5163, 78809, 128162, 1817, 66724, 78538, 0, 10564, 7763, 13077, 41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, 41814, 4248, 0, 0, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 126471, @@ -19487,33 +19505,33 @@ 65222, 6998, 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, 1146, 5065, 69890, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, 0, 78200, 78201, 5062, 1264, 64817, 13254, 11697, 126598, 9785, 64716, 0, - 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983864, + 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983873, 42130, 0, 5151, 917829, 917823, 0, 93980, 0, 7620, 3800, 65122, 0, 0, 8355, 7854, 0, 954, 64927, 4185, 41045, 127141, 41438, 41439, 68666, - 10711, 4593, 127745, 120584, 983401, 64774, 8053, 10532, 66727, 0, 0, 0, + 10711, 4593, 127745, 120584, 983408, 64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, 5166, 9888, 127800, 5148, 42834, 0, 78205, 78206, 43787, 78204, 64131, 3119, 917814, 0, 3060, 64135, 9986, 0, 77876, 636, 11698, - 0, 983444, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431, - 119960, 1477, 43289, 0, 74358, 8618, 983395, 9908, 983972, 0, 0, 3937, - 12312, 0, 983396, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244, - 92209, 71341, 3935, 120665, 983469, 0, 11950, 5392, 42248, 65129, 68656, + 0, 983451, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431, + 119960, 1477, 43289, 0, 74358, 8618, 983402, 9908, 983981, 0, 0, 3937, + 12312, 0, 983403, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244, + 92209, 71341, 3935, 120665, 983476, 0, 11950, 5392, 42248, 65129, 68656, 5397, 0, 12046, 12599, 0, 128261, 5395, 0, 5393, 354, 68615, 119948, 78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 0, 128874, 0, 0, 43297, 983079, 4311, 4644, 8818, 0, 128186, 0, 7145, 3918, 66452, 3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, 813, 119945, 68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, 42117, 92287, - 128224, 0, 0, 74046, 43745, 4911, 988, 917807, 0, 983461, 43061, 7054, + 128224, 0, 0, 74046, 43745, 4911, 988, 917807, 0, 983468, 43061, 7054, 64147, 0, 64920, 68195, 6698, 118933, 92506, 0, 120006, 11981, 12202, 0, 11032, 67654, 6093, 11608, 975, 68662, 65843, 170, 0, 0, 4169, 0, 41859, 6058, 120401, 13203, 120657, 0, 0, 68657, 9818, 10178, 10324, 42106, 5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, 4742, 120564, 92391, - 73736, 983357, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, - 42108, 983347, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, - 917916, 127331, 65549, 9496, 64598, 118866, 983359, 7876, 68132, 917872, + 73736, 983364, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, + 42108, 983354, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, + 917916, 127331, 65549, 9496, 64598, 118866, 983366, 7876, 68132, 917872, 3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, 4171, 12008, 6251, 3923, 1490, 0, 119591, 126512, 40972, 5245, 0, 10114, 42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849, - 4825, 69240, 917852, 68655, 0, 983381, 0, 0, 68628, 983340, 9850, 118937, + 4825, 69240, 917852, 68655, 0, 983388, 0, 0, 68628, 983347, 9850, 118937, 367, 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 126626, 64101, 0, 0, 4824, 10614, 119659, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012, @@ -19522,12 +19540,12 @@ 64118, 126998, 12962, 0, 126580, 4017, 12827, 5241, 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, 126641, 66202, 8957, 4139, 0, 0, 0, 0, - 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983376, 4726, 0, - 194892, 0, 128321, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0, - 128294, 64212, 41020, 1382, 64209, 64216, 44002, 64214, 1656, 41831, 0, - 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, 41845, - 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, 0, - 7935, 2420, 0, 1114, 92599, 67585, 70104, 120053, 92350, 120051, 3938, + 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983383, 4726, 0, + 194892, 983622, 128321, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, + 0, 128294, 64212, 41020, 1382, 64209, 64216, 44002, 64214, 1656, 41831, + 0, 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, + 41845, 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, + 0, 7935, 2420, 0, 1114, 92599, 67585, 70104, 120053, 92350, 120051, 3938, 120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955, 6452, 4713, 128196, 66249, 917885, 917890, 917891, 65152, 719, 120044, 78623, 120042, 6713, 4532, 65412, 69822, 10868, 4717, 2349, 5902, 66450, @@ -19539,26 +19557,26 @@ 4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 71335, 414, 65404, 0, 195027, 6456, 73820, 0, 6691, 42193, 92225, 128171, 0, 74495, 0, 0, 0, 118820, 9751, 65407, 128085, 11770, 3919, 0, 0, 65061, 0, 0, 0, 12235, 0, 0, - 127233, 64092, 983463, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454, + 127233, 64092, 983470, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454, 127888, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732, - 78116, 0, 983139, 0, 983074, 8896, 0, 375, 6976, 66582, 119005, 983865, - 0, 983427, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529, - 119200, 119201, 119198, 119199, 69692, 983425, 69698, 13150, 64492, 0, 0, + 78116, 0, 983139, 0, 983074, 8896, 0, 375, 6976, 66582, 119005, 983874, + 0, 983434, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529, + 119200, 119201, 119198, 119199, 69692, 983432, 69698, 13150, 64492, 0, 0, 2291, 12902, 0, 42891, 66327, 74298, 917857, 10799, 69690, 2587, 66372, 0, 4193, 92250, 4241, 983057, 7998, 0, 0, 0, 126640, 2316, 118821, 0, 0, - 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 983877, 3762, 10015, 120672, + 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 983886, 3762, 10015, 120672, 119232, 0, 41590, 0, 70098, 3780, 7485, 5779, 0, 42037, 0, 3906, 12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, 0, 0, 0, 0, 0, 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, - 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 983743, 119237, 0, 128805, + 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 983752, 119237, 0, 128805, 4470, 11826, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0, - 5377, 120585, 68143, 1688, 78245, 983349, 69685, 983747, 0, 0, 44020, + 5377, 120585, 68143, 1688, 78245, 983356, 69685, 983756, 0, 0, 44020, 6808, 41319, 1300, 10650, 41692, 64505, 2290, 0, 119624, 1465, 10850, 3943, 0, 41205, 41315, 118961, 0, 0, 5352, 0, 0, 8839, 41314, 7384, 7785, 41204, 127322, 41209, 69637, 92241, 43607, 0, 0, 5420, 3897, 10134, 0, 74417, 4018, 7150, 68127, 0, 0, 0, 0, 127526, 2561, 68621, 3542, 7148, 12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, 78751, 7146, 0, 65150, - 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 983428, 69641, 10753, + 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 983435, 69641, 10753, 10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, 0, 0, 67996, 2020, 0, 4022, 128783, 0, 77923, 126593, 41691, 0, 0, 74329, 0, 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, @@ -19573,7 +19591,7 @@ 68675, 128054, 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0, 0, 65292, 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879, 55223, 0, 128071, 41826, 8865, 6402, 0, 13279, 7917, 74755, 0, 7733, 0, - 4998, 983887, 92332, 41950, 0, 4268, 0, 0, 70061, 4013, 0, 10881, 0, 0, + 4998, 983896, 92332, 41950, 0, 4268, 0, 0, 70061, 4013, 0, 10881, 0, 0, 0, 74788, 2014, 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949, 0, 0, 0, 2015, 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 10135, 65909, 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833, @@ -19592,9 +19610,9 @@ 9425, 9426, 9427, 9428, 9429, 64758, 2362, 9655, 0, 2004, 9096, 9782, 128848, 9172, 128545, 19965, 0, 5955, 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 92448, 65210, 8798, 0, 92165, 1392, 0, 0, 127364, 10606, 8065, - 118805, 10353, 10417, 0, 0, 64524, 92418, 4019, 0, 983281, 43280, 8219, - 68402, 1812, 119963, 983683, 0, 126488, 42410, 74448, 119132, 6054, - 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983254, 68678, + 118805, 10353, 10417, 0, 0, 64524, 92418, 4019, 0, 983288, 43280, 8219, + 68402, 1812, 119963, 983692, 0, 126488, 42410, 74448, 119132, 6054, + 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983261, 68678, 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775, 64760, 11766, 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, 36, 0, 5153, 41805, 0, 73735, 763, 41808, 64910, 983130, 2009, 0, 0, 127142, @@ -19609,7 +19627,7 @@ 78002, 0, 7513, 1863, 4710, 0, 5956, 7621, 78006, 92624, 4705, 716, 78004, 0, 4704, 120040, 120270, 42241, 161, 43977, 74546, 66214, 4706, 0, 69914, 42672, 4709, 10680, 119065, 43293, 119944, 0, 119164, 120328, - 92467, 10187, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983633, + 92467, 10187, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983642, 8506, 0, 0, 126996, 1005, 937, 78216, 4734, 2870, 0, 78218, 983109, 7463, 4729, 0, 235, 1384, 4728, 0, 120420, 92490, 74449, 8109, 43105, 983174, 4730, 447, 13186, 1513, 4733, 120415, 0, 0, 42527, 12911, 43427, 1383, @@ -19620,7 +19638,7 @@ 12769, 65905, 41697, 1283, 120302, 4779, 0, 3719, 4006, 983569, 19957, 128773, 2021, 119332, 120699, 119150, 43028, 65493, 41838, 3875, 5962, 64341, 92616, 9814, 43457, 5827, 3314, 7787, 78234, 65494, 68153, 0, 0, - 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, 5771, 41298, 983785, + 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, 5771, 41298, 983794, 9742, 521, 0, 10800, 92222, 8404, 194625, 483, 7096, 7089, 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 43748, 65782, 9841, 8843, 12145, 92470, 10074, 78548, 0, 3769, 0, 0, 0, 983107, 9573, 0, 65290, 8849, 0, @@ -19628,17 +19646,17 @@ 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608, 10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639, 1390, 0, 0, 421, 43536, 5846, 120120, 4130, 127775, 7595, 42588, 7600, 120121, 66035, - 983904, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 11831, 2370, + 983913, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 11831, 2370, 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 69843, 6290, 65374, 120451, 2390, 3944, 66628, 120434, 0, 6135, 3118, 74265, 119093, - 120446, 0, 0, 8127, 8975, 64739, 7943, 983734, 0, 10618, 2584, 0, 0, 0, + 120446, 0, 0, 8127, 8975, 64739, 7943, 983743, 0, 10618, 2584, 0, 0, 0, 9998, 128564, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 70075, 120130, 4267, 1631, 42206, 77983, 0, 195046, 65700, 66562, 0, 64645, 0, - 0, 126588, 12586, 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 983788, + 0, 126588, 12586, 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 983797, 7793, 78275, 9328, 119104, 78393, 12604, 0, 6615, 2285, 92344, 3986, - 44025, 0, 8912, 64555, 7409, 0, 983351, 9541, 78276, 0, 11275, 8540, - 11498, 0, 983350, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0, - 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983343, 0, 1606, 120348, + 44025, 0, 8912, 64555, 7409, 0, 983358, 9541, 78276, 0, 11275, 8540, + 11498, 0, 983357, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0, + 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983350, 0, 1606, 120348, 120351, 3093, 68436, 0, 983061, 119613, 0, 0, 4312, 74091, 120337, 120336, 11923, 4023, 120333, 5763, 94015, 4827, 10894, 12810, 64406, 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 118837, 11973, @@ -19648,25 +19666,25 @@ 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 93996, 2376, 0, 119320, 0, 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0, 0, 983084, 0, 0, 0, 74188, 71342, 983086, 983573, 120047, 128575, 0, - 0, 120049, 0, 1847, 0, 10339, 983358, 42384, 0, 4227, 74158, 0, 92501, - 43032, 0, 42365, 0, 12671, 11384, 0, 983458, 0, 64797, 983338, 5820, - 983337, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664, + 0, 120049, 0, 1847, 0, 10339, 983365, 42384, 0, 4227, 74158, 0, 92501, + 43032, 0, 42365, 0, 12671, 11384, 0, 983465, 0, 64797, 983345, 5820, + 983344, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664, 120063, 0, 7377, 127867, 41799, 65530, 1711, 12984, 43039, 3114, 6255, - 983333, 118938, 0, 10853, 926, 983362, 74184, 983361, 120055, 0, 43175, + 983340, 118938, 0, 10853, 926, 983369, 74184, 983368, 120055, 0, 43175, 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, 119605, 520, 4200, - 12699, 8331, 0, 3091, 41034, 127353, 983672, 8360, 0, 78044, 321, 4229, + 12699, 8331, 0, 3091, 41034, 127353, 983681, 8360, 0, 78044, 321, 4229, 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, 92386, 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660, 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 0, 743, 4414, 120766, 0, 42632, 917973, 65161, 73896, 128589, 0, 1405, 119063, 43220, 43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, 43342, 119064, 65529, 65364, 128197, 0, 6485, 1397, 0, 41986, 92678, 0, 0, - 74097, 0, 7471, 12079, 67997, 12682, 43287, 92317, 0, 983143, 983698, 0, + 74097, 0, 7471, 12079, 67997, 12682, 43287, 92317, 0, 983143, 983707, 0, 0, 1099, 10490, 0, 10501, 65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346, 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812, - 19911, 4218, 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 983893, + 19911, 4218, 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 983902, 74359, 12626, 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, - 41795, 64666, 126508, 43530, 2752, 0, 0, 983486, 59, 0, 983593, 0, 92371, + 41795, 64666, 126508, 43530, 2752, 0, 0, 983493, 59, 0, 983593, 0, 92371, 77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, 8009, 3305, 43033, 511, 92700, 66255, 13127, 120067, 0, 74397, 120235, 917977, 65915, 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783, @@ -19677,17 +19695,17 @@ 0, 41841, 43338, 0, 0, 5726, 64915, 42175, 0, 0, 41497, 65044, 120109, 2851, 43017, 983589, 0, 4373, 78058, 0, 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 917789, 64922, 0, 8190, 12083, 0, 0, 6506, 64312, - 74374, 2368, 0, 4419, 983838, 119125, 3439, 1825, 1192, 120106, 8891, + 74374, 2368, 0, 4419, 983847, 119125, 3439, 1825, 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, 8990, 2848, 0, 128223, 92528, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, 68178, 995, 0, 0, 64826, 0, 917798, - 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 983841, 12112, 69912, 0, + 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 983850, 12112, 69912, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, 2102, 65445, 78258, 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, 12446, 43295, 0, 41894, 0, 6277, 41672, 41893, 10010, 128678, 3540, 128649, 835, 71340, 69816, 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 128127, 8283, 0, 5434, 983590, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464, 6486, 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 128539, - 431, 0, 0, 128182, 128096, 68167, 983654, 13096, 128643, 0, 43408, 9516, + 431, 0, 0, 128182, 128096, 68167, 983663, 13096, 128643, 0, 43408, 9516, 128538, 5268, 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356, 3477, 227, 10488, 68203, 382, 11418, 0, 195066, 0, 0, 0, 0, 6484, 2541, 66039, 0, 78718, 92723, 3549, 0, 9110, 119665, 2743, 0, 43290, 194812, @@ -19696,7 +19714,7 @@ 12849, 3953, 1897, 0, 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 0, 68473, 74104, 5228, 128804, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, 1162, 917847, 2671, 0, 0, 92632, 92631, 118865, 4553, 73811, 0, 195005, - 0, 0, 19921, 74331, 11424, 195006, 4567, 41891, 0, 983779, 55249, 4820, + 0, 0, 19921, 74331, 11424, 195006, 4567, 41891, 0, 983788, 55249, 4820, 65239, 194662, 0, 194665, 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, 1753, 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, 0, 1898, 1413, 42443, 0, 802, 12141, 0, 194671, @@ -19705,7 +19723,7 @@ 78719, 66573, 0, 78724, 78712, 11761, 194655, 0, 41094, 0, 0, 194893, 0, 92689, 6196, 6945, 93969, 194890, 128184, 120491, 11816, 194943, 5733, 2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, 194717, 1238, 200, - 983206, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983697, 3394, + 983207, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983706, 3394, 194894, 120668, 0, 0, 127358, 66219, 127183, 43284, 194656, 7817, 1841, 11055, 120533, 194979, 194982, 1669, 10776, 194981, 7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, 0, 65324, 914, @@ -19713,30 +19731,30 @@ 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 92618, 5734, 8960, 0, 92527, 65317, 77880, 0, 0, 0, 12304, 0, 0, 65315, 92670, 128511, 0, 0, 0, 119621, 92529, 74536, 12447, 64486, 127374, 126562, 983129, 0, - 0, 983793, 42767, 10915, 0, 12007, 43695, 120520, 11975, 194878, 0, + 0, 983802, 42767, 10915, 0, 12007, 43695, 120520, 11975, 194878, 0, 92604, 2555, 8629, 128640, 43168, 41872, 43706, 4496, 194879, 128148, 120241, 0, 0, 0, 0, 64730, 70041, 66714, 68222, 0, 70076, 65596, 92306, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 126473, 67871, 74386, 0, 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, 0, 1473, 42820, 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 94003, 3406, 1054, 71320, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765, - 128705, 0, 983684, 9693, 41943, 126564, 41931, 41759, 12757, 4353, 0, - 1059, 9790, 8995, 119974, 983687, 65937, 0, 41764, 10646, 0, 118833, - 92372, 0, 74830, 78569, 12743, 983680, 6480, 917761, 41779, 42580, 66601, - 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, 41767, 119629, 983755, - 43020, 128271, 3955, 74254, 0, 983745, 917861, 0, 77926, 9770, 9246, + 128705, 0, 983693, 9693, 41943, 126564, 41931, 41759, 12757, 4353, 0, + 1059, 9790, 8995, 119974, 983696, 65937, 0, 41764, 10646, 0, 118833, + 92372, 0, 74830, 78569, 12743, 983689, 6480, 917761, 41779, 42580, 66601, + 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, 41767, 119629, 983764, + 43020, 128271, 3955, 74254, 0, 983754, 917861, 0, 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, 127093, 12797, 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, 128061, 78574, 0, 74284, 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, 43812, 42144, 65015, 0, 563, 0, - 983682, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 94051, 43137, 694, 0, + 983691, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 94051, 43137, 694, 0, 9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, 7229, 12761, 0, 0, 13025, 64811, 8757, 78824, 126478, 1574, 7381, 0, 2525, 4852, 5749, 68465, 13027, 42824, 120574, 1039, 7151, 10155, 5745, 188, 41858, 11592, 0, 74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, 0, 4856, 8051, 0, 119609, 71327, 9644, 0, 0, 0, 194916, 120732, 66710, 118834, - 983352, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, + 983359, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, 10226, 65142, - 128025, 3594, 42424, 194959, 40, 12657, 983656, 0, 386, 0, 8834, 0, + 128025, 3594, 42424, 194959, 40, 12657, 983665, 0, 386, 0, 8834, 0, 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 65322, 4304, 74503, 8160, 78707, 194753, 0, 0, 128526, 1348, 92349, 78597, 126539, 13303, 0, 92392, 194755, 7599, 1278, 43616, 13269, 0, 0, 74387, 78179, @@ -19748,25 +19766,25 @@ 42507, 1962, 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173, 5437, 74174, 10669, 8702, 7964, 92352, 0, 199, 194843, 4105, 194845, 194699, 194847, 194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070, - 6472, 65814, 73954, 0, 4724, 0, 0, 9191, 0, 64432, 983808, 983242, + 6472, 65814, 73954, 0, 4724, 0, 0, 9191, 0, 64432, 983817, 983247, 195024, 10196, 7886, 0, 6585, 0, 6680, 195042, 0, 195051, 6679, 74412, - 92251, 194866, 74421, 11382, 983622, 983628, 127891, 127484, 194833, + 92251, 194866, 74421, 11382, 983631, 983637, 127891, 127484, 194833, 194832, 6681, 127482, 12693, 194836, 42727, 78196, 128252, 78195, 65442, - 119610, 69733, 9989, 43248, 66248, 194816, 0, 194818, 128845, 194820, + 119610, 69733, 9989, 43248, 66248, 194816, 0, 11321, 128845, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825, 73927, 92444, 194736, 65746, 127476, 69889, 74389, 128696, 4342, 42839, 194831, 1677, 0, 0, 126590, 917855, 11091, 11011, 2719, 0, 0, 119595, 10160, 0, 0, 7585, 65169, 2052, 4308, 92174, 43000, 7505, 543, 64916, 64736, 0, 0, 64655, 0, - 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 127170, 0, 0, 0, 0, - 12994, 92728, 10828, 983934, 6228, 4307, 3482, 128527, 0, 0, 0, 506, - 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 983671, 8841, 0, 516, + 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 127170, 0, 983625, 0, + 0, 12994, 92728, 10828, 983943, 6228, 4307, 3482, 128527, 0, 0, 0, 506, + 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 983680, 8841, 0, 516, 93974, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182, 11827, 74308, 12001, 120178, 10242, 64564, 120179, 67986, 6584, 7749, 11037, 0, 1758, 127092, 10667, 10560, 120197, 92593, 1935, 11517, 120193, 120196, 120195, 1931, 120189, 74839, 120191, 1217, 64702, 12643, 825, 127838, 194905, 12294, 92428, 78834, 9138, 78831, 78833, 12631, 78829, 11080, 74554, 64000, 5591, 1239, 0, 11313, 0, 3403, 0, 0, 64364, 92269, - 0, 74582, 8998, 12988, 0, 9152, 983840, 0, 126484, 67589, 41850, 64290, + 0, 74582, 8998, 12988, 0, 9152, 983849, 0, 126484, 67589, 41850, 64290, 3433, 92393, 12615, 1594, 42192, 6914, 67603, 0, 119569, 74565, 41353, 67602, 67611, 4337, 0, 127296, 918, 65035, 41351, 7681, 194900, 42577, 41393, 12668, 194904, 2477, 127285, 0, 127301, 0, 67604, 194880, 127235, @@ -19778,14 +19796,14 @@ 73796, 0, 119228, 12035, 0, 2818, 0, 74411, 73793, 0, 4172, 0, 0, 8373, 10873, 12197, 0, 0, 92265, 69706, 0, 78210, 0, 128110, 194865, 126982, 74563, 64828, 11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617, - 3274, 127365, 126523, 94042, 983941, 74522, 41989, 0, 0, 128798, 3263, 0, + 3274, 127365, 126523, 94042, 983950, 74522, 41989, 0, 0, 128798, 3263, 0, 65672, 0, 3270, 64539, 11489, 0, 0, 0, 0, 9505, 65518, 194776, 756, 194605, 0, 0, 0, 7261, 0, 186, 0, 119156, 5770, 13179, 65830, 12612, - 12949, 64856, 12800, 983892, 74203, 64718, 11507, 0, 92434, 118929, 0, + 12949, 64856, 12800, 983901, 74203, 64718, 11507, 0, 92434, 118929, 0, 11578, 0, 119296, 0, 0, 0, 0, 74568, 9254, 0, 1794, 120217, 64521, 5624, 120220, 120221, 119958, 120223, 3617, 66636, 64886, 94061, 120212, 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, 4452, 0, - 983762, 92526, 4511, 0, 983868, 64678, 11425, 0, 43245, 1231, 194783, + 983771, 92526, 4511, 0, 983877, 64678, 11425, 0, 43245, 1231, 194783, 69903, 0, 9003, 8192, 0, 5305, 9653, 10616, 8694, 9546, 0, 0, 120478, 120200, 65205, 120202, 64063, 9878, 74780, 119626, 78202, 64058, 8799, 42131, 0, 64062, 1028, 64060, 64059, 837, 10567, 0, 43103, 0, 120754, @@ -19794,26 +19812,26 @@ 64032, 42735, 64038, 64037, 64036, 64035, 4291, 194928, 64015, 64014, 64681, 194930, 0, 78145, 0, 43090, 0, 3476, 8973, 64012, 42473, 64010, 64008, 64007, 2003, 7706, 64517, 78153, 2538, 64009, 204, 0, 4802, 4111, - 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 983259, 0, 4767, 9343, + 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 983266, 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, 64052, 43453, 64050, 41340, 118975, 194835, 10005, 12329, 41333, 0, 8489, 1942, 0, 194834, 42520, 128249, 0, 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, 9167, 42151, 78244, - 983227, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, 78248, + 983232, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, 78248, 77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920, 7532, 41414, 78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454, 10751, 9051, - 120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030, 294, 41874, 0, - 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, 0, 4351, - 6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, 119895, - 119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, 1135, - 0, 0, 128525, 1995, 6722, 983916, 0, 2552, 41546, 60, 68394, 8649, 41549, - 78496, 983320, 0, 6682, 0, 78679, 64710, 41547, 983621, 2013, 128291, - 78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537, 119908, 9137, - 7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, 2002, 2000, - 120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628, 68446, 12081, - 9826, 64502, 1767, 0, 0, 0, 120201, 983637, 0, 0, 3059, 44024, 120204, - 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, 3592, 10078, 0, - 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, 9281, 3296, - 12865, 1997, 1895, + 120720, 6708, 10535, 983627, 68218, 55274, 2008, 64031, 64030, 294, + 41874, 0, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, + 0, 4351, 6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, + 119895, 119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, + 1135, 0, 0, 128525, 1995, 6722, 983925, 0, 2552, 41546, 60, 68394, 8649, + 41549, 78496, 983327, 0, 6682, 0, 78679, 64710, 41547, 983630, 2013, + 128291, 78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537, + 119908, 9137, 7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, + 2002, 2000, 120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628, + 68446, 12081, 9826, 64502, 1767, 0, 0, 0, 120201, 983646, 0, 0, 3059, + 44024, 120204, 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, + 3592, 10078, 0, 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, + 9281, 3296, 12865, 1997, 1895, }; #define code_magic 47 @@ -19821,7 +19839,7 @@ #define code_poly 32771 static const unsigned int aliases_start = 0xf0000; -static const unsigned int aliases_end = 0xf01c2; +static const unsigned int aliases_end = 0xf01c9; static const unsigned int name_aliases[] = { 0x0000, 0x0000, @@ -19984,6 +20002,7 @@ 0x01A2, 0x01A3, 0x034F, + 0x061C, 0x0709, 0x0CDE, 0x0E9D, @@ -20008,6 +20027,10 @@ 0x202F, 0x205F, 0x2060, + 0x2066, + 0x2067, + 0x2068, + 0x2069, 0x2118, 0x2448, 0x2449, @@ -20032,6 +20055,8 @@ 0xFEFF, 0xFEFF, 0xFEFF, + 0x122D4, + 0x122D5, 0x1D0C5, 0xE0100, 0xE0101, @@ -20281,7 +20306,7 @@ } named_sequence; static const unsigned int named_sequences_start = 0xf0200; -static const unsigned int named_sequences_end = 0xf03a5; +static const unsigned int named_sequences_end = 0xf03ae; static const named_sequence named_sequences[] = { {2, {0x0100, 0x0300}}, {2, {0x0101, 0x0300}}, @@ -20352,6 +20377,15 @@ {2, {0x0259, 0x0301}}, {2, {0x025A, 0x0300}}, {2, {0x025A, 0x0301}}, + {2, {0x0626, 0x0627}}, + {2, {0x0626, 0x0648}}, + {2, {0x0626, 0x0649}}, + {2, {0x0626, 0x06C6}}, + {2, {0x0626, 0x06C7}}, + {2, {0x0626, 0x06C8}}, + {2, {0x0626, 0x06D0}}, + {2, {0x0626, 0x06D5}}, + {2, {0x0646, 0x06A9}}, {3, {0x0995, 0x09CD, 0x09B7}}, {2, {0x0B95, 0x0BCD}}, {2, {0x0B99, 0x0BCD}}, diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -1589,7 +1589,7 @@ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 5, 21, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 8, @@ -1801,7 +1801,7 @@ 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 96, 5, 5, 5, 5, 55, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 25, 25, 25, 2, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, + 25, 25, 25, 21, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -1828,7 +1828,7 @@ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 132, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 18, 0, 0, 5, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 25, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 18, 25, @@ -1915,7 +1915,7 @@ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, - 21, 21, 21, 21, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 245, 95, 0, 0, + 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 245, 95, 0, 0, 246, 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 95, 245, 26, 22, 23, 246, 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2925,9 +2925,6 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) { switch (ch) { - case 0x12456: - case 0x12457: - return (double) -1.0; case 0x0F33: return (double) -1.0/2.0; case 0x0030: @@ -3383,6 +3380,7 @@ case 0x12435: case 0x1244A: case 0x12450: + case 0x12456: case 0x12459: case 0x1D361: case 0x1D7D0: @@ -3539,6 +3537,7 @@ case 0x1243B: case 0x1244B: case 0x12451: + case 0x12457: case 0x1D362: case 0x1D7D1: case 0x1D7DB: @@ -4294,7 +4293,6 @@ case 0x0085: case 0x00A0: case 0x1680: - case 0x180E: case 0x2000: case 0x2001: case 0x2002: diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -37,7 +37,7 @@ VERSION = "3.2" # The Unicode Database -UNIDATA_VERSION = "6.2.0" +UNIDATA_VERSION = "6.3.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" @@ -68,7 +68,7 @@ BIDIRECTIONAL_NAMES = [ "", "L", "LRE", "LRO", "R", "AL", "RLE", "RLO", "PDF", "EN", "ES", "ET", "AN", "CS", "NSM", "BN", "B", "S", "WS", - "ON" ] + "ON", "LRI", "RLI", "FSI", "PDI" ] EASTASIANWIDTH_NAMES = [ "F", "H", "W", "Na", "A", "N" ] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 23:34:07 2013 From: python-checkins at python.org (r.david.murray) Date: Thu, 10 Oct 2013 23:34:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbjogIzE4NzY0OiBwKHJpbnQpIC0+?= =?utf-8?q?_p_in_pdb_docs=2E?= Message-ID: <3cwlt71vpGz7LjP@mail.python.org> http://hg.python.org/cpython/rev/592579b89d8c changeset: 86201:592579b89d8c user: R David Murray date: Thu Oct 10 17:33:43 2013 -0400 summary: #18764: p(rint) -> p in pdb docs. Missed changing the doc for the command itself, patch for that also by Connor Osborn. files: Doc/library/pdb.rst | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -403,10 +403,16 @@ Print the argument list of the current function. -.. pdbcommand:: p(rint) expression +.. pdbcommand:: p expression Evaluate the *expression* in the current context and print its value. + .. note:: + + ``print()`` can also be used, but is not a debugger command --- this executes the + Python :func:`print` function. + + .. pdbcommand:: pp expression Like the :pdbcmd:`p` command, except the value of the expression is -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 23:41:04 2013 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 10 Oct 2013 23:41:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_remove_url_fro?= =?utf-8?q?m_docstring_=28closes_=2319220=29?= Message-ID: <3cwm2823wcz7LjP@mail.python.org> http://hg.python.org/cpython/rev/4e301c80f5d1 changeset: 86202:4e301c80f5d1 branch: 3.3 parent: 86193:249ba942a6d4 user: Benjamin Peterson date: Thu Oct 10 17:39:56 2013 -0400 summary: remove url from docstring (closes #19220) files: Modules/unicodedata.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1325,8 +1325,7 @@ 6.0.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 6.0.0 (see\n\ -http://www.unicode.org/reports/tr44/tr44-6.html)."); +UnicodeData File Format 6.0.0."); static struct PyModuleDef unicodedatamodule = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 23:41:05 2013 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 10 Oct 2013 23:41:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy4zICgjMTkyMjAp?= Message-ID: <3cwm293vXMz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/f38edb58fefb changeset: 86203:f38edb58fefb parent: 86200:97df7404f39c parent: 86202:4e301c80f5d1 user: Benjamin Peterson date: Thu Oct 10 17:40:30 2013 -0400 summary: merge 3.3 (#19220) files: Modules/unicodedata.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1325,9 +1325,7 @@ 6.3.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 6.3.0 (see\n\ -http://www.unicode.org/reports/tr44/tr44-6.html)."); - +UnicodeData File Format 6.3.0"); static struct PyModuleDef unicodedatamodule = { PyModuleDef_HEAD_INIT, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 10 23:41:06 2013 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 10 Oct 2013 23:41:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge_heads?= Message-ID: <3cwm2B5cJYz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/4204de1e673e changeset: 86204:4204de1e673e parent: 86203:f38edb58fefb parent: 86201:592579b89d8c user: Benjamin Peterson date: Thu Oct 10 17:40:48 2013 -0400 summary: merge heads files: Doc/library/pdb.rst | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -403,10 +403,16 @@ Print the argument list of the current function. -.. pdbcommand:: p(rint) expression +.. pdbcommand:: p expression Evaluate the *expression* in the current context and print its value. + .. note:: + + ``print()`` can also be used, but is not a debugger command --- this executes the + Python :func:`print` function. + + .. pdbcommand:: pp expression Like the :pdbcmd:`p` command, except the value of the expression is -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Fri Oct 11 00:16:59 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Fri, 11 Oct 2013 08:16:59 +1000 Subject: [Python-checkins] peps: Revise PEP 453 to be docs-only for 2.7 & 3.3 In-Reply-To: <5256FA3E.20907@udel.edu> References: <3cwZsf27c8z7LjN@mail.python.org> <5256FA3E.20907@udel.edu> Message-ID: On 11 Oct 2013 05:04, "Terry Reedy" wrote: > > On 10/10/2013 10:48 AM, nick.coghlan wrote: >> >> http://hg.python.org/peps/rev/405b80d54b7d >> changeset: 5188:405b80d54b7d >> user: Nick Coghlan >> date: Fri Oct 11 00:47:47 2013 +1000 >> summary: >> Revise PEP 453 to be docs-only for 2.7 & 3.3 >> >> - all functional changes are now 3.4 only >> - still proposes docs changes for 2.7 & 3.3 >> - notes current effort to create a Windows installer for pip >> - notes possibility of a future PEP to provide a combined >> CPython 2.7, pip and Python Launcher installer from python.org > > >> +`Installing Python Modules `__ guide in >> +Python 2.7, 3.3 and 3.4 be updated to officially recommend the use of ``pip`` >> +as the default installer for Python packages, and that appropriate technical >> +changes be made in Python 3.4 to provide ``pip`` by default in support of >> +that recommendation. > > > Does one need a separate installation of pip for each Python version or is pip 'separate' enough that one installation works for all Python versions? Is the answer to this the same on all systems? If the answer is 'one' and 'yes', the 2.7 and 3.3 docs should say that installing 3.4 also installs pip and that this is all one needs to do. pip is version specific (it's just a normal Python package). >> +While this PEP only proposes documentation changes for Python 2.7, once >> +``pip`` has a Windows installer available, a separate PEP will be created >> +and submitted proposing the creation and distribution of aggregate installers >> +for future CPython 2.7 maintenance releases that combine the CPython, >> +``pip`` and Python Launcher for Windows installers into a single download >> +(the separate downloads would still remain available - the aggregate >> +installers would be provided as a convenience, and as a clear indication >> +of the recommended operating environment for Python in Windows systems). > > > If the combined installer is an optional convenience, I would not think a PEP necessary. I am assuming that the combined installer would not add a module to /lib any more than two separate installers would, and hence would not be adding a feature to 2.7 itself. That PEP (if created) would be for publishing such an aggregate installer from the 2.7 release page on python.org. Since it would be proposing more work for the creator of the CPython Windows installers, a PEP seems appropriate. Cheers, Nick. > > -- > Terry Jan Reedy > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Fri Oct 11 02:17:35 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 11 Oct 2013 02:17:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_make_sure_the_?= =?utf-8?q?docstring_is_never_out_of_date_wrt_unicode_data_version?= Message-ID: <3cwqVl2R2Yz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/fdc8da393675 changeset: 86205:fdc8da393675 branch: 3.3 parent: 86202:4e301c80f5d1 user: Benjamin Peterson date: Thu Oct 10 20:16:25 2013 -0400 summary: make sure the docstring is never out of date wrt unicode data version files: Modules/unicodedata.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1325,7 +1325,7 @@ 6.0.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 6.0.0."); +UnicodeData File Format " UNIDATA_VERSION "."); static struct PyModuleDef unicodedatamodule = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 11 02:17:36 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 11 Oct 2013 02:17:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy4z?= Message-ID: <3cwqVm58NNz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/50cee52219c5 changeset: 86206:50cee52219c5 parent: 86204:4204de1e673e parent: 86205:fdc8da393675 user: Benjamin Peterson date: Thu Oct 10 20:17:29 2013 -0400 summary: merge 3.3 files: Modules/unicodedata.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1325,7 +1325,7 @@ 6.3.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 6.3.0"); +UnicodeData File Format " UNIDATA_VERSION "."); static struct PyModuleDef unicodedatamodule = { PyModuleDef_HEAD_INIT, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 11 02:22:45 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 11 Oct 2013 02:22:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_replace_hardco?= =?utf-8?q?ded_version?= Message-ID: <3cwqcj38DCzRCZ@mail.python.org> http://hg.python.org/cpython/rev/2d146914d446 changeset: 86207:2d146914d446 branch: 3.3 parent: 86205:fdc8da393675 user: Benjamin Peterson date: Thu Oct 10 20:22:10 2013 -0400 summary: replace hardcoded version files: Modules/unicodedata.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1322,7 +1322,7 @@ "This module provides access to the Unicode Character Database which\n\ defines character properties for all Unicode characters. The data in\n\ this database is based on the UnicodeData.txt file version\n\ -6.0.0 which is publically available from ftp://ftp.unicode.org/.\n\ +" UNIDATA_VERSION " which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ UnicodeData File Format " UNIDATA_VERSION "."); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 11 02:22:46 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 11 Oct 2013 02:22:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy4z?= Message-ID: <3cwqck4wzZz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/93f0e6e1be0b changeset: 86208:93f0e6e1be0b parent: 86206:50cee52219c5 parent: 86207:2d146914d446 user: Benjamin Peterson date: Thu Oct 10 20:22:39 2013 -0400 summary: merge 3.3 files: Modules/unicodedata.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1322,7 +1322,7 @@ "This module provides access to the Unicode Character Database which\n\ defines character properties for all Unicode characters. The data in\n\ this database is based on the UnicodeData.txt file version\n\ -6.3.0 which is publically available from ftp://ftp.unicode.org/.\n\ +" UNIDATA_VERSION " which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ UnicodeData File Format " UNIDATA_VERSION "."); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 11 07:03:28 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 11 Oct 2013 07:03:28 +0200 Subject: [Python-checkins] Daily reference leaks (93f0e6e1be0b): sum=0 Message-ID: results for 93f0e6e1be0b on branch "default" -------------------------------------------- test_imp leaked [0, 1, -1] references, sum=0 test_site leaked [0, 2, -2] references, sum=0 test_site leaked [0, 2, -2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogK4bxqw', '-x'] From python-checkins at python.org Fri Oct 11 07:39:48 2013 From: python-checkins at python.org (raymond.hettinger) Date: Fri, 11 Oct 2013 07:39:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Rename_contextlib=2Eignore?= =?utf-8?b?ZCgpIHRvIGNvbnRleHRsaWIuaWdub3JlKCku?= Message-ID: <3cwyfX6Mdfz7LjX@mail.python.org> http://hg.python.org/cpython/rev/f014b5f0773f changeset: 86209:f014b5f0773f user: Raymond Hettinger date: Thu Oct 10 22:39:39 2013 -0700 summary: Rename contextlib.ignored() to contextlib.ignore(). files: Doc/library/contextlib.rst | 6 +++--- Lib/contextlib.py | 6 +++--- Lib/test/test_contextlib.py | 10 +++++----- Misc/NEWS | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -94,16 +94,16 @@ without needing to explicitly close ``page``. Even if an error occurs, ``page.close()`` will be called when the :keyword:`with` block is exited. -.. function:: ignored(*exceptions) +.. function:: ignore(*exceptions) Return a context manager that ignores the specified exceptions if they occur in the body of a with-statement. For example:: - from contextlib import ignored + from contextlib import ignore - with ignored(OSError): + with ignore(OSError): os.remove('somefile.tmp') This code is equivalent to:: diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -5,7 +5,7 @@ from functools import wraps __all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", - "ignored", "redirect_stdout"] + "ignore", "redirect_stdout"] class ContextDecorator(object): @@ -179,10 +179,10 @@ sys.stdout = self.old_target @contextmanager -def ignored(*exceptions): +def ignore(*exceptions): """Context manager to ignore specified exceptions - with ignored(OSError): + with ignore(OSError): os.remove(somefile) """ diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -632,26 +632,26 @@ stack.push(cm) self.assertIs(stack._exit_callbacks[-1], cm) -class TestIgnored(unittest.TestCase): +class TestIgnore(unittest.TestCase): def test_no_exception(self): - with ignored(ValueError): + with ignore(ValueError): self.assertEqual(pow(2, 5), 32) def test_exact_exception(self): - with ignored(TypeError): + with ignore(TypeError): len(5) def test_multiple_exception_args(self): - with ignored(ZeroDivisionError, TypeError): + with ignore(ZeroDivisionError, TypeError): len(5) def test_exception_hierarchy(self): - with ignored(LookupError): + with ignore(LookupError): 'Hello'[50] class TestRedirectStdout(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1656,8 +1656,8 @@ - Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO queue now uses a deque instead of a list. -- Issue #15806: Add contextlib.ignored(). This creates a context manager - to ignore specified exceptions, replacing the "except Exc: pass" idiom. +- Issue #15806: Add contextlib.ignore(). This creates a context manager to + ignore specified exceptions, replacing the "except SomeException: pass" idiom. - Issue #14645: The email generator classes now produce output using the specified linesep throughout. Previously if the prolog, epilog, or -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 11 18:10:10 2013 From: python-checkins at python.org (r.david.murray) Date: Fri, 11 Oct 2013 18:10:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2319192=3A_Give_up_on_tim?= =?utf-8?q?e=2Exmlrpc=2Ecom_as_an_xmlrpc_network_test=2E?= Message-ID: <3cxDdt6nBYz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/a4515186bf9c changeset: 86210:a4515186bf9c user: R David Murray date: Fri Oct 11 12:09:51 2013 -0400 summary: #19192: Give up on time.xmlrpc.com as an xmlrpc network test. time.xmlrpc.com has come and gone over the years, and has been gone again for a while. The test did test one thing that the current xmlrpc tests don't: the use of multiple levels of attribute names in the call. So in addition to removing the network test, we add a test in xmlrpc of dotted name access. There should also be a test for when dotted name access is disallowed, but that requires more extensive test harness refactoring, and in any case was not tested by the network test we are deleting, since it is a server-side setting. This is a slightly simplified version of a patch by Vajrasky Kok. files: Lib/test/test_xmlrpc.py | 17 ++++++++++++- Lib/test/test_xmlrpc_net.py | 29 +----------------------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -380,6 +380,11 @@ if name == 'div': return 'This is the div function' + class Fixture: + @staticmethod + def getData(): + return '42' + def my_function(): '''This is my function''' return True @@ -411,7 +416,8 @@ serv.register_function(pow) serv.register_function(lambda x,y: x+y, 'add') serv.register_function(my_function) - serv.register_instance(TestInstanceClass()) + testInstance = TestInstanceClass() + serv.register_instance(testInstance, allow_dotted_names=True) evt.set() # handle up to 'numrequests' requests @@ -591,7 +597,8 @@ def test_introspection1(self): expected_methods = set(['pow', 'div', 'my_function', 'add', 'system.listMethods', 'system.methodHelp', - 'system.methodSignature', 'system.multicall']) + 'system.methodSignature', 'system.multicall', + 'Fixture']) try: p = xmlrpclib.ServerProxy(URL) meth = p.system.listMethods() @@ -690,6 +697,12 @@ # This avoids waiting for the socket timeout. self.test_simple1() + def test_allow_dotted_names_true(self): + # XXX also need allow_dotted_names_false test. + server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT)) + data = server.Fixture.getData() + self.assertEqual(data, '42') + def test_unicode_host(self): server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT)) self.assertEqual(server.add("a", "\xe9"), "a\xe9") diff --git a/Lib/test/test_xmlrpc_net.py b/Lib/test/test_xmlrpc_net.py --- a/Lib/test/test_xmlrpc_net.py +++ b/Lib/test/test_xmlrpc_net.py @@ -9,32 +9,7 @@ import xmlrpc.client as xmlrpclib -class CurrentTimeTest(unittest.TestCase): - - def test_current_time(self): - # Get the current time from xmlrpc.com. This code exercises - # the minimal HTTP functionality in xmlrpclib. - self.skipTest("time.xmlrpc.com is unreliable") - server = xmlrpclib.ServerProxy("http://time.xmlrpc.com/RPC2") - try: - t0 = server.currentTime.getCurrentTime() - except OSError as e: - self.skipTest("network error: %s" % e) - return - - # Perform a minimal sanity check on the result, just to be sure - # the request means what we think it means. - t1 = xmlrpclib.DateTime() - - dt0 = xmlrpclib._datetime_type(t0.value) - dt1 = xmlrpclib._datetime_type(t1.value) - if dt0 > dt1: - delta = dt0 - dt1 - else: - delta = dt1 - dt0 - # The difference between the system time here and the system - # time on the server should not be too big. - self.assertTrue(delta.days <= 1) +class PythonBuildersTest(unittest.TestCase): def test_python_builders(self): # Get the list of builders from the XMLRPC buildbot interface at @@ -55,7 +30,7 @@ def test_main(): support.requires("network") - support.run_unittest(CurrentTimeTest) + support.run_unittest(PythonBuildersTest) if __name__ == "__main__": test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 11 21:41:07 2013 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 11 Oct 2013 21:41:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_expected_checksum_for_?= =?utf-8?q?new_unicodedata_=28after_full_rebuild=29?= Message-ID: <3cxKKH6HR7z7Ljj@mail.python.org> http://hg.python.org/cpython/rev/9a0b46132876 changeset: 86211:9a0b46132876 user: Antoine Pitrou date: Fri Oct 11 21:40:55 2013 +0200 summary: Fix expected checksum for new unicodedata (after full rebuild) files: Lib/test/test_unicodedata.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -80,7 +80,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # update this, if the database changes - expectedchecksum = 'ebd64e81553c9cb37f424f5616254499fcd8849e' + expectedchecksum = 'f0b74d26776331cc7bdc3a4698f037d73f2cee2b' def test_function_checksum(self): data = [] h = hashlib.sha1() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 00:15:05 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 00:15:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=239548=3A_Add_a_min?= =?utf-8?q?imal_=22=5Fbootlocale=22_module_that_is_imported_by_the_=5Fio?= Message-ID: <3cxNkx1WqDz7Lkr@mail.python.org> http://hg.python.org/cpython/rev/fbbf8b160e8d changeset: 86212:fbbf8b160e8d user: Antoine Pitrou date: Sat Oct 12 00:13:50 2013 +0200 summary: Issue #9548: Add a minimal "_bootlocale" module that is imported by the _io module instead of the full locale module. files: Lib/_bootlocale.py | 34 +++++++++++++++++++++++++ Lib/locale.py | 21 +++----------- Lib/site.py | 4 +- Lib/test/test_subprocess.py | 7 ++-- Misc/NEWS | 3 ++ Modules/_io/_iomodule.c | 2 +- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/Lib/_bootlocale.py b/Lib/_bootlocale.py new file mode 100644 --- /dev/null +++ b/Lib/_bootlocale.py @@ -0,0 +1,34 @@ +"""A minimal subset of the locale module used at interpreter startup +(imported by the _io module), in order to reduce startup time. + +Don't import directly from third-party code; use the `locale` module instead! +""" + +import sys +import _locale + +if sys.platform.startswith("win"): + def getpreferredencoding(do_setlocale=True): + return _locale._getdefaultlocale()[1] +else: + try: + _locale.CODESET + except ImportError: + def getpreferredencoding(do_setlocale=True): + # This path for legacy systems needs the more complex + # getdefaultlocale() function, import the full locale module. + import locale + return locale.getpreferredencoding(do_setlocale) + else: + def getpreferredencoding(do_setlocale=True): + assert not do_setlocale + result = _locale.nl_langinfo(_locale.CODESET) + if not result and sys.platform == 'darwin': + # nl_langinfo can return an empty string + # when the setting has an invalid value. + # Default to UTF-8 in that case because + # UTF-8 is the default charset on OSX and + # returning nothing will crash the + # interpreter. + result = 'UTF-8' + return result diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -554,8 +554,8 @@ # On Win32, this will return the ANSI code page def getpreferredencoding(do_setlocale = True): """Return the charset that the user is likely using.""" - import _locale - return _locale._getdefaultlocale()[1] + import _bootlocale + return _bootlocale.getpreferredencoding(False) else: # On Unix, if CODESET is available, use that. try: @@ -574,27 +574,16 @@ def getpreferredencoding(do_setlocale = True): """Return the charset that the user is likely using, according to the system configuration.""" + import _bootlocale if do_setlocale: oldloc = setlocale(LC_CTYPE) try: setlocale(LC_CTYPE, "") except Error: pass - result = nl_langinfo(CODESET) - if not result and sys.platform == 'darwin': - # nl_langinfo can return an empty string - # when the setting has an invalid value. - # Default to UTF-8 in that case because - # UTF-8 is the default charset on OSX and - # returning nothing will crash the - # interpreter. - result = 'UTF-8' + result = _bootlocale.getpreferredencoding(False) + if do_setlocale: setlocale(LC_CTYPE, oldloc) - else: - result = nl_langinfo(CODESET) - if not result and sys.platform == 'darwin': - # See above for explanation - result = 'UTF-8' return result diff --git a/Lib/site.py b/Lib/site.py --- a/Lib/site.py +++ b/Lib/site.py @@ -426,8 +426,8 @@ while they are always available as "mbcs" in each locale. Make them usable by aliasing to "mbcs" in such a case.""" if sys.platform == 'win32': - import locale, codecs - enc = locale.getdefaultlocale()[1] + import _bootlocale, codecs + enc = _bootlocale.getpreferredencoding(False) if enc.startswith('cp'): # "cp***" ? try: codecs.lookup(enc) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -883,8 +883,9 @@ # # UTF-16 and UTF-32-BE are sufficient to check both with BOM and # without, and UTF-16 and UTF-32. + import _bootlocale for encoding in ['utf-16', 'utf-32-be']: - old_getpreferredencoding = locale.getpreferredencoding + old_getpreferredencoding = _bootlocale.getpreferredencoding # Indirectly via io.TextIOWrapper, Popen() defaults to # locale.getpreferredencoding(False) and earlier in Python 3.2 to # locale.getpreferredencoding(). @@ -895,7 +896,7 @@ encoding) args = [sys.executable, '-c', code] try: - locale.getpreferredencoding = getpreferredencoding + _bootlocale.getpreferredencoding = getpreferredencoding # We set stdin to be non-None because, as of this writing, # a different code path is used when the number of pipes is # zero or one. @@ -904,7 +905,7 @@ stdout=subprocess.PIPE) stdout, stderr = popen.communicate(input='') finally: - locale.getpreferredencoding = old_getpreferredencoding + _bootlocale.getpreferredencoding = old_getpreferredencoding self.assertEqual(stdout, '1\n2\n3\n4') def test_no_leaking(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Library ------- +- Issue #9548: Add a minimal "_bootlocale" module that is imported by the + _io module instead of the full locale module. + - Issue #18764: remove the 'print' alias for the PDB 'p' command so that it no longer shadows the print function. diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -546,7 +546,7 @@ } Py_CLEAR(state->locale_module); } - mod = PyImport_ImportModule("locale"); + mod = PyImport_ImportModule("_bootlocale"); if (mod == NULL) return NULL; state->locale_module = PyWeakref_NewRef(mod, NULL); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 00:25:04 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 00:25:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319205=3A_Don=27t_?= =?utf-8?q?import_the_=27re=27_module_in_site_and_sysconfig_module_to?= Message-ID: <3cxNyS2mR1z7Lk3@mail.python.org> http://hg.python.org/cpython/rev/406529adf156 changeset: 86213:406529adf156 user: Christian Heimes date: Sat Oct 12 00:24:55 2013 +0200 summary: Issue #19205: Don't import the 're' module in site and sysconfig module to to speed up interpreter start. files: Lib/site.py | 6 +++--- Lib/sysconfig.py | 4 +++- Lib/test/test_site.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/site.py b/Lib/site.py --- a/Lib/site.py +++ b/Lib/site.py @@ -70,7 +70,6 @@ import sys import os -import re import builtins import _sitebuiltins @@ -436,8 +435,7 @@ encodings._cache[enc] = encodings._unknown encodings.aliases.aliases[enc] = 'mbcs' - -CONFIG_LINE = re.compile(r'^(?P(\w|[-_])+)\s*=\s*(?P.*)\s*$') +CONFIG_LINE = r'^(?P(\w|[-_])+)\s*=\s*(?P.*)\s*$' def venv(known_paths): global PREFIXES, ENABLE_USER_SITE @@ -460,6 +458,8 @@ ] if candidate_confs: + import re + config_line = re.compile(CONFIG_LINE) virtual_conf = candidate_confs[0] system_site = "true" with open(virtual_conf) as f: diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -1,7 +1,6 @@ """Access to Python's configuration information.""" import os -import re import sys from os.path import pardir, realpath @@ -222,6 +221,7 @@ """ # Regexes needed for parsing Makefile (and similar syntaxes, # like old-style Setup files). + import re _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") @@ -435,6 +435,7 @@ """ if vars is None: vars = {} + import re define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") @@ -658,6 +659,7 @@ return "%s-%s.%s" % (osname, version, release) elif osname[:6] == "cygwin": osname = "cygwin" + import re rel_re = re.compile(r'[\d.]+') m = rel_re.match(release) if m: diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -420,5 +420,20 @@ self.assertEqual(code, 200, msg="Can't find " + url) +class StartupImportTests(unittest.TestCase): + + def test_startup_imports(self): + # This tests checks which modules are loaded by Python when it + # initially starts upon startup. + args = [sys.executable, '-I', '-c', + 'import sys; print(set(sys.modules))'] + stdout = subprocess.check_output(args) + modules = eval(stdout.decode('utf-8')) + self.assertIn('site', modules) + + re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} + self.assertFalse(modules.intersection(re_mods)) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Library ------- +- Issue #19205: Don't import the 're' module in site and sysconfig module to + to speed up interpreter start. + - Issue #9548: Add a minimal "_bootlocale" module that is imported by the _io module instead of the full locale module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 00:28:26 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 00:28:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319205_fix_406529a?= =?utf-8?q?df156?= Message-ID: <3cxP2L63kszNt4@mail.python.org> http://hg.python.org/cpython/rev/2cd1b28d1666 changeset: 86214:2cd1b28d1666 user: Christian Heimes date: Sat Oct 12 00:28:17 2013 +0200 summary: Issue #19205 fix 406529adf156 I forgot to hit save. files: Lib/site.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/site.py b/Lib/site.py --- a/Lib/site.py +++ b/Lib/site.py @@ -465,7 +465,7 @@ with open(virtual_conf) as f: for line in f: line = line.strip() - m = CONFIG_LINE.match(line) + m = config_line.match(line) if m: d = m.groupdict() key, value = d['key'].lower(), d['value'] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 01:01:04 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 01:01:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Also_test_that_the_locale_?= =?utf-8?q?module_isn=27t_loaded_during_normal_startup?= Message-ID: <3cxPm05JM0z7Lks@mail.python.org> http://hg.python.org/cpython/rev/e8ddf7c0c3f2 changeset: 86215:e8ddf7c0c3f2 user: Christian Heimes date: Sat Oct 12 01:00:51 2013 +0200 summary: Also test that the locale module isn't loaded during normal startup files: Lib/test/test_site.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -434,6 +434,8 @@ re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} self.assertFalse(modules.intersection(re_mods)) + self.assertNotIn('locale', modules) + if __name__ == "__main__": unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 01:27:41 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 01:27:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319209=3A_Remove_i?= =?utf-8?q?mport_of_copyreg_from_the_os_module_to_speed_up?= Message-ID: <3cxQLj6bP0z7Lk3@mail.python.org> http://hg.python.org/cpython/rev/29c4a6a11e76 changeset: 86216:29c4a6a11e76 user: Christian Heimes date: Sat Oct 12 01:27:08 2013 +0200 summary: Issue #19209: Remove import of copyreg from the os module to speed up interpreter startup. stat_result and statvfs_result are now hard-coded to reside in the os module. The patch is based on Victor Stinner's patch. files: Lib/os.py | 27 --------------------------- Lib/test/test_os.py | 22 ++++++++++++++++++++++ Lib/test/test_site.py | 5 ++++- Misc/NEWS | 4 ++++ Modules/posixmodule.c | 4 ++-- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -945,33 +945,6 @@ __all__.extend(["spawnlp", "spawnlpe"]) -import copyreg as _copyreg - -def _make_stat_result(tup, dict): - return stat_result(tup, dict) - -def _pickle_stat_result(sr): - (type, args) = sr.__reduce__() - return (_make_stat_result, args) - -try: - _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result) -except NameError: # stat_result may not exist - pass - -def _make_statvfs_result(tup, dict): - return statvfs_result(tup, dict) - -def _pickle_statvfs_result(sr): - (type, args) = sr.__reduce__() - return (_make_statvfs_result, args) - -try: - _copyreg.pickle(statvfs_result, _pickle_statvfs_result, - _make_statvfs_result) -except NameError: # statvfs_result may not exist - pass - # Supply os.popen() def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -26,6 +26,7 @@ import codecs import decimal import fractions +import pickle try: import threading except ImportError: @@ -264,6 +265,13 @@ warnings.simplefilter("ignore", DeprecationWarning) self.check_stat_attributes(fname) + def test_stat_result_pickle(self): + result = os.stat(self.fname) + p = pickle.dumps(result) + self.assertIn(b'\x03cos\nstat_result\n', p) + unpickled = pickle.loads(p) + self.assertEqual(result, unpickled) + def test_statvfs_attributes(self): if not hasattr(os, "statvfs"): return @@ -310,6 +318,20 @@ except TypeError: pass + @unittest.skipUnless(hasattr(os, 'statvfs'), + "need os.statvfs()") + def test_statvfs_result_pickle(self): + try: + result = os.statvfs(self.fname) + except OSError as e: + # On AtheOS, glibc always returns ENOSYS + if e.errno == errno.ENOSYS: + return + p = pickle.dumps(result) + self.assertIn(b'\x03cos\nstatvfs_result\n', p) + unpickled = pickle.loads(p) + self.assertEqual(result, unpickled) + def test_utime_dir(self): delta = 1000000 st = os.stat(support.TESTFN) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -431,10 +431,13 @@ modules = eval(stdout.decode('utf-8')) self.assertIn('site', modules) + # http://bugs.python.org/issue19205 re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} self.assertFalse(modules.intersection(re_mods)) - + # http://bugs.python.org/issue9548 self.assertNotIn('locale', modules) + # http://bugs.python.org/issue19209 + self.assertNotIn('copyreg', modules) if __name__ == "__main__": diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Library ------- +- Issue #19209: Remove import of copyreg from the os module to speed up + interpreter startup. stat_result and statvfs_result are now hard-coded to + reside in the os module. + - Issue #19205: Don't import the 're' module in site and sysconfig module to to speed up interpreter start. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -11974,7 +11974,7 @@ return NULL; #endif - stat_result_desc.name = MODNAME ".stat_result"; + stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; @@ -11983,7 +11983,7 @@ structseq_new = StatResultType.tp_new; StatResultType.tp_new = statresult_new; - statvfs_result_desc.name = MODNAME ".statvfs_result"; + statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ if (PyStructSequence_InitType2(&StatVFSResultType, &statvfs_result_desc) < 0) return NULL; -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Sat Oct 12 01:32:50 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 12 Oct 2013 09:32:50 +1000 Subject: [Python-checkins] cpython: Issue #19209: Remove import of copyreg from the os module to speed up In-Reply-To: <3cxQLj6bP0z7Lk3@mail.python.org> References: <3cxQLj6bP0z7Lk3@mail.python.org> Message-ID: On 12 Oct 2013 09:27, "christian.heimes" wrote: > > http://hg.python.org/cpython/rev/29c4a6a11e76 > changeset: 86216:29c4a6a11e76 > user: Christian Heimes > date: Sat Oct 12 01:27:08 2013 +0200 > summary: > Issue #19209: Remove import of copyreg from the os module to speed up > interpreter startup. stat_result and statvfs_result are now hard-coded to > reside in the os module. > The patch is based on Victor Stinner's patch. > > files: > Lib/os.py | 27 --------------------------- > Lib/test/test_os.py | 22 ++++++++++++++++++++++ > Lib/test/test_site.py | 5 ++++- > Misc/NEWS | 4 ++++ > Modules/posixmodule.c | 4 ++-- > 5 files changed, 32 insertions(+), 30 deletions(-) > > > diff --git a/Lib/os.py b/Lib/os.py > --- a/Lib/os.py > +++ b/Lib/os.py > @@ -945,33 +945,6 @@ > __all__.extend(["spawnlp", "spawnlpe"]) > > > -import copyreg as _copyreg > - > -def _make_stat_result(tup, dict): > - return stat_result(tup, dict) > - > -def _pickle_stat_result(sr): > - (type, args) = sr.__reduce__() > - return (_make_stat_result, args) > - > -try: > - _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result) > -except NameError: # stat_result may not exist > - pass > - > -def _make_statvfs_result(tup, dict): > - return statvfs_result(tup, dict) > - > -def _pickle_statvfs_result(sr): > - (type, args) = sr.__reduce__() > - return (_make_statvfs_result, args) > - > -try: > - _copyreg.pickle(statvfs_result, _pickle_statvfs_result, > - _make_statvfs_result) > -except NameError: # statvfs_result may not exist > - pass > - > # Supply os.popen() > def popen(cmd, mode="r", buffering=-1): > if not isinstance(cmd, str): > diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py > --- a/Lib/test/test_os.py > +++ b/Lib/test/test_os.py > @@ -26,6 +26,7 @@ > import codecs > import decimal > import fractions > +import pickle > try: > import threading > except ImportError: > @@ -264,6 +265,13 @@ > warnings.simplefilter("ignore", DeprecationWarning) > self.check_stat_attributes(fname) > > + def test_stat_result_pickle(self): > + result = os.stat(self.fname) > + p = pickle.dumps(result) > + self.assertIn(b'\x03cos\nstat_result\n', p) > + unpickled = pickle.loads(p) > + self.assertEqual(result, unpickled) > + > def test_statvfs_attributes(self): > if not hasattr(os, "statvfs"): > return > @@ -310,6 +318,20 @@ > except TypeError: > pass > > + @unittest.skipUnless(hasattr(os, 'statvfs'), > + "need os.statvfs()") > + def test_statvfs_result_pickle(self): > + try: > + result = os.statvfs(self.fname) > + except OSError as e: > + # On AtheOS, glibc always returns ENOSYS > + if e.errno == errno.ENOSYS: > + return > + p = pickle.dumps(result) > + self.assertIn(b'\x03cos\nstatvfs_result\n', p) > + unpickled = pickle.loads(p) > + self.assertEqual(result, unpickled) > + > def test_utime_dir(self): > delta = 1000000 > st = os.stat(support.TESTFN) > diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py > --- a/Lib/test/test_site.py > +++ b/Lib/test/test_site.py > @@ -431,10 +431,13 @@ > modules = eval(stdout.decode('utf-8')) > self.assertIn('site', modules) > > + # http://bugs.python.org/issue19205 > re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} > self.assertFalse(modules.intersection(re_mods)) > - > + # http://bugs.python.org/issue9548 > self.assertNotIn('locale', modules) This looks like it snuck in from a separate patch. Cheers, Nick. > + # http://bugs.python.org/issue19209 > + self.assertNotIn('copyreg', modules) > > > if __name__ == "__main__": > diff --git a/Misc/NEWS b/Misc/NEWS > --- a/Misc/NEWS > +++ b/Misc/NEWS > @@ -36,6 +36,10 @@ > Library > ------- > > +- Issue #19209: Remove import of copyreg from the os module to speed up > + interpreter startup. stat_result and statvfs_result are now hard-coded to > + reside in the os module. > + > - Issue #19205: Don't import the 're' module in site and sysconfig module to > to speed up interpreter start. > > diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c > --- a/Modules/posixmodule.c > +++ b/Modules/posixmodule.c > @@ -11974,7 +11974,7 @@ > return NULL; > #endif > > - stat_result_desc.name = MODNAME ".stat_result"; > + stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ > stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; > stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; > stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; > @@ -11983,7 +11983,7 @@ > structseq_new = StatResultType.tp_new; > StatResultType.tp_new = statresult_new; > > - statvfs_result_desc.name = MODNAME ".statvfs_result"; > + statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ > if (PyStructSequence_InitType2(&StatVFSResultType, > &statvfs_result_desc) < 0) > return NULL; > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sat Oct 12 01:34:11 2013 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Oct 2013 01:34:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_test=5Fos=3A_report_tests_?= =?utf-8?q?as_skipped_when_os=2Estatvfs=28=29_fails_with_ENOSYS?= Message-ID: <3cxQVC4rmqz7LlX@mail.python.org> http://hg.python.org/cpython/rev/930f9d6373bc changeset: 86217:930f9d6373bc user: Victor Stinner date: Sat Oct 12 01:33:54 2013 +0200 summary: test_os: report tests as skipped when os.statvfs() fails with ENOSYS files: Lib/test/test_os.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -281,7 +281,7 @@ except OSError as e: # On AtheOS, glibc always returns ENOSYS if e.errno == errno.ENOSYS: - return + self.skipTest('os.statvfs() failed with ENOSYS') # Make sure direct access works self.assertEqual(result.f_bfree, result[3]) @@ -326,7 +326,8 @@ except OSError as e: # On AtheOS, glibc always returns ENOSYS if e.errno == errno.ENOSYS: - return + self.skipTest('os.statvfs() failed with ENOSYS') + p = pickle.dumps(result) self.assertIn(b'\x03cos\nstatvfs_result\n', p) unpickled = pickle.loads(p) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 01:42:02 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 01:42:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319209=3A_fix_stru?= =?utf-8?q?ctseq_test?= Message-ID: <3cxQgG300bz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/89e405e6a7a9 changeset: 86218:89e405e6a7a9 parent: 86216:29c4a6a11e76 user: Christian Heimes date: Sat Oct 12 01:38:52 2013 +0200 summary: Issue #19209: fix structseq test files: Lib/test/test_structseq.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py --- a/Lib/test/test_structseq.py +++ b/Lib/test/test_structseq.py @@ -38,7 +38,7 @@ # os.stat() gives a complicated struct sequence. st = os.stat(__file__) rep = repr(st) - self.assertTrue(rep.startswith(os.name + ".stat_result")) + self.assertTrue(rep.startswith("os.stat_result")) self.assertIn("st_mode=", rep) self.assertIn("st_ino=", rep) self.assertIn("st_dev=", rep) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 01:42:03 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 01:42:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cxQgH4sy8z7Lk2@mail.python.org> http://hg.python.org/cpython/rev/64d9569b4e1f changeset: 86219:64d9569b4e1f parent: 86218:89e405e6a7a9 parent: 86217:930f9d6373bc user: Christian Heimes date: Sat Oct 12 01:41:49 2013 +0200 summary: merge files: Lib/test/test_os.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -281,7 +281,7 @@ except OSError as e: # On AtheOS, glibc always returns ENOSYS if e.errno == errno.ENOSYS: - return + self.skipTest('os.statvfs() failed with ENOSYS') # Make sure direct access works self.assertEqual(result.f_bfree, result[3]) @@ -326,7 +326,8 @@ except OSError as e: # On AtheOS, glibc always returns ENOSYS if e.errno == errno.ENOSYS: - return + self.skipTest('os.statvfs() failed with ENOSYS') + p = pickle.dumps(result) self.assertIn(b'\x03cos\nstatvfs_result\n', p) unpickled = pickle.loads(p) -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Sat Oct 12 01:53:12 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 12 Oct 2013 09:53:12 +1000 Subject: [Python-checkins] cpython: Issue #19209: fix structseq test In-Reply-To: <3cxQgG300bz7Lk2@mail.python.org> References: <3cxQgG300bz7Lk2@mail.python.org> Message-ID: On 12 Oct 2013 09:42, "christian.heimes" wrote: > > http://hg.python.org/cpython/rev/89e405e6a7a9 > changeset: 86218:89e405e6a7a9 > parent: 86216:29c4a6a11e76 > user: Christian Heimes > date: Sat Oct 12 01:38:52 2013 +0200 > summary: > Issue #19209: fix structseq test > > files: > Lib/test/test_structseq.py | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > > diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py > --- a/Lib/test/test_structseq.py > +++ b/Lib/test/test_structseq.py > @@ -38,7 +38,7 @@ > # os.stat() gives a complicated struct sequence. > st = os.stat(__file__) > rep = repr(st) > - self.assertTrue(rep.startswith(os.name + ".stat_result")) > + self.assertTrue(rep.startswith("os.stat_result")) If stat results can be pickled, this suggests a possible issue with unpickling pickles generated with older versions of Python. Cheers, Nick. > self.assertIn("st_mode=", rep) > self.assertIn("st_ino=", rep) > self.assertIn("st_dev=", rep) > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > -------------- next part -------------- An HTML attachment was scrubbed... URL: From solipsis at pitrou.net Sat Oct 12 04:45:02 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 12 Oct 2013 04:45:02 +0200 Subject: [Python-checkins] Daily reference leaks (64d9569b4e1f): sum=0 Message-ID: results for 64d9569b4e1f on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogxTtwJH', '-x'] From python-checkins at python.org Sat Oct 12 12:32:38 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 12:32:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319205=3A_add_debu?= =?utf-8?q?gging_output_for_failing_test_on_Snow_Leopard?= Message-ID: <3cxj5y4Wzvz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/a57dfbba91f9 changeset: 86220:a57dfbba91f9 user: Christian Heimes date: Sat Oct 12 12:32:21 2013 +0200 summary: Issue #19205: add debugging output for failing test on Snow Leopard files: Lib/test/test_site.py | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -425,19 +425,24 @@ def test_startup_imports(self): # This tests checks which modules are loaded by Python when it # initially starts upon startup. - args = [sys.executable, '-I', '-c', - 'import sys; print(set(sys.modules))'] - stdout = subprocess.check_output(args) - modules = eval(stdout.decode('utf-8')) + popen = subprocess.Popen([sys.executable, '-I', '-v', '-c', + 'import sys; print(set(sys.modules))'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = popen.communicate() + stdout = stdout.decode('utf-8') + stderr = stderr.decode('utf-8') + modules = eval(stdout) + self.assertIn('site', modules) # http://bugs.python.org/issue19205 re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} - self.assertFalse(modules.intersection(re_mods)) + self.assertFalse(modules.intersection(re_mods), stderr) # http://bugs.python.org/issue9548 - self.assertNotIn('locale', modules) + self.assertNotIn('locale', modules, stderr) # http://bugs.python.org/issue19209 - self.assertNotIn('copyreg', modules) + self.assertNotIn('copyreg', modules, stderr) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 13:24:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 13:24:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Markup_fix=2E?= Message-ID: <3cxkFJ3wqjz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/000a3f7487a5 changeset: 86221:000a3f7487a5 user: Georg Brandl date: Sat Oct 12 13:24:55 2013 +0200 summary: Markup fix. files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -604,7 +604,7 @@ libraries that assumed the previous behaviour was intentional can use :func:`inspect.unwrap` to gain equivalent behaviour. -* (C API) The result of the :c:var:`PyOS_ReadlineFunctionPointer` callback must +* (C API) The result of the :c:data:`PyOS_ReadlineFunctionPointer` callback must now be a string allocated by :c:func:`PyMem_RawMalloc` or :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred, instead of a string allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 14:51:48 2013 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Oct 2013 14:51:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2318754=3A_Run_Pyth?= =?utf-8?q?on_child_processes_in_isolated_more_in_the_test_suite=2E?= Message-ID: <3cxmBX4Vt0z7LjR@mail.python.org> http://hg.python.org/cpython/rev/72b2e7b74307 changeset: 86222:72b2e7b74307 user: Victor Stinner date: Sat Oct 12 14:44:01 2013 +0200 summary: Close #18754: Run Python child processes in isolated more in the test suite. files: Lib/test/script_helper.py | 18 +++++++++++++++++- Lib/test/test_cmd_line.py | 2 +- Lib/test/test_cmd_line_script.py | 10 ++++++---- Lib/test/test_compileall.py | 2 +- Lib/test/test_import.py | 3 ++- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py --- a/Lib/test/script_helper.py +++ b/Lib/test/script_helper.py @@ -17,8 +17,17 @@ # Executing the interpreter in a subprocess def _assert_python(expected_success, *args, **env_vars): + if '__isolated' in env_vars: + isolated = env_vars.pop('__isolated') + else: + isolated = not env_vars cmd_line = [sys.executable, '-X', 'faulthandler'] - if not env_vars: + if isolated: + # isolated mode: ignore Python environment variables, ignore user + # site-packages, and don't add the current directory to sys.path + cmd_line.append('-I') + elif not env_vars: + # ignore Python environment variables cmd_line.append('-E') # Need to preserve the original environment, for in-place testing of # shared library builds. @@ -51,6 +60,11 @@ Assert that running the interpreter with `args` and optional environment variables `env_vars` succeeds (rc == 0) and return a (return code, stdout, stderr) tuple. + + If the __cleanenv keyword is set, env_vars is used a fresh environment. + + Python is started in isolated mode (command line option -I), + except if the __isolated keyword is set to False. """ return _assert_python(True, *args, **env_vars) @@ -59,6 +73,8 @@ Assert that running the interpreter with `args` and optional environment variables `env_vars` fails (rc != 0) and return a (return code, stdout, stderr) tuple. + + See assert_python_ok() for more options. """ return _assert_python(False, *args, **env_vars) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -263,7 +263,7 @@ path = path.encode("ascii", "backslashreplace") sys.stdout.buffer.write(path)""" rc1, out1, err1 = assert_python_ok('-c', code, PYTHONPATH="") - rc2, out2, err2 = assert_python_ok('-c', code) + rc2, out2, err2 = assert_python_ok('-c', code, __isolated=False) # regarding to Posix specification, outputs should be equal # for empty and unset PYTHONPATH self.assertEqual(out1, out2) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -123,7 +123,7 @@ if not __debug__: cmd_line_switches += ('-' + 'O' * sys.flags.optimize,) run_args = cmd_line_switches + (script_name,) + tuple(example_args) - rc, out, err = assert_python_ok(*run_args) + rc, out, err = assert_python_ok(*run_args, __isolated=False) self._check_output(script_name, rc, out + err, expected_file, expected_argv0, expected_path0, expected_package, expected_loader) @@ -294,7 +294,7 @@ pkg_dir = os.path.join(script_dir, 'test_pkg') make_pkg(pkg_dir, "import sys; print('init_argv0==%r' % sys.argv[0])") script_name = _make_test_script(pkg_dir, 'script') - rc, out, err = assert_python_ok('-m', 'test_pkg.script', *example_args) + rc, out, err = assert_python_ok('-m', 'test_pkg.script', *example_args, __isolated=False) if verbose > 1: print(out) expected = "init_argv0==%r" % '-m' @@ -311,7 +311,8 @@ with open("-c", "w") as f: f.write("data") rc, out, err = assert_python_ok('-c', - 'import sys; print("sys.path[0]==%r" % sys.path[0])') + 'import sys; print("sys.path[0]==%r" % sys.path[0])', + __isolated=False) if verbose > 1: print(out) expected = "sys.path[0]==%r" % '' @@ -325,7 +326,8 @@ with support.change_cwd(path=script_dir): with open("-m", "w") as f: f.write("data") - rc, out, err = assert_python_ok('-m', 'other', *example_args) + rc, out, err = assert_python_ok('-m', 'other', *example_args, + __isolated=False) self._check_output(script_name, rc, out, script_name, script_name, '', '', importlib.machinery.SourceFileLoader) diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -295,7 +295,7 @@ pyc = importlib.util.cache_from_source(bazfn) os.rename(pyc, os.path.join(self.pkgdir, 'baz.pyc')) os.remove(bazfn) - rc, out, err = script_helper.assert_python_failure(fn) + rc, out, err = script_helper.assert_python_failure(fn, __isolated=False) self.assertRegex(err, b'File "dinsdale') def test_include_bad_file(self): diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -1058,7 +1058,8 @@ # encode filenames, especially on Windows pyname = script_helper.make_script('', TESTFN_UNENCODABLE, 'pass') name = pyname[:-3] - script_helper.assert_python_ok("-c", "mod = __import__(%a)" % name) + script_helper.assert_python_ok("-c", "mod = __import__(%a)" % name, + __isolated=False) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 15:00:56 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 15:00:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_wrong_exception_in_=5F?= =?utf-8?q?bootlocale_=28apparently_this_error_condition_is_never?= Message-ID: <3cxmP42MX3z7LjV@mail.python.org> http://hg.python.org/cpython/rev/1a980088c269 changeset: 86223:1a980088c269 user: Antoine Pitrou date: Sat Oct 12 15:00:44 2013 +0200 summary: Fix wrong exception in _bootlocale (apparently this error condition is never triggered) files: Lib/_bootlocale.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/_bootlocale.py b/Lib/_bootlocale.py --- a/Lib/_bootlocale.py +++ b/Lib/_bootlocale.py @@ -13,7 +13,7 @@ else: try: _locale.CODESET - except ImportError: + except AttributeError: def getpreferredencoding(do_setlocale=True): # This path for legacy systems needs the more complex # getdefaultlocale() function, import the full locale module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 15:09:00 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 12 Oct 2013 15:09:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319205=3A_=5Fosx?= =?utf-8?q?=5Fsupport_uses_the_re_module_all_over_the_place=2E_Omit_the_te?= =?utf-8?q?st?= Message-ID: <3cxmZN1Frlz7LjV@mail.python.org> http://hg.python.org/cpython/rev/9f6ef09f6492 changeset: 86224:9f6ef09f6492 user: Christian Heimes date: Sat Oct 12 15:08:42 2013 +0200 summary: Issue #19205: _osx_support uses the re module all over the place. Omit the test for nw. files: Lib/test/test_site.py | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -438,7 +438,9 @@ # http://bugs.python.org/issue19205 re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} - self.assertFalse(modules.intersection(re_mods), stderr) + # _osx_support uses the re module in many placs + if sys.platform != 'darwin': + self.assertFalse(modules.intersection(re_mods), stderr) # http://bugs.python.org/issue9548 self.assertNotIn('locale', modules, stderr) # http://bugs.python.org/issue19209 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 15:36:35 2013 From: python-checkins at python.org (ezio.melotti) Date: Sat, 12 Oct 2013 15:36:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2319221=3A_update_whatsne?= =?utf-8?q?w_entry_about_UCD_version=2E?= Message-ID: <3cxnBC2q9tz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/cc1e2f9a569a changeset: 86225:cc1e2f9a569a user: Ezio Melotti date: Sat Oct 12 16:36:13 2013 +0300 summary: #19221: update whatsnew entry about UCD version. files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -168,7 +168,7 @@ Some smaller changes made to the core Python language are: -* Unicode database updated to UCD version 6.2. +* Unicode database updated to UCD version 6.3. * :func:`min` and :func:`max` now accept a *default* argument that can be used to specify the value they return if the iterable they are evaluating has no -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 17:25:36 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 17:25:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTMx?= =?utf-8?q?=3A_The_aifc_module_now_correctly_reads_and_writes_sampwidth_of?= Message-ID: <3cxqc06fH6z7LkH@mail.python.org> http://hg.python.org/cpython/rev/567241d794bd changeset: 86226:567241d794bd branch: 2.7 parent: 86192:0820e8394d96 user: Serhiy Storchaka date: Sat Oct 12 18:21:12 2013 +0300 summary: Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. files: Lib/aifc.py | 12 +++++++----- Misc/NEWS | 3 +++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -480,7 +480,7 @@ pass else: self._convert = self._adpcm2lin - self._framesize = self._framesize // 4 + self._sampwidth = 2 return # for ULAW and ALAW try Compression Library try: @@ -490,21 +490,20 @@ try: import audioop self._convert = self._ulaw2lin - self._framesize = self._framesize // 2 + self._sampwidth = 2 return except ImportError: pass raise Error, 'cannot read compressed AIFF-C files' if self._comptype == 'ULAW': scheme = cl.G711_ULAW - self._framesize = self._framesize // 2 elif self._comptype == 'ALAW': scheme = cl.G711_ALAW - self._framesize = self._framesize // 2 else: raise Error, 'unsupported compression type' self._decomp = cl.OpenDecompressor(scheme) self._convert = self._decomp_data + self._sampwidth = 2 else: self._comptype = 'NONE' self._compname = 'not compressed' @@ -867,7 +866,10 @@ _write_short(self._file, self._nchannels) self._nframes_pos = self._file.tell() _write_ulong(self._file, self._nframes) - _write_short(self._file, self._sampwidth * 8) + if self._comptype in ('ULAW', 'ALAW', 'G722'): + _write_short(self._file, 8) + else: + _write_short(self._file, self._sampwidth * 8) _write_float(self._file, self._framerate) if self._aifc: self._file.write(self._comptype) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Library ------- +- Issue #19131: The aifc module now correctly reads and writes sampwidth of + compressed streams. + - Issue #19158: a rare race in BoundedSemaphore could allow .release() too often. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 17:25:38 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 17:25:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTMx?= =?utf-8?q?=3A_The_aifc_module_now_correctly_reads_and_writes_sampwidth_of?= Message-ID: <3cxqc21KVgz7LjV@mail.python.org> http://hg.python.org/cpython/rev/863a92cc9e03 changeset: 86227:863a92cc9e03 branch: 3.3 parent: 86207:2d146914d446 user: Serhiy Storchaka date: Sat Oct 12 18:21:33 2013 +0300 summary: Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. files: Lib/aifc.py | 9 +++++---- Misc/NEWS | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -457,15 +457,13 @@ if self._comptype != b'NONE': if self._comptype == b'G722': self._convert = self._adpcm2lin - self._framesize = self._framesize // 4 elif self._comptype in (b'ulaw', b'ULAW'): self._convert = self._ulaw2lin - self._framesize = self._framesize // 2 elif self._comptype in (b'alaw', b'ALAW'): self._convert = self._alaw2lin - self._framesize = self._framesize // 2 else: raise Error('unsupported compression type') + self._sampwidth = 2 else: self._comptype = b'NONE' self._compname = b'not compressed' @@ -787,7 +785,10 @@ _write_short(self._file, self._nchannels) self._nframes_pos = self._file.tell() _write_ulong(self._file, self._nframes) - _write_short(self._file, self._sampwidth * 8) + if self._comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): + _write_short(self._file, 8) + else: + _write_short(self._file, self._sampwidth * 8) _write_float(self._file, self._framerate) if self._aifc: self._file.write(self._comptype) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,9 @@ Library ------- +- Issue #19131: The aifc module now correctly reads and writes sampwidth of + compressed streams. + - Issue #19158: a rare race in BoundedSemaphore could allow .release() too often. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 17:25:39 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 17:25:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319131=3A_The_aifc_module_now_correctly_reads_an?= =?utf-8?q?d_writes_sampwidth_of?= Message-ID: <3cxqc33G6mz7Lkg@mail.python.org> http://hg.python.org/cpython/rev/cff4dd674efe changeset: 86228:cff4dd674efe parent: 86225:cc1e2f9a569a parent: 86227:863a92cc9e03 user: Serhiy Storchaka date: Sat Oct 12 18:23:21 2013 +0300 summary: Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. files: Lib/aifc.py | 9 +++++---- Misc/NEWS | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -468,15 +468,13 @@ if self._comptype != b'NONE': if self._comptype == b'G722': self._convert = self._adpcm2lin - self._framesize = self._framesize // 4 elif self._comptype in (b'ulaw', b'ULAW'): self._convert = self._ulaw2lin - self._framesize = self._framesize // 2 elif self._comptype in (b'alaw', b'ALAW'): self._convert = self._alaw2lin - self._framesize = self._framesize // 2 else: raise Error('unsupported compression type') + self._sampwidth = 2 else: self._comptype = b'NONE' self._compname = b'not compressed' @@ -804,7 +802,10 @@ _write_short(self._file, self._nchannels) self._nframes_pos = self._file.tell() _write_ulong(self._file, self._nframes) - _write_short(self._file, self._sampwidth * 8) + if self._comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): + _write_short(self._file, 8) + else: + _write_short(self._file, self._sampwidth * 8) _write_float(self._file, self._framerate) if self._aifc: self._file.write(self._comptype) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Library ------- +- Issue #19131: The aifc module now correctly reads and writes sampwidth of + compressed streams. + - Issue #19209: Remove import of copyreg from the os module to speed up interpreter startup. stat_result and statvfs_result are now hard-coded to reside in the os module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:11:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:11:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_4=3A_convert_to_reST=2C_u?= =?utf-8?q?pdate_SourceForge_-=3E_bugs=2Epython=2Eorg=2C_update?= Message-ID: <3cxrcR3x09z7Ljl@mail.python.org> http://hg.python.org/peps/rev/f7e3f6a53823 changeset: 5190:f7e3f6a53823 user: Georg Brandl date: Sat Oct 12 18:11:53 2013 +0200 summary: PEP 4: convert to reST, update SourceForge -> bugs.python.org, update DeprecationWarning policy and add removal of code using the module. Closes #8090. files: pep-0004.txt | 141 ++++++++++++++++++++++---------------- 1 files changed, 81 insertions(+), 60 deletions(-) diff --git a/pep-0004.txt b/pep-0004.txt --- a/pep-0004.txt +++ b/pep-0004.txt @@ -5,90 +5,99 @@ Author: Martin von L?wis Status: Active Type: Process +Content-Type: text/x-rst Created: 1-Oct-2000 Post-History: + Introduction +============ - When new modules were added to the standard Python library in the - past, it was not possible to foresee whether they would still be - useful in the future. Even though Python "Comes With Batteries - Included", batteries may discharge over time. Carrying old - modules around is a burden on the maintainer, especially when - there is no interest in the module anymore. +When new modules were added to the standard Python library in the +past, it was not possible to foresee whether they would still be +useful in the future. Even though Python "Comes With Batteries +Included", batteries may discharge over time. Carrying old modules +around is a burden on the maintainer, especially when there is no +interest in the module anymore. - At the same time, removing a module from the distribution is - difficult, as it is not known in general whether anybody is still - using it. This PEP defines a procedure for removing modules from - the standard Python library. Usage of a module may be - `deprecated', which means that it may be removed from a future - Python release. The rationale for deprecating a module is also - collected in this PEP. If the rationale turns out faulty, the - module may become `undeprecated'. +At the same time, removing a module from the distribution is +difficult, as it is not known in general whether anybody is still +using it. This PEP defines a procedure for removing modules from the +standard Python library. Usage of a module may be 'deprecated', which +means that it may be removed from a future Python release. The +rationale for deprecating a module is also collected in this PEP. If +the rationale turns out faulty, the module may become 'undeprecated'. Procedure for declaring a module deprecated +=========================================== - Since the status of module deprecation is recorded in this PEP, - proposals for deprecating modules MUST be made by providing a - change to the text of this PEP, which SHOULD be a patch posted to - SourceForge, or sent by mail to the author of this PEP. +Since the status of module deprecation is recorded in this PEP, +proposals for deprecating modules MUST be made by providing a change +to the text of this PEP, which SHOULD be a patch posted to +bugs.python.org. - A proposal for deprecation of the module MUST include the date of - the proposed deprecation and a rationale for deprecating it. In - addition, the proposal MUST include a change to the documentation - of the module; deprecation is indicated by saying that the module - is "obsolete" or "deprecated". The proposal MAY include a patch - for the module's source code to indicate deprecation there as - well. +A proposal for deprecation of the module MUST include the date of the +proposed deprecation and a rationale for deprecating it. In addition, +the proposal MUST include a change to the documentation of the module; +deprecation is indicated by saying that the module is "obsolete" or +"deprecated". The proposal SHOULD include a patch for the module's +source code to indicate deprecation there as well, by raising a +DeprecationWarning. The proposal MUST include patches to remove any +use of the deprecated module from the standard library. - It is expected that deprecated modules are included in the Python - releases that immediately follows the deprecation; later releases - may ship without the deprecated modules. +It is expected that deprecated modules are included in the Python +releases that immediately follows the deprecation; later releases may +ship without the deprecated modules. Procedure for declaring a module undeprecated +============================================= - When a module becomes deprecated, a rationale is given for its - deprecation. In some cases, an alternative interface for the same - functionality is provided, so the old interface is deprecated. In - other cases, the need for having the functionality of the module - may not exist anymore. +When a module becomes deprecated, a rationale is given for its +deprecation. In some cases, an alternative interface for the same +functionality is provided, so the old interface is deprecated. In +other cases, the need for having the functionality of the module may +not exist anymore. - If the rationale is faulty, again a change to this PEP's text MUST - be submitted. This change MUST include the date of undeprecation - and a rationale for undeprecation. Modules that are undeprecated - under this procedure MUST be listed in this PEP for at least one - major release of Python. +If the rationale is faulty, again a change to this PEP's text MUST be +submitted. This change MUST include the date of undeprecation and a +rationale for undeprecation. Modules that are undeprecated under this +procedure MUST be listed in this PEP for at least one major release of +Python. Obsolete modules +================ - A number of modules are already listed as obsolete in the library - documentation. These are listed here for completeness. +A number of modules are already listed as obsolete in the library +documentation. These are listed here for completeness. - cl, sv, timing + cl, sv, timing - All these modules have been declared as obsolete in Python 2.0, - some even earlier. +All these modules have been declared as obsolete in Python 2.0, some +even earlier. - The following obsolete modules were removed in Python 2.5: +The following obsolete modules were removed in Python 2.5: - addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, - grep, lockfile, newdir, ni, packmail, Para, poly, - rand, reconvert, regex, regsub, statcache, tb, tzparse, - util, whatsound, whrandom, zmod + addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, + grep, lockfile, newdir, ni, packmail, Para, poly, + rand, reconvert, regex, regsub, statcache, tb, tzparse, + util, whatsound, whrandom, zmod - The following modules were removed in Python 2.6: +The following modules were removed in Python 2.6: - gopherlib, rgbimg, macfs + gopherlib, rgbimg, macfs - The following modules currently lack a DeprecationWarning: +The following modules currently lack a DeprecationWarning: - rfc822, mimetools, multifile + rfc822, mimetools, multifile Deprecated modules +================== + +:: Module name: posixfile Rationale: Locking is better done by fcntl.lockf(). @@ -251,19 +260,31 @@ Deprecation of modules removed in Python 3.0 +============================================ - PEP 3108 lists all modules that have been removed from Python 3.0. - They all are documented as deprecated in Python 2.6, and raise a - DeprecationWarning if the -3 flag is activated. +PEP 3108 lists all modules that have been removed from Python 3.0. +They all are documented as deprecated in Python 2.6, and raise a +DeprecationWarning if the -3 flag is activated. Undeprecated modules +==================== - None. +None. + + +Copyright +========= + +This document has been placed in the public domain. -Local Variables: -mode: indented-text -indent-tabs-mode: nil -End: +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Oct 12 18:13:49 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:13:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMzIw?= =?utf-8?q?3=3A_add_a_FAQ_section_about_seemingly_duplicate_id=28=29s=2E?= Message-ID: <3cxrgd6SZNzSDW@mail.python.org> http://hg.python.org/cpython/rev/8525cc1f342f changeset: 86229:8525cc1f342f branch: 2.7 parent: 86226:567241d794bd user: Georg Brandl date: Sat Oct 12 18:14:25 2013 +0200 summary: Closes #13203: add a FAQ section about seemingly duplicate id()s. files: Doc/faq/programming.rst | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1724,6 +1724,32 @@ keeping a list of weak references to each instance. +Why does the result of ``id()`` appear to be not unique? +-------------------------------------------------------- + +The :func:`id` builtin returns an integer that is guaranteed to be unique during +the lifetime of the object. Since in CPython, this is the object's memory +address, it happens frequently that after an object is deleted from memory, the +next freshly created object is allocated at the same position in memory. This +is illustrated by this example: + +>>> id(1000) +13901272 +>>> id(2000) +13901272 + +The two ids belong to different integer objects that are created before, and +deleted immediately after execution of the ``id()`` call. To be sure that +objects whose id you want to examine are still alive, create another reference +to the object: + +>>> a = 1000; b = 2000 +>>> id(a) +13901272 +>>> id(b) +13891296 + + Modules ======= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:14:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:14:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzIw?= =?utf-8?q?3=3A_add_a_FAQ_section_about_seemingly_duplicate_id=28=29s=2E?= Message-ID: <3cxrhS65z9z7LjR@mail.python.org> http://hg.python.org/cpython/rev/0d5de993db66 changeset: 86230:0d5de993db66 branch: 3.3 parent: 86227:863a92cc9e03 user: Georg Brandl date: Sat Oct 12 18:14:25 2013 +0200 summary: Closes #13203: add a FAQ section about seemingly duplicate id()s. files: Doc/faq/programming.rst | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1599,6 +1599,32 @@ keeping a list of weak references to each instance. +Why does the result of ``id()`` appear to be not unique? +-------------------------------------------------------- + +The :func:`id` builtin returns an integer that is guaranteed to be unique during +the lifetime of the object. Since in CPython, this is the object's memory +address, it happens frequently that after an object is deleted from memory, the +next freshly created object is allocated at the same position in memory. This +is illustrated by this example: + +>>> id(1000) +13901272 +>>> id(2000) +13901272 + +The two ids belong to different integer objects that are created before, and +deleted immediately after execution of the ``id()`` call. To be sure that +objects whose id you want to examine are still alive, create another reference +to the object: + +>>> a = 1000; b = 2000 +>>> id(a) +13901272 +>>> id(b) +13891296 + + Modules ======= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:14:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:14:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxrhV0sS5z7LjR@mail.python.org> http://hg.python.org/cpython/rev/5e756a93d83b changeset: 86231:5e756a93d83b parent: 86228:cff4dd674efe parent: 86230:0d5de993db66 user: Georg Brandl date: Sat Oct 12 18:15:21 2013 +0200 summary: merge with 3.3 files: Doc/faq/programming.rst | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1599,6 +1599,32 @@ keeping a list of weak references to each instance. +Why does the result of ``id()`` appear to be not unique? +-------------------------------------------------------- + +The :func:`id` builtin returns an integer that is guaranteed to be unique during +the lifetime of the object. Since in CPython, this is the object's memory +address, it happens frequently that after an object is deleted from memory, the +next freshly created object is allocated at the same position in memory. This +is illustrated by this example: + +>>> id(1000) +13901272 +>>> id(2000) +13901272 + +The two ids belong to different integer objects that are created before, and +deleted immediately after execution of the ``id()`` call. To be sure that +objects whose id you want to examine are still alive, create another reference +to the object: + +>>> a = 1000; b = 2000 +>>> id(a) +13901272 +>>> id(b) +13891296 + + Modules ======= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:19:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:19:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTE3?= =?utf-8?q?9=3A_make_table_of_XML_vulnerabilities_clearer_by_using_=22ever?= =?utf-8?q?yday=22?= Message-ID: <3cxrnd2S04z7LjT@mail.python.org> http://hg.python.org/cpython/rev/6b0ca3963ff1 changeset: 86232:6b0ca3963ff1 branch: 3.3 parent: 86230:0d5de993db66 user: Georg Brandl date: Sat Oct 12 18:19:33 2013 +0200 summary: Closes #19179: make table of XML vulnerabilities clearer by using "everyday" booleans and explaining the table beforehand. files: Doc/library/xml.rst | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -53,15 +53,17 @@ to or circumvent firewalls. The attacks on XML abuse unfamiliar features like inline `DTD`_ (document type definition) with entities. +The following table gives an overview of the known attacks and if the various +modules are vulnerable to them. ========================= ======== ========= ========= ======== ========= kind sax etree minidom pulldom xmlrpc ========================= ======== ========= ========= ======== ========= -billion laughs **True** **True** **True** **True** **True** -quadratic blowup **True** **True** **True** **True** **True** -external entity expansion **True** False (1) False (2) **True** False (3) -DTD retrieval **True** False False **True** False -decompression bomb False False False False **True** +billion laughs **Yes** **Yes** **Yes** **Yes** **Yes** +quadratic blowup **Yes** **Yes** **Yes** **Yes** **Yes** +external entity expansion **Yes** No (1) No (2) **Yes** No (3) +DTD retrieval **Yes** No No **Yes** No +decompression bomb No No No No **Yes** ========================= ======== ========= ========= ======== ========= 1. :mod:`xml.etree.ElementTree` doesn't expand external entities and raises a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:19:02 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:19:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxrnf4CfGz7LjT@mail.python.org> http://hg.python.org/cpython/rev/ac0cd73e13ff changeset: 86233:ac0cd73e13ff parent: 86231:5e756a93d83b parent: 86232:6b0ca3963ff1 user: Georg Brandl date: Sat Oct 12 18:19:48 2013 +0200 summary: merge with 3.3 files: Doc/library/xml.rst | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -53,15 +53,17 @@ to or circumvent firewalls. The attacks on XML abuse unfamiliar features like inline `DTD`_ (document type definition) with entities. +The following table gives an overview of the known attacks and if the various +modules are vulnerable to them. ========================= ======== ========= ========= ======== ========= kind sax etree minidom pulldom xmlrpc ========================= ======== ========= ========= ======== ========= -billion laughs **True** **True** **True** **True** **True** -quadratic blowup **True** **True** **True** **True** **True** -external entity expansion **True** False (1) False (2) **True** False (3) -DTD retrieval **True** False False **True** False -decompression bomb False False False False **True** +billion laughs **Yes** **Yes** **Yes** **Yes** **Yes** +quadratic blowup **Yes** **Yes** **Yes** **Yes** **Yes** +external entity expansion **Yes** No (1) No (2) **Yes** No (3) +DTD retrieval **Yes** No No **Yes** No +decompression bomb No No No No **Yes** ========================= ======== ========= ========= ======== ========= 1. :mod:`xml.etree.ElementTree` doesn't expand external entities and raises a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:19:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:19:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTE3?= =?utf-8?q?9=3A_make_table_of_XML_vulnerabilities_clearer_by_using_=22ever?= =?utf-8?q?yday=22?= Message-ID: <3cxrnm6Njcz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/9aae58596349 changeset: 86234:9aae58596349 branch: 2.7 parent: 86229:8525cc1f342f user: Georg Brandl date: Sat Oct 12 18:19:33 2013 +0200 summary: Closes #19179: make table of XML vulnerabilities clearer by using "everyday" booleans and explaining the table beforehand. files: Doc/library/xml.rst | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -52,15 +52,17 @@ to or circumvent firewalls. The attacks on XML abuse unfamiliar features like inline `DTD`_ (document type definition) with entities. +The following table gives an overview of the known attacks and if the various +modules are vulnerable to them. ========================= ======== ========= ========= ======== ========= kind sax etree minidom pulldom xmlrpc ========================= ======== ========= ========= ======== ========= -billion laughs **True** **True** **True** **True** **True** -quadratic blowup **True** **True** **True** **True** **True** -external entity expansion **True** False (1) False (2) **True** False (3) -DTD retrieval **True** False False **True** False -decompression bomb False False False False **True** +billion laughs **Yes** **Yes** **Yes** **Yes** **Yes** +quadratic blowup **Yes** **Yes** **Yes** **Yes** **Yes** +external entity expansion **Yes** No (1) No (2) **Yes** No (3) +DTD retrieval **Yes** No No **Yes** No +decompression bomb No No No No **Yes** ========================= ======== ========= ========= ======== ========= 1. :mod:`xml.etree.ElementTree` doesn't expand external entities and raises a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:40:37 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:40:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzAy?= =?utf-8?q?6=3A_fix_documentation_of_MAKE=5FFUNCTION_for_3=2Ex=2E?= Message-ID: <3cxsGY1xLdzPXl@mail.python.org> http://hg.python.org/cpython/rev/b9ab48c491d5 changeset: 86235:b9ab48c491d5 branch: 3.3 parent: 86232:6b0ca3963ff1 user: Georg Brandl date: Sat Oct 12 18:41:18 2013 +0200 summary: Closes #13026: fix documentation of MAKE_FUNCTION for 3.x. files: Doc/library/dis.rst | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -754,10 +754,17 @@ .. opcode:: MAKE_FUNCTION (argc) - Pushes a new function object on the stack. TOS is the - :term:`qualified name` of the function; TOS1 is the code associated with - the function. The function object is defined to have *argc* default parameters, - which are found below TOS1. + Pushes a new function object on the stack. From bottom to top, the consumed + stack must consist of + + * ``argc & 0xFF`` default argument objects in positional order + * ``(argc >> 8) & 0xFF`` pairs of name and default argument, with the name + just below the object on the stack, for keyword-only parameters + * ``(argc >> 16) & 0x7FFF`` parameter annotation objects + * a tuple listing the parameter names for the annotations (only if there are + ony annotation objects) + * the code associated with the function (at TOS1) + * the :term:`qualified name` of the function (at TOS) .. opcode:: MAKE_CLOSURE (argc) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:40:38 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:40:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxsGZ48YHz7LjY@mail.python.org> http://hg.python.org/cpython/rev/9f844a7bf01e changeset: 86236:9f844a7bf01e parent: 86233:ac0cd73e13ff parent: 86235:b9ab48c491d5 user: Georg Brandl date: Sat Oct 12 18:41:23 2013 +0200 summary: merge with 3.3 files: Doc/library/dis.rst | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -846,10 +846,17 @@ .. opcode:: MAKE_FUNCTION (argc) - Pushes a new function object on the stack. TOS is the - :term:`qualified name` of the function; TOS1 is the code associated with - the function. The function object is defined to have *argc* default parameters, - which are found below TOS1. + Pushes a new function object on the stack. From bottom to top, the consumed + stack must consist of + + * ``argc & 0xFF`` default argument objects in positional order + * ``(argc >> 8) & 0xFF`` pairs of name and default argument, with the name + just below the object on the stack, for keyword-only parameters + * ``(argc >> 16) & 0x7FFF`` parameter annotation objects + * a tuple listing the parameter names for the annotations (only if there are + ony annotation objects) + * the code associated with the function (at TOS1) + * the :term:`qualified name` of the function (at TOS) .. opcode:: MAKE_CLOSURE (argc) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 18:43:28 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 18:43:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMzkw?= =?utf-8?q?5=3A_mention_rich-comparison_methods_in_addition_to_=5F=5Fcmp?= =?utf-8?q?=5F=5F_when?= Message-ID: <3cxsKr1jblz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/9f1e1da820fb changeset: 86237:9f1e1da820fb branch: 2.7 parent: 86234:9aae58596349 user: Georg Brandl date: Sat Oct 12 18:44:13 2013 +0200 summary: Closes #13905: mention rich-comparison methods in addition to __cmp__ when documenting how to make classes comparable and orderable. files: Doc/library/stdtypes.rst | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -189,11 +189,22 @@ and ``>=`` operators will raise a :exc:`TypeError` exception when any operand is a complex number. -.. index:: single: __cmp__() (instance method) - -Instances of a class normally compare as non-equal unless the class defines the -:meth:`__cmp__` method. Refer to :ref:`customization`) for information on the -use of this method to effect object comparisons. +.. index:: + single: __cmp__() (instance method) + single: __eq__() (instance method) + single: __ne__() (instance method) + single: __lt__() (instance method) + single: __le__() (instance method) + single: __gt__() (instance method) + single: __ge__() (instance method) + +Non-identical instances of a class normally compare as non-equal unless the +class defines the :meth:`__eq__` method or the :meth:`__cmp__` method. + +Instances of a class cannot be ordered with respect to other instances of the +same class, or other types of object, unless the class defines either enough of +the rich comparison methods (:meth:`__lt__`, :meth:`__le__`, :meth:`__gt__`, and +:meth:`__ge__`) or the :meth:`__cmp__` method. .. impl-detail:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 19:02:59 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 19:02:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzgz?= =?utf-8?q?3=3A_document_PyStructSequence_C-API_functions=2E?= Message-ID: <3cxsmM2pCrz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/05dcaf761c7d changeset: 86238:05dcaf761c7d branch: 3.3 parent: 86235:b9ab48c491d5 user: Georg Brandl date: Sat Oct 12 19:03:43 2013 +0200 summary: Closes #13833: document PyStructSequence C-API functions. files: Doc/c-api/tuple.rst | 100 ++++++++++++++++++++++++++++++++ 1 files changed, 100 insertions(+), 0 deletions(-) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -108,3 +108,103 @@ .. c:function:: int PyTuple_ClearFreeList() Clear the free list. Return the total number of freed items. + + +Struct Sequence Objects +----------------------- + +Struct sequence objects are the C equivalent of :func:`~collections.namedtuple` +objects, i.e. a sequence whose items can also be accessed through attributes. +To create a struct sequence, you first have to create a specific struct sequence +type. + +.. c:function:: PyTypeObject* PyStructSequence_NewType(PyStructSequence_Desc *desc) + + Create a new struct sequence type from the data in *desc*, described below. Instances + of the resulting type can be created with :c:func:`PyStructSequence_New`. + + +.. c:function:: void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) + + Initializes a struct sequence type *type* from *desc* in place. + + +.. c:type:: PyStructSequence_Desc + + Contains the meta information of a struct sequence type to create. + + +-------------------+------------------------------+------------------------------------+ + | Field | C Type | Meaning | + +===================+==============================+====================================+ + | ``name`` | ``char *`` | name of the struct sequence type | + +-------------------+------------------------------+------------------------------------+ + | ``doc`` | ``char *`` | pointer to docstring for the type | + | | | or NULL to omit | + +-------------------+------------------------------+------------------------------------+ + | ``fields`` | ``PyStructSequence_Field *`` | pointer to *NULL*-terminated array | + | | | with field names of the new type | + +-------------------+------------------------------+------------------------------------+ + | ``n_in_sequence`` | ``int`` | number of fields visible to the | + | | | Python side (if used as tuple) | + +-------------------+------------------------------+------------------------------------+ + + +.. c:type:: PyStructSequence_Field + + Describes a field of a struct sequence. As a struct sequence is modeled as a + tuple, all fields are typed as :c:type:`PyObject\*`. The index in the + :attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which + field of the struct sequence is described. + + +-----------+---------------+--------------------------------------+ + | Field | C Type | Meaning | + +===========+===============+======================================+ + | ``name`` | ``char *`` | name for the field or *NULL* to end | + | | | the list of named fields, set to | + | | | PyStructSequence_UnnamedField to | + | | | leave unnamed | + +-----------+---------------+--------------------------------------+ + | ``doc`` | ``char *`` | field docstring or *NULL* to omit | + +-----------+---------------+--------------------------------------+ + + +.. c:var:: char* PyStructSequence_UnnamedField + + Special value for a field name to leave it unnamed. + + +.. c:function:: PyObject* PyStructSequence_New(PyTypeObject *type) + + Creates an instance of *type*, which must have been created with + :c:func:`PyStructSequence_NewType`. + + +.. c:function:: PyObject* PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos) + + Return the object at position *pos* in the struct sequence pointed to by *p*. + No bounds checking is performed. + + +.. c:function:: PyObject* PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos) + + Macro equivalent of :c:func:`PyStructSequence_GetItem`. + + +.. c:function:: void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o) + + Sets the field at index *pos* of the struct sequence *p* to value *o*. Like + :c:func:`PyTuple_SET_ITEM`, this should only be used to fill in brand new + instances. + + .. note:: + + This function "steals" a reference to *o*. + + +.. c:function:: PyObject* PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o) + + Macro equivalent of :c:func:`PyStructSequence_SetItem`. + + .. note:: + + This function "steals" a reference to *o*. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 19:03:00 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 19:03:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxsmN6rh5z7Ljq@mail.python.org> http://hg.python.org/cpython/rev/34f170e78a32 changeset: 86239:34f170e78a32 parent: 86236:9f844a7bf01e parent: 86238:05dcaf761c7d user: Georg Brandl date: Sat Oct 12 19:03:47 2013 +0200 summary: merge with 3.3 files: Doc/c-api/tuple.rst | 100 ++++++++++++++++++++++++++++++++ 1 files changed, 100 insertions(+), 0 deletions(-) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -108,3 +108,103 @@ .. c:function:: int PyTuple_ClearFreeList() Clear the free list. Return the total number of freed items. + + +Struct Sequence Objects +----------------------- + +Struct sequence objects are the C equivalent of :func:`~collections.namedtuple` +objects, i.e. a sequence whose items can also be accessed through attributes. +To create a struct sequence, you first have to create a specific struct sequence +type. + +.. c:function:: PyTypeObject* PyStructSequence_NewType(PyStructSequence_Desc *desc) + + Create a new struct sequence type from the data in *desc*, described below. Instances + of the resulting type can be created with :c:func:`PyStructSequence_New`. + + +.. c:function:: void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) + + Initializes a struct sequence type *type* from *desc* in place. + + +.. c:type:: PyStructSequence_Desc + + Contains the meta information of a struct sequence type to create. + + +-------------------+------------------------------+------------------------------------+ + | Field | C Type | Meaning | + +===================+==============================+====================================+ + | ``name`` | ``char *`` | name of the struct sequence type | + +-------------------+------------------------------+------------------------------------+ + | ``doc`` | ``char *`` | pointer to docstring for the type | + | | | or NULL to omit | + +-------------------+------------------------------+------------------------------------+ + | ``fields`` | ``PyStructSequence_Field *`` | pointer to *NULL*-terminated array | + | | | with field names of the new type | + +-------------------+------------------------------+------------------------------------+ + | ``n_in_sequence`` | ``int`` | number of fields visible to the | + | | | Python side (if used as tuple) | + +-------------------+------------------------------+------------------------------------+ + + +.. c:type:: PyStructSequence_Field + + Describes a field of a struct sequence. As a struct sequence is modeled as a + tuple, all fields are typed as :c:type:`PyObject\*`. The index in the + :attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which + field of the struct sequence is described. + + +-----------+---------------+--------------------------------------+ + | Field | C Type | Meaning | + +===========+===============+======================================+ + | ``name`` | ``char *`` | name for the field or *NULL* to end | + | | | the list of named fields, set to | + | | | PyStructSequence_UnnamedField to | + | | | leave unnamed | + +-----------+---------------+--------------------------------------+ + | ``doc`` | ``char *`` | field docstring or *NULL* to omit | + +-----------+---------------+--------------------------------------+ + + +.. c:var:: char* PyStructSequence_UnnamedField + + Special value for a field name to leave it unnamed. + + +.. c:function:: PyObject* PyStructSequence_New(PyTypeObject *type) + + Creates an instance of *type*, which must have been created with + :c:func:`PyStructSequence_NewType`. + + +.. c:function:: PyObject* PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos) + + Return the object at position *pos* in the struct sequence pointed to by *p*. + No bounds checking is performed. + + +.. c:function:: PyObject* PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos) + + Macro equivalent of :c:func:`PyStructSequence_GetItem`. + + +.. c:function:: void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o) + + Sets the field at index *pos* of the struct sequence *p* to value *o*. Like + :c:func:`PyTuple_SET_ITEM`, this should only be used to fill in brand new + instances. + + .. note:: + + This function "steals" a reference to *o*. + + +.. c:function:: PyObject* PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o) + + Macro equivalent of :c:func:`PyStructSequence_SetItem`. + + .. note:: + + This function "steals" a reference to *o*. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 19:12:52 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 19:12:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzkx?= =?utf-8?q?5=3A_update_tutorial_with_respect_to_=2Epyc_files_=28=5F=5Fpyca?= =?utf-8?q?che=5F=5F_/_PEP?= Message-ID: <3cxszm0VzKzSyF@mail.python.org> http://hg.python.org/cpython/rev/6ecef57f57f9 changeset: 86240:6ecef57f57f9 branch: 3.3 parent: 86238:05dcaf761c7d user: Georg Brandl date: Sat Oct 12 19:13:23 2013 +0200 summary: Closes #13915: update tutorial with respect to .pyc files (__pycache__ / PEP 3147). Initial wording proposed by John Roth. files: Doc/tutorial/modules.rst | 76 +++++++++++---------------- 1 files changed, 32 insertions(+), 44 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,57 +183,45 @@ "Compiled" Python files ----------------------- -As an important speed-up of the start-up time for short programs that use a lot -of standard modules, if a file called :file:`spam.pyc` exists in the directory -where :file:`spam.py` is found, this is assumed to contain an -already-"byte-compiled" version of the module :mod:`spam`. The modification time -of the version of :file:`spam.py` used to create :file:`spam.pyc` is recorded in -:file:`spam.pyc`, and the :file:`.pyc` file is ignored if these don't match. +To speed up loading modules, Python caches the compiled version of each module +in the ``__pycache__`` directory under the name :file:`module.{version}.pyc``, +where the version encodes the format of the compiled file; it generally contains +the Python version number. For example, in CPython release 3.3 the compiled +version of spam.py would be cached as ``__pycache__/spam.cpython-33.pyc``. This +naming convention allows compiled modules from different releases and different +versions of Python to coexist. -Normally, you don't need to do anything to create the :file:`spam.pyc` file. -Whenever :file:`spam.py` is successfully compiled, an attempt is made to write -the compiled version to :file:`spam.pyc`. It is not an error if this attempt -fails; if for any reason the file is not written completely, the resulting -:file:`spam.pyc` file will be recognized as invalid and thus ignored later. The -contents of the :file:`spam.pyc` file are platform independent, so a Python -module directory can be shared by machines of different architectures. +Python checks the modification date of the source against the compiled version +to see if it's out of date and needs to be recompiled. This is a completely +automatic process. Also, the compiled modules are platform-independent, so the +same library can be shared among systems with different architectures. + +Python does not check the cache in two circumstances. First, it always +recompiles and does not store the result for the module that's loaded directly +from the command line. Second, it does not check the cache if there is no +source module. To support a non-source (compiled only) distribution, the +compiled module must be in the source directory, and there must not be a source +module. Some tips for experts: -* When the Python interpreter is invoked with the :option:`-O` flag, optimized - code is generated and stored in :file:`.pyo` files. The optimizer currently - doesn't help much; it only removes :keyword:`assert` statements. When - :option:`-O` is used, *all* :term:`bytecode` is optimized; ``.pyc`` files are - ignored and ``.py`` files are compiled to optimized bytecode. +* You can use the :option:`-O` or :option:`-OO` switches on the Python command + to reduce the size of a compiled module. The ``-O`` switch removes assert + statements, the ``-OO`` switch removes both assert statements and __doc__ + strings. Since some programs may rely on having these available, you should + only use this option if you know what you're doing. "Optimized" modules have + a .pyo rather than a .pyc suffix and are usually smaller. Future releases may + change the effects of optimization. -* Passing two :option:`-O` flags to the Python interpreter (:option:`-OO`) will - cause the bytecode compiler to perform optimizations that could in some rare - cases result in malfunctioning programs. Currently only ``__doc__`` strings are - removed from the bytecode, resulting in more compact :file:`.pyo` files. Since - some programs may rely on having these available, you should only use this - option if you know what you're doing. +* A program doesn't run any faster when it is read from a ``.pyc`` or ``.pyo`` + file than when it is read from a ``.py`` file; the only thing that's faster + about ``.pyc`` or ``.pyo`` files is the speed with which they are loaded. -* A program doesn't run any faster when it is read from a :file:`.pyc` or - :file:`.pyo` file than when it is read from a :file:`.py` file; the only thing - that's faster about :file:`.pyc` or :file:`.pyo` files is the speed with which - they are loaded. +* The module :mod:`compileall` can create .pyc files (or .pyo files when + :option:`-O` is used) for all modules in a directory. -* When a script is run by giving its name on the command line, the bytecode for - the script is never written to a :file:`.pyc` or :file:`.pyo` file. Thus, the - startup time of a script may be reduced by moving most of its code to a module - and having a small bootstrap script that imports that module. It is also - possible to name a :file:`.pyc` or :file:`.pyo` file directly on the command - line. - -* It is possible to have a file called :file:`spam.pyc` (or :file:`spam.pyo` - when :option:`-O` is used) without a file :file:`spam.py` for the same module. - This can be used to distribute a library of Python code in a form that is - moderately hard to reverse engineer. - - .. index:: module: compileall - -* The module :mod:`compileall` can create :file:`.pyc` files (or :file:`.pyo` - files when :option:`-O` is used) for all modules in a directory. +* There is more detail on this process, including a flow chart of the + decisions, in PEP 3147. .. _tut-standardmodules: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 19:12:53 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 19:12:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxszn3QcJz7LjY@mail.python.org> http://hg.python.org/cpython/rev/23fe05e85ba3 changeset: 86241:23fe05e85ba3 parent: 86239:34f170e78a32 parent: 86240:6ecef57f57f9 user: Georg Brandl date: Sat Oct 12 19:13:38 2013 +0200 summary: merge with 3.3 files: Doc/tutorial/modules.rst | 76 +++++++++++---------------- 1 files changed, 32 insertions(+), 44 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,57 +183,45 @@ "Compiled" Python files ----------------------- -As an important speed-up of the start-up time for short programs that use a lot -of standard modules, if a file called :file:`spam.pyc` exists in the directory -where :file:`spam.py` is found, this is assumed to contain an -already-"byte-compiled" version of the module :mod:`spam`. The modification time -of the version of :file:`spam.py` used to create :file:`spam.pyc` is recorded in -:file:`spam.pyc`, and the :file:`.pyc` file is ignored if these don't match. +To speed up loading modules, Python caches the compiled version of each module +in the ``__pycache__`` directory under the name :file:`module.{version}.pyc``, +where the version encodes the format of the compiled file; it generally contains +the Python version number. For example, in CPython release 3.3 the compiled +version of spam.py would be cached as ``__pycache__/spam.cpython-33.pyc``. This +naming convention allows compiled modules from different releases and different +versions of Python to coexist. -Normally, you don't need to do anything to create the :file:`spam.pyc` file. -Whenever :file:`spam.py` is successfully compiled, an attempt is made to write -the compiled version to :file:`spam.pyc`. It is not an error if this attempt -fails; if for any reason the file is not written completely, the resulting -:file:`spam.pyc` file will be recognized as invalid and thus ignored later. The -contents of the :file:`spam.pyc` file are platform independent, so a Python -module directory can be shared by machines of different architectures. +Python checks the modification date of the source against the compiled version +to see if it's out of date and needs to be recompiled. This is a completely +automatic process. Also, the compiled modules are platform-independent, so the +same library can be shared among systems with different architectures. + +Python does not check the cache in two circumstances. First, it always +recompiles and does not store the result for the module that's loaded directly +from the command line. Second, it does not check the cache if there is no +source module. To support a non-source (compiled only) distribution, the +compiled module must be in the source directory, and there must not be a source +module. Some tips for experts: -* When the Python interpreter is invoked with the :option:`-O` flag, optimized - code is generated and stored in :file:`.pyo` files. The optimizer currently - doesn't help much; it only removes :keyword:`assert` statements. When - :option:`-O` is used, *all* :term:`bytecode` is optimized; ``.pyc`` files are - ignored and ``.py`` files are compiled to optimized bytecode. +* You can use the :option:`-O` or :option:`-OO` switches on the Python command + to reduce the size of a compiled module. The ``-O`` switch removes assert + statements, the ``-OO`` switch removes both assert statements and __doc__ + strings. Since some programs may rely on having these available, you should + only use this option if you know what you're doing. "Optimized" modules have + a .pyo rather than a .pyc suffix and are usually smaller. Future releases may + change the effects of optimization. -* Passing two :option:`-O` flags to the Python interpreter (:option:`-OO`) will - cause the bytecode compiler to perform optimizations that could in some rare - cases result in malfunctioning programs. Currently only ``__doc__`` strings are - removed from the bytecode, resulting in more compact :file:`.pyo` files. Since - some programs may rely on having these available, you should only use this - option if you know what you're doing. +* A program doesn't run any faster when it is read from a ``.pyc`` or ``.pyo`` + file than when it is read from a ``.py`` file; the only thing that's faster + about ``.pyc`` or ``.pyo`` files is the speed with which they are loaded. -* A program doesn't run any faster when it is read from a :file:`.pyc` or - :file:`.pyo` file than when it is read from a :file:`.py` file; the only thing - that's faster about :file:`.pyc` or :file:`.pyo` files is the speed with which - they are loaded. +* The module :mod:`compileall` can create .pyc files (or .pyo files when + :option:`-O` is used) for all modules in a directory. -* When a script is run by giving its name on the command line, the bytecode for - the script is never written to a :file:`.pyc` or :file:`.pyo` file. Thus, the - startup time of a script may be reduced by moving most of its code to a module - and having a small bootstrap script that imports that module. It is also - possible to name a :file:`.pyc` or :file:`.pyo` file directly on the command - line. - -* It is possible to have a file called :file:`spam.pyc` (or :file:`spam.pyo` - when :option:`-O` is used) without a file :file:`spam.py` for the same module. - This can be used to distribute a library of Python code in a form that is - moderately hard to reverse engineer. - - .. index:: module: compileall - -* The module :mod:`compileall` can create :file:`.pyc` files (or :file:`.pyo` - files when :option:`-O` is used) for all modules in a directory. +* There is more detail on this process, including a flow chart of the + decisions, in PEP 3147. .. _tut-standardmodules: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:00:25 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 20:00:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Introduce_supp?= =?utf-8?q?ort_for_documenting_which_C_API_elements_are_not_part_of_the?= Message-ID: <3cxv2d07Xpz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/a63af1c8e0b1 changeset: 86242:a63af1c8e0b1 branch: 3.3 parent: 86240:6ecef57f57f9 user: Georg Brandl date: Sat Oct 12 19:54:30 2013 +0200 summary: Introduce support for documenting which C API elements are not part of the stable/limited API. files: Doc/c-api/index.rst | 2 +- Doc/c-api/stable.rst | 51 ++-- Doc/conf.py | 4 +- Doc/tools/sphinxext/c_annotations.py | 117 ++++++++++ Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 8 + 5 files changed, 152 insertions(+), 30 deletions(-) diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst --- a/Doc/c-api/index.rst +++ b/Doc/c-api/index.rst @@ -13,6 +13,7 @@ :maxdepth: 2 intro.rst + stable.rst veryhigh.rst refcounting.rst exceptions.rst @@ -22,5 +23,4 @@ init.rst memory.rst objimpl.rst - stable.rst apiabiversion.rst diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -6,36 +6,33 @@ Stable Application Binary Interface *********************************** -Traditionally, the C API of Python will change with every release. -Most changes will be source-compatible, typically by only adding API, -rather than changing existing API or removing API (although some -interfaces do get removed after being deprecated first). +Traditionally, the C API of Python will change with every release. Most changes +will be source-compatible, typically by only adding API, rather than changing +existing API or removing API (although some interfaces do get removed after +being deprecated first). -Unfortunately, the API compatibility does not extend to binary -compatibility (the ABI). The reason is primarily the evolution of -struct definitions, where addition of a new field, or changing -the type of a field, might not break the API, but can break the ABI. -As a consequence, extension modules need to be recompiled for -every Python release (although an exception is possible on Unix -when none of the affected interfaces are used). In addition, on -Windows, extension modules link with a specific pythonXY.dll and -need to be recompiled to link with a newer one. +Unfortunately, the API compatibility does not extend to binary compatibility +(the ABI). The reason is primarily the evolution of struct definitions, where +addition of a new field, or changing the type of a field, might not break the +API, but can break the ABI. As a consequence, extension modules need to be +recompiled for every Python release (although an exception is possible on Unix +when none of the affected interfaces are used). In addition, on Windows, +extension modules link with a specific pythonXY.dll and need to be recompiled to +link with a newer one. -Since Python 3.2, a subset of the API has been declared to guarantee -a stable ABI. Extension modules wishing to use this API need to define -``Py_LIMITED_API``. A number of interpreter details then become hidden -from the extension module; in return, a module is built that works -on any 3.x version (x>=2) without recompilation. +Since Python 3.2, a subset of the API has been declared to guarantee a stable +ABI. Extension modules wishing to use this API (called "limited API") need to +define ``Py_LIMITED_API``. A number of interpreter details then become hidden +from the extension module; in return, a module is built that works on any 3.x +version (x>=2) without recompilation. In some cases, the stable ABI needs to be extended with new functions. -Extension modules wishing to use these new APIs need to set -``Py_LIMITED_API`` to the ``PY_VERSION_HEX`` value (see -:ref:`apiabiversion`) of the minimum Python version they want to -support (e.g. ``0x03030000`` for Python 3.3). Such modules will work -on all subsequent Python releases, but fail to load (because of +Extension modules wishing to use these new APIs need to set ``Py_LIMITED_API`` +to the ``PY_VERSION_HEX`` value (see :ref:`apiabiversion`) of the minimum Python +version they want to support (e.g. ``0x03030000`` for Python 3.3). Such modules +will work on all subsequent Python releases, but fail to load (because of missing symbols) on the older releases. -As of Python 3.2, the set of functions available to the limited API -is documented in PEP 384. - -.. XXX copy exact list here? Into each functions definition? +As of Python 3.2, the set of functions available to the limited API is +documented in PEP 384. In the C API documentation, API elements that are not +part of the limited API are marked as "Not part of the limited API." diff --git a/Doc/conf.py b/Doc/conf.py --- a/Doc/conf.py +++ b/Doc/conf.py @@ -12,8 +12,8 @@ # General configuration # --------------------- -extensions = ['sphinx.ext.refcounting', 'sphinx.ext.coverage', - 'sphinx.ext.doctest', 'pyspecific'] +extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', + 'pyspecific', 'c_annotations'] templates_path = ['tools/sphinxext'] # General substitutions. diff --git a/Doc/tools/sphinxext/c_annotations.py b/Doc/tools/sphinxext/c_annotations.py new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/c_annotations.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +""" + c_annotations.py + ~~~~~~~~~~~~~~~~ + + Supports annotations for C API elements: + + * reference count annotations for C API functions. Based on + refcount.py and anno-api.py in the old Python documentation tools. + + * stable API annotations + + Usage: Set the `refcount_file` config value to the path to the reference + count data file. + + :copyright: Copyright 2007-2013 by Georg Brandl. + :license: Python license. +""" + +from os import path +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx import addnodes +from sphinx.domains.c import CObject + + +class RCEntry: + def __init__(self, name): + self.name = name + self.args = [] + self.result_type = '' + self.result_refs = None + + +class Annotations(dict): + @classmethod + def fromfile(cls, filename): + d = cls() + fp = open(filename, 'r') + try: + for line in fp: + line = line.strip() + if line[:1] in ("", "#"): + # blank lines and comments + continue + parts = line.split(":", 4) + if len(parts) != 5: + raise ValueError("Wrong field count in %r" % line) + function, type, arg, refcount, comment = parts + # Get the entry, creating it if needed: + try: + entry = d[function] + except KeyError: + entry = d[function] = RCEntry(function) + if not refcount or refcount == "null": + refcount = None + else: + refcount = int(refcount) + # Update the entry with the new parameter or the result + # information. + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + finally: + fp.close() + return d + + def add_annotations(self, app, doctree): + for node in doctree.traverse(addnodes.desc_content): + par = node.parent + if par['domain'] != 'c': + continue + if par['notlimited']: + node.insert(0, nodes.emphasis(' Not part of the stable API.', + ' Not part of the stable API.', + classes=['notlimited'])) + if par['objtype'] != 'function': + continue + if not par[0].has_key('names') or not par[0]['names']: + continue + entry = self.get(par[0]['names'][0]) + if not entry: + continue + elif entry.result_type not in ("PyObject*", "PyVarObject*"): + continue + if entry.result_refs is None: + rc = 'Return value: Always NULL.' + elif entry.result_refs: + rc = 'Return value: New reference.' + else: + rc = 'Return value: Borrowed reference.' + node.insert(0, nodes.emphasis(rc, rc, classes=['refcount'])) + + +def init_annotations(app): + refcounts = Annotations.fromfile( + path.join(app.srcdir, app.config.refcount_file)) + app.connect('doctree-read', refcounts.add_annotations) + + +def setup(app): + app.add_config_value('refcount_file', '', True) + app.connect('builder-inited', init_annotations) + + # monkey-patch C object... + CObject.option_spec = { + 'noindex': directives.flag, + 'notlimited': directives.flag, + } + old_handle_signature = CObject.handle_signature + def new_handle_signature(self, sig, signode): + signode.parent['notlimited'] = 'notlimited' in self.options + return old_handle_signature(self, sig, signode) + CObject.handle_signature = new_handle_signature diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -168,3 +168,11 @@ div.footer a:hover { color: #0095C4; } + +.refcount { + color: #060; +} + +.notlimited { + color: #922; +} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:00:26 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 20:00:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxv2f48PFz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/b59bff04aec8 changeset: 86243:b59bff04aec8 parent: 86241:23fe05e85ba3 parent: 86242:a63af1c8e0b1 user: Georg Brandl date: Sat Oct 12 20:01:14 2013 +0200 summary: merge with 3.3 files: Doc/c-api/index.rst | 2 +- Doc/c-api/stable.rst | 51 ++-- Doc/conf.py | 4 +- Doc/tools/sphinxext/c_annotations.py | 117 ++++++++++ Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 8 + 5 files changed, 152 insertions(+), 30 deletions(-) diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst --- a/Doc/c-api/index.rst +++ b/Doc/c-api/index.rst @@ -13,6 +13,7 @@ :maxdepth: 2 intro.rst + stable.rst veryhigh.rst refcounting.rst exceptions.rst @@ -22,5 +23,4 @@ init.rst memory.rst objimpl.rst - stable.rst apiabiversion.rst diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -6,36 +6,33 @@ Stable Application Binary Interface *********************************** -Traditionally, the C API of Python will change with every release. -Most changes will be source-compatible, typically by only adding API, -rather than changing existing API or removing API (although some -interfaces do get removed after being deprecated first). +Traditionally, the C API of Python will change with every release. Most changes +will be source-compatible, typically by only adding API, rather than changing +existing API or removing API (although some interfaces do get removed after +being deprecated first). -Unfortunately, the API compatibility does not extend to binary -compatibility (the ABI). The reason is primarily the evolution of -struct definitions, where addition of a new field, or changing -the type of a field, might not break the API, but can break the ABI. -As a consequence, extension modules need to be recompiled for -every Python release (although an exception is possible on Unix -when none of the affected interfaces are used). In addition, on -Windows, extension modules link with a specific pythonXY.dll and -need to be recompiled to link with a newer one. +Unfortunately, the API compatibility does not extend to binary compatibility +(the ABI). The reason is primarily the evolution of struct definitions, where +addition of a new field, or changing the type of a field, might not break the +API, but can break the ABI. As a consequence, extension modules need to be +recompiled for every Python release (although an exception is possible on Unix +when none of the affected interfaces are used). In addition, on Windows, +extension modules link with a specific pythonXY.dll and need to be recompiled to +link with a newer one. -Since Python 3.2, a subset of the API has been declared to guarantee -a stable ABI. Extension modules wishing to use this API need to define -``Py_LIMITED_API``. A number of interpreter details then become hidden -from the extension module; in return, a module is built that works -on any 3.x version (x>=2) without recompilation. +Since Python 3.2, a subset of the API has been declared to guarantee a stable +ABI. Extension modules wishing to use this API (called "limited API") need to +define ``Py_LIMITED_API``. A number of interpreter details then become hidden +from the extension module; in return, a module is built that works on any 3.x +version (x>=2) without recompilation. In some cases, the stable ABI needs to be extended with new functions. -Extension modules wishing to use these new APIs need to set -``Py_LIMITED_API`` to the ``PY_VERSION_HEX`` value (see -:ref:`apiabiversion`) of the minimum Python version they want to -support (e.g. ``0x03030000`` for Python 3.3). Such modules will work -on all subsequent Python releases, but fail to load (because of +Extension modules wishing to use these new APIs need to set ``Py_LIMITED_API`` +to the ``PY_VERSION_HEX`` value (see :ref:`apiabiversion`) of the minimum Python +version they want to support (e.g. ``0x03030000`` for Python 3.3). Such modules +will work on all subsequent Python releases, but fail to load (because of missing symbols) on the older releases. -As of Python 3.2, the set of functions available to the limited API -is documented in PEP 384. - -.. XXX copy exact list here? Into each functions definition? +As of Python 3.2, the set of functions available to the limited API is +documented in PEP 384. In the C API documentation, API elements that are not +part of the limited API are marked as "Not part of the limited API." diff --git a/Doc/conf.py b/Doc/conf.py --- a/Doc/conf.py +++ b/Doc/conf.py @@ -12,8 +12,8 @@ # General configuration # --------------------- -extensions = ['sphinx.ext.refcounting', 'sphinx.ext.coverage', - 'sphinx.ext.doctest', 'pyspecific'] +extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', + 'pyspecific', 'c_annotations'] templates_path = ['tools/sphinxext'] # General substitutions. diff --git a/Doc/tools/sphinxext/c_annotations.py b/Doc/tools/sphinxext/c_annotations.py new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/c_annotations.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +""" + c_annotations.py + ~~~~~~~~~~~~~~~~ + + Supports annotations for C API elements: + + * reference count annotations for C API functions. Based on + refcount.py and anno-api.py in the old Python documentation tools. + + * stable API annotations + + Usage: Set the `refcount_file` config value to the path to the reference + count data file. + + :copyright: Copyright 2007-2013 by Georg Brandl. + :license: Python license. +""" + +from os import path +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx import addnodes +from sphinx.domains.c import CObject + + +class RCEntry: + def __init__(self, name): + self.name = name + self.args = [] + self.result_type = '' + self.result_refs = None + + +class Annotations(dict): + @classmethod + def fromfile(cls, filename): + d = cls() + fp = open(filename, 'r') + try: + for line in fp: + line = line.strip() + if line[:1] in ("", "#"): + # blank lines and comments + continue + parts = line.split(":", 4) + if len(parts) != 5: + raise ValueError("Wrong field count in %r" % line) + function, type, arg, refcount, comment = parts + # Get the entry, creating it if needed: + try: + entry = d[function] + except KeyError: + entry = d[function] = RCEntry(function) + if not refcount or refcount == "null": + refcount = None + else: + refcount = int(refcount) + # Update the entry with the new parameter or the result + # information. + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + finally: + fp.close() + return d + + def add_annotations(self, app, doctree): + for node in doctree.traverse(addnodes.desc_content): + par = node.parent + if par['domain'] != 'c': + continue + if par['notlimited']: + node.insert(0, nodes.emphasis(' Not part of the stable API.', + ' Not part of the stable API.', + classes=['notlimited'])) + if par['objtype'] != 'function': + continue + if not par[0].has_key('names') or not par[0]['names']: + continue + entry = self.get(par[0]['names'][0]) + if not entry: + continue + elif entry.result_type not in ("PyObject*", "PyVarObject*"): + continue + if entry.result_refs is None: + rc = 'Return value: Always NULL.' + elif entry.result_refs: + rc = 'Return value: New reference.' + else: + rc = 'Return value: Borrowed reference.' + node.insert(0, nodes.emphasis(rc, rc, classes=['refcount'])) + + +def init_annotations(app): + refcounts = Annotations.fromfile( + path.join(app.srcdir, app.config.refcount_file)) + app.connect('doctree-read', refcounts.add_annotations) + + +def setup(app): + app.add_config_value('refcount_file', '', True) + app.connect('builder-inited', init_annotations) + + # monkey-patch C object... + CObject.option_spec = { + 'noindex': directives.flag, + 'notlimited': directives.flag, + } + old_handle_signature = CObject.handle_signature + def new_handle_signature(self, sig, signode): + signode.parent['notlimited'] = 'notlimited' in self.options + return old_handle_signature(self, sig, signode) + CObject.handle_signature = new_handle_signature diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -168,3 +168,11 @@ div.footer a:hover { color: #0095C4; } + +.refcount { + color: #060; +} + +.notlimited { + color: #922; +} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:38:52 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 20:38:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_If_the_close=28=29_method_of_a_writer_in_the_sunau_or_wave_?= =?utf-8?q?module?= Message-ID: <3cxvv04rhqz7LjM@mail.python.org> http://hg.python.org/cpython/rev/3303d735058f changeset: 86244:3303d735058f branch: 2.7 parent: 86237:9f1e1da820fb user: Serhiy Storchaka date: Sat Oct 12 21:35:33 2013 +0300 summary: Issue #18919: If the close() method of a writer in the sunau or wave module failed, second invocation of close() and destructor no more raise an exception. Second invocation of close() on sunau writer now has no effects. The aifc module now accepts lower case of names of the 'ulaw' and 'alaw' codecs. files: Lib/aifc.py | 18 +++++++++--------- Lib/sunau.py | 15 +++++++++------ Lib/wave.py | 12 +++++++----- Misc/NEWS | 6 ++++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -486,7 +486,7 @@ try: import cl except ImportError: - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): try: import audioop self._convert = self._ulaw2lin @@ -495,9 +495,9 @@ except ImportError: pass raise Error, 'cannot read compressed AIFF-C files' - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): scheme = cl.G711_ULAW - elif self._comptype == 'ALAW': + elif self._comptype in ('ALAW', 'alaw'): scheme = cl.G711_ALAW else: raise Error, 'unsupported compression type' @@ -654,7 +654,7 @@ def setcomptype(self, comptype, compname): if self._nframeswritten: raise Error, 'cannot change parameters after starting to write' - if comptype not in ('NONE', 'ULAW', 'ALAW', 'G722'): + if comptype not in ('NONE', 'ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): raise Error, 'unsupported compression type' self._comptype = comptype self._compname = compname @@ -674,7 +674,7 @@ nchannels, sampwidth, framerate, nframes, comptype, compname = info if self._nframeswritten: raise Error, 'cannot change parameters after starting to write' - if comptype not in ('NONE', 'ULAW', 'ALAW', 'G722'): + if comptype not in ('NONE', 'ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): raise Error, 'unsupported compression type' self.setnchannels(nchannels) self.setsampwidth(sampwidth) @@ -803,7 +803,7 @@ try: import cl except ImportError: - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): try: import audioop self._convert = self._lin2ulaw @@ -811,9 +811,9 @@ except ImportError: pass raise Error, 'cannot write compressed AIFF-C files' - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): scheme = cl.G711_ULAW - elif self._comptype == 'ALAW': + elif self._comptype in ('ALAW', 'alaw'): scheme = cl.G711_ALAW else: raise Error, 'unsupported compression type' @@ -866,7 +866,7 @@ _write_short(self._file, self._nchannels) self._nframes_pos = self._file.tell() _write_ulong(self._file, self._nframes) - if self._comptype in ('ULAW', 'ALAW', 'G722'): + if self._comptype in ('ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): _write_short(self._file, 8) else: _write_short(self._file, self._sampwidth * 8) diff --git a/Lib/sunau.py b/Lib/sunau.py --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -406,12 +406,15 @@ self._patchheader() def close(self): - self._ensure_header_written() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + if self._file: + try: + self._ensure_header_written() + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None # # private methods diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -436,11 +436,13 @@ def close(self): if self._file: - self._ensure_header_written(0) - if self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + try: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None if self._i_opened_the_file: self._i_opened_the_file.close() self._i_opened_the_file = None diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,12 @@ Library ------- +- Issue #18919: If the close() method of a writer in the sunau or wave module + failed, second invocation of close() and destructor no more raise an + exception. Second invocation of close() on sunau writer now has no effects. + The aifc module now accepts lower case of names of the 'ulaw' and 'alaw' + codecs. + - Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:38:53 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 20:38:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_If_the_close=28=29_method_of_a_writer_in_the_sunau_or_wave_?= =?utf-8?q?module?= Message-ID: <3cxvv16hT6z7LjM@mail.python.org> http://hg.python.org/cpython/rev/b7eae747385c changeset: 86245:b7eae747385c branch: 3.3 parent: 86242:a63af1c8e0b1 user: Serhiy Storchaka date: Sat Oct 12 21:36:10 2013 +0300 summary: Issue #18919: If the close() method of a writer in the sunau or wave module failed, second invocation of close() and destructor no more raise an exception. files: Lib/sunau.py | 19 +++++++++++-------- Lib/wave.py | 12 +++++++----- Misc/NEWS | 4 ++++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Lib/sunau.py b/Lib/sunau.py --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -414,14 +414,17 @@ self._patchheader() def close(self): - self._ensure_header_written() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - if self._opened and self._file: - self._file.close() - self._file = None + if self._file: + try: + self._ensure_header_written() + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + if self._opened and self._file: + self._file.close() + finally: + self._file = None # # private methods diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -436,11 +436,13 @@ def close(self): if self._file: - self._ensure_header_written(0) - if self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + try: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None if self._i_opened_the_file: self._i_opened_the_file.close() self._i_opened_the_file = None diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,10 @@ Library ------- +- Issue #18919: If the close() method of a writer in the sunau or wave module + failed, second invocation of close() and destructor no more raise an + exception. + - Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:38:55 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 12 Oct 2013 20:38:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3cxvv31Tzbz7LjS@mail.python.org> http://hg.python.org/cpython/rev/cd0fe2b4a2cd changeset: 86246:cd0fe2b4a2cd parent: 86243:b59bff04aec8 parent: 86245:b7eae747385c user: Serhiy Storchaka date: Sat Oct 12 21:38:14 2013 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:51:45 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 20:51:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_compatibil?= =?utf-8?q?ity_with_upcoming_Sphinx_1=2E2=2E?= Message-ID: <3cxw9s0hyTz7LjS@mail.python.org> http://hg.python.org/cpython/rev/52d8df5fc023 changeset: 86247:52d8df5fc023 branch: 2.7 parent: 86244:3303d735058f user: Georg Brandl date: Sat Oct 12 20:50:21 2013 +0200 summary: Fix compatibility with upcoming Sphinx 1.2. files: Doc/tools/sphinxext/pyspecific.py | 33 +++++++++--------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py --- a/Doc/tools/sphinxext/pyspecific.py +++ b/Doc/tools/sphinxext/pyspecific.py @@ -5,7 +5,7 @@ Sphinx extension with Python doc-specific markup. - :copyright: 2008, 2009, 2010 by Georg Brandl. + :copyright: 2008-2013 by Georg Brandl. :license: Python license. """ @@ -13,7 +13,12 @@ SOURCE_URI = 'http://hg.python.org/cpython/file/2.7/%s' from docutils import nodes, utils + +import sphinx from sphinx.util.nodes import split_explicit_title +from sphinx.writers.html import HTMLTranslator +from sphinx.writers.latex import LaTeXTranslator +from sphinx.locale import versionlabels # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -22,21 +27,17 @@ Body.enum.converters['lowerroman'] = \ Body.enum.converters['upperroman'] = lambda x: None -# monkey-patch HTML translator to give versionmodified paragraphs a class -def new_visit_versionmodified(self, node): - self.body.append(self.starttag(node, 'p', CLASS=node['type'])) - text = versionlabels[node['type']] % node['version'] - if len(node): - text += ': ' - else: - text += '.' - self.body.append('%s' % text) - -from sphinx.writers.html import HTMLTranslator -from sphinx.writers.latex import LaTeXTranslator -from sphinx.locale import versionlabels -HTMLTranslator.visit_versionmodified = new_visit_versionmodified -HTMLTranslator.visit_versionmodified = new_visit_versionmodified +if sphinx.__version__[:3] < '1.2': + # monkey-patch HTML translator to give versionmodified paragraphs a class + def new_visit_versionmodified(self, node): + self.body.append(self.starttag(node, 'p', CLASS=node['type'])) + text = versionlabels[node['type']] % node['version'] + if len(node): + text += ': ' + else: + text += '.' + self.body.append('%s' % text) + HTMLTranslator.visit_versionmodified = new_visit_versionmodified # monkey-patch HTML and LaTeX translators to keep doctest blocks in the # doctest docs themselves -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:53:03 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 20:53:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_compatibil?= =?utf-8?q?ity_with_upcoming_Sphinx_1=2E2=2E?= Message-ID: <3cxwCM4BQCz7LjS@mail.python.org> http://hg.python.org/cpython/rev/1514384b5d28 changeset: 86248:1514384b5d28 branch: 3.3 parent: 86245:b7eae747385c user: Georg Brandl date: Sat Oct 12 20:50:21 2013 +0200 summary: Fix compatibility with upcoming Sphinx 1.2. files: Doc/tools/sphinxext/pyspecific.py | 33 +++++++++--------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py --- a/Doc/tools/sphinxext/pyspecific.py +++ b/Doc/tools/sphinxext/pyspecific.py @@ -5,7 +5,7 @@ Sphinx extension with Python doc-specific markup. - :copyright: 2008, 2009, 2010, 2011, 2012 by Georg Brandl. + :copyright: 2008-2013 by Georg Brandl. :license: Python license. """ @@ -13,7 +13,12 @@ SOURCE_URI = 'http://hg.python.org/cpython/file/3.3/%s' from docutils import nodes, utils + +import sphinx from sphinx.util.nodes import split_explicit_title +from sphinx.writers.html import HTMLTranslator +from sphinx.writers.latex import LaTeXTranslator +from sphinx.locale import versionlabels # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -22,21 +27,17 @@ Body.enum.converters['lowerroman'] = \ Body.enum.converters['upperroman'] = lambda x: None -# monkey-patch HTML translator to give versionmodified paragraphs a class -def new_visit_versionmodified(self, node): - self.body.append(self.starttag(node, 'p', CLASS=node['type'])) - text = versionlabels[node['type']] % node['version'] - if len(node): - text += ':' - else: - text += '.' - self.body.append('%s ' % text) - -from sphinx.writers.html import HTMLTranslator -from sphinx.writers.latex import LaTeXTranslator -from sphinx.locale import versionlabels -HTMLTranslator.visit_versionmodified = new_visit_versionmodified -HTMLTranslator.visit_versionmodified = new_visit_versionmodified +if sphinx.__version__[:3] < '1.2': + # monkey-patch HTML translator to give versionmodified paragraphs a class + def new_visit_versionmodified(self, node): + self.body.append(self.starttag(node, 'p', CLASS=node['type'])) + text = versionlabels[node['type']] % node['version'] + if len(node): + text += ':' + else: + text += '.' + self.body.append('%s ' % text) + HTMLTranslator.visit_versionmodified = new_visit_versionmodified # monkey-patch HTML and LaTeX translators to keep doctest blocks in the # doctest docs themselves -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 20:53:04 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 20:53:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxwCN6hX1z7LjS@mail.python.org> http://hg.python.org/cpython/rev/7c8f7174deff changeset: 86249:7c8f7174deff parent: 86246:cd0fe2b4a2cd parent: 86248:1514384b5d28 user: Georg Brandl date: Sat Oct 12 20:53:53 2013 +0200 summary: merge with 3.3 files: Doc/tools/sphinxext/pyspecific.py | 33 +++++++++--------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py --- a/Doc/tools/sphinxext/pyspecific.py +++ b/Doc/tools/sphinxext/pyspecific.py @@ -5,7 +5,7 @@ Sphinx extension with Python doc-specific markup. - :copyright: 2008, 2009, 2010, 2011, 2012 by Georg Brandl. + :copyright: 2008-2013 by Georg Brandl. :license: Python license. """ @@ -13,7 +13,12 @@ SOURCE_URI = 'http://hg.python.org/cpython/file/default/%s' from docutils import nodes, utils + +import sphinx from sphinx.util.nodes import split_explicit_title +from sphinx.writers.html import HTMLTranslator +from sphinx.writers.latex import LaTeXTranslator +from sphinx.locale import versionlabels # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -22,21 +27,17 @@ Body.enum.converters['lowerroman'] = \ Body.enum.converters['upperroman'] = lambda x: None -# monkey-patch HTML translator to give versionmodified paragraphs a class -def new_visit_versionmodified(self, node): - self.body.append(self.starttag(node, 'p', CLASS=node['type'])) - text = versionlabels[node['type']] % node['version'] - if len(node): - text += ':' - else: - text += '.' - self.body.append('%s ' % text) - -from sphinx.writers.html import HTMLTranslator -from sphinx.writers.latex import LaTeXTranslator -from sphinx.locale import versionlabels -HTMLTranslator.visit_versionmodified = new_visit_versionmodified -HTMLTranslator.visit_versionmodified = new_visit_versionmodified +if sphinx.__version__[:3] < '1.2': + # monkey-patch HTML translator to give versionmodified paragraphs a class + def new_visit_versionmodified(self, node): + self.body.append(self.starttag(node, 'p', CLASS=node['type'])) + text = versionlabels[node['type']] % node['version'] + if len(node): + text += ':' + else: + text += '.' + self.body.append('%s ' % text) + HTMLTranslator.visit_versionmodified = new_visit_versionmodified # monkey-patch HTML and LaTeX translators to keep doctest blocks in the # doctest docs themselves -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 21:01:41 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 21:01:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?benchmarks=3A_Also_ignore_lib2to3=27s?= =?utf-8?q?_remains_in_lib3?= Message-ID: <3cxwPK54g2zRrC@mail.python.org> http://hg.python.org/benchmarks/rev/c169fa4e50ba changeset: 212:c169fa4e50ba user: Antoine Pitrou date: Sat Oct 12 21:01:33 2013 +0200 summary: Also ignore lib2to3's remains in lib3 files: .hgignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -5,6 +5,7 @@ *.pyd *.o lib/2to3/lib2to3/*.pickle +lib3/2to3/lib2to3/*.pickle *.cover *~ .coverage -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Sat Oct 12 21:24:20 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 12 Oct 2013 21:24:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_add_some_audio_formats?= Message-ID: <3cxwvT00rRz7LjV@mail.python.org> http://hg.python.org/cpython/rev/554ebba8036d changeset: 86250:554ebba8036d user: Benjamin Peterson date: Sat Oct 12 15:24:15 2013 -0400 summary: add some audio formats files: .hgeol | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/.hgeol b/.hgeol --- a/.hgeol +++ b/.hgeol @@ -10,6 +10,7 @@ **.vsprops = BIN **.aif = BIN +**.aiff = BIN **.au = BIN **.bmp = BIN **.db = BIN @@ -23,6 +24,7 @@ **.png = BIN **.psd = BIN **.tar = BIN +**.wav = BIN **.xar = BIN **.zip = BIN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 21:28:16 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 12 Oct 2013 21:28:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_add_aifc?= Message-ID: <3cxx000KSBz7LjS@mail.python.org> http://hg.python.org/cpython/rev/c7fd3919bab6 changeset: 86251:c7fd3919bab6 user: Benjamin Peterson date: Sat Oct 12 15:28:10 2013 -0400 summary: add aifc files: .hgeol | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgeol b/.hgeol --- a/.hgeol +++ b/.hgeol @@ -10,6 +10,7 @@ **.vsprops = BIN **.aif = BIN +**.aifc = BIN **.aiff = BIN **.au = BIN **.bmp = BIN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 21:55:42 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 12 Oct 2013 21:55:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_backport_media?= =?utf-8?q?_types_from_default?= Message-ID: <3cxxbf0ZMQzSmB@mail.python.org> http://hg.python.org/cpython/rev/3c1e2cba8a75 changeset: 86252:3c1e2cba8a75 branch: 3.3 parent: 86248:1514384b5d28 user: Benjamin Peterson date: Sat Oct 12 15:54:05 2013 -0400 summary: backport media types from default files: .hgeol | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/.hgeol b/.hgeol --- a/.hgeol +++ b/.hgeol @@ -10,6 +10,8 @@ **.vsprops = BIN **.aif = BIN +**.aifc = BIN +**.aiff = BIN **.au = BIN **.bmp = BIN **.db = BIN @@ -23,6 +25,7 @@ **.png = BIN **.psd = BIN **.tar = BIN +**.wav = BIN **.xar = BIN **.zip = BIN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 21:55:43 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 12 Oct 2013 21:55:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_add_more_media?= =?utf-8?q?_types?= Message-ID: <3cxxbg2DWsz7LjR@mail.python.org> http://hg.python.org/cpython/rev/ced6d02097e6 changeset: 86253:ced6d02097e6 branch: 2.7 parent: 86247:52d8df5fc023 user: Benjamin Peterson date: Sat Oct 12 15:55:24 2013 -0400 summary: add more media types files: .hgeol | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/.hgeol b/.hgeol --- a/.hgeol +++ b/.hgeol @@ -10,6 +10,8 @@ **.vsprops = BIN **.aif = BIN +**.aifc = BIN +**.aiff = BIN **.au = BIN **.bmp = BIN **.db = BIN @@ -23,6 +25,7 @@ **.png = BIN **.psd = BIN **.tar = BIN +**.wav = BIN **.xar = BIN **.zip = BIN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 21:55:44 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 12 Oct 2013 21:55:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy4z?= Message-ID: <3cxxbh3zVnz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/94e459da3234 changeset: 86254:94e459da3234 parent: 86251:c7fd3919bab6 parent: 86252:3c1e2cba8a75 user: Benjamin Peterson date: Sat Oct 12 15:55:33 2013 -0400 summary: merge 3.3 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:25:54 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 22:25:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319219=3A_Speed_up?= =?utf-8?q?_marshal=2Eloads=28=29=2C_and_make_pyc_files_slightly_=285=25_t?= =?utf-8?b?byAxMCUp?= Message-ID: <3cxyGV6MKWz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/4059e871e74e changeset: 86255:4059e871e74e user: Antoine Pitrou date: Sat Oct 12 22:25:39 2013 +0200 summary: Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller. files: Include/marshal.h | 2 +- Lib/test/test_marshal.py | 8 +- Python/importlib.h | 6625 ++++++++++++------------- Python/marshal.c | 390 +- 4 files changed, 3471 insertions(+), 3554 deletions(-) diff --git a/Include/marshal.h b/Include/marshal.h --- a/Include/marshal.h +++ b/Include/marshal.h @@ -7,7 +7,7 @@ extern "C" { #endif -#define Py_MARSHAL_VERSION 3 +#define Py_MARSHAL_VERSION 4 PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -262,11 +262,11 @@ def test_bad_reader(self): class BadReader(io.BytesIO): - def read(self, n=-1): - b = super().read(n) + def readinto(self, buf): + n = super().readinto(buf) if n is not None and n > 4: - b += b' ' * 10**6 - return b + n += 10**6 + return n for value in (1.0, 1j, b'0123456789', '0123456789'): self.assertRaises(ValueError, marshal.load, BadReader(marshal.dumps(value))) diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -51,6 +51,12 @@ #define TYPE_FROZENSET '>' #define FLAG_REF '\x80' /* with a type, add obj to index */ +#define TYPE_ASCII 'a' +#define TYPE_ASCII_INTERNED 'A' +#define TYPE_SMALL_TUPLE ')' +#define TYPE_SHORT_ASCII 'z' +#define TYPE_SHORT_ASCII_INTERNED 'Z' + #define WFERR_OK 0 #define WFERR_UNMARSHALLABLE 1 #define WFERR_NESTEDTOODEEP 2 @@ -66,6 +72,8 @@ PyObject *current_filename; char *ptr; char *end; + char *buf; + Py_ssize_t buf_size; PyObject *refs; /* dict on marshal, list on unmarshal */ int version; } WFILE; @@ -148,6 +156,13 @@ w_string(s, n, p); } +static void +w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) +{ + w_byte(n, p); + w_string(s, n, p); +} + /* We assume that Python ints are stored internally in base some power of 2**15; for the sake of portability we'll always read and write them in base exactly 2**15. */ @@ -394,24 +409,51 @@ w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p); } else if (PyUnicode_CheckExact(v)) { - PyObject *utf8; - utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); - if (utf8 == NULL) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; + if (p->version >= 4 && PyUnicode_IS_ASCII(v)) { + int is_short = PyUnicode_GET_LENGTH(v) < 256; + if (is_short) { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); + else + W_TYPE(TYPE_SHORT_ASCII, p); + w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } + else { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_ASCII_INTERNED, p); + else + W_TYPE(TYPE_ASCII, p); + w_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } } - if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) - W_TYPE(TYPE_INTERNED, p); - else - W_TYPE(TYPE_UNICODE, p); - w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); - Py_DECREF(utf8); + else { + PyObject *utf8; + utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); + if (utf8 == NULL) { + p->depth--; + p->error = WFERR_UNMARSHALLABLE; + return; + } + if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_INTERNED, p); + else + W_TYPE(TYPE_UNICODE, p); + w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); + Py_DECREF(utf8); + } } else if (PyTuple_CheckExact(v)) { - W_TYPE(TYPE_TUPLE, p); n = PyTuple_Size(v); - W_SIZE(n, p); + if (p->version >= 4 && n < 256) { + W_TYPE(TYPE_SMALL_TUPLE, p); + w_byte(n, p); + } + else { + W_TYPE(TYPE_TUPLE, p); + W_SIZE(n, p); + } for (i = 0; i < n; i++) { w_object(PyTuple_GET_ITEM(v, i), p); } @@ -537,59 +579,75 @@ typedef WFILE RFILE; /* Same struct with different invariants */ -#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF) +static char * +r_string(Py_ssize_t n, RFILE *p) +{ + Py_ssize_t read = -1; -static Py_ssize_t -r_string(char *s, Py_ssize_t n, RFILE *p) -{ - char *ptr; - Py_ssize_t read, left; + if (p->ptr != NULL) { + /* Fast path for loads() */ + char *res = p->ptr; + Py_ssize_t left = p->end - p->ptr; + if (left < n) { + PyErr_SetString(PyExc_EOFError, + "marshal data too short"); + return NULL; + } + p->ptr += n; + return res; + } + if (p->buf == NULL) { + p->buf = PyMem_MALLOC(n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } + else if (p->buf_size < n) { + p->buf = PyMem_REALLOC(p->buf, n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } + if (!p->readable) { + assert(p->fp != NULL); + /* The result fits into int because it must be <=n. */ + read = fread(p->buf, 1, n, p->fp); + } + else { + _Py_IDENTIFIER(readinto); + PyObject *res, *mview; + Py_buffer buf; - if (!p->readable) { - if (p->fp != NULL) - /* The result fits into int because it must be <=n. */ - read = fread(s, 1, n, p->fp); - else { - left = p->end - p->ptr; - read = (left < n) ? left : n; - memcpy(s, p->ptr, read); - p->ptr += read; + if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1) + return NULL; + mview = PyMemoryView_FromBuffer(&buf); + if (mview == NULL) + return NULL; + + res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview); + if (res != NULL) { + read = PyNumber_AsSsize_t(res, PyExc_ValueError); + Py_DECREF(res); } } - else { - _Py_IDENTIFIER(read); - - PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n); - read = 0; - if (data != NULL) { - if (!PyBytes_Check(data)) { - PyErr_Format(PyExc_TypeError, - "f.read() returned not bytes but %.100s", - data->ob_type->tp_name); - } - else { - read = (int)PyBytes_GET_SIZE(data); - if (read > 0) { - if (read > n) { - PyErr_Format(PyExc_ValueError, - "read() returned too much data: " - "%zd bytes requested, %zd returned", - n, read); - read = -1; - } - else { - ptr = PyBytes_AS_STRING(data); - memcpy(s, ptr, read); - } - } - } - Py_DECREF(data); + if (read != n) { + if (!PyErr_Occurred()) { + if (read > n) + PyErr_Format(PyExc_ValueError, + "read() returned too much data: " + "%zd bytes requested, %zd returned", + n, read); + else + PyErr_SetString(PyExc_EOFError, + "EOF read where not expected"); } + return NULL; } - if (!PyErr_Occurred() && (read < n)) { - PyErr_SetString(PyExc_EOFError, "EOF read where not expected"); - } - return read; + return p->buf; } @@ -597,15 +655,20 @@ r_byte(RFILE *p) { int c = EOF; - unsigned char ch; - Py_ssize_t n; - if (!p->readable) - c = p->fp ? getc(p->fp) : rs_byte(p); + if (p->ptr != NULL) { + if (p->ptr < p->end) + c = (unsigned char) *p->ptr++; + return c; + } + if (!p->readable) { + assert(p->fp); + c = getc(p->fp); + } else { - n = r_string((char *) &ch, 1, p); - if (n > 0) - c = ch; + char *ptr = r_string(1, p); + if (ptr != NULL) + c = *(unsigned char *) ptr; } return c; } @@ -613,32 +676,36 @@ static int r_short(RFILE *p) { - short x; - unsigned char buffer[2]; + short x = -1; + unsigned char *buffer; - r_string((char *) buffer, 2, p); - x = buffer[0]; - x |= buffer[1] << 8; - /* Sign-extension, in case short greater than 16 bits */ - x |= -(x & 0x8000); + buffer = (unsigned char *) r_string(2, p); + if (buffer != NULL) { + x = buffer[0]; + x |= buffer[1] << 8; + /* Sign-extension, in case short greater than 16 bits */ + x |= -(x & 0x8000); + } return x; } static long r_long(RFILE *p) { - long x; - unsigned char buffer[4]; + long x = -1; + unsigned char *buffer; - r_string((char *) buffer, 4, p); - x = buffer[0]; - x |= (long)buffer[1] << 8; - x |= (long)buffer[2] << 16; - x |= (long)buffer[3] << 24; + buffer = (unsigned char *) r_string(4, p); + if (buffer != NULL) { + x = buffer[0]; + x |= (long)buffer[1] << 8; + x |= (long)buffer[2] << 16; + x |= (long)buffer[3] << 24; #if SIZEOF_LONG > 4 - /* Sign extension for 64-bit machines */ - x |= -(x & 0x80000000L); + /* Sign extension for 64-bit machines */ + x |= -(x & 0x80000000L); #endif + } return x; } @@ -716,9 +783,7 @@ r_ref_reserve(int flag, RFILE *p) { if (flag) { /* currently only FLAG_REF is defined */ - Py_ssize_t idx = PyList_Size(p->refs); - if (idx < 0) - return -1; + Py_ssize_t idx = PyList_GET_SIZE(p->refs); if (idx >= 0x7ffffffe) { PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)"); return -1; @@ -742,12 +807,10 @@ r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p) { if (o != NULL && flag) { /* currently only FLAG_REF is defined */ - if (PyList_SetItem(p->refs, idx, o) < 0) { - Py_DECREF(o); /* release the new object */ - return NULL; - } else { - Py_INCREF(o); /* a reference for the list */ - } + PyObject *tmp = PyList_GET_ITEM(p->refs, idx); + Py_INCREF(o); + PyList_SET_ITEM(p->refs, idx, o); + Py_DECREF(tmp); } return o; } @@ -777,7 +840,7 @@ Py_ssize_t idx = 0; long i, n; int type, code = r_byte(p); - int flag; + int flag, is_interned = 0; PyObject *retval; if (code == EOF) { @@ -846,7 +909,7 @@ case TYPE_FLOAT: { - char buf[256]; + char buf[256], *ptr; double dx; retval = NULL; n = r_byte(p); @@ -855,8 +918,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; dx = PyOS_string_to_double(buf, NULL, NULL); if (dx == -1.0 && PyErr_Occurred()) @@ -868,9 +933,10 @@ case TYPE_BINARY_FLOAT: { - unsigned char buf[8]; + unsigned char *buf; double x; - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -886,7 +952,7 @@ case TYPE_COMPLEX: { - char buf[256]; + char buf[256], *ptr; Py_complex c; retval = NULL; n = r_byte(p); @@ -895,8 +961,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.real = PyOS_string_to_double(buf, NULL, NULL); if (c.real == -1.0 && PyErr_Occurred()) @@ -907,8 +975,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.imag = PyOS_string_to_double(buf, NULL, NULL); if (c.imag == -1.0 && PyErr_Occurred()) @@ -920,9 +990,10 @@ case TYPE_BINARY_COMPLEX: { - unsigned char buf[8]; + unsigned char *buf; Py_complex c; - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -931,7 +1002,8 @@ retval = NULL; break; } - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -946,32 +1018,82 @@ } case TYPE_STRING: + { + char *ptr; + n = r_long(p); + if (PyErr_Occurred()) { + retval = NULL; + break; + } + if (n < 0 || n > SIZE32_MAX) { + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + retval = NULL; + break; + } + v = PyBytes_FromStringAndSize((char *)NULL, n); + if (v == NULL) { + retval = NULL; + break; + } + ptr = r_string(n, p); + if (ptr == NULL) { + Py_DECREF(v); + retval = NULL; + break; + } + memcpy(PyBytes_AS_STRING(v), ptr, n); + retval = v; + R_REF(retval); + break; + } + + case TYPE_ASCII_INTERNED: + is_interned = 1; + case TYPE_ASCII: n = r_long(p); if (PyErr_Occurred()) { retval = NULL; break; } if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); retval = NULL; break; } - v = PyBytes_FromStringAndSize((char *)NULL, n); - if (v == NULL) { - retval = NULL; + goto _read_ascii; + + case TYPE_SHORT_ASCII_INTERNED: + is_interned = 1; + case TYPE_SHORT_ASCII: + n = r_byte(p); + if (n == EOF) { + PyErr_SetString(PyExc_EOFError, + "EOF read where object expected"); break; } - if (r_string(PyBytes_AS_STRING(v), n, p) != n) { - Py_DECREF(v); - retval = NULL; + _read_ascii: + { + char *ptr; + ptr = r_string(n, p); + if (ptr == NULL) { + retval = NULL; + break; + } + v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); + if (v == NULL) { + retval = NULL; + break; + } + if (is_interned) + PyUnicode_InternInPlace(&v); + retval = v; + R_REF(retval); break; } - retval = v; - R_REF(retval); - break; + case TYPE_INTERNED: + is_interned = 1; case TYPE_UNICODE: - case TYPE_INTERNED: { char *buffer; @@ -986,18 +1108,12 @@ break; } if (n != 0) { - buffer = PyMem_NEW(char, n); + buffer = r_string(n, p); if (buffer == NULL) { - retval = PyErr_NoMemory(); - break; - } - if (r_string(buffer, n, p) != n) { - PyMem_DEL(buffer); retval = NULL; break; } v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); - PyMem_DEL(buffer); } else { v = PyUnicode_New(0, 0); @@ -1006,13 +1122,16 @@ retval = NULL; break; } - if (type == TYPE_INTERNED) + if (is_interned) PyUnicode_InternInPlace(&v); retval = v; R_REF(retval); break; } + case TYPE_SMALL_TUPLE: + n = (unsigned char) r_byte(p); + goto _read_tuple; case TYPE_TUPLE: n = r_long(p); if (PyErr_Occurred()) { @@ -1024,6 +1143,7 @@ retval = NULL; break; } + _read_tuple: v = PyTuple_New(n); R_REF(v); if (v == NULL) { @@ -1304,23 +1424,33 @@ PyMarshal_ReadShortFromFile(FILE *fp) { RFILE rf; + int res; assert(fp); rf.readable = NULL; rf.fp = fp; rf.current_filename = NULL; rf.end = rf.ptr = NULL; - return r_short(&rf); + rf.buf = NULL; + res = r_short(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } long PyMarshal_ReadLongFromFile(FILE *fp) { RFILE rf; + long res; rf.fp = fp; rf.readable = NULL; rf.current_filename = NULL; rf.ptr = rf.end = NULL; - return r_long(&rf); + rf.buf = NULL; + res = r_long(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } #ifdef HAVE_FSTAT @@ -1379,11 +1509,14 @@ rf.current_filename = NULL; rf.depth = 0; rf.ptr = rf.end = NULL; + rf.buf = NULL; rf.refs = PyList_New(0); if (rf.refs == NULL) return NULL; result = r_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } @@ -1397,12 +1530,15 @@ rf.current_filename = NULL; rf.ptr = str; rf.end = str + len; + rf.buf = NULL; rf.depth = 0; rf.refs = PyList_New(0); if (rf.refs == NULL) return NULL; result = r_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } @@ -1516,9 +1652,13 @@ rf.fp = NULL; rf.readable = f; rf.current_filename = NULL; + rf.ptr = rf.end = NULL; + rf.buf = NULL; if ((rf.refs = PyList_New(0)) != NULL) { result = read_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); } else result = NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:26:33 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 22:26:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Forgot_NEWS_entry_for_prev?= =?utf-8?q?ious_commit=2E?= Message-ID: <3cxyHF5qr6z7LjS@mail.python.org> http://hg.python.org/cpython/rev/2cec3d85774b changeset: 86256:2cec3d85774b user: Antoine Pitrou date: Sat Oct 12 22:26:28 2013 +0200 summary: Forgot NEWS entry for previous commit. files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #19219: Speed up marshal.loads(), and make pyc files slightly + (5% to 10%) smaller. + - Issue #19221: Upgrade Unicode database to version 6.3.0. - Issue #16742: The result of the C callback PyOS_ReadlineFunctionPointer must -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:41:23 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 22:41:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Don=27t_export_internal_sy?= =?utf-8?b?bWJvbHMgKCJtYWtlIHNtZWxseSIp?= Message-ID: <3cxycM6Nczz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/eeec58c57964 changeset: 86257:eeec58c57964 user: Antoine Pitrou date: Sat Oct 12 22:41:17 2013 +0200 summary: Don't export internal symbols ("make smelly") files: Python/errors.c | 2 +- Python/fileutils.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -1014,7 +1014,7 @@ XXX The functionality of this function is quite similar to the functionality in tb_displayline() in traceback.c. */ -PyObject * +static PyObject * err_programtext(FILE *fp, int lineno) { int i; diff --git a/Python/fileutils.c b/Python/fileutils.c --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -566,7 +566,7 @@ #endif -int +static int get_inheritable(int fd, int raise) { #ifdef MS_WINDOWS -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:54:28 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 22:54:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=234555=3A_All_expor?= =?utf-8?q?ted_C_symbols_are_now_prefixed_with_either_=22Py=22_or_=22=5FPy?= =?utf-8?b?Ii4=?= Message-ID: <3cxyvS5lfmz7LjV@mail.python.org> http://hg.python.org/cpython/rev/142c62a490ce changeset: 86258:142c62a490ce user: Antoine Pitrou date: Sat Oct 12 22:52:43 2013 +0200 summary: Issue #4555: All exported C symbols are now prefixed with either "Py" or "_Py". ("make smelly" now clean) files: Include/asdl.h | 4 +- Misc/NEWS | 3 + Parser/asdl_c.py | 4 +- Python/Python-ast.c | 96 ++++++++++++++++---------------- Python/asdl.c | 4 +- Python/ast.c | 64 +++++++++++----------- 6 files changed, 89 insertions(+), 86 deletions(-) diff --git a/Include/asdl.h b/Include/asdl.h --- a/Include/asdl.h +++ b/Include/asdl.h @@ -25,8 +25,8 @@ int elements[1]; } asdl_int_seq; -asdl_seq *asdl_seq_new(Py_ssize_t size, PyArena *arena); -asdl_int_seq *asdl_int_seq_new(Py_ssize_t size, PyArena *arena); +asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); #define asdl_seq_GET(S, I) (S)->elements[(I)] #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #4555: All exported C symbols are now prefixed with either + "Py" or "_Py". + - Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller. diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -519,9 +519,9 @@ self.emit("}", depth+1) self.emit("len = PyList_GET_SIZE(tmp);", depth+1) if self.isSimpleType(field): - self.emit("%s = asdl_int_seq_new(len, arena);" % field.name, depth+1) + self.emit("%s = _Py_asdl_int_seq_new(len, arena);" % field.name, depth+1) else: - self.emit("%s = asdl_seq_new(len, arena);" % field.name, depth+1) + self.emit("%s = _Py_asdl_seq_new(len, arena);" % field.name, depth+1) self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) self.emit("for (i = 0; i < len; i++) {", depth+1) self.emit("%s value;" % ctype, depth+2) diff --git a/Python/Python-ast.c b/Python/Python-ast.c --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -3612,7 +3612,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3647,7 +3647,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3704,7 +3704,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3807,7 +3807,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3831,7 +3831,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3894,7 +3894,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - bases = asdl_seq_new(len, arena); + bases = _Py_asdl_seq_new(len, arena); if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3918,7 +3918,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -3962,7 +3962,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3986,7 +3986,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4043,7 +4043,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4079,7 +4079,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4196,7 +4196,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4220,7 +4220,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4268,7 +4268,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4292,7 +4292,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4340,7 +4340,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4364,7 +4364,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4400,7 +4400,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - items = asdl_seq_new(len, arena); + items = _Py_asdl_seq_new(len, arena); if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty value; @@ -4424,7 +4424,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4494,7 +4494,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4518,7 +4518,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - handlers = asdl_seq_new(len, arena); + handlers = _Py_asdl_seq_new(len, arena); if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty value; @@ -4542,7 +4542,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4566,7 +4566,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - finalbody = asdl_seq_new(len, arena); + finalbody = _Py_asdl_seq_new(len, arena); if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4635,7 +4635,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4682,7 +4682,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4727,7 +4727,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4762,7 +4762,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4903,7 +4903,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5099,7 +5099,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keys = asdl_seq_new(len, arena); + keys = _Py_asdl_seq_new(len, arena); if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5123,7 +5123,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5158,7 +5158,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5205,7 +5205,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5252,7 +5252,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5311,7 +5311,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5358,7 +5358,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5449,7 +5449,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - ops = asdl_int_seq_new(len, arena); + ops = _Py_asdl_int_seq_new(len, arena); if (ops == NULL) goto failed; for (i = 0; i < len; i++) { cmpop_ty value; @@ -5473,7 +5473,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - comparators = asdl_seq_new(len, arena); + comparators = _Py_asdl_seq_new(len, arena); if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5523,7 +5523,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5547,7 +5547,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -5862,7 +5862,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5909,7 +5909,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6074,7 +6074,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - dims = asdl_seq_new(len, arena); + dims = _Py_asdl_seq_new(len, arena); if (dims == NULL) goto failed; for (i = 0; i < len; i++) { slice_ty value; @@ -6425,7 +6425,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - ifs = asdl_seq_new(len, arena); + ifs = _Py_asdl_seq_new(len, arena); if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6520,7 +6520,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -6566,7 +6566,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6600,7 +6600,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - kwonlyargs = asdl_seq_new(len, arena); + kwonlyargs = _Py_asdl_seq_new(len, arena); if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6624,7 +6624,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - kw_defaults = asdl_seq_new(len, arena); + kw_defaults = _Py_asdl_seq_new(len, arena); if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6658,7 +6658,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - defaults = asdl_seq_new(len, arena); + defaults = _Py_asdl_seq_new(len, arena); if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; diff --git a/Python/asdl.c b/Python/asdl.c --- a/Python/asdl.c +++ b/Python/asdl.c @@ -2,7 +2,7 @@ #include "asdl.h" asdl_seq * -asdl_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena) { asdl_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); @@ -33,7 +33,7 @@ } asdl_int_seq * -asdl_int_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena) { asdl_int_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -696,7 +696,7 @@ k = 0; switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n), arena); + stmts = _Py_asdl_seq_new(num_stmts(n), arena); if (!stmts) goto out; for (i = 0; i < NCH(n) - 1; i++) { @@ -736,7 +736,7 @@ } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1, arena); + stmts = _Py_asdl_seq_new(1, arena); if (!stmts) goto out; asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, @@ -748,7 +748,7 @@ else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num, arena); + stmts = _Py_asdl_seq_new(num, arena); if (!stmts) goto out; if (num == 1) { @@ -1099,7 +1099,7 @@ int i; assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; @@ -1279,22 +1279,22 @@ if (TYPE(ch) == DOUBLESTAR) break; if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++; } - posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL); + posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL); if (!posargs && nposargs) return NULL; kwonlyargs = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwonlyargs && nkwonlyargs) return NULL; posdefaults = (nposdefaults ? - asdl_seq_new(nposdefaults, c->c_arena) : NULL); + _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL); if (!posdefaults && nposdefaults) return NULL; /* The length of kwonlyargs and kwdefaults are same since we set NULL as default for keyword only argument w/o default - we have sequence data structure, but no dictionary */ kwdefaults = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwdefaults && nkwonlyargs) return NULL; @@ -1462,7 +1462,7 @@ int i; REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n), c->c_arena); + decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena); if (!decorator_seq) return NULL; @@ -1658,7 +1658,7 @@ if (n_fors == -1) return NULL; - comps = asdl_seq_new(n_fors, c->c_arena); + comps = _Py_asdl_seq_new(n_fors, c->c_arena); if (!comps) return NULL; @@ -1699,7 +1699,7 @@ if (n_ifs == -1) return NULL; - ifs = asdl_seq_new(n_ifs, c->c_arena); + ifs = _Py_asdl_seq_new(n_ifs, c->c_arena); if (!ifs) return NULL; @@ -1921,7 +1921,7 @@ /* it's a simple set */ asdl_seq *elts; size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */ - elts = asdl_seq_new(size, c->c_arena); + elts = _Py_asdl_seq_new(size, c->c_arena); if (!elts) return NULL; for (i = 0; i < NCH(ch); i += 2) { @@ -1940,11 +1940,11 @@ } else { /* it's a dict */ size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size, c->c_arena); + keys = _Py_asdl_seq_new(size, c->c_arena); if (!keys) return NULL; - values = asdl_seq_new(size, c->c_arena); + values = _Py_asdl_seq_new(size, c->c_arena); if (!values) return NULL; @@ -2139,7 +2139,7 @@ expr_ty e; int simple = 1; asdl_seq *slices, *elts; - slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) return NULL; for (j = 0; j < NCH(n); j += 2) { @@ -2155,7 +2155,7 @@ Load, LINENO(n), n->n_col_offset, c->c_arena); } /* extract Index values and put them in a Tuple */ - elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); + elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); if (!elts) return NULL; for (j = 0; j < asdl_seq_LEN(slices); ++j) { @@ -2288,7 +2288,7 @@ n = CHILD(n, 0); goto loop; } - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2324,10 +2324,10 @@ expr_ty expression; asdl_int_seq *ops; asdl_seq *cmps; - ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena); + ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena); if (!ops) return NULL; - cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); + cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!cmps) { return NULL; } @@ -2453,10 +2453,10 @@ return NULL; } - args = asdl_seq_new(nargs + ngens, c->c_arena); + args = _Py_asdl_seq_new(nargs + ngens, c->c_arena); if (!args) return NULL; - keywords = asdl_seq_new(nkeywords, c->c_arena); + keywords = _Py_asdl_seq_new(nkeywords, c->c_arena); if (!keywords) return NULL; nargs = 0; @@ -2633,7 +2633,7 @@ /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = asdl_seq_new(NCH(n) / 2, c->c_arena); + targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { @@ -2674,7 +2674,7 @@ REQ(n, exprlist); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2904,7 +2904,7 @@ if (TYPE(n) == import_name) { n = CHILD(n, 1); REQ(n, dotted_as_names); - aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!aliases) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2966,7 +2966,7 @@ return NULL; } - aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena); if (!aliases) return NULL; @@ -3005,7 +3005,7 @@ int i; REQ(n, global_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3026,7 +3026,7 @@ int i; REQ(n, nonlocal_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3079,7 +3079,7 @@ REQ(n, suite); total = num_stmts(n); - seq = asdl_seq_new(total, c->c_arena); + seq = _Py_asdl_seq_new(total, c->c_arena); if (!seq) return NULL; if (TYPE(CHILD(n, 0)) == simple_stmt) { @@ -3198,7 +3198,7 @@ if (has_else) { asdl_seq *suite_seq2; - orelse = asdl_seq_new(1, c->c_arena); + orelse = _Py_asdl_seq_new(1, c->c_arena); if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); @@ -3222,7 +3222,7 @@ for (i = 0; i < n_elif; i++) { int off = 5 + (n_elif - i - 1) * 4; - asdl_seq *newobj = asdl_seq_new(1, c->c_arena); + asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena); if (!newobj) return NULL; expression = ast_for_expr(c, CHILD(n, off)); @@ -3434,7 +3434,7 @@ if (n_except > 0) { int i; /* process except statements to create a try ... except */ - handlers = asdl_seq_new(n_except, c->c_arena); + handlers = _Py_asdl_seq_new(n_except, c->c_arena); if (handlers == NULL) return NULL; @@ -3485,7 +3485,7 @@ REQ(n, with_stmt); n_items = (NCH(n) - 2) / 2; - items = asdl_seq_new(n_items, c->c_arena); + items = _Py_asdl_seq_new(n_items, c->c_arena); if (!items) return NULL; for (i = 1; i < NCH(n) - 2; i += 2) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:56:40 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 22:56:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Invert_logic_o?= =?utf-8?q?f_new_limited-API_annotation_and_call_it_=22stable_ABI=22=2E?= Message-ID: <3cxyy06KRhz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/faf318b53d58 changeset: 86259:faf318b53d58 branch: 3.3 parent: 86252:3c1e2cba8a75 user: Georg Brandl date: Sat Oct 12 22:55:34 2013 +0200 summary: Invert logic of new limited-API annotation and call it "stable ABI". files: Doc/tools/sphinxext/c_annotations.py | 12 +++++----- Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 4 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/tools/sphinxext/c_annotations.py b/Doc/tools/sphinxext/c_annotations.py --- a/Doc/tools/sphinxext/c_annotations.py +++ b/Doc/tools/sphinxext/c_annotations.py @@ -73,10 +73,10 @@ par = node.parent if par['domain'] != 'c': continue - if par['notlimited']: - node.insert(0, nodes.emphasis(' Not part of the stable API.', - ' Not part of the stable API.', - classes=['notlimited'])) + if par['stableabi']: + node.insert(0, nodes.emphasis(' Part of the stable ABI.', + ' Part of the stable ABI.', + classes=['stableabi'])) if par['objtype'] != 'function': continue if not par[0].has_key('names') or not par[0]['names']: @@ -108,10 +108,10 @@ # monkey-patch C object... CObject.option_spec = { 'noindex': directives.flag, - 'notlimited': directives.flag, + 'stableabi': directives.flag, } old_handle_signature = CObject.handle_signature def new_handle_signature(self, sig, signode): - signode.parent['notlimited'] = 'notlimited' in self.options + signode.parent['stableabi'] = 'stableabi' in self.options return old_handle_signature(self, sig, signode) CObject.handle_signature = new_handle_signature diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -173,6 +173,6 @@ color: #060; } -.notlimited { - color: #922; +.stableabi { + color: #229; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:56:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 22:56:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cxyy20xwxz7Lk3@mail.python.org> http://hg.python.org/cpython/rev/fc09e5cff7ea changeset: 86260:fc09e5cff7ea parent: 86249:7c8f7174deff parent: 86259:faf318b53d58 user: Georg Brandl date: Sat Oct 12 22:56:37 2013 +0200 summary: merge with 3.3 files: .hgeol | 3 ++ Doc/tools/sphinxext/c_annotations.py | 12 +++++----- Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 4 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.hgeol b/.hgeol --- a/.hgeol +++ b/.hgeol @@ -10,6 +10,8 @@ **.vsprops = BIN **.aif = BIN +**.aifc = BIN +**.aiff = BIN **.au = BIN **.bmp = BIN **.db = BIN @@ -23,6 +25,7 @@ **.png = BIN **.psd = BIN **.tar = BIN +**.wav = BIN **.xar = BIN **.zip = BIN diff --git a/Doc/tools/sphinxext/c_annotations.py b/Doc/tools/sphinxext/c_annotations.py --- a/Doc/tools/sphinxext/c_annotations.py +++ b/Doc/tools/sphinxext/c_annotations.py @@ -73,10 +73,10 @@ par = node.parent if par['domain'] != 'c': continue - if par['notlimited']: - node.insert(0, nodes.emphasis(' Not part of the stable API.', - ' Not part of the stable API.', - classes=['notlimited'])) + if par['stableabi']: + node.insert(0, nodes.emphasis(' Part of the stable ABI.', + ' Part of the stable ABI.', + classes=['stableabi'])) if par['objtype'] != 'function': continue if not par[0].has_key('names') or not par[0]['names']: @@ -108,10 +108,10 @@ # monkey-patch C object... CObject.option_spec = { 'noindex': directives.flag, - 'notlimited': directives.flag, + 'stableabi': directives.flag, } old_handle_signature = CObject.handle_signature def new_handle_signature(self, sig, signode): - signode.parent['notlimited'] = 'notlimited' in self.options + signode.parent['stableabi'] = 'stableabi' in self.options return old_handle_signature(self, sig, signode) CObject.handle_signature = new_handle_signature diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -173,6 +173,6 @@ color: #060; } -.notlimited { - color: #922; +.stableabi { + color: #229; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 22:56:44 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 12 Oct 2013 22:56:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cxyy40Zwfz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/e45cb197f207 changeset: 86261:e45cb197f207 parent: 86260:fc09e5cff7ea parent: 86258:142c62a490ce user: Georg Brandl date: Sat Oct 12 22:57:30 2013 +0200 summary: merge files: Include/asdl.h | 4 +- Include/marshal.h | 2 +- Lib/test/test_marshal.py | 8 +- Misc/NEWS | 6 + Parser/asdl_c.py | 4 +- Python/Python-ast.c | 96 +- Python/asdl.c | 4 +- Python/ast.c | 64 +- Python/errors.c | 2 +- Python/fileutils.c | 2 +- Python/importlib.h | 6625 ++++++++++++------------- Python/marshal.c | 390 +- 12 files changed, 3565 insertions(+), 3642 deletions(-) diff --git a/Include/asdl.h b/Include/asdl.h --- a/Include/asdl.h +++ b/Include/asdl.h @@ -25,8 +25,8 @@ int elements[1]; } asdl_int_seq; -asdl_seq *asdl_seq_new(Py_ssize_t size, PyArena *arena); -asdl_int_seq *asdl_int_seq_new(Py_ssize_t size, PyArena *arena); +asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); #define asdl_seq_GET(S, I) (S)->elements[(I)] #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) diff --git a/Include/marshal.h b/Include/marshal.h --- a/Include/marshal.h +++ b/Include/marshal.h @@ -7,7 +7,7 @@ extern "C" { #endif -#define Py_MARSHAL_VERSION 3 +#define Py_MARSHAL_VERSION 4 PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -262,11 +262,11 @@ def test_bad_reader(self): class BadReader(io.BytesIO): - def read(self, n=-1): - b = super().read(n) + def readinto(self, buf): + n = super().readinto(buf) if n is not None and n > 4: - b += b' ' * 10**6 - return b + n += 10**6 + return n for value in (1.0, 1j, b'0123456789', '0123456789'): self.assertRaises(ValueError, marshal.load, BadReader(marshal.dumps(value))) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,12 @@ Core and Builtins ----------------- +- Issue #4555: All exported C symbols are now prefixed with either + "Py" or "_Py". + +- Issue #19219: Speed up marshal.loads(), and make pyc files slightly + (5% to 10%) smaller. + - Issue #19221: Upgrade Unicode database to version 6.3.0. - Issue #16742: The result of the C callback PyOS_ReadlineFunctionPointer must diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -519,9 +519,9 @@ self.emit("}", depth+1) self.emit("len = PyList_GET_SIZE(tmp);", depth+1) if self.isSimpleType(field): - self.emit("%s = asdl_int_seq_new(len, arena);" % field.name, depth+1) + self.emit("%s = _Py_asdl_int_seq_new(len, arena);" % field.name, depth+1) else: - self.emit("%s = asdl_seq_new(len, arena);" % field.name, depth+1) + self.emit("%s = _Py_asdl_seq_new(len, arena);" % field.name, depth+1) self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) self.emit("for (i = 0; i < len; i++) {", depth+1) self.emit("%s value;" % ctype, depth+2) diff --git a/Python/Python-ast.c b/Python/Python-ast.c --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -3612,7 +3612,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3647,7 +3647,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3704,7 +3704,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3807,7 +3807,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3831,7 +3831,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3894,7 +3894,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - bases = asdl_seq_new(len, arena); + bases = _Py_asdl_seq_new(len, arena); if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3918,7 +3918,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -3962,7 +3962,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3986,7 +3986,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4043,7 +4043,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4079,7 +4079,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4196,7 +4196,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4220,7 +4220,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4268,7 +4268,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4292,7 +4292,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4340,7 +4340,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4364,7 +4364,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4400,7 +4400,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - items = asdl_seq_new(len, arena); + items = _Py_asdl_seq_new(len, arena); if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty value; @@ -4424,7 +4424,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4494,7 +4494,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4518,7 +4518,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - handlers = asdl_seq_new(len, arena); + handlers = _Py_asdl_seq_new(len, arena); if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty value; @@ -4542,7 +4542,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4566,7 +4566,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - finalbody = asdl_seq_new(len, arena); + finalbody = _Py_asdl_seq_new(len, arena); if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4635,7 +4635,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4682,7 +4682,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4727,7 +4727,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4762,7 +4762,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4903,7 +4903,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5099,7 +5099,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keys = asdl_seq_new(len, arena); + keys = _Py_asdl_seq_new(len, arena); if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5123,7 +5123,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5158,7 +5158,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5205,7 +5205,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5252,7 +5252,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5311,7 +5311,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5358,7 +5358,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5449,7 +5449,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - ops = asdl_int_seq_new(len, arena); + ops = _Py_asdl_int_seq_new(len, arena); if (ops == NULL) goto failed; for (i = 0; i < len; i++) { cmpop_ty value; @@ -5473,7 +5473,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - comparators = asdl_seq_new(len, arena); + comparators = _Py_asdl_seq_new(len, arena); if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5523,7 +5523,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5547,7 +5547,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -5862,7 +5862,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5909,7 +5909,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6074,7 +6074,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - dims = asdl_seq_new(len, arena); + dims = _Py_asdl_seq_new(len, arena); if (dims == NULL) goto failed; for (i = 0; i < len; i++) { slice_ty value; @@ -6425,7 +6425,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - ifs = asdl_seq_new(len, arena); + ifs = _Py_asdl_seq_new(len, arena); if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6520,7 +6520,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -6566,7 +6566,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6600,7 +6600,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - kwonlyargs = asdl_seq_new(len, arena); + kwonlyargs = _Py_asdl_seq_new(len, arena); if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6624,7 +6624,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - kw_defaults = asdl_seq_new(len, arena); + kw_defaults = _Py_asdl_seq_new(len, arena); if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6658,7 +6658,7 @@ goto failed; } len = PyList_GET_SIZE(tmp); - defaults = asdl_seq_new(len, arena); + defaults = _Py_asdl_seq_new(len, arena); if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; diff --git a/Python/asdl.c b/Python/asdl.c --- a/Python/asdl.c +++ b/Python/asdl.c @@ -2,7 +2,7 @@ #include "asdl.h" asdl_seq * -asdl_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena) { asdl_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); @@ -33,7 +33,7 @@ } asdl_int_seq * -asdl_int_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena) { asdl_int_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -696,7 +696,7 @@ k = 0; switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n), arena); + stmts = _Py_asdl_seq_new(num_stmts(n), arena); if (!stmts) goto out; for (i = 0; i < NCH(n) - 1; i++) { @@ -736,7 +736,7 @@ } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1, arena); + stmts = _Py_asdl_seq_new(1, arena); if (!stmts) goto out; asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, @@ -748,7 +748,7 @@ else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num, arena); + stmts = _Py_asdl_seq_new(num, arena); if (!stmts) goto out; if (num == 1) { @@ -1099,7 +1099,7 @@ int i; assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; @@ -1279,22 +1279,22 @@ if (TYPE(ch) == DOUBLESTAR) break; if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++; } - posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL); + posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL); if (!posargs && nposargs) return NULL; kwonlyargs = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwonlyargs && nkwonlyargs) return NULL; posdefaults = (nposdefaults ? - asdl_seq_new(nposdefaults, c->c_arena) : NULL); + _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL); if (!posdefaults && nposdefaults) return NULL; /* The length of kwonlyargs and kwdefaults are same since we set NULL as default for keyword only argument w/o default - we have sequence data structure, but no dictionary */ kwdefaults = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwdefaults && nkwonlyargs) return NULL; @@ -1462,7 +1462,7 @@ int i; REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n), c->c_arena); + decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena); if (!decorator_seq) return NULL; @@ -1658,7 +1658,7 @@ if (n_fors == -1) return NULL; - comps = asdl_seq_new(n_fors, c->c_arena); + comps = _Py_asdl_seq_new(n_fors, c->c_arena); if (!comps) return NULL; @@ -1699,7 +1699,7 @@ if (n_ifs == -1) return NULL; - ifs = asdl_seq_new(n_ifs, c->c_arena); + ifs = _Py_asdl_seq_new(n_ifs, c->c_arena); if (!ifs) return NULL; @@ -1921,7 +1921,7 @@ /* it's a simple set */ asdl_seq *elts; size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */ - elts = asdl_seq_new(size, c->c_arena); + elts = _Py_asdl_seq_new(size, c->c_arena); if (!elts) return NULL; for (i = 0; i < NCH(ch); i += 2) { @@ -1940,11 +1940,11 @@ } else { /* it's a dict */ size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size, c->c_arena); + keys = _Py_asdl_seq_new(size, c->c_arena); if (!keys) return NULL; - values = asdl_seq_new(size, c->c_arena); + values = _Py_asdl_seq_new(size, c->c_arena); if (!values) return NULL; @@ -2139,7 +2139,7 @@ expr_ty e; int simple = 1; asdl_seq *slices, *elts; - slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) return NULL; for (j = 0; j < NCH(n); j += 2) { @@ -2155,7 +2155,7 @@ Load, LINENO(n), n->n_col_offset, c->c_arena); } /* extract Index values and put them in a Tuple */ - elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); + elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); if (!elts) return NULL; for (j = 0; j < asdl_seq_LEN(slices); ++j) { @@ -2288,7 +2288,7 @@ n = CHILD(n, 0); goto loop; } - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2324,10 +2324,10 @@ expr_ty expression; asdl_int_seq *ops; asdl_seq *cmps; - ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena); + ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena); if (!ops) return NULL; - cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); + cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!cmps) { return NULL; } @@ -2453,10 +2453,10 @@ return NULL; } - args = asdl_seq_new(nargs + ngens, c->c_arena); + args = _Py_asdl_seq_new(nargs + ngens, c->c_arena); if (!args) return NULL; - keywords = asdl_seq_new(nkeywords, c->c_arena); + keywords = _Py_asdl_seq_new(nkeywords, c->c_arena); if (!keywords) return NULL; nargs = 0; @@ -2633,7 +2633,7 @@ /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = asdl_seq_new(NCH(n) / 2, c->c_arena); + targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { @@ -2674,7 +2674,7 @@ REQ(n, exprlist); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2904,7 +2904,7 @@ if (TYPE(n) == import_name) { n = CHILD(n, 1); REQ(n, dotted_as_names); - aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!aliases) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2966,7 +2966,7 @@ return NULL; } - aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena); if (!aliases) return NULL; @@ -3005,7 +3005,7 @@ int i; REQ(n, global_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3026,7 +3026,7 @@ int i; REQ(n, nonlocal_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3079,7 +3079,7 @@ REQ(n, suite); total = num_stmts(n); - seq = asdl_seq_new(total, c->c_arena); + seq = _Py_asdl_seq_new(total, c->c_arena); if (!seq) return NULL; if (TYPE(CHILD(n, 0)) == simple_stmt) { @@ -3198,7 +3198,7 @@ if (has_else) { asdl_seq *suite_seq2; - orelse = asdl_seq_new(1, c->c_arena); + orelse = _Py_asdl_seq_new(1, c->c_arena); if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); @@ -3222,7 +3222,7 @@ for (i = 0; i < n_elif; i++) { int off = 5 + (n_elif - i - 1) * 4; - asdl_seq *newobj = asdl_seq_new(1, c->c_arena); + asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena); if (!newobj) return NULL; expression = ast_for_expr(c, CHILD(n, off)); @@ -3434,7 +3434,7 @@ if (n_except > 0) { int i; /* process except statements to create a try ... except */ - handlers = asdl_seq_new(n_except, c->c_arena); + handlers = _Py_asdl_seq_new(n_except, c->c_arena); if (handlers == NULL) return NULL; @@ -3485,7 +3485,7 @@ REQ(n, with_stmt); n_items = (NCH(n) - 2) / 2; - items = asdl_seq_new(n_items, c->c_arena); + items = _Py_asdl_seq_new(n_items, c->c_arena); if (!items) return NULL; for (i = 1; i < NCH(n) - 2; i += 2) { diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -1014,7 +1014,7 @@ XXX The functionality of this function is quite similar to the functionality in tb_displayline() in traceback.c. */ -PyObject * +static PyObject * err_programtext(FILE *fp, int lineno) { int i; diff --git a/Python/fileutils.c b/Python/fileutils.c --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -566,7 +566,7 @@ #endif -int +static int get_inheritable(int fd, int raise) { #ifdef MS_WINDOWS diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -51,6 +51,12 @@ #define TYPE_FROZENSET '>' #define FLAG_REF '\x80' /* with a type, add obj to index */ +#define TYPE_ASCII 'a' +#define TYPE_ASCII_INTERNED 'A' +#define TYPE_SMALL_TUPLE ')' +#define TYPE_SHORT_ASCII 'z' +#define TYPE_SHORT_ASCII_INTERNED 'Z' + #define WFERR_OK 0 #define WFERR_UNMARSHALLABLE 1 #define WFERR_NESTEDTOODEEP 2 @@ -66,6 +72,8 @@ PyObject *current_filename; char *ptr; char *end; + char *buf; + Py_ssize_t buf_size; PyObject *refs; /* dict on marshal, list on unmarshal */ int version; } WFILE; @@ -148,6 +156,13 @@ w_string(s, n, p); } +static void +w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) +{ + w_byte(n, p); + w_string(s, n, p); +} + /* We assume that Python ints are stored internally in base some power of 2**15; for the sake of portability we'll always read and write them in base exactly 2**15. */ @@ -394,24 +409,51 @@ w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p); } else if (PyUnicode_CheckExact(v)) { - PyObject *utf8; - utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); - if (utf8 == NULL) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; + if (p->version >= 4 && PyUnicode_IS_ASCII(v)) { + int is_short = PyUnicode_GET_LENGTH(v) < 256; + if (is_short) { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); + else + W_TYPE(TYPE_SHORT_ASCII, p); + w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } + else { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_ASCII_INTERNED, p); + else + W_TYPE(TYPE_ASCII, p); + w_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } } - if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) - W_TYPE(TYPE_INTERNED, p); - else - W_TYPE(TYPE_UNICODE, p); - w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); - Py_DECREF(utf8); + else { + PyObject *utf8; + utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); + if (utf8 == NULL) { + p->depth--; + p->error = WFERR_UNMARSHALLABLE; + return; + } + if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_INTERNED, p); + else + W_TYPE(TYPE_UNICODE, p); + w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); + Py_DECREF(utf8); + } } else if (PyTuple_CheckExact(v)) { - W_TYPE(TYPE_TUPLE, p); n = PyTuple_Size(v); - W_SIZE(n, p); + if (p->version >= 4 && n < 256) { + W_TYPE(TYPE_SMALL_TUPLE, p); + w_byte(n, p); + } + else { + W_TYPE(TYPE_TUPLE, p); + W_SIZE(n, p); + } for (i = 0; i < n; i++) { w_object(PyTuple_GET_ITEM(v, i), p); } @@ -537,59 +579,75 @@ typedef WFILE RFILE; /* Same struct with different invariants */ -#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF) +static char * +r_string(Py_ssize_t n, RFILE *p) +{ + Py_ssize_t read = -1; -static Py_ssize_t -r_string(char *s, Py_ssize_t n, RFILE *p) -{ - char *ptr; - Py_ssize_t read, left; + if (p->ptr != NULL) { + /* Fast path for loads() */ + char *res = p->ptr; + Py_ssize_t left = p->end - p->ptr; + if (left < n) { + PyErr_SetString(PyExc_EOFError, + "marshal data too short"); + return NULL; + } + p->ptr += n; + return res; + } + if (p->buf == NULL) { + p->buf = PyMem_MALLOC(n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } + else if (p->buf_size < n) { + p->buf = PyMem_REALLOC(p->buf, n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } + if (!p->readable) { + assert(p->fp != NULL); + /* The result fits into int because it must be <=n. */ + read = fread(p->buf, 1, n, p->fp); + } + else { + _Py_IDENTIFIER(readinto); + PyObject *res, *mview; + Py_buffer buf; - if (!p->readable) { - if (p->fp != NULL) - /* The result fits into int because it must be <=n. */ - read = fread(s, 1, n, p->fp); - else { - left = p->end - p->ptr; - read = (left < n) ? left : n; - memcpy(s, p->ptr, read); - p->ptr += read; + if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1) + return NULL; + mview = PyMemoryView_FromBuffer(&buf); + if (mview == NULL) + return NULL; + + res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview); + if (res != NULL) { + read = PyNumber_AsSsize_t(res, PyExc_ValueError); + Py_DECREF(res); } } - else { - _Py_IDENTIFIER(read); - - PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n); - read = 0; - if (data != NULL) { - if (!PyBytes_Check(data)) { - PyErr_Format(PyExc_TypeError, - "f.read() returned not bytes but %.100s", - data->ob_type->tp_name); - } - else { - read = (int)PyBytes_GET_SIZE(data); - if (read > 0) { - if (read > n) { - PyErr_Format(PyExc_ValueError, - "read() returned too much data: " - "%zd bytes requested, %zd returned", - n, read); - read = -1; - } - else { - ptr = PyBytes_AS_STRING(data); - memcpy(s, ptr, read); - } - } - } - Py_DECREF(data); + if (read != n) { + if (!PyErr_Occurred()) { + if (read > n) + PyErr_Format(PyExc_ValueError, + "read() returned too much data: " + "%zd bytes requested, %zd returned", + n, read); + else + PyErr_SetString(PyExc_EOFError, + "EOF read where not expected"); } + return NULL; } - if (!PyErr_Occurred() && (read < n)) { - PyErr_SetString(PyExc_EOFError, "EOF read where not expected"); - } - return read; + return p->buf; } @@ -597,15 +655,20 @@ r_byte(RFILE *p) { int c = EOF; - unsigned char ch; - Py_ssize_t n; - if (!p->readable) - c = p->fp ? getc(p->fp) : rs_byte(p); + if (p->ptr != NULL) { + if (p->ptr < p->end) + c = (unsigned char) *p->ptr++; + return c; + } + if (!p->readable) { + assert(p->fp); + c = getc(p->fp); + } else { - n = r_string((char *) &ch, 1, p); - if (n > 0) - c = ch; + char *ptr = r_string(1, p); + if (ptr != NULL) + c = *(unsigned char *) ptr; } return c; } @@ -613,32 +676,36 @@ static int r_short(RFILE *p) { - short x; - unsigned char buffer[2]; + short x = -1; + unsigned char *buffer; - r_string((char *) buffer, 2, p); - x = buffer[0]; - x |= buffer[1] << 8; - /* Sign-extension, in case short greater than 16 bits */ - x |= -(x & 0x8000); + buffer = (unsigned char *) r_string(2, p); + if (buffer != NULL) { + x = buffer[0]; + x |= buffer[1] << 8; + /* Sign-extension, in case short greater than 16 bits */ + x |= -(x & 0x8000); + } return x; } static long r_long(RFILE *p) { - long x; - unsigned char buffer[4]; + long x = -1; + unsigned char *buffer; - r_string((char *) buffer, 4, p); - x = buffer[0]; - x |= (long)buffer[1] << 8; - x |= (long)buffer[2] << 16; - x |= (long)buffer[3] << 24; + buffer = (unsigned char *) r_string(4, p); + if (buffer != NULL) { + x = buffer[0]; + x |= (long)buffer[1] << 8; + x |= (long)buffer[2] << 16; + x |= (long)buffer[3] << 24; #if SIZEOF_LONG > 4 - /* Sign extension for 64-bit machines */ - x |= -(x & 0x80000000L); + /* Sign extension for 64-bit machines */ + x |= -(x & 0x80000000L); #endif + } return x; } @@ -716,9 +783,7 @@ r_ref_reserve(int flag, RFILE *p) { if (flag) { /* currently only FLAG_REF is defined */ - Py_ssize_t idx = PyList_Size(p->refs); - if (idx < 0) - return -1; + Py_ssize_t idx = PyList_GET_SIZE(p->refs); if (idx >= 0x7ffffffe) { PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)"); return -1; @@ -742,12 +807,10 @@ r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p) { if (o != NULL && flag) { /* currently only FLAG_REF is defined */ - if (PyList_SetItem(p->refs, idx, o) < 0) { - Py_DECREF(o); /* release the new object */ - return NULL; - } else { - Py_INCREF(o); /* a reference for the list */ - } + PyObject *tmp = PyList_GET_ITEM(p->refs, idx); + Py_INCREF(o); + PyList_SET_ITEM(p->refs, idx, o); + Py_DECREF(tmp); } return o; } @@ -777,7 +840,7 @@ Py_ssize_t idx = 0; long i, n; int type, code = r_byte(p); - int flag; + int flag, is_interned = 0; PyObject *retval; if (code == EOF) { @@ -846,7 +909,7 @@ case TYPE_FLOAT: { - char buf[256]; + char buf[256], *ptr; double dx; retval = NULL; n = r_byte(p); @@ -855,8 +918,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; dx = PyOS_string_to_double(buf, NULL, NULL); if (dx == -1.0 && PyErr_Occurred()) @@ -868,9 +933,10 @@ case TYPE_BINARY_FLOAT: { - unsigned char buf[8]; + unsigned char *buf; double x; - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -886,7 +952,7 @@ case TYPE_COMPLEX: { - char buf[256]; + char buf[256], *ptr; Py_complex c; retval = NULL; n = r_byte(p); @@ -895,8 +961,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.real = PyOS_string_to_double(buf, NULL, NULL); if (c.real == -1.0 && PyErr_Occurred()) @@ -907,8 +975,10 @@ "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.imag = PyOS_string_to_double(buf, NULL, NULL); if (c.imag == -1.0 && PyErr_Occurred()) @@ -920,9 +990,10 @@ case TYPE_BINARY_COMPLEX: { - unsigned char buf[8]; + unsigned char *buf; Py_complex c; - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -931,7 +1002,8 @@ retval = NULL; break; } - if (r_string((char*)buf, 8, p) != 8) { + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) { retval = NULL; break; } @@ -946,32 +1018,82 @@ } case TYPE_STRING: + { + char *ptr; + n = r_long(p); + if (PyErr_Occurred()) { + retval = NULL; + break; + } + if (n < 0 || n > SIZE32_MAX) { + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + retval = NULL; + break; + } + v = PyBytes_FromStringAndSize((char *)NULL, n); + if (v == NULL) { + retval = NULL; + break; + } + ptr = r_string(n, p); + if (ptr == NULL) { + Py_DECREF(v); + retval = NULL; + break; + } + memcpy(PyBytes_AS_STRING(v), ptr, n); + retval = v; + R_REF(retval); + break; + } + + case TYPE_ASCII_INTERNED: + is_interned = 1; + case TYPE_ASCII: n = r_long(p); if (PyErr_Occurred()) { retval = NULL; break; } if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); retval = NULL; break; } - v = PyBytes_FromStringAndSize((char *)NULL, n); - if (v == NULL) { - retval = NULL; + goto _read_ascii; + + case TYPE_SHORT_ASCII_INTERNED: + is_interned = 1; + case TYPE_SHORT_ASCII: + n = r_byte(p); + if (n == EOF) { + PyErr_SetString(PyExc_EOFError, + "EOF read where object expected"); break; } - if (r_string(PyBytes_AS_STRING(v), n, p) != n) { - Py_DECREF(v); - retval = NULL; + _read_ascii: + { + char *ptr; + ptr = r_string(n, p); + if (ptr == NULL) { + retval = NULL; + break; + } + v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); + if (v == NULL) { + retval = NULL; + break; + } + if (is_interned) + PyUnicode_InternInPlace(&v); + retval = v; + R_REF(retval); break; } - retval = v; - R_REF(retval); - break; + case TYPE_INTERNED: + is_interned = 1; case TYPE_UNICODE: - case TYPE_INTERNED: { char *buffer; @@ -986,18 +1108,12 @@ break; } if (n != 0) { - buffer = PyMem_NEW(char, n); + buffer = r_string(n, p); if (buffer == NULL) { - retval = PyErr_NoMemory(); - break; - } - if (r_string(buffer, n, p) != n) { - PyMem_DEL(buffer); retval = NULL; break; } v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); - PyMem_DEL(buffer); } else { v = PyUnicode_New(0, 0); @@ -1006,13 +1122,16 @@ retval = NULL; break; } - if (type == TYPE_INTERNED) + if (is_interned) PyUnicode_InternInPlace(&v); retval = v; R_REF(retval); break; } + case TYPE_SMALL_TUPLE: + n = (unsigned char) r_byte(p); + goto _read_tuple; case TYPE_TUPLE: n = r_long(p); if (PyErr_Occurred()) { @@ -1024,6 +1143,7 @@ retval = NULL; break; } + _read_tuple: v = PyTuple_New(n); R_REF(v); if (v == NULL) { @@ -1304,23 +1424,33 @@ PyMarshal_ReadShortFromFile(FILE *fp) { RFILE rf; + int res; assert(fp); rf.readable = NULL; rf.fp = fp; rf.current_filename = NULL; rf.end = rf.ptr = NULL; - return r_short(&rf); + rf.buf = NULL; + res = r_short(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } long PyMarshal_ReadLongFromFile(FILE *fp) { RFILE rf; + long res; rf.fp = fp; rf.readable = NULL; rf.current_filename = NULL; rf.ptr = rf.end = NULL; - return r_long(&rf); + rf.buf = NULL; + res = r_long(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } #ifdef HAVE_FSTAT @@ -1379,11 +1509,14 @@ rf.current_filename = NULL; rf.depth = 0; rf.ptr = rf.end = NULL; + rf.buf = NULL; rf.refs = PyList_New(0); if (rf.refs == NULL) return NULL; result = r_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } @@ -1397,12 +1530,15 @@ rf.current_filename = NULL; rf.ptr = str; rf.end = str + len; + rf.buf = NULL; rf.depth = 0; rf.refs = PyList_New(0); if (rf.refs == NULL) return NULL; result = r_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } @@ -1516,9 +1652,13 @@ rf.fp = NULL; rf.readable = f; rf.current_filename = NULL; + rf.ptr = rf.end = NULL; + rf.buf = NULL; if ((rf.refs = PyList_New(0)) != NULL) { result = read_object(&rf); Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); } else result = NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 23:16:50 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 23:16:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_to_fix_weird_assertion?= =?utf-8?q?_error_on_the_Fedora_buildbot=2E?= Message-ID: <3cxzPG28PVz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/0383f08bff4c changeset: 86262:0383f08bff4c parent: 86258:142c62a490ce user: Antoine Pitrou date: Sat Oct 12 23:14:47 2013 +0200 summary: Try to fix weird assertion error on the Fedora buildbot. files: Python/marshal.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -83,7 +83,7 @@ else w_more(c, p) static void -w_more(int c, WFILE *p) +w_more(char c, WFILE *p) { Py_ssize_t size, newsize; if (p->str == NULL) @@ -100,7 +100,7 @@ p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size; p->end = PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; - *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); + *p->ptr++ = c; } } @@ -159,7 +159,7 @@ static void w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) { - w_byte(n, p); + w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); w_string(s, n, p); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 12 23:16:51 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 12 Oct 2013 23:16:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge?= Message-ID: <3cxzPH3yG6z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/9b7b8b7ccf28 changeset: 86263:9b7b8b7ccf28 parent: 86261:e45cb197f207 parent: 86262:0383f08bff4c user: Antoine Pitrou date: Sat Oct 12 23:16:32 2013 +0200 summary: Merge files: Python/marshal.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -83,7 +83,7 @@ else w_more(c, p) static void -w_more(int c, WFILE *p) +w_more(char c, WFILE *p) { Py_ssize_t size, newsize; if (p->str == NULL) @@ -100,7 +100,7 @@ p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size; p->end = PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; - *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); + *p->ptr++ = c; } } @@ -159,7 +159,7 @@ static void w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) { - w_byte(n, p); + w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); w_string(s, n, p); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 00:52:54 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 00:52:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318582=3A_Add_=27p?= =?utf-8?q?bkdf2=5Fhmac=27_to_the_hashlib_module=2E?= Message-ID: <3cy1X65hTjz7LjS@mail.python.org> http://hg.python.org/cpython/rev/5fd56d6d3fce changeset: 86264:5fd56d6d3fce user: Christian Heimes date: Sun Oct 13 00:52:43 2013 +0200 summary: Issue #18582: Add 'pbkdf2_hmac' to the hashlib module. files: Doc/library/hashlib.rst | 43 ++++++++ Doc/whatsnew/3.4.rst | 8 + Lib/hashlib.py | 8 + Lib/test/test_hashlib.py | 82 ++++++++++++++++ Misc/NEWS | 3 + Modules/_hashopenssl.c | 136 +++++++++++++++++++++++++++ 6 files changed, 280 insertions(+), 0 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -32,6 +32,10 @@ Some algorithms have known hash collision weaknesses, refer to the "See also" section at the end. + +Hash algorithms +--------------- + There is one constructor method named for each type of :dfn:`hash`. All return a hash object with the same simple interface. For example: use :func:`sha1` to create a SHA1 hash object. You can now feed this object with :term:`bytes-like @@ -174,6 +178,43 @@ compute the digests of data sharing a common initial substring. +Key Derivation Function +----------------------- + +Key derivation and key stretching algorithms are designed for secure password +hashing. Naive algorithms such as ``sha1(password)`` are not resistant +against brute-force attacks. A good password hashing function must be tunable, +slow and include a salt. + + +.. function:: pbkdf2_hmac(name, password, salt, rounds, dklen=None) + + The function provides PKCS#5 password-based key derivation function 2. It + uses HMAC as pseudorandom function. + + The string *name* is the desired name of the hash digest algorithm for + HMAC, e.g. 'sha1' or 'sha256'. *password* and *salt* are interpreted as + buffers of bytes. Applications and libraries should limit *password* to + a sensible value (e.g. 1024). *salt* should be about 16 or more bytes from + a proper source, e.g. :func:`os.urandom`. + + The number of *rounds* should be chosen based on the hash algorithm and + computing power. As of 2013 a value of at least 100,000 rounds of SHA-256 + have been suggested. + + *dklen* is the length of the derived key. If *dklen* is ``None`` then the + digest size of the hash algorithm *name* is used, e.g. 64 for SHA-512. + + >>> import hashlib, binascii + >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) + >>> binascii.hexlify(dk) + b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5' + + .. versionadded:: 3.4 + + .. note:: *pbkdf2_hmac* is only available with OpenSSL 1.0 and newer. + + .. seealso:: Module :mod:`hmac` @@ -189,3 +230,5 @@ Wikipedia article with information on which algorithms have known issues and what that means regarding their use. + http://www.ietf.org/rfc/rfc2898.txt + PKCS #5: Password-Based Cryptography Specification Version 2.0 diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -261,6 +261,14 @@ New :func:`functools.singledispatch` decorator: see the :pep:`443`. +hashlib +------- + +New :func:`hashlib.pbkdf2_hmac` function. + +(Contributed by Christian Heimes in :issue:`18582`) + + inspect ------- diff --git a/Lib/hashlib.py b/Lib/hashlib.py --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -147,6 +147,14 @@ new = __py_new __get_hash = __get_builtin_constructor +# PBKDF2 requires OpenSSL 1.0+ with HMAC and SHA +try: + from _hashlib import pbkdf2_hmac +except ImportError: + pass +else: + __all__ += ('pbkdf2_hmac',) + for __func_name in __always_supported: # try them all, some may not work due to the OpenSSL # version not supporting that algorithm. diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -545,6 +545,88 @@ self.assertEqual(expected_hash, hasher.hexdigest()) + pbkdf2_test_vectors = [ + (b'password', b'salt', 1, None), + (b'password', b'salt', 2, None), + (b'password', b'salt', 4096, None), + # too slow, it takes over a minute on a fast CPU. + #(b'password', b'salt', 16777216, None), + (b'passwordPASSWORDpassword', b'saltSALTsaltSALTsaltSALTsaltSALTsalt', + 4096, -1), + (b'pass\0word', b'sa\0lt', 4096, 16), + ] + + pbkdf2_results = { + "sha1": [ + # offical test vectors from RFC 6070 + (bytes.fromhex('0c60c80f961f0e71f3a9b524af6012062fe037a6'), None), + (bytes.fromhex('ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957'), None), + (bytes.fromhex('4b007901b765489abead49d926f721d065a429c1'), None), + #(bytes.fromhex('eefe3d61cd4da4e4e9945b3d6ba2158c2634e984'), None), + (bytes.fromhex('3d2eec4fe41c849b80c8d83662c0e44a8b291a964c' + 'f2f07038'), 25), + (bytes.fromhex('56fa6aa75548099dcc37d7f03425e0c3'), None),], + "sha256": [ + (bytes.fromhex('120fb6cffcf8b32c43e7225256c4f837' + 'a86548c92ccc35480805987cb70be17b'), None), + (bytes.fromhex('ae4d0c95af6b46d32d0adff928f06dd0' + '2a303f8ef3c251dfd6e2d85a95474c43'), None), + (bytes.fromhex('c5e478d59288c841aa530db6845c4c8d' + '962893a001ce4e11a4963873aa98134a'), None), + #(bytes.fromhex('cf81c66fe8cfc04d1f31ecb65dab4089' + # 'f7f179e89b3b0bcb17ad10e3ac6eba46'), None), + (bytes.fromhex('348c89dbcbd32b2f32d814b8116e84cf2b17' + '347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9'), 40), + (bytes.fromhex('89b69d0516f829893c696226650a8687'), None),], + "sha512": [ + (bytes.fromhex('867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5' + 'd513554e1c8cf252c02d470a285a0501bad999bfe943c08f' + '050235d7d68b1da55e63f73b60a57fce'), None), + (bytes.fromhex('e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f004071' + '3f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82' + 'be67335c77a6068e04112754f27ccf4e'), None), + (bytes.fromhex('d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f8' + '7f6902e072f457b5143f30602641b3d55cd335988cb36b84' + '376060ecd532e039b742a239434af2d5'), None), + (bytes.fromhex('8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b8' + '68c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30' + '225c583a186cd82bd4daea9724a3d3b8'), 64), + (bytes.fromhex('9d9e9c4cd21fe4be24d5b8244c759665'), None),], + } + + @unittest.skipUnless(hasattr(hashlib, 'pbkdf2_hmac'), + 'pbkdf2_hmac required for this test.') + def test_pbkdf2_hmac(self): + pbkdf2 = hashlib.pbkdf2_hmac + + for digest_name, results in self.pbkdf2_results.items(): + for i, vector in enumerate(self.pbkdf2_test_vectors): + password, salt, rounds, dklen = vector + expected, overwrite_dklen = results[i] + if overwrite_dklen: + dklen = overwrite_dklen + out = pbkdf2(digest_name, password, salt, rounds, dklen) + self.assertEqual(out, expected, + (digest_name, password, salt, rounds, dklen)) + out = pbkdf2(digest_name, memoryview(password), + memoryview(salt), rounds, dklen) + out = pbkdf2(digest_name, bytearray(password), + bytearray(salt), rounds, dklen) + self.assertEqual(out, expected) + if dklen is None: + out = pbkdf2(digest_name, password, salt, rounds) + self.assertEqual(out, expected, + (digest_name, password, salt, rounds)) + + self.assertRaises(TypeError, pbkdf2, b'sha1', b'pass', b'salt', 1) + self.assertRaises(TypeError, pbkdf2, 'sha1', 'pass', 'salt', 1) + self.assertRaises(ValueError, pbkdf2, 'sha1', b'pass', b'salt', 0) + self.assertRaises(ValueError, pbkdf2, 'sha1', b'pass', b'salt', -1) + self.assertRaises(ValueError, pbkdf2, 'sha1', b'pass', b'salt', 1, 0) + self.assertRaises(ValueError, pbkdf2, 'sha1', b'pass', b'salt', 1, -1) + with self.assertRaisesRegex(ValueError, 'unsupported hash type'): + pbkdf2('unknown', b'pass', b'salt', 1) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,9 @@ Library ------- +- Issue #18582: Add 'pbkdf2_hmac' to the hashlib module. It implements PKCS#5 + password-based key derivation functions with HMAC as pseudorandom function. + - Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -22,6 +22,7 @@ #include /* We use the object interface to discover what hashes OpenSSL supports. */ #include +#include "openssl/err.h" #define MUNCH_SIZE INT_MAX @@ -61,6 +62,34 @@ DEFINE_CONSTS_FOR_NEW(sha512) #endif +static PyObject * +_setException(PyObject *exc) +{ + unsigned long errcode; + const char *lib, *func, *reason; + + errcode = ERR_peek_last_error(); + if (!errcode) { + PyErr_SetString(exc, "unknown reasons"); + return NULL; + } + ERR_clear_error(); + + lib = ERR_lib_error_string(errcode); + func = ERR_func_error_string(errcode); + reason = ERR_reason_error_string(errcode); + + if (lib && func) { + PyErr_Format(exc, "[%s: %s] %s", lib, func, reason); + } + else if (lib) { + PyErr_Format(exc, "[%s] %s", lib, reason); + } + else { + PyErr_SetString(exc, reason); + } + return NULL; +} static EVPobject * newEVPobject(PyObject *name) @@ -466,6 +495,109 @@ return ret_obj; } +#if (OPENSSL_VERSION_NUMBER >= 0x10000000 && !defined(OPENSSL_NO_HMAC) \ + && !defined(OPENSSL_NO_SHA)) +#define PY_PBKDF2_HMAC 1 + +PyDoc_STRVAR(pbkdf2_hmac__doc__, +"pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\ +\n\ +Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as\n\ +pseudorandom function."); + +static PyObject * +pbkdf2_hmac(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"hash_name", "password", "salt", "iterations", + "dklen", NULL}; + PyObject *key_obj = NULL, *dklen_obj = Py_None; + char *name, *key; + Py_buffer password, salt; + long iterations, dklen; + int retval; + const EVP_MD *digest; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "sy*y*l|O:pbkdf2_hmac", + kwlist, &name, &password, &salt, + &iterations, &dklen_obj)) { + return NULL; + } + + digest = EVP_get_digestbyname(name); + if (digest == NULL) { + PyErr_SetString(PyExc_ValueError, "unsupported hash type"); + goto end; + } + + if (password.len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "password is too long."); + goto end; + } + + if (salt.len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "salt is too long."); + goto end; + } + + if (iterations < 1) { + PyErr_SetString(PyExc_ValueError, + "iteration value must be greater than 0."); + goto end; + } + if (iterations > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "iteration value is too great."); + goto end; + } + + if (dklen_obj == Py_None) { + dklen = EVP_MD_size(digest); + } else { + dklen = PyLong_AsLong(dklen_obj); + if ((dklen == -1) && PyErr_Occurred()) { + goto end; + } + } + if (dklen < 1) { + PyErr_SetString(PyExc_ValueError, + "key length must be greater than 0."); + goto end; + } + if (dklen > INT_MAX) { + /* INT_MAX is always smaller than dkLen max (2^32 - 1) * hLen */ + PyErr_SetString(PyExc_OverflowError, + "key length is too great."); + goto end; + } + + key_obj = PyBytes_FromStringAndSize(NULL, dklen); + if (key_obj == NULL) { + goto end; + } + key = PyBytes_AS_STRING(key_obj); + + Py_BEGIN_ALLOW_THREADS + retval = PKCS5_PBKDF2_HMAC((char*)password.buf, password.len, + (unsigned char *)salt.buf, salt.len, + iterations, digest, dklen, + (unsigned char *)key); + Py_END_ALLOW_THREADS + + if (!retval) { + Py_CLEAR(key_obj); + _setException(PyExc_ValueError); + goto end; + } + + end: + PyBuffer_Release(&password); + PyBuffer_Release(&salt); + return key_obj; +} + +#endif /* State for our callback function so that it can accumulate a result. */ typedef struct _internal_name_mapper_state { @@ -588,6 +720,10 @@ static struct PyMethodDef EVP_functions[] = { {"new", (PyCFunction)EVP_new, METH_VARARGS|METH_KEYWORDS, EVP_new__doc__}, +#ifdef PY_PBKDF2_HMAC + {"pbkdf2_hmac", (PyCFunction)pbkdf2_hmac, METH_VARARGS|METH_KEYWORDS, + pbkdf2_hmac__doc__}, +#endif CONSTRUCTOR_METH_DEF(md5), CONSTRUCTOR_METH_DEF(sha1), #ifdef _OPENSSL_SUPPORTS_SHA2 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 00:58:13 2013 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Oct 2013 00:58:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NDU4?= =?utf-8?q?=3A_Prevent_crashes_with_newer_versions_of_libedit=2E__Its_read?= =?utf-8?q?line?= Message-ID: <3cy1fF5FGqzSlP@mail.python.org> http://hg.python.org/cpython/rev/1e03fd72e116 changeset: 86265:1e03fd72e116 branch: 2.7 parent: 86253:ced6d02097e6 user: Ned Deily date: Sat Oct 12 15:45:25 2013 -0700 summary: Issue #18458: Prevent crashes with newer versions of libedit. Its readline emulation has changed from 0-based indexing to 1-based like gnu readline. Original patch by Ronald Oussoren. files: Misc/NEWS | 4 +++ Modules/readline.c | 40 +++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,10 @@ Library ------- +- Issue #18458: Prevent crashes with newer versions of libedit. Its readline + emulation has changed from 0-based indexing to 1-based like gnu readline. + Original patch by Ronald Oussoren. + - Issue #18919: If the close() method of a writer in the sunau or wave module failed, second invocation of close() and destructor no more raise an exception. Second invocation of close() on sunau writer now has no effects. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -54,14 +54,16 @@ * with the "real" readline and cannot be detected at compile-time, * hence we use a runtime check to detect if we're using libedit * - * Currently there is one know API incompatibility: + * Currently there is one known API incompatibility: * - 'get_history' has a 1-based index with GNU readline, and a 0-based - * index with libedit's emulation. + * index with older versions of libedit's emulation. * - Note that replace_history and remove_history use a 0-based index - * with both implementation. + * with both implementations. */ static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; + +static int libedit_history_start = 0; #endif /* __APPLE__ */ static void @@ -555,21 +557,21 @@ return NULL; #ifdef __APPLE__ if (using_libedit_emulation) { - /* Libedit emulation uses 0-based indexes, - * the real one uses 1-based indexes, - * adjust the index to ensure that Python - * code doesn't have to worry about the - * difference. + /* Older versions of libedit's readline emulation + * use 0-based indexes, while readline and newer + * versions of libedit use 1-based indexes. */ int length = _py_get_history_length(); - idx --; + + idx = idx - 1 + libedit_history_start; /* * Apple's readline emulation crashes when * the index is out of range, therefore * test for that and fail gracefully. */ - if (idx < 0 || idx >= length) { + if (idx < (0 + libedit_history_start) + || idx >= (length + libedit_history_start)) { Py_RETURN_NONE; } } @@ -883,6 +885,17 @@ */ if (using_libedit_emulation) rl_initialize(); + + /* Detect if libedit's readline emulation uses 0-based + * indexing or 1-based indexing. + */ + add_history("1"); + if (history_get(1) == NULL) { + libedit_history_start = 0; + } else { + libedit_history_start = 1; + } + clear_history(); #endif /* __APPLE__ */ using_history(); @@ -1090,11 +1103,8 @@ if (length > 0) #ifdef __APPLE__ if (using_libedit_emulation) { - /* - * Libedit's emulation uses 0-based indexes, - * the real readline uses 1-based indexes. - */ - line = history_get(length - 1)->line; + /* handle older 0-based or newer 1-based indexing */ + line = history_get(length + libedit_history_start - 1)->line; } else #endif /* __APPLE__ */ line = history_get(length)->line; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 00:58:15 2013 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Oct 2013 00:58:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NDU4?= =?utf-8?q?=3A_Prevent_crashes_with_newer_versions_of_libedit=2E__Its_read?= =?utf-8?q?line?= Message-ID: <3cy1fH13q1zSlP@mail.python.org> http://hg.python.org/cpython/rev/dfb7cab9f819 changeset: 86266:dfb7cab9f819 branch: 3.3 parent: 86259:faf318b53d58 user: Ned Deily date: Sat Oct 12 15:47:58 2013 -0700 summary: Issue #18458: Prevent crashes with newer versions of libedit. Its readline emulation has changed from 0-based indexing to 1-based like gnu readline. Original patch by Ronald Oussoren. files: Misc/NEWS | 4 +++ Modules/readline.c | 40 +++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,10 @@ Library ------- +- Issue #18458: Prevent crashes with newer versions of libedit. Its readline + emulation has changed from 0-based indexing to 1-based like gnu readline. + Original patch by Ronald Oussoren. + - Issue #18919: If the close() method of a writer in the sunau or wave module failed, second invocation of close() and destructor no more raise an exception. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -54,14 +54,16 @@ * with the "real" readline and cannot be detected at compile-time, * hence we use a runtime check to detect if we're using libedit * - * Currently there is one know API incompatibility: + * Currently there is one known API incompatibility: * - 'get_history' has a 1-based index with GNU readline, and a 0-based - * index with libedit's emulation. + * index with older versions of libedit's emulation. * - Note that replace_history and remove_history use a 0-based index - * with both implementation. + * with both implementations. */ static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; + +static int libedit_history_start = 0; #endif /* __APPLE__ */ #ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK @@ -579,21 +581,21 @@ return NULL; #ifdef __APPLE__ if (using_libedit_emulation) { - /* Libedit emulation uses 0-based indexes, - * the real one uses 1-based indexes, - * adjust the index to ensure that Python - * code doesn't have to worry about the - * difference. + /* Older versions of libedit's readline emulation + * use 0-based indexes, while readline and newer + * versions of libedit use 1-based indexes. */ int length = _py_get_history_length(); - idx --; + + idx = idx - 1 + libedit_history_start; /* * Apple's readline emulation crashes when * the index is out of range, therefore * test for that and fail gracefully. */ - if (idx < 0 || idx >= length) { + if (idx < (0 + libedit_history_start) + || idx >= (length + libedit_history_start)) { Py_RETURN_NONE; } } @@ -908,6 +910,17 @@ */ if (using_libedit_emulation) rl_initialize(); + + /* Detect if libedit's readline emulation uses 0-based + * indexing or 1-based indexing. + */ + add_history("1"); + if (history_get(1) == NULL) { + libedit_history_start = 0; + } else { + libedit_history_start = 1; + } + clear_history(); #endif /* __APPLE__ */ using_history(); @@ -1116,11 +1129,8 @@ if (length > 0) #ifdef __APPLE__ if (using_libedit_emulation) { - /* - * Libedit's emulation uses 0-based indexes, - * the real readline uses 1-based indexes. - */ - line = (const char *)history_get(length - 1)->line; + /* handle older 0-based or newer 1-based indexing */ + line = (const char *)history_get(length + libedit_history_start - 1)->line; } else #endif /* __APPLE__ */ line = (const char *)history_get(length)->line; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 00:58:16 2013 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Oct 2013 00:58:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318458=3A_merge_comments_from_3=2E3?= Message-ID: <3cy1fJ30J3z7Ljc@mail.python.org> http://hg.python.org/cpython/rev/47a7313f079a changeset: 86267:47a7313f079a parent: 86264:5fd56d6d3fce parent: 86266:dfb7cab9f819 user: Ned Deily date: Sat Oct 12 15:57:04 2013 -0700 summary: Issue #18458: merge comments from 3.3 files: Modules/readline.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -55,11 +55,11 @@ * with the "real" readline and cannot be detected at compile-time, * hence we use a runtime check to detect if we're using libedit * - * Currently there is one know API incompatibility: + * Currently there is one known API incompatibility: * - 'get_history' has a 1-based index with GNU readline, and a 0-based - * index with libedit's emulation. + * index with older versions of libedit's emulation. * - Note that replace_history and remove_history use a 0-based index - * with both implementation. + * with both implementations. */ static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 01:04:48 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 13 Oct 2013 01:04:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MjAy?= =?utf-8?q?=3A__Add_cross-reference_and_a_rough_code_equivalent?= Message-ID: <3cy1nr5sR6z7LjS@mail.python.org> http://hg.python.org/cpython/rev/3b6401c27e39 changeset: 86268:3b6401c27e39 branch: 3.3 parent: 86266:dfb7cab9f819 user: Raymond Hettinger date: Sat Oct 12 16:04:17 2013 -0700 summary: Issue #19202: Add cross-reference and a rough code equivalent files: Doc/library/functools.rst | 12 ++++++++++++ Doc/library/itertools.rst | 3 +++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -185,6 +185,18 @@ a default when the sequence is empty. If *initializer* is not given and *sequence* contains only one item, the first item is returned. + Equivalent to:: + + def reduce(function, iterable, initializer=None): + it = iter(iterable) + if initializer is None: + value = next(it) + else: + value = initializer + for element in it: + value = function(value, element) + return value + .. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -135,6 +135,9 @@ '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32', '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60'] + See :func:`functools.reduce` for a similar function that returns only the + final accumulated value. + .. versionadded:: 3.2 .. versionchanged:: 3.3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 01:04:50 2013 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 13 Oct 2013 01:04:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cy1nt0S1Cz7LjX@mail.python.org> http://hg.python.org/cpython/rev/51be7a2468b3 changeset: 86269:51be7a2468b3 parent: 86267:47a7313f079a parent: 86268:3b6401c27e39 user: Raymond Hettinger date: Sat Oct 12 16:04:39 2013 -0700 summary: merge files: Doc/library/functools.rst | 12 ++++++++++++ Doc/library/itertools.rst | 3 +++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -205,6 +205,18 @@ a default when the sequence is empty. If *initializer* is not given and *sequence* contains only one item, the first item is returned. + Equivalent to:: + + def reduce(function, iterable, initializer=None): + it = iter(iterable) + if initializer is None: + value = next(it) + else: + value = initializer + for element in it: + value = function(value, element) + return value + .. decorator:: singledispatch(default) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -135,6 +135,9 @@ '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32', '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60'] + See :func:`functools.reduce` for a similar function that returns only the + final accumulated value. + .. versionadded:: 3.2 .. versionchanged:: 3.3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 01:55:09 2013 From: python-checkins at python.org (richard.oudkerk) Date: Sun, 13 Oct 2013 01:55:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogTWFrZSB0ZXN0X3Rl?= =?utf-8?q?rminate=28=29_succeed_or_fail_quickly=2E?= Message-ID: <3cy2vx05N8z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/87f484679a39 changeset: 86270:87f484679a39 branch: 3.3 parent: 86268:3b6401c27e39 user: Richard Oudkerk date: Sun Oct 13 00:49:27 2013 +0100 summary: Make test_terminate() succeed or fail quickly. This does not fix #19227, but should stop the Gentoo buildbot from hanging. files: Lib/test/test_multiprocessing.py | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -270,7 +270,7 @@ @classmethod def _test_terminate(cls): - time.sleep(1000) + time.sleep(100) def test_terminate(self): if self.TYPE == 'threads': @@ -296,7 +296,19 @@ p.terminate() - self.assertEqual(join(), None) + if hasattr(signal, 'alarm'): + def handler(*args): + raise RuntimeError('join took too long: pid=%s' % p.pid) + old_handler = signal.signal(signal.SIGALRM, handler) + try: + signal.alarm(10) + self.assertEqual(join(), None) + signal.alarm(0) + finally: + signal.signal(signal.SIGALRM, old_handler) + else: + self.assertEqual(join(), None) + self.assertTimingAlmostEqual(join.elapsed, 0.0) self.assertEqual(p.is_alive(), False) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 01:55:10 2013 From: python-checkins at python.org (richard.oudkerk) Date: Sun, 13 Oct 2013 01:55:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogTWVyZ2Uu?= Message-ID: <3cy2vy1xGSz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/205adbbc5bab changeset: 86271:205adbbc5bab parent: 86269:51be7a2468b3 parent: 86270:87f484679a39 user: Richard Oudkerk date: Sun Oct 13 00:52:21 2013 +0100 summary: Merge. files: Lib/test/_test_multiprocessing.py | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -273,7 +273,7 @@ @classmethod def _test_terminate(cls): - time.sleep(1000) + time.sleep(100) def test_terminate(self): if self.TYPE == 'threads': @@ -299,7 +299,19 @@ p.terminate() - self.assertEqual(join(), None) + if hasattr(signal, 'alarm'): + def handler(*args): + raise RuntimeError('join took too long: pid=%s' % p.pid) + old_handler = signal.signal(signal.SIGALRM, handler) + try: + signal.alarm(10) + self.assertEqual(join(), None) + signal.alarm(0) + finally: + signal.signal(signal.SIGALRM, old_handler) + else: + self.assertEqual(join(), None) + self.assertTimingAlmostEqual(join.elapsed, 0.0) self.assertEqual(p.is_alive(), False) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:31 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_import_functools_fr?= =?utf-8?q?om_re_module=2E_The_re_module_imports_functools_but?= Message-ID: <3cy3dH6Ct4z7LjY@mail.python.org> http://hg.python.org/cpython/rev/28c25ae338fa changeset: 86272:28c25ae338fa parent: 86269:51be7a2468b3 user: Christian Heimes date: Sun Oct 13 02:00:09 2013 +0200 summary: Remove import functools from re module. The re module imports functools but never uses it. files: Lib/re.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -121,7 +121,6 @@ import sys import sre_compile import sre_parse -import functools # public symbols __all__ = [ "match", "search", "sub", "subn", "split", "findall", -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:33 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319218=3A_Rename_c?= =?utf-8?q?ollections=2Eabc_to_=5Fcollections=5Fabc_in_order_to_speed_up?= Message-ID: <3cy3dK0xt8z7LjY@mail.python.org> http://hg.python.org/cpython/rev/0b6052f2a8ee changeset: 86273:0b6052f2a8ee user: Christian Heimes date: Sun Oct 13 02:04:20 2013 +0200 summary: Issue #19218: Rename collections.abc to _collections_abc in order to speed up interpreter start files: Doc/library/collections.abc.rst | 2 +- Lib/collections/abc.py | 0 Lib/collections/__init__.py | 6 +++--- Lib/os.py | 2 +- Lib/random.py | 2 +- Lib/test/test_site.py | 5 +++++ Misc/NEWS | 3 +++ 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -15,7 +15,7 @@ import itertools __name__ = '' -**Source code:** :source:`Lib/collections/abc.py` +**Source code:** :source:`Lib/_collections_abc.py` -------------- diff --git a/Lib/collections/abc.py b/Lib/_collections_abc.py rename from Lib/collections/abc.py rename to Lib/_collections_abc.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -3,9 +3,9 @@ # For backwards compatibility, continue to make the collections ABCs # available through the collections module. -from collections.abc import * -import collections.abc -__all__ += collections.abc.__all__ +from _collections_abc import * +import _collections_abc +__all__ += _collections_abc.__all__ from _collections import deque, defaultdict from operator import itemgetter as _itemgetter, eq as _eq diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -631,7 +631,7 @@ # Change environ to automatically call putenv(), unsetenv if they exist. -from collections.abc import MutableMapping +from _collections_abc import MutableMapping class _Environ(MutableMapping): def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -41,7 +41,7 @@ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin from os import urandom as _urandom -from collections.abc import Set as _Set, Sequence as _Sequence +from _collections_abc import Set as _Set, Sequence as _Sequence from hashlib import sha512 as _sha512 __all__ = ["Random","seed","random","uniform","randint","choice","sample", diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -445,6 +445,11 @@ self.assertNotIn('locale', modules, stderr) # http://bugs.python.org/issue19209 self.assertNotIn('copyreg', modules, stderr) + # http://bugs.python.org/issue19218> + collection_mods = {'_collections', 'collections', 'functools', + 'heapq', 'itertools', 'keyword', 'operator', + 'reprlib', 'types', 'weakref'} + self.assertFalse(modules.intersection(re_mods), stderr) if __name__ == "__main__": diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,9 @@ Library ------- +- Issue #19218: Rename collections.abc to _collections_abc in order to + speed up interpreter start. + - Issue #18582: Add 'pbkdf2_hmac' to the hashlib module. It implements PKCS#5 password-based key derivation functions with HMAC as pseudorandom function. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:34 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319218=3A_Add_faca?= =?utf-8?q?de_collections=2Eabc?= Message-ID: <3cy3dL2fDgz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/7ea831581af4 changeset: 86274:7ea831581af4 user: Christian Heimes date: Sun Oct 13 02:04:50 2013 +0200 summary: Issue #19218: Add facade collections.abc files: Lib/collections/abc.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py new file mode 100644 --- /dev/null +++ b/Lib/collections/abc.py @@ -0,0 +1,3 @@ +from _collections_abc import * +from _collections_abc import __all__ + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:35 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319218=3A_set_=5F?= =?utf-8?q?=5Fname=5F=5F_of_=5Fcollections=5Fabc_to_collections=2Eabc_in_o?= =?utf-8?q?rder_to?= Message-ID: <3cy3dM4Fmdz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/62b6ecd1e463 changeset: 86275:62b6ecd1e463 user: Christian Heimes date: Sun Oct 13 02:21:33 2013 +0200 summary: Issue #19218: set __name__ of _collections_abc to collections.abc in order to fix tests and keep beautiful qualified names. files: Lib/_collections_abc.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -18,6 +18,12 @@ "ByteString", ] +# This module has been renamed from collections.abc to _collections_abc to +# speed up interpreter startup. Some of the types such as MutableMapping are +# required early but collections module imports a lot of other modules. +# See issue #19218 +__name__ = "collections.abc" + # Private list of types that we want to register with the various ABCs # so that they will pass tests like: # it = iter(somebytearray) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:36 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3cy3dN5zNwz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/af6975b4aa06 changeset: 86276:af6975b4aa06 parent: 86275:62b6ecd1e463 parent: 86271:205adbbc5bab user: Christian Heimes date: Sun Oct 13 02:22:10 2013 +0200 summary: merge files: Lib/test/_test_multiprocessing.py | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -273,7 +273,7 @@ @classmethod def _test_terminate(cls): - time.sleep(1000) + time.sleep(100) def test_terminate(self): if self.TYPE == 'threads': @@ -299,7 +299,19 @@ p.terminate() - self.assertEqual(join(), None) + if hasattr(signal, 'alarm'): + def handler(*args): + raise RuntimeError('join took too long: pid=%s' % p.pid) + old_handler = signal.signal(signal.SIGALRM, handler) + try: + signal.alarm(10) + self.assertEqual(join(), None) + signal.alarm(0) + finally: + signal.signal(signal.SIGALRM, old_handler) + else: + self.assertEqual(join(), None) + self.assertTimingAlmostEqual(join.elapsed, 0.0) self.assertEqual(p.is_alive(), False) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:27:38 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:27:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_whitespace_cleanup?= Message-ID: <3cy3dQ0R2zz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/1eb688c52611 changeset: 86277:1eb688c52611 user: Christian Heimes date: Sun Oct 13 02:27:22 2013 +0200 summary: whitespace cleanup files: Lib/collections/abc.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py --- a/Lib/collections/abc.py +++ b/Lib/collections/abc.py @@ -1,3 +1,2 @@ from _collections_abc import * from _collections_abc import __all__ - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 02:29:22 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 02:29:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319219=3A_retval_m?= =?utf-8?q?ay_be_used_uninitialized_value?= Message-ID: <3cy3gQ3WJsz7LjT@mail.python.org> http://hg.python.org/cpython/rev/2a2b339b6b59 changeset: 86278:2a2b339b6b59 user: Christian Heimes date: Sun Oct 13 02:29:06 2013 +0200 summary: Issue #19219: retval may be used uninitialized value CID 486239: Uninitialized pointer read (UNINIT) files: Python/marshal.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -841,7 +841,7 @@ long i, n; int type, code = r_byte(p); int flag, is_interned = 0; - PyObject *retval; + PyObject *retval = NULL; if (code == EOF) { PyErr_SetString(PyExc_EOFError, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 03:10:14 2013 From: python-checkins at python.org (christian.heimes) Date: Sun, 13 Oct 2013 03:10:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Document_speedup_in_whatsn?= =?utf-8?q?ew?= Message-ID: <3cy4ZZ5yV6z7LjR@mail.python.org> http://hg.python.org/cpython/rev/9c5236d3ad75 changeset: 86279:9c5236d3ad75 user: Christian Heimes date: Sun Oct 13 03:10:06 2013 +0200 summary: Document speedup in whatsnew files: Doc/whatsnew/3.4.rst | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -506,6 +506,17 @@ (Contributed by Raymond Hettinger in :issue"`18771`.) +* The interpreter starts about 30% faster. A couple of measures lead to the + speedup. The interpreter loads less modules on startup, e.g. the :mod:`re`, + :mod:`collections` and :mod:`locale` modules and their dependencies are no + longer imported by default. The marshal module has been improved to load + compiled Python code faster. + + (Contributed by Antoine Pitrou, Christian Heimes and Victor Stinner in + :issue:`19219`, :issue:`19218`, :issue:`19209`, :issue:`19205` and + :issue:`9548`) + + Build and C API Changes ======================= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 03:13:08 2013 From: python-checkins at python.org (ethan.furman) Date: Sun, 13 Oct 2013 03:13:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2318281=3A_superflu?= =?utf-8?q?ous_stat_constants_removed_from_tarfile?= Message-ID: <3cy4dw45qLz7LjR@mail.python.org> http://hg.python.org/cpython/rev/3d557da59c22 changeset: 86280:3d557da59c22 user: Ethan Furman date: Sat Oct 12 18:13:02 2013 -0700 summary: Close #18281: superfluous stat constants removed from tarfile files: Lib/tarfile.py | 24 ------------------------ 1 files changed, 0 insertions(+), 24 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -140,30 +140,6 @@ } #--------------------------------------------------------- -# Bits used in the mode field, values in octal. -#--------------------------------------------------------- -S_IFLNK = 0o120000 # symbolic link -S_IFREG = 0o100000 # regular file -S_IFBLK = 0o060000 # block device -S_IFDIR = 0o040000 # directory -S_IFCHR = 0o020000 # character device -S_IFIFO = 0o010000 # fifo - -TSUID = 0o4000 # set UID on execution -TSGID = 0o2000 # set GID on execution -TSVTX = 0o1000 # reserved - -TUREAD = 0o400 # read by owner -TUWRITE = 0o200 # write by owner -TUEXEC = 0o100 # execute/search by owner -TGREAD = 0o040 # read by group -TGWRITE = 0o020 # write by group -TGEXEC = 0o010 # execute/search by group -TOREAD = 0o004 # read by other -TOWRITE = 0o002 # write by other -TOEXEC = 0o001 # execute/search by other - -#--------------------------------------------------------- # initialization #--------------------------------------------------------- if os.name in ("nt", "ce"): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 06:36:25 2013 From: python-checkins at python.org (eric.smith) Date: Sun, 13 Oct 2013 06:36:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Grammar_fix=2E?= Message-ID: <3cy98T1WWtz7LkB@mail.python.org> http://hg.python.org/cpython/rev/3f1deecd8d50 changeset: 86281:3f1deecd8d50 user: Eric V. Smith date: Sun Oct 13 00:36:08 2013 -0400 summary: Grammar fix. files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -507,7 +507,7 @@ (Contributed by Raymond Hettinger in :issue"`18771`.) * The interpreter starts about 30% faster. A couple of measures lead to the - speedup. The interpreter loads less modules on startup, e.g. the :mod:`re`, + speedup. The interpreter loads fewer modules on startup, e.g. the :mod:`re`, :mod:`collections` and :mod:`locale` modules and their dependencies are no longer imported by default. The marshal module has been improved to load compiled Python code faster. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Oct 13 07:04:52 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 13 Oct 2013 07:04:52 +0200 Subject: [Python-checkins] Daily reference leaks (3d557da59c22): sum=-14 Message-ID: results for 3d557da59c22 on branch "default" -------------------------------------------- test_imp leaked [0, 0, 1] references, sum=1 test_site leaked [0, -2, 0] references, sum=-2 test_site leaked [0, -2, 0] memory blocks, sum=-2 test_urllib2net leaked [0, 1586, -1597] references, sum=-11 test_urllib2net leaked [0, 1405, -1405] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogn_o96M', '-x'] From python-checkins at python.org Sun Oct 13 09:31:13 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:31:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_re=2Efullmatch=28=29_f?= =?utf-8?q?unction_and_regex=2Efullmatch=28=29_method=2C_which_anchor_the?= Message-ID: <3cyF296CVhzShM@mail.python.org> http://hg.python.org/cpython/rev/b51218966201 changeset: 86282:b51218966201 user: Georg Brandl date: Sun Oct 13 09:18:45 2013 +0200 summary: Add re.fullmatch() function and regex.fullmatch() method, which anchor the pattern at both ends of the string to match. Patch by Matthew Barnett. Closes #16203. files: Doc/library/re.rst | 28 +++++++ Lib/re.py | 28 ++++-- Lib/test/test_re.py | 24 ++++++ Modules/_sre.c | 120 ++++++++++++++++++++++--------- Modules/sre.h | 1 + 5 files changed, 156 insertions(+), 45 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -584,6 +584,16 @@ instead (see also :ref:`search-vs-match`). +.. function:: fullmatch(pattern, string, flags=0) + + If the whole *string* matches the regular expression *pattern*, return a + corresponding :ref:`match object `. Return ``None`` if the + string does not match the pattern; note that this is different from a + zero-length match. + + .. versionadded:: 3.4 + + .. function:: split(pattern, string, maxsplit=0, flags=0) Split *string* by the occurrences of *pattern*. If capturing parentheses are @@ -778,6 +788,24 @@ :meth:`~regex.search` instead (see also :ref:`search-vs-match`). +.. method:: regex.fullmatch(string[, pos[, endpos]]) + + If the whole *string* matches this regular expression, return a corresponding + :ref:`match object `. Return ``None`` if the string does not + match the pattern; note that this is different from a zero-length match. + + The optional *pos* and *endpos* parameters have the same meaning as for the + :meth:`~regex.search` method. + + >>> pattern = re.compile("o[gh]") + >>> pattern.fullmatch("dog") # No match as "o" is not at the start of "dog". + >>> pattern.fullmatch("ogre") # No match as not the full string matches. + >>> pattern.fullmatch("doggie", 1, 3) # Matches within given limits. + <_sre.SRE_Match object at ...> + + .. versionadded:: 3.4 + + .. method:: regex.split(string, maxsplit=0) Identical to the :func:`split` function, using the compiled pattern. diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -85,16 +85,17 @@ \\ Matches a literal backslash. This module exports the following functions: - match Match a regular expression pattern to the beginning of a string. - search Search a string for the presence of a pattern. - sub Substitute occurrences of a pattern found in a string. - subn Same as sub, but also return the number of substitutions made. - split Split a string by the occurrences of a pattern. - findall Find all occurrences of a pattern in a string. - finditer Return an iterator yielding a match object for each match. - compile Compile a pattern into a RegexObject. - purge Clear the regular expression cache. - escape Backslash all non-alphanumerics in a string. + match Match a regular expression pattern to the beginning of a string. + fullmatch Match a regular expression pattern to all of a string. + search Search a string for the presence of a pattern. + sub Substitute occurrences of a pattern found in a string. + subn Same as sub, but also return the number of substitutions made. + split Split a string by the occurrences of a pattern. + findall Find all occurrences of a pattern in a string. + finditer Return an iterator yielding a match object for each match. + compile Compile a pattern into a RegexObject. + purge Clear the regular expression cache. + escape Backslash all non-alphanumerics in a string. Some of the functions in this module takes flags as optional parameters: A ASCII For string patterns, make \w, \W, \b, \B, \d, \D @@ -123,7 +124,7 @@ import sre_parse # public symbols -__all__ = [ "match", "search", "sub", "subn", "split", "findall", +__all__ = [ "match", "fullmatch", "search", "sub", "subn", "split", "findall", "compile", "purge", "template", "escape", "A", "I", "L", "M", "S", "X", "U", "ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", "UNICODE", "error" ] @@ -154,6 +155,11 @@ a match object, or None if no match was found.""" return _compile(pattern, flags).match(string) +def fullmatch(pattern, string, flags=0): + """Try to apply the pattern to all of the string, returning + a match object, or None if no match was found.""" + return _compile(pattern, flags).fullmatch(string) + def search(pattern, string, flags=0): """Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.""" diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1061,6 +1061,30 @@ self.assertEqual(m.group(1), "") self.assertEqual(m.group(2), "y") + def test_fullmatch(self): + # Issue 16203: Proposal: add re.fullmatch() method. + self.assertEqual(re.fullmatch(r"a", "a").span(), (0, 1)) + self.assertEqual(re.fullmatch(r"a|ab", "ab").span(), (0, 2)) + self.assertEqual(re.fullmatch(r".*?$", "abc").span(), (0, 3)) + self.assertEqual(re.fullmatch(r".*?", "abc").span(), (0, 3)) + self.assertEqual(re.fullmatch(r"a.*?b", "ab").span(), (0, 2)) + self.assertEqual(re.fullmatch(r"a.*?b", "abb").span(), (0, 3)) + self.assertEqual(re.fullmatch(r"a.*?b", "axxb").span(), (0, 4)) + self.assertEqual(re.fullmatch(r"abc$", "abc\n"), None) + self.assertEqual(re.fullmatch(r"abc\Z", "abc\n"), None) + self.assertEqual(re.fullmatch(r"(?m)abc$", "abc\n"), None) + self.assertEqual(re.fullmatch(r"ab(?=c)cd", "abcd").span(), (0, 4)) + self.assertEqual(re.fullmatch(r"ab(?<=b)cd", "abcd").span(), (0, 4)) + self.assertEqual(re.fullmatch(r"(?=a|ab)ab", "ab").span(), (0, 2)) + + self.assertEqual( + re.compile(r"bc").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) + self.assertEqual( + re.compile(r".*?$").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) + self.assertEqual( + re.compile(r".*?").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) + + def run_re_tests(): from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR if verbose: diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -4,24 +4,25 @@ * regular expression matching engine * * partial history: - * 1999-10-24 fl created (based on existing template matcher code) - * 2000-03-06 fl first alpha, sort of - * 2000-08-01 fl fixes for 1.6b1 - * 2000-08-07 fl use PyOS_CheckStack() if available - * 2000-09-20 fl added expand method - * 2001-03-20 fl lots of fixes for 2.1b2 - * 2001-04-15 fl export copyright as Python attribute, not global - * 2001-04-28 fl added __copy__ methods (work in progress) - * 2001-05-14 fl fixes for 1.5.2 compatibility - * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) - * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) - * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 - * 2001-10-21 fl added sub/subn primitive - * 2001-10-24 fl added finditer primitive (for 2.2 only) - * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) - * 2002-11-09 fl fixed empty sub/subn return type - * 2003-04-18 mvl fully support 4-byte codes - * 2003-10-17 gn implemented non recursive scheme + * 1999-10-24 fl created (based on existing template matcher code) + * 2000-03-06 fl first alpha, sort of + * 2000-08-01 fl fixes for 1.6b1 + * 2000-08-07 fl use PyOS_CheckStack() if available + * 2000-09-20 fl added expand method + * 2001-03-20 fl lots of fixes for 2.1b2 + * 2001-04-15 fl export copyright as Python attribute, not global + * 2001-04-28 fl added __copy__ methods (work in progress) + * 2001-05-14 fl fixes for 1.5.2 compatibility + * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) + * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) + * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 + * 2001-10-21 fl added sub/subn primitive + * 2001-10-24 fl added finditer primitive (for 2.2 only) + * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) + * 2002-11-09 fl fixed empty sub/subn return type + * 2003-04-18 mvl fully support 4-byte codes + * 2003-10-17 gn implemented non recursive scheme + * 2013-02-04 mrab added fullmatch primitive * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * @@ -746,11 +747,12 @@ #define JUMP_ASSERT 12 #define JUMP_ASSERT_NOT 13 -#define DO_JUMP(jumpvalue, jumplabel, nextpattern) \ +#define DO_JUMP(jumpvalue, jumplabel, nextpattern, matchall) \ DATA_ALLOC(SRE_MATCH_CONTEXT, nextctx); \ nextctx->last_ctx_pos = ctx_pos; \ nextctx->jump = jumpvalue; \ nextctx->pattern = nextpattern; \ + nextctx->match_all = matchall; \ ctx_pos = alloc_pos; \ ctx = nextctx; \ goto entrance; \ @@ -769,6 +771,7 @@ SRE_CODE chr; SRE_REPEAT* rep; } u; + int match_all; } SRE_MATCH_CONTEXT; /* check if string matches the given pattern. returns <0 for @@ -791,6 +794,7 @@ ctx->last_ctx_pos = -1; ctx->jump = JUMP_NONE; ctx->pattern = pattern; + ctx->match_all = state->match_all; ctx_pos = alloc_pos; entrance: @@ -864,6 +868,8 @@ case SRE_OP_SUCCESS: /* end of pattern */ TRACE(("|%p|%p|SUCCESS\n", ctx->pattern, ctx->ptr)); + if (ctx->match_all && ctx->ptr != state->end) + RETURN_FAILURE; state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -972,7 +978,7 @@ !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0)))) continue; state->ptr = ctx->ptr; - DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1); + DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1, ctx->match_all); if (ret) { if (ctx->u.rep) MARK_POP_DISCARD(ctx->lastmark); @@ -1019,7 +1025,8 @@ if (ctx->count < (Py_ssize_t) ctx->pattern[1]) RETURN_FAILURE; - if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { + if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS && + (!ctx->match_all || ctx->ptr == state->end)) { /* tail is empty. we're finished */ state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -1042,7 +1049,7 @@ break; state->ptr = ctx->ptr; DO_JUMP(JUMP_REPEAT_ONE_1, jump_repeat_one_1, - ctx->pattern+ctx->pattern[0]); + ctx->pattern+ctx->pattern[0], ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1059,7 +1066,7 @@ while (ctx->count >= (Py_ssize_t) ctx->pattern[1]) { state->ptr = ctx->ptr; DO_JUMP(JUMP_REPEAT_ONE_2, jump_repeat_one_2, - ctx->pattern+ctx->pattern[0]); + ctx->pattern+ctx->pattern[0], ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1104,7 +1111,8 @@ ctx->ptr += state->charsize * ctx->count; } - if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { + if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS && + (!ctx->match_all || ctx->ptr == state->end)) { /* tail is empty. we're finished */ state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -1116,7 +1124,7 @@ || ctx->count <= (Py_ssize_t)ctx->pattern[2]) { state->ptr = ctx->ptr; DO_JUMP(JUMP_MIN_REPEAT_ONE,jump_min_repeat_one, - ctx->pattern+ctx->pattern[0]); + ctx->pattern+ctx->pattern[0], ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1155,7 +1163,7 @@ state->repeat = ctx->u.rep; state->ptr = ctx->ptr; - DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]); + DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0], ctx->match_all); state->repeat = ctx->u.rep->prev; PyObject_FREE(ctx->u.rep); @@ -1187,7 +1195,7 @@ /* not enough matches */ ctx->u.rep->count = ctx->count; DO_JUMP(JUMP_MAX_UNTIL_1, jump_max_until_1, - ctx->u.rep->pattern+3); + ctx->u.rep->pattern+3, ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1209,7 +1217,7 @@ DATA_PUSH(&ctx->u.rep->last_ptr); ctx->u.rep->last_ptr = state->ptr; DO_JUMP(JUMP_MAX_UNTIL_2, jump_max_until_2, - ctx->u.rep->pattern+3); + ctx->u.rep->pattern+3, ctx->match_all); DATA_POP(&ctx->u.rep->last_ptr); if (ret) { MARK_POP_DISCARD(ctx->lastmark); @@ -1225,7 +1233,7 @@ /* cannot match more repeated items here. make sure the tail matches */ state->repeat = ctx->u.rep->prev; - DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern); + DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern, ctx->match_all); RETURN_ON_SUCCESS(ret); state->repeat = ctx->u.rep; state->ptr = ctx->ptr; @@ -1250,7 +1258,7 @@ /* not enough matches */ ctx->u.rep->count = ctx->count; DO_JUMP(JUMP_MIN_UNTIL_1, jump_min_until_1, - ctx->u.rep->pattern+3); + ctx->u.rep->pattern+3, ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1264,7 +1272,7 @@ /* see if the tail matches */ state->repeat = ctx->u.rep->prev; - DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern); + DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern, ctx->match_all); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1285,7 +1293,7 @@ DATA_PUSH(&ctx->u.rep->last_ptr); ctx->u.rep->last_ptr = state->ptr; DO_JUMP(JUMP_MIN_UNTIL_3,jump_min_until_3, - ctx->u.rep->pattern+3); + ctx->u.rep->pattern+3, ctx->match_all); DATA_POP(&ctx->u.rep->last_ptr); if (ret) { RETURN_ON_ERROR(ret); @@ -1378,7 +1386,7 @@ state->ptr = ctx->ptr - state->charsize * ctx->pattern[1]; if (state->ptr < state->beginning) RETURN_FAILURE; - DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2); + DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2, 0); RETURN_ON_FAILURE(ret); ctx->pattern += ctx->pattern[0]; break; @@ -1390,7 +1398,7 @@ ctx->ptr, ctx->pattern[1])); state->ptr = ctx->ptr - state->charsize * ctx->pattern[1]; if (state->ptr >= state->beginning) { - DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2); + DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2, 0); if (ret) { RETURN_ON_ERROR(ret); RETURN_FAILURE; @@ -1910,6 +1918,44 @@ } static PyObject* +pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kw) +{ + SRE_STATE state; + Py_ssize_t status; + + PyObject* string; + Py_ssize_t start = 0; + Py_ssize_t end = PY_SSIZE_T_MAX; + static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:fullmatch", kwlist, + &string, &start, &end)) + return NULL; + + string = state_init(&state, self, string, start, end); + if (!string) + return NULL; + + state.match_all = 1; + state.ptr = state.start; + + TRACE(("|%p|%p|FULLMATCH\n", PatternObject_GetCode(self), state.ptr)); + + if (state.logical_charsize == 1) { + status = sre_match(&state, PatternObject_GetCode(self)); + } else { + status = sre_umatch(&state, PatternObject_GetCode(self)); + } + + TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); + if (PyErr_Occurred()) + return NULL; + + state_fini(&state); + + return pattern_new_match(self, &state, status); +} + +static PyObject* pattern_search(PatternObject* self, PyObject* args, PyObject* kw) { SRE_STATE state; @@ -2530,6 +2576,10 @@ "match(string[, pos[, endpos]]) -> match object or None.\n\ Matches zero or more characters at the beginning of the string"); +PyDoc_STRVAR(pattern_fullmatch_doc, +"fullmatch(string[, pos[, endpos]]) -> match object or None.\n\ + Matches against all of the string"); + PyDoc_STRVAR(pattern_search_doc, "search(string[, pos[, endpos]]) -> match object or None.\n\ Scan through string looking for a match, and return a corresponding\n\ @@ -2565,6 +2615,8 @@ static PyMethodDef pattern_methods[] = { {"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS, pattern_match_doc}, + {"fullmatch", (PyCFunction) pattern_fullmatch, METH_VARARGS|METH_KEYWORDS, + pattern_fullmatch_doc}, {"search", (PyCFunction) pattern_search, METH_VARARGS|METH_KEYWORDS, pattern_search_doc}, {"sub", (PyCFunction) pattern_sub, METH_VARARGS|METH_KEYWORDS, diff --git a/Modules/sre.h b/Modules/sre.h --- a/Modules/sre.h +++ b/Modules/sre.h @@ -89,6 +89,7 @@ SRE_REPEAT *repeat; /* hooks */ SRE_TOLOWER_HOOK lower; + int match_all; } SRE_STATE; typedef struct { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:31:15 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:31:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_display_of?= =?utf-8?q?_deprecated_blocks_with_Sphinx_1=2E2=2E?= Message-ID: <3cyF2C1BtmzShM@mail.python.org> http://hg.python.org/cpython/rev/5257cc2425be changeset: 86283:5257cc2425be branch: 3.3 parent: 86270:87f484679a39 user: Georg Brandl date: Sun Oct 13 09:31:42 2013 +0200 summary: Fix display of deprecated blocks with Sphinx 1.2. files: Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 2 +- Doc/tools/sphinxext/static/basic.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -122,7 +122,7 @@ font-weight: normal; } -p.deprecated { +.deprecated { border-radius: 3px; } diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -334,7 +334,7 @@ font-style: italic; } -p.deprecated, p.deprecated-removed { +.deprecated, .deprecated-removed { background-color: #ffe4e4; border: 1px solid #f66; padding: 7px -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:31:16 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:31:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyF2D2qgNz7Lk3@mail.python.org> http://hg.python.org/cpython/rev/bd56b182c7f8 changeset: 86284:bd56b182c7f8 parent: 86282:b51218966201 parent: 86283:5257cc2425be user: Georg Brandl date: Sun Oct 13 09:32:00 2013 +0200 summary: merge with 3.3 files: Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css | 2 +- Doc/tools/sphinxext/static/basic.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css --- a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css +++ b/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css @@ -122,7 +122,7 @@ font-weight: normal; } -p.deprecated { +.deprecated { border-radius: 3px; } diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -334,7 +334,7 @@ font-style: italic; } -p.deprecated, p.deprecated-removed { +.deprecated, .deprecated-removed { background-color: #ffe4e4; border: 1px solid #f66; padding: 7px -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:32:08 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:32:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Back_out_accidentally_push?= =?utf-8?q?ed_changeset_b51218966201=2E?= Message-ID: <3cyF3D4yJSzShM@mail.python.org> http://hg.python.org/cpython/rev/614597994b7c changeset: 86285:614597994b7c user: Georg Brandl date: Sun Oct 13 09:32:59 2013 +0200 summary: Back out accidentally pushed changeset b51218966201. files: Doc/library/re.rst | 28 ------- Lib/re.py | 28 ++---- Lib/test/test_re.py | 24 ------ Modules/_sre.c | 120 +++++++++---------------------- Modules/sre.h | 1 - 5 files changed, 45 insertions(+), 156 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -584,16 +584,6 @@ instead (see also :ref:`search-vs-match`). -.. function:: fullmatch(pattern, string, flags=0) - - If the whole *string* matches the regular expression *pattern*, return a - corresponding :ref:`match object `. Return ``None`` if the - string does not match the pattern; note that this is different from a - zero-length match. - - .. versionadded:: 3.4 - - .. function:: split(pattern, string, maxsplit=0, flags=0) Split *string* by the occurrences of *pattern*. If capturing parentheses are @@ -788,24 +778,6 @@ :meth:`~regex.search` instead (see also :ref:`search-vs-match`). -.. method:: regex.fullmatch(string[, pos[, endpos]]) - - If the whole *string* matches this regular expression, return a corresponding - :ref:`match object `. Return ``None`` if the string does not - match the pattern; note that this is different from a zero-length match. - - The optional *pos* and *endpos* parameters have the same meaning as for the - :meth:`~regex.search` method. - - >>> pattern = re.compile("o[gh]") - >>> pattern.fullmatch("dog") # No match as "o" is not at the start of "dog". - >>> pattern.fullmatch("ogre") # No match as not the full string matches. - >>> pattern.fullmatch("doggie", 1, 3) # Matches within given limits. - <_sre.SRE_Match object at ...> - - .. versionadded:: 3.4 - - .. method:: regex.split(string, maxsplit=0) Identical to the :func:`split` function, using the compiled pattern. diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -85,17 +85,16 @@ \\ Matches a literal backslash. This module exports the following functions: - match Match a regular expression pattern to the beginning of a string. - fullmatch Match a regular expression pattern to all of a string. - search Search a string for the presence of a pattern. - sub Substitute occurrences of a pattern found in a string. - subn Same as sub, but also return the number of substitutions made. - split Split a string by the occurrences of a pattern. - findall Find all occurrences of a pattern in a string. - finditer Return an iterator yielding a match object for each match. - compile Compile a pattern into a RegexObject. - purge Clear the regular expression cache. - escape Backslash all non-alphanumerics in a string. + match Match a regular expression pattern to the beginning of a string. + search Search a string for the presence of a pattern. + sub Substitute occurrences of a pattern found in a string. + subn Same as sub, but also return the number of substitutions made. + split Split a string by the occurrences of a pattern. + findall Find all occurrences of a pattern in a string. + finditer Return an iterator yielding a match object for each match. + compile Compile a pattern into a RegexObject. + purge Clear the regular expression cache. + escape Backslash all non-alphanumerics in a string. Some of the functions in this module takes flags as optional parameters: A ASCII For string patterns, make \w, \W, \b, \B, \d, \D @@ -124,7 +123,7 @@ import sre_parse # public symbols -__all__ = [ "match", "fullmatch", "search", "sub", "subn", "split", "findall", +__all__ = [ "match", "search", "sub", "subn", "split", "findall", "compile", "purge", "template", "escape", "A", "I", "L", "M", "S", "X", "U", "ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", "UNICODE", "error" ] @@ -155,11 +154,6 @@ a match object, or None if no match was found.""" return _compile(pattern, flags).match(string) -def fullmatch(pattern, string, flags=0): - """Try to apply the pattern to all of the string, returning - a match object, or None if no match was found.""" - return _compile(pattern, flags).fullmatch(string) - def search(pattern, string, flags=0): """Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.""" diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1061,30 +1061,6 @@ self.assertEqual(m.group(1), "") self.assertEqual(m.group(2), "y") - def test_fullmatch(self): - # Issue 16203: Proposal: add re.fullmatch() method. - self.assertEqual(re.fullmatch(r"a", "a").span(), (0, 1)) - self.assertEqual(re.fullmatch(r"a|ab", "ab").span(), (0, 2)) - self.assertEqual(re.fullmatch(r".*?$", "abc").span(), (0, 3)) - self.assertEqual(re.fullmatch(r".*?", "abc").span(), (0, 3)) - self.assertEqual(re.fullmatch(r"a.*?b", "ab").span(), (0, 2)) - self.assertEqual(re.fullmatch(r"a.*?b", "abb").span(), (0, 3)) - self.assertEqual(re.fullmatch(r"a.*?b", "axxb").span(), (0, 4)) - self.assertEqual(re.fullmatch(r"abc$", "abc\n"), None) - self.assertEqual(re.fullmatch(r"abc\Z", "abc\n"), None) - self.assertEqual(re.fullmatch(r"(?m)abc$", "abc\n"), None) - self.assertEqual(re.fullmatch(r"ab(?=c)cd", "abcd").span(), (0, 4)) - self.assertEqual(re.fullmatch(r"ab(?<=b)cd", "abcd").span(), (0, 4)) - self.assertEqual(re.fullmatch(r"(?=a|ab)ab", "ab").span(), (0, 2)) - - self.assertEqual( - re.compile(r"bc").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) - self.assertEqual( - re.compile(r".*?$").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) - self.assertEqual( - re.compile(r".*?").fullmatch("abcd", pos=1, endpos=3).span(), (1, 3)) - - def run_re_tests(): from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR if verbose: diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -4,25 +4,24 @@ * regular expression matching engine * * partial history: - * 1999-10-24 fl created (based on existing template matcher code) - * 2000-03-06 fl first alpha, sort of - * 2000-08-01 fl fixes for 1.6b1 - * 2000-08-07 fl use PyOS_CheckStack() if available - * 2000-09-20 fl added expand method - * 2001-03-20 fl lots of fixes for 2.1b2 - * 2001-04-15 fl export copyright as Python attribute, not global - * 2001-04-28 fl added __copy__ methods (work in progress) - * 2001-05-14 fl fixes for 1.5.2 compatibility - * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) - * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) - * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 - * 2001-10-21 fl added sub/subn primitive - * 2001-10-24 fl added finditer primitive (for 2.2 only) - * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) - * 2002-11-09 fl fixed empty sub/subn return type - * 2003-04-18 mvl fully support 4-byte codes - * 2003-10-17 gn implemented non recursive scheme - * 2013-02-04 mrab added fullmatch primitive + * 1999-10-24 fl created (based on existing template matcher code) + * 2000-03-06 fl first alpha, sort of + * 2000-08-01 fl fixes for 1.6b1 + * 2000-08-07 fl use PyOS_CheckStack() if available + * 2000-09-20 fl added expand method + * 2001-03-20 fl lots of fixes for 2.1b2 + * 2001-04-15 fl export copyright as Python attribute, not global + * 2001-04-28 fl added __copy__ methods (work in progress) + * 2001-05-14 fl fixes for 1.5.2 compatibility + * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) + * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) + * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 + * 2001-10-21 fl added sub/subn primitive + * 2001-10-24 fl added finditer primitive (for 2.2 only) + * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) + * 2002-11-09 fl fixed empty sub/subn return type + * 2003-04-18 mvl fully support 4-byte codes + * 2003-10-17 gn implemented non recursive scheme * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * @@ -747,12 +746,11 @@ #define JUMP_ASSERT 12 #define JUMP_ASSERT_NOT 13 -#define DO_JUMP(jumpvalue, jumplabel, nextpattern, matchall) \ +#define DO_JUMP(jumpvalue, jumplabel, nextpattern) \ DATA_ALLOC(SRE_MATCH_CONTEXT, nextctx); \ nextctx->last_ctx_pos = ctx_pos; \ nextctx->jump = jumpvalue; \ nextctx->pattern = nextpattern; \ - nextctx->match_all = matchall; \ ctx_pos = alloc_pos; \ ctx = nextctx; \ goto entrance; \ @@ -771,7 +769,6 @@ SRE_CODE chr; SRE_REPEAT* rep; } u; - int match_all; } SRE_MATCH_CONTEXT; /* check if string matches the given pattern. returns <0 for @@ -794,7 +791,6 @@ ctx->last_ctx_pos = -1; ctx->jump = JUMP_NONE; ctx->pattern = pattern; - ctx->match_all = state->match_all; ctx_pos = alloc_pos; entrance: @@ -868,8 +864,6 @@ case SRE_OP_SUCCESS: /* end of pattern */ TRACE(("|%p|%p|SUCCESS\n", ctx->pattern, ctx->ptr)); - if (ctx->match_all && ctx->ptr != state->end) - RETURN_FAILURE; state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -978,7 +972,7 @@ !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0)))) continue; state->ptr = ctx->ptr; - DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1, ctx->match_all); + DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1); if (ret) { if (ctx->u.rep) MARK_POP_DISCARD(ctx->lastmark); @@ -1025,8 +1019,7 @@ if (ctx->count < (Py_ssize_t) ctx->pattern[1]) RETURN_FAILURE; - if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS && - (!ctx->match_all || ctx->ptr == state->end)) { + if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { /* tail is empty. we're finished */ state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -1049,7 +1042,7 @@ break; state->ptr = ctx->ptr; DO_JUMP(JUMP_REPEAT_ONE_1, jump_repeat_one_1, - ctx->pattern+ctx->pattern[0], ctx->match_all); + ctx->pattern+ctx->pattern[0]); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1066,7 +1059,7 @@ while (ctx->count >= (Py_ssize_t) ctx->pattern[1]) { state->ptr = ctx->ptr; DO_JUMP(JUMP_REPEAT_ONE_2, jump_repeat_one_2, - ctx->pattern+ctx->pattern[0], ctx->match_all); + ctx->pattern+ctx->pattern[0]); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1111,8 +1104,7 @@ ctx->ptr += state->charsize * ctx->count; } - if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS && - (!ctx->match_all || ctx->ptr == state->end)) { + if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { /* tail is empty. we're finished */ state->ptr = ctx->ptr; RETURN_SUCCESS; @@ -1124,7 +1116,7 @@ || ctx->count <= (Py_ssize_t)ctx->pattern[2]) { state->ptr = ctx->ptr; DO_JUMP(JUMP_MIN_REPEAT_ONE,jump_min_repeat_one, - ctx->pattern+ctx->pattern[0], ctx->match_all); + ctx->pattern+ctx->pattern[0]); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1163,7 +1155,7 @@ state->repeat = ctx->u.rep; state->ptr = ctx->ptr; - DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0], ctx->match_all); + DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]); state->repeat = ctx->u.rep->prev; PyObject_FREE(ctx->u.rep); @@ -1195,7 +1187,7 @@ /* not enough matches */ ctx->u.rep->count = ctx->count; DO_JUMP(JUMP_MAX_UNTIL_1, jump_max_until_1, - ctx->u.rep->pattern+3, ctx->match_all); + ctx->u.rep->pattern+3); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1217,7 +1209,7 @@ DATA_PUSH(&ctx->u.rep->last_ptr); ctx->u.rep->last_ptr = state->ptr; DO_JUMP(JUMP_MAX_UNTIL_2, jump_max_until_2, - ctx->u.rep->pattern+3, ctx->match_all); + ctx->u.rep->pattern+3); DATA_POP(&ctx->u.rep->last_ptr); if (ret) { MARK_POP_DISCARD(ctx->lastmark); @@ -1233,7 +1225,7 @@ /* cannot match more repeated items here. make sure the tail matches */ state->repeat = ctx->u.rep->prev; - DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern, ctx->match_all); + DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern); RETURN_ON_SUCCESS(ret); state->repeat = ctx->u.rep; state->ptr = ctx->ptr; @@ -1258,7 +1250,7 @@ /* not enough matches */ ctx->u.rep->count = ctx->count; DO_JUMP(JUMP_MIN_UNTIL_1, jump_min_until_1, - ctx->u.rep->pattern+3, ctx->match_all); + ctx->u.rep->pattern+3); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1272,7 +1264,7 @@ /* see if the tail matches */ state->repeat = ctx->u.rep->prev; - DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern, ctx->match_all); + DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern); if (ret) { RETURN_ON_ERROR(ret); RETURN_SUCCESS; @@ -1293,7 +1285,7 @@ DATA_PUSH(&ctx->u.rep->last_ptr); ctx->u.rep->last_ptr = state->ptr; DO_JUMP(JUMP_MIN_UNTIL_3,jump_min_until_3, - ctx->u.rep->pattern+3, ctx->match_all); + ctx->u.rep->pattern+3); DATA_POP(&ctx->u.rep->last_ptr); if (ret) { RETURN_ON_ERROR(ret); @@ -1386,7 +1378,7 @@ state->ptr = ctx->ptr - state->charsize * ctx->pattern[1]; if (state->ptr < state->beginning) RETURN_FAILURE; - DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2, 0); + DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2); RETURN_ON_FAILURE(ret); ctx->pattern += ctx->pattern[0]; break; @@ -1398,7 +1390,7 @@ ctx->ptr, ctx->pattern[1])); state->ptr = ctx->ptr - state->charsize * ctx->pattern[1]; if (state->ptr >= state->beginning) { - DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2, 0); + DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2); if (ret) { RETURN_ON_ERROR(ret); RETURN_FAILURE; @@ -1918,44 +1910,6 @@ } static PyObject* -pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kw) -{ - SRE_STATE state; - Py_ssize_t status; - - PyObject* string; - Py_ssize_t start = 0; - Py_ssize_t end = PY_SSIZE_T_MAX; - static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:fullmatch", kwlist, - &string, &start, &end)) - return NULL; - - string = state_init(&state, self, string, start, end); - if (!string) - return NULL; - - state.match_all = 1; - state.ptr = state.start; - - TRACE(("|%p|%p|FULLMATCH\n", PatternObject_GetCode(self), state.ptr)); - - if (state.logical_charsize == 1) { - status = sre_match(&state, PatternObject_GetCode(self)); - } else { - status = sre_umatch(&state, PatternObject_GetCode(self)); - } - - TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); - if (PyErr_Occurred()) - return NULL; - - state_fini(&state); - - return pattern_new_match(self, &state, status); -} - -static PyObject* pattern_search(PatternObject* self, PyObject* args, PyObject* kw) { SRE_STATE state; @@ -2576,10 +2530,6 @@ "match(string[, pos[, endpos]]) -> match object or None.\n\ Matches zero or more characters at the beginning of the string"); -PyDoc_STRVAR(pattern_fullmatch_doc, -"fullmatch(string[, pos[, endpos]]) -> match object or None.\n\ - Matches against all of the string"); - PyDoc_STRVAR(pattern_search_doc, "search(string[, pos[, endpos]]) -> match object or None.\n\ Scan through string looking for a match, and return a corresponding\n\ @@ -2615,8 +2565,6 @@ static PyMethodDef pattern_methods[] = { {"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS, pattern_match_doc}, - {"fullmatch", (PyCFunction) pattern_fullmatch, METH_VARARGS|METH_KEYWORDS, - pattern_fullmatch_doc}, {"search", (PyCFunction) pattern_search, METH_VARARGS|METH_KEYWORDS, pattern_search_doc}, {"sub", (PyCFunction) pattern_sub, METH_VARARGS|METH_KEYWORDS, diff --git a/Modules/sre.h b/Modules/sre.h --- a/Modules/sre.h +++ b/Modules/sre.h @@ -89,7 +89,6 @@ SRE_REPEAT *repeat; /* hooks */ SRE_TOLOWER_HOOK lower; - int match_all; } SRE_STATE; typedef struct { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:46:32 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:46:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_display_of?= =?utf-8?q?_deprecated_blocks_with_Sphinx_1=2E2=2E?= Message-ID: <3cyFMr1fbdz7LjY@mail.python.org> http://hg.python.org/cpython/rev/3e2525d640d5 changeset: 86286:3e2525d640d5 branch: 2.7 parent: 86265:1e03fd72e116 user: Georg Brandl date: Sun Oct 13 09:31:42 2013 +0200 summary: Fix display of deprecated blocks with Sphinx 1.2. files: Doc/tools/sphinxext/static/basic.css | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -334,7 +334,7 @@ font-style: italic; } -p.deprecated { +.deprecated { background-color: #ffe4e4; border: 1px solid #f66; padding: 7px -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:55:34 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:55:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_a_small_CS?= =?utf-8?q?S_glitch_with_deprecated_blocks_and_Sphinx_1=2E2=2E?= Message-ID: <3cyFZG4Ggkz7LjY@mail.python.org> http://hg.python.org/cpython/rev/c86c6d215ab6 changeset: 86287:c86c6d215ab6 branch: 3.3 parent: 86283:5257cc2425be user: Georg Brandl date: Sun Oct 13 09:56:20 2013 +0200 summary: Fix a small CSS glitch with deprecated blocks and Sphinx 1.2. files: Doc/tools/sphinxext/static/basic.css | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -337,7 +337,11 @@ .deprecated, .deprecated-removed { background-color: #ffe4e4; border: 1px solid #f66; - padding: 7px + padding: 7px; +} + +div.deprecated p { + margin-bottom: 0; } .system-message { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:55:35 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:55:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyFZH659pz7LjY@mail.python.org> http://hg.python.org/cpython/rev/c9aefabc63b2 changeset: 86288:c9aefabc63b2 parent: 86285:614597994b7c parent: 86287:c86c6d215ab6 user: Georg Brandl date: Sun Oct 13 09:56:24 2013 +0200 summary: merge with 3.3 files: Doc/tools/sphinxext/static/basic.css | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -337,7 +337,11 @@ .deprecated, .deprecated-removed { background-color: #ffe4e4; border: 1px solid #f66; - padding: 7px + padding: 7px; +} + +div.deprecated p { + margin-bottom: 0; } .system-message { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 09:55:39 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 09:55:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_a_small_CS?= =?utf-8?q?S_glitch_with_deprecated_blocks_and_Sphinx_1=2E2=2E?= Message-ID: <3cyFZM0qgbz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/1b311be91096 changeset: 86289:1b311be91096 branch: 2.7 parent: 86286:3e2525d640d5 user: Georg Brandl date: Sun Oct 13 09:56:20 2013 +0200 summary: Fix a small CSS glitch with deprecated blocks and Sphinx 1.2. files: Doc/tools/sphinxext/static/basic.css | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -337,7 +337,11 @@ .deprecated { background-color: #ffe4e4; border: 1px solid #f66; - padding: 7px + padding: 7px; +} + +div.deprecated p { + margin-bottom: 0; } .system-message { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:06:54 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:06:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNDQ4?= =?utf-8?q?6=3A_add_versionchanged_notices_throughout_the_threading_docs_f?= =?utf-8?q?or?= Message-ID: <3cyFqL2vpjz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/81c28c415718 changeset: 86290:81c28c415718 branch: 2.7 user: Georg Brandl date: Sun Oct 13 10:07:31 2013 +0200 summary: Closes #14486: add versionchanged notices throughout the threading docs for PEP8-compliant APIs; the note at the top of the page is too hard to notice. files: Doc/library/threading.rst | 36 +++++++++++++++++++------- 1 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -48,6 +48,9 @@ Return the number of :class:`Thread` objects currently alive. The returned count is equal to the length of the list returned by :func:`.enumerate`. + .. versionchanged:: 2.6 + Added ``active_count()`` spelling. + .. function:: Condition() :noindex: @@ -67,6 +70,9 @@ :mod:`threading` module, a dummy thread object with limited functionality is returned. + .. versionchanged:: 2.6 + Added ``current_thread()`` spelling. + .. function:: enumerate() @@ -328,17 +334,19 @@ :meth:`join` a thread before it has been started and attempts to do so raises the same exception. - .. method:: getName() - setName() - - Old API for :attr:`~Thread.name`. - .. attribute:: name A string used for identification purposes only. It has no semantics. Multiple threads may be given the same name. The initial name is set by the constructor. + .. versionadded:: 2.6 + + .. method:: getName() + setName() + + Pre-2.6 API for :attr:`~Thread.name`. + .. attribute:: ident The 'thread identifier' of this thread or ``None`` if the thread has not @@ -358,10 +366,8 @@ until just after the :meth:`run` method terminates. The module function :func:`.enumerate` returns a list of all alive threads. - .. method:: isDaemon() - setDaemon() - - Old API for :attr:`~Thread.daemon`. + .. versionchanged:: 2.6 + Added ``is_alive()`` spelling. .. attribute:: daemon @@ -374,6 +380,13 @@ The entire Python program exits when no alive non-daemon threads are left. + .. versionadded:: 2.6 + + .. method:: isDaemon() + setDaemon() + + Pre-2.6 API for :attr:`~Thread.daemon`. + .. _lock-objects: @@ -602,6 +615,9 @@ calling thread has not acquired the lock when this method is called, a :exc:`RuntimeError` is raised. + .. versionchanged:: 2.6 + Added ``notify_all()`` spelling. + .. _semaphore-objects: @@ -701,7 +717,7 @@ Return true if and only if the internal flag is true. .. versionchanged:: 2.6 - The ``is_set()`` syntax is new. + Added ``is_set()`` spelling. .. method:: set() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:22:45 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:22:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNTgy?= =?utf-8?q?9=3A_document_ThreadError_and_fix_exception_raised_for_releasin?= =?utf-8?q?g?= Message-ID: <3cyG9d5x7cz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/d7e9c0a6dbcf changeset: 86291:d7e9c0a6dbcf branch: 2.7 user: Georg Brandl date: Sun Oct 13 10:23:27 2013 +0200 summary: Closes #15829: document ThreadError and fix exception raised for releasing unlocked locks. files: Doc/library/threading.rst | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -208,6 +208,13 @@ .. versionadded:: 2.5 + +.. exception:: ThreadError + + Raised for various threading-related errors as described below. Note that + many interfaces use :exc:`RuntimeError` instead of :exc:`ThreadError`. + + Detailed interfaces for the objects are documented below. The design of this module is loosely based on Java's threading model. However, @@ -406,7 +413,7 @@ then the :meth:`acquire` call resets it to locked and returns. The :meth:`release` method should only be called in the locked state; it changes the state to unlocked and returns immediately. If an attempt is made to release an -unlocked lock, a :exc:`RuntimeError` will be raised. +unlocked lock, a :exc:`ThreadError` will be raised. When more than one thread is blocked in :meth:`acquire` waiting for the state to turn to unlocked, only one thread proceeds when a :meth:`release` call resets -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:43:18 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:43:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNzM3?= =?utf-8?q?5=3A_port_new_threading_docstrings_from_2=2E7=2E?= Message-ID: <3cyGdL2q76z7Lk6@mail.python.org> http://hg.python.org/cpython/rev/24429118988b changeset: 86292:24429118988b branch: 3.3 parent: 86287:c86c6d215ab6 user: Georg Brandl date: Sun Oct 13 10:43:59 2013 +0200 summary: Closes #17375: port new threading docstrings from 2.7. files: Lib/threading.py | 414 +++++++++++++++++++++++++++++++--- 1 files changed, 375 insertions(+), 39 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -44,10 +44,22 @@ _trace_hook = None def setprofile(func): + """Set a profile function for all threads started from the threading module. + + The func will be passed to sys.setprofile() for each thread, before its + run() method is called. + + """ global _profile_hook _profile_hook = func def settrace(func): + """Set a trace function for all threads started from the threading module. + + The func will be passed to sys.settrace() for each thread, before its run() + method is called. + + """ global _trace_hook _trace_hook = func @@ -56,11 +68,27 @@ Lock = _allocate_lock def RLock(*args, **kwargs): + """Factory function that returns a new reentrant lock. + + A reentrant lock must be released by the thread that acquired it. Once a + thread has acquired a reentrant lock, the same thread may acquire it again + without blocking; the thread must release it once for each time it has + acquired it. + + """ if _CRLock is None: return _PyRLock(*args, **kwargs) return _CRLock(*args, **kwargs) class _RLock: + """This class implements reentrant lock objects. + + A reentrant lock must be released by the thread that acquired it. Once a + thread has acquired a reentrant lock, the same thread may acquire it + again without blocking; the thread must release it once for each time it + has acquired it. + + """ def __init__(self): self._block = _allocate_lock() @@ -77,6 +105,31 @@ self.__class__.__name__, owner, self._count) def acquire(self, blocking=True, timeout=-1): + """Acquire a lock, blocking or non-blocking. + + When invoked without arguments: if this thread already owns the lock, + increment the recursion level by one, and return immediately. Otherwise, + if another thread owns the lock, block until the lock is unlocked. Once + the lock is unlocked (not owned by any thread), then grab ownership, set + the recursion level to one, and return. If more than one thread is + blocked waiting until the lock is unlocked, only one at a time will be + able to grab ownership of the lock. There is no return value in this + case. + + When invoked with the blocking argument set to true, do the same thing + as when called without arguments, and return true. + + When invoked with the blocking argument set to false, do not block. If a + call without an argument would block, return false immediately; + otherwise, do the same thing as when called without arguments, and + return true. + + When invoked with the floating-point timeout argument set to a positive + value, block for at most the number of seconds specified by timeout + and as long as the lock cannot be acquired. Return true if the lock has + been acquired, false if the timeout has elapsed. + + """ me = get_ident() if self._owner == me: self._count = self._count + 1 @@ -90,6 +143,21 @@ __enter__ = acquire def release(self): + """Release a lock, decrementing the recursion level. + + If after the decrement it is zero, reset the lock to unlocked (not owned + by any thread), and if any other threads are blocked waiting for the + lock to become unlocked, allow exactly one of them to proceed. If after + the decrement the recursion level is still nonzero, the lock remains + locked and owned by the calling thread. + + Only call this method when the calling thread owns the lock. A + RuntimeError is raised if this method is called when the lock is + unlocked. + + There is no return value. + + """ if self._owner != get_ident(): raise RuntimeError("cannot release un-acquired lock") self._count = count = self._count - 1 @@ -123,6 +191,16 @@ class Condition: + """Class that implements a condition variable. + + A condition variable allows one or more threads to wait until they are + notified by another thread. + + If the lock argument is given and not None, it must be a Lock or RLock + object, and it is used as the underlying lock. Otherwise, a new RLock object + is created and used as the underlying lock. + + """ def __init__(self, lock=None): if lock is None: @@ -173,6 +251,28 @@ return True def wait(self, timeout=None): + """Wait until notified or until a timeout occurs. + + If the calling thread has not acquired the lock when this method is + called, a RuntimeError is raised. + + This method releases the underlying lock, and then blocks until it is + awakened by a notify() or notify_all() call for the same condition + variable in another thread, or until the optional timeout occurs. Once + awakened or timed out, it re-acquires the lock and returns. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). + + When the underlying lock is an RLock, it is not released using its + release() method, since this may not actually unlock the lock when it + was acquired multiple times recursively. Instead, an internal interface + of the RLock class is used, which really unlocks it even when it has + been recursively acquired several times. Another internal interface is + then used to restore the recursion level when the lock is reacquired. + + """ if not self._is_owned(): raise RuntimeError("cannot wait on un-acquired lock") waiter = _allocate_lock() @@ -198,6 +298,13 @@ self._acquire_restore(saved_state) def wait_for(self, predicate, timeout=None): + """Wait until a condition evaluates to True. + + predicate should be a callable which result will be interpreted as a + boolean value. A timeout may be provided giving the maximum time to + wait. + + """ endtime = None waittime = timeout result = predicate() @@ -214,6 +321,15 @@ return result def notify(self, n=1): + """Wake up one or more threads waiting on this condition, if any. + + If the calling thread has not acquired the lock when this method is + called, a RuntimeError is raised. + + This method wakes up at most n of the threads waiting for the condition + variable; it is a no-op if no threads are waiting. + + """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") __waiters = self._waiters @@ -228,12 +344,26 @@ pass def notify_all(self): + """Wake up all threads waiting on this condition. + + If the calling thread has not acquired the lock when this method + is called, a RuntimeError is raised. + + """ self.notify(len(self._waiters)) notifyAll = notify_all class Semaphore: + """This class implements semaphore objects. + + Semaphores manage a counter representing the number of release() calls minus + the number of acquire() calls, plus an initial value. The acquire() method + blocks if necessary until it can return without making the counter + negative. If not given, value defaults to 1. + + """ # After Tim Peters' semaphore class, but not quite the same (no maximum) @@ -244,6 +374,29 @@ self._value = value def acquire(self, blocking=True, timeout=None): + """Acquire a semaphore, decrementing the internal counter by one. + + When invoked without arguments: if the internal counter is larger than + zero on entry, decrement it by one and return immediately. If it is zero + on entry, block, waiting until some other thread has called release() to + make it larger than zero. This is done with proper interlocking so that + if multiple acquire() calls are blocked, release() will wake exactly one + of them up. The implementation may pick one at random, so the order in + which blocked threads are awakened should not be relied on. There is no + return value in this case. + + When invoked with blocking set to true, do the same thing as when called + without arguments, and return true. + + When invoked with blocking set to false, do not block. If a call without + an argument would block, return false immediately; otherwise, do the + same thing as when called without arguments, and return true. + + When invoked with a timeout other than None, it will block for at + most timeout seconds. If acquire does not complete successfully in + that interval, return false. Return true otherwise. + + """ if not blocking and timeout is not None: raise ValueError("can't specify timeout for non-blocking acquire") rc = False @@ -268,6 +421,12 @@ __enter__ = acquire def release(self): + """Release a semaphore, incrementing the internal counter by one. + + When the counter is zero on entry and another thread is waiting for it + to become larger than zero again, wake up that thread. + + """ with self._cond: self._value = self._value + 1 self._cond.notify() @@ -277,12 +436,36 @@ class BoundedSemaphore(Semaphore): - """Semaphore that checks that # releases is <= # acquires""" + """Implements a bounded semaphore. + + A bounded semaphore checks to make sure its current value doesn't exceed its + initial value. If it does, ValueError is raised. In most situations + semaphores are used to guard resources with limited capacity. + + If the semaphore is released too many times it's a sign of a bug. If not + given, value defaults to 1. + + Like regular semaphores, bounded semaphores manage a counter representing + the number of release() calls minus the number of acquire() calls, plus an + initial value. The acquire() method blocks if necessary until it can return + without making the counter negative. If not given, value defaults to 1. + + """ + def __init__(self, value=1): Semaphore.__init__(self, value) self._initial_value = value def release(self): + """Release a semaphore, incrementing the internal counter by one. + + When the counter is zero on entry and another thread is waiting for it + to become larger than zero again, wake up that thread. + + If the number of releases exceeds the number of acquires, + raise a ValueError. + + """ with self._cond: if self._value >= self._initial_value: raise ValueError("Semaphore released too many times") @@ -291,6 +474,13 @@ class Event: + """Class implementing event objects. + + Events manage a flag that can be set to true with the set() method and reset + to false with the clear() method. The wait() method blocks until the flag is + true. The flag is initially false. + + """ # After Tim Peters' event class (without is_posted()) @@ -303,11 +493,18 @@ self._cond.__init__() def is_set(self): + """Return true if and only if the internal flag is true.""" return self._flag isSet = is_set def set(self): + """Set the internal flag to true. + + All threads waiting for it to become true are awakened. Threads + that call wait() once the flag is true will not block at all. + + """ self._cond.acquire() try: self._flag = True @@ -316,6 +513,12 @@ self._cond.release() def clear(self): + """Reset the internal flag to false. + + Subsequently, threads calling wait() will block until set() is called to + set the internal flag to true again. + + """ self._cond.acquire() try: self._flag = False @@ -323,6 +526,20 @@ self._cond.release() def wait(self, timeout=None): + """Block until the internal flag is true. + + If the internal flag is true on entry, return immediately. Otherwise, + block until another thread calls set() to set the flag to true, or until + the optional timeout occurs. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). + + This method returns the internal flag on exit, so it will always return + True except if a timeout is given and the operation times out. + + """ self._cond.acquire() try: signaled = self._flag @@ -345,19 +562,22 @@ # similar to 'draining' except that threads leave with a BrokenBarrierError, # and a 'broken' state in which all threads get the exception. class Barrier: + """Implements a Barrier. + + Useful for synchronizing a fixed number of threads at known synchronization + points. Threads block on 'wait()' and are simultaneously once they have all + made that call. + """ - Barrier. Useful for synchronizing a fixed number of threads - at known synchronization points. Threads block on 'wait()' and are - simultaneously once they have all made that call. - """ + def __init__(self, parties, action=None, timeout=None): - """ - Create a barrier, initialised to 'parties' threads. - 'action' is a callable which, when supplied, will be called - by one of the threads after they have all entered the - barrier and just prior to releasing them all. - If a 'timeout' is provided, it is uses as the default for - all subsequent 'wait()' calls. + """Create a barrier, initialised to 'parties' threads. + + 'action' is a callable which, when supplied, will be called by one of + the threads after they have all entered the barrier and just prior to + releasing them all. If a 'timeout' is provided, it is uses as the + default for all subsequent 'wait()' calls. + """ self._cond = Condition(Lock()) self._action = action @@ -367,12 +587,13 @@ self._count = 0 def wait(self, timeout=None): - """ - Wait for the barrier. When the specified number of threads have - started waiting, they are all simultaneously awoken. If an 'action' - was provided for the barrier, one of the threads will have executed - that callback prior to returning. + """Wait for the barrier. + + When the specified number of threads have started waiting, they are all + simultaneously awoken. If an 'action' was provided for the barrier, one + of the threads will have executed that callback prior to returning. Returns an individual index number from 0 to 'parties-1'. + """ if timeout is None: timeout = self._timeout @@ -439,10 +660,11 @@ self._cond.notify_all() def reset(self): - """ - Reset the barrier to the initial state. + """Reset the barrier to the initial state. + Any threads currently waiting will get the BrokenBarrier exception raised. + """ with self._cond: if self._count > 0: @@ -458,11 +680,11 @@ self._cond.notify_all() def abort(self): - """ - Place the barrier into a 'broken' state. - Useful in case of error. Any currently waiting threads and - threads attempting to 'wait()' will have BrokenBarrierError - raised. + """Place the barrier into a 'broken' state. + + Useful in case of error. Any currently waiting threads and threads + attempting to 'wait()' will have BrokenBarrierError raised. + """ with self._cond: self._break() @@ -475,16 +697,12 @@ @property def parties(self): - """ - Return the number of threads required to trip the barrier. - """ + """Return the number of threads required to trip the barrier.""" return self._parties @property def n_waiting(self): - """ - Return the number of threads that are currently waiting at the barrier. - """ + """Return the number of threads currently waiting at the barrier.""" # We don't need synchronization here since this is an ephemeral result # anyway. It returns the correct value in the steady state. if self._state == 0: @@ -493,13 +711,12 @@ @property def broken(self): - """ - Return True if the barrier is in a broken state - """ + """Return True if the barrier is in a broken state.""" return self._state == -2 -#exception raised by the Barrier class -class BrokenBarrierError(RuntimeError): pass +# exception raised by the Barrier class +class BrokenBarrierError(RuntimeError): + pass # Helper to generate new thread names @@ -520,6 +737,13 @@ # Main class for threads class Thread: + """A class that represents a thread of control. + + This class can be safely subclassed in a limited fashion. There are two ways + to specify the activity: by passing a callable object to the constructor, or + by overriding the run() method in a subclass. + + """ __initialized = False # Need to store a reference to sys.exc_info for printing @@ -533,6 +757,27 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): + """This constructor should always be called with keyword arguments. Arguments are: + + *group* should be None; reserved for future extension when a ThreadGroup + class is implemented. + + *target* is the callable object to be invoked by the run() + method. Defaults to None, meaning nothing is called. + + *name* is the thread name. By default, a unique name is constructed of + the form "Thread-N" where N is a small decimal number. + + *args* is the argument tuple for the target invocation. Defaults to (). + + *kwargs* is a dictionary of keyword arguments for the target + invocation. Defaults to {}. + + If a subclass overrides the constructor, it must make sure to invoke + the base class constructor (Thread.__init__()) before doing anything + else to the thread. + + """ assert group is None, "group argument must be None for now" if kwargs is None: kwargs = {} @@ -575,6 +820,15 @@ return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status) def start(self): + """Start the thread's activity. + + It must be called at most once per thread object. It arranges for the + object's run() method to be invoked in a separate thread of control. + + This method will raise a RuntimeError if called more than once on the + same thread object. + + """ if not self._initialized: raise RuntimeError("thread.__init__() not called") @@ -591,6 +845,14 @@ self._started.wait() def run(self): + """Method representing the thread's activity. + + You may override this method in a subclass. The standard run() method + invokes the callable object passed to the object's constructor as the + target argument, if any, with sequential and keyword arguments taken + from the args and kwargs arguments, respectively. + + """ try: if self._target: self._target(*self._args, **self._kwargs) @@ -729,6 +991,29 @@ raise def join(self, timeout=None): + """Wait until the thread terminates. + + This blocks the calling thread until the thread whose join() method is + called terminates -- either normally or through an unhandled exception + or until the optional timeout occurs. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). As join() always returns None, you must call + isAlive() after join() to decide whether a timeout happened -- if the + thread is still alive, the join() call timed out. + + When the timeout argument is not present or None, the operation will + block until the thread terminates. + + A thread can be join()ed many times. + + join() raises a RuntimeError if an attempt is made to join the current + thread as that would cause a deadlock. It is also an error to join() a + thread before it has been started and attempts to do so raises the same + exception. + + """ if not self._initialized: raise RuntimeError("Thread.__init__() not called") if not self._started.is_set(): @@ -753,6 +1038,12 @@ @property def name(self): + """A string used for identification purposes only. + + It has no semantics. Multiple threads may be given the same name. The + initial name is set by the constructor. + + """ assert self._initialized, "Thread.__init__() not called" return self._name @@ -763,10 +1054,24 @@ @property def ident(self): + """Thread identifier of this thread or None if it has not been started. + + This is a nonzero integer. See the thread.get_ident() function. Thread + identifiers may be recycled when a thread exits and another thread is + created. The identifier is available even after the thread has exited. + + """ assert self._initialized, "Thread.__init__() not called" return self._ident def is_alive(self): + """Return whether the thread is alive. + + This method returns True just before the run() method starts until just + after the run() method terminates. The module function enumerate() + returns a list of all alive threads. + + """ assert self._initialized, "Thread.__init__() not called" return self._started.is_set() and not self._stopped @@ -774,6 +1079,17 @@ @property def daemon(self): + """A boolean value indicating whether this thread is a daemon thread. + + This must be set before start() is called, otherwise RuntimeError is + raised. Its initial value is inherited from the creating thread; the + main thread is not a daemon thread and therefore all threads created in + the main thread default to daemon = False. + + The entire Python program exits when no alive non-daemon threads are + left. + + """ assert self._initialized, "Thread.__init__() not called" return self._daemonic @@ -802,9 +1118,10 @@ class Timer(Thread): """Call a function after a specified number of seconds: - t = Timer(30.0, f, args=None, kwargs=None) - t.start() - t.cancel() # stop the timer's action if it's still waiting + t = Timer(30.0, f, args=None, kwargs=None) + t.start() + t.cancel() # stop the timer's action if it's still waiting + """ def __init__(self, interval, function, args=None, kwargs=None): @@ -816,7 +1133,7 @@ self.finished = Event() def cancel(self): - """Stop the timer if it hasn't finished yet""" + """Stop the timer if it hasn't finished yet.""" self.finished.set() def run(self): @@ -885,6 +1202,12 @@ # Global API functions def current_thread(): + """Return the current Thread object, corresponding to the caller's thread of control. + + If the caller's thread of control was not created through the threading + module, a dummy thread object with limited functionality is returned. + + """ try: return _active[get_ident()] except KeyError: @@ -893,6 +1216,12 @@ currentThread = current_thread def active_count(): + """Return the number of Thread objects currently alive. + + The returned count is equal to the length of the list returned by + enumerate(). + + """ with _active_limbo_lock: return len(_active) + len(_limbo) @@ -903,6 +1232,13 @@ return list(_active.values()) + list(_limbo.values()) def enumerate(): + """Return a list of all Thread objects currently alive. + + The list includes daemonic threads, dummy thread objects created by + current_thread(), and the main thread. It excludes terminated threads and + threads that have not yet been started. + + """ with _active_limbo_lock: return list(_active.values()) + list(_limbo.values()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:43:19 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:43:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyGdM6qdFz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/bee6f147813e changeset: 86293:bee6f147813e parent: 86288:c9aefabc63b2 parent: 86292:24429118988b user: Georg Brandl date: Sun Oct 13 10:44:04 2013 +0200 summary: merge with 3.3 files: Lib/threading.py | 414 +++++++++++++++++++++++++++++++--- 1 files changed, 375 insertions(+), 39 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -50,10 +50,22 @@ _trace_hook = None def setprofile(func): + """Set a profile function for all threads started from the threading module. + + The func will be passed to sys.setprofile() for each thread, before its + run() method is called. + + """ global _profile_hook _profile_hook = func def settrace(func): + """Set a trace function for all threads started from the threading module. + + The func will be passed to sys.settrace() for each thread, before its run() + method is called. + + """ global _trace_hook _trace_hook = func @@ -62,11 +74,27 @@ Lock = _allocate_lock def RLock(*args, **kwargs): + """Factory function that returns a new reentrant lock. + + A reentrant lock must be released by the thread that acquired it. Once a + thread has acquired a reentrant lock, the same thread may acquire it again + without blocking; the thread must release it once for each time it has + acquired it. + + """ if _CRLock is None: return _PyRLock(*args, **kwargs) return _CRLock(*args, **kwargs) class _RLock: + """This class implements reentrant lock objects. + + A reentrant lock must be released by the thread that acquired it. Once a + thread has acquired a reentrant lock, the same thread may acquire it + again without blocking; the thread must release it once for each time it + has acquired it. + + """ def __init__(self): self._block = _allocate_lock() @@ -83,6 +111,31 @@ self.__class__.__name__, owner, self._count) def acquire(self, blocking=True, timeout=-1): + """Acquire a lock, blocking or non-blocking. + + When invoked without arguments: if this thread already owns the lock, + increment the recursion level by one, and return immediately. Otherwise, + if another thread owns the lock, block until the lock is unlocked. Once + the lock is unlocked (not owned by any thread), then grab ownership, set + the recursion level to one, and return. If more than one thread is + blocked waiting until the lock is unlocked, only one at a time will be + able to grab ownership of the lock. There is no return value in this + case. + + When invoked with the blocking argument set to true, do the same thing + as when called without arguments, and return true. + + When invoked with the blocking argument set to false, do not block. If a + call without an argument would block, return false immediately; + otherwise, do the same thing as when called without arguments, and + return true. + + When invoked with the floating-point timeout argument set to a positive + value, block for at most the number of seconds specified by timeout + and as long as the lock cannot be acquired. Return true if the lock has + been acquired, false if the timeout has elapsed. + + """ me = get_ident() if self._owner == me: self._count += 1 @@ -96,6 +149,21 @@ __enter__ = acquire def release(self): + """Release a lock, decrementing the recursion level. + + If after the decrement it is zero, reset the lock to unlocked (not owned + by any thread), and if any other threads are blocked waiting for the + lock to become unlocked, allow exactly one of them to proceed. If after + the decrement the recursion level is still nonzero, the lock remains + locked and owned by the calling thread. + + Only call this method when the calling thread owns the lock. A + RuntimeError is raised if this method is called when the lock is + unlocked. + + There is no return value. + + """ if self._owner != get_ident(): raise RuntimeError("cannot release un-acquired lock") self._count = count = self._count - 1 @@ -129,6 +197,16 @@ class Condition: + """Class that implements a condition variable. + + A condition variable allows one or more threads to wait until they are + notified by another thread. + + If the lock argument is given and not None, it must be a Lock or RLock + object, and it is used as the underlying lock. Otherwise, a new RLock object + is created and used as the underlying lock. + + """ def __init__(self, lock=None): if lock is None: @@ -179,6 +257,28 @@ return True def wait(self, timeout=None): + """Wait until notified or until a timeout occurs. + + If the calling thread has not acquired the lock when this method is + called, a RuntimeError is raised. + + This method releases the underlying lock, and then blocks until it is + awakened by a notify() or notify_all() call for the same condition + variable in another thread, or until the optional timeout occurs. Once + awakened or timed out, it re-acquires the lock and returns. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). + + When the underlying lock is an RLock, it is not released using its + release() method, since this may not actually unlock the lock when it + was acquired multiple times recursively. Instead, an internal interface + of the RLock class is used, which really unlocks it even when it has + been recursively acquired several times. Another internal interface is + then used to restore the recursion level when the lock is reacquired. + + """ if not self._is_owned(): raise RuntimeError("cannot wait on un-acquired lock") waiter = _allocate_lock() @@ -204,6 +304,13 @@ self._acquire_restore(saved_state) def wait_for(self, predicate, timeout=None): + """Wait until a condition evaluates to True. + + predicate should be a callable which result will be interpreted as a + boolean value. A timeout may be provided giving the maximum time to + wait. + + """ endtime = None waittime = timeout result = predicate() @@ -220,6 +327,15 @@ return result def notify(self, n=1): + """Wake up one or more threads waiting on this condition, if any. + + If the calling thread has not acquired the lock when this method is + called, a RuntimeError is raised. + + This method wakes up at most n of the threads waiting for the condition + variable; it is a no-op if no threads are waiting. + + """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") all_waiters = self._waiters @@ -234,12 +350,26 @@ pass def notify_all(self): + """Wake up all threads waiting on this condition. + + If the calling thread has not acquired the lock when this method + is called, a RuntimeError is raised. + + """ self.notify(len(self._waiters)) notifyAll = notify_all class Semaphore: + """This class implements semaphore objects. + + Semaphores manage a counter representing the number of release() calls minus + the number of acquire() calls, plus an initial value. The acquire() method + blocks if necessary until it can return without making the counter + negative. If not given, value defaults to 1. + + """ # After Tim Peters' semaphore class, but not quite the same (no maximum) @@ -250,6 +380,29 @@ self._value = value def acquire(self, blocking=True, timeout=None): + """Acquire a semaphore, decrementing the internal counter by one. + + When invoked without arguments: if the internal counter is larger than + zero on entry, decrement it by one and return immediately. If it is zero + on entry, block, waiting until some other thread has called release() to + make it larger than zero. This is done with proper interlocking so that + if multiple acquire() calls are blocked, release() will wake exactly one + of them up. The implementation may pick one at random, so the order in + which blocked threads are awakened should not be relied on. There is no + return value in this case. + + When invoked with blocking set to true, do the same thing as when called + without arguments, and return true. + + When invoked with blocking set to false, do not block. If a call without + an argument would block, return false immediately; otherwise, do the + same thing as when called without arguments, and return true. + + When invoked with a timeout other than None, it will block for at + most timeout seconds. If acquire does not complete successfully in + that interval, return false. Return true otherwise. + + """ if not blocking and timeout is not None: raise ValueError("can't specify timeout for non-blocking acquire") rc = False @@ -274,6 +427,12 @@ __enter__ = acquire def release(self): + """Release a semaphore, incrementing the internal counter by one. + + When the counter is zero on entry and another thread is waiting for it + to become larger than zero again, wake up that thread. + + """ with self._cond: self._value += 1 self._cond.notify() @@ -283,12 +442,36 @@ class BoundedSemaphore(Semaphore): - """Semaphore that checks that # releases is <= # acquires""" + """Implements a bounded semaphore. + + A bounded semaphore checks to make sure its current value doesn't exceed its + initial value. If it does, ValueError is raised. In most situations + semaphores are used to guard resources with limited capacity. + + If the semaphore is released too many times it's a sign of a bug. If not + given, value defaults to 1. + + Like regular semaphores, bounded semaphores manage a counter representing + the number of release() calls minus the number of acquire() calls, plus an + initial value. The acquire() method blocks if necessary until it can return + without making the counter negative. If not given, value defaults to 1. + + """ + def __init__(self, value=1): Semaphore.__init__(self, value) self._initial_value = value def release(self): + """Release a semaphore, incrementing the internal counter by one. + + When the counter is zero on entry and another thread is waiting for it + to become larger than zero again, wake up that thread. + + If the number of releases exceeds the number of acquires, + raise a ValueError. + + """ with self._cond: if self._value >= self._initial_value: raise ValueError("Semaphore released too many times") @@ -297,6 +480,13 @@ class Event: + """Class implementing event objects. + + Events manage a flag that can be set to true with the set() method and reset + to false with the clear() method. The wait() method blocks until the flag is + true. The flag is initially false. + + """ # After Tim Peters' event class (without is_posted()) @@ -309,11 +499,18 @@ self._cond.__init__() def is_set(self): + """Return true if and only if the internal flag is true.""" return self._flag isSet = is_set def set(self): + """Set the internal flag to true. + + All threads waiting for it to become true are awakened. Threads + that call wait() once the flag is true will not block at all. + + """ self._cond.acquire() try: self._flag = True @@ -322,6 +519,12 @@ self._cond.release() def clear(self): + """Reset the internal flag to false. + + Subsequently, threads calling wait() will block until set() is called to + set the internal flag to true again. + + """ self._cond.acquire() try: self._flag = False @@ -329,6 +532,20 @@ self._cond.release() def wait(self, timeout=None): + """Block until the internal flag is true. + + If the internal flag is true on entry, return immediately. Otherwise, + block until another thread calls set() to set the flag to true, or until + the optional timeout occurs. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). + + This method returns the internal flag on exit, so it will always return + True except if a timeout is given and the operation times out. + + """ self._cond.acquire() try: signaled = self._flag @@ -351,19 +568,22 @@ # similar to 'draining' except that threads leave with a BrokenBarrierError, # and a 'broken' state in which all threads get the exception. class Barrier: + """Implements a Barrier. + + Useful for synchronizing a fixed number of threads at known synchronization + points. Threads block on 'wait()' and are simultaneously once they have all + made that call. + """ - Barrier. Useful for synchronizing a fixed number of threads - at known synchronization points. Threads block on 'wait()' and are - simultaneously once they have all made that call. - """ + def __init__(self, parties, action=None, timeout=None): - """ - Create a barrier, initialised to 'parties' threads. - 'action' is a callable which, when supplied, will be called - by one of the threads after they have all entered the - barrier and just prior to releasing them all. - If a 'timeout' is provided, it is uses as the default for - all subsequent 'wait()' calls. + """Create a barrier, initialised to 'parties' threads. + + 'action' is a callable which, when supplied, will be called by one of + the threads after they have all entered the barrier and just prior to + releasing them all. If a 'timeout' is provided, it is uses as the + default for all subsequent 'wait()' calls. + """ self._cond = Condition(Lock()) self._action = action @@ -373,12 +593,13 @@ self._count = 0 def wait(self, timeout=None): - """ - Wait for the barrier. When the specified number of threads have - started waiting, they are all simultaneously awoken. If an 'action' - was provided for the barrier, one of the threads will have executed - that callback prior to returning. + """Wait for the barrier. + + When the specified number of threads have started waiting, they are all + simultaneously awoken. If an 'action' was provided for the barrier, one + of the threads will have executed that callback prior to returning. Returns an individual index number from 0 to 'parties-1'. + """ if timeout is None: timeout = self._timeout @@ -445,10 +666,11 @@ self._cond.notify_all() def reset(self): - """ - Reset the barrier to the initial state. + """Reset the barrier to the initial state. + Any threads currently waiting will get the BrokenBarrier exception raised. + """ with self._cond: if self._count > 0: @@ -464,11 +686,11 @@ self._cond.notify_all() def abort(self): - """ - Place the barrier into a 'broken' state. - Useful in case of error. Any currently waiting threads and - threads attempting to 'wait()' will have BrokenBarrierError - raised. + """Place the barrier into a 'broken' state. + + Useful in case of error. Any currently waiting threads and threads + attempting to 'wait()' will have BrokenBarrierError raised. + """ with self._cond: self._break() @@ -481,16 +703,12 @@ @property def parties(self): - """ - Return the number of threads required to trip the barrier. - """ + """Return the number of threads required to trip the barrier.""" return self._parties @property def n_waiting(self): - """ - Return the number of threads that are currently waiting at the barrier. - """ + """Return the number of threads currently waiting at the barrier.""" # We don't need synchronization here since this is an ephemeral result # anyway. It returns the correct value in the steady state. if self._state == 0: @@ -499,13 +717,12 @@ @property def broken(self): - """ - Return True if the barrier is in a broken state - """ + """Return True if the barrier is in a broken state.""" return self._state == -2 -#exception raised by the Barrier class -class BrokenBarrierError(RuntimeError): pass +# exception raised by the Barrier class +class BrokenBarrierError(RuntimeError): + pass # Helper to generate new thread names @@ -524,6 +741,13 @@ # Main class for threads class Thread: + """A class that represents a thread of control. + + This class can be safely subclassed in a limited fashion. There are two ways + to specify the activity: by passing a callable object to the constructor, or + by overriding the run() method in a subclass. + + """ __initialized = False # Need to store a reference to sys.exc_info for printing @@ -537,6 +761,27 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): + """This constructor should always be called with keyword arguments. Arguments are: + + *group* should be None; reserved for future extension when a ThreadGroup + class is implemented. + + *target* is the callable object to be invoked by the run() + method. Defaults to None, meaning nothing is called. + + *name* is the thread name. By default, a unique name is constructed of + the form "Thread-N" where N is a small decimal number. + + *args* is the argument tuple for the target invocation. Defaults to (). + + *kwargs* is a dictionary of keyword arguments for the target + invocation. Defaults to {}. + + If a subclass overrides the constructor, it must make sure to invoke + the base class constructor (Thread.__init__()) before doing anything + else to the thread. + + """ assert group is None, "group argument must be None for now" if kwargs is None: kwargs = {} @@ -586,6 +831,15 @@ return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status) def start(self): + """Start the thread's activity. + + It must be called at most once per thread object. It arranges for the + object's run() method to be invoked in a separate thread of control. + + This method will raise a RuntimeError if called more than once on the + same thread object. + + """ if not self._initialized: raise RuntimeError("thread.__init__() not called") @@ -602,6 +856,14 @@ self._started.wait() def run(self): + """Method representing the thread's activity. + + You may override this method in a subclass. The standard run() method + invokes the callable object passed to the object's constructor as the + target argument, if any, with sequential and keyword arguments taken + from the args and kwargs arguments, respectively. + + """ try: if self._target: self._target(*self._args, **self._kwargs) @@ -765,6 +1027,29 @@ raise def join(self, timeout=None): + """Wait until the thread terminates. + + This blocks the calling thread until the thread whose join() method is + called terminates -- either normally or through an unhandled exception + or until the optional timeout occurs. + + When the timeout argument is present and not None, it should be a + floating point number specifying a timeout for the operation in seconds + (or fractions thereof). As join() always returns None, you must call + isAlive() after join() to decide whether a timeout happened -- if the + thread is still alive, the join() call timed out. + + When the timeout argument is not present or None, the operation will + block until the thread terminates. + + A thread can be join()ed many times. + + join() raises a RuntimeError if an attempt is made to join the current + thread as that would cause a deadlock. It is also an error to join() a + thread before it has been started and attempts to do so raises the same + exception. + + """ if not self._initialized: raise RuntimeError("Thread.__init__() not called") if not self._started.is_set(): @@ -792,6 +1077,12 @@ @property def name(self): + """A string used for identification purposes only. + + It has no semantics. Multiple threads may be given the same name. The + initial name is set by the constructor. + + """ assert self._initialized, "Thread.__init__() not called" return self._name @@ -802,10 +1093,24 @@ @property def ident(self): + """Thread identifier of this thread or None if it has not been started. + + This is a nonzero integer. See the thread.get_ident() function. Thread + identifiers may be recycled when a thread exits and another thread is + created. The identifier is available even after the thread has exited. + + """ assert self._initialized, "Thread.__init__() not called" return self._ident def is_alive(self): + """Return whether the thread is alive. + + This method returns True just before the run() method starts until just + after the run() method terminates. The module function enumerate() + returns a list of all alive threads. + + """ assert self._initialized, "Thread.__init__() not called" if self._is_stopped or not self._started.is_set(): return False @@ -816,6 +1121,17 @@ @property def daemon(self): + """A boolean value indicating whether this thread is a daemon thread. + + This must be set before start() is called, otherwise RuntimeError is + raised. Its initial value is inherited from the creating thread; the + main thread is not a daemon thread and therefore all threads created in + the main thread default to daemon = False. + + The entire Python program exits when no alive non-daemon threads are + left. + + """ assert self._initialized, "Thread.__init__() not called" return self._daemonic @@ -844,9 +1160,10 @@ class Timer(Thread): """Call a function after a specified number of seconds: - t = Timer(30.0, f, args=None, kwargs=None) - t.start() - t.cancel() # stop the timer's action if it's still waiting + t = Timer(30.0, f, args=None, kwargs=None) + t.start() + t.cancel() # stop the timer's action if it's still waiting + """ def __init__(self, interval, function, args=None, kwargs=None): @@ -858,7 +1175,7 @@ self.finished = Event() def cancel(self): - """Stop the timer if it hasn't finished yet""" + """Stop the timer if it hasn't finished yet.""" self.finished.set() def run(self): @@ -909,6 +1226,12 @@ # Global API functions def current_thread(): + """Return the current Thread object, corresponding to the caller's thread of control. + + If the caller's thread of control was not created through the threading + module, a dummy thread object with limited functionality is returned. + + """ try: return _active[get_ident()] except KeyError: @@ -917,6 +1240,12 @@ currentThread = current_thread def active_count(): + """Return the number of Thread objects currently alive. + + The returned count is equal to the length of the list returned by + enumerate(). + + """ with _active_limbo_lock: return len(_active) + len(_limbo) @@ -927,6 +1256,13 @@ return list(_active.values()) + list(_limbo.values()) def enumerate(): + """Return a list of all Thread objects currently alive. + + The list includes daemonic threads, dummy thread objects created by + current_thread(), and the main thread. It excludes terminated threads and + threads that have not yet been started. + + """ with _active_limbo_lock: return list(_active.values()) + list(_limbo.values()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:48:59 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:48:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxMzc0?= =?utf-8?q?0=3A_SND=5FNOWAIT_seems_to_be_ignored_on_modern_Windows=2E?= Message-ID: <3cyGlv5n4Nz7LjY@mail.python.org> http://hg.python.org/cpython/rev/e08dea96b6e2 changeset: 86294:e08dea96b6e2 branch: 3.3 parent: 86292:24429118988b user: Georg Brandl date: Sun Oct 13 10:49:41 2013 +0200 summary: Closes #13740: SND_NOWAIT seems to be ignored on modern Windows. files: Doc/library/winsound.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Doc/library/winsound.rst b/Doc/library/winsound.rst --- a/Doc/library/winsound.rst +++ b/Doc/library/winsound.rst @@ -126,6 +126,10 @@ Return immediately if the sound driver is busy. + .. note:: + + This flag is not supported on modern Windows platforms. + .. data:: MB_ICONASTERISK -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:49:01 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:49:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyGlx0SG6z7Ljb@mail.python.org> http://hg.python.org/cpython/rev/f2d92da0f28a changeset: 86295:f2d92da0f28a parent: 86293:bee6f147813e parent: 86294:e08dea96b6e2 user: Georg Brandl date: Sun Oct 13 10:49:47 2013 +0200 summary: merge with 3.3 files: Doc/library/winsound.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Doc/library/winsound.rst b/Doc/library/winsound.rst --- a/Doc/library/winsound.rst +++ b/Doc/library/winsound.rst @@ -126,6 +126,10 @@ Return immediately if the sound driver is busy. + .. note:: + + This flag is not supported on modern Windows platforms. + .. data:: MB_ICONASTERISK -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 10:49:10 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 10:49:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxMzc0?= =?utf-8?q?0=3A_SND=5FNOWAIT_seems_to_be_ignored_on_modern_Windows=2E?= Message-ID: <3cyGm63tNTz7LkF@mail.python.org> http://hg.python.org/cpython/rev/3c8feb068694 changeset: 86296:3c8feb068694 branch: 2.7 parent: 86291:d7e9c0a6dbcf user: Georg Brandl date: Sun Oct 13 10:49:41 2013 +0200 summary: Closes #13740: SND_NOWAIT seems to be ignored on modern Windows. files: Doc/library/winsound.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Doc/library/winsound.rst b/Doc/library/winsound.rst --- a/Doc/library/winsound.rst +++ b/Doc/library/winsound.rst @@ -133,6 +133,10 @@ Return immediately if the sound driver is busy. + .. note:: + + This flag is not supported on modern Windows platforms. + .. data:: MB_ICONASTERISK -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 11:55:34 2013 From: python-checkins at python.org (mark.dickinson) Date: Sun, 13 Oct 2013 11:55:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NzM5?= =?utf-8?q?=3A_Fix_inconsistent_results_from_math=2Elog=28n=29_and_math=2E?= =?utf-8?b?bG9nKGxvbmcobikp?= Message-ID: <3cyJDk6zhgz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/f543863f4e43 changeset: 86297:f543863f4e43 branch: 2.7 user: Mark Dickinson date: Sun Oct 13 10:55:15 2013 +0100 summary: Issue #18739: Fix inconsistent results from math.log(n) and math.log(long(n)) files: Lib/test/test_math.py | 6 +++++ Misc/NEWS | 3 ++ Modules/mathmodule.c | 34 ++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -599,6 +599,9 @@ self.assertEqual(math.log(INF), INF) self.assertRaises(ValueError, math.log, NINF) self.assertTrue(math.isnan(math.log(NAN))) + # Log values should match for int and long (issue #18739). + for n in range(1, 1000): + self.assertEqual(math.log(n), math.log(long(n))) def testLog1p(self): self.assertRaises(TypeError, math.log1p) @@ -621,6 +624,9 @@ self.assertEqual(math.log(INF), INF) self.assertRaises(ValueError, math.log10, NINF) self.assertTrue(math.isnan(math.log10(NAN))) + # Log values should match for int and long (issue #18739). + for n in range(1, 1000): + self.assertEqual(math.log10(n), math.log10(long(n))) def testModf(self): self.assertRaises(TypeError, math.modf) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #18739: Fix an inconsistency between math.log(n) and math.log(long(n)); + the results could be off from one another by a ulp or two. + - Issue #13461: Fix a crash in the "replace" error handler on 64-bit platforms. Patch by Yogesh Chaudhari. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1277,23 +1277,33 @@ { /* If it is long, do it ourselves. */ if (PyLong_Check(arg)) { - double x; + double x, result; Py_ssize_t e; - x = _PyLong_Frexp((PyLongObject *)arg, &e); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - if (x <= 0.0) { + + /* Negative or zero inputs give a ValueError. */ + if (Py_SIZE(arg) <= 0) { PyErr_SetString(PyExc_ValueError, "math domain error"); return NULL; } - /* Special case for log(1), to make sure we get an - exact result there. */ - if (e == 1 && x == 0.5) - return PyFloat_FromDouble(0.0); - /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */ - x = func(x) + func(2.0) * e; - return PyFloat_FromDouble(x); + + x = PyLong_AsDouble(arg); + if (x == -1.0 && PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + /* Here the conversion to double overflowed, but it's possible + to compute the log anyway. Clear the exception and continue. */ + PyErr_Clear(); + x = _PyLong_Frexp((PyLongObject *)arg, &e); + if (x == -1.0 && PyErr_Occurred()) + return NULL; + /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */ + result = func(x) + func(2.0) * e; + } + else + /* Successfully converted x to a double. */ + result = func(x); + return PyFloat_FromDouble(result); } /* Else let libm handle it by itself. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 12:04:56 2013 From: python-checkins at python.org (mark.dickinson) Date: Sun, 13 Oct 2013 12:04:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318659=3A_fix_test?= =?utf-8?q?=5Fformat_test_that_wasn=27t_being_executed=2E__Thanks_Vajrasky?= Message-ID: <3cyJRX5r4Jz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/e7eed20f2da7 changeset: 86298:e7eed20f2da7 parent: 86295:f2d92da0f28a user: Mark Dickinson date: Sun Oct 13 11:04:36 2013 +0100 summary: Issue #18659: fix test_format test that wasn't being executed. Thanks Vajrasky Kok for the patch. files: Lib/test/test_format.py | 13 +++++-------- 1 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -327,12 +327,9 @@ self.assertIs(text % (), text) self.assertIs(text.format(), text) - -def test_main(): - support.run_unittest(FormatTest) - + @support.cpython_only def test_precision(self): - INT_MAX = 2147483647 + from _testcapi import INT_MAX f = 1.2 self.assertEqual(format(f, ".0f"), "1") @@ -342,10 +339,10 @@ self.assertEqual(str(cm.exception), "precision too big") c = complex(f) - self.assertEqual(format(f, ".0f"), "1") - self.assertEqual(format(f, ".3f"), "1.200") + self.assertEqual(format(c, ".0f"), "1+0j") + self.assertEqual(format(c, ".3f"), "1.200+0.000j") with self.assertRaises(ValueError) as cm: - format(f, ".%sf" % (INT_MAX + 1)) + format(c, ".%sf" % (INT_MAX + 1)) self.assertEqual(str(cm.exception), "precision too big") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 12:34:20 2013 From: python-checkins at python.org (mark.dickinson) Date: Sun, 13 Oct 2013 12:34:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_failing_checks_for_?= =?utf-8?q?explicit_error_messages=2E?= Message-ID: <3cyK5S3Rk7z7LjZ@mail.python.org> http://hg.python.org/cpython/rev/d115dc671f52 changeset: 86299:d115dc671f52 user: Mark Dickinson date: Sun Oct 13 11:34:01 2013 +0100 summary: Remove failing checks for explicit error messages. files: Lib/test/test_format.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -336,14 +336,12 @@ self.assertEqual(format(f, ".3f"), "1.200") with self.assertRaises(ValueError) as cm: format(f, ".%sf" % (INT_MAX + 1)) - self.assertEqual(str(cm.exception), "precision too big") c = complex(f) self.assertEqual(format(c, ".0f"), "1+0j") self.assertEqual(format(c, ".3f"), "1.200+0.000j") with self.assertRaises(ValueError) as cm: format(c, ".%sf" % (INT_MAX + 1)) - self.assertEqual(str(cm.exception), "precision too big") if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 14:32:14 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 13 Oct 2013 14:32:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_453_typo_fix?= Message-ID: <3cyMjV3vNczMfZ@mail.python.org> http://hg.python.org/peps/rev/975e7292492d changeset: 5192:975e7292492d user: Nick Coghlan date: Sun Oct 13 22:32:05 2013 +1000 summary: PEP 453 typo fix files: pep-0453.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -834,7 +834,7 @@ `__. Accordingly, the proposal to backport ``ensurepip`` to Python 2.7 and 3.3 -has been removed from this PEP in favour of creating and Windows installer +has been removed from this PEP in favour of creating a Windows installer for ``pip`` and a possible future PEP suggesting creation of an aggregate installer for Python 2.7 that combines CPython 2.7, ``pip`` and the Python Launcher for Windows. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 13 15:32:00 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 13 Oct 2013 15:32:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Docs_tweaks_for_contextlib?= =?utf-8?q?_additions?= Message-ID: <3cyP2S1w2DzSmB@mail.python.org> http://hg.python.org/cpython/rev/de15abcdf2c8 changeset: 86300:de15abcdf2c8 user: Nick Coghlan date: Sun Oct 13 23:23:08 2013 +1000 summary: Docs tweaks for contextlib additions files: Doc/library/contextlib.rst | 14 ++++++++++++-- Doc/whatsnew/3.4.rst | 13 +++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -99,22 +99,27 @@ Return a context manager that ignores the specified exceptions if they occur in the body of a with-statement. + As with any other mechanism that completely suppresses exceptions, it + should only be used to cover very specific errors where silently + ignoring the exception is known to be the right thing to do. + For example:: from contextlib import ignore - with ignore(OSError): + with ignore(FileNotFoundError): os.remove('somefile.tmp') This code is equivalent to:: try: os.remove('somefile.tmp') - except OSError: + except FileNotFoundError: pass .. versionadded:: 3.4 + .. function:: redirect_stdout(new_target) Context manager for temporarily redirecting :data:`sys.stdout` to @@ -144,6 +149,11 @@ with redirect_stdout(sys.stderr): help(pow) + Note that the global side effect on :data:`sys.stdout` means that this + context manager is not suitable for use in library code and most threaded + applications. It also has no effect on the output of subprocesses. + However, it is still a useful approach for many utility scripts. + .. versionadded:: 3.4 .. class:: ContextDecorator() diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -205,6 +205,19 @@ results should be less than 1% and may better match results found elsewhere. +contextlib +---------- + +The new :class:`contextlib.ignore` context manager helps to clarify the +intent of code that deliberately ignores failures from a particular +operation. + +The new :class:`contextlib.redirect_stdio` context manager makes it easier +for utility scripts to handle inflexible APIs that don't provide any +options to retrieve their output as a string or direct it to somewhere +other than :data:`sys.stdout`. + + dis --- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 15:49:34 2013 From: python-checkins at python.org (kristjan.jonsson) Date: Sun, 13 Oct 2013 15:49:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319219_Remove_a_lo?= =?utf-8?q?t_of_=22retval_=3D_NULL=22_statements=2C_now_that_retval?= Message-ID: <3cyPQk1KzWz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/500b4b62c19a changeset: 86301:500b4b62c19a user: Kristj?n Valur J?nsson date: Sun Oct 13 13:41:59 2013 +0000 summary: Issue #19219 Remove a lot of "retval = NULL" statements, now that retval is pre-initialized to that value. Test show a 5% speedup as a bonus. files: Python/marshal.c | 101 +++++++--------------------------- 1 files changed, 22 insertions(+), 79 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -868,7 +868,6 @@ switch (type) { case TYPE_NULL: - retval = NULL; break; case TYPE_NONE: @@ -911,7 +910,6 @@ { char buf[256], *ptr; double dx; - retval = NULL; n = r_byte(p); if (n == EOF) { PyErr_SetString(PyExc_EOFError, @@ -936,15 +934,11 @@ unsigned char *buf; double x; buf = (unsigned char *) r_string(8, p); - if (buf == NULL) { - retval = NULL; + if (buf == NULL) break; - } x = _PyFloat_Unpack8(buf, 1); - if (x == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (x == -1.0 && PyErr_Occurred()) break; - } retval = PyFloat_FromDouble(x); R_REF(retval); break; @@ -954,7 +948,6 @@ { char buf[256], *ptr; Py_complex c; - retval = NULL; n = r_byte(p); if (n == EOF) { PyErr_SetString(PyExc_EOFError, @@ -993,25 +986,17 @@ unsigned char *buf; Py_complex c; buf = (unsigned char *) r_string(8, p); - if (buf == NULL) { - retval = NULL; + if (buf == NULL) break; - } c.real = _PyFloat_Unpack8(buf, 1); - if (c.real == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (c.real == -1.0 && PyErr_Occurred()) break; - } buf = (unsigned char *) r_string(8, p); - if (buf == NULL) { - retval = NULL; + if (buf == NULL) break; - } c.imag = _PyFloat_Unpack8(buf, 1); - if (c.imag == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (c.imag == -1.0 && PyErr_Occurred()) break; - } retval = PyComplex_FromCComplex(c); R_REF(retval); break; @@ -1021,24 +1006,18 @@ { char *ptr; n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); - retval = NULL; break; } v = PyBytes_FromStringAndSize((char *)NULL, n); - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } ptr = r_string(n, p); if (ptr == NULL) { Py_DECREF(v); - retval = NULL; break; } memcpy(PyBytes_AS_STRING(v), ptr, n); @@ -1051,13 +1030,10 @@ is_interned = 1; case TYPE_ASCII: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); - retval = NULL; break; } goto _read_ascii; @@ -1075,15 +1051,11 @@ { char *ptr; ptr = r_string(n, p); - if (ptr == NULL) { - retval = NULL; + if (ptr == NULL) break; - } v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } if (is_interned) PyUnicode_InternInPlace(&v); retval = v; @@ -1098,30 +1070,23 @@ char *buffer; n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); - retval = NULL; break; } if (n != 0) { buffer = r_string(n, p); - if (buffer == NULL) { - retval = NULL; + if (buffer == NULL) break; - } v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); } else { v = PyUnicode_New(0, 0); } - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } if (is_interned) PyUnicode_InternInPlace(&v); retval = v; @@ -1134,22 +1099,17 @@ goto _read_tuple; case TYPE_TUPLE: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)"); - retval = NULL; break; } _read_tuple: v = PyTuple_New(n); R_REF(v); - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -1167,21 +1127,16 @@ case TYPE_LIST: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)"); - retval = NULL; break; } v = PyList_New(n); R_REF(v); - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -1200,10 +1155,8 @@ case TYPE_DICT: v = PyDict_New(); R_REF(v); - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } for (;;) { PyObject *key, *val; key = r_object(p); @@ -1225,13 +1178,10 @@ case TYPE_SET: case TYPE_FROZENSET: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)"); - retval = NULL; break; } v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); @@ -1245,10 +1195,8 @@ if (idx < 0) Py_CLEAR(v); /* signal error */ } - if (v == NULL) { - retval = NULL; + if (v == NULL) break; - } for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -1291,10 +1239,8 @@ PyObject *lnotab = NULL; idx = r_ref_reserve(flag, p); - if (idx < 0) { - retval = NULL; + if (idx < 0) break; - } v = NULL; @@ -1381,13 +1327,11 @@ n = r_long(p); if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); - retval = NULL; break; } v = PyList_GET_ITEM(p->refs, n); if (v == Py_None) { PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); - retval = NULL; break; } Py_INCREF(v); @@ -1398,7 +1342,6 @@ /* Bogus data got written, which isn't ideal. This will let you keep working and recover. */ PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)"); - retval = NULL; break; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 16:11:18 2013 From: python-checkins at python.org (victor.stinner) Date: Sun, 13 Oct 2013 16:11:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_445_has_been_implemented?= Message-ID: <3cyPvp404vz7Ljc@mail.python.org> http://hg.python.org/peps/rev/3b8b289dfbbe changeset: 5193:3b8b289dfbbe user: Victor Stinner date: Sun Oct 13 16:10:58 2013 +0200 summary: PEP 445 has been implemented files: pep-0445.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0445.txt b/pep-0445.txt --- a/pep-0445.txt +++ b/pep-0445.txt @@ -4,7 +4,7 @@ Last-Modified: $Date$ Author: Victor Stinner BDFL-Delegate: Antoine Pitrou -Status: Accepted +Status: Final Type: Standards Track Content-Type: text/x-rst Created: 15-june-2013 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 13 16:52:41 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 16:52:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Added_tests_for_the_sunau_module=2E__Unified_and_extended_t?= =?utf-8?q?ests?= Message-ID: <3cyQqY4jVZz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/a9f967c8d002 changeset: 86302:a9f967c8d002 branch: 2.7 parent: 86297:f543863f4e43 user: Serhiy Storchaka date: Sun Oct 13 17:47:22 2013 +0300 summary: Issue #18919: Added tests for the sunau module. Unified and extended tests for audio modules: aifc, sunau and wave. files: Lib/test/audiodata/pluck-pcm16.aiff | Bin Lib/test/audiodata/pluck-pcm16.au | Bin Lib/test/audiodata/pluck-pcm16.wav | Bin Lib/test/audiodata/pluck-pcm24.aiff | Bin Lib/test/audiodata/pluck-pcm24.wav | Bin Lib/test/audiodata/pluck-pcm32.aiff | Bin Lib/test/audiodata/pluck-pcm32.au | Bin Lib/test/audiodata/pluck-pcm32.wav | Bin Lib/test/audiodata/pluck-pcm8.aiff | Bin Lib/test/audiodata/pluck-pcm8.au | Bin Lib/test/audiodata/pluck-pcm8.wav | Bin Lib/test/audiodata/pluck-ulaw.aifc | Bin Lib/test/audiodata/pluck-ulaw.au | Bin Lib/test/audiotests.py | 218 ++++++++ Lib/test/test_aifc.py | 398 +++++++++++---- Lib/test/test_sunau.py | 107 ++++ Lib/test/test_wave.py | 131 +++- Misc/NEWS | 3 + 18 files changed, 719 insertions(+), 138 deletions(-) diff --git a/Lib/test/audiodata/pluck-pcm16.aiff b/Lib/test/audiodata/pluck-pcm16.aiff new file mode 100644 index 0000000000000000000000000000000000000000..6c8c40d14092893a4b4af626f6caf5c8c826017d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au new file mode 100644 index 0000000000000000000000000000000000000000..398f07f071974314161f1f364d005586921eba1d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.wav b/Lib/test/audiodata/pluck-pcm16.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb8627def9fd84ecd4607b122ac744bae1668ecb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.aiff b/Lib/test/audiodata/pluck-pcm24.aiff new file mode 100644 index 0000000000000000000000000000000000000000..8eba145a44d37a837b00428c6e39c6d68e25ac4b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.wav b/Lib/test/audiodata/pluck-pcm24.wav new file mode 100644 index 0000000000000000000000000000000000000000..60d92c32ba3c2ba7cb31fa109ffefbecf8867aaa GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.aiff b/Lib/test/audiodata/pluck-pcm32.aiff new file mode 100644 index 0000000000000000000000000000000000000000..46ac0373f6abbc7454a53b536daa27589857604c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.au b/Lib/test/audiodata/pluck-pcm32.au new file mode 100644 index 0000000000000000000000000000000000000000..92ee5965e40197bd2a086841f37f0d7ca681a03b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.wav b/Lib/test/audiodata/pluck-pcm32.wav new file mode 100644 index 0000000000000000000000000000000000000000..846628bf82f7278697b093db94becb704be2c3d8 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.aiff b/Lib/test/audiodata/pluck-pcm8.aiff new file mode 100644 index 0000000000000000000000000000000000000000..5de4f3b2d879bae0a41710cea4d0b1aad9309124 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au new file mode 100644 index 0000000000000000000000000000000000000000..b7172c8f23475babb68760aae89e394243c38f5c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.wav b/Lib/test/audiodata/pluck-pcm8.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb28cb8aa671050294436b01e5ffd586ae14acbb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.aifc b/Lib/test/audiodata/pluck-ulaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3085cf097fb18a839a3ae5b9a47bd75cdef5f8a5 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.au b/Lib/test/audiodata/pluck-ulaw.au new file mode 100644 index 0000000000000000000000000000000000000000..11103535c6b6a401da742a3c76db68baf2c38ba1 GIT binary patch [stripped] diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py new file mode 100644 --- /dev/null +++ b/Lib/test/audiotests.py @@ -0,0 +1,218 @@ +from test.test_support import findfile, TESTFN, unlink +import unittest +import array +import io +import pickle +import sys +import base64 + +def fromhex(s): + return base64.b16decode(s.replace(' ', '')) + +def byteswap2(data): + a = array.array('h', data) + a.byteswap() + return a.tostring() + +def byteswap3(data): + ba = bytearray(data) + ba[::3] = data[2::3] + ba[2::3] = data[::3] + return bytes(ba) + +def byteswap4(data): + a = array.array('i', data) + a.byteswap() + return a.tostring() + + +class AudioTests: + close_fd = False + + def setUp(self): + self.f = self.fout = None + + def tearDown(self): + if self.f is not None: + self.f.close() + if self.fout is not None: + self.fout.close() + unlink(TESTFN) + + def check_params(self, f, nchannels, sampwidth, framerate, nframes, + comptype, compname): + self.assertEqual(f.getnchannels(), nchannels) + self.assertEqual(f.getsampwidth(), sampwidth) + self.assertEqual(f.getframerate(), framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.getcomptype(), comptype) + self.assertEqual(f.getcompname(), compname) + + params = f.getparams() + self.assertEqual(params, + (nchannels, sampwidth, framerate, nframes, comptype, compname)) + + dump = pickle.dumps(params) + self.assertEqual(pickle.loads(dump), params) + + +class AudioWriteTests(AudioTests): + + def create_file(self, testfile): + f = self.fout = self.module.open(testfile, 'wb') + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + return f + + def check_file(self, testfile, nframes, frames): + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.readframes(nframes), frames) + finally: + f.close() + + def test_write_params(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.nframes, self.comptype, self.compname) + f.close() + + def test_write(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + f.close() + + self.check_file(TESTFN, self.nframes, self.frames) + + def test_incompleted_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes + 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_multiple_writes(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes) + framesize = self.nchannels * self.sampwidth + f.writeframes(self.frames[:-framesize]) + f.writeframes(self.frames[-framesize:]) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_overflowed_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes - 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + +class AudioTestsWithSourceFile(AudioTests): + + @classmethod + def setUpClass(cls): + cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata') + + def test_read_params(self): + f = self.f = self.module.open(self.sndfilepath) + #self.assertEqual(f.getfp().name, self.sndfilepath) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.sndfilenframes, self.comptype, self.compname) + + def test_close(self): + testfile = open(self.sndfilepath, 'rb') + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + testfile = open(TESTFN, 'wb') + fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing + + def test_read(self): + framesize = self.nchannels * self.sampwidth + chunk1 = self.frames[:2 * framesize] + chunk2 = self.frames[2 * framesize: 4 * framesize] + f = self.f = self.module.open(self.sndfilepath) + self.assertEqual(f.readframes(0), b'') + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), chunk1) + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), chunk1) + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos0) + self.assertEqual(f.readframes(2), chunk1) + with self.assertRaises(self.module.Error): + f.setpos(-1) + with self.assertRaises(self.module.Error): + f.setpos(f.getnframes() + 1) + + def test_copy(self): + f = self.f = self.module.open(self.sndfilepath) + fout = self.fout = self.module.open(TESTFN, 'wb') + fout.setparams(f.getparams()) + i = 0 + n = f.getnframes() + while n > 0: + i += 1 + fout.writeframes(f.readframes(i)) + n -= i + fout.close() + fout = self.fout = self.module.open(TESTFN, 'rb') + f.rewind() + self.assertEqual(f.getparams(), fout.getparams()) + self.assertEqual(f.readframes(f.getnframes()), + fout.readframes(fout.getnframes())) + + def test_read_not_from_start(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + with open(self.sndfilepath, 'rb') as f: + testfile.write(f.read()) + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), self.sndfilenframes) + self.assertEqual(f.readframes(self.nframes), self.frames) + finally: + f.close() diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,118 +1,168 @@ -from test.test_support import findfile, run_unittest, TESTFN +from test.test_support import findfile, TESTFN, unlink, run_unittest import unittest +from test import audiotests import os import io - +import sys +import struct import aifc -class AIFCTest(unittest.TestCase): +class AifcPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm8.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) + close_fd = True - def setUp(self): - self.f = self.fout = None - self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') - def tearDown(self): - if self.f is not None: - self.f.close() - if self.fout is not None: - try: - self.fout.close() - except (aifc.Error, AttributeError): - pass - try: - os.remove(TESTFN) - except OSError: - pass +class AifcPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm16.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \ + B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \ + 5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \ + 117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \ + EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \ + E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \ + """) + close_fd = True + +class AifcPCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm24.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + close_fd = True + + +class AifcPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm32.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + close_fd = True + + +class AifcULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-ulaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'ulaw' + compname = '' + frames = audiotests.fromhex("""\ + 022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcMiscTest(audiotests.AudioTests, unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(self.sndfilepath) + self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) - def test_params(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.getnchannels(), 2) - self.assertEqual(f.getsampwidth(), 2) - self.assertEqual(f.getframerate(), 48000) - self.assertEqual(f.getnframes(), 14400) - self.assertEqual(f.getcomptype(), 'NONE') - self.assertEqual(f.getcompname(), 'not compressed') - self.assertEqual(f.getparams(), (2, 2, 48000, 14400, 'NONE', 'not compressed')) + def test_write_markers_values(self): + fout = aifc.open(io.BytesIO(), 'wb') + self.assertEqual(fout.getmarkers(), None) + fout.setmark(1, 0, 'foo1') + fout.setmark(1, 1, 'foo2') + self.assertEqual(fout.getmark(1), (1, 1, 'foo2')) + self.assertEqual(fout.getmarkers(), [(1, 1, 'foo2')]) + fout.initfp(None) - def test_read(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.tell(), 0) - self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - f.rewind() - pos0 = f.tell() - self.assertEqual(pos0, 0) - self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - pos2 = f.tell() - self.assertEqual(pos2, 2) - self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad') - f.setpos(pos2) - self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad') - f.setpos(pos0) - self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - - def test_write(self): - f = self.f = aifc.open(self.sndfilepath) + def test_read_markers(self): fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setparams(f.getparams()) - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) + fout.aiff() + fout.setparams((1, 1, 1, 1, 'NONE', '')) + fout.setmark(1, 0, 'odd') + fout.setmark(2, 0, 'even') + fout.writeframes('\x00') fout.close() - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams(), fout.getparams()) - self.assertEqual(f.readframes(5), fout.readframes(5)) - - def test_compress(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setnchannels(f.getnchannels()) - fout.setsampwidth(f.getsampwidth()) - fout.setframerate(f.getframerate()) - fout.setcomptype('ULAW', 'foo') - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - self.assertLess( - os.stat(TESTFN).st_size, - os.stat(self.sndfilepath).st_size*0.75, - ) - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams()[0:3], fout.getparams()[0:3]) - self.assertEqual(fout.getcomptype(), 'ULAW') - self.assertEqual(fout.getcompname(), 'foo') - # XXX: this test fails, not sure if it should succeed or not - # self.assertEqual(f.readframes(5), fout.readframes(5)) - - def test_close(self): - class Wrapfile(object): - def __init__(self, file): - self.file = open(file, 'rb') - self.closed = False - def close(self): - self.file.close() - self.closed = True - def __getattr__(self, attr): return getattr(self.file, attr) - testfile = Wrapfile(self.sndfilepath) - f = self.f = aifc.open(testfile) - self.assertEqual(testfile.closed, False) - f.close() - self.assertEqual(testfile.closed, True) - testfile = open(TESTFN, 'wb') - fout = aifc.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(aifc.Error): - fout.close() - self.assertTrue(testfile.closed) - fout.close() # do nothing + f = self.f = aifc.open(TESTFN, 'rb') + self.assertEqual(f.getmarkers(), [(1, 0, 'odd'), (2, 0, 'even')]) + self.assertEqual(f.getmark(1), (1, 0, 'odd')) + self.assertEqual(f.getmark(2), (2, 0, 'even')) + self.assertRaises(aifc.Error, f.getmark, 3) class AIFCLowLevelTest(unittest.TestCase): @@ -127,7 +177,7 @@ self.assertEqual(read_written(x, 'float'), x) for x in (float('NaN'), float('Inf')): self.assertEqual(read_written(x, 'float'), aifc._HUGE_VAL) - for x in (b'', b'foo', b'a' * 255): + for x in ('', 'foo', 'a' * 255): self.assertEqual(read_written(x, 'string'), x) for x in (-0x7FFFFFFF, -1, 0, 1, 0x7FFFFFFF): self.assertEqual(read_written(x, 'long'), x) @@ -139,7 +189,7 @@ self.assertEqual(read_written(x, 'ushort'), x) def test_read_raises(self): - f = io.BytesIO(b'\x00') + f = io.BytesIO('\x00') self.assertRaises(EOFError, aifc._read_ulong, f) self.assertRaises(EOFError, aifc._read_long, f) self.assertRaises(EOFError, aifc._read_ushort, f) @@ -148,13 +198,149 @@ def test_write_long_string_raises(self): f = io.BytesIO() with self.assertRaises(ValueError): - aifc._write_string(f, b'too long' * 255) + aifc._write_string(f, 'too long' * 255) + + def test_wrong_open_mode(self): + with self.assertRaises(aifc.Error): + aifc.open(TESTFN, 'wrong_mode') + + def test_read_wrong_form(self): + b1 = io.BytesIO('WRNG' + struct.pack('>L', 0)) + b2 = io.BytesIO('FORM' + struct.pack('>L', 4) + 'WRNG') + self.assertRaises(aifc.Error, aifc.open, b1) + self.assertRaises(aifc.Error, aifc.open, b2) + + def test_read_no_comm_chunk(self): + b = io.BytesIO('FORM' + struct.pack('>L', 4) + 'AIFF') + self.assertRaises(aifc.Error, aifc.open, b) + + def test_read_wrong_compression_type(self): + b = 'FORM' + struct.pack('>L', 4) + 'AIFC' + b += 'COMM' + struct.pack('>LhlhhLL', 23, 0, 0, 0, 0, 0, 0) + b += 'WRNG' + struct.pack('B', 0) + self.assertRaises(aifc.Error, aifc.open, io.BytesIO(b)) + + def test_read_wrong_marks(self): + b = 'FORM' + struct.pack('>L', 4) + 'AIFF' + b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) + b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 + b += 'MARK' + struct.pack('>LhB', 3, 1, 1) + f = aifc.open(io.BytesIO(b)) + self.assertEqual(f.getmarkers(), None) + + def test_read_comm_kludge_compname_even(self): + b = 'FORM' + struct.pack('>L', 4) + 'AIFC' + b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) + b += 'NONE' + struct.pack('B', 4) + 'even' + '\x00' + b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 + f = aifc.open(io.BytesIO(b)) + self.assertEqual(f.getcompname(), 'even') + + def test_read_comm_kludge_compname_odd(self): + b = 'FORM' + struct.pack('>L', 4) + 'AIFC' + b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) + b += 'NONE' + struct.pack('B', 3) + 'odd' + b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 + f = aifc.open(io.BytesIO(b)) + self.assertEqual(f.getcompname(), 'odd') + + def test_write_params_raises(self): + fout = aifc.open(io.BytesIO(), 'wb') + wrong_params = (0, 0, 0, 0, 'WRNG', '') + self.assertRaises(aifc.Error, fout.setparams, wrong_params) + self.assertRaises(aifc.Error, fout.getparams) + self.assertRaises(aifc.Error, fout.setnchannels, 0) + self.assertRaises(aifc.Error, fout.getnchannels) + self.assertRaises(aifc.Error, fout.setsampwidth, 0) + self.assertRaises(aifc.Error, fout.getsampwidth) + self.assertRaises(aifc.Error, fout.setframerate, 0) + self.assertRaises(aifc.Error, fout.getframerate) + self.assertRaises(aifc.Error, fout.setcomptype, 'WRNG', '') + fout.aiff() + fout.setnchannels(1) + fout.setsampwidth(1) + fout.setframerate(1) + fout.setnframes(1) + fout.writeframes('\x00') + self.assertRaises(aifc.Error, fout.setparams, (1, 1, 1, 1, 1, 1)) + self.assertRaises(aifc.Error, fout.setnchannels, 1) + self.assertRaises(aifc.Error, fout.setsampwidth, 1) + self.assertRaises(aifc.Error, fout.setframerate, 1) + self.assertRaises(aifc.Error, fout.setnframes, 1) + self.assertRaises(aifc.Error, fout.setcomptype, 'NONE', '') + self.assertRaises(aifc.Error, fout.aiff) + self.assertRaises(aifc.Error, fout.aifc) + + def test_write_params_singles(self): + fout = aifc.open(io.BytesIO(), 'wb') + fout.aifc() + fout.setnchannels(1) + fout.setsampwidth(2) + fout.setframerate(3) + fout.setnframes(4) + fout.setcomptype('NONE', 'name') + self.assertEqual(fout.getnchannels(), 1) + self.assertEqual(fout.getsampwidth(), 2) + self.assertEqual(fout.getframerate(), 3) + self.assertEqual(fout.getnframes(), 0) + self.assertEqual(fout.tell(), 0) + self.assertEqual(fout.getcomptype(), 'NONE') + self.assertEqual(fout.getcompname(), 'name') + fout.writeframes('\x00' * 4 * fout.getsampwidth() * fout.getnchannels()) + self.assertEqual(fout.getnframes(), 4) + self.assertEqual(fout.tell(), 4) + + def test_write_params_bunch(self): + fout = aifc.open(io.BytesIO(), 'wb') + fout.aifc() + p = (1, 2, 3, 4, 'NONE', 'name') + fout.setparams(p) + self.assertEqual(fout.getparams(), p) + fout.initfp(None) + + def test_write_header_raises(self): + fout = aifc.open(io.BytesIO(), 'wb') + self.assertRaises(aifc.Error, fout.close) + fout = aifc.open(io.BytesIO(), 'wb') + fout.setnchannels(1) + self.assertRaises(aifc.Error, fout.close) + fout = aifc.open(io.BytesIO(), 'wb') + fout.setnchannels(1) + fout.setsampwidth(1) + self.assertRaises(aifc.Error, fout.close) + + def test_write_header_comptype_raises(self): + for comptype in ('ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): + fout = aifc.open(io.BytesIO(), 'wb') + fout.setsampwidth(1) + fout.setcomptype(comptype, '') + self.assertRaises(aifc.Error, fout.close) + fout.initfp(None) + + def test_write_markers_raises(self): + fout = aifc.open(io.BytesIO(), 'wb') + self.assertRaises(aifc.Error, fout.setmark, 0, 0, '') + self.assertRaises(aifc.Error, fout.setmark, 1, -1, '') + self.assertRaises(aifc.Error, fout.setmark, 1, 0, None) + self.assertRaises(aifc.Error, fout.getmark, 1) + fout.initfp(None) + + def test_write_aiff_by_extension(self): + sampwidth = 2 + fout = self.fout = aifc.open(TESTFN + '.aiff', 'wb') + fout.setparams((1, sampwidth, 1, 1, 'ULAW', '')) + frames = '\x00' * fout.getnchannels() * sampwidth + fout.writeframes(frames) + fout.close() + f = self.f = aifc.open(TESTFN + '.aiff', 'rb') + self.assertEqual(f.getcomptype(), 'NONE') + f.close() def test_main(): - run_unittest(AIFCTest) - run_unittest(AIFCLowLevelTest) - + run_unittest(AifcPCM8Test, AifcPCM16Test, AifcPCM16Test, AifcPCM24Test, + AifcPCM32Test, AifcULAWTest, + AifcMiscTest, AIFCLowLevelTest) if __name__ == "__main__": - unittest.main() + test_main() diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_sunau.py @@ -0,0 +1,107 @@ +from test.test_support import TESTFN, run_unittest +import unittest +from test import audiotests +import sys +import sunau + + +class SunauPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm8.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) + + +class SunauPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm16.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \ + B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \ + 5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \ + 1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \ + EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \ + E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \ + """) + + +class SunauPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm32.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + + +class SunauULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-ulaw.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'ULAW' + compname = 'CCITT G.711 u-law' + frames = audiotests.fromhex("""\ + 022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + + +def test_main(): + run_unittest(SunauPCM8Test, SunauPCM16Test, SunauPCM16Test, + SunauPCM32Test, SunauULAWTest) + +if __name__ == "__main__": + test_main() diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,45 +1,112 @@ from test.test_support import TESTFN, run_unittest -import os +import unittest +from test import audiotests import wave -import unittest -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class TestWave(unittest.TestCase): +class WavePCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm8.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 827F CB80 B184 0088 4B86 C883 3F81 837E 387A 3473 A96B 9A66 \ + 6D64 4662 8E60 6F60 D762 7B68 936F 5877 177B 757C 887B 5F7B \ + 917A BE7B 3C7C E67F 4F84 C389 418E D192 6E97 0296 FF94 0092 \ + C98E D28D 6F8F 4E8F 648C E38A 888A AB8B D18E 0B91 368E C48A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass +class WavePCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm16.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DC0843 CBDF06B2 48AA03F3 BFE701B2 036BFE7C \ + B857FA3E B4B2F34F 2999EBCA 1A5FE6D7 EDFCE491 C626E279 0E05E0B8 EF27E02D \ + 5754E275 FB31E843 1373EF89 D827F72C 978BFB7A F5F7FC11 0866FB9C DF30FB42 \ + 117FFA36 3EE4FB5D BC75FCB6 66D5FF5F CF16040E 43220978 C1BC0EC8 511F12A4 \ + EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ + E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ + """) + frames = audiotests.byteswap2(frames) - def test_it(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setnframes(nframes) - output = '\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = wave.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual(self.f.readframes(nframes), output) +class WavePCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm24.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + frames = audiotests.byteswap3(frames) + + +class WavePCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm32.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = audiotests.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + frames = audiotests.byteswap4(frames) + def test_main(): - run_unittest(TestWave) + run_unittest(WavePCM8Test, WavePCM16Test, WavePCM24Test, WavePCM32Test) if __name__ == '__main__': test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -302,6 +302,9 @@ Tests ----- +- Issue #18919: Added tests for the sunau module. Unified and extended tests + for audio modules: aifc, sunau and wave. + - Issue #18792: Use "127.0.0.1" or "::1" instead of "localhost" as much as possible, since "localhost" goes through a DNS lookup under recent Windows versions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 16:56:15 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 13 Oct 2013 16:56:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE3ODI3?= =?utf-8?q?=3A_Document_codecs=2Eencode_and_codecs=2Edecode?= Message-ID: <3cyQvg0lCMz7LjX@mail.python.org> http://hg.python.org/cpython/rev/b607ce6c9ee6 changeset: 86303:b607ce6c9ee6 branch: 3.3 parent: 86294:e08dea96b6e2 user: Nick Coghlan date: Mon Oct 14 00:22:13 2013 +1000 summary: Issue #17827: Document codecs.encode and codecs.decode files: Doc/library/codecs.rst | 19 +++++++++++++++++++ Misc/NEWS | 3 +++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -22,6 +22,25 @@ It defines the following functions: +.. function:: encode(obj, encoding='utf-8', errors='strict') + + Encodes *obj* using the codec registered for *encoding*. + + *Errors* may be given to set the desired error handling scheme. The + default error handler is ``strict`` meaning that encoding errors raise + :exc:`ValueError` (or a more codec specific subclass, such as + :exc:`UnicodeEncodeError`). Refer to :ref:`codec-base-classes` for more + information on codec error handling. + +.. function:: decode(obj, encoding='utf-8', errors='strict') + + Decodes *obj* using the codec registered for *encoding*. + + *Errors* may be given to set the desired error handling scheme. The + default error handler is ``strict`` meaning that decoding errors raise + :exc:`ValueError` (or a more codec specific subclass, such as + :exc:`UnicodeDecodeError`). Refer to :ref:`codec-base-classes` for more + information on codec error handling. .. function:: register(search_function) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,9 @@ Library ------- +- Issue #17827: Add the missing documentation for ``codecs.encode`` and + ``codecs.decode``. + - Issue #18458: Prevent crashes with newer versions of libedit. Its readline emulation has changed from 0-based indexing to 1-based like gnu readline. Original patch by Ronald Oussoren. -- Repository URL: http://hg.python.org/cpython From root at python.org Sun Oct 13 17:05:23 2013 From: root at python.org (Cron Daemon) Date: Sun, 13 Oct 2013 17:05:23 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: error: Connection timed out From python-checkins at python.org Sun Oct 13 17:14:16 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 17:14:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Unified_and_extended_tests_for_audio_modules=3A_aifc=2C_sun?= =?utf-8?q?au_and?= Message-ID: <3cyRJS1zGCz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/ee7563b07c6f changeset: 86305:ee7563b07c6f branch: 3.3 parent: 86294:e08dea96b6e2 user: Serhiy Storchaka date: Sun Oct 13 17:55:07 2013 +0300 summary: Issue #18919: Unified and extended tests for audio modules: aifc, sunau and wave. files: Lib/test/audiodata/pluck-alaw.aifc | Bin Lib/test/audiodata/pluck-pcm16.aiff | Bin Lib/test/audiodata/pluck-pcm16.au | Bin Lib/test/audiodata/pluck-pcm16.wav | Bin Lib/test/audiodata/pluck-pcm24.aiff | Bin Lib/test/audiodata/pluck-pcm24.wav | Bin Lib/test/audiodata/pluck-pcm32.aiff | Bin Lib/test/audiodata/pluck-pcm32.au | Bin Lib/test/audiodata/pluck-pcm32.wav | Bin Lib/test/audiodata/pluck-pcm8.aiff | Bin Lib/test/audiodata/pluck-pcm8.au | Bin Lib/test/audiodata/pluck-pcm8.wav | Bin Lib/test/audiodata/pluck-ulaw.aifc | Bin Lib/test/audiodata/pluck-ulaw.au | Bin Lib/test/audiotests.py | 214 ++++++++++++ Lib/test/test_aifc.py | 267 +++++++++------ Lib/test/test_sunau.py | 145 +++++--- Lib/test/test_wave.py | 151 +++++--- Misc/NEWS | 3 + 19 files changed, 557 insertions(+), 223 deletions(-) diff --git a/Lib/test/audiodata/pluck-alaw.aifc b/Lib/test/audiodata/pluck-alaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3b7fbd2af75a0a190b0a507ec43afbf8bd2b2267 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.aiff b/Lib/test/audiodata/pluck-pcm16.aiff new file mode 100644 index 0000000000000000000000000000000000000000..6c8c40d14092893a4b4af626f6caf5c8c826017d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au new file mode 100644 index 0000000000000000000000000000000000000000..398f07f071974314161f1f364d005586921eba1d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.wav b/Lib/test/audiodata/pluck-pcm16.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb8627def9fd84ecd4607b122ac744bae1668ecb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.aiff b/Lib/test/audiodata/pluck-pcm24.aiff new file mode 100644 index 0000000000000000000000000000000000000000..8eba145a44d37a837b00428c6e39c6d68e25ac4b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.wav b/Lib/test/audiodata/pluck-pcm24.wav new file mode 100644 index 0000000000000000000000000000000000000000..60d92c32ba3c2ba7cb31fa109ffefbecf8867aaa GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.aiff b/Lib/test/audiodata/pluck-pcm32.aiff new file mode 100644 index 0000000000000000000000000000000000000000..46ac0373f6abbc7454a53b536daa27589857604c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.au b/Lib/test/audiodata/pluck-pcm32.au new file mode 100644 index 0000000000000000000000000000000000000000..92ee5965e40197bd2a086841f37f0d7ca681a03b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.wav b/Lib/test/audiodata/pluck-pcm32.wav new file mode 100644 index 0000000000000000000000000000000000000000..846628bf82f7278697b093db94becb704be2c3d8 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.aiff b/Lib/test/audiodata/pluck-pcm8.aiff new file mode 100644 index 0000000000000000000000000000000000000000..5de4f3b2d879bae0a41710cea4d0b1aad9309124 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au new file mode 100644 index 0000000000000000000000000000000000000000..b7172c8f23475babb68760aae89e394243c38f5c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.wav b/Lib/test/audiodata/pluck-pcm8.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb28cb8aa671050294436b01e5ffd586ae14acbb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.aifc b/Lib/test/audiodata/pluck-ulaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3085cf097fb18a839a3ae5b9a47bd75cdef5f8a5 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.au b/Lib/test/audiodata/pluck-ulaw.au new file mode 100644 index 0000000000000000000000000000000000000000..11103535c6b6a401da742a3c76db68baf2c38ba1 GIT binary patch [stripped] diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py new file mode 100644 --- /dev/null +++ b/Lib/test/audiotests.py @@ -0,0 +1,214 @@ +from test.support import findfile, TESTFN, unlink +import unittest +import array +import io +import pickle +import sys + +def byteswap2(data): + a = array.array('h', data) + a.byteswap() + return a.tobytes() + +def byteswap3(data): + ba = bytearray(data) + ba[::3] = data[2::3] + ba[2::3] = data[::3] + return bytes(ba) + +def byteswap4(data): + a = array.array('i', data) + a.byteswap() + return a.tobytes() + + +class AudioTests: + close_fd = False + + def setUp(self): + self.f = self.fout = None + + def tearDown(self): + if self.f is not None: + self.f.close() + if self.fout is not None: + self.fout.close() + unlink(TESTFN) + + def check_params(self, f, nchannels, sampwidth, framerate, nframes, + comptype, compname): + self.assertEqual(f.getnchannels(), nchannels) + self.assertEqual(f.getsampwidth(), sampwidth) + self.assertEqual(f.getframerate(), framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.getcomptype(), comptype) + self.assertEqual(f.getcompname(), compname) + + params = f.getparams() + self.assertEqual(params, + (nchannels, sampwidth, framerate, nframes, comptype, compname)) + + dump = pickle.dumps(params) + self.assertEqual(pickle.loads(dump), params) + + +class AudioWriteTests(AudioTests): + + def create_file(self, testfile): + f = self.fout = self.module.open(testfile, 'wb') + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + return f + + def check_file(self, testfile, nframes, frames): + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.readframes(nframes), frames) + finally: + f.close() + + def test_write_params(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.nframes, self.comptype, self.compname) + f.close() + + def test_write(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + f.close() + + self.check_file(TESTFN, self.nframes, self.frames) + + def test_incompleted_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes + 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_multiple_writes(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes) + framesize = self.nchannels * self.sampwidth + f.writeframes(self.frames[:-framesize]) + f.writeframes(self.frames[-framesize:]) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_overflowed_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes - 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + +class AudioTestsWithSourceFile(AudioTests): + + @classmethod + def setUpClass(cls): + cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata') + + def test_read_params(self): + f = self.f = self.module.open(self.sndfilepath) + #self.assertEqual(f.getfp().name, self.sndfilepath) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.sndfilenframes, self.comptype, self.compname) + + def test_close(self): + testfile = open(self.sndfilepath, 'rb') + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + testfile = open(TESTFN, 'wb') + fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing + + def test_read(self): + framesize = self.nchannels * self.sampwidth + chunk1 = self.frames[:2 * framesize] + chunk2 = self.frames[2 * framesize: 4 * framesize] + f = self.f = self.module.open(self.sndfilepath) + self.assertEqual(f.readframes(0), b'') + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), chunk1) + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), chunk1) + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos0) + self.assertEqual(f.readframes(2), chunk1) + with self.assertRaises(self.module.Error): + f.setpos(-1) + with self.assertRaises(self.module.Error): + f.setpos(f.getnframes() + 1) + + def test_copy(self): + f = self.f = self.module.open(self.sndfilepath) + fout = self.fout = self.module.open(TESTFN, 'wb') + fout.setparams(f.getparams()) + i = 0 + n = f.getnframes() + while n > 0: + i += 1 + fout.writeframes(f.readframes(i)) + n -= i + fout.close() + fout = self.fout = self.module.open(TESTFN, 'rb') + f.rewind() + self.assertEqual(f.getparams(), fout.getparams()) + self.assertEqual(f.readframes(f.getnframes()), + fout.readframes(fout.getnframes())) + + def test_read_not_from_start(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + with open(self.sndfilepath, 'rb') as f: + testfile.write(f.read()) + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), self.sndfilenframes) + self.assertEqual(f.readframes(self.nframes), self.frames) + finally: + f.close() diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,124 +1,170 @@ -from test.support import findfile, run_unittest, TESTFN, unlink +from test.support import findfile, TESTFN, unlink import unittest +from test import audiotests import os import io +import sys import struct - import aifc -class AIFCTest(unittest.TestCase): +class AifcPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm8.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) + close_fd = True - def setUp(self): - self.f = self.fout = None - self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') - def tearDown(self): - if self.f is not None: - self.f.close() - if self.fout is not None: - try: - self.fout.close() - except (aifc.Error, AttributeError): - pass - unlink(TESTFN) - unlink(TESTFN + '.aiff') +class AifcPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm16.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \ + B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \ + 5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \ + 117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \ + EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \ + E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \ + """) + close_fd = True + +class AifcPCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm24.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + close_fd = True + + +class AifcPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm32.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + close_fd = True + + +class AifcULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-ulaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'ulaw' + compname = b'' + frames = bytes.fromhex("""\ + 022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcALAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-alaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'alaw' + compname = b'' + frames = bytes.fromhex("""\ + 0230FFE8 4A0000F8 310004E0 82000840 CB0006A0 4A0003F0 BE0001A8 0370FE78 \ + BA00FA20 B600F340 2900EB80 1A80E680 ED80E480 C700E280 0E40E080 EF80E080 \ + 5600E280 FB20E880 1380EF80 D900F740 9600FB60 F5C0FC10 0840FBA0 DF00FB20 \ + 1180FA20 3F00FB60 BE00FCB0 6600FF58 CF000420 42000940 C1000EC0 52001280 \ + EE801780 82001680 7E001480 82001280 4A000EC0 52000DC0 EF800F40 CF000FC0 \ + E4800CC0 62000A40 08C00A40 2B000B40 52000E40 8A001180 B6000EC0 46000A40 \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcMiscTest(audiotests.AudioTests, unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(self.sndfilepath) - - def test_params(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.getfp().name, self.sndfilepath) - self.assertEqual(f.getnchannels(), 2) - self.assertEqual(f.getsampwidth(), 2) - self.assertEqual(f.getframerate(), 48000) - self.assertEqual(f.getnframes(), 14400) - self.assertEqual(f.getcomptype(), b'NONE') - self.assertEqual(f.getcompname(), b'not compressed') - self.assertEqual( - f.getparams(), - (2, 2, 48000, 14400, b'NONE', b'not compressed'), - ) - - def test_read(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.readframes(0), b'') - self.assertEqual(f.tell(), 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - f.rewind() - pos0 = f.tell() - self.assertEqual(pos0, 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - pos2 = f.tell() - self.assertEqual(pos2, 2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - with self.assertRaises(aifc.Error): - f.setpos(-1) - with self.assertRaises(aifc.Error): - f.setpos(f.getnframes() + 1) - - def test_write(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setparams(f.getparams()) - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams(), fout.getparams()) - self.assertEqual(f.readframes(5), fout.readframes(5)) - - def test_compress(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setnchannels(f.getnchannels()) - fout.setsampwidth(f.getsampwidth()) - fout.setframerate(f.getframerate()) - fout.setcomptype(b'ULAW', b'foo') - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - self.assertLess( - os.stat(TESTFN).st_size, - os.stat(self.sndfilepath).st_size*0.75, - ) - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams()[0:3], fout.getparams()[0:3]) - self.assertEqual(fout.getcomptype(), b'ULAW') - self.assertEqual(fout.getcompname(), b'foo') - - def test_close(self): - class Wrapfile(object): - def __init__(self, file): - self.file = open(file, 'rb') - self.closed = False - def close(self): - self.file.close() - self.closed = True - def __getattr__(self, attr): return getattr(self.file, attr) - testfile = Wrapfile(self.sndfilepath) - f = self.f = aifc.open(testfile) - self.assertEqual(testfile.closed, False) - f.close() - self.assertEqual(testfile.closed, True) - testfile = open(TESTFN, 'wb') - fout = aifc.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(aifc.Error): - fout.close() - self.assertTrue(testfile.closed) - fout.close() # do nothing + self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) def test_write_header_comptype_sampwidth(self): for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): @@ -329,10 +375,5 @@ f.close() -def test_main(): - run_unittest(AIFCTest) - run_unittest(AIFCLowLevelTest) - - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -1,70 +1,103 @@ -from test.support import run_unittest, TESTFN +from test.support import TESTFN import unittest -import os - +from test import audiotests +import sys import sunau -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class SunAUTest(unittest.TestCase): +class SunauPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm8.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass +class SunauPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm16.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \ + B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \ + 5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \ + 1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \ + EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \ + E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \ + """) - def test_lin(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('NONE', 'not compressed') - output = b'\xff\x00\x12\xcc' * (nframes * nchannels * sampwidth // 4) - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('NONE', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunauPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm32.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) - def test_ulaw(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('ULAW', '') - # u-law compression is lossy, therefore we can't expect non-zero data - # to come back unchanged. - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('ULAW', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunauULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-ulaw.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'ULAW' + compname = 'CCITT G.711 u-law' + frames = bytes.fromhex("""\ + 022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) -def test_main(): - run_unittest(SunAUTest) - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,66 +1,109 @@ -from test.support import TESTFN, run_unittest -import os +from test.support import TESTFN +import unittest +from test import audiotests import wave -import struct -import unittest -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class TestWave(unittest.TestCase): +class WavePCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm8.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 827F CB80 B184 0088 4B86 C883 3F81 837E 387A 3473 A96B 9A66 \ + 6D64 4662 8E60 6F60 D762 7B68 936F 5877 177B 757C 887B 5F7B \ + 917A BE7B 3C7C E67F 4F84 C389 418E D192 6E97 0296 FF94 0092 \ + C98E D28D 6F8F 4E8F 648C E38A 888A AB8B D18E 0B91 368E C48A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass +class WavePCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm16.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DC0843 CBDF06B2 48AA03F3 BFE701B2 036BFE7C \ + B857FA3E B4B2F34F 2999EBCA 1A5FE6D7 EDFCE491 C626E279 0E05E0B8 EF27E02D \ + 5754E275 FB31E843 1373EF89 D827F72C 978BFB7A F5F7FC11 0866FB9C DF30FB42 \ + 117FFA36 3EE4FB5D BC75FCB6 66D5FF5F CF16040E 43220978 C1BC0EC8 511F12A4 \ + EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ + E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ + """) + frames = audiotests.byteswap2(frames) - def test_it(self, test_rounding=False): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - if test_rounding: - self.f.setframerate(framerate - 0.1) - else: - self.f.setframerate(framerate) - self.f.setnframes(nframes) - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = wave.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual(self.f.readframes(nframes), output) +class WavePCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm24.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + frames = audiotests.byteswap3(frames) - def test_fractional_framerate(self): - """ - Addresses [ 1512791 ] module wave does no rounding - Floating point framerates should be rounded, rather than truncated. - """ - self.test_it(test_rounding=True) - def test_issue7681(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - # Don't call setnframes, make _write_header divide to figure it out - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) +class WavePCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm32.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + frames = audiotests.byteswap4(frames) -def test_main(): - run_unittest(TestWave) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -424,6 +424,9 @@ Tests ----- +- Issue #18919: Unified and extended tests for audio modules: aifc, sunau and + wave. + - Issue #18952: Fix regression in support data downloads introduced when test.support was converted to a package. Regression noticed by Zachary Ware. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 17:14:18 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 17:14:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318919=3A_Unified_and_extended_tests_for_audio_m?= =?utf-8?q?odules=3A_aifc=2C_sunau_and?= Message-ID: <3cyRJV0Rmhz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/fc418ecd8777 changeset: 86306:fc418ecd8777 parent: 86301:500b4b62c19a parent: 86305:ee7563b07c6f user: Serhiy Storchaka date: Sun Oct 13 18:06:45 2013 +0300 summary: Issue #18919: Unified and extended tests for audio modules: aifc, sunau and wave. files: Lib/test/audiodata/pluck-alaw.aifc | Bin Lib/test/audiodata/pluck-pcm16.aiff | Bin Lib/test/audiodata/pluck-pcm16.au | Bin Lib/test/audiodata/pluck-pcm16.wav | Bin Lib/test/audiodata/pluck-pcm24.aiff | Bin Lib/test/audiodata/pluck-pcm24.wav | Bin Lib/test/audiodata/pluck-pcm32.aiff | Bin Lib/test/audiodata/pluck-pcm32.au | Bin Lib/test/audiodata/pluck-pcm32.wav | Bin Lib/test/audiodata/pluck-pcm8.aiff | Bin Lib/test/audiodata/pluck-pcm8.au | Bin Lib/test/audiodata/pluck-pcm8.wav | Bin Lib/test/audiodata/pluck-ulaw.aifc | Bin Lib/test/audiodata/pluck-ulaw.au | Bin Lib/test/audiotests.py | 261 ++++++++++++++ Lib/test/test_aifc.py | 296 ++++++++------- Lib/test/test_sunau.py | 204 ++++------ Lib/test/test_wave.py | 213 +++++------ Misc/NEWS | 6 + 19 files changed, 606 insertions(+), 374 deletions(-) diff --git a/Lib/test/audiodata/pluck-alaw.aifc b/Lib/test/audiodata/pluck-alaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3b7fbd2af75a0a190b0a507ec43afbf8bd2b2267 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.aiff b/Lib/test/audiodata/pluck-pcm16.aiff new file mode 100644 index 0000000000000000000000000000000000000000..6c8c40d14092893a4b4af626f6caf5c8c826017d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au new file mode 100644 index 0000000000000000000000000000000000000000..398f07f071974314161f1f364d005586921eba1d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.wav b/Lib/test/audiodata/pluck-pcm16.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb8627def9fd84ecd4607b122ac744bae1668ecb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.aiff b/Lib/test/audiodata/pluck-pcm24.aiff new file mode 100644 index 0000000000000000000000000000000000000000..8eba145a44d37a837b00428c6e39c6d68e25ac4b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.wav b/Lib/test/audiodata/pluck-pcm24.wav new file mode 100644 index 0000000000000000000000000000000000000000..60d92c32ba3c2ba7cb31fa109ffefbecf8867aaa GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.aiff b/Lib/test/audiodata/pluck-pcm32.aiff new file mode 100644 index 0000000000000000000000000000000000000000..46ac0373f6abbc7454a53b536daa27589857604c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.au b/Lib/test/audiodata/pluck-pcm32.au new file mode 100644 index 0000000000000000000000000000000000000000..92ee5965e40197bd2a086841f37f0d7ca681a03b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.wav b/Lib/test/audiodata/pluck-pcm32.wav new file mode 100644 index 0000000000000000000000000000000000000000..846628bf82f7278697b093db94becb704be2c3d8 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.aiff b/Lib/test/audiodata/pluck-pcm8.aiff new file mode 100644 index 0000000000000000000000000000000000000000..5de4f3b2d879bae0a41710cea4d0b1aad9309124 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au new file mode 100644 index 0000000000000000000000000000000000000000..b7172c8f23475babb68760aae89e394243c38f5c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.wav b/Lib/test/audiodata/pluck-pcm8.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb28cb8aa671050294436b01e5ffd586ae14acbb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.aifc b/Lib/test/audiodata/pluck-ulaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3085cf097fb18a839a3ae5b9a47bd75cdef5f8a5 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.au b/Lib/test/audiodata/pluck-ulaw.au new file mode 100644 index 0000000000000000000000000000000000000000..11103535c6b6a401da742a3c76db68baf2c38ba1 GIT binary patch [stripped] diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py new file mode 100644 --- /dev/null +++ b/Lib/test/audiotests.py @@ -0,0 +1,261 @@ +from test.support import findfile, TESTFN, unlink +import unittest +import array +import io +import pickle +import sys + +def byteswap2(data): + a = array.array('h', data) + a.byteswap() + return a.tobytes() + +def byteswap3(data): + ba = bytearray(data) + ba[::3] = data[2::3] + ba[2::3] = data[::3] + return bytes(ba) + +def byteswap4(data): + a = array.array('i', data) + a.byteswap() + return a.tobytes() + + +class AudioTests: + close_fd = False + + def setUp(self): + self.f = self.fout = None + + def tearDown(self): + if self.f is not None: + self.f.close() + if self.fout is not None: + self.fout.close() + unlink(TESTFN) + + def check_params(self, f, nchannels, sampwidth, framerate, nframes, + comptype, compname): + self.assertEqual(f.getnchannels(), nchannels) + self.assertEqual(f.getsampwidth(), sampwidth) + self.assertEqual(f.getframerate(), framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.getcomptype(), comptype) + self.assertEqual(f.getcompname(), compname) + + params = f.getparams() + self.assertEqual(params, + (nchannels, sampwidth, framerate, nframes, comptype, compname)) + self.assertEqual(params.nchannels, nchannels) + self.assertEqual(params.sampwidth, sampwidth) + self.assertEqual(params.framerate, framerate) + self.assertEqual(params.nframes, nframes) + self.assertEqual(params.comptype, comptype) + self.assertEqual(params.compname, compname) + + dump = pickle.dumps(params) + self.assertEqual(pickle.loads(dump), params) + + +class AudioWriteTests(AudioTests): + + def create_file(self, testfile): + f = self.fout = self.module.open(testfile, 'wb') + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + return f + + def check_file(self, testfile, nframes, frames): + with self.module.open(testfile, 'rb') as f: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.readframes(nframes), frames) + + def test_write_params(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.nframes, self.comptype, self.compname) + f.close() + + def test_write_context_manager_calls_close(self): + # Close checks for a minimum header and will raise an error + # if it is not set, so this proves that close is called. + with self.assertRaises(self.module.Error): + with self.module.open(TESTFN, 'wb'): + pass + with self.assertRaises(self.module.Error): + with open(TESTFN, 'wb') as testfile: + with self.module.open(testfile): + pass + + def test_context_manager_with_open_file(self): + with open(TESTFN, 'wb') as testfile: + with self.module.open(testfile) as f: + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + self.assertEqual(testfile.closed, self.close_fd) + with open(TESTFN, 'rb') as testfile: + with self.module.open(testfile) as f: + self.assertFalse(f.getfp().closed) + params = f.getparams() + self.assertEqual(params.nchannels, self.nchannels) + self.assertEqual(params.sampwidth, self.sampwidth) + self.assertEqual(params.framerate, self.framerate) + if not self.close_fd: + self.assertIsNone(f.getfp()) + self.assertEqual(testfile.closed, self.close_fd) + + def test_context_manager_with_filename(self): + # If the file doesn't get closed, this test won't fail, but it will + # produce a resource leak warning. + with self.module.open(TESTFN, 'wb') as f: + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + with self.module.open(TESTFN) as f: + self.assertFalse(f.getfp().closed) + params = f.getparams() + self.assertEqual(params.nchannels, self.nchannels) + self.assertEqual(params.sampwidth, self.sampwidth) + self.assertEqual(params.framerate, self.framerate) + if not self.close_fd: + self.assertIsNone(f.getfp()) + + def test_write(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + f.close() + + self.check_file(TESTFN, self.nframes, self.frames) + + def test_incompleted_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes + 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_multiple_writes(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes) + framesize = self.nchannels * self.sampwidth + f.writeframes(self.frames[:-framesize]) + f.writeframes(self.frames[-framesize:]) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_overflowed_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes - 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + +class AudioTestsWithSourceFile(AudioTests): + + @classmethod + def setUpClass(cls): + cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata') + + def test_read_params(self): + f = self.f = self.module.open(self.sndfilepath) + #self.assertEqual(f.getfp().name, self.sndfilepath) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.sndfilenframes, self.comptype, self.compname) + + def test_close(self): + testfile = open(self.sndfilepath, 'rb') + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + testfile = open(TESTFN, 'wb') + fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing + + def test_read(self): + framesize = self.nchannels * self.sampwidth + chunk1 = self.frames[:2 * framesize] + chunk2 = self.frames[2 * framesize: 4 * framesize] + f = self.f = self.module.open(self.sndfilepath) + self.assertEqual(f.readframes(0), b'') + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), chunk1) + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), chunk1) + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos0) + self.assertEqual(f.readframes(2), chunk1) + with self.assertRaises(self.module.Error): + f.setpos(-1) + with self.assertRaises(self.module.Error): + f.setpos(f.getnframes() + 1) + + def test_copy(self): + f = self.f = self.module.open(self.sndfilepath) + fout = self.fout = self.module.open(TESTFN, 'wb') + fout.setparams(f.getparams()) + i = 0 + n = f.getnframes() + while n > 0: + i += 1 + fout.writeframes(f.readframes(i)) + n -= i + fout.close() + fout = self.fout = self.module.open(TESTFN, 'rb') + f.rewind() + self.assertEqual(f.getparams(), fout.getparams()) + self.assertEqual(f.readframes(f.getnframes()), + fout.readframes(fout.getnframes())) + + def test_read_not_from_start(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + with open(self.sndfilepath, 'rb') as f: + testfile.write(f.read()) + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + with self.module.open(testfile, 'rb') as f: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), self.sndfilenframes) + self.assertEqual(f.readframes(self.nframes), self.frames) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,57 +1,170 @@ -from test.support import findfile, run_unittest, TESTFN, unlink +from test.support import findfile, TESTFN, unlink import unittest +from test import audiotests import os import io +import sys import struct -import pickle - import aifc -class AIFCTest(unittest.TestCase): +class AifcPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm8.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) + close_fd = True - def setUp(self): - self.f = self.fout = None - self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') - def tearDown(self): - if self.f is not None: - self.f.close() - if self.fout is not None: - try: - self.fout.close() - except (aifc.Error, AttributeError): - pass - unlink(TESTFN) - unlink(TESTFN + '.aiff') +class AifcPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm16.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \ + B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \ + 5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \ + 117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \ + EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \ + E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \ + """) + close_fd = True + +class AifcPCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm24.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + close_fd = True + + +class AifcPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm32.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + close_fd = True + + +class AifcULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-ulaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'ulaw' + compname = b'' + frames = bytes.fromhex("""\ + 022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcALAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-alaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'alaw' + compname = b'' + frames = bytes.fromhex("""\ + 0230FFE8 4A0000F8 310004E0 82000840 CB0006A0 4A0003F0 BE0001A8 0370FE78 \ + BA00FA20 B600F340 2900EB80 1A80E680 ED80E480 C700E280 0E40E080 EF80E080 \ + 5600E280 FB20E880 1380EF80 D900F740 9600FB60 F5C0FC10 0840FBA0 DF00FB20 \ + 1180FA20 3F00FB60 BE00FCB0 6600FF58 CF000420 42000940 C1000EC0 52001280 \ + EE801780 82001680 7E001480 82001280 4A000EC0 52000DC0 EF800F40 CF000FC0 \ + E4800CC0 62000A40 08C00A40 2B000B40 52000E40 8A001180 B6000EC0 46000A40 \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcMiscTest(audiotests.AudioTests, unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(self.sndfilepath) - - def test_params(self): - f = self.f = aifc.open(self.sndfilepath) - params = f.getparams() - self.assertEqual(f.getfp().name, self.sndfilepath) - self.assertEqual(f.getnchannels(), 2) - self.assertEqual(f.getsampwidth(), 2) - self.assertEqual(f.getframerate(), 48000) - self.assertEqual(f.getnframes(), 14400) - self.assertEqual(f.getcomptype(), b'NONE') - self.assertEqual(f.getcompname(), b'not compressed') - self.assertEqual( - f.getparams(), - (2, 2, 48000, 14400, b'NONE', b'not compressed'), - ) - - params = f.getparams() - self.assertEqual(params.nchannels, 2) - self.assertEqual(params.sampwidth, 2) - self.assertEqual(params.framerate, 48000) - self.assertEqual(params.nframes, 14400) - self.assertEqual(params.comptype, b'NONE') - self.assertEqual(params.compname, b'not compressed') + self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) def test_params_added(self): f = self.f = aifc.open(TESTFN, 'wb') @@ -68,102 +181,6 @@ self.assertEqual(params.comptype, f.getcomptype()) self.assertEqual(params.compname, f.getcompname()) - def test_getparams_picklable(self): - self.f = aifc.open(self.sndfilepath) - params = self.f.getparams() - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - self.f.close() - - def test_context_manager(self): - with open(self.sndfilepath, 'rb') as testfile: - with aifc.open(testfile) as f: - pass - self.assertEqual(testfile.closed, True) - with open(TESTFN, 'wb') as testfile: - with self.assertRaises(aifc.Error): - with aifc.open(testfile, 'wb') as fout: - pass - self.assertEqual(testfile.closed, True) - fout.close() # do nothing - - def test_read(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.readframes(0), b'') - self.assertEqual(f.tell(), 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - f.rewind() - pos0 = f.tell() - self.assertEqual(pos0, 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - pos2 = f.tell() - self.assertEqual(pos2, 2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - with self.assertRaises(aifc.Error): - f.setpos(-1) - with self.assertRaises(aifc.Error): - f.setpos(f.getnframes() + 1) - - def test_write(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setparams(f.getparams()) - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams(), fout.getparams()) - self.assertEqual(f.readframes(5), fout.readframes(5)) - - def test_compress(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setnchannels(f.getnchannels()) - fout.setsampwidth(f.getsampwidth()) - fout.setframerate(f.getframerate()) - fout.setcomptype(b'ULAW', b'foo') - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - self.assertLess( - os.stat(TESTFN).st_size, - os.stat(self.sndfilepath).st_size*0.75, - ) - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams()[0:3], fout.getparams()[0:3]) - self.assertEqual(fout.getcomptype(), b'ULAW') - self.assertEqual(fout.getcompname(), b'foo') - - def test_close(self): - class Wrapfile(object): - def __init__(self, file): - self.file = open(file, 'rb') - self.closed = False - def close(self): - self.file.close() - self.closed = True - def __getattr__(self, attr): return getattr(self.file, attr) - testfile = Wrapfile(self.sndfilepath) - f = self.f = aifc.open(testfile) - self.assertEqual(testfile.closed, False) - f.close() - self.assertEqual(testfile.closed, True) - testfile = open(TESTFN, 'wb') - fout = aifc.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(aifc.Error): - fout.close() - self.assertTrue(testfile.closed) - fout.close() # do nothing - def test_write_header_comptype_sampwidth(self): for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): fout = aifc.open(io.BytesIO(), 'wb') @@ -375,10 +392,5 @@ f.close() -def test_main(): - run_unittest(AIFCTest) - run_unittest(AIFCLowLevelTest) - - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -1,128 +1,102 @@ -from test.support import TESTFN, unlink +from test.support import TESTFN import unittest -import pickle -import os - +from test import audiotests +import sys import sunau -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class SunAUTest(unittest.TestCase): +class SunauPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm8.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - unlink(TESTFN) +class SunauPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm16.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \ + B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \ + 5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \ + 1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \ + EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \ + E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \ + """) - def test_lin(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('NONE', 'not compressed') - output = b'\xff\x00\x12\xcc' * (nframes * nchannels * sampwidth // 4) - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('NONE', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunauPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm32.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) - def test_ulaw(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('ULAW', '') - # u-law compression is lossy, therefore we can't expect non-zero data - # to come back unchanged. - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('ULAW', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() - - def test_getparams(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('ULAW', '') - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - - self.f = sunau.open(TESTFN, 'rb') - params = self.f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertEqual(params.nframes, nframes) - self.assertEqual(params.comptype, 'ULAW') - - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - - def test_write_context_manager_calls_close(self): - # Close checks for a minimum header and will raise an error - # if it is not set, so this proves that close is called. - with self.assertRaises(sunau.Error): - with sunau.open(TESTFN, 'wb') as f: - pass - with self.assertRaises(sunau.Error): - with open(TESTFN, 'wb') as testfile: - with sunau.open(testfile): - pass - - def test_context_manager_with_open_file(self): - with open(TESTFN, 'wb') as testfile: - with sunau.open(testfile) as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - self.assertFalse(testfile.closed) - with open(TESTFN, 'rb') as testfile: - with sunau.open(testfile) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params[0], nchannels) - self.assertEqual(params[1], sampwidth) - self.assertEqual(params[2], framerate) - self.assertIsNone(f.getfp()) - self.assertFalse(testfile.closed) - - def test_context_manager_with_filename(self): - # If the file doesn't get closed, this test won't fail, but it will - # produce a resource leak warning. - with sunau.open(TESTFN, 'wb') as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - with sunau.open(TESTFN) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params[0], nchannels) - self.assertEqual(params[1], sampwidth) - self.assertEqual(params[2], framerate) - self.assertIsNone(f.getfp()) +class SunauULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-ulaw.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'ULAW' + compname = 'CCITT G.711 u-law' + frames = bytes.fromhex("""\ + 022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) if __name__ == "__main__": diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,129 +1,108 @@ -from test.support import TESTFN, unlink +from test.support import TESTFN +import unittest +from test import audiotests import wave -import pickle -import unittest -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class TestWave(unittest.TestCase): +class WavePCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm8.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 827F CB80 B184 0088 4B86 C883 3F81 837E 387A 3473 A96B 9A66 \ + 6D64 4662 8E60 6F60 D762 7B68 936F 5877 177B 757C 887B 5F7B \ + 917A BE7B 3C7C E67F 4F84 C389 418E D192 6E97 0296 FF94 0092 \ + C98E D28D 6F8F 4E8F 648C E38A 888A AB8B D18E 0B91 368E C48A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - unlink(TESTFN) +class WavePCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm16.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DC0843 CBDF06B2 48AA03F3 BFE701B2 036BFE7C \ + B857FA3E B4B2F34F 2999EBCA 1A5FE6D7 EDFCE491 C626E279 0E05E0B8 EF27E02D \ + 5754E275 FB31E843 1373EF89 D827F72C 978BFB7A F5F7FC11 0866FB9C DF30FB42 \ + 117FFA36 3EE4FB5D BC75FCB6 66D5FF5F CF16040E 43220978 C1BC0EC8 511F12A4 \ + EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ + E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ + """) + frames = audiotests.byteswap2(frames) - def test_it(self, test_rounding=False): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - if test_rounding: - self.f.setframerate(framerate - 0.1) - else: - self.f.setframerate(framerate) - self.f.setnframes(nframes) - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = wave.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual(self.f.readframes(nframes), output) +class WavePCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm24.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + frames = audiotests.byteswap3(frames) - def test_fractional_framerate(self): - """ - Addresses [ 1512791 ] module wave does no rounding - Floating point framerates should be rounded, rather than truncated. - """ - self.test_it(test_rounding=True) - def test_issue7681(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - # Don't call setnframes, make _write_header divide to figure it out - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - - def test_getparams(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.close() - - self.f = wave.open(TESTFN, 'rb') - params = self.f.getparams() - self.assertEqual(params.nchannels, self.f.getnchannels()) - self.assertEqual(params.nframes, self.f.getnframes()) - self.assertEqual(params.sampwidth, self.f.getsampwidth()) - self.assertEqual(params.framerate, self.f.getframerate()) - self.assertEqual(params.comptype, self.f.getcomptype()) - self.assertEqual(params.compname, self.f.getcompname()) - - def test_getparams_picklable(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.close() - - self.f = wave.open(TESTFN, 'rb') - params = self.f.getparams() - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - - def test_wave_write_context_manager_calls_close(self): - # Close checks for a minimum header and will raise an error - # if it is not set, so this proves that close is called. - with self.assertRaises(wave.Error): - with wave.open(TESTFN, 'wb') as f: - pass - with self.assertRaises(wave.Error): - with open(TESTFN, 'wb') as testfile: - with wave.open(testfile): - pass - - def test_context_manager_with_open_file(self): - with open(TESTFN, 'wb') as testfile: - with wave.open(testfile) as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - self.assertFalse(testfile.closed) - with open(TESTFN, 'rb') as testfile: - with wave.open(testfile) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertIsNone(f.getfp()) - self.assertFalse(testfile.closed) - - def test_context_manager_with_filename(self): - # If the file doesn't get closed, this test won't fail, but it will - # produce a resource leak warning. - with wave.open(TESTFN, 'wb') as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - with wave.open(TESTFN) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertIsNone(f.getfp()) +class WavePCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm32.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + frames = audiotests.byteswap4(frames) if __name__ == '__main__': diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -105,6 +105,12 @@ - Issue #4366: Fix building extensions on all platforms when --enable-shared is used. +Tests +----- + +- Issue #18919: Unified and extended tests for audio modules: aifc, sunau and + wave. + Documentation ------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 17:14:19 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 17:14:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuMyk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3cyRJW5nWxz7Lk7@mail.python.org> http://hg.python.org/cpython/rev/975ae00aa20f changeset: 86307:975ae00aa20f branch: 3.3 parent: 86303:b607ce6c9ee6 parent: 86305:ee7563b07c6f user: Serhiy Storchaka date: Sun Oct 13 18:11:05 2013 +0300 summary: Merge heads files: Lib/test/audiodata/pluck-alaw.aifc | Bin Lib/test/audiodata/pluck-pcm16.aiff | Bin Lib/test/audiodata/pluck-pcm16.au | Bin Lib/test/audiodata/pluck-pcm16.wav | Bin Lib/test/audiodata/pluck-pcm24.aiff | Bin Lib/test/audiodata/pluck-pcm24.wav | Bin Lib/test/audiodata/pluck-pcm32.aiff | Bin Lib/test/audiodata/pluck-pcm32.au | Bin Lib/test/audiodata/pluck-pcm32.wav | Bin Lib/test/audiodata/pluck-pcm8.aiff | Bin Lib/test/audiodata/pluck-pcm8.au | Bin Lib/test/audiodata/pluck-pcm8.wav | Bin Lib/test/audiodata/pluck-ulaw.aifc | Bin Lib/test/audiodata/pluck-ulaw.au | Bin Lib/test/audiotests.py | 214 ++++++++++++ Lib/test/test_aifc.py | 267 +++++++++------ Lib/test/test_sunau.py | 145 +++++--- Lib/test/test_wave.py | 151 +++++--- Misc/NEWS | 3 + 19 files changed, 557 insertions(+), 223 deletions(-) diff --git a/Lib/test/audiodata/pluck-alaw.aifc b/Lib/test/audiodata/pluck-alaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3b7fbd2af75a0a190b0a507ec43afbf8bd2b2267 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.aiff b/Lib/test/audiodata/pluck-pcm16.aiff new file mode 100644 index 0000000000000000000000000000000000000000..6c8c40d14092893a4b4af626f6caf5c8c826017d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au new file mode 100644 index 0000000000000000000000000000000000000000..398f07f071974314161f1f364d005586921eba1d GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm16.wav b/Lib/test/audiodata/pluck-pcm16.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb8627def9fd84ecd4607b122ac744bae1668ecb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.aiff b/Lib/test/audiodata/pluck-pcm24.aiff new file mode 100644 index 0000000000000000000000000000000000000000..8eba145a44d37a837b00428c6e39c6d68e25ac4b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm24.wav b/Lib/test/audiodata/pluck-pcm24.wav new file mode 100644 index 0000000000000000000000000000000000000000..60d92c32ba3c2ba7cb31fa109ffefbecf8867aaa GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.aiff b/Lib/test/audiodata/pluck-pcm32.aiff new file mode 100644 index 0000000000000000000000000000000000000000..46ac0373f6abbc7454a53b536daa27589857604c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.au b/Lib/test/audiodata/pluck-pcm32.au new file mode 100644 index 0000000000000000000000000000000000000000..92ee5965e40197bd2a086841f37f0d7ca681a03b GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm32.wav b/Lib/test/audiodata/pluck-pcm32.wav new file mode 100644 index 0000000000000000000000000000000000000000..846628bf82f7278697b093db94becb704be2c3d8 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.aiff b/Lib/test/audiodata/pluck-pcm8.aiff new file mode 100644 index 0000000000000000000000000000000000000000..5de4f3b2d879bae0a41710cea4d0b1aad9309124 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au new file mode 100644 index 0000000000000000000000000000000000000000..b7172c8f23475babb68760aae89e394243c38f5c GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-pcm8.wav b/Lib/test/audiodata/pluck-pcm8.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb28cb8aa671050294436b01e5ffd586ae14acbb GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.aifc b/Lib/test/audiodata/pluck-ulaw.aifc new file mode 100644 index 0000000000000000000000000000000000000000..3085cf097fb18a839a3ae5b9a47bd75cdef5f8a5 GIT binary patch [stripped] diff --git a/Lib/test/audiodata/pluck-ulaw.au b/Lib/test/audiodata/pluck-ulaw.au new file mode 100644 index 0000000000000000000000000000000000000000..11103535c6b6a401da742a3c76db68baf2c38ba1 GIT binary patch [stripped] diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py new file mode 100644 --- /dev/null +++ b/Lib/test/audiotests.py @@ -0,0 +1,214 @@ +from test.support import findfile, TESTFN, unlink +import unittest +import array +import io +import pickle +import sys + +def byteswap2(data): + a = array.array('h', data) + a.byteswap() + return a.tobytes() + +def byteswap3(data): + ba = bytearray(data) + ba[::3] = data[2::3] + ba[2::3] = data[::3] + return bytes(ba) + +def byteswap4(data): + a = array.array('i', data) + a.byteswap() + return a.tobytes() + + +class AudioTests: + close_fd = False + + def setUp(self): + self.f = self.fout = None + + def tearDown(self): + if self.f is not None: + self.f.close() + if self.fout is not None: + self.fout.close() + unlink(TESTFN) + + def check_params(self, f, nchannels, sampwidth, framerate, nframes, + comptype, compname): + self.assertEqual(f.getnchannels(), nchannels) + self.assertEqual(f.getsampwidth(), sampwidth) + self.assertEqual(f.getframerate(), framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.getcomptype(), comptype) + self.assertEqual(f.getcompname(), compname) + + params = f.getparams() + self.assertEqual(params, + (nchannels, sampwidth, framerate, nframes, comptype, compname)) + + dump = pickle.dumps(params) + self.assertEqual(pickle.loads(dump), params) + + +class AudioWriteTests(AudioTests): + + def create_file(self, testfile): + f = self.fout = self.module.open(testfile, 'wb') + f.setnchannels(self.nchannels) + f.setsampwidth(self.sampwidth) + f.setframerate(self.framerate) + f.setcomptype(self.comptype, self.compname) + return f + + def check_file(self, testfile, nframes, frames): + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.readframes(nframes), frames) + finally: + f.close() + + def test_write_params(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.nframes, self.comptype, self.compname) + f.close() + + def test_write(self): + f = self.create_file(TESTFN) + f.setnframes(self.nframes) + f.writeframes(self.frames) + f.close() + + self.check_file(TESTFN, self.nframes, self.frames) + + def test_incompleted_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes + 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_multiple_writes(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes) + framesize = self.nchannels * self.sampwidth + f.writeframes(self.frames[:-framesize]) + f.writeframes(self.frames[-framesize:]) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + def test_overflowed_write(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile) + f.setnframes(self.nframes - 1) + f.writeframes(self.frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, self.nframes, self.frames) + + +class AudioTestsWithSourceFile(AudioTests): + + @classmethod + def setUpClass(cls): + cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata') + + def test_read_params(self): + f = self.f = self.module.open(self.sndfilepath) + #self.assertEqual(f.getfp().name, self.sndfilepath) + self.check_params(f, self.nchannels, self.sampwidth, self.framerate, + self.sndfilenframes, self.comptype, self.compname) + + def test_close(self): + testfile = open(self.sndfilepath, 'rb') + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + testfile = open(TESTFN, 'wb') + fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing + + def test_read(self): + framesize = self.nchannels * self.sampwidth + chunk1 = self.frames[:2 * framesize] + chunk2 = self.frames[2 * framesize: 4 * framesize] + f = self.f = self.module.open(self.sndfilepath) + self.assertEqual(f.readframes(0), b'') + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), chunk1) + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), chunk1) + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos2) + self.assertEqual(f.readframes(2), chunk2) + f.setpos(pos0) + self.assertEqual(f.readframes(2), chunk1) + with self.assertRaises(self.module.Error): + f.setpos(-1) + with self.assertRaises(self.module.Error): + f.setpos(f.getnframes() + 1) + + def test_copy(self): + f = self.f = self.module.open(self.sndfilepath) + fout = self.fout = self.module.open(TESTFN, 'wb') + fout.setparams(f.getparams()) + i = 0 + n = f.getnframes() + while n > 0: + i += 1 + fout.writeframes(f.readframes(i)) + n -= i + fout.close() + fout = self.fout = self.module.open(TESTFN, 'rb') + f.rewind() + self.assertEqual(f.getparams(), fout.getparams()) + self.assertEqual(f.readframes(f.getnframes()), + fout.readframes(fout.getnframes())) + + def test_read_not_from_start(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + with open(self.sndfilepath, 'rb') as f: + testfile.write(f.read()) + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + f = self.module.open(testfile, 'rb') + try: + self.assertEqual(f.getnchannels(), self.nchannels) + self.assertEqual(f.getsampwidth(), self.sampwidth) + self.assertEqual(f.getframerate(), self.framerate) + self.assertEqual(f.getnframes(), self.sndfilenframes) + self.assertEqual(f.readframes(self.nframes), self.frames) + finally: + f.close() diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,124 +1,170 @@ -from test.support import findfile, run_unittest, TESTFN, unlink +from test.support import findfile, TESTFN, unlink import unittest +from test import audiotests import os import io +import sys import struct - import aifc -class AIFCTest(unittest.TestCase): +class AifcPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm8.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) + close_fd = True - def setUp(self): - self.f = self.fout = None - self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') - def tearDown(self): - if self.f is not None: - self.f.close() - if self.fout is not None: - try: - self.fout.close() - except (aifc.Error, AttributeError): - pass - unlink(TESTFN) - unlink(TESTFN + '.aiff') +class AifcPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm16.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \ + B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \ + 5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \ + 117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \ + EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \ + E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \ + """) + close_fd = True + +class AifcPCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm24.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + close_fd = True + + +class AifcPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-pcm32.aiff' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = b'NONE' + compname = b'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + close_fd = True + + +class AifcULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-ulaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'ulaw' + compname = b'' + frames = bytes.fromhex("""\ + 022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcALAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = aifc + sndfilename = 'pluck-alaw.aifc' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = b'alaw' + compname = b'' + frames = bytes.fromhex("""\ + 0230FFE8 4A0000F8 310004E0 82000840 CB0006A0 4A0003F0 BE0001A8 0370FE78 \ + BA00FA20 B600F340 2900EB80 1A80E680 ED80E480 C700E280 0E40E080 EF80E080 \ + 5600E280 FB20E880 1380EF80 D900F740 9600FB60 F5C0FC10 0840FBA0 DF00FB20 \ + 1180FA20 3F00FB60 BE00FCB0 6600FF58 CF000420 42000940 C1000EC0 52001280 \ + EE801780 82001680 7E001480 82001280 4A000EC0 52000DC0 EF800F40 CF000FC0 \ + E4800CC0 62000A40 08C00A40 2B000B40 52000E40 8A001180 B6000EC0 46000A40 \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + close_fd = True + + +class AifcMiscTest(audiotests.AudioTests, unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(self.sndfilepath) - - def test_params(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.getfp().name, self.sndfilepath) - self.assertEqual(f.getnchannels(), 2) - self.assertEqual(f.getsampwidth(), 2) - self.assertEqual(f.getframerate(), 48000) - self.assertEqual(f.getnframes(), 14400) - self.assertEqual(f.getcomptype(), b'NONE') - self.assertEqual(f.getcompname(), b'not compressed') - self.assertEqual( - f.getparams(), - (2, 2, 48000, 14400, b'NONE', b'not compressed'), - ) - - def test_read(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.readframes(0), b'') - self.assertEqual(f.tell(), 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - f.rewind() - pos0 = f.tell() - self.assertEqual(pos0, 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - pos2 = f.tell() - self.assertEqual(pos2, 2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - with self.assertRaises(aifc.Error): - f.setpos(-1) - with self.assertRaises(aifc.Error): - f.setpos(f.getnframes() + 1) - - def test_write(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setparams(f.getparams()) - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams(), fout.getparams()) - self.assertEqual(f.readframes(5), fout.readframes(5)) - - def test_compress(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setnchannels(f.getnchannels()) - fout.setsampwidth(f.getsampwidth()) - fout.setframerate(f.getframerate()) - fout.setcomptype(b'ULAW', b'foo') - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - self.assertLess( - os.stat(TESTFN).st_size, - os.stat(self.sndfilepath).st_size*0.75, - ) - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams()[0:3], fout.getparams()[0:3]) - self.assertEqual(fout.getcomptype(), b'ULAW') - self.assertEqual(fout.getcompname(), b'foo') - - def test_close(self): - class Wrapfile(object): - def __init__(self, file): - self.file = open(file, 'rb') - self.closed = False - def close(self): - self.file.close() - self.closed = True - def __getattr__(self, attr): return getattr(self.file, attr) - testfile = Wrapfile(self.sndfilepath) - f = self.f = aifc.open(testfile) - self.assertEqual(testfile.closed, False) - f.close() - self.assertEqual(testfile.closed, True) - testfile = open(TESTFN, 'wb') - fout = aifc.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(aifc.Error): - fout.close() - self.assertTrue(testfile.closed) - fout.close() # do nothing + self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) def test_write_header_comptype_sampwidth(self): for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): @@ -329,10 +375,5 @@ f.close() -def test_main(): - run_unittest(AIFCTest) - run_unittest(AIFCLowLevelTest) - - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -1,70 +1,103 @@ -from test.support import run_unittest, TESTFN +from test.support import TESTFN import unittest -import os - +from test import audiotests +import sys import sunau -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class SunAUTest(unittest.TestCase): +class SunauPCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm8.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ + EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ + 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ + 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass +class SunauPCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm16.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \ + B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \ + 5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \ + 1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \ + EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \ + E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \ + """) - def test_lin(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('NONE', 'not compressed') - output = b'\xff\x00\x12\xcc' * (nframes * nchannels * sampwidth // 4) - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('NONE', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunauPCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-pcm32.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) - def test_ulaw(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('ULAW', '') - # u-law compression is lossy, therefore we can't expect non-zero data - # to come back unchanged. - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('ULAW', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunauULAWTest(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = sunau + sndfilename = 'pluck-ulaw.au' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'ULAW' + compname = 'CCITT G.711 u-law' + frames = bytes.fromhex("""\ + 022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ + B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ + 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ + 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \ + EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ + E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ + """) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) -def test_main(): - run_unittest(SunAUTest) - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,66 +1,109 @@ -from test.support import TESTFN, run_unittest -import os +from test.support import TESTFN +import unittest +from test import audiotests import wave -import struct -import unittest -nchannels = 2 -sampwidth = 2 -framerate = 8000 -nframes = 100 -class TestWave(unittest.TestCase): +class WavePCM8Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm8.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 1 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 827F CB80 B184 0088 4B86 C883 3F81 837E 387A 3473 A96B 9A66 \ + 6D64 4662 8E60 6F60 D762 7B68 936F 5877 177B 757C 887B 5F7B \ + 917A BE7B 3C7C E67F 4F84 C389 418E D192 6E97 0296 FF94 0092 \ + C98E D28D 6F8F 4E8F 648C E38A 888A AB8B D18E 0B91 368E C48A \ + """) - def setUp(self): - self.f = None - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass +class WavePCM16Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm16.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 2 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022EFFEA 4B5C00F9 311404EF 80DC0843 CBDF06B2 48AA03F3 BFE701B2 036BFE7C \ + B857FA3E B4B2F34F 2999EBCA 1A5FE6D7 EDFCE491 C626E279 0E05E0B8 EF27E02D \ + 5754E275 FB31E843 1373EF89 D827F72C 978BFB7A F5F7FC11 0866FB9C DF30FB42 \ + 117FFA36 3EE4FB5D BC75FCB6 66D5FF5F CF16040E 43220978 C1BC0EC8 511F12A4 \ + EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ + E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ + """) + frames = audiotests.byteswap2(frames) - def test_it(self, test_rounding=False): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - if test_rounding: - self.f.setframerate(framerate - 0.1) - else: - self.f.setframerate(framerate) - self.f.setnframes(nframes) - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - self.f = wave.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual(self.f.readframes(nframes), output) +class WavePCM24Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm24.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 3 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ + CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ + B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ + EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ + 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ + 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ + 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ + CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ + EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ + 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ + E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ + 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ + """) + frames = audiotests.byteswap3(frames) - def test_fractional_framerate(self): - """ - Addresses [ 1512791 ] module wave does no rounding - Floating point framerates should be rounded, rather than truncated. - """ - self.test_it(test_rounding=True) - def test_issue7681(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - # Don't call setnframes, make _write_header divide to figure it out - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) +class WavePCM32Test(audiotests.AudioWriteTests, + audiotests.AudioTestsWithSourceFile, + unittest.TestCase): + module = wave + sndfilename = 'pluck-pcm32.wav' + sndfilenframes = 3307 + nchannels = 2 + sampwidth = 4 + framerate = 11025 + nframes = 48 + comptype = 'NONE' + compname = 'not compressed' + frames = bytes.fromhex("""\ + 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ + CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ + B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ + EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ + 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ + 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ + 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ + CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ + EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ + 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ + E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ + 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ + """) + frames = audiotests.byteswap4(frames) -def test_main(): - run_unittest(TestWave) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -427,6 +427,9 @@ Tests ----- +- Issue #18919: Unified and extended tests for audio modules: aifc, sunau and + wave. + - Issue #18952: Fix regression in support data downloads introduced when test.support was converted to a package. Regression noticed by Zachary Ware. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 17:14:22 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 17:14:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3cyRJZ0cdDz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/de98b760ca77 changeset: 86308:de98b760ca77 parent: 86306:fc418ecd8777 parent: 86304:32f3d6721c84 user: Serhiy Storchaka date: Sun Oct 13 18:11:11 2013 +0300 summary: Merge heads files: Doc/library/codecs.rst | 19 +++++++++++++++++++ Doc/whatsnew/3.4.rst | 13 +++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 35 insertions(+), 0 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -22,6 +22,25 @@ It defines the following functions: +.. function:: encode(obj, encoding='utf-8', errors='strict') + + Encodes *obj* using the codec registered for *encoding*. + + *Errors* may be given to set the desired error handling scheme. The + default error handler is ``strict`` meaning that encoding errors raise + :exc:`ValueError` (or a more codec specific subclass, such as + :exc:`UnicodeEncodeError`). Refer to :ref:`codec-base-classes` for more + information on codec error handling. + +.. function:: decode(obj, encoding='utf-8', errors='strict') + + Decodes *obj* using the codec registered for *encoding*. + + *Errors* may be given to set the desired error handling scheme. The + default error handler is ``strict`` meaning that decoding errors raise + :exc:`ValueError` (or a more codec specific subclass, such as + :exc:`UnicodeDecodeError`). Refer to :ref:`codec-base-classes` for more + information on codec error handling. .. function:: register(search_function) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -197,6 +197,19 @@ plain tuple. (Contributed by Claudiu Popa in :issue:`17818`.) +codecs +------ + +The :meth:`codecs.encode` and :meth:`codecs.decode` convenience functions are +now properly documented. These functions have existed in the :mod:`codecs` +module since ~2004, but were previously only discoverable through runtime +introspection. + +Unlike the convenience methods on :class:`str`, :class:`bytes` and +:class:`bytearray`, these convenience functions support arbitrary codecs, +rather than being limited to Unicode text encodings. + + colorsys -------- diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,9 @@ Library ------- +- Issue #17827: Add the missing documentation for ``codecs.encode`` and + ``codecs.decode``. + - Issue #19218: Rename collections.abc to _collections_abc in order to speed up interpreter start. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 17:14:28 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 17:14:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3cyRJh5vYmz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/eeed65cb68b0 changeset: 86309:eeed65cb68b0 parent: 86308:de98b760ca77 parent: 86307:975ae00aa20f user: Serhiy Storchaka date: Sun Oct 13 18:12:22 2013 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 17:18:41 2013 From: python-checkins at python.org (kristjan.jonsson) Date: Sun, 13 Oct 2013 17:18:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Catch_a_few_extra_error_ca?= =?utf-8?q?ses_in_marshal=2Ec?= Message-ID: <3cyRPY1fXcz7LjX@mail.python.org> http://hg.python.org/cpython/rev/d6d340549c80 changeset: 86310:d6d340549c80 user: Kristj?n Valur J?nsson date: Sun Oct 13 15:19:56 2013 +0000 summary: Catch a few extra error cases in marshal.c files: Python/marshal.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1297,6 +1297,8 @@ if (name == NULL) goto code_error; firstlineno = (int)r_long(p); + if (firstlineno == -1 && PyErr_Occurred()) + break; lnotab = r_object(p); if (lnotab == NULL) goto code_error; @@ -1326,6 +1328,8 @@ case TYPE_REF: n = r_long(p); if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { + if (n == -1 && PyErr_Occurred()) + break; PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); break; } -- Repository URL: http://hg.python.org/cpython From root at python.org Sun Oct 13 17:40:22 2013 From: root at python.org (Cron Daemon) Date: Sun, 13 Oct 2013 17:40:22 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: error: Connection timed out From python-checkins at python.org Sun Oct 13 18:20:19 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:20:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTk4?= =?utf-8?q?=3A_Improved_cross-references_in_the_cgi_module_documentation?= =?utf-8?q?=2E?= Message-ID: <3cySmg5zj9z7LjW@mail.python.org> http://hg.python.org/cpython/rev/053eb1db0bf8 changeset: 86311:053eb1db0bf8 branch: 2.7 parent: 86302:a9f967c8d002 user: Serhiy Storchaka date: Sun Oct 13 18:27:51 2013 +0300 summary: Issue #19198: Improved cross-references in the cgi module documentation. files: Doc/library/cgi.rst | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -97,7 +97,7 @@ The :class:`FieldStorage` instance can be indexed like a Python dictionary. It allows membership testing with the :keyword:`in` operator, and also supports -the standard dictionary method :meth:`keys` and the built-in function +the standard dictionary method :meth:`~dict.keys` and the built-in function :func:`len`. Form fields containing empty strings are ignored and do not appear in the dictionary; to keep such values, provide a true value for the optional *keep_blank_values* keyword parameter when creating the :class:`FieldStorage` @@ -119,28 +119,29 @@ Here the fields, accessed through ``form[key]``, are themselves instances of :class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form -encoding). The :attr:`value` attribute of the instance yields the string value -of the field. The :meth:`getvalue` method returns this string value directly; -it also accepts an optional second argument as a default to return if the -requested key is not present. +encoding). The :attr:`~FieldStorage.value` attribute of the instance yields +the string value of the field. The :meth:`~FieldStorage.getvalue` method +returns this string value directly; it also accepts an optional second argument +as a default to return if the requested key is not present. If the submitted form data contains more than one field with the same name, the object retrieved by ``form[key]`` is not a :class:`FieldStorage` or :class:`MiniFieldStorage` instance but a list of such instances. Similarly, in this situation, ``form.getvalue(key)`` would return a list of strings. If you expect this possibility (when your HTML form contains multiple fields with the -same name), use the :func:`getlist` function, which always returns a list of -values (so that you do not need to special-case the single item case). For -example, this code concatenates any number of username fields, separated by -commas:: +same name), use the :meth:`~FieldStorage.getlist` method, which always returns +a list of values (so that you do not need to special-case the single item +case). For example, this code concatenates any number of username fields, +separated by commas:: value = form.getlist("username") usernames = ",".join(value) If a field represents an uploaded file, accessing the value via the -:attr:`value` attribute or the :func:`getvalue` method reads the entire file in -memory as a string. This may not be what you want. You can test for an uploaded -file by testing either the :attr:`filename` attribute or the :attr:`!file` +:attr:`~FieldStorage.value` attribute or the :func:`~FieldStorage.getvalue` +method reads the entire file in memory as a string. This may not be what you +want. You can test for an uploaded file by testing either the +:attr:`~FieldStorage.filename` attribute or the :attr:`~FieldStorage.file` attribute. You can then read the data at leisure from the :attr:`!file` attribute:: @@ -155,8 +156,8 @@ If an error is encountered when obtaining the contents of an uploaded file (for example, when the user interrupts the form submission by clicking on -a Back or Cancel button) the :attr:`done` attribute of the object for the -field will be set to the value -1. +a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the +object for the field will be set to the value -1. The file upload draft standard entertains the possibility of uploading multiple files from one field (using a recursive :mimetype:`multipart/\*` encoding). @@ -225,8 +226,8 @@ code which checks whether the obtained value is a single value or a list of values. That's annoying and leads to less readable scripts. -A more convenient approach is to use the methods :meth:`getfirst` and -:meth:`getlist` provided by this higher level interface. +A more convenient approach is to use the methods :meth:`~FieldStorage.getfirst` +and :meth:`~FieldStorage.getlist` provided by this higher level interface. .. method:: FieldStorage.getfirst(name[, default]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:20:21 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:20:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTk4?= =?utf-8?q?=3A_Improved_cross-references_in_the_cgi_module_documentation?= =?utf-8?q?=2E?= Message-ID: <3cySmj2xjxz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/e52e259d42e8 changeset: 86312:e52e259d42e8 branch: 3.3 parent: 86307:975ae00aa20f user: Serhiy Storchaka date: Sun Oct 13 18:28:26 2013 +0300 summary: Issue #19198: Improved cross-references in the cgi module documentation. files: Doc/library/cgi.rst | 36 +++++++++++++++++--------------- 1 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -97,7 +97,7 @@ The :class:`FieldStorage` instance can be indexed like a Python dictionary. It allows membership testing with the :keyword:`in` operator, and also supports -the standard dictionary method :meth:`keys` and the built-in function +the standard dictionary method :meth:`~dict.keys` and the built-in function :func:`len`. Form fields containing empty strings are ignored and do not appear in the dictionary; to keep such values, provide a true value for the optional *keep_blank_values* keyword parameter when creating the :class:`FieldStorage` @@ -119,30 +119,32 @@ Here the fields, accessed through ``form[key]``, are themselves instances of :class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form -encoding). The :attr:`value` attribute of the instance yields the string value -of the field. The :meth:`getvalue` method returns this string value directly; -it also accepts an optional second argument as a default to return if the -requested key is not present. +encoding). The :attr:`~FieldStorage.value` attribute of the instance yields +the string value of the field. The :meth:`~FieldStorage.getvalue` method +returns this string value directly; it also accepts an optional second argument +as a default to return if the requested key is not present. If the submitted form data contains more than one field with the same name, the object retrieved by ``form[key]`` is not a :class:`FieldStorage` or :class:`MiniFieldStorage` instance but a list of such instances. Similarly, in this situation, ``form.getvalue(key)`` would return a list of strings. If you expect this possibility (when your HTML form contains multiple fields with the -same name), use the :func:`getlist` function, which always returns a list of -values (so that you do not need to special-case the single item case). For -example, this code concatenates any number of username fields, separated by -commas:: +same name), use the :meth:`~FieldStorage.getlist` method, which always returns +a list of values (so that you do not need to special-case the single item +case). For example, this code concatenates any number of username fields, +separated by commas:: value = form.getlist("username") usernames = ",".join(value) If a field represents an uploaded file, accessing the value via the -:attr:`value` attribute or the :func:`getvalue` method reads the entire file in -memory as bytes. This may not be what you want. You can test for an uploaded -file by testing either the :attr:`filename` attribute or the :attr:`!file` +:attr:`~FieldStorage.value` attribute or the :meth:`~FieldStorage.getvalue` +method reads the entire file in memory as bytes. This may not be what you +want. You can test for an uploaded file by testing either the +:attr:`~FieldStorage.filename` attribute or the :attr:`~FieldStorage.file` attribute. You can then read the data at leisure from the :attr:`!file` -attribute (the :func:`read` and :func:`readline` methods will return bytes):: +attribute (the :func:`~io.RawIOBase.read` and :func:`~io.IOBase.readline` +methods will return bytes):: fileitem = form["userfile"] if fileitem.file: @@ -155,8 +157,8 @@ If an error is encountered when obtaining the contents of an uploaded file (for example, when the user interrupts the form submission by clicking on -a Back or Cancel button) the :attr:`done` attribute of the object for the -field will be set to the value -1. +a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the +object for the field will be set to the value -1. The file upload draft standard entertains the possibility of uploading multiple files from one field (using a recursive :mimetype:`multipart/\*` encoding). @@ -223,8 +225,8 @@ code which checks whether the obtained value is a single value or a list of values. That's annoying and leads to less readable scripts. -A more convenient approach is to use the methods :meth:`getfirst` and -:meth:`getlist` provided by this higher level interface. +A more convenient approach is to use the methods :meth:`~FieldStorage.getfirst` +and :meth:`~FieldStorage.getlist` provided by this higher level interface. .. method:: FieldStorage.getfirst(name, default=None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:20:22 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:20:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319198=3A_Improved_cross-references_in_the_cgi_m?= =?utf-8?q?odule_documentation=2E?= Message-ID: <3cySmk6vnGz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/781deb421ad0 changeset: 86313:781deb421ad0 parent: 86309:eeed65cb68b0 parent: 86312:e52e259d42e8 user: Serhiy Storchaka date: Sun Oct 13 18:29:08 2013 +0300 summary: Issue #19198: Improved cross-references in the cgi module documentation. files: Doc/library/cgi.rst | 36 +++++++++++++++++--------------- 1 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -97,7 +97,7 @@ The :class:`FieldStorage` instance can be indexed like a Python dictionary. It allows membership testing with the :keyword:`in` operator, and also supports -the standard dictionary method :meth:`keys` and the built-in function +the standard dictionary method :meth:`~dict.keys` and the built-in function :func:`len`. Form fields containing empty strings are ignored and do not appear in the dictionary; to keep such values, provide a true value for the optional *keep_blank_values* keyword parameter when creating the :class:`FieldStorage` @@ -119,30 +119,32 @@ Here the fields, accessed through ``form[key]``, are themselves instances of :class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form -encoding). The :attr:`value` attribute of the instance yields the string value -of the field. The :meth:`getvalue` method returns this string value directly; -it also accepts an optional second argument as a default to return if the -requested key is not present. +encoding). The :attr:`~FieldStorage.value` attribute of the instance yields +the string value of the field. The :meth:`~FieldStorage.getvalue` method +returns this string value directly; it also accepts an optional second argument +as a default to return if the requested key is not present. If the submitted form data contains more than one field with the same name, the object retrieved by ``form[key]`` is not a :class:`FieldStorage` or :class:`MiniFieldStorage` instance but a list of such instances. Similarly, in this situation, ``form.getvalue(key)`` would return a list of strings. If you expect this possibility (when your HTML form contains multiple fields with the -same name), use the :func:`getlist` function, which always returns a list of -values (so that you do not need to special-case the single item case). For -example, this code concatenates any number of username fields, separated by -commas:: +same name), use the :meth:`~FieldStorage.getlist` method, which always returns +a list of values (so that you do not need to special-case the single item +case). For example, this code concatenates any number of username fields, +separated by commas:: value = form.getlist("username") usernames = ",".join(value) If a field represents an uploaded file, accessing the value via the -:attr:`value` attribute or the :func:`getvalue` method reads the entire file in -memory as bytes. This may not be what you want. You can test for an uploaded -file by testing either the :attr:`filename` attribute or the :attr:`!file` +:attr:`~FieldStorage.value` attribute or the :meth:`~FieldStorage.getvalue` +method reads the entire file in memory as bytes. This may not be what you +want. You can test for an uploaded file by testing either the +:attr:`~FieldStorage.filename` attribute or the :attr:`~FieldStorage.file` attribute. You can then read the data at leisure from the :attr:`!file` -attribute (the :func:`read` and :func:`readline` methods will return bytes):: +attribute (the :func:`~io.RawIOBase.read` and :func:`~io.IOBase.readline` +methods will return bytes):: fileitem = form["userfile"] if fileitem.file: @@ -155,8 +157,8 @@ If an error is encountered when obtaining the contents of an uploaded file (for example, when the user interrupts the form submission by clicking on -a Back or Cancel button) the :attr:`done` attribute of the object for the -field will be set to the value -1. +a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the +object for the field will be set to the value -1. The file upload draft standard entertains the possibility of uploading multiple files from one field (using a recursive :mimetype:`multipart/\*` encoding). @@ -223,8 +225,8 @@ code which checks whether the obtained value is a single value or a list of values. That's annoying and leads to less readable scripts. -A more convenient approach is to use the methods :meth:`getfirst` and -:meth:`getlist` provided by this higher level interface. +A more convenient approach is to use the methods :meth:`~FieldStorage.getfirst` +and :meth:`~FieldStorage.getlist` provided by this higher level interface. .. method:: FieldStorage.getfirst(name, default=None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:20:24 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:20:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MjAz?= =?utf-8?q?=3A_Improved_cross-references_in_the_curses_howto=2E?= Message-ID: <3cySmm3mj7z7Lk3@mail.python.org> http://hg.python.org/cpython/rev/54d422f5a5c6 changeset: 86314:54d422f5a5c6 branch: 3.3 parent: 86312:e52e259d42e8 user: Serhiy Storchaka date: Sun Oct 13 18:51:59 2013 +0300 summary: Issue #19203: Improved cross-references in the curses howto. files: Doc/howto/curses.rst | 44 +++++++++++++++++-------------- 1 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -122,8 +122,9 @@ stdscr.keypad(False) curses.echo() -to reverse the curses-friendly terminal settings. Then call the :func:`endwin` -function to restore the terminal to its original operating mode. :: +to reverse the curses-friendly terminal settings. Then call the +:func:`~curses.endwin` function to restore the terminal to its original +operating mode. :: curses.endwin() @@ -152,7 +153,7 @@ wrapper(main) -The :func:`wrapper` function takes a callable object and does the +The :func:`~curses.wrapper` function takes a callable object and does the initializations described above, also initializing colors if color support is present. :func:`wrapper` then runs your provided callable. Once the callable returns, :func:`wrapper` will restore the original @@ -170,7 +171,7 @@ rectangular area of the screen, and supports methods to display text, erase it, allow the user to input strings, and so forth. -The ``stdscr`` object returned by the :func:`initscr` function is a +The ``stdscr`` object returned by the :func:`~curses.initscr` function is a window object that covers the entire screen. Many programs may need only this single window, but you might wish to divide the screen into smaller windows, in order to redraw or clear them separately. The @@ -267,14 +268,14 @@ :c:func:`addstr` displays a string at the current cursor location in the ``stdscr`` window, while :c:func:`mvaddstr` moves to a given y,x coordinate first before displaying the string. :c:func:`waddstr` is just -like :func:`addstr`, but allows specifying a window to use instead of +like :c:func:`addstr`, but allows specifying a window to use instead of using ``stdscr`` by default. :c:func:`mvwaddstr` allows specifying both a window and a coordinate. Fortunately the Python interface hides all these details. ``stdscr`` -is a window object like any other, and methods such as :meth:`addstr` -accept multiple argument forms. Usually there are four different -forms. +is a window object like any other, and methods such as +:meth:`~curses.window.addstr` accept multiple argument forms. Usually there +are four different forms. +---------------------------------+-----------------------------------------------+ | Form | Description | @@ -325,7 +326,7 @@ If your application doesn't need a blinking cursor at all, you can call ``curs_set(False)`` to make it invisible. For compatibility with older curses versions, there's a ``leaveok(bool)`` function -that's a synonym for :func:`curs_set`. When *bool* is true, the +that's a synonym for :func:`~curses.curs_set`. When *bool* is true, the curses library will attempt to suppress the flashing cursor, and you won't need to worry about leaving it in odd locations. @@ -372,10 +373,11 @@ most common such terminal is probably the Linux console, followed by color xterms. -To use color, you must call the :func:`start_color` function soon after calling -:func:`initscr`, to initialize the default color set (the -:func:`curses.wrapper` function does this automatically). Once that's -done, the :func:`has_colors` function returns TRUE if the terminal in use can +To use color, you must call the :func:`~curses.start_color` function soon +after calling :func:`~curses.initscr`, to initialize the default color set +(the :func:`curses.wrapper` function does this automatically). Once that's +done, the :func:`~curses.has_colors` function returns TRUE if the terminal +in use can actually display color. (Note: curses uses the American spelling 'color', instead of the Canadian/British spelling 'colour'. If you're used to the British spelling, you'll have to resign yourself to misspelling it for the sake @@ -383,9 +385,10 @@ The curses library maintains a finite number of color pairs, containing a foreground (or text) color and a background color. You can get the attribute -value corresponding to a color pair with the :func:`color_pair` function; this -can be bitwise-OR'ed with other attributes such as :const:`A_REVERSE`, but -again, such combinations are not guaranteed to work on all terminals. +value corresponding to a color pair with the :func:`~curses.color_pair` +function; this can be bitwise-OR'ed with other attributes such as +:const:`A_REVERSE`, but again, such combinations are not guaranteed to work +on all terminals. An example, which displays a line of text using color pair 1:: @@ -418,9 +421,10 @@ RGB value. This lets you change color 1, which is usually red, to purple or blue or any other color you like. Unfortunately, the Linux console doesn't support this, so I'm unable to try it out, and can't provide any examples. You -can check if your terminal can do this by calling :func:`can_change_color`, -which returns True if the capability is there. If you're lucky enough to have -such a talented terminal, consult your system's man pages for more information. +can check if your terminal can do this by calling +:func:`~curses.can_change_color`, which returns True if the capability is +there. If you're lucky enough to have such a talented terminal, consult your +system's man pages for more information. User Input @@ -434,7 +438,7 @@ There are two methods for getting input from a window: * :meth:`~curses.window.getch` refreshes the screen and then waits for - the user to hit a key, displaying the key if :func:`echo` has been + the user to hit a key, displaying the key if :func:`~curses.echo` has been called earlier. You can optionally specify a coordinate to which the cursor should be moved before pausing. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:20:25 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:20:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3cySmn6mhwz7LkS@mail.python.org> http://hg.python.org/cpython/rev/85d9ec7ed389 changeset: 86315:85d9ec7ed389 parent: 86313:781deb421ad0 parent: 86310:d6d340549c80 user: Serhiy Storchaka date: Sun Oct 13 19:17:46 2013 +0300 summary: Merge heads files: Python/marshal.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1297,6 +1297,8 @@ if (name == NULL) goto code_error; firstlineno = (int)r_long(p); + if (firstlineno == -1 && PyErr_Occurred()) + break; lnotab = r_object(p); if (lnotab == NULL) goto code_error; @@ -1326,6 +1328,8 @@ case TYPE_REF: n = r_long(p); if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { + if (n == -1 && PyErr_Occurred()) + break; PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); break; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:25:08 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 18:25:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319203=3A_Improved_cross-references_in_the_curse?= =?utf-8?q?s_howto=2E?= Message-ID: <3cyStD0NdJz7LjS@mail.python.org> http://hg.python.org/cpython/rev/542f96b913ac changeset: 86316:542f96b913ac parent: 86315:85d9ec7ed389 parent: 86314:54d422f5a5c6 user: Serhiy Storchaka date: Sun Oct 13 19:24:30 2013 +0300 summary: Issue #19203: Improved cross-references in the curses howto. files: Doc/howto/curses.rst | 44 +++++++++++++++++-------------- 1 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -122,8 +122,9 @@ stdscr.keypad(False) curses.echo() -to reverse the curses-friendly terminal settings. Then call the :func:`endwin` -function to restore the terminal to its original operating mode. :: +to reverse the curses-friendly terminal settings. Then call the +:func:`~curses.endwin` function to restore the terminal to its original +operating mode. :: curses.endwin() @@ -152,7 +153,7 @@ wrapper(main) -The :func:`wrapper` function takes a callable object and does the +The :func:`~curses.wrapper` function takes a callable object and does the initializations described above, also initializing colors if color support is present. :func:`wrapper` then runs your provided callable. Once the callable returns, :func:`wrapper` will restore the original @@ -170,7 +171,7 @@ rectangular area of the screen, and supports methods to display text, erase it, allow the user to input strings, and so forth. -The ``stdscr`` object returned by the :func:`initscr` function is a +The ``stdscr`` object returned by the :func:`~curses.initscr` function is a window object that covers the entire screen. Many programs may need only this single window, but you might wish to divide the screen into smaller windows, in order to redraw or clear them separately. The @@ -267,14 +268,14 @@ :c:func:`addstr` displays a string at the current cursor location in the ``stdscr`` window, while :c:func:`mvaddstr` moves to a given y,x coordinate first before displaying the string. :c:func:`waddstr` is just -like :func:`addstr`, but allows specifying a window to use instead of +like :c:func:`addstr`, but allows specifying a window to use instead of using ``stdscr`` by default. :c:func:`mvwaddstr` allows specifying both a window and a coordinate. Fortunately the Python interface hides all these details. ``stdscr`` -is a window object like any other, and methods such as :meth:`addstr` -accept multiple argument forms. Usually there are four different -forms. +is a window object like any other, and methods such as +:meth:`~curses.window.addstr` accept multiple argument forms. Usually there +are four different forms. +---------------------------------+-----------------------------------------------+ | Form | Description | @@ -325,7 +326,7 @@ If your application doesn't need a blinking cursor at all, you can call ``curs_set(False)`` to make it invisible. For compatibility with older curses versions, there's a ``leaveok(bool)`` function -that's a synonym for :func:`curs_set`. When *bool* is true, the +that's a synonym for :func:`~curses.curs_set`. When *bool* is true, the curses library will attempt to suppress the flashing cursor, and you won't need to worry about leaving it in odd locations. @@ -372,10 +373,11 @@ most common such terminal is probably the Linux console, followed by color xterms. -To use color, you must call the :func:`start_color` function soon after calling -:func:`initscr`, to initialize the default color set (the -:func:`curses.wrapper` function does this automatically). Once that's -done, the :func:`has_colors` function returns TRUE if the terminal in use can +To use color, you must call the :func:`~curses.start_color` function soon +after calling :func:`~curses.initscr`, to initialize the default color set +(the :func:`curses.wrapper` function does this automatically). Once that's +done, the :func:`~curses.has_colors` function returns TRUE if the terminal +in use can actually display color. (Note: curses uses the American spelling 'color', instead of the Canadian/British spelling 'colour'. If you're used to the British spelling, you'll have to resign yourself to misspelling it for the sake @@ -383,9 +385,10 @@ The curses library maintains a finite number of color pairs, containing a foreground (or text) color and a background color. You can get the attribute -value corresponding to a color pair with the :func:`color_pair` function; this -can be bitwise-OR'ed with other attributes such as :const:`A_REVERSE`, but -again, such combinations are not guaranteed to work on all terminals. +value corresponding to a color pair with the :func:`~curses.color_pair` +function; this can be bitwise-OR'ed with other attributes such as +:const:`A_REVERSE`, but again, such combinations are not guaranteed to work +on all terminals. An example, which displays a line of text using color pair 1:: @@ -418,9 +421,10 @@ RGB value. This lets you change color 1, which is usually red, to purple or blue or any other color you like. Unfortunately, the Linux console doesn't support this, so I'm unable to try it out, and can't provide any examples. You -can check if your terminal can do this by calling :func:`can_change_color`, -which returns True if the capability is there. If you're lucky enough to have -such a talented terminal, consult your system's man pages for more information. +can check if your terminal can do this by calling +:func:`~curses.can_change_color`, which returns True if the capability is +there. If you're lucky enough to have such a talented terminal, consult your +system's man pages for more information. User Input @@ -434,7 +438,7 @@ There are two methods for getting input from a window: * :meth:`~curses.window.getch` refreshes the screen and then waits for - the user to hit a key, displaying the key if :func:`echo` has been + the user to hit a key, displaying the key if :func:`~curses.echo` has been called earlier. You can optionally specify a coordinate to which the cursor should be moved before pausing. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:27:38 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 18:27:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Refer_to_strft?= =?utf-8?q?ime=283=29_manpage_for_platform_specific_format_codes=2E?= Message-ID: <3cySx65zZkz7LjS@mail.python.org> http://hg.python.org/cpython/rev/d513149e0c19 changeset: 86317:d513149e0c19 branch: 2.7 parent: 86311:053eb1db0bf8 user: Georg Brandl date: Sun Oct 13 18:28:25 2013 +0200 summary: Refer to strftime(3) manpage for platform specific format codes. Suggested by Skip Montanaro on docs at . files: Doc/library/datetime.rst | 3 ++- Doc/library/time.rst | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1603,7 +1603,8 @@ The full set of format codes supported varies across platforms, because Python calls the platform C library's :func:`strftime` function, and platform -variations are common. +variations are common. To see the full set of format codes supported on your +platform, consult the :manpage:`strftime(3)` documentation. The following is a list of all the format codes that the C standard (1989 version) requires, and these work on all platforms with a standard C diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -350,8 +350,10 @@ >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) 'Thu, 28 Jun 2001 14:17:15 +0000' - Additional directives may be supported on certain platforms, but only the ones - listed here have a meaning standardized by ANSI C. + Additional directives may be supported on certain platforms, but only the + ones listed here have a meaning standardized by ANSI C. To see the full set + of format codes supported on your platform, consult the :manpage:`strftime(3)` + documentation. On some platforms, an optional field width and precision specification can immediately follow the initial ``'%'`` of a directive in the following order; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:38:12 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 18:38:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Refer_to_strft?= =?utf-8?q?ime=283=29_manpage_for_platform_specific_format_codes=2E?= Message-ID: <3cyT9J2g8pz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/23b6f485e59c changeset: 86318:23b6f485e59c branch: 3.3 parent: 86314:54d422f5a5c6 user: Georg Brandl date: Sun Oct 13 18:28:25 2013 +0200 summary: Refer to strftime(3) manpage for platform specific format codes. Suggested by Skip Montanaro on docs at . files: Doc/library/datetime.rst | 3 ++- Doc/library/time.rst | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1782,7 +1782,8 @@ The full set of format codes supported varies across platforms, because Python calls the platform C library's :func:`strftime` function, and platform -variations are common. +variations are common. To see the full set of format codes supported on your +platform, consult the :manpage:`strftime(3)` documentation. The following is a list of all the format codes that the C standard (1989 version) requires, and these work on all platforms with a standard C diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -471,8 +471,10 @@ >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) 'Thu, 28 Jun 2001 14:17:15 +0000' - Additional directives may be supported on certain platforms, but only the ones - listed here have a meaning standardized by ANSI C. + Additional directives may be supported on certain platforms, but only the + ones listed here have a meaning standardized by ANSI C. To see the full set + of format codes supported on your platform, consult the :manpage:`strftime(3)` + documentation. On some platforms, an optional field width and precision specification can immediately follow the initial ``'%'`` of a directive in the following order; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 18:38:13 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 18:38:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyT9K4Stbz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/e566e20083b8 changeset: 86319:e566e20083b8 parent: 86316:542f96b913ac parent: 86318:23b6f485e59c user: Georg Brandl date: Sun Oct 13 18:38:53 2013 +0200 summary: merge with 3.3 files: Doc/library/datetime.rst | 3 ++- Doc/library/time.rst | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1784,7 +1784,8 @@ The full set of format codes supported varies across platforms, because Python calls the platform C library's :func:`strftime` function, and platform -variations are common. +variations are common. To see the full set of format codes supported on your +platform, consult the :manpage:`strftime(3)` documentation. The following is a list of all the format codes that the C standard (1989 version) requires, and these work on all platforms with a standard C diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -471,8 +471,10 @@ >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) 'Thu, 28 Jun 2001 14:17:15 +0000' - Additional directives may be supported on certain platforms, but only the ones - listed here have a meaning standardized by ANSI C. + Additional directives may be supported on certain platforms, but only the + ones listed here have a meaning standardized by ANSI C. To see the full set + of format codes supported on your platform, consult the :manpage:`strftime(3)` + documentation. On some platforms, an optional field width and precision specification can immediately follow the initial ``'%'`` of a directive in the following order; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:08:17 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 19:08:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSW1wcm92ZSAjMTky?= =?utf-8?q?04=3A_Improved_cross-references_in_the_urllib_package_documenta?= =?utf-8?q?tion=2E?= Message-ID: <3cyTr13tj4z7LjP@mail.python.org> http://hg.python.org/cpython/rev/3901ff1e6547 changeset: 86320:3901ff1e6547 branch: 3.3 parent: 86318:23b6f485e59c user: Serhiy Storchaka date: Sun Oct 13 20:06:50 2013 +0300 summary: Improve #19204: Improved cross-references in the urllib package documentation. files: Doc/library/urllib.error.rst | 8 ++- Doc/library/urllib.parse.rst | 4 +- Doc/library/urllib.request.rst | 41 +++++++++++---------- Doc/library/urllib.rst | 2 + 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst --- a/Doc/library/urllib.error.rst +++ b/Doc/library/urllib.error.rst @@ -31,8 +31,9 @@ Though being an exception (a subclass of :exc:`URLError`), an :exc:`HTTPError` can also function as a non-exceptional file-like return - value (the same thing that :func:`urlopen` returns). This is useful when - handling exotic HTTP errors, such as requests for authentication. + value (the same thing that :func:`~urllib.request.urlopen` returns). This + is useful when handling exotic HTTP errors, such as requests for + authentication. .. attribute:: code @@ -47,7 +48,8 @@ .. exception:: ContentTooShortError(msg, content) - This exception is raised when the :func:`urlretrieve` function detects that + This exception is raised when the :func:`~urllib.request.urlretrieve` + function detects that the amount of the downloaded data is less than the expected amount (given by the *Content-Length* header). The :attr:`content` attribute stores the downloaded (and supposedly truncated) data. diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -518,8 +518,8 @@ Convert a mapping object or a sequence of two-element tuples, which may either be a :class:`str` or a :class:`bytes`, to a "percent-encoded" string. If the resultant string is to be used as a *data* for POST - operation with :func:`urlopen` function, then it should be properly encoded - to bytes, otherwise it would result in a :exc:`TypeError`. + operation with :func:`~urllib.request.urlopen` function, then it should be + properly encoded to bytes, otherwise it would result in a :exc:`TypeError`. The resulting string is a series of ``key=value`` pairs separated by ``'&'`` characters, where both *key* and *value* are quoted using :func:`quote_plus` diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -81,7 +81,7 @@ * :meth:`~urllib.response.addinfourl.getcode` -- return the HTTP status code of the response. - Raises :exc:`URLError` on errors. + Raises :exc:`~urllib.error.URLError` on errors. Note that ``None`` may be returned if no handler handles the request (though the default installed global :class:`OpenerDirector` uses @@ -144,14 +144,14 @@ Convert the pathname *path* from the local syntax for a path to the form used in the path component of a URL. This does not produce a complete URL. The return - value will already be quoted using the :func:`quote` function. + value will already be quoted using the :func:`~urllib.parse.quote` function. .. function:: url2pathname(path) Convert the path component *path* from a percent-encoded URL to the local syntax for a - path. This does not accept a complete URL. This function uses :func:`unquote` - to decode *path*. + path. This does not accept a complete URL. This function uses + :func:`~urllib.parse.unquote` to decode *path*. .. function:: getproxies() @@ -240,7 +240,7 @@ .. class:: HTTPDefaultErrorHandler() A class which defines a default handler for HTTP error responses; all responses - are turned into :exc:`HTTPError` exceptions. + are turned into :exc:`~urllib.error.HTTPError` exceptions. .. class:: HTTPRedirectHandler() @@ -614,8 +614,8 @@ #. Handlers with a method named like :meth:`protocol_open` are called to handle the request. This stage ends when a handler either returns a non-\ :const:`None` - value (ie. a response), or raises an exception (usually :exc:`URLError`). - Exceptions are allowed to propagate. + value (ie. a response), or raises an exception (usually + :exc:`~urllib.error.URLError`). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named :meth:`default_open`. If all such methods return :const:`None`, the algorithm @@ -674,8 +674,9 @@ This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. - It should raise :exc:`URLError`, unless a truly exceptional thing happens (for - example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). + It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional + thing happens (for example, :exc:`MemoryError` should not be mapped to + :exc:`URLError`). This method will be called before any protocol-specific open method. @@ -761,8 +762,8 @@ .. note:: Some HTTP redirections require action from this module's client code. If this - is the case, :exc:`HTTPError` is raised. See :rfc:`2616` for details of the - precise meanings of the various redirection codes. + is the case, :exc:`~urllib.error.HTTPError` is raised. See :rfc:`2616` for + details of the precise meanings of the various redirection codes. An :class:`HTTPError` exception raised as a security consideration if the HTTPRedirectHandler is presented with a redirected url which is not an HTTP, @@ -775,9 +776,9 @@ by the default implementations of the :meth:`http_error_30\*` methods when a redirection is received from the server. If a redirection should take place, return a new :class:`Request` to allow :meth:`http_error_30\*` to perform the - redirect to *newurl*. Otherwise, raise :exc:`HTTPError` if no other handler - should try to handle this URL, or return ``None`` if you can't but another - handler might. + redirect to *newurl*. Otherwise, raise :exc:`~urllib.error.HTTPError` if + no other handler should try to handle this URL, or return ``None`` if you + can't but another handler might. .. note:: @@ -979,7 +980,7 @@ .. versionchanged:: 3.2 This method is applicable only for local hostnames. When a remote - hostname is given, an :exc:`URLError` is raised. + hostname is given, an :exc:`~urllib.error.URLError` is raised. .. _ftp-handler-objects: @@ -1021,7 +1022,7 @@ .. method:: UnknownHandler.unknown_open() - Raise a :exc:`URLError` exception. + Raise a :exc:`~urllib.error.URLError` exception. .. _http-error-processor-objects: @@ -1038,7 +1039,7 @@ For non-200 error codes, this simply passes the job on to the :meth:`protocol_error_code` handler methods, via :meth:`OpenerDirector.error`. Eventually, :class:`HTTPDefaultErrorHandler` will raise an - :exc:`HTTPError` if no other handler handles the error. + :exc:`~urllib.error.HTTPError` if no other handler handles the error. .. method:: HTTPErrorProcessor.https_response() @@ -1251,7 +1252,7 @@ argument may be given to specify a ``POST`` request (normally the request type is ``GET``). The *data* argument must be a bytes object in standard :mimetype:`application/x-www-form-urlencoded` format; see the - :func:`urlencode` function below. + :func:`urllib.parse.urlencode` function. :func:`urlretrieve` will raise :exc:`ContentTooShortError` when it detects that the amount of data available was less than the expected amount (which is the @@ -1333,8 +1334,8 @@ If the *url* uses the :file:`http:` scheme identifier, the optional *data* argument may be given to specify a ``POST`` request (normally the request type is ``GET``). The *data* argument must in standard - :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urlencode` - function below. + :mimetype:`application/x-www-form-urlencoded` format; see the + :func:`urllib.parse.urlencode` function. .. attribute:: version diff --git a/Doc/library/urllib.rst b/Doc/library/urllib.rst --- a/Doc/library/urllib.rst +++ b/Doc/library/urllib.rst @@ -1,6 +1,8 @@ :mod:`urllib` --- URL handling modules ====================================== +.. module:: urllib + ``urllib`` is a package that collects several modules for working with URLs: * :mod:`urllib.request` for opening and reading URLs -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:08:18 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 19:08:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Improve_=2319204=3A_Improved_cross-references_in_the_url?= =?utf-8?q?lib_package_documentation=2E?= Message-ID: <3cyTr272Y4z7LjW@mail.python.org> http://hg.python.org/cpython/rev/b5bd28d39cf3 changeset: 86321:b5bd28d39cf3 parent: 86319:e566e20083b8 parent: 86320:3901ff1e6547 user: Serhiy Storchaka date: Sun Oct 13 20:07:51 2013 +0300 summary: Improve #19204: Improved cross-references in the urllib package documentation. files: Doc/library/urllib.error.rst | 8 ++- Doc/library/urllib.parse.rst | 4 +- Doc/library/urllib.request.rst | 41 +++++++++++---------- Doc/library/urllib.rst | 2 + 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst --- a/Doc/library/urllib.error.rst +++ b/Doc/library/urllib.error.rst @@ -31,8 +31,9 @@ Though being an exception (a subclass of :exc:`URLError`), an :exc:`HTTPError` can also function as a non-exceptional file-like return - value (the same thing that :func:`urlopen` returns). This is useful when - handling exotic HTTP errors, such as requests for authentication. + value (the same thing that :func:`~urllib.request.urlopen` returns). This + is useful when handling exotic HTTP errors, such as requests for + authentication. .. attribute:: code @@ -54,7 +55,8 @@ .. exception:: ContentTooShortError(msg, content) - This exception is raised when the :func:`urlretrieve` function detects that + This exception is raised when the :func:`~urllib.request.urlretrieve` + function detects that the amount of the downloaded data is less than the expected amount (given by the *Content-Length* header). The :attr:`content` attribute stores the downloaded (and supposedly truncated) data. diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -518,8 +518,8 @@ Convert a mapping object or a sequence of two-element tuples, which may either be a :class:`str` or a :class:`bytes`, to a "percent-encoded" string. If the resultant string is to be used as a *data* for POST - operation with :func:`urlopen` function, then it should be properly encoded - to bytes, otherwise it would result in a :exc:`TypeError`. + operation with :func:`~urllib.request.urlopen` function, then it should be + properly encoded to bytes, otherwise it would result in a :exc:`TypeError`. The resulting string is a series of ``key=value`` pairs separated by ``'&'`` characters, where both *key* and *value* are quoted using :func:`quote_plus` diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -81,7 +81,7 @@ * :meth:`~urllib.response.addinfourl.getcode` -- return the HTTP status code of the response. - Raises :exc:`URLError` on errors. + Raises :exc:`~urllib.error.URLError` on errors. Note that ``None`` may be returned if no handler handles the request (though the default installed global :class:`OpenerDirector` uses @@ -144,14 +144,14 @@ Convert the pathname *path* from the local syntax for a path to the form used in the path component of a URL. This does not produce a complete URL. The return - value will already be quoted using the :func:`quote` function. + value will already be quoted using the :func:`~urllib.parse.quote` function. .. function:: url2pathname(path) Convert the path component *path* from a percent-encoded URL to the local syntax for a - path. This does not accept a complete URL. This function uses :func:`unquote` - to decode *path*. + path. This does not accept a complete URL. This function uses + :func:`~urllib.parse.unquote` to decode *path*. .. function:: getproxies() @@ -245,7 +245,7 @@ .. class:: HTTPDefaultErrorHandler() A class which defines a default handler for HTTP error responses; all responses - are turned into :exc:`HTTPError` exceptions. + are turned into :exc:`~urllib.error.HTTPError` exceptions. .. class:: HTTPRedirectHandler() @@ -582,8 +582,8 @@ #. Handlers with a method named like :meth:`protocol_open` are called to handle the request. This stage ends when a handler either returns a non-\ :const:`None` - value (ie. a response), or raises an exception (usually :exc:`URLError`). - Exceptions are allowed to propagate. + value (ie. a response), or raises an exception (usually + :exc:`~urllib.error.URLError`). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named :meth:`default_open`. If all such methods return :const:`None`, the algorithm @@ -642,8 +642,9 @@ This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. - It should raise :exc:`URLError`, unless a truly exceptional thing happens (for - example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). + It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional + thing happens (for example, :exc:`MemoryError` should not be mapped to + :exc:`URLError`). This method will be called before any protocol-specific open method. @@ -729,8 +730,8 @@ .. note:: Some HTTP redirections require action from this module's client code. If this - is the case, :exc:`HTTPError` is raised. See :rfc:`2616` for details of the - precise meanings of the various redirection codes. + is the case, :exc:`~urllib.error.HTTPError` is raised. See :rfc:`2616` for + details of the precise meanings of the various redirection codes. An :class:`HTTPError` exception raised as a security consideration if the HTTPRedirectHandler is presented with a redirected url which is not an HTTP, @@ -743,9 +744,9 @@ by the default implementations of the :meth:`http_error_30\*` methods when a redirection is received from the server. If a redirection should take place, return a new :class:`Request` to allow :meth:`http_error_30\*` to perform the - redirect to *newurl*. Otherwise, raise :exc:`HTTPError` if no other handler - should try to handle this URL, or return ``None`` if you can't but another - handler might. + redirect to *newurl*. Otherwise, raise :exc:`~urllib.error.HTTPError` if + no other handler should try to handle this URL, or return ``None`` if you + can't but another handler might. .. note:: @@ -947,7 +948,7 @@ .. versionchanged:: 3.2 This method is applicable only for local hostnames. When a remote - hostname is given, an :exc:`URLError` is raised. + hostname is given, an :exc:`~urllib.error.URLError` is raised. .. _data-handler-objects: @@ -1004,7 +1005,7 @@ .. method:: UnknownHandler.unknown_open() - Raise a :exc:`URLError` exception. + Raise a :exc:`~urllib.error.URLError` exception. .. _http-error-processor-objects: @@ -1021,7 +1022,7 @@ For non-200 error codes, this simply passes the job on to the :meth:`protocol_error_code` handler methods, via :meth:`OpenerDirector.error`. Eventually, :class:`HTTPDefaultErrorHandler` will raise an - :exc:`HTTPError` if no other handler handles the error. + :exc:`~urllib.error.HTTPError` if no other handler handles the error. .. method:: HTTPErrorProcessor.https_response() @@ -1234,7 +1235,7 @@ argument may be given to specify a ``POST`` request (normally the request type is ``GET``). The *data* argument must be a bytes object in standard :mimetype:`application/x-www-form-urlencoded` format; see the - :func:`urlencode` function below. + :func:`urllib.parse.urlencode` function. :func:`urlretrieve` will raise :exc:`ContentTooShortError` when it detects that the amount of data available was less than the expected amount (which is the @@ -1316,8 +1317,8 @@ If the *url* uses the :file:`http:` scheme identifier, the optional *data* argument may be given to specify a ``POST`` request (normally the request type is ``GET``). The *data* argument must in standard - :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urlencode` - function below. + :mimetype:`application/x-www-form-urlencoded` format; see the + :func:`urllib.parse.urlencode` function. .. attribute:: version diff --git a/Doc/library/urllib.rst b/Doc/library/urllib.rst --- a/Doc/library/urllib.rst +++ b/Doc/library/urllib.rst @@ -1,6 +1,8 @@ :mod:`urllib` --- URL handling modules ====================================== +.. module:: urllib + ``urllib`` is a package that collects several modules for working with URLs: * :mod:`urllib.request` for opening and reading URLs -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:14:33 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 19:14:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MjA3?= =?utf-8?q?=3A_Improved_cross-references_in_the_os=2C_os=2Epath=2C_and_pos?= =?utf-8?q?ix_modules?= Message-ID: <3cyTzF3H2Cz7LkM@mail.python.org> http://hg.python.org/cpython/rev/7ea984fc9be1 changeset: 86322:7ea984fc9be1 branch: 3.3 parent: 86320:3901ff1e6547 user: Serhiy Storchaka date: Sun Oct 13 20:12:43 2013 +0300 summary: Issue #19207: Improved cross-references in the os, os.path, and posix modules documentation. files: Doc/library/os.path.rst | 6 +- Doc/library/os.rst | 57 ++++++++++++++-------------- Doc/library/posix.rst | 9 ++-- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -273,9 +273,9 @@ .. function:: samestat(stat1, stat2) Return ``True`` if the stat tuples *stat1* and *stat2* refer to the same file. - These structures may have been returned by :func:`fstat`, :func:`lstat`, or - :func:`stat`. This function implements the underlying comparison used by - :func:`samefile` and :func:`sameopenfile`. + These structures may have been returned by :func:`os.fstat`, + :func:`os.lstat`, or :func:`os.stat`. This function implements the + underlying comparison used by :func:`samefile` and :func:`sameopenfile`. Availability: Unix. diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -643,7 +643,7 @@ is slightly deceptive; on Unix platforms, sockets and pipes are also referenced by file descriptors. -The :meth:`~file.fileno` method can be used to obtain the file descriptor +The :meth:`~io.IOBase.fileno` method can be used to obtain the file descriptor associated with a :term:`file object` when required. Note that using the file descriptor directly will bypass the file object methods, ignoring aspects such as internal buffering of data. @@ -660,7 +660,7 @@ This function is intended for low-level I/O and must be applied to a file descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, use its :meth:`~file.close` method. + :func:`fdopen`, use its :meth:`~io.IOBase.close` method. .. function:: closerange(fd_low, fd_high) @@ -821,7 +821,7 @@ Set the current position of file descriptor *fd* to position *pos*, modified by *how*: :const:`SEEK_SET` or ``0`` to set the position relative to the beginning of the file; :const:`SEEK_CUR` or ``1`` to set it relative to the - current position; :const:`os.SEEK_END` or ``2`` to set it relative to the end of + current position; :const:`SEEK_END` or ``2`` to set it relative to the end of the file. Return the new cursor position in bytes, starting from the beginning. Availability: Unix, Windows. @@ -1938,7 +1938,7 @@ .. data:: supports_dir_fd - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of their *dir_fd* parameter. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For consistency's sakes, functions that support @@ -1960,7 +1960,7 @@ .. data:: supports_effective_ids - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of the *effective_ids* parameter for :func:`os.access`. If the local platform supports it, the collection will contain :func:`os.access`, otherwise it will be empty. @@ -1978,7 +1978,7 @@ .. data:: supports_fd - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit specifying their *path* parameter as an open file descriptor. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For @@ -1999,7 +1999,7 @@ .. data:: supports_follow_symlinks - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of their *follow_symlinks* parameter. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For consistency's sakes, functions that @@ -2348,7 +2348,7 @@ These functions may be used to create and manage processes. -The various :func:`exec\*` functions take a list of arguments for the new +The various :func:`exec\* ` functions take a list of arguments for the new program loaded into the process. In each case, the first of these arguments is passed to the new program as its own name rather than as an argument a user may have typed on a command line. For the C programmer, this is the ``argv[0]`` @@ -2386,9 +2386,9 @@ descriptors are not flushed, so if there may be data buffered on these open files, you should flush them using :func:`sys.stdout.flush` or :func:`os.fsync` before calling an - :func:`exec\*` function. - - The "l" and "v" variants of the :func:`exec\*` functions differ in how + :func:`exec\* ` function. + + The "l" and "v" variants of the :func:`exec\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the :func:`execl\*` @@ -2400,7 +2400,7 @@ The variants which include a "p" near the end (:func:`execlp`, :func:`execlpe`, :func:`execvp`, and :func:`execvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`exec\*e` variants, + environment is being replaced (using one of the :func:`exec\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`execl`, :func:`execle`, :func:`execv`, and :func:`execve`, will not use the :envvar:`PATH` variable to @@ -2646,7 +2646,6 @@ .. function:: popen(...) - :noindex: Run child processes, returning opened pipes for communications. These functions are described in section :ref:`os-newstreams`. @@ -2674,7 +2673,7 @@ process. On Windows, the process id will actually be the process handle, so can be used with the :func:`waitpid` function. - The "l" and "v" variants of the :func:`spawn\*` functions differ in how + The "l" and "v" variants of the :func:`spawn\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the @@ -2686,7 +2685,7 @@ The variants which include a second "p" near the end (:func:`spawnlp`, :func:`spawnlpe`, :func:`spawnvp`, and :func:`spawnvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`spawn\*e` variants, + environment is being replaced (using one of the :func:`spawn\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`spawnl`, :func:`spawnle`, :func:`spawnv`, and :func:`spawnve`, will not use the @@ -2720,7 +2719,7 @@ .. data:: P_NOWAIT P_NOWAITO - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. If either of these values is given, the :func:`spawn\*` functions will return as soon as the new process has been created, with the process id as the return value. @@ -2730,7 +2729,7 @@ .. data:: P_WAIT - Possible value for the *mode* parameter to the :func:`spawn\*` family of + Possible value for the *mode* parameter to the :func:`spawn\* ` family of functions. If this is given as *mode*, the :func:`spawn\*` functions will not return until the new process has run to completion and will return the exit code of the process the run is successful, or ``-signal`` if a signal kills the @@ -2742,11 +2741,11 @@ .. data:: P_DETACH P_OVERLAY - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. These are less portable than those listed above. :const:`P_DETACH` is similar to :const:`P_NOWAIT`, but the new process is detached from the console of the calling process. If :const:`P_OVERLAY` is used, the current - process will be replaced; the :func:`spawn\*` function will not return. + process will be replaced; the :func:`spawn\* ` function will not return. Availability: Windows. @@ -2918,8 +2917,8 @@ (shifting makes cross-platform use of the function easier). A *pid* less than or equal to ``0`` has no special meaning on Windows, and raises an exception. The value of integer *options* has no effect. *pid* can refer to any process whose - id is known, not necessarily a child process. The :func:`spawn` functions called - with :const:`P_NOWAIT` return suitable process handles. + id is known, not necessarily a child process. The :func:`spawn\* ` + functions called with :const:`P_NOWAIT` return suitable process handles. .. function:: wait3(options) @@ -2927,8 +2926,9 @@ Similar to :func:`waitpid`, except no process id argument is given and a 3-element tuple containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ - :func:`getrusage` for details on resource usage information. The option - argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :func:`~resource.getrusage` for details on resource usage information. The + option argument is the same as that provided to :func:`waitpid` and + :func:`wait4`. Availability: Unix. @@ -2937,9 +2937,9 @@ Similar to :func:`waitpid`, except a 3-element tuple, containing the child's process id, exit status indication, and resource usage information is returned. - Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage - information. The arguments to :func:`wait4` are the same as those provided to - :func:`waitpid`. + Refer to :mod:`resource`.\ :func:`~resource.getrusage` for details on + resource usage information. The arguments to :func:`wait4` are the same + as those provided to :func:`waitpid`. Availability: Unix. @@ -3272,8 +3272,9 @@ .. data:: defpath - The default search path used by :func:`exec\*p\*` and :func:`spawn\*p\*` if the - environment doesn't have a ``'PATH'`` key. Also available via :mod:`os.path`. + The default search path used by :func:`exec\*p\* ` and + :func:`spawn\*p\* ` if the environment doesn't have a ``'PATH'`` + key. Also available via :mod:`os.path`. .. data:: linesep diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -19,7 +19,7 @@ available through the :mod:`os` interface. Once :mod:`os` is imported, there is *no* performance penalty in using it instead of :mod:`posix`. In addition, :mod:`os` provides some additional functionality, such as automatically calling -:func:`putenv` when an entry in ``os.environ`` is changed. +:func:`~os.putenv` when an entry in ``os.environ`` is changed. Errors are reported as exceptions; the usual exceptions are given for type errors, while errors reported by the system calls raise :exc:`OSError`. @@ -74,9 +74,10 @@ pathname of your home directory, equivalent to ``getenv("HOME")`` in C. Modifying this dictionary does not affect the string environment passed on by - :func:`execv`, :func:`popen` or :func:`system`; if you need to change the - environment, pass ``environ`` to :func:`execve` or add variable assignments and - export statements to the command string for :func:`system` or :func:`popen`. + :func:`~os.execv`, :func:`~os.popen` or :func:`~os.system`; if you need to + change the environment, pass ``environ`` to :func:`~os.execve` or add + variable assignments and export statements to the command string for + :func:`~os.system` or :func:`~os.popen`. .. versionchanged:: 3.2 On Unix, keys and values are bytes. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:14:34 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 19:14:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319207=3A_Improved_cross-references_in_the_os=2C?= =?utf-8?q?_os=2Epath=2C_and_posix_modules?= Message-ID: <3cyTzG6Wybz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/74c3cf05fb1e changeset: 86323:74c3cf05fb1e parent: 86321:b5bd28d39cf3 parent: 86322:7ea984fc9be1 user: Serhiy Storchaka date: Sun Oct 13 20:13:37 2013 +0300 summary: Issue #19207: Improved cross-references in the os, os.path, and posix modules documentation. files: Doc/library/os.path.rst | 6 +- Doc/library/os.rst | 59 ++++++++++++++-------------- Doc/library/posix.rst | 9 ++- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -271,9 +271,9 @@ .. function:: samestat(stat1, stat2) Return ``True`` if the stat tuples *stat1* and *stat2* refer to the same file. - These structures may have been returned by :func:`fstat`, :func:`lstat`, or - :func:`stat`. This function implements the underlying comparison used by - :func:`samefile` and :func:`sameopenfile`. + These structures may have been returned by :func:`os.fstat`, + :func:`os.lstat`, or :func:`os.stat`. This function implements the + underlying comparison used by :func:`samefile` and :func:`sameopenfile`. Availability: Unix, Windows. diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -643,7 +643,7 @@ is slightly deceptive; on Unix platforms, sockets and pipes are also referenced by file descriptors. -The :meth:`~file.fileno` method can be used to obtain the file descriptor +The :meth:`~io.IOBase.fileno` method can be used to obtain the file descriptor associated with a :term:`file object` when required. Note that using the file descriptor directly will bypass the file object methods, ignoring aspects such as internal buffering of data. @@ -660,7 +660,7 @@ This function is intended for low-level I/O and must be applied to a file descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, use its :meth:`~file.close` method. + :func:`fdopen`, use its :meth:`~io.IOBase.close` method. .. function:: closerange(fd_low, fd_high) @@ -834,7 +834,7 @@ Set the current position of file descriptor *fd* to position *pos*, modified by *how*: :const:`SEEK_SET` or ``0`` to set the position relative to the beginning of the file; :const:`SEEK_CUR` or ``1`` to set it relative to the - current position; :const:`os.SEEK_END` or ``2`` to set it relative to the end of + current position; :const:`SEEK_END` or ``2`` to set it relative to the end of the file. Return the new cursor position in bytes, starting from the beginning. Availability: Unix, Windows. @@ -1217,7 +1217,7 @@ On Windows, non-inheritable handles and file descriptors are closed in child processes, except for standard streams (file descriptors 0, 1 and 2: stdin, stdout -and stderr), which are always inherited. Using :func:`os.spawn*` functions, +and stderr), which are always inherited. Using :func:`spawn\* ` functions, all inheritable handles and all inheritable file descriptors are inherited. Using the :mod:`subprocess` module, all file descriptors except standard streams are closed, and inheritable handles are only inherited if the @@ -1993,7 +1993,7 @@ .. data:: supports_dir_fd - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of their *dir_fd* parameter. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For consistency's sakes, functions that support @@ -2015,7 +2015,7 @@ .. data:: supports_effective_ids - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of the *effective_ids* parameter for :func:`os.access`. If the local platform supports it, the collection will contain :func:`os.access`, otherwise it will be empty. @@ -2033,7 +2033,7 @@ .. data:: supports_fd - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit specifying their *path* parameter as an open file descriptor. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For @@ -2054,7 +2054,7 @@ .. data:: supports_follow_symlinks - A :class:`~collections.Set` object indicating which functions in the + A :class:`~collections.abc.Set` object indicating which functions in the :mod:`os` module permit use of their *follow_symlinks* parameter. Different platforms provide different functionality, and an option that might work on one might be unsupported on another. For consistency's sakes, functions that @@ -2403,7 +2403,7 @@ These functions may be used to create and manage processes. -The various :func:`exec\*` functions take a list of arguments for the new +The various :func:`exec\* ` functions take a list of arguments for the new program loaded into the process. In each case, the first of these arguments is passed to the new program as its own name rather than as an argument a user may have typed on a command line. For the C programmer, this is the ``argv[0]`` @@ -2441,9 +2441,9 @@ descriptors are not flushed, so if there may be data buffered on these open files, you should flush them using :func:`sys.stdout.flush` or :func:`os.fsync` before calling an - :func:`exec\*` function. - - The "l" and "v" variants of the :func:`exec\*` functions differ in how + :func:`exec\* ` function. + + The "l" and "v" variants of the :func:`exec\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the :func:`execl\*` @@ -2455,7 +2455,7 @@ The variants which include a "p" near the end (:func:`execlp`, :func:`execlpe`, :func:`execvp`, and :func:`execvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`exec\*e` variants, + environment is being replaced (using one of the :func:`exec\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`execl`, :func:`execle`, :func:`execv`, and :func:`execve`, will not use the :envvar:`PATH` variable to @@ -2701,7 +2701,6 @@ .. function:: popen(...) - :noindex: Run child processes, returning opened pipes for communications. These functions are described in section :ref:`os-newstreams`. @@ -2729,7 +2728,7 @@ process. On Windows, the process id will actually be the process handle, so can be used with the :func:`waitpid` function. - The "l" and "v" variants of the :func:`spawn\*` functions differ in how + The "l" and "v" variants of the :func:`spawn\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the @@ -2741,7 +2740,7 @@ The variants which include a second "p" near the end (:func:`spawnlp`, :func:`spawnlpe`, :func:`spawnvp`, and :func:`spawnvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`spawn\*e` variants, + environment is being replaced (using one of the :func:`spawn\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`spawnl`, :func:`spawnle`, :func:`spawnv`, and :func:`spawnve`, will not use the @@ -2775,7 +2774,7 @@ .. data:: P_NOWAIT P_NOWAITO - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. If either of these values is given, the :func:`spawn\*` functions will return as soon as the new process has been created, with the process id as the return value. @@ -2785,7 +2784,7 @@ .. data:: P_WAIT - Possible value for the *mode* parameter to the :func:`spawn\*` family of + Possible value for the *mode* parameter to the :func:`spawn\* ` family of functions. If this is given as *mode*, the :func:`spawn\*` functions will not return until the new process has run to completion and will return the exit code of the process the run is successful, or ``-signal`` if a signal kills the @@ -2797,11 +2796,11 @@ .. data:: P_DETACH P_OVERLAY - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. These are less portable than those listed above. :const:`P_DETACH` is similar to :const:`P_NOWAIT`, but the new process is detached from the console of the calling process. If :const:`P_OVERLAY` is used, the current - process will be replaced; the :func:`spawn\*` function will not return. + process will be replaced; the :func:`spawn\* ` function will not return. Availability: Windows. @@ -2973,8 +2972,8 @@ (shifting makes cross-platform use of the function easier). A *pid* less than or equal to ``0`` has no special meaning on Windows, and raises an exception. The value of integer *options* has no effect. *pid* can refer to any process whose - id is known, not necessarily a child process. The :func:`spawn` functions called - with :const:`P_NOWAIT` return suitable process handles. + id is known, not necessarily a child process. The :func:`spawn\* ` + functions called with :const:`P_NOWAIT` return suitable process handles. .. function:: wait3(options) @@ -2982,8 +2981,9 @@ Similar to :func:`waitpid`, except no process id argument is given and a 3-element tuple containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ - :func:`getrusage` for details on resource usage information. The option - argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :func:`~resource.getrusage` for details on resource usage information. The + option argument is the same as that provided to :func:`waitpid` and + :func:`wait4`. Availability: Unix. @@ -2992,9 +2992,9 @@ Similar to :func:`waitpid`, except a 3-element tuple, containing the child's process id, exit status indication, and resource usage information is returned. - Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage - information. The arguments to :func:`wait4` are the same as those provided to - :func:`waitpid`. + Refer to :mod:`resource`.\ :func:`~resource.getrusage` for details on + resource usage information. The arguments to :func:`wait4` are the same + as those provided to :func:`waitpid`. Availability: Unix. @@ -3330,8 +3330,9 @@ .. data:: defpath - The default search path used by :func:`exec\*p\*` and :func:`spawn\*p\*` if the - environment doesn't have a ``'PATH'`` key. Also available via :mod:`os.path`. + The default search path used by :func:`exec\*p\* ` and + :func:`spawn\*p\* ` if the environment doesn't have a ``'PATH'`` + key. Also available via :mod:`os.path`. .. data:: linesep diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -19,7 +19,7 @@ available through the :mod:`os` interface. Once :mod:`os` is imported, there is *no* performance penalty in using it instead of :mod:`posix`. In addition, :mod:`os` provides some additional functionality, such as automatically calling -:func:`putenv` when an entry in ``os.environ`` is changed. +:func:`~os.putenv` when an entry in ``os.environ`` is changed. Errors are reported as exceptions; the usual exceptions are given for type errors, while errors reported by the system calls raise :exc:`OSError`. @@ -74,9 +74,10 @@ pathname of your home directory, equivalent to ``getenv("HOME")`` in C. Modifying this dictionary does not affect the string environment passed on by - :func:`execv`, :func:`popen` or :func:`system`; if you need to change the - environment, pass ``environ`` to :func:`execve` or add variable assignments and - export statements to the command string for :func:`system` or :func:`popen`. + :func:`~os.execv`, :func:`~os.popen` or :func:`~os.system`; if you need to + change the environment, pass ``environ`` to :func:`~os.execve` or add + variable assignments and export statements to the command string for + :func:`~os.system` or :func:`~os.popen`. .. versionchanged:: 3.2 On Unix, keys and values are bytes. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:26:21 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 19:26:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MjA3?= =?utf-8?q?=3A_Improved_cross-references_in_the_os=2C_os=2Epath=2C_and_pos?= =?utf-8?q?ix_modules?= Message-ID: <3cyVDs1X65z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/fd2c34e0104b changeset: 86324:fd2c34e0104b branch: 2.7 parent: 86317:d513149e0c19 user: Serhiy Storchaka date: Sun Oct 13 20:25:30 2013 +0300 summary: Issue #19207: Improved cross-references in the os, os.path, and posix modules documentation. files: Doc/library/os.path.rst | 6 +- Doc/library/os.rst | 44 +++++++++++++++------------- Doc/library/posix.rst | 9 +++-- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -267,9 +267,9 @@ .. function:: samestat(stat1, stat2) Return ``True`` if the stat tuples *stat1* and *stat2* refer to the same file. - These structures may have been returned by :func:`fstat`, :func:`lstat`, or - :func:`stat`. This function implements the underlying comparison used by - :func:`samefile` and :func:`sameopenfile`. + These structures may have been returned by :func:`os.fstat`, + :func:`os.lstat`, or :func:`os.stat`. This function implements the + underlying comparison used by :func:`samefile` and :func:`sameopenfile`. Availability: Unix. diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -615,7 +615,7 @@ This function is intended for low-level I/O and must be applied to a file descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, use its :meth:`~file.close` method. + :func:`fdopen`, use its :meth:`~io.IOBase.close` method. .. function:: closerange(fd_low, fd_high) @@ -743,7 +743,7 @@ Set the current position of file descriptor *fd* to position *pos*, modified by *how*: :const:`SEEK_SET` or ``0`` to set the position relative to the beginning of the file; :const:`SEEK_CUR` or ``1`` to set it relative to the - current position; :const:`os.SEEK_END` or ``2`` to set it relative to the end of + current position; :const:`SEEK_END` or ``2`` to set it relative to the end of the file. Availability: Unix, Windows. @@ -1676,7 +1676,7 @@ These functions may be used to create and manage processes. -The various :func:`exec\*` functions take a list of arguments for the new +The various :func:`exec\* ` functions take a list of arguments for the new program loaded into the process. In each case, the first of these arguments is passed to the new program as its own name rather than as an argument a user may have typed on a command line. For the C programmer, this is the ``argv[0]`` @@ -1714,9 +1714,9 @@ descriptors are not flushed, so if there may be data buffered on these open files, you should flush them using :func:`sys.stdout.flush` or :func:`os.fsync` before calling an - :func:`exec\*` function. - - The "l" and "v" variants of the :func:`exec\*` functions differ in how + :func:`exec\* ` function. + + The "l" and "v" variants of the :func:`exec\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the :func:`execl\*` @@ -1728,7 +1728,7 @@ The variants which include a "p" near the end (:func:`execlp`, :func:`execlpe`, :func:`execvp`, and :func:`execvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`exec\*e` variants, + environment is being replaced (using one of the :func:`exec\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`execl`, :func:`execle`, :func:`execv`, and :func:`execve`, will not use the :envvar:`PATH` variable to @@ -2030,7 +2030,7 @@ process. On Windows, the process id will actually be the process handle, so can be used with the :func:`waitpid` function. - The "l" and "v" variants of the :func:`spawn\*` functions differ in how + The "l" and "v" variants of the :func:`spawn\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the @@ -2042,7 +2042,7 @@ The variants which include a second "p" near the end (:func:`spawnlp`, :func:`spawnlpe`, :func:`spawnvp`, and :func:`spawnvpe`) will use the :envvar:`PATH` environment variable to locate the program *file*. When the - environment is being replaced (using one of the :func:`spawn\*e` variants, + environment is being replaced (using one of the :func:`spawn\*e ` variants, discussed in the next paragraph), the new environment is used as the source of the :envvar:`PATH` variable. The other variants, :func:`spawnl`, :func:`spawnle`, :func:`spawnv`, and :func:`spawnve`, will not use the @@ -2078,7 +2078,7 @@ .. data:: P_NOWAIT P_NOWAITO - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. If either of these values is given, the :func:`spawn\*` functions will return as soon as the new process has been created, with the process id as the return value. @@ -2090,7 +2090,7 @@ .. data:: P_WAIT - Possible value for the *mode* parameter to the :func:`spawn\*` family of + Possible value for the *mode* parameter to the :func:`spawn\* ` family of functions. If this is given as *mode*, the :func:`spawn\*` functions will not return until the new process has run to completion and will return the exit code of the process the run is successful, or ``-signal`` if a signal kills the @@ -2104,7 +2104,7 @@ .. data:: P_DETACH P_OVERLAY - Possible values for the *mode* parameter to the :func:`spawn\*` family of + Possible values for the *mode* parameter to the :func:`spawn\* ` family of functions. These are less portable than those listed above. :const:`P_DETACH` is similar to :const:`P_NOWAIT`, but the new process is detached from the console of the calling process. If :const:`P_OVERLAY` is used, the current @@ -2220,8 +2220,8 @@ (shifting makes cross-platform use of the function easier). A *pid* less than or equal to ``0`` has no special meaning on Windows, and raises an exception. The value of integer *options* has no effect. *pid* can refer to any process whose - id is known, not necessarily a child process. The :func:`spawn` functions called - with :const:`P_NOWAIT` return suitable process handles. + id is known, not necessarily a child process. The :func:`spawn\* ` + functions called with :const:`P_NOWAIT` return suitable process handles. .. function:: wait3(options) @@ -2229,8 +2229,9 @@ Similar to :func:`waitpid`, except no process id argument is given and a 3-element tuple containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ - :func:`getrusage` for details on resource usage information. The option - argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :func:`~resource.getrusage` for details on resource usage information. The + option argument is the same as that provided to :func:`waitpid` and + :func:`wait4`. Availability: Unix. @@ -2241,9 +2242,9 @@ Similar to :func:`waitpid`, except a 3-element tuple, containing the child's process id, exit status indication, and resource usage information is returned. - Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage - information. The arguments to :func:`wait4` are the same as those provided to - :func:`waitpid`. + Refer to :mod:`resource`.\ :func:`~resource.getrusage` for details on + resource usage information. The arguments to :func:`wait4` are the same as + those provided to :func:`waitpid`. Availability: Unix. @@ -2467,8 +2468,9 @@ .. data:: defpath - The default search path used by :func:`exec\*p\*` and :func:`spawn\*p\*` if the - environment doesn't have a ``'PATH'`` key. Also available via :mod:`os.path`. + The default search path used by :func:`exec\*p\* ` and + :func:`spawn\*p\* ` if the environment doesn't have a ``'PATH'`` + key. Also available via :mod:`os.path`. .. data:: linesep diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -19,7 +19,7 @@ available through the :mod:`os` interface. Once :mod:`os` is imported, there is *no* performance penalty in using it instead of :mod:`posix`. In addition, :mod:`os` provides some additional functionality, such as automatically calling -:func:`putenv` when an entry in ``os.environ`` is changed. +:func:`~os.putenv` when an entry in ``os.environ`` is changed. Errors are reported as exceptions; the usual exceptions are given for type errors, while errors reported by the system calls raise :exc:`OSError`. @@ -74,9 +74,10 @@ directory, equivalent to ``getenv("HOME")`` in C. Modifying this dictionary does not affect the string environment passed on by - :func:`execv`, :func:`popen` or :func:`system`; if you need to change the - environment, pass ``environ`` to :func:`execve` or add variable assignments and - export statements to the command string for :func:`system` or :func:`popen`. + :func:`~os.execv`, :func:`~os.popen` or :func:`~os.system`; if you need to + change the environment, pass ``environ`` to :func:`~os.execve` or add + variable assignments and export statements to the command string for + :func:`~os.system` or :func:`~os.popen`. .. note:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 19:52:20 2013 From: python-checkins at python.org (ethan.furman) Date: Sun, 13 Oct 2013 19:52:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue19030=3A_commit_tests?= =?utf-8?q?_for_DynamicClassAttribute?= Message-ID: <3cyVpr0Y7mzNt4@mail.python.org> http://hg.python.org/cpython/rev/3752c94368dd changeset: 86325:3752c94368dd parent: 86323:74c3cf05fb1e user: Ethan Furman date: Sun Oct 13 10:52:10 2013 -0700 summary: Issue19030: commit tests for DynamicClassAttribute files: Lib/test/test_dynamicclassattribute.py | 304 +++++++++++++ 1 files changed, 304 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_dynamicclassattribute.py b/Lib/test/test_dynamicclassattribute.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_dynamicclassattribute.py @@ -0,0 +1,304 @@ +# Test case for DynamicClassAttribute +# more tests are in test_descr + +import abc +import sys +import unittest +from test.support import run_unittest +from types import DynamicClassAttribute + +class PropertyBase(Exception): + pass + +class PropertyGet(PropertyBase): + pass + +class PropertySet(PropertyBase): + pass + +class PropertyDel(PropertyBase): + pass + +class BaseClass(object): + def __init__(self): + self._spam = 5 + + @DynamicClassAttribute + def spam(self): + """BaseClass.getter""" + return self._spam + + @spam.setter + def spam(self, value): + self._spam = value + + @spam.deleter + def spam(self): + del self._spam + +class SubClass(BaseClass): + + spam = BaseClass.__dict__['spam'] + + @spam.getter + def spam(self): + """SubClass.getter""" + raise PropertyGet(self._spam) + + @spam.setter + def spam(self, value): + raise PropertySet(self._spam) + + @spam.deleter + def spam(self): + raise PropertyDel(self._spam) + +class PropertyDocBase(object): + _spam = 1 + def _get_spam(self): + return self._spam + spam = DynamicClassAttribute(_get_spam, doc="spam spam spam") + +class PropertyDocSub(PropertyDocBase): + spam = PropertyDocBase.__dict__['spam'] + @spam.getter + def spam(self): + """The decorator does not use this doc string""" + return self._spam + +class PropertySubNewGetter(BaseClass): + spam = BaseClass.__dict__['spam'] + @spam.getter + def spam(self): + """new docstring""" + return 5 + +class PropertyNewGetter(object): + @DynamicClassAttribute + def spam(self): + """original docstring""" + return 1 + @spam.getter + def spam(self): + """new docstring""" + return 8 + +class ClassWithAbstractVirtualProperty(metaclass=abc.ABCMeta): + @DynamicClassAttribute + @abc.abstractmethod + def color(): + pass + +class ClassWithPropertyAbstractVirtual(metaclass=abc.ABCMeta): + @abc.abstractmethod + @DynamicClassAttribute + def color(): + pass + +class PropertyTests(unittest.TestCase): + def test_property_decorator_baseclass(self): + # see #1620 + base = BaseClass() + self.assertEqual(base.spam, 5) + self.assertEqual(base._spam, 5) + base.spam = 10 + self.assertEqual(base.spam, 10) + self.assertEqual(base._spam, 10) + delattr(base, "spam") + self.assertTrue(not hasattr(base, "spam")) + self.assertTrue(not hasattr(base, "_spam")) + base.spam = 20 + self.assertEqual(base.spam, 20) + self.assertEqual(base._spam, 20) + + def test_property_decorator_subclass(self): + # see #1620 + sub = SubClass() + self.assertRaises(PropertyGet, getattr, sub, "spam") + self.assertRaises(PropertySet, setattr, sub, "spam", None) + self.assertRaises(PropertyDel, delattr, sub, "spam") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_property_decorator_subclass_doc(self): + sub = SubClass() + self.assertEqual(sub.__class__.__dict__['spam'].__doc__, "SubClass.getter") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_property_decorator_baseclass_doc(self): + base = BaseClass() + self.assertEqual(base.__class__.__dict__['spam'].__doc__, "BaseClass.getter") + + def test_property_decorator_doc(self): + base = PropertyDocBase() + sub = PropertyDocSub() + self.assertEqual(base.__class__.__dict__['spam'].__doc__, "spam spam spam") + self.assertEqual(sub.__class__.__dict__['spam'].__doc__, "spam spam spam") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_property_getter_doc_override(self): + newgettersub = PropertySubNewGetter() + self.assertEqual(newgettersub.spam, 5) + self.assertEqual(newgettersub.__class__.__dict__['spam'].__doc__, "new docstring") + newgetter = PropertyNewGetter() + self.assertEqual(newgetter.spam, 8) + self.assertEqual(newgetter.__class__.__dict__['spam'].__doc__, "new docstring") + + def test_property___isabstractmethod__descriptor(self): + for val in (True, False, [], [1], '', '1'): + class C(object): + def foo(self): + pass + foo.__isabstractmethod__ = val + foo = DynamicClassAttribute(foo) + self.assertIs(C.__dict__['foo'].__isabstractmethod__, bool(val)) + + # check that the DynamicClassAttribute's __isabstractmethod__ descriptor does the + # right thing when presented with a value that fails truth testing: + class NotBool(object): + def __nonzero__(self): + raise ValueError() + __len__ = __nonzero__ + with self.assertRaises(ValueError): + class C(object): + def foo(self): + pass + foo.__isabstractmethod__ = NotBool() + foo = DynamicClassAttribute(foo) + + def test_abstract_virtual(self): + self.assertRaises(TypeError, ClassWithAbstractVirtualProperty) + self.assertRaises(TypeError, ClassWithPropertyAbstractVirtual) + class APV(ClassWithPropertyAbstractVirtual): + pass + self.assertRaises(TypeError, APV) + class AVP(ClassWithAbstractVirtualProperty): + pass + self.assertRaises(TypeError, AVP) + class Okay1(ClassWithAbstractVirtualProperty): + @DynamicClassAttribute + def color(self): + return self._color + def __init__(self): + self._color = 'cyan' + with self.assertRaises(AttributeError): + Okay1.color + self.assertEqual(Okay1().color, 'cyan') + class Okay2(ClassWithAbstractVirtualProperty): + @DynamicClassAttribute + def color(self): + return self._color + def __init__(self): + self._color = 'magenta' + with self.assertRaises(AttributeError): + Okay2.color + self.assertEqual(Okay2().color, 'magenta') + + +# Issue 5890: subclasses of DynamicClassAttribute do not preserve method __doc__ strings +class PropertySub(DynamicClassAttribute): + """This is a subclass of DynamicClassAttribute""" + +class PropertySubSlots(DynamicClassAttribute): + """This is a subclass of DynamicClassAttribute that defines __slots__""" + __slots__ = () + +class PropertySubclassTests(unittest.TestCase): + + @unittest.skipIf(hasattr(PropertySubSlots, '__doc__'), + "__doc__ is already present, __slots__ will have no effect") + def test_slots_docstring_copy_exception(self): + try: + class Foo(object): + @PropertySubSlots + def spam(self): + """Trying to copy this docstring will raise an exception""" + return 1 + print('\n',spam.__doc__) + except AttributeError: + pass + else: + raise Exception("AttributeError not raised") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_docstring_copy(self): + class Foo(object): + @PropertySub + def spam(self): + """spam wrapped in DynamicClassAttribute subclass""" + return 1 + self.assertEqual( + Foo.__dict__['spam'].__doc__, + "spam wrapped in DynamicClassAttribute subclass") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_property_setter_copies_getter_docstring(self): + class Foo(object): + def __init__(self): self._spam = 1 + @PropertySub + def spam(self): + """spam wrapped in DynamicClassAttribute subclass""" + return self._spam + @spam.setter + def spam(self, value): + """this docstring is ignored""" + self._spam = value + foo = Foo() + self.assertEqual(foo.spam, 1) + foo.spam = 2 + self.assertEqual(foo.spam, 2) + self.assertEqual( + Foo.__dict__['spam'].__doc__, + "spam wrapped in DynamicClassAttribute subclass") + class FooSub(Foo): + spam = Foo.__dict__['spam'] + @spam.setter + def spam(self, value): + """another ignored docstring""" + self._spam = 'eggs' + foosub = FooSub() + self.assertEqual(foosub.spam, 1) + foosub.spam = 7 + self.assertEqual(foosub.spam, 'eggs') + self.assertEqual( + FooSub.__dict__['spam'].__doc__, + "spam wrapped in DynamicClassAttribute subclass") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_property_new_getter_new_docstring(self): + + class Foo(object): + @PropertySub + def spam(self): + """a docstring""" + return 1 + @spam.getter + def spam(self): + """a new docstring""" + return 2 + self.assertEqual(Foo.__dict__['spam'].__doc__, "a new docstring") + class FooBase(object): + @PropertySub + def spam(self): + """a docstring""" + return 1 + class Foo2(FooBase): + spam = FooBase.__dict__['spam'] + @spam.getter + def spam(self): + """a new docstring""" + return 2 + self.assertEqual(Foo.__dict__['spam'].__doc__, "a new docstring") + + + +def test_main(): + run_unittest(PropertyTests, PropertySubclassTests) + +if __name__ == '__main__': + test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 20:20:58 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 20:20:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIElzc3VlICMxOTE5?= =?utf-8?q?7=3A_Improved_cross-references_in_the_shlex_module_documentatio?= =?utf-8?q?n=2E?= Message-ID: <3cyWRt6mpDz7LkN@mail.python.org> http://hg.python.org/cpython/rev/bca5ba1ea5aa changeset: 86326:bca5ba1ea5aa branch: 2.7 parent: 86324:fd2c34e0104b user: Serhiy Storchaka date: Sun Oct 13 21:17:56 2013 +0300 summary: Issue #19197: Improved cross-references in the shlex module documentation. files: Doc/library/shlex.rst | 110 ++++++++++++++++------------- 1 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -16,9 +16,9 @@ -------------- -The :class:`shlex` class makes it easy to write lexical analyzers for simple -syntaxes resembling that of the Unix shell. This will often be useful for -writing minilanguages, (for example, in run control files for Python +The :class:`~shlex.shlex` class makes it easy to write lexical analyzers for +simple syntaxes resembling that of the Unix shell. This will often be useful +for writing minilanguages, (for example, in run control files for Python applications) or for parsing quoted strings. Prior to Python 2.7.3, this module did not support Unicode input. @@ -30,9 +30,10 @@ Split the string *s* using shell-like syntax. If *comments* is :const:`False` (the default), the parsing of comments in the given string will be disabled - (setting the :attr:`commenters` attribute of the :class:`shlex` instance to - the empty string). This function operates in POSIX mode by default, but uses - non-POSIX mode if the *posix* argument is false. + (setting the :attr:`~shlex.commenters` attribute of the + :class:`~shlex.shlex` instance to the empty string). This function operates + in POSIX mode by default, but uses non-POSIX mode if the *posix* argument is + false. .. versionadded:: 2.3 @@ -41,26 +42,28 @@ .. note:: - Since the :func:`split` function instantiates a :class:`shlex` instance, passing - ``None`` for *s* will read the string to split from standard input. + Since the :func:`split` function instantiates a :class:`~shlex.shlex` + instance, passing ``None`` for *s* will read the string to split from + standard input. The :mod:`shlex` module defines the following class: .. class:: shlex([instream[, infile[, posix]]]) - A :class:`shlex` instance or subclass instance is a lexical analyzer object. - The initialization argument, if present, specifies where to read characters - from. It must be a file-/stream-like object with :meth:`read` and - :meth:`readline` methods, or a string (strings are accepted since Python 2.3). - If no argument is given, input will be taken from ``sys.stdin``. The second - optional argument is a filename string, which sets the initial value of the - :attr:`infile` attribute. If the *instream* argument is omitted or equal to - ``sys.stdin``, this second argument defaults to "stdin". The *posix* argument - was introduced in Python 2.3, and defines the operational mode. When *posix* is - not true (default), the :class:`shlex` instance will operate in compatibility - mode. When operating in POSIX mode, :class:`shlex` will try to be as close as - possible to the POSIX shell parsing rules. + A :class:`~shlex.shlex` instance or subclass instance is a lexical analyzer + object. The initialization argument, if present, specifies where to read + characters from. It must be a file-/stream-like object with + :meth:`~io.TextIOBase.read` and :meth:`~io.TextIOBase.readline` methods, or + a string (strings are accepted since Python 2.3). If no argument is given, + input will be taken from ``sys.stdin``. The second optional argument is a + filename string, which sets the initial value of the :attr:`~shlex.infile` + attribute. If the *instream* argument is omitted or equal to ``sys.stdin``, + this second argument defaults to "stdin". The *posix* argument was + introduced in Python 2.3, and defines the operational mode. When *posix* is + not true (default), the :class:`~shlex.shlex` instance will operate in + compatibility mode. When operating in POSIX mode, :class:`~shlex.shlex` + will try to be as close as possible to the POSIX shell parsing rules. .. seealso:: @@ -74,14 +77,14 @@ shlex Objects ------------- -A :class:`shlex` instance has the following methods: +A :class:`~shlex.shlex` instance has the following methods: .. method:: shlex.get_token() Return a token. If tokens have been stacked using :meth:`push_token`, pop a token off the stack. Otherwise, read one from the input stream. If reading - encounters an immediate end-of-file, :attr:`self.eof` is returned (the empty + encounters an immediate end-of-file, :attr:`eof` is returned (the empty string (``''``) in non-POSIX mode, and ``None`` in POSIX mode). @@ -99,9 +102,9 @@ .. method:: shlex.sourcehook(filename) - When :class:`shlex` detects a source request (see :attr:`source` below) this - method is given the following token as argument, and expected to return a tuple - consisting of a filename and an open file-like object. + When :class:`~shlex.shlex` detects a source request (see :attr:`source` + below) this method is given the following token as argument, and expected + to return a tuple consisting of a filename and an open file-like object. Normally, this method first strips any quotes off the argument. If the result is an absolute pathname, or there was no previous source request in effect, or @@ -118,8 +121,9 @@ This hook is exposed so that you can use it to implement directory search paths, addition of file extensions, and other namespace hacks. There is no - corresponding 'close' hook, but a shlex instance will call the :meth:`close` - method of the sourced input stream when it returns EOF. + corresponding 'close' hook, but a shlex instance will call the + :meth:`~io.IOBase.close` method of the sourced input stream when it returns + EOF. For more explicit control of source stacking, use the :meth:`push_source` and :meth:`pop_source` methods. @@ -153,8 +157,8 @@ messages in the standard, parseable format understood by Emacs and other Unix tools. -Instances of :class:`shlex` subclasses have some public instance variables which -either control lexical analysis or can be used for debugging: +Instances of :class:`~shlex.shlex` subclasses have some public instance +variables which either control lexical analysis or can be used for debugging: .. attribute:: shlex.commenters @@ -203,8 +207,8 @@ .. attribute:: shlex.whitespace_split If ``True``, tokens will only be split in whitespaces. This is useful, for - example, for parsing command lines with :class:`shlex`, getting tokens in a - similar way to shell arguments. + example, for parsing command lines with :class:`~shlex.shlex`, getting + tokens in a similar way to shell arguments. .. versionadded:: 2.3 @@ -218,7 +222,8 @@ .. attribute:: shlex.instream - The input stream from which this :class:`shlex` instance is reading characters. + The input stream from which this :class:`~shlex.shlex` instance is reading + characters. .. attribute:: shlex.source @@ -227,16 +232,16 @@ string will be recognized as a lexical-level inclusion request similar to the ``source`` keyword in various shells. That is, the immediately following token will opened as a filename and input taken from that stream until EOF, at which - point the :meth:`close` method of that stream will be called and the input - source will again become the original input stream. Source requests may be - stacked any number of levels deep. + point the :meth:`~io.IOBase.close` method of that stream will be called and + the input source will again become the original input stream. Source + requests may be stacked any number of levels deep. .. attribute:: shlex.debug - If this attribute is numeric and ``1`` or more, a :class:`shlex` instance will - print verbose progress output on its behavior. If you need to use this, you can - read the module source code to learn the details. + If this attribute is numeric and ``1`` or more, a :class:`~shlex.shlex` + instance will print verbose progress output on its behavior. If you need + to use this, you can read the module source code to learn the details. .. attribute:: shlex.lineno @@ -262,7 +267,7 @@ Parsing Rules ------------- -When operating in non-POSIX mode, :class:`shlex` will try to obey to the +When operating in non-POSIX mode, :class:`~shlex.shlex` will try to obey to the following rules. * Quote characters are not recognized within words (``Do"Not"Separate`` is @@ -276,16 +281,17 @@ * Closing quotes separate words (``"Do"Separate`` is parsed as ``"Do"`` and ``Separate``); -* If :attr:`whitespace_split` is ``False``, any character not declared to be a - word character, whitespace, or a quote will be returned as a single-character - token. If it is ``True``, :class:`shlex` will only split words in whitespaces; +* If :attr:`~shlex.whitespace_split` is ``False``, any character not + declared to be a word character, whitespace, or a quote will be returned as + a single-character token. If it is ``True``, :class:`~shlex.shlex` will only + split words in whitespaces; * EOF is signaled with an empty string (``''``); * It's not possible to parse empty strings, even if quoted. -When operating in POSIX mode, :class:`shlex` will try to obey to the following -parsing rules. +When operating in POSIX mode, :class:`~shlex.shlex` will try to obey to the +following parsing rules. * Quotes are stripped out, and do not separate words (``"Do"Not"Separate"`` is parsed as the single word ``DoNotSeparate``); @@ -293,14 +299,16 @@ * Non-quoted escape characters (e.g. ``'\'``) preserve the literal value of the next character that follows; -* Enclosing characters in quotes which are not part of :attr:`escapedquotes` - (e.g. ``"'"``) preserve the literal value of all characters within the quotes; +* Enclosing characters in quotes which are not part of + :attr:`~shlex.escapedquotes` (e.g. ``"'"``) preserve the literal value + of all characters within the quotes; -* Enclosing characters in quotes which are part of :attr:`escapedquotes` (e.g. - ``'"'``) preserves the literal value of all characters within the quotes, with - the exception of the characters mentioned in :attr:`escape`. The escape - characters retain its special meaning only when followed by the quote in use, or - the escape character itself. Otherwise the escape character will be considered a +* Enclosing characters in quotes which are part of + :attr:`~shlex.escapedquotes` (e.g. ``'"'``) preserves the literal value + of all characters within the quotes, with the exception of the characters + mentioned in :attr:`~shlex.escape`. The escape characters retain its + special meaning only when followed by the quote in use, or the escape + character itself. Otherwise the escape character will be considered a normal character. * EOF is signaled with a :const:`None` value; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 20:21:00 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 20:21:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTk3?= =?utf-8?q?=3A_Improved_cross-references_in_the_shlex_module_documentation?= =?utf-8?q?=2E?= Message-ID: <3cyWRw2cXkz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/325fedff6178 changeset: 86327:325fedff6178 branch: 3.3 parent: 86322:7ea984fc9be1 user: Serhiy Storchaka date: Sun Oct 13 21:19:00 2013 +0300 summary: Issue #19197: Improved cross-references in the shlex module documentation. files: Doc/library/shlex.rst | 110 ++++++++++++++++------------- 1 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -12,9 +12,9 @@ -------------- -The :class:`shlex` class makes it easy to write lexical analyzers for simple -syntaxes resembling that of the Unix shell. This will often be useful for -writing minilanguages, (for example, in run control files for Python +The :class:`~shlex.shlex` class makes it easy to write lexical analyzers for +simple syntaxes resembling that of the Unix shell. This will often be useful +for writing minilanguages, (for example, in run control files for Python applications) or for parsing quoted strings. The :mod:`shlex` module defines the following functions: @@ -24,15 +24,16 @@ Split the string *s* using shell-like syntax. If *comments* is :const:`False` (the default), the parsing of comments in the given string will be disabled - (setting the :attr:`commenters` attribute of the :class:`shlex` instance to - the empty string). This function operates in POSIX mode by default, but uses - non-POSIX mode if the *posix* argument is false. + (setting the :attr:`~shlex.commenters` attribute of the + :class:`~shlex.shlex` instance to the empty string). This function operates + in POSIX mode by default, but uses non-POSIX mode if the *posix* argument is + false. .. note:: - Since the :func:`split` function instantiates a :class:`shlex` instance, - passing ``None`` for *s* will read the string to split from standard - input. + Since the :func:`split` function instantiates a :class:`~shlex.shlex` + instance, passing ``None`` for *s* will read the string to split from + standard input. .. function:: quote(s) @@ -73,17 +74,19 @@ .. class:: shlex(instream=None, infile=None, posix=False) - A :class:`shlex` instance or subclass instance is a lexical analyzer object. - The initialization argument, if present, specifies where to read characters - from. It must be a file-/stream-like object with :meth:`read` and - :meth:`readline` methods, or a string. If no argument is given, input will - be taken from ``sys.stdin``. The second optional argument is a filename - string, which sets the initial value of the :attr:`infile` attribute. If the - *instream* argument is omitted or equal to ``sys.stdin``, this second - argument defaults to "stdin". The *posix* argument defines the operational - mode: when *posix* is not true (default), the :class:`shlex` instance will - operate in compatibility mode. When operating in POSIX mode, :class:`shlex` - will try to be as close as possible to the POSIX shell parsing rules. + A :class:`~shlex.shlex` instance or subclass instance is a lexical analyzer + object. The initialization argument, if present, specifies where to read + characters from. It must be a file-/stream-like object with + :meth:`~io.TextIOBase.read` and :meth:`~io.TextIOBase.readline` methods, or + a string. If no argument is given, input will be taken from ``sys.stdin``. + The second optional argument is a filename string, which sets the initial + value of the :attr:`~shlex.infile` attribute. If the *instream* + argument is omitted or equal to ``sys.stdin``, this second argument + defaults to "stdin". The *posix* argument defines the operational mode: + when *posix* is not true (default), the :class:`~shlex.shlex` instance will + operate in compatibility mode. When operating in POSIX mode, + :class:`~shlex.shlex` will try to be as close as possible to the POSIX shell + parsing rules. .. seealso:: @@ -97,14 +100,14 @@ shlex Objects ------------- -A :class:`shlex` instance has the following methods: +A :class:`~shlex.shlex` instance has the following methods: .. method:: shlex.get_token() Return a token. If tokens have been stacked using :meth:`push_token`, pop a token off the stack. Otherwise, read one from the input stream. If reading - encounters an immediate end-of-file, :attr:`self.eof` is returned (the empty + encounters an immediate end-of-file, :attr:`eof` is returned (the empty string (``''``) in non-POSIX mode, and ``None`` in POSIX mode). @@ -122,9 +125,9 @@ .. method:: shlex.sourcehook(filename) - When :class:`shlex` detects a source request (see :attr:`source` below) this - method is given the following token as argument, and expected to return a tuple - consisting of a filename and an open file-like object. + When :class:`~shlex.shlex` detects a source request (see :attr:`source` + below) this method is given the following token as argument, and expected + to return a tuple consisting of a filename and an open file-like object. Normally, this method first strips any quotes off the argument. If the result is an absolute pathname, or there was no previous source request in effect, or @@ -141,8 +144,9 @@ This hook is exposed so that you can use it to implement directory search paths, addition of file extensions, and other namespace hacks. There is no - corresponding 'close' hook, but a shlex instance will call the :meth:`close` - method of the sourced input stream when it returns EOF. + corresponding 'close' hook, but a shlex instance will call the + :meth:`~io.IOBase.close` method of the sourced input stream when it returns + EOF. For more explicit control of source stacking, use the :meth:`push_source` and :meth:`pop_source` methods. @@ -172,8 +176,8 @@ messages in the standard, parseable format understood by Emacs and other Unix tools. -Instances of :class:`shlex` subclasses have some public instance variables which -either control lexical analysis or can be used for debugging: +Instances of :class:`~shlex.shlex` subclasses have some public instance +variables which either control lexical analysis or can be used for debugging: .. attribute:: shlex.commenters @@ -218,8 +222,8 @@ .. attribute:: shlex.whitespace_split If ``True``, tokens will only be split in whitespaces. This is useful, for - example, for parsing command lines with :class:`shlex`, getting tokens in a - similar way to shell arguments. + example, for parsing command lines with :class:`~shlex.shlex`, getting + tokens in a similar way to shell arguments. .. attribute:: shlex.infile @@ -231,7 +235,8 @@ .. attribute:: shlex.instream - The input stream from which this :class:`shlex` instance is reading characters. + The input stream from which this :class:`~shlex.shlex` instance is reading + characters. .. attribute:: shlex.source @@ -240,16 +245,16 @@ string will be recognized as a lexical-level inclusion request similar to the ``source`` keyword in various shells. That is, the immediately following token will opened as a filename and input taken from that stream until EOF, at which - point the :meth:`close` method of that stream will be called and the input - source will again become the original input stream. Source requests may be - stacked any number of levels deep. + point the :meth:`~io.IOBase.close` method of that stream will be called and + the input source will again become the original input stream. Source + requests may be stacked any number of levels deep. .. attribute:: shlex.debug - If this attribute is numeric and ``1`` or more, a :class:`shlex` instance will - print verbose progress output on its behavior. If you need to use this, you can - read the module source code to learn the details. + If this attribute is numeric and ``1`` or more, a :class:`~shlex.shlex` + instance will print verbose progress output on its behavior. If you need + to use this, you can read the module source code to learn the details. .. attribute:: shlex.lineno @@ -273,7 +278,7 @@ Parsing Rules ------------- -When operating in non-POSIX mode, :class:`shlex` will try to obey to the +When operating in non-POSIX mode, :class:`~shlex.shlex` will try to obey to the following rules. * Quote characters are not recognized within words (``Do"Not"Separate`` is @@ -287,16 +292,17 @@ * Closing quotes separate words (``"Do"Separate`` is parsed as ``"Do"`` and ``Separate``); -* If :attr:`whitespace_split` is ``False``, any character not declared to be a - word character, whitespace, or a quote will be returned as a single-character - token. If it is ``True``, :class:`shlex` will only split words in whitespaces; +* If :attr:`~shlex.whitespace_split` is ``False``, any character not + declared to be a word character, whitespace, or a quote will be returned as + a single-character token. If it is ``True``, :class:`~shlex.shlex` will only + split words in whitespaces; * EOF is signaled with an empty string (``''``); * It's not possible to parse empty strings, even if quoted. -When operating in POSIX mode, :class:`shlex` will try to obey to the following -parsing rules. +When operating in POSIX mode, :class:`~shlex.shlex` will try to obey to the +following parsing rules. * Quotes are stripped out, and do not separate words (``"Do"Not"Separate"`` is parsed as the single word ``DoNotSeparate``); @@ -304,14 +310,16 @@ * Non-quoted escape characters (e.g. ``'\'``) preserve the literal value of the next character that follows; -* Enclosing characters in quotes which are not part of :attr:`escapedquotes` - (e.g. ``"'"``) preserve the literal value of all characters within the quotes; +* Enclosing characters in quotes which are not part of + :attr:`~shlex.escapedquotes` (e.g. ``"'"``) preserve the literal value + of all characters within the quotes; -* Enclosing characters in quotes which are part of :attr:`escapedquotes` (e.g. - ``'"'``) preserves the literal value of all characters within the quotes, with - the exception of the characters mentioned in :attr:`escape`. The escape - characters retain its special meaning only when followed by the quote in use, or - the escape character itself. Otherwise the escape character will be considered a +* Enclosing characters in quotes which are part of + :attr:`~shlex.escapedquotes` (e.g. ``'"'``) preserves the literal value + of all characters within the quotes, with the exception of the characters + mentioned in :attr:`~shlex.escape`. The escape characters retain its + special meaning only when followed by the quote in use, or the escape + character itself. Otherwise the escape character will be considered a normal character. * EOF is signaled with a :const:`None` value; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 20:21:01 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 20:21:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319197=3A_Improved_cross-references_in_the_shlex?= =?utf-8?q?_module_documentation=2E?= Message-ID: <3cyWRx5WfPz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/dfbd5115fb95 changeset: 86328:dfbd5115fb95 parent: 86325:3752c94368dd parent: 86327:325fedff6178 user: Serhiy Storchaka date: Sun Oct 13 21:20:30 2013 +0300 summary: Issue #19197: Improved cross-references in the shlex module documentation. files: Doc/library/shlex.rst | 110 ++++++++++++++++------------- 1 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -12,9 +12,9 @@ -------------- -The :class:`shlex` class makes it easy to write lexical analyzers for simple -syntaxes resembling that of the Unix shell. This will often be useful for -writing minilanguages, (for example, in run control files for Python +The :class:`~shlex.shlex` class makes it easy to write lexical analyzers for +simple syntaxes resembling that of the Unix shell. This will often be useful +for writing minilanguages, (for example, in run control files for Python applications) or for parsing quoted strings. The :mod:`shlex` module defines the following functions: @@ -24,15 +24,16 @@ Split the string *s* using shell-like syntax. If *comments* is :const:`False` (the default), the parsing of comments in the given string will be disabled - (setting the :attr:`commenters` attribute of the :class:`shlex` instance to - the empty string). This function operates in POSIX mode by default, but uses - non-POSIX mode if the *posix* argument is false. + (setting the :attr:`~shlex.commenters` attribute of the + :class:`~shlex.shlex` instance to the empty string). This function operates + in POSIX mode by default, but uses non-POSIX mode if the *posix* argument is + false. .. note:: - Since the :func:`split` function instantiates a :class:`shlex` instance, - passing ``None`` for *s* will read the string to split from standard - input. + Since the :func:`split` function instantiates a :class:`~shlex.shlex` + instance, passing ``None`` for *s* will read the string to split from + standard input. .. function:: quote(s) @@ -73,17 +74,19 @@ .. class:: shlex(instream=None, infile=None, posix=False) - A :class:`shlex` instance or subclass instance is a lexical analyzer object. - The initialization argument, if present, specifies where to read characters - from. It must be a file-/stream-like object with :meth:`read` and - :meth:`readline` methods, or a string. If no argument is given, input will - be taken from ``sys.stdin``. The second optional argument is a filename - string, which sets the initial value of the :attr:`infile` attribute. If the - *instream* argument is omitted or equal to ``sys.stdin``, this second - argument defaults to "stdin". The *posix* argument defines the operational - mode: when *posix* is not true (default), the :class:`shlex` instance will - operate in compatibility mode. When operating in POSIX mode, :class:`shlex` - will try to be as close as possible to the POSIX shell parsing rules. + A :class:`~shlex.shlex` instance or subclass instance is a lexical analyzer + object. The initialization argument, if present, specifies where to read + characters from. It must be a file-/stream-like object with + :meth:`~io.TextIOBase.read` and :meth:`~io.TextIOBase.readline` methods, or + a string. If no argument is given, input will be taken from ``sys.stdin``. + The second optional argument is a filename string, which sets the initial + value of the :attr:`~shlex.infile` attribute. If the *instream* + argument is omitted or equal to ``sys.stdin``, this second argument + defaults to "stdin". The *posix* argument defines the operational mode: + when *posix* is not true (default), the :class:`~shlex.shlex` instance will + operate in compatibility mode. When operating in POSIX mode, + :class:`~shlex.shlex` will try to be as close as possible to the POSIX shell + parsing rules. .. seealso:: @@ -97,14 +100,14 @@ shlex Objects ------------- -A :class:`shlex` instance has the following methods: +A :class:`~shlex.shlex` instance has the following methods: .. method:: shlex.get_token() Return a token. If tokens have been stacked using :meth:`push_token`, pop a token off the stack. Otherwise, read one from the input stream. If reading - encounters an immediate end-of-file, :attr:`self.eof` is returned (the empty + encounters an immediate end-of-file, :attr:`eof` is returned (the empty string (``''``) in non-POSIX mode, and ``None`` in POSIX mode). @@ -122,9 +125,9 @@ .. method:: shlex.sourcehook(filename) - When :class:`shlex` detects a source request (see :attr:`source` below) this - method is given the following token as argument, and expected to return a tuple - consisting of a filename and an open file-like object. + When :class:`~shlex.shlex` detects a source request (see :attr:`source` + below) this method is given the following token as argument, and expected + to return a tuple consisting of a filename and an open file-like object. Normally, this method first strips any quotes off the argument. If the result is an absolute pathname, or there was no previous source request in effect, or @@ -141,8 +144,9 @@ This hook is exposed so that you can use it to implement directory search paths, addition of file extensions, and other namespace hacks. There is no - corresponding 'close' hook, but a shlex instance will call the :meth:`close` - method of the sourced input stream when it returns EOF. + corresponding 'close' hook, but a shlex instance will call the + :meth:`~io.IOBase.close` method of the sourced input stream when it returns + EOF. For more explicit control of source stacking, use the :meth:`push_source` and :meth:`pop_source` methods. @@ -172,8 +176,8 @@ messages in the standard, parseable format understood by Emacs and other Unix tools. -Instances of :class:`shlex` subclasses have some public instance variables which -either control lexical analysis or can be used for debugging: +Instances of :class:`~shlex.shlex` subclasses have some public instance +variables which either control lexical analysis or can be used for debugging: .. attribute:: shlex.commenters @@ -218,8 +222,8 @@ .. attribute:: shlex.whitespace_split If ``True``, tokens will only be split in whitespaces. This is useful, for - example, for parsing command lines with :class:`shlex`, getting tokens in a - similar way to shell arguments. + example, for parsing command lines with :class:`~shlex.shlex`, getting + tokens in a similar way to shell arguments. .. attribute:: shlex.infile @@ -231,7 +235,8 @@ .. attribute:: shlex.instream - The input stream from which this :class:`shlex` instance is reading characters. + The input stream from which this :class:`~shlex.shlex` instance is reading + characters. .. attribute:: shlex.source @@ -240,16 +245,16 @@ string will be recognized as a lexical-level inclusion request similar to the ``source`` keyword in various shells. That is, the immediately following token will opened as a filename and input taken from that stream until EOF, at which - point the :meth:`close` method of that stream will be called and the input - source will again become the original input stream. Source requests may be - stacked any number of levels deep. + point the :meth:`~io.IOBase.close` method of that stream will be called and + the input source will again become the original input stream. Source + requests may be stacked any number of levels deep. .. attribute:: shlex.debug - If this attribute is numeric and ``1`` or more, a :class:`shlex` instance will - print verbose progress output on its behavior. If you need to use this, you can - read the module source code to learn the details. + If this attribute is numeric and ``1`` or more, a :class:`~shlex.shlex` + instance will print verbose progress output on its behavior. If you need + to use this, you can read the module source code to learn the details. .. attribute:: shlex.lineno @@ -273,7 +278,7 @@ Parsing Rules ------------- -When operating in non-POSIX mode, :class:`shlex` will try to obey to the +When operating in non-POSIX mode, :class:`~shlex.shlex` will try to obey to the following rules. * Quote characters are not recognized within words (``Do"Not"Separate`` is @@ -287,16 +292,17 @@ * Closing quotes separate words (``"Do"Separate`` is parsed as ``"Do"`` and ``Separate``); -* If :attr:`whitespace_split` is ``False``, any character not declared to be a - word character, whitespace, or a quote will be returned as a single-character - token. If it is ``True``, :class:`shlex` will only split words in whitespaces; +* If :attr:`~shlex.whitespace_split` is ``False``, any character not + declared to be a word character, whitespace, or a quote will be returned as + a single-character token. If it is ``True``, :class:`~shlex.shlex` will only + split words in whitespaces; * EOF is signaled with an empty string (``''``); * It's not possible to parse empty strings, even if quoted. -When operating in POSIX mode, :class:`shlex` will try to obey to the following -parsing rules. +When operating in POSIX mode, :class:`~shlex.shlex` will try to obey to the +following parsing rules. * Quotes are stripped out, and do not separate words (``"Do"Not"Separate"`` is parsed as the single word ``DoNotSeparate``); @@ -304,14 +310,16 @@ * Non-quoted escape characters (e.g. ``'\'``) preserve the literal value of the next character that follows; -* Enclosing characters in quotes which are not part of :attr:`escapedquotes` - (e.g. ``"'"``) preserve the literal value of all characters within the quotes; +* Enclosing characters in quotes which are not part of + :attr:`~shlex.escapedquotes` (e.g. ``"'"``) preserve the literal value + of all characters within the quotes; -* Enclosing characters in quotes which are part of :attr:`escapedquotes` (e.g. - ``'"'``) preserves the literal value of all characters within the quotes, with - the exception of the characters mentioned in :attr:`escape`. The escape - characters retain its special meaning only when followed by the quote in use, or - the escape character itself. Otherwise the escape character will be considered a +* Enclosing characters in quotes which are part of + :attr:`~shlex.escapedquotes` (e.g. ``'"'``) preserves the literal value + of all characters within the quotes, with the exception of the characters + mentioned in :attr:`~shlex.escape`. The escape characters retain its + special meaning only when followed by the quote in use, or the escape + character itself. Otherwise the escape character will be considered a normal character. * EOF is signaled with a :const:`None` value; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 20:51:59 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 20:51:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_pdb=3A_modernize_find=5Ffu?= =?utf-8?q?nction=28=29_and_add_tests_for_it=2E?= Message-ID: <3cyX7g5GYlz7LjW@mail.python.org> http://hg.python.org/cpython/rev/9c65877b3e34 changeset: 86329:9c65877b3e34 user: Georg Brandl date: Sun Oct 13 20:51:47 2013 +0200 summary: pdb: modernize find_function() and add tests for it. Closes #18714. files: Lib/pdb.py | 17 +++++------------ Lib/test/test_pdb.py | 30 ++++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -95,18 +95,11 @@ except OSError: return None # consumer of this info expects the first line to be 1 - lineno = 1 - answer = None - while True: - line = fp.readline() - if line == '': - break - if cre.match(line): - answer = funcname, filename, lineno - break - lineno += 1 - fp.close() - return answer + with fp: + for lineno, line in enumerate(fp, start=1): + if cre.match(line): + return funcname, filename, lineno + return None def getsourcelines(obj): lines, lineno = inspect.findsource(obj) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -620,6 +620,36 @@ stderr = stderr and bytes.decode(stderr) return stdout, stderr + def _assert_find_function(self, file_content, func_name, expected): + file_content = textwrap.dedent(file_content) + + with open(support.TESTFN, 'w') as f: + f.write(file_content) + + expected = None if not expected else ( + expected[0], support.TESTFN, expected[1]) + self.assertEqual( + expected, pdb.find_function(func_name, support.TESTFN)) + + def test_find_function_empty_file(self): + self._assert_find_function('', 'foo', None) + + def test_find_function_found(self): + self._assert_find_function( + """\ + def foo(): + pass + + def bar(): + pass + + def quux(): + pass + """, + 'bar', + ('bar', 4), + ) + def test_issue7964(self): # open the file as binary so we can force \r\n newline with open(support.TESTFN, 'wb') as f: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -114,6 +114,8 @@ - Issue #18919: Unified and extended tests for audio modules: aifc, sunau and wave. +- Issue #18714: Added tests for ``pdb.find_function()``. + Documentation ------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 20:55:39 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 20:55:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2318714=3A_add_attributio?= =?utf-8?q?n=2E?= Message-ID: <3cyXCv6sCtz7LjW@mail.python.org> http://hg.python.org/cpython/rev/86af5991c809 changeset: 86330:86af5991c809 user: Georg Brandl date: Sun Oct 13 20:56:25 2013 +0200 summary: #18714: add attribution. files: Misc/ACKS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1027,6 +1027,7 @@ Fernando P?rez Pierre Quentel Brian Quinlan +Kevin Jing Qiu Anders Qvist Thomas Rachel Ram Rachum -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 21:48:40 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 21:48:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2317730=3A_in_code?= =?utf-8?q?=2Einteract=28=29=2C_when_banner=3D=22=22=2C_do_not_print_anyth?= =?utf-8?q?ing=2E?= Message-ID: <3cyYP46Kvzz7LjS@mail.python.org> http://hg.python.org/cpython/rev/2933598a7802 changeset: 86331:2933598a7802 user: Georg Brandl date: Sun Oct 13 21:49:06 2013 +0200 summary: Closes #17730: in code.interact(), when banner="", do not print anything. Also adds tests for banner printing. files: Doc/library/code.rst | 5 ++++- Lib/code.py | 2 +- Lib/test/test_code_module.py | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Doc/library/code.rst b/Doc/library/code.rst --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -132,12 +132,15 @@ .. method:: InteractiveConsole.interact(banner=None) - Closely emulate the interactive Python console. The optional banner argument + Closely emulate the interactive Python console. The optional *banner* argument specify the banner to print before the first interaction; by default it prints a banner similar to the one printed by the standard Python interpreter, followed by the class name of the console object in parentheses (so as not to confuse this with the real interpreter -- since it's so close!). + .. versionchanged:: 3.4 + To suppress printing any banner, pass an empty string. + .. method:: InteractiveConsole.push(line) diff --git a/Lib/code.py b/Lib/code.py --- a/Lib/code.py +++ b/Lib/code.py @@ -216,7 +216,7 @@ self.write("Python %s on %s\n%s\n(%s)\n" % (sys.version, sys.platform, cprt, self.__class__.__name__)) - else: + elif banner: self.write("%s\n" % str(banner)) more = 0 while 1: diff --git a/Lib/test/test_code_module.py b/Lib/test/test_code_module.py --- a/Lib/test/test_code_module.py +++ b/Lib/test/test_code_module.py @@ -64,6 +64,20 @@ self.console.interact() self.assertTrue(hook.called) + def test_banner(self): + # with banner + self.infunc.side_effect = EOFError('Finished') + self.console.interact(banner='Foo') + self.assertEqual(len(self.stderr.method_calls), 2) + banner_call = self.stderr.method_calls[0] + self.assertEqual(banner_call, ['write', ('Foo\n',), {}]) + + # no banner + self.stderr.reset_mock() + self.infunc.side_effect = EOFError('Finished') + self.console.interact(banner='') + self.assertEqual(len(self.stderr.method_calls), 1) + def test_main(): support.run_unittest(TestInteractiveConsole) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 21:54:31 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 13 Oct 2013 21:54:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4Nzc2?= =?utf-8?q?=3A_atexit_callbacks_now_display_their_full_traceback_when_they?= =?utf-8?q?_raise?= Message-ID: <3cyYWq4kXwz7LjS@mail.python.org> http://hg.python.org/cpython/rev/19ce90930e8b changeset: 86332:19ce90930e8b branch: 3.3 parent: 86327:325fedff6178 user: Antoine Pitrou date: Sun Oct 13 21:53:13 2013 +0200 summary: Issue #18776: atexit callbacks now display their full traceback when they raise an exception. files: Lib/test/test_atexit.py | 19 +++++++++++++++++++ Misc/NEWS | 3 +++ Python/pythonrun.c | 10 ++++++++++ 3 files changed, 32 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -74,6 +74,25 @@ self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) self.assertIn("ZeroDivisionError", self.stream.getvalue()) + def test_print_tracebacks(self): + # Issue #18776: the tracebacks should be printed when errors occur. + def f(): + 1/0 # one + def g(): + 1/0 # two + def h(): + 1/0 # three + atexit.register(f) + atexit.register(g) + atexit.register(h) + + self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) + stderr = self.stream.getvalue() + self.assertEqual(stderr.count("ZeroDivisionError"), 3) + self.assertIn("# one", stderr) + self.assertIn("# two", stderr) + self.assertIn("# three", stderr) + def test_stress(self): a = [0] def inc(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,9 @@ Library ------- +- Issue #18776: atexit callbacks now display their full traceback when they + raise an exception. + - Issue #17827: Add the missing documentation for ``codecs.encode`` and ``codecs.decode``. diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1880,6 +1880,16 @@ { PyObject *seen; PyObject *f = PySys_GetObject("stderr"); + if (PyExceptionInstance_Check(value) + && tb != NULL && PyTraceBack_Check(tb)) { + /* Put the traceback on the exception, otherwise it won't get + displayed. See issue #18776. */ + PyObject *cur_tb = PyException_GetTraceback(value); + if (cur_tb == NULL) + PyException_SetTraceback(value, tb); + else + Py_DECREF(cur_tb); + } if (f == Py_None) { /* pass */ } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 21:54:32 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 13 Oct 2013 21:54:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318776=3A_atexit_callbacks_now_display_their_ful?= =?utf-8?q?l_traceback_when_they_raise?= Message-ID: <3cyYWr6fmFz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/c13ef65f3dcf changeset: 86333:c13ef65f3dcf parent: 86331:2933598a7802 parent: 86332:19ce90930e8b user: Antoine Pitrou date: Sun Oct 13 21:54:15 2013 +0200 summary: Issue #18776: atexit callbacks now display their full traceback when they raise an exception. files: Lib/test/test_atexit.py | 19 +++++++++++++++++++ Misc/NEWS | 3 +++ Python/pythonrun.c | 10 ++++++++++ 3 files changed, 32 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -77,6 +77,25 @@ self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) self.assertIn("ZeroDivisionError", self.stream.getvalue()) + def test_print_tracebacks(self): + # Issue #18776: the tracebacks should be printed when errors occur. + def f(): + 1/0 # one + def g(): + 1/0 # two + def h(): + 1/0 # three + atexit.register(f) + atexit.register(g) + atexit.register(h) + + self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) + stderr = self.stream.getvalue() + self.assertEqual(stderr.count("ZeroDivisionError"), 3) + self.assertIn("# one", stderr) + self.assertIn("# two", stderr) + self.assertIn("# three", stderr) + def test_stress(self): a = [0] def inc(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,9 @@ Library ------- +- Issue #18776: atexit callbacks now display their full traceback when they + raise an exception. + - Issue #17827: Add the missing documentation for ``codecs.encode`` and ``codecs.decode``. diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1919,6 +1919,16 @@ { PyObject *seen; PyObject *f = PySys_GetObject("stderr"); + if (PyExceptionInstance_Check(value) + && tb != NULL && PyTraceBack_Check(tb)) { + /* Put the traceback on the exception, otherwise it won't get + displayed. See issue #18776. */ + PyObject *cur_tb = PyException_GetTraceback(value); + if (cur_tb == NULL) + PyException_SetTraceback(value, tb); + else + Py_DECREF(cur_tb); + } if (f == Py_None) { /* pass */ } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:14:02 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 13 Oct 2013 22:14:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_unexpected_headings?= =?utf-8?q?_from_Misc/NEWS?= Message-ID: <3cyYyL0Y0mz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/eeb74e020034 changeset: 86334:eeb74e020034 user: Antoine Pitrou date: Sun Oct 13 22:13:56 2013 +0200 summary: Remove unexpected headings from Misc/NEWS files: Misc/NEWS | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1344,14 +1344,6 @@ - Issue #12990: The "Python Launcher" on OSX could not launch python scripts that have paths that include wide characters. -What's New in Python 3.3.1 release candidate 1? -=============================================== - -*Release date: 24-Mar-2013* - -Core and Builtins ------------------ - - Issue #17328: Fix possible refleak in dict.setdefault. - Issue #17275: Corrected class name in init error messages of the C version of -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:16:42 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:16:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2317335=3A_remove_?= =?utf-8?q?no-op_assignment=2E?= Message-ID: <3cyZ1Q1nvgz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/b9d3e99ea516 changeset: 86335:b9d3e99ea516 user: Georg Brandl date: Sun Oct 13 22:16:48 2013 +0200 summary: Closes #17335: remove no-op assignment. files: Lib/cgi.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -676,7 +676,6 @@ encoding=self.encoding, errors=self.errors) for key, value in query: self.list.append(MiniFieldStorage(key, value)) - FieldStorageClass = None klass = self.FieldStorageClass or self.__class__ first_line = self.fp.readline() # bytes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:19:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:19:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTI0?= =?utf-8?q?8=3A_actually_check_for_Python_3=2Ex_in_tools/sphinx-build=2Epy?= =?utf-8?q?=2E?= Message-ID: <3cyZ4V0p5Lz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/6e65ee2a0073 changeset: 86336:6e65ee2a0073 branch: 3.3 parent: 86332:19ce90930e8b user: Georg Brandl date: Sun Oct 13 22:19:49 2013 +0200 summary: Closes #19248: actually check for Python 3.x in tools/sphinx-build.py. files: Doc/tools/sphinx-build.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinx-build.py b/Doc/tools/sphinx-build.py --- a/Doc/tools/sphinx-build.py +++ b/Doc/tools/sphinx-build.py @@ -15,7 +15,7 @@ if __name__ == '__main__': - if sys.version_info[:3] < (2, 4, 0): + if sys.version_info[:3] < (2, 4, 0) or sys.version_info[:3] > (3, 0, 0): sys.stderr.write("""\ Error: Sphinx needs to be executed with Python 2.4 or newer (not 3.0 though). (If you run this from the Makefile, you can set the PYTHON variable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:19:23 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:19:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyZ4W2TL5z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/d155c51a2c5b changeset: 86337:d155c51a2c5b parent: 86335:b9d3e99ea516 parent: 86336:6e65ee2a0073 user: Georg Brandl date: Sun Oct 13 22:20:08 2013 +0200 summary: merge with 3.3 files: Doc/tools/sphinx-build.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinx-build.py b/Doc/tools/sphinx-build.py --- a/Doc/tools/sphinx-build.py +++ b/Doc/tools/sphinx-build.py @@ -15,7 +15,7 @@ if __name__ == '__main__': - if sys.version_info[:3] < (2, 4, 0): + if sys.version_info[:3] < (2, 4, 0) or sys.version_info[:3] > (3, 0, 0): sys.stderr.write("""\ Error: Sphinx needs to be executed with Python 2.4 or newer (not 3.0 though). (If you run this from the Makefile, you can set the PYTHON variable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:22:46 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:22:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Wing_IDE_is_sw?= =?utf-8?q?itching_to_PyQt=2E=2E=2E?= Message-ID: <3cyZ8Q4Chgz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/7a2256a6aceb changeset: 86338:7a2256a6aceb branch: 3.3 parent: 86336:6e65ee2a0073 user: Georg Brandl date: Sun Oct 13 22:23:27 2013 +0200 summary: Wing IDE is switching to PyQt... files: Doc/library/othergui.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -19,8 +19,7 @@ `PyGTK `_ provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:22:47 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:22:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cyZ8R616Gz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/701397e23249 changeset: 86339:701397e23249 parent: 86337:d155c51a2c5b parent: 86338:7a2256a6aceb user: Georg Brandl date: Sun Oct 13 22:23:34 2013 +0200 summary: merge with 3.3 files: Doc/library/othergui.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -19,8 +19,7 @@ `PyGTK `_ provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:23:47 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:23:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Wing_IDE_is_sw?= =?utf-8?q?itching_to_PyQt=2E=2E=2E?= Message-ID: <3cyZ9b5vFhz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/68e7acb0ba5b changeset: 86340:68e7acb0ba5b branch: 2.7 parent: 86326:bca5ba1ea5aa user: Georg Brandl date: Sun Oct 13 22:23:27 2013 +0200 summary: Wing IDE is switching to PyQt... files: Doc/library/othergui.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -13,8 +13,7 @@ provides an object oriented interface that is slightly higher level than the C one. It comes with many more widgets than Tkinter provides, and has good Python-specific reference documentation. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:24:22 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 22:24:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_spacing_of_toplevel_it?= =?utf-8?q?ems=2E?= Message-ID: <3cyZBG0HVVz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/096eae786285 changeset: 86341:096eae786285 parent: 86339:701397e23249 user: Georg Brandl date: Sun Oct 13 22:25:10 2013 +0200 summary: Fix spacing of toplevel items. files: Doc/library/contextlib.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -94,6 +94,7 @@ without needing to explicitly close ``page``. Even if an error occurs, ``page.close()`` will be called when the :keyword:`with` block is exited. + .. function:: ignore(*exceptions) Return a context manager that ignores the specified exceptions if they @@ -156,6 +157,7 @@ .. versionadded:: 3.4 + .. class:: ContextDecorator() A base class that enables a context manager to also be used as a decorator. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:01 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NzU4?= =?utf-8?q?=3A_Fixed_and_improved_cross-references=2E?= Message-ID: <3cyZQY5c60z7Ljc@mail.python.org> http://hg.python.org/cpython/rev/fa7cfbec0d32 changeset: 86342:fa7cfbec0d32 branch: 2.7 parent: 86326:bca5ba1ea5aa user: Serhiy Storchaka date: Sun Oct 13 23:09:00 2013 +0300 summary: Issue #18758: Fixed and improved cross-references. files: Doc/faq/design.rst | 3 ++- Doc/library/2to3.rst | 4 ++-- Doc/library/abc.rst | 18 +++++++++--------- Doc/library/asyncore.rst | 8 ++++---- Doc/library/audioop.rst | 2 +- Doc/library/calendar.rst | 9 +++++---- Doc/library/chunk.rst | 5 +++-- Doc/library/code.rst | 10 +++++----- Doc/library/codecs.rst | 22 ++++++++++++---------- Doc/library/collections.rst | 6 +++--- Doc/library/difflib.rst | 12 +++++++----- Doc/library/exceptions.rst | 2 +- Doc/library/fileinput.rst | 11 ++++++----- Doc/library/ftplib.rst | 4 ++-- Doc/library/imaplib.rst | 5 +++-- Doc/library/mailbox.rst | 4 ++-- Doc/library/math.rst | 5 +++-- Doc/library/msilib.rst | 5 +++-- Doc/library/ossaudiodev.rst | 4 ++-- Doc/library/socket.rst | 2 +- Doc/library/socketserver.rst | 14 +++++++------- Doc/library/stat.rst | 4 ++-- Doc/library/telnetlib.rst | 2 +- Doc/library/time.rst | 4 ++-- Doc/library/xml.sax.reader.rst | 12 ++++++------ Doc/library/zipfile.rst | 5 +++-- Misc/NEWS | 2 ++ 27 files changed, 99 insertions(+), 85 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -682,7 +682,8 @@ (ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check whether an instance or a class implements a particular ABC. The :mod:`collections` module defines a set of useful ABCs such as -:class:`Iterable`, :class:`Container`, and :class:`MutableMapping`. +:class:`~collections.Iterable`, :class:`~collections.Container`, and +:class:`~collections.MutableMapping`. For Python, many of the advantages of interface specifications can be obtained by an appropriate test discipline for components. There is also a tool, diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -290,11 +290,11 @@ Converts the use of iterator's :meth:`~iterator.next` methods to the :func:`next` function. It also renames :meth:`next` methods to - :meth:`~object.__next__`. + :meth:`~iterator.__next__`. .. 2to3fixer:: nonzero - Renames :meth:`~object.__nonzero__` to :meth:`~object.__bool__`. + Renames :meth:`__nonzero__` to :meth:`~object.__bool__`. .. 2to3fixer:: numliterals diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -110,19 +110,19 @@ MyIterable.register(Foo) The ABC ``MyIterable`` defines the standard iterable method, - :meth:`__iter__`, as an abstract method. The implementation given here can - still be called from subclasses. The :meth:`get_iterator` method is also - part of the ``MyIterable`` abstract base class, but it does not have to be - overridden in non-abstract derived classes. + :meth:`~iterator.__iter__`, as an abstract method. The implementation given + here can still be called from subclasses. The :meth:`get_iterator` method + is also part of the ``MyIterable`` abstract base class, but it does not have + to be overridden in non-abstract derived classes. The :meth:`__subclasshook__` class method defined here says that any class - that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of - one of its base classes, accessed via the :attr:`__mro__` list) is - considered a ``MyIterable`` too. + that has an :meth:`~iterator.__iter__` method in its + :attr:`~object.__dict__` (or in that of one of its base classes, accessed + via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, - even though it does not define an :meth:`__iter__` method (it uses the - old-style iterable protocol, defined in terms of :meth:`__len__` and + even though it does not define an :meth:`~iterator.__iter__` method (it uses + the old-style iterable protocol, defined in terms of :meth:`__len__` and :meth:`__getitem__`). Note that this will not make ``get_iterator`` available as a method of ``Foo``, so it is provided separately. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -53,10 +53,10 @@ channels have been closed. All arguments are optional. The *count* parameter defaults to None, resulting in the loop terminating only when all channels have been closed. The *timeout* argument sets the timeout - parameter for the appropriate :func:`select` or :func:`poll` call, measured - in seconds; the default is 30 seconds. The *use_poll* parameter, if true, - indicates that :func:`poll` should be used in preference to :func:`select` - (the default is ``False``). + parameter for the appropriate :func:`~select.select` or :func:`~select.poll` + call, measured in seconds; the default is 30 seconds. The *use_poll* + parameter, if true, indicates that :func:`~select.poll` should be used in + preference to :func:`~select.select` (the default is ``False``). The *map* parameter is a dictionary whose items are the channels to watch. As channels are closed they are deleted from their map. If *map* is diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -247,7 +247,7 @@ transmit the data but also the state. Note that you should send the *initial* state (the one you passed to :func:`lin2adpcm`) along to the decoder, not the final state (as returned by the coder). If you want to use -:func:`struct.struct` to store the state in binary you can code the first +:class:`struct.Struct` to store the state in binary you can code the first element (the predicted value) in 16 bits and the second (the delta index) in 8. The ADPCM coders have never been tried against other ADPCM coders, only against diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -294,10 +294,11 @@ .. function:: timegm(tuple) - An unrelated but handy function that takes a time tuple such as returned by the - :func:`gmtime` function in the :mod:`time` module, and returns the corresponding - Unix timestamp value, assuming an epoch of 1970, and the POSIX encoding. In - fact, :func:`time.gmtime` and :func:`timegm` are each others' inverse. + An unrelated but handy function that takes a time tuple such as returned by + the :func:`~time.gmtime` function in the :mod:`time` module, and returns the + corresponding Unix timestamp value, assuming an epoch of 1970, and the POSIX + encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each others' + inverse. .. versionadded:: 2.0 diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -55,8 +55,9 @@ Class which represents a chunk. The *file* argument is expected to be a file-like object. An instance of this class is specifically allowed. The - only method that is needed is :meth:`read`. If the methods :meth:`seek` and - :meth:`tell` are present and don't raise an exception, they are also used. + only method that is needed is :meth:`~file.read`. If the methods + :meth:`~file.seek` and :meth:`~file.tell` are present and don't + raise an exception, they are also used. If these methods are present and raise an exception, they are expected to not have altered the object. If the optional argument *align* is true, chunks are assumed to be aligned on 2-byte boundaries. If *align* is false, no diff --git a/Doc/library/code.rst b/Doc/library/code.rst --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -33,11 +33,11 @@ Convenience function to run a read-eval-print loop. This creates a new instance of :class:`InteractiveConsole` and sets *readfunc* to be used as the - :meth:`raw_input` method, if provided. If *local* is provided, it is passed to - the :class:`InteractiveConsole` constructor for use as the default namespace for - the interpreter loop. The :meth:`interact` method of the instance is then run - with *banner* passed as the banner to use, if provided. The console object is - discarded after use. + :meth:`InteractiveConsole.raw_input` method, if provided. If *local* is + provided, it is passed to the :class:`InteractiveConsole` constructor for + use as the default namespace for the interpreter loop. The :meth:`interact` + method of the instance is then run with *banner* passed as the banner to + use, if provided. The console object is discarded after use. .. function:: compile_command(source[, filename[, symbol]]) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -47,9 +47,9 @@ The various functions or classes take the following arguments: *encode* and *decode*: These must be functions or methods which have the same - interface as the :meth:`encode`/:meth:`decode` methods of Codec instances (see - Codec Interface). The functions/methods are expected to work in a stateless - mode. + interface as the :meth:`~Codec.encode`/:meth:`~Codec.decode` methods of Codec + instances (see :ref:`Codec Interface `). The functions/methods + are expected to work in a stateless mode. *incrementalencoder* and *incrementaldecoder*: These have to be factory functions providing the following interface: @@ -315,8 +315,8 @@ The :class:`Codec` class defines the interface for stateless encoders/decoders. -To simplify and standardize error handling, the :meth:`encode` and -:meth:`decode` methods may implement different error handling schemes by +To simplify and standardize error handling, the :meth:`~Codec.encode` and +:meth:`~Codec.decode` methods may implement different error handling schemes by providing the *errors* string argument. The following string values are defined and implemented by all standard Python codecs: @@ -397,12 +397,14 @@ The :class:`IncrementalEncoder` and :class:`IncrementalDecoder` classes provide the basic interface for incremental encoding and decoding. Encoding/decoding the input isn't done with one call to the stateless encoder/decoder function, but -with multiple calls to the :meth:`encode`/:meth:`decode` method of the -incremental encoder/decoder. The incremental encoder/decoder keeps track of the -encoding/decoding process during method calls. +with multiple calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method of +the incremental encoder/decoder. The incremental encoder/decoder keeps track of +the encoding/decoding process during method calls. -The joined output of calls to the :meth:`encode`/:meth:`decode` method is the -same as if all the single inputs were joined into one, and this input was +The joined output of calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method is +the same as if all the single inputs were joined into one, and this input was encoded/decoded with the stateless encoder/decoder. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -818,9 +818,9 @@ Equality tests between :class:`OrderedDict` objects are order-sensitive and are implemented as ``list(od1.items())==list(od2.items())``. Equality tests between :class:`OrderedDict` objects and other -:class:`Mapping` objects are order-insensitive like regular dictionaries. -This allows :class:`OrderedDict` objects to be substituted anywhere a -regular dictionary is used. +:class:`Mapping` objects are order-insensitive like regular +dictionaries. This allows :class:`OrderedDict` objects to be substituted +anywhere a regular dictionary is used. The :class:`OrderedDict` constructor and :meth:`update` method both accept keyword arguments, but their order is lost because Python's function call diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -632,10 +632,12 @@ Compare two sequences of lines, and generate the delta (a sequence of lines). - Each sequence must contain individual single-line strings ending with newlines. - Such sequences can be obtained from the :meth:`readlines` method of file-like - objects. The delta generated also consists of newline-terminated strings, ready - to be printed as-is via the :meth:`writelines` method of a file-like object. + Each sequence must contain individual single-line strings ending with + newlines. Such sequences can be obtained from the + :meth:`~file.readlines` method of file-like objects. The delta + generated also consists of newline-terminated strings, ready to be + printed as-is via the :meth:`~file.writelines` method of a + file-like object. .. _differ-examples: @@ -645,7 +647,7 @@ This example compares two texts. First we set up the texts, sequences of individual single-line strings ending with newlines (such sequences can also be -obtained from the :meth:`readlines` method of file-like objects): +obtained from the :meth:`~file.readlines` method of file-like objects): >>> text1 = ''' 1. Beautiful is better than ugly. ... 2. Explicit is better than implicit. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -356,7 +356,7 @@ executed, and so that a debugger can execute a script without running the risk of losing control. The :func:`os._exit` function can be used if it is absolutely positively necessary to exit immediately (for example, in the child - process after a call to :func:`fork`). + process after a call to :func:`os.fork`). The exception inherits from :exc:`BaseException` instead of :exc:`StandardError` or :exc:`Exception` so that it is not accidentally caught by code that catches diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -126,11 +126,12 @@ Class :class:`FileInput` is the implementation; its methods :meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, - :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the functions - of the same name in the module. In addition it has a :meth:`readline` method - which returns the next input line, and a :meth:`__getitem__` method which - implements the sequence behavior. The sequence must be accessed in strictly - sequential order; random access and :meth:`readline` cannot be mixed. + :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the + functions of the same name in the module. In addition it has a + :meth:`~file.readline` method which returns the next input line, + and a :meth:`__getitem__` method which implements the sequence behavior. + The sequence must be accessed in strictly sequential order; random access + and :meth:`~file.readline` cannot be mixed. With *mode* you can specify which file mode will be passed to :func:`open`. It must be one of ``'r'``, ``'rU'``, ``'U'`` and ``'rb'``. diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -265,8 +265,8 @@ Store a file in ASCII transfer mode. *command* should be an appropriate ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the - open file object *file* using its :meth:`readline` method to provide the data to - be stored. *callback* is an optional single parameter callable + open file object *file* using its :meth:`~file.readline` method to provide + the data to be stored. *callback* is an optional single parameter callable that is called on each line after it is sent. .. versionchanged:: 2.6 diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -313,8 +313,9 @@ Opens socket to *port* at *host*. This method is implicitly called by the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the ``read``, ``readline``, ``send``, and ``shutdown`` - methods. You may override this method. + method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, + :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override + this method. .. method:: IMAP4.partial(message_num, message_part, start, length) diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -994,7 +994,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). @@ -1365,7 +1365,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). diff --git a/Doc/library/math.rst b/Doc/library/math.rst --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -136,8 +136,9 @@ .. function:: trunc(x) - Return the :class:`Real` value *x* truncated to an :class:`Integral` (usually - a long integer). Uses the ``__trunc__`` method. + Return the :class:`~numbers.Real` value *x* truncated to an + :class:`~numbers.Integral` (usually a long integer). Uses the + ``__trunc__`` method. .. versionadded:: 2.6 diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -432,8 +432,9 @@ ----------- :mod:`msilib` provides several classes that wrap the GUI tables in an MSI -database. However, no standard user interface is provided; use :mod:`bdist_msi` -to create MSI files with a user-interface for installing Python packages. +database. However, no standard user interface is provided; use +:mod:`~distutils.command.bdist_msi` to create MSI files with a user-interface +for installing Python packages. .. class:: Control(dlg, name) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -163,11 +163,11 @@ is only useful in non-blocking mode. Has no return value, since the amount of data written is always equal to the amount of data supplied. -The following methods each map to exactly one :func:`ioctl` system call. The +The following methods each map to exactly one :c:func:`ioctl` system call. The correspondence is obvious: for example, :meth:`setfmt` corresponds to the ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can be useful when consulting the OSS documentation). If the underlying -:func:`ioctl` fails, they all raise :exc:`IOError`. +:c:func:`ioctl` fails, they all raise :exc:`IOError`. .. method:: oss_audio_device.nonblock() diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -186,7 +186,7 @@ RCVALL_* Constants for Windows' WSAIoctl(). The constants are used as arguments to the - :meth:`ioctl` method of socket objects. + :meth:`~socket.socket.ioctl` method of socket objects. .. versionadded:: 2.6 diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -116,13 +116,13 @@ the request handler class :meth:`handle` method. Another approach to handling multiple simultaneous requests in an environment -that supports neither threads nor :func:`fork` (or where these are too expensive -or inappropriate for the service) is to maintain an explicit table of partially -finished requests and to use :func:`select` to decide which request to work on -next (or whether to handle a new incoming request). This is particularly -important for stream services where each client can potentially be connected for -a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` for -another way to manage this. +that supports neither threads nor :func:`~os.fork` (or where these are too +expensive or inappropriate for the service) is to maintain an explicit table of +partially finished requests and to use :func:`~select.select` to decide which +request to work on next (or whether to handle a new incoming request). This is +particularly important for stream services where each client can potentially be +connected for a long time (if threads or subprocesses cannot be used). See +:mod:`asyncore` for another way to manage this. .. XXX should data and methods be intermingled, or separate? how should the distinction between class and instance variables be drawn? diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst --- a/Doc/library/stat.rst +++ b/Doc/library/stat.rst @@ -1,5 +1,5 @@ -:mod:`stat` --- Interpreting :func:`stat` results -================================================= +:mod:`stat` --- Interpreting :func:`~os.stat` results +===================================================== .. module:: stat :synopsis: Utilities for interpreting the results of os.stat(), os.lstat() and os.fstat(). diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -189,7 +189,7 @@ Read until one from a list of a regular expressions matches. The first argument is a list of regular expressions, either compiled - (:class:`re.RegexObject` instances) or uncompiled (strings). The optional second + (:class:`regex objects `) or uncompiled (strings). The optional second argument is a timeout, in seconds; the default is to block indefinitely. Return a tuple of three items: the index in the list of the first regular diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -553,8 +553,8 @@ of many format specifiers in :func:`strftime` and :func:`strptime`. Module :mod:`calendar` - General calendar-related functions. :func:`timegm` is the inverse of - :func:`gmtime` from this module. + General calendar-related functions. :func:`~calendar.timegm` is the + inverse of :func:`gmtime` from this module. .. rubric:: Footnotes diff --git a/Doc/library/xml.sax.reader.rst b/Doc/library/xml.sax.reader.rst --- a/Doc/library/xml.sax.reader.rst +++ b/Doc/library/xml.sax.reader.rst @@ -329,12 +329,12 @@ --------------------------------- :class:`Attributes` objects implement a portion of the mapping protocol, -including the methods :meth:`~collections.abc.Mapping.copy`, -:meth:`~collections.abc.Mapping.get`, -:meth:`~collections.abc.Mapping.has_key`, -:meth:`~collections.abc.Mapping.items`, -:meth:`~collections.abc.Mapping.keys`, -and :meth:`~collections.abc.Mapping.values`. The following methods +including the methods :meth:`~collections.Mapping.copy`, +:meth:`~collections.Mapping.get`, +:meth:`~collections.Mapping.has_key`, +:meth:`~collections.Mapping.items`, +:meth:`~collections.Mapping.keys`, +and :meth:`~collections.Mapping.values`. The following methods are also provided: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -180,8 +180,9 @@ .. note:: The file-like object is read-only and provides the following methods: - :meth:`!read`, :meth:`!readline`, :meth:`!readlines`, :meth:`!__iter__`, - :meth:`!next`. + :meth:`~file.read`, :meth:`~file.readline`, + :meth:`~file.readlines`, :meth:`__iter__`, + :meth:`~object.next`. .. note:: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -321,6 +321,8 @@ Documentation ------------- +- Issue #18758: Fixed and improved cross-references. + - Issue #18718: datetime documentation contradictory on leap second support. - Issue #17701: Improving strftime documentation. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:03 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NzU4?= =?utf-8?q?=3A_Fixed_and_improved_cross-references=2E?= Message-ID: <3cyZQb4Xqcz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/907da535ed9d changeset: 86343:907da535ed9d branch: 3.3 parent: 86332:19ce90930e8b user: Serhiy Storchaka date: Sun Oct 13 23:09:14 2013 +0300 summary: Issue #18758: Fixed and improved cross-references. files: Doc/faq/design.rst | 3 +- Doc/howto/unicode.rst | 10 +++++--- Doc/howto/urllib2.rst | 2 +- Doc/library/2to3.rst | 4 +- Doc/library/_thread.rst | 2 +- Doc/library/abc.rst | 18 ++++++++-------- Doc/library/asyncore.rst | 8 +++--- Doc/library/audioop.rst | 2 +- Doc/library/calendar.rst | 9 ++++--- Doc/library/chunk.rst | 5 ++- Doc/library/code.rst | 14 ++++++------ Doc/library/codecs.rst | 22 +++++++++++--------- Doc/library/collections.abc.rst | 5 ++- Doc/library/collections.rst | 6 ++-- Doc/library/configparser.rst | 3 +- Doc/library/dbm.rst | 5 ++- Doc/library/difflib.rst | 20 ++++++++++-------- Doc/library/exceptions.rst | 11 ++++----- Doc/library/fileinput.rst | 11 +++++---- Doc/library/ftplib.rst | 4 +- Doc/library/http.server.rst | 6 ++-- Doc/library/imaplib.rst | 5 ++- Doc/library/inspect.rst | 5 ++- Doc/library/io.rst | 4 +- Doc/library/itertools.rst | 6 ++-- Doc/library/mailbox.rst | 4 +- Doc/library/math.rst | 9 ++++--- Doc/library/msilib.rst | 5 ++- Doc/library/ossaudiodev.rst | 4 +- Doc/library/pyexpat.rst | 10 ++++---- Doc/library/shelve.rst | 4 +- Doc/library/socket.rst | 2 +- Doc/library/socketserver.rst | 14 ++++++------ Doc/library/stat.rst | 4 +- Doc/library/telnetlib.rst | 2 +- Doc/library/time.rst | 4 +- Doc/library/unittest.mock.rst | 8 +++--- Doc/library/warnings.rst | 2 +- Doc/library/zipfile.rst | 5 ++- Misc/NEWS | 2 + 40 files changed, 144 insertions(+), 125 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -634,7 +634,8 @@ (ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check whether an instance or a class implements a particular ABC. The :mod:`collections.abc` module defines a set of useful ABCs such as -:class:`Iterable`, :class:`Container`, and :class:`MutableMapping`. +:class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and +:class:`~collections.abc.MutableMapping`. For Python, many of the advantages of interface specifications can be obtained by an appropriate test discipline for components. There is also a tool, diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -531,9 +531,10 @@ of partial coding sequences. The work of implementing this has already been done for you: the built-in :func:`open` function can return a file-like object that assumes the file's contents are in a specified encoding and accepts Unicode -parameters for methods such as :meth:`read` and :meth:`write`. This works through -:func:`open`\'s *encoding* and *errors* parameters which are interpreted just -like those in :meth:`str.encode` and :meth:`bytes.decode`. +parameters for methods such as :meth:`~io.TextIOBase.read` and +:meth:`~io.TextIOBase.write`. This works through:func:`open`\'s *encoding* and +*errors* parameters which are interpreted just like those in :meth:`str.encode` +and :meth:`bytes.decode`. Reading Unicode from a file is therefore simple:: @@ -656,7 +657,8 @@ and behaving like a stream returning data in encoding #2. For example, if you have an input file *f* that's in Latin-1, you -can wrap it with a :class:`StreamRecoder` to return bytes encoded in UTF-8:: +can wrap it with a :class:`~codecs.StreamRecoder` to return bytes encoded in +UTF-8:: new_f = codecs.StreamRecoder(f, # en/decoder: used by read() to encode its results and diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -57,7 +57,7 @@ html = response.read() If you wish to retrieve a resource via URL and store it in a temporary location, -you can do so via the :func:`urlretrieve` function:: +you can do so via the :func:`~urllib.request.urlretrieve` function:: import urllib.request local_filename, headers = urllib.request.urlretrieve('http://python.org/') diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -290,11 +290,11 @@ Converts the use of iterator's :meth:`~iterator.next` methods to the :func:`next` function. It also renames :meth:`next` methods to - :meth:`~object.__next__`. + :meth:`~iterator.__next__`. .. 2to3fixer:: nonzero - Renames :meth:`~object.__nonzero__` to :meth:`~object.__bool__`. + Renames :meth:`__nonzero__` to :meth:`~object.__bool__`. .. 2to3fixer:: numliterals diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -177,7 +177,7 @@ equivalent to calling :func:`_thread.exit`. * Not all built-in functions that may block waiting for I/O allow other threads - to run. (The most popular ones (:func:`time.sleep`, :meth:`file.read`, + to run. (The most popular ones (:func:`time.sleep`, :meth:`io.FileIO.read`, :func:`select.select`) work as expected.) * It is not possible to interrupt the :meth:`acquire` method on a lock --- the diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -110,19 +110,19 @@ MyIterable.register(Foo) The ABC ``MyIterable`` defines the standard iterable method, - :meth:`__iter__`, as an abstract method. The implementation given here can - still be called from subclasses. The :meth:`get_iterator` method is also - part of the ``MyIterable`` abstract base class, but it does not have to be - overridden in non-abstract derived classes. + :meth:`~iterator.__iter__`, as an abstract method. The implementation given + here can still be called from subclasses. The :meth:`get_iterator` method + is also part of the ``MyIterable`` abstract base class, but it does not have + to be overridden in non-abstract derived classes. The :meth:`__subclasshook__` class method defined here says that any class - that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of - one of its base classes, accessed via the :attr:`__mro__` list) is - considered a ``MyIterable`` too. + that has an :meth:`~iterator.__iter__` method in its + :attr:`~object.__dict__` (or in that of one of its base classes, accessed + via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, - even though it does not define an :meth:`__iter__` method (it uses the - old-style iterable protocol, defined in terms of :meth:`__len__` and + even though it does not define an :meth:`~iterator.__iter__` method (it uses + the old-style iterable protocol, defined in terms of :meth:`__len__` and :meth:`__getitem__`). Note that this will not make ``get_iterator`` available as a method of ``Foo``, so it is provided separately. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -53,10 +53,10 @@ channels have been closed. All arguments are optional. The *count* parameter defaults to None, resulting in the loop terminating only when all channels have been closed. The *timeout* argument sets the timeout - parameter for the appropriate :func:`select` or :func:`poll` call, measured - in seconds; the default is 30 seconds. The *use_poll* parameter, if true, - indicates that :func:`poll` should be used in preference to :func:`select` - (the default is ``False``). + parameter for the appropriate :func:`~select.select` or :func:`~select.poll` + call, measured in seconds; the default is 30 seconds. The *use_poll* + parameter, if true, indicates that :func:`~select.poll` should be used in + preference to :func:`~select.select` (the default is ``False``). The *map* parameter is a dictionary whose items are the channels to watch. As channels are closed they are deleted from their map. If *map* is diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -241,7 +241,7 @@ transmit the data but also the state. Note that you should send the *initial* state (the one you passed to :func:`lin2adpcm`) along to the decoder, not the final state (as returned by the coder). If you want to use -:func:`struct.struct` to store the state in binary you can code the first +:class:`struct.Struct` to store the state in binary you can code the first element (the predicted value) in 16 bits and the second (the delta index) in 8. The ADPCM coders have never been tried against other ADPCM coders, only against diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -272,10 +272,11 @@ .. function:: timegm(tuple) - An unrelated but handy function that takes a time tuple such as returned by the - :func:`gmtime` function in the :mod:`time` module, and returns the corresponding - Unix timestamp value, assuming an epoch of 1970, and the POSIX encoding. In - fact, :func:`time.gmtime` and :func:`timegm` are each others' inverse. + An unrelated but handy function that takes a time tuple such as returned by + the :func:`~time.gmtime` function in the :mod:`time` module, and returns the + corresponding Unix timestamp value, assuming an epoch of 1970, and the POSIX + encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each others' + inverse. The :mod:`calendar` module exports the following data attributes: diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -54,8 +54,9 @@ Class which represents a chunk. The *file* argument is expected to be a file-like object. An instance of this class is specifically allowed. The - only method that is needed is :meth:`read`. If the methods :meth:`seek` and - :meth:`tell` are present and don't raise an exception, they are also used. + only method that is needed is :meth:`~io.IOBase.read`. If the methods + :meth:`~io.IOBase.seek` and :meth:`~io.IOBase.tell` are present and don't + raise an exception, they are also used. If these methods are present and raise an exception, they are expected to not have altered the object. If the optional argument *align* is true, chunks are assumed to be aligned on 2-byte boundaries. If *align* is false, no diff --git a/Doc/library/code.rst b/Doc/library/code.rst --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -29,13 +29,13 @@ .. function:: interact(banner=None, readfunc=None, local=None) - Convenience function to run a read-eval-print loop. This creates a new instance - of :class:`InteractiveConsole` and sets *readfunc* to be used as the - :meth:`raw_input` method, if provided. If *local* is provided, it is passed to - the :class:`InteractiveConsole` constructor for use as the default namespace for - the interpreter loop. The :meth:`interact` method of the instance is then run - with *banner* passed as the banner to use, if provided. The console object is - discarded after use. + Convenience function to run a read-eval-print loop. This creates a new + instance of :class:`InteractiveConsole` and sets *readfunc* to be used as + the :meth:`InteractiveConsole.raw_input` method, if provided. If *local* is + provided, it is passed to the :class:`InteractiveConsole` constructor for + use as the default namespace for the interpreter loop. The :meth:`interact` + method of the instance is then run with *banner* passed as the banner to + use, if provided. The console object is discarded after use. .. function:: compile_command(source, filename="", symbol="single") diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -65,9 +65,9 @@ The various functions or classes take the following arguments: *encode* and *decode*: These must be functions or methods which have the same - interface as the :meth:`encode`/:meth:`decode` methods of Codec instances (see - Codec Interface). The functions/methods are expected to work in a stateless - mode. + interface as the :meth:`~Codec.encode`/:meth:`~Codec.decode` methods of Codec + instances (see :ref:`Codec Interface `). The functions/methods + are expected to work in a stateless mode. *incrementalencoder* and *incrementaldecoder*: These have to be factory functions providing the following interface: @@ -333,8 +333,8 @@ The :class:`Codec` class defines the interface for stateless encoders/decoders. -To simplify and standardize error handling, the :meth:`encode` and -:meth:`decode` methods may implement different error handling schemes by +To simplify and standardize error handling, the :meth:`~Codec.encode` and +:meth:`~Codec.decode` methods may implement different error handling schemes by providing the *errors* string argument. The following string values are defined and implemented by all standard Python codecs: @@ -428,12 +428,14 @@ The :class:`IncrementalEncoder` and :class:`IncrementalDecoder` classes provide the basic interface for incremental encoding and decoding. Encoding/decoding the input isn't done with one call to the stateless encoder/decoder function, but -with multiple calls to the :meth:`encode`/:meth:`decode` method of the -incremental encoder/decoder. The incremental encoder/decoder keeps track of the -encoding/decoding process during method calls. +with multiple calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method of +the incremental encoder/decoder. The incremental encoder/decoder keeps track of +the encoding/decoding process during method calls. -The joined output of calls to the :meth:`encode`/:meth:`decode` method is the -same as if all the single inputs were joined into one, and this input was +The joined output of calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method is +the same as if all the single inputs were joined into one, and this input was encoded/decoded with the stateless encoder/decoder. diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -98,8 +98,9 @@ .. class:: Iterator - ABC for classes that provide the :meth:`__iter__` and :meth:`__next__` methods. - See also the definition of :term:`iterator`. + ABC for classes that provide the :meth:`~iterator.__iter__` and + :meth:`~iterator.__next__` methods. See also the definition of + :term:`iterator`. .. class:: Sequence MutableSequence diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -974,9 +974,9 @@ Equality tests between :class:`OrderedDict` objects are order-sensitive and are implemented as ``list(od1.items())==list(od2.items())``. Equality tests between :class:`OrderedDict` objects and other -:class:`Mapping` objects are order-insensitive like regular dictionaries. -This allows :class:`OrderedDict` objects to be substituted anywhere a -regular dictionary is used. +:class:`~collections.abc.Mapping` objects are order-insensitive like regular +dictionaries. This allows :class:`OrderedDict` objects to be substituted +anywhere a regular dictionary is used. The :class:`OrderedDict` constructor and :meth:`update` method both accept keyword arguments, but their order is lost because Python's function call diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -371,7 +371,8 @@ parser. :mod:`configparser` objects behave as close to actual dictionaries as possible. -The mapping interface is complete and adheres to the ``MutableMapping`` ABC. +The mapping interface is complete and adheres to the +:class:`~collections.abc.MutableMapping` ABC. However, there are a few differences that should be taken into account: * By default, all keys in sections are accessible in a case-insensitive manner diff --git a/Doc/library/dbm.rst b/Doc/library/dbm.rst --- a/Doc/library/dbm.rst +++ b/Doc/library/dbm.rst @@ -317,8 +317,9 @@ database has to be created. It defaults to octal ``0o666`` (and will be modified by the prevailing umask). - In addition to the methods provided by the :class:`collections.MutableMapping` class, - :class:`dumbdbm` objects provide the following method: + In addition to the methods provided by the + :class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects + provide the following method: .. method:: dumbdbm.sync() diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -143,8 +143,8 @@ By default, the diff control lines (those with ``***`` or ``---``) are created with a trailing newline. This is helpful so that inputs created from - :func:`file.readlines` result in diffs that are suitable for use with - :func:`file.writelines` since both the inputs and outputs have trailing + :func:`io.IOBase.readlines` result in diffs that are suitable for use with + :func:`io.IOBase.writelines` since both the inputs and outputs have trailing newlines. For inputs that do not have trailing newlines, set the *lineterm* argument to @@ -275,8 +275,8 @@ By default, the diff control lines (those with ``---``, ``+++``, or ``@@``) are created with a trailing newline. This is helpful so that inputs created from - :func:`file.readlines` result in diffs that are suitable for use with - :func:`file.writelines` since both the inputs and outputs have trailing + :func:`io.IOBase.readlines` result in diffs that are suitable for use with + :func:`io.IOBase.writelines` since both the inputs and outputs have trailing newlines. For inputs that do not have trailing newlines, set the *lineterm* argument to @@ -629,10 +629,12 @@ Compare two sequences of lines, and generate the delta (a sequence of lines). - Each sequence must contain individual single-line strings ending with newlines. - Such sequences can be obtained from the :meth:`readlines` method of file-like - objects. The delta generated also consists of newline-terminated strings, ready - to be printed as-is via the :meth:`writelines` method of a file-like object. + Each sequence must contain individual single-line strings ending with + newlines. Such sequences can be obtained from the + :meth:`~io.IOBase.readlines` method of file-like objects. The delta + generated also consists of newline-terminated strings, ready to be + printed as-is via the :meth:`~io.IOBase.writelines` method of a + file-like object. .. _differ-examples: @@ -642,7 +644,7 @@ This example compares two texts. First we set up the texts, sequences of individual single-line strings ending with newlines (such sequences can also be -obtained from the :meth:`readlines` method of file-like objects): +obtained from the :meth:`~io.BaseIO.readlines` method of file-like objects): >>> text1 = ''' 1. Beautiful is better than ugly. ... 2. Explicit is better than implicit. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -146,10 +146,9 @@ .. exception:: EOFError - Raised when one of the built-in functions (:func:`input` or :func:`raw_input`) - hits an end-of-file condition (EOF) without reading any data. (N.B.: the - :meth:`file.read` and :meth:`file.readline` methods return an empty string - when they hit EOF.) + Raised when the :func:`input` function hits an end-of-file condition (EOF) + without reading any data. (N.B.: the :meth:`io.IOBase.read` and + :meth:`io.IOBase.readline` methods return an empty string when they hit EOF.) .. exception:: FloatingPointError @@ -360,7 +359,7 @@ executed, and so that a debugger can execute a script without running the risk of losing control. The :func:`os._exit` function can be used if it is absolutely positively necessary to exit immediately (for example, in the child - process after a call to :func:`fork`). + process after a call to :func:`os.fork`). The exception inherits from :exc:`BaseException` instead of :exc:`Exception` so that it is not accidentally caught by code that catches :exc:`Exception`. This @@ -623,7 +622,7 @@ .. exception:: BytesWarning - Base class for warnings related to :class:`bytes` and :class:`buffer`. + Base class for warnings related to :class:`bytes` and :class:`bytearray`. .. exception:: ResourceWarning diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -136,11 +136,12 @@ Class :class:`FileInput` is the implementation; its methods :meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, - :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the functions - of the same name in the module. In addition it has a :meth:`readline` method - which returns the next input line, and a :meth:`__getitem__` method which - implements the sequence behavior. The sequence must be accessed in strictly - sequential order; random access and :meth:`readline` cannot be mixed. + :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the + functions of the same name in the module. In addition it has a + :meth:`~io.TextIOBase.readline` method which returns the next input line, + and a :meth:`__getitem__` method which implements the sequence behavior. + The sequence must be accessed in strictly sequential order; random access + and :meth:`~io.TextIOBase.readline` cannot be mixed. With *mode* you can specify which file mode will be passed to :func:`open`. It must be one of ``'r'``, ``'rU'``, ``'U'`` and ``'rb'``. diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -272,7 +272,7 @@ Store a file in binary transfer mode. *cmd* should be an appropriate ``STOR`` command: ``"STOR filename"``. *file* is a :term:`file object` - (opened in binary mode) which is read until EOF using its :meth:`read` + (opened in binary mode) which is read until EOF using its :meth:`~io.IOBase.read` method in blocks of size *blocksize* to provide the data to be stored. The *blocksize* argument defaults to 8192. *callback* is an optional single parameter callable that is called on each block of data after it is sent. @@ -286,7 +286,7 @@ Store a file in ASCII transfer mode. *cmd* should be an appropriate ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the - :term:`file object` *file* (opened in binary mode) using its :meth:`readline` + :term:`file object` *file* (opened in binary mode) using its :meth:`~io.IOBase.readline` method to provide the data to be stored. *callback* is an optional single parameter callable that is called on each line after it is sent. diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -29,8 +29,8 @@ .. class:: HTTPServer(server_address, RequestHandlerClass) - This class builds on the :class:`TCPServer` class by storing the server - address as instance variables named :attr:`server_name` and + This class builds on the :class:`~socketserver.TCPServer` class by storing + the server address as instance variables named :attr:`server_name` and :attr:`server_port`. The server is accessible by the handler, typically through the handler's :attr:`server` instance variable. @@ -319,7 +319,7 @@ file's contents are returned; otherwise a directory listing is generated by calling the :meth:`list_directory` method. This method uses :func:`os.listdir` to scan the directory, and returns a ``404`` error - response if the :func:`listdir` fails. + response if the :func:`~os.listdir` fails. If the request was mapped to a file, it is opened and the contents are returned. Any :exc:`OSError` exception in opening the requested file is diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -310,8 +310,9 @@ Opens socket to *port* at *host*. This method is implicitly called by the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the ``read``, ``readline``, ``send``, and ``shutdown`` - methods. You may override this method. + method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, + :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override + this method. .. method:: IMAP4.partial(message_num, message_part, start, length) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -906,8 +906,9 @@ that raise AttributeError). It can also return descriptors objects instead of instance members. - If the instance :attr:`__dict__` is shadowed by another member (for example a - property) then this function will be unable to find instance members. + If the instance :attr:`~object.__dict__` is shadowed by another member (for + example a property) then this function will be unable to find instance + members. .. versionadded:: 3.2 diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -157,7 +157,7 @@ The abstract base classes also provide default implementations of some methods in order to help implementation of concrete stream classes. For example, :class:`BufferedIOBase` provides unoptimized implementations of - ``readinto()`` and ``readline()``. + :meth:`~IOBase.readinto` and :meth:`~IOBase.readline`. At the top of the I/O hierarchy is the abstract base class :class:`IOBase`. It defines the basic interface to a stream. Note, however, that there is no @@ -228,7 +228,7 @@ The basic type used for binary data read from or written to a file is :class:`bytes`. :class:`bytearray`\s are accepted too, and in some cases - (such as :class:`readinto`) required. Text I/O classes work with + (such as :meth:`readinto`) required. Text I/O classes work with :class:`str` data. Note that calling any method (even inquiries) on a closed stream is diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -88,9 +88,9 @@ .. function:: accumulate(iterable[, func]) Make an iterator that returns accumulated sums. Elements may be any addable - type including :class:`Decimal` or :class:`Fraction`. If the optional - *func* argument is supplied, it should be a function of two arguments - and it will be used instead of addition. + type including :class:`~decimal.Decimal` or :class:`~fractions.Fraction`. + If the optional *func* argument is supplied, it should be a function of two + arguments and it will be used instead of addition. Equivalent to:: diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -1009,7 +1009,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). @@ -1380,7 +1380,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). diff --git a/Doc/library/math.rst b/Doc/library/math.rst --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -31,7 +31,7 @@ Return the ceiling of *x*, the smallest integer greater than or equal to *x*. If *x* is not a float, delegates to ``x.__ceil__()``, which should return an - :class:`Integral` value. + :class:`~numbers.Integral` value. .. function:: copysign(x, y) @@ -53,7 +53,7 @@ Return the floor of *x*, the largest integer less than or equal to *x*. If *x* is not a float, delegates to ``x.__floor__()``, which should return an - :class:`Integral` value. + :class:`~numbers.Integral` value. .. function:: fmod(x, y) @@ -133,8 +133,9 @@ .. function:: trunc(x) - Return the :class:`Real` value *x* truncated to an :class:`Integral` (usually - an integer). Delegates to ``x.__trunc__()``. + Return the :class:`~numbers.Real` value *x* truncated to an + :class:`~numbers.Integral` (usually an integer). Delegates to + ``x.__trunc__()``. Note that :func:`frexp` and :func:`modf` have a different call/return pattern diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -429,8 +429,9 @@ ----------- :mod:`msilib` provides several classes that wrap the GUI tables in an MSI -database. However, no standard user interface is provided; use :mod:`bdist_msi` -to create MSI files with a user-interface for installing Python packages. +database. However, no standard user interface is provided; use +:mod:`~distutils.command.bdist_msi` to create MSI files with a user-interface +for installing Python packages. .. class:: Control(dlg, name) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -169,11 +169,11 @@ be used in a :keyword:`with` statement. -The following methods each map to exactly one :func:`ioctl` system call. The +The following methods each map to exactly one :c:func:`ioctl` system call. The correspondence is obvious: for example, :meth:`setfmt` corresponds to the ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can be useful when consulting the OSS documentation). If the underlying -:func:`ioctl` fails, they all raise :exc:`OSError`. +:c:func:`ioctl` fails, they all raise :exc:`OSError`. .. method:: oss_audio_device.nonblock() diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -484,8 +484,8 @@ .. attribute:: ExpatError.code Expat's internal error number for the specific error. The - :data:`errors.messages` dictionary maps these error numbers to Expat's error - messages. For example:: + :data:`errors.messages ` dictionary maps + these error numbers to Expat's error messages. For example:: from xml.parsers.expat import ParserCreate, ExpatError, errors @@ -495,9 +495,9 @@ except ExpatError as err: print("Error:", errors.messages[err.code]) - The :mod:`errors` module also provides error message constants and a - dictionary :data:`~errors.codes` mapping these messages back to the error - codes, see below. + The :mod:`~xml.parsers.expat.errors` module also provides error message + constants and a dictionary :data:`~xml.parsers.expat.errors.codes` mapping + these messages back to the error codes, see below. .. attribute:: ExpatError.lineno diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -103,8 +103,8 @@ .. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8') - A subclass of :class:`collections.MutableMapping` which stores pickled values - in the *dict* object. + A subclass of :class:`collections.abc.MutableMapping` which stores pickled + values in the *dict* object. By default, version 0 pickles are used to serialize values. The version of the pickle protocol can be specified with the *protocol* parameter. See the diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -275,7 +275,7 @@ RCVALL_* Constants for Windows' WSAIoctl(). The constants are used as arguments to the - :meth:`ioctl` method of socket objects. + :meth:`~socket.socket.ioctl` method of socket objects. .. data:: TIPC_* diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -111,13 +111,13 @@ the request handler class :meth:`handle` method. Another approach to handling multiple simultaneous requests in an environment -that supports neither threads nor :func:`fork` (or where these are too expensive -or inappropriate for the service) is to maintain an explicit table of partially -finished requests and to use :func:`select` to decide which request to work on -next (or whether to handle a new incoming request). This is particularly -important for stream services where each client can potentially be connected for -a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` -for another way to manage this. +that supports neither threads nor :func:`~os.fork` (or where these are too +expensive or inappropriate for the service) is to maintain an explicit table of +partially finished requests and to use :func:`~select.select` to decide which +request to work on next (or whether to handle a new incoming request). This is +particularly important for stream services where each client can potentially be +connected for a long time (if threads or subprocesses cannot be used). See +:mod:`asyncore` for another way to manage this. .. XXX should data and methods be intermingled, or separate? how should the distinction between class and instance variables be drawn? diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst --- a/Doc/library/stat.rst +++ b/Doc/library/stat.rst @@ -1,5 +1,5 @@ -:mod:`stat` --- Interpreting :func:`stat` results -================================================= +:mod:`stat` --- Interpreting :func:`~os.stat` results +===================================================== .. module:: stat :synopsis: Utilities for interpreting the results of os.stat(), diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -185,7 +185,7 @@ Read until one from a list of a regular expressions matches. The first argument is a list of regular expressions, either compiled - (:class:`re.RegexObject` instances) or uncompiled (byte strings). The + (:ref:`regex objects `) or uncompiled (byte strings). The optional second argument is a timeout, in seconds; the default is to block indefinitely. diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -677,8 +677,8 @@ of many format specifiers in :func:`strftime` and :func:`strptime`. Module :mod:`calendar` - General calendar-related functions. :func:`timegm` is the inverse of - :func:`gmtime` from this module. + General calendar-related functions. :func:`~calendar.timegm` is the + inverse of :func:`gmtime` from this module. .. rubric:: Footnotes diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -210,8 +210,8 @@ Accessing any attribute not in this list will raise an `AttributeError`. If `spec` is an object (rather than a list of strings) then - :attr:`__class__` returns the class of the spec object. This allows mocks - to pass `isinstance` tests. + :attr:`~instance.__class__` returns the class of the spec object. This + allows mocks to pass `isinstance` tests. * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* or get an attribute on the mock that isn't on the object passed as @@ -1969,8 +1969,8 @@ default) then a `MagicMock` will be created for you, with the API limited to methods or attributes available on standard file handles. - `read_data` is a string for the `read` method of the file handle to return. - This is an empty string by default. + `read_data` is a string for the `~io.IOBase.read` method of the file handle + to return. This is an empty string by default. Using `open` as a context manager is a great way to ensure your file handles are closed properly and is becoming common:: diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -89,7 +89,7 @@ | | Unicode. | +----------------------------------+-----------------------------------------------+ | :exc:`BytesWarning` | Base category for warnings related to | -| | :class:`bytes` and :class:`buffer`. | +| | :class:`bytes` and :class:`bytearray`. | +----------------------------------+-----------------------------------------------+ | :exc:`ResourceWarning` | Base category for warnings related to | | | resource usage. | diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -213,8 +213,9 @@ .. note:: The file-like object is read-only and provides the following methods: - :meth:`!read`, :meth:`!readline`, :meth:`!readlines`, :meth:`!__iter__`, - :meth:`!__next__`. + :meth:`~io.BufferedIOBase.read`, :meth:`~io.IOBase.readline`, + :meth:`~io.IOBase.readlines`, :meth:`__iter__`, + :meth:`~iterator.__next__`. .. note:: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -495,6 +495,8 @@ Documentation ------------- +- Issue #18758: Fixed and improved cross-references. + - Issue #18743: Fix references to non-existant "StringIO" module. - Issue #18783: Removed existing mentions of Python long type in docstrings, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:05 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318758=3A_Fixed_and_improved_cross-references=2E?= Message-ID: <3cyZQd3Rcyz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/261d9bf0cc2b changeset: 86344:261d9bf0cc2b parent: 86333:c13ef65f3dcf parent: 86343:907da535ed9d user: Serhiy Storchaka date: Sun Oct 13 23:12:09 2013 +0300 summary: Issue #18758: Fixed and improved cross-references. files: Doc/faq/design.rst | 3 +- Doc/howto/unicode.rst | 10 +++++--- Doc/howto/urllib2.rst | 2 +- Doc/library/2to3.rst | 4 +- Doc/library/_thread.rst | 2 +- Doc/library/abc.rst | 18 ++++++++-------- Doc/library/asyncore.rst | 8 +++--- Doc/library/audioop.rst | 2 +- Doc/library/calendar.rst | 9 ++++--- Doc/library/chunk.rst | 5 ++- Doc/library/code.rst | 14 ++++++------ Doc/library/codecs.rst | 22 +++++++++++--------- Doc/library/collections.abc.rst | 5 ++- Doc/library/collections.rst | 6 ++-- Doc/library/configparser.rst | 3 +- Doc/library/dbm.rst | 5 ++- Doc/library/difflib.rst | 20 ++++++++++-------- Doc/library/enum.rst | 4 +- Doc/library/exceptions.rst | 11 ++++----- Doc/library/fileinput.rst | 11 +++++---- Doc/library/ftplib.rst | 4 +- Doc/library/http.server.rst | 6 ++-- Doc/library/imaplib.rst | 5 ++- Doc/library/importlib.rst | 2 +- Doc/library/inspect.rst | 5 ++- Doc/library/io.rst | 4 +- Doc/library/itertools.rst | 6 ++-- Doc/library/mailbox.rst | 4 +- Doc/library/math.rst | 9 ++++--- Doc/library/msilib.rst | 5 ++- Doc/library/ossaudiodev.rst | 4 +- Doc/library/pyexpat.rst | 10 ++++---- Doc/library/shelve.rst | 4 +- Doc/library/smtpd.rst | 4 +- Doc/library/socket.rst | 2 +- Doc/library/socketserver.rst | 14 ++++++------ Doc/library/stat.rst | 4 +- Doc/library/telnetlib.rst | 2 +- Doc/library/time.rst | 4 +- Doc/library/unittest.mock.rst | 7 +++-- Doc/library/warnings.rst | 2 +- Doc/library/zipfile.rst | 5 ++- Doc/whatsnew/3.4.rst | 6 ++-- Misc/NEWS | 2 + 44 files changed, 152 insertions(+), 132 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -634,7 +634,8 @@ (ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check whether an instance or a class implements a particular ABC. The :mod:`collections.abc` module defines a set of useful ABCs such as -:class:`Iterable`, :class:`Container`, and :class:`MutableMapping`. +:class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and +:class:`~collections.abc.MutableMapping`. For Python, many of the advantages of interface specifications can be obtained by an appropriate test discipline for components. There is also a tool, diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -531,9 +531,10 @@ of partial coding sequences. The work of implementing this has already been done for you: the built-in :func:`open` function can return a file-like object that assumes the file's contents are in a specified encoding and accepts Unicode -parameters for methods such as :meth:`read` and :meth:`write`. This works through -:func:`open`\'s *encoding* and *errors* parameters which are interpreted just -like those in :meth:`str.encode` and :meth:`bytes.decode`. +parameters for methods such as :meth:`~io.TextIOBase.read` and +:meth:`~io.TextIOBase.write`. This works through:func:`open`\'s *encoding* and +*errors* parameters which are interpreted just like those in :meth:`str.encode` +and :meth:`bytes.decode`. Reading Unicode from a file is therefore simple:: @@ -656,7 +657,8 @@ and behaving like a stream returning data in encoding #2. For example, if you have an input file *f* that's in Latin-1, you -can wrap it with a :class:`StreamRecoder` to return bytes encoded in UTF-8:: +can wrap it with a :class:`~codecs.StreamRecoder` to return bytes encoded in +UTF-8:: new_f = codecs.StreamRecoder(f, # en/decoder: used by read() to encode its results and diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -57,7 +57,7 @@ html = response.read() If you wish to retrieve a resource via URL and store it in a temporary location, -you can do so via the :func:`urlretrieve` function:: +you can do so via the :func:`~urllib.request.urlretrieve` function:: import urllib.request local_filename, headers = urllib.request.urlretrieve('http://python.org/') diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -290,11 +290,11 @@ Converts the use of iterator's :meth:`~iterator.next` methods to the :func:`next` function. It also renames :meth:`next` methods to - :meth:`~object.__next__`. + :meth:`~iterator.__next__`. .. 2to3fixer:: nonzero - Renames :meth:`~object.__nonzero__` to :meth:`~object.__bool__`. + Renames :meth:`__nonzero__` to :meth:`~object.__bool__`. .. 2to3fixer:: numliterals diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -177,7 +177,7 @@ equivalent to calling :func:`_thread.exit`. * Not all built-in functions that may block waiting for I/O allow other threads - to run. (The most popular ones (:func:`time.sleep`, :meth:`file.read`, + to run. (The most popular ones (:func:`time.sleep`, :meth:`io.FileIO.read`, :func:`select.select`) work as expected.) * It is not possible to interrupt the :meth:`acquire` method on a lock --- the diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -114,19 +114,19 @@ MyIterable.register(Foo) The ABC ``MyIterable`` defines the standard iterable method, - :meth:`__iter__`, as an abstract method. The implementation given here can - still be called from subclasses. The :meth:`get_iterator` method is also - part of the ``MyIterable`` abstract base class, but it does not have to be - overridden in non-abstract derived classes. + :meth:`~iterator.__iter__`, as an abstract method. The implementation given + here can still be called from subclasses. The :meth:`get_iterator` method + is also part of the ``MyIterable`` abstract base class, but it does not have + to be overridden in non-abstract derived classes. The :meth:`__subclasshook__` class method defined here says that any class - that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of - one of its base classes, accessed via the :attr:`__mro__` list) is - considered a ``MyIterable`` too. + that has an :meth:`~iterator.__iter__` method in its + :attr:`~object.__dict__` (or in that of one of its base classes, accessed + via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, - even though it does not define an :meth:`__iter__` method (it uses the - old-style iterable protocol, defined in terms of :meth:`__len__` and + even though it does not define an :meth:`~iterator.__iter__` method (it uses + the old-style iterable protocol, defined in terms of :meth:`__len__` and :meth:`__getitem__`). Note that this will not make ``get_iterator`` available as a method of ``Foo``, so it is provided separately. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -53,10 +53,10 @@ channels have been closed. All arguments are optional. The *count* parameter defaults to None, resulting in the loop terminating only when all channels have been closed. The *timeout* argument sets the timeout - parameter for the appropriate :func:`select` or :func:`poll` call, measured - in seconds; the default is 30 seconds. The *use_poll* parameter, if true, - indicates that :func:`poll` should be used in preference to :func:`select` - (the default is ``False``). + parameter for the appropriate :func:`~select.select` or :func:`~select.poll` + call, measured in seconds; the default is 30 seconds. The *use_poll* + parameter, if true, indicates that :func:`~select.poll` should be used in + preference to :func:`~select.select` (the default is ``False``). The *map* parameter is a dictionary whose items are the channels to watch. As channels are closed they are deleted from their map. If *map* is diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -241,7 +241,7 @@ transmit the data but also the state. Note that you should send the *initial* state (the one you passed to :func:`lin2adpcm`) along to the decoder, not the final state (as returned by the coder). If you want to use -:func:`struct.struct` to store the state in binary you can code the first +:class:`struct.Struct` to store the state in binary you can code the first element (the predicted value) in 16 bits and the second (the delta index) in 8. The ADPCM coders have never been tried against other ADPCM coders, only against diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -272,10 +272,11 @@ .. function:: timegm(tuple) - An unrelated but handy function that takes a time tuple such as returned by the - :func:`gmtime` function in the :mod:`time` module, and returns the corresponding - Unix timestamp value, assuming an epoch of 1970, and the POSIX encoding. In - fact, :func:`time.gmtime` and :func:`timegm` are each others' inverse. + An unrelated but handy function that takes a time tuple such as returned by + the :func:`~time.gmtime` function in the :mod:`time` module, and returns the + corresponding Unix timestamp value, assuming an epoch of 1970, and the POSIX + encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each others' + inverse. The :mod:`calendar` module exports the following data attributes: diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -54,8 +54,9 @@ Class which represents a chunk. The *file* argument is expected to be a file-like object. An instance of this class is specifically allowed. The - only method that is needed is :meth:`read`. If the methods :meth:`seek` and - :meth:`tell` are present and don't raise an exception, they are also used. + only method that is needed is :meth:`~io.IOBase.read`. If the methods + :meth:`~io.IOBase.seek` and :meth:`~io.IOBase.tell` are present and don't + raise an exception, they are also used. If these methods are present and raise an exception, they are expected to not have altered the object. If the optional argument *align* is true, chunks are assumed to be aligned on 2-byte boundaries. If *align* is false, no diff --git a/Doc/library/code.rst b/Doc/library/code.rst --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -29,13 +29,13 @@ .. function:: interact(banner=None, readfunc=None, local=None) - Convenience function to run a read-eval-print loop. This creates a new instance - of :class:`InteractiveConsole` and sets *readfunc* to be used as the - :meth:`raw_input` method, if provided. If *local* is provided, it is passed to - the :class:`InteractiveConsole` constructor for use as the default namespace for - the interpreter loop. The :meth:`interact` method of the instance is then run - with *banner* passed as the banner to use, if provided. The console object is - discarded after use. + Convenience function to run a read-eval-print loop. This creates a new + instance of :class:`InteractiveConsole` and sets *readfunc* to be used as + the :meth:`InteractiveConsole.raw_input` method, if provided. If *local* is + provided, it is passed to the :class:`InteractiveConsole` constructor for + use as the default namespace for the interpreter loop. The :meth:`interact` + method of the instance is then run with *banner* passed as the banner to + use, if provided. The console object is discarded after use. .. function:: compile_command(source, filename="", symbol="single") diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -65,9 +65,9 @@ The various functions or classes take the following arguments: *encode* and *decode*: These must be functions or methods which have the same - interface as the :meth:`encode`/:meth:`decode` methods of Codec instances (see - Codec Interface). The functions/methods are expected to work in a stateless - mode. + interface as the :meth:`~Codec.encode`/:meth:`~Codec.decode` methods of Codec + instances (see :ref:`Codec Interface `). The functions/methods + are expected to work in a stateless mode. *incrementalencoder* and *incrementaldecoder*: These have to be factory functions providing the following interface: @@ -333,8 +333,8 @@ The :class:`Codec` class defines the interface for stateless encoders/decoders. -To simplify and standardize error handling, the :meth:`encode` and -:meth:`decode` methods may implement different error handling schemes by +To simplify and standardize error handling, the :meth:`~Codec.encode` and +:meth:`~Codec.decode` methods may implement different error handling schemes by providing the *errors* string argument. The following string values are defined and implemented by all standard Python codecs: @@ -428,12 +428,14 @@ The :class:`IncrementalEncoder` and :class:`IncrementalDecoder` classes provide the basic interface for incremental encoding and decoding. Encoding/decoding the input isn't done with one call to the stateless encoder/decoder function, but -with multiple calls to the :meth:`encode`/:meth:`decode` method of the -incremental encoder/decoder. The incremental encoder/decoder keeps track of the -encoding/decoding process during method calls. +with multiple calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method of +the incremental encoder/decoder. The incremental encoder/decoder keeps track of +the encoding/decoding process during method calls. -The joined output of calls to the :meth:`encode`/:meth:`decode` method is the -same as if all the single inputs were joined into one, and this input was +The joined output of calls to the +:meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method is +the same as if all the single inputs were joined into one, and this input was encoded/decoded with the stateless encoder/decoder. diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -98,8 +98,9 @@ .. class:: Iterator - ABC for classes that provide the :meth:`__iter__` and :meth:`__next__` methods. - See also the definition of :term:`iterator`. + ABC for classes that provide the :meth:`~iterator.__iter__` and + :meth:`~iterator.__next__` methods. See also the definition of + :term:`iterator`. .. class:: Sequence MutableSequence diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -979,9 +979,9 @@ Equality tests between :class:`OrderedDict` objects are order-sensitive and are implemented as ``list(od1.items())==list(od2.items())``. Equality tests between :class:`OrderedDict` objects and other -:class:`Mapping` objects are order-insensitive like regular dictionaries. -This allows :class:`OrderedDict` objects to be substituted anywhere a -regular dictionary is used. +:class:`~collections.abc.Mapping` objects are order-insensitive like regular +dictionaries. This allows :class:`OrderedDict` objects to be substituted +anywhere a regular dictionary is used. The :class:`OrderedDict` constructor and :meth:`update` method both accept keyword arguments, but their order is lost because Python's function call diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -371,7 +371,8 @@ parser. :mod:`configparser` objects behave as close to actual dictionaries as possible. -The mapping interface is complete and adheres to the ``MutableMapping`` ABC. +The mapping interface is complete and adheres to the +:class:`~collections.abc.MutableMapping` ABC. However, there are a few differences that should be taken into account: * By default, all keys in sections are accessible in a case-insensitive manner diff --git a/Doc/library/dbm.rst b/Doc/library/dbm.rst --- a/Doc/library/dbm.rst +++ b/Doc/library/dbm.rst @@ -317,8 +317,9 @@ database has to be created. It defaults to octal ``0o666`` (and will be modified by the prevailing umask). - In addition to the methods provided by the :class:`collections.MutableMapping` class, - :class:`dumbdbm` objects provide the following method: + In addition to the methods provided by the + :class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects + provide the following method: .. method:: dumbdbm.sync() diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -143,8 +143,8 @@ By default, the diff control lines (those with ``***`` or ``---``) are created with a trailing newline. This is helpful so that inputs created from - :func:`file.readlines` result in diffs that are suitable for use with - :func:`file.writelines` since both the inputs and outputs have trailing + :func:`io.IOBase.readlines` result in diffs that are suitable for use with + :func:`io.IOBase.writelines` since both the inputs and outputs have trailing newlines. For inputs that do not have trailing newlines, set the *lineterm* argument to @@ -275,8 +275,8 @@ By default, the diff control lines (those with ``---``, ``+++``, or ``@@``) are created with a trailing newline. This is helpful so that inputs created from - :func:`file.readlines` result in diffs that are suitable for use with - :func:`file.writelines` since both the inputs and outputs have trailing + :func:`io.IOBase.readlines` result in diffs that are suitable for use with + :func:`io.IOBase.writelines` since both the inputs and outputs have trailing newlines. For inputs that do not have trailing newlines, set the *lineterm* argument to @@ -629,10 +629,12 @@ Compare two sequences of lines, and generate the delta (a sequence of lines). - Each sequence must contain individual single-line strings ending with newlines. - Such sequences can be obtained from the :meth:`readlines` method of file-like - objects. The delta generated also consists of newline-terminated strings, ready - to be printed as-is via the :meth:`writelines` method of a file-like object. + Each sequence must contain individual single-line strings ending with + newlines. Such sequences can be obtained from the + :meth:`~io.IOBase.readlines` method of file-like objects. The delta + generated also consists of newline-terminated strings, ready to be + printed as-is via the :meth:`~io.IOBase.writelines` method of a + file-like object. .. _differ-examples: @@ -642,7 +644,7 @@ This example compares two texts. First we set up the texts, sequences of individual single-line strings ending with newlines (such sequences can also be -obtained from the :meth:`readlines` method of file-like objects): +obtained from the :meth:`~io.BaseIO.readlines` method of file-like objects): >>> text1 = ''' 1. Beautiful is better than ugly. ... 2. Explicit is better than implicit. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -371,8 +371,8 @@ >>> list(Animal) [, , , ] -The semantics of this API resemble :class:`namedtuple`. The first argument -of the call to :class:`Enum` is the name of the enumeration. +The semantics of this API resemble :class:`~collections.namedtuple`. The first +argument of the call to :class:`Enum` is the name of the enumeration. The second argument is the *source* of enumeration member names. It can be a whitespace-separated string of names, a sequence of names, a sequence of diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -146,10 +146,9 @@ .. exception:: EOFError - Raised when one of the built-in functions (:func:`input` or :func:`raw_input`) - hits an end-of-file condition (EOF) without reading any data. (N.B.: the - :meth:`file.read` and :meth:`file.readline` methods return an empty string - when they hit EOF.) + Raised when the :func:`input` function hits an end-of-file condition (EOF) + without reading any data. (N.B.: the :meth:`io.IOBase.read` and + :meth:`io.IOBase.readline` methods return an empty string when they hit EOF.) .. exception:: FloatingPointError @@ -366,7 +365,7 @@ executed, and so that a debugger can execute a script without running the risk of losing control. The :func:`os._exit` function can be used if it is absolutely positively necessary to exit immediately (for example, in the child - process after a call to :func:`fork`). + process after a call to :func:`os.fork`). The exception inherits from :exc:`BaseException` instead of :exc:`Exception` so that it is not accidentally caught by code that catches :exc:`Exception`. This @@ -629,7 +628,7 @@ .. exception:: BytesWarning - Base class for warnings related to :class:`bytes` and :class:`buffer`. + Base class for warnings related to :class:`bytes` and :class:`bytearray`. .. exception:: ResourceWarning diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -136,11 +136,12 @@ Class :class:`FileInput` is the implementation; its methods :meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, - :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the functions - of the same name in the module. In addition it has a :meth:`readline` method - which returns the next input line, and a :meth:`__getitem__` method which - implements the sequence behavior. The sequence must be accessed in strictly - sequential order; random access and :meth:`readline` cannot be mixed. + :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the + functions of the same name in the module. In addition it has a + :meth:`~io.TextIOBase.readline` method which returns the next input line, + and a :meth:`__getitem__` method which implements the sequence behavior. + The sequence must be accessed in strictly sequential order; random access + and :meth:`~io.TextIOBase.readline` cannot be mixed. With *mode* you can specify which file mode will be passed to :func:`open`. It must be one of ``'r'``, ``'rU'``, ``'U'`` and ``'rb'``. diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -272,7 +272,7 @@ Store a file in binary transfer mode. *cmd* should be an appropriate ``STOR`` command: ``"STOR filename"``. *file* is a :term:`file object` - (opened in binary mode) which is read until EOF using its :meth:`read` + (opened in binary mode) which is read until EOF using its :meth:`~io.IOBase.read` method in blocks of size *blocksize* to provide the data to be stored. The *blocksize* argument defaults to 8192. *callback* is an optional single parameter callable that is called on each block of data after it is sent. @@ -286,7 +286,7 @@ Store a file in ASCII transfer mode. *cmd* should be an appropriate ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the - :term:`file object` *file* (opened in binary mode) using its :meth:`readline` + :term:`file object` *file* (opened in binary mode) using its :meth:`~io.IOBase.readline` method to provide the data to be stored. *callback* is an optional single parameter callable that is called on each line after it is sent. diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -29,8 +29,8 @@ .. class:: HTTPServer(server_address, RequestHandlerClass) - This class builds on the :class:`TCPServer` class by storing the server - address as instance variables named :attr:`server_name` and + This class builds on the :class:`~socketserver.TCPServer` class by storing + the server address as instance variables named :attr:`server_name` and :attr:`server_port`. The server is accessible by the handler, typically through the handler's :attr:`server` instance variable. @@ -326,7 +326,7 @@ file's contents are returned; otherwise a directory listing is generated by calling the :meth:`list_directory` method. This method uses :func:`os.listdir` to scan the directory, and returns a ``404`` error - response if the :func:`listdir` fails. + response if the :func:`~os.listdir` fails. If the request was mapped to a file, it is opened and the contents are returned. Any :exc:`OSError` exception in opening the requested file is diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -310,8 +310,9 @@ Opens socket to *port* at *host*. This method is implicitly called by the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the ``read``, ``readline``, ``send``, and ``shutdown`` - methods. You may override this method. + method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, + :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override + this method. .. method:: IMAP4.partial(message_num, message_part, start, length) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -165,7 +165,7 @@ It is legal though generally not very useful to reload built-in or dynamically loaded modules (this is not true for e.g. :mod:`sys`, - :mod:`__main__`, :mod:`__builtin__` and other key modules where reloading is + :mod:`__main__`, :mod:`builtins` and other key modules where reloading is frowned upon). In many cases, however, extension modules are not designed to be initialized more than once, and may fail in arbitrary ways when reloaded. diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -928,8 +928,9 @@ that raise AttributeError). It can also return descriptors objects instead of instance members. - If the instance :attr:`__dict__` is shadowed by another member (for example a - property) then this function will be unable to find instance members. + If the instance :attr:`~object.__dict__` is shadowed by another member (for + example a property) then this function will be unable to find instance + members. .. versionadded:: 3.2 diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -157,7 +157,7 @@ The abstract base classes also provide default implementations of some methods in order to help implementation of concrete stream classes. For example, :class:`BufferedIOBase` provides unoptimized implementations of - ``readinto()`` and ``readline()``. + :meth:`~IOBase.readinto` and :meth:`~IOBase.readline`. At the top of the I/O hierarchy is the abstract base class :class:`IOBase`. It defines the basic interface to a stream. Note, however, that there is no @@ -228,7 +228,7 @@ The basic type used for binary data read from or written to a file is :class:`bytes`. :class:`bytearray`\s are accepted too, and in some cases - (such as :class:`readinto`) required. Text I/O classes work with + (such as :meth:`readinto`) required. Text I/O classes work with :class:`str` data. Note that calling any method (even inquiries) on a closed stream is diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -88,9 +88,9 @@ .. function:: accumulate(iterable[, func]) Make an iterator that returns accumulated sums. Elements may be any addable - type including :class:`Decimal` or :class:`Fraction`. If the optional - *func* argument is supplied, it should be a function of two arguments - and it will be used instead of addition. + type including :class:`~decimal.Decimal` or :class:`~fractions.Fraction`. + If the optional *func* argument is supplied, it should be a function of two + arguments and it will be used instead of addition. Equivalent to:: diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -1009,7 +1009,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). @@ -1380,7 +1380,7 @@ Set the "From " line to *from_*, which should be specified without a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If - *time_* is specified, it should be a :class:`struct_time` instance, a + *time_* is specified, it should be a :class:`time.struct_time` instance, a tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use :meth:`time.gmtime`). diff --git a/Doc/library/math.rst b/Doc/library/math.rst --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -31,7 +31,7 @@ Return the ceiling of *x*, the smallest integer greater than or equal to *x*. If *x* is not a float, delegates to ``x.__ceil__()``, which should return an - :class:`Integral` value. + :class:`~numbers.Integral` value. .. function:: copysign(x, y) @@ -53,7 +53,7 @@ Return the floor of *x*, the largest integer less than or equal to *x*. If *x* is not a float, delegates to ``x.__floor__()``, which should return an - :class:`Integral` value. + :class:`~numbers.Integral` value. .. function:: fmod(x, y) @@ -133,8 +133,9 @@ .. function:: trunc(x) - Return the :class:`Real` value *x* truncated to an :class:`Integral` (usually - an integer). Delegates to ``x.__trunc__()``. + Return the :class:`~numbers.Real` value *x* truncated to an + :class:`~numbers.Integral` (usually an integer). Delegates to + ``x.__trunc__()``. Note that :func:`frexp` and :func:`modf` have a different call/return pattern diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -429,8 +429,9 @@ ----------- :mod:`msilib` provides several classes that wrap the GUI tables in an MSI -database. However, no standard user interface is provided; use :mod:`bdist_msi` -to create MSI files with a user-interface for installing Python packages. +database. However, no standard user interface is provided; use +:mod:`~distutils.command.bdist_msi` to create MSI files with a user-interface +for installing Python packages. .. class:: Control(dlg, name) diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -169,11 +169,11 @@ be used in a :keyword:`with` statement. -The following methods each map to exactly one :func:`ioctl` system call. The +The following methods each map to exactly one :c:func:`ioctl` system call. The correspondence is obvious: for example, :meth:`setfmt` corresponds to the ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can be useful when consulting the OSS documentation). If the underlying -:func:`ioctl` fails, they all raise :exc:`OSError`. +:c:func:`ioctl` fails, they all raise :exc:`OSError`. .. method:: oss_audio_device.nonblock() diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -484,8 +484,8 @@ .. attribute:: ExpatError.code Expat's internal error number for the specific error. The - :data:`errors.messages` dictionary maps these error numbers to Expat's error - messages. For example:: + :data:`errors.messages ` dictionary maps + these error numbers to Expat's error messages. For example:: from xml.parsers.expat import ParserCreate, ExpatError, errors @@ -495,9 +495,9 @@ except ExpatError as err: print("Error:", errors.messages[err.code]) - The :mod:`errors` module also provides error message constants and a - dictionary :data:`~errors.codes` mapping these messages back to the error - codes, see below. + The :mod:`~xml.parsers.expat.errors` module also provides error message + constants and a dictionary :data:`~xml.parsers.expat.errors.codes` mapping + these messages back to the error codes, see below. .. attribute:: ExpatError.lineno diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -106,8 +106,8 @@ .. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8') - A subclass of :class:`collections.MutableMapping` which stores pickled values - in the *dict* object. + A subclass of :class:`collections.abc.MutableMapping` which stores pickled + values in the *dict* object. By default, version 0 pickles are used to serialize values. The version of the pickle protocol can be specified with the *protocol* parameter. See the diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -27,7 +27,7 @@ ------------------ -.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, +.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432,\ map=None) Create a new :class:`SMTPServer` object, which binds to local address @@ -96,7 +96,7 @@ SMTPChannel Objects ------------------- -.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432, +.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432,\ map=None)) Create a new :class:`SMTPChannel` object which manages the communication diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -285,7 +285,7 @@ RCVALL_* Constants for Windows' WSAIoctl(). The constants are used as arguments to the - :meth:`ioctl` method of socket objects. + :meth:`~socket.socket.ioctl` method of socket objects. .. data:: TIPC_* diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -111,13 +111,13 @@ the request handler class :meth:`handle` method. Another approach to handling multiple simultaneous requests in an environment -that supports neither threads nor :func:`fork` (or where these are too expensive -or inappropriate for the service) is to maintain an explicit table of partially -finished requests and to use :func:`select` to decide which request to work on -next (or whether to handle a new incoming request). This is particularly -important for stream services where each client can potentially be connected for -a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` -for another way to manage this. +that supports neither threads nor :func:`~os.fork` (or where these are too +expensive or inappropriate for the service) is to maintain an explicit table of +partially finished requests and to use :func:`~select.select` to decide which +request to work on next (or whether to handle a new incoming request). This is +particularly important for stream services where each client can potentially be +connected for a long time (if threads or subprocesses cannot be used). See +:mod:`asyncore` for another way to manage this. .. XXX should data and methods be intermingled, or separate? how should the distinction between class and instance variables be drawn? diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst --- a/Doc/library/stat.rst +++ b/Doc/library/stat.rst @@ -1,5 +1,5 @@ -:mod:`stat` --- Interpreting :func:`stat` results -================================================= +:mod:`stat` --- Interpreting :func:`~os.stat` results +===================================================== .. module:: stat :synopsis: Utilities for interpreting the results of os.stat(), diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -185,7 +185,7 @@ Read until one from a list of a regular expressions matches. The first argument is a list of regular expressions, either compiled - (:class:`re.RegexObject` instances) or uncompiled (byte strings). The + (:ref:`regex objects `) or uncompiled (byte strings). The optional second argument is a timeout, in seconds; the default is to block indefinitely. diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -677,8 +677,8 @@ of many format specifiers in :func:`strftime` and :func:`strptime`. Module :mod:`calendar` - General calendar-related functions. :func:`timegm` is the inverse of - :func:`gmtime` from this module. + General calendar-related functions. :func:`~calendar.timegm` is the + inverse of :func:`gmtime` from this module. .. rubric:: Footnotes diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -210,8 +210,8 @@ Accessing any attribute not in this list will raise an `AttributeError`. If `spec` is an object (rather than a list of strings) then - :attr:`__class__` returns the class of the spec object. This allows mocks - to pass `isinstance` tests. + :attr:`~instance.__class__` returns the class of the spec object. This + allows mocks to pass `isinstance` tests. * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* or get an attribute on the mock that isn't on the object passed as @@ -1989,7 +1989,8 @@ default) then a `MagicMock` will be created for you, with the API limited to methods or attributes available on standard file handles. - `read_data` is a string for the `read`, `readline`, and `readlines` methods + `read_data` is a string for the :meth:`~io.IOBase.read`, + :meth:`~io.IOBase.readline`, and :meth:`~io.IOBase.readlines` methods of the file handle to return. Calls to those methods will take data from `read_data` until it is depleted. The mock of these methods is pretty simplistic. If you need more control over the data that you are feeding to diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -89,7 +89,7 @@ | | Unicode. | +----------------------------------+-----------------------------------------------+ | :exc:`BytesWarning` | Base category for warnings related to | -| | :class:`bytes` and :class:`buffer`. | +| | :class:`bytes` and :class:`bytearray`. | +----------------------------------+-----------------------------------------------+ | :exc:`ResourceWarning` | Base category for warnings related to | | | resource usage. | diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -213,8 +213,9 @@ .. note:: The file-like object is read-only and provides the following methods: - :meth:`!read`, :meth:`!readline`, :meth:`!readlines`, :meth:`!__iter__`, - :meth:`!__next__`. + :meth:`~io.BufferedIOBase.read`, :meth:`~io.IOBase.readline`, + :meth:`~io.IOBase.readlines`, :meth:`__iter__`, + :meth:`~iterator.__next__`. .. note:: diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -234,9 +234,9 @@ dis --- -The :mod:`dis` module is now built around an :class:`Instruction` class that -provides details of individual bytecode operations and a -:func:`get_instructions` iterator that emits the Instruction stream for a +The :mod:`dis` module is now built around an :class:`~dis.Instruction` class +that provides details of individual bytecode operations and a +:func:`~dis.get_instructions` iterator that emits the Instruction stream for a given piece of Python code. The various display tools in the :mod:`dis` module have been updated to be based on these new components. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -122,6 +122,8 @@ Documentation ------------- +- Issue #18758: Fixed and improved cross-references. + - Issue #18972: Modernize email examples and use the argparse module in them. Build -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:06 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3cyZQf5GjQz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/c9f424394b96 changeset: 86345:c9f424394b96 parent: 86344:261d9bf0cc2b parent: 86335:b9d3e99ea516 user: Serhiy Storchaka date: Sun Oct 13 23:22:09 2013 +0300 summary: Merge heads files: Lib/cgi.py | 1 - Misc/NEWS | 8 -------- 2 files changed, 0 insertions(+), 9 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -676,7 +676,6 @@ encoding=self.encoding, errors=self.errors) for key, value in query: self.list.append(MiniFieldStorage(key, value)) - FieldStorageClass = None klass = self.FieldStorageClass or self.__class__ first_line = self.fp.readline() # bytes diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1346,14 +1346,6 @@ - Issue #12990: The "Python Launcher" on OSX could not launch python scripts that have paths that include wide characters. -What's New in Python 3.3.1 release candidate 1? -=============================================== - -*Release date: 24-Mar-2013* - -Core and Builtins ------------------ - - Issue #17328: Fix possible refleak in dict.setdefault. - Issue #17275: Corrected class name in init error messages of the C version of -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:07 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuMyk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3cyZQg749Xz7Lk7@mail.python.org> http://hg.python.org/cpython/rev/4c15bf02b7c4 changeset: 86346:4c15bf02b7c4 branch: 3.3 parent: 86343:907da535ed9d parent: 86338:7a2256a6aceb user: Serhiy Storchaka date: Sun Oct 13 23:27:23 2013 +0300 summary: Merge heads files: Doc/library/othergui.rst | 3 +-- Doc/tools/sphinx-build.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -19,8 +19,7 @@ `PyGTK `_ provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ diff --git a/Doc/tools/sphinx-build.py b/Doc/tools/sphinx-build.py --- a/Doc/tools/sphinx-build.py +++ b/Doc/tools/sphinx-build.py @@ -15,7 +15,7 @@ if __name__ == '__main__': - if sys.version_info[:3] < (2, 4, 0): + if sys.version_info[:3] < (2, 4, 0) or sys.version_info[:3] > (3, 0, 0): sys.stderr.write("""\ Error: Sphinx needs to be executed with Python 2.4 or newer (not 3.0 though). (If you run this from the Makefile, you can set the PYTHON variable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:09 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3cyZQj1tXNz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/862bb83113d7 changeset: 86347:862bb83113d7 parent: 86345:c9f424394b96 parent: 86341:096eae786285 user: Serhiy Storchaka date: Sun Oct 13 23:27:44 2013 +0300 summary: Merge heads files: Doc/library/contextlib.rst | 2 ++ Doc/library/othergui.rst | 3 +-- Doc/tools/sphinx-build.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -94,6 +94,7 @@ without needing to explicitly close ``page``. Even if an error occurs, ``page.close()`` will be called when the :keyword:`with` block is exited. + .. function:: ignore(*exceptions) Return a context manager that ignores the specified exceptions if they @@ -156,6 +157,7 @@ .. versionadded:: 3.4 + .. class:: ContextDecorator() A base class that enables a context manager to also be used as a decorator. diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -19,8 +19,7 @@ `PyGTK `_ provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ diff --git a/Doc/tools/sphinx-build.py b/Doc/tools/sphinx-build.py --- a/Doc/tools/sphinx-build.py +++ b/Doc/tools/sphinx-build.py @@ -15,7 +15,7 @@ if __name__ == '__main__': - if sys.version_info[:3] < (2, 4, 0): + if sys.version_info[:3] < (2, 4, 0) or sys.version_info[:3] > (3, 0, 0): sys.stderr.write("""\ Error: Sphinx needs to be executed with Python 2.4 or newer (not 3.0 though). (If you run this from the Makefile, you can set the PYTHON variable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:35:10 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:35:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3cyZQk47ZCz7LkM@mail.python.org> http://hg.python.org/cpython/rev/ee7c6fe60aca changeset: 86348:ee7c6fe60aca branch: 2.7 parent: 86342:fa7cfbec0d32 parent: 86340:68e7acb0ba5b user: Serhiy Storchaka date: Sun Oct 13 23:29:53 2013 +0300 summary: Merge heads files: Doc/library/othergui.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -13,8 +13,7 @@ provides an object oriented interface that is slightly higher level than the C one. It comes with many more widgets than Tkinter provides, and has good Python-specific reference documentation. There are also bindings to - `GNOME `_. One well known PyGTK application is - `WingIDE `_. An online `tutorial + `GNOME `_. An online `tutorial `_ is available. `PyQt `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 22:36:02 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 13 Oct 2013 22:36:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3cyZRk6h7Lz7LkF@mail.python.org> http://hg.python.org/cpython/rev/42f0c474ec84 changeset: 86349:42f0c474ec84 parent: 86347:862bb83113d7 parent: 86346:4c15bf02b7c4 user: Serhiy Storchaka date: Sun Oct 13 23:30:53 2013 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 23:30:55 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 23:30:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNjY1?= =?utf-8?q?7=3A_fix_docstring_of_traceback=2Eformat=5Ftb=28=29=2E?= Message-ID: <3cybg302Qxz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/e6ab0cd959a0 changeset: 86350:e6ab0cd959a0 branch: 2.7 parent: 86348:ee7c6fe60aca user: Georg Brandl date: Sun Oct 13 23:31:38 2013 +0200 summary: Closes #16657: fix docstring of traceback.format_tb(). files: Lib/traceback.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/traceback.py b/Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -72,7 +72,7 @@ n = n+1 def format_tb(tb, limit = None): - """A shorthand for 'format_list(extract_stack(f, limit)).""" + """A shorthand for 'format_list(extract_tb(tb, limit))'.""" return format_list(extract_tb(tb, limit)) def extract_tb(tb, limit = None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 23:33:23 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 23:33:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNjY1?= =?utf-8?q?7=3A_fix_docstring_of_traceback=2Eformat=5Ftb=28=29=2E?= Message-ID: <3cybjv3nRXz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/dcded8c7af89 changeset: 86351:dcded8c7af89 branch: 3.3 parent: 86346:4c15bf02b7c4 user: Georg Brandl date: Sun Oct 13 23:32:14 2013 +0200 summary: Closes #16657: fix docstring of traceback.format_tb(). files: Lib/traceback.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/traceback.py b/Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -71,7 +71,7 @@ n = n+1 def format_tb(tb, limit=None): - """A shorthand for 'format_list(extract_stack(f, limit)).""" + """A shorthand for 'format_list(extract_tb(tb, limit))'.""" return format_list(extract_tb(tb, limit)) def extract_tb(tb, limit=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 23:33:24 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 23:33:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cybjw5ZxMz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/9eaa3e28e514 changeset: 86352:9eaa3e28e514 parent: 86349:42f0c474ec84 parent: 86351:dcded8c7af89 user: Georg Brandl date: Sun Oct 13 23:34:06 2013 +0200 summary: merge with 3.3 files: Lib/traceback.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/traceback.py b/Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -89,7 +89,7 @@ print_list(extract_tb(tb, limit=limit), file=file) def format_tb(tb, limit=None): - """A shorthand for 'format_list(extract_tb(tb, limit)).""" + """A shorthand for 'format_list(extract_tb(tb, limit))'.""" return format_list(extract_tb(tb, limit=limit)) def extract_tb(tb, limit=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 13 23:37:57 2013 From: python-checkins at python.org (georg.brandl) Date: Sun, 13 Oct 2013 23:37:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxNjcz?= =?utf-8?q?2=3A_move_=22xxmodule=22_comment_block_to_detect=5Fmodules=28?= =?utf-8?b?KS4gIChBbHJlYWR5?= Message-ID: <3cybq94GlBz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/c167ab1c49c9 changeset: 86353:c167ab1c49c9 branch: 2.7 parent: 86350:e6ab0cd959a0 user: Georg Brandl date: Sun Oct 13 23:38:44 2013 +0200 summary: Closes #16732: move "xxmodule" comment block to detect_modules(). (Already done in 3.x) files: setup.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1721,6 +1721,10 @@ if '_tkinter' not in [e.name for e in self.extensions]: missing.append('_tkinter') +## # Uncomment these lines if you want to play with xxmodule.c +## ext = Extension('xx', ['xxmodule.c']) +## self.extensions.append(ext) + return missing def detect_tkinter_darwin(self, inc_dirs, lib_dirs): @@ -1911,10 +1915,6 @@ ) self.extensions.append(ext) -## # Uncomment these lines if you want to play with xxmodule.c -## ext = Extension('xx', ['xxmodule.c']) -## self.extensions.append(ext) - # XXX handle these, but how to detect? # *** Uncomment and edit for PIL (TkImaging) extension only: # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 02:00:17 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 14 Oct 2013 02:00:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzQ5NjU6IEltcGxl?= =?utf-8?q?ment_intelligent_scrolling_of_the_sidebar_in_the_docs=2E?= Message-ID: <3cyfzP3lNxzNQC@mail.python.org> http://hg.python.org/cpython/rev/3bb34d370871 changeset: 86354:3bb34d370871 branch: 3.3 parent: 86351:dcded8c7af89 user: Ezio Melotti date: Mon Oct 14 02:58:59 2013 +0300 summary: #4965: Implement intelligent scrolling of the sidebar in the docs. files: Doc/tools/sphinxext/static/basic.css | 2 + Doc/tools/sphinxext/static/sidebar.js | 50 +++++++++++++- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -38,6 +38,8 @@ /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { + position: relative; + top: 0; padding: 10px 5px 0 10px; word-wrap: break-word; } diff --git a/Doc/tools/sphinxext/static/sidebar.js b/Doc/tools/sphinxext/static/sidebar.js --- a/Doc/tools/sphinxext/static/sidebar.js +++ b/Doc/tools/sphinxext/static/sidebar.js @@ -2,7 +2,8 @@ * sidebar.js * ~~~~~~~~~~ * - * This script makes the Sphinx sidebar collapsible. + * This script makes the Sphinx sidebar collapsible and implements intelligent + * scrolling. * * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds in * .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton used to @@ -24,6 +25,8 @@ // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function + var jwindow = $(window); + var jdocument = $(document); var bodywrapper = $('.bodywrapper'); var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); @@ -42,6 +45,13 @@ var dark_color = '#AAAAAA'; var light_color = '#CCCCCC'; + function get_viewport_height() { + if (window.innerHeight) + return window.innerHeight; + else + return jwindow.height(); + } + function sidebar_is_collapsed() { return sidebarwrapper.is(':not(:visible)'); } @@ -51,6 +61,8 @@ expand_sidebar(); else collapse_sidebar(); + // adjust the scrolling of the sidebar + scroll_sidebar(); } function collapse_sidebar() { @@ -95,11 +107,7 @@ ); var sidebarbutton = $('#sidebarbutton'); // find the height of the viewport to center the '<<' in the page - var viewport_height; - if (window.innerHeight) - viewport_height = window.innerHeight; - else - viewport_height = $(window).height(); + var viewport_height = get_viewport_height(); var sidebar_offset = sidebar.offset().top; var sidebar_height = Math.max(bodywrapper.height(), sidebar.height()); sidebarbutton.find('span').css({ @@ -152,4 +160,34 @@ add_sidebar_button(); var sidebarbutton = $('#sidebarbutton'); set_position_from_cookie(); + + + /* intelligent scrolling */ + function scroll_sidebar() { + var sidebar_height = sidebarwrapper.height(); + var viewport_height = get_viewport_height(); + var offset = sidebar.position()['top']; + var wintop = jwindow.scrollTop(); + var winbot = wintop + viewport_height; + var curtop = sidebarwrapper.position()['top']; + var curbot = curtop + sidebar_height; + // does sidebar fit in window? + if (sidebar_height < viewport_height) { + // yes: easy case -- always keep at the top + sidebarwrapper.css('top', $u.min([$u.max([0, wintop - offset - 10]), + jdocument.height() - sidebar_height - 200])); + } + else { + // no: only scroll if top/bottom edge of sidebar is at + // top/bottom edge of window + if (curtop > wintop && curbot > winbot) { + sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); + } + else if (curtop < wintop && curbot < winbot) { + sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, + jdocument.height() - sidebar_height - 200])); + } + } + } + jwindow.scroll(scroll_sidebar); }); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 02:00:18 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 14 Oct 2013 02:00:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzQ5NjU6IG1lcmdlIHdpdGggMy4zLg==?= Message-ID: <3cyfzQ6Y9vz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/8d916ea12efb changeset: 86355:8d916ea12efb parent: 86352:9eaa3e28e514 parent: 86354:3bb34d370871 user: Ezio Melotti date: Mon Oct 14 02:59:54 2013 +0300 summary: #4965: merge with 3.3. files: Doc/tools/sphinxext/static/basic.css | 2 + Doc/tools/sphinxext/static/sidebar.js | 50 +++++++++++++- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -38,6 +38,8 @@ /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { + position: relative; + top: 0; padding: 10px 5px 0 10px; word-wrap: break-word; } diff --git a/Doc/tools/sphinxext/static/sidebar.js b/Doc/tools/sphinxext/static/sidebar.js --- a/Doc/tools/sphinxext/static/sidebar.js +++ b/Doc/tools/sphinxext/static/sidebar.js @@ -2,7 +2,8 @@ * sidebar.js * ~~~~~~~~~~ * - * This script makes the Sphinx sidebar collapsible. + * This script makes the Sphinx sidebar collapsible and implements intelligent + * scrolling. * * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds in * .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton used to @@ -24,6 +25,8 @@ // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function + var jwindow = $(window); + var jdocument = $(document); var bodywrapper = $('.bodywrapper'); var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); @@ -42,6 +45,13 @@ var dark_color = '#AAAAAA'; var light_color = '#CCCCCC'; + function get_viewport_height() { + if (window.innerHeight) + return window.innerHeight; + else + return jwindow.height(); + } + function sidebar_is_collapsed() { return sidebarwrapper.is(':not(:visible)'); } @@ -51,6 +61,8 @@ expand_sidebar(); else collapse_sidebar(); + // adjust the scrolling of the sidebar + scroll_sidebar(); } function collapse_sidebar() { @@ -95,11 +107,7 @@ ); var sidebarbutton = $('#sidebarbutton'); // find the height of the viewport to center the '<<' in the page - var viewport_height; - if (window.innerHeight) - viewport_height = window.innerHeight; - else - viewport_height = $(window).height(); + var viewport_height = get_viewport_height(); var sidebar_offset = sidebar.offset().top; var sidebar_height = Math.max(bodywrapper.height(), sidebar.height()); sidebarbutton.find('span').css({ @@ -152,4 +160,34 @@ add_sidebar_button(); var sidebarbutton = $('#sidebarbutton'); set_position_from_cookie(); + + + /* intelligent scrolling */ + function scroll_sidebar() { + var sidebar_height = sidebarwrapper.height(); + var viewport_height = get_viewport_height(); + var offset = sidebar.position()['top']; + var wintop = jwindow.scrollTop(); + var winbot = wintop + viewport_height; + var curtop = sidebarwrapper.position()['top']; + var curbot = curtop + sidebar_height; + // does sidebar fit in window? + if (sidebar_height < viewport_height) { + // yes: easy case -- always keep at the top + sidebarwrapper.css('top', $u.min([$u.max([0, wintop - offset - 10]), + jdocument.height() - sidebar_height - 200])); + } + else { + // no: only scroll if top/bottom edge of sidebar is at + // top/bottom edge of window + if (curtop > wintop && curbot > winbot) { + sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); + } + else if (curtop < wintop && curbot < winbot) { + sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, + jdocument.height() - sidebar_height - 200])); + } + } + } + jwindow.scroll(scroll_sidebar); }); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 06:45:24 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 06:45:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Re_=2318521=3A_fix_not-qui?= =?utf-8?q?te-C_syntax_that_works_only_because_the_PyXXX=5FCheck_are?= Message-ID: <3cynJN4hmhz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/eaeaed43ff1c changeset: 86356:eaeaed43ff1c user: Georg Brandl date: Mon Oct 14 06:46:12 2013 +0200 summary: Re #18521: fix not-quite-C syntax that works only because the PyXXX_Check are macros defined with () around them. files: Modules/_ctypes/_ctypes.c | 2 +- Modules/_testbuffer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4202,7 +4202,7 @@ i += self->b_length; return Array_item(_self, i); } - else if PySlice_Check(item) { + else if (PySlice_Check(item)) { StgDictObject *stgdict, *itemdict; PyObject *proto; PyObject *np; diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -1815,7 +1815,7 @@ if (init_slice(base, key, 0) < 0) goto err_occurred; } - else if PyTuple_Check(key) { + else if (PyTuple_Check(key)) { /* multi-dimensional slice */ PyObject *tuple = key; Py_ssize_t i, n; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 06:52:39 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 06:52:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Re_=2318521=3A_remove_assi?= =?utf-8?q?gnments_of_variables_that_are_immediately_reassigned=2E?= Message-ID: <3cynSl08B1z7Ljb@mail.python.org> http://hg.python.org/cpython/rev/7396d10405db changeset: 86357:7396d10405db user: Georg Brandl date: Mon Oct 14 06:51:46 2013 +0200 summary: Re #18521: remove assignments of variables that are immediately reassigned. files: Modules/socketmodule.c | 2 +- Python/pystrtod.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -5155,7 +5155,7 @@ PyObject *all = (PyObject *)NULL; PyObject *idna = NULL; - family = socktype = protocol = flags = 0; + socktype = protocol = flags = 0; family = AF_UNSPEC; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo", kwnames, &hobj, &pobj, &family, &socktype, diff --git a/Python/pystrtod.c b/Python/pystrtod.c --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -164,7 +164,7 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr) { char *fail_pos; - double val = -1.0; + double val; struct lconv *locale_data; const char *decimal_point; size_t decimal_point_len; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 07:00:24 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 07:00:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Re_=2318521=3A_move_array_?= =?utf-8?q?bounds_check_before_array_access=2E?= Message-ID: <3cyndh3pvGz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/63bc2fe28a6e changeset: 86358:63bc2fe28a6e user: Georg Brandl date: Mon Oct 14 07:01:11 2013 +0200 summary: Re #18521: move array bounds check before array access. files: Python/getargs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -376,7 +376,7 @@ "argument %" PY_FORMAT_SIZE_T "d", iarg); i = 0; p += strlen(p); - while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { + while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) { PyOS_snprintf(p, sizeof(buf) - (p - buf), ", item %d", levels[i]-1); p += strlen(p); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 14 07:03:40 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 14 Oct 2013 07:03:40 +0200 Subject: [Python-checkins] Daily reference leaks (8d916ea12efb): sum=0 Message-ID: results for 8d916ea12efb on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogFQO04s', '-x'] From python-checkins at python.org Mon Oct 14 09:44:58 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 09:44:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MTg5?= =?utf-8?q?=3A_Improved_cross-references_in_the_pickle_module_documentatio?= =?utf-8?q?n=2E?= Message-ID: <3cysHZ01VXz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/c99a3566be83 changeset: 86359:c99a3566be83 branch: 2.7 parent: 86353:c167ab1c49c9 user: Serhiy Storchaka date: Mon Oct 14 10:43:26 2013 +0300 summary: Issue #19189: Improved cross-references in the pickle module documentation. files: Doc/library/pickle.rst | 61 +++++++++++++++-------------- 1 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -352,9 +352,9 @@ * classes that are defined at the top level of a module -* instances of such classes whose :attr:`__dict__` or the result of calling - :meth:`__getstate__` is picklable (see section :ref:`pickle-protocol` for - details). +* instances of such classes whose :attr:`~object.__dict__` or the result of + calling :meth:`__getstate__` is picklable (see section :ref:`pickle-protocol` + for details). Attempts to pickle unpicklable objects will raise the :exc:`PicklingError` exception; when this happens, an unspecified number of bytes may have already @@ -443,7 +443,7 @@ defines the method :meth:`__getstate__`, it is called and the return state is pickled as the contents for the instance, instead of the contents of the instance's dictionary. If there is no :meth:`__getstate__` method, the - instance's :attr:`__dict__` is pickled. + instance's :attr:`~object.__dict__` is pickled. .. method:: object.__setstate__(state) @@ -511,7 +511,8 @@ * Optionally, the object's state, which will be passed to the object's :meth:`__setstate__` method as described in section :ref:`pickle-inst`. If the object has no :meth:`__setstate__` method, then, as above, the value - must be a dictionary and it will be added to the object's :attr:`__dict__`. + must be a dictionary and it will be added to the object's + :attr:`~object.__dict__`. * Optionally, an iterator (and not a sequence) yielding successive list items. These list items will be pickled, and appended to the object using @@ -569,19 +570,20 @@ 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 -:attr:`persistent_load` attribute of the unpickler object. +:attr:`~Pickler.persistent_id` attribute of the pickler object and the +:attr:`~Unpickler.persistent_load` attribute of the unpickler object. To pickle objects that have an external persistent id, the pickler must have a -custom :func:`persistent_id` method that takes an object as an argument and -returns either ``None`` or the persistent id for that object. When ``None`` is -returned, the pickler simply pickles the object as normal. When a persistent id -string is returned, the pickler will pickle that string, along with a marker so -that the unpickler will recognize the string as a persistent id. +custom :func:`~Pickler.persistent_id` method that takes an object as an +argument and returns either ``None`` or the persistent id for that object. +When ``None`` is returned, the pickler simply pickles the object as normal. +When a persistent id string is returned, the pickler will pickle that string, +along with a marker so that the unpickler will recognize the string as a +persistent id. To unpickle external objects, the unpickler must have a custom -:func:`persistent_load` function that takes a persistent id string and returns -the referenced object. +:func:`~Unpickler.persistent_load` function that takes a persistent id string +and returns the referenced object. Here's a silly example that *might* shed more light:: @@ -631,13 +633,14 @@ 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. +In the :mod:`cPickle` module, the unpickler's :attr:`~Unpickler.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:`~Unpickler.persistent_load` to a list is usually used in +conjunction with the :meth:`~Unpickler.noload` method on the Unpickler. .. BAW: Both pickle and cPickle support something called inst_persistent_id() which appears to give unknown types a second shot at producing a persistent @@ -675,13 +678,13 @@ 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. +what gets unpickled, you can set the unpickler's :attr:`~Unpickler.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. The moral of the story is that you should be really careful about the source of the strings your application unpickles. @@ -732,7 +735,7 @@ Here's a larger example that shows how to modify pickling behavior for a class. The :class:`TextReader` class opens a text file, and returns the line number and -line contents each time its :meth:`readline` method is called. If a +line contents each time its :meth:`!readline` method is called. If a :class:`TextReader` instance is pickled, all attributes *except* the file object member are saved. When the instance is unpickled, the file is reopened, and reading resumes from the last location. The :meth:`__setstate__` and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 09:44:59 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 09:44:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MTg5?= =?utf-8?q?=3A_Improved_cross-references_in_the_pickle_module_documentatio?= =?utf-8?q?n=2E?= Message-ID: <3cysHb2xv4z7Ljh@mail.python.org> http://hg.python.org/cpython/rev/f2c725fb4b2f changeset: 86360:f2c725fb4b2f branch: 3.3 parent: 86354:3bb34d370871 user: Serhiy Storchaka date: Mon Oct 14 10:43:46 2013 +0300 summary: Issue #19189: Improved cross-references in the pickle module documentation. files: Doc/library/pickle.rst | 41 ++++++++++++++++------------- 1 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -294,7 +294,7 @@ :func:`copyreg.pickle`. It is a mapping whose keys are classes and whose values are reduction functions. A reduction function takes a single argument of the associated class and should - conform to the same interface as a :meth:`~object.__reduce__` + conform to the same interface as a :meth:`__reduce__` method. By default, a pickler object will not have a @@ -390,8 +390,8 @@ * classes that are defined at the top level of a module -* instances of such classes whose :attr:`__dict__` or the result of calling - :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for +* instances of such classes whose :attr:`~object.__dict__` or the result of + calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for details). Attempts to pickle unpicklable objects will raise the :exc:`PicklingError` @@ -435,6 +435,8 @@ Pickling Class Instances ------------------------ +.. currentmodule:: None + In this section, we describe the general mechanisms available to you to define, customize, and control how class instances are pickled and unpickled. @@ -470,7 +472,7 @@ defines the method :meth:`__getstate__`, it is called and the returned object is pickled as the contents for the instance, instead of the contents of the instance's dictionary. If the :meth:`__getstate__` method is absent, the - instance's :attr:`__dict__` is pickled as usual. + instance's :attr:`~object.__dict__` is pickled as usual. .. method:: object.__setstate__(state) @@ -539,7 +541,7 @@ * Optionally, the object's state, which will be passed to the object's :meth:`__setstate__` method as previously described. If the object has no such method then, the value must be a dictionary and it will be added to - the object's :attr:`__dict__` attribute. + the object's :attr:`~object.__dict__` attribute. * Optionally, an iterator (and not a sequence) yielding successive items. These items will be appended to the object either using @@ -565,6 +567,8 @@ the extended version. The main use for this method is to provide backwards-compatible reduce values for older Python releases. +.. currentmodule:: pickle + .. _pickle-persistent: Persistence of External Objects @@ -582,19 +586,19 @@ The resolution of such persistent IDs is not defined by the :mod:`pickle` module; it will delegate this resolution to the user defined methods on the -pickler and unpickler, :meth:`persistent_id` and :meth:`persistent_load` -respectively. +pickler and unpickler, :meth:`~Pickler.persistent_id` and +:meth:`~Unpickler.persistent_load` respectively. To pickle objects that have an external persistent id, the pickler must have a -custom :meth:`persistent_id` method that takes an object as an argument and -returns either ``None`` or the persistent id for that object. When ``None`` is -returned, the pickler simply pickles the object as normal. When a persistent ID -string is returned, the pickler will pickle that object, along with a marker so -that the unpickler will recognize it as a persistent ID. +custom :meth:`~Pickler.persistent_id` method that takes an object as an +argument and returns either ``None`` or the persistent id for that object. +When ``None`` is returned, the pickler simply pickles the object as normal. +When a persistent ID string is returned, the pickler will pickle that object, +along with a marker so that the unpickler will recognize it as a persistent ID. To unpickle external objects, the unpickler must have a custom -:meth:`persistent_load` method that takes a persistent ID object and returns the -referenced object. +:meth:`~Unpickler.persistent_load` method that takes a persistent ID object and +returns the referenced object. Here is a comprehensive example presenting how persistent ID can be used to pickle external objects by reference. @@ -651,7 +655,7 @@ Here's an example that shows how to modify pickling behavior for a class. The :class:`TextReader` class opens a text file, and returns the line number and -line contents each time its :meth:`readline` method is called. If a +line contents each time its :meth:`!readline` method is called. If a :class:`TextReader` instance is pickled, all attributes *except* the file object member are saved. When the instance is unpickled, the file is reopened, and reading resumes from the last location. The :meth:`__setstate__` and @@ -730,9 +734,10 @@ inoffensive, it is not difficult to imagine one that could damage your system. For this reason, you may want to control what gets unpickled by customizing -:meth:`Unpickler.find_class`. Unlike its name suggests, :meth:`find_class` is -called whenever a global (i.e., a class or a function) is requested. Thus it is -possible to either completely forbid globals or restrict them to a safe subset. +:meth:`Unpickler.find_class`. Unlike its name suggests, +:meth:`Unpickler.find_class` is called whenever a global (i.e., a class or +a function) is requested. Thus it is possible to either completely forbid +globals or restrict them to a safe subset. Here is an example of an unpickler allowing only few safe classes from the :mod:`builtins` module to be loaded:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 09:45:00 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 09:45:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319189=3A_Improved_cross-references_in_the_pickl?= =?utf-8?q?e_module_documentation=2E?= Message-ID: <3cysHc5vTyz7LkR@mail.python.org> http://hg.python.org/cpython/rev/37c06d20dda5 changeset: 86361:37c06d20dda5 parent: 86358:63bc2fe28a6e parent: 86360:f2c725fb4b2f user: Serhiy Storchaka date: Mon Oct 14 10:44:25 2013 +0300 summary: Issue #19189: Improved cross-references in the pickle module documentation. files: Doc/library/pickle.rst | 41 ++++++++++++++++------------- 1 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -294,7 +294,7 @@ :func:`copyreg.pickle`. It is a mapping whose keys are classes and whose values are reduction functions. A reduction function takes a single argument of the associated class and should - conform to the same interface as a :meth:`~object.__reduce__` + conform to the same interface as a :meth:`__reduce__` method. By default, a pickler object will not have a @@ -390,8 +390,8 @@ * classes that are defined at the top level of a module -* instances of such classes whose :attr:`__dict__` or the result of calling - :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for +* instances of such classes whose :attr:`~object.__dict__` or the result of + calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for details). Attempts to pickle unpicklable objects will raise the :exc:`PicklingError` @@ -435,6 +435,8 @@ Pickling Class Instances ------------------------ +.. currentmodule:: None + In this section, we describe the general mechanisms available to you to define, customize, and control how class instances are pickled and unpickled. @@ -470,7 +472,7 @@ defines the method :meth:`__getstate__`, it is called and the returned object is pickled as the contents for the instance, instead of the contents of the instance's dictionary. If the :meth:`__getstate__` method is absent, the - instance's :attr:`__dict__` is pickled as usual. + instance's :attr:`~object.__dict__` is pickled as usual. .. method:: object.__setstate__(state) @@ -539,7 +541,7 @@ * Optionally, the object's state, which will be passed to the object's :meth:`__setstate__` method as previously described. If the object has no such method then, the value must be a dictionary and it will be added to - the object's :attr:`__dict__` attribute. + the object's :attr:`~object.__dict__` attribute. * Optionally, an iterator (and not a sequence) yielding successive items. These items will be appended to the object either using @@ -565,6 +567,8 @@ the extended version. The main use for this method is to provide backwards-compatible reduce values for older Python releases. +.. currentmodule:: pickle + .. _pickle-persistent: Persistence of External Objects @@ -582,19 +586,19 @@ The resolution of such persistent IDs is not defined by the :mod:`pickle` module; it will delegate this resolution to the user defined methods on the -pickler and unpickler, :meth:`persistent_id` and :meth:`persistent_load` -respectively. +pickler and unpickler, :meth:`~Pickler.persistent_id` and +:meth:`~Unpickler.persistent_load` respectively. To pickle objects that have an external persistent id, the pickler must have a -custom :meth:`persistent_id` method that takes an object as an argument and -returns either ``None`` or the persistent id for that object. When ``None`` is -returned, the pickler simply pickles the object as normal. When a persistent ID -string is returned, the pickler will pickle that object, along with a marker so -that the unpickler will recognize it as a persistent ID. +custom :meth:`~Pickler.persistent_id` method that takes an object as an +argument and returns either ``None`` or the persistent id for that object. +When ``None`` is returned, the pickler simply pickles the object as normal. +When a persistent ID string is returned, the pickler will pickle that object, +along with a marker so that the unpickler will recognize it as a persistent ID. To unpickle external objects, the unpickler must have a custom -:meth:`persistent_load` method that takes a persistent ID object and returns the -referenced object. +:meth:`~Unpickler.persistent_load` method that takes a persistent ID object and +returns the referenced object. Here is a comprehensive example presenting how persistent ID can be used to pickle external objects by reference. @@ -651,7 +655,7 @@ Here's an example that shows how to modify pickling behavior for a class. The :class:`TextReader` class opens a text file, and returns the line number and -line contents each time its :meth:`readline` method is called. If a +line contents each time its :meth:`!readline` method is called. If a :class:`TextReader` instance is pickled, all attributes *except* the file object member are saved. When the instance is unpickled, the file is reopened, and reading resumes from the last location. The :meth:`__setstate__` and @@ -730,9 +734,10 @@ inoffensive, it is not difficult to imagine one that could damage your system. For this reason, you may want to control what gets unpickled by customizing -:meth:`Unpickler.find_class`. Unlike its name suggests, :meth:`find_class` is -called whenever a global (i.e., a class or a function) is requested. Thus it is -possible to either completely forbid globals or restrict them to a safe subset. +:meth:`Unpickler.find_class`. Unlike its name suggests, +:meth:`Unpickler.find_class` is called whenever a global (i.e., a class or +a function) is requested. Thus it is possible to either completely forbid +globals or restrict them to a safe subset. Here is an example of an unpickler allowing only few safe classes from the :mod:`builtins` module to be loaded:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 16:09:34 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 16:09:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxNzE1?= =?utf-8?q?4=3A_error_out_gracefully_on_=22ignore=22_or_=22condition=22_wi?= =?utf-8?q?thout_argument=2E?= Message-ID: <3cz1qL58VXz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/3507be2f94d4 changeset: 86362:3507be2f94d4 branch: 3.3 parent: 86360:f2c725fb4b2f user: Georg Brandl date: Mon Oct 14 16:08:15 2013 +0200 summary: Closes #17154: error out gracefully on "ignore" or "condition" without argument. files: Lib/pdb.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -805,6 +805,8 @@ cond = None try: bp = self.get_bpbynumber(args[0].strip()) + except IndexError: + self.error('Breakpoint number expected') except ValueError as err: self.error(err) else: @@ -832,6 +834,8 @@ count = 0 try: bp = self.get_bpbynumber(args[0].strip()) + except IndexError: + self.error('Breakpoint number expected') except ValueError as err: self.error(err) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 16:09:35 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 16:09:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cz1qM6z22z7Ljn@mail.python.org> http://hg.python.org/cpython/rev/cbf515f5a810 changeset: 86363:cbf515f5a810 parent: 86361:37c06d20dda5 parent: 86362:3507be2f94d4 user: Georg Brandl date: Mon Oct 14 16:08:25 2013 +0200 summary: merge with 3.3 files: Lib/pdb.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -798,6 +798,8 @@ cond = None try: bp = self.get_bpbynumber(args[0].strip()) + except IndexError: + self.error('Breakpoint number expected') except ValueError as err: self.error(err) else: @@ -825,6 +827,8 @@ count = 0 try: bp = self.get_bpbynumber(args[0].strip()) + except IndexError: + self.error('Breakpoint number expected') except ValueError as err: self.error(err) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 16:53:22 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 16:53:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTI1?= =?utf-8?q?8=3A_close_WSGI_server_after_handling_request_in_demo_code=2E?= Message-ID: <3cz2nt1VHVz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/f1e66ef64d17 changeset: 86364:f1e66ef64d17 branch: 3.3 parent: 86362:3507be2f94d4 user: Georg Brandl date: Mon Oct 14 16:52:13 2013 +0200 summary: Closes #19258: close WSGI server after handling request in demo code. files: Lib/wsgiref/simple_server.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py --- a/Lib/wsgiref/simple_server.py +++ b/Lib/wsgiref/simple_server.py @@ -155,3 +155,4 @@ import webbrowser webbrowser.open('http://localhost:8000/xyz?abc') httpd.handle_request() # serve one request, then exit + httpd.server_close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 16:53:23 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 16:53:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTI1?= =?utf-8?q?8=3A_close_WSGI_server_after_handling_request_in_demo_code=2E?= Message-ID: <3cz2nv3JLlz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/64a1e224042e changeset: 86365:64a1e224042e branch: 2.7 parent: 86359:c99a3566be83 user: Georg Brandl date: Mon Oct 14 16:52:13 2013 +0200 summary: Closes #19258: close WSGI server after handling request in demo code. files: Lib/wsgiref/simple_server.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py --- a/Lib/wsgiref/simple_server.py +++ b/Lib/wsgiref/simple_server.py @@ -153,3 +153,4 @@ import webbrowser webbrowser.open('http://localhost:8000/xyz?abc') httpd.handle_request() # serve one request, then exit + httpd.server_close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 16:53:24 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 16:53:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3cz2nw58llz7LkW@mail.python.org> http://hg.python.org/cpython/rev/0ee6543fb3f2 changeset: 86366:0ee6543fb3f2 parent: 86363:cbf515f5a810 parent: 86364:f1e66ef64d17 user: Georg Brandl date: Mon Oct 14 16:53:07 2013 +0200 summary: merge with 3.3 files: Lib/wsgiref/simple_server.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py --- a/Lib/wsgiref/simple_server.py +++ b/Lib/wsgiref/simple_server.py @@ -155,3 +155,4 @@ import webbrowser webbrowser.open('http://localhost:8000/xyz?abc') httpd.handle_request() # serve one request, then exit + httpd.server_close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:06:35 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:06:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Catch_and_check_warnings_in_the_aifc_module_tests=2E?= Message-ID: <3cz5lb3JRjz7LjP@mail.python.org> http://hg.python.org/cpython/rev/164a60cce934 changeset: 86367:164a60cce934 branch: 2.7 parent: 86365:64a1e224042e user: Serhiy Storchaka date: Mon Oct 14 20:03:06 2013 +0300 summary: Issue #18919: Catch and check warnings in the aifc module tests. files: Lib/test/test_aifc.py | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,4 +1,5 @@ -from test.test_support import findfile, TESTFN, unlink, run_unittest +from test.test_support import (findfile, TESTFN, unlink, captured_stdout, + run_unittest) import unittest from test import audiotests import os @@ -225,7 +226,10 @@ b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 b += 'MARK' + struct.pack('>LhB', 3, 1, 1) - f = aifc.open(io.BytesIO(b)) + with captured_stdout() as s: + f = aifc.open(io.BytesIO(b)) + self.assertEqual(s.getvalue(), 'Warning: MARK chunk contains ' + 'only 0 markers instead of 1\n') self.assertEqual(f.getmarkers(), None) def test_read_comm_kludge_compname_even(self): @@ -233,7 +237,9 @@ b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += 'NONE' + struct.pack('B', 4) + 'even' + '\x00' b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 - f = aifc.open(io.BytesIO(b)) + with captured_stdout() as s: + f = aifc.open(io.BytesIO(b)) + self.assertEqual(s.getvalue(), 'Warning: bad COMM chunk size\n') self.assertEqual(f.getcompname(), 'even') def test_read_comm_kludge_compname_odd(self): @@ -241,7 +247,9 @@ b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += 'NONE' + struct.pack('B', 3) + 'odd' b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8 - f = aifc.open(io.BytesIO(b)) + with captured_stdout() as s: + f = aifc.open(io.BytesIO(b)) + self.assertEqual(s.getvalue(), 'Warning: bad COMM chunk size\n') self.assertEqual(f.getcompname(), 'odd') def test_write_params_raises(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:06:36 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:06:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Check_warnings_messages_in_the_aifc_module_tests=2E?= Message-ID: <3cz5lc5BGgz7LjP@mail.python.org> http://hg.python.org/cpython/rev/9eecd00ffc28 changeset: 86368:9eecd00ffc28 branch: 3.3 parent: 86364:f1e66ef64d17 user: Serhiy Storchaka date: Mon Oct 14 20:05:33 2013 +0300 summary: Issue #18919: Check warnings messages in the aifc module tests. files: Lib/test/test_aifc.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -260,8 +260,10 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 b += b'MARK' + struct.pack('>LhB', 3, 1, 1) - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: MARK chunk contains ' + 'only 0 markers instead of 1') self.assertEqual(f.getmarkers(), None) def test_read_comm_kludge_compname_even(self): @@ -269,8 +271,9 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'NONE' + struct.pack('B', 4) + b'even' + b'\x00' b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') self.assertEqual(f.getcompname(), b'even') def test_read_comm_kludge_compname_odd(self): @@ -278,8 +281,9 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'NONE' + struct.pack('B', 3) + b'odd' b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') self.assertEqual(f.getcompname(), b'odd') def test_write_params_raises(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:06:37 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:06:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318919=3A_Check_warnings_messages_in_the_aifc_mo?= =?utf-8?q?dule_tests=2E?= Message-ID: <3cz5ld73hrz7LkF@mail.python.org> http://hg.python.org/cpython/rev/d168f094d16d changeset: 86369:d168f094d16d parent: 86366:0ee6543fb3f2 parent: 86368:9eecd00ffc28 user: Serhiy Storchaka date: Mon Oct 14 20:06:04 2013 +0300 summary: Issue #18919: Check warnings messages in the aifc module tests. files: Lib/test/test_aifc.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -275,8 +275,10 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 b += b'MARK' + struct.pack('>LhB', 3, 1, 1) - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: MARK chunk contains ' + 'only 0 markers instead of 1') self.assertEqual(f.getmarkers(), None) def test_read_comm_kludge_compname_even(self): @@ -284,8 +286,9 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'NONE' + struct.pack('B', 4) + b'even' + b'\x00' b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') self.assertEqual(f.getcompname(), b'even') def test_read_comm_kludge_compname_odd(self): @@ -293,8 +296,9 @@ b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0) b += b'NONE' + struct.pack('B', 3) + b'odd' b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 - with self.assertWarns(UserWarning): + with self.assertWarns(UserWarning) as cm: f = aifc.open(io.BytesIO(b)) + self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') self.assertEqual(f.getcompname(), b'odd') def test_write_params_raises(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:10:42 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:10:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Fixed_resource_leaks_in_audio_tests=2E?= Message-ID: <3cz5rL3mjJz7LjP@mail.python.org> http://hg.python.org/cpython/rev/fd7752db1e54 changeset: 86370:fd7752db1e54 branch: 2.7 parent: 86367:164a60cce934 user: Serhiy Storchaka date: Mon Oct 14 20:09:30 2013 +0300 summary: Issue #18919: Fixed resource leaks in audio tests. files: Lib/test/audiotests.py | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py --- a/Lib/test/audiotests.py +++ b/Lib/test/audiotests.py @@ -145,18 +145,18 @@ self.sndfilenframes, self.comptype, self.compname) def test_close(self): - testfile = open(self.sndfilepath, 'rb') - f = self.f = self.module.open(testfile) - self.assertFalse(testfile.closed) - f.close() - self.assertEqual(testfile.closed, self.close_fd) - testfile = open(TESTFN, 'wb') - fout = self.module.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(self.module.Error): - fout.close() - self.assertEqual(testfile.closed, self.close_fd) - fout.close() # do nothing + with open(self.sndfilepath, 'rb') as testfile: + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + with open(TESTFN, 'wb') as testfile: + fout = self.fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing def test_read(self): framesize = self.nchannels * self.sampwidth -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:10:43 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:10:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Fixed_resource_leaks_in_audio_tests=2E?= Message-ID: <3cz5rM5dcBz7LkC@mail.python.org> http://hg.python.org/cpython/rev/2850fc02f324 changeset: 86371:2850fc02f324 branch: 3.3 parent: 86368:9eecd00ffc28 user: Serhiy Storchaka date: Mon Oct 14 20:09:47 2013 +0300 summary: Issue #18919: Fixed resource leaks in audio tests. files: Lib/test/audiotests.py | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py --- a/Lib/test/audiotests.py +++ b/Lib/test/audiotests.py @@ -141,18 +141,18 @@ self.sndfilenframes, self.comptype, self.compname) def test_close(self): - testfile = open(self.sndfilepath, 'rb') - f = self.f = self.module.open(testfile) - self.assertFalse(testfile.closed) - f.close() - self.assertEqual(testfile.closed, self.close_fd) - testfile = open(TESTFN, 'wb') - fout = self.module.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(self.module.Error): - fout.close() - self.assertEqual(testfile.closed, self.close_fd) - fout.close() # do nothing + with open(self.sndfilepath, 'rb') as testfile: + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + with open(TESTFN, 'wb') as testfile: + fout = self.fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing def test_read(self): framesize = self.nchannels * self.sampwidth -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 19:10:45 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 19:10:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318919=3A_Fixed_resource_leaks_in_audio_tests=2E?= Message-ID: <3cz5rP0hHQz7LkD@mail.python.org> http://hg.python.org/cpython/rev/835c6ea487b1 changeset: 86372:835c6ea487b1 parent: 86369:d168f094d16d parent: 86371:2850fc02f324 user: Serhiy Storchaka date: Mon Oct 14 20:10:18 2013 +0300 summary: Issue #18919: Fixed resource leaks in audio tests. files: Lib/test/audiotests.py | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py --- a/Lib/test/audiotests.py +++ b/Lib/test/audiotests.py @@ -191,18 +191,18 @@ self.sndfilenframes, self.comptype, self.compname) def test_close(self): - testfile = open(self.sndfilepath, 'rb') - f = self.f = self.module.open(testfile) - self.assertFalse(testfile.closed) - f.close() - self.assertEqual(testfile.closed, self.close_fd) - testfile = open(TESTFN, 'wb') - fout = self.module.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(self.module.Error): - fout.close() - self.assertEqual(testfile.closed, self.close_fd) - fout.close() # do nothing + with open(self.sndfilepath, 'rb') as testfile: + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + with open(TESTFN, 'wb') as testfile: + fout = self.fout = self.module.open(testfile, 'wb') + self.assertFalse(testfile.closed) + with self.assertRaises(self.module.Error): + fout.close() + self.assertEqual(testfile.closed, self.close_fd) + fout.close() # do nothing def test_read(self): framesize = self.nchannels * self.sampwidth -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 20:16:56 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 20:16:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?benchmarks=3A_Make_logging_output_a_l?= =?utf-8?q?ittle_more_consistent=2E?= Message-ID: <3cz7Jm1HPbz7LjP@mail.python.org> http://hg.python.org/benchmarks/rev/8c0abff6273a changeset: 213:8c0abff6273a user: Georg Brandl date: Mon Oct 14 20:17:41 2013 +0200 summary: Make logging output a little more consistent. files: perf.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -886,7 +886,7 @@ def LogCall(command): command = list(map(str, command)) - info("Running %s", " ".join(command)) + info("Running `%s`", " ".join(command)) return command @@ -1259,7 +1259,7 @@ an_s = "s" if iterations == 1: an_s = "" - info("Running `%s` %d time%s", command, iterations, an_s) + info("Running `%s` %d time%s", " ".join(command), iterations, an_s) times = [] mem_usage = [] @@ -1859,7 +1859,7 @@ work = "i = 0\nwhile i < 200000: i += 1" command = python + cmd_opts + ["-c", work] mem_usage = [] - info("Running `%s` %d times", command, num_loops * 20) + info("Running `%s` %d times", " ".join(command), num_loops * 20) for _ in range(num_loops): t0 = time.time() _StartupPython(command, mem_usage, track_memory, inherit_env) -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Mon Oct 14 20:19:56 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 20:19:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Add_test/audiodata_to_LIBSUBDIRS=2E?= Message-ID: <3cz7ND3m4zz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/de1f62a55648 changeset: 86373:de1f62a55648 branch: 2.7 parent: 86370:fd7752db1e54 user: Serhiy Storchaka date: Mon Oct 14 21:18:29 2013 +0300 summary: Issue #18919: Add test/audiodata to LIBSUBDIRS. files: Makefile.pre.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -924,7 +924,7 @@ plat-mac/lib-scriptpackages/Terminal PLATMACPATH=:plat-mac:plat-mac/lib-scriptpackages LIBSUBDIRS= lib-tk lib-tk/test lib-tk/test/test_tkinter \ - lib-tk/test/test_ttk site-packages test test/data \ + lib-tk/test/test_ttk site-packages test test/audiodata test/data \ test/cjkencodings test/decimaltestdata test/xmltestdata test/subprocessdata \ test/tracedmodules \ encodings compiler hotshot \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 20:19:57 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 20:19:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4OTE5?= =?utf-8?q?=3A_Add_test/audiodata_to_LIBSUBDIRS=2E?= Message-ID: <3cz7NF5k1jz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/865bab7387f2 changeset: 86374:865bab7387f2 branch: 3.3 parent: 86371:2850fc02f324 user: Serhiy Storchaka date: Mon Oct 14 21:18:50 2013 +0300 summary: Issue #18919: Add test/audiodata to LIBSUBDIRS. files: Makefile.pre.in | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1010,6 +1010,7 @@ XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ tkinter/test/test_ttk site-packages test \ + test/audiodata \ test/capath test/data \ test/cjkencodings test/decimaltestdata test/xmltestdata \ test/subprocessdata test/sndhdrdata test/support \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 20:19:59 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Oct 2013 20:19:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318919=3A_Add_test/audiodata_to_LIBSUBDIRS=2E?= Message-ID: <3cz7NH0Z1dz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/4d5143ff58ea changeset: 86375:4d5143ff58ea parent: 86372:835c6ea487b1 parent: 86374:865bab7387f2 user: Serhiy Storchaka date: Mon Oct 14 21:19:24 2013 +0300 summary: Issue #18919: Add test/audiodata to LIBSUBDIRS. files: Makefile.pre.in | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1060,6 +1060,7 @@ XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ tkinter/test/test_ttk site-packages test \ + test/audiodata \ test/capath test/data \ test/cjkencodings test/decimaltestdata test/xmltestdata \ test/subprocessdata test/sndhdrdata test/support \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 20:50:41 2013 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 14 Oct 2013 20:50:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319260=3A_remove_o?= =?utf-8?q?utdated_comment_in_marshal=2Ec?= Message-ID: <3cz83j0wZBz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/1309fee48908 changeset: 86376:1309fee48908 user: Antoine Pitrou date: Mon Oct 14 20:50:32 2013 +0200 summary: Close #19260: remove outdated comment in marshal.c files: Python/marshal.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -614,7 +614,6 @@ } if (!p->readable) { assert(p->fp != NULL); - /* The result fits into int because it must be <=n. */ read = fread(p->buf, 1, n, p->fp); } else { @@ -650,7 +649,6 @@ return p->buf; } - static int r_byte(RFILE *p) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 14 21:31:38 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 14 Oct 2013 21:31:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?benchmarks=3A_Closes_=2319079=3A_add_?= =?utf-8?q?VersionRange_decorator_to_benchmark_suite_to_mark_compatible?= Message-ID: <3cz8yy2JhZz7LjR@mail.python.org> http://hg.python.org/benchmarks/rev/e40042a7788c changeset: 214:e40042a7788c user: Georg Brandl date: Mon Oct 14 21:32:30 2013 +0200 summary: Closes #19079: add VersionRange decorator to benchmark suite to mark compatible Python versions. The selected set of benchmarks is intersected with the set of benchmarks compatible with both selected Pythons before running. The "2n3" set of benchmarks is now calculated automatically. files: perf.py | 177 +++++++++++++++++++++++++++++++------------ 1 files changed, 125 insertions(+), 52 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -88,8 +88,8 @@ info = logging.info -def ported_lib(python, _cache={}): - """Return the 3rd-party library path for the given Python interpreter. +def interpreter_version(python, _cache={}): + """Return the interpreter version for the given Python interpreter. *python* is the base command (as a list) to execute the interpreter. """ key = tuple(python) @@ -97,20 +97,27 @@ return _cache[key] except KeyError: pass - code = """import sys; print(sys.version_info[0])""" + code = """import sys; print('.'.join(map(str, sys.version_info[:2])))""" subproc = subprocess.Popen(python + ['-c', code], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = subproc.communicate() if subproc.returncode != 0: raise RuntimeError("Child interpreter died: " + err.decode()) - major = int(out.strip()) - if major == 2: - result = 'lib' - else: - result = 'lib3' - _cache[key] = result - return result + version = out.strip() + if len(version) != 3: + raise RuntimeError("Strange version printed: %s" % version) + _cache[key] = version + return version + + +def ported_lib(python): + """Return the 3rd-party library path for the given Python interpreter. + *python* is the base command (as a list) to execute the interpreter. + """ + if interpreter_version(python)[0] == '3': + return 'lib3' + return 'lib' def avg(seq): @@ -1134,6 +1141,17 @@ ### Benchmarks +# Decorators for giving ranges of supported Python versions. +# Benchmarks without a range applied are assumed to be compatible with all +# (reasonably new) Python versions. + +def VersionRange(minver=None, maxver=None): + def deco(func): + func._range = minver or '2.0', maxver or '4.0' + return func + return deco + + class PyBenchBenchmarkResult(object): def __init__(self, min_base, min_changed, delta_min, @@ -1172,6 +1190,7 @@ return BenchmarkError(line) + at VersionRange(None, '2.7') def BM_PyBench(base_python, changed_python, options): if options.track_memory: return BenchmarkError("Benchmark does not report memory usage yet") @@ -1310,7 +1329,7 @@ command = python + [two_to_three_bin, "-f", "all", target] return MeasureCommand(command, trials, env, options.track_memory) - + at VersionRange() def BM_2to3(*args, **kwargs): return SimpleBenchmark(Measure2to3, *args, **kwargs) @@ -1331,7 +1350,7 @@ command = python + [hg_bin, "help"] return MeasureCommand(command, trials, hg_env, options.track_memory) - + at VersionRange(None, '2.7') def BM_hg_startup(*args, **kwargs): return SimpleBenchmark(MeasureHgStartup, *args, **kwargs) @@ -1350,7 +1369,7 @@ command = python + [bzr_bin, "help"] return MeasureCommand(command, trials, bzr_env, options.track_memory) - + at VersionRange(None, '2.7') def BM_bzr_startup(*args, **kwargs): return SimpleBenchmark(MeasureBzrStartup, *args, **kwargs) @@ -1362,7 +1381,7 @@ bm_env = {"PYTHONPATH": lib_path} return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=3) - + at VersionRange(None, '3.3') def BM_Chameleon(*args, **kwargs): return SimpleBenchmark(MeasureChameleon, *args, **kwargs) @@ -1375,7 +1394,7 @@ bm_env = {"PYTHONPATH": DJANGO_DIR} return MeasureGeneric(python, options, bm_path, bm_env) - + at VersionRange(None, '2.7') def BM_Django(*args, **kwargs): return SimpleBenchmark(MeasureDjango, *args, **kwargs) @@ -1386,6 +1405,7 @@ bm_env = {"PYTHONPATH": django_path} return MeasureGeneric(python, options, bm_path, bm_env) + at VersionRange() def BM_Django_v2(*args, **kwargs): return SimpleBenchmark(MeasureDjangoV2, *args, **kwargs) @@ -1394,6 +1414,7 @@ bm_path = Relative("performance/bm_float.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Float(*args, **kwargs): return SimpleBenchmark(MeasureFloat, *args, **kwargs) @@ -1413,7 +1434,7 @@ return MeasureGeneric(python, options, bm_path, bm_env) - + at VersionRange(None, '2.7') def BM_Rietveld(*args, **kwargs): return SimpleBenchmark(MeasureRietveld, *args, **kwargs) @@ -1505,10 +1526,12 @@ pass + at VersionRange(None, '2.7') def BM_Spitfire(*args, **kwargs): return SimpleBenchmark(MeasureSpitfireWithPsyco, *args, **kwargs) + at VersionRange(None, '2.7') def BM_SlowSpitfire(base_python, changed_python, options): extra_args = ["--disable_psyco"] spitfire_env = {"PYTHONPATH": Relative("lib/spitfire")} @@ -1530,7 +1553,7 @@ bm_env = BuildEnv({"PYTHONPATH": mako_path}, options.inherit_env) return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=5) - + at VersionRange() def BM_mako(*args, **kwargs): return SimpleBenchmark(MeasureMako, *args, **kwargs) @@ -1542,7 +1565,7 @@ return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=10) - + at VersionRange() def BM_mako_v2(*args, **kwargs): return SimpleBenchmark(MeasureMakoV2, *args, **kwargs) @@ -1554,7 +1577,7 @@ return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=10) - + at VersionRange() def BM_pathlib(*args, **kwargs): return SimpleBenchmark(MeasurePathlib, *args, **kwargs) @@ -1592,30 +1615,36 @@ return SimpleBenchmark(MeasurePickle, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_FastPickle(base_python, changed_python, options): args = ["--use_cpickle", "pickle"] return _PickleBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_FastUnpickle(base_python, changed_python, options): args = ["--use_cpickle", "unpickle"] return _PickleBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_Pickle_List(base_python, changed_python, options): args = ["--use_cpickle", "pickle_list"] return _PickleBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_Unpickle_List(base_python, changed_python, options): args = ["--use_cpickle", "unpickle_list"] return _PickleBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_Pickle_Dict(base_python, changed_python, options): args = ["--use_cpickle", "pickle_dict"] return _PickleBenchmark(base_python, changed_python, options, args) + at VersionRange(None, '2.7') # 3.x doesn't have slow pickle def BM_SlowPickle(base_python, changed_python, options): return _PickleBenchmark(base_python, changed_python, options, ["pickle"]) + at VersionRange(None, '2.7') def BM_SlowUnpickle(base_python, changed_python, options): return _PickleBenchmark(base_python, changed_python, options, ["unpickle"]) @@ -1634,25 +1663,25 @@ bm_path = Relative("performance/bm_elementtree.py") return MeasureGeneric(python, options, bm_path, extra_args=extra_args) - + at VersionRange() def BM_ETree_Parse(base_python, changed_python, options): extra_args = ['parse'] return SimpleBenchmark(MeasureEtree, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_ETree_IterParse(base_python, changed_python, options): extra_args = ['iterparse'] return SimpleBenchmark(MeasureEtree, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_ETree_Generate(base_python, changed_python, options): extra_args = ['generate'] return SimpleBenchmark(MeasureEtree, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_ETree_Process(base_python, changed_python, options): extra_args = ['process'] return SimpleBenchmark(MeasureEtree, @@ -1692,11 +1721,12 @@ return SimpleBenchmark(MeasureJSON, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_JSON_Dump(base_python, changed_python, options): args = ["json_dump"] return _JSONBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_JSON_Load(base_python, changed_python, options): args = ["json_load"] return _JSONBenchmark(base_python, changed_python, options, args) @@ -1706,9 +1736,11 @@ bm_path = Relative("performance/bm_json_v2.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_JSON_Dump_V2(*args, **kwargs): return SimpleBenchmark(MeasureJSONDumpV2, *args, **kwargs) + def MeasureNQueens(python, options): """Test the performance of an N-Queens solver. @@ -1722,6 +1754,7 @@ bm_path = Relative("performance/bm_nqueens.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_NQueens(*args, **kwargs): return SimpleBenchmark(MeasureNQueens, *args, **kwargs) @@ -1730,6 +1763,7 @@ bm_path = Relative("performance/bm_chaos.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Chaos(*args, **kwargs): return SimpleBenchmark(MeasureChaos, *args, **kwargs) @@ -1738,6 +1772,7 @@ bm_path = Relative("performance/bm_fannkuch.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Fannkuch(*args, **kwargs): return SimpleBenchmark(MeasureFannkuch, *args, **kwargs) @@ -1746,6 +1781,7 @@ bm_path = Relative("performance/bm_go.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Go(*args, **kwargs): return SimpleBenchmark(MeasureGo, *args, **kwargs) @@ -1754,6 +1790,7 @@ bm_path = Relative("performance/bm_meteor_contest.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Meteor_Contest(*args, **kwargs): return SimpleBenchmark(MeasureMeteorContest, *args, **kwargs) @@ -1762,6 +1799,7 @@ bm_path = Relative("performance/bm_spectral_norm.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Spectral_Norm(*args, **kwargs): return SimpleBenchmark(MeasureSpectralNorm, *args, **kwargs) @@ -1770,6 +1808,7 @@ bm_path = Relative("performance/bm_telco.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Telco(*args, **kwargs): return SimpleBenchmark(MeasureTelco, *args, **kwargs) @@ -1778,6 +1817,7 @@ bm_path = Relative("performance/bm_hexiom2.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=0.04) + at VersionRange() def BM_Hexiom2(*args, **kwargs): return SimpleBenchmark(MeasureHexiom2, *args, **kwargs) @@ -1786,6 +1826,7 @@ bm_path = Relative("performance/bm_raytrace.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_Raytrace(*args, **kwargs): return SimpleBenchmark(MeasureRaytrace, *args, **kwargs) @@ -1823,15 +1864,17 @@ return SimpleBenchmark(MeasureLogging, base_python, changed_python, options, extra_args) - + at VersionRange() def BM_Silent_Logging(base_python, changed_python, options): args = ["no_output"] return _LoggingBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_Simple_Logging(base_python, changed_python, options): args = ["simple_output"] return _LoggingBenchmark(base_python, changed_python, options, args) + at VersionRange() def BM_Formatted_Logging(base_python, changed_python, options): args = ["formatted_output"] return _LoggingBenchmark(base_python, changed_python, options, args) @@ -1888,7 +1931,7 @@ mem_usage = None return RawData(times, mem_usage) - + at VersionRange() def BM_normal_startup(base_python, changed_python, options): if options.rigorous: num_loops = 100 @@ -1905,7 +1948,7 @@ return CompareBenchmarkData(base_data, changed_data, options) - + at VersionRange() def BM_startup_nosite(base_python, changed_python, options): if options.rigorous: num_loops = 200 @@ -1941,17 +1984,17 @@ return SimpleBenchmark(MeasureRegexPerformance, base_python, changed_python, options, bm_path) - + at VersionRange() def BM_regex_v8(base_python, changed_python, options): bm_path = "performance/bm_regex_v8.py" return RegexBenchmark(base_python, changed_python, options, bm_path) - + at VersionRange() def BM_regex_effbot(base_python, changed_python, options): bm_path = "performance/bm_regex_effbot.py" return RegexBenchmark(base_python, changed_python, options, bm_path) - + at VersionRange() def BM_regex_compile(base_python, changed_python, options): bm_path = "performance/bm_regex_compile.py" return RegexBenchmark(base_python, changed_python, options, bm_path) @@ -1976,12 +2019,12 @@ return SimpleBenchmark(MeasureThreading, base_python, changed_python, options, bm_name) - + at VersionRange() def BM_threaded_count(base_python, changed_python, options): bm_name = "threaded_count" return ThreadingBenchmark(base_python, changed_python, options, bm_name) - + at VersionRange() def BM_iterative_count(base_python, changed_python, options): bm_name = "iterative_count" return ThreadingBenchmark(base_python, changed_python, options, bm_name) @@ -2000,7 +2043,7 @@ bm_path = Relative("performance/bm_unpack_sequence.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=1000) - + at VersionRange() def BM_unpack_sequence(*args, **kwargs): return SimpleBenchmark(MeasureUnpackSequence, *args, **kwargs) @@ -2009,7 +2052,7 @@ bm_path = Relative("performance/bm_call_simple.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=3) - + at VersionRange() def BM_call_simple(*args, **kwargs): return SimpleBenchmark(MeasureCallSimple, *args, **kwargs) @@ -2018,7 +2061,7 @@ bm_path = Relative("performance/bm_call_method.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=3) - + at VersionRange() def BM_call_method(*args, **kwargs): return SimpleBenchmark(MeasureCallMethod, *args, **kwargs) @@ -2027,7 +2070,7 @@ bm_path = Relative("performance/bm_call_method_unknown.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=3) - + at VersionRange() def BM_call_method_unknown(*args, **kwargs): return SimpleBenchmark(MeasureCallMethodUnknown, *args, **kwargs) @@ -2036,7 +2079,7 @@ bm_path = Relative("performance/bm_call_method_slots.py") return MeasureGeneric(python, options, bm_path, iteration_scaling=3) - + at VersionRange() def BM_call_method_slots(*args, **kwargs): return SimpleBenchmark(MeasureCallMethodSlots, *args, **kwargs) @@ -2054,7 +2097,7 @@ bm_path = Relative("performance/bm_nbody.py") return MeasureGeneric(python, options, bm_path) - + at VersionRange() def BM_nbody(*args, **kwargs): return SimpleBenchmark(MeasureNbody, *args, **kwargs) @@ -2074,7 +2117,7 @@ bm_env = BuildEnv({"PYTHONPATH": pypath}, options.inherit_env) return MeasureGeneric(python, options, bm_path, bm_env) - + at VersionRange(None, '2.7') def BM_spambayes(*args, **kwargs): return SimpleBenchmark(MeasureSpamBayes, *args, **kwargs) @@ -2095,7 +2138,7 @@ return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=0.10) - + at VersionRange(None, '2.7') def BM_html5lib_warmup(*args, **kwargs): return SimpleBenchmark(MeasureHtml5libWarmup, *args, **kwargs) @@ -2114,7 +2157,7 @@ command = python + [bm_path, "-n", "1"] return MeasureCommand(command, trials, bm_env, options.track_memory) - + at VersionRange(None, '2.7') def BM_html5lib(*args, **kwargs): return SimpleBenchmark(MeasureHtml5lib, *args, **kwargs) @@ -2123,6 +2166,7 @@ bm_path = Relative("performance/bm_richards.py") return MeasureGeneric(python, options, bm_path) + at VersionRange() def BM_richards(*args, **kwargs): return SimpleBenchmark(MeasureRichards, *args, **kwargs) @@ -2141,7 +2185,7 @@ bm_path = Relative("performance/bm_pidigits.py") return MeasureGeneric(python, options, bm_path) - + at VersionRange() def BM_pidigits(*args, **kwargs): return SimpleBenchmark(MeasurePiDigits, *args, **kwargs) @@ -2180,17 +2224,16 @@ "template" : ["slowspitfire", "django_v2", "mako_v2"], "logging": ["silent_logging", "simple_logging", "formatted_logging"], - # Benchmarks natively 2.x- and 3.x-compatible - "2n3": ["2to3", "calls", "chameleon", "chaos", "django_v2", - "etree", "fannkuch", "fastpickle", "fastunpickle", - "go", "hexiom2", "json_dump_v2", "json_load", - "mako", "mako_v2", "math", "logging", - "meteor_contest", "normal_startup", "nqueens", - "pathlib", "raytrace", "regex", "richards", - "spectral_norm", "startup_nosite", "telco", - "threading", "unpack_sequence"], } +# Calculate set of 2-and-3 compatible benchmarks. +group2n3 = BENCH_GROUPS["2n3"] = [] +for bm, func in BENCH_FUNCS.items(): + minver, maxver = getattr(func, '_range', ('2.0', '4.0')) + if minver <= '2.7' and '3.2' <= maxver: + group2n3.append(bm) + + SLOW_BENCHMARKS = ["hexiom2"] @@ -2257,6 +2300,33 @@ return should_run +def FilterBenchmarks(benchmarks, bench_funcs, base_python, changed_python): + """Filters out benchmarks not supported by both Pythons. + + Args: + benchmarks: a set() of benchmark names + bench_funcs: dict mapping benchmark names to functions + base_python, changed_python: the interpereter commands (as lists) + + Returns: + The filtered set of benchmark names + """ + basever = interpreter_version(base_python) + changedver = interpreter_version(changed_python) + for bm in list(benchmarks): + minver, maxver = getattr(bench_funcs[bm], '_range', ('2.0', '4.0')) + if not minver <= basever <= maxver: + benchmarks.discard(bm) + logging.info("Skipping benchmark %s; not compatible with " + "Python %s" % (bm, basever)) + continue + if not minver <= changedver <= maxver: + benchmarks.discard(bm) + logging.info("Skipping benchmark %s; not compatible with " + "Python %s" % (bm, changedver)) + return benchmarks + + def ParsePythonArgsOption(python_args_opt): """Parses the --args option. @@ -2407,6 +2477,9 @@ should_run = ParseBenchmarksOption(options.benchmarks, bench_groups, options.fast) + should_run = FilterBenchmarks(should_run, bench_funcs, + base_cmd_prefix, changed_cmd_prefix) + results = [] for name in sorted(should_run): func = bench_funcs[name] -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Mon Oct 14 22:01:13 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 14 Oct 2013 22:01:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzQ5NjU6IEltcGxl?= =?utf-8?q?ment_intelligent_scrolling_of_the_sidebar_in_the_docs=2E?= Message-ID: <3cz9d54lDzz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/d7ebe03fa752 changeset: 86377:d7ebe03fa752 branch: 2.7 parent: 86373:de1f62a55648 user: Ezio Melotti date: Mon Oct 14 22:01:28 2013 +0300 summary: #4965: Implement intelligent scrolling of the sidebar in the docs. files: Doc/tools/sphinxext/static/basic.css | 2 + Doc/tools/sphinxext/static/sidebar.js | 186 ++++++++++++++ 2 files changed, 188 insertions(+), 0 deletions(-) diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/sphinxext/static/basic.css --- a/Doc/tools/sphinxext/static/basic.css +++ b/Doc/tools/sphinxext/static/basic.css @@ -38,6 +38,8 @@ /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { + position: relative; + top: 0; padding: 10px 5px 0 10px; word-wrap: break-word; } diff --git a/Doc/tools/sphinxext/static/sidebar.js b/Doc/tools/sphinxext/static/sidebar.js new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/static/sidebar.js @@ -0,0 +1,186 @@ +/* + * sidebar.js + * ~~~~~~~~~~ + * + * This script makes the Sphinx sidebar collapsible and implements + * intelligent scrolling. + * + * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds + * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton + * used to collapse and expand the sidebar. + * + * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden + * and the width of the sidebar and the margin-left of the document + * are decreased. When the sidebar is expanded the opposite happens. + * This script saves a per-browser/per-session cookie used to + * remember the position of the sidebar among the pages. + * Once the browser is closed the cookie is deleted and the position + * reset to the default (expanded). + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +$(function() { + // global elements used by the functions. + // the 'sidebarbutton' element is defined as global after its + // creation, in the add_sidebar_button function + var jwindow = $(window); + var jdocument = $(document); + var bodywrapper = $('.bodywrapper'); + var sidebar = $('.sphinxsidebar'); + var sidebarwrapper = $('.sphinxsidebarwrapper'); + + // original margin-left of the bodywrapper and width of the sidebar + // with the sidebar expanded + var bw_margin_expanded = bodywrapper.css('margin-left'); + var ssb_width_expanded = sidebar.width(); + + // margin-left of the bodywrapper and width of the sidebar + // with the sidebar collapsed + var bw_margin_collapsed = '.8em'; + var ssb_width_collapsed = '.8em'; + + // colors used by the current theme + var dark_color = $('.related').css('background-color'); + var light_color = $('.document').css('background-color'); + + function get_viewport_height() { + if (window.innerHeight) + return window.innerHeight; + else + return jwindow.height(); + } + + function sidebar_is_collapsed() { + return sidebarwrapper.is(':not(:visible)'); + } + + function toggle_sidebar() { + if (sidebar_is_collapsed()) + expand_sidebar(); + else + collapse_sidebar(); + // adjust the scrolling of the sidebar + scroll_sidebar(); + } + + function collapse_sidebar() { + sidebarwrapper.hide(); + sidebar.css('width', ssb_width_collapsed); + bodywrapper.css('margin-left', bw_margin_collapsed); + sidebarbutton.css({ + 'margin-left': '0', + 'height': bodywrapper.height() + }); + sidebarbutton.find('span').text('?'); + sidebarbutton.attr('title', _('Expand sidebar')); + document.cookie = 'sidebar=collapsed'; + } + + function expand_sidebar() { + bodywrapper.css('margin-left', bw_margin_expanded); + sidebar.css('width', ssb_width_expanded); + sidebarwrapper.show(); + sidebarbutton.css({ + 'margin-left': ssb_width_expanded-12, + 'height': bodywrapper.height() + }); + sidebarbutton.find('span').text('?'); + sidebarbutton.attr('title', _('Collapse sidebar')); + document.cookie = 'sidebar=expanded'; + } + + function add_sidebar_button() { + sidebarwrapper.css({ + 'float': 'left', + 'margin-right': '0', + 'width': ssb_width_expanded - 28 + }); + // create the button + sidebar.append( + '
«
' + ); + var sidebarbutton = $('#sidebarbutton'); + light_color = sidebarbutton.css('background-color'); + // find the height of the viewport to center the '<<' in the page + var viewport_height = get_viewport_height(); + sidebarbutton.find('span').css({ + 'display': 'block', + 'margin-top': (viewport_height - sidebar.position().top - 20) / 2 + }); + + sidebarbutton.click(toggle_sidebar); + sidebarbutton.attr('title', _('Collapse sidebar')); + sidebarbutton.css({ + 'color': '#FFFFFF', + 'border-left': '1px solid ' + dark_color, + 'font-size': '1.2em', + 'cursor': 'pointer', + 'height': bodywrapper.height(), + 'padding-top': '1px', + 'margin-left': ssb_width_expanded - 12 + }); + + sidebarbutton.hover( + function () { + $(this).css('background-color', dark_color); + }, + function () { + $(this).css('background-color', light_color); + } + ); + } + + function set_position_from_cookie() { + if (!document.cookie) + return; + var items = document.cookie.split(';'); + for(var k=0; k wintop && curbot > winbot) { + sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); + } + else if (curtop < wintop && curbot < winbot) { + sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, + jdocument.height() - sidebar_height - 200])); + } + } + } + jwindow.scroll(scroll_sidebar); +}); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 15 07:02:31 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 15 Oct 2013 07:02:31 +0200 Subject: [Python-checkins] Daily reference leaks (1309fee48908): sum=0 Message-ID: results for 1309fee48908 on branch "default" -------------------------------------------- test_imp leaked [0, -1, 1] references, sum=0 test_site leaked [-2, 2, 0] references, sum=0 test_site leaked [-2, 2, 0] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogUybp74', '-x'] From victor.stinner at gmail.com Sat Oct 12 03:16:36 2013 From: victor.stinner at gmail.com (Victor Stinner) Date: Sat, 12 Oct 2013 03:16:36 +0200 Subject: [Python-checkins] cpython: Issue #19209: fix structseq test In-Reply-To: References: <3cxQgG300bz7Lk2@mail.python.org> Message-ID: 2013/10/12 Nick Coghlan : >> summary: >> Issue #19209: fix structseq test >> >> diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py >> --- a/Lib/test/test_structseq.py >> +++ b/Lib/test/test_structseq.py >> @@ -38,7 +38,7 @@ >> # os.stat() gives a complicated struct sequence. >> st = os.stat(__file__) >> rep = repr(st) >> - self.assertTrue(rep.startswith(os.name + ".stat_result")) >> + self.assertTrue(rep.startswith("os.stat_result")) > > If stat results can be pickled, this suggests a possible issue with > unpickling pickles generated with older versions of Python. This change should not break the backward compatibility. The os module was using a copyreg "hack" (is it the good name?) to replace "posix" with "os" when a os.stat or os.statvfs object was serialized with pickle. See the issue for information. Victor From python-checkins at python.org Tue Oct 15 11:06:56 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 15 Oct 2013 11:06:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2317221=3A_Merge_3?= =?utf-8?q?=2E4=2E0_Alpha_1_entries_before_and_after_3=2E3=2E1_release?= Message-ID: <3czW3h4vqDz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/484ce82b7873 changeset: 86378:484ce82b7873 parent: 86376:1309fee48908 user: Serhiy Storchaka date: Tue Oct 15 12:05:57 2013 +0300 summary: Issue #17221: Merge 3.4.0 Alpha 1 entries before and after 3.3.1 release candidate 1. files: Misc/NEWS | 1282 ++++++++++++++++++++-------------------- 1 files changed, 631 insertions(+), 651 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -695,657 +695,6 @@ - Issue #17323: The "[X refs, Y blocks]" printed by debug builds has been disabled by default. It can be re-enabled with the `-X showrefcount` option. -Library -------- - -- Issue #13461: Fix a crash in the TextIOWrapper.tell method on 64-bit - platforms. Patch by Yogesh Chaudhari. - -- Issue #18681: Fix a NameError in importlib.reload() (noticed by Weizhao Li). - -- Issue #14323: Expanded the number of digits in the coefficients for the - RGB -- YIQ conversions so that they match the FCC NTSC versions. - -- Issue #17998: Fix an internal error in regular expression engine. - -- Issue #17557: Fix os.getgroups() to work with the modified behavior of - getgroups(2) on OS X 10.8. Original patch by Mateusz Lenik. - -- Issue #18608: Avoid keeping a strong reference to the locale module - inside the _io module. - -- Issue #18619: Fix atexit leaking callbacks registered from sub-interpreters, - and make it GC-aware. - -- Issue #15699: The readline module now uses PEP 3121-style module - initialization, so as to reclaim allocated resources (Python callbacks) - at shutdown. Original patch by Robin Schreiber. - -- Issue #17616: wave.open now supports the context manager protocol. - -- Issue #18599: Fix name attribute of _sha1.sha1() object. It now returns - 'SHA1' instead of 'SHA'. - -- Issue #13266: Added inspect.unwrap to easily unravel __wrapped__ chains - (initial patch by Daniel Urban and Aaron Iles) - -- Issue #18561: Skip name in ctypes' _build_callargs() if name is NULL. - -- Issue #18559: Fix NULL pointer dereference error in _pickle module - -- Issue #18556: Check the return type of PyUnicode_AsWideChar() in ctype's - U_set(). - -- Issue #17818: aifc.getparams now returns a namedtuple. - -- Issue #18549: Eliminate dead code in socket_ntohl() - -- Issue #18530: Remove additional stat call from posixpath.ismount. - Patch by Alex Gaynor. - -- Issue #18514: Fix unreachable Py_DECREF() call in PyCData_FromBaseObj() - -- Issue #9177: Calling read() or write() now raises ValueError, not - AttributeError, on a closed SSL socket. Patch by Senko Rasic. - -- Issue #18513: Fix behaviour of cmath.rect w.r.t. signed zeros on OS X 10.8 + - gcc. - -- Issue #18479: Changed venv Activate.ps1 to make deactivate a function, and - removed Deactivate.ps1. - -- Issue #18480: Add missing call to PyType_Ready to the _elementtree extension. - -- Issue #17778: Fix test discovery for test_multiprocessing. (Patch by - Zachary Ware.) - -- Issue #18393: The private module _gestalt and private functions - platform._mac_ver_gestalt, platform._mac_ver_lookup and - platform._bcd2str have been removed. This does not affect the public - interface of the platform module. - -- Issue #17482: functools.update_wrapper (and functools.wraps) now set the - __wrapped__ attribute correctly even if the underlying function has a - __wrapped__ attribute set. - -- Issue #18431: The new email header parser now decodes RFC2047 encoded words - in structured headers. - -- Issue #18432: The sched module's queue method was incorrectly returning - an iterator instead of a list. - -- Issue #18044: The new email header parser was mis-parsing encoded words where - an encoded character immediately followed the '?' that follows the CTE - character, resulting in a decoding failure. They are now decoded correctly. - -- Issue #18101: Tcl.split() now process strings nested in a tuple as it - do with byte strings. - -- Issue #18116: getpass was always getting an error when testing /dev/tty, - and thus was always falling back to stdin. It also leaked an open file - when it did so. Both of these issues are now fixed. - -- Issue #17198: Fix a NameError in the dbm module. Patch by Valentina - Mukhamedzhanova. - -- Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form. - -- Issue #18020: improve html.escape speed by an order of magnitude. - Patch by Matt Bryant. - -- Issue #18347: ElementTree's html serializer now preserves the case of - closing tags. - -- Issue #17261: Ensure multiprocessing's proxies use proper address. - -- Issue #18343: faulthandler.register() now keeps the previous signal handler - when the function is called twice, so faulthandler.unregister() restores - correctly the original signal handler. - -- Issue #17097: Make multiprocessing ignore EINTR. - -- Issue #18339: Negative ints keys in unpickler.memo dict no longer cause a - segfault inside the _pickle C extension. - -- Issue 18240: The HMAC module is no longer restricted to bytes and accepts - any bytes-like object, e.g. memoryview. Original patch by Jonas Borgstr?m. - -- Issue #18224: Removed pydoc script from created venv, as it causes problems - on Windows and adds no value over and above python -m pydoc ... - -- Issue #18155: The csv module now correctly handles csv files that use - a delimter character that has a special meaning in regexes, instead of - throwing an exception. - -- Issue #14360: encode_quopri can now be successfully used as an encoder - when constructing a MIMEApplication object. - -- Issue #11390: Add -o and -f command line options to the doctest CLI to - specify doctest options (and convert it to using argparse). - -- Issue #18135: ssl.SSLSocket.write() now raises an OverflowError if the input - string in longer than 2 gigabytes, and ssl.SSLContext.load_cert_chain() - raises a ValueError if the password is longer than 2 gigabytes. The ssl - module does not support partial write. - -- Issue #11016: Add C implementation of the stat module as _stat. - -- Issue #18248: Fix libffi build on AIX. - -- Issue #18259: Declare sethostname in socketmodule.c for AIX - -- Issue #18147: Add diagnostic functions to ssl.SSLContext(). get_ca_list() - lists all loaded CA certificates and cert_store_stats() returns amount of - loaded X.509 certs, X.509 CA certs and CRLs. - -- Issue #18167: cgi.FieldStorage no longer fails to handle multipart/form-data - when \r\n appears at end of 65535 bytes without other newlines. - -- Issue #18076: Introduce importlib.util.decode_source(). -- Issue #18357: add tests for dictview set difference. - Patch by Fraser Tweedale. - - -- importlib.abc.SourceLoader.get_source() no longer changes SyntaxError or - UnicodeDecodeError into ImportError. - -- Issue #18058, 18057: Make the namespace package loader meet the - importlib.abc.InspectLoader ABC, allowing for namespace packages to work with - runpy. - -- Issue #17177: The imp module is pending deprecation. - -- subprocess: Prevent a possible double close of parent pipe fds when the - subprocess exec runs into an error. Prevent a regular multi-close of the - /dev/null fd when any of stdin, stdout and stderr was set to DEVNULL. - -- Issue #18194: Introduce importlib.util.cache_from_source() and - source_from_cache() while documenting the equivalent functions in imp as - deprecated. - -- Issue #17907: Document imp.new_module() as deprecated in favour of - types.ModuleType. - -- Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document as deprecated - imp.get_magic(). - -- Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache. - Patch by Mark Levitt - -- Issue #18193: Add importlib.reload(). - -- Issue #18157: Stop using imp.load_module() in pydoc. - -- Issue #16102: Make uuid._netbios_getnode() work again on Python 3. - -- Issue #17134: Add ssl.enum_cert_store() as interface to Windows' cert store. - -- Issue #18143: Implement ssl.get_default_verify_paths() in order to debug - the default locations for cafile and capath. - -- Issue #17314: Move multiprocessing.forking over to importlib. - -- Issue #11959: SMTPServer and SMTPChannel now take an optional map, use of - which avoids affecting global state. - -- Issue #18109: os.uname() now decodes fields from the locale encoding, and - socket.gethostname() now decodes the hostname from the locale encoding, - instead of using the UTF-8 encoding in strict mode. - -- Issue #18089: Implement importlib.abc.InspectLoader.load_module. - -- Issue #18088: Introduce importlib.abc.Loader.init_module_attrs for setting - module attributes. Leads to the pending deprecation of - importlib.util.module_for_loader. - -- Issue #17403: urllib.parse.robotparser normalizes the urls before adding to - ruleline. This helps in handling certain types invalid urls in a conservative - manner. Patch contributed by Mher Movsisyan. - -- Issue #18070: Have importlib.util.module_for_loader() set attributes - unconditionally in order to properly support reloading. - -- Added importlib.util.module_to_load to return a context manager to provide the - proper module object to load. - -- Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw - stream's read() returns more bytes than requested. - -- Issue #18011: base64.b32decode() now raises a binascii.Error if there are - non-alphabet characters present in the input string to conform a docstring. - Updated the module documentation. - -- Issue #18072: Implement importlib.abc.InspectLoader.get_code() and - importlib.abc.ExecutionLoader.get_code(). - -- Issue #8240: Set the SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER flag on SSL - sockets. - -- Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X - with port None or "0" and flags AI_NUMERICSERV. - -- Issue #16986: ElementTree now correctly parses a string input not only when - an internal XML encoding is UTF-8 or US-ASCII. - -- Issue #17996: socket module now exposes AF_LINK constant on BSD and OSX. - -- Issue #17900: Allowed pickling of recursive OrderedDicts. Decreased pickled - size and pickling time. - -- Issue #17914: Add os.cpu_count(). Patch by Yogesh Chaudhari, based on an - initial patch by Trent Nelson. - -- Issue #17812: Fixed quadratic complexity of base64.b32encode(). - Optimize base64.b32encode() and base64.b32decode() (speed up to 3x). - -- Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of - service using certificates with many wildcards (CVE-2013-2099). - -- Issue #15758: Fix FileIO.readall() so it no longer has O(n**2) complexity. - -- Issue #14596: The struct.Struct() objects now use more compact implementation. - -- Issue #17981: Closed socket on error in SysLogHandler. - -- Issue #17964: Fix os.sysconf(): the return type of the C sysconf() function - is long, not int. - -- Fix typos in the multiprocessing module. - -- Issue #17754: Make ctypes.util.find_library() independent of the locale. - -- Issue #17968: Fix memory leak in os.listxattr(). - -- Issue #17606: Fixed support of encoded byte strings in the XMLGenerator - characters() and ignorableWhitespace() methods. Original patch by Sebastian - Ortiz Vasquez. - -- Issue #17732: Ignore distutils.cfg options pertaining to install paths if a - virtual environment is active. - -- Issue #17915: Fix interoperability of xml.sax with file objects returned by - codecs.open(). - -- Issue #16601: Restarting iteration over tarfile no more continues from where - it left off. Patch by Michael Birtwell. - -- Issue #17289: The readline module now plays nicer with external modules - or applications changing the rl_completer_word_break_characters global - variable. Initial patch by Bradley Froehle. - -- Issue #12181: select module: Fix struct kevent definition on OpenBSD 64-bit - platforms. Patch by Federico Schwindt. - -- Issue #11816: multiple improvements to the dis module: get_instructions - generator, ability to redirect output to a file, Bytecode and Instruction - abstractions. Patch by Nick Coghlan, Ryan Kelly and Thomas Kluyver. - -- Issue #13831: Embed stringification of remote traceback in local - traceback raised when pool task raises an exception. - -- Issue #15528: Add weakref.finalize to support finalization using - weakref callbacks. - -- Issue #14173: Avoid crashing when reading a signal handler during - interpreter shutdown. - -- Issue #15902: Fix imp.load_module() accepting None as a file when loading an - extension module. - -- Issue #13721: SSLSocket.getpeercert() and SSLSocket.do_handshake() now - raise an OSError with ENOTCONN, instead of an AttributeError, when the - SSLSocket is not connected. - -- Issue #14679: add an __all__ (that contains only HTMLParser) to html.parser. - -- Issue #17802: Fix an UnboundLocalError in html.parser. Initial tests by - Thomas Barlow. - -- Issue #17358: Modules loaded by imp.load_source() and load_compiled() (and by - extention load_module()) now have a better chance of working when reloaded. - -- Issue #17804: New function ``struct.iter_unpack`` allows for streaming - struct unpacking. - -- Issue #17830: When keyword.py is used to update a keyword file, it now - preserves the line endings of the original file. - -- Issue #17272: Making the urllib.request's Request.full_url a descriptor. - Fixes bugs with assignment to full_url. Patch by Demian Brecht. - -- Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures - -- Issue #11714: Use 'with' statements to assure a Semaphore releases a - condition variable. Original patch by Thomas Rachel. - -- Issue #16624: `subprocess.check_output` now accepts an `input` argument, - allowing the subprocess's stdin to be provided as a (byte) string. - Patch by Zack Weinberg. - -- Issue #17795: Reverted backwards-incompatible change in SysLogHandler with - Unix domain sockets. - -- Issue #16694: Add a pure Python implementation of the operator module. - Patch by Zachary Ware. - -- Issue #11182: remove the unused and undocumented pydoc.Scanner class. - Patch by Martin Morrison. - -- Issue #17741: Add ElementTree.IncrementalParser, an event-driven parser - for non-blocking applications. - -- Issue #17555: Fix ForkAwareThreadLock so that size of after fork - registry does not grow exponentially with generation of process. - -- Issue #17707: multiprocessing.Queue's get() method does not block for short - timeouts. - -- Isuse #17720: Fix the Python implementation of pickle.Unpickler to correctly - process the APPENDS opcode when it is used on non-list objects. - -- Issue #17012: shutil.which() no longer fallbacks to the PATH environment - variable if empty path argument is specified. Patch by Serhiy Storchaka. - -- Issue #17710: Fix pickle raising a SystemError on bogus input. - -- Issue #17341: Include the invalid name in the error messages from re about - invalid group names. - -- Issue #17702: os.environ now raises KeyError with the original environment - variable name (str on UNIX), instead of using the encoded name (bytes on - UNIX). - -- Issue #16163: Make the importlib based version of pkgutil.iter_importers - work for submodules. Initial patch by Berker Peksag. - -- Issue #16804: Fix a bug in the 'site' module that caused running - 'python -S -m site' to incorrectly throw an exception. - -- Issue #15480: Remove the deprecated and unused TYPE_INT64 code from marshal. - Initial patch by Daniel Riti. - -- Issue #2118: SMTPException is now a subclass of IOError. - -- Issue #17016: Get rid of possible pointer wraparounds and integer overflows - in the re module. Patch by Nickolai Zeldovich. - -- Issue #16658: add missing return to HTTPConnection.send() - Patch by Jeff Knupp. - -- Issue #9556: Allowed specifying a time-of-day for a TimedRotatingFileHandler - to rotate. - -- Issue #14971: unittest test discovery no longer gets confused when a function - has a different __name__ than its name in the TestCase class dictionary. - -- Issue #17487: The wave getparams method now returns a namedtuple rather than - a plain tuple. - -- Issue #17675: socket repr() provides local and remote addresses (if any). - Patch by Giampaolo Rodola' - -- Issue #17093: Make the ABCs in importlib.abc provide default values or raise - reasonable exceptions for their methods to make them more amenable to super() - calls. - -- Issue #17566: Make importlib.abc.Loader.module_repr() optional instead of an - abstractmethod and raising NotImplementedError so as to be ignored by default. - -- Issue #17678: Remove the use of deprecated method in http/cookiejar.py. - Changing the usage of get_origin_req_host() to origin_req_host. - -- Issue #17666: Fix reading gzip files with an extra field. - -- Issue #16475: Support object instancing, recursion and interned strings - in marshal - -- Issue #17502: Process DEFAULT values in mock side_effect that returns iterator. - -- Issue #16795: On the ast.arguments object, unify vararg with varargannotation - and kwarg and kwargannotation. Change the column offset of ast.Attribute to be - at the attribute name. - -- Issue #17434: Properly raise a SyntaxError when a string occurs between future - imports. - -- Issue #17117: Import and @importlib.util.set_loader now set __loader__ when - it has a value of None or the attribute doesn't exist. - -- Issue #17032: The "global" in the "NameError: global name 'x' is not defined" - error message has been removed. Patch by Ram Rachum. - -- Issue #18080: When building a C extension module on OS X, if the compiler - is overriden with the CC environment variable, use the new compiler as - the default for linking if LDSHARED is not also overriden. This restores - Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0. - -- Issue #18113: Fixed a refcount leak in the curses.panel module's - set_userptr() method. Reported by Atsuo Ishimoto. - -- Implement PEP 443 "Single-dispatch generic functions". - -- Implement PEP 435 "Adding an Enum type to the Python standard library". - -Tests ------ - -- Issue #1666318: Add a test that shutil.copytree() retains directory - permissions. Patch by Catherine Devlin. - -- Issue #18273: move the tests in Lib/test/json_tests to Lib/test/test_json - and make them discoverable by unittest. Patch by Zachary Ware. - -- Fix a fcntl test case on KFreeBSD, Debian #708653 (Petr Salinger). - -- Issue #18396: Fix spurious test failure in test_signal on Windows when - faulthandler is enabled (Patch by Jeremy Kloth) - -- Issue #17046: Fix broken test_executable_without_cwd in test_subprocess. - -- Issue #15415: Add new temp_dir() and change_cwd() context managers to - test.support, and refactor temp_cwd() to use them. Patch by Chris Jerdonek. - -- Issue #15494: test.support is now a package rather than a module (Initial - patch by Indra Talip) - -- Issue #17944: test_zipfile now discoverable and uses subclassing to - generate tests for different compression types. Fixed a bug with skipping - some tests due to use of exhausted iterators. - -- Issue #18266: test_largefile now works with unittest test discovery and - supports running only selected tests. Patch by Zachary Ware. - -- Issue #17767: test_locale now works with unittest test discovery. - Original patch by Zachary Ware. - -- Issue #18375: Assume --randomize when --randseed is used for running the - testsuite. - -- Issue #11185: Fix test_wait4 under AIX. Patch by S?bastien Sabl?. - -- Issue #18207: Fix test_ssl for some versions of OpenSSL that ignore seconds - in ASN1_TIME fields. - -- Issue #18094: test_uuid no more reports skipped tests as passed. - -- Issue #17992: Add timeouts to asyncore and asynchat tests so that they won't - accidentally hang. - -- Issue #17833: Fix test_gdb failures seen on machines where debug symbols - for glibc are available (seen on PPC64 Linux). - -- Issue #7855: Add tests for ctypes/winreg for issues found in IronPython. - Initial patch by Dino Viehland. - -- Issue #11078: test___all__ now checks for duplicates in __all__. - Initial patch by R. David Murray. - -- Issue #17712: Fix test_gdb failures on Ubuntu 13.04. - -- Issue #17835: Fix test_io when the default OS pipe buffer size is larger - than one million bytes. - -- Issue #17065: Use process-unique key for winreg tests to avoid failures if - test is run multiple times in parallel (eg: on a buildbot host). - -- Issue #12820: add tests for the xml.dom.minicompat module. - Patch by John Chandler and Phil Connell. - -- Issue #17691: test_univnewlines now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17790: test_set now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17789: test_random now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17779: test_osx_env now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17766: test_iterlen now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17690: test_time now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #17692: test_sqlite now works with unittest test discovery. - Patch by Zachary Ware. - -- Issue #11995: test_pydoc doesn't import all sys.path modules anymore. - -Documentation -------------- - -- Issue #17701: Improving strftime documentation. - -- Issue #18440: Clarify that `hash()` can truncate the value returned from an - object's custom `__hash__()` method. - -- Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs. - -- Issue #14097: improve the "introduction" page of the tutorial. - -- Issue #17977: The documentation for the cadefault argument's default value - in urllib.request.urlopen() is fixed to match the code. - -- Issue #15940: Specify effect of locale on time functions. - -- Issue #6696: add documentation for the Profile objects, and improve - profile/cProfile docs. Patch by Tom Pinckney. - -C-API ------ - -- Issue #18351: Fix various issues in a function in importlib provided to help - PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()). - -- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and - PyObject_CallMethod() now changed to `const char*`. Based on patches by - J?rg M?ller and Lars Buitinck. - -- Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now - expand their arguments once instead of multiple times. Patch written by Illia - Polosukhin. - -- Issue #17522: Add the PyGILState_Check() API. - -- Issue #17327: Add PyDict_SetDefault. - -IDLE ----- - -- Issue #18429: Format / Format Paragraph, now works when comment blocks - are selected. As with text blocks, this works best when the selection - only includes complete lines. - -- Issue #18226: Add docstrings and unittests for FormatParagraph.py. - Original patches by Todd Rovito and Phil Webster. - -- Issue #18279: Format - Strip trailing whitespace no longer marks a file as - changed when it has not been changed. This fix followed the addition of a - test file originally written by Phil Webster (the issue's main goal). - -- Issue #7136: In the Idle File menu, "New Window" is renamed "New File". - Patch by Tal Einat, Roget Serwy, and Todd Rovito. - -- Remove dead imports of imp. - -- Issue #18196: Avoid displaying spurious SystemExit tracebacks. - -- Issue #5492: Avoid traceback when exiting IDLE caused by a race condition. - -- Issue #17511: Keep IDLE find dialog open after clicking "Find Next". - Original patch by Sarah K. - -- Issue #18055: Move IDLE off of imp and on to importlib. - -- Issue #15392: Create a unittest framework for IDLE. - Initial patch by Rajagopalasarma Jayakrishnan. - See Lib/idlelib/idle_test/README.txt for how to run Idle tests. - -- Issue #14146: Highlight source line while debugging on Windows. - -- Issue #17838: Allow sys.stdin to be reassigned. - -- Issue #13495: Avoid loading the color delegator twice in IDLE. - -- Issue #17798: Allow IDLE to edit new files when specified on command line. - -- Issue #14735: Update IDLE docs to omit "Control-z on Windows". - -- Issue #17532: Always include Options menu for IDLE on OS X. - Patch by Guilherme Sim?es. - -Windows -------- - -- Issue #18569: The installer now adds .py to the PATHEXT variable when extensions - are registered. Patch by Paul Moore. - -Build ------ - -- Issue #16067: Add description into MSI file to replace installer's - temporary name. - -- Issue #18257: Fix readlink usage in python-config. Install the python - version again on Darwin. - -- Issue #18481: Add C coverage reporting with gcov and lcov. A new make target - "coverage-report" creates an instrumented Python build, runs unit tests - and creates a HTML. The report can be updated with "make coverage-lcov". - -- Issue #17845: Clarified the message printed when some module are not built. - -- Issue #18256: Compilation fix for recent AIX releases. Patch by - David Edelsohn. - -- Issue #17547: In configure, explicitly pass -Wformat for the benefit for GCC - 4.8. - -- Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1 - on Windows. - -Tools/Demos ------------ - -- Issue #18817: Fix a resource warning in Lib/aifc.py demo. Patch by - Vajrasky Kok. - -- Issue #18439: Make patchcheck work on Windows for ACKS, NEWS. - -- Issue #18448: Fix a typo in Tools/demo/eiffel.py. - -- Issue #18457: Fixed saving of formulas and complex numbers in - Tools/demo/ss1.py. - -- Issue #18449: Make Tools/demo/ss1.py work again on Python 3. Patch by - F?vry Thibault. - -- Issue #12990: The "Python Launcher" on OSX could not launch python scripts - that have paths that include wide characters. - - Issue #17328: Fix possible refleak in dict.setdefault. - Issue #17275: Corrected class name in init error messages of the C version of @@ -1580,6 +929,434 @@ Library ------- +- Issue #13461: Fix a crash in the TextIOWrapper.tell method on 64-bit + platforms. Patch by Yogesh Chaudhari. + +- Issue #18681: Fix a NameError in importlib.reload() (noticed by Weizhao Li). + +- Issue #14323: Expanded the number of digits in the coefficients for the + RGB -- YIQ conversions so that they match the FCC NTSC versions. + +- Issue #17998: Fix an internal error in regular expression engine. + +- Issue #17557: Fix os.getgroups() to work with the modified behavior of + getgroups(2) on OS X 10.8. Original patch by Mateusz Lenik. + +- Issue #18608: Avoid keeping a strong reference to the locale module + inside the _io module. + +- Issue #18619: Fix atexit leaking callbacks registered from sub-interpreters, + and make it GC-aware. + +- Issue #15699: The readline module now uses PEP 3121-style module + initialization, so as to reclaim allocated resources (Python callbacks) + at shutdown. Original patch by Robin Schreiber. + +- Issue #17616: wave.open now supports the context manager protocol. + +- Issue #18599: Fix name attribute of _sha1.sha1() object. It now returns + 'SHA1' instead of 'SHA'. + +- Issue #13266: Added inspect.unwrap to easily unravel __wrapped__ chains + (initial patch by Daniel Urban and Aaron Iles) + +- Issue #18561: Skip name in ctypes' _build_callargs() if name is NULL. + +- Issue #18559: Fix NULL pointer dereference error in _pickle module + +- Issue #18556: Check the return type of PyUnicode_AsWideChar() in ctype's + U_set(). + +- Issue #17818: aifc.getparams now returns a namedtuple. + +- Issue #18549: Eliminate dead code in socket_ntohl() + +- Issue #18530: Remove additional stat call from posixpath.ismount. + Patch by Alex Gaynor. + +- Issue #18514: Fix unreachable Py_DECREF() call in PyCData_FromBaseObj() + +- Issue #9177: Calling read() or write() now raises ValueError, not + AttributeError, on a closed SSL socket. Patch by Senko Rasic. + +- Issue #18513: Fix behaviour of cmath.rect w.r.t. signed zeros on OS X 10.8 + + gcc. + +- Issue #18479: Changed venv Activate.ps1 to make deactivate a function, and + removed Deactivate.ps1. + +- Issue #18480: Add missing call to PyType_Ready to the _elementtree extension. + +- Issue #17778: Fix test discovery for test_multiprocessing. (Patch by + Zachary Ware.) + +- Issue #18393: The private module _gestalt and private functions + platform._mac_ver_gestalt, platform._mac_ver_lookup and + platform._bcd2str have been removed. This does not affect the public + interface of the platform module. + +- Issue #17482: functools.update_wrapper (and functools.wraps) now set the + __wrapped__ attribute correctly even if the underlying function has a + __wrapped__ attribute set. + +- Issue #18431: The new email header parser now decodes RFC2047 encoded words + in structured headers. + +- Issue #18432: The sched module's queue method was incorrectly returning + an iterator instead of a list. + +- Issue #18044: The new email header parser was mis-parsing encoded words where + an encoded character immediately followed the '?' that follows the CTE + character, resulting in a decoding failure. They are now decoded correctly. + +- Issue #18101: Tcl.split() now process strings nested in a tuple as it + do with byte strings. + +- Issue #18116: getpass was always getting an error when testing /dev/tty, + and thus was always falling back to stdin. It also leaked an open file + when it did so. Both of these issues are now fixed. + +- Issue #17198: Fix a NameError in the dbm module. Patch by Valentina + Mukhamedzhanova. + +- Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form. + +- Issue #18020: improve html.escape speed by an order of magnitude. + Patch by Matt Bryant. + +- Issue #18347: ElementTree's html serializer now preserves the case of + closing tags. + +- Issue #17261: Ensure multiprocessing's proxies use proper address. + +- Issue #18343: faulthandler.register() now keeps the previous signal handler + when the function is called twice, so faulthandler.unregister() restores + correctly the original signal handler. + +- Issue #17097: Make multiprocessing ignore EINTR. + +- Issue #18339: Negative ints keys in unpickler.memo dict no longer cause a + segfault inside the _pickle C extension. + +- Issue 18240: The HMAC module is no longer restricted to bytes and accepts + any bytes-like object, e.g. memoryview. Original patch by Jonas Borgstr?m. + +- Issue #18224: Removed pydoc script from created venv, as it causes problems + on Windows and adds no value over and above python -m pydoc ... + +- Issue #18155: The csv module now correctly handles csv files that use + a delimter character that has a special meaning in regexes, instead of + throwing an exception. + +- Issue #14360: encode_quopri can now be successfully used as an encoder + when constructing a MIMEApplication object. + +- Issue #11390: Add -o and -f command line options to the doctest CLI to + specify doctest options (and convert it to using argparse). + +- Issue #18135: ssl.SSLSocket.write() now raises an OverflowError if the input + string in longer than 2 gigabytes, and ssl.SSLContext.load_cert_chain() + raises a ValueError if the password is longer than 2 gigabytes. The ssl + module does not support partial write. + +- Issue #11016: Add C implementation of the stat module as _stat. + +- Issue #18248: Fix libffi build on AIX. + +- Issue #18259: Declare sethostname in socketmodule.c for AIX + +- Issue #18147: Add diagnostic functions to ssl.SSLContext(). get_ca_list() + lists all loaded CA certificates and cert_store_stats() returns amount of + loaded X.509 certs, X.509 CA certs and CRLs. + +- Issue #18167: cgi.FieldStorage no longer fails to handle multipart/form-data + when \r\n appears at end of 65535 bytes without other newlines. + +- Issue #18076: Introduce importlib.util.decode_source(). +- Issue #18357: add tests for dictview set difference. + Patch by Fraser Tweedale. + + +- importlib.abc.SourceLoader.get_source() no longer changes SyntaxError or + UnicodeDecodeError into ImportError. + +- Issue #18058, 18057: Make the namespace package loader meet the + importlib.abc.InspectLoader ABC, allowing for namespace packages to work with + runpy. + +- Issue #17177: The imp module is pending deprecation. + +- subprocess: Prevent a possible double close of parent pipe fds when the + subprocess exec runs into an error. Prevent a regular multi-close of the + /dev/null fd when any of stdin, stdout and stderr was set to DEVNULL. + +- Issue #18194: Introduce importlib.util.cache_from_source() and + source_from_cache() while documenting the equivalent functions in imp as + deprecated. + +- Issue #17907: Document imp.new_module() as deprecated in favour of + types.ModuleType. + +- Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document as deprecated + imp.get_magic(). + +- Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache. + Patch by Mark Levitt + +- Issue #18193: Add importlib.reload(). + +- Issue #18157: Stop using imp.load_module() in pydoc. + +- Issue #16102: Make uuid._netbios_getnode() work again on Python 3. + +- Issue #17134: Add ssl.enum_cert_store() as interface to Windows' cert store. + +- Issue #18143: Implement ssl.get_default_verify_paths() in order to debug + the default locations for cafile and capath. + +- Issue #17314: Move multiprocessing.forking over to importlib. + +- Issue #11959: SMTPServer and SMTPChannel now take an optional map, use of + which avoids affecting global state. + +- Issue #18109: os.uname() now decodes fields from the locale encoding, and + socket.gethostname() now decodes the hostname from the locale encoding, + instead of using the UTF-8 encoding in strict mode. + +- Issue #18089: Implement importlib.abc.InspectLoader.load_module. + +- Issue #18088: Introduce importlib.abc.Loader.init_module_attrs for setting + module attributes. Leads to the pending deprecation of + importlib.util.module_for_loader. + +- Issue #17403: urllib.parse.robotparser normalizes the urls before adding to + ruleline. This helps in handling certain types invalid urls in a conservative + manner. Patch contributed by Mher Movsisyan. + +- Issue #18070: Have importlib.util.module_for_loader() set attributes + unconditionally in order to properly support reloading. + +- Added importlib.util.module_to_load to return a context manager to provide the + proper module object to load. + +- Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw + stream's read() returns more bytes than requested. + +- Issue #18011: base64.b32decode() now raises a binascii.Error if there are + non-alphabet characters present in the input string to conform a docstring. + Updated the module documentation. + +- Issue #18072: Implement importlib.abc.InspectLoader.get_code() and + importlib.abc.ExecutionLoader.get_code(). + +- Issue #8240: Set the SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER flag on SSL + sockets. + +- Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X + with port None or "0" and flags AI_NUMERICSERV. + +- Issue #16986: ElementTree now correctly parses a string input not only when + an internal XML encoding is UTF-8 or US-ASCII. + +- Issue #17996: socket module now exposes AF_LINK constant on BSD and OSX. + +- Issue #17900: Allowed pickling of recursive OrderedDicts. Decreased pickled + size and pickling time. + +- Issue #17914: Add os.cpu_count(). Patch by Yogesh Chaudhari, based on an + initial patch by Trent Nelson. + +- Issue #17812: Fixed quadratic complexity of base64.b32encode(). + Optimize base64.b32encode() and base64.b32decode() (speed up to 3x). + +- Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of + service using certificates with many wildcards (CVE-2013-2099). + +- Issue #15758: Fix FileIO.readall() so it no longer has O(n**2) complexity. + +- Issue #14596: The struct.Struct() objects now use more compact implementation. + +- Issue #17981: Closed socket on error in SysLogHandler. + +- Issue #17964: Fix os.sysconf(): the return type of the C sysconf() function + is long, not int. + +- Fix typos in the multiprocessing module. + +- Issue #17754: Make ctypes.util.find_library() independent of the locale. + +- Issue #17968: Fix memory leak in os.listxattr(). + +- Issue #17606: Fixed support of encoded byte strings in the XMLGenerator + characters() and ignorableWhitespace() methods. Original patch by Sebastian + Ortiz Vasquez. + +- Issue #17732: Ignore distutils.cfg options pertaining to install paths if a + virtual environment is active. + +- Issue #17915: Fix interoperability of xml.sax with file objects returned by + codecs.open(). + +- Issue #16601: Restarting iteration over tarfile no more continues from where + it left off. Patch by Michael Birtwell. + +- Issue #17289: The readline module now plays nicer with external modules + or applications changing the rl_completer_word_break_characters global + variable. Initial patch by Bradley Froehle. + +- Issue #12181: select module: Fix struct kevent definition on OpenBSD 64-bit + platforms. Patch by Federico Schwindt. + +- Issue #11816: multiple improvements to the dis module: get_instructions + generator, ability to redirect output to a file, Bytecode and Instruction + abstractions. Patch by Nick Coghlan, Ryan Kelly and Thomas Kluyver. + +- Issue #13831: Embed stringification of remote traceback in local + traceback raised when pool task raises an exception. + +- Issue #15528: Add weakref.finalize to support finalization using + weakref callbacks. + +- Issue #14173: Avoid crashing when reading a signal handler during + interpreter shutdown. + +- Issue #15902: Fix imp.load_module() accepting None as a file when loading an + extension module. + +- Issue #13721: SSLSocket.getpeercert() and SSLSocket.do_handshake() now + raise an OSError with ENOTCONN, instead of an AttributeError, when the + SSLSocket is not connected. + +- Issue #14679: add an __all__ (that contains only HTMLParser) to html.parser. + +- Issue #17802: Fix an UnboundLocalError in html.parser. Initial tests by + Thomas Barlow. + +- Issue #17358: Modules loaded by imp.load_source() and load_compiled() (and by + extention load_module()) now have a better chance of working when reloaded. + +- Issue #17804: New function ``struct.iter_unpack`` allows for streaming + struct unpacking. + +- Issue #17830: When keyword.py is used to update a keyword file, it now + preserves the line endings of the original file. + +- Issue #17272: Making the urllib.request's Request.full_url a descriptor. + Fixes bugs with assignment to full_url. Patch by Demian Brecht. + +- Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures + +- Issue #11714: Use 'with' statements to assure a Semaphore releases a + condition variable. Original patch by Thomas Rachel. + +- Issue #16624: `subprocess.check_output` now accepts an `input` argument, + allowing the subprocess's stdin to be provided as a (byte) string. + Patch by Zack Weinberg. + +- Issue #17795: Reverted backwards-incompatible change in SysLogHandler with + Unix domain sockets. + +- Issue #16694: Add a pure Python implementation of the operator module. + Patch by Zachary Ware. + +- Issue #11182: remove the unused and undocumented pydoc.Scanner class. + Patch by Martin Morrison. + +- Issue #17741: Add ElementTree.IncrementalParser, an event-driven parser + for non-blocking applications. + +- Issue #17555: Fix ForkAwareThreadLock so that size of after fork + registry does not grow exponentially with generation of process. + +- Issue #17707: multiprocessing.Queue's get() method does not block for short + timeouts. + +- Isuse #17720: Fix the Python implementation of pickle.Unpickler to correctly + process the APPENDS opcode when it is used on non-list objects. + +- Issue #17012: shutil.which() no longer fallbacks to the PATH environment + variable if empty path argument is specified. Patch by Serhiy Storchaka. + +- Issue #17710: Fix pickle raising a SystemError on bogus input. + +- Issue #17341: Include the invalid name in the error messages from re about + invalid group names. + +- Issue #17702: os.environ now raises KeyError with the original environment + variable name (str on UNIX), instead of using the encoded name (bytes on + UNIX). + +- Issue #16163: Make the importlib based version of pkgutil.iter_importers + work for submodules. Initial patch by Berker Peksag. + +- Issue #16804: Fix a bug in the 'site' module that caused running + 'python -S -m site' to incorrectly throw an exception. + +- Issue #15480: Remove the deprecated and unused TYPE_INT64 code from marshal. + Initial patch by Daniel Riti. + +- Issue #2118: SMTPException is now a subclass of IOError. + +- Issue #17016: Get rid of possible pointer wraparounds and integer overflows + in the re module. Patch by Nickolai Zeldovich. + +- Issue #16658: add missing return to HTTPConnection.send() + Patch by Jeff Knupp. + +- Issue #9556: Allowed specifying a time-of-day for a TimedRotatingFileHandler + to rotate. + +- Issue #14971: unittest test discovery no longer gets confused when a function + has a different __name__ than its name in the TestCase class dictionary. + +- Issue #17487: The wave getparams method now returns a namedtuple rather than + a plain tuple. + +- Issue #17675: socket repr() provides local and remote addresses (if any). + Patch by Giampaolo Rodola' + +- Issue #17093: Make the ABCs in importlib.abc provide default values or raise + reasonable exceptions for their methods to make them more amenable to super() + calls. + +- Issue #17566: Make importlib.abc.Loader.module_repr() optional instead of an + abstractmethod and raising NotImplementedError so as to be ignored by default. + +- Issue #17678: Remove the use of deprecated method in http/cookiejar.py. + Changing the usage of get_origin_req_host() to origin_req_host. + +- Issue #17666: Fix reading gzip files with an extra field. + +- Issue #16475: Support object instancing, recursion and interned strings + in marshal + +- Issue #17502: Process DEFAULT values in mock side_effect that returns iterator. + +- Issue #16795: On the ast.arguments object, unify vararg with varargannotation + and kwarg and kwargannotation. Change the column offset of ast.Attribute to be + at the attribute name. + +- Issue #17434: Properly raise a SyntaxError when a string occurs between future + imports. + +- Issue #17117: Import and @importlib.util.set_loader now set __loader__ when + it has a value of None or the attribute doesn't exist. + +- Issue #17032: The "global" in the "NameError: global name 'x' is not defined" + error message has been removed. Patch by Ram Rachum. + +- Issue #18080: When building a C extension module on OS X, if the compiler + is overriden with the CC environment variable, use the new compiler as + the default for linking if LDSHARED is not also overriden. This restores + Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0. + +- Issue #18113: Fixed a refcount leak in the curses.panel module's + set_userptr() method. Reported by Atsuo Ishimoto. + +- Implement PEP 443 "Single-dispatch generic functions". + +- Implement PEP 435 "Adding an Enum type to the Python standard library". + - Issue #15596: Faster pickling of unicode strings. - Issue #17572: Avoid chained exceptions while passing bad directives to @@ -2288,6 +2065,48 @@ IDLE ---- +- Issue #18429: Format / Format Paragraph, now works when comment blocks + are selected. As with text blocks, this works best when the selection + only includes complete lines. + +- Issue #18226: Add docstrings and unittests for FormatParagraph.py. + Original patches by Todd Rovito and Phil Webster. + +- Issue #18279: Format - Strip trailing whitespace no longer marks a file as + changed when it has not been changed. This fix followed the addition of a + test file originally written by Phil Webster (the issue's main goal). + +- Issue #7136: In the Idle File menu, "New Window" is renamed "New File". + Patch by Tal Einat, Roget Serwy, and Todd Rovito. + +- Remove dead imports of imp. + +- Issue #18196: Avoid displaying spurious SystemExit tracebacks. + +- Issue #5492: Avoid traceback when exiting IDLE caused by a race condition. + +- Issue #17511: Keep IDLE find dialog open after clicking "Find Next". + Original patch by Sarah K. + +- Issue #18055: Move IDLE off of imp and on to importlib. + +- Issue #15392: Create a unittest framework for IDLE. + Initial patch by Rajagopalasarma Jayakrishnan. + See Lib/idlelib/idle_test/README.txt for how to run Idle tests. + +- Issue #14146: Highlight source line while debugging on Windows. + +- Issue #17838: Allow sys.stdin to be reassigned. + +- Issue #13495: Avoid loading the color delegator twice in IDLE. + +- Issue #17798: Allow IDLE to edit new files when specified on command line. + +- Issue #14735: Update IDLE docs to omit "Control-z on Windows". + +- Issue #17532: Always include Options menu for IDLE on OS X. + Patch by Guilherme Sim?es. + - Issue #17585: Fixed IDLE regression. Now closes when using exit() or quit(). - Issue #17657: Show full Tk version in IDLE's about dialog. @@ -2341,6 +2160,91 @@ Tests ----- +- Issue #1666318: Add a test that shutil.copytree() retains directory + permissions. Patch by Catherine Devlin. + +- Issue #18273: move the tests in Lib/test/json_tests to Lib/test/test_json + and make them discoverable by unittest. Patch by Zachary Ware. + +- Fix a fcntl test case on KFreeBSD, Debian #708653 (Petr Salinger). + +- Issue #18396: Fix spurious test failure in test_signal on Windows when + faulthandler is enabled (Patch by Jeremy Kloth) + +- Issue #17046: Fix broken test_executable_without_cwd in test_subprocess. + +- Issue #15415: Add new temp_dir() and change_cwd() context managers to + test.support, and refactor temp_cwd() to use them. Patch by Chris Jerdonek. + +- Issue #15494: test.support is now a package rather than a module (Initial + patch by Indra Talip) + +- Issue #17944: test_zipfile now discoverable and uses subclassing to + generate tests for different compression types. Fixed a bug with skipping + some tests due to use of exhausted iterators. + +- Issue #18266: test_largefile now works with unittest test discovery and + supports running only selected tests. Patch by Zachary Ware. + +- Issue #17767: test_locale now works with unittest test discovery. + Original patch by Zachary Ware. + +- Issue #18375: Assume --randomize when --randseed is used for running the + testsuite. + +- Issue #11185: Fix test_wait4 under AIX. Patch by S?bastien Sabl?. + +- Issue #18207: Fix test_ssl for some versions of OpenSSL that ignore seconds + in ASN1_TIME fields. + +- Issue #18094: test_uuid no more reports skipped tests as passed. + +- Issue #17992: Add timeouts to asyncore and asynchat tests so that they won't + accidentally hang. + +- Issue #17833: Fix test_gdb failures seen on machines where debug symbols + for glibc are available (seen on PPC64 Linux). + +- Issue #7855: Add tests for ctypes/winreg for issues found in IronPython. + Initial patch by Dino Viehland. + +- Issue #11078: test___all__ now checks for duplicates in __all__. + Initial patch by R. David Murray. + +- Issue #17712: Fix test_gdb failures on Ubuntu 13.04. + +- Issue #17835: Fix test_io when the default OS pipe buffer size is larger + than one million bytes. + +- Issue #17065: Use process-unique key for winreg tests to avoid failures if + test is run multiple times in parallel (eg: on a buildbot host). + +- Issue #12820: add tests for the xml.dom.minicompat module. + Patch by John Chandler and Phil Connell. + +- Issue #17691: test_univnewlines now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17790: test_set now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17789: test_random now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17779: test_osx_env now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17766: test_iterlen now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17690: test_time now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #17692: test_sqlite now works with unittest test discovery. + Patch by Zachary Ware. + +- Issue #11995: test_pydoc doesn't import all sys.path modules anymore. + - Issue #17448: test_sax now skips if there are no xml parsers available instead of raising an ImportError. @@ -2479,6 +2383,27 @@ Build ----- +- Issue #16067: Add description into MSI file to replace installer's + temporary name. + +- Issue #18257: Fix readlink usage in python-config. Install the python + version again on Darwin. + +- Issue #18481: Add C coverage reporting with gcov and lcov. A new make target + "coverage-report" creates an instrumented Python build, runs unit tests + and creates a HTML. The report can be updated with "make coverage-lcov". + +- Issue #17845: Clarified the message printed when some module are not built. + +- Issue #18256: Compilation fix for recent AIX releases. Patch by + David Edelsohn. + +- Issue #17547: In configure, explicitly pass -Wformat for the benefit for GCC + 4.8. + +- Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1 + on Windows. + - Issue #17591: Use lowercase filenames when including Windows header files. Patch by Roumen Petrov. @@ -2551,6 +2476,22 @@ C-API ----- +- Issue #18351: Fix various issues in a function in importlib provided to help + PyImport_ExecCodeModuleWithPathnames() (and thus by extension + PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()). + +- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and + PyObject_CallMethod() now changed to `const char*`. Based on patches by + J?rg M?ller and Lars Buitinck. + +- Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now + expand their arguments once instead of multiple times. Patch written by Illia + Polosukhin. + +- Issue #17522: Add the PyGILState_Check() API. + +- Issue #17327: Add PyDict_SetDefault. + - Issue #16881: Fix Py_ARRAY_LENGTH macro for GCC < 3.1. - Issue #15422: Get rid of PyCFunction_New macro. Use PyCFunction_NewEx @@ -2569,6 +2510,23 @@ Documentation ------------- +- Issue #17701: Improving strftime documentation. + +- Issue #18440: Clarify that `hash()` can truncate the value returned from an + object's custom `__hash__()` method. + +- Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs. + +- Issue #14097: improve the "introduction" page of the tutorial. + +- Issue #17977: The documentation for the cadefault argument's default value + in urllib.request.urlopen() is fixed to match the code. + +- Issue #15940: Specify effect of locale on time functions. + +- Issue #6696: add documentation for the Profile objects, and improve + profile/cProfile docs. Patch by Tom Pinckney. + - Issue #15940: Specify effect of locale on time functions. - Issue 17538: Document XML vulnerabilties @@ -2662,6 +2620,22 @@ Tools/Demos ----------- +- Issue #18817: Fix a resource warning in Lib/aifc.py demo. Patch by + Vajrasky Kok. + +- Issue #18439: Make patchcheck work on Windows for ACKS, NEWS. + +- Issue #18448: Fix a typo in Tools/demo/eiffel.py. + +- Issue #18457: Fixed saving of formulas and complex numbers in + Tools/demo/ss1.py. + +- Issue #18449: Make Tools/demo/ss1.py work again on Python 3. Patch by + F?vry Thibault. + +- Issue #12990: The "Python Launcher" on OSX could not launch python scripts + that have paths that include wide characters. + - Issue #15239: Make mkstringprep.py work again on Python 3. - Issue #17028: Allowed Python arguments to be supplied to the Windows @@ -2694,6 +2668,12 @@ - Issue #13301: use ast.literal_eval() instead of eval() in Tools/i18n/msgfmt.py Patch by Serhiy Storchaka. +Windows +------- + +- Issue #18569: The installer now adds .py to the PATHEXT variable when extensions + are registered. Patch by Paul Moore. + What's New in Python 3.3.0? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 14:33:26 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 15 Oct 2013 14:33:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_pip_integration_timeline_?= =?utf-8?q?to_PEP_453?= Message-ID: <3czbdy2jW2z7Ljd@mail.python.org> http://hg.python.org/peps/rev/39a7dfcb9ab9 changeset: 5194:39a7dfcb9ab9 user: Nick Coghlan date: Tue Oct 15 22:33:12 2013 +1000 summary: Add pip integration timeline to PEP 453 - timeline based on discussion with the 3.4 release team and the pip devs - also clarified the two trust models on offer (i.e. that the PEP ensures trusting PyPI remains explicitly opt-in, just as it has always been in the past) files: pep-0453.txt | 44 ++++++++++++++++++++++++++++++++++++--- 1 files changed, 40 insertions(+), 4 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -331,8 +331,8 @@ ----------------------- The design in this PEP has been deliberately chosen to avoid making any -significant changes to the trust model of the CPython installers for end -users that do not subsequently make use of ``pip``. +significant changes to the trust model of CPython for end users that do +not subsequently run the command ``pip install --upgrade pip``. The installers will contain all the components of a fully functioning version of Python, including the ``pip`` installer. The installation @@ -340,8 +340,9 @@ trusting the security of the network connection established between ``pip`` and the Python package index. -Only users that choose to use ``pip`` directly will need to pay -attention to any PyPI related security considerations. +Only users that choose to use ``pip`` to communicate with PyPI will +need to pay attention to the additional security considerations that come +with doing so. Reliability considerations @@ -401,6 +402,41 @@ updated for Python 3.4+ +Integration timeline +-------------------- + +Allowing ``pip`` to be bundled with CPython as a wheel file requires some +adjustments to ``pip`` itself, so the proposed time frame for integration +into CPython if this PEP is accepted is as follows: + +* by November 17th (1 week prior to the scheduled date of 3.4.0 beta 1) + + Documentation updated and ``ensurepip`` implemented based on a beta release + of ``pip`` 1.5. + +* by November 24th (scheduled date of 3.4.0 beta 1) + + All other proposed functional changes for Python 3.4 implemented, + including the installer updates to invoke ensurepip. + +* by December 29th (1 week prior to the scheduled date of 3.4.0 beta 2) + + ``ensurepip`` updated to the final release of pip 1.5 + + PEP 101 updated to cover ensuring the bundled version of ``pip`` is up + to date. + +(See PEP 429 for the current official scheduled dates of each release. Dates +listed above are accurate as of October 15th.) + +If there is no final release of ``pip`` 1.5 available the week before the +scheduled Python 3.4 beta 2 release, then implementation of this PEP will +be deferred to Python 3.5. Note that this scenario is unlikely - the final +``pip`` 1.5 release could likely be ready for beta 1. However, it makes +sense to defer the final release until after the ``ensurepip`` bootstrapping +has seen some testing in a CPython beta release. + + Proposed CLI ------------ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 15 14:43:55 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 15 Oct 2013 14:43:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Tweak_the_proposed_integratio?= =?utf-8?q?n_timeline?= Message-ID: <3czbt30yNKz7LjQ@mail.python.org> http://hg.python.org/peps/rev/953676f056cf changeset: 5195:953676f056cf user: Nick Coghlan date: Tue Oct 15 22:43:46 2013 +1000 summary: Tweak the proposed integration timeline files: pep-0453.txt | 43 +++++++++++++++++++++++++-------------- 1 files changed, 27 insertions(+), 16 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -405,36 +405,47 @@ Integration timeline -------------------- -Allowing ``pip`` to be bundled with CPython as a wheel file requires some -adjustments to ``pip`` itself, so the proposed time frame for integration -into CPython if this PEP is accepted is as follows: +If this PEP is accepted, the proposed time frame for integration of ``pip`` +into the CPython release is as follows: -* by November 17th (1 week prior to the scheduled date of 3.4.0 beta 1) +* as soon as possible - Documentation updated and ``ensurepip`` implemented based on a beta release - of ``pip`` 1.5. + Documentation updated and ``ensurepip`` implemented based on a pre-release + version of ``pip`` 1.5. + + All other proposed functional changes for Python 3.4 implemented, + including the installer updates to invoke ``ensurepip``. + +* by November 20th (3 days prior to the scheduled date of 3.4.0 beta 1) + + ``ensurepip`` updated to use a beta release of ``pip`` 1.5. + + PEP 101 updated to cover ensuring the bundled version of ``pip`` is up + to date. * by November 24th (scheduled date of 3.4.0 beta 1) - All other proposed functional changes for Python 3.4 implemented, - including the installer updates to invoke ensurepip. + As with any other new feature, all proposed functional changes for + Python 3.4 must be implemented prior to the beta feature freeze. * by December 29th (1 week prior to the scheduled date of 3.4.0 beta 2) ``ensurepip`` updated to the final release of pip 1.5 - PEP 101 updated to cover ensuring the bundled version of ``pip`` is up - to date. - (See PEP 429 for the current official scheduled dates of each release. Dates listed above are accurate as of October 15th.) -If there is no final release of ``pip`` 1.5 available the week before the +If there is no final release of ``pip`` 1.5 available by one week before the scheduled Python 3.4 beta 2 release, then implementation of this PEP will -be deferred to Python 3.5. Note that this scenario is unlikely - the final -``pip`` 1.5 release could likely be ready for beta 1. However, it makes -sense to defer the final release until after the ``ensurepip`` bootstrapping -has seen some testing in a CPython beta release. +be deferred to Python 3.5. Note that this scenario is unlikely - the +tentative date for the ``pip`` 1.5 release is currently December 1st. + +In future CPython releases, this kind of coordinated scheduling shouldn't be +needed: the CPython release manager will be able to just update to the latest +released version of ``pip``. However, in this case, some fixes are needed in +``pip`` in order to allow the bundling to work correctly, so the ``pip`` 1.5 +release cycle needs to be properly aligned with the CPython 3.4 beta +releases. Proposed CLI -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 15 17:52:55 2013 From: python-checkins at python.org (richard.oudkerk) Date: Tue, 15 Oct 2013 17:52:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Print_process_?= =?utf-8?q?instead_of_pid=2E?= Message-ID: <3czh472DTyz7LkW@mail.python.org> http://hg.python.org/cpython/rev/82aab9b1066d changeset: 86379:82aab9b1066d branch: 3.3 parent: 86374:865bab7387f2 user: Richard Oudkerk date: Tue Oct 15 16:48:51 2013 +0100 summary: Print process instead of pid. files: Lib/test/test_multiprocessing.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -298,7 +298,7 @@ if hasattr(signal, 'alarm'): def handler(*args): - raise RuntimeError('join took too long: pid=%s' % p.pid) + raise RuntimeError('join took too long: %s' % p) old_handler = signal.signal(signal.SIGALRM, handler) try: signal.alarm(10) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 17:52:56 2013 From: python-checkins at python.org (richard.oudkerk) Date: Tue, 15 Oct 2013 17:52:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Merge?= Message-ID: <3czh4852jFz7Lkc@mail.python.org> http://hg.python.org/cpython/rev/d8f2947262a6 changeset: 86380:d8f2947262a6 parent: 86378:484ce82b7873 parent: 86379:82aab9b1066d user: Richard Oudkerk date: Tue Oct 15 16:49:59 2013 +0100 summary: Merge files: Lib/test/_test_multiprocessing.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -301,7 +301,7 @@ if hasattr(signal, 'alarm'): def handler(*args): - raise RuntimeError('join took too long: pid=%s' % p.pid) + raise RuntimeError('join took too long: %s' % p) old_handler = signal.signal(signal.SIGALRM, handler) try: signal.alarm(10) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 20:23:32 2013 From: python-checkins at python.org (georg.brandl) Date: Tue, 15 Oct 2013 20:23:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?benchmarks=3A_Fix_byte/str_comparison?= =?utf-8?q?_issue_under_Python_3=2E?= Message-ID: <3czlPw4Wylz7LjW@mail.python.org> http://hg.python.org/benchmarks/rev/f65c24b57b2f changeset: 215:f65c24b57b2f user: Georg Brandl date: Tue Oct 15 20:24:25 2013 +0200 summary: Fix byte/str comparison issue under Python 3. files: perf.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -104,7 +104,7 @@ out, err = subproc.communicate() if subproc.returncode != 0: raise RuntimeError("Child interpreter died: " + err.decode()) - version = out.strip() + version = out.decode().strip() if len(version) != 3: raise RuntimeError("Strange version printed: %s" % version) _cache[key] = version -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Tue Oct 15 20:24:17 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 15 Oct 2013 20:24:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318725=3A_The_text?= =?utf-8?q?wrap_module_now_supports_truncating_multiline_text=2E?= Message-ID: <3czlQn0YpYz7LjX@mail.python.org> http://hg.python.org/cpython/rev/2e8c424dc638 changeset: 86381:2e8c424dc638 user: Serhiy Storchaka date: Tue Oct 15 21:22:54 2013 +0300 summary: Issue #18725: The textwrap module now supports truncating multiline text. files: Doc/library/textwrap.rst | 28 +++-- Lib/test/test_textwrap.py | 105 ++++++++++++++++++++++++- Lib/textwrap.py | 88 ++++++++++++--------- Misc/NEWS | 2 + 4 files changed, 165 insertions(+), 58 deletions(-) diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst --- a/Doc/library/textwrap.rst +++ b/Doc/library/textwrap.rst @@ -250,6 +250,22 @@ was to always allow breaking hyphenated words. + .. attribute:: max_lines + + (default: ``None``) If not ``None``, then the text be will truncated to + *max_lines* lines. + + .. versionadded:: 3.4 + + + .. attribute:: placeholder + + (default: ``' [...]'``) String that will be appended to the last line of + text if it will be truncated. + + .. versionadded:: 3.4 + + :class:`TextWrapper` also provides some public methods, analogous to the module-level convenience functions: @@ -266,15 +282,3 @@ Wraps the single paragraph in *text*, and returns a single string containing the wrapped paragraph. - - - .. function:: shorten(text, *, placeholder=" [...]") - - Collapse and truncate the given text to fit in :attr:`width` - characters. - - The text first has its whitespace collapsed. If it then fits in - :attr:`width`, it is returned as-is. Otherwise, as many words - as possible are joined and then the *placeholder* is appended. - - .. versionadded:: 3.4 diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py --- a/Lib/test/test_textwrap.py +++ b/Lib/test/test_textwrap.py @@ -42,10 +42,6 @@ "\nexpected %r\n" "but got %r" % (expect, result)) - def check_shorten(self, text, width, expect, **kwargs): - result = shorten(text, width, **kwargs) - self.check(result, expect) - class WrapTestCase(BaseTestCase): @@ -433,6 +429,90 @@ self.check_wrap(text, 7, ["aa \xe4\xe4-", "\xe4\xe4"]) +class MaxLinesTestCase(BaseTestCase): + text = "Hello there, how are you this fine day? I'm glad to hear it!" + + def test_simple(self): + self.check_wrap(self.text, 12, + ["Hello [...]"], + max_lines=0) + self.check_wrap(self.text, 12, + ["Hello [...]"], + max_lines=1) + self.check_wrap(self.text, 12, + ["Hello there,", + "how [...]"], + max_lines=2) + self.check_wrap(self.text, 13, + ["Hello there,", + "how are [...]"], + max_lines=2) + self.check_wrap(self.text, 80, [self.text], max_lines=1) + self.check_wrap(self.text, 12, + ["Hello there,", + "how are you", + "this fine", + "day? I'm", + "glad to hear", + "it!"], + max_lines=6) + + def test_spaces(self): + # strip spaces before placeholder + self.check_wrap(self.text, 12, + ["Hello there,", + "how are you", + "this fine", + "day? [...]"], + max_lines=4) + # placeholder at the start of line + self.check_wrap(self.text, 6, + ["Hello", + "[...]"], + max_lines=2) + # final spaces + self.check_wrap(self.text + ' ' * 10, 12, + ["Hello there,", + "how are you", + "this fine", + "day? I'm", + "glad to hear", + "it!"], + max_lines=6) + + def test_placeholder(self): + self.check_wrap(self.text, 12, + ["Hello..."], + max_lines=1, + placeholder='...') + self.check_wrap(self.text, 12, + ["Hello there,", + "how are..."], + max_lines=2, + placeholder='...') + # long placeholder and indentation + with self.assertRaises(ValueError): + wrap(self.text, 16, initial_indent=' ', + max_lines=1, placeholder=' [truncated]...') + with self.assertRaises(ValueError): + wrap(self.text, 16, subsequent_indent=' ', + max_lines=2, placeholder=' [truncated]...') + self.check_wrap(self.text, 16, + [" Hello there,", + " [truncated]..."], + max_lines=2, + initial_indent=' ', + subsequent_indent=' ', + placeholder=' [truncated]...') + self.check_wrap(self.text, 16, + [" [truncated]..."], + max_lines=1, + initial_indent=' ', + subsequent_indent=' ', + placeholder=' [truncated]...') + self.check_wrap(self.text, 80, [self.text], placeholder='.' * 1000) + + class LongWordTestCase (BaseTestCase): def setUp(self): self.wrapper = TextWrapper() @@ -493,6 +573,14 @@ result = wrap(self.text, width=30, break_long_words=0) self.check(result, expect) + def test_max_lines_long(self): + self.check_wrap(self.text, 12, + ['Did you say ', + '"supercalifr', + 'agilisticexp', + '[...]'], + max_lines=4) + class IndentTestCases(BaseTestCase): @@ -782,6 +870,10 @@ class ShortenTestCase(BaseTestCase): + def check_shorten(self, text, width, expect, **kwargs): + result = shorten(text, width, **kwargs) + self.check(result, expect) + def test_simple(self): # Simple case: just words, spaces, and a bit of punctuation text = "Hello there, how are you this fine day? I'm glad to hear it!" @@ -825,10 +917,9 @@ self.check_shorten("hello world! ", 10, "[...]") def test_width_too_small_for_placeholder(self): - wrapper = TextWrapper(width=8) - wrapper.shorten("x" * 20, placeholder="(......)") + shorten("x" * 20, width=8, placeholder="(......)") with self.assertRaises(ValueError): - wrapper.shorten("x" * 20, placeholder="(.......)") + shorten("x" * 20, width=8, placeholder="(.......)") def test_first_word_too_long_but_placeholder_fits(self): self.check_shorten("Helloo", 5, "[...]") diff --git a/Lib/textwrap.py b/Lib/textwrap.py --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -19,8 +19,6 @@ # since 0xa0 is not in range(128). _whitespace = '\t\n\x0b\x0c\r ' -_default_placeholder = ' [...]' - class TextWrapper: """ Object for wrapping/filling text. The public interface consists of @@ -64,6 +62,10 @@ compound words. drop_whitespace (default: true) Drop leading and trailing whitespace from lines. + max_lines (default: None) + Truncate wrapped lines. + placeholder (default: ' [...]') + Append to the last line of truncated text. """ unicode_whitespace_trans = {} @@ -106,7 +108,10 @@ break_long_words=True, drop_whitespace=True, break_on_hyphens=True, - tabsize=8): + tabsize=8, + *, + max_lines=None, + placeholder=' [...]'): self.width = width self.initial_indent = initial_indent self.subsequent_indent = subsequent_indent @@ -117,6 +122,8 @@ self.drop_whitespace = drop_whitespace self.break_on_hyphens = break_on_hyphens self.tabsize = tabsize + self.max_lines = max_lines + self.placeholder = placeholder # -- Private methods ----------------------------------------------- @@ -225,6 +232,13 @@ lines = [] if self.width <= 0: raise ValueError("invalid width %r (must be > 0)" % self.width) + if self.max_lines is not None: + if self.max_lines > 1: + indent = self.subsequent_indent + else: + indent = self.initial_indent + if len(indent) + len(self.placeholder.lstrip()) > self.width: + raise ValueError("placeholder too large for max width") # Arrange in reverse order so items can be efficiently popped # from a stack of chucks. @@ -267,15 +281,41 @@ # fit on *any* line (not just this one). if chunks and len(chunks[-1]) > width: self._handle_long_word(chunks, cur_line, cur_len, width) + cur_len = sum(map(len, cur_line)) # If the last chunk on this line is all whitespace, drop it. if self.drop_whitespace and cur_line and cur_line[-1].strip() == '': + cur_len -= len(cur_line[-1]) del cur_line[-1] - # Convert current line back to a string and store it in list - # of all lines (return value). if cur_line: - lines.append(indent + ''.join(cur_line)) + if (self.max_lines is None or + len(lines) + 1 < self.max_lines or + (not chunks or + self.drop_whitespace and + len(chunks) == 1 and + not chunks[0].strip()) and cur_len <= width): + # Convert current line back to a string and store it in + # list of all lines (return value). + lines.append(indent + ''.join(cur_line)) + else: + while cur_line: + if (cur_line[-1].strip() and + cur_len + len(self.placeholder) <= width): + cur_line.append(self.placeholder) + lines.append(indent + ''.join(cur_line)) + break + cur_len -= len(cur_line[-1]) + del cur_line[-1] + else: + if lines: + prev_line = lines[-1].rstrip() + if (len(prev_line) + len(self.placeholder) <= + self.width): + lines[-1] = prev_line + self.placeholder + break + lines.append(indent + self.placeholder.lstrip()) + break return lines @@ -308,36 +348,6 @@ """ return "\n".join(self.wrap(text)) - def shorten(self, text, *, placeholder=_default_placeholder): - """shorten(text: str) -> str - - Collapse and truncate the given text to fit in 'self.width' columns. - """ - max_length = self.width - if max_length < len(placeholder.strip()): - raise ValueError("placeholder too large for max width") - sep = ' ' - sep_len = len(sep) - parts = [] - cur_len = 0 - chunks = self._split_chunks(text) - for chunk in chunks: - if not chunk.strip(): - continue - chunk_len = len(chunk) + sep_len if parts else len(chunk) - if cur_len + chunk_len > max_length: - break - parts.append(chunk) - cur_len += chunk_len - else: - # No truncation necessary - return sep.join(parts) - max_truncated_length = max_length - len(placeholder) - while parts and cur_len > max_truncated_length: - last = parts.pop() - cur_len -= len(last) + sep_len - return (sep.join(parts) + placeholder).strip() - # -- Convenience interface --------------------------------------------- @@ -366,7 +376,7 @@ w = TextWrapper(width=width, **kwargs) return w.fill(text) -def shorten(text, width, *, placeholder=_default_placeholder, **kwargs): +def shorten(text, width, **kwargs): """Collapse and truncate the given text to fit in the given width. The text first has its whitespace collapsed. If it then fits in @@ -378,8 +388,8 @@ >>> textwrap.shorten("Hello world!", width=11) 'Hello [...]' """ - w = TextWrapper(width=width, **kwargs) - return w.shorten(text, placeholder=placeholder) + w = TextWrapper(width=width, max_lines=1, **kwargs) + return w.fill(' '.join(text.strip().split())) # -- Loosely related functionality ------------------------------------- diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,8 @@ Library ------- +- Issue #18725: The textwrap module now supports truncating multiline text. + - Issue #18776: atexit callbacks now display their full traceback when they raise an exception. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 23:24:57 2013 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 15 Oct 2013 23:24:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE0NDA3?= =?utf-8?q?=3A_Fix_unittest_test_discovery_in_test=5Fconcurrent=5Ffutures?= =?utf-8?q?=2E?= Message-ID: <3czqRF15n0z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/38243a0a1f44 changeset: 86382:38243a0a1f44 branch: 3.3 parent: 86379:82aab9b1066d user: Antoine Pitrou date: Tue Oct 15 23:23:32 2013 +0200 summary: Issue #14407: Fix unittest test discovery in test_concurrent_futures. files: Lib/test/test_concurrent_futures.py | 35 ++++++---------- Misc/NEWS | 2 + 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -88,7 +88,7 @@ executor_type = futures.ProcessPoolExecutor -class ExecutorShutdownTest(unittest.TestCase): +class ExecutorShutdownTest: def test_run_after_shutdown(self): self.executor.shutdown() self.assertRaises(RuntimeError, @@ -116,7 +116,7 @@ f.result() -class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest): +class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, unittest.TestCase): def _prime_executor(self): pass @@ -148,7 +148,7 @@ t.join() -class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest): +class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest, unittest.TestCase): def _prime_executor(self): pass @@ -184,7 +184,7 @@ p.join() -class WaitTests(unittest.TestCase): +class WaitTests: def test_first_completed(self): future1 = self.executor.submit(mul, 21, 2) @@ -285,7 +285,7 @@ self.assertEqual(set([future2]), pending) -class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests): +class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests, unittest.TestCase): def test_pending_calls_race(self): # Issue #14406: multi-threaded race condition when waiting on all @@ -303,11 +303,11 @@ sys.setswitchinterval(oldswitchinterval) -class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests): +class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests, unittest.TestCase): pass -class AsCompletedTests(unittest.TestCase): +class AsCompletedTests: # TODO(brian at sweetapp.com): Should have a test with a non-zero timeout. def test_no_timeout(self): future1 = self.executor.submit(mul, 2, 21) @@ -345,15 +345,15 @@ completed_futures) -class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests): +class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests, unittest.TestCase): pass -class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests): +class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests, unittest.TestCase): pass -class ExecutorTest(unittest.TestCase): +class ExecutorTest: # Executor.shutdown() and context manager usage is tested by # ExecutorShutdownTest. def test_submit(self): @@ -397,7 +397,7 @@ self.executor.shutdown() -class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest): +class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, unittest.TestCase): def test_map_submits_without_iteration(self): """Tests verifying issue 11777.""" finished = [] @@ -409,7 +409,7 @@ self.assertCountEqual(finished, range(10)) -class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest): +class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest, unittest.TestCase): def test_killed_child(self): # When a child process is abruptly terminated, the whole pool gets # "broken". @@ -648,16 +648,7 @@ @test.support.reap_threads def test_main(): try: - test.support.run_unittest(ProcessPoolExecutorTest, - ThreadPoolExecutorTest, - ProcessPoolWaitTests, - ThreadPoolWaitTests, - ProcessPoolAsCompletedTests, - ThreadPoolAsCompletedTests, - FutureTests, - ProcessPoolShutdownTest, - ThreadPoolShutdownTest, - ) + test.support.run_unittest(__name__) finally: test.support.reap_children() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -430,6 +430,8 @@ Tests ----- +- Issue #14407: Fix unittest test discovery in test_concurrent_futures. + - Issue #18919: Unified and extended tests for audio modules: aifc, sunau and wave. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 23:24:58 2013 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 15 Oct 2013 23:24:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2314407=3A_Fix_unittest_test_discovery_in_test=5F?= =?utf-8?q?concurrent=5Ffutures=2E?= Message-ID: <3czqRG4Fpcz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/9cc40bc5f02b changeset: 86383:9cc40bc5f02b parent: 86381:2e8c424dc638 parent: 86382:38243a0a1f44 user: Antoine Pitrou date: Tue Oct 15 23:24:44 2013 +0200 summary: Issue #14407: Fix unittest test discovery in test_concurrent_futures. files: Lib/test/test_concurrent_futures.py | 35 ++++++---------- Misc/NEWS | 2 + 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -94,7 +94,7 @@ executor_type = futures.ProcessPoolExecutor -class ExecutorShutdownTest(unittest.TestCase): +class ExecutorShutdownTest: def test_run_after_shutdown(self): self.executor.shutdown() self.assertRaises(RuntimeError, @@ -122,7 +122,7 @@ f.result() -class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest): +class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, unittest.TestCase): def _prime_executor(self): pass @@ -154,7 +154,7 @@ t.join() -class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest): +class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest, unittest.TestCase): def _prime_executor(self): pass @@ -190,7 +190,7 @@ p.join() -class WaitTests(unittest.TestCase): +class WaitTests: def test_first_completed(self): future1 = self.executor.submit(mul, 21, 2) @@ -291,7 +291,7 @@ self.assertEqual(set([future2]), pending) -class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests): +class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests, unittest.TestCase): def test_pending_calls_race(self): # Issue #14406: multi-threaded race condition when waiting on all @@ -309,11 +309,11 @@ sys.setswitchinterval(oldswitchinterval) -class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests): +class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests, unittest.TestCase): pass -class AsCompletedTests(unittest.TestCase): +class AsCompletedTests: # TODO(brian at sweetapp.com): Should have a test with a non-zero timeout. def test_no_timeout(self): future1 = self.executor.submit(mul, 2, 21) @@ -351,15 +351,15 @@ completed_futures) -class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests): +class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests, unittest.TestCase): pass -class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests): +class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests, unittest.TestCase): pass -class ExecutorTest(unittest.TestCase): +class ExecutorTest: # Executor.shutdown() and context manager usage is tested by # ExecutorShutdownTest. def test_submit(self): @@ -419,7 +419,7 @@ "Stale reference not collected within timeout.") -class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest): +class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, unittest.TestCase): def test_map_submits_without_iteration(self): """Tests verifying issue 11777.""" finished = [] @@ -431,7 +431,7 @@ self.assertCountEqual(finished, range(10)) -class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest): +class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest, unittest.TestCase): def test_killed_child(self): # When a child process is abruptly terminated, the whole pool gets # "broken". @@ -670,16 +670,7 @@ @test.support.reap_threads def test_main(): try: - test.support.run_unittest(ProcessPoolExecutorTest, - ThreadPoolExecutorTest, - ProcessPoolWaitTests, - ThreadPoolWaitTests, - ProcessPoolAsCompletedTests, - ThreadPoolAsCompletedTests, - FutureTests, - ProcessPoolShutdownTest, - ThreadPoolShutdownTest, - ) + test.support.run_unittest(__name__) finally: test.support.reap_children() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -116,6 +116,8 @@ Tests ----- +- Issue #14407: Fix unittest test discovery in test_concurrent_futures. + - Issue #18919: Unified and extended tests for audio modules: aifc, sunau and wave. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 15 23:48:19 2013 From: python-checkins at python.org (victor.stinner) Date: Tue, 15 Oct 2013 23:48:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2UgIzE5MjY3?= =?utf-8?q?=3A_Fix_support_of_multibyte_encoding_=28ex=3A_UTF-16=29_in_the?= =?utf-8?q?_logging?= Message-ID: <3czqyC2XQKz7LjS@mail.python.org> http://hg.python.org/cpython/rev/e94e29dab32c changeset: 86384:e94e29dab32c branch: 2.7 parent: 86377:d7ebe03fa752 user: Victor Stinner date: Tue Oct 15 23:36:56 2013 +0200 summary: Close #19267: Fix support of multibyte encoding (ex: UTF-16) in the logging module. files: Lib/logging/__init__.py | 2 +- Lib/test/test_logging.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -857,7 +857,7 @@ try: if (isinstance(msg, unicode) and getattr(stream, 'encoding', None)): - ufs = fs.decode(stream.encoding) + ufs = u'%s\n' try: stream.write(ufs % msg) except UnicodeEncodeError: diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1060,6 +1060,24 @@ #Compare against what the data should be when encoded in CP-1251 self.assertEqual(s, '\xe4\xee \xf1\xe2\xe8\xe4\xe0\xed\xe8\xff\n') + def test_encoding_utf16_unicode(self): + # Issue #19267 + log = logging.getLogger("test") + message = u'b\u0142\u0105d' + writer_class = codecs.getwriter('utf-16-le') + writer_class.encoding = 'utf-16-le' + stream = cStringIO.StringIO() + writer = writer_class(stream, 'strict') + handler = logging.StreamHandler(writer) + log.addHandler(handler) + try: + log.warning(message) + finally: + log.removeHandler(handler) + handler.close() + s = stream.getvalue() + self.assertEqual(s, 'b\x00B\x01\x05\x01d\x00\n\x00') + class WarningsTest(BaseTest): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -370,6 +370,9 @@ - Issue #17926: Fix dbm.__contains__ on 64-bit big-endian machines. +- Issue #19267: Fix support of multibyte encoding (ex: UTF-16) in the logging + module. + - Issue #17918: When using SSLSocket.accept(), if the SSL handshake failed on the new socket, the socket would linger indefinitely. Thanks to Peter Saveliev for reporting. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 16 07:02:26 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 16 Oct 2013 07:02:26 +0200 Subject: [Python-checkins] Daily reference leaks (9cc40bc5f02b): sum=0 Message-ID: results for 9cc40bc5f02b on branch "default" -------------------------------------------- test_imp leaked [0, -1, 1] references, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogWsONkE', '-x'] From python-checkins at python.org Wed Oct 16 11:47:20 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Oct 2013 11:47:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318468=3A_The_re?= =?utf-8?q?=2Esplit=2C_re=2Efindall=2C_and_re=2Esub_functions_and_the_grou?= =?utf-8?b?cCgp?= Message-ID: <3d07vr1zkdz7LjT@mail.python.org> http://hg.python.org/cpython/rev/add40e9f7cbe changeset: 86385:add40e9f7cbe parent: 86383:9cc40bc5f02b user: Serhiy Storchaka date: Wed Oct 16 12:46:28 2013 +0300 summary: Issue #18468: The re.split, re.findall, and re.sub functions and the group() and groups() methods of match object now always return a string or a bytes object. files: Lib/test/test_re.py | 82 +++++++++++++++++++---- Misc/NEWS | 4 + Modules/_sre.c | 110 +++++++++++++++++-------------- 3 files changed, 131 insertions(+), 65 deletions(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -17,8 +17,26 @@ import unittest +class S(str): + def __getitem__(self, index): + return S(super().__getitem__(index)) + +class B(bytes): + def __getitem__(self, index): + return B(super().__getitem__(index)) + class ReTests(unittest.TestCase): + def assertTypedEqual(self, actual, expect, msg=None): + self.assertEqual(actual, expect, msg) + def recurse(actual, expect): + if isinstance(expect, (tuple, list)): + for x, y in zip(actual, expect): + recurse(x, y) + else: + self.assertIs(type(actual), type(expect), msg) + recurse(actual, expect) + def test_keep_buffer(self): # See bug 14212 b = bytearray(b'x') @@ -53,6 +71,13 @@ return str(int_value + 1) def test_basic_re_sub(self): + self.assertTypedEqual(re.sub('y', 'a', 'xyz'), 'xaz') + self.assertTypedEqual(re.sub('y', S('a'), S('xyz')), 'xaz') + self.assertTypedEqual(re.sub(b'y', b'a', b'xyz'), b'xaz') + self.assertTypedEqual(re.sub(b'y', B(b'a'), B(b'xyz')), b'xaz') + self.assertTypedEqual(re.sub(b'y', bytearray(b'a'), bytearray(b'xyz')), b'xaz') + self.assertTypedEqual(re.sub(b'y', memoryview(b'a'), memoryview(b'xyz')), b'xaz') + self.assertEqual(re.sub("(?i)b+", "x", "bbbb BBBB"), 'x x') self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'), '9.3 -3 24x100y') @@ -210,10 +235,22 @@ self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2)) def test_re_split(self): - self.assertEqual(re.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c']) - self.assertEqual(re.split(":*", ":a:b::c"), ['', 'a', 'b', 'c']) - self.assertEqual(re.split("(:*)", ":a:b::c"), - ['', ':', 'a', ':', 'b', '::', 'c']) + for string in ":a:b::c", S(":a:b::c"): + self.assertTypedEqual(re.split(":", string), + ['', 'a', 'b', '', 'c']) + self.assertTypedEqual(re.split(":*", string), + ['', 'a', 'b', 'c']) + self.assertTypedEqual(re.split("(:*)", string), + ['', ':', 'a', ':', 'b', '::', 'c']) + for string in (b":a:b::c", B(b":a:b::c"), bytearray(b":a:b::c"), + memoryview(b":a:b::c")): + self.assertTypedEqual(re.split(b":", string), + [b'', b'a', b'b', b'', b'c']) + self.assertTypedEqual(re.split(b":*", string), + [b'', b'a', b'b', b'c']) + self.assertTypedEqual(re.split(b"(:*)", string), + [b'', b':', b'a', b':', b'b', b'::', b'c']) + self.assertEqual(re.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c']) self.assertEqual(re.split("(:)*", ":a:b::c"), ['', ':', 'a', ':', 'b', ':', 'c']) @@ -235,22 +272,39 @@ def test_re_findall(self): self.assertEqual(re.findall(":+", "abc"), []) - self.assertEqual(re.findall(":+", "a:b::c:::d"), [":", "::", ":::"]) - self.assertEqual(re.findall("(:+)", "a:b::c:::d"), [":", "::", ":::"]) - self.assertEqual(re.findall("(:)(:*)", "a:b::c:::d"), [(":", ""), - (":", ":"), - (":", "::")]) + for string in "a:b::c:::d", S("a:b::c:::d"): + self.assertTypedEqual(re.findall(":+", string), + [":", "::", ":::"]) + self.assertTypedEqual(re.findall("(:+)", string), + [":", "::", ":::"]) + self.assertTypedEqual(re.findall("(:)(:*)", string), + [(":", ""), (":", ":"), (":", "::")]) + for string in (b"a:b::c:::d", B(b"a:b::c:::d"), bytearray(b"a:b::c:::d"), + memoryview(b"a:b::c:::d")): + self.assertTypedEqual(re.findall(b":+", string), + [b":", b"::", b":::"]) + self.assertTypedEqual(re.findall(b"(:+)", string), + [b":", b"::", b":::"]) + self.assertTypedEqual(re.findall(b"(:)(:*)", string), + [(b":", b""), (b":", b":"), (b":", b"::")]) def test_bug_117612(self): self.assertEqual(re.findall(r"(a|(b))", "aba"), [("a", ""),("b", "b"),("a", "")]) def test_re_match(self): - self.assertEqual(re.match('a', 'a').groups(), ()) - self.assertEqual(re.match('(a)', 'a').groups(), ('a',)) - self.assertEqual(re.match(r'(a)', 'a').group(0), 'a') - self.assertEqual(re.match(r'(a)', 'a').group(1), 'a') - self.assertEqual(re.match(r'(a)', 'a').group(1, 1), ('a', 'a')) + for string in 'a', S('a'): + self.assertEqual(re.match('a', string).groups(), ()) + self.assertEqual(re.match('(a)', string).groups(), ('a',)) + self.assertEqual(re.match('(a)', string).group(0), 'a') + self.assertEqual(re.match('(a)', string).group(1), 'a') + self.assertEqual(re.match('(a)', string).group(1, 1), ('a', 'a')) + for string in b'a', B(b'a'), bytearray(b'a'), memoryview(b'a'): + self.assertEqual(re.match(b'a', string).groups(), ()) + self.assertEqual(re.match(b'(a)', string).groups(), (b'a',)) + self.assertEqual(re.match(b'(a)', string).group(0), b'a') + self.assertEqual(re.match(b'(a)', string).group(1), b'a') + self.assertEqual(re.match(b'(a)', string).group(1, 1), (b'a', b'a')) pat = re.compile('((a)|(b))(c)?') self.assertEqual(pat.match('a').groups(), ('a', 'a', None, None)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,10 @@ Library ------- +- Issue #18468: The re.split, re.findall, and re.sub functions and the group() + and groups() methods of match object now always return a string or a bytes + object. + - Issue #18725: The textwrap module now supports truncating multiline text. - Issue #18776: atexit callbacks now display their full traceback when they diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1812,6 +1812,24 @@ (((char*)(member) - (char*)(state)->beginning) / (state)->charsize) LOCAL(PyObject*) +getslice(int logical_charsize, const void *ptr, + PyObject* string, Py_ssize_t start, Py_ssize_t end) +{ + if (logical_charsize == 1) { + if (PyBytes_CheckExact(string) && + start == 0 && end == PyBytes_GET_SIZE(string)) { + Py_INCREF(string); + return string; + } + return PyBytes_FromStringAndSize( + (const char *)ptr + start, end - start); + } + else { + return PyUnicode_Substring(string, start, end); + } +} + +LOCAL(PyObject*) state_getslice(SRE_STATE* state, Py_ssize_t index, PyObject* string, int empty) { Py_ssize_t i, j; @@ -1831,7 +1849,7 @@ j = STATE_OFFSET(state, state->mark[index+1]); } - return PySequence_GetSlice(string, i, j); + return getslice(state->logical_charsize, state->beginning, string, i, j); } static void @@ -1993,45 +2011,6 @@ #endif static PyObject* -join_list(PyObject* list, PyObject* string) -{ - /* join list elements */ - - PyObject* joiner; - PyObject* function; - PyObject* args; - PyObject* result; - - joiner = PySequence_GetSlice(string, 0, 0); - if (!joiner) - return NULL; - - if (PyList_GET_SIZE(list) == 0) { - Py_DECREF(list); - return joiner; - } - - function = PyObject_GetAttrString(joiner, "join"); - if (!function) { - Py_DECREF(joiner); - return NULL; - } - args = PyTuple_New(1); - if (!args) { - Py_DECREF(function); - Py_DECREF(joiner); - return NULL; - } - PyTuple_SET_ITEM(args, 0, list); - result = PyObject_CallObject(function, args); - Py_DECREF(args); /* also removes list */ - Py_DECREF(function); - Py_DECREF(joiner); - - return result; -} - -static PyObject* pattern_findall(PatternObject* self, PyObject* args, PyObject* kw) { SRE_STATE state; @@ -2086,7 +2065,8 @@ case 0: b = STATE_OFFSET(&state, state.start); e = STATE_OFFSET(&state, state.ptr); - item = PySequence_GetSlice(string, b, e); + item = getslice(state.logical_charsize, state.beginning, + string, b, e); if (!item) goto error; break; @@ -2216,7 +2196,7 @@ } /* get segment before this match */ - item = PySequence_GetSlice( + item = getslice(state.logical_charsize, state.beginning, string, STATE_OFFSET(&state, last), STATE_OFFSET(&state, state.start) ); @@ -2245,7 +2225,7 @@ } /* get segment following last match (even if empty) */ - item = PySequence_GetSlice( + item = getslice(state.logical_charsize, state.beginning, string, STATE_OFFSET(&state, last), state.endpos ); if (!item) @@ -2271,6 +2251,7 @@ { SRE_STATE state; PyObject* list; + PyObject* joiner; PyObject* item; PyObject* filter; PyObject* args; @@ -2360,7 +2341,8 @@ if (i < b) { /* get segment before this match */ - item = PySequence_GetSlice(string, i, b); + item = getslice(state.logical_charsize, state.beginning, + string, i, b); if (!item) goto error; status = PyList_Append(list, item); @@ -2415,7 +2397,8 @@ /* get segment following last match */ if (i < state.endpos) { - item = PySequence_GetSlice(string, i, state.endpos); + item = getslice(state.logical_charsize, state.beginning, + string, i, state.endpos); if (!item) goto error; status = PyList_Append(list, item); @@ -2429,10 +2412,24 @@ Py_DECREF(filter); /* convert list to single string (also removes list) */ - item = join_list(list, string); - - if (!item) + joiner = getslice(state.logical_charsize, state.beginning, string, 0, 0); + if (!joiner) { + Py_DECREF(list); return NULL; + } + if (PyList_GET_SIZE(list) == 0) { + Py_DECREF(list); + item = joiner; + } + else { + if (state.logical_charsize == 1) + item = _PyBytes_Join(joiner, list); + else + item = PyUnicode_Join(joiner, list); + Py_DECREF(joiner); + if (!item) + return NULL; + } if (subn) return Py_BuildValue("Nn", item, n); @@ -3189,6 +3186,12 @@ static PyObject* match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) { + Py_ssize_t length; + int logical_charsize, charsize; + Py_buffer view; + PyObject *result; + void* ptr; + if (index < 0 || index >= self->groups) { /* raise IndexError if we were given a bad group number */ PyErr_SetString( @@ -3206,9 +3209,14 @@ return def; } - return PySequence_GetSlice( - self->string, self->mark[index], self->mark[index+1] - ); + ptr = getstring(self->string, &length, &logical_charsize, &charsize, &view); + if (ptr == NULL) + return NULL; + result = getslice(logical_charsize, ptr, + self->string, self->mark[index], self->mark[index+1]); + if (logical_charsize == 1 && view.buf != NULL) + PyBuffer_Release(&view); + return result; } static Py_ssize_t -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 16 12:08:26 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Oct 2013 12:08:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_shorten_to_=5F=5Fall?= =?utf-8?b?XyAoaXNzdWVzICMxODU4NSBhbmQgIzE4NzI1KS4=?= Message-ID: <3d08NB4n6Jz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/0bd257cd3e88 changeset: 86386:0bd257cd3e88 user: Serhiy Storchaka date: Wed Oct 16 13:07:53 2013 +0300 summary: Add shorten to __all_ (issues #18585 and #18725). files: Lib/textwrap.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/textwrap.py b/Lib/textwrap.py --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -7,7 +7,7 @@ import re -__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent'] +__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten'] # Hardcode the recognized whitespace characters to the US-ASCII # whitespace characters. The main reason for doing this is that in -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 16 17:44:04 2013 From: python-checkins at python.org (richard.oudkerk) Date: Wed, 16 Oct 2013 17:44:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318999=3A_Make_mul?= =?utf-8?q?tiprocessing_use_context_objects=2E?= Message-ID: <3d0HqS3yY9z7Ljn@mail.python.org> http://hg.python.org/cpython/rev/72a5ac909c7a changeset: 86387:72a5ac909c7a user: Richard Oudkerk date: Wed Oct 16 16:41:56 2013 +0100 summary: Issue #18999: Make multiprocessing use context objects. This allows different parts of a program to use different methods for starting processes without interfering with each other. files: Doc/library/multiprocessing.rst | 78 ++- Lib/multiprocessing/__init__.py | 260 +-------- Lib/multiprocessing/context.py | 348 +++++++++++ Lib/multiprocessing/forkserver.py | 224 +++--- Lib/multiprocessing/heap.py | 4 +- Lib/multiprocessing/managers.py | 11 +- Lib/multiprocessing/pool.py | 12 +- Lib/multiprocessing/popen.py | 78 -- Lib/multiprocessing/popen_fork.py | 4 - Lib/multiprocessing/popen_forkserver.py | 12 +- Lib/multiprocessing/popen_spawn_posix.py | 13 +- Lib/multiprocessing/popen_spawn_win32.py | 12 +- Lib/multiprocessing/process.py | 21 +- Lib/multiprocessing/queues.py | 29 +- Lib/multiprocessing/reduction.py | 4 +- Lib/multiprocessing/semaphore_tracker.py | 100 +- Lib/multiprocessing/sharedctypes.py | 37 +- Lib/multiprocessing/spawn.py | 8 +- Lib/multiprocessing/synchronize.py | 53 +- Lib/test/_test_multiprocessing.py | 42 +- 20 files changed, 736 insertions(+), 614 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -98,8 +98,8 @@ -Start methods -~~~~~~~~~~~~~ +Contexts and start methods +~~~~~~~~~~~~~~~~~~~~~~~~~~ Depending on the platform, :mod:`multiprocessing` supports three ways to start a process. These *start methods* are @@ -132,7 +132,7 @@ unnecessary resources are inherited. Available on Unix platforms which support passing file descriptors - over unix pipes. + over Unix pipes. Before Python 3.4 *fork* was the only option available on Unix. Also, prior to Python 3.4, child processes would inherit all the parents @@ -153,18 +153,46 @@ import multiprocessing as mp - def foo(): - print('hello') + def foo(q): + q.put('hello') if __name__ == '__main__': mp.set_start_method('spawn') - p = mp.Process(target=foo) + q = mp.Queue() + p = mp.Process(target=foo, args=(q,)) p.start() + print(q.get()) p.join() :func:`set_start_method` should not be used more than once in the program. +Alternatively, you can use :func:`get_context` to obtain a context +object. Context objects have the same API as the multiprocessing +module, and allow one to use multiple start methods in the same +program. :: + + import multiprocessing as mp + + def foo(q): + q.put('hello') + + if __name__ == '__main__': + ctx = mp.get_context('spawn') + q = ctx.Queue() + p = ctx.Process(target=foo, args=(q,)) + p.start() + print(q.get()) + p.join() + +Note that objects related to one context may not be compatible with +processes for a different context. In particular, locks created using +the *fork* context cannot be passed to a processes started using the +*spawn* or *forkserver* start methods. + +A library which wants to use a particular start method should probably +use :func:`get_context` to avoid interfering with the choice of the +library user. Exchanging objects between processes @@ -859,11 +887,30 @@ .. versionadded:: 3.4 -.. function:: get_start_method() - - Return the current start method. This can be ``'fork'``, - ``'spawn'`` or ``'forkserver'``. ``'fork'`` is the default on - Unix, while ``'spawn'`` is the default on Windows. +.. function:: get_context(method=None) + + Return a context object which has the same attributes as the + :mod:`multiprocessing` module. + + If *method* is *None* then the default context is returned. + Otherwise *method* should be ``'fork'``, ``'spawn'``, + ``'forkserver'``. :exc:`ValueError` is raised if the specified + start method is not available. + + .. versionadded:: 3.4 + +.. function:: get_start_method(allow_none=False) + + Return the name of start method used for starting processes. + + If the start method has not been fixed and *allow_none* is false, + then the start method is fixed to the default and the name is + returned. If the start method has not been fixed and *allow_none* + is true then *None* is returned. + + The return value can be ``'fork'``, ``'spawn'``, ``'forkserver'`` + or *None*. ``'fork'`` is the default on Unix, while ``'spawn'`` is + the default on Windows. .. versionadded:: 3.4 @@ -1785,7 +1832,7 @@ One can create a pool of processes which will carry out tasks submitted to it with the :class:`Pool` class. -.. class:: Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) +.. class:: Pool([processes[, initializer[, initargs[, maxtasksperchild [, context]]]]]) A process pool object which controls a pool of worker processes to which jobs can be submitted. It supports asynchronous results with timeouts and @@ -1805,6 +1852,13 @@ unused resources to be freed. The default *maxtasksperchild* is None, which means worker processes will live as long as the pool. + .. versionadded:: 3.4 + *context* can be used to specify the context used for starting + the worker processes. Usually a pool is created using the + function :func:`multiprocessing.Pool` or the :meth:`Pool` method + of a context object. In both cases *context* is set + appropriately. + .. note:: Worker processes within a :class:`Pool` typically live for the complete diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -12,27 +12,16 @@ # Licensed to PSF under a Contributor Agreement. # -__version__ = '0.70a1' - -__all__ = [ - 'Process', 'current_process', 'active_children', 'freeze_support', - 'Manager', 'Pipe', 'cpu_count', 'log_to_stderr', 'get_logger', - 'allow_connection_pickling', 'BufferTooShort', 'TimeoutError', - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', - 'Event', 'Barrier', 'Queue', 'SimpleQueue', 'JoinableQueue', 'Pool', - 'Value', 'Array', 'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING', - 'set_executable', 'set_start_method', 'get_start_method', - 'get_all_start_methods', 'set_forkserver_preload' - ] +import sys +from . import context # -# Imports +# Copy stuff from default context # -import os -import sys - -from .process import Process, current_process, active_children +globals().update((name, getattr(context._default_context, name)) + for name in context._default_context.__all__) +__all__ = context._default_context.__all__ # # XXX These should not really be documented or public. @@ -47,240 +36,3 @@ if '__main__' in sys.modules: sys.modules['__mp_main__'] = sys.modules['__main__'] - -# -# Exceptions -# - -class ProcessError(Exception): - pass - -class BufferTooShort(ProcessError): - pass - -class TimeoutError(ProcessError): - pass - -class AuthenticationError(ProcessError): - pass - -# -# Definitions not depending on native semaphores -# - -def Manager(): - ''' - Returns a manager associated with a running server process - - The managers methods such as `Lock()`, `Condition()` and `Queue()` - can be used to create shared objects. - ''' - from .managers import SyncManager - m = SyncManager() - m.start() - return m - -def Pipe(duplex=True): - ''' - Returns two connection object connected by a pipe - ''' - from .connection import Pipe - return Pipe(duplex) - -def cpu_count(): - ''' - Returns the number of CPUs in the system - ''' - num = os.cpu_count() - if num is None: - raise NotImplementedError('cannot determine number of cpus') - else: - return num - -def freeze_support(): - ''' - Check whether this is a fake forked process in a frozen executable. - If so then run code specified by commandline and exit. - ''' - if sys.platform == 'win32' and getattr(sys, 'frozen', False): - from .spawn import freeze_support - freeze_support() - -def get_logger(): - ''' - Return package logger -- if it does not already exist then it is created - ''' - from .util import get_logger - return get_logger() - -def log_to_stderr(level=None): - ''' - Turn on logging and add a handler which prints to stderr - ''' - from .util import log_to_stderr - return log_to_stderr(level) - -def allow_connection_pickling(): - ''' - Install support for sending connections and sockets between processes - ''' - # This is undocumented. In previous versions of multiprocessing - # its only effect was to make socket objects inheritable on Windows. - from . import connection - -# -# Definitions depending on native semaphores -# - -def Lock(): - ''' - Returns a non-recursive lock object - ''' - from .synchronize import Lock - return Lock() - -def RLock(): - ''' - Returns a recursive lock object - ''' - from .synchronize import RLock - return RLock() - -def Condition(lock=None): - ''' - Returns a condition object - ''' - from .synchronize import Condition - return Condition(lock) - -def Semaphore(value=1): - ''' - Returns a semaphore object - ''' - from .synchronize import Semaphore - return Semaphore(value) - -def BoundedSemaphore(value=1): - ''' - Returns a bounded semaphore object - ''' - from .synchronize import BoundedSemaphore - return BoundedSemaphore(value) - -def Event(): - ''' - Returns an event object - ''' - from .synchronize import Event - return Event() - -def Barrier(parties, action=None, timeout=None): - ''' - Returns a barrier object - ''' - from .synchronize import Barrier - return Barrier(parties, action, timeout) - -def Queue(maxsize=0): - ''' - Returns a queue object - ''' - from .queues import Queue - return Queue(maxsize) - -def JoinableQueue(maxsize=0): - ''' - Returns a queue object - ''' - from .queues import JoinableQueue - return JoinableQueue(maxsize) - -def SimpleQueue(): - ''' - Returns a queue object - ''' - from .queues import SimpleQueue - return SimpleQueue() - -def Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None): - ''' - Returns a process pool object - ''' - from .pool import Pool - return Pool(processes, initializer, initargs, maxtasksperchild) - -def RawValue(typecode_or_type, *args): - ''' - Returns a shared object - ''' - from .sharedctypes import RawValue - return RawValue(typecode_or_type, *args) - -def RawArray(typecode_or_type, size_or_initializer): - ''' - Returns a shared array - ''' - from .sharedctypes import RawArray - return RawArray(typecode_or_type, size_or_initializer) - -def Value(typecode_or_type, *args, lock=True): - ''' - Returns a synchronized shared object - ''' - from .sharedctypes import Value - return Value(typecode_or_type, *args, lock=lock) - -def Array(typecode_or_type, size_or_initializer, *, lock=True): - ''' - Returns a synchronized shared array - ''' - from .sharedctypes import Array - return Array(typecode_or_type, size_or_initializer, lock=lock) - -# -# -# - -def set_executable(executable): - ''' - Sets the path to a python.exe or pythonw.exe binary used to run - child processes instead of sys.executable when using the 'spawn' - start method. Useful for people embedding Python. - ''' - from .spawn import set_executable - set_executable(executable) - -def set_start_method(method): - ''' - Set method for starting processes: 'fork', 'spawn' or 'forkserver'. - ''' - from .popen import set_start_method - set_start_method(method) - -def get_start_method(): - ''' - Get method for starting processes: 'fork', 'spawn' or 'forkserver'. - ''' - from .popen import get_start_method - return get_start_method() - -def get_all_start_methods(): - ''' - Get list of availables start methods, default first. - ''' - from .popen import get_all_start_methods - return get_all_start_methods() - -def set_forkserver_preload(module_names): - ''' - Set list of module names to try to load in the forkserver process - when it is started. Properly chosen this can significantly reduce - the cost of starting a new process using the forkserver method. - The default list is ['__main__']. - ''' - try: - from .forkserver import set_forkserver_preload - except ImportError: - pass - else: - set_forkserver_preload(module_names) diff --git a/Lib/multiprocessing/context.py b/Lib/multiprocessing/context.py new file mode 100644 --- /dev/null +++ b/Lib/multiprocessing/context.py @@ -0,0 +1,348 @@ +import os +import sys +import threading + +from . import process + +__all__ = [] # things are copied from here to __init__.py + +# +# Exceptions +# + +class ProcessError(Exception): + pass + +class BufferTooShort(ProcessError): + pass + +class TimeoutError(ProcessError): + pass + +class AuthenticationError(ProcessError): + pass + +# +# Base type for contexts +# + +class BaseContext(object): + + ProcessError = ProcessError + BufferTooShort = BufferTooShort + TimeoutError = TimeoutError + AuthenticationError = AuthenticationError + + current_process = staticmethod(process.current_process) + active_children = staticmethod(process.active_children) + + def cpu_count(self): + '''Returns the number of CPUs in the system''' + num = os.cpu_count() + if num is None: + raise NotImplementedError('cannot determine number of cpus') + else: + return num + + def Manager(self): + '''Returns a manager associated with a running server process + + The managers methods such as `Lock()`, `Condition()` and `Queue()` + can be used to create shared objects. + ''' + from .managers import SyncManager + m = SyncManager(ctx=self.get_context()) + m.start() + return m + + def Pipe(self, duplex=True): + '''Returns two connection object connected by a pipe''' + from .connection import Pipe + return Pipe(duplex) + + def Lock(self): + '''Returns a non-recursive lock object''' + from .synchronize import Lock + return Lock(ctx=self.get_context()) + + def RLock(self): + '''Returns a recursive lock object''' + from .synchronize import RLock + return RLock(ctx=self.get_context()) + + def Condition(self, lock=None): + '''Returns a condition object''' + from .synchronize import Condition + return Condition(lock, ctx=self.get_context()) + + def Semaphore(self, value=1): + '''Returns a semaphore object''' + from .synchronize import Semaphore + return Semaphore(value, ctx=self.get_context()) + + def BoundedSemaphore(self, value=1): + '''Returns a bounded semaphore object''' + from .synchronize import BoundedSemaphore + return BoundedSemaphore(value, ctx=self.get_context()) + + def Event(self): + '''Returns an event object''' + from .synchronize import Event + return Event(ctx=self.get_context()) + + def Barrier(self, parties, action=None, timeout=None): + '''Returns a barrier object''' + from .synchronize import Barrier + return Barrier(parties, action, timeout, ctx=self.get_context()) + + def Queue(self, maxsize=0): + '''Returns a queue object''' + from .queues import Queue + return Queue(maxsize, ctx=self.get_context()) + + def JoinableQueue(self, maxsize=0): + '''Returns a queue object''' + from .queues import JoinableQueue + return JoinableQueue(maxsize, ctx=self.get_context()) + + def SimpleQueue(self): + '''Returns a queue object''' + from .queues import SimpleQueue + return SimpleQueue(ctx=self.get_context()) + + def Pool(self, processes=None, initializer=None, initargs=(), + maxtasksperchild=None): + '''Returns a process pool object''' + from .pool import Pool + return Pool(processes, initializer, initargs, maxtasksperchild, + context=self.get_context()) + + def RawValue(self, typecode_or_type, *args): + '''Returns a shared object''' + from .sharedctypes import RawValue + return RawValue(typecode_or_type, *args) + + def RawArray(self, typecode_or_type, size_or_initializer): + '''Returns a shared array''' + from .sharedctypes import RawArray + return RawArray(typecode_or_type, size_or_initializer) + + def Value(self, typecode_or_type, *args, lock=True): + '''Returns a synchronized shared object''' + from .sharedctypes import Value + return Value(typecode_or_type, *args, lock=lock, + ctx=self.get_context()) + + def Array(self, typecode_or_type, size_or_initializer, *, lock=True): + '''Returns a synchronized shared array''' + from .sharedctypes import Array + return Array(typecode_or_type, size_or_initializer, lock=lock, + ctx=self.get_context()) + + def freeze_support(self): + '''Check whether this is a fake forked process in a frozen executable. + If so then run code specified by commandline and exit. + ''' + if sys.platform == 'win32' and getattr(sys, 'frozen', False): + from .spawn import freeze_support + freeze_support() + + def get_logger(self): + '''Return package logger -- if it does not already exist then + it is created. + ''' + from .util import get_logger + return get_logger() + + def log_to_stderr(self, level=None): + '''Turn on logging and add a handler which prints to stderr''' + from .util import log_to_stderr + return log_to_stderr(level) + + def allow_connection_pickling(self): + '''Install support for sending connections and sockets + between processes + ''' + # This is undocumented. In previous versions of multiprocessing + # its only effect was to make socket objects inheritable on Windows. + from . import connection + + def set_executable(self, executable): + '''Sets the path to a python.exe or pythonw.exe binary used to run + child processes instead of sys.executable when using the 'spawn' + start method. Useful for people embedding Python. + ''' + from .spawn import set_executable + set_executable(executable) + + def set_forkserver_preload(self, module_names): + '''Set list of module names to try to load in forkserver process. + This is really just a hint. + ''' + from .forkserver import set_forkserver_preload + set_forkserver_preload(module_names) + + def get_context(self, method=None): + if method is None: + return self + try: + ctx = _concrete_contexts[method] + except KeyError: + raise ValueError('cannot find context for %r' % method) + ctx._check_available() + return ctx + + def get_start_method(self, allow_none=False): + return self._name + + def set_start_method(self, method=None): + raise ValueError('cannot set start method of concrete context') + + def _check_available(self): + pass + +# +# Type of default context -- underlying context can be set at most once +# + +class Process(process.BaseProcess): + _start_method = None + @staticmethod + def _Popen(process_obj): + return _default_context.get_context().Process._Popen(process_obj) + +class DefaultContext(BaseContext): + Process = Process + + def __init__(self, context): + self._default_context = context + self._actual_context = None + + def get_context(self, method=None): + if method is None: + if self._actual_context is None: + self._actual_context = self._default_context + return self._actual_context + else: + return super().get_context(method) + + def set_start_method(self, method, force=False): + if self._actual_context is not None and not force: + raise RuntimeError('context has already been set') + if method is None and force: + self._actual_context = None + return + self._actual_context = self.get_context(method) + + def get_start_method(self, allow_none=False): + if self._actual_context is None: + if allow_none: + return None + self._actual_context = self._default_context + return self._actual_context._name + + def get_all_start_methods(self): + if sys.platform == 'win32': + return ['spawn'] + else: + from . import reduction + if reduction.HAVE_SEND_HANDLE: + return ['fork', 'spawn', 'forkserver'] + else: + return ['fork', 'spawn'] + +DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_') + +# +# Context types for fixed start method +# + +if sys.platform != 'win32': + + class ForkProcess(process.BaseProcess): + _start_method = 'fork' + @staticmethod + def _Popen(process_obj): + from .popen_fork import Popen + return Popen(process_obj) + + class SpawnProcess(process.BaseProcess): + _start_method = 'spawn' + @staticmethod + def _Popen(process_obj): + from .popen_spawn_posix import Popen + return Popen(process_obj) + + class ForkServerProcess(process.BaseProcess): + _start_method = 'forkserver' + @staticmethod + def _Popen(process_obj): + from .popen_forkserver import Popen + return Popen(process_obj) + + class ForkContext(BaseContext): + _name = 'fork' + Process = ForkProcess + + class SpawnContext(BaseContext): + _name = 'spawn' + Process = SpawnProcess + + class ForkServerContext(BaseContext): + _name = 'forkserver' + Process = ForkServerProcess + def _check_available(self): + from . import reduction + if not reduction.HAVE_SEND_HANDLE: + raise ValueError('forkserver start method not available') + + _concrete_contexts = { + 'fork': ForkContext(), + 'spawn': SpawnContext(), + 'forkserver': ForkServerContext(), + } + _default_context = DefaultContext(_concrete_contexts['fork']) + +else: + + class SpawnProcess(process.BaseProcess): + _start_method = 'spawn' + @staticmethod + def _Popen(process_obj): + from .popen_spawn_win32 import Popen + return Popen(process_obj) + + class SpawnContext(BaseContext): + _name = 'spawn' + Process = SpawnProcess + + _concrete_contexts = { + 'spawn': SpawnContext(), + } + _default_context = DefaultContext(_concrete_contexts['spawn']) + +# +# Force the start method +# + +def _force_start_method(method): + _default_context._actual_context = _concrete_contexts[method] + +# +# Check that the current thread is spawning a child process +# + +_tls = threading.local() + +def get_spawning_popen(): + return getattr(_tls, 'spawning_popen', None) + +def set_spawning_popen(popen): + _tls.spawning_popen = popen + +def assert_spawning(obj): + if get_spawning_popen() is None: + raise RuntimeError( + '%s objects should only be shared between processes' + ' through inheritance' % type(obj).__name__ + ) diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -24,105 +24,113 @@ MAXFDS_TO_SEND = 256 UNSIGNED_STRUCT = struct.Struct('Q') # large enough for pid_t -_forkserver_address = None -_forkserver_alive_fd = None -_inherited_fds = None -_lock = threading.Lock() -_preload_modules = ['__main__'] +# +# Forkserver class +# + +class ForkServer(object): + + def __init__(self): + self._forkserver_address = None + self._forkserver_alive_fd = None + self._inherited_fds = None + self._lock = threading.Lock() + self._preload_modules = ['__main__'] + + def set_forkserver_preload(self, modules_names): + '''Set list of module names to try to load in forkserver process.''' + if not all(type(mod) is str for mod in self._preload_modules): + raise TypeError('module_names must be a list of strings') + self._preload_modules = modules_names + + def get_inherited_fds(self): + '''Return list of fds inherited from parent process. + + This returns None if the current process was not started by fork + server. + ''' + return self._inherited_fds + + def connect_to_new_process(self, fds): + '''Request forkserver to create a child process. + + Returns a pair of fds (status_r, data_w). The calling process can read + the child process's pid and (eventually) its returncode from status_r. + The calling process should write to data_w the pickled preparation and + process data. + ''' + self.ensure_running() + if len(fds) + 4 >= MAXFDS_TO_SEND: + raise ValueError('too many fds') + with socket.socket(socket.AF_UNIX) as client: + client.connect(self._forkserver_address) + parent_r, child_w = os.pipe() + child_r, parent_w = os.pipe() + allfds = [child_r, child_w, self._forkserver_alive_fd, + semaphore_tracker.getfd()] + allfds += fds + try: + reduction.sendfds(client, allfds) + return parent_r, parent_w + except: + os.close(parent_r) + os.close(parent_w) + raise + finally: + os.close(child_r) + os.close(child_w) + + def ensure_running(self): + '''Make sure that a fork server is running. + + This can be called from any process. Note that usually a child + process will just reuse the forkserver started by its parent, so + ensure_running() will do nothing. + ''' + with self._lock: + semaphore_tracker.ensure_running() + if self._forkserver_alive_fd is not None: + return + + cmd = ('from multiprocessing.forkserver import main; ' + + 'main(%d, %d, %r, **%r)') + + if self._preload_modules: + desired_keys = {'main_path', 'sys_path'} + data = spawn.get_preparation_data('ignore') + data = dict((x,y) for (x,y) in data.items() + if x in desired_keys) + else: + data = {} + + with socket.socket(socket.AF_UNIX) as listener: + address = connection.arbitrary_address('AF_UNIX') + listener.bind(address) + os.chmod(address, 0o600) + listener.listen(100) + + # all client processes own the write end of the "alive" pipe; + # when they all terminate the read end becomes ready. + alive_r, alive_w = os.pipe() + try: + fds_to_pass = [listener.fileno(), alive_r] + cmd %= (listener.fileno(), alive_r, self._preload_modules, + data) + exe = spawn.get_executable() + args = [exe] + util._args_from_interpreter_flags() + args += ['-c', cmd] + pid = util.spawnv_passfds(exe, args, fds_to_pass) + except: + os.close(alive_w) + raise + finally: + os.close(alive_r) + self._forkserver_address = address + self._forkserver_alive_fd = alive_w # -# Public function # - -def set_forkserver_preload(modules_names): - '''Set list of module names to try to load in forkserver process.''' - global _preload_modules - _preload_modules = modules_names - - -def get_inherited_fds(): - '''Return list of fds inherited from parent process. - - This returns None if the current process was not started by fork server. - ''' - return _inherited_fds - - -def connect_to_new_process(fds): - '''Request forkserver to create a child process. - - Returns a pair of fds (status_r, data_w). The calling process can read - the child process's pid and (eventually) its returncode from status_r. - The calling process should write to data_w the pickled preparation and - process data. - ''' - if len(fds) + 4 >= MAXFDS_TO_SEND: - raise ValueError('too many fds') - with socket.socket(socket.AF_UNIX) as client: - client.connect(_forkserver_address) - parent_r, child_w = os.pipe() - child_r, parent_w = os.pipe() - allfds = [child_r, child_w, _forkserver_alive_fd, - semaphore_tracker._semaphore_tracker_fd] - allfds += fds - try: - reduction.sendfds(client, allfds) - return parent_r, parent_w - except: - os.close(parent_r) - os.close(parent_w) - raise - finally: - os.close(child_r) - os.close(child_w) - - -def ensure_running(): - '''Make sure that a fork server is running. - - This can be called from any process. Note that usually a child - process will just reuse the forkserver started by its parent, so - ensure_running() will do nothing. - ''' - global _forkserver_address, _forkserver_alive_fd - with _lock: - if _forkserver_alive_fd is not None: - return - - assert all(type(mod) is str for mod in _preload_modules) - cmd = ('from multiprocessing.forkserver import main; ' + - 'main(%d, %d, %r, **%r)') - - if _preload_modules: - desired_keys = {'main_path', 'sys_path'} - data = spawn.get_preparation_data('ignore') - data = dict((x,y) for (x,y) in data.items() if x in desired_keys) - else: - data = {} - - with socket.socket(socket.AF_UNIX) as listener: - address = connection.arbitrary_address('AF_UNIX') - listener.bind(address) - os.chmod(address, 0o600) - listener.listen(100) - - # all client processes own the write end of the "alive" pipe; - # when they all terminate the read end becomes ready. - alive_r, alive_w = os.pipe() - try: - fds_to_pass = [listener.fileno(), alive_r] - cmd %= (listener.fileno(), alive_r, _preload_modules, data) - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() + ['-c', cmd] - pid = util.spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(alive_w) - raise - finally: - os.close(alive_r) - _forkserver_address = address - _forkserver_alive_fd = alive_w - +# def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): '''Run forkserver.''' @@ -151,8 +159,7 @@ handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ selectors.DefaultSelector() as selector: - global _forkserver_address - _forkserver_address = listener.getsockname() + _forkserver._forkserver_address = listener.getsockname() selector.register(listener, selectors.EVENT_READ) selector.register(alive_r, selectors.EVENT_READ) @@ -187,13 +194,7 @@ if e.errno != errno.ECONNABORTED: raise -# -# Code to bootstrap new process -# - def _serve_one(s, listener, alive_r, handler): - global _inherited_fds, _forkserver_alive_fd - # close unnecessary stuff and reset SIGCHLD handler listener.close() os.close(alive_r) @@ -203,8 +204,9 @@ fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) s.close() assert len(fds) <= MAXFDS_TO_SEND - child_r, child_w, _forkserver_alive_fd, stfd, *_inherited_fds = fds - semaphore_tracker._semaphore_tracker_fd = stfd + (child_r, child_w, _forkserver._forkserver_alive_fd, + stfd, *_forkserver._inherited_fds) = fds + semaphore_tracker._semaphore_tracker._fd = stfd # send pid to client processes write_unsigned(child_w, os.getpid()) @@ -253,3 +255,13 @@ if nbytes == 0: raise RuntimeError('should not get here') msg = msg[nbytes:] + +# +# +# + +_forkserver = ForkServer() +ensure_running = _forkserver.ensure_running +get_inherited_fds = _forkserver.get_inherited_fds +connect_to_new_process = _forkserver.connect_to_new_process +set_forkserver_preload = _forkserver.set_forkserver_preload diff --git a/Lib/multiprocessing/heap.py b/Lib/multiprocessing/heap.py --- a/Lib/multiprocessing/heap.py +++ b/Lib/multiprocessing/heap.py @@ -16,7 +16,7 @@ import threading import _multiprocessing -from . import popen +from . import context from . import reduction from . import util @@ -50,7 +50,7 @@ self._state = (self.size, self.name) def __getstate__(self): - popen.assert_spawning(self) + context.assert_spawning(self) return self._state def __setstate__(self, state): diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -23,11 +23,12 @@ from traceback import format_exc from . import connection +from . import context from . import pool from . import process -from . import popen from . import reduction from . import util +from . import get_context # # Register some things for pickling @@ -438,7 +439,8 @@ _registry = {} _Server = Server - def __init__(self, address=None, authkey=None, serializer='pickle'): + def __init__(self, address=None, authkey=None, serializer='pickle', + ctx=None): if authkey is None: authkey = process.current_process().authkey self._address = address # XXX not final address if eg ('', 0) @@ -447,6 +449,7 @@ self._state.value = State.INITIAL self._serializer = serializer self._Listener, self._Client = listener_client[serializer] + self._ctx = ctx or get_context() def get_server(self): ''' @@ -478,7 +481,7 @@ reader, writer = connection.Pipe(duplex=False) # spawn process which runs a server - self._process = process.Process( + self._process = self._ctx.Process( target=type(self)._run_server, args=(self._registry, self._address, self._authkey, self._serializer, writer, initializer, initargs), @@ -800,7 +803,7 @@ def __reduce__(self): kwds = {} - if popen.get_spawning_popen() is not None: + if context.get_spawning_popen() is not None: kwds['authkey'] = self._authkey if getattr(self, '_isauto', False): diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -24,7 +24,7 @@ # If threading is available then ThreadPool should be provided. Therefore # we avoid top-level imports which are liable to fail on some systems. from . import util -from . import Process, cpu_count, TimeoutError, SimpleQueue +from . import get_context, cpu_count, TimeoutError # # Constants representing the state of a pool @@ -137,10 +137,12 @@ ''' Class which supports an async version of applying functions to arguments. ''' - Process = Process + def Process(self, *args, **kwds): + return self._ctx.Process(*args, **kwds) def __init__(self, processes=None, initializer=None, initargs=(), - maxtasksperchild=None): + maxtasksperchild=None, context=None): + self._ctx = context or get_context() self._setup_queues() self._taskqueue = queue.Queue() self._cache = {} @@ -232,8 +234,8 @@ self._repopulate_pool() def _setup_queues(self): - self._inqueue = SimpleQueue() - self._outqueue = SimpleQueue() + self._inqueue = self._ctx.SimpleQueue() + self._outqueue = self._ctx.SimpleQueue() self._quick_put = self._inqueue._writer.send self._quick_get = self._outqueue._reader.recv diff --git a/Lib/multiprocessing/popen.py b/Lib/multiprocessing/popen.py deleted file mode 100644 --- a/Lib/multiprocessing/popen.py +++ /dev/null @@ -1,78 +0,0 @@ -import sys -import threading - -__all__ = ['Popen', 'get_spawning_popen', 'set_spawning_popen', - 'assert_spawning'] - -# -# Check that the current thread is spawning a child process -# - -_tls = threading.local() - -def get_spawning_popen(): - return getattr(_tls, 'spawning_popen', None) - -def set_spawning_popen(popen): - _tls.spawning_popen = popen - -def assert_spawning(obj): - if get_spawning_popen() is None: - raise RuntimeError( - '%s objects should only be shared between processes' - ' through inheritance' % type(obj).__name__ - ) - -# -# -# - -_Popen = None - -def Popen(process_obj): - if _Popen is None: - set_start_method() - return _Popen(process_obj) - -def get_start_method(): - if _Popen is None: - set_start_method() - return _Popen.method - -def set_start_method(meth=None, *, start_helpers=True): - global _Popen - try: - modname = _method_to_module[meth] - __import__(modname) - except (KeyError, ImportError): - raise ValueError('could not use start method %r' % meth) - module = sys.modules[modname] - if start_helpers: - module.Popen.ensure_helpers_running() - _Popen = module.Popen - - -if sys.platform == 'win32': - - _method_to_module = { - None: 'multiprocessing.popen_spawn_win32', - 'spawn': 'multiprocessing.popen_spawn_win32', - } - - def get_all_start_methods(): - return ['spawn'] - -else: - _method_to_module = { - None: 'multiprocessing.popen_fork', - 'fork': 'multiprocessing.popen_fork', - 'spawn': 'multiprocessing.popen_spawn_posix', - 'forkserver': 'multiprocessing.popen_forkserver', - } - - def get_all_start_methods(): - from . import reduction - if reduction.HAVE_SEND_HANDLE: - return ['fork', 'spawn', 'forkserver'] - else: - return ['fork', 'spawn'] diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -81,7 +81,3 @@ os.close(child_w) util.Finalize(self, os.close, (parent_r,)) self.sentinel = parent_r - - @staticmethod - def ensure_helpers_running(): - pass diff --git a/Lib/multiprocessing/popen_forkserver.py b/Lib/multiprocessing/popen_forkserver.py --- a/Lib/multiprocessing/popen_forkserver.py +++ b/Lib/multiprocessing/popen_forkserver.py @@ -4,8 +4,8 @@ from . import reduction if not reduction.HAVE_SEND_HANDLE: raise ImportError('No support for sending fds between processes') +from . import context from . import forkserver -from . import popen from . import popen_fork from . import spawn from . import util @@ -42,12 +42,12 @@ def _launch(self, process_obj): prep_data = spawn.get_preparation_data(process_obj._name) buf = io.BytesIO() - popen.set_spawning_popen(self) + context.set_spawning_popen(self) try: reduction.dump(prep_data, buf) reduction.dump(process_obj, buf) finally: - popen.set_spawning_popen(None) + context.set_spawning_popen(None) self.sentinel, w = forkserver.connect_to_new_process(self._fds) util.Finalize(self, os.close, (self.sentinel,)) @@ -67,9 +67,3 @@ # The process ended abnormally perhaps because of a signal self.returncode = 255 return self.returncode - - @staticmethod - def ensure_helpers_running(): - from . import semaphore_tracker - semaphore_tracker.ensure_running() - forkserver.ensure_running() diff --git a/Lib/multiprocessing/popen_spawn_posix.py b/Lib/multiprocessing/popen_spawn_posix.py --- a/Lib/multiprocessing/popen_spawn_posix.py +++ b/Lib/multiprocessing/popen_spawn_posix.py @@ -2,7 +2,7 @@ import io import os -from . import popen +from . import context from . import popen_fork from . import reduction from . import spawn @@ -41,16 +41,16 @@ def _launch(self, process_obj): from . import semaphore_tracker - tracker_fd = semaphore_tracker._semaphore_tracker_fd + tracker_fd = semaphore_tracker.getfd() self._fds.append(tracker_fd) prep_data = spawn.get_preparation_data(process_obj._name) fp = io.BytesIO() - popen.set_spawning_popen(self) + context.set_spawning_popen(self) try: reduction.dump(prep_data, fp) reduction.dump(process_obj, fp) finally: - popen.set_spawning_popen(None) + context.set_spawning_popen(None) parent_r = child_w = child_r = parent_w = None try: @@ -70,8 +70,3 @@ for fd in (child_r, child_w, parent_w): if fd is not None: os.close(fd) - - @staticmethod - def ensure_helpers_running(): - from . import semaphore_tracker - semaphore_tracker.ensure_running() diff --git a/Lib/multiprocessing/popen_spawn_win32.py b/Lib/multiprocessing/popen_spawn_win32.py --- a/Lib/multiprocessing/popen_spawn_win32.py +++ b/Lib/multiprocessing/popen_spawn_win32.py @@ -4,8 +4,8 @@ import sys import _winapi +from . import context from . import spawn -from . import popen from . import reduction from . import util @@ -60,15 +60,15 @@ util.Finalize(self, _winapi.CloseHandle, (self.sentinel,)) # send information to child - popen.set_spawning_popen(self) + context.set_spawning_popen(self) try: reduction.dump(prep_data, to_child) reduction.dump(process_obj, to_child) finally: - popen.set_spawning_popen(None) + context.set_spawning_popen(None) def duplicate_for_child(self, handle): - assert self is popen.get_spawning_popen() + assert self is context.get_spawning_popen() return reduction.duplicate(handle, self.sentinel) def wait(self, timeout=None): @@ -97,7 +97,3 @@ except OSError: if self.wait(timeout=1.0) is None: raise - - @staticmethod - def ensure_helpers_running(): - pass diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -7,7 +7,7 @@ # Licensed to PSF under a Contributor Agreement. # -__all__ = ['Process', 'current_process', 'active_children'] +__all__ = ['BaseProcess', 'current_process', 'active_children'] # # Imports @@ -59,13 +59,14 @@ # The `Process` class # -class Process(object): +class BaseProcess(object): ''' Process objects represent activity that is run in a separate process The class is analogous to `threading.Thread` ''' - _Popen = None + def _Popen(self): + raise NotImplementedError def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None): @@ -101,11 +102,7 @@ assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children' _cleanup() - if self._Popen is not None: - Popen = self._Popen - else: - from .popen import Popen - self._popen = Popen(self) + self._popen = self._Popen(self) self._sentinel = self._popen.sentinel _children.add(self) @@ -229,10 +226,12 @@ ## def _bootstrap(self): - from . import util + from . import util, context global _current_process, _process_counter, _children try: + if self._start_method is not None: + context._force_start_method(self._start_method) _process_counter = itertools.count(1) _children = set() if sys.stdin is not None: @@ -282,7 +281,7 @@ class AuthenticationString(bytes): def __reduce__(self): - from .popen import get_spawning_popen + from .context import get_spawning_popen if get_spawning_popen() is None: raise TypeError( 'Pickling an AuthenticationString object is ' @@ -294,7 +293,7 @@ # Create object representing the main process # -class _MainProcess(Process): +class _MainProcess(BaseProcess): def __init__(self): self._identity = () diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -22,8 +22,7 @@ import _multiprocessing from . import connection -from . import popen -from . import synchronize +from . import context from .util import debug, info, Finalize, register_after_fork, is_exiting from .reduction import ForkingPickler @@ -34,18 +33,18 @@ class Queue(object): - def __init__(self, maxsize=0): + def __init__(self, maxsize=0, *, ctx): if maxsize <= 0: maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX self._maxsize = maxsize self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = synchronize.Lock() + self._rlock = ctx.Lock() self._opid = os.getpid() if sys.platform == 'win32': self._wlock = None else: - self._wlock = synchronize.Lock() - self._sem = synchronize.BoundedSemaphore(maxsize) + self._wlock = ctx.Lock() + self._sem = ctx.BoundedSemaphore(maxsize) # For use by concurrent.futures self._ignore_epipe = False @@ -55,7 +54,7 @@ register_after_fork(self, Queue._after_fork) def __getstate__(self): - popen.assert_spawning(self) + context.assert_spawning(self) return (self._ignore_epipe, self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) @@ -279,10 +278,10 @@ class JoinableQueue(Queue): - def __init__(self, maxsize=0): - Queue.__init__(self, maxsize) - self._unfinished_tasks = synchronize.Semaphore(0) - self._cond = synchronize.Condition() + def __init__(self, maxsize=0, *, ctx): + Queue.__init__(self, maxsize, ctx=ctx) + self._unfinished_tasks = ctx.Semaphore(0) + self._cond = ctx.Condition() def __getstate__(self): return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks) @@ -332,20 +331,20 @@ class SimpleQueue(object): - def __init__(self): + def __init__(self, *, ctx): self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = synchronize.Lock() + self._rlock = ctx.Lock() self._poll = self._reader.poll if sys.platform == 'win32': self._wlock = None else: - self._wlock = synchronize.Lock() + self._wlock = ctx.Lock() def empty(self): return not self._poll() def __getstate__(self): - popen.assert_spawning(self) + context.assert_spawning(self) return (self._reader, self._writer, self._rlock, self._wlock) def __setstate__(self, state): diff --git a/Lib/multiprocessing/reduction.py b/Lib/multiprocessing/reduction.py --- a/Lib/multiprocessing/reduction.py +++ b/Lib/multiprocessing/reduction.py @@ -15,7 +15,7 @@ import socket import sys -from . import popen +from . import context from . import util __all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump'] @@ -183,7 +183,7 @@ def DupFd(fd): '''Return a wrapper for an fd.''' - popen_obj = popen.get_spawning_popen() + popen_obj = context.get_spawning_popen() if popen_obj is not None: return popen_obj.DupFd(popen_obj.duplicate_for_child(fd)) elif HAVE_SEND_HANDLE: diff --git a/Lib/multiprocessing/semaphore_tracker.py b/Lib/multiprocessing/semaphore_tracker.py --- a/Lib/multiprocessing/semaphore_tracker.py +++ b/Lib/multiprocessing/semaphore_tracker.py @@ -26,60 +26,70 @@ __all__ = ['ensure_running', 'register', 'unregister'] -_semaphore_tracker_fd = None -_lock = threading.Lock() +class SemaphoreTracker(object): + def __init__(self): + self._lock = threading.Lock() + self._fd = None -def ensure_running(): - '''Make sure that semaphore tracker process is running. + def getfd(self): + self.ensure_running() + return self._fd - This can be run from any process. Usually a child process will use - the semaphore created by its parent.''' - global _semaphore_tracker_fd - with _lock: - if _semaphore_tracker_fd is not None: - return - fds_to_pass = [] - try: - fds_to_pass.append(sys.stderr.fileno()) - except Exception: - pass - cmd = 'from multiprocessing.semaphore_tracker import main; main(%d)' - r, w = os.pipe() - try: - fds_to_pass.append(r) - # process will out live us, so no need to wait on pid - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd % r] - util.spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(w) - raise - else: - _semaphore_tracker_fd = w - finally: - os.close(r) + def ensure_running(self): + '''Make sure that semaphore tracker process is running. + This can be run from any process. Usually a child process will use + the semaphore created by its parent.''' + with self._lock: + if self._fd is not None: + return + fds_to_pass = [] + try: + fds_to_pass.append(sys.stderr.fileno()) + except Exception: + pass + cmd = 'from multiprocessing.semaphore_tracker import main;main(%d)' + r, w = os.pipe() + try: + fds_to_pass.append(r) + # process will out live us, so no need to wait on pid + exe = spawn.get_executable() + args = [exe] + util._args_from_interpreter_flags() + args += ['-c', cmd % r] + util.spawnv_passfds(exe, args, fds_to_pass) + except: + os.close(w) + raise + else: + self._fd = w + finally: + os.close(r) -def register(name): - '''Register name of semaphore with semaphore tracker.''' - _send('REGISTER', name) + def register(self, name): + '''Register name of semaphore with semaphore tracker.''' + self._send('REGISTER', name) + def unregister(self, name): + '''Unregister name of semaphore with semaphore tracker.''' + self._send('UNREGISTER', name) -def unregister(name): - '''Unregister name of semaphore with semaphore tracker.''' - _send('UNREGISTER', name) + def _send(self, cmd, name): + self.ensure_running() + msg = '{0}:{1}\n'.format(cmd, name).encode('ascii') + if len(name) > 512: + # posix guarantees that writes to a pipe of less than PIPE_BUF + # bytes are atomic, and that PIPE_BUF >= 512 + raise ValueError('name too long') + nbytes = os.write(self._fd, msg) + assert nbytes == len(msg) -def _send(cmd, name): - msg = '{0}:{1}\n'.format(cmd, name).encode('ascii') - if len(name) > 512: - # posix guarantees that writes to a pipe of less than PIPE_BUF - # bytes are atomic, and that PIPE_BUF >= 512 - raise ValueError('name too long') - nbytes = os.write(_semaphore_tracker_fd, msg) - assert nbytes == len(msg) +_semaphore_tracker = SemaphoreTracker() +ensure_running = _semaphore_tracker.ensure_running +register = _semaphore_tracker.register +unregister = _semaphore_tracker.unregister +getfd = _semaphore_tracker.getfd def main(fd): diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py --- a/Lib/multiprocessing/sharedctypes.py +++ b/Lib/multiprocessing/sharedctypes.py @@ -11,10 +11,10 @@ import weakref from . import heap +from . import get_context -from .synchronize import RLock +from .context import assert_spawning from .reduction import ForkingPickler -from .popen import assert_spawning __all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized'] @@ -66,7 +66,7 @@ result.__init__(*size_or_initializer) return result -def Value(typecode_or_type, *args, lock=True): +def Value(typecode_or_type, *args, lock=True, ctx=None): ''' Return a synchronization wrapper for a Value ''' @@ -74,12 +74,13 @@ if lock is False: return obj if lock in (True, None): - lock = RLock() + ctx = ctx or get_context() + lock = ctx.RLock() if not hasattr(lock, 'acquire'): raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock) + return synchronized(obj, lock, ctx=ctx) -def Array(typecode_or_type, size_or_initializer, *, lock=True): +def Array(typecode_or_type, size_or_initializer, *, lock=True, ctx=None): ''' Return a synchronization wrapper for a RawArray ''' @@ -87,25 +88,27 @@ if lock is False: return obj if lock in (True, None): - lock = RLock() + ctx = ctx or get_context() + lock = ctx.RLock() if not hasattr(lock, 'acquire'): raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock) + return synchronized(obj, lock, ctx=ctx) def copy(obj): new_obj = _new_value(type(obj)) ctypes.pointer(new_obj)[0] = obj return new_obj -def synchronized(obj, lock=None): +def synchronized(obj, lock=None, ctx=None): assert not isinstance(obj, SynchronizedBase), 'object already synchronized' + ctx = ctx or get_context() if isinstance(obj, ctypes._SimpleCData): - return Synchronized(obj, lock) + return Synchronized(obj, lock, ctx) elif isinstance(obj, ctypes.Array): if obj._type_ is ctypes.c_char: - return SynchronizedString(obj, lock) - return SynchronizedArray(obj, lock) + return SynchronizedString(obj, lock, ctx) + return SynchronizedArray(obj, lock, ctx) else: cls = type(obj) try: @@ -115,7 +118,7 @@ d = dict((name, make_property(name)) for name in names) classname = 'Synchronized' + cls.__name__ scls = class_cache[cls] = type(classname, (SynchronizedBase,), d) - return scls(obj, lock) + return scls(obj, lock, ctx) # # Functions for pickling/unpickling @@ -175,9 +178,13 @@ class SynchronizedBase(object): - def __init__(self, obj, lock=None): + def __init__(self, obj, lock=None, ctx=None): self._obj = obj - self._lock = lock or RLock() + if lock: + self._lock = lock + else: + ctx = ctx or get_context(force=True) + self._lock = ctx.RLock() self.acquire = self._lock.acquire self.release = self._lock.release diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -12,9 +12,9 @@ import pickle import sys +from . import get_start_method, set_start_method from . import process from . import util -from . import popen __all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable', 'get_preparation_data', 'get_command_line', 'import_main_path'] @@ -91,7 +91,7 @@ fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) else: from . import semaphore_tracker - semaphore_tracker._semaphore_tracker_fd = tracker_fd + semaphore_tracker._semaphore_tracker._fd = tracker_fd fd = pipe_handle exitcode = _main(fd) sys.exit(exitcode) @@ -154,7 +154,7 @@ sys_argv=sys.argv, orig_dir=process.ORIGINAL_DIR, dir=os.getcwd(), - start_method=popen.get_start_method(), + start_method=get_start_method(), ) if sys.platform != 'win32' or (not WINEXE and not WINSERVICE): @@ -204,7 +204,7 @@ process.ORIGINAL_DIR = data['orig_dir'] if 'start_method' in data: - popen.set_start_method(data['start_method'], start_helpers=False) + set_start_method(data['start_method']) if 'main_path' in data: import_main_path(data['main_path']) diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -20,7 +20,7 @@ from time import time as _time -from . import popen +from . import context from . import process from . import util @@ -50,14 +50,15 @@ _rand = tempfile._RandomNameSequence() - def __init__(self, kind, value, maxvalue): - unlink_immediately = (sys.platform == 'win32' or - popen.get_start_method() == 'fork') + def __init__(self, kind, value, maxvalue, *, ctx): + ctx = ctx or get_context() + ctx = ctx.get_context() + unlink_now = sys.platform == 'win32' or ctx._name == 'fork' for i in range(100): try: sl = self._semlock = _multiprocessing.SemLock( kind, value, maxvalue, self._make_name(), - unlink_immediately) + unlink_now) except FileExistsError: pass else: @@ -99,10 +100,10 @@ return self._semlock.__exit__(*args) def __getstate__(self): - popen.assert_spawning(self) + context.assert_spawning(self) sl = self._semlock if sys.platform == 'win32': - h = popen.get_spawning_popen().duplicate_for_child(sl.handle) + h = context.get_spawning_popen().duplicate_for_child(sl.handle) else: h = sl.handle return (h, sl.kind, sl.maxvalue, sl.name) @@ -123,8 +124,8 @@ class Semaphore(SemLock): - def __init__(self, value=1): - SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX) + def __init__(self, value=1, *, ctx): + SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx) def get_value(self): return self._semlock._get_value() @@ -142,8 +143,8 @@ class BoundedSemaphore(Semaphore): - def __init__(self, value=1): - SemLock.__init__(self, SEMAPHORE, value, value) + def __init__(self, value=1, *, ctx): + SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx) def __repr__(self): try: @@ -159,8 +160,8 @@ class Lock(SemLock): - def __init__(self): - SemLock.__init__(self, SEMAPHORE, 1, 1) + def __init__(self, *, ctx): + SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx) def __repr__(self): try: @@ -184,8 +185,8 @@ class RLock(SemLock): - def __init__(self): - SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1) + def __init__(self, *, ctx): + SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1, ctx=ctx) def __repr__(self): try: @@ -210,15 +211,15 @@ class Condition(object): - def __init__(self, lock=None): - self._lock = lock or RLock() - self._sleeping_count = Semaphore(0) - self._woken_count = Semaphore(0) - self._wait_semaphore = Semaphore(0) + def __init__(self, lock=None, *, ctx): + self._lock = lock or ctx.RLock() + self._sleeping_count = ctx.Semaphore(0) + self._woken_count = ctx.Semaphore(0) + self._wait_semaphore = ctx.Semaphore(0) self._make_methods() def __getstate__(self): - popen.assert_spawning(self) + context.assert_spawning(self) return (self._lock, self._sleeping_count, self._woken_count, self._wait_semaphore) @@ -332,9 +333,9 @@ class Event(object): - def __init__(self): - self._cond = Condition(Lock()) - self._flag = Semaphore(0) + def __init__(self, *, ctx): + self._cond = ctx.Condition(ctx.Lock()) + self._flag = ctx.Semaphore(0) def is_set(self): self._cond.acquire() @@ -383,11 +384,11 @@ class Barrier(threading.Barrier): - def __init__(self, parties, action=None, timeout=None): + def __init__(self, parties, action=None, timeout=None, *, ctx): import struct from .heap import BufferWrapper wrapper = BufferWrapper(struct.calcsize('i') * 2) - cond = Condition() + cond = ctx.Condition() self.__setstate__((parties, action, timeout, cond, wrapper)) self._state = 0 self._count = 0 diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3555,6 +3555,32 @@ conn.close() class TestStartMethod(unittest.TestCase): + @classmethod + def _check_context(cls, conn): + conn.send(multiprocessing.get_start_method()) + + def check_context(self, ctx): + r, w = ctx.Pipe(duplex=False) + p = ctx.Process(target=self._check_context, args=(w,)) + p.start() + w.close() + child_method = r.recv() + r.close() + p.join() + self.assertEqual(child_method, ctx.get_start_method()) + + def test_context(self): + for method in ('fork', 'spawn', 'forkserver'): + try: + ctx = multiprocessing.get_context(method) + except ValueError: + continue + self.assertEqual(ctx.get_start_method(), method) + self.assertIs(ctx.get_context(), ctx) + self.assertRaises(ValueError, ctx.set_start_method, 'spawn') + self.assertRaises(ValueError, ctx.set_start_method, None) + self.check_context(ctx) + def test_set_get(self): multiprocessing.set_forkserver_preload(PRELOAD) count = 0 @@ -3562,13 +3588,19 @@ try: for method in ('fork', 'spawn', 'forkserver'): try: - multiprocessing.set_start_method(method) + multiprocessing.set_start_method(method, force=True) except ValueError: continue self.assertEqual(multiprocessing.get_start_method(), method) + ctx = multiprocessing.get_context() + self.assertEqual(ctx.get_start_method(), method) + self.assertTrue(type(ctx).__name__.lower().startswith(method)) + self.assertTrue( + ctx.Process.__name__.lower().startswith(method)) + self.check_context(multiprocessing) count += 1 finally: - multiprocessing.set_start_method(old_method) + multiprocessing.set_start_method(old_method, force=True) self.assertGreaterEqual(count, 1) def test_get_all(self): @@ -3753,9 +3785,9 @@ multiprocessing.process._cleanup() dangling[0] = multiprocessing.process._dangling.copy() dangling[1] = threading._dangling.copy() - old_start_method[0] = multiprocessing.get_start_method() + old_start_method[0] = multiprocessing.get_start_method(allow_none=True) try: - multiprocessing.set_start_method(start_method) + multiprocessing.set_start_method(start_method, force=True) except ValueError: raise unittest.SkipTest(start_method + ' start method not supported') @@ -3771,7 +3803,7 @@ multiprocessing.get_logger().setLevel(LOG_LEVEL) def tearDownModule(): - multiprocessing.set_start_method(old_start_method[0]) + multiprocessing.set_start_method(old_start_method[0], force=True) # pause a bit so we don't get warning about dangling threads/processes time.sleep(0.5) multiprocessing.process._cleanup() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 16 18:07:34 2013 From: python-checkins at python.org (richard.oudkerk) Date: Wed, 16 Oct 2013 18:07:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_import_of_SimpleQueue?= =?utf-8?q?=2E?= Message-ID: <3d0JLZ1zRVz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/e2a411a429d6 changeset: 86388:e2a411a429d6 user: Richard Oudkerk date: Wed Oct 16 17:06:22 2013 +0100 summary: Fix import of SimpleQueue. files: Lib/concurrent/futures/process.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -49,8 +49,9 @@ import os from concurrent.futures import _base import queue +from queue import Full import multiprocessing -from multiprocessing.queues import SimpleQueue, Full +from multiprocessing import SimpleQueue from multiprocessing.connection import wait import threading import weakref -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 04:09:36 2013 From: python-checkins at python.org (ethan.furman) Date: Thu, 17 Oct 2013 04:09:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319252=3A_better_t?= =?utf-8?q?est_coverage_for_Enum=2E__Thanks=2C_CliffM?= Message-ID: <3d0YjD3Q9Hz7LjT@mail.python.org> http://hg.python.org/cpython/rev/89f6abc2e115 changeset: 86389:89f6abc2e115 user: Ethan Furman date: Wed Oct 16 19:09:31 2013 -0700 summary: Close #19252: better test coverage for Enum. Thanks, CliffM files: Lib/test/test_enum.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1139,8 +1139,10 @@ green = () blue = () self.assertEqual(list(ColorInAList), [ColorInAList.red, ColorInAList.green, ColorInAList.blue]) - self.assertEqual(ColorInAList.red.value, [1]) - self.assertEqual(ColorInAList([1]), ColorInAList.red) + for enum, value in zip(ColorInAList, range(3)): + value += 1 + self.assertEqual(enum.value, [value]) + self.assertIs(ColorInAList([value]), enum) def test_conflicting_types_resolved_in_new(self): class LabelledIntEnum(int, Enum): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 04:53:29 2013 From: python-checkins at python.org (r.david.murray) Date: Thu, 17 Oct 2013 04:53:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2318891=3A_Complete_new_p?= =?utf-8?q?rovisional_email_API=2E?= Message-ID: <3d0Zgs0ppQz7LjM@mail.python.org> http://hg.python.org/cpython/rev/6d12285e250b changeset: 86390:6d12285e250b user: R David Murray date: Wed Oct 16 22:48:40 2013 -0400 summary: #18891: Complete new provisional email API. This adds EmailMessage and, MIMEPart subclasses of Message with new API methods, and a ContentManager class used by the new methods. Also a new policy setting, content_manager. Patch was reviewed by Stephen J. Turnbull and Serhiy Storchaka, and reflects their feedback. I will ideally add some examples of using the new API to the documentation before the final release. files: Doc/library/email.contentmanager.rst | 427 +++++ Doc/library/email.message.rst | 18 +- Doc/library/email.policy.rst | 34 +- Doc/library/email.rst | 1 + Doc/whatsnew/3.4.rst | 15 + Lib/email/contentmanager.py | 249 +++ Lib/email/message.py | 216 ++- Lib/email/policy.py | 13 + Lib/email/utils.py | 10 +- Lib/test/test_email/__init__.py | 26 +- Lib/test/test_email/test_contentmanager.py | 796 ++++++++++ Lib/test/test_email/test_headerregistry.py | 14 +- Lib/test/test_email/test_message.py | 742 +++++++++- Lib/test/test_email/test_policy.py | 1 + Misc/NEWS | 3 + 15 files changed, 2539 insertions(+), 26 deletions(-) diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst new file mode 100644 --- /dev/null +++ b/Doc/library/email.contentmanager.rst @@ -0,0 +1,427 @@ +:mod:`email.contentmanager`: Managing MIME Content +-------------------------------------------------- + +.. module:: email.contentmanager + :synopsis: Storing and Retrieving Content from MIME Parts + +.. moduleauthor:: R. David Murray +.. sectionauthor:: R. David Murray + + +.. note:: + + The contentmanager module has been included in the standard library on a + :term:`provisional basis `. Backwards incompatible + changes (up to and including removal of the module) may occur if deemed + necessary by the core developers. + +.. versionadded:: 3.4 + as a :term:`provisional module `. + +The :mod:`~email.message` module provides a class that can represent an +arbitrary email message. That basic message model has a useful and flexible +API, but it provides only a lower-level API for interacting with the generic +parts of a message (the headers, generic header parameters, and the payload, +which may be a list of sub-parts). This module provides classes and tools +that provide an enhanced and extensible API for dealing with various specific +types of content, including the ability to retrieve the content of the message +as a specialized object type rather than as a simple bytes object. The module +automatically takes care of the RFC-specified MIME details (required headers +and parameters, etc.) for the certain common content types content properties, +and support for additional types can be added by an application using the +extension mechanisms. + +This module defines the eponymous "Content Manager" classes. The base +:class:`.ContentManager` class defines an API for registering content +management functions which extract data from ``Message`` objects or insert data +and headers into ``Message`` objects, thus providing a way of converting +between ``Message`` objects containing data and other representations of that +data (Python data types, specialized Python objects, external files, etc). The +module also defines one concrete content manager: :data:`raw_data_manager` +converts between MIME content types and ``str`` or ``bytes`` data. It also +provides a convenient API for managing the MIME parameters when inserting +content into ``Message``\ s. It also handles inserting and extracting +``Message`` objects when dealing with the ``message/rfc822`` content type. + +Another part of the enhanced interface is subclasses of +:class:`~email.message.Message` that provide new convenience API functions, +including convenience methods for calling the Content Managers derived from +this module. + +.. note:: + + Although :class:`.EmailMessage` and :class:`.MIMEPart` are currently + documented in this module because of the provisional nature of the code, the + implementation lives in the :mod:`email.message` module. + + +.. class:: EmailMessage(policy=default) + + If *policy* is specified (it must be an instance of a :mod:`~email.policy` + class) use the rules it specifies to udpate and serialize the representation + of the message. If *policy* is not set, use the + :class:`~email.policy.default` policy, which follows the rules of the email + RFCs except for line endings (instead of the RFC mandated ``\r\n``, it uses + the Python standard ``\n`` line endings). For more information see the + :mod:`~email.policy` documentation. + + This class is a subclass of :class:`~email.message.Message`. It adds + the following methods: + + + .. attribute:: is_attachment + + Set to ``True`` if there is a :mailheader:`Content-Disposition` header + and its (case insensitive) value is ``attachment``, ``False`` otherwise. + + + .. method:: get_body(preferencelist=('related', 'html', 'plain')) + + Return the MIME part that is the best candidate to be the "body" of the + message. + + *preferencelist* must be a sequence of strings from the set ``related``, + ``html``, and ``plain``, and indicates the order of preference for the + content type of the part returned. + + Start looking for candidate matches with the object on which the + ``get_body`` method is called. + + If ``related`` is not included in *preferencelist*, consider the root + part (or subpart of the root part) of any related encountered as a + candidate if the (sub-)part matches a preference. + + When encountering a ``multipart/related``, check the ``start`` parameter + and if a part with a matching :mailheader:`Content-ID` is found, consider + only it when looking for candidate matches. Otherwise consider only the + first (default root) part of the ``multipart/related``. + + If a part has a :mailheader:``Content-Disposition`` header, only consider + the part a candidate match if the value of the header is ``inline``. + + If none of the candidates matches any of the preferences in + *preferneclist*, return ``None``. + + Notes: (1) For most applications the only *preferencelist* combinations + that really make sense are ``('plain',)``, ``('html', 'plain')``, and the + default, ``('related', 'html', 'plain')``. (2) Because matching starts + with the object on which ``get_body`` is called, calling ``get_body`` on + a ``multipart/related`` will return the object itself unless + *preferencelist* has a non-default value. (3) Messages (or message parts) + that do not specify a :mailheader:`Content-Type` or whose + :mailheader:`Content-Type` header is invalid will be treated as if they + are of type ``text/plain``, which may occasionally cause ``get_body`` to + return unexpected results. + + + .. method:: iter_attachments() + + Return an iterator over all of the parts of the message that are not + candidate "body" parts. That is, skip the first occurrence of each of + ``text/plain``, ``text/html``, ``multipart/related``, or + ``multipart/alternative`` (unless they are explicitly marked as + attachments via :mailheader:`Content-Disposition: attachment`), and + return all remaining parts. When applied directly to a + ``multipart/related``, return an iterator over the all the related parts + except the root part (ie: the part pointed to by the ``start`` parameter, + or the first part if there is no ``start`` parameter or the ``start`` + parameter doesn't match the :mailheader:`Content-ID` of any of the + parts). When applied directly to a ``multipart/alternative`` or a + non-``multipart``, return an empty iterator. + + + .. method:: iter_parts() + + Return an iterator over all of the immediate sub-parts of the message, + which will be empty for a non-``multipart``. (See also + :meth:``~email.message.walk``.) + + + .. method:: get_content(*args, content_manager=None, **kw) + + Call the ``get_content`` method of the *content_manager*, passing self + as the message object, and passing along any other arguments or keywords + as additional arguments. If *content_manager* is not specified, use + the ``content_manager`` specified by the current :mod:`~email.policy`. + + + .. method:: set_content(*args, content_manager=None, **kw) + + Call the ``set_content`` method of the *content_manager*, passing self + as the message object, and passing along any other arguments or keywords + as additional arguments. If *content_manager* is not specified, use + the ``content_manager`` specified by the current :mod:`~email.policy`. + + + .. method:: make_related(boundary=None) + + Convert a non-``multipart`` message into a ``multipart/related`` message, + moving any existing :mailheader:`Content-` headers and payload into a + (new) first part of the ``multipart``. If *boundary* is specified, use + it as the boundary string in the multipart, otherwise leave the boundary + to be automatically created when it is needed (for example, when the + message is serialized). + + + .. method:: make_alternative(boundary=None) + + Convert a non-``multipart`` or a ``multipart/related`` into a + ``multipart/alternative``, moving any existing :mailheader:`Content-` + headers and payload into a (new) first part of the ``multipart``. If + *boundary* is specified, use it as the boundary string in the multipart, + otherwise leave the boundary to be automatically created when it is + needed (for example, when the message is serialized). + + + .. method:: make_mixed(boundary=None) + + Convert a non-``multipart``, a ``multipart/related``, or a + ``multipart-alternative`` into a ``multipart/mixed``, moving any existing + :mailheader:`Content-` headers and payload into a (new) first part of the + ``multipart``. If *boundary* is specified, use it as the boundary string + in the multipart, otherwise leave the boundary to be automatically + created when it is needed (for example, when the message is serialized). + + + .. method:: add_related(*args, content_manager=None, **kw) + + If the message is a ``multipart/related``, create a new message + object, pass all of the arguments to its :meth:`set_content` method, + and :meth:`~email.message.Message.attach` it to the ``multipart``. If + the message is a non-``multipart``, call :meth:`make_related` and then + proceed as above. If the message is any other type of ``multipart``, + raise a :exc:`TypeError`. If *content_manager* is not specified, use + the ``content_manager`` specified by the current :mod:`~email.policy`. + If the added part has no :mailheader:`Content-Disposition` header, + add one with the value ``inline``. + + + .. method:: add_alternative(*args, content_manager=None, **kw) + + If the message is a ``multipart/alternative``, create a new message + object, pass all of the arguments to its :meth:`set_content` method, and + :meth:`~email.message.Message.attach` it to the ``multipart``. If the + message is a non-``multipart`` or ``multipart/related``, call + :meth:`make_alternative` and then proceed as above. If the message is + any other type of ``multipart``, raise a :exc:`TypeError`. If + *content_manager* is not specified, use the ``content_manager`` specified + by the current :mod:`~email.policy`. + + + .. method:: add_attachment(*args, content_manager=None, **kw) + + If the message is a ``multipart/mixed``, create a new message object, + pass all of the arguments to its :meth:`set_content` method, and + :meth:`~email.message.Message.attach` it to the ``multipart``. If the + message is a non-``multipart``, ``multipart/related``, or + ``multipart/alternative``, call :meth:`make_mixed` and then proceed as + above. If *content_manager* is not specified, use the ``content_manager`` + specified by the current :mod:`~email.policy`. If the added part + has no :mailheader:`Content-Disposition` header, add one with the value + ``attachment``. This method can be used both for explicit attachments + (:mailheader:`Content-Disposition: attachment` and ``inline`` attachments + (:mailheader:`Content-Disposition: inline`), by passing appropriate + options to the ``content_manager``. + + + .. method:: clear() + + Remove the payload and all of the headers. + + + .. method:: clear_content() + + Remove the payload and all of the :exc:`Content-` headers, leaving + all other headers intact and in their original order. + + +.. class:: ContentManager() + + Base class for content managers. Provides the standard registry mechanisms + to register converters between MIME content and other representations, as + well as the ``get_content`` and ``set_content`` dispatch methods. + + + .. method:: get_content(msg, *args, **kw) + + Look up a handler function based on the ``mimetype`` of *msg* (see next + paragraph), call it, passing through all arguments, and return the result + of the call. The expectation is that the handler will extract the + payload from *msg* and return an object that encodes information about + the extracted data. + + To find the handler, look for the following keys in the registry, + stopping with the first one found: + + * the string representing the full MIME type (``maintype/subtype``) + * the string representing the ``maintype`` + * the empty string + + If none of these keys produce a handler, raise a :exc:`KeyError` for the + full MIME type. + + + .. method:: set_content(msg, obj, *args, **kw) + + If the ``maintype`` is ``multipart``, raise a :exc:`TypeError`; otherwise + look up a handler function based on the type of *obj* (see next + paragraph), call :meth:`~email.message.EmailMessage.clear_content` on the + *msg*, and call the handler function, passing through all arguments. The + expectation is that the handler will transform and store *obj* into + *msg*, possibly making other changes to *msg* as well, such as adding + various MIME headers to encode information needed to interpret the stored + data. + + To find the handler, obtain the type of *obj* (``typ = type(obj)``), and + look for the following keys in the registry, stopping with the first one + found: + + * the type itself (``typ``) + * the type's fully qualified name (``typ.__module__ + '.' + + typ.__qualname__``). + * the type's qualname (``typ.__qualname__``) + * the type's name (``typ.__name__``). + + If none of the above match, repeat all of the checks above for each of + the types in the :term:`MRO` (``typ.__mro__``). Finally, if no other key + yields a handler, check for a handler for the key ``None``. If there is + no handler for ``None``, raise a :exc:`KeyError` for the fully + qualified name of the type. + + Also add a :mailheader:`MIME-Version` header if one is not present (see + also :class:`.MIMEPart`). + + + .. method:: add_get_handler(key, handler) + + Record the function *handler* as the handler for *key*. For the possible + values of *key*, see :meth:`get_content`. + + + .. method:: add_set_handler(typekey, handler) + + Record *handler* as the function to call when an object of a type + matching *typekey* is passed to :meth:`set_content`. For the possible + values of *typekey*, see :meth:`set_content`. + + +.. class:: MIMEPart(policy=default) + + This class represents a subpart of a MIME message. It is identical to + :class:`EmailMessage`, except that no :mailheader:`MIME-Version` headers are + added when :meth:`~EmailMessage.set_content` is called, since sub-parts do + not need their own :mailheader:`MIME-Version` headers. + + +Content Manager Instances +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Currently the email package provides only one concrete content manager, +:data:`raw_data_manager`, although more may be added in the future. +:data:`raw_data_manager` is the +:attr:`~email.policy.EmailPolicy.content_manager` provided by +:attr:`~email.policy.EmailPolicy` and its derivatives. + + +.. data:: raw_data_manager + + This content manager provides only a minimum interface beyond that provided + by :class:`~email.message.Message` itself: it deals only with text, raw + byte strings, and :class:`~email.message.Message` objects. Nevertheless, it + provides significant advantages compared to the base API: ``get_content`` on + a text part will return a unicode string without the application needing to + manually decode it, ``set_content`` provides a rich set of options for + controlling the headers added to a part and controlling the content transfer + encoding, and it enables the use of the various ``add_`` methods, thereby + simplifying the creation of multipart messages. + + .. method:: get_content(msg, errors='replace') + + Return the payload of the part as either a string (for ``text`` parts), a + :class:`~email.message.EmailMessage` object (for ``message/rfc822`` + parts), or a ``bytes`` object (for all other non-multipart types). Raise + a :exc:`KeyError` if called on a ``multipart``. If the part is a + ``text`` part and *errors* is specified, use it as the error handler when + decoding the payload to unicode. The default error handler is + ``replace``. + + .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8' \ + cte=None, \ + disposition=None, filename=None, cid=None, \ + params=None, headers=None) + set_content(msg, <'bytes'>, maintype, subtype, cte="base64", \ + disposition=None, filename=None, cid=None, \ + params=None, headers=None) + set_content(msg, <'Message'>, cte=None, \ + disposition=None, filename=None, cid=None, \ + params=None, headers=None) + set_content(msg, <'list'>, subtype='mixed', \ + disposition=None, filename=None, cid=None, \ + params=None, headers=None) + + Add headers and payload to *msg*: + + Add a :mailheader:`Content-Type` header with a ``maintype/subtype`` + value. + + * For ``str``, set the MIME ``maintype`` to ``text``, and set the + subtype to *subtype* if it is specified, or ``plain`` if it is not. + * For ``bytes``, use the specified *maintype* and *subtype*, or + raise a :exc:`TypeError` if they are not specified. + * For :class:`~email.message.Message` objects, set the maintype to + ``message``, and set the subtype to *subtype* if it is specified + or ``rfc822`` if it is not. If *subtype* is ``partial``, raise an + error (``bytes`` objects must be used to construct + ``message/partial`` parts). + * For *<'list'>*, which should be a list of + :class:`~email.message.Message` objects, set the ``maintype`` to + ``multipart``, and the ``subtype`` to *subtype* if it is + specified, and ``mixed`` if it is not. If the message parts in + the *<'list'>* have :mailheader:`MIME-Version` headers, remove + them. + + If *charset* is provided (which is valid only for ``str``), encode the + string to bytes using the specified character set. The default is + ``utf-8``. If the specified *charset* is a known alias for a standard + MIME charset name, use the standard charset instead. + + If *cte* is set, encode the payload using the specified content transfer + encoding, and set the :mailheader:`Content-Transfer-Endcoding` header to + that value. For ``str`` objects, if it is not set use heuristics to + determine the most compact encoding. Possible values for *cte* are + ``quoted-printable``, ``base64``, ``7bit``, ``8bit``, and ``binary``. + If the input cannot be encoded in the specified encoding (eg: ``7bit``), + raise a :exc:`ValueError`. For :class:`~email.message.Message`, per + :rfc:`2046`, raise an error if a *cte* of ``quoted-printable`` or + ``base64`` is requested for *subtype* ``rfc822``, and for any *cte* + other than ``7bit`` for *subtype* ``external-body``. For + ``message/rfc822``, use ``8bit`` if *cte* is not specified. For all + other values of *subtype*, use ``7bit``. + + .. note:: A *cte* of ``binary`` does not actually work correctly yet. + The ``Message`` object as modified by ``set_content`` is correct, but + :class:`~email.generator.BytesGenerator` does not serialize it + correctly. + + If *disposition* is set, use it as the value of the + :mailheader:`Content-Disposition` header. If not specified, and + *filename* is specified, add the header with the value ``attachment``. + If it is not specified and *filename* is also not specified, do not add + the header. The only valid values for *disposition* are ``attachment`` + and ``inline``. + + If *filename* is specified, use it as the value of the ``filename`` + parameter of the :mailheader:`Content-Disposition` header. There is no + default. + + If *cid* is specified, add a :mailheader:`Content-ID` header with + *cid* as its value. + + If *params* is specified, iterate its ``items`` method and use the + resulting ``(key, value)`` pairs to set additional paramters on the + :mailheader:`Content-Type` header. + + If *headers* is specified and is a list of strings of the form + ``headername: headervalue`` or a list of ``header`` objects + (distinguised from strings by having a ``name`` attribute), add the + headers to *msg*. diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -33,10 +33,11 @@ .. class:: Message(policy=compat32) - The *policy* argument determiens the :mod:`~email.policy` that will be used - to update the message model. The default value, :class:`compat32 - ` maintains backward compatibility with the - Python 3.2 version of the email package. For more information see the + If *policy* is specified (it must be an instance of a :mod:`~email.policy` + class) use the rules it specifies to udpate and serialize the representation + of the message. If *policy* is not set, use the :class`compat32 + ` policy, which maintains backward compatibility with + the Python 3.2 version of the email package. For more information see the :mod:`~email.policy` documentation. .. versionchanged:: 3.3 The *policy* keyword argument was added. @@ -465,7 +466,8 @@ to ``False``. - .. method:: set_param(param, value, header='Content-Type', requote=True, charset=None, language='') + .. method:: set_param(param, value, header='Content-Type', requote=True, + charset=None, language='', replace=False) Set a parameter in the :mailheader:`Content-Type` header. If the parameter already exists in the header, its value will be replaced with @@ -482,6 +484,12 @@ language, defaulting to the empty string. Both *charset* and *language* should be strings. + If *replace* is ``False`` (the default) the header is moved to the + end of the list of headers. If *replace* is ``True``, the header + will be updated in place. + + .. versionchanged: 3.4 ``replace`` keyword was added. + .. method:: del_param(param, header='content-type', requote=True) diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -371,7 +371,7 @@ to) :rfc:`5322`, :rfc:`2047`, and the current MIME RFCs. This policy adds new header parsing and folding algorithms. Instead of - simple strings, headers are custom objects with custom attributes depending + simple strings, headers are ``str`` subclasses with attributes that depend on the type of the field. The parsing and folding algorithm fully implement :rfc:`2047` and :rfc:`5322`. @@ -408,6 +408,20 @@ fields are treated as unstructured. This list will be completed before the extension is marked stable.) + .. attribute:: content_manager + + An object with at least two methods: get_content and set_content. When + the :meth:`~email.message.Message.get_content` or + :meth:`~email.message.Message.set_content` method of a + :class:`~email.message.Message` object is called, it calls the + corresponding method of this object, passing it the message object as its + first argument, and any arguments or keywords that were passed to it as + additional arguments. By default ``content_manager`` is set to + :data:`~email.contentmanager.raw_data_manager`. + + .. versionadded 3.4 + + The class provides the following concrete implementations of the abstract methods of :class:`Policy`: @@ -427,7 +441,7 @@ The name is returned unchanged. If the input value has a ``name`` attribute and it matches *name* ignoring case, the value is returned unchanged. Otherwise the *name* and *value* are passed to - ``header_factory``, and the resulting custom header object is returned as + ``header_factory``, and the resulting header object is returned as the value. In this case a ``ValueError`` is raised if the input value contains CR or LF characters. @@ -435,7 +449,7 @@ If the value has a ``name`` attribute, it is returned to unmodified. Otherwise the *name*, and the *value* with any CR or LF characters - removed, are passed to the ``header_factory``, and the resulting custom + removed, are passed to the ``header_factory``, and the resulting header object is returned. Any surrogateescaped bytes get turned into the unicode unknown-character glyph. @@ -445,9 +459,9 @@ A value is considered to be a 'source value' if and only if it does not have a ``name`` attribute (having a ``name`` attribute means it is a header object of some sort). If a source value needs to be refolded - according to the policy, it is converted into a custom header object by + according to the policy, it is converted into a header object by passing the *name* and the *value* with any CR and LF characters removed - to the ``header_factory``. Folding of a custom header object is done by + to the ``header_factory``. Folding of a header object is done by calling its ``fold`` method with the current policy. Source values are split into lines using :meth:`~str.splitlines`. If @@ -502,23 +516,23 @@ the email package is changed from the Python 3.2 API in the following ways: * Setting a header on a :class:`~email.message.Message` results in that - header being parsed and a custom header object created. + header being parsed and a header object created. * Fetching a header value from a :class:`~email.message.Message` results - in that header being parsed and a custom header object created and + in that header being parsed and a header object created and returned. - * Any custom header object, or any header that is refolded due to the + * Any header object, or any header that is refolded due to the policy settings, is folded using an algorithm that fully implements the RFC folding algorithms, including knowing where encoded words are required and allowed. From the application view, this means that any header obtained through the -:class:`~email.message.Message` is a custom header object with custom +:class:`~email.message.Message` is a header object with extra attributes, whose string value is the fully decoded unicode value of the header. Likewise, a header may be assigned a new value, or a new header created, using a unicode string, and the policy will take care of converting the unicode string into the correct RFC encoded form. -The custom header objects and their attributes are described in +The header objects and their attributes are described in :mod:`~email.headerregistry`. diff --git a/Doc/library/email.rst b/Doc/library/email.rst --- a/Doc/library/email.rst +++ b/Doc/library/email.rst @@ -53,6 +53,7 @@ email.generator.rst email.policy.rst email.headerregistry.rst + email.contentmanager.rst email.mime.rst email.header.rst email.charset.rst diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -280,6 +280,21 @@ (Contributed by R. David Murray in :issue:`18600`.) +A pair of new subclasses of :class:`~email.message.Message` have been added, +along with a new sub-module, :mod:`~email.contentmanager`. All documentation +is currently in the new module, which is being added as part of the new +:term:`provisional ` email API. These classes provide a +number of new methods that make extracting content from and inserting content +into email messages much easier. See the :mod:`~email.contentmanager` +documentation for details. + +These API additions complete the bulk of the work that was planned as part of +the email6 project. The currently provisional API is scheduled to become final +in Python 3.5 (possibly with a few minor additions in the area of error +handling). + +(Contributed by R. David Murray in :issue:`18891`.) + functools --------- diff --git a/Lib/email/contentmanager.py b/Lib/email/contentmanager.py new file mode 100644 --- /dev/null +++ b/Lib/email/contentmanager.py @@ -0,0 +1,249 @@ +import binascii +import email.charset +import email.message +import email.errors +from email import quoprimime + +class ContentManager: + + def __init__(self): + self.get_handlers = {} + self.set_handlers = {} + + def add_get_handler(self, key, handler): + self.get_handlers[key] = handler + + def get_content(self, msg, *args, **kw): + content_type = msg.get_content_type() + if content_type in self.get_handlers: + return self.get_handlers[content_type](msg, *args, **kw) + maintype = msg.get_content_maintype() + if maintype in self.get_handlers: + return self.get_handlers[maintype](msg, *args, **kw) + if '' in self.get_handlers: + return self.get_handlers[''](msg, *args, **kw) + raise KeyError(content_type) + + def add_set_handler(self, typekey, handler): + self.set_handlers[typekey] = handler + + def set_content(self, msg, obj, *args, **kw): + if msg.get_content_maintype() == 'multipart': + # XXX: is this error a good idea or not? We can remove it later, + # but we can't add it later, so do it for now. + raise TypeError("set_content not valid on multipart") + handler = self._find_set_handler(msg, obj) + msg.clear_content() + handler(msg, obj, *args, **kw) + + def _find_set_handler(self, msg, obj): + full_path_for_error = None + for typ in type(obj).__mro__: + if typ in self.set_handlers: + return self.set_handlers[typ] + qname = typ.__qualname__ + modname = getattr(typ, '__module__', '') + full_path = '.'.join((modname, qname)) if modname else qname + if full_path_for_error is None: + full_path_for_error = full_path + if full_path in self.set_handlers: + return self.set_handlers[full_path] + if qname in self.set_handlers: + return self.set_handlers[qname] + name = typ.__name__ + if name in self.set_handlers: + return self.set_handlers[name] + if None in self.set_handlers: + return self.set_handlers[None] + raise KeyError(full_path_for_error) + + +raw_data_manager = ContentManager() + + +def get_text_content(msg, errors='replace'): + content = msg.get_payload(decode=True) + charset = msg.get_param('charset', 'ASCII') + return content.decode(charset, errors=errors) +raw_data_manager.add_get_handler('text', get_text_content) + + +def get_non_text_content(msg): + return msg.get_payload(decode=True) +for maintype in 'audio image video application'.split(): + raw_data_manager.add_get_handler(maintype, get_non_text_content) + + +def get_message_content(msg): + return msg.get_payload(0) +for subtype in 'rfc822 external-body'.split(): + raw_data_manager.add_get_handler('message/'+subtype, get_message_content) + + +def get_and_fixup_unknown_message_content(msg): + # If we don't understand a message subtype, we are supposed to treat it as + # if it were application/octet-stream, per + # tools.ietf.org/html/rfc2046#section-5.2.4. Feedparser doesn't do that, + # so do our best to fix things up. Note that it is *not* appropriate to + # model message/partial content as Message objects, so they are handled + # here as well. (How to reassemble them is out of scope for this comment :) + return bytes(msg.get_payload(0)) +raw_data_manager.add_get_handler('message', + get_and_fixup_unknown_message_content) + + +def _prepare_set(msg, maintype, subtype, headers): + msg['Content-Type'] = '/'.join((maintype, subtype)) + if headers: + if not hasattr(headers[0], 'name'): + mp = msg.policy + headers = [mp.header_factory(*mp.header_source_parse([header])) + for header in headers] + try: + for header in headers: + if header.defects: + raise header.defects[0] + msg[header.name] = header + except email.errors.HeaderDefect as exc: + raise ValueError("Invalid header: {}".format( + header.fold(policy=msg.policy))) from exc + + +def _finalize_set(msg, disposition, filename, cid, params): + if disposition is None and filename is not None: + disposition = 'attachment' + if disposition is not None: + msg['Content-Disposition'] = disposition + if filename is not None: + msg.set_param('filename', + filename, + header='Content-Disposition', + replace=True) + if cid is not None: + msg['Content-ID'] = cid + if params is not None: + for key, value in params.items(): + msg.set_param(key, value) + + +# XXX: This is a cleaned-up version of base64mime.body_encode. It would +# be nice to drop both this and quoprimime.body_encode in favor of +# enhanced binascii routines that accepted a max_line_length parameter. +def _encode_base64(data, max_line_length): + encoded_lines = [] + unencoded_bytes_per_line = max_line_length * 3 // 4 + for i in range(0, len(data), unencoded_bytes_per_line): + thisline = data[i:i+unencoded_bytes_per_line] + encoded_lines.append(binascii.b2a_base64(thisline).decode('ascii')) + return ''.join(encoded_lines) + + +def _encode_text(string, charset, cte, policy): + lines = string.encode(charset).splitlines() + linesep = policy.linesep.encode('ascii') + def embeded_body(lines): return linesep.join(lines) + linesep + def normal_body(lines): return b'\n'.join(lines) + b'\n' + if cte==None: + # Use heuristics to decide on the "best" encoding. + try: + return '7bit', normal_body(lines).decode('ascii') + except UnicodeDecodeError: + pass + if (policy.cte_type == '8bit' and + max(len(x) for x in lines) <= policy.max_line_length): + return '8bit', normal_body(lines).decode('ascii', 'surrogateescape') + sniff = embeded_body(lines[:10]) + sniff_qp = quoprimime.body_encode(sniff.decode('latin-1'), + policy.max_line_length) + sniff_base64 = binascii.b2a_base64(sniff) + # This is a little unfair to qp; it includes lineseps, base64 doesn't. + if len(sniff_qp) > len(sniff_base64): + cte = 'base64' + else: + cte = 'quoted-printable' + if len(lines) <= 10: + return cte, sniff_qp + if cte == '7bit': + data = normal_body(lines).decode('ascii') + elif cte == '8bit': + data = normal_body(lines).decode('ascii', 'surrogateescape') + elif cte == 'quoted-printable': + data = quoprimime.body_encode(normal_body(lines).decode('latin-1'), + policy.max_line_length) + elif cte == 'base64': + data = _encode_base64(embeded_body(lines), policy.max_line_length) + else: + raise ValueError("Unknown content transfer encoding {}".format(cte)) + return cte, data + + +def set_text_content(msg, string, subtype="plain", charset='utf-8', cte=None, + disposition=None, filename=None, cid=None, + params=None, headers=None): + _prepare_set(msg, 'text', subtype, headers) + cte, payload = _encode_text(string, charset, cte, msg.policy) + msg.set_payload(payload) + msg.set_param('charset', + email.charset.ALIASES.get(charset, charset), + replace=True) + msg['Content-Transfer-Encoding'] = cte + _finalize_set(msg, disposition, filename, cid, params) +raw_data_manager.add_set_handler(str, set_text_content) + + +def set_message_content(msg, message, subtype="rfc822", cte=None, + disposition=None, filename=None, cid=None, + params=None, headers=None): + if subtype == 'partial': + raise ValueError("message/partial is not supported for Message objects") + if subtype == 'rfc822': + if cte not in (None, '7bit', '8bit', 'binary'): + # http://tools.ietf.org/html/rfc2046#section-5.2.1 mandate. + raise ValueError( + "message/rfc822 parts do not support cte={}".format(cte)) + # 8bit will get coerced on serialization if policy.cte_type='7bit'. We + # may end up claiming 8bit when it isn't needed, but the only negative + # result of that should be a gateway that needs to coerce to 7bit + # having to look through the whole embedded message to discover whether + # or not it actually has to do anything. + cte = '8bit' if cte is None else cte + elif subtype == 'external-body': + if cte not in (None, '7bit'): + # http://tools.ietf.org/html/rfc2046#section-5.2.3 mandate. + raise ValueError( + "message/external-body parts do not support cte={}".format(cte)) + cte = '7bit' + elif cte is None: + # http://tools.ietf.org/html/rfc2046#section-5.2.4 says all future + # subtypes should be restricted to 7bit, so assume that. + cte = '7bit' + _prepare_set(msg, 'message', subtype, headers) + msg.set_payload([message]) + msg['Content-Transfer-Encoding'] = cte + _finalize_set(msg, disposition, filename, cid, params) +raw_data_manager.add_set_handler(email.message.Message, set_message_content) + + +def set_bytes_content(msg, data, maintype, subtype, cte='base64', + disposition=None, filename=None, cid=None, + params=None, headers=None): + _prepare_set(msg, maintype, subtype, headers) + if cte == 'base64': + data = _encode_base64(data, max_line_length=msg.policy.max_line_length) + elif cte == 'quoted-printable': + # XXX: quoprimime.body_encode won't encode newline characters in data, + # so we can't use it. This means max_line_length is ignored. Another + # bug to fix later. (Note: encoders.quopri is broken on line ends.) + data = binascii.b2a_qp(data, istext=False, header=False, quotetabs=True) + data = data.decode('ascii') + elif cte == '7bit': + # Make sure it really is only ASCII. The early warning here seems + # worth the overhead...if you care write your own content manager :). + data.encode('ascii') + elif cte in ('8bit', 'binary'): + data = data.decode('ascii', 'surrogateescape') + msg.set_payload(data) + msg['Content-Transfer-Encoding'] = cte + _finalize_set(msg, disposition, filename, cid, params) +for typ in (bytes, bytearray, memoryview): + raw_data_manager.add_set_handler(typ, set_bytes_content) diff --git a/Lib/email/message.py b/Lib/email/message.py --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -8,8 +8,6 @@ import re import uu -import base64 -import binascii from io import BytesIO, StringIO # Intrapackage imports @@ -679,7 +677,7 @@ return failobj def set_param(self, param, value, header='Content-Type', requote=True, - charset=None, language=''): + charset=None, language='', replace=False): """Set a parameter in the Content-Type header. If the parameter already exists in the header, its value will be @@ -723,8 +721,11 @@ else: ctype = SEMISPACE.join([ctype, append_param]) if ctype != self.get(header): - del self[header] - self[header] = ctype + if replace: + self.replace_header(header, ctype) + else: + del self[header] + self[header] = ctype def del_param(self, param, header='content-type', requote=True): """Remove the given parameter completely from the Content-Type header. @@ -905,3 +906,208 @@ # I.e. def walk(self): ... from email.iterators import walk + + +class MIMEPart(Message): + + def __init__(self, policy=None): + if policy is None: + from email.policy import default + policy = default + Message.__init__(self, policy) + + @property + def is_attachment(self): + c_d = self.get('content-disposition') + if c_d is None: + return False + return c_d.lower() == 'attachment' + + def _find_body(self, part, preferencelist): + if part.is_attachment: + return + maintype, subtype = part.get_content_type().split('/') + if maintype == 'text': + if subtype in preferencelist: + yield (preferencelist.index(subtype), part) + return + if maintype != 'multipart': + return + if subtype != 'related': + for subpart in part.iter_parts(): + yield from self._find_body(subpart, preferencelist) + return + if 'related' in preferencelist: + yield (preferencelist.index('related'), part) + candidate = None + start = part.get_param('start') + if start: + for subpart in part.iter_parts(): + if subpart['content-id'] == start: + candidate = subpart + break + if candidate is None: + subparts = part.get_payload() + candidate = subparts[0] if subparts else None + if candidate is not None: + yield from self._find_body(candidate, preferencelist) + + def get_body(self, preferencelist=('related', 'html', 'plain')): + """Return best candidate mime part for display as 'body' of message. + + Do a depth first search, starting with self, looking for the first part + matching each of the items in preferencelist, and return the part + corresponding to the first item that has a match, or None if no items + have a match. If 'related' is not included in preferencelist, consider + the root part of any multipart/related encountered as a candidate + match. Ignore parts with 'Content-Disposition: attachment'. + """ + best_prio = len(preferencelist) + body = None + for prio, part in self._find_body(self, preferencelist): + if prio < best_prio: + best_prio = prio + body = part + if prio == 0: + break + return body + + _body_types = {('text', 'plain'), + ('text', 'html'), + ('multipart', 'related'), + ('multipart', 'alternative')} + def iter_attachments(self): + """Return an iterator over the non-main parts of a multipart. + + Skip the first of each occurrence of text/plain, text/html, + multipart/related, or multipart/alternative in the multipart (unless + they have a 'Content-Disposition: attachment' header) and include all + remaining subparts in the returned iterator. When applied to a + multipart/related, return all parts except the root part. Return an + empty iterator when applied to a multipart/alternative or a + non-multipart. + """ + maintype, subtype = self.get_content_type().split('/') + if maintype != 'multipart' or subtype == 'alternative': + return + parts = self.get_payload() + if maintype == 'multipart' and subtype == 'related': + # For related, we treat everything but the root as an attachment. + # The root may be indicated by 'start'; if there's no start or we + # can't find the named start, treat the first subpart as the root. + start = self.get_param('start') + if start: + found = False + attachments = [] + for part in parts: + if part.get('content-id') == start: + found = True + else: + attachments.append(part) + if found: + yield from attachments + return + parts.pop(0) + yield from parts + return + # Otherwise we more or less invert the remaining logic in get_body. + # This only really works in edge cases (ex: non-text relateds or + # alternatives) if the sending agent sets content-disposition. + seen = [] # Only skip the first example of each candidate type. + for part in parts: + maintype, subtype = part.get_content_type().split('/') + if ((maintype, subtype) in self._body_types and + not part.is_attachment and subtype not in seen): + seen.append(subtype) + continue + yield part + + def iter_parts(self): + """Return an iterator over all immediate subparts of a multipart. + + Return an empty iterator for a non-multipart. + """ + if self.get_content_maintype() == 'multipart': + yield from self.get_payload() + + def get_content(self, *args, content_manager=None, **kw): + if content_manager is None: + content_manager = self.policy.content_manager + return content_manager.get_content(self, *args, **kw) + + def set_content(self, *args, content_manager=None, **kw): + if content_manager is None: + content_manager = self.policy.content_manager + content_manager.set_content(self, *args, **kw) + + def _make_multipart(self, subtype, disallowed_subtypes, boundary): + if self.get_content_maintype() == 'multipart': + existing_subtype = self.get_content_subtype() + disallowed_subtypes = disallowed_subtypes + (subtype,) + if existing_subtype in disallowed_subtypes: + raise ValueError("Cannot convert {} to {}".format( + existing_subtype, subtype)) + keep_headers = [] + part_headers = [] + for name, value in self._headers: + if name.lower().startswith('content-'): + part_headers.append((name, value)) + else: + keep_headers.append((name, value)) + if part_headers: + # There is existing content, move it to the first subpart. + part = type(self)(policy=self.policy) + part._headers = part_headers + part._payload = self._payload + self._payload = [part] + else: + self._payload = [] + self._headers = keep_headers + self['Content-Type'] = 'multipart/' + subtype + if boundary is not None: + self.set_param('boundary', boundary) + + def make_related(self, boundary=None): + self._make_multipart('related', ('alternative', 'mixed'), boundary) + + def make_alternative(self, boundary=None): + self._make_multipart('alternative', ('mixed',), boundary) + + def make_mixed(self, boundary=None): + self._make_multipart('mixed', (), boundary) + + def _add_multipart(self, _subtype, *args, _disp=None, **kw): + if (self.get_content_maintype() != 'multipart' or + self.get_content_subtype() != _subtype): + getattr(self, 'make_' + _subtype)() + part = type(self)(policy=self.policy) + part.set_content(*args, **kw) + if _disp and 'content-disposition' not in part: + part['Content-Disposition'] = _disp + self.attach(part) + + def add_related(self, *args, **kw): + self._add_multipart('related', *args, _disp='inline', **kw) + + def add_alternative(self, *args, **kw): + self._add_multipart('alternative', *args, **kw) + + def add_attachment(self, *args, **kw): + self._add_multipart('mixed', *args, _disp='attachment', **kw) + + def clear(self): + self._headers = [] + self._payload = None + + def clear_content(self): + self._headers = [(n, v) for n, v in self._headers + if not n.lower().startswith('content-')] + self._payload = None + + +class EmailMessage(MIMEPart): + + def set_content(self, *args, **kw): + super().set_content(*args, **kw) + if 'MIME-Version' not in self: + self['MIME-Version'] = '1.0' diff --git a/Lib/email/policy.py b/Lib/email/policy.py --- a/Lib/email/policy.py +++ b/Lib/email/policy.py @@ -5,6 +5,7 @@ from email._policybase import Policy, Compat32, compat32, _extend_docstrings from email.utils import _has_surrogates from email.headerregistry import HeaderRegistry as HeaderRegistry +from email.contentmanager import raw_data_manager __all__ = [ 'Compat32', @@ -58,10 +59,22 @@ special treatment, while all other fields are treated as unstructured. This list will be completed before the extension is marked stable.) + + content_manager -- an object with at least two methods: get_content + and set_content. When the get_content or + set_content method of a Message object is called, + it calls the corresponding method of this object, + passing it the message object as its first argument, + and any arguments or keywords that were passed to + it as additional arguments. The default + content_manager is + :data:`~email.contentmanager.raw_data_manager`. + """ refold_source = 'long' header_factory = HeaderRegistry() + content_manager = raw_data_manager def __init__(self, **kw): # Ensure that each new instance gets a unique header factory diff --git a/Lib/email/utils.py b/Lib/email/utils.py --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -68,9 +68,13 @@ # How to deal with a string containing bytes before handing it to the # application through the 'normal' interface. def _sanitize(string): - # Turn any escaped bytes into unicode 'unknown' char. - original_bytes = string.encode('ascii', 'surrogateescape') - return original_bytes.decode('ascii', 'replace') + # Turn any escaped bytes into unicode 'unknown' char. If the escaped + # bytes happen to be utf-8 they will instead get decoded, even if they + # were invalid in the charset the source was supposed to be in. This + # seems like it is not a bad thing; a defect was still registered. + original_bytes = string.encode('utf-8', 'surrogateescape') + return original_bytes.decode('utf-8', 'replace') + # Helpers diff --git a/Lib/test/test_email/__init__.py b/Lib/test/test_email/__init__.py --- a/Lib/test/test_email/__init__.py +++ b/Lib/test/test_email/__init__.py @@ -2,6 +2,7 @@ import sys import unittest import test.support +import collections import email from email.message import Message from email._policybase import compat32 @@ -42,6 +43,8 @@ # here we make minimal changes in the test_email tests compared to their # pre-3.3 state. policy = compat32 + # Likewise, the default message object is Message. + message = Message def __init__(self, *args, **kw): super().__init__(*args, **kw) @@ -54,11 +57,23 @@ with openfile(filename) as fp: return email.message_from_file(fp, policy=self.policy) - def _str_msg(self, string, message=Message, policy=None): + def _str_msg(self, string, message=None, policy=None): if policy is None: policy = self.policy + if message is None: + message = self.message return email.message_from_string(string, message, policy=policy) + def _bytes_msg(self, bytestring, message=None, policy=None): + if policy is None: + policy = self.policy + if message is None: + message = self.message + return email.message_from_bytes(bytestring, message, policy=policy) + + def _make_message(self): + return self.message(policy=self.policy) + def _bytes_repr(self, b): return [repr(x) for x in b.splitlines(keepends=True)] @@ -123,6 +138,7 @@ """ paramdicts = {} + testers = collections.defaultdict(list) for name, attr in cls.__dict__.items(): if name.endswith('_params'): if not hasattr(attr, 'keys'): @@ -134,7 +150,15 @@ d[n] = x attr = d paramdicts[name[:-7] + '_as_'] = attr + if '_as_' in name: + testers[name.split('_as_')[0] + '_as_'].append(name) testfuncs = {} + for name in paramdicts: + if name not in testers: + raise ValueError("No tester found for {}".format(name)) + for name in testers: + if name not in paramdicts: + raise ValueError("No params found for {}".format(name)) for name, attr in cls.__dict__.items(): for paramsname, paramsdict in paramdicts.items(): if name.startswith(paramsname): diff --git a/Lib/test/test_email/test_contentmanager.py b/Lib/test/test_email/test_contentmanager.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_email/test_contentmanager.py @@ -0,0 +1,796 @@ +import unittest +from test.test_email import TestEmailBase, parameterize +import textwrap +from email import policy +from email.message import EmailMessage +from email.contentmanager import ContentManager, raw_data_manager + + + at parameterize +class TestContentManager(TestEmailBase): + + policy = policy.default + message = EmailMessage + + get_key_params = { + 'full_type': (1, 'text/plain',), + 'maintype_only': (2, 'text',), + 'null_key': (3, '',), + } + + def get_key_as_get_content_key(self, order, key): + def foo_getter(msg, foo=None): + bar = msg['X-Bar-Header'] + return foo, bar + cm = ContentManager() + cm.add_get_handler(key, foo_getter) + m = self._make_message() + m['Content-Type'] = 'text/plain' + m['X-Bar-Header'] = 'foo' + self.assertEqual(cm.get_content(m, foo='bar'), ('bar', 'foo')) + + def get_key_as_get_content_key_order(self, order, key): + def bar_getter(msg): + return msg['X-Bar-Header'] + def foo_getter(msg): + return msg['X-Foo-Header'] + cm = ContentManager() + cm.add_get_handler(key, foo_getter) + for precedence, key in self.get_key_params.values(): + if precedence > order: + cm.add_get_handler(key, bar_getter) + m = self._make_message() + m['Content-Type'] = 'text/plain' + m['X-Bar-Header'] = 'bar' + m['X-Foo-Header'] = 'foo' + self.assertEqual(cm.get_content(m), ('foo')) + + def test_get_content_raises_if_unknown_mimetype_and_no_default(self): + cm = ContentManager() + m = self._make_message() + m['Content-Type'] = 'text/plain' + with self.assertRaisesRegex(KeyError, 'text/plain'): + cm.get_content(m) + + class BaseThing(str): + pass + baseobject_full_path = __name__ + '.' + 'TestContentManager.BaseThing' + class Thing(BaseThing): + pass + testobject_full_path = __name__ + '.' + 'TestContentManager.Thing' + + set_key_params = { + 'type': (0, Thing,), + 'full_path': (1, testobject_full_path,), + 'qualname': (2, 'TestContentManager.Thing',), + 'name': (3, 'Thing',), + 'base_type': (4, BaseThing,), + 'base_full_path': (5, baseobject_full_path,), + 'base_qualname': (6, 'TestContentManager.BaseThing',), + 'base_name': (7, 'BaseThing',), + 'str_type': (8, str,), + 'str_full_path': (9, 'builtins.str',), + 'str_name': (10, 'str',), # str name and qualname are the same + 'null_key': (11, None,), + } + + def set_key_as_set_content_key(self, order, key): + def foo_setter(msg, obj, foo=None): + msg['X-Foo-Header'] = foo + msg.set_payload(obj) + cm = ContentManager() + cm.add_set_handler(key, foo_setter) + m = self._make_message() + msg_obj = self.Thing() + cm.set_content(m, msg_obj, foo='bar') + self.assertEqual(m['X-Foo-Header'], 'bar') + self.assertEqual(m.get_payload(), msg_obj) + + def set_key_as_set_content_key_order(self, order, key): + def foo_setter(msg, obj): + msg['X-FooBar-Header'] = 'foo' + msg.set_payload(obj) + def bar_setter(msg, obj): + msg['X-FooBar-Header'] = 'bar' + cm = ContentManager() + cm.add_set_handler(key, foo_setter) + for precedence, key in self.get_key_params.values(): + if precedence > order: + cm.add_set_handler(key, bar_setter) + m = self._make_message() + msg_obj = self.Thing() + cm.set_content(m, msg_obj) + self.assertEqual(m['X-FooBar-Header'], 'foo') + self.assertEqual(m.get_payload(), msg_obj) + + def test_set_content_raises_if_unknown_type_and_no_default(self): + cm = ContentManager() + m = self._make_message() + msg_obj = self.Thing() + with self.assertRaisesRegex(KeyError, self.testobject_full_path): + cm.set_content(m, msg_obj) + + def test_set_content_raises_if_called_on_multipart(self): + cm = ContentManager() + m = self._make_message() + m['Content-Type'] = 'multipart/foo' + with self.assertRaises(TypeError): + cm.set_content(m, 'test') + + def test_set_content_calls_clear_content(self): + m = self._make_message() + m['Content-Foo'] = 'bar' + m['Content-Type'] = 'text/html' + m['To'] = 'test' + m.set_payload('abc') + cm = ContentManager() + cm.add_set_handler(str, lambda *args, **kw: None) + m.set_content('xyz', content_manager=cm) + self.assertIsNone(m['Content-Foo']) + self.assertIsNone(m['Content-Type']) + self.assertEqual(m['To'], 'test') + self.assertIsNone(m.get_payload()) + + + at parameterize +class TestRawDataManager(TestEmailBase): + # Note: these tests are dependent on the order in which headers are added + # to the message objects by the code. There's no defined ordering in + # RFC5322/MIME, so this makes the tests more fragile than the standards + # require. However, if the header order changes it is best to understand + # *why*, and make sure it isn't a subtle bug in whatever change was + # applied. + + policy = policy.default.clone(max_line_length=60, + content_manager=raw_data_manager) + message = EmailMessage + + def test_get_text_plain(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain + + Basic text. + """)) + self.assertEqual(raw_data_manager.get_content(m), "Basic text.\n") + + def test_get_text_html(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/html + +

Basic text.

+ """)) + self.assertEqual(raw_data_manager.get_content(m), + "

Basic text.

\n") + + def test_get_text_plain_latin1(self): + m = self._bytes_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset=latin1 + + Bas?c t?xt. + """).encode('latin1')) + self.assertEqual(raw_data_manager.get_content(m), "Bas?c t?xt.\n") + + def test_get_text_plain_latin1_quoted_printable(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset="latin-1" + Content-Transfer-Encoding: quoted-printable + + Bas=ECc t=EBxt. + """)) + self.assertEqual(raw_data_manager.get_content(m), "Bas?c t?xt.\n") + + def test_get_text_plain_utf8_base64(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset="utf8" + Content-Transfer-Encoding: base64 + + QmFzw6xjIHTDq3h0Lgo= + """)) + self.assertEqual(raw_data_manager.get_content(m), "Bas?c t?xt.\n") + + def test_get_text_plain_bad_utf8_quoted_printable(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset="utf8" + Content-Transfer-Encoding: quoted-printable + + Bas=c3=acc t=c3=abxt=fd. + """)) + self.assertEqual(raw_data_manager.get_content(m), "Bas?c t?xt?.\n") + + def test_get_text_plain_bad_utf8_quoted_printable_ignore_errors(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset="utf8" + Content-Transfer-Encoding: quoted-printable + + Bas=c3=acc t=c3=abxt=fd. + """)) + self.assertEqual(raw_data_manager.get_content(m, errors='ignore'), + "Bas?c t?xt.\n") + + def test_get_text_plain_utf8_base64_recoverable_bad_CTE_data(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain; charset="utf8" + Content-Transfer-Encoding: base64 + + QmFzw6xjIHTDq3h0Lgo\xFF= + """)) + self.assertEqual(raw_data_manager.get_content(m, errors='ignore'), + "Bas?c t?xt.\n") + + def test_get_text_invalid_keyword(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: text/plain + + Basic text. + """)) + with self.assertRaises(TypeError): + raw_data_manager.get_content(m, foo='ignore') + + def test_get_non_text(self): + template = textwrap.dedent("""\ + Content-Type: {} + Content-Transfer-Encoding: base64 + + Ym9ndXMgZGF0YQ== + """) + for maintype in 'audio image video application'.split(): + with self.subTest(maintype=maintype): + m = self._str_msg(template.format(maintype+'/foo')) + self.assertEqual(raw_data_manager.get_content(m), b"bogus data") + + def test_get_non_text_invalid_keyword(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: image/jpg + Content-Transfer-Encoding: base64 + + Ym9ndXMgZGF0YQ== + """)) + with self.assertRaises(TypeError): + raw_data_manager.get_content(m, errors='ignore') + + def test_get_raises_on_multipart(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: multipart/mixed; boundary="===" + + --=== + --===-- + """)) + with self.assertRaises(KeyError): + raw_data_manager.get_content(m) + + def test_get_message_rfc822_and_external_body(self): + template = textwrap.dedent("""\ + Content-Type: message/{} + + To: foo at example.com + From: bar at example.com + Subject: example + + an example message + """) + for subtype in 'rfc822 external-body'.split(): + with self.subTest(subtype=subtype): + m = self._str_msg(template.format(subtype)) + sub_msg = raw_data_manager.get_content(m) + self.assertIsInstance(sub_msg, self.message) + self.assertEqual(raw_data_manager.get_content(sub_msg), + "an example message\n") + self.assertEqual(sub_msg['to'], 'foo at example.com') + self.assertEqual(sub_msg['from'].addresses[0].username, 'bar') + + def test_get_message_non_rfc822_or_external_body_yields_bytes(self): + m = self._str_msg(textwrap.dedent("""\ + Content-Type: message/partial + + To: foo at example.com + From: bar at example.com + Subject: example + + The real body is in another message. + """)) + self.assertEqual(raw_data_manager.get_content(m)[:10], b'To: foo at ex') + + def test_set_text_plain(self): + m = self._make_message() + content = "Simple message.\n" + raw_data_manager.set_content(m, content) + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 7bit + + Simple message. + """)) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_html(self): + m = self._make_message() + content = "

Simple message.

\n" + raw_data_manager.set_content(m, content, subtype='html') + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: text/html; charset="utf-8" + Content-Transfer-Encoding: 7bit + +

Simple message.

+ """)) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_charset_latin_1(self): + m = self._make_message() + content = "Simple message.\n" + raw_data_manager.set_content(m, content, charset='latin-1') + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="iso-8859-1" + Content-Transfer-Encoding: 7bit + + Simple message. + """)) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_short_line_minimal_non_ascii_heuristics(self): + m = self._make_message() + content = "et l? il est mont? sur moi et il commence ? m'?to.\n" + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 8bit + + et l? il est mont? sur moi et il commence ? m'?to. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_long_line_minimal_non_ascii_heuristics(self): + m = self._make_message() + content = ("j'ai un probl?me de python. il est sorti de son" + " vivarium. et l? il est mont? sur moi et il commence" + " ? m'?to.\n") + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: quoted-printable + + j'ai un probl=C3=A8me de python. il est sorti de son vivari= + um. et l=C3=A0 il est mont=C3=A9 sur moi et il commence = + =C3=A0 m'=C3=A9to. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_11_lines_long_line_minimal_non_ascii_heuristics(self): + m = self._make_message() + content = '\n'*10 + ( + "j'ai un probl?me de python. il est sorti de son" + " vivarium. et l? il est mont? sur moi et il commence" + " ? m'?to.\n") + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: quoted-printable + """ + '\n'*10 + """ + j'ai un probl=C3=A8me de python. il est sorti de son vivari= + um. et l=C3=A0 il est mont=C3=A9 sur moi et il commence = + =C3=A0 m'=C3=A9to. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_maximal_non_ascii_heuristics(self): + m = self._make_message() + content = "????????.\n" + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 8bit + + ????????. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_11_lines_maximal_non_ascii_heuristics(self): + m = self._make_message() + content = '\n'*10 + "????????.\n" + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 8bit + """ + '\n'*10 + """ + ????????. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_long_line_maximal_non_ascii_heuristics(self): + m = self._make_message() + content = ("????????????????????????????????" + "????????????????????????????????" + "????????????????????????????????.\n") + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: base64 + + w6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOoxJnD + tsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOo + xJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TD + qcOoxJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOg + w6TDqcOoxJnDtsWRLgo= + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_11_lines_long_line_maximal_non_ascii_heuristics(self): + # Yes, it chooses "wrong" here. It's a heuristic. So this result + # could change if we come up with a better heuristic. + m = self._make_message() + content = ('\n'*10 + + "????????????????????????????????" + "????????????????????????????????" + "????????????????????????????????.\n") + raw_data_manager.set_content(m, "\n"*10 + + "????????????????????????????????" + "????????????????????????????????" + "????????????????????????????????.\n") + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: quoted-printable + """ + '\n'*10 + """ + =C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3= + =A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4= + =C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3= + =A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99= + =C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5= + =91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1= + =C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3= + =A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9= + =C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4= + =99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6= + =C5=91. + """).encode('utf-8')) + self.assertEqual(m.get_payload(decode=True).decode('utf-8'), content) + self.assertEqual(m.get_content(), content) + + def test_set_text_non_ascii_with_cte_7bit_raises(self): + m = self._make_message() + with self.assertRaises(UnicodeError): + raw_data_manager.set_content(m,"????????.\n", cte='7bit') + + def test_set_text_non_ascii_with_charset_ascii_raises(self): + m = self._make_message() + with self.assertRaises(UnicodeError): + raw_data_manager.set_content(m,"????????.\n", charset='ascii') + + def test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raises(self): + m = self._make_message() + with self.assertRaises(UnicodeError): + raw_data_manager.set_content(m,"????????.\n", cte='7bit', charset='ascii') + + def test_set_message(self): + m = self._make_message() + m['Subject'] = "Forwarded message" + content = self._make_message() + content['To'] = 'python at vivarium.org' + content['From'] = 'police at monty.org' + content['Subject'] = "get back in your box" + content.set_content("Or face the comfy chair.") + raw_data_manager.set_content(m, content) + self.assertEqual(str(m), textwrap.dedent("""\ + Subject: Forwarded message + Content-Type: message/rfc822 + Content-Transfer-Encoding: 8bit + + To: python at vivarium.org + From: police at monty.org + Subject: get back in your box + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + + Or face the comfy chair. + """)) + payload = m.get_payload(0) + self.assertIsInstance(payload, self.message) + self.assertEqual(str(payload), str(content)) + self.assertIsInstance(m.get_content(), self.message) + self.assertEqual(str(m.get_content()), str(content)) + + def test_set_message_with_non_ascii_and_coercion_to_7bit(self): + m = self._make_message() + m['Subject'] = "Escape report" + content = self._make_message() + content['To'] = 'police at monty.org' + content['From'] = 'victim at monty.org' + content['Subject'] = "Help" + content.set_content("j'ai un probl?me de python. il est sorti de son" + " vivarium.") + raw_data_manager.set_content(m, content) + self.assertEqual(bytes(m), textwrap.dedent("""\ + Subject: Escape report + Content-Type: message/rfc822 + Content-Transfer-Encoding: 8bit + + To: police at monty.org + From: victim at monty.org + Subject: Help + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 8bit + MIME-Version: 1.0 + + j'ai un probl?me de python. il est sorti de son vivarium. + """).encode('utf-8')) + # The choice of base64 for the body encoding is because generator + # doesn't bother with heuristics and uses it unconditionally for utf-8 + # text. + # XXX: the first cte should be 7bit, too...that's a generator bug. + # XXX: the line length in the body also looks like a generator bug. + self.assertEqual(m.as_string(maxheaderlen=self.policy.max_line_length), + textwrap.dedent("""\ + Subject: Escape report + Content-Type: message/rfc822 + Content-Transfer-Encoding: 8bit + + To: police at monty.org + From: victim at monty.org + Subject: Help + Content-Type: text/plain; charset="utf-8" + MIME-Version: 1.0 + Content-Transfer-Encoding: base64 + + aidhaSB1biBwcm9ibMOobWUgZGUgcHl0aG9uLiBpbCBlc3Qgc29ydGkgZGUgc29uIHZpdmFyaXVt + Lgo= + """)) + self.assertIsInstance(m.get_content(), self.message) + self.assertEqual(str(m.get_content()), str(content)) + + def test_set_message_invalid_cte_raises(self): + m = self._make_message() + content = self._make_message() + for cte in 'quoted-printable base64'.split(): + for subtype in 'rfc822 external-body'.split(): + with self.subTest(cte=cte, subtype=subtype): + with self.assertRaises(ValueError) as ar: + m.set_content(content, subtype, cte=cte) + exc = str(ar.exception) + self.assertIn(cte, exc) + self.assertIn(subtype, exc) + subtype = 'external-body' + for cte in '8bit binary'.split(): + with self.subTest(cte=cte, subtype=subtype): + with self.assertRaises(ValueError) as ar: + m.set_content(content, subtype, cte=cte) + exc = str(ar.exception) + self.assertIn(cte, exc) + self.assertIn(subtype, exc) + + def test_set_image_jpg(self): + for content in (b"bogus content", + bytearray(b"bogus content"), + memoryview(b"bogus content")): + with self.subTest(content=content): + m = self._make_message() + raw_data_manager.set_content(m, content, 'image', 'jpeg') + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: image/jpeg + Content-Transfer-Encoding: base64 + + Ym9ndXMgY29udGVudA== + """)) + self.assertEqual(m.get_payload(decode=True), content) + self.assertEqual(m.get_content(), content) + + def test_set_audio_aif_with_quoted_printable_cte(self): + # Why you would use qp, I don't know, but it is technically supported. + # XXX: the incorrect line length is because binascii.b2a_qp doesn't + # support a line length parameter, but we must use it to get newline + # encoding. + # XXX: what about that lack of tailing newline? Do we actually handle + # that correctly in all cases? That is, if the *source* has an + # unencoded newline, do we add an extra newline to the returned payload + # or not? And can that actually be disambiguated based on the RFC? + m = self._make_message() + content = b'b\xFFgus\tcon\nt\rent ' + b'z'*100 + m.set_content(content, 'audio', 'aif', cte='quoted-printable') + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: audio/aif + Content-Transfer-Encoding: quoted-printable + MIME-Version: 1.0 + + b=FFgus=09con=0At=0Dent=20zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz""").encode('latin-1')) + self.assertEqual(m.get_payload(decode=True), content) + self.assertEqual(m.get_content(), content) + + def test_set_video_mpeg_with_binary_cte(self): + m = self._make_message() + content = b'b\xFFgus\tcon\nt\rent ' + b'z'*100 + m.set_content(content, 'video', 'mpeg', cte='binary') + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: video/mpeg + Content-Transfer-Encoding: binary + MIME-Version: 1.0 + + """).encode('ascii') + + # XXX: the second \n ought to be a \r, but generator gets it wrong. + # THIS MEANS WE DON'T ACTUALLY SUPPORT THE 'binary' CTE. + b'b\xFFgus\tcon\nt\nent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' + + b'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz') + self.assertEqual(m.get_payload(decode=True), content) + self.assertEqual(m.get_content(), content) + + def test_set_application_octet_stream_with_8bit_cte(self): + # In 8bit mode, univeral line end logic applies. It is up to the + # application to make sure the lines are short enough; we don't check. + m = self._make_message() + content = b'b\xFFgus\tcon\nt\rent\n' + b'z'*60 + b'\n' + m.set_content(content, 'application', 'octet-stream', cte='8bit') + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: application/octet-stream + Content-Transfer-Encoding: 8bit + MIME-Version: 1.0 + + """).encode('ascii') + + b'b\xFFgus\tcon\nt\nent\n' + + b'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\n') + self.assertEqual(m.get_payload(decode=True), content) + self.assertEqual(m.get_content(), content) + + def test_set_headers_from_header_objects(self): + m = self._make_message() + content = "Simple message.\n" + header_factory = self.policy.header_factory + raw_data_manager.set_content(m, content, headers=( + header_factory("To", "foo at example.com"), + header_factory("From", "foo at example.com"), + header_factory("Subject", "I'm talking to myself."))) + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + To: foo at example.com + From: foo at example.com + Subject: I'm talking to myself. + Content-Transfer-Encoding: 7bit + + Simple message. + """)) + + def test_set_headers_from_strings(self): + m = self._make_message() + content = "Simple message.\n" + raw_data_manager.set_content(m, content, headers=( + "X-Foo-Header: foo", + "X-Bar-Header: bar",)) + self.assertEqual(str(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + X-Foo-Header: foo + X-Bar-Header: bar + Content-Transfer-Encoding: 7bit + + Simple message. + """)) + + def test_set_headers_with_invalid_duplicate_string_header_raises(self): + m = self._make_message() + content = "Simple message.\n" + with self.assertRaisesRegex(ValueError, 'Content-Type'): + raw_data_manager.set_content(m, content, headers=( + "Content-Type: foo/bar",) + ) + + def test_set_headers_with_invalid_duplicate_header_header_raises(self): + m = self._make_message() + content = "Simple message.\n" + header_factory = self.policy.header_factory + with self.assertRaisesRegex(ValueError, 'Content-Type'): + raw_data_manager.set_content(m, content, headers=( + header_factory("Content-Type", " foo/bar"),) + ) + + def test_set_headers_with_defective_string_header_raises(self): + m = self._make_message() + content = "Simple message.\n" + with self.assertRaisesRegex(ValueError, 'a at fairly@@invalid at address'): + raw_data_manager.set_content(m, content, headers=( + 'To: a at fairly@@invalid at address',) + ) + print(m['To'].defects) + + def test_set_headers_with_defective_header_header_raises(self): + m = self._make_message() + content = "Simple message.\n" + header_factory = self.policy.header_factory + with self.assertRaisesRegex(ValueError, 'a at fairly@@invalid at address'): + raw_data_manager.set_content(m, content, headers=( + header_factory('To', 'a at fairly@@invalid at address'),) + ) + print(m['To'].defects) + + def test_set_disposition_inline(self): + m = self._make_message() + m.set_content('foo', disposition='inline') + self.assertEqual(m['Content-Disposition'], 'inline') + + def test_set_disposition_attachment(self): + m = self._make_message() + m.set_content('foo', disposition='attachment') + self.assertEqual(m['Content-Disposition'], 'attachment') + + def test_set_disposition_foo(self): + m = self._make_message() + m.set_content('foo', disposition='foo') + self.assertEqual(m['Content-Disposition'], 'foo') + + # XXX: we should have a 'strict' policy mode (beyond raise_on_defect) that + # would cause 'foo' above to raise. + + def test_set_filename(self): + m = self._make_message() + m.set_content('foo', filename='bar.txt') + self.assertEqual(m['Content-Disposition'], + 'attachment; filename="bar.txt"') + + def test_set_filename_and_disposition_inline(self): + m = self._make_message() + m.set_content('foo', disposition='inline', filename='bar.txt') + self.assertEqual(m['Content-Disposition'], 'inline; filename="bar.txt"') + + def test_set_non_ascii_filename(self): + m = self._make_message() + m.set_content('foo', filename='?b?r?.txt') + self.assertEqual(bytes(m), textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 7bit + Content-Disposition: attachment; + filename*=utf-8''%C3%A1b%C3%A1r%C3%AE.txt + MIME-Version: 1.0 + + foo + """).encode('ascii')) + + content_object_params = { + 'text_plain': ('content', ()), + 'text_html': ('content', ('html',)), + 'application_octet_stream': (b'content', + ('application', 'octet_stream')), + 'image_jpeg': (b'content', ('image', 'jpeg')), + 'message_rfc822': (message(), ()), + 'message_external_body': (message(), ('external-body',)), + } + + def content_object_as_header_receiver(self, obj, mimetype): + m = self._make_message() + m.set_content(obj, *mimetype, headers=( + 'To: foo at example.com', + 'From: bar at simple.net')) + self.assertEqual(m['to'], 'foo at example.com') + self.assertEqual(m['from'], 'bar at simple.net') + + def content_object_as_disposition_inline_receiver(self, obj, mimetype): + m = self._make_message() + m.set_content(obj, *mimetype, disposition='inline') + self.assertEqual(m['Content-Disposition'], 'inline') + + def content_object_as_non_ascii_filename_receiver(self, obj, mimetype): + m = self._make_message() + m.set_content(obj, *mimetype, disposition='inline', filename='b?r.txt') + self.assertEqual(m['Content-Disposition'], 'inline; filename="b?r.txt"') + self.assertEqual(m.get_filename(), "b?r.txt") + self.assertEqual(m['Content-Disposition'].params['filename'], "b?r.txt") + + def content_object_as_cid_receiver(self, obj, mimetype): + m = self._make_message() + m.set_content(obj, *mimetype, cid='some_random_stuff') + self.assertEqual(m['Content-ID'], 'some_random_stuff') + + def content_object_as_params_receiver(self, obj, mimetype): + m = self._make_message() + params = {'foo': 'b?r', 'abc': 'xyz'} + m.set_content(obj, *mimetype, params=params) + if isinstance(obj, str): + params['charset'] = 'utf-8' + self.assertEqual(m['Content-Type'].params, params) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -661,7 +661,7 @@ 'text/plain; name="ascii_is_the_default"'), 'rfc2231_bad_character_in_charset_parameter_value': ( - "text/plain; charset*=ascii''utf-8%E2%80%9D", + "text/plain; charset*=ascii''utf-8%F1%F2%F3", 'text/plain', 'text', 'plain', @@ -669,6 +669,18 @@ [errors.UndecodableBytesDefect], 'text/plain; charset="utf-8\uFFFD\uFFFD\uFFFD"'), + 'rfc2231_utf_8_in_supposedly_ascii_charset_parameter_value': ( + "text/plain; charset*=ascii''utf-8%E2%80%9D", + 'text/plain', + 'text', + 'plain', + {'charset': 'utf-8?'}, + [errors.UndecodableBytesDefect], + 'text/plain; charset="utf-8?"', + ), + # XXX: if the above were *re*folded, it would get tagged as utf-8 + # instead of ascii in the param, since it now contains non-ASCII. + 'rfc2231_encoded_then_unencoded_segments': ( ('application/x-foo;' '\tname*0*="us-ascii\'en-us\'My";' diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1,6 +1,13 @@ import unittest +import textwrap from email import policy -from test.test_email import TestEmailBase +from email.message import EmailMessage, MIMEPart +from test.test_email import TestEmailBase, parameterize + + +# Helper. +def first(iterable): + return next(filter(lambda x: x is not None, iterable), None) class Test(TestEmailBase): @@ -14,5 +21,738 @@ m['To'] = 'xyz at abc' + at parameterize +class TestEmailMessageBase: + + policy = policy.default + + # The first argument is a triple (related, html, plain) of indices into the + # list returned by 'walk' called on a Message constructed from the third. + # The indices indicate which part should match the corresponding part-type + # when passed to get_body (ie: the "first" part of that type in the + # message). The second argument is a list of indices into the 'walk' list + # of the attachments that should be returned by a call to + # 'iter_attachments'. The third argument is a list of indices into 'walk' + # that should be returned by a call to 'iter_parts'. Note that the first + # item returned by 'walk' is the Message itself. + + message_params = { + + 'empty_message': ( + (None, None, 0), + (), + (), + ""), + + 'non_mime_plain': ( + (None, None, 0), + (), + (), + textwrap.dedent("""\ + To: foo at example.com + + simple text body + """)), + + 'mime_non_text': ( + (None, None, None), + (), + (), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: image/jpg + + bogus body. + """)), + + 'plain_html_alternative': ( + (None, 2, 1), + (), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/alternative; boundary="===" + + preamble + + --=== + Content-Type: text/plain + + simple body + + --=== + Content-Type: text/html + +

simple body

+ --===-- + """)), + + 'plain_html_mixed': ( + (None, 2, 1), + (), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + preamble + + --=== + Content-Type: text/plain + + simple body + + --=== + Content-Type: text/html + +

simple body

+ + --===-- + """)), + + 'plain_html_attachment_mixed': ( + (None, None, 1), + (2,), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: text/plain + + simple body + + --=== + Content-Type: text/html + Content-Disposition: attachment + +

simple body

+ + --===-- + """)), + + 'html_text_attachment_mixed': ( + (None, 2, None), + (1,), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: text/plain + Content-Disposition: AtTaChment + + simple body + + --=== + Content-Type: text/html + +

simple body

+ + --===-- + """)), + + 'html_text_attachment_inline_mixed': ( + (None, 2, 1), + (), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: text/plain + Content-Disposition: InLine + + simple body + + --=== + Content-Type: text/html + Content-Disposition: inline + +

simple body

+ + --===-- + """)), + + # RFC 2387 + 'related': ( + (0, 1, None), + (2,), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/related; boundary="==="; type=text/html + + --=== + Content-Type: text/html + +

simple body

+ + --=== + Content-Type: image/jpg + Content-ID: + + bogus data + + --===-- + """)), + + # This message structure will probably never be seen in the wild, but + # it proves we distinguish between text parts based on 'start'. The + # content would not, of course, actually work :) + 'related_with_start': ( + (0, 2, None), + (1,), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/related; boundary="==="; type=text/html; + start="" + + --=== + Content-Type: text/html + Content-ID: + + useless text + + --=== + Content-Type: text/html + Content-ID: + +

simple body

+ + + --===-- + """)), + + + 'mixed_alternative_plain_related': ( + (3, 4, 2), + (6, 7), + (1, 6, 7), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: multipart/alternative; boundary="+++" + + --+++ + Content-Type: text/plain + + simple body + + --+++ + Content-Type: multipart/related; boundary="___" + + --___ + Content-Type: text/html + +

simple body

+ + --___ + Content-Type: image/jpg + Content-ID: + + bogus jpg body + + --___-- + + --+++-- + + --=== + Content-Type: image/jpg + Content-Disposition: attachment + + bogus jpg body + + --=== + Content-Type: image/jpg + Content-Disposition: AttacHmenT + + another bogus jpg body + + --===-- + """)), + + # This structure suggested by Stephen J. Turnbull...may not exist/be + # supported in the wild, but we want to support it. + 'mixed_related_alternative_plain_html': ( + (1, 4, 3), + (6, 7), + (1, 6, 7), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: multipart/related; boundary="+++" + + --+++ + Content-Type: multipart/alternative; boundary="___" + + --___ + Content-Type: text/plain + + simple body + + --___ + Content-Type: text/html + +

simple body

+ + --___-- + + --+++ + Content-Type: image/jpg + Content-ID: + + bogus jpg body + + --+++-- + + --=== + Content-Type: image/jpg + Content-Disposition: attachment + + bogus jpg body + + --=== + Content-Type: image/jpg + Content-Disposition: attachment + + another bogus jpg body + + --===-- + """)), + + # Same thing, but proving we only look at the root part, which is the + # first one if there isn't any start parameter. That is, this is a + # broken related. + 'mixed_related_alternative_plain_html_wrong_order': ( + (1, None, None), + (6, 7), + (1, 6, 7), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: multipart/related; boundary="+++" + + --+++ + Content-Type: image/jpg + Content-ID: + + bogus jpg body + + --+++ + Content-Type: multipart/alternative; boundary="___" + + --___ + Content-Type: text/plain + + simple body + + --___ + Content-Type: text/html + +

simple body

+ + --___-- + + --+++-- + + --=== + Content-Type: image/jpg + Content-Disposition: attachment + + bogus jpg body + + --=== + Content-Type: image/jpg + Content-Disposition: attachment + + another bogus jpg body + + --===-- + """)), + + 'message_rfc822': ( + (None, None, None), + (), + (), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: message/rfc822 + + To: bar at example.com + From: robot at examp.com + + this is a message body. + """)), + + 'mixed_text_message_rfc822': ( + (None, None, 1), + (2,), + (1, 2), + textwrap.dedent("""\ + To: foo at example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="===" + + --=== + Content-Type: text/plain + + Your message has bounced, ser. + + --=== + Content-Type: message/rfc822 + + To: bar at example.com + From: robot at examp.com + + this is a message body. + + --===-- + """)), + + } + + def message_as_get_body(self, body_parts, attachments, parts, msg): + m = self._str_msg(msg) + allparts = list(m.walk()) + expected = [None if n is None else allparts[n] for n in body_parts] + related = 0; html = 1; plain = 2 + self.assertEqual(m.get_body(), first(expected)) + self.assertEqual(m.get_body(preferencelist=( + 'related', 'html', 'plain')), + first(expected)) + self.assertEqual(m.get_body(preferencelist=('related', 'html')), + first(expected[related:html+1])) + self.assertEqual(m.get_body(preferencelist=('related', 'plain')), + first([expected[related], expected[plain]])) + self.assertEqual(m.get_body(preferencelist=('html', 'plain')), + first(expected[html:plain+1])) + self.assertEqual(m.get_body(preferencelist=['related']), + expected[related]) + self.assertEqual(m.get_body(preferencelist=['html']), expected[html]) + self.assertEqual(m.get_body(preferencelist=['plain']), expected[plain]) + self.assertEqual(m.get_body(preferencelist=('plain', 'html')), + first(expected[plain:html-1:-1])) + self.assertEqual(m.get_body(preferencelist=('plain', 'related')), + first([expected[plain], expected[related]])) + self.assertEqual(m.get_body(preferencelist=('html', 'related')), + first(expected[html::-1])) + self.assertEqual(m.get_body(preferencelist=('plain', 'html', 'related')), + first(expected[::-1])) + self.assertEqual(m.get_body(preferencelist=('html', 'plain', 'related')), + first([expected[html], + expected[plain], + expected[related]])) + + def message_as_iter_attachment(self, body_parts, attachments, parts, msg): + m = self._str_msg(msg) + allparts = list(m.walk()) + attachments = [allparts[n] for n in attachments] + self.assertEqual(list(m.iter_attachments()), attachments) + + def message_as_iter_parts(self, body_parts, attachments, parts, msg): + m = self._str_msg(msg) + allparts = list(m.walk()) + parts = [allparts[n] for n in parts] + self.assertEqual(list(m.iter_parts()), parts) + + class _TestContentManager: + def get_content(self, msg, *args, **kw): + return msg, args, kw + def set_content(self, msg, *args, **kw): + self.msg = msg + self.args = args + self.kw = kw + + def test_get_content_with_cm(self): + m = self._str_msg('') + cm = self._TestContentManager() + self.assertEqual(m.get_content(content_manager=cm), (m, (), {})) + msg, args, kw = m.get_content('foo', content_manager=cm, bar=1, k=2) + self.assertEqual(msg, m) + self.assertEqual(args, ('foo',)) + self.assertEqual(kw, dict(bar=1, k=2)) + + def test_get_content_default_cm_comes_from_policy(self): + p = policy.default.clone(content_manager=self._TestContentManager()) + m = self._str_msg('', policy=p) + self.assertEqual(m.get_content(), (m, (), {})) + msg, args, kw = m.get_content('foo', bar=1, k=2) + self.assertEqual(msg, m) + self.assertEqual(args, ('foo',)) + self.assertEqual(kw, dict(bar=1, k=2)) + + def test_set_content_with_cm(self): + m = self._str_msg('') + cm = self._TestContentManager() + m.set_content(content_manager=cm) + self.assertEqual(cm.msg, m) + self.assertEqual(cm.args, ()) + self.assertEqual(cm.kw, {}) + m.set_content('foo', content_manager=cm, bar=1, k=2) + self.assertEqual(cm.msg, m) + self.assertEqual(cm.args, ('foo',)) + self.assertEqual(cm.kw, dict(bar=1, k=2)) + + def test_set_content_default_cm_comes_from_policy(self): + cm = self._TestContentManager() + p = policy.default.clone(content_manager=cm) + m = self._str_msg('', policy=p) + m.set_content() + self.assertEqual(cm.msg, m) + self.assertEqual(cm.args, ()) + self.assertEqual(cm.kw, {}) + m.set_content('foo', bar=1, k=2) + self.assertEqual(cm.msg, m) + self.assertEqual(cm.args, ('foo',)) + self.assertEqual(cm.kw, dict(bar=1, k=2)) + + # outcome is whether xxx_method should raise ValueError error when called + # on multipart/subtype. Blank outcome means it depends on xxx (add + # succeeds, make raises). Note: 'none' means there are content-type + # headers but payload is None...this happening in practice would be very + # unusual, so treating it as if there were content seems reasonable. + # method subtype outcome + subtype_params = ( + ('related', 'no_content', 'succeeds'), + ('related', 'none', 'succeeds'), + ('related', 'plain', 'succeeds'), + ('related', 'related', ''), + ('related', 'alternative', 'raises'), + ('related', 'mixed', 'raises'), + ('alternative', 'no_content', 'succeeds'), + ('alternative', 'none', 'succeeds'), + ('alternative', 'plain', 'succeeds'), + ('alternative', 'related', 'succeeds'), + ('alternative', 'alternative', ''), + ('alternative', 'mixed', 'raises'), + ('mixed', 'no_content', 'succeeds'), + ('mixed', 'none', 'succeeds'), + ('mixed', 'plain', 'succeeds'), + ('mixed', 'related', 'succeeds'), + ('mixed', 'alternative', 'succeeds'), + ('mixed', 'mixed', ''), + ) + + def _make_subtype_test_message(self, subtype): + m = self.message() + payload = None + msg_headers = [ + ('To', 'foo at bar.com'), + ('From', 'bar at foo.com'), + ] + if subtype != 'no_content': + ('content-shadow', 'Logrus'), + msg_headers.append(('X-Random-Header', 'Corwin')) + if subtype == 'text': + payload = '' + msg_headers.append(('Content-Type', 'text/plain')) + m.set_payload('') + elif subtype != 'no_content': + payload = [] + msg_headers.append(('Content-Type', 'multipart/' + subtype)) + msg_headers.append(('X-Trump', 'Random')) + m.set_payload(payload) + for name, value in msg_headers: + m[name] = value + return m, msg_headers, payload + + def _check_disallowed_subtype_raises(self, m, method_name, subtype, method): + with self.assertRaises(ValueError) as ar: + getattr(m, method)() + exc_text = str(ar.exception) + self.assertIn(subtype, exc_text) + self.assertIn(method_name, exc_text) + + def _check_make_multipart(self, m, msg_headers, payload): + count = 0 + for name, value in msg_headers: + if not name.lower().startswith('content-'): + self.assertEqual(m[name], value) + count += 1 + self.assertEqual(len(m), count+1) # +1 for new Content-Type + part = next(m.iter_parts()) + count = 0 + for name, value in msg_headers: + if name.lower().startswith('content-'): + self.assertEqual(part[name], value) + count += 1 + self.assertEqual(len(part), count) + self.assertEqual(part.get_payload(), payload) + + def subtype_as_make(self, method, subtype, outcome): + m, msg_headers, payload = self._make_subtype_test_message(subtype) + make_method = 'make_' + method + if outcome in ('', 'raises'): + self._check_disallowed_subtype_raises(m, method, subtype, make_method) + return + getattr(m, make_method)() + self.assertEqual(m.get_content_maintype(), 'multipart') + self.assertEqual(m.get_content_subtype(), method) + if subtype == 'no_content': + self.assertEqual(len(m.get_payload()), 0) + self.assertEqual(m.items(), + msg_headers + [('Content-Type', + 'multipart/'+method)]) + else: + self.assertEqual(len(m.get_payload()), 1) + self._check_make_multipart(m, msg_headers, payload) + + def subtype_as_make_with_boundary(self, method, subtype, outcome): + # Doing all variation is a bit of overkill... + m = self.message() + if outcome in ('', 'raises'): + m['Content-Type'] = 'multipart/' + subtype + with self.assertRaises(ValueError) as cm: + getattr(m, 'make_' + method)() + return + if subtype == 'plain': + m['Content-Type'] = 'text/plain' + elif subtype != 'no_content': + m['Content-Type'] = 'multipart/' + subtype + getattr(m, 'make_' + method)(boundary="abc") + self.assertTrue(m.is_multipart()) + self.assertEqual(m.get_boundary(), 'abc') + + def test_policy_on_part_made_by_make_comes_from_message(self): + for method in ('make_related', 'make_alternative', 'make_mixed'): + m = self.message(policy=self.policy.clone(content_manager='foo')) + m['Content-Type'] = 'text/plain' + getattr(m, method)() + self.assertEqual(m.get_payload(0).policy.content_manager, 'foo') + + class _TestSetContentManager: + def set_content(self, msg, content, *args, **kw): + msg['Content-Type'] = 'text/plain' + msg.set_payload(content) + + def subtype_as_add(self, method, subtype, outcome): + m, msg_headers, payload = self._make_subtype_test_message(subtype) + cm = self._TestSetContentManager() + add_method = 'add_attachment' if method=='mixed' else 'add_' + method + if outcome == 'raises': + self._check_disallowed_subtype_raises(m, method, subtype, add_method) + return + getattr(m, add_method)('test', content_manager=cm) + self.assertEqual(m.get_content_maintype(), 'multipart') + self.assertEqual(m.get_content_subtype(), method) + if method == subtype or subtype == 'no_content': + self.assertEqual(len(m.get_payload()), 1) + for name, value in msg_headers: + self.assertEqual(m[name], value) + part = m.get_payload()[0] + else: + self.assertEqual(len(m.get_payload()), 2) + self._check_make_multipart(m, msg_headers, payload) + part = m.get_payload()[1] + self.assertEqual(part.get_content_type(), 'text/plain') + self.assertEqual(part.get_payload(), 'test') + if method=='mixed': + self.assertEqual(part['Content-Disposition'], 'attachment') + elif method=='related': + self.assertEqual(part['Content-Disposition'], 'inline') + else: + # Otherwise we don't guess. + self.assertIsNone(part['Content-Disposition']) + + class _TestSetRaisingContentManager: + def set_content(self, msg, content, *args, **kw): + raise Exception('test') + + def test_default_content_manager_for_add_comes_from_policy(self): + cm = self._TestSetRaisingContentManager() + m = self.message(policy=self.policy.clone(content_manager=cm)) + for method in ('add_related', 'add_alternative', 'add_attachment'): + with self.assertRaises(Exception) as ar: + getattr(m, method)('') + self.assertEqual(str(ar.exception), 'test') + + def message_as_clear(self, body_parts, attachments, parts, msg): + m = self._str_msg(msg) + m.clear() + self.assertEqual(len(m), 0) + self.assertEqual(list(m.items()), []) + self.assertIsNone(m.get_payload()) + self.assertEqual(list(m.iter_parts()), []) + + def message_as_clear_content(self, body_parts, attachments, parts, msg): + m = self._str_msg(msg) + expected_headers = [h for h in m.keys() + if not h.lower().startswith('content-')] + m.clear_content() + self.assertEqual(list(m.keys()), expected_headers) + self.assertIsNone(m.get_payload()) + self.assertEqual(list(m.iter_parts()), []) + + def test_is_attachment(self): + m = self._make_message() + self.assertFalse(m.is_attachment) + m['Content-Disposition'] = 'inline' + self.assertFalse(m.is_attachment) + m.replace_header('Content-Disposition', 'attachment') + self.assertTrue(m.is_attachment) + m.replace_header('Content-Disposition', 'AtTachMent') + self.assertTrue(m.is_attachment) + + + +class TestEmailMessage(TestEmailMessageBase, TestEmailBase): + message = EmailMessage + + def test_set_content_adds_MIME_Version(self): + m = self._str_msg('') + cm = self._TestContentManager() + self.assertNotIn('MIME-Version', m) + m.set_content(content_manager=cm) + self.assertEqual(m['MIME-Version'], '1.0') + + class _MIME_Version_adding_CM: + def set_content(self, msg, *args, **kw): + msg['MIME-Version'] = '1.0' + + def test_set_content_does_not_duplicate_MIME_Version(self): + m = self._str_msg('') + cm = self._MIME_Version_adding_CM() + self.assertNotIn('MIME-Version', m) + m.set_content(content_manager=cm) + self.assertEqual(m['MIME-Version'], '1.0') + + +class TestMIMEPart(TestEmailMessageBase, TestEmailBase): + # Doing the full test run here may seem a bit redundant, since the two + # classes are almost identical. But what if they drift apart? So we do + # the full tests so that any future drift doesn't introduce bugs. + message = MIMEPart + + def test_set_content_does_not_add_MIME_Version(self): + m = self._str_msg('') + cm = self._TestContentManager() + self.assertNotIn('MIME-Version', m) + m.set_content(content_manager=cm) + self.assertNotIn('MIME-Version', m) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -30,6 +30,7 @@ 'raise_on_defect': False, 'header_factory': email.policy.EmailPolicy.header_factory, 'refold_source': 'long', + 'content_manager': email.policy.EmailPolicy.content_manager, }) # For each policy under test, we give here what we expect the defaults to diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,9 @@ Library ------- +- Issue #18891: Completed the new email package (provisional) API additions + by adding new classes EmailMessage, MIMEPart, and ContentManager. + - Issue #18468: The re.split, re.findall, and re.sub functions and the group() and groups() methods of match object now always return a string or a bytes object. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 17 08:46:23 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 17 Oct 2013 08:46:23 +0200 Subject: [Python-checkins] Daily reference leaks (e2a411a429d6): sum=973822 Message-ID: results for e2a411a429d6 on branch "default" -------------------------------------------- test_unittest leaked [317, 317, 317] references, sum=951 test_unittest leaked [196, 197, 197] memory blocks, sum=590 test_doctest leaked [2232, 2232, 2232] references, sum=6696 test_doctest leaked [1667, 1669, 1669] memory blocks, sum=5005 test_argparse leaked [70935, 70935, 70935] references, sum=212805 test_argparse leaked [43489, 43491, 43491] memory blocks, sum=130471 test_cgitb leaked [90, 90, 90] references, sum=270 test_cgitb leaked [65, 65, 65] memory blocks, sum=195 test_cmd leaked [41, 41, 41] references, sum=123 test_cmd leaked [20, 20, 20] memory blocks, sum=60 test_cmd_line leaked [34, 34, 34] references, sum=102 test_cmd_line leaked [34, 34, 34] memory blocks, sum=102 test_cmd_line_script leaked [24, 24, 24] references, sum=72 test_cmd_line_script leaked [19, 19, 19] memory blocks, sum=57 test_compileall leaked [6, 6, 6] references, sum=18 test_compileall leaked [6, 6, 6] memory blocks, sum=18 test_configparser leaked [34560, 34560, 34560] references, sum=103680 test_configparser leaked [16778, 16780, 16780] memory blocks, sum=50338 test_contextlib leaked [10, 10, 10] references, sum=30 test_contextlib leaked [5, 5, 5] memory blocks, sum=15 test_ctypes leaked [137, 137, 137] references, sum=411 test_ctypes leaked [105, 105, 105] memory blocks, sum=315 test_decimal leaked [10, 10, 10] references, sum=30 test_decimal leaked [8, 8, 8] memory blocks, sum=24 test_difflib leaked [401, 401, 401] references, sum=1203 test_difflib leaked [267, 269, 269] memory blocks, sum=805 test_distutils leaked [533, 533, 533] references, sum=1599 test_distutils leaked [389, 391, 391] memory blocks, sum=1171 test_docxmlrpc leaked [60, 60, 60] references, sum=180 test_docxmlrpc leaked [60, 60, 60] memory blocks, sum=180 test_email leaked [3837, 3837, 3837] references, sum=11511 test_email leaked [2146, 2148, 2148] memory blocks, sum=6442 test_faulthandler leaked [111, 111, 111] references, sum=333 test_faulthandler leaked [98, 98, 98] memory blocks, sum=294 test_gc leaked [4, 4, 4] references, sum=12 test_gc leaked [4, 4, 4] memory blocks, sum=12 test_generators leaked [5, 5, 5] references, sum=15 test_generators leaked [4, 4, 4] memory blocks, sum=12 test_genexps leaked [5, 5, 5] references, sum=15 test_genexps leaked [4, 4, 4] memory blocks, sum=12 test_gettext leaked [134, 134, 134] references, sum=402 test_gettext leaked [128, 128, 128] memory blocks, sum=384 test_htmlparser leaked [2177, 2177, 2177] references, sum=6531 test_htmlparser leaked [40, 41, 41] memory blocks, sum=122 test_http_cookiejar leaked [2805, 2805, 2805] references, sum=8415 test_http_cookiejar leaked [1808, 1810, 1810] memory blocks, sum=5428 test_imp leaked [0, 1, -1] references, sum=0 test_import leaked [16, 16, 16] references, sum=48 test_import leaked [10, 10, 10] memory blocks, sum=30 test_inspect leaked [2, 2, 2] references, sum=6 test_inspect leaked [2, 2, 2] memory blocks, sum=6 test_json leaked [2553, 2553, 2553] references, sum=7659 test_json leaked [1323, 1325, 1325] memory blocks, sum=3973 test_keyword leaked [39, 39, 39] references, sum=117 test_keyword leaked [20, 20, 20] memory blocks, sum=60 test_lib2to3 leaked [57052, 57052, 57052] references, sum=171156 test_lib2to3 leaked [46298, 46300, 46300] memory blocks, sum=138898 test_listcomps leaked [10, 10, 10] references, sum=30 test_listcomps leaked [8, 8, 8] memory blocks, sum=24 test_locale leaked [43, 43, 43] references, sum=129 test_locale leaked [19, 19, 19] memory blocks, sum=57 test_logging leaked [706, 706, 706] references, sum=2118 test_logging leaked [362, 364, 364] memory blocks, sum=1090 test_mailbox leaked [46, 46, 46] references, sum=138 test_mailbox leaked [41, 41, 41] memory blocks, sum=123 test_netrc leaked [96, 96, 96] references, sum=288 test_netrc leaked [59, 59, 59] memory blocks, sum=177 test_nntplib leaked [1774, 1774, 1774] references, sum=5322 test_nntplib leaked [902, 904, 904] memory blocks, sum=2710 test_parser leaked [2, 2, 2] references, sum=6 test_parser leaked [2, 2, 2] memory blocks, sum=6 test_pep292 leaked [174, 174, 174] references, sum=522 test_pep292 leaked [107, 107, 107] memory blocks, sum=321 test_pkg leaked [57, 57, 57] references, sum=171 test_pkg leaked [31, 31, 31] memory blocks, sum=93 test_pydoc leaked [1804, 1804, 1804] references, sum=5412 test_pydoc leaked [684, 686, 686] memory blocks, sum=2056 test_re leaked [10539, 10539, 10539] references, sum=31617 test_re leaked [135, 136, 136] memory blocks, sum=407 test_regrtest leaked [5005, 5005, 5005] references, sum=15015 test_regrtest leaked [2704, 2706, 2706] memory blocks, sum=8116 test_robotparser leaked [4, 4, 4] references, sum=12 test_robotparser leaked [4, 4, 4] memory blocks, sum=12 test_setcomps leaked [10, 10, 10] references, sum=30 test_setcomps leaked [8, 8, 8] memory blocks, sum=24 test_site leaked [2, 2, 2] references, sum=6 test_site leaked [2, 2, 2] memory blocks, sum=6 test_smtplib leaked [65, 65, 65] references, sum=195 test_smtplib leaked [45, 45, 45] memory blocks, sum=135 test_ssl leaked [15, 15, 15] references, sum=45 test_ssl leaked [10, 10, 10] memory blocks, sum=30 test_strptime leaked [627, 627, 627] references, sum=1881 test_strptime leaked [433, 435, 435] memory blocks, sum=1303 test_subprocess leaked [138, 138, 138] references, sum=414 test_subprocess leaked [102, 102, 102] memory blocks, sum=306 test_sys leaked [22, 22, 22] references, sum=66 test_sys leaked [12, 12, 12] memory blocks, sum=36 test_textwrap leaked [192, 192, 192] references, sum=576 test_textwrap leaked [116, 116, 116] memory blocks, sum=348 test_threading leaked [2, 2, 2] references, sum=6 test_threading leaked [2, 2, 2] memory blocks, sum=6 test_time leaked [100, 100, 100] references, sum=300 test_time leaked [94, 94, 94] memory blocks, sum=282 test_timeit leaked [34, 34, 34] references, sum=102 test_timeit leaked [20, 20, 20] memory blocks, sum=60 test_tokenize leaked [5, 5, 5] references, sum=15 test_tokenize leaked [4, 4, 4] memory blocks, sum=12 test_tools leaked [398, 398, 398] references, sum=1194 test_tools leaked [214, 215, 215] memory blocks, sum=644 test_urllib leaked [16, 16, 16] references, sum=48 test_urllib leaked [11, 11, 11] memory blocks, sum=33 test_urllib2 leaked [333, 333, 333] references, sum=999 test_urllib2 leaked [216, 217, 217] memory blocks, sum=650 test_urllib2_localnet leaked [61, 61, 61] references, sum=183 test_urllib2_localnet leaked [41, 41, 41] memory blocks, sum=123 test_urllib2net leaked [38, 38, 38] references, sum=114 test_urllib2net leaked [29, 29, 29] memory blocks, sum=87 test_urllibnet leaked [38, 38, 38] references, sum=114 test_urllibnet leaked [24, 24, 24] memory blocks, sum=72 test_warnings leaked [4, 4, 4] references, sum=12 test_warnings leaked [4, 4, 4] memory blocks, sum=12 test_weakref leaked [2, 2, 2] references, sum=6 test_weakref leaked [2, 2, 2] memory blocks, sum=6 test_xmlrpc leaked [2, 2, 2] references, sum=6 test_zipfile leaked [8, 8, 8] references, sum=24 test_zipfile leaked [4, 4, 4] memory blocks, sum=12 test_zipimport_support leaked [1492, 1492, 1492] references, sum=4476 test_zipimport_support leaked [1146, 1148, 1148] memory blocks, sum=3442 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogZ_t0zZ', '-x'] From python-checkins at python.org Thu Oct 17 11:40:47 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 11:40:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_to_print_a_backtrace_o?= =?utf-8?q?f_wedged_child_process_in_test=2E?= Message-ID: <3d0ljq1V7Zz7LjV@mail.python.org> http://hg.python.org/cpython/rev/6f4806323208 changeset: 86391:6f4806323208 user: Richard Oudkerk date: Thu Oct 17 10:38:37 2013 +0100 summary: Try to print a backtrace of wedged child process in test. files: Lib/test/_test_multiprocessing.py | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -300,6 +300,9 @@ p.terminate() if hasattr(signal, 'alarm'): + # On the Gentoo buildbot waitpid() often seems to block forever. + # We use alarm() to interrupt it if it blocks for too long, and + # then try to print a backtrace for the child process using gdb. def handler(*args): raise RuntimeError('join took too long: %s' % p) old_handler = signal.signal(signal.SIGALRM, handler) @@ -307,6 +310,16 @@ signal.alarm(10) self.assertEqual(join(), None) signal.alarm(0) + except RuntimeError: + print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG)) + import subprocess + p = subprocess.Popen(['gdb', sys.executable, str(p.pid)], + stdin=subprocess.PIPE) + try: + p.communicate(b'bt 50', timeout=10) + except subprocess.TimeoutExpired: + p.kill() + raise finally: signal.signal(signal.SIGALRM, old_handler) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 11:52:32 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 11:52:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMTkyNzY6?= =?utf-8?q?_Fix_tests_for_wave_files_on_big-endian_platforms=2E?= Message-ID: <3d0lzN6R7Tz7LjT@mail.python.org> http://hg.python.org/cpython/rev/73dad296c483 changeset: 86392:73dad296c483 branch: 2.7 parent: 86384:e94e29dab32c user: Serhiy Storchaka date: Thu Oct 17 12:45:45 2013 +0300 summary: Issue 19276: Fix tests for wave files on big-endian platforms. Skip tests for 24-bit wave file on big-endian platforms. files: Lib/test/test_wave.py | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,6 +1,7 @@ from test.test_support import TESTFN, run_unittest import unittest from test import audiotests +import sys import wave @@ -44,9 +45,13 @@ EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ """) - frames = audiotests.byteswap2(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + at unittest.skipIf(sys.byteorder == 'big', + '24-bit wave files are supported only on little-endian ' + 'platforms') class WavePCM24Test(audiotests.AudioWriteTests, audiotests.AudioTestsWithSourceFile, unittest.TestCase): @@ -73,7 +78,8 @@ E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ """) - frames = audiotests.byteswap3(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap3(frames) class WavePCM32Test(audiotests.AudioWriteTests, @@ -102,7 +108,8 @@ E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ """) - frames = audiotests.byteswap4(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap4(frames) def test_main(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 11:52:34 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 11:52:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgMTkyNzY6?= =?utf-8?q?_Fix_tests_for_wave_files_on_big-endian_platforms=2E?= Message-ID: <3d0lzQ14yMz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/236884b40a2d changeset: 86393:236884b40a2d branch: 3.3 parent: 86382:38243a0a1f44 user: Serhiy Storchaka date: Thu Oct 17 12:46:00 2013 +0300 summary: Issue 19276: Fix tests for wave files on big-endian platforms. Skip tests for 24-bit wave file on big-endian platforms. files: Lib/test/test_wave.py | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,6 +1,7 @@ from test.support import TESTFN import unittest from test import audiotests +import sys import wave @@ -44,9 +45,13 @@ EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ """) - frames = audiotests.byteswap2(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + at unittest.skipIf(sys.byteorder == 'big', + '24-bit wave files are supported only on little-endian ' + 'platforms') class WavePCM24Test(audiotests.AudioWriteTests, audiotests.AudioTestsWithSourceFile, unittest.TestCase): @@ -73,7 +78,8 @@ E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ """) - frames = audiotests.byteswap3(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap3(frames) class WavePCM32Test(audiotests.AudioWriteTests, @@ -102,7 +108,8 @@ E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ """) - frames = audiotests.byteswap4(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap4(frames) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 11:52:35 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 11:52:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_19276=3A_Fix_tests_for_wave_files_on_big-endian_pl?= =?utf-8?q?atforms=2E?= Message-ID: <3d0lzR2l9Bz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/8bdf5328c55b changeset: 86394:8bdf5328c55b parent: 86390:6d12285e250b parent: 86393:236884b40a2d user: Serhiy Storchaka date: Thu Oct 17 12:46:53 2013 +0300 summary: Issue 19276: Fix tests for wave files on big-endian platforms. Skip tests for 24-bit wave file on big-endian platforms. files: Lib/test/test_wave.py | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,6 +1,7 @@ from test.support import TESTFN import unittest from test import audiotests +import sys import wave @@ -44,9 +45,13 @@ EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ """) - frames = audiotests.byteswap2(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + at unittest.skipIf(sys.byteorder == 'big', + '24-bit wave files are supported only on little-endian ' + 'platforms') class WavePCM24Test(audiotests.AudioWriteTests, audiotests.AudioTestsWithSourceFile, unittest.TestCase): @@ -73,7 +78,8 @@ E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ """) - frames = audiotests.byteswap3(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap3(frames) class WavePCM32Test(audiotests.AudioWriteTests, @@ -102,7 +108,8 @@ E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ """) - frames = audiotests.byteswap4(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap4(frames) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 11:52:36 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 11:52:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3d0lzS4RT9z7Ljt@mail.python.org> http://hg.python.org/cpython/rev/e046ae3e9628 changeset: 86395:e046ae3e9628 parent: 86394:8bdf5328c55b parent: 86391:6f4806323208 user: Serhiy Storchaka date: Thu Oct 17 12:48:32 2013 +0300 summary: Merge heads files: Lib/test/_test_multiprocessing.py | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -300,6 +300,9 @@ p.terminate() if hasattr(signal, 'alarm'): + # On the Gentoo buildbot waitpid() often seems to block forever. + # We use alarm() to interrupt it if it blocks for too long, and + # then try to print a backtrace for the child process using gdb. def handler(*args): raise RuntimeError('join took too long: %s' % p) old_handler = signal.signal(signal.SIGALRM, handler) @@ -307,6 +310,16 @@ signal.alarm(10) self.assertEqual(join(), None) signal.alarm(0) + except RuntimeError: + print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG)) + import subprocess + p = subprocess.Popen(['gdb', sys.executable, str(p.pid)], + stdin=subprocess.PIPE) + try: + p.communicate(b'bt 50', timeout=10) + except subprocess.TimeoutExpired: + p.kill() + raise finally: signal.signal(signal.SIGALRM, old_handler) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 13:12:06 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 13:12:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_strace_instead_of_gdb_?= =?utf-8?q?to_see_what_wedged_child_is_doing=2E?= Message-ID: <3d0nlB1lKmz7LkD@mail.python.org> http://hg.python.org/cpython/rev/223465695023 changeset: 86396:223465695023 user: Richard Oudkerk date: Thu Oct 17 12:10:45 2013 +0100 summary: Try strace instead of gdb to see what wedged child is doing. files: Lib/test/_test_multiprocessing.py | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -273,7 +273,10 @@ @classmethod def _test_terminate(cls): + print('signal.getsignal(SIGTERM) =', signal.getsignal(signal.SIGTERM)) + print('starting sleep') time.sleep(100) + print('finished sleep') def test_terminate(self): if self.TYPE == 'threads': @@ -313,12 +316,11 @@ except RuntimeError: print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG)) import subprocess - p = subprocess.Popen(['gdb', sys.executable, str(p.pid)], - stdin=subprocess.PIPE) try: - p.communicate(b'bt 50', timeout=10) + subprocess.check_call(['strace', '-p', str(p.pid)], + timeout=10) except subprocess.TimeoutExpired: - p.kill() + pass raise finally: signal.signal(signal.SIGALRM, old_handler) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 13:40:14 2013 From: python-checkins at python.org (christian.heimes) Date: Thu, 17 Oct 2013 13:40:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319275=3A_Fix_test?= =?utf-8?q?=5Fsite_on_AMD64_Snow_Leopard?= Message-ID: <3d0pMf5QLYz7LjW@mail.python.org> http://hg.python.org/cpython/rev/58aaf7542efe changeset: 86397:58aaf7542efe user: Christian Heimes date: Thu Oct 17 13:40:00 2013 +0200 summary: Issue #19275: Fix test_site on AMD64 Snow Leopard files: Lib/test/test_site.py | 5 +++-- Misc/NEWS | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -443,8 +443,9 @@ self.assertFalse(modules.intersection(re_mods), stderr) # http://bugs.python.org/issue9548 self.assertNotIn('locale', modules, stderr) - # http://bugs.python.org/issue19209 - self.assertNotIn('copyreg', modules, stderr) + if sys.platform != 'darwin': + # http://bugs.python.org/issue19209 + self.assertNotIn('copyreg', modules, stderr) # http://bugs.python.org/issue19218> collection_mods = {'_collections', 'collections', 'functools', 'heapq', 'itertools', 'keyword', 'operator', diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -123,6 +123,8 @@ Tests ----- +- Issue #19275: Fix test_site on AMD64 Snow Leopard + - Issue #14407: Fix unittest test discovery in test_concurrent_futures. - Issue #18919: Unified and extended tests for audio modules: aifc, sunau and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 14:57:51 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 14:57:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Stop_trying_to_use_strace?= =?utf-8?q?=2C_but_add_a_sleep_before_terminate=28=29=2E?= Message-ID: <3d0r5C0rLXz7LjV@mail.python.org> http://hg.python.org/cpython/rev/4e2b08c78b3d changeset: 86398:4e2b08c78b3d user: Richard Oudkerk date: Thu Oct 17 13:56:18 2013 +0100 summary: Stop trying to use strace, but add a sleep before terminate(). files: Lib/test/_test_multiprocessing.py | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -300,12 +300,14 @@ self.assertTimingAlmostEqual(join.elapsed, 0.0) self.assertEqual(p.is_alive(), True) + # XXX maybe terminating too soon causes the problems on Gentoo... + time.sleep(1) + p.terminate() if hasattr(signal, 'alarm'): # On the Gentoo buildbot waitpid() often seems to block forever. - # We use alarm() to interrupt it if it blocks for too long, and - # then try to print a backtrace for the child process using gdb. + # We use alarm() to interrupt it if it blocks for too long. def handler(*args): raise RuntimeError('join took too long: %s' % p) old_handler = signal.signal(signal.SIGALRM, handler) @@ -315,12 +317,6 @@ signal.alarm(0) except RuntimeError: print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG)) - import subprocess - try: - subprocess.check_call(['strace', '-p', str(p.pid)], - timeout=10) - except subprocess.TimeoutExpired: - pass raise finally: signal.signal(signal.SIGALRM, old_handler) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 15:22:03 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 17 Oct 2013 15:22:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316129=3A_Add_=60P?= =?utf-8?q?y=5FSetStandardStreamEncoding=60?= Message-ID: <3d0rd742bTz7LjR@mail.python.org> http://hg.python.org/cpython/rev/9cd88b39ef62 changeset: 86399:9cd88b39ef62 user: Nick Coghlan date: Thu Oct 17 22:35:35 2013 +1000 summary: Issue #16129: Add `Py_SetStandardStreamEncoding` This new pre-initialization API allows embedding applications like Blender to force a particular encoding and error handler for the standard IO streams. Also refactors Modules/_testembed.c to let us start testing multiple embedding scenarios. (Initial patch by Bastien Montagne) files: Doc/c-api/init.rst | 27 ++++++++ Doc/whatsnew/3.4.rst | 5 +- Include/pythonrun.h | 2 + Lib/test/test_capi.py | 96 ++++++++++++++++++++++-------- Misc/ACKS | 1 + Misc/NEWS | 8 ++ Modules/_testembed.c | 94 ++++++++++++++++++++++++++++- Python/pythonrun.c | 81 ++++++++++++++++++++----- 8 files changed, 266 insertions(+), 48 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -86,6 +86,33 @@ ======================= +.. c:function:: int Py_SetStandardStreamEncoding(char *encoding, char *errors) + + .. index:: + single: Py_Initialize() + single: main() + triple: stdin; stdout; sdterr + + This function should be called before :c:func:`Py_Initialize`. It + specifies which encoding and error handling to use with standard io, + with the same meanings as in :func:`str.encode`. + + It overrides :envvar:`PYTHONIOENCODING` values, and allows embedding code + to control io encoding when the environment variable does not work. + + ``encoding`` and/or ``errors`` may be NULL to use + :envvar:`PYTHONIOENCODING` and/or default values (depending on other + settings). + + Note that :data:`sys.stderr` always uses the "backslashreplace" error + handler, regardless of this (or any other) setting. + + If :c:func:`Py_Finalize` is called, this function will need to be called + again in order to affect subsequent calls to :c:func:`Py_Initialize`. + + Returns 0 if successful. + + .. c:function:: void Py_SetProgramName(wchar_t *name) .. index:: diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -564,7 +564,10 @@ Changes to Python's build process and to the C API include: -* None yet. +* The new :c:func:`Py_SetStandardStreamEncoding` pre-initialization API + allows applications embedding the CPython interpreter to reliably force + a particular encoding and error handler for the standard streams + (Contributed by Bastien Montagne and Nick Coghlan in :issue:`16129`) Deprecated diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -38,6 +38,8 @@ PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, const char *errors); + #ifndef Py_LIMITED_API PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -9,6 +9,7 @@ import sys import time import unittest +import textwrap from test import support try: import _posixsubprocess @@ -218,36 +219,81 @@ self.assertEqual(_testcapi.argparsing("Hello", "World"), 1) -class EmbeddingTest(unittest.TestCase): + at unittest.skipIf( + sys.platform.startswith('win'), + "interpreter embedding tests aren't built under Windows") +class EmbeddingTests(unittest.TestCase): + # XXX only tested under Unix checkouts - @unittest.skipIf( - sys.platform.startswith('win'), - "test doesn't work under Windows") - def test_subinterps(self): - # XXX only tested under Unix checkouts + def setUp(self): basepath = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) - oldcwd = os.getcwd() + self.test_exe = exe = os.path.join(basepath, "Modules", "_testembed") + if not os.path.exists(exe): + self.skipTest("%r doesn't exist" % exe) # This is needed otherwise we get a fatal error: # "Py_Initialize: Unable to get the locale encoding # LookupError: no codec search functions registered: can't find encoding" + self.oldcwd = os.getcwd() os.chdir(basepath) - try: - exe = os.path.join(basepath, "Modules", "_testembed") - if not os.path.exists(exe): - self.skipTest("%r doesn't exist" % exe) - p = subprocess.Popen([exe], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - (out, err) = p.communicate() - self.assertEqual(p.returncode, 0, - "bad returncode %d, stderr is %r" % - (p.returncode, err)) - if support.verbose: - print() - print(out.decode('latin1')) - print(err.decode('latin1')) - finally: - os.chdir(oldcwd) + + def tearDown(self): + os.chdir(self.oldcwd) + + def run_embedded_interpreter(self, *args): + """Runs a test in the embedded interpreter""" + cmd = [self.test_exe] + cmd.extend(args) + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + (out, err) = p.communicate() + self.assertEqual(p.returncode, 0, + "bad returncode %d, stderr is %r" % + (p.returncode, err)) + return out.decode("latin1"), err.decode("latin1") + + def test_subinterps(self): + # This is just a "don't crash" test + out, err = self.run_embedded_interpreter() + if support.verbose: + print() + print(out) + print(err) + + def test_forced_io_encoding(self): + # Checks forced configuration of embedded interpreter IO streams + out, err = self.run_embedded_interpreter("forced_io_encoding") + if support.verbose: + print() + print(out) + print(err) + expected_output = textwrap.dedent("""\ + --- Use defaults --- + Expected encoding: default + Expected errors: default + stdin: {0.stdin.encoding}:strict + stdout: {0.stdout.encoding}:strict + stderr: {0.stderr.encoding}:backslashreplace + --- Set errors only --- + Expected encoding: default + Expected errors: surrogateescape + stdin: {0.stdin.encoding}:surrogateescape + stdout: {0.stdout.encoding}:surrogateescape + stderr: {0.stderr.encoding}:backslashreplace + --- Set encoding only --- + Expected encoding: latin-1 + Expected errors: default + stdin: latin-1:strict + stdout: latin-1:strict + stderr: latin-1:backslashreplace + --- Set encoding and errors --- + Expected encoding: latin-1 + Expected errors: surrogateescape + stdin: latin-1:surrogateescape + stdout: latin-1:surrogateescape + stderr: latin-1:backslashreplace""").format(sys) + + self.assertEqual(out.strip(), expected_output) class SkipitemTest(unittest.TestCase): @@ -358,7 +404,7 @@ def test_main(): support.run_unittest(CAPITest, TestPendingCalls, Test6012, - EmbeddingTest, SkipitemTest, TestThreadState, + EmbeddingTests, SkipitemTest, TestThreadState, SubinterpreterTest) for name in dir(_testcapi): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -872,6 +872,7 @@ Florian Mladitsch Doug Moen The Dragon De Monsyne +Bastien Montagne Skip Montanaro Peter Moody Paul Moore diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -120,6 +120,14 @@ - Issue #4366: Fix building extensions on all platforms when --enable-shared is used. +C API +----- + +- Issue #16129: Added a `Py_SetStandardStreamEncoding` pre-initialization API + to allow embedding applications like Blender to force a particular + encoding and error handler for the standard IO streams (initial patch by + Bastien Montagne) + Tests ----- diff --git a/Modules/_testembed.c b/Modules/_testembed.c --- a/Modules/_testembed.c +++ b/Modules/_testembed.c @@ -1,7 +1,26 @@ #include #include -void print_subinterp(void) +/********************************************************* + * Embedded interpreter tests that need a custom exe + * + * Executed via 'EmbeddingTests' in Lib/test/test_capi.py + *********************************************************/ + +static void _testembed_Py_Initialize(void) +{ + /* HACK: the "./" at front avoids a search along the PATH in + Modules/getpath.c */ + Py_SetProgramName(L"./_testembed"); + Py_Initialize(); +} + + +/***************************************************** + * Test repeated initalisation and subinterpreters + *****************************************************/ + +static void print_subinterp(void) { /* Just output some debug stuff */ PyThreadState *ts = PyThreadState_Get(); @@ -14,7 +33,7 @@ ); } -int main(int argc, char *argv[]) +static void test_repeated_init_and_subinterpreters(void) { PyThreadState *mainstate, *substate; #ifdef WITH_THREAD @@ -24,10 +43,7 @@ for (i=0; i<3; i++) { printf("--- Pass %d ---\n", i); - /* HACK: the "./" at front avoids a search along the PATH in - Modules/getpath.c */ - Py_SetProgramName(L"./_testembed"); - Py_Initialize(); + _testembed_Py_Initialize(); mainstate = PyThreadState_Get(); #ifdef WITH_THREAD @@ -54,5 +70,71 @@ PyEval_RestoreThread(mainstate); Py_Finalize(); } +} + +/***************************************************** + * Test forcing a particular IO encoding + *****************************************************/ + +static void check_stdio_details(const char *encoding, const char * errors) +{ + /* Output info for the test case to check */ + if (encoding) { + printf("Expected encoding: %s\n", encoding); + } else { + printf("Expected encoding: default\n"); + } + if (errors) { + printf("Expected errors: %s\n", errors); + } else { + printf("Expected errors: default\n"); + } + fflush(stdout); + /* Force the given IO encoding */ + Py_SetStandardStreamEncoding(encoding, errors); + _testembed_Py_Initialize(); + PyRun_SimpleString( + "import sys;" + "print('stdin: {0.encoding}:{0.errors}'.format(sys.stdin));" + "print('stdout: {0.encoding}:{0.errors}'.format(sys.stdout));" + "print('stderr: {0.encoding}:{0.errors}'.format(sys.stderr));" + "sys.stdout.flush()" + ); + Py_Finalize(); +} + +static void test_forced_io_encoding(void) +{ + /* Check various combinations */ + printf("--- Use defaults ---\n"); + check_stdio_details(NULL, NULL); + printf("--- Set errors only ---\n"); + check_stdio_details(NULL, "surrogateescape"); + printf("--- Set encoding only ---\n"); + check_stdio_details("latin-1", NULL); + printf("--- Set encoding and errors ---\n"); + check_stdio_details("latin-1", "surrogateescape"); + + /* Check calling after initialization fails */ + Py_Initialize(); + + if (Py_SetStandardStreamEncoding(NULL, NULL) == 0) { + printf("Unexpected success calling Py_SetStandardStreamEncoding"); + } + Py_Finalize(); +} + +/* Different embedding tests */ +int main(int argc, char *argv[]) +{ + + /* TODO: Check the argument string to allow for more test cases */ + if (argc > 1) { + /* For now: assume "forced_io_encoding */ + test_forced_io_encoding(); + } else { + /* Run the original embedding test case by default */ + test_repeated_init_and_subinterpreters(); + } return 0; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -134,6 +134,40 @@ return initialized; } +/* Helper to allow an embedding application to override the normal + * mechanism that attempts to figure out an appropriate IO encoding + */ + +static char *_Py_StandardStreamEncoding = NULL; +static char *_Py_StandardStreamErrors = NULL; + +int +Py_SetStandardStreamEncoding(const char *encoding, const char *errors) +{ + if (Py_IsInitialized()) { + /* This is too late to have any effect */ + return -1; + } + if (encoding) { + _Py_StandardStreamEncoding = _PyMem_RawStrdup(encoding); + if (!_Py_StandardStreamEncoding) { + PyErr_NoMemory(); + return -1; + } + } + if (errors) { + _Py_StandardStreamErrors = _PyMem_RawStrdup(errors); + if (!_Py_StandardStreamErrors) { + if (_Py_StandardStreamEncoding) { + PyMem_RawFree(_Py_StandardStreamEncoding); + } + PyErr_NoMemory(); + return -1; + } + } + return 0; +} + /* Global initializations. Can be undone by Py_Finalize(). Don't call this twice without an intervening Py_Finalize() call. When initializations fail, a fatal error is issued and the function does @@ -1088,23 +1122,29 @@ } Py_DECREF(wrapper); - pythonioencoding = Py_GETENV("PYTHONIOENCODING"); - encoding = errors = NULL; - if (pythonioencoding) { - pythonioencoding = _PyMem_Strdup(pythonioencoding); - if (pythonioencoding == NULL) { - PyErr_NoMemory(); - goto error; + encoding = _Py_StandardStreamEncoding; + errors = _Py_StandardStreamErrors; + if (!encoding || !errors) { + pythonioencoding = Py_GETENV("PYTHONIOENCODING"); + if (pythonioencoding) { + char *err; + pythonioencoding = _PyMem_Strdup(pythonioencoding); + if (pythonioencoding == NULL) { + PyErr_NoMemory(); + goto error; + } + err = strchr(pythonioencoding, ':'); + if (err) { + *err = '\0'; + err++; + if (*err && !errors) { + errors = err; + } + } + if (*pythonioencoding && !encoding) { + encoding = pythonioencoding; + } } - errors = strchr(pythonioencoding, ':'); - if (errors) { - *errors = '\0'; - errors++; - if (!*errors) - errors = NULL; - } - if (*pythonioencoding) - encoding = pythonioencoding; } /* Set sys.stdin */ @@ -1184,6 +1224,15 @@ status = -1; } + /* We won't need them anymore. */ + if (_Py_StandardStreamEncoding) { + PyMem_RawFree(_Py_StandardStreamEncoding); + _Py_StandardStreamEncoding = NULL; + } + if (_Py_StandardStreamErrors) { + PyMem_RawFree(_Py_StandardStreamErrors); + _Py_StandardStreamErrors = NULL; + } PyMem_Free(pythonioencoding); Py_XDECREF(bimod); Py_XDECREF(iomod); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 15:27:30 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 17 Oct 2013 15:27:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316129=3A_Move_Py?= =?utf-8?q?=5FSetStandardStreamEncoding_declaration?= Message-ID: <3d0rlQ6tlBz7LjV@mail.python.org> http://hg.python.org/cpython/rev/537e13ca7683 changeset: 86400:537e13ca7683 user: Nick Coghlan date: Thu Oct 17 23:27:17 2013 +1000 summary: Issue #16129: Move Py_SetStandardStreamEncoding declaration files: Include/pythonrun.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -28,6 +28,9 @@ PyAPI_FUNC(void) Py_SetPythonHome(wchar_t *); PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, + const char *errors); + PyAPI_FUNC(void) Py_Initialize(void); PyAPI_FUNC(void) Py_InitializeEx(int); #ifndef Py_LIMITED_API @@ -38,8 +41,6 @@ PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); -PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, const char *errors); - #ifndef Py_LIMITED_API PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 15:33:02 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 15:33:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_doing_a_raw_test_of_os?= =?utf-8?b?LmZvcmsoKS9vcy5raWxsKCku?= Message-ID: <3d0rsp05P1z7Ljs@mail.python.org> http://hg.python.org/cpython/rev/9558e9360afc changeset: 86401:9558e9360afc parent: 86399:9cd88b39ef62 user: Richard Oudkerk date: Thu Oct 17 14:24:06 2013 +0100 summary: Try doing a raw test of os.fork()/os.kill(). files: Lib/test/_test_multiprocessing.py | 41 ++++++++++++++++-- 1 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -273,10 +273,11 @@ @classmethod def _test_terminate(cls): - print('signal.getsignal(SIGTERM) =', signal.getsignal(signal.SIGTERM)) - print('starting sleep') + print('signal.getsignal(SIGTERM) =', + signal.getsignal(signal.SIGTERM), file=sys.stderr) + print('starting sleep', file=sys.stderr) time.sleep(100) - print('finished sleep') + print('finished sleep', file=sys.stderr) def test_terminate(self): if self.TYPE == 'threads': @@ -314,11 +315,12 @@ try: signal.alarm(10) self.assertEqual(join(), None) - signal.alarm(0) except RuntimeError: - print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG)) + print('os.waitpid() =', + os.waitpid(p.pid, os.WNOHANG), file=sys.stderr) raise finally: + signal.alarm(0) signal.signal(signal.SIGALRM, old_handler) else: self.assertEqual(join(), None) @@ -333,6 +335,35 @@ # XXX sometimes get p.exitcode == 0 on Windows ... #self.assertEqual(p.exitcode, -signal.SIGTERM) + @unittest.skipIf(WIN32, 'Unix only') + def test_sigterm(self): + # A test for the Gentoo build bot which does not directly use + # multiprocessing. Start and terminate child processes. + if self.TYPE != 'processes': + return + for i in range(10): + pid = os.fork() + if pid == 0: + try: + print('sleeping', file=sys.stderr) + time.sleep(100) + print('waking', file=sys.stderr) + finally: + sys.stderr.flush() + os._exit(0) + else: + os.kill(pid, signal.SIGTERM) + def handler(*args): + raise RuntimeError('join took too long: %s' % p) + old_handler = signal.signal(signal.SIGALRM, handler) + try: + signal.alarm(10) + pid_status = os.waitpid(pid, 0) + self.assertEqual(pid_status[0], pid) + finally: + signal.alarm(0) + signal.signal(signal.SIGALRM, old_handler) + def test_cpu_count(self): try: cpus = multiprocessing.cpu_count() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 15:33:03 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 15:33:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?b?KTogTWVyZ2Uu?= Message-ID: <3d0rsq2W4rz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/5cc9cbfb5cff changeset: 86402:5cc9cbfb5cff parent: 86401:9558e9360afc parent: 86400:537e13ca7683 user: Richard Oudkerk date: Thu Oct 17 14:31:51 2013 +0100 summary: Merge. files: Include/pythonrun.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -28,6 +28,9 @@ PyAPI_FUNC(void) Py_SetPythonHome(wchar_t *); PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, + const char *errors); + PyAPI_FUNC(void) Py_Initialize(void); PyAPI_FUNC(void) Py_InitializeEx(int); #ifndef Py_LIMITED_API @@ -38,8 +41,6 @@ PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); -PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, const char *errors); - #ifndef Py_LIMITED_API PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 15:42:53 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 17 Oct 2013 15:42:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319266=3A_contextl?= =?utf-8?q?ib=2Eignore_-=3E_contextlib=2Esuppress?= Message-ID: <3d0s593s0Sz7LjV@mail.python.org> http://hg.python.org/cpython/rev/22247b7d17fa changeset: 86403:22247b7d17fa user: Nick Coghlan date: Thu Oct 17 23:40:57 2013 +1000 summary: Close #19266: contextlib.ignore -> contextlib.suppress Patch by Zero Piraeus. files: Doc/library/contextlib.rst | 26 ++++++++++---- Doc/whatsnew/3.4.rst | 13 ++++-- Lib/contextlib.py | 8 ++-- Lib/test/test_contextlib.py | 44 ++++++++++++------------ Misc/ACKS | 1 + Misc/NEWS | 5 ++ 6 files changed, 58 insertions(+), 39 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -95,22 +95,27 @@ ``page.close()`` will be called when the :keyword:`with` block is exited. -.. function:: ignore(*exceptions) +.. function:: suppress(*exceptions) - Return a context manager that ignores the specified exceptions if they - occur in the body of a with-statement. + Return a context manager that suppresses any of the specified exceptions + if they occur in the body of a with statement and then resumes execution + with the first statement following the end of the with statement. - As with any other mechanism that completely suppresses exceptions, it - should only be used to cover very specific errors where silently - ignoring the exception is known to be the right thing to do. + As with any other mechanism that completely suppresses exceptions, this + context manager should be used only to cover very specific errors where + silently continuing with program execution is known to be the right + thing to do. For example:: - from contextlib import ignore + from contextlib import suppress - with ignore(FileNotFoundError): + with suppress(FileNotFoundError): os.remove('somefile.tmp') + with suppress(FileNotFoundError): + os.remove('someotherfile.tmp') + This code is equivalent to:: try: @@ -118,6 +123,11 @@ except FileNotFoundError: pass + try: + os.remove('someotherfile.tmp') + except FileNotFoundError: + pass + .. versionadded:: 3.4 diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -221,14 +221,17 @@ contextlib ---------- -The new :class:`contextlib.ignore` context manager helps to clarify the -intent of code that deliberately ignores failures from a particular -operation. +The new :class:`contextlib.suppress` context manager helps to clarify the +intent of code that deliberately suppresses exceptions from a single +statement. (Contributed by Raymond Hettinger in :issue:`15806` and +Zero Piraeus in :issue:`19266`) + The new :class:`contextlib.redirect_stdio` context manager makes it easier for utility scripts to handle inflexible APIs that don't provide any options to retrieve their output as a string or direct it to somewhere -other than :data:`sys.stdout`. +other than :data:`sys.stdout`. (Contribute by Raymond Hettinger in +:issue:`15805`) dis @@ -283,7 +286,7 @@ A pair of new subclasses of :class:`~email.message.Message` have been added, along with a new sub-module, :mod:`~email.contentmanager`. All documentation is currently in the new module, which is being added as part of the new -:term:`provisional ` email API. These classes provide a +:term:`provisional ` email API. These classes provide a number of new methods that make extracting content from and inserting content into email messages much easier. See the :mod:`~email.contentmanager` documentation for details. diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -5,7 +5,7 @@ from functools import wraps __all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", - "ignore", "redirect_stdout"] + "redirect_stdout", "suppress"] class ContextDecorator(object): @@ -179,10 +179,10 @@ sys.stdout = self.old_target @contextmanager -def ignore(*exceptions): - """Context manager to ignore specified exceptions +def suppress(*exceptions): + """Context manager to suppress specified exceptions - with ignore(OSError): + with suppress(OSError): os.remove(somefile) """ diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -632,28 +632,6 @@ stack.push(cm) self.assertIs(stack._exit_callbacks[-1], cm) -class TestIgnore(unittest.TestCase): - - def test_no_exception(self): - - with ignore(ValueError): - self.assertEqual(pow(2, 5), 32) - - def test_exact_exception(self): - - with ignore(TypeError): - len(5) - - def test_multiple_exception_args(self): - - with ignore(ZeroDivisionError, TypeError): - len(5) - - def test_exception_hierarchy(self): - - with ignore(LookupError): - 'Hello'[50] - class TestRedirectStdout(unittest.TestCase): def test_redirect_to_string_io(self): @@ -663,5 +641,27 @@ s = f.getvalue() self.assertIn('pow', s) +class TestSuppress(unittest.TestCase): + + def test_no_exception(self): + + with suppress(ValueError): + self.assertEqual(pow(2, 5), 32) + + def test_exact_exception(self): + + with suppress(TypeError): + len(5) + + def test_multiple_exception_args(self): + + with suppress(ZeroDivisionError, TypeError): + len(5) + + def test_exception_hierarchy(self): + + with suppress(LookupError): + 'Hello'[50] + if __name__ == "__main__": unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1003,6 +1003,7 @@ Fran?ois Pinard Tom Pinckney Zach Pincus +Zero Piraeus Michael Piotrowski Antoine Pitrou Jean-Fran?ois Pi?ronne diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,11 @@ Library ------- +- Issue #19266: Rename the new-in-3.4 ``contextlib.ignore`` context manager + to ``contextlib.suppress`` in order to be more consistent with existing + descriptions of that operation elsewhere in the language and standard + library documentation (Patch by Zero Piraeus) + - Issue #18891: Completed the new email package (provisional) API additions by adding new classes EmailMessage, MIMEPart, and ContentManager. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 16:23:20 2013 From: python-checkins at python.org (richard.oudkerk) Date: Thu, 17 Oct 2013 16:23:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_signal_handler_in_test?= =?utf-8?q?=2E?= Message-ID: <3d0szr6R6bz7LjT@mail.python.org> http://hg.python.org/cpython/rev/9853d3a20849 changeset: 86404:9853d3a20849 user: Richard Oudkerk date: Thu Oct 17 15:22:10 2013 +0100 summary: Fix signal handler in test. files: Lib/test/_test_multiprocessing.py | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -354,12 +354,16 @@ else: os.kill(pid, signal.SIGTERM) def handler(*args): - raise RuntimeError('join took too long: %s' % p) + raise RuntimeError('waitpid() took too long') old_handler = signal.signal(signal.SIGALRM, handler) try: signal.alarm(10) pid_status = os.waitpid(pid, 0) self.assertEqual(pid_status[0], pid) + except RuntimeError: + print('os.waitpid() =', + os.waitpid(pid, os.WNOHANG), file=sys.stderr) + raise finally: signal.alarm(0) signal.signal(signal.SIGALRM, old_handler) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 17:44:33 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 17 Oct 2013 17:44:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_to_debug_overspecified?= =?utf-8?q?_test_=3A=28?= Message-ID: <3d0vnY32zfzQLZ@mail.python.org> http://hg.python.org/cpython/rev/d9354992229f changeset: 86405:d9354992229f user: Nick Coghlan date: Fri Oct 18 01:44:22 2013 +1000 summary: Try to debug overspecified test :( files: Lib/test/test_capi.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -292,7 +292,8 @@ stdin: latin-1:surrogateescape stdout: latin-1:surrogateescape stderr: latin-1:backslashreplace""").format(sys) - + # Looks like this overspecifies the output :( + self.maxDiff = None self.assertEqual(out.strip(), expected_output) class SkipitemTest(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 17:46:32 2013 From: python-checkins at python.org (nick.coghlan) Date: Thu, 17 Oct 2013 17:46:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Skip_=2316129_test_until_I?= =?utf-8?q?_debug_cross-platform_issues?= Message-ID: <3d0vqr2JRNz7LjS@mail.python.org> http://hg.python.org/cpython/rev/51480f6428a5 changeset: 86406:51480f6428a5 user: Nick Coghlan date: Fri Oct 18 01:46:19 2013 +1000 summary: Skip #16129 test until I debug cross-platform issues files: Lib/test/test_capi.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -260,6 +260,7 @@ print(out) print(err) + @unittest.skip def test_forced_io_encoding(self): # Checks forced configuration of embedded interpreter IO streams out, err = self.run_embedded_interpreter("forced_io_encoding") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 19:50:10 2013 From: python-checkins at python.org (georg.brandl) Date: Thu, 17 Oct 2013 19:50:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTI3?= =?utf-8?q?7=3A_document_all_parameters_of_compressobj=28=29=2E?= Message-ID: <3d0yZV2rkLz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/c54c8e71b79a changeset: 86407:c54c8e71b79a branch: 2.7 parent: 86392:73dad296c483 user: Georg Brandl date: Thu Oct 17 19:51:00 2013 +0200 summary: Closes #19277: document all parameters of compressobj(). files: Doc/library/zlib.rst | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -68,7 +68,7 @@ Raises the :exc:`error` exception if any error occurs. -.. function:: compressobj([level]) +.. function:: compressobj([level[, method[, wbits[, memlevel[, strategy]]]]]) Returns a compression object, to be used for compressing data streams that won't fit into memory at once. *level* is an integer from ``0`` to ``9`` controlling @@ -76,6 +76,21 @@ ``9`` is slowest and produces the most. ``0`` is no compression. The default value is ``6``. + *method* is the compression algorithm. Currently, the only supported value is + ``DEFLATED``. + + *wbits* is the base two logarithm of the size of the window buffer. This + should be an integer from ``8`` to ``15``. Higher values give better + compression, but use more memory. The default is 15. + + *memlevel* controls the amount of memory used for internal compression state. + Valid values range from ``1`` to ``9``. Higher values using more memory, + but are faster and produce smaller output. The default is 8. + + *strategy* is used to tune the compression algorithm. Possible values are + ``Z_DEFAULT_STRATEGY``, ``Z_FILTERED``, and ``Z_HUFFMAN_ONLY``. The default + is ``Z_DEFAULT_STRATEGY``. + .. function:: crc32(data[, value]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 19:51:41 2013 From: python-checkins at python.org (georg.brandl) Date: Thu, 17 Oct 2013 19:51:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_inaccurate?= =?utf-8?q?_versionchanged_tag_for_compressobj=28=29=3A_most_parameter_wer?= =?utf-8?q?e_there=2C?= Message-ID: <3d0ycF4Mffz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/0fff9feb4bdf changeset: 86408:0fff9feb4bdf branch: 3.3 parent: 86393:236884b40a2d user: Georg Brandl date: Thu Oct 17 19:51:34 2013 +0200 summary: Fix inaccurate versionchanged tag for compressobj(): most parameter were there, just got kwarg support. files: Doc/library/zlib.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -88,8 +88,7 @@ that are expected to be most common should come at the end of the dictionary. .. versionchanged:: 3.3 - Added the *method*, *wbits*, *memlevel*, *strategy* and *zdict* - parameters. + Added the *zdict* parameter and keyword argument support. .. function:: crc32(data[, value]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 19:51:42 2013 From: python-checkins at python.org (georg.brandl) Date: Thu, 17 Oct 2013 19:51:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_with_3=2E3?= Message-ID: <3d0ycG6PXkz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/22931761e4a3 changeset: 86409:22931761e4a3 parent: 86406:51480f6428a5 parent: 86408:0fff9feb4bdf user: Georg Brandl date: Thu Oct 17 19:52:33 2013 +0200 summary: merge with 3.3 files: Doc/library/zlib.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -88,8 +88,7 @@ that are expected to be most common should come at the end of the dictionary. .. versionchanged:: 3.3 - Added the *method*, *wbits*, *memlevel*, *strategy* and *zdict* - parameters. + Added the *zdict* parameter and keyword argument support. .. function:: crc32(data[, value]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 22:05:51 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 22:05:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5Mjc2?= =?utf-8?q?=3A_Fixed_the_wave_module_on_64-bit_big-endian_platforms=2E?= Message-ID: <3d11b36FRkz7Lkd@mail.python.org> http://hg.python.org/cpython/rev/9d2605f24a86 changeset: 86410:9d2605f24a86 branch: 2.7 parent: 86407:c54c8e71b79a user: Serhiy Storchaka date: Thu Oct 17 23:03:48 2013 +0300 summary: Issue #19276: Fixed the wave module on 64-bit big-endian platforms. files: Lib/wave.py | 4 +++- Misc/NEWS | 2 ++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -80,7 +80,7 @@ WAVE_FORMAT_PCM = 0x0001 -_array_fmts = None, 'b', 'h', None, 'l' +_array_fmts = None, 'b', 'h', None, 'i' # Determine endian-ness import struct @@ -238,6 +238,7 @@ import array chunk = self._data_chunk data = array.array(_array_fmts[self._sampwidth]) + assert data.itemsize == self._sampwidth nitems = nframes * self._nchannels if nitems * self._sampwidth > chunk.chunksize - chunk.size_read: nitems = (chunk.chunksize - chunk.size_read) / self._sampwidth @@ -421,6 +422,7 @@ if self._sampwidth > 1 and big_endian: import array data = array.array(_array_fmts[self._sampwidth], data) + assert data.itemsize == self._sampwidth data.byteswap() data.tofile(self._file) self._datawritten = self._datawritten + len(data) * self._sampwidth diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,8 @@ Library ------- +- Issue #19276: Fixed the wave module on 64-bit big-endian platforms. + - Issue #18458: Prevent crashes with newer versions of libedit. Its readline emulation has changed from 0-based indexing to 1-based like gnu readline. Original patch by Ronald Oussoren. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 22:05:53 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 22:05:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mjc2?= =?utf-8?q?=3A_Fixed_the_wave_module_on_64-bit_big-endian_platforms=2E?= Message-ID: <3d11b513r7z7LkX@mail.python.org> http://hg.python.org/cpython/rev/a1a4a527c699 changeset: 86411:a1a4a527c699 branch: 3.3 parent: 86408:0fff9feb4bdf user: Serhiy Storchaka date: Thu Oct 17 23:04:04 2013 +0300 summary: Issue #19276: Fixed the wave module on 64-bit big-endian platforms. files: Lib/wave.py | 4 +++- Misc/NEWS | 2 ++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -80,7 +80,7 @@ WAVE_FORMAT_PCM = 0x0001 -_array_fmts = None, 'b', 'h', None, 'l' +_array_fmts = None, 'b', 'h', None, 'i' # Determine endian-ness import struct @@ -238,6 +238,7 @@ import array chunk = self._data_chunk data = array.array(_array_fmts[self._sampwidth]) + assert data.itemsize == self._sampwidth nitems = nframes * self._nchannels if nitems * self._sampwidth > chunk.chunksize - chunk.size_read: nitems = (chunk.chunksize - chunk.size_read) // self._sampwidth @@ -421,6 +422,7 @@ if self._sampwidth > 1 and big_endian: import array data = array.array(_array_fmts[self._sampwidth], data) + assert data.itemsize == self._sampwidth data.byteswap() data.tofile(self._file) self._datawritten = self._datawritten + len(data) * self._sampwidth diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,8 @@ Library ------- +- Issue #19276: Fixed the wave module on 64-bit big-endian platforms. + - Issue #18776: atexit callbacks now display their full traceback when they raise an exception. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 22:05:54 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 17 Oct 2013 22:05:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319276=3A_Fixed_the_wave_module_on_64-bit_big-en?= =?utf-8?q?dian_platforms=2E?= Message-ID: <3d11b633Kbz7Lkw@mail.python.org> http://hg.python.org/cpython/rev/7e8ad3084891 changeset: 86412:7e8ad3084891 parent: 86409:22931761e4a3 parent: 86411:a1a4a527c699 user: Serhiy Storchaka date: Thu Oct 17 23:05:19 2013 +0300 summary: Issue #19276: Fixed the wave module on 64-bit big-endian platforms. files: Lib/wave.py | 4 +++- Misc/NEWS | 2 ++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -80,7 +80,7 @@ WAVE_FORMAT_PCM = 0x0001 -_array_fmts = None, 'b', 'h', None, 'l' +_array_fmts = None, 'b', 'h', None, 'i' import struct import sys @@ -244,6 +244,7 @@ import array chunk = self._data_chunk data = array.array(_array_fmts[self._sampwidth]) + assert data.itemsize == self._sampwidth nitems = nframes * self._nchannels if nitems * self._sampwidth > chunk.chunksize - chunk.size_read: nitems = (chunk.chunksize - chunk.size_read) // self._sampwidth @@ -433,6 +434,7 @@ if self._sampwidth > 1 and sys.byteorder == 'big': import array data = array.array(_array_fmts[self._sampwidth], data) + assert data.itemsize == self._sampwidth data.byteswap() data.tofile(self._file) self._datawritten = self._datawritten + len(data) * self._sampwidth diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,8 @@ Library ------- +- Issue #19276: Fixed the wave module on 64-bit big-endian platforms. + - Issue #19266: Rename the new-in-3.4 ``contextlib.ignore`` context manager to ``contextlib.suppress`` in order to be more consistent with existing descriptions of that operation elsewhere in the language and standard -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 22:40:58 2013 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 17 Oct 2013 22:40:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Initial_checkin_of_asyncio?= =?utf-8?b?IHBhY2thZ2UgKD09IFR1bGlwLCA9PSBQRVAgMzE1Niku?= Message-ID: <3d12MZ38HMz7LkR@mail.python.org> http://hg.python.org/cpython/rev/dafe78cd58c7 changeset: 86413:dafe78cd58c7 user: Guido van Rossum date: Thu Oct 17 13:40:50 2013 -0700 summary: Initial checkin of asyncio package (== Tulip, == PEP 3156). files: Lib/asyncio/__init__.py | 33 + Lib/asyncio/base_events.py | 606 +++ Lib/asyncio/constants.py | 4 + Lib/asyncio/events.py | 395 ++ Lib/asyncio/futures.py | 338 ++ Lib/asyncio/locks.py | 401 ++ Lib/asyncio/log.py | 6 + Lib/asyncio/proactor_events.py | 352 ++ Lib/asyncio/protocols.py | 98 + Lib/asyncio/queues.py | 284 + Lib/asyncio/selector_events.py | 769 ++++ Lib/asyncio/streams.py | 257 + Lib/asyncio/tasks.py | 636 ++++ Lib/asyncio/test_utils.py | 246 + Lib/asyncio/transports.py | 186 + Lib/asyncio/unix_events.py | 541 +++ Lib/asyncio/windows_events.py | 375 ++ Lib/asyncio/windows_utils.py | 181 + Lib/test/test_asyncio/__init__.py | 26 + Lib/test/test_asyncio/__main__.py | 5 + Lib/test/test_asyncio/echo.py | 6 + Lib/test/test_asyncio/echo2.py | 6 + Lib/test/test_asyncio/echo3.py | 9 + Lib/test/test_asyncio/sample.crt | 14 + Lib/test/test_asyncio/sample.key | 15 + Lib/test/test_asyncio/test_base_events.py | 590 +++ Lib/test/test_asyncio/test_events.py | 1573 ++++++++++ Lib/test/test_asyncio/test_futures.py | 329 ++ Lib/test/test_asyncio/test_locks.py | 765 ++++ Lib/test/test_asyncio/test_proactor_events.py | 480 +++ Lib/test/test_asyncio/test_queues.py | 470 ++ Lib/test/test_asyncio/test_selector_events.py | 1485 +++++++++ Lib/test/test_asyncio/test_selectors.py | 145 + Lib/test/test_asyncio/test_streams.py | 361 ++ Lib/test/test_asyncio/test_tasks.py | 1518 +++++++++ Lib/test/test_asyncio/test_transports.py | 55 + Lib/test/test_asyncio/test_unix_events.py | 767 ++++ Lib/test/test_asyncio/test_windows_events.py | 95 + Lib/test/test_asyncio/test_windows_utils.py | 136 + Lib/test/test_asyncio/tests.txt | 14 + Misc/NEWS | 6 + Modules/overlapped.c | 1202 +++++++ PCbuild/_overlapped.vcxproj | 234 + PCbuild/pcbuild.sln | 2 + 44 files changed, 16016 insertions(+), 0 deletions(-) diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/__init__.py @@ -0,0 +1,33 @@ +"""The asyncio package, tracking PEP 3156.""" + +import sys + +# The selectors module is in the stdlib in Python 3.4 but not in 3.3. +# Do this first, so the other submodules can use "from . import selectors". +try: + import selectors # Will also be exported. +except ImportError: + from . import selectors + +# This relies on each of the submodules having an __all__ variable. +from .futures import * +from .events import * +from .locks import * +from .transports import * +from .protocols import * +from .streams import * +from .tasks import * + +if sys.platform == 'win32': # pragma: no cover + from .windows_events import * +else: + from .unix_events import * # pragma: no cover + + +__all__ = (futures.__all__ + + events.__all__ + + locks.__all__ + + transports.__all__ + + protocols.__all__ + + streams.__all__ + + tasks.__all__) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/base_events.py @@ -0,0 +1,606 @@ +"""Base implementation of event loop. + +The event loop can be broken up into a multiplexer (the part +responsible for notifying us of IO events) and the event loop proper, +which wraps a multiplexer with functionality for scheduling callbacks, +immediately or at a given time in the future. + +Whenever a public API takes a callback, subsequent positional +arguments will be passed to the callback if/when it is called. This +avoids the proliferation of trivial lambdas implementing closures. +Keyword arguments for the callback are not supported; this is a +conscious design decision, leaving the door open for keyword arguments +to modify the meaning of the API call itself. +""" + + +import collections +import concurrent.futures +import heapq +import logging +import socket +import subprocess +import time +import os +import sys + +from . import events +from . import futures +from . import tasks +from .log import asyncio_log + + +__all__ = ['BaseEventLoop', 'Server'] + + +# Argument for default thread pool executor creation. +_MAX_WORKERS = 5 + + +class _StopError(BaseException): + """Raised to stop the event loop.""" + + +def _raise_stop_error(*args): + raise _StopError + + +class Server(events.AbstractServer): + + def __init__(self, loop, sockets): + self.loop = loop + self.sockets = sockets + self.active_count = 0 + self.waiters = [] + + def attach(self, transport): + assert self.sockets is not None + self.active_count += 1 + + def detach(self, transport): + assert self.active_count > 0 + self.active_count -= 1 + if self.active_count == 0 and self.sockets is None: + self._wakeup() + + def close(self): + sockets = self.sockets + if sockets is not None: + self.sockets = None + for sock in sockets: + self.loop._stop_serving(sock) + if self.active_count == 0: + self._wakeup() + + def _wakeup(self): + waiters = self.waiters + self.waiters = None + for waiter in waiters: + if not waiter.done(): + waiter.set_result(waiter) + + @tasks.coroutine + def wait_closed(self): + if self.sockets is None or self.waiters is None: + return + waiter = futures.Future(loop=self.loop) + self.waiters.append(waiter) + yield from waiter + + +class BaseEventLoop(events.AbstractEventLoop): + + def __init__(self): + self._ready = collections.deque() + self._scheduled = [] + self._default_executor = None + self._internal_fds = 0 + self._running = False + + def _make_socket_transport(self, sock, protocol, waiter=None, *, + extra=None, server=None): + """Create socket transport.""" + raise NotImplementedError + + def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter, *, + server_side=False, server_hostname=None, + extra=None, server=None): + """Create SSL transport.""" + raise NotImplementedError + + def _make_datagram_transport(self, sock, protocol, + address=None, extra=None): + """Create datagram transport.""" + raise NotImplementedError + + def _make_read_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + """Create read pipe transport.""" + raise NotImplementedError + + def _make_write_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + """Create write pipe transport.""" + raise NotImplementedError + + @tasks.coroutine + def _make_subprocess_transport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + """Create subprocess transport.""" + raise NotImplementedError + + def _read_from_self(self): + """XXX""" + raise NotImplementedError + + def _write_to_self(self): + """XXX""" + raise NotImplementedError + + def _process_events(self, event_list): + """Process selector events.""" + raise NotImplementedError + + def run_forever(self): + """Run until stop() is called.""" + if self._running: + raise RuntimeError('Event loop is running.') + self._running = True + try: + while True: + try: + self._run_once() + except _StopError: + break + finally: + self._running = False + + def run_until_complete(self, future): + """Run until the Future is done. + + If the argument is a coroutine, it is wrapped in a Task. + + XXX TBD: It would be disastrous to call run_until_complete() + with the same coroutine twice -- it would wrap it in two + different Tasks and that can't be good. + + Return the Future's result, or raise its exception. + """ + future = tasks.async(future, loop=self) + future.add_done_callback(_raise_stop_error) + self.run_forever() + future.remove_done_callback(_raise_stop_error) + if not future.done(): + raise RuntimeError('Event loop stopped before Future completed.') + + return future.result() + + def stop(self): + """Stop running the event loop. + + Every callback scheduled before stop() is called will run. + Callback scheduled after stop() is called won't. However, + those callbacks will run if run() is called again later. + """ + self.call_soon(_raise_stop_error) + + def is_running(self): + """Returns running status of event loop.""" + return self._running + + def time(self): + """Return the time according to the event loop's clock.""" + return time.monotonic() + + def call_later(self, delay, callback, *args): + """Arrange for a callback to be called at a given time. + + Return a Handle: an opaque object with a cancel() method that + can be used to cancel the call. + + The delay can be an int or float, expressed in seconds. It is + always a relative time. + + Each callback will be called exactly once. If two callbacks + are scheduled for exactly the same time, it undefined which + will be called first. + + Any positional arguments after the callback will be passed to + the callback when it is called. + """ + return self.call_at(self.time() + delay, callback, *args) + + def call_at(self, when, callback, *args): + """Like call_later(), but uses an absolute time.""" + timer = events.TimerHandle(when, callback, args) + heapq.heappush(self._scheduled, timer) + return timer + + def call_soon(self, callback, *args): + """Arrange for a callback to be called as soon as possible. + + This operates as a FIFO queue, callbacks are called in the + order in which they are registered. Each callback will be + called exactly once. + + Any positional arguments after the callback will be passed to + the callback when it is called. + """ + handle = events.make_handle(callback, args) + self._ready.append(handle) + return handle + + def call_soon_threadsafe(self, callback, *args): + """XXX""" + handle = self.call_soon(callback, *args) + self._write_to_self() + return handle + + def run_in_executor(self, executor, callback, *args): + if isinstance(callback, events.Handle): + assert not args + assert not isinstance(callback, events.TimerHandle) + if callback._cancelled: + f = futures.Future(loop=self) + f.set_result(None) + return f + callback, args = callback._callback, callback._args + if executor is None: + executor = self._default_executor + if executor is None: + executor = concurrent.futures.ThreadPoolExecutor(_MAX_WORKERS) + self._default_executor = executor + return futures.wrap_future(executor.submit(callback, *args), loop=self) + + def set_default_executor(self, executor): + self._default_executor = executor + + def getaddrinfo(self, host, port, *, + family=0, type=0, proto=0, flags=0): + return self.run_in_executor(None, socket.getaddrinfo, + host, port, family, type, proto, flags) + + def getnameinfo(self, sockaddr, flags=0): + return self.run_in_executor(None, socket.getnameinfo, sockaddr, flags) + + @tasks.coroutine + def create_connection(self, protocol_factory, host=None, port=None, *, + ssl=None, family=0, proto=0, flags=0, sock=None, + local_addr=None): + """XXX""" + if host is not None or port is not None: + if sock is not None: + raise ValueError( + 'host/port and sock can not be specified at the same time') + + f1 = self.getaddrinfo( + host, port, family=family, + type=socket.SOCK_STREAM, proto=proto, flags=flags) + fs = [f1] + if local_addr is not None: + f2 = self.getaddrinfo( + *local_addr, family=family, + type=socket.SOCK_STREAM, proto=proto, flags=flags) + fs.append(f2) + else: + f2 = None + + yield from tasks.wait(fs, loop=self) + + infos = f1.result() + if not infos: + raise OSError('getaddrinfo() returned empty list') + if f2 is not None: + laddr_infos = f2.result() + if not laddr_infos: + raise OSError('getaddrinfo() returned empty list') + + exceptions = [] + for family, type, proto, cname, address in infos: + try: + sock = socket.socket(family=family, type=type, proto=proto) + sock.setblocking(False) + if f2 is not None: + for _, _, _, _, laddr in laddr_infos: + try: + sock.bind(laddr) + break + except OSError as exc: + exc = OSError( + exc.errno, 'error while ' + 'attempting to bind on address ' + '{!r}: {}'.format( + laddr, exc.strerror.lower())) + exceptions.append(exc) + else: + sock.close() + sock = None + continue + yield from self.sock_connect(sock, address) + except OSError as exc: + if sock is not None: + sock.close() + exceptions.append(exc) + else: + break + else: + if len(exceptions) == 1: + raise exceptions[0] + else: + # If they all have the same str(), raise one. + model = str(exceptions[0]) + if all(str(exc) == model for exc in exceptions): + raise exceptions[0] + # Raise a combined exception so the user can see all + # the various error messages. + raise OSError('Multiple exceptions: {}'.format( + ', '.join(str(exc) for exc in exceptions))) + + elif sock is None: + raise ValueError( + 'host and port was not specified and no sock specified') + + sock.setblocking(False) + + protocol = protocol_factory() + waiter = futures.Future(loop=self) + if ssl: + sslcontext = None if isinstance(ssl, bool) else ssl + transport = self._make_ssl_transport( + sock, protocol, sslcontext, waiter, + server_side=False, server_hostname=host) + else: + transport = self._make_socket_transport(sock, protocol, waiter) + + yield from waiter + return transport, protocol + + @tasks.coroutine + def create_datagram_endpoint(self, protocol_factory, + local_addr=None, remote_addr=None, *, + family=0, proto=0, flags=0): + """Create datagram connection.""" + if not (local_addr or remote_addr): + if family == 0: + raise ValueError('unexpected address family') + addr_pairs_info = (((family, proto), (None, None)),) + else: + # join addresss by (family, protocol) + addr_infos = collections.OrderedDict() + for idx, addr in ((0, local_addr), (1, remote_addr)): + if addr is not None: + assert isinstance(addr, tuple) and len(addr) == 2, ( + '2-tuple is expected') + + infos = yield from self.getaddrinfo( + *addr, family=family, type=socket.SOCK_DGRAM, + proto=proto, flags=flags) + if not infos: + raise OSError('getaddrinfo() returned empty list') + + for fam, _, pro, _, address in infos: + key = (fam, pro) + if key not in addr_infos: + addr_infos[key] = [None, None] + addr_infos[key][idx] = address + + # each addr has to have info for each (family, proto) pair + addr_pairs_info = [ + (key, addr_pair) for key, addr_pair in addr_infos.items() + if not ((local_addr and addr_pair[0] is None) or + (remote_addr and addr_pair[1] is None))] + + if not addr_pairs_info: + raise ValueError('can not get address information') + + exceptions = [] + + for ((family, proto), + (local_address, remote_address)) in addr_pairs_info: + sock = None + r_addr = None + try: + sock = socket.socket( + family=family, type=socket.SOCK_DGRAM, proto=proto) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(False) + + if local_addr: + sock.bind(local_address) + if remote_addr: + yield from self.sock_connect(sock, remote_address) + r_addr = remote_address + except OSError as exc: + if sock is not None: + sock.close() + exceptions.append(exc) + else: + break + else: + raise exceptions[0] + + protocol = protocol_factory() + transport = self._make_datagram_transport(sock, protocol, r_addr) + return transport, protocol + + @tasks.coroutine + def create_server(self, protocol_factory, host=None, port=None, + *, + family=socket.AF_UNSPEC, + flags=socket.AI_PASSIVE, + sock=None, + backlog=100, + ssl=None, + reuse_address=None): + """XXX""" + if host is not None or port is not None: + if sock is not None: + raise ValueError( + 'host/port and sock can not be specified at the same time') + + AF_INET6 = getattr(socket, 'AF_INET6', 0) + if reuse_address is None: + reuse_address = os.name == 'posix' and sys.platform != 'cygwin' + sockets = [] + if host == '': + host = None + + infos = yield from self.getaddrinfo( + host, port, family=family, + type=socket.SOCK_STREAM, proto=0, flags=flags) + if not infos: + raise OSError('getaddrinfo() returned empty list') + + completed = False + try: + for res in infos: + af, socktype, proto, canonname, sa = res + sock = socket.socket(af, socktype, proto) + sockets.append(sock) + if reuse_address: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, + True) + # Disable IPv4/IPv6 dual stack support (enabled by + # default on Linux) which makes a single socket + # listen on both address families. + if af == AF_INET6 and hasattr(socket, 'IPPROTO_IPV6'): + sock.setsockopt(socket.IPPROTO_IPV6, + socket.IPV6_V6ONLY, + True) + try: + sock.bind(sa) + except OSError as err: + raise OSError(err.errno, 'error while attempting ' + 'to bind on address %r: %s' + % (sa, err.strerror.lower())) + completed = True + finally: + if not completed: + for sock in sockets: + sock.close() + else: + if sock is None: + raise ValueError( + 'host and port was not specified and no sock specified') + sockets = [sock] + + server = Server(self, sockets) + for sock in sockets: + sock.listen(backlog) + sock.setblocking(False) + self._start_serving(protocol_factory, sock, ssl, server) + return server + + @tasks.coroutine + def connect_read_pipe(self, protocol_factory, pipe): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + transport = self._make_read_pipe_transport(pipe, protocol, waiter) + yield from waiter + return transport, protocol + + @tasks.coroutine + def connect_write_pipe(self, protocol_factory, pipe): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + transport = self._make_write_pipe_transport(pipe, protocol, waiter) + yield from waiter + return transport, protocol + + @tasks.coroutine + def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=False, shell=True, bufsize=0, + **kwargs): + assert not universal_newlines, "universal_newlines must be False" + assert shell, "shell must be True" + assert isinstance(cmd, str), cmd + protocol = protocol_factory() + transport = yield from self._make_subprocess_transport( + protocol, cmd, True, stdin, stdout, stderr, bufsize, **kwargs) + return transport, protocol + + @tasks.coroutine + def subprocess_exec(self, protocol_factory, *args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=False, shell=False, bufsize=0, + **kwargs): + assert not universal_newlines, "universal_newlines must be False" + assert not shell, "shell must be False" + protocol = protocol_factory() + transport = yield from self._make_subprocess_transport( + protocol, args, False, stdin, stdout, stderr, bufsize, **kwargs) + return transport, protocol + + def _add_callback(self, handle): + """Add a Handle to ready or scheduled.""" + assert isinstance(handle, events.Handle), 'A Handle is required here' + if handle._cancelled: + return + if isinstance(handle, events.TimerHandle): + heapq.heappush(self._scheduled, handle) + else: + self._ready.append(handle) + + def _add_callback_signalsafe(self, handle): + """Like _add_callback() but called from a signal handler.""" + self._add_callback(handle) + self._write_to_self() + + def _run_once(self): + """Run one full iteration of the event loop. + + This calls all currently ready callbacks, polls for I/O, + schedules the resulting callbacks, and finally schedules + 'call_later' callbacks. + """ + # Remove delayed calls that were cancelled from head of queue. + while self._scheduled and self._scheduled[0]._cancelled: + heapq.heappop(self._scheduled) + + timeout = None + if self._ready: + timeout = 0 + elif self._scheduled: + # Compute the desired timeout. + when = self._scheduled[0]._when + deadline = max(0, when - self.time()) + if timeout is None: + timeout = deadline + else: + timeout = min(timeout, deadline) + + # TODO: Instrumentation only in debug mode? + t0 = self.time() + event_list = self._selector.select(timeout) + t1 = self.time() + argstr = '' if timeout is None else '{:.3f}'.format(timeout) + if t1-t0 >= 1: + level = logging.INFO + else: + level = logging.DEBUG + asyncio_log.log(level, 'poll%s took %.3f seconds', argstr, t1-t0) + self._process_events(event_list) + + # Handle 'later' callbacks that are ready. + now = self.time() + while self._scheduled: + handle = self._scheduled[0] + if handle._when > now: + break + handle = heapq.heappop(self._scheduled) + self._ready.append(handle) + + # This is the only place where callbacks are actually *called*. + # All other places just add them to ready. + # Note: We run all currently scheduled callbacks, but not any + # callbacks scheduled by callbacks run this time around -- + # they will be run the next time (after another I/O poll). + # Use an idiom that is threadsafe without using locks. + ntodo = len(self._ready) + for i in range(ntodo): + handle = self._ready.popleft() + if not handle._cancelled: + handle._run() + handle = None # Needed to break cycles when an exception occurs. diff --git a/Lib/asyncio/constants.py b/Lib/asyncio/constants.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/constants.py @@ -0,0 +1,4 @@ +"""Constants.""" + + +LOG_THRESHOLD_FOR_CONNLOST_WRITES = 5 diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/events.py @@ -0,0 +1,395 @@ +"""Event loop and event loop policy.""" + +__all__ = ['AbstractEventLoopPolicy', 'DefaultEventLoopPolicy', + 'AbstractEventLoop', 'AbstractServer', + 'Handle', 'TimerHandle', + 'get_event_loop_policy', 'set_event_loop_policy', + 'get_event_loop', 'set_event_loop', 'new_event_loop', + ] + +import subprocess +import sys +import threading +import socket + +from .log import asyncio_log + + +class Handle: + """Object returned by callback registration methods.""" + + def __init__(self, callback, args): + self._callback = callback + self._args = args + self._cancelled = False + + def __repr__(self): + res = 'Handle({}, {})'.format(self._callback, self._args) + if self._cancelled: + res += '' + return res + + def cancel(self): + self._cancelled = True + + def _run(self): + try: + self._callback(*self._args) + except Exception: + asyncio_log.exception('Exception in callback %s %r', + self._callback, self._args) + self = None # Needed to break cycles when an exception occurs. + + +def make_handle(callback, args): + # TODO: Inline this? + assert not isinstance(callback, Handle), 'A Handle is not a callback' + return Handle(callback, args) + + +class TimerHandle(Handle): + """Object returned by timed callback registration methods.""" + + def __init__(self, when, callback, args): + assert when is not None + super().__init__(callback, args) + + self._when = when + + def __repr__(self): + res = 'TimerHandle({}, {}, {})'.format(self._when, + self._callback, + self._args) + if self._cancelled: + res += '' + + return res + + def __hash__(self): + return hash(self._when) + + def __lt__(self, other): + return self._when < other._when + + def __le__(self, other): + if self._when < other._when: + return True + return self.__eq__(other) + + def __gt__(self, other): + return self._when > other._when + + def __ge__(self, other): + if self._when > other._when: + return True + return self.__eq__(other) + + def __eq__(self, other): + if isinstance(other, TimerHandle): + return (self._when == other._when and + self._callback == other._callback and + self._args == other._args and + self._cancelled == other._cancelled) + return NotImplemented + + def __ne__(self, other): + equal = self.__eq__(other) + return NotImplemented if equal is NotImplemented else not equal + + +class AbstractServer: + """Abstract server returned by create_service().""" + + def close(self): + """Stop serving. This leaves existing connections open.""" + return NotImplemented + + def wait_closed(self): + """Coroutine to wait until service is closed.""" + return NotImplemented + + +class AbstractEventLoop: + """Abstract event loop.""" + + # Running and stopping the event loop. + + def run_forever(self): + """Run the event loop until stop() is called.""" + raise NotImplementedError + + def run_until_complete(self, future): + """Run the event loop until a Future is done. + + Return the Future's result, or raise its exception. + """ + raise NotImplementedError + + def stop(self): + """Stop the event loop as soon as reasonable. + + Exactly how soon that is may depend on the implementation, but + no more I/O callbacks should be scheduled. + """ + raise NotImplementedError + + def is_running(self): + """Return whether the event loop is currently running.""" + raise NotImplementedError + + # Methods scheduling callbacks. All these return Handles. + + def call_soon(self, callback, *args): + return self.call_later(0, callback, *args) + + def call_later(self, delay, callback, *args): + raise NotImplementedError + + def call_at(self, when, callback, *args): + raise NotImplementedError + + def time(self): + raise NotImplementedError + + # Methods for interacting with threads. + + def call_soon_threadsafe(self, callback, *args): + raise NotImplementedError + + def run_in_executor(self, executor, callback, *args): + raise NotImplementedError + + def set_default_executor(self, executor): + raise NotImplementedError + + # Network I/O methods returning Futures. + + def getaddrinfo(self, host, port, *, family=0, type=0, proto=0, flags=0): + raise NotImplementedError + + def getnameinfo(self, sockaddr, flags=0): + raise NotImplementedError + + def create_connection(self, protocol_factory, host=None, port=None, *, + ssl=None, family=0, proto=0, flags=0, sock=None, + local_addr=None): + raise NotImplementedError + + def create_server(self, protocol_factory, host=None, port=None, *, + family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, + sock=None, backlog=100, ssl=None, reuse_address=None): + """A coroutine which creates a TCP server bound to host and port. + + The return value is a Server object which can be used to stop + the service. + + If host is an empty string or None all interfaces are assumed + and a list of multiple sockets will be returned (most likely + one for IPv4 and another one for IPv6). + + family can be set to either AF_INET or AF_INET6 to force the + socket to use IPv4 or IPv6. If not set it will be determined + from host (defaults to AF_UNSPEC). + + flags is a bitmask for getaddrinfo(). + + sock can optionally be specified in order to use a preexisting + socket object. + + backlog is the maximum number of queued connections passed to + listen() (defaults to 100). + + ssl can be set to an SSLContext to enable SSL over the + accepted connections. + + reuse_address tells the kernel to reuse a local socket in + TIME_WAIT state, without waiting for its natural timeout to + expire. If not specified will automatically be set to True on + UNIX. + """ + raise NotImplementedError + + def create_datagram_endpoint(self, protocol_factory, + local_addr=None, remote_addr=None, *, + family=0, proto=0, flags=0): + raise NotImplementedError + + def connect_read_pipe(self, protocol_factory, pipe): + """Register read pipe in eventloop. + + protocol_factory should instantiate object with Protocol interface. + pipe is file-like object already switched to nonblocking. + Return pair (transport, protocol), where transport support + ReadTransport ABC""" + # The reason to accept file-like object instead of just file descriptor + # is: we need to own pipe and close it at transport finishing + # Can got complicated errors if pass f.fileno(), + # close fd in pipe transport then close f and vise versa. + raise NotImplementedError + + def connect_write_pipe(self, protocol_factory, pipe): + """Register write pipe in eventloop. + + protocol_factory should instantiate object with BaseProtocol interface. + Pipe is file-like object already switched to nonblocking. + Return pair (transport, protocol), where transport support + WriteTransport ABC""" + # The reason to accept file-like object instead of just file descriptor + # is: we need to own pipe and close it at transport finishing + # Can got complicated errors if pass f.fileno(), + # close fd in pipe transport then close f and vise versa. + raise NotImplementedError + + def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + **kwargs): + raise NotImplementedError + + def subprocess_exec(self, protocol_factory, *args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + **kwargs): + raise NotImplementedError + + # Ready-based callback registration methods. + # The add_*() methods return None. + # The remove_*() methods return True if something was removed, + # False if there was nothing to delete. + + def add_reader(self, fd, callback, *args): + raise NotImplementedError + + def remove_reader(self, fd): + raise NotImplementedError + + def add_writer(self, fd, callback, *args): + raise NotImplementedError + + def remove_writer(self, fd): + raise NotImplementedError + + # Completion based I/O methods returning Futures. + + def sock_recv(self, sock, nbytes): + raise NotImplementedError + + def sock_sendall(self, sock, data): + raise NotImplementedError + + def sock_connect(self, sock, address): + raise NotImplementedError + + def sock_accept(self, sock): + raise NotImplementedError + + # Signal handling. + + def add_signal_handler(self, sig, callback, *args): + raise NotImplementedError + + def remove_signal_handler(self, sig): + raise NotImplementedError + + +class AbstractEventLoopPolicy: + """Abstract policy for accessing the event loop.""" + + def get_event_loop(self): + """XXX""" + raise NotImplementedError + + def set_event_loop(self, loop): + """XXX""" + raise NotImplementedError + + def new_event_loop(self): + """XXX""" + raise NotImplementedError + + +class DefaultEventLoopPolicy(threading.local, AbstractEventLoopPolicy): + """Default policy implementation for accessing the event loop. + + In this policy, each thread has its own event loop. However, we + only automatically create an event loop by default for the main + thread; other threads by default have no event loop. + + Other policies may have different rules (e.g. a single global + event loop, or automatically creating an event loop per thread, or + using some other notion of context to which an event loop is + associated). + """ + + _loop = None + _set_called = False + + def get_event_loop(self): + """Get the event loop. + + This may be None or an instance of EventLoop. + """ + if (self._loop is None and + not self._set_called and + isinstance(threading.current_thread(), threading._MainThread)): + self._loop = self.new_event_loop() + assert self._loop is not None, \ + ('There is no current event loop in thread %r.' % + threading.current_thread().name) + return self._loop + + def set_event_loop(self, loop): + """Set the event loop.""" + # TODO: The isinstance() test violates the PEP. + self._set_called = True + assert loop is None or isinstance(loop, AbstractEventLoop) + self._loop = loop + + def new_event_loop(self): + """Create a new event loop. + + You must call set_event_loop() to make this the current event + loop. + """ + if sys.platform == 'win32': # pragma: no cover + from . import windows_events + return windows_events.SelectorEventLoop() + else: # pragma: no cover + from . import unix_events + return unix_events.SelectorEventLoop() + + +# Event loop policy. The policy itself is always global, even if the +# policy's rules say that there is an event loop per thread (or other +# notion of context). The default policy is installed by the first +# call to get_event_loop_policy(). +_event_loop_policy = None + + +def get_event_loop_policy(): + """XXX""" + global _event_loop_policy + if _event_loop_policy is None: + _event_loop_policy = DefaultEventLoopPolicy() + return _event_loop_policy + + +def set_event_loop_policy(policy): + """XXX""" + global _event_loop_policy + # TODO: The isinstance() test violates the PEP. + assert policy is None or isinstance(policy, AbstractEventLoopPolicy) + _event_loop_policy = policy + + +def get_event_loop(): + """XXX""" + return get_event_loop_policy().get_event_loop() + + +def set_event_loop(loop): + """XXX""" + get_event_loop_policy().set_event_loop(loop) + + +def new_event_loop(): + """XXX""" + return get_event_loop_policy().new_event_loop() diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/futures.py @@ -0,0 +1,338 @@ +"""A Future class similar to the one in PEP 3148.""" + +__all__ = ['CancelledError', 'TimeoutError', + 'InvalidStateError', + 'Future', 'wrap_future', + ] + +import concurrent.futures._base +import logging +import traceback + +from . import events +from .log import asyncio_log + +# States for Future. +_PENDING = 'PENDING' +_CANCELLED = 'CANCELLED' +_FINISHED = 'FINISHED' + +# TODO: Do we really want to depend on concurrent.futures internals? +Error = concurrent.futures._base.Error +CancelledError = concurrent.futures.CancelledError +TimeoutError = concurrent.futures.TimeoutError + +STACK_DEBUG = logging.DEBUG - 1 # heavy-duty debugging + + +class InvalidStateError(Error): + """The operation is not allowed in this state.""" + # TODO: Show the future, its state, the method, and the required state. + + +class _TracebackLogger: + """Helper to log a traceback upon destruction if not cleared. + + This solves a nasty problem with Futures and Tasks that have an + exception set: if nobody asks for the exception, the exception is + never logged. This violates the Zen of Python: 'Errors should + never pass silently. Unless explicitly silenced.' + + However, we don't want to log the exception as soon as + set_exception() is called: if the calling code is written + properly, it will get the exception and handle it properly. But + we *do* want to log it if result() or exception() was never called + -- otherwise developers waste a lot of time wondering why their + buggy code fails silently. + + An earlier attempt added a __del__() method to the Future class + itself, but this backfired because the presence of __del__() + prevents garbage collection from breaking cycles. A way out of + this catch-22 is to avoid having a __del__() method on the Future + class itself, but instead to have a reference to a helper object + with a __del__() method that logs the traceback, where we ensure + that the helper object doesn't participate in cycles, and only the + Future has a reference to it. + + The helper object is added when set_exception() is called. When + the Future is collected, and the helper is present, the helper + object is also collected, and its __del__() method will log the + traceback. When the Future's result() or exception() method is + called (and a helper object is present), it removes the the helper + object, after calling its clear() method to prevent it from + logging. + + One downside is that we do a fair amount of work to extract the + traceback from the exception, even when it is never logged. It + would seem cheaper to just store the exception object, but that + references the traceback, which references stack frames, which may + reference the Future, which references the _TracebackLogger, and + then the _TracebackLogger would be included in a cycle, which is + what we're trying to avoid! As an optimization, we don't + immediately format the exception; we only do the work when + activate() is called, which call is delayed until after all the + Future's callbacks have run. Since usually a Future has at least + one callback (typically set by 'yield from') and usually that + callback extracts the callback, thereby removing the need to + format the exception. + + PS. I don't claim credit for this solution. I first heard of it + in a discussion about closing files when they are collected. + """ + + __slots__ = ['exc', 'tb'] + + def __init__(self, exc): + self.exc = exc + self.tb = None + + def activate(self): + exc = self.exc + if exc is not None: + self.exc = None + self.tb = traceback.format_exception(exc.__class__, exc, + exc.__traceback__) + + def clear(self): + self.exc = None + self.tb = None + + def __del__(self): + if self.tb: + asyncio_log.error('Future/Task exception was never retrieved:\n%s', + ''.join(self.tb)) + + +class Future: + """This class is *almost* compatible with concurrent.futures.Future. + + Differences: + + - result() and exception() do not take a timeout argument and + raise an exception when the future isn't done yet. + + - Callbacks registered with add_done_callback() are always called + via the event loop's call_soon_threadsafe(). + + - This class is not compatible with the wait() and as_completed() + methods in the concurrent.futures package. + + (In Python 3.4 or later we may be able to unify the implementations.) + """ + + # Class variables serving as defaults for instance variables. + _state = _PENDING + _result = None + _exception = None + _loop = None + + _blocking = False # proper use of future (yield vs yield from) + + _tb_logger = None + + def __init__(self, *, loop=None): + """Initialize the future. + + The optional event_loop argument allows to explicitly set the event + loop object used by the future. If it's not provided, the future uses + the default event loop. + """ + if loop is None: + self._loop = events.get_event_loop() + else: + self._loop = loop + self._callbacks = [] + + def __repr__(self): + res = self.__class__.__name__ + if self._state == _FINISHED: + if self._exception is not None: + res += ''.format(self._exception) + else: + res += ''.format(self._result) + elif self._callbacks: + size = len(self._callbacks) + if size > 2: + res += '<{}, [{}, <{} more>, {}]>'.format( + self._state, self._callbacks[0], + size-2, self._callbacks[-1]) + else: + res += '<{}, {}>'.format(self._state, self._callbacks) + else: + res += '<{}>'.format(self._state) + return res + + def cancel(self): + """Cancel the future and schedule callbacks. + + If the future is already done or cancelled, return False. Otherwise, + change the future's state to cancelled, schedule the callbacks and + return True. + """ + if self._state != _PENDING: + return False + self._state = _CANCELLED + self._schedule_callbacks() + return True + + def _schedule_callbacks(self): + """Internal: Ask the event loop to call all callbacks. + + The callbacks are scheduled to be called as soon as possible. Also + clears the callback list. + """ + callbacks = self._callbacks[:] + if not callbacks: + return + + self._callbacks[:] = [] + for callback in callbacks: + self._loop.call_soon(callback, self) + + def cancelled(self): + """Return True if the future was cancelled.""" + return self._state == _CANCELLED + + # Don't implement running(); see http://bugs.python.org/issue18699 + + def done(self): + """Return True if the future is done. + + Done means either that a result / exception are available, or that the + future was cancelled. + """ + return self._state != _PENDING + + def result(self): + """Return the result this future represents. + + If the future has been cancelled, raises CancelledError. If the + future's result isn't yet available, raises InvalidStateError. If + the future is done and has an exception set, this exception is raised. + """ + if self._state == _CANCELLED: + raise CancelledError + if self._state != _FINISHED: + raise InvalidStateError('Result is not ready.') + if self._tb_logger is not None: + self._tb_logger.clear() + self._tb_logger = None + if self._exception is not None: + raise self._exception + return self._result + + def exception(self): + """Return the exception that was set on this future. + + The exception (or None if no exception was set) is returned only if + the future is done. If the future has been cancelled, raises + CancelledError. If the future isn't done yet, raises + InvalidStateError. + """ + if self._state == _CANCELLED: + raise CancelledError + if self._state != _FINISHED: + raise InvalidStateError('Exception is not set.') + if self._tb_logger is not None: + self._tb_logger.clear() + self._tb_logger = None + return self._exception + + def add_done_callback(self, fn): + """Add a callback to be run when the future becomes done. + + The callback is called with a single argument - the future object. If + the future is already done when this is called, the callback is + scheduled with call_soon. + """ + if self._state != _PENDING: + self._loop.call_soon(fn, self) + else: + self._callbacks.append(fn) + + # New method not in PEP 3148. + + def remove_done_callback(self, fn): + """Remove all instances of a callback from the "call when done" list. + + Returns the number of callbacks removed. + """ + filtered_callbacks = [f for f in self._callbacks if f != fn] + removed_count = len(self._callbacks) - len(filtered_callbacks) + if removed_count: + self._callbacks[:] = filtered_callbacks + return removed_count + + # So-called internal methods (note: no set_running_or_notify_cancel()). + + def set_result(self, result): + """Mark the future done and set its result. + + If the future is already done when this method is called, raises + InvalidStateError. + """ + if self._state != _PENDING: + raise InvalidStateError('{}: {!r}'.format(self._state, self)) + self._result = result + self._state = _FINISHED + self._schedule_callbacks() + + def set_exception(self, exception): + """Mark the future done and set an exception. + + If the future is already done when this method is called, raises + InvalidStateError. + """ + if self._state != _PENDING: + raise InvalidStateError('{}: {!r}'.format(self._state, self)) + self._exception = exception + self._tb_logger = _TracebackLogger(exception) + self._state = _FINISHED + self._schedule_callbacks() + # Arrange for the logger to be activated after all callbacks + # have had a chance to call result() or exception(). + self._loop.call_soon(self._tb_logger.activate) + + # Truly internal methods. + + def _copy_state(self, other): + """Internal helper to copy state from another Future. + + The other Future may be a concurrent.futures.Future. + """ + assert other.done() + assert not self.done() + if other.cancelled(): + self.cancel() + else: + exception = other.exception() + if exception is not None: + self.set_exception(exception) + else: + result = other.result() + self.set_result(result) + + def __iter__(self): + if not self.done(): + self._blocking = True + yield self # This tells Task to wait for completion. + assert self.done(), "yield from wasn't used with future" + return self.result() # May raise too. + + +def wrap_future(fut, *, loop=None): + """Wrap concurrent.futures.Future object.""" + if isinstance(fut, Future): + return fut + + assert isinstance(fut, concurrent.futures.Future), \ + 'concurrent.futures.Future is expected, got {!r}'.format(fut) + + if loop is None: + loop = events.get_event_loop() + + new_future = Future(loop=loop) + fut.add_done_callback( + lambda future: loop.call_soon_threadsafe( + new_future._copy_state, fut)) + return new_future diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/locks.py @@ -0,0 +1,401 @@ +"""Synchronization primitives.""" + +__all__ = ['Lock', 'Event', 'Condition', 'Semaphore'] + +import collections + +from . import events +from . import futures +from . import tasks + + +class Lock: + """Primitive lock objects. + + A primitive lock is a synchronization primitive that is not owned + by a particular coroutine when locked. A primitive lock is in one + of two states, 'locked' or 'unlocked'. + + It is created in the unlocked state. It has two basic methods, + acquire() and release(). When the state is unlocked, acquire() + changes the state to locked and returns immediately. When the + state is locked, acquire() blocks until a call to release() in + another coroutine changes it to unlocked, then the acquire() call + resets it to locked and returns. The release() method should only + be called in the locked state; it changes the state to unlocked + and returns immediately. If an attempt is made to release an + unlocked lock, a RuntimeError will be raised. + + When more than one coroutine is blocked in acquire() waiting for + the state to turn to unlocked, only one coroutine proceeds when a + release() call resets the state to unlocked; first coroutine which + is blocked in acquire() is being processed. + + acquire() is a coroutine and should be called with 'yield from'. + + Locks also support the context manager protocol. '(yield from lock)' + should be used as context manager expression. + + Usage: + + lock = Lock() + ... + yield from lock + try: + ... + finally: + lock.release() + + Context manager usage: + + lock = Lock() + ... + with (yield from lock): + ... + + Lock objects can be tested for locking state: + + if not lock.locked(): + yield from lock + else: + # lock is acquired + ... + + """ + + def __init__(self, *, loop=None): + self._waiters = collections.deque() + self._locked = False + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + res = super().__repr__() + extra = 'locked' if self._locked else 'unlocked' + if self._waiters: + extra = '{},waiters:{}'.format(extra, len(self._waiters)) + return '<{} [{}]>'.format(res[1:-1], extra) + + def locked(self): + """Return true if lock is acquired.""" + return self._locked + + @tasks.coroutine + def acquire(self): + """Acquire a lock. + + This method blocks until the lock is unlocked, then sets it to + locked and returns True. + """ + if not self._waiters and not self._locked: + self._locked = True + return True + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield from fut + self._locked = True + return True + finally: + self._waiters.remove(fut) + + def release(self): + """Release a lock. + + When the lock is locked, reset it to unlocked, and return. + If any other coroutines are blocked waiting for the lock to become + unlocked, allow exactly one of them to proceed. + + When invoked on an unlocked lock, a RuntimeError is raised. + + There is no return value. + """ + if self._locked: + self._locked = False + # Wake up the first waiter who isn't cancelled. + for fut in self._waiters: + if not fut.done(): + fut.set_result(True) + break + else: + raise RuntimeError('Lock is not acquired.') + + def __enter__(self): + if not self._locked: + raise RuntimeError( + '"yield from" should be used as context manager expression') + return True + + def __exit__(self, *args): + self.release() + + def __iter__(self): + yield from self.acquire() + return self + + +class Event: + """An Event implementation, our equivalent to threading.Event. + + Class implementing event objects. An event manages a flag that can be set + to true with the set() method and reset to false with the clear() method. + The wait() method blocks until the flag is true. The flag is initially + false. + """ + + def __init__(self, *, loop=None): + self._waiters = collections.deque() + self._value = False + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + # TODO: add waiters:N if > 0. + res = super().__repr__() + return '<{} [{}]>'.format(res[1:-1], 'set' if self._value else 'unset') + + def is_set(self): + """Return true if and only if the internal flag is true.""" + return self._value + + def set(self): + """Set the internal flag to true. All coroutines waiting for it to + become true are awakened. Coroutine that call wait() once the flag is + true will not block at all. + """ + if not self._value: + self._value = True + + for fut in self._waiters: + if not fut.done(): + fut.set_result(True) + + def clear(self): + """Reset the internal flag to false. Subsequently, coroutines calling + wait() will block until set() is called to set the internal flag + to true again.""" + self._value = False + + @tasks.coroutine + def wait(self): + """Block until the internal flag is true. + + If the internal flag is true on entry, return True + immediately. Otherwise, block until another coroutine calls + set() to set the flag to true, then return True. + """ + if self._value: + return True + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield from fut + return True + finally: + self._waiters.remove(fut) + + +# TODO: Why is this a Lock subclass? threading.Condition *has* a lock. +class Condition(Lock): + """A Condition implementation. + + This class implements condition variable objects. A condition variable + allows one or more coroutines to wait until they are notified by another + coroutine. + """ + + def __init__(self, *, loop=None): + super().__init__(loop=loop) + self._condition_waiters = collections.deque() + + # TODO: Add __repr__() with len(_condition_waiters). + + @tasks.coroutine + def wait(self): + """Wait until notified. + + If the calling coroutine has not acquired the lock when this + method is called, a RuntimeError is raised. + + This method releases the underlying lock, and then blocks + until it is awakened by a notify() or notify_all() call for + the same condition variable in another coroutine. Once + awakened, it re-acquires the lock and returns True. + """ + if not self._locked: + raise RuntimeError('cannot wait on un-acquired lock') + + keep_lock = True + self.release() + try: + fut = futures.Future(loop=self._loop) + self._condition_waiters.append(fut) + try: + yield from fut + return True + finally: + self._condition_waiters.remove(fut) + + except GeneratorExit: + keep_lock = False # Prevent yield in finally clause. + raise + finally: + if keep_lock: + yield from self.acquire() + + @tasks.coroutine + def wait_for(self, predicate): + """Wait until a predicate becomes true. + + The predicate should be a callable which result will be + interpreted as a boolean value. The final predicate value is + the return value. + """ + result = predicate() + while not result: + yield from self.wait() + result = predicate() + return result + + def notify(self, n=1): + """By default, wake up one coroutine waiting on this condition, if any. + If the calling coroutine has not acquired the lock when this method + is called, a RuntimeError is raised. + + This method wakes up at most n of the coroutines waiting for the + condition variable; it is a no-op if no coroutines are waiting. + + Note: an awakened coroutine does not actually return from its + wait() call until it can reacquire the lock. Since notify() does + not release the lock, its caller should. + """ + if not self._locked: + raise RuntimeError('cannot notify on un-acquired lock') + + idx = 0 + for fut in self._condition_waiters: + if idx >= n: + break + + if not fut.done(): + idx += 1 + fut.set_result(False) + + def notify_all(self): + """Wake up all threads waiting on this condition. This method acts + like notify(), but wakes up all waiting threads instead of one. If the + calling thread has not acquired the lock when this method is called, + a RuntimeError is raised. + """ + self.notify(len(self._condition_waiters)) + + +class Semaphore: + """A Semaphore implementation. + + A semaphore manages an internal counter which is decremented by each + acquire() call and incremented by each release() call. The counter + can never go below zero; when acquire() finds that it is zero, it blocks, + waiting until some other thread calls release(). + + Semaphores also support the context manager protocol. + + The first optional argument gives the initial value for the internal + counter; it defaults to 1. If the value given is less than 0, + ValueError is raised. + + The second optional argument determins can semophore be released more than + initial internal counter value; it defaults to False. If the value given + is True and number of release() is more than number of successfull + acquire() calls ValueError is raised. + """ + + def __init__(self, value=1, bound=False, *, loop=None): + if value < 0: + raise ValueError("Semaphore initial value must be > 0") + self._value = value + self._bound = bound + self._bound_value = value + self._waiters = collections.deque() + self._locked = False + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + # TODO: add waiters:N if > 0. + res = super().__repr__() + return '<{} [{}]>'.format( + res[1:-1], + 'locked' if self._locked else 'unlocked,value:{}'.format( + self._value)) + + def locked(self): + """Returns True if semaphore can not be acquired immediately.""" + return self._locked + + @tasks.coroutine + def acquire(self): + """Acquire a semaphore. + + If the internal counter is larger than zero on entry, + decrement it by one and return True immediately. If it is + zero on entry, block, waiting until some other coroutine has + called release() to make it larger than 0, and then return + True. + """ + if not self._waiters and self._value > 0: + self._value -= 1 + if self._value == 0: + self._locked = True + return True + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield from fut + self._value -= 1 + if self._value == 0: + self._locked = True + return True + finally: + self._waiters.remove(fut) + + def release(self): + """Release a semaphore, incrementing the internal counter by one. + When it was zero on entry and another coroutine is waiting for it to + become larger than zero again, wake up that coroutine. + + If Semaphore is create with "bound" paramter equals true, then + release() method checks to make sure its current value doesn't exceed + its initial value. If it does, ValueError is raised. + """ + if self._bound and self._value >= self._bound_value: + raise ValueError('Semaphore released too many times') + + self._value += 1 + self._locked = False + + for waiter in self._waiters: + if not waiter.done(): + waiter.set_result(True) + break + + def __enter__(self): + # TODO: This is questionable. How do we know the user actually + # wrote "with (yield from sema)" instead of "with sema"? + return True + + def __exit__(self, *args): + self.release() + + def __iter__(self): + yield from self.acquire() + return self diff --git a/Lib/asyncio/log.py b/Lib/asyncio/log.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/log.py @@ -0,0 +1,6 @@ +"""Logging configuration.""" + +import logging + + +asyncio_log = logging.getLogger("asyncio") diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/proactor_events.py @@ -0,0 +1,352 @@ +"""Event loop using a proactor and related classes. + +A proactor is a "notify-on-completion" multiplexer. Currently a +proactor is only implemented on Windows with IOCP. +""" + +import socket + +from . import base_events +from . import constants +from . import futures +from . import transports +from .log import asyncio_log + + +class _ProactorBasePipeTransport(transports.BaseTransport): + """Base class for pipe and socket transports.""" + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super().__init__(extra) + self._set_extra(sock) + self._loop = loop + self._sock = sock + self._protocol = protocol + self._server = server + self._buffer = [] + self._read_fut = None + self._write_fut = None + self._conn_lost = 0 + self._closing = False # Set when close() called. + self._eof_written = False + if self._server is not None: + self._server.attach(self) + self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + self._loop.call_soon(waiter.set_result, None) + + def _set_extra(self, sock): + self._extra['pipe'] = sock + + def close(self): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + if not self._buffer and self._write_fut is None: + self._loop.call_soon(self._call_connection_lost, None) + if self._read_fut is not None: + self._read_fut.cancel() + + def _fatal_error(self, exc): + asyncio_log.exception('Fatal error for %s', self) + self._force_close(exc) + + def _force_close(self, exc): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + if self._write_fut: + self._write_fut.cancel() + if self._read_fut: + self._read_fut.cancel() + self._write_fut = self._read_fut = None + self._buffer = [] + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + # XXX If there is a pending overlapped read on the other + # end then it may fail with ERROR_NETNAME_DELETED if we + # just close our end. First calling shutdown() seems to + # cure it, but maybe using DisconnectEx() would be better. + if hasattr(self._sock, 'shutdown'): + self._sock.shutdown(socket.SHUT_RDWR) + self._sock.close() + server = self._server + if server is not None: + server.detach(self) + self._server = None + + +class _ProactorReadPipeTransport(_ProactorBasePipeTransport, + transports.ReadTransport): + """Transport for read pipes.""" + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super().__init__(loop, sock, protocol, waiter, extra, server) + self._read_fut = None + self._paused = False + self._loop.call_soon(self._loop_reading) + + def pause(self): + assert not self._closing, 'Cannot pause() when closing' + assert not self._paused, 'Already paused' + self._paused = True + + def resume(self): + assert self._paused, 'Not paused' + self._paused = False + if self._closing: + return + self._loop.call_soon(self._loop_reading, self._read_fut) + + def _loop_reading(self, fut=None): + if self._paused: + return + data = None + + try: + if fut is not None: + assert self._read_fut is fut or (self._read_fut is None and + self._closing) + self._read_fut = None + data = fut.result() # deliver data later in "finally" clause + + if self._closing: + # since close() has been called we ignore any read data + data = None + return + + if data == b'': + # we got end-of-file so no need to reschedule a new read + return + + # reschedule a new read + self._read_fut = self._loop._proactor.recv(self._sock, 4096) + except ConnectionAbortedError as exc: + if not self._closing: + self._fatal_error(exc) + except ConnectionResetError as exc: + self._force_close(exc) + except OSError as exc: + self._fatal_error(exc) + except futures.CancelledError: + if not self._closing: + raise + else: + self._read_fut.add_done_callback(self._loop_reading) + finally: + if data: + self._protocol.data_received(data) + elif data is not None: + keep_open = self._protocol.eof_received() + if not keep_open: + self.close() + + +class _ProactorWritePipeTransport(_ProactorBasePipeTransport, + transports.WriteTransport): + """Transport for write pipes.""" + + def write(self, data): + assert isinstance(data, bytes), repr(data) + if self._eof_written: + raise IOError('write_eof() already called') + + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + asyncio_log.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + self._buffer.append(data) + if self._write_fut is None: + self._loop_writing() + + def _loop_writing(self, f=None): + try: + assert f is self._write_fut + self._write_fut = None + if f: + f.result() + data = b''.join(self._buffer) + self._buffer = [] + if not data: + if self._closing: + self._loop.call_soon(self._call_connection_lost, None) + if self._eof_written: + self._sock.shutdown(socket.SHUT_WR) + return + self._write_fut = self._loop._proactor.send(self._sock, data) + self._write_fut.add_done_callback(self._loop_writing) + except ConnectionResetError as exc: + self._force_close(exc) + except OSError as exc: + self._fatal_error(exc) + + def can_write_eof(self): + return True + + def write_eof(self): + self.close() + + def abort(self): + self._force_close(None) + + +class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, + _ProactorWritePipeTransport, + transports.Transport): + """Transport for duplex pipes.""" + + def can_write_eof(self): + return False + + def write_eof(self): + raise NotImplementedError + + +class _ProactorSocketTransport(_ProactorReadPipeTransport, + _ProactorWritePipeTransport, + transports.Transport): + """Transport for connected sockets.""" + + def _set_extra(self, sock): + self._extra['socket'] = sock + try: + self._extra['sockname'] = sock.getsockname() + except (socket.error, AttributeError): + pass + if 'peername' not in self._extra: + try: + self._extra['peername'] = sock.getpeername() + except (socket.error, AttributeError): + pass + + def can_write_eof(self): + return True + + def write_eof(self): + if self._closing or self._eof_written: + return + self._eof_written = True + if self._write_fut is None: + self._sock.shutdown(socket.SHUT_WR) + + +class BaseProactorEventLoop(base_events.BaseEventLoop): + + def __init__(self, proactor): + super().__init__() + asyncio_log.debug('Using proactor: %s', proactor.__class__.__name__) + self._proactor = proactor + self._selector = proactor # convenient alias + proactor.set_loop(self) + self._make_self_pipe() + + def _make_socket_transport(self, sock, protocol, waiter=None, + extra=None, server=None): + return _ProactorSocketTransport(self, sock, protocol, waiter, + extra, server) + + def _make_duplex_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + return _ProactorDuplexPipeTransport(self, + sock, protocol, waiter, extra) + + def _make_read_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + return _ProactorReadPipeTransport(self, sock, protocol, waiter, extra) + + def _make_write_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + return _ProactorWritePipeTransport(self, sock, protocol, waiter, extra) + + def close(self): + if self._proactor is not None: + self._close_self_pipe() + self._proactor.close() + self._proactor = None + self._selector = None + + def sock_recv(self, sock, n): + return self._proactor.recv(sock, n) + + def sock_sendall(self, sock, data): + return self._proactor.send(sock, data) + + def sock_connect(self, sock, address): + return self._proactor.connect(sock, address) + + def sock_accept(self, sock): + return self._proactor.accept(sock) + + def _socketpair(self): + raise NotImplementedError + + def _close_self_pipe(self): + self._ssock.close() + self._ssock = None + self._csock.close() + self._csock = None + self._internal_fds -= 1 + + def _make_self_pipe(self): + # A self-socket, really. :-) + self._ssock, self._csock = self._socketpair() + self._ssock.setblocking(False) + self._csock.setblocking(False) + self._internal_fds += 1 + self.call_soon(self._loop_self_reading) + + def _loop_self_reading(self, f=None): + try: + if f is not None: + f.result() # may raise + f = self._proactor.recv(self._ssock, 4096) + except: + self.close() + raise + else: + f.add_done_callback(self._loop_self_reading) + + def _write_to_self(self): + self._csock.send(b'x') + + def _start_serving(self, protocol_factory, sock, ssl=None, server=None): + assert not ssl, 'IocpEventLoop is incompatible with SSL.' + + def loop(f=None): + try: + if f is not None: + conn, addr = f.result() + protocol = protocol_factory() + self._make_socket_transport( + conn, protocol, + extra={'peername': addr}, server=server) + f = self._proactor.accept(sock) + except OSError: + if sock.fileno() != -1: + asyncio_log.exception('Accept failed') + sock.close() + except futures.CancelledError: + sock.close() + else: + f.add_done_callback(loop) + + self.call_soon(loop) + + def _process_events(self, event_list): + pass # XXX hard work currently done in poll + + def _stop_serving(self, sock): + self._proactor._stop_serving(sock) + sock.close() diff --git a/Lib/asyncio/protocols.py b/Lib/asyncio/protocols.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/protocols.py @@ -0,0 +1,98 @@ +"""Abstract Protocol class.""" + +__all__ = ['Protocol', 'DatagramProtocol'] + + +class BaseProtocol: + """ABC for base protocol class. + + Usually user implements protocols that derived from BaseProtocol + like Protocol or ProcessProtocol. + + The only case when BaseProtocol should be implemented directly is + write-only transport like write pipe + """ + + def connection_made(self, transport): + """Called when a connection is made. + + The argument is the transport representing the pipe connection. + To receive data, wait for data_received() calls. + When the connection is closed, connection_lost() is called. + """ + + def connection_lost(self, exc): + """Called when the connection is lost or closed. + + The argument is an exception object or None (the latter + meaning a regular EOF is received or the connection was + aborted or closed). + """ + + +class Protocol(BaseProtocol): + """ABC representing a protocol. + + The user should implement this interface. They can inherit from + this class but don't need to. The implementations here do + nothing (they don't raise exceptions). + + When the user wants to requests a transport, they pass a protocol + factory to a utility function (e.g., EventLoop.create_connection()). + + When the connection is made successfully, connection_made() is + called with a suitable transport object. Then data_received() + will be called 0 or more times with data (bytes) received from the + transport; finally, connection_lost() will be called exactly once + with either an exception object or None as an argument. + + State machine of calls: + + start -> CM [-> DR*] [-> ER?] -> CL -> end + """ + + def data_received(self, data): + """Called when some data is received. + + The argument is a bytes object. + """ + + def eof_received(self): + """Called when the other end calls write_eof() or equivalent. + + If this returns a false value (including None), the transport + will close itself. If it returns a true value, closing the + transport is up to the protocol. + """ + + +class DatagramProtocol(BaseProtocol): + """ABC representing a datagram protocol.""" + + def datagram_received(self, data, addr): + """Called when some datagram is received.""" + + def connection_refused(self, exc): + """Connection is refused.""" + + +class SubprocessProtocol(BaseProtocol): + """ABC representing a protocol for subprocess calls.""" + + def pipe_data_received(self, fd, data): + """Called when subprocess write a data into stdout/stderr pipes. + + fd is int file dascriptor. + data is bytes object. + """ + + def pipe_connection_lost(self, fd, exc): + """Called when a file descriptor associated with the child process is + closed. + + fd is the int file descriptor that was closed. + """ + + def process_exited(self): + """Called when subprocess has exited. + """ diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/queues.py @@ -0,0 +1,284 @@ +"""Queues""" + +__all__ = ['Queue', 'PriorityQueue', 'LifoQueue', 'JoinableQueue', + 'Full', 'Empty'] + +import collections +import heapq +import queue + +from . import events +from . import futures +from . import locks +from .tasks import coroutine + + +# Re-export queue.Full and .Empty exceptions. +Full = queue.Full +Empty = queue.Empty + + +class Queue: + """A queue, useful for coordinating producer and consumer coroutines. + + If maxsize is less than or equal to zero, the queue size is infinite. If it + is an integer greater than 0, then "yield from put()" will block when the + queue reaches maxsize, until an item is removed by get(). + + Unlike the standard library Queue, you can reliably know this Queue's size + with qsize(), since your single-threaded Tulip application won't be + interrupted between calling qsize() and doing an operation on the Queue. + """ + + def __init__(self, maxsize=0, *, loop=None): + if loop is None: + self._loop = events.get_event_loop() + else: + self._loop = loop + self._maxsize = maxsize + + # Futures. + self._getters = collections.deque() + # Pairs of (item, Future). + self._putters = collections.deque() + self._init(maxsize) + + def _init(self, maxsize): + self._queue = collections.deque() + + def _get(self): + return self._queue.popleft() + + def _put(self, item): + self._queue.append(item) + + def __repr__(self): + return '<{} at {:#x} {}>'.format( + type(self).__name__, id(self), self._format()) + + def __str__(self): + return '<{} {}>'.format(type(self).__name__, self._format()) + + def _format(self): + result = 'maxsize={!r}'.format(self._maxsize) + if getattr(self, '_queue', None): + result += ' _queue={!r}'.format(list(self._queue)) + if self._getters: + result += ' _getters[{}]'.format(len(self._getters)) + if self._putters: + result += ' _putters[{}]'.format(len(self._putters)) + return result + + def _consume_done_getters(self): + # Delete waiters at the head of the get() queue who've timed out. + while self._getters and self._getters[0].done(): + self._getters.popleft() + + def _consume_done_putters(self): + # Delete waiters at the head of the put() queue who've timed out. + while self._putters and self._putters[0][1].done(): + self._putters.popleft() + + def qsize(self): + """Number of items in the queue.""" + return len(self._queue) + + @property + def maxsize(self): + """Number of items allowed in the queue.""" + return self._maxsize + + def empty(self): + """Return True if the queue is empty, False otherwise.""" + return not self._queue + + def full(self): + """Return True if there are maxsize items in the queue. + + Note: if the Queue was initialized with maxsize=0 (the default), + then full() is never True. + """ + if self._maxsize <= 0: + return False + else: + return self.qsize() == self._maxsize + + @coroutine + def put(self, item): + """Put an item into the queue. + + If you yield from put(), wait until a free slot is available + before adding item. + """ + self._consume_done_getters() + if self._getters: + assert not self._queue, ( + 'queue non-empty, why are getters waiting?') + + getter = self._getters.popleft() + + # Use _put and _get instead of passing item straight to getter, in + # case a subclass has logic that must run (e.g. JoinableQueue). + self._put(item) + getter.set_result(self._get()) + + elif self._maxsize > 0 and self._maxsize == self.qsize(): + waiter = futures.Future(loop=self._loop) + + self._putters.append((item, waiter)) + yield from waiter + + else: + self._put(item) + + def put_nowait(self, item): + """Put an item into the queue without blocking. + + If no free slot is immediately available, raise Full. + """ + self._consume_done_getters() + if self._getters: + assert not self._queue, ( + 'queue non-empty, why are getters waiting?') + + getter = self._getters.popleft() + + # Use _put and _get instead of passing item straight to getter, in + # case a subclass has logic that must run (e.g. JoinableQueue). + self._put(item) + getter.set_result(self._get()) + + elif self._maxsize > 0 and self._maxsize == self.qsize(): + raise Full + else: + self._put(item) + + @coroutine + def get(self): + """Remove and return an item from the queue. + + If you yield from get(), wait until a item is available. + """ + self._consume_done_putters() + if self._putters: + assert self.full(), 'queue not full, why are putters waiting?' + item, putter = self._putters.popleft() + self._put(item) + + # When a getter runs and frees up a slot so this putter can + # run, we need to defer the put for a tick to ensure that + # getters and putters alternate perfectly. See + # ChannelTest.test_wait. + self._loop.call_soon(putter.set_result, None) + + return self._get() + + elif self.qsize(): + return self._get() + else: + waiter = futures.Future(loop=self._loop) + + self._getters.append(waiter) + return (yield from waiter) + + def get_nowait(self): + """Remove and return an item from the queue. + + Return an item if one is immediately available, else raise Full. + """ + self._consume_done_putters() + if self._putters: + assert self.full(), 'queue not full, why are putters waiting?' + item, putter = self._putters.popleft() + self._put(item) + # Wake putter on next tick. + putter.set_result(None) + + return self._get() + + elif self.qsize(): + return self._get() + else: + raise Empty + + +class PriorityQueue(Queue): + """A subclass of Queue; retrieves entries in priority order (lowest first). + + Entries are typically tuples of the form: (priority number, data). + """ + + def _init(self, maxsize): + self._queue = [] + + def _put(self, item, heappush=heapq.heappush): + heappush(self._queue, item) + + def _get(self, heappop=heapq.heappop): + return heappop(self._queue) + + +class LifoQueue(Queue): + """A subclass of Queue that retrieves most recently added entries first.""" + + def _init(self, maxsize): + self._queue = [] + + def _put(self, item): + self._queue.append(item) + + def _get(self): + return self._queue.pop() + + +class JoinableQueue(Queue): + """A subclass of Queue with task_done() and join() methods.""" + + def __init__(self, maxsize=0, *, loop=None): + super().__init__(maxsize=maxsize, loop=loop) + self._unfinished_tasks = 0 + self._finished = locks.Event(loop=self._loop) + self._finished.set() + + def _format(self): + result = Queue._format(self) + if self._unfinished_tasks: + result += ' tasks={}'.format(self._unfinished_tasks) + return result + + def _put(self, item): + super()._put(item) + self._unfinished_tasks += 1 + self._finished.clear() + + def task_done(self): + """Indicate that a formerly enqueued task is complete. + + Used by queue consumers. For each get() used to fetch a task, + a subsequent call to task_done() tells the queue that the processing + on the task is complete. + + If a join() is currently blocking, it will resume when all items have + been processed (meaning that a task_done() call was received for every + item that had been put() into the queue). + + Raises ValueError if called more times than there were items placed in + the queue. + """ + if self._unfinished_tasks <= 0: + raise ValueError('task_done() called too many times') + self._unfinished_tasks -= 1 + if self._unfinished_tasks == 0: + self._finished.set() + + @coroutine + def join(self): + """Block until all items in the queue have been gotten and processed. + + The count of unfinished tasks goes up whenever an item is added to the + queue. The count goes down whenever a consumer thread calls 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, join() unblocks. + """ + if self._unfinished_tasks > 0: + yield from self._finished.wait() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/selector_events.py @@ -0,0 +1,769 @@ +"""Event loop using a selector and related classes. + +A selector is a "notify-when-ready" multiplexer. For a subclass which +also includes support for signal handling, see the unix_events sub-module. +""" + +import collections +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +from . import base_events +from . import constants +from . import events +from . import futures +from . import selectors +from . import transports +from .log import asyncio_log + + +class BaseSelectorEventLoop(base_events.BaseEventLoop): + """Selector event loop. + + See events.EventLoop for API specification. + """ + + def __init__(self, selector=None): + super().__init__() + + if selector is None: + selector = selectors.DefaultSelector() + asyncio_log.debug('Using selector: %s', selector.__class__.__name__) + self._selector = selector + self._make_self_pipe() + + def _make_socket_transport(self, sock, protocol, waiter=None, *, + extra=None, server=None): + return _SelectorSocketTransport(self, sock, protocol, waiter, + extra, server) + + def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter, *, + server_side=False, server_hostname=None, + extra=None, server=None): + return _SelectorSslTransport( + self, rawsock, protocol, sslcontext, waiter, + server_side, server_hostname, extra, server) + + def _make_datagram_transport(self, sock, protocol, + address=None, extra=None): + return _SelectorDatagramTransport(self, sock, protocol, address, extra) + + def close(self): + if self._selector is not None: + self._close_self_pipe() + self._selector.close() + self._selector = None + + def _socketpair(self): + raise NotImplementedError + + def _close_self_pipe(self): + self.remove_reader(self._ssock.fileno()) + self._ssock.close() + self._ssock = None + self._csock.close() + self._csock = None + self._internal_fds -= 1 + + def _make_self_pipe(self): + # A self-socket, really. :-) + self._ssock, self._csock = self._socketpair() + self._ssock.setblocking(False) + self._csock.setblocking(False) + self._internal_fds += 1 + self.add_reader(self._ssock.fileno(), self._read_from_self) + + def _read_from_self(self): + try: + self._ssock.recv(1) + except (BlockingIOError, InterruptedError): + pass + + def _write_to_self(self): + try: + self._csock.send(b'x') + except (BlockingIOError, InterruptedError): + pass + + def _start_serving(self, protocol_factory, sock, ssl=None, server=None): + self.add_reader(sock.fileno(), self._accept_connection, + protocol_factory, sock, ssl, server) + + def _accept_connection(self, protocol_factory, sock, ssl=None, + server=None): + try: + conn, addr = sock.accept() + conn.setblocking(False) + except (BlockingIOError, InterruptedError): + pass # False alarm. + except Exception: + # Bad error. Stop serving. + self.remove_reader(sock.fileno()) + sock.close() + # There's nowhere to send the error, so just log it. + # TODO: Someone will want an error handler for this. + asyncio_log.exception('Accept failed') + else: + if ssl: + self._make_ssl_transport( + conn, protocol_factory(), ssl, None, + server_side=True, extra={'peername': addr}, server=server) + else: + self._make_socket_transport( + conn, protocol_factory(), extra={'peername': addr}, + server=server) + # It's now up to the protocol to handle the connection. + + def add_reader(self, fd, callback, *args): + """Add a reader callback.""" + handle = events.make_handle(callback, args) + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, selectors.EVENT_READ, + (handle, None)) + else: + mask, (reader, writer) = key.events, key.data + self._selector.modify(fd, mask | selectors.EVENT_READ, + (handle, writer)) + if reader is not None: + reader.cancel() + + def remove_reader(self, fd): + """Remove a reader callback.""" + try: + key = self._selector.get_key(fd) + except KeyError: + return False + else: + mask, (reader, writer) = key.events, key.data + mask &= ~selectors.EVENT_READ + if not mask: + self._selector.unregister(fd) + else: + self._selector.modify(fd, mask, (None, writer)) + + if reader is not None: + reader.cancel() + return True + else: + return False + + def add_writer(self, fd, callback, *args): + """Add a writer callback..""" + handle = events.make_handle(callback, args) + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, selectors.EVENT_WRITE, + (None, handle)) + else: + mask, (reader, writer) = key.events, key.data + self._selector.modify(fd, mask | selectors.EVENT_WRITE, + (reader, handle)) + if writer is not None: + writer.cancel() + + def remove_writer(self, fd): + """Remove a writer callback.""" + try: + key = self._selector.get_key(fd) + except KeyError: + return False + else: + mask, (reader, writer) = key.events, key.data + # Remove both writer and connector. + mask &= ~selectors.EVENT_WRITE + if not mask: + self._selector.unregister(fd) + else: + self._selector.modify(fd, mask, (reader, None)) + + if writer is not None: + writer.cancel() + return True + else: + return False + + def sock_recv(self, sock, n): + """XXX""" + fut = futures.Future(loop=self) + self._sock_recv(fut, False, sock, n) + return fut + + def _sock_recv(self, fut, registered, sock, n): + fd = sock.fileno() + if registered: + # Remove the callback early. It should be rare that the + # selector says the fd is ready but the call still returns + # EAGAIN, and I am willing to take a hit in that case in + # order to simplify the common case. + self.remove_reader(fd) + if fut.cancelled(): + return + try: + data = sock.recv(n) + except (BlockingIOError, InterruptedError): + self.add_reader(fd, self._sock_recv, fut, True, sock, n) + except Exception as exc: + fut.set_exception(exc) + else: + fut.set_result(data) + + def sock_sendall(self, sock, data): + """XXX""" + fut = futures.Future(loop=self) + if data: + self._sock_sendall(fut, False, sock, data) + else: + fut.set_result(None) + return fut + + def _sock_sendall(self, fut, registered, sock, data): + fd = sock.fileno() + + if registered: + self.remove_writer(fd) + if fut.cancelled(): + return + + try: + n = sock.send(data) + except (BlockingIOError, InterruptedError): + n = 0 + except Exception as exc: + fut.set_exception(exc) + return + + if n == len(data): + fut.set_result(None) + else: + if n: + data = data[n:] + self.add_writer(fd, self._sock_sendall, fut, True, sock, data) + + def sock_connect(self, sock, address): + """XXX""" + # That address better not require a lookup! We're not calling + # self.getaddrinfo() for you here. But verifying this is + # complicated; the socket module doesn't have a pattern for + # IPv6 addresses (there are too many forms, apparently). + fut = futures.Future(loop=self) + self._sock_connect(fut, False, sock, address) + return fut + + def _sock_connect(self, fut, registered, sock, address): + # TODO: Use getaddrinfo() to look up the address, to avoid the + # trap of hanging the entire event loop when the address + # requires doing a DNS lookup. (OTOH, the caller should + # already have done this, so it would be nice if we could + # easily tell whether the address needs looking up or not. I + # know how to do this for IPv4, but IPv6 addresses have many + # syntaxes.) + fd = sock.fileno() + if registered: + self.remove_writer(fd) + if fut.cancelled(): + return + try: + if not registered: + # First time around. + sock.connect(address) + else: + err = sock.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + # Jump to the except clause below. + raise OSError(err, 'Connect call failed') + except (BlockingIOError, InterruptedError): + self.add_writer(fd, self._sock_connect, fut, True, sock, address) + except Exception as exc: + fut.set_exception(exc) + else: + fut.set_result(None) + + def sock_accept(self, sock): + """XXX""" + fut = futures.Future(loop=self) + self._sock_accept(fut, False, sock) + return fut + + def _sock_accept(self, fut, registered, sock): + fd = sock.fileno() + if registered: + self.remove_reader(fd) + if fut.cancelled(): + return + try: + conn, address = sock.accept() + conn.setblocking(False) + except (BlockingIOError, InterruptedError): + self.add_reader(fd, self._sock_accept, fut, True, sock) + except Exception as exc: + fut.set_exception(exc) + else: + fut.set_result((conn, address)) + + def _process_events(self, event_list): + for key, mask in event_list: + fileobj, (reader, writer) = key.fileobj, key.data + if mask & selectors.EVENT_READ and reader is not None: + if reader._cancelled: + self.remove_reader(fileobj) + else: + self._add_callback(reader) + if mask & selectors.EVENT_WRITE and writer is not None: + if writer._cancelled: + self.remove_writer(fileobj) + else: + self._add_callback(writer) + + def _stop_serving(self, sock): + self.remove_reader(sock.fileno()) + sock.close() + + +class _SelectorTransport(transports.Transport): + + max_size = 256 * 1024 # Buffer size passed to recv(). + + def __init__(self, loop, sock, protocol, extra, server=None): + super().__init__(extra) + self._extra['socket'] = sock + self._extra['sockname'] = sock.getsockname() + if 'peername' not in self._extra: + try: + self._extra['peername'] = sock.getpeername() + except socket.error: + self._extra['peername'] = None + self._loop = loop + self._sock = sock + self._sock_fd = sock.fileno() + self._protocol = protocol + self._server = server + self._buffer = collections.deque() + self._conn_lost = 0 + self._closing = False # Set when close() called. + if server is not None: + server.attach(self) + + def abort(self): + self._force_close(None) + + def close(self): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + self._loop.remove_reader(self._sock_fd) + if not self._buffer: + self._loop.call_soon(self._call_connection_lost, None) + + def _fatal_error(self, exc): + # should be called from exception handler only + asyncio_log.exception('Fatal error for %s', self) + self._force_close(exc) + + def _force_close(self, exc): + if self._buffer: + self._buffer.clear() + self._loop.remove_writer(self._sock_fd) + + if self._closing: + return + + self._closing = True + self._conn_lost += 1 + self._loop.remove_reader(self._sock_fd) + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._sock.close() + self._sock = None + self._protocol = None + self._loop = None + server = self._server + if server is not None: + server.detach(self) + self._server = None + + +class _SelectorSocketTransport(_SelectorTransport): + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super().__init__(loop, sock, protocol, extra, server) + self._eof = False + self._paused = False + + self._loop.add_reader(self._sock_fd, self._read_ready) + self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + self._loop.call_soon(waiter.set_result, None) + + def pause(self): + assert not self._closing, 'Cannot pause() when closing' + assert not self._paused, 'Already paused' + self._paused = True + self._loop.remove_reader(self._sock_fd) + + def resume(self): + assert self._paused, 'Not paused' + self._paused = False + if self._closing: + return + self._loop.add_reader(self._sock_fd, self._read_ready) + + def _read_ready(self): + try: + data = self._sock.recv(self.max_size) + except (BlockingIOError, InterruptedError): + pass + except ConnectionResetError as exc: + self._force_close(exc) + except Exception as exc: + self._fatal_error(exc) + else: + if data: + self._protocol.data_received(data) + else: + keep_open = self._protocol.eof_received() + if not keep_open: + self.close() + + def write(self, data): + assert isinstance(data, bytes), repr(type(data)) + assert not self._eof, 'Cannot call write() after write_eof()' + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + asyncio_log.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Attempt to send it right away first. + try: + n = self._sock.send(data) + except (BlockingIOError, InterruptedError): + n = 0 + except (BrokenPipeError, ConnectionResetError) as exc: + self._force_close(exc) + return + except OSError as exc: + self._fatal_error(exc) + return + else: + data = data[n:] + if not data: + return + # Start async I/O. + self._loop.add_writer(self._sock_fd, self._write_ready) + + self._buffer.append(data) + + def _write_ready(self): + data = b''.join(self._buffer) + assert data, 'Data should not be empty' + + self._buffer.clear() + try: + n = self._sock.send(data) + except (BlockingIOError, InterruptedError): + self._buffer.append(data) + except (BrokenPipeError, ConnectionResetError) as exc: + self._loop.remove_writer(self._sock_fd) + self._force_close(exc) + except Exception as exc: + self._loop.remove_writer(self._sock_fd) + self._fatal_error(exc) + else: + data = data[n:] + if not data: + self._loop.remove_writer(self._sock_fd) + if self._closing: + self._call_connection_lost(None) + elif self._eof: + self._sock.shutdown(socket.SHUT_WR) + return + + self._buffer.append(data) # Try again later. + + def write_eof(self): + if self._eof: + return + self._eof = True + if not self._buffer: + self._sock.shutdown(socket.SHUT_WR) + + def can_write_eof(self): + return True + + +class _SelectorSslTransport(_SelectorTransport): + + def __init__(self, loop, rawsock, protocol, sslcontext, waiter=None, + server_side=False, server_hostname=None, + extra=None, server=None): + if server_side: + assert isinstance( + sslcontext, ssl.SSLContext), 'Must pass an SSLContext' + else: + # Client-side may pass ssl=True to use a default context. + # The default is the same as used by urllib. + if sslcontext is None: + sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + sslcontext.options |= ssl.OP_NO_SSLv2 + sslcontext.set_default_verify_paths() + sslcontext.verify_mode = ssl.CERT_REQUIRED + wrap_kwargs = { + 'server_side': server_side, + 'do_handshake_on_connect': False, + } + if server_hostname is not None and not server_side and ssl.HAS_SNI: + wrap_kwargs['server_hostname'] = server_hostname + sslsock = sslcontext.wrap_socket(rawsock, **wrap_kwargs) + + super().__init__(loop, sslsock, protocol, extra, server) + + self._server_hostname = server_hostname + self._waiter = waiter + self._rawsock = rawsock + self._sslcontext = sslcontext + self._paused = False + + # SSL-specific extra info. (peercert is set later) + self._extra.update(sslcontext=sslcontext) + + self._on_handshake() + + def _on_handshake(self): + try: + self._sock.do_handshake() + except ssl.SSLWantReadError: + self._loop.add_reader(self._sock_fd, self._on_handshake) + return + except ssl.SSLWantWriteError: + self._loop.add_writer(self._sock_fd, self._on_handshake) + return + except Exception as exc: + self._sock.close() + if self._waiter is not None: + self._waiter.set_exception(exc) + return + except BaseException as exc: + self._sock.close() + if self._waiter is not None: + self._waiter.set_exception(exc) + raise + + # Verify hostname if requested. + peercert = self._sock.getpeercert() + if (self._server_hostname is not None and + self._sslcontext.verify_mode == ssl.CERT_REQUIRED): + try: + ssl.match_hostname(peercert, self._server_hostname) + except Exception as exc: + self._sock.close() + if self._waiter is not None: + self._waiter.set_exception(exc) + return + + # Add extra info that becomes available after handshake. + self._extra.update(peercert=peercert, + cipher=self._sock.cipher(), + compression=self._sock.compression(), + ) + + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) + self._loop.add_reader(self._sock_fd, self._on_ready) + self._loop.add_writer(self._sock_fd, self._on_ready) + self._loop.call_soon(self._protocol.connection_made, self) + if self._waiter is not None: + self._loop.call_soon(self._waiter.set_result, None) + + def pause(self): + # XXX This is a bit icky, given the comment at the top of + # _on_ready(). Is it possible to evoke a deadlock? I don't + # know, although it doesn't look like it; write() will still + # accept more data for the buffer and eventually the app will + # call resume() again, and things will flow again. + + assert not self._closing, 'Cannot pause() when closing' + assert not self._paused, 'Already paused' + self._paused = True + self._loop.remove_reader(self._sock_fd) + + def resume(self): + assert self._paused, 'Not paused' + self._paused = False + if self._closing: + return + self._loop.add_reader(self._sock_fd, self._on_ready) + + def _on_ready(self): + # Because of renegotiations (?), there's no difference between + # readable and writable. We just try both. XXX This may be + # incorrect; we probably need to keep state about what we + # should do next. + + # First try reading. + if not self._closing and not self._paused: + try: + data = self._sock.recv(self.max_size) + except (BlockingIOError, InterruptedError, + ssl.SSLWantReadError, ssl.SSLWantWriteError): + pass + except ConnectionResetError as exc: + self._force_close(exc) + except Exception as exc: + self._fatal_error(exc) + else: + if data: + self._protocol.data_received(data) + else: + try: + self._protocol.eof_received() + finally: + self.close() + + # Now try writing, if there's anything to write. + if self._buffer: + data = b''.join(self._buffer) + self._buffer.clear() + try: + n = self._sock.send(data) + except (BlockingIOError, InterruptedError, + ssl.SSLWantReadError, ssl.SSLWantWriteError): + n = 0 + except (BrokenPipeError, ConnectionResetError) as exc: + self._loop.remove_writer(self._sock_fd) + self._force_close(exc) + return + except Exception as exc: + self._loop.remove_writer(self._sock_fd) + self._fatal_error(exc) + return + + if n < len(data): + self._buffer.append(data[n:]) + + if self._closing and not self._buffer: + self._loop.remove_writer(self._sock_fd) + self._call_connection_lost(None) + + def write(self, data): + assert isinstance(data, bytes), repr(type(data)) + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + asyncio_log.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + self._buffer.append(data) + # We could optimize, but the callback can do this for now. + + def can_write_eof(self): + return False + + def close(self): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + self._loop.remove_reader(self._sock_fd) + + +class _SelectorDatagramTransport(_SelectorTransport): + + def __init__(self, loop, sock, protocol, address=None, extra=None): + super().__init__(loop, sock, protocol, extra) + + self._address = address + self._loop.add_reader(self._sock_fd, self._read_ready) + self._loop.call_soon(self._protocol.connection_made, self) + + def _read_ready(self): + try: + data, addr = self._sock.recvfrom(self.max_size) + except (BlockingIOError, InterruptedError): + pass + except Exception as exc: + self._fatal_error(exc) + else: + self._protocol.datagram_received(data, addr) + + def sendto(self, data, addr=None): + assert isinstance(data, bytes), repr(type(data)) + if not data: + return + + if self._address: + assert addr in (None, self._address) + + if self._conn_lost and self._address: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + asyncio_log.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Attempt to send it right away first. + try: + if self._address: + self._sock.send(data) + else: + self._sock.sendto(data, addr) + return + except ConnectionRefusedError as exc: + if self._address: + self._fatal_error(exc) + return + except (BlockingIOError, InterruptedError): + self._loop.add_writer(self._sock_fd, self._sendto_ready) + except Exception as exc: + self._fatal_error(exc) + return + + self._buffer.append((data, addr)) + + def _sendto_ready(self): + while self._buffer: + data, addr = self._buffer.popleft() + try: + if self._address: + self._sock.send(data) + else: + self._sock.sendto(data, addr) + except ConnectionRefusedError as exc: + if self._address: + self._fatal_error(exc) + return + except (BlockingIOError, InterruptedError): + self._buffer.appendleft((data, addr)) # Try again later. + break + except Exception as exc: + self._fatal_error(exc) + return + + if not self._buffer: + self._loop.remove_writer(self._sock_fd) + if self._closing: + self._call_connection_lost(None) + + def _force_close(self, exc): + if self._address and isinstance(exc, ConnectionRefusedError): + self._protocol.connection_refused(exc) + + super()._force_close(exc) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/streams.py @@ -0,0 +1,257 @@ +"""Stream-related things.""" + +__all__ = ['StreamReader', 'StreamReaderProtocol', 'open_connection'] + +import collections + +from . import events +from . import futures +from . import protocols +from . import tasks + + +_DEFAULT_LIMIT = 2**16 + + + at tasks.coroutine +def open_connection(host=None, port=None, *, + loop=None, limit=_DEFAULT_LIMIT, **kwds): + """A wrapper for create_connection() returning a (reader, writer) pair. + + The reader returned is a StreamReader instance; the writer is a + Transport. + + The arguments are all the usual arguments to create_connection() + except protocol_factory; most common are positional host and port, + with various optional keyword arguments following. + + Additional optional keyword arguments are loop (to set the event loop + instance to use) and limit (to set the buffer limit passed to the + StreamReader). + + (If you want to customize the StreamReader and/or + StreamReaderProtocol classes, just copy the code -- there's + really nothing special here except some convenience.) + """ + if loop is None: + loop = events.get_event_loop() + reader = StreamReader(limit=limit, loop=loop) + protocol = StreamReaderProtocol(reader) + transport, _ = yield from loop.create_connection( + lambda: protocol, host, port, **kwds) + return reader, transport # (reader, writer) + + +class StreamReaderProtocol(protocols.Protocol): + """Trivial helper class to adapt between Protocol and StreamReader. + + (This is a helper class instead of making StreamReader itself a + Protocol subclass, because the StreamReader has other potential + uses, and to prevent the user of the StreamReader to accidentally + call inappropriate methods of the protocol.) + """ + + def __init__(self, stream_reader): + self.stream_reader = stream_reader + + def connection_made(self, transport): + self.stream_reader.set_transport(transport) + + def connection_lost(self, exc): + if exc is None: + self.stream_reader.feed_eof() + else: + self.stream_reader.set_exception(exc) + + def data_received(self, data): + self.stream_reader.feed_data(data) + + def eof_received(self): + self.stream_reader.feed_eof() + + +class StreamReader: + + def __init__(self, limit=_DEFAULT_LIMIT, loop=None): + # The line length limit is a security feature; + # it also doubles as half the buffer limit. + self.limit = limit + if loop is None: + loop = events.get_event_loop() + self.loop = loop + self.buffer = collections.deque() # Deque of bytes objects. + self.byte_count = 0 # Bytes in buffer. + self.eof = False # Whether we're done. + self.waiter = None # A future. + self._exception = None + self._transport = None + self._paused = False + + def exception(self): + return self._exception + + def set_exception(self, exc): + self._exception = exc + + waiter = self.waiter + if waiter is not None: + self.waiter = None + if not waiter.cancelled(): + waiter.set_exception(exc) + + def set_transport(self, transport): + assert self._transport is None, 'Transport already set' + self._transport = transport + + def _maybe_resume_transport(self): + if self._paused and self.byte_count <= self.limit: + self._paused = False + self._transport.resume() + + def feed_eof(self): + self.eof = True + waiter = self.waiter + if waiter is not None: + self.waiter = None + if not waiter.cancelled(): + waiter.set_result(True) + + def feed_data(self, data): + if not data: + return + + self.buffer.append(data) + self.byte_count += len(data) + + waiter = self.waiter + if waiter is not None: + self.waiter = None + if not waiter.cancelled(): + waiter.set_result(False) + + if (self._transport is not None and + not self._paused and + self.byte_count > 2*self.limit): + try: + self._transport.pause() + except NotImplementedError: + # The transport can't be paused. + # We'll just have to buffer all data. + # Forget the transport so we don't keep trying. + self._transport = None + else: + self._paused = True + + @tasks.coroutine + def readline(self): + if self._exception is not None: + raise self._exception + + parts = [] + parts_size = 0 + not_enough = True + + while not_enough: + while self.buffer and not_enough: + data = self.buffer.popleft() + ichar = data.find(b'\n') + if ichar < 0: + parts.append(data) + parts_size += len(data) + else: + ichar += 1 + head, tail = data[:ichar], data[ichar:] + if tail: + self.buffer.appendleft(tail) + not_enough = False + parts.append(head) + parts_size += len(head) + + if parts_size > self.limit: + self.byte_count -= parts_size + self._maybe_resume_transport() + raise ValueError('Line is too long') + + if self.eof: + break + + if not_enough: + assert self.waiter is None + self.waiter = futures.Future(loop=self.loop) + try: + yield from self.waiter + finally: + self.waiter = None + + line = b''.join(parts) + self.byte_count -= parts_size + self._maybe_resume_transport() + + return line + + @tasks.coroutine + def read(self, n=-1): + if self._exception is not None: + raise self._exception + + if not n: + return b'' + + if n < 0: + while not self.eof: + assert not self.waiter + self.waiter = futures.Future(loop=self.loop) + try: + yield from self.waiter + finally: + self.waiter = None + else: + if not self.byte_count and not self.eof: + assert not self.waiter + self.waiter = futures.Future(loop=self.loop) + try: + yield from self.waiter + finally: + self.waiter = None + + if n < 0 or self.byte_count <= n: + data = b''.join(self.buffer) + self.buffer.clear() + self.byte_count = 0 + self._maybe_resume_transport() + return data + + parts = [] + parts_bytes = 0 + while self.buffer and parts_bytes < n: + data = self.buffer.popleft() + data_bytes = len(data) + if n < parts_bytes + data_bytes: + data_bytes = n - parts_bytes + data, rest = data[:data_bytes], data[data_bytes:] + self.buffer.appendleft(rest) + + parts.append(data) + parts_bytes += data_bytes + self.byte_count -= data_bytes + self._maybe_resume_transport() + + return b''.join(parts) + + @tasks.coroutine + def readexactly(self, n): + if self._exception is not None: + raise self._exception + + if n <= 0: + return b'' + + while self.byte_count < n and not self.eof: + assert not self.waiter + self.waiter = futures.Future(loop=self.loop) + try: + yield from self.waiter + finally: + self.waiter = None + + return (yield from self.read(n)) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/tasks.py @@ -0,0 +1,636 @@ +"""Support for tasks, coroutines and the scheduler.""" + +__all__ = ['coroutine', 'Task', + 'FIRST_COMPLETED', 'FIRST_EXCEPTION', 'ALL_COMPLETED', + 'wait', 'wait_for', 'as_completed', 'sleep', 'async', + 'gather', + ] + +import collections +import concurrent.futures +import functools +import inspect +import linecache +import traceback +import weakref + +from . import events +from . import futures +from .log import asyncio_log + +# If you set _DEBUG to true, @coroutine will wrap the resulting +# generator objects in a CoroWrapper instance (defined below). That +# instance will log a message when the generator is never iterated +# over, which may happen when you forget to use "yield from" with a +# coroutine call. Note that the value of the _DEBUG flag is taken +# when the decorator is used, so to be of any use it must be set +# before you define your coroutines. A downside of using this feature +# is that tracebacks show entries for the CoroWrapper.__next__ method +# when _DEBUG is true. +_DEBUG = False + + +class CoroWrapper: + """Wrapper for coroutine in _DEBUG mode.""" + + __slot__ = ['gen', 'func'] + + def __init__(self, gen, func): + assert inspect.isgenerator(gen), gen + self.gen = gen + self.func = func + + def __iter__(self): + return self + + def __next__(self): + return next(self.gen) + + def send(self, value): + return self.gen.send(value) + + def throw(self, exc): + return self.gen.throw(exc) + + def close(self): + return self.gen.close() + + def __del__(self): + frame = self.gen.gi_frame + if frame is not None and frame.f_lasti == -1: + func = self.func + code = func.__code__ + filename = code.co_filename + lineno = code.co_firstlineno + asyncio_log.error('Coroutine %r defined at %s:%s was never yielded from', + func.__name__, filename, lineno) + + +def coroutine(func): + """Decorator to mark coroutines. + + If the coroutine is not yielded from before it is destroyed, + an error message is logged. + """ + if inspect.isgeneratorfunction(func): + coro = func + else: + @functools.wraps(func) + def coro(*args, **kw): + res = func(*args, **kw) + if isinstance(res, futures.Future) or inspect.isgenerator(res): + res = yield from res + return res + + if not _DEBUG: + wrapper = coro + else: + @functools.wraps(func) + def wrapper(*args, **kwds): + w = CoroWrapper(coro(*args, **kwds), func) + w.__name__ = coro.__name__ + w.__doc__ = coro.__doc__ + return w + + wrapper._is_coroutine = True # For iscoroutinefunction(). + return wrapper + + +def iscoroutinefunction(func): + """Return True if func is a decorated coroutine function.""" + return getattr(func, '_is_coroutine', False) + + +def iscoroutine(obj): + """Return True if obj is a coroutine object.""" + return isinstance(obj, CoroWrapper) or inspect.isgenerator(obj) + + +class Task(futures.Future): + """A coroutine wrapped in a Future.""" + + # An important invariant maintained while a Task not done: + # + # - Either _fut_waiter is None, and _step() is scheduled; + # - or _fut_waiter is some Future, and _step() is *not* scheduled. + # + # The only transition from the latter to the former is through + # _wakeup(). When _fut_waiter is not None, one of its callbacks + # must be _wakeup(). + + # Weak set containing all tasks alive. + _all_tasks = weakref.WeakSet() + + @classmethod + def all_tasks(cls, loop=None): + """Return a set of all tasks for an event loop. + + By default all tasks for the current event loop are returned. + """ + if loop is None: + loop = events.get_event_loop() + return {t for t in cls._all_tasks if t._loop is loop} + + def __init__(self, coro, *, loop=None): + assert iscoroutine(coro), repr(coro) # Not a coroutine function! + super().__init__(loop=loop) + self._coro = iter(coro) # Use the iterator just in case. + self._fut_waiter = None + self._must_cancel = False + self._loop.call_soon(self._step) + self.__class__._all_tasks.add(self) + + def __repr__(self): + res = super().__repr__() + if (self._must_cancel and + self._state == futures._PENDING and + ')'.format(self._coro.__name__) + res[i:] + return res + + def get_stack(self, *, limit=None): + """Return the list of stack frames for this task's coroutine. + + If the coroutine is active, this returns the stack where it is + suspended. If the coroutine has completed successfully or was + cancelled, this returns an empty list. If the coroutine was + terminated by an exception, this returns the list of traceback + frames. + + The frames are always ordered from oldest to newest. + + The optional limit gives the maximum nummber of frames to + return; by default all available frames are returned. Its + meaning differs depending on whether a stack or a traceback is + returned: the newest frames of a stack are returned, but the + oldest frames of a traceback are returned. (This matches the + behavior of the traceback module.) + + For reasons beyond our control, only one stack frame is + returned for a suspended coroutine. + """ + frames = [] + f = self._coro.gi_frame + if f is not None: + while f is not None: + if limit is not None: + if limit <= 0: + break + limit -= 1 + frames.append(f) + f = f.f_back + frames.reverse() + elif self._exception is not None: + tb = self._exception.__traceback__ + while tb is not None: + if limit is not None: + if limit <= 0: + break + limit -= 1 + frames.append(tb.tb_frame) + tb = tb.tb_next + return frames + + def print_stack(self, *, limit=None, file=None): + """Print the stack or traceback for this task's coroutine. + + This produces output similar to that of the traceback module, + for the frames retrieved by get_stack(). The limit argument + is passed to get_stack(). The file argument is an I/O stream + to which the output goes; by default it goes to sys.stderr. + """ + extracted_list = [] + checked = set() + for f in self.get_stack(limit=limit): + lineno = f.f_lineno + co = f.f_code + filename = co.co_filename + name = co.co_name + if filename not in checked: + checked.add(filename) + linecache.checkcache(filename) + line = linecache.getline(filename, lineno, f.f_globals) + extracted_list.append((filename, lineno, name, line)) + exc = self._exception + if not extracted_list: + print('No stack for %r' % self, file=file) + elif exc is not None: + print('Traceback for %r (most recent call last):' % self, + file=file) + else: + print('Stack for %r (most recent call last):' % self, + file=file) + traceback.print_list(extracted_list, file=file) + if exc is not None: + for line in traceback.format_exception_only(exc.__class__, exc): + print(line, file=file, end='') + + def cancel(self): + if self.done(): + return False + if self._fut_waiter is not None: + if self._fut_waiter.cancel(): + # Leave self._fut_waiter; it may be a Task that + # catches and ignores the cancellation so we may have + # to cancel it again later. + return True + # It must be the case that self._step is already scheduled. + self._must_cancel = True + return True + + def _step(self, value=None, exc=None): + assert not self.done(), \ + '_step(): already done: {!r}, {!r}, {!r}'.format(self, value, exc) + if self._must_cancel: + if not isinstance(exc, futures.CancelledError): + exc = futures.CancelledError() + self._must_cancel = False + coro = self._coro + self._fut_waiter = None + # Call either coro.throw(exc) or coro.send(value). + try: + if exc is not None: + result = coro.throw(exc) + elif value is not None: + result = coro.send(value) + else: + result = next(coro) + except StopIteration as exc: + self.set_result(exc.value) + except futures.CancelledError as exc: + super().cancel() # I.e., Future.cancel(self). + except Exception as exc: + self.set_exception(exc) + except BaseException as exc: + self.set_exception(exc) + raise + else: + if isinstance(result, futures.Future): + # Yielded Future must come from Future.__iter__(). + if result._blocking: + result._blocking = False + result.add_done_callback(self._wakeup) + self._fut_waiter = result + if self._must_cancel: + if self._fut_waiter.cancel(): + self._must_cancel = False + else: + self._loop.call_soon( + self._step, None, + RuntimeError( + 'yield was used instead of yield from ' + 'in task {!r} with {!r}'.format(self, result))) + elif result is None: + # Bare yield relinquishes control for one event loop iteration. + self._loop.call_soon(self._step) + elif inspect.isgenerator(result): + # Yielding a generator is just wrong. + self._loop.call_soon( + self._step, None, + RuntimeError( + 'yield was used instead of yield from for ' + 'generator in task {!r} with {}'.format( + self, result))) + else: + # Yielding something else is an error. + self._loop.call_soon( + self._step, None, + RuntimeError( + 'Task got bad yield: {!r}'.format(result))) + self = None + + def _wakeup(self, future): + try: + value = future.result() + except Exception as exc: + # This may also be a cancellation. + self._step(None, exc) + else: + self._step(value, None) + self = None # Needed to break cycles when an exception occurs. + + +# wait() and as_completed() similar to those in PEP 3148. + +FIRST_COMPLETED = concurrent.futures.FIRST_COMPLETED +FIRST_EXCEPTION = concurrent.futures.FIRST_EXCEPTION +ALL_COMPLETED = concurrent.futures.ALL_COMPLETED + + + at coroutine +def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): + """Wait for the Futures and coroutines given by fs to complete. + + Coroutines will be wrapped in Tasks. + + Returns two sets of Future: (done, pending). + + Usage: + + done, pending = yield from asyncio.wait(fs) + + Note: This does not raise TimeoutError! Futures that aren't done + when the timeout occurs are returned in the second set. + """ + if not fs: + raise ValueError('Set of coroutines/Futures is empty.') + + if loop is None: + loop = events.get_event_loop() + + fs = set(async(f, loop=loop) for f in fs) + + if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): + raise ValueError('Invalid return_when value: {}'.format(return_when)) + return (yield from _wait(fs, timeout, return_when, loop)) + + +def _release_waiter(waiter, value=True, *args): + if not waiter.done(): + waiter.set_result(value) + + + at coroutine +def wait_for(fut, timeout, *, loop=None): + """Wait for the single Future or coroutine to complete, with timeout. + + Coroutine will be wrapped in Task. + + Returns result of the Future or coroutine. Raises TimeoutError when + timeout occurs. + + Usage: + + result = yield from asyncio.wait_for(fut, 10.0) + + """ + if loop is None: + loop = events.get_event_loop() + + waiter = futures.Future(loop=loop) + timeout_handle = loop.call_later(timeout, _release_waiter, waiter, False) + cb = functools.partial(_release_waiter, waiter, True) + + fut = async(fut, loop=loop) + fut.add_done_callback(cb) + + try: + if (yield from waiter): + return fut.result() + else: + fut.remove_done_callback(cb) + raise futures.TimeoutError() + finally: + timeout_handle.cancel() + + + at coroutine +def _wait(fs, timeout, return_when, loop): + """Internal helper for wait() and _wait_for(). + + The fs argument must be a collection of Futures. + """ + assert fs, 'Set of Futures is empty.' + waiter = futures.Future(loop=loop) + timeout_handle = None + if timeout is not None: + timeout_handle = loop.call_later(timeout, _release_waiter, waiter) + counter = len(fs) + + def _on_completion(f): + nonlocal counter + counter -= 1 + if (counter <= 0 or + return_when == FIRST_COMPLETED or + return_when == FIRST_EXCEPTION and (not f.cancelled() and + f.exception() is not None)): + if timeout_handle is not None: + timeout_handle.cancel() + if not waiter.done(): + waiter.set_result(False) + + for f in fs: + f.add_done_callback(_on_completion) + + try: + yield from waiter + finally: + if timeout_handle is not None: + timeout_handle.cancel() + + done, pending = set(), set() + for f in fs: + f.remove_done_callback(_on_completion) + if f.done(): + done.add(f) + else: + pending.add(f) + return done, pending + + +# This is *not* a @coroutine! It is just an iterator (yielding Futures). +def as_completed(fs, *, loop=None, timeout=None): + """Return an iterator whose values, when waited for, are Futures. + + This differs from PEP 3148; the proper way to use this is: + + for f in as_completed(fs): + result = yield from f # The 'yield from' may raise. + # Use result. + + Raises TimeoutError if the timeout occurs before all Futures are + done. + + Note: The futures 'f' are not necessarily members of fs. + """ + loop = loop if loop is not None else events.get_event_loop() + deadline = None if timeout is None else loop.time() + timeout + todo = set(async(f, loop=loop) for f in fs) + completed = collections.deque() + + @coroutine + def _wait_for_one(): + while not completed: + timeout = None + if deadline is not None: + timeout = deadline - loop.time() + if timeout < 0: + raise futures.TimeoutError() + done, pending = yield from _wait( + todo, timeout, FIRST_COMPLETED, loop) + # Multiple callers might be waiting for the same events + # and getting the same outcome. Dedupe by updating todo. + for f in done: + if f in todo: + todo.remove(f) + completed.append(f) + f = completed.popleft() + return f.result() # May raise. + + for _ in range(len(todo)): + yield _wait_for_one() + + + at coroutine +def sleep(delay, result=None, *, loop=None): + """Coroutine that completes after a given time (in seconds).""" + future = futures.Future(loop=loop) + h = future._loop.call_later(delay, future.set_result, result) + try: + return (yield from future) + finally: + h.cancel() + + +def async(coro_or_future, *, loop=None): + """Wrap a coroutine in a future. + + If the argument is a Future, it is returned directly. + """ + if isinstance(coro_or_future, futures.Future): + if loop is not None and loop is not coro_or_future._loop: + raise ValueError('loop argument must agree with Future') + return coro_or_future + elif iscoroutine(coro_or_future): + return Task(coro_or_future, loop=loop) + else: + raise TypeError('A Future or coroutine is required') + + +class _GatheringFuture(futures.Future): + """Helper for gather(). + + This overrides cancel() to cancel all the children and act more + like Task.cancel(), which doesn't immediately mark itself as + cancelled. + """ + + def __init__(self, children, *, loop=None): + super().__init__(loop=loop) + self._children = children + + def cancel(self): + if self.done(): + return False + for child in self._children: + child.cancel() + return True + + +def gather(*coros_or_futures, loop=None, return_exceptions=False): + """Return a future aggregating results from the given coroutines + or futures. + + All futures must share the same event loop. If all the tasks are + done successfully, the returned future's result is the list of + results (in the order of the original sequence, not necessarily + the order of results arrival). If *result_exception* is True, + exceptions in the tasks are treated the same as successful + results, and gathered in the result list; otherwise, the first + raised exception will be immediately propagated to the returned + future. + + Cancellation: if the outer Future is cancelled, all children (that + have not completed yet) are also cancelled. If any child is + cancelled, this is treated as if it raised CancelledError -- + the outer Future is *not* cancelled in this case. (This is to + prevent the cancellation of one child to cause other children to + be cancelled.) + """ + children = [async(fut, loop=loop) for fut in coros_or_futures] + n = len(children) + if n == 0: + outer = futures.Future(loop=loop) + outer.set_result([]) + return outer + if loop is None: + loop = children[0]._loop + for fut in children: + if fut._loop is not loop: + raise ValueError("futures are tied to different event loops") + outer = _GatheringFuture(children, loop=loop) + nfinished = 0 + results = [None] * n + + def _done_callback(i, fut): + nonlocal nfinished + if outer._state != futures._PENDING: + if fut._exception is not None: + # Mark exception retrieved. + fut.exception() + return + if fut._state == futures._CANCELLED: + res = futures.CancelledError() + if not return_exceptions: + outer.set_exception(res) + return + elif fut._exception is not None: + res = fut.exception() # Mark exception retrieved. + if not return_exceptions: + outer.set_exception(res) + return + else: + res = fut._result + results[i] = res + nfinished += 1 + if nfinished == n: + outer.set_result(results) + + for i, fut in enumerate(children): + fut.add_done_callback(functools.partial(_done_callback, i)) + return outer + + +def shield(arg, *, loop=None): + """Wait for a future, shielding it from cancellation. + + The statement + + res = yield from shield(something()) + + is exactly equivalent to the statement + + res = yield from something() + + *except* that if the coroutine containing it is cancelled, the + task running in something() is not cancelled. From the POV of + something(), the cancellation did not happen. But its caller is + still cancelled, so the yield-from expression still raises + CancelledError. Note: If something() is cancelled by other means + this will still cancel shield(). + + If you want to completely ignore cancellation (not recommended) + you can combine shield() with a try/except clause, as follows: + + try: + res = yield from shield(something()) + except CancelledError: + res = None + """ + inner = async(arg, loop=loop) + if inner.done(): + # Shortcut. + return inner + loop = inner._loop + outer = futures.Future(loop=loop) + + def _done_callback(inner): + if outer.cancelled(): + # Mark inner's result as retrieved. + inner.cancelled() or inner.exception() + return + if inner.cancelled(): + outer.cancel() + else: + exc = inner.exception() + if exc is not None: + outer.set_exception(exc) + else: + outer.set_result(inner.result()) + + inner.add_done_callback(_done_callback) + return outer diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/test_utils.py @@ -0,0 +1,246 @@ +"""Utilities shared by tests.""" + +import collections +import contextlib +import io +import unittest.mock +import os +import sys +import threading +import unittest +import unittest.mock +from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +from . import tasks +from . import base_events +from . import events +from . import selectors + + +if sys.platform == 'win32': # pragma: no cover + from .windows_utils import socketpair +else: + from socket import socketpair # pragma: no cover + + +def dummy_ssl_context(): + if ssl is None: + return None + else: + return ssl.SSLContext(ssl.PROTOCOL_SSLv23) + + +def run_briefly(loop): + @tasks.coroutine + def once(): + pass + gen = once() + t = tasks.Task(gen, loop=loop) + try: + loop.run_until_complete(t) + finally: + gen.close() + + +def run_once(loop): + """loop.stop() schedules _raise_stop_error() + and run_forever() runs until _raise_stop_error() callback. + this wont work if test waits for some IO events, because + _raise_stop_error() runs before any of io events callbacks. + """ + loop.stop() + loop.run_forever() + + + at contextlib.contextmanager +def run_test_server(*, host='127.0.0.1', port=0, use_ssl=False): + + class SilentWSGIRequestHandler(WSGIRequestHandler): + def get_stderr(self): + return io.StringIO() + + def log_message(self, format, *args): + pass + + class SilentWSGIServer(WSGIServer): + def handle_error(self, request, client_address): + pass + + class SSLWSGIServer(SilentWSGIServer): + def finish_request(self, request, client_address): + # The relative location of our test directory (which + # contains the sample key and certificate files) differs + # between the stdlib and stand-alone Tulip/asyncio. + # Prefer our own if we can find it. + here = os.path.join(os.path.dirname(__file__), '..', 'tests') + if not os.path.isdir(here): + here = os.path.join(os.path.dirname(os.__file__), + 'test', 'test_asyncio') + keyfile = os.path.join(here, 'sample.key') + certfile = os.path.join(here, 'sample.crt') + ssock = ssl.wrap_socket(request, + keyfile=keyfile, + certfile=certfile, + server_side=True) + try: + self.RequestHandlerClass(ssock, client_address, self) + ssock.close() + except OSError: + # maybe socket has been closed by peer + pass + + def app(environ, start_response): + status = '200 OK' + headers = [('Content-type', 'text/plain')] + start_response(status, headers) + return [b'Test message'] + + # Run the test WSGI server in a separate thread in order not to + # interfere with event handling in the main thread + server_class = SSLWSGIServer if use_ssl else SilentWSGIServer + httpd = make_server(host, port, app, + server_class, SilentWSGIRequestHandler) + httpd.address = httpd.server_address + server_thread = threading.Thread(target=httpd.serve_forever) + server_thread.start() + try: + yield httpd + finally: + httpd.shutdown() + server_thread.join() + + +def make_test_protocol(base): + dct = {} + for name in dir(base): + if name.startswith('__') and name.endswith('__'): + # skip magic names + continue + dct[name] = unittest.mock.Mock(return_value=None) + return type('TestProtocol', (base,) + base.__bases__, dct)() + + +class TestSelector(selectors.BaseSelector): + + def select(self, timeout): + return [] + + +class TestLoop(base_events.BaseEventLoop): + """Loop for unittests. + + It manages self time directly. + If something scheduled to be executed later then + on next loop iteration after all ready handlers done + generator passed to __init__ is calling. + + Generator should be like this: + + def gen(): + ... + when = yield ... + ... = yield time_advance + + Value retuned by yield is absolute time of next scheduled handler. + Value passed to yield is time advance to move loop's time forward. + """ + + def __init__(self, gen=None): + super().__init__() + + if gen is None: + def gen(): + yield + self._check_on_close = False + else: + self._check_on_close = True + + self._gen = gen() + next(self._gen) + self._time = 0 + self._timers = [] + self._selector = TestSelector() + + self.readers = {} + self.writers = {} + self.reset_counters() + + def time(self): + return self._time + + def advance_time(self, advance): + """Move test time forward.""" + if advance: + self._time += advance + + def close(self): + if self._check_on_close: + try: + self._gen.send(0) + except StopIteration: + pass + else: # pragma: no cover + raise AssertionError("Time generator is not finished") + + def add_reader(self, fd, callback, *args): + self.readers[fd] = events.make_handle(callback, args) + + def remove_reader(self, fd): + self.remove_reader_count[fd] += 1 + if fd in self.readers: + del self.readers[fd] + return True + else: + return False + + def assert_reader(self, fd, callback, *args): + assert fd in self.readers, 'fd {} is not registered'.format(fd) + handle = self.readers[fd] + assert handle._callback == callback, '{!r} != {!r}'.format( + handle._callback, callback) + assert handle._args == args, '{!r} != {!r}'.format( + handle._args, args) + + def add_writer(self, fd, callback, *args): + self.writers[fd] = events.make_handle(callback, args) + + def remove_writer(self, fd): + self.remove_writer_count[fd] += 1 + if fd in self.writers: + del self.writers[fd] + return True + else: + return False + + def assert_writer(self, fd, callback, *args): + assert fd in self.writers, 'fd {} is not registered'.format(fd) + handle = self.writers[fd] + assert handle._callback == callback, '{!r} != {!r}'.format( + handle._callback, callback) + assert handle._args == args, '{!r} != {!r}'.format( + handle._args, args) + + def reset_counters(self): + self.remove_reader_count = collections.defaultdict(int) + self.remove_writer_count = collections.defaultdict(int) + + def _run_once(self): + super()._run_once() + for when in self._timers: + advance = self._gen.send(when) + self.advance_time(advance) + self._timers = [] + + def call_at(self, when, callback, *args): + self._timers.append(when) + return super().call_at(when, callback, *args) + + def _process_events(self, event_list): + return + + def _write_to_self(self): + pass diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/transports.py @@ -0,0 +1,186 @@ +"""Abstract Transport class.""" + +__all__ = ['ReadTransport', 'WriteTransport', 'Transport'] + + +class BaseTransport: + """Base ABC for transports.""" + + def __init__(self, extra=None): + if extra is None: + extra = {} + self._extra = extra + + def get_extra_info(self, name, default=None): + """Get optional transport information.""" + return self._extra.get(name, default) + + def close(self): + """Closes the transport. + + Buffered data will be flushed asynchronously. No more data + will be received. After all buffered data is flushed, the + protocol's connection_lost() method will (eventually) called + with None as its argument. + """ + raise NotImplementedError + + +class ReadTransport(BaseTransport): + """ABC for read-only transports.""" + + def pause(self): + """Pause the receiving end. + + No data will be passed to the protocol's data_received() + method until resume() is called. + """ + raise NotImplementedError + + def resume(self): + """Resume the receiving end. + + Data received will once again be passed to the protocol's + data_received() method. + """ + raise NotImplementedError + + +class WriteTransport(BaseTransport): + """ABC for write-only transports.""" + + def write(self, data): + """Write some data bytes to the transport. + + This does not block; it buffers the data and arranges for it + to be sent out asynchronously. + """ + raise NotImplementedError + + def writelines(self, list_of_data): + """Write a list (or any iterable) of data bytes to the transport. + + The default implementation just calls write() for each item in + the list/iterable. + """ + for data in list_of_data: + self.write(data) + + def write_eof(self): + """Closes the write end after flushing buffered data. + + (This is like typing ^D into a UNIX program reading from stdin.) + + Data may still be received. + """ + raise NotImplementedError + + def can_write_eof(self): + """Return True if this protocol supports write_eof(), False if not.""" + raise NotImplementedError + + def abort(self): + """Closes the transport immediately. + + Buffered data will be lost. No more data will be received. + The protocol's connection_lost() method will (eventually) be + called with None as its argument. + """ + raise NotImplementedError + + +class Transport(ReadTransport, WriteTransport): + """ABC representing a bidirectional transport. + + There may be several implementations, but typically, the user does + not implement new transports; rather, the platform provides some + useful transports that are implemented using the platform's best + practices. + + The user never instantiates a transport directly; they call a + utility function, passing it a protocol factory and other + information necessary to create the transport and protocol. (E.g. + EventLoop.create_connection() or EventLoop.create_server().) + + The utility function will asynchronously create a transport and a + protocol and hook them up by calling the protocol's + connection_made() method, passing it the transport. + + The implementation here raises NotImplemented for every method + except writelines(), which calls write() in a loop. + """ + + +class DatagramTransport(BaseTransport): + """ABC for datagram (UDP) transports.""" + + def sendto(self, data, addr=None): + """Send data to the transport. + + This does not block; it buffers the data and arranges for it + to be sent out asynchronously. + addr is target socket address. + If addr is None use target address pointed on transport creation. + """ + raise NotImplementedError + + def abort(self): + """Closes the transport immediately. + + Buffered data will be lost. No more data will be received. + The protocol's connection_lost() method will (eventually) be + called with None as its argument. + """ + raise NotImplementedError + + +class SubprocessTransport(BaseTransport): + + def get_pid(self): + """Get subprocess id.""" + raise NotImplementedError + + def get_returncode(self): + """Get subprocess returncode. + + See also + http://docs.python.org/3/library/subprocess#subprocess.Popen.returncode + """ + raise NotImplementedError + + def get_pipe_transport(self, fd): + """Get transport for pipe with number fd.""" + raise NotImplementedError + + def send_signal(self, signal): + """Send signal to subprocess. + + See also: + docs.python.org/3/library/subprocess#subprocess.Popen.send_signal + """ + raise NotImplementedError + + def terminate(self): + """Stop the subprocess. + + Alias for close() method. + + On Posix OSs the method sends SIGTERM to the subprocess. + On Windows the Win32 API function TerminateProcess() + is called to stop the subprocess. + + See also: + http://docs.python.org/3/library/subprocess#subprocess.Popen.terminate + """ + raise NotImplementedError + + def kill(self): + """Kill the subprocess. + + On Posix OSs the function sends SIGKILL to the subprocess. + On Windows kill() is an alias for terminate(). + + See also: + http://docs.python.org/3/library/subprocess#subprocess.Popen.kill + """ + raise NotImplementedError diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/unix_events.py @@ -0,0 +1,541 @@ +"""Selector eventloop for Unix with signal handling.""" + +import collections +import errno +import fcntl +import functools +import os +import signal +import socket +import stat +import subprocess +import sys + + +from . import constants +from . import events +from . import protocols +from . import selector_events +from . import tasks +from . import transports +from .log import asyncio_log + + +__all__ = ['SelectorEventLoop', 'STDIN', 'STDOUT', 'STDERR'] + +STDIN = 0 +STDOUT = 1 +STDERR = 2 + + +if sys.platform == 'win32': # pragma: no cover + raise ImportError('Signals are not really supported on Windows') + + +class SelectorEventLoop(selector_events.BaseSelectorEventLoop): + """Unix event loop + + Adds signal handling to SelectorEventLoop + """ + + def __init__(self, selector=None): + super().__init__(selector) + self._signal_handlers = {} + self._subprocesses = {} + + def _socketpair(self): + return socket.socketpair() + + def close(self): + handler = self._signal_handlers.get(signal.SIGCHLD) + if handler is not None: + self.remove_signal_handler(signal.SIGCHLD) + super().close() + + def add_signal_handler(self, sig, callback, *args): + """Add a handler for a signal. UNIX only. + + Raise ValueError if the signal number is invalid or uncatchable. + Raise RuntimeError if there is a problem setting up the handler. + """ + self._check_signal(sig) + try: + # set_wakeup_fd() raises ValueError if this is not the + # main thread. By calling it early we ensure that an + # event loop running in another thread cannot add a signal + # handler. + signal.set_wakeup_fd(self._csock.fileno()) + except ValueError as exc: + raise RuntimeError(str(exc)) + + handle = events.make_handle(callback, args) + self._signal_handlers[sig] = handle + + try: + signal.signal(sig, self._handle_signal) + except OSError as exc: + del self._signal_handlers[sig] + if not self._signal_handlers: + try: + signal.set_wakeup_fd(-1) + except ValueError as nexc: + asyncio_log.info('set_wakeup_fd(-1) failed: %s', nexc) + + if exc.errno == errno.EINVAL: + raise RuntimeError('sig {} cannot be caught'.format(sig)) + else: + raise + + def _handle_signal(self, sig, arg): + """Internal helper that is the actual signal handler.""" + handle = self._signal_handlers.get(sig) + if handle is None: + return # Assume it's some race condition. + if handle._cancelled: + self.remove_signal_handler(sig) # Remove it properly. + else: + self._add_callback_signalsafe(handle) + + def remove_signal_handler(self, sig): + """Remove a handler for a signal. UNIX only. + + Return True if a signal handler was removed, False if not. + """ + self._check_signal(sig) + try: + del self._signal_handlers[sig] + except KeyError: + return False + + if sig == signal.SIGINT: + handler = signal.default_int_handler + else: + handler = signal.SIG_DFL + + try: + signal.signal(sig, handler) + except OSError as exc: + if exc.errno == errno.EINVAL: + raise RuntimeError('sig {} cannot be caught'.format(sig)) + else: + raise + + if not self._signal_handlers: + try: + signal.set_wakeup_fd(-1) + except ValueError as exc: + asyncio_log.info('set_wakeup_fd(-1) failed: %s', exc) + + return True + + def _check_signal(self, sig): + """Internal helper to validate a signal. + + Raise ValueError if the signal number is invalid or uncatchable. + Raise RuntimeError if there is a problem setting up the handler. + """ + if not isinstance(sig, int): + raise TypeError('sig must be an int, not {!r}'.format(sig)) + + if not (1 <= sig < signal.NSIG): + raise ValueError( + 'sig {} out of range(1, {})'.format(sig, signal.NSIG)) + + def _make_read_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + return _UnixReadPipeTransport(self, pipe, protocol, waiter, extra) + + def _make_write_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + return _UnixWritePipeTransport(self, pipe, protocol, waiter, extra) + + @tasks.coroutine + def _make_subprocess_transport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + self._reg_sigchld() + transp = _UnixSubprocessTransport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs) + self._subprocesses[transp.get_pid()] = transp + yield from transp._post_init() + return transp + + def _reg_sigchld(self): + if signal.SIGCHLD not in self._signal_handlers: + self.add_signal_handler(signal.SIGCHLD, self._sig_chld) + + def _sig_chld(self): + try: + try: + pid, status = os.waitpid(0, os.WNOHANG) + except ChildProcessError: + return + if pid == 0: + self.call_soon(self._sig_chld) + return + elif os.WIFSIGNALED(status): + returncode = -os.WTERMSIG(status) + elif os.WIFEXITED(status): + returncode = os.WEXITSTATUS(status) + else: + self.call_soon(self._sig_chld) + return + transp = self._subprocesses.get(pid) + if transp is not None: + transp._process_exited(returncode) + except Exception: + asyncio_log.exception('Unknown exception in SIGCHLD handler') + + def _subprocess_closed(self, transport): + pid = transport.get_pid() + self._subprocesses.pop(pid, None) + + +def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) + + +class _UnixReadPipeTransport(transports.ReadTransport): + + max_size = 256 * 1024 # max bytes we read in one eventloop iteration + + def __init__(self, loop, pipe, protocol, waiter=None, extra=None): + super().__init__(extra) + self._extra['pipe'] = pipe + self._loop = loop + self._pipe = pipe + self._fileno = pipe.fileno() + _set_nonblocking(self._fileno) + self._protocol = protocol + self._closing = False + self._loop.add_reader(self._fileno, self._read_ready) + self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + self._loop.call_soon(waiter.set_result, None) + + def _read_ready(self): + try: + data = os.read(self._fileno, self.max_size) + except (BlockingIOError, InterruptedError): + pass + except OSError as exc: + self._fatal_error(exc) + else: + if data: + self._protocol.data_received(data) + else: + self._closing = True + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._protocol.eof_received) + self._loop.call_soon(self._call_connection_lost, None) + + def pause(self): + self._loop.remove_reader(self._fileno) + + def resume(self): + self._loop.add_reader(self._fileno, self._read_ready) + + def close(self): + if not self._closing: + self._close(None) + + def _fatal_error(self, exc): + # should be called by exception handler only + asyncio_log.exception('Fatal error for %s', self) + self._close(exc) + + def _close(self, exc): + self._closing = True + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._pipe.close() + self._pipe = None + self._protocol = None + self._loop = None + + +class _UnixWritePipeTransport(transports.WriteTransport): + + def __init__(self, loop, pipe, protocol, waiter=None, extra=None): + super().__init__(extra) + self._extra['pipe'] = pipe + self._loop = loop + self._pipe = pipe + self._fileno = pipe.fileno() + if not stat.S_ISFIFO(os.fstat(self._fileno).st_mode): + raise ValueError("Pipe transport is for pipes only.") + _set_nonblocking(self._fileno) + self._protocol = protocol + self._buffer = [] + self._conn_lost = 0 + self._closing = False # Set when close() or write_eof() called. + self._loop.add_reader(self._fileno, self._read_ready) + + self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + self._loop.call_soon(waiter.set_result, None) + + def _read_ready(self): + # pipe was closed by peer + self._close() + + def write(self, data): + assert isinstance(data, bytes), repr(data) + if not data: + return + + if self._conn_lost or self._closing: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + asyncio_log.warning('pipe closed by peer or ' + 'os.write(pipe, data) raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Attempt to send it right away first. + try: + n = os.write(self._fileno, data) + except (BlockingIOError, InterruptedError): + n = 0 + except Exception as exc: + self._conn_lost += 1 + self._fatal_error(exc) + return + if n == len(data): + return + elif n > 0: + data = data[n:] + self._loop.add_writer(self._fileno, self._write_ready) + + self._buffer.append(data) + + def _write_ready(self): + data = b''.join(self._buffer) + assert data, 'Data should not be empty' + + self._buffer.clear() + try: + n = os.write(self._fileno, data) + except (BlockingIOError, InterruptedError): + self._buffer.append(data) + except Exception as exc: + self._conn_lost += 1 + # Remove writer here, _fatal_error() doesn't it + # because _buffer is empty. + self._loop.remove_writer(self._fileno) + self._fatal_error(exc) + else: + if n == len(data): + self._loop.remove_writer(self._fileno) + if self._closing: + self._loop.remove_reader(self._fileno) + self._call_connection_lost(None) + return + elif n > 0: + data = data[n:] + + self._buffer.append(data) # Try again later. + + def can_write_eof(self): + return True + + # TODO: Make the relationships between write_eof(), close(), + # abort(), _fatal_error() and _close() more straightforward. + + def write_eof(self): + if self._closing: + return + assert self._pipe + self._closing = True + if not self._buffer: + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, None) + + def close(self): + if not self._closing: + # write_eof is all what we needed to close the write pipe + self.write_eof() + + def abort(self): + self._close(None) + + def _fatal_error(self, exc): + # should be called by exception handler only + asyncio_log.exception('Fatal error for %s', self) + self._close(exc) + + def _close(self, exc=None): + self._closing = True + if self._buffer: + self._loop.remove_writer(self._fileno) + self._buffer.clear() + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._pipe.close() + self._pipe = None + self._protocol = None + self._loop = None + + +class _UnixWriteSubprocessPipeProto(protocols.BaseProtocol): + pipe = None + + def __init__(self, proc, fd): + self.proc = proc + self.fd = fd + self.connected = False + self.disconnected = False + proc._pipes[fd] = self + + def connection_made(self, transport): + self.connected = True + self.pipe = transport + self.proc._try_connected() + + def connection_lost(self, exc): + self.disconnected = True + self.proc._pipe_connection_lost(self.fd, exc) + + +class _UnixReadSubprocessPipeProto(_UnixWriteSubprocessPipeProto, + protocols.Protocol): + + def data_received(self, data): + self.proc._pipe_data_received(self.fd, data) + + def eof_received(self): + pass + + +class _UnixSubprocessTransport(transports.SubprocessTransport): + + def __init__(self, loop, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + super().__init__(extra) + self._protocol = protocol + self._loop = loop + + self._pipes = {} + if stdin == subprocess.PIPE: + self._pipes[STDIN] = None + if stdout == subprocess.PIPE: + self._pipes[STDOUT] = None + if stderr == subprocess.PIPE: + self._pipes[STDERR] = None + self._pending_calls = collections.deque() + self._finished = False + self._returncode = None + + self._proc = subprocess.Popen( + args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, + universal_newlines=False, bufsize=bufsize, **kwargs) + self._extra['subprocess'] = self._proc + + def close(self): + for proto in self._pipes.values(): + proto.pipe.close() + if self._returncode is None: + self.terminate() + + def get_pid(self): + return self._proc.pid + + def get_returncode(self): + return self._returncode + + def get_pipe_transport(self, fd): + if fd in self._pipes: + return self._pipes[fd].pipe + else: + return None + + def send_signal(self, signal): + self._proc.send_signal(signal) + + def terminate(self): + self._proc.terminate() + + def kill(self): + self._proc.kill() + + @tasks.coroutine + def _post_init(self): + proc = self._proc + loop = self._loop + if proc.stdin is not None: + transp, proto = yield from loop.connect_write_pipe( + functools.partial( + _UnixWriteSubprocessPipeProto, self, STDIN), + proc.stdin) + if proc.stdout is not None: + transp, proto = yield from loop.connect_read_pipe( + functools.partial( + _UnixReadSubprocessPipeProto, self, STDOUT), + proc.stdout) + if proc.stderr is not None: + transp, proto = yield from loop.connect_read_pipe( + functools.partial( + _UnixReadSubprocessPipeProto, self, STDERR), + proc.stderr) + if not self._pipes: + self._try_connected() + + def _call(self, cb, *data): + if self._pending_calls is not None: + self._pending_calls.append((cb, data)) + else: + self._loop.call_soon(cb, *data) + + def _try_connected(self): + assert self._pending_calls is not None + if all(p is not None and p.connected for p in self._pipes.values()): + self._loop.call_soon(self._protocol.connection_made, self) + for callback, data in self._pending_calls: + self._loop.call_soon(callback, *data) + self._pending_calls = None + + def _pipe_connection_lost(self, fd, exc): + self._call(self._protocol.pipe_connection_lost, fd, exc) + self._try_finish() + + def _pipe_data_received(self, fd, data): + self._call(self._protocol.pipe_data_received, fd, data) + + def _process_exited(self, returncode): + assert returncode is not None, returncode + assert self._returncode is None, self._returncode + self._returncode = returncode + self._loop._subprocess_closed(self) + self._call(self._protocol.process_exited) + self._try_finish() + + def _try_finish(self): + assert not self._finished + if self._returncode is None: + return + if all(p is not None and p.disconnected + for p in self._pipes.values()): + self._finished = True + self._loop.call_soon(self._call_connection_lost, None) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._proc = None + self._protocol = None + self._loop = None diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/windows_events.py @@ -0,0 +1,375 @@ +"""Selector and proactor eventloops for Windows.""" + +import errno +import socket +import weakref +import struct +import _winapi + +from . import futures +from . import proactor_events +from . import selector_events +from . import tasks +from . import windows_utils +from .log import asyncio_log + +try: + import _overlapped +except ImportError: + from . import _overlapped + + +__all__ = ['SelectorEventLoop', 'ProactorEventLoop', 'IocpProactor'] + + +NULL = 0 +INFINITE = 0xffffffff +ERROR_CONNECTION_REFUSED = 1225 +ERROR_CONNECTION_ABORTED = 1236 + + +class _OverlappedFuture(futures.Future): + """Subclass of Future which represents an overlapped operation. + + Cancelling it will immediately cancel the overlapped operation. + """ + + def __init__(self, ov, *, loop=None): + super().__init__(loop=loop) + self.ov = ov + + def cancel(self): + try: + self.ov.cancel() + except OSError: + pass + return super().cancel() + + +class PipeServer(object): + """Class representing a pipe server. + + This is much like a bound, listening socket. + """ + def __init__(self, address): + self._address = address + self._free_instances = weakref.WeakSet() + self._pipe = self._server_pipe_handle(True) + + def _get_unconnected_pipe(self): + # Create new instance and return previous one. This ensures + # that (until the server is closed) there is always at least + # one pipe handle for address. Therefore if a client attempt + # to connect it will not fail with FileNotFoundError. + tmp, self._pipe = self._pipe, self._server_pipe_handle(False) + return tmp + + def _server_pipe_handle(self, first): + # Return a wrapper for a new pipe handle. + if self._address is None: + return None + flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED + if first: + flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE + h = _winapi.CreateNamedPipe( + self._address, flags, + _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | + _winapi.PIPE_WAIT, + _winapi.PIPE_UNLIMITED_INSTANCES, + windows_utils.BUFSIZE, windows_utils.BUFSIZE, + _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL) + pipe = windows_utils.PipeHandle(h) + self._free_instances.add(pipe) + return pipe + + def close(self): + # Close all instances which have not been connected to by a client. + if self._address is not None: + for pipe in self._free_instances: + pipe.close() + self._pipe = None + self._address = None + self._free_instances.clear() + + __del__ = close + + +class SelectorEventLoop(selector_events.BaseSelectorEventLoop): + """Windows version of selector event loop.""" + + def _socketpair(self): + return windows_utils.socketpair() + + +class ProactorEventLoop(proactor_events.BaseProactorEventLoop): + """Windows version of proactor event loop using IOCP.""" + + def __init__(self, proactor=None): + if proactor is None: + proactor = IocpProactor() + super().__init__(proactor) + + def _socketpair(self): + return windows_utils.socketpair() + + @tasks.coroutine + def create_pipe_connection(self, protocol_factory, address): + f = self._proactor.connect_pipe(address) + pipe = yield from f + protocol = protocol_factory() + trans = self._make_duplex_pipe_transport(pipe, protocol, + extra={'addr': address}) + return trans, protocol + + @tasks.coroutine + def start_serving_pipe(self, protocol_factory, address): + server = PipeServer(address) + def loop(f=None): + pipe = None + try: + if f: + pipe = f.result() + server._free_instances.discard(pipe) + protocol = protocol_factory() + self._make_duplex_pipe_transport( + pipe, protocol, extra={'addr': address}) + pipe = server._get_unconnected_pipe() + if pipe is None: + return + f = self._proactor.accept_pipe(pipe) + except OSError: + if pipe and pipe.fileno() != -1: + asyncio_log.exception('Pipe accept failed') + pipe.close() + except futures.CancelledError: + if pipe: + pipe.close() + else: + f.add_done_callback(loop) + self.call_soon(loop) + return [server] + + def _stop_serving(self, server): + server.close() + + +class IocpProactor: + """Proactor implementation using IOCP.""" + + def __init__(self, concurrency=0xffffffff): + self._loop = None + self._results = [] + self._iocp = _overlapped.CreateIoCompletionPort( + _overlapped.INVALID_HANDLE_VALUE, NULL, 0, concurrency) + self._cache = {} + self._registered = weakref.WeakSet() + self._stopped_serving = weakref.WeakSet() + + def set_loop(self, loop): + self._loop = loop + + def select(self, timeout=None): + if not self._results: + self._poll(timeout) + tmp = self._results + self._results = [] + return tmp + + def recv(self, conn, nbytes, flags=0): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + if isinstance(conn, socket.socket): + ov.WSARecv(conn.fileno(), nbytes, flags) + else: + ov.ReadFile(conn.fileno(), nbytes) + def finish(trans, key, ov): + try: + return ov.getresult() + except OSError as exc: + if exc.winerror == _overlapped.ERROR_NETNAME_DELETED: + raise ConnectionResetError(*exc.args) + else: + raise + return self._register(ov, conn, finish) + + def send(self, conn, buf, flags=0): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + if isinstance(conn, socket.socket): + ov.WSASend(conn.fileno(), buf, flags) + else: + ov.WriteFile(conn.fileno(), buf) + def finish(trans, key, ov): + try: + return ov.getresult() + except OSError as exc: + if exc.winerror == _overlapped.ERROR_NETNAME_DELETED: + raise ConnectionResetError(*exc.args) + else: + raise + return self._register(ov, conn, finish) + + def accept(self, listener): + self._register_with_iocp(listener) + conn = self._get_accept_socket(listener.family) + ov = _overlapped.Overlapped(NULL) + ov.AcceptEx(listener.fileno(), conn.fileno()) + def finish_accept(trans, key, ov): + ov.getresult() + # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work. + buf = struct.pack('@P', listener.fileno()) + conn.setsockopt(socket.SOL_SOCKET, + _overlapped.SO_UPDATE_ACCEPT_CONTEXT, buf) + conn.settimeout(listener.gettimeout()) + return conn, conn.getpeername() + return self._register(ov, listener, finish_accept) + + def connect(self, conn, address): + self._register_with_iocp(conn) + # The socket needs to be locally bound before we call ConnectEx(). + try: + _overlapped.BindLocal(conn.fileno(), conn.family) + except OSError as e: + if e.winerror != errno.WSAEINVAL: + raise + # Probably already locally bound; check using getsockname(). + if conn.getsockname()[1] == 0: + raise + ov = _overlapped.Overlapped(NULL) + ov.ConnectEx(conn.fileno(), address) + def finish_connect(trans, key, ov): + ov.getresult() + # Use SO_UPDATE_CONNECT_CONTEXT so getsockname() etc work. + conn.setsockopt(socket.SOL_SOCKET, + _overlapped.SO_UPDATE_CONNECT_CONTEXT, 0) + return conn + return self._register(ov, conn, finish_connect) + + def accept_pipe(self, pipe): + self._register_with_iocp(pipe) + ov = _overlapped.Overlapped(NULL) + ov.ConnectNamedPipe(pipe.fileno()) + def finish(trans, key, ov): + ov.getresult() + return pipe + return self._register(ov, pipe, finish) + + def connect_pipe(self, address): + ov = _overlapped.Overlapped(NULL) + ov.WaitNamedPipeAndConnect(address, self._iocp, ov.address) + def finish(err, handle, ov): + # err, handle were arguments passed to PostQueuedCompletionStatus() + # in a function run in a thread pool. + if err == _overlapped.ERROR_SEM_TIMEOUT: + # Connection did not succeed within time limit. + msg = _overlapped.FormatMessage(err) + raise ConnectionRefusedError(0, msg, None, err) + elif err != 0: + msg = _overlapped.FormatMessage(err) + raise OSError(0, msg, None, err) + else: + return windows_utils.PipeHandle(handle) + return self._register(ov, None, finish, wait_for_post=True) + + def _register_with_iocp(self, obj): + # To get notifications of finished ops on this objects sent to the + # completion port, were must register the handle. + if obj not in self._registered: + self._registered.add(obj) + _overlapped.CreateIoCompletionPort(obj.fileno(), self._iocp, 0, 0) + # XXX We could also use SetFileCompletionNotificationModes() + # to avoid sending notifications to completion port of ops + # that succeed immediately. + + def _register(self, ov, obj, callback, wait_for_post=False): + # Return a future which will be set with the result of the + # operation when it completes. The future's value is actually + # the value returned by callback(). + f = _OverlappedFuture(ov, loop=self._loop) + if ov.pending or wait_for_post: + # Register the overlapped operation for later. Note that + # we only store obj to prevent it from being garbage + # collected too early. + self._cache[ov.address] = (f, ov, obj, callback) + else: + # The operation has completed, so no need to postpone the + # work. We cannot take this short cut if we need the + # NumberOfBytes, CompletionKey values returned by + # PostQueuedCompletionStatus(). + try: + value = callback(None, None, ov) + except OSError as e: + f.set_exception(e) + else: + f.set_result(value) + return f + + def _get_accept_socket(self, family): + s = socket.socket(family) + s.settimeout(0) + return s + + def _poll(self, timeout=None): + if timeout is None: + ms = INFINITE + elif timeout < 0: + raise ValueError("negative timeout") + else: + ms = int(timeout * 1000 + 0.5) + if ms >= INFINITE: + raise ValueError("timeout too big") + while True: + status = _overlapped.GetQueuedCompletionStatus(self._iocp, ms) + if status is None: + return + err, transferred, key, address = status + try: + f, ov, obj, callback = self._cache.pop(address) + except KeyError: + # key is either zero, or it is used to return a pipe + # handle which should be closed to avoid a leak. + if key not in (0, _overlapped.INVALID_HANDLE_VALUE): + _winapi.CloseHandle(key) + ms = 0 + continue + if obj in self._stopped_serving: + f.cancel() + elif not f.cancelled(): + try: + value = callback(transferred, key, ov) + except OSError as e: + f.set_exception(e) + self._results.append(f) + else: + f.set_result(value) + self._results.append(f) + ms = 0 + + def _stop_serving(self, obj): + # obj is a socket or pipe handle. It will be closed in + # BaseProactorEventLoop._stop_serving() which will make any + # pending operations fail quickly. + self._stopped_serving.add(obj) + + def close(self): + # Cancel remaining registered operations. + for address, (f, ov, obj, callback) in list(self._cache.items()): + if obj is None: + # The operation was started with connect_pipe() which + # queues a task to Windows' thread pool. This cannot + # be cancelled, so just forget it. + del self._cache[address] + else: + try: + ov.cancel() + except OSError: + pass + + while self._cache: + if not self._poll(1): + asyncio_log.debug('taking long time to close proactor') + + self._results = [] + if self._iocp is not None: + _winapi.CloseHandle(self._iocp) + self._iocp = None diff --git a/Lib/asyncio/windows_utils.py b/Lib/asyncio/windows_utils.py new file mode 100644 --- /dev/null +++ b/Lib/asyncio/windows_utils.py @@ -0,0 +1,181 @@ +""" +Various Windows specific bits and pieces +""" + +import sys + +if sys.platform != 'win32': # pragma: no cover + raise ImportError('win32 only') + +import socket +import itertools +import msvcrt +import os +import subprocess +import tempfile +import _winapi + + +__all__ = ['socketpair', 'pipe', 'Popen', 'PIPE', 'PipeHandle'] + +# +# Constants/globals +# + +BUFSIZE = 8192 +PIPE = subprocess.PIPE +_mmap_counter = itertools.count() + +# +# Replacement for socket.socketpair() +# + +def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): + """A socket pair usable as a self-pipe, for Windows. + + Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. + """ + # We create a connected TCP socket. Note the trick with setblocking(0) + # that prevents us from having to create a thread. + lsock = socket.socket(family, type, proto) + lsock.bind(('localhost', 0)) + lsock.listen(1) + addr, port = lsock.getsockname() + csock = socket.socket(family, type, proto) + csock.setblocking(False) + try: + csock.connect((addr, port)) + except (BlockingIOError, InterruptedError): + pass + except Exception: + lsock.close() + csock.close() + raise + ssock, _ = lsock.accept() + csock.setblocking(True) + lsock.close() + return (ssock, csock) + +# +# Replacement for os.pipe() using handles instead of fds +# + +def pipe(*, duplex=False, overlapped=(True, True), bufsize=BUFSIZE): + """Like os.pipe() but with overlapped support and using handles not fds.""" + address = tempfile.mktemp(prefix=r'\\.\pipe\python-pipe-%d-%d-' % + (os.getpid(), next(_mmap_counter))) + + if duplex: + openmode = _winapi.PIPE_ACCESS_DUPLEX + access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE + obsize, ibsize = bufsize, bufsize + else: + openmode = _winapi.PIPE_ACCESS_INBOUND + access = _winapi.GENERIC_WRITE + obsize, ibsize = 0, bufsize + + openmode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE + + if overlapped[0]: + openmode |= _winapi.FILE_FLAG_OVERLAPPED + + if overlapped[1]: + flags_and_attribs = _winapi.FILE_FLAG_OVERLAPPED + else: + flags_and_attribs = 0 + + h1 = h2 = None + try: + h1 = _winapi.CreateNamedPipe( + address, openmode, _winapi.PIPE_WAIT, + 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL) + + h2 = _winapi.CreateFile( + address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING, + flags_and_attribs, _winapi.NULL) + + ov = _winapi.ConnectNamedPipe(h1, overlapped=True) + ov.GetOverlappedResult(True) + return h1, h2 + except: + if h1 is not None: + _winapi.CloseHandle(h1) + if h2 is not None: + _winapi.CloseHandle(h2) + raise + +# +# Wrapper for a pipe handle +# + +class PipeHandle: + """Wrapper for an overlapped pipe handle which is vaguely file-object like. + + The IOCP event loop can use these instead of socket objects. + """ + def __init__(self, handle): + self._handle = handle + + @property + def handle(self): + return self._handle + + def fileno(self): + return self._handle + + def close(self, *, CloseHandle=_winapi.CloseHandle): + if self._handle != -1: + CloseHandle(self._handle) + self._handle = -1 + + __del__ = close + + def __enter__(self): + return self + + def __exit__(self, t, v, tb): + self.close() + +# +# Replacement for subprocess.Popen using overlapped pipe handles +# + +class Popen(subprocess.Popen): + """Replacement for subprocess.Popen using overlapped pipe handles. + + The stdin, stdout, stderr are None or instances of PipeHandle. + """ + def __init__(self, args, stdin=None, stdout=None, stderr=None, **kwds): + stdin_rfd = stdout_wfd = stderr_wfd = None + stdin_wh = stdout_rh = stderr_rh = None + if stdin == PIPE: + stdin_rh, stdin_wh = pipe(overlapped=(False, True)) + stdin_rfd = msvcrt.open_osfhandle(stdin_rh, os.O_RDONLY) + if stdout == PIPE: + stdout_rh, stdout_wh = pipe(overlapped=(True, False)) + stdout_wfd = msvcrt.open_osfhandle(stdout_wh, 0) + if stderr == PIPE: + stderr_rh, stderr_wh = pipe(overlapped=(True, False)) + stderr_wfd = msvcrt.open_osfhandle(stderr_wh, 0) + try: + super().__init__(args, bufsize=0, universal_newlines=False, + stdin=stdin_rfd, stdout=stdout_wfd, + stderr=stderr_wfd, **kwds) + except: + for h in (stdin_wh, stdout_rh, stderr_rh): + _winapi.CloseHandle(h) + raise + else: + if stdin_wh is not None: + self.stdin = PipeHandle(stdin_wh) + if stdout_rh is not None: + self.stdout = PipeHandle(stdout_rh) + if stderr_rh is not None: + self.stderr = PipeHandle(stderr_rh) + finally: + if stdin == PIPE: + os.close(stdin_rfd) + if stdout == PIPE: + os.close(stdout_wfd) + if stderr == PIPE: + os.close(stderr_wfd) diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/__init__.py @@ -0,0 +1,26 @@ +import os +import sys +import unittest +from test.support import run_unittest + + +def suite(): + tests_file = os.path.join(os.path.dirname(__file__), 'tests.txt') + with open(tests_file) as fp: + test_names = fp.read().splitlines() + tests = unittest.TestSuite() + loader = unittest.TestLoader() + for test_name in test_names: + mod_name = 'test.' + test_name + try: + __import__(mod_name) + except unittest.SkipTest: + pass + else: + mod = sys.modules[mod_name] + tests.addTests(loader.loadTestsFromModule(mod)) + return tests + + +def test_main(): + run_unittest(suite()) diff --git a/Lib/test/test_asyncio/__main__.py b/Lib/test/test_asyncio/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/__main__.py @@ -0,0 +1,5 @@ +from . import test_main + + +if __name__ == '__main__': + test_main() diff --git a/Lib/test/test_asyncio/echo.py b/Lib/test/test_asyncio/echo.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/echo.py @@ -0,0 +1,6 @@ +import os + +if __name__ == '__main__': + while True: + buf = os.read(0, 1024) + os.write(1, buf) diff --git a/Lib/test/test_asyncio/echo2.py b/Lib/test/test_asyncio/echo2.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/echo2.py @@ -0,0 +1,6 @@ +import os + +if __name__ == '__main__': + buf = os.read(0, 1024) + os.write(1, b'OUT:'+buf) + os.write(2, b'ERR:'+buf) diff --git a/Lib/test/test_asyncio/echo3.py b/Lib/test/test_asyncio/echo3.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/echo3.py @@ -0,0 +1,9 @@ +import os + +if __name__ == '__main__': + while True: + buf = os.read(0, 1024) + try: + os.write(1, b'OUT:'+buf) + except OSError as ex: + os.write(2, b'ERR:' + ex.__class__.__name__.encode('ascii')) diff --git a/Lib/test/test_asyncio/sample.crt b/Lib/test/test_asyncio/sample.crt new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/sample.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICMzCCAZwCCQDFl4ys0fU7iTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuLUZyYW5jaXNjbzEi +MCAGA1UECgwZUHl0aG9uIFNvZnR3YXJlIEZvbmRhdGlvbjAeFw0xMzAzMTgyMDA3 +MjhaFw0yMzAzMTYyMDA3MjhaMF4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxp +Zm9ybmlhMRYwFAYDVQQHDA1TYW4tRnJhbmNpc2NvMSIwIAYDVQQKDBlQeXRob24g +U29mdHdhcmUgRm9uZGF0aW9uMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn +t3s+J7L0xP/YdAQOacpPi9phlrzKZhcXL3XMu2LCUg2fNJpx/47Vc5TZSaO11uO7 +gdwVz3Z7Q2epAgwo59JLffLt5fia8+a/SlPweI/j4+wcIIIiqusnLfpqR8cIAavg +Z06cLYCDvb9wMlheIvSJY12skc1nnphWS2YJ0Xm6uQIDAQABMA0GCSqGSIb3DQEB +BQUAA4GBAE9PknG6pv72+5z/gsDGYy8sK5UNkbWSNr4i4e5lxVsF03+/M71H+3AB +MxVX4+A+Vlk2fmU+BrdHIIUE0r1dDcO3josQ9hc9OJpp5VLSQFP8VeuJCmzYPp9I +I8WbW93cnXnChTrYQVdgVoFdv7GE9YgU7NYkrGIM0nZl1/f/bHPB +-----END CERTIFICATE----- diff --git a/Lib/test/test_asyncio/sample.key b/Lib/test/test_asyncio/sample.key new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/sample.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCnt3s+J7L0xP/YdAQOacpPi9phlrzKZhcXL3XMu2LCUg2fNJpx +/47Vc5TZSaO11uO7gdwVz3Z7Q2epAgwo59JLffLt5fia8+a/SlPweI/j4+wcIIIi +qusnLfpqR8cIAavgZ06cLYCDvb9wMlheIvSJY12skc1nnphWS2YJ0Xm6uQIDAQAB +AoGABfm8k19Yue3W68BecKEGS0VBV57GRTPT+MiBGvVGNIQ15gk6w3sGfMZsdD1y +bsUkQgcDb2d/4i5poBTpl/+Cd41V+c20IC/sSl5X1IEreHMKSLhy/uyjyiyfXlP1 +iXhToFCgLWwENWc8LzfUV8vuAV5WG6oL9bnudWzZxeqx8V0CQQDR7xwVj6LN70Eb +DUhSKLkusmFw5Gk9NJ/7wZ4eHg4B8c9KNVvSlLCLhcsVTQXuqYeFpOqytI45SneP +lr0vrvsDAkEAzITYiXu6ox5huDCG7imX2W9CAYuX638urLxBqBXMS7GqBzojD6RL +21Q8oPwJWJquERa3HDScq1deiQbM9uKIkwJBAIa1PLslGN216Xv3UPHPScyKD/aF +ynXIv+OnANPoiyp6RH4ksQ/18zcEGiVH8EeNpvV9tlAHhb+DZibQHgNr74sCQQC0 +zhToplu/bVKSlUQUNO0rqrI9z30FErDewKeCw5KSsIRSU1E/uM3fHr9iyq4wiL6u +GNjUtKZ0y46lsT9uW6LFAkB5eqeEQnshAdr3X5GykWHJ8DDGBXPPn6Rce1NX4RSq +V9khG2z1bFyfo+hMqpYnF2k32hVq3E54RS8YYnwBsVof +-----END RSA PRIVATE KEY----- diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_base_events.py @@ -0,0 +1,590 @@ +"""Tests for base_events.py""" + +import logging +import socket +import time +import unittest +import unittest.mock + +from asyncio import base_events +from asyncio import events +from asyncio import futures +from asyncio import protocols +from asyncio import tasks +from asyncio import test_utils + + +class BaseEventLoopTests(unittest.TestCase): + + def setUp(self): + self.loop = base_events.BaseEventLoop() + self.loop._selector = unittest.mock.Mock() + events.set_event_loop(None) + + def test_not_implemented(self): + m = unittest.mock.Mock() + self.assertRaises( + NotImplementedError, + self.loop._make_socket_transport, m, m) + self.assertRaises( + NotImplementedError, + self.loop._make_ssl_transport, m, m, m, m) + self.assertRaises( + NotImplementedError, + self.loop._make_datagram_transport, m, m) + self.assertRaises( + NotImplementedError, self.loop._process_events, []) + self.assertRaises( + NotImplementedError, self.loop._write_to_self) + self.assertRaises( + NotImplementedError, self.loop._read_from_self) + self.assertRaises( + NotImplementedError, + self.loop._make_read_pipe_transport, m, m) + self.assertRaises( + NotImplementedError, + self.loop._make_write_pipe_transport, m, m) + gen = self.loop._make_subprocess_transport(m, m, m, m, m, m, m) + self.assertRaises(NotImplementedError, next, iter(gen)) + + def test__add_callback_handle(self): + h = events.Handle(lambda: False, ()) + + self.loop._add_callback(h) + self.assertFalse(self.loop._scheduled) + self.assertIn(h, self.loop._ready) + + def test__add_callback_timer(self): + h = events.TimerHandle(time.monotonic()+10, lambda: False, ()) + + self.loop._add_callback(h) + self.assertIn(h, self.loop._scheduled) + + def test__add_callback_cancelled_handle(self): + h = events.Handle(lambda: False, ()) + h.cancel() + + self.loop._add_callback(h) + self.assertFalse(self.loop._scheduled) + self.assertFalse(self.loop._ready) + + def test_set_default_executor(self): + executor = unittest.mock.Mock() + self.loop.set_default_executor(executor) + self.assertIs(executor, self.loop._default_executor) + + def test_getnameinfo(self): + sockaddr = unittest.mock.Mock() + self.loop.run_in_executor = unittest.mock.Mock() + self.loop.getnameinfo(sockaddr) + self.assertEqual( + (None, socket.getnameinfo, sockaddr, 0), + self.loop.run_in_executor.call_args[0]) + + def test_call_soon(self): + def cb(): + pass + + h = self.loop.call_soon(cb) + self.assertEqual(h._callback, cb) + self.assertIsInstance(h, events.Handle) + self.assertIn(h, self.loop._ready) + + def test_call_later(self): + def cb(): + pass + + h = self.loop.call_later(10.0, cb) + self.assertIsInstance(h, events.TimerHandle) + self.assertIn(h, self.loop._scheduled) + self.assertNotIn(h, self.loop._ready) + + def test_call_later_negative_delays(self): + calls = [] + + def cb(arg): + calls.append(arg) + + self.loop._process_events = unittest.mock.Mock() + self.loop.call_later(-1, cb, 'a') + self.loop.call_later(-2, cb, 'b') + test_utils.run_briefly(self.loop) + self.assertEqual(calls, ['b', 'a']) + + def test_time_and_call_at(self): + def cb(): + self.loop.stop() + + self.loop._process_events = unittest.mock.Mock() + when = self.loop.time() + 0.1 + self.loop.call_at(when, cb) + t0 = self.loop.time() + self.loop.run_forever() + t1 = self.loop.time() + self.assertTrue(0.09 <= t1-t0 <= 0.12, t1-t0) + + def test_run_once_in_executor_handle(self): + def cb(): + pass + + self.assertRaises( + AssertionError, self.loop.run_in_executor, + None, events.Handle(cb, ()), ('',)) + self.assertRaises( + AssertionError, self.loop.run_in_executor, + None, events.TimerHandle(10, cb, ())) + + def test_run_once_in_executor_cancelled(self): + def cb(): + pass + h = events.Handle(cb, ()) + h.cancel() + + f = self.loop.run_in_executor(None, h) + self.assertIsInstance(f, futures.Future) + self.assertTrue(f.done()) + self.assertIsNone(f.result()) + + def test_run_once_in_executor_plain(self): + def cb(): + pass + h = events.Handle(cb, ()) + f = futures.Future(loop=self.loop) + executor = unittest.mock.Mock() + executor.submit.return_value = f + + self.loop.set_default_executor(executor) + + res = self.loop.run_in_executor(None, h) + self.assertIs(f, res) + + executor = unittest.mock.Mock() + executor.submit.return_value = f + res = self.loop.run_in_executor(executor, h) + self.assertIs(f, res) + self.assertTrue(executor.submit.called) + + f.cancel() # Don't complain about abandoned Future. + + def test__run_once(self): + h1 = events.TimerHandle(time.monotonic() + 0.1, lambda: True, ()) + h2 = events.TimerHandle(time.monotonic() + 10.0, lambda: True, ()) + + h1.cancel() + + self.loop._process_events = unittest.mock.Mock() + self.loop._scheduled.append(h1) + self.loop._scheduled.append(h2) + self.loop._run_once() + + t = self.loop._selector.select.call_args[0][0] + self.assertTrue(9.99 < t < 10.1, t) + self.assertEqual([h2], self.loop._scheduled) + self.assertTrue(self.loop._process_events.called) + + @unittest.mock.patch('asyncio.base_events.time') + @unittest.mock.patch('asyncio.base_events.asyncio_log') + def test__run_once_logging(self, m_logging, m_time): + # Log to INFO level if timeout > 1.0 sec. + idx = -1 + data = [10.0, 10.0, 12.0, 13.0] + + def monotonic(): + nonlocal data, idx + idx += 1 + return data[idx] + + m_time.monotonic = monotonic + m_logging.INFO = logging.INFO + m_logging.DEBUG = logging.DEBUG + + self.loop._scheduled.append( + events.TimerHandle(11.0, lambda: True, ())) + self.loop._process_events = unittest.mock.Mock() + self.loop._run_once() + self.assertEqual(logging.INFO, m_logging.log.call_args[0][0]) + + idx = -1 + data = [10.0, 10.0, 10.3, 13.0] + self.loop._scheduled = [events.TimerHandle(11.0, lambda:True, ())] + self.loop._run_once() + self.assertEqual(logging.DEBUG, m_logging.log.call_args[0][0]) + + def test__run_once_schedule_handle(self): + handle = None + processed = False + + def cb(loop): + nonlocal processed, handle + processed = True + handle = loop.call_soon(lambda: True) + + h = events.TimerHandle(time.monotonic() - 1, cb, (self.loop,)) + + self.loop._process_events = unittest.mock.Mock() + self.loop._scheduled.append(h) + self.loop._run_once() + + self.assertTrue(processed) + self.assertEqual([handle], list(self.loop._ready)) + + def test_run_until_complete_type_error(self): + self.assertRaises( + TypeError, self.loop.run_until_complete, 'blah') + + +class MyProto(protocols.Protocol): + done = None + + def __init__(self, create_future=False): + self.state = 'INITIAL' + self.nbytes = 0 + if create_future: + self.done = futures.Future() + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'CONNECTED' + transport.write(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n') + + def data_received(self, data): + assert self.state == 'CONNECTED', self.state + self.nbytes += len(data) + + def eof_received(self): + assert self.state == 'CONNECTED', self.state + self.state = 'EOF' + + def connection_lost(self, exc): + assert self.state in ('CONNECTED', 'EOF'), self.state + self.state = 'CLOSED' + if self.done: + self.done.set_result(None) + + +class MyDatagramProto(protocols.DatagramProtocol): + done = None + + def __init__(self, create_future=False): + self.state = 'INITIAL' + self.nbytes = 0 + if create_future: + self.done = futures.Future() + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'INITIALIZED' + + def datagram_received(self, data, addr): + assert self.state == 'INITIALIZED', self.state + self.nbytes += len(data) + + def connection_refused(self, exc): + assert self.state == 'INITIALIZED', self.state + + def connection_lost(self, exc): + assert self.state == 'INITIALIZED', self.state + self.state = 'CLOSED' + if self.done: + self.done.set_result(None) + + +class BaseEventLoopWithSelectorTests(unittest.TestCase): + + def setUp(self): + self.loop = events.new_event_loop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_connection_multiple_errors(self, m_socket): + + class MyProto(protocols.Protocol): + pass + + @tasks.coroutine + def getaddrinfo(*args, **kw): + yield from [] + return [(2, 1, 6, '', ('107.6.106.82', 80)), + (2, 1, 6, '', ('107.6.106.82', 80))] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + idx = -1 + errors = ['err1', 'err2'] + + def _socket(*args, **kw): + nonlocal idx, errors + idx += 1 + raise OSError(errors[idx]) + + m_socket.socket = _socket + + self.loop.getaddrinfo = getaddrinfo_task + + coro = self.loop.create_connection(MyProto, 'example.com', 80) + with self.assertRaises(OSError) as cm: + self.loop.run_until_complete(coro) + + self.assertEqual(str(cm.exception), 'Multiple exceptions: err1, err2') + + def test_create_connection_host_port_sock(self): + coro = self.loop.create_connection( + MyProto, 'example.com', 80, sock=object()) + self.assertRaises(ValueError, self.loop.run_until_complete, coro) + + def test_create_connection_no_host_port_sock(self): + coro = self.loop.create_connection(MyProto) + self.assertRaises(ValueError, self.loop.run_until_complete, coro) + + def test_create_connection_no_getaddrinfo(self): + @tasks.coroutine + def getaddrinfo(*args, **kw): + yield from [] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + self.loop.getaddrinfo = getaddrinfo_task + coro = self.loop.create_connection(MyProto, 'example.com', 80) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + def test_create_connection_connect_err(self): + @tasks.coroutine + def getaddrinfo(*args, **kw): + yield from [] + return [(2, 1, 6, '', ('107.6.106.82', 80))] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + self.loop.getaddrinfo = getaddrinfo_task + self.loop.sock_connect = unittest.mock.Mock() + self.loop.sock_connect.side_effect = OSError + + coro = self.loop.create_connection(MyProto, 'example.com', 80) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + def test_create_connection_multiple(self): + @tasks.coroutine + def getaddrinfo(*args, **kw): + return [(2, 1, 6, '', ('0.0.0.1', 80)), + (2, 1, 6, '', ('0.0.0.2', 80))] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + self.loop.getaddrinfo = getaddrinfo_task + self.loop.sock_connect = unittest.mock.Mock() + self.loop.sock_connect.side_effect = OSError + + coro = self.loop.create_connection( + MyProto, 'example.com', 80, family=socket.AF_INET) + with self.assertRaises(OSError): + self.loop.run_until_complete(coro) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_connection_multiple_errors_local_addr(self, m_socket): + + def bind(addr): + if addr[0] == '0.0.0.1': + err = OSError('Err') + err.strerror = 'Err' + raise err + + m_socket.socket.return_value.bind = bind + + @tasks.coroutine + def getaddrinfo(*args, **kw): + return [(2, 1, 6, '', ('0.0.0.1', 80)), + (2, 1, 6, '', ('0.0.0.2', 80))] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + self.loop.getaddrinfo = getaddrinfo_task + self.loop.sock_connect = unittest.mock.Mock() + self.loop.sock_connect.side_effect = OSError('Err2') + + coro = self.loop.create_connection( + MyProto, 'example.com', 80, family=socket.AF_INET, + local_addr=(None, 8080)) + with self.assertRaises(OSError) as cm: + self.loop.run_until_complete(coro) + + self.assertTrue(str(cm.exception).startswith('Multiple exceptions: ')) + self.assertTrue(m_socket.socket.return_value.close.called) + + def test_create_connection_no_local_addr(self): + @tasks.coroutine + def getaddrinfo(host, *args, **kw): + if host == 'example.com': + return [(2, 1, 6, '', ('107.6.106.82', 80)), + (2, 1, 6, '', ('107.6.106.82', 80))] + else: + return [] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + self.loop.getaddrinfo = getaddrinfo_task + + coro = self.loop.create_connection( + MyProto, 'example.com', 80, family=socket.AF_INET, + local_addr=(None, 8080)) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + def test_create_server_empty_host(self): + # if host is empty string use None instead + host = object() + + @tasks.coroutine + def getaddrinfo(*args, **kw): + nonlocal host + host = args[0] + yield from [] + + def getaddrinfo_task(*args, **kwds): + return tasks.Task(getaddrinfo(*args, **kwds), loop=self.loop) + + self.loop.getaddrinfo = getaddrinfo_task + fut = self.loop.create_server(MyProto, '', 0) + self.assertRaises(OSError, self.loop.run_until_complete, fut) + self.assertIsNone(host) + + def test_create_server_host_port_sock(self): + fut = self.loop.create_server( + MyProto, '0.0.0.0', 0, sock=object()) + self.assertRaises(ValueError, self.loop.run_until_complete, fut) + + def test_create_server_no_host_port_sock(self): + fut = self.loop.create_server(MyProto) + self.assertRaises(ValueError, self.loop.run_until_complete, fut) + + def test_create_server_no_getaddrinfo(self): + getaddrinfo = self.loop.getaddrinfo = unittest.mock.Mock() + getaddrinfo.return_value = [] + + f = self.loop.create_server(MyProto, '0.0.0.0', 0) + self.assertRaises(OSError, self.loop.run_until_complete, f) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_server_cant_bind(self, m_socket): + + class Err(OSError): + strerror = 'error' + + m_socket.getaddrinfo.return_value = [ + (2, 1, 6, '', ('127.0.0.1', 10100))] + m_sock = m_socket.socket.return_value = unittest.mock.Mock() + m_sock.bind.side_effect = Err + + fut = self.loop.create_server(MyProto, '0.0.0.0', 0) + self.assertRaises(OSError, self.loop.run_until_complete, fut) + self.assertTrue(m_sock.close.called) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_datagram_endpoint_no_addrinfo(self, m_socket): + m_socket.getaddrinfo.return_value = [] + + coro = self.loop.create_datagram_endpoint( + MyDatagramProto, local_addr=('localhost', 0)) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + def test_create_datagram_endpoint_addr_error(self): + coro = self.loop.create_datagram_endpoint( + MyDatagramProto, local_addr='localhost') + self.assertRaises( + AssertionError, self.loop.run_until_complete, coro) + coro = self.loop.create_datagram_endpoint( + MyDatagramProto, local_addr=('localhost', 1, 2, 3)) + self.assertRaises( + AssertionError, self.loop.run_until_complete, coro) + + def test_create_datagram_endpoint_connect_err(self): + self.loop.sock_connect = unittest.mock.Mock() + self.loop.sock_connect.side_effect = OSError + + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol, remote_addr=('127.0.0.1', 0)) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_datagram_endpoint_socket_err(self, m_socket): + m_socket.getaddrinfo = socket.getaddrinfo + m_socket.socket.side_effect = OSError + + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol, family=socket.AF_INET) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol, local_addr=('127.0.0.1', 0)) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + + def test_create_datagram_endpoint_no_matching_family(self): + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol, + remote_addr=('127.0.0.1', 0), local_addr=('::1', 0)) + self.assertRaises( + ValueError, self.loop.run_until_complete, coro) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_datagram_endpoint_setblk_err(self, m_socket): + m_socket.socket.return_value.setblocking.side_effect = OSError + + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol, family=socket.AF_INET) + self.assertRaises( + OSError, self.loop.run_until_complete, coro) + self.assertTrue( + m_socket.socket.return_value.close.called) + + def test_create_datagram_endpoint_noaddr_nofamily(self): + coro = self.loop.create_datagram_endpoint( + protocols.DatagramProtocol) + self.assertRaises(ValueError, self.loop.run_until_complete, coro) + + @unittest.mock.patch('asyncio.base_events.socket') + def test_create_datagram_endpoint_cant_bind(self, m_socket): + class Err(OSError): + pass + + m_socket.AF_INET6 = socket.AF_INET6 + m_socket.getaddrinfo = socket.getaddrinfo + m_sock = m_socket.socket.return_value = unittest.mock.Mock() + m_sock.bind.side_effect = Err + + fut = self.loop.create_datagram_endpoint( + MyDatagramProto, + local_addr=('127.0.0.1', 0), family=socket.AF_INET) + self.assertRaises(Err, self.loop.run_until_complete, fut) + self.assertTrue(m_sock.close.called) + + def test_accept_connection_retry(self): + sock = unittest.mock.Mock() + sock.accept.side_effect = BlockingIOError() + + self.loop._accept_connection(MyProto, sock) + self.assertFalse(sock.close.called) + + @unittest.mock.patch('asyncio.selector_events.asyncio_log') + def test_accept_connection_exception(self, m_log): + sock = unittest.mock.Mock() + sock.fileno.return_value = 10 + sock.accept.side_effect = OSError() + + self.loop._accept_connection(MyProto, sock) + self.assertTrue(sock.close.called) + self.assertTrue(m_log.exception.called) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_events.py @@ -0,0 +1,1573 @@ +"""Tests for events.py.""" + +import functools +import gc +import io +import os +import signal +import socket +try: + import ssl +except ImportError: + ssl = None +import subprocess +import sys +import threading +import time +import errno +import unittest +import unittest.mock +from test.support import find_unused_port + + +from asyncio import futures +from asyncio import events +from asyncio import transports +from asyncio import protocols +from asyncio import selector_events +from asyncio import tasks +from asyncio import test_utils +from asyncio import locks + + +class MyProto(protocols.Protocol): + done = None + + def __init__(self, loop=None): + self.state = 'INITIAL' + self.nbytes = 0 + if loop is not None: + self.done = futures.Future(loop=loop) + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'CONNECTED' + transport.write(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n') + + def data_received(self, data): + assert self.state == 'CONNECTED', self.state + self.nbytes += len(data) + + def eof_received(self): + assert self.state == 'CONNECTED', self.state + self.state = 'EOF' + + def connection_lost(self, exc): + assert self.state in ('CONNECTED', 'EOF'), self.state + self.state = 'CLOSED' + if self.done: + self.done.set_result(None) + + +class MyDatagramProto(protocols.DatagramProtocol): + done = None + + def __init__(self, loop=None): + self.state = 'INITIAL' + self.nbytes = 0 + if loop is not None: + self.done = futures.Future(loop=loop) + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'INITIALIZED' + + def datagram_received(self, data, addr): + assert self.state == 'INITIALIZED', self.state + self.nbytes += len(data) + + def connection_refused(self, exc): + assert self.state == 'INITIALIZED', self.state + + def connection_lost(self, exc): + assert self.state == 'INITIALIZED', self.state + self.state = 'CLOSED' + if self.done: + self.done.set_result(None) + + +class MyReadPipeProto(protocols.Protocol): + done = None + + def __init__(self, loop=None): + self.state = ['INITIAL'] + self.nbytes = 0 + self.transport = None + if loop is not None: + self.done = futures.Future(loop=loop) + + def connection_made(self, transport): + self.transport = transport + assert self.state == ['INITIAL'], self.state + self.state.append('CONNECTED') + + def data_received(self, data): + assert self.state == ['INITIAL', 'CONNECTED'], self.state + self.nbytes += len(data) + + def eof_received(self): + assert self.state == ['INITIAL', 'CONNECTED'], self.state + self.state.append('EOF') + + def connection_lost(self, exc): + assert self.state == ['INITIAL', 'CONNECTED', 'EOF'], self.state + self.state.append('CLOSED') + if self.done: + self.done.set_result(None) + + +class MyWritePipeProto(protocols.BaseProtocol): + done = None + + def __init__(self, loop=None): + self.state = 'INITIAL' + self.transport = None + if loop is not None: + self.done = futures.Future(loop=loop) + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'CONNECTED' + + def connection_lost(self, exc): + assert self.state == 'CONNECTED', self.state + self.state = 'CLOSED' + if self.done: + self.done.set_result(None) + + +class MySubprocessProtocol(protocols.SubprocessProtocol): + + def __init__(self, loop): + self.state = 'INITIAL' + self.transport = None + self.connected = futures.Future(loop=loop) + self.completed = futures.Future(loop=loop) + self.disconnects = {fd: futures.Future(loop=loop) for fd in range(3)} + self.data = {1: b'', 2: b''} + self.returncode = None + self.got_data = {1: locks.Event(loop=loop), + 2: locks.Event(loop=loop)} + + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'CONNECTED' + self.connected.set_result(None) + + def connection_lost(self, exc): + assert self.state == 'CONNECTED', self.state + self.state = 'CLOSED' + self.completed.set_result(None) + + def pipe_data_received(self, fd, data): + assert self.state == 'CONNECTED', self.state + self.data[fd] += data + self.got_data[fd].set() + + def pipe_connection_lost(self, fd, exc): + assert self.state == 'CONNECTED', self.state + if exc: + self.disconnects[fd].set_exception(exc) + else: + self.disconnects[fd].set_result(exc) + + def process_exited(self): + assert self.state == 'CONNECTED', self.state + self.returncode = self.transport.get_returncode() + + +class EventLoopTestsMixin: + + def setUp(self): + super().setUp() + self.loop = self.create_event_loop() + events.set_event_loop(None) + + def tearDown(self): + # just in case if we have transport close callbacks + test_utils.run_briefly(self.loop) + + self.loop.close() + gc.collect() + super().tearDown() + + def test_run_until_complete_nesting(self): + @tasks.coroutine + def coro1(): + yield + + @tasks.coroutine + def coro2(): + self.assertTrue(self.loop.is_running()) + self.loop.run_until_complete(coro1()) + + self.assertRaises( + RuntimeError, self.loop.run_until_complete, coro2()) + + # Note: because of the default Windows timing granularity of + # 15.6 msec, we use fairly long sleep times here (~100 msec). + + def test_run_until_complete(self): + t0 = self.loop.time() + self.loop.run_until_complete(tasks.sleep(0.1, loop=self.loop)) + t1 = self.loop.time() + self.assertTrue(0.08 <= t1-t0 <= 0.12, t1-t0) + + def test_run_until_complete_stopped(self): + @tasks.coroutine + def cb(): + self.loop.stop() + yield from tasks.sleep(0.1, loop=self.loop) + task = cb() + self.assertRaises(RuntimeError, + self.loop.run_until_complete, task) + + def test_call_later(self): + results = [] + + def callback(arg): + results.append(arg) + self.loop.stop() + + self.loop.call_later(0.1, callback, 'hello world') + t0 = time.monotonic() + self.loop.run_forever() + t1 = time.monotonic() + self.assertEqual(results, ['hello world']) + self.assertTrue(0.09 <= t1-t0 <= 0.12, t1-t0) + + def test_call_soon(self): + results = [] + + def callback(arg1, arg2): + results.append((arg1, arg2)) + self.loop.stop() + + self.loop.call_soon(callback, 'hello', 'world') + self.loop.run_forever() + self.assertEqual(results, [('hello', 'world')]) + + def test_call_soon_threadsafe(self): + results = [] + lock = threading.Lock() + + def callback(arg): + results.append(arg) + if len(results) >= 2: + self.loop.stop() + + def run_in_thread(): + self.loop.call_soon_threadsafe(callback, 'hello') + lock.release() + + lock.acquire() + t = threading.Thread(target=run_in_thread) + t.start() + + with lock: + self.loop.call_soon(callback, 'world') + self.loop.run_forever() + t.join() + self.assertEqual(results, ['hello', 'world']) + + def test_call_soon_threadsafe_same_thread(self): + results = [] + + def callback(arg): + results.append(arg) + if len(results) >= 2: + self.loop.stop() + + self.loop.call_soon_threadsafe(callback, 'hello') + self.loop.call_soon(callback, 'world') + self.loop.run_forever() + self.assertEqual(results, ['hello', 'world']) + + def test_run_in_executor(self): + def run(arg): + return (arg, threading.get_ident()) + f2 = self.loop.run_in_executor(None, run, 'yo') + res, thread_id = self.loop.run_until_complete(f2) + self.assertEqual(res, 'yo') + self.assertNotEqual(thread_id, threading.get_ident()) + + def test_reader_callback(self): + r, w = test_utils.socketpair() + bytes_read = [] + + def reader(): + try: + data = r.recv(1024) + except BlockingIOError: + # Spurious readiness notifications are possible + # at least on Linux -- see man select. + return + if data: + bytes_read.append(data) + else: + self.assertTrue(self.loop.remove_reader(r.fileno())) + r.close() + + self.loop.add_reader(r.fileno(), reader) + self.loop.call_soon(w.send, b'abc') + test_utils.run_briefly(self.loop) + self.loop.call_soon(w.send, b'def') + test_utils.run_briefly(self.loop) + self.loop.call_soon(w.close) + self.loop.call_soon(self.loop.stop) + self.loop.run_forever() + self.assertEqual(b''.join(bytes_read), b'abcdef') + + def test_writer_callback(self): + r, w = test_utils.socketpair() + w.setblocking(False) + self.loop.add_writer(w.fileno(), w.send, b'x'*(256*1024)) + test_utils.run_briefly(self.loop) + + def remove_writer(): + self.assertTrue(self.loop.remove_writer(w.fileno())) + + self.loop.call_soon(remove_writer) + self.loop.call_soon(self.loop.stop) + self.loop.run_forever() + w.close() + data = r.recv(256*1024) + r.close() + self.assertGreaterEqual(len(data), 200) + + def test_sock_client_ops(self): + with test_utils.run_test_server() as httpd: + sock = socket.socket() + sock.setblocking(False) + self.loop.run_until_complete( + self.loop.sock_connect(sock, httpd.address)) + self.loop.run_until_complete( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + data = self.loop.run_until_complete( + self.loop.sock_recv(sock, 1024)) + # consume data + self.loop.run_until_complete( + self.loop.sock_recv(sock, 1024)) + sock.close() + + self.assertTrue(data.startswith(b'HTTP/1.0 200 OK')) + + def test_sock_client_fail(self): + # Make sure that we will get an unused port + address = None + try: + s = socket.socket() + s.bind(('127.0.0.1', 0)) + address = s.getsockname() + finally: + s.close() + + sock = socket.socket() + sock.setblocking(False) + with self.assertRaises(ConnectionRefusedError): + self.loop.run_until_complete( + self.loop.sock_connect(sock, address)) + sock.close() + + def test_sock_accept(self): + listener = socket.socket() + listener.setblocking(False) + listener.bind(('127.0.0.1', 0)) + listener.listen(1) + client = socket.socket() + client.connect(listener.getsockname()) + + f = self.loop.sock_accept(listener) + conn, addr = self.loop.run_until_complete(f) + self.assertEqual(conn.gettimeout(), 0) + self.assertEqual(addr, client.getsockname()) + self.assertEqual(client.getpeername(), listener.getsockname()) + client.close() + conn.close() + listener.close() + + @unittest.skipUnless(hasattr(signal, 'SIGKILL'), 'No SIGKILL') + def test_add_signal_handler(self): + caught = 0 + + def my_handler(): + nonlocal caught + caught += 1 + + # Check error behavior first. + self.assertRaises( + TypeError, self.loop.add_signal_handler, 'boom', my_handler) + self.assertRaises( + TypeError, self.loop.remove_signal_handler, 'boom') + self.assertRaises( + ValueError, self.loop.add_signal_handler, signal.NSIG+1, + my_handler) + self.assertRaises( + ValueError, self.loop.remove_signal_handler, signal.NSIG+1) + self.assertRaises( + ValueError, self.loop.add_signal_handler, 0, my_handler) + self.assertRaises( + ValueError, self.loop.remove_signal_handler, 0) + self.assertRaises( + ValueError, self.loop.add_signal_handler, -1, my_handler) + self.assertRaises( + ValueError, self.loop.remove_signal_handler, -1) + self.assertRaises( + RuntimeError, self.loop.add_signal_handler, signal.SIGKILL, + my_handler) + # Removing SIGKILL doesn't raise, since we don't call signal(). + self.assertFalse(self.loop.remove_signal_handler(signal.SIGKILL)) + # Now set a handler and handle it. + self.loop.add_signal_handler(signal.SIGINT, my_handler) + test_utils.run_briefly(self.loop) + os.kill(os.getpid(), signal.SIGINT) + test_utils.run_briefly(self.loop) + self.assertEqual(caught, 1) + # Removing it should restore the default handler. + self.assertTrue(self.loop.remove_signal_handler(signal.SIGINT)) + self.assertEqual(signal.getsignal(signal.SIGINT), + signal.default_int_handler) + # Removing again returns False. + self.assertFalse(self.loop.remove_signal_handler(signal.SIGINT)) + + @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM') + def test_signal_handling_while_selecting(self): + # Test with a signal actually arriving during a select() call. + caught = 0 + + def my_handler(): + nonlocal caught + caught += 1 + self.loop.stop() + + self.loop.add_signal_handler(signal.SIGALRM, my_handler) + + signal.setitimer(signal.ITIMER_REAL, 0.01, 0) # Send SIGALRM once. + self.loop.run_forever() + self.assertEqual(caught, 1) + + @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM') + def test_signal_handling_args(self): + some_args = (42,) + caught = 0 + + def my_handler(*args): + nonlocal caught + caught += 1 + self.assertEqual(args, some_args) + + self.loop.add_signal_handler(signal.SIGALRM, my_handler, *some_args) + + signal.setitimer(signal.ITIMER_REAL, 0.01, 0) # Send SIGALRM once. + self.loop.call_later(0.015, self.loop.stop) + self.loop.run_forever() + self.assertEqual(caught, 1) + + def test_create_connection(self): + with test_utils.run_test_server() as httpd: + f = self.loop.create_connection( + lambda: MyProto(loop=self.loop), *httpd.address) + tr, pr = self.loop.run_until_complete(f) + self.assertTrue(isinstance(tr, transports.Transport)) + self.assertTrue(isinstance(pr, protocols.Protocol)) + self.loop.run_until_complete(pr.done) + self.assertGreater(pr.nbytes, 0) + tr.close() + + def test_create_connection_sock(self): + with test_utils.run_test_server() as httpd: + sock = None + infos = self.loop.run_until_complete( + self.loop.getaddrinfo( + *httpd.address, type=socket.SOCK_STREAM)) + for family, type, proto, cname, address in infos: + try: + sock = socket.socket(family=family, type=type, proto=proto) + sock.setblocking(False) + self.loop.run_until_complete( + self.loop.sock_connect(sock, address)) + except: + pass + else: + break + else: + assert False, 'Can not create socket.' + + f = self.loop.create_connection( + lambda: MyProto(loop=self.loop), sock=sock) + tr, pr = self.loop.run_until_complete(f) + self.assertTrue(isinstance(tr, transports.Transport)) + self.assertTrue(isinstance(pr, protocols.Protocol)) + self.loop.run_until_complete(pr.done) + self.assertGreater(pr.nbytes, 0) + tr.close() + + @unittest.skipIf(ssl is None, 'No ssl module') + def test_create_ssl_connection(self): + with test_utils.run_test_server(use_ssl=True) as httpd: + f = self.loop.create_connection( + lambda: MyProto(loop=self.loop), *httpd.address, + ssl=test_utils.dummy_ssl_context()) + tr, pr = self.loop.run_until_complete(f) + self.assertTrue(isinstance(tr, transports.Transport)) + self.assertTrue(isinstance(pr, protocols.Protocol)) + self.assertTrue('ssl' in tr.__class__.__name__.lower()) + self.assertIsNotNone(tr.get_extra_info('sockname')) + self.loop.run_until_complete(pr.done) + self.assertGreater(pr.nbytes, 0) + tr.close() + + def test_create_connection_local_addr(self): + with test_utils.run_test_server() as httpd: + port = find_unused_port() + f = self.loop.create_connection( + lambda: MyProto(loop=self.loop), + *httpd.address, local_addr=(httpd.address[0], port)) + tr, pr = self.loop.run_until_complete(f) + expected = pr.transport.get_extra_info('sockname')[1] + self.assertEqual(port, expected) + tr.close() + + def test_create_connection_local_addr_in_use(self): + with test_utils.run_test_server() as httpd: + f = self.loop.create_connection( + lambda: MyProto(loop=self.loop), + *httpd.address, local_addr=httpd.address) + with self.assertRaises(OSError) as cm: + self.loop.run_until_complete(f) + self.assertEqual(cm.exception.errno, errno.EADDRINUSE) + self.assertIn(str(httpd.address), cm.exception.strerror) + + def test_create_server(self): + proto = None + + def factory(): + nonlocal proto + proto = MyProto() + return proto + + f = self.loop.create_server(factory, '0.0.0.0', 0) + server = self.loop.run_until_complete(f) + self.assertEqual(len(server.sockets), 1) + sock = server.sockets[0] + host, port = sock.getsockname() + self.assertEqual(host, '0.0.0.0') + client = socket.socket() + client.connect(('127.0.0.1', port)) + client.send(b'xxx') + test_utils.run_briefly(self.loop) + self.assertIsInstance(proto, MyProto) + self.assertEqual('INITIAL', proto.state) + test_utils.run_briefly(self.loop) + self.assertEqual('CONNECTED', proto.state) + test_utils.run_briefly(self.loop) # windows iocp + self.assertEqual(3, proto.nbytes) + + # extra info is available + self.assertIsNotNone(proto.transport.get_extra_info('sockname')) + self.assertEqual('127.0.0.1', + proto.transport.get_extra_info('peername')[0]) + + # close connection + proto.transport.close() + test_utils.run_briefly(self.loop) # windows iocp + + self.assertEqual('CLOSED', proto.state) + + # the client socket must be closed after to avoid ECONNRESET upon + # recv()/send() on the serving socket + client.close() + + # close server + server.close() + + @unittest.skipIf(ssl is None, 'No ssl module') + def test_create_server_ssl(self): + proto = None + + class ClientMyProto(MyProto): + def connection_made(self, transport): + self.transport = transport + assert self.state == 'INITIAL', self.state + self.state = 'CONNECTED' + + def factory(): + nonlocal proto + proto = MyProto(loop=self.loop) + return proto + + here = os.path.dirname(__file__) + sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + sslcontext.load_cert_chain( + certfile=os.path.join(here, 'sample.crt'), + keyfile=os.path.join(here, 'sample.key')) + + f = self.loop.create_server( + factory, '127.0.0.1', 0, ssl=sslcontext) + + server = self.loop.run_until_complete(f) + sock = server.sockets[0] + host, port = sock.getsockname() + self.assertEqual(host, '127.0.0.1') + + f_c = self.loop.create_connection(ClientMyProto, host, port, + ssl=test_utils.dummy_ssl_context()) + client, pr = self.loop.run_until_complete(f_c) + + client.write(b'xxx') + test_utils.run_briefly(self.loop) + self.assertIsInstance(proto, MyProto) + test_utils.run_briefly(self.loop) + self.assertEqual('CONNECTED', proto.state) + self.assertEqual(3, proto.nbytes) + + # extra info is available + self.assertIsNotNone(proto.transport.get_extra_info('sockname')) + self.assertEqual('127.0.0.1', + proto.transport.get_extra_info('peername')[0]) + + # close connection + proto.transport.close() + self.loop.run_until_complete(proto.done) + self.assertEqual('CLOSED', proto.state) + + # the client socket must be closed after to avoid ECONNRESET upon + # recv()/send() on the serving socket + client.close() + + # stop serving + server.close() + + def test_create_server_sock(self): + proto = futures.Future(loop=self.loop) + + class TestMyProto(MyProto): + def connection_made(self, transport): + super().connection_made(transport) + proto.set_result(self) + + sock_ob = socket.socket(type=socket.SOCK_STREAM) + sock_ob.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock_ob.bind(('0.0.0.0', 0)) + + f = self.loop.create_server(TestMyProto, sock=sock_ob) + server = self.loop.run_until_complete(f) + sock = server.sockets[0] + self.assertIs(sock, sock_ob) + + host, port = sock.getsockname() + self.assertEqual(host, '0.0.0.0') + client = socket.socket() + client.connect(('127.0.0.1', port)) + client.send(b'xxx') + client.close() + server.close() + + def test_create_server_addr_in_use(self): + sock_ob = socket.socket(type=socket.SOCK_STREAM) + sock_ob.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock_ob.bind(('0.0.0.0', 0)) + + f = self.loop.create_server(MyProto, sock=sock_ob) + server = self.loop.run_until_complete(f) + sock = server.sockets[0] + host, port = sock.getsockname() + + f = self.loop.create_server(MyProto, host=host, port=port) + with self.assertRaises(OSError) as cm: + self.loop.run_until_complete(f) + self.assertEqual(cm.exception.errno, errno.EADDRINUSE) + + server.close() + + @unittest.skipUnless(socket.has_ipv6, 'IPv6 not supported') + def test_create_server_dual_stack(self): + f_proto = futures.Future(loop=self.loop) + + class TestMyProto(MyProto): + def connection_made(self, transport): + super().connection_made(transport) + f_proto.set_result(self) + + try_count = 0 + while True: + try: + port = find_unused_port() + f = self.loop.create_server(TestMyProto, host=None, port=port) + server = self.loop.run_until_complete(f) + except OSError as ex: + if ex.errno == errno.EADDRINUSE: + try_count += 1 + self.assertGreaterEqual(5, try_count) + continue + else: + raise + else: + break + client = socket.socket() + client.connect(('127.0.0.1', port)) + client.send(b'xxx') + proto = self.loop.run_until_complete(f_proto) + proto.transport.close() + client.close() + + f_proto = futures.Future(loop=self.loop) + client = socket.socket(socket.AF_INET6) + client.connect(('::1', port)) + client.send(b'xxx') + proto = self.loop.run_until_complete(f_proto) + proto.transport.close() + client.close() + + server.close() + + def test_server_close(self): + f = self.loop.create_server(MyProto, '0.0.0.0', 0) + server = self.loop.run_until_complete(f) + sock = server.sockets[0] + host, port = sock.getsockname() + + client = socket.socket() + client.connect(('127.0.0.1', port)) + client.send(b'xxx') + client.close() + + server.close() + + client = socket.socket() + self.assertRaises( + ConnectionRefusedError, client.connect, ('127.0.0.1', port)) + client.close() + + def test_create_datagram_endpoint(self): + class TestMyDatagramProto(MyDatagramProto): + def __init__(inner_self): + super().__init__(loop=self.loop) + + def datagram_received(self, data, addr): + super().datagram_received(data, addr) + self.transport.sendto(b'resp:'+data, addr) + + coro = self.loop.create_datagram_endpoint( + TestMyDatagramProto, local_addr=('127.0.0.1', 0)) + s_transport, server = self.loop.run_until_complete(coro) + host, port = s_transport.get_extra_info('sockname') + + coro = self.loop.create_datagram_endpoint( + lambda: MyDatagramProto(loop=self.loop), + remote_addr=(host, port)) + transport, client = self.loop.run_until_complete(coro) + + self.assertEqual('INITIALIZED', client.state) + transport.sendto(b'xxx') + for _ in range(1000): + if server.nbytes: + break + test_utils.run_briefly(self.loop) + self.assertEqual(3, server.nbytes) + for _ in range(1000): + if client.nbytes: + break + test_utils.run_briefly(self.loop) + + # received + self.assertEqual(8, client.nbytes) + + # extra info is available + self.assertIsNotNone(transport.get_extra_info('sockname')) + + # close connection + transport.close() + self.loop.run_until_complete(client.done) + self.assertEqual('CLOSED', client.state) + server.transport.close() + + def test_internal_fds(self): + loop = self.create_event_loop() + if not isinstance(loop, selector_events.BaseSelectorEventLoop): + return + + self.assertEqual(1, loop._internal_fds) + loop.close() + self.assertEqual(0, loop._internal_fds) + self.assertIsNone(loop._csock) + self.assertIsNone(loop._ssock) + + @unittest.skipUnless(sys.platform != 'win32', + "Don't support pipes for Windows") + def test_read_pipe(self): + proto = None + + def factory(): + nonlocal proto + proto = MyReadPipeProto(loop=self.loop) + return proto + + rpipe, wpipe = os.pipe() + pipeobj = io.open(rpipe, 'rb', 1024) + + @tasks.coroutine + def connect(): + t, p = yield from self.loop.connect_read_pipe(factory, pipeobj) + self.assertIs(p, proto) + self.assertIs(t, proto.transport) + self.assertEqual(['INITIAL', 'CONNECTED'], proto.state) + self.assertEqual(0, proto.nbytes) + + self.loop.run_until_complete(connect()) + + os.write(wpipe, b'1') + test_utils.run_briefly(self.loop) + self.assertEqual(1, proto.nbytes) + + os.write(wpipe, b'2345') + test_utils.run_briefly(self.loop) + self.assertEqual(['INITIAL', 'CONNECTED'], proto.state) + self.assertEqual(5, proto.nbytes) + + os.close(wpipe) + self.loop.run_until_complete(proto.done) + self.assertEqual( + ['INITIAL', 'CONNECTED', 'EOF', 'CLOSED'], proto.state) + # extra info is available + self.assertIsNotNone(proto.transport.get_extra_info('pipe')) + + @unittest.skipUnless(sys.platform != 'win32', + "Don't support pipes for Windows") + def test_write_pipe(self): + proto = None + transport = None + + def factory(): + nonlocal proto + proto = MyWritePipeProto(loop=self.loop) + return proto + + rpipe, wpipe = os.pipe() + pipeobj = io.open(wpipe, 'wb', 1024) + + @tasks.coroutine + def connect(): + nonlocal transport + t, p = yield from self.loop.connect_write_pipe(factory, pipeobj) + self.assertIs(p, proto) + self.assertIs(t, proto.transport) + self.assertEqual('CONNECTED', proto.state) + transport = t + + self.loop.run_until_complete(connect()) + + transport.write(b'1') + test_utils.run_briefly(self.loop) + data = os.read(rpipe, 1024) + self.assertEqual(b'1', data) + + transport.write(b'2345') + test_utils.run_briefly(self.loop) + data = os.read(rpipe, 1024) + self.assertEqual(b'2345', data) + self.assertEqual('CONNECTED', proto.state) + + os.close(rpipe) + + # extra info is available + self.assertIsNotNone(proto.transport.get_extra_info('pipe')) + + # close connection + proto.transport.close() + self.loop.run_until_complete(proto.done) + self.assertEqual('CLOSED', proto.state) + + @unittest.skipUnless(sys.platform != 'win32', + "Don't support pipes for Windows") + def test_write_pipe_disconnect_on_close(self): + proto = None + transport = None + + def factory(): + nonlocal proto + proto = MyWritePipeProto(loop=self.loop) + return proto + + rpipe, wpipe = os.pipe() + pipeobj = io.open(wpipe, 'wb', 1024) + + @tasks.coroutine + def connect(): + nonlocal transport + t, p = yield from self.loop.connect_write_pipe(factory, + pipeobj) + self.assertIs(p, proto) + self.assertIs(t, proto.transport) + self.assertEqual('CONNECTED', proto.state) + transport = t + + self.loop.run_until_complete(connect()) + self.assertEqual('CONNECTED', proto.state) + + transport.write(b'1') + test_utils.run_briefly(self.loop) + data = os.read(rpipe, 1024) + self.assertEqual(b'1', data) + + os.close(rpipe) + + self.loop.run_until_complete(proto.done) + self.assertEqual('CLOSED', proto.state) + + def test_prompt_cancellation(self): + r, w = test_utils.socketpair() + r.setblocking(False) + f = self.loop.sock_recv(r, 1) + ov = getattr(f, 'ov', None) + self.assertTrue(ov is None or ov.pending) + + @tasks.coroutine + def main(): + try: + self.loop.call_soon(f.cancel) + yield from f + except futures.CancelledError: + res = 'cancelled' + else: + res = None + finally: + self.loop.stop() + return res + + start = time.monotonic() + t = tasks.Task(main(), loop=self.loop) + self.loop.run_forever() + elapsed = time.monotonic() - start + + self.assertLess(elapsed, 0.1) + self.assertEqual(t.result(), 'cancelled') + self.assertRaises(futures.CancelledError, f.result) + self.assertTrue(ov is None or not ov.pending) + self.loop._stop_serving(r) + + r.close() + w.close() + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_exec(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + self.assertEqual('CONNECTED', proto.state) + + stdin = transp.get_pipe_transport(0) + stdin.write(b'Python The Winner') + self.loop.run_until_complete(proto.got_data[1].wait()) + transp.close() + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGTERM, proto.returncode) + self.assertEqual(b'Python The Winner', proto.data[1]) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_interactive(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + self.assertEqual('CONNECTED', proto.state) + + try: + stdin = transp.get_pipe_transport(0) + stdin.write(b'Python ') + self.loop.run_until_complete(proto.got_data[1].wait()) + proto.got_data[1].clear() + self.assertEqual(b'Python ', proto.data[1]) + + stdin.write(b'The Winner') + self.loop.run_until_complete(proto.got_data[1].wait()) + self.assertEqual(b'Python The Winner', proto.data[1]) + finally: + transp.close() + + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGTERM, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_shell(self): + proto = None + transp = None + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'echo "Python"') + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + transp.get_pipe_transport(0).close() + self.loop.run_until_complete(proto.completed) + self.assertEqual(0, proto.returncode) + self.assertTrue(all(f.done() for f in proto.disconnects.values())) + self.assertEqual({1: b'Python\n', 2: b''}, proto.data) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_exitcode(self): + proto = None + + @tasks.coroutine + def connect(): + nonlocal proto + transp, proto = yield from self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'exit 7', stdin=None, stdout=None, stderr=None) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.completed) + self.assertEqual(7, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_close_after_finish(self): + proto = None + transp = None + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'exit 7', stdin=None, stdout=None, stderr=None) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.assertIsNone(transp.get_pipe_transport(0)) + self.assertIsNone(transp.get_pipe_transport(1)) + self.assertIsNone(transp.get_pipe_transport(2)) + self.loop.run_until_complete(proto.completed) + self.assertEqual(7, proto.returncode) + self.assertIsNone(transp.close()) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_kill(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + transp.kill() + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGKILL, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_send_signal(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + transp.send_signal(signal.SIGHUP) + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGHUP, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_stderr(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo2.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + stdin = transp.get_pipe_transport(0) + stdin.write(b'test') + + self.loop.run_until_complete(proto.completed) + + transp.close() + self.assertEqual(b'OUT:test', proto.data[1]) + self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2]) + self.assertEqual(0, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_stderr_redirect_to_stdout(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo2.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog, stderr=subprocess.STDOUT) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + stdin = transp.get_pipe_transport(0) + self.assertIsNotNone(transp.get_pipe_transport(1)) + self.assertIsNone(transp.get_pipe_transport(2)) + + stdin.write(b'test') + self.loop.run_until_complete(proto.completed) + self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'), + proto.data[1]) + self.assertEqual(b'', proto.data[2]) + + transp.close() + self.assertEqual(0, proto.returncode) + + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_close_client_stream(self): + proto = None + transp = None + + prog = os.path.join(os.path.dirname(__file__), 'echo3.py') + + @tasks.coroutine + def connect(): + nonlocal proto, transp + transp, proto = yield from self.loop.subprocess_exec( + functools.partial(MySubprocessProtocol, self.loop), + sys.executable, prog) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.connected) + + stdin = transp.get_pipe_transport(0) + stdout = transp.get_pipe_transport(1) + stdin.write(b'test') + self.loop.run_until_complete(proto.got_data[1].wait()) + self.assertEqual(b'OUT:test', proto.data[1]) + + stdout.close() + self.loop.run_until_complete(proto.disconnects[1]) + stdin.write(b'xxx') + self.loop.run_until_complete(proto.got_data[2].wait()) + self.assertEqual(b'ERR:BrokenPipeError', proto.data[2]) + + transp.close() + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGTERM, proto.returncode) + + +if sys.platform == 'win32': + from asyncio import windows_events + + class SelectEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return windows_events.SelectorEventLoop() + + class ProactorEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return windows_events.ProactorEventLoop() + + def test_create_ssl_connection(self): + raise unittest.SkipTest("IocpEventLoop imcompatible with SSL") + + def test_create_server_ssl(self): + raise unittest.SkipTest("IocpEventLoop imcompatible with SSL") + + def test_reader_callback(self): + raise unittest.SkipTest("IocpEventLoop does not have add_reader()") + + def test_reader_callback_cancel(self): + raise unittest.SkipTest("IocpEventLoop does not have add_reader()") + + def test_writer_callback(self): + raise unittest.SkipTest("IocpEventLoop does not have add_writer()") + + def test_writer_callback_cancel(self): + raise unittest.SkipTest("IocpEventLoop does not have add_writer()") + + def test_create_datagram_endpoint(self): + raise unittest.SkipTest( + "IocpEventLoop does not have create_datagram_endpoint()") +else: + from asyncio import selectors + from asyncio import unix_events + + if hasattr(selectors, 'KqueueSelector'): + class KqueueEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return unix_events.SelectorEventLoop( + selectors.KqueueSelector()) + + if hasattr(selectors, 'EpollSelector'): + class EPollEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return unix_events.SelectorEventLoop(selectors.EpollSelector()) + + if hasattr(selectors, 'PollSelector'): + class PollEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return unix_events.SelectorEventLoop(selectors.PollSelector()) + + # Should always exist. + class SelectEventLoopTests(EventLoopTestsMixin, unittest.TestCase): + + def create_event_loop(self): + return unix_events.SelectorEventLoop(selectors.SelectSelector()) + + +class HandleTests(unittest.TestCase): + + def test_handle(self): + def callback(*args): + return args + + args = () + h = events.Handle(callback, args) + self.assertIs(h._callback, callback) + self.assertIs(h._args, args) + self.assertFalse(h._cancelled) + + r = repr(h) + self.assertTrue(r.startswith( + 'Handle(' + '.callback')) + self.assertTrue(r.endswith('())')) + + h.cancel() + self.assertTrue(h._cancelled) + + r = repr(h) + self.assertTrue(r.startswith( + 'Handle(' + '.callback')) + self.assertTrue(r.endswith('())'), r) + + def test_make_handle(self): + def callback(*args): + return args + h1 = events.Handle(callback, ()) + self.assertRaises( + AssertionError, events.make_handle, h1, ()) + + @unittest.mock.patch('asyncio.events.asyncio_log') + def test_callback_with_exception(self, log): + def callback(): + raise ValueError() + + h = events.Handle(callback, ()) + h._run() + self.assertTrue(log.exception.called) + + +class TimerTests(unittest.TestCase): + + def test_hash(self): + when = time.monotonic() + h = events.TimerHandle(when, lambda: False, ()) + self.assertEqual(hash(h), hash(when)) + + def test_timer(self): + def callback(*args): + return args + + args = () + when = time.monotonic() + h = events.TimerHandle(when, callback, args) + self.assertIs(h._callback, callback) + self.assertIs(h._args, args) + self.assertFalse(h._cancelled) + + r = repr(h) + self.assertTrue(r.endswith('())')) + + h.cancel() + self.assertTrue(h._cancelled) + + r = repr(h) + self.assertTrue(r.endswith('())'), r) + + self.assertRaises(AssertionError, + events.TimerHandle, None, callback, args) + + def test_timer_comparison(self): + def callback(*args): + return args + + when = time.monotonic() + + h1 = events.TimerHandle(when, callback, ()) + h2 = events.TimerHandle(when, callback, ()) + # TODO: Use assertLess etc. + self.assertFalse(h1 < h2) + self.assertFalse(h2 < h1) + self.assertTrue(h1 <= h2) + self.assertTrue(h2 <= h1) + self.assertFalse(h1 > h2) + self.assertFalse(h2 > h1) + self.assertTrue(h1 >= h2) + self.assertTrue(h2 >= h1) + self.assertTrue(h1 == h2) + self.assertFalse(h1 != h2) + + h2.cancel() + self.assertFalse(h1 == h2) + + h1 = events.TimerHandle(when, callback, ()) + h2 = events.TimerHandle(when + 10.0, callback, ()) + self.assertTrue(h1 < h2) + self.assertFalse(h2 < h1) + self.assertTrue(h1 <= h2) + self.assertFalse(h2 <= h1) + self.assertFalse(h1 > h2) + self.assertTrue(h2 > h1) + self.assertFalse(h1 >= h2) + self.assertTrue(h2 >= h1) + self.assertFalse(h1 == h2) + self.assertTrue(h1 != h2) + + h3 = events.Handle(callback, ()) + self.assertIs(NotImplemented, h1.__eq__(h3)) + self.assertIs(NotImplemented, h1.__ne__(h3)) + + +class AbstractEventLoopTests(unittest.TestCase): + + def test_not_implemented(self): + f = unittest.mock.Mock() + loop = events.AbstractEventLoop() + self.assertRaises( + NotImplementedError, loop.run_forever) + self.assertRaises( + NotImplementedError, loop.run_until_complete, None) + self.assertRaises( + NotImplementedError, loop.stop) + self.assertRaises( + NotImplementedError, loop.is_running) + self.assertRaises( + NotImplementedError, loop.call_later, None, None) + self.assertRaises( + NotImplementedError, loop.call_at, f, f) + self.assertRaises( + NotImplementedError, loop.call_soon, None) + self.assertRaises( + NotImplementedError, loop.time) + self.assertRaises( + NotImplementedError, loop.call_soon_threadsafe, None) + self.assertRaises( + NotImplementedError, loop.run_in_executor, f, f) + self.assertRaises( + NotImplementedError, loop.set_default_executor, f) + self.assertRaises( + NotImplementedError, loop.getaddrinfo, 'localhost', 8080) + self.assertRaises( + NotImplementedError, loop.getnameinfo, ('localhost', 8080)) + self.assertRaises( + NotImplementedError, loop.create_connection, f) + self.assertRaises( + NotImplementedError, loop.create_server, f) + self.assertRaises( + NotImplementedError, loop.create_datagram_endpoint, f) + self.assertRaises( + NotImplementedError, loop.add_reader, 1, f) + self.assertRaises( + NotImplementedError, loop.remove_reader, 1) + self.assertRaises( + NotImplementedError, loop.add_writer, 1, f) + self.assertRaises( + NotImplementedError, loop.remove_writer, 1) + self.assertRaises( + NotImplementedError, loop.sock_recv, f, 10) + self.assertRaises( + NotImplementedError, loop.sock_sendall, f, 10) + self.assertRaises( + NotImplementedError, loop.sock_connect, f, f) + self.assertRaises( + NotImplementedError, loop.sock_accept, f) + self.assertRaises( + NotImplementedError, loop.add_signal_handler, 1, f) + self.assertRaises( + NotImplementedError, loop.remove_signal_handler, 1) + self.assertRaises( + NotImplementedError, loop.remove_signal_handler, 1) + self.assertRaises( + NotImplementedError, loop.connect_read_pipe, f, + unittest.mock.sentinel.pipe) + self.assertRaises( + NotImplementedError, loop.connect_write_pipe, f, + unittest.mock.sentinel.pipe) + self.assertRaises( + NotImplementedError, loop.subprocess_shell, f, + unittest.mock.sentinel) + self.assertRaises( + NotImplementedError, loop.subprocess_exec, f) + + +class ProtocolsAbsTests(unittest.TestCase): + + def test_empty(self): + f = unittest.mock.Mock() + p = protocols.Protocol() + self.assertIsNone(p.connection_made(f)) + self.assertIsNone(p.connection_lost(f)) + self.assertIsNone(p.data_received(f)) + self.assertIsNone(p.eof_received()) + + dp = protocols.DatagramProtocol() + self.assertIsNone(dp.connection_made(f)) + self.assertIsNone(dp.connection_lost(f)) + self.assertIsNone(dp.connection_refused(f)) + self.assertIsNone(dp.datagram_received(f, f)) + + sp = protocols.SubprocessProtocol() + self.assertIsNone(sp.connection_made(f)) + self.assertIsNone(sp.connection_lost(f)) + self.assertIsNone(sp.pipe_data_received(1, f)) + self.assertIsNone(sp.pipe_connection_lost(1, f)) + self.assertIsNone(sp.process_exited()) + + +class PolicyTests(unittest.TestCase): + + def test_event_loop_policy(self): + policy = events.AbstractEventLoopPolicy() + self.assertRaises(NotImplementedError, policy.get_event_loop) + self.assertRaises(NotImplementedError, policy.set_event_loop, object()) + self.assertRaises(NotImplementedError, policy.new_event_loop) + + def test_get_event_loop(self): + policy = events.DefaultEventLoopPolicy() + self.assertIsNone(policy._loop) + + loop = policy.get_event_loop() + self.assertIsInstance(loop, events.AbstractEventLoop) + + self.assertIs(policy._loop, loop) + self.assertIs(loop, policy.get_event_loop()) + loop.close() + + def test_get_event_loop_after_set_none(self): + policy = events.DefaultEventLoopPolicy() + policy.set_event_loop(None) + self.assertRaises(AssertionError, policy.get_event_loop) + + @unittest.mock.patch('asyncio.events.threading.current_thread') + def test_get_event_loop_thread(self, m_current_thread): + + def f(): + policy = events.DefaultEventLoopPolicy() + self.assertRaises(AssertionError, policy.get_event_loop) + + th = threading.Thread(target=f) + th.start() + th.join() + + def test_new_event_loop(self): + policy = events.DefaultEventLoopPolicy() + + loop = policy.new_event_loop() + self.assertIsInstance(loop, events.AbstractEventLoop) + loop.close() + + def test_set_event_loop(self): + policy = events.DefaultEventLoopPolicy() + old_loop = policy.get_event_loop() + + self.assertRaises(AssertionError, policy.set_event_loop, object()) + + loop = policy.new_event_loop() + policy.set_event_loop(loop) + self.assertIs(loop, policy.get_event_loop()) + self.assertIsNot(old_loop, policy.get_event_loop()) + loop.close() + old_loop.close() + + def test_get_event_loop_policy(self): + policy = events.get_event_loop_policy() + self.assertIsInstance(policy, events.AbstractEventLoopPolicy) + self.assertIs(policy, events.get_event_loop_policy()) + + def test_set_event_loop_policy(self): + self.assertRaises( + AssertionError, events.set_event_loop_policy, object()) + + old_policy = events.get_event_loop_policy() + + policy = events.DefaultEventLoopPolicy() + events.set_event_loop_policy(policy) + self.assertIs(policy, events.get_event_loop_policy()) + self.assertIsNot(policy, old_policy) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_futures.py @@ -0,0 +1,329 @@ +"""Tests for futures.py.""" + +import concurrent.futures +import threading +import unittest +import unittest.mock + +from asyncio import events +from asyncio import futures +from asyncio import test_utils + + +def _fakefunc(f): + return f + + +class FutureTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_initial_state(self): + f = futures.Future(loop=self.loop) + self.assertFalse(f.cancelled()) + self.assertFalse(f.done()) + f.cancel() + self.assertTrue(f.cancelled()) + + def test_init_constructor_default_loop(self): + try: + events.set_event_loop(self.loop) + f = futures.Future() + self.assertIs(f._loop, self.loop) + finally: + events.set_event_loop(None) + + def test_constructor_positional(self): + # Make sure Future does't accept a positional argument + self.assertRaises(TypeError, futures.Future, 42) + + def test_cancel(self): + f = futures.Future(loop=self.loop) + self.assertTrue(f.cancel()) + self.assertTrue(f.cancelled()) + self.assertTrue(f.done()) + self.assertRaises(futures.CancelledError, f.result) + self.assertRaises(futures.CancelledError, f.exception) + self.assertRaises(futures.InvalidStateError, f.set_result, None) + self.assertRaises(futures.InvalidStateError, f.set_exception, None) + self.assertFalse(f.cancel()) + + def test_result(self): + f = futures.Future(loop=self.loop) + self.assertRaises(futures.InvalidStateError, f.result) + + f.set_result(42) + self.assertFalse(f.cancelled()) + self.assertTrue(f.done()) + self.assertEqual(f.result(), 42) + self.assertEqual(f.exception(), None) + self.assertRaises(futures.InvalidStateError, f.set_result, None) + self.assertRaises(futures.InvalidStateError, f.set_exception, None) + self.assertFalse(f.cancel()) + + def test_exception(self): + exc = RuntimeError() + f = futures.Future(loop=self.loop) + self.assertRaises(futures.InvalidStateError, f.exception) + + f.set_exception(exc) + self.assertFalse(f.cancelled()) + self.assertTrue(f.done()) + self.assertRaises(RuntimeError, f.result) + self.assertEqual(f.exception(), exc) + self.assertRaises(futures.InvalidStateError, f.set_result, None) + self.assertRaises(futures.InvalidStateError, f.set_exception, None) + self.assertFalse(f.cancel()) + + def test_yield_from_twice(self): + f = futures.Future(loop=self.loop) + + def fixture(): + yield 'A' + x = yield from f + yield 'B', x + y = yield from f + yield 'C', y + + g = fixture() + self.assertEqual(next(g), 'A') # yield 'A'. + self.assertEqual(next(g), f) # First yield from f. + f.set_result(42) + self.assertEqual(next(g), ('B', 42)) # yield 'B', x. + # The second "yield from f" does not yield f. + self.assertEqual(next(g), ('C', 42)) # yield 'C', y. + + def test_repr(self): + f_pending = futures.Future(loop=self.loop) + self.assertEqual(repr(f_pending), 'Future') + f_pending.cancel() + + f_cancelled = futures.Future(loop=self.loop) + f_cancelled.cancel() + self.assertEqual(repr(f_cancelled), 'Future') + + f_result = futures.Future(loop=self.loop) + f_result.set_result(4) + self.assertEqual(repr(f_result), 'Future') + self.assertEqual(f_result.result(), 4) + + exc = RuntimeError() + f_exception = futures.Future(loop=self.loop) + f_exception.set_exception(exc) + self.assertEqual(repr(f_exception), 'Future') + self.assertIs(f_exception.exception(), exc) + + f_few_callbacks = futures.Future(loop=self.loop) + f_few_callbacks.add_done_callback(_fakefunc) + self.assertIn('Future', r) + f_many_callbacks.cancel() + + def test_copy_state(self): + # Test the internal _copy_state method since it's being directly + # invoked in other modules. + f = futures.Future(loop=self.loop) + f.set_result(10) + + newf = futures.Future(loop=self.loop) + newf._copy_state(f) + self.assertTrue(newf.done()) + self.assertEqual(newf.result(), 10) + + f_exception = futures.Future(loop=self.loop) + f_exception.set_exception(RuntimeError()) + + newf_exception = futures.Future(loop=self.loop) + newf_exception._copy_state(f_exception) + self.assertTrue(newf_exception.done()) + self.assertRaises(RuntimeError, newf_exception.result) + + f_cancelled = futures.Future(loop=self.loop) + f_cancelled.cancel() + + newf_cancelled = futures.Future(loop=self.loop) + newf_cancelled._copy_state(f_cancelled) + self.assertTrue(newf_cancelled.cancelled()) + + def test_iter(self): + fut = futures.Future(loop=self.loop) + + def coro(): + yield from fut + + def test(): + arg1, arg2 = coro() + + self.assertRaises(AssertionError, test) + fut.cancel() + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_abandoned(self, m_log): + fut = futures.Future(loop=self.loop) + del fut + self.assertFalse(m_log.error.called) + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_result_unretrieved(self, m_log): + fut = futures.Future(loop=self.loop) + fut.set_result(42) + del fut + self.assertFalse(m_log.error.called) + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_result_retrieved(self, m_log): + fut = futures.Future(loop=self.loop) + fut.set_result(42) + fut.result() + del fut + self.assertFalse(m_log.error.called) + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_exception_unretrieved(self, m_log): + fut = futures.Future(loop=self.loop) + fut.set_exception(RuntimeError('boom')) + del fut + test_utils.run_briefly(self.loop) + self.assertTrue(m_log.error.called) + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_exception_retrieved(self, m_log): + fut = futures.Future(loop=self.loop) + fut.set_exception(RuntimeError('boom')) + fut.exception() + del fut + self.assertFalse(m_log.error.called) + + @unittest.mock.patch('asyncio.futures.asyncio_log') + def test_tb_logger_exception_result_retrieved(self, m_log): + fut = futures.Future(loop=self.loop) + fut.set_exception(RuntimeError('boom')) + self.assertRaises(RuntimeError, fut.result) + del fut + self.assertFalse(m_log.error.called) + + def test_wrap_future(self): + + def run(arg): + return (arg, threading.get_ident()) + ex = concurrent.futures.ThreadPoolExecutor(1) + f1 = ex.submit(run, 'oi') + f2 = futures.wrap_future(f1, loop=self.loop) + res, ident = self.loop.run_until_complete(f2) + self.assertIsInstance(f2, futures.Future) + self.assertEqual(res, 'oi') + self.assertNotEqual(ident, threading.get_ident()) + + def test_wrap_future_future(self): + f1 = futures.Future(loop=self.loop) + f2 = futures.wrap_future(f1) + self.assertIs(f1, f2) + + @unittest.mock.patch('asyncio.futures.events') + def test_wrap_future_use_global_loop(self, m_events): + def run(arg): + return (arg, threading.get_ident()) + ex = concurrent.futures.ThreadPoolExecutor(1) + f1 = ex.submit(run, 'oi') + f2 = futures.wrap_future(f1) + self.assertIs(m_events.get_event_loop.return_value, f2._loop) + + +class FutureDoneCallbackTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def run_briefly(self): + test_utils.run_briefly(self.loop) + + def _make_callback(self, bag, thing): + # Create a callback function that appends thing to bag. + def bag_appender(future): + bag.append(thing) + return bag_appender + + def _new_future(self): + return futures.Future(loop=self.loop) + + def test_callbacks_invoked_on_set_result(self): + bag = [] + f = self._new_future() + f.add_done_callback(self._make_callback(bag, 42)) + f.add_done_callback(self._make_callback(bag, 17)) + + self.assertEqual(bag, []) + f.set_result('foo') + + self.run_briefly() + + self.assertEqual(bag, [42, 17]) + self.assertEqual(f.result(), 'foo') + + def test_callbacks_invoked_on_set_exception(self): + bag = [] + f = self._new_future() + f.add_done_callback(self._make_callback(bag, 100)) + + self.assertEqual(bag, []) + exc = RuntimeError() + f.set_exception(exc) + + self.run_briefly() + + self.assertEqual(bag, [100]) + self.assertEqual(f.exception(), exc) + + def test_remove_done_callback(self): + bag = [] + f = self._new_future() + cb1 = self._make_callback(bag, 1) + cb2 = self._make_callback(bag, 2) + cb3 = self._make_callback(bag, 3) + + # Add one cb1 and one cb2. + f.add_done_callback(cb1) + f.add_done_callback(cb2) + + # One instance of cb2 removed. Now there's only one cb1. + self.assertEqual(f.remove_done_callback(cb2), 1) + + # Never had any cb3 in there. + self.assertEqual(f.remove_done_callback(cb3), 0) + + # After this there will be 6 instances of cb1 and one of cb2. + f.add_done_callback(cb2) + for i in range(5): + f.add_done_callback(cb1) + + # Remove all instances of cb1. One cb2 remains. + self.assertEqual(f.remove_done_callback(cb1), 6) + + self.assertEqual(bag, []) + f.set_result('foo') + + self.run_briefly() + + self.assertEqual(bag, [2]) + self.assertEqual(f.result(), 'foo') + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_locks.py @@ -0,0 +1,765 @@ +"""Tests for lock.py""" + +import unittest +import unittest.mock + +from asyncio import events +from asyncio import futures +from asyncio import locks +from asyncio import tasks +from asyncio import test_utils + + +class LockTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_ctor_loop(self): + loop = unittest.mock.Mock() + lock = locks.Lock(loop=loop) + self.assertIs(lock._loop, loop) + + lock = locks.Lock(loop=self.loop) + self.assertIs(lock._loop, self.loop) + + def test_ctor_noloop(self): + try: + events.set_event_loop(self.loop) + lock = locks.Lock() + self.assertIs(lock._loop, self.loop) + finally: + events.set_event_loop(None) + + def test_repr(self): + lock = locks.Lock(loop=self.loop) + self.assertTrue(repr(lock).endswith('[unlocked]>')) + + @tasks.coroutine + def acquire_lock(): + yield from lock + + self.loop.run_until_complete(acquire_lock()) + self.assertTrue(repr(lock).endswith('[locked]>')) + + def test_lock(self): + lock = locks.Lock(loop=self.loop) + + @tasks.coroutine + def acquire_lock(): + return (yield from lock) + + res = self.loop.run_until_complete(acquire_lock()) + + self.assertTrue(res) + self.assertTrue(lock.locked()) + + lock.release() + self.assertFalse(lock.locked()) + + def test_acquire(self): + lock = locks.Lock(loop=self.loop) + result = [] + + self.assertTrue(self.loop.run_until_complete(lock.acquire())) + + @tasks.coroutine + def c1(result): + if (yield from lock.acquire()): + result.append(1) + return True + + @tasks.coroutine + def c2(result): + if (yield from lock.acquire()): + result.append(2) + return True + + @tasks.coroutine + def c3(result): + if (yield from lock.acquire()): + result.append(3) + return True + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + lock.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + + t3 = tasks.Task(c3(result), loop=self.loop) + + lock.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2], result) + + lock.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2, 3], result) + + self.assertTrue(t1.done()) + self.assertTrue(t1.result()) + self.assertTrue(t2.done()) + self.assertTrue(t2.result()) + self.assertTrue(t3.done()) + self.assertTrue(t3.result()) + + def test_acquire_cancel(self): + lock = locks.Lock(loop=self.loop) + self.assertTrue(self.loop.run_until_complete(lock.acquire())) + + task = tasks.Task(lock.acquire(), loop=self.loop) + self.loop.call_soon(task.cancel) + self.assertRaises( + futures.CancelledError, + self.loop.run_until_complete, task) + self.assertFalse(lock._waiters) + + def test_cancel_race(self): + # Several tasks: + # - A acquires the lock + # - B is blocked in aqcuire() + # - C is blocked in aqcuire() + # + # Now, concurrently: + # - B is cancelled + # - A releases the lock + # + # If B's waiter is marked cancelled but not yet removed from + # _waiters, A's release() call will crash when trying to set + # B's waiter; instead, it should move on to C's waiter. + + # Setup: A has the lock, b and c are waiting. + lock = locks.Lock(loop=self.loop) + + @tasks.coroutine + def lockit(name, blocker): + yield from lock.acquire() + try: + if blocker is not None: + yield from blocker + finally: + lock.release() + + fa = futures.Future(loop=self.loop) + ta = tasks.Task(lockit('A', fa), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertTrue(lock.locked()) + tb = tasks.Task(lockit('B', None), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertEqual(len(lock._waiters), 1) + tc = tasks.Task(lockit('C', None), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertEqual(len(lock._waiters), 2) + + # Create the race and check. + # Without the fix this failed at the last assert. + fa.set_result(None) + tb.cancel() + self.assertTrue(lock._waiters[0].cancelled()) + test_utils.run_briefly(self.loop) + self.assertFalse(lock.locked()) + self.assertTrue(ta.done()) + self.assertTrue(tb.cancelled()) + self.assertTrue(tc.done()) + + def test_release_not_acquired(self): + lock = locks.Lock(loop=self.loop) + + self.assertRaises(RuntimeError, lock.release) + + def test_release_no_waiters(self): + lock = locks.Lock(loop=self.loop) + self.loop.run_until_complete(lock.acquire()) + self.assertTrue(lock.locked()) + + lock.release() + self.assertFalse(lock.locked()) + + def test_context_manager(self): + lock = locks.Lock(loop=self.loop) + + @tasks.coroutine + def acquire_lock(): + return (yield from lock) + + with self.loop.run_until_complete(acquire_lock()): + self.assertTrue(lock.locked()) + + self.assertFalse(lock.locked()) + + def test_context_manager_no_yield(self): + lock = locks.Lock(loop=self.loop) + + try: + with lock: + self.fail('RuntimeError is not raised in with expression') + except RuntimeError as err: + self.assertEqual( + str(err), + '"yield from" should be used as context manager expression') + + +class EventTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_ctor_loop(self): + loop = unittest.mock.Mock() + ev = locks.Event(loop=loop) + self.assertIs(ev._loop, loop) + + ev = locks.Event(loop=self.loop) + self.assertIs(ev._loop, self.loop) + + def test_ctor_noloop(self): + try: + events.set_event_loop(self.loop) + ev = locks.Event() + self.assertIs(ev._loop, self.loop) + finally: + events.set_event_loop(None) + + def test_repr(self): + ev = locks.Event(loop=self.loop) + self.assertTrue(repr(ev).endswith('[unset]>')) + + ev.set() + self.assertTrue(repr(ev).endswith('[set]>')) + + def test_wait(self): + ev = locks.Event(loop=self.loop) + self.assertFalse(ev.is_set()) + + result = [] + + @tasks.coroutine + def c1(result): + if (yield from ev.wait()): + result.append(1) + + @tasks.coroutine + def c2(result): + if (yield from ev.wait()): + result.append(2) + + @tasks.coroutine + def c3(result): + if (yield from ev.wait()): + result.append(3) + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + t3 = tasks.Task(c3(result), loop=self.loop) + + ev.set() + test_utils.run_briefly(self.loop) + self.assertEqual([3, 1, 2], result) + + self.assertTrue(t1.done()) + self.assertIsNone(t1.result()) + self.assertTrue(t2.done()) + self.assertIsNone(t2.result()) + self.assertTrue(t3.done()) + self.assertIsNone(t3.result()) + + def test_wait_on_set(self): + ev = locks.Event(loop=self.loop) + ev.set() + + res = self.loop.run_until_complete(ev.wait()) + self.assertTrue(res) + + def test_wait_cancel(self): + ev = locks.Event(loop=self.loop) + + wait = tasks.Task(ev.wait(), loop=self.loop) + self.loop.call_soon(wait.cancel) + self.assertRaises( + futures.CancelledError, + self.loop.run_until_complete, wait) + self.assertFalse(ev._waiters) + + def test_clear(self): + ev = locks.Event(loop=self.loop) + self.assertFalse(ev.is_set()) + + ev.set() + self.assertTrue(ev.is_set()) + + ev.clear() + self.assertFalse(ev.is_set()) + + def test_clear_with_waiters(self): + ev = locks.Event(loop=self.loop) + result = [] + + @tasks.coroutine + def c1(result): + if (yield from ev.wait()): + result.append(1) + return True + + t = tasks.Task(c1(result), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + ev.set() + ev.clear() + self.assertFalse(ev.is_set()) + + ev.set() + ev.set() + self.assertEqual(1, len(ev._waiters)) + + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + self.assertEqual(0, len(ev._waiters)) + + self.assertTrue(t.done()) + self.assertTrue(t.result()) + + +class ConditionTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_ctor_loop(self): + loop = unittest.mock.Mock() + cond = locks.Condition(loop=loop) + self.assertIs(cond._loop, loop) + + cond = locks.Condition(loop=self.loop) + self.assertIs(cond._loop, self.loop) + + def test_ctor_noloop(self): + try: + events.set_event_loop(self.loop) + cond = locks.Condition() + self.assertIs(cond._loop, self.loop) + finally: + events.set_event_loop(None) + + def test_wait(self): + cond = locks.Condition(loop=self.loop) + result = [] + + @tasks.coroutine + def c1(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(1) + return True + + @tasks.coroutine + def c2(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(2) + return True + + @tasks.coroutine + def c3(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(3) + return True + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + t3 = tasks.Task(c3(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + self.assertFalse(cond.locked()) + + self.assertTrue(self.loop.run_until_complete(cond.acquire())) + cond.notify() + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + self.assertTrue(cond.locked()) + + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + self.assertTrue(cond.locked()) + + cond.notify(2) + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + self.assertTrue(cond.locked()) + + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2], result) + self.assertTrue(cond.locked()) + + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2, 3], result) + self.assertTrue(cond.locked()) + + self.assertTrue(t1.done()) + self.assertTrue(t1.result()) + self.assertTrue(t2.done()) + self.assertTrue(t2.result()) + self.assertTrue(t3.done()) + self.assertTrue(t3.result()) + + def test_wait_cancel(self): + cond = locks.Condition(loop=self.loop) + self.loop.run_until_complete(cond.acquire()) + + wait = tasks.Task(cond.wait(), loop=self.loop) + self.loop.call_soon(wait.cancel) + self.assertRaises( + futures.CancelledError, + self.loop.run_until_complete, wait) + self.assertFalse(cond._condition_waiters) + self.assertTrue(cond.locked()) + + def test_wait_unacquired(self): + cond = locks.Condition(loop=self.loop) + self.assertRaises( + RuntimeError, + self.loop.run_until_complete, cond.wait()) + + def test_wait_for(self): + cond = locks.Condition(loop=self.loop) + presult = False + + def predicate(): + return presult + + result = [] + + @tasks.coroutine + def c1(result): + yield from cond.acquire() + if (yield from cond.wait_for(predicate)): + result.append(1) + cond.release() + return True + + t = tasks.Task(c1(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + self.loop.run_until_complete(cond.acquire()) + cond.notify() + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + presult = True + self.loop.run_until_complete(cond.acquire()) + cond.notify() + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + + self.assertTrue(t.done()) + self.assertTrue(t.result()) + + def test_wait_for_unacquired(self): + cond = locks.Condition(loop=self.loop) + + # predicate can return true immediately + res = self.loop.run_until_complete(cond.wait_for(lambda: [1, 2, 3])) + self.assertEqual([1, 2, 3], res) + + self.assertRaises( + RuntimeError, + self.loop.run_until_complete, + cond.wait_for(lambda: False)) + + def test_notify(self): + cond = locks.Condition(loop=self.loop) + result = [] + + @tasks.coroutine + def c1(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(1) + cond.release() + return True + + @tasks.coroutine + def c2(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(2) + cond.release() + return True + + @tasks.coroutine + def c3(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(3) + cond.release() + return True + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + t3 = tasks.Task(c3(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + self.loop.run_until_complete(cond.acquire()) + cond.notify(1) + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + + self.loop.run_until_complete(cond.acquire()) + cond.notify(1) + cond.notify(2048) + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2, 3], result) + + self.assertTrue(t1.done()) + self.assertTrue(t1.result()) + self.assertTrue(t2.done()) + self.assertTrue(t2.result()) + self.assertTrue(t3.done()) + self.assertTrue(t3.result()) + + def test_notify_all(self): + cond = locks.Condition(loop=self.loop) + + result = [] + + @tasks.coroutine + def c1(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(1) + cond.release() + return True + + @tasks.coroutine + def c2(result): + yield from cond.acquire() + if (yield from cond.wait()): + result.append(2) + cond.release() + return True + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([], result) + + self.loop.run_until_complete(cond.acquire()) + cond.notify_all() + cond.release() + test_utils.run_briefly(self.loop) + self.assertEqual([1, 2], result) + + self.assertTrue(t1.done()) + self.assertTrue(t1.result()) + self.assertTrue(t2.done()) + self.assertTrue(t2.result()) + + def test_notify_unacquired(self): + cond = locks.Condition(loop=self.loop) + self.assertRaises(RuntimeError, cond.notify) + + def test_notify_all_unacquired(self): + cond = locks.Condition(loop=self.loop) + self.assertRaises(RuntimeError, cond.notify_all) + + +class SemaphoreTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_ctor_loop(self): + loop = unittest.mock.Mock() + sem = locks.Semaphore(loop=loop) + self.assertIs(sem._loop, loop) + + sem = locks.Semaphore(loop=self.loop) + self.assertIs(sem._loop, self.loop) + + def test_ctor_noloop(self): + try: + events.set_event_loop(self.loop) + sem = locks.Semaphore() + self.assertIs(sem._loop, self.loop) + finally: + events.set_event_loop(None) + + def test_repr(self): + sem = locks.Semaphore(loop=self.loop) + self.assertTrue(repr(sem).endswith('[unlocked,value:1]>')) + + self.loop.run_until_complete(sem.acquire()) + self.assertTrue(repr(sem).endswith('[locked]>')) + + def test_semaphore(self): + sem = locks.Semaphore(loop=self.loop) + self.assertEqual(1, sem._value) + + @tasks.coroutine + def acquire_lock(): + return (yield from sem) + + res = self.loop.run_until_complete(acquire_lock()) + + self.assertTrue(res) + self.assertTrue(sem.locked()) + self.assertEqual(0, sem._value) + + sem.release() + self.assertFalse(sem.locked()) + self.assertEqual(1, sem._value) + + def test_semaphore_value(self): + self.assertRaises(ValueError, locks.Semaphore, -1) + + def test_acquire(self): + sem = locks.Semaphore(3, loop=self.loop) + result = [] + + self.assertTrue(self.loop.run_until_complete(sem.acquire())) + self.assertTrue(self.loop.run_until_complete(sem.acquire())) + self.assertFalse(sem.locked()) + + @tasks.coroutine + def c1(result): + yield from sem.acquire() + result.append(1) + return True + + @tasks.coroutine + def c2(result): + yield from sem.acquire() + result.append(2) + return True + + @tasks.coroutine + def c3(result): + yield from sem.acquire() + result.append(3) + return True + + @tasks.coroutine + def c4(result): + yield from sem.acquire() + result.append(4) + return True + + t1 = tasks.Task(c1(result), loop=self.loop) + t2 = tasks.Task(c2(result), loop=self.loop) + t3 = tasks.Task(c3(result), loop=self.loop) + + test_utils.run_briefly(self.loop) + self.assertEqual([1], result) + self.assertTrue(sem.locked()) + self.assertEqual(2, len(sem._waiters)) + self.assertEqual(0, sem._value) + + t4 = tasks.Task(c4(result), loop=self.loop) + + sem.release() + sem.release() + self.assertEqual(2, sem._value) + + test_utils.run_briefly(self.loop) + self.assertEqual(0, sem._value) + self.assertEqual([1, 2, 3], result) + self.assertTrue(sem.locked()) + self.assertEqual(1, len(sem._waiters)) + self.assertEqual(0, sem._value) + + self.assertTrue(t1.done()) + self.assertTrue(t1.result()) + self.assertTrue(t2.done()) + self.assertTrue(t2.result()) + self.assertTrue(t3.done()) + self.assertTrue(t3.result()) + self.assertFalse(t4.done()) + + # cleanup locked semaphore + sem.release() + + def test_acquire_cancel(self): + sem = locks.Semaphore(loop=self.loop) + self.loop.run_until_complete(sem.acquire()) + + acquire = tasks.Task(sem.acquire(), loop=self.loop) + self.loop.call_soon(acquire.cancel) + self.assertRaises( + futures.CancelledError, + self.loop.run_until_complete, acquire) + self.assertFalse(sem._waiters) + + def test_release_not_acquired(self): + sem = locks.Semaphore(bound=True, loop=self.loop) + + self.assertRaises(ValueError, sem.release) + + def test_release_no_waiters(self): + sem = locks.Semaphore(loop=self.loop) + self.loop.run_until_complete(sem.acquire()) + self.assertTrue(sem.locked()) + + sem.release() + self.assertFalse(sem.locked()) + + def test_context_manager(self): + sem = locks.Semaphore(2, loop=self.loop) + + @tasks.coroutine + def acquire_lock(): + return (yield from sem) + + with self.loop.run_until_complete(acquire_lock()): + self.assertFalse(sem.locked()) + self.assertEqual(1, sem._value) + + with self.loop.run_until_complete(acquire_lock()): + self.assertTrue(sem.locked()) + + self.assertEqual(2, sem._value) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -0,0 +1,480 @@ +"""Tests for proactor_events.py""" + +import socket +import unittest +import unittest.mock + +import asyncio +from asyncio.proactor_events import BaseProactorEventLoop +from asyncio.proactor_events import _ProactorSocketTransport +from asyncio.proactor_events import _ProactorWritePipeTransport +from asyncio.proactor_events import _ProactorDuplexPipeTransport +from asyncio import test_utils + + +class ProactorSocketTransportTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + self.proactor = unittest.mock.Mock() + self.loop._proactor = self.proactor + self.protocol = test_utils.make_test_protocol(asyncio.Protocol) + self.sock = unittest.mock.Mock(socket.socket) + + def test_ctor(self): + fut = asyncio.Future(loop=self.loop) + tr = _ProactorSocketTransport( + self.loop, self.sock, self.protocol, fut) + test_utils.run_briefly(self.loop) + self.assertIsNone(fut.result()) + self.protocol.connection_made(tr) + self.proactor.recv.assert_called_with(self.sock, 4096) + + def test_loop_reading(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._loop_reading() + self.loop._proactor.recv.assert_called_with(self.sock, 4096) + self.assertFalse(self.protocol.data_received.called) + self.assertFalse(self.protocol.eof_received.called) + + def test_loop_reading_data(self): + res = asyncio.Future(loop=self.loop) + res.set_result(b'data') + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + + tr._read_fut = res + tr._loop_reading(res) + self.loop._proactor.recv.assert_called_with(self.sock, 4096) + self.protocol.data_received.assert_called_with(b'data') + + def test_loop_reading_no_data(self): + res = asyncio.Future(loop=self.loop) + res.set_result(b'') + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + + self.assertRaises(AssertionError, tr._loop_reading, res) + + tr.close = unittest.mock.Mock() + tr._read_fut = res + tr._loop_reading(res) + self.assertFalse(self.loop._proactor.recv.called) + self.assertTrue(self.protocol.eof_received.called) + self.assertTrue(tr.close.called) + + def test_loop_reading_aborted(self): + err = self.loop._proactor.recv.side_effect = ConnectionAbortedError() + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._fatal_error = unittest.mock.Mock() + tr._loop_reading() + tr._fatal_error.assert_called_with(err) + + def test_loop_reading_aborted_closing(self): + self.loop._proactor.recv.side_effect = ConnectionAbortedError() + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._closing = True + tr._fatal_error = unittest.mock.Mock() + tr._loop_reading() + self.assertFalse(tr._fatal_error.called) + + def test_loop_reading_aborted_is_fatal(self): + self.loop._proactor.recv.side_effect = ConnectionAbortedError() + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._closing = False + tr._fatal_error = unittest.mock.Mock() + tr._loop_reading() + self.assertTrue(tr._fatal_error.called) + + def test_loop_reading_conn_reset_lost(self): + err = self.loop._proactor.recv.side_effect = ConnectionResetError() + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._closing = False + tr._fatal_error = unittest.mock.Mock() + tr._force_close = unittest.mock.Mock() + tr._loop_reading() + self.assertFalse(tr._fatal_error.called) + tr._force_close.assert_called_with(err) + + def test_loop_reading_exception(self): + err = self.loop._proactor.recv.side_effect = (OSError()) + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._fatal_error = unittest.mock.Mock() + tr._loop_reading() + tr._fatal_error.assert_called_with(err) + + def test_write(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._loop_writing = unittest.mock.Mock() + tr.write(b'data') + self.assertEqual(tr._buffer, [b'data']) + self.assertTrue(tr._loop_writing.called) + + def test_write_no_data(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr.write(b'') + self.assertFalse(tr._buffer) + + def test_write_more(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._write_fut = unittest.mock.Mock() + tr._loop_writing = unittest.mock.Mock() + tr.write(b'data') + self.assertEqual(tr._buffer, [b'data']) + self.assertFalse(tr._loop_writing.called) + + def test_loop_writing(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._buffer = [b'da', b'ta'] + tr._loop_writing() + self.loop._proactor.send.assert_called_with(self.sock, b'data') + self.loop._proactor.send.return_value.add_done_callback.\ + assert_called_with(tr._loop_writing) + + @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + def test_loop_writing_err(self, m_log): + err = self.loop._proactor.send.side_effect = OSError() + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._fatal_error = unittest.mock.Mock() + tr._buffer = [b'da', b'ta'] + tr._loop_writing() + tr._fatal_error.assert_called_with(err) + tr._conn_lost = 1 + + tr.write(b'data') + tr.write(b'data') + tr.write(b'data') + tr.write(b'data') + tr.write(b'data') + self.assertEqual(tr._buffer, []) + m_log.warning.assert_called_with('socket.send() raised exception.') + + def test_loop_writing_stop(self): + fut = asyncio.Future(loop=self.loop) + fut.set_result(b'data') + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._write_fut = fut + tr._loop_writing(fut) + self.assertIsNone(tr._write_fut) + + def test_loop_writing_closing(self): + fut = asyncio.Future(loop=self.loop) + fut.set_result(1) + + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._write_fut = fut + tr.close() + tr._loop_writing(fut) + self.assertIsNone(tr._write_fut) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + + def test_abort(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._force_close = unittest.mock.Mock() + tr.abort() + tr._force_close.assert_called_with(None) + + def test_close(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr.close() + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + self.assertTrue(tr._closing) + self.assertEqual(tr._conn_lost, 1) + + self.protocol.connection_lost.reset_mock() + tr.close() + test_utils.run_briefly(self.loop) + self.assertFalse(self.protocol.connection_lost.called) + + def test_close_write_fut(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._write_fut = unittest.mock.Mock() + tr.close() + test_utils.run_briefly(self.loop) + self.assertFalse(self.protocol.connection_lost.called) + + def test_close_buffer(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._buffer = [b'data'] + tr.close() + test_utils.run_briefly(self.loop) + self.assertFalse(self.protocol.connection_lost.called) + + @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + def test_fatal_error(self, m_logging): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._force_close = unittest.mock.Mock() + tr._fatal_error(None) + self.assertTrue(tr._force_close.called) + self.assertTrue(m_logging.exception.called) + + def test_force_close(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._buffer = [b'data'] + read_fut = tr._read_fut = unittest.mock.Mock() + write_fut = tr._write_fut = unittest.mock.Mock() + tr._force_close(None) + + read_fut.cancel.assert_called_with() + write_fut.cancel.assert_called_with() + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + self.assertEqual([], tr._buffer) + self.assertEqual(tr._conn_lost, 1) + + def test_force_close_idempotent(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._closing = True + tr._force_close(None) + test_utils.run_briefly(self.loop) + self.assertFalse(self.protocol.connection_lost.called) + + def test_fatal_error_2(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._buffer = [b'data'] + tr._force_close(None) + + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + self.assertEqual([], tr._buffer) + + def test_call_connection_lost(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + tr._call_connection_lost(None) + self.assertTrue(self.protocol.connection_lost.called) + self.assertTrue(self.sock.close.called) + + def test_write_eof(self): + tr = _ProactorSocketTransport( + self.loop, self.sock, self.protocol) + self.assertTrue(tr.can_write_eof()) + tr.write_eof() + self.sock.shutdown.assert_called_with(socket.SHUT_WR) + tr.write_eof() + self.assertEqual(self.sock.shutdown.call_count, 1) + tr.close() + + def test_write_eof_buffer(self): + tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) + f = asyncio.Future(loop=self.loop) + tr._loop._proactor.send.return_value = f + tr.write(b'data') + tr.write_eof() + self.assertTrue(tr._eof_written) + self.assertFalse(self.sock.shutdown.called) + tr._loop._proactor.send.assert_called_with(self.sock, b'data') + f.set_result(4) + self.loop._run_once() + self.sock.shutdown.assert_called_with(socket.SHUT_WR) + tr.close() + + def test_write_eof_write_pipe(self): + tr = _ProactorWritePipeTransport( + self.loop, self.sock, self.protocol) + self.assertTrue(tr.can_write_eof()) + tr.write_eof() + self.assertTrue(tr._closing) + self.loop._run_once() + self.assertTrue(self.sock.close.called) + tr.close() + + def test_write_eof_buffer_write_pipe(self): + tr = _ProactorWritePipeTransport(self.loop, self.sock, self.protocol) + f = asyncio.Future(loop=self.loop) + tr._loop._proactor.send.return_value = f + tr.write(b'data') + tr.write_eof() + self.assertTrue(tr._closing) + self.assertFalse(self.sock.shutdown.called) + tr._loop._proactor.send.assert_called_with(self.sock, b'data') + f.set_result(4) + self.loop._run_once() + self.loop._run_once() + self.assertTrue(self.sock.close.called) + tr.close() + + def test_write_eof_duplex_pipe(self): + tr = _ProactorDuplexPipeTransport( + self.loop, self.sock, self.protocol) + self.assertFalse(tr.can_write_eof()) + with self.assertRaises(NotImplementedError): + tr.write_eof() + tr.close() + + def test_pause_resume(self): + tr = _ProactorSocketTransport( + self.loop, self.sock, self.protocol) + futures = [] + for msg in [b'data1', b'data2', b'data3', b'data4', b'']: + f = asyncio.Future(loop=self.loop) + f.set_result(msg) + futures.append(f) + self.loop._proactor.recv.side_effect = futures + self.loop._run_once() + self.assertFalse(tr._paused) + self.loop._run_once() + self.protocol.data_received.assert_called_with(b'data1') + self.loop._run_once() + self.protocol.data_received.assert_called_with(b'data2') + tr.pause() + self.assertTrue(tr._paused) + for i in range(10): + self.loop._run_once() + self.protocol.data_received.assert_called_with(b'data2') + tr.resume() + self.assertFalse(tr._paused) + self.loop._run_once() + self.protocol.data_received.assert_called_with(b'data3') + self.loop._run_once() + self.protocol.data_received.assert_called_with(b'data4') + tr.close() + + +class BaseProactorEventLoopTests(unittest.TestCase): + + def setUp(self): + self.sock = unittest.mock.Mock(socket.socket) + self.proactor = unittest.mock.Mock() + + self.ssock, self.csock = unittest.mock.Mock(), unittest.mock.Mock() + + class EventLoop(BaseProactorEventLoop): + def _socketpair(s): + return (self.ssock, self.csock) + + self.loop = EventLoop(self.proactor) + + @unittest.mock.patch.object(BaseProactorEventLoop, 'call_soon') + @unittest.mock.patch.object(BaseProactorEventLoop, '_socketpair') + def test_ctor(self, socketpair, call_soon): + ssock, csock = socketpair.return_value = ( + unittest.mock.Mock(), unittest.mock.Mock()) + loop = BaseProactorEventLoop(self.proactor) + self.assertIs(loop._ssock, ssock) + self.assertIs(loop._csock, csock) + self.assertEqual(loop._internal_fds, 1) + call_soon.assert_called_with(loop._loop_self_reading) + + def test_close_self_pipe(self): + self.loop._close_self_pipe() + self.assertEqual(self.loop._internal_fds, 0) + self.assertTrue(self.ssock.close.called) + self.assertTrue(self.csock.close.called) + self.assertIsNone(self.loop._ssock) + self.assertIsNone(self.loop._csock) + + def test_close(self): + self.loop._close_self_pipe = unittest.mock.Mock() + self.loop.close() + self.assertTrue(self.loop._close_self_pipe.called) + self.assertTrue(self.proactor.close.called) + self.assertIsNone(self.loop._proactor) + + self.loop._close_self_pipe.reset_mock() + self.loop.close() + self.assertFalse(self.loop._close_self_pipe.called) + + def test_sock_recv(self): + self.loop.sock_recv(self.sock, 1024) + self.proactor.recv.assert_called_with(self.sock, 1024) + + def test_sock_sendall(self): + self.loop.sock_sendall(self.sock, b'data') + self.proactor.send.assert_called_with(self.sock, b'data') + + def test_sock_connect(self): + self.loop.sock_connect(self.sock, 123) + self.proactor.connect.assert_called_with(self.sock, 123) + + def test_sock_accept(self): + self.loop.sock_accept(self.sock) + self.proactor.accept.assert_called_with(self.sock) + + def test_socketpair(self): + self.assertRaises( + NotImplementedError, BaseProactorEventLoop, self.proactor) + + def test_make_socket_transport(self): + tr = self.loop._make_socket_transport(self.sock, unittest.mock.Mock()) + self.assertIsInstance(tr, _ProactorSocketTransport) + + def test_loop_self_reading(self): + self.loop._loop_self_reading() + self.proactor.recv.assert_called_with(self.ssock, 4096) + self.proactor.recv.return_value.add_done_callback.assert_called_with( + self.loop._loop_self_reading) + + def test_loop_self_reading_fut(self): + fut = unittest.mock.Mock() + self.loop._loop_self_reading(fut) + self.assertTrue(fut.result.called) + self.proactor.recv.assert_called_with(self.ssock, 4096) + self.proactor.recv.return_value.add_done_callback.assert_called_with( + self.loop._loop_self_reading) + + def test_loop_self_reading_exception(self): + self.loop.close = unittest.mock.Mock() + self.proactor.recv.side_effect = OSError() + self.assertRaises(OSError, self.loop._loop_self_reading) + self.assertTrue(self.loop.close.called) + + def test_write_to_self(self): + self.loop._write_to_self() + self.csock.send.assert_called_with(b'x') + + def test_process_events(self): + self.loop._process_events([]) + + @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + def test_create_server(self, m_log): + pf = unittest.mock.Mock() + call_soon = self.loop.call_soon = unittest.mock.Mock() + + self.loop._start_serving(pf, self.sock) + self.assertTrue(call_soon.called) + + # callback + loop = call_soon.call_args[0][0] + loop() + self.proactor.accept.assert_called_with(self.sock) + + # conn + fut = unittest.mock.Mock() + fut.result.return_value = (unittest.mock.Mock(), unittest.mock.Mock()) + + make_tr = self.loop._make_socket_transport = unittest.mock.Mock() + loop(fut) + self.assertTrue(fut.result.called) + self.assertTrue(make_tr.called) + + # exception + fut.result.side_effect = OSError() + loop(fut) + self.assertTrue(self.sock.close.called) + self.assertTrue(m_log.exception.called) + + def test_create_server_cancel(self): + pf = unittest.mock.Mock() + call_soon = self.loop.call_soon = unittest.mock.Mock() + + self.loop._start_serving(pf, self.sock) + loop = call_soon.call_args[0][0] + + # cancelled + fut = asyncio.Future(loop=self.loop) + fut.cancel() + loop(fut) + self.assertTrue(self.sock.close.called) + + def test_stop_serving(self): + sock = unittest.mock.Mock() + self.loop._stop_serving(sock) + self.assertTrue(sock.close.called) + self.proactor._stop_serving.assert_called_with(sock) diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_queues.py @@ -0,0 +1,470 @@ +"""Tests for queues.py""" + +import unittest +import unittest.mock + +from asyncio import events +from asyncio import futures +from asyncio import locks +from asyncio import queues +from asyncio import tasks +from asyncio import test_utils + + +class _QueueTestBase(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + +class QueueBasicTests(_QueueTestBase): + + def _test_repr_or_str(self, fn, expect_id): + """Test Queue's repr or str. + + fn is repr or str. expect_id is True if we expect the Queue's id to + appear in fn(Queue()). + """ + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0.1 + self.assertAlmostEqual(0.2, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + q = queues.Queue(loop=loop) + self.assertTrue(fn(q).startswith(')') + t.cancel() # Does not take immediate effect! + self.assertEqual(repr(t), 'Task()') + self.assertRaises(futures.CancelledError, + self.loop.run_until_complete, t) + self.assertEqual(repr(t), 'Task()') + t = tasks.Task(notmuch(), loop=self.loop) + self.loop.run_until_complete(t) + self.assertEqual(repr(t), "Task()") + + def test_task_repr_custom(self): + @tasks.coroutine + def coro(): + pass + + class T(futures.Future): + def __repr__(self): + return 'T[]' + + class MyTask(tasks.Task, T): + def __repr__(self): + return super().__repr__() + + gen = coro() + t = MyTask(gen, loop=self.loop) + self.assertEqual(repr(t), 'T[]()') + gen.close() + + def test_task_basics(self): + @tasks.coroutine + def outer(): + a = yield from inner1() + b = yield from inner2() + return a+b + + @tasks.coroutine + def inner1(): + return 42 + + @tasks.coroutine + def inner2(): + return 1000 + + t = outer() + self.assertEqual(self.loop.run_until_complete(t), 1042) + + def test_cancel(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + @tasks.coroutine + def task(): + yield from tasks.sleep(10.0, loop=loop) + return 12 + + t = tasks.Task(task(), loop=loop) + loop.call_soon(t.cancel) + with self.assertRaises(futures.CancelledError): + loop.run_until_complete(t) + self.assertTrue(t.done()) + self.assertTrue(t.cancelled()) + self.assertFalse(t.cancel()) + + def test_cancel_yield(self): + @tasks.coroutine + def task(): + yield + yield + return 12 + + t = tasks.Task(task(), loop=self.loop) + test_utils.run_briefly(self.loop) # start coro + t.cancel() + self.assertRaises( + futures.CancelledError, self.loop.run_until_complete, t) + self.assertTrue(t.done()) + self.assertTrue(t.cancelled()) + self.assertFalse(t.cancel()) + + def test_cancel_inner_future(self): + f = futures.Future(loop=self.loop) + + @tasks.coroutine + def task(): + yield from f + return 12 + + t = tasks.Task(task(), loop=self.loop) + test_utils.run_briefly(self.loop) # start task + f.cancel() + with self.assertRaises(futures.CancelledError): + self.loop.run_until_complete(t) + self.assertTrue(f.cancelled()) + self.assertTrue(t.cancelled()) + + def test_cancel_both_task_and_inner_future(self): + f = futures.Future(loop=self.loop) + + @tasks.coroutine + def task(): + yield from f + return 12 + + t = tasks.Task(task(), loop=self.loop) + test_utils.run_briefly(self.loop) + + f.cancel() + t.cancel() + + with self.assertRaises(futures.CancelledError): + self.loop.run_until_complete(t) + + self.assertTrue(t.done()) + self.assertTrue(f.cancelled()) + self.assertTrue(t.cancelled()) + + def test_cancel_task_catching(self): + fut1 = futures.Future(loop=self.loop) + fut2 = futures.Future(loop=self.loop) + + @tasks.coroutine + def task(): + yield from fut1 + try: + yield from fut2 + except futures.CancelledError: + return 42 + + t = tasks.Task(task(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertIs(t._fut_waiter, fut1) # White-box test. + fut1.set_result(None) + test_utils.run_briefly(self.loop) + self.assertIs(t._fut_waiter, fut2) # White-box test. + t.cancel() + self.assertTrue(fut2.cancelled()) + res = self.loop.run_until_complete(t) + self.assertEqual(res, 42) + self.assertFalse(t.cancelled()) + + def test_cancel_task_ignoring(self): + fut1 = futures.Future(loop=self.loop) + fut2 = futures.Future(loop=self.loop) + fut3 = futures.Future(loop=self.loop) + + @tasks.coroutine + def task(): + yield from fut1 + try: + yield from fut2 + except futures.CancelledError: + pass + res = yield from fut3 + return res + + t = tasks.Task(task(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertIs(t._fut_waiter, fut1) # White-box test. + fut1.set_result(None) + test_utils.run_briefly(self.loop) + self.assertIs(t._fut_waiter, fut2) # White-box test. + t.cancel() + self.assertTrue(fut2.cancelled()) + test_utils.run_briefly(self.loop) + self.assertIs(t._fut_waiter, fut3) # White-box test. + fut3.set_result(42) + res = self.loop.run_until_complete(t) + self.assertEqual(res, 42) + self.assertFalse(fut3.cancelled()) + self.assertFalse(t.cancelled()) + + def test_cancel_current_task(self): + loop = events.new_event_loop() + self.addCleanup(loop.close) + + @tasks.coroutine + def task(): + t.cancel() + self.assertTrue(t._must_cancel) # White-box test. + # The sleep should be cancelled immediately. + yield from tasks.sleep(100, loop=loop) + return 12 + + t = tasks.Task(task(), loop=loop) + self.assertRaises( + futures.CancelledError, loop.run_until_complete, t) + self.assertTrue(t.done()) + self.assertFalse(t._must_cancel) # White-box test. + self.assertFalse(t.cancel()) + + def test_stop_while_run_in_complete(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0.1 + self.assertAlmostEqual(0.2, when) + when = yield 0.1 + self.assertAlmostEqual(0.3, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + x = 0 + waiters = [] + + @tasks.coroutine + def task(): + nonlocal x + while x < 10: + waiters.append(tasks.sleep(0.1, loop=loop)) + yield from waiters[-1] + x += 1 + if x == 2: + loop.stop() + + t = tasks.Task(task(), loop=loop) + self.assertRaises( + RuntimeError, loop.run_until_complete, t) + self.assertFalse(t.done()) + self.assertEqual(x, 2) + self.assertAlmostEqual(0.3, loop.time()) + + # close generators + for w in waiters: + w.close() + + def test_wait_for(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.2, when) + when = yield 0 + self.assertAlmostEqual(0.1, when) + when = yield 0.1 + self.assertAlmostEqual(0.4, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + @tasks.coroutine + def foo(): + yield from tasks.sleep(0.2, loop=loop) + return 'done' + + fut = tasks.Task(foo(), loop=loop) + + with self.assertRaises(futures.TimeoutError): + loop.run_until_complete(tasks.wait_for(fut, 0.1, loop=loop)) + + self.assertFalse(fut.done()) + self.assertAlmostEqual(0.1, loop.time()) + + # wait for result + res = loop.run_until_complete( + tasks.wait_for(fut, 0.3, loop=loop)) + self.assertEqual(res, 'done') + self.assertAlmostEqual(0.2, loop.time()) + + def test_wait_for_with_global_loop(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.2, when) + when = yield 0 + self.assertAlmostEqual(0.01, when) + yield 0.01 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + @tasks.coroutine + def foo(): + yield from tasks.sleep(0.2, loop=loop) + return 'done' + + events.set_event_loop(loop) + try: + fut = tasks.Task(foo(), loop=loop) + with self.assertRaises(futures.TimeoutError): + loop.run_until_complete(tasks.wait_for(fut, 0.01)) + finally: + events.set_event_loop(None) + + self.assertAlmostEqual(0.01, loop.time()) + self.assertFalse(fut.done()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(fut) + + def test_wait(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + yield 0.15 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(0.1, loop=loop), loop=loop) + b = tasks.Task(tasks.sleep(0.15, loop=loop), loop=loop) + + @tasks.coroutine + def foo(): + done, pending = yield from tasks.wait([b, a], loop=loop) + self.assertEqual(done, set([a, b])) + self.assertEqual(pending, set()) + return 42 + + res = loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertEqual(res, 42) + self.assertAlmostEqual(0.15, loop.time()) + + # Doing it again should take no time and exercise a different path. + res = loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.15, loop.time()) + self.assertEqual(res, 42) + + def test_wait_with_global_loop(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.01, when) + when = yield 0 + self.assertAlmostEqual(0.015, when) + yield 0.015 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(0.01, loop=loop), loop=loop) + b = tasks.Task(tasks.sleep(0.015, loop=loop), loop=loop) + + @tasks.coroutine + def foo(): + done, pending = yield from tasks.wait([b, a]) + self.assertEqual(done, set([a, b])) + self.assertEqual(pending, set()) + return 42 + + events.set_event_loop(loop) + try: + res = loop.run_until_complete( + tasks.Task(foo(), loop=loop)) + finally: + events.set_event_loop(None) + + self.assertEqual(res, 42) + + def test_wait_errors(self): + self.assertRaises( + ValueError, self.loop.run_until_complete, + tasks.wait(set(), loop=self.loop)) + + self.assertRaises( + ValueError, self.loop.run_until_complete, + tasks.wait([tasks.sleep(10.0, loop=self.loop)], + return_when=-1, loop=self.loop)) + + def test_wait_first_completed(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + when = yield 0 + self.assertAlmostEqual(0.1, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(10.0, loop=loop), loop=loop) + b = tasks.Task(tasks.sleep(0.1, loop=loop), loop=loop) + task = tasks.Task( + tasks.wait([b, a], return_when=tasks.FIRST_COMPLETED, + loop=loop), + loop=loop) + + done, pending = loop.run_until_complete(task) + self.assertEqual({b}, done) + self.assertEqual({a}, pending) + self.assertFalse(a.done()) + self.assertTrue(b.done()) + self.assertIsNone(b.result()) + self.assertAlmostEqual(0.1, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_wait_really_done(self): + # there is possibility that some tasks in the pending list + # became done but their callbacks haven't all been called yet + + @tasks.coroutine + def coro1(): + yield + + @tasks.coroutine + def coro2(): + yield + yield + + a = tasks.Task(coro1(), loop=self.loop) + b = tasks.Task(coro2(), loop=self.loop) + task = tasks.Task( + tasks.wait([b, a], return_when=tasks.FIRST_COMPLETED, + loop=self.loop), + loop=self.loop) + + done, pending = self.loop.run_until_complete(task) + self.assertEqual({a, b}, done) + self.assertTrue(a.done()) + self.assertIsNone(a.result()) + self.assertTrue(b.done()) + self.assertIsNone(b.result()) + + def test_wait_first_exception(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + # first_exception, task already has exception + a = tasks.Task(tasks.sleep(10.0, loop=loop), loop=loop) + + @tasks.coroutine + def exc(): + raise ZeroDivisionError('err') + + b = tasks.Task(exc(), loop=loop) + task = tasks.Task( + tasks.wait([b, a], return_when=tasks.FIRST_EXCEPTION, + loop=loop), + loop=loop) + + done, pending = loop.run_until_complete(task) + self.assertEqual({b}, done) + self.assertEqual({a}, pending) + self.assertAlmostEqual(0, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_wait_first_exception_in_wait(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + when = yield 0 + self.assertAlmostEqual(0.01, when) + yield 0.01 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + # first_exception, exception during waiting + a = tasks.Task(tasks.sleep(10.0, loop=loop), loop=loop) + + @tasks.coroutine + def exc(): + yield from tasks.sleep(0.01, loop=loop) + raise ZeroDivisionError('err') + + b = tasks.Task(exc(), loop=loop) + task = tasks.wait([b, a], return_when=tasks.FIRST_EXCEPTION, + loop=loop) + + done, pending = loop.run_until_complete(task) + self.assertEqual({b}, done) + self.assertEqual({a}, pending) + self.assertAlmostEqual(0.01, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_wait_with_exception(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + yield 0.15 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(0.1, loop=loop), loop=loop) + + @tasks.coroutine + def sleeper(): + yield from tasks.sleep(0.15, loop=loop) + raise ZeroDivisionError('really') + + b = tasks.Task(sleeper(), loop=loop) + + @tasks.coroutine + def foo(): + done, pending = yield from tasks.wait([b, a], loop=loop) + self.assertEqual(len(done), 2) + self.assertEqual(pending, set()) + errors = set(f for f in done if f.exception() is not None) + self.assertEqual(len(errors), 1) + + loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.15, loop.time()) + + loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.15, loop.time()) + + def test_wait_with_timeout(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + when = yield 0 + self.assertAlmostEqual(0.11, when) + yield 0.11 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(0.1, loop=loop), loop=loop) + b = tasks.Task(tasks.sleep(0.15, loop=loop), loop=loop) + + @tasks.coroutine + def foo(): + done, pending = yield from tasks.wait([b, a], timeout=0.11, + loop=loop) + self.assertEqual(done, set([a])) + self.assertEqual(pending, set([b])) + + loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.11, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_wait_concurrent_complete(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + when = yield 0 + self.assertAlmostEqual(0.1, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.Task(tasks.sleep(0.1, loop=loop), loop=loop) + b = tasks.Task(tasks.sleep(0.15, loop=loop), loop=loop) + + done, pending = loop.run_until_complete( + tasks.wait([b, a], timeout=0.1, loop=loop)) + + self.assertEqual(done, set([a])) + self.assertEqual(pending, set([b])) + self.assertAlmostEqual(0.1, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_as_completed(self): + + def gen(): + yield 0 + yield 0 + yield 0.01 + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + completed = set() + time_shifted = False + + @tasks.coroutine + def sleeper(dt, x): + nonlocal time_shifted + yield from tasks.sleep(dt, loop=loop) + completed.add(x) + if not time_shifted and 'a' in completed and 'b' in completed: + time_shifted = True + loop.advance_time(0.14) + return x + + a = sleeper(0.01, 'a') + b = sleeper(0.01, 'b') + c = sleeper(0.15, 'c') + + @tasks.coroutine + def foo(): + values = [] + for f in tasks.as_completed([b, c, a], loop=loop): + values.append((yield from f)) + return values + + res = loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.15, loop.time()) + self.assertTrue('a' in res[:2]) + self.assertTrue('b' in res[:2]) + self.assertEqual(res[2], 'c') + + # Doing it again should take no time and exercise a different path. + res = loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertAlmostEqual(0.15, loop.time()) + + def test_as_completed_with_timeout(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.12, when) + when = yield 0 + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + when = yield 0.1 + self.assertAlmostEqual(0.12, when) + yield 0.02 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.sleep(0.1, 'a', loop=loop) + b = tasks.sleep(0.15, 'b', loop=loop) + + @tasks.coroutine + def foo(): + values = [] + for f in tasks.as_completed([a, b], timeout=0.12, loop=loop): + try: + v = yield from f + values.append((1, v)) + except futures.TimeoutError as exc: + values.append((2, exc)) + return values + + res = loop.run_until_complete(tasks.Task(foo(), loop=loop)) + self.assertEqual(len(res), 2, res) + self.assertEqual(res[0], (1, 'a')) + self.assertEqual(res[1][0], 2) + self.assertTrue(isinstance(res[1][1], futures.TimeoutError)) + self.assertAlmostEqual(0.12, loop.time()) + + # move forward to close generator + loop.advance_time(10) + loop.run_until_complete(tasks.wait([a, b], loop=loop)) + + def test_as_completed_reverse_wait(self): + + def gen(): + yield 0 + yield 0.05 + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.sleep(0.05, 'a', loop=loop) + b = tasks.sleep(0.10, 'b', loop=loop) + fs = {a, b} + futs = list(tasks.as_completed(fs, loop=loop)) + self.assertEqual(len(futs), 2) + + x = loop.run_until_complete(futs[1]) + self.assertEqual(x, 'a') + self.assertAlmostEqual(0.05, loop.time()) + loop.advance_time(0.05) + y = loop.run_until_complete(futs[0]) + self.assertEqual(y, 'b') + self.assertAlmostEqual(0.10, loop.time()) + + def test_as_completed_concurrent(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.05, when) + when = yield 0 + self.assertAlmostEqual(0.05, when) + yield 0.05 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + a = tasks.sleep(0.05, 'a', loop=loop) + b = tasks.sleep(0.05, 'b', loop=loop) + fs = {a, b} + futs = list(tasks.as_completed(fs, loop=loop)) + self.assertEqual(len(futs), 2) + waiter = tasks.wait(futs, loop=loop) + done, pending = loop.run_until_complete(waiter) + self.assertEqual(set(f.result() for f in done), {'a', 'b'}) + + def test_sleep(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.05, when) + when = yield 0.05 + self.assertAlmostEqual(0.1, when) + yield 0.05 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + @tasks.coroutine + def sleeper(dt, arg): + yield from tasks.sleep(dt/2, loop=loop) + res = yield from tasks.sleep(dt/2, arg, loop=loop) + return res + + t = tasks.Task(sleeper(0.1, 'yeah'), loop=loop) + loop.run_until_complete(t) + self.assertTrue(t.done()) + self.assertEqual(t.result(), 'yeah') + self.assertAlmostEqual(0.1, loop.time()) + + def test_sleep_cancel(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + t = tasks.Task(tasks.sleep(10.0, 'yeah', loop=loop), + loop=loop) + + handle = None + orig_call_later = loop.call_later + + def call_later(self, delay, callback, *args): + nonlocal handle + handle = orig_call_later(self, delay, callback, *args) + return handle + + loop.call_later = call_later + test_utils.run_briefly(loop) + + self.assertFalse(handle._cancelled) + + t.cancel() + test_utils.run_briefly(loop) + self.assertTrue(handle._cancelled) + + def test_task_cancel_sleeping_task(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(5000, when) + yield 0.1 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + sleepfut = None + + @tasks.coroutine + def sleep(dt): + nonlocal sleepfut + sleepfut = tasks.sleep(dt, loop=loop) + yield from sleepfut + + @tasks.coroutine + def doit(): + sleeper = tasks.Task(sleep(5000), loop=loop) + loop.call_later(0.1, sleeper.cancel) + try: + yield from sleeper + except futures.CancelledError: + return 'cancelled' + else: + return 'slept in' + + doer = doit() + self.assertEqual(loop.run_until_complete(doer), 'cancelled') + self.assertAlmostEqual(0.1, loop.time()) + + def test_task_cancel_waiter_future(self): + fut = futures.Future(loop=self.loop) + + @tasks.coroutine + def coro(): + yield from fut + + task = tasks.Task(coro(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertIs(task._fut_waiter, fut) + + task.cancel() + test_utils.run_briefly(self.loop) + self.assertRaises( + futures.CancelledError, self.loop.run_until_complete, task) + self.assertIsNone(task._fut_waiter) + self.assertTrue(fut.cancelled()) + + def test_step_in_completed_task(self): + @tasks.coroutine + def notmuch(): + return 'ko' + + gen = notmuch() + task = tasks.Task(gen, loop=self.loop) + task.set_result('ok') + + self.assertRaises(AssertionError, task._step) + gen.close() + + def test_step_result(self): + @tasks.coroutine + def notmuch(): + yield None + yield 1 + return 'ko' + + self.assertRaises( + RuntimeError, self.loop.run_until_complete, notmuch()) + + def test_step_result_future(self): + # If coroutine returns future, task waits on this future. + + class Fut(futures.Future): + def __init__(self, *args, **kwds): + self.cb_added = False + super().__init__(*args, **kwds) + + def add_done_callback(self, fn): + self.cb_added = True + super().add_done_callback(fn) + + fut = Fut(loop=self.loop) + result = None + + @tasks.coroutine + def wait_for_future(): + nonlocal result + result = yield from fut + + t = tasks.Task(wait_for_future(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertTrue(fut.cb_added) + + res = object() + fut.set_result(res) + test_utils.run_briefly(self.loop) + self.assertIs(res, result) + self.assertTrue(t.done()) + self.assertIsNone(t.result()) + + def test_step_with_baseexception(self): + @tasks.coroutine + def notmutch(): + raise BaseException() + + task = tasks.Task(notmutch(), loop=self.loop) + self.assertRaises(BaseException, task._step) + + self.assertTrue(task.done()) + self.assertIsInstance(task.exception(), BaseException) + + def test_baseexception_during_cancel(self): + + def gen(): + when = yield + self.assertAlmostEqual(10.0, when) + yield 0 + + loop = test_utils.TestLoop(gen) + self.addCleanup(loop.close) + + @tasks.coroutine + def sleeper(): + yield from tasks.sleep(10, loop=loop) + + base_exc = BaseException() + + @tasks.coroutine + def notmutch(): + try: + yield from sleeper() + except futures.CancelledError: + raise base_exc + + task = tasks.Task(notmutch(), loop=loop) + test_utils.run_briefly(loop) + + task.cancel() + self.assertFalse(task.done()) + + self.assertRaises(BaseException, test_utils.run_briefly, loop) + + self.assertTrue(task.done()) + self.assertFalse(task.cancelled()) + self.assertIs(task.exception(), base_exc) + + def test_iscoroutinefunction(self): + def fn(): + pass + + self.assertFalse(tasks.iscoroutinefunction(fn)) + + def fn1(): + yield + self.assertFalse(tasks.iscoroutinefunction(fn1)) + + @tasks.coroutine + def fn2(): + yield + self.assertTrue(tasks.iscoroutinefunction(fn2)) + + def test_yield_vs_yield_from(self): + fut = futures.Future(loop=self.loop) + + @tasks.coroutine + def wait_for_future(): + yield fut + + task = wait_for_future() + with self.assertRaises(RuntimeError): + self.loop.run_until_complete(task) + + self.assertFalse(fut.done()) + + def test_yield_vs_yield_from_generator(self): + @tasks.coroutine + def coro(): + yield + + @tasks.coroutine + def wait_for_future(): + gen = coro() + try: + yield gen + finally: + gen.close() + + task = wait_for_future() + self.assertRaises( + RuntimeError, + self.loop.run_until_complete, task) + + def test_coroutine_non_gen_function(self): + @tasks.coroutine + def func(): + return 'test' + + self.assertTrue(tasks.iscoroutinefunction(func)) + + coro = func() + self.assertTrue(tasks.iscoroutine(coro)) + + res = self.loop.run_until_complete(coro) + self.assertEqual(res, 'test') + + def test_coroutine_non_gen_function_return_future(self): + fut = futures.Future(loop=self.loop) + + @tasks.coroutine + def func(): + return fut + + @tasks.coroutine + def coro(): + fut.set_result('test') + + t1 = tasks.Task(func(), loop=self.loop) + t2 = tasks.Task(coro(), loop=self.loop) + res = self.loop.run_until_complete(t1) + self.assertEqual(res, 'test') + self.assertIsNone(t2.result()) + + # Some thorough tests for cancellation propagation through + # coroutines, tasks and wait(). + + def test_yield_future_passes_cancel(self): + # Cancelling outer() cancels inner() cancels waiter. + proof = 0 + waiter = futures.Future(loop=self.loop) + + @tasks.coroutine + def inner(): + nonlocal proof + try: + yield from waiter + except futures.CancelledError: + proof += 1 + raise + else: + self.fail('got past sleep() in inner()') + + @tasks.coroutine + def outer(): + nonlocal proof + try: + yield from inner() + except futures.CancelledError: + proof += 100 # Expect this path. + else: + proof += 10 + + f = tasks.async(outer(), loop=self.loop) + test_utils.run_briefly(self.loop) + f.cancel() + self.loop.run_until_complete(f) + self.assertEqual(proof, 101) + self.assertTrue(waiter.cancelled()) + + def test_yield_wait_does_not_shield_cancel(self): + # Cancelling outer() makes wait() return early, leaves inner() + # running. + proof = 0 + waiter = futures.Future(loop=self.loop) + + @tasks.coroutine + def inner(): + nonlocal proof + yield from waiter + proof += 1 + + @tasks.coroutine + def outer(): + nonlocal proof + d, p = yield from tasks.wait([inner()], loop=self.loop) + proof += 100 + + f = tasks.async(outer(), loop=self.loop) + test_utils.run_briefly(self.loop) + f.cancel() + self.assertRaises( + futures.CancelledError, self.loop.run_until_complete, f) + waiter.set_result(None) + test_utils.run_briefly(self.loop) + self.assertEqual(proof, 1) + + def test_shield_result(self): + inner = futures.Future(loop=self.loop) + outer = tasks.shield(inner) + inner.set_result(42) + res = self.loop.run_until_complete(outer) + self.assertEqual(res, 42) + + def test_shield_exception(self): + inner = futures.Future(loop=self.loop) + outer = tasks.shield(inner) + test_utils.run_briefly(self.loop) + exc = RuntimeError('expected') + inner.set_exception(exc) + test_utils.run_briefly(self.loop) + self.assertIs(outer.exception(), exc) + + def test_shield_cancel(self): + inner = futures.Future(loop=self.loop) + outer = tasks.shield(inner) + test_utils.run_briefly(self.loop) + inner.cancel() + test_utils.run_briefly(self.loop) + self.assertTrue(outer.cancelled()) + + def test_shield_shortcut(self): + fut = futures.Future(loop=self.loop) + fut.set_result(42) + res = self.loop.run_until_complete(tasks.shield(fut)) + self.assertEqual(res, 42) + + def test_shield_effect(self): + # Cancelling outer() does not affect inner(). + proof = 0 + waiter = futures.Future(loop=self.loop) + + @tasks.coroutine + def inner(): + nonlocal proof + yield from waiter + proof += 1 + + @tasks.coroutine + def outer(): + nonlocal proof + yield from tasks.shield(inner(), loop=self.loop) + proof += 100 + + f = tasks.async(outer(), loop=self.loop) + test_utils.run_briefly(self.loop) + f.cancel() + with self.assertRaises(futures.CancelledError): + self.loop.run_until_complete(f) + waiter.set_result(None) + test_utils.run_briefly(self.loop) + self.assertEqual(proof, 1) + + def test_shield_gather(self): + child1 = futures.Future(loop=self.loop) + child2 = futures.Future(loop=self.loop) + parent = tasks.gather(child1, child2, loop=self.loop) + outer = tasks.shield(parent, loop=self.loop) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + self.assertTrue(outer.cancelled()) + child1.set_result(1) + child2.set_result(2) + test_utils.run_briefly(self.loop) + self.assertEqual(parent.result(), [1, 2]) + + def test_gather_shield(self): + child1 = futures.Future(loop=self.loop) + child2 = futures.Future(loop=self.loop) + inner1 = tasks.shield(child1, loop=self.loop) + inner2 = tasks.shield(child2, loop=self.loop) + parent = tasks.gather(inner1, inner2, loop=self.loop) + test_utils.run_briefly(self.loop) + parent.cancel() + # This should cancel inner1 and inner2 but bot child1 and child2. + test_utils.run_briefly(self.loop) + self.assertIsInstance(parent.exception(), futures.CancelledError) + self.assertTrue(inner1.cancelled()) + self.assertTrue(inner2.cancelled()) + child1.set_result(1) + child2.set_result(2) + test_utils.run_briefly(self.loop) + + +class GatherTestsBase: + + def setUp(self): + self.one_loop = test_utils.TestLoop() + self.other_loop = test_utils.TestLoop() + + def tearDown(self): + self.one_loop.close() + self.other_loop.close() + + def _run_loop(self, loop): + while loop._ready: + test_utils.run_briefly(loop) + + def _check_success(self, **kwargs): + a, b, c = [futures.Future(loop=self.one_loop) for i in range(3)] + fut = tasks.gather(*self.wrap_futures(a, b, c), **kwargs) + cb = Mock() + fut.add_done_callback(cb) + b.set_result(1) + a.set_result(2) + self._run_loop(self.one_loop) + self.assertEqual(cb.called, False) + self.assertFalse(fut.done()) + c.set_result(3) + self._run_loop(self.one_loop) + cb.assert_called_once_with(fut) + self.assertEqual(fut.result(), [2, 1, 3]) + + def test_success(self): + self._check_success() + self._check_success(return_exceptions=False) + + def test_result_exception_success(self): + self._check_success(return_exceptions=True) + + def test_one_exception(self): + a, b, c, d, e = [futures.Future(loop=self.one_loop) for i in range(5)] + fut = tasks.gather(*self.wrap_futures(a, b, c, d, e)) + cb = Mock() + fut.add_done_callback(cb) + exc = ZeroDivisionError() + a.set_result(1) + b.set_exception(exc) + self._run_loop(self.one_loop) + self.assertTrue(fut.done()) + cb.assert_called_once_with(fut) + self.assertIs(fut.exception(), exc) + # Does nothing + c.set_result(3) + d.cancel() + e.set_exception(RuntimeError()) + + def test_return_exceptions(self): + a, b, c, d = [futures.Future(loop=self.one_loop) for i in range(4)] + fut = tasks.gather(*self.wrap_futures(a, b, c, d), + return_exceptions=True) + cb = Mock() + fut.add_done_callback(cb) + exc = ZeroDivisionError() + exc2 = RuntimeError() + b.set_result(1) + c.set_exception(exc) + a.set_result(3) + self._run_loop(self.one_loop) + self.assertFalse(fut.done()) + d.set_exception(exc2) + self._run_loop(self.one_loop) + self.assertTrue(fut.done()) + cb.assert_called_once_with(fut) + self.assertEqual(fut.result(), [3, 1, exc, exc2]) + + +class FutureGatherTests(GatherTestsBase, unittest.TestCase): + + def wrap_futures(self, *futures): + return futures + + def _check_empty_sequence(self, seq_or_iter): + events.set_event_loop(self.one_loop) + self.addCleanup(events.set_event_loop, None) + fut = tasks.gather(*seq_or_iter) + self.assertIsInstance(fut, futures.Future) + self.assertIs(fut._loop, self.one_loop) + self._run_loop(self.one_loop) + self.assertTrue(fut.done()) + self.assertEqual(fut.result(), []) + fut = tasks.gather(*seq_or_iter, loop=self.other_loop) + self.assertIs(fut._loop, self.other_loop) + + def test_constructor_empty_sequence(self): + self._check_empty_sequence([]) + self._check_empty_sequence(()) + self._check_empty_sequence(set()) + self._check_empty_sequence(iter("")) + + def test_constructor_heterogenous_futures(self): + fut1 = futures.Future(loop=self.one_loop) + fut2 = futures.Future(loop=self.other_loop) + with self.assertRaises(ValueError): + tasks.gather(fut1, fut2) + with self.assertRaises(ValueError): + tasks.gather(fut1, loop=self.other_loop) + + def test_constructor_homogenous_futures(self): + children = [futures.Future(loop=self.other_loop) for i in range(3)] + fut = tasks.gather(*children) + self.assertIs(fut._loop, self.other_loop) + self._run_loop(self.other_loop) + self.assertFalse(fut.done()) + fut = tasks.gather(*children, loop=self.other_loop) + self.assertIs(fut._loop, self.other_loop) + self._run_loop(self.other_loop) + self.assertFalse(fut.done()) + + def test_one_cancellation(self): + a, b, c, d, e = [futures.Future(loop=self.one_loop) for i in range(5)] + fut = tasks.gather(a, b, c, d, e) + cb = Mock() + fut.add_done_callback(cb) + a.set_result(1) + b.cancel() + self._run_loop(self.one_loop) + self.assertTrue(fut.done()) + cb.assert_called_once_with(fut) + self.assertFalse(fut.cancelled()) + self.assertIsInstance(fut.exception(), futures.CancelledError) + # Does nothing + c.set_result(3) + d.cancel() + e.set_exception(RuntimeError()) + + def test_result_exception_one_cancellation(self): + a, b, c, d, e, f = [futures.Future(loop=self.one_loop) + for i in range(6)] + fut = tasks.gather(a, b, c, d, e, f, return_exceptions=True) + cb = Mock() + fut.add_done_callback(cb) + a.set_result(1) + zde = ZeroDivisionError() + b.set_exception(zde) + c.cancel() + self._run_loop(self.one_loop) + self.assertFalse(fut.done()) + d.set_result(3) + e.cancel() + rte = RuntimeError() + f.set_exception(rte) + res = self.one_loop.run_until_complete(fut) + self.assertIsInstance(res[2], futures.CancelledError) + self.assertIsInstance(res[4], futures.CancelledError) + res[2] = res[4] = None + self.assertEqual(res, [1, zde, None, 3, None, rte]) + cb.assert_called_once_with(fut) + + +class CoroutineGatherTests(GatherTestsBase, unittest.TestCase): + + def setUp(self): + super().setUp() + events.set_event_loop(self.one_loop) + + def tearDown(self): + events.set_event_loop(None) + super().tearDown() + + def wrap_futures(self, *futures): + coros = [] + for fut in futures: + @tasks.coroutine + def coro(fut=fut): + return (yield from fut) + coros.append(coro()) + return coros + + def test_constructor_loop_selection(self): + @tasks.coroutine + def coro(): + return 'abc' + gen1 = coro() + gen2 = coro() + fut = tasks.gather(gen1, gen2) + self.assertIs(fut._loop, self.one_loop) + gen1.close() + gen2.close() + gen3 = coro() + gen4 = coro() + fut = tasks.gather(gen3, gen4, loop=self.other_loop) + self.assertIs(fut._loop, self.other_loop) + gen3.close() + gen4.close() + + def test_cancellation_broadcast(self): + # Cancelling outer() cancels all children. + proof = 0 + waiter = futures.Future(loop=self.one_loop) + + @tasks.coroutine + def inner(): + nonlocal proof + yield from waiter + proof += 1 + + child1 = tasks.async(inner(), loop=self.one_loop) + child2 = tasks.async(inner(), loop=self.one_loop) + gatherer = None + + @tasks.coroutine + def outer(): + nonlocal proof, gatherer + gatherer = tasks.gather(child1, child2, loop=self.one_loop) + yield from gatherer + proof += 100 + + f = tasks.async(outer(), loop=self.one_loop) + test_utils.run_briefly(self.one_loop) + self.assertTrue(f.cancel()) + with self.assertRaises(futures.CancelledError): + self.one_loop.run_until_complete(f) + self.assertFalse(gatherer.cancel()) + self.assertTrue(waiter.cancelled()) + self.assertTrue(child1.cancelled()) + self.assertTrue(child2.cancelled()) + test_utils.run_briefly(self.one_loop) + self.assertEqual(proof, 0) + + def test_exception_marking(self): + # Test for the first line marked "Mark exception retrieved." + + @tasks.coroutine + def inner(f): + yield from f + raise RuntimeError('should not be ignored') + + a = futures.Future(loop=self.one_loop) + b = futures.Future(loop=self.one_loop) + + @tasks.coroutine + def outer(): + yield from tasks.gather(inner(a), inner(b), loop=self.one_loop) + + f = tasks.async(outer(), loop=self.one_loop) + test_utils.run_briefly(self.one_loop) + a.set_result(None) + test_utils.run_briefly(self.one_loop) + b.set_result(None) + test_utils.run_briefly(self.one_loop) + self.assertIsInstance(f.exception(), RuntimeError) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_transports.py @@ -0,0 +1,55 @@ +"""Tests for transports.py.""" + +import unittest +import unittest.mock + +from asyncio import transports + + +class TransportTests(unittest.TestCase): + + def test_ctor_extra_is_none(self): + transport = transports.Transport() + self.assertEqual(transport._extra, {}) + + def test_get_extra_info(self): + transport = transports.Transport({'extra': 'info'}) + self.assertEqual('info', transport.get_extra_info('extra')) + self.assertIsNone(transport.get_extra_info('unknown')) + + default = object() + self.assertIs(default, transport.get_extra_info('unknown', default)) + + def test_writelines(self): + transport = transports.Transport() + transport.write = unittest.mock.Mock() + + transport.writelines(['line1', 'line2', 'line3']) + self.assertEqual(3, transport.write.call_count) + + def test_not_implemented(self): + transport = transports.Transport() + + self.assertRaises(NotImplementedError, transport.write, 'data') + self.assertRaises(NotImplementedError, transport.write_eof) + self.assertRaises(NotImplementedError, transport.can_write_eof) + self.assertRaises(NotImplementedError, transport.pause) + self.assertRaises(NotImplementedError, transport.resume) + self.assertRaises(NotImplementedError, transport.close) + self.assertRaises(NotImplementedError, transport.abort) + + def test_dgram_not_implemented(self): + transport = transports.DatagramTransport() + + self.assertRaises(NotImplementedError, transport.sendto, 'data') + self.assertRaises(NotImplementedError, transport.abort) + + def test_subprocess_transport_not_implemented(self): + transport = transports.SubprocessTransport() + + self.assertRaises(NotImplementedError, transport.get_pid) + self.assertRaises(NotImplementedError, transport.get_returncode) + self.assertRaises(NotImplementedError, transport.get_pipe_transport, 1) + self.assertRaises(NotImplementedError, transport.send_signal, 1) + self.assertRaises(NotImplementedError, transport.terminate) + self.assertRaises(NotImplementedError, transport.kill) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -0,0 +1,767 @@ +"""Tests for unix_events.py.""" + +import gc +import errno +import io +import pprint +import signal +import stat +import sys +import unittest +import unittest.mock + + +from asyncio import events +from asyncio import futures +from asyncio import protocols +from asyncio import test_utils +from asyncio import unix_events + + + at unittest.skipUnless(signal, 'Signals are not supported') +class SelectorEventLoopTests(unittest.TestCase): + + def setUp(self): + self.loop = unix_events.SelectorEventLoop() + events.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_check_signal(self): + self.assertRaises( + TypeError, self.loop._check_signal, '1') + self.assertRaises( + ValueError, self.loop._check_signal, signal.NSIG + 1) + + def test_handle_signal_no_handler(self): + self.loop._handle_signal(signal.NSIG + 1, ()) + + def test_handle_signal_cancelled_handler(self): + h = events.Handle(unittest.mock.Mock(), ()) + h.cancel() + self.loop._signal_handlers[signal.NSIG + 1] = h + self.loop.remove_signal_handler = unittest.mock.Mock() + self.loop._handle_signal(signal.NSIG + 1, ()) + self.loop.remove_signal_handler.assert_called_with(signal.NSIG + 1) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_add_signal_handler_setup_error(self, m_signal): + m_signal.NSIG = signal.NSIG + m_signal.set_wakeup_fd.side_effect = ValueError + + self.assertRaises( + RuntimeError, + self.loop.add_signal_handler, + signal.SIGINT, lambda: True) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_add_signal_handler(self, m_signal): + m_signal.NSIG = signal.NSIG + + cb = lambda: True + self.loop.add_signal_handler(signal.SIGHUP, cb) + h = self.loop._signal_handlers.get(signal.SIGHUP) + self.assertTrue(isinstance(h, events.Handle)) + self.assertEqual(h._callback, cb) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_add_signal_handler_install_error(self, m_signal): + m_signal.NSIG = signal.NSIG + + def set_wakeup_fd(fd): + if fd == -1: + raise ValueError() + m_signal.set_wakeup_fd = set_wakeup_fd + + class Err(OSError): + errno = errno.EFAULT + m_signal.signal.side_effect = Err + + self.assertRaises( + Err, + self.loop.add_signal_handler, + signal.SIGINT, lambda: True) + + @unittest.mock.patch('asyncio.unix_events.signal') + @unittest.mock.patch('asyncio.unix_events.asyncio_log') + def test_add_signal_handler_install_error2(self, m_logging, m_signal): + m_signal.NSIG = signal.NSIG + + class Err(OSError): + errno = errno.EINVAL + m_signal.signal.side_effect = Err + + self.loop._signal_handlers[signal.SIGHUP] = lambda: True + self.assertRaises( + RuntimeError, + self.loop.add_signal_handler, + signal.SIGINT, lambda: True) + self.assertFalse(m_logging.info.called) + self.assertEqual(1, m_signal.set_wakeup_fd.call_count) + + @unittest.mock.patch('asyncio.unix_events.signal') + @unittest.mock.patch('asyncio.unix_events.asyncio_log') + def test_add_signal_handler_install_error3(self, m_logging, m_signal): + class Err(OSError): + errno = errno.EINVAL + m_signal.signal.side_effect = Err + m_signal.NSIG = signal.NSIG + + self.assertRaises( + RuntimeError, + self.loop.add_signal_handler, + signal.SIGINT, lambda: True) + self.assertFalse(m_logging.info.called) + self.assertEqual(2, m_signal.set_wakeup_fd.call_count) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_remove_signal_handler(self, m_signal): + m_signal.NSIG = signal.NSIG + + self.loop.add_signal_handler(signal.SIGHUP, lambda: True) + + self.assertTrue( + self.loop.remove_signal_handler(signal.SIGHUP)) + self.assertTrue(m_signal.set_wakeup_fd.called) + self.assertTrue(m_signal.signal.called) + self.assertEqual( + (signal.SIGHUP, m_signal.SIG_DFL), m_signal.signal.call_args[0]) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_remove_signal_handler_2(self, m_signal): + m_signal.NSIG = signal.NSIG + m_signal.SIGINT = signal.SIGINT + + self.loop.add_signal_handler(signal.SIGINT, lambda: True) + self.loop._signal_handlers[signal.SIGHUP] = object() + m_signal.set_wakeup_fd.reset_mock() + + self.assertTrue( + self.loop.remove_signal_handler(signal.SIGINT)) + self.assertFalse(m_signal.set_wakeup_fd.called) + self.assertTrue(m_signal.signal.called) + self.assertEqual( + (signal.SIGINT, m_signal.default_int_handler), + m_signal.signal.call_args[0]) + + @unittest.mock.patch('asyncio.unix_events.signal') + @unittest.mock.patch('asyncio.unix_events.asyncio_log') + def test_remove_signal_handler_cleanup_error(self, m_logging, m_signal): + m_signal.NSIG = signal.NSIG + self.loop.add_signal_handler(signal.SIGHUP, lambda: True) + + m_signal.set_wakeup_fd.side_effect = ValueError + + self.loop.remove_signal_handler(signal.SIGHUP) + self.assertTrue(m_logging.info) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_remove_signal_handler_error(self, m_signal): + m_signal.NSIG = signal.NSIG + self.loop.add_signal_handler(signal.SIGHUP, lambda: True) + + m_signal.signal.side_effect = OSError + + self.assertRaises( + OSError, self.loop.remove_signal_handler, signal.SIGHUP) + + @unittest.mock.patch('asyncio.unix_events.signal') + def test_remove_signal_handler_error2(self, m_signal): + m_signal.NSIG = signal.NSIG + self.loop.add_signal_handler(signal.SIGHUP, lambda: True) + + class Err(OSError): + errno = errno.EINVAL + m_signal.signal.side_effect = Err + + self.assertRaises( + RuntimeError, self.loop.remove_signal_handler, signal.SIGHUP) + + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld(self, m_waitpid, m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG): + m_waitpid.side_effect = [(7, object()), ChildProcessError] + m_WIFEXITED.return_value = True + m_WIFSIGNALED.return_value = False + m_WEXITSTATUS.return_value = 3 + transp = unittest.mock.Mock() + self.loop._subprocesses[7] = transp + + self.loop._sig_chld() + transp._process_exited.assert_called_with(3) + self.assertFalse(m_WTERMSIG.called) + + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld_signal(self, m_waitpid, m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG): + m_waitpid.side_effect = [(7, object()), ChildProcessError] + m_WIFEXITED.return_value = False + m_WIFSIGNALED.return_value = True + m_WTERMSIG.return_value = 1 + transp = unittest.mock.Mock() + self.loop._subprocesses[7] = transp + + self.loop._sig_chld() + transp._process_exited.assert_called_with(-1) + self.assertFalse(m_WEXITSTATUS.called) + + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld_zero_pid(self, m_waitpid, m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG): + m_waitpid.side_effect = [(0, object()), ChildProcessError] + transp = unittest.mock.Mock() + self.loop._subprocesses[7] = transp + + self.loop._sig_chld() + self.assertFalse(transp._process_exited.called) + self.assertFalse(m_WIFSIGNALED.called) + self.assertFalse(m_WIFEXITED.called) + self.assertFalse(m_WTERMSIG.called) + self.assertFalse(m_WEXITSTATUS.called) + + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld_not_registered_subprocess(self, m_waitpid, + m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG): + m_waitpid.side_effect = [(7, object()), ChildProcessError] + m_WIFEXITED.return_value = True + m_WIFSIGNALED.return_value = False + m_WEXITSTATUS.return_value = 3 + + self.loop._sig_chld() + self.assertFalse(m_WTERMSIG.called) + + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld_unknown_status(self, m_waitpid, + m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG): + m_waitpid.side_effect = [(7, object()), ChildProcessError] + m_WIFEXITED.return_value = False + m_WIFSIGNALED.return_value = False + transp = unittest.mock.Mock() + self.loop._subprocesses[7] = transp + + self.loop._sig_chld() + self.assertFalse(transp._process_exited.called) + self.assertFalse(m_WEXITSTATUS.called) + self.assertFalse(m_WTERMSIG.called) + + @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('os.WTERMSIG') + @unittest.mock.patch('os.WEXITSTATUS') + @unittest.mock.patch('os.WIFSIGNALED') + @unittest.mock.patch('os.WIFEXITED') + @unittest.mock.patch('os.waitpid') + def test__sig_chld_unknown_status_in_handler(self, m_waitpid, + m_WIFEXITED, m_WIFSIGNALED, + m_WEXITSTATUS, m_WTERMSIG, + m_log): + m_waitpid.side_effect = Exception + transp = unittest.mock.Mock() + self.loop._subprocesses[7] = transp + + self.loop._sig_chld() + self.assertFalse(transp._process_exited.called) + self.assertFalse(m_WIFSIGNALED.called) + self.assertFalse(m_WIFEXITED.called) + self.assertFalse(m_WTERMSIG.called) + self.assertFalse(m_WEXITSTATUS.called) + m_log.exception.assert_called_with( + 'Unknown exception in SIGCHLD handler') + + @unittest.mock.patch('os.waitpid') + def test__sig_chld_process_error(self, m_waitpid): + m_waitpid.side_effect = ChildProcessError + self.loop._sig_chld() + self.assertTrue(m_waitpid.called) + + +class UnixReadPipeTransportTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + self.protocol = test_utils.make_test_protocol(protocols.Protocol) + self.pipe = unittest.mock.Mock(spec_set=io.RawIOBase) + self.pipe.fileno.return_value = 5 + + fcntl_patcher = unittest.mock.patch('fcntl.fcntl') + fcntl_patcher.start() + self.addCleanup(fcntl_patcher.stop) + + def test_ctor(self): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + self.loop.assert_reader(5, tr._read_ready) + test_utils.run_briefly(self.loop) + self.protocol.connection_made.assert_called_with(tr) + + def test_ctor_with_waiter(self): + fut = futures.Future(loop=self.loop) + unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol, fut) + test_utils.run_briefly(self.loop) + self.assertIsNone(fut.result()) + + @unittest.mock.patch('os.read') + def test__read_ready(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + m_read.return_value = b'data' + tr._read_ready() + + m_read.assert_called_with(5, tr.max_size) + self.protocol.data_received.assert_called_with(b'data') + + @unittest.mock.patch('os.read') + def test__read_ready_eof(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + m_read.return_value = b'' + tr._read_ready() + + m_read.assert_called_with(5, tr.max_size) + self.assertFalse(self.loop.readers) + test_utils.run_briefly(self.loop) + self.protocol.eof_received.assert_called_with() + self.protocol.connection_lost.assert_called_with(None) + + @unittest.mock.patch('os.read') + def test__read_ready_blocked(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + m_read.side_effect = BlockingIOError + tr._read_ready() + + m_read.assert_called_with(5, tr.max_size) + test_utils.run_briefly(self.loop) + self.assertFalse(self.protocol.data_received.called) + + @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('os.read') + def test__read_ready_error(self, m_read, m_logexc): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + err = OSError() + m_read.side_effect = err + tr._close = unittest.mock.Mock() + tr._read_ready() + + m_read.assert_called_with(5, tr.max_size) + tr._close.assert_called_with(err) + m_logexc.assert_called_with('Fatal error for %s', tr) + + @unittest.mock.patch('os.read') + def test_pause(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + m = unittest.mock.Mock() + self.loop.add_reader(5, m) + tr.pause() + self.assertFalse(self.loop.readers) + + @unittest.mock.patch('os.read') + def test_resume(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + tr.resume() + self.loop.assert_reader(5, tr._read_ready) + + @unittest.mock.patch('os.read') + def test_close(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + tr._close = unittest.mock.Mock() + tr.close() + tr._close.assert_called_with(None) + + @unittest.mock.patch('os.read') + def test_close_already_closing(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + tr._closing = True + tr._close = unittest.mock.Mock() + tr.close() + self.assertFalse(tr._close.called) + + @unittest.mock.patch('os.read') + def test__close(self, m_read): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + err = object() + tr._close(err) + self.assertTrue(tr._closing) + self.assertFalse(self.loop.readers) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(err) + + def test__call_connection_lost(self): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + err = None + tr._call_connection_lost(err) + self.protocol.connection_lost.assert_called_with(err) + self.pipe.close.assert_called_with() + + self.assertIsNone(tr._protocol) + self.assertEqual(2, sys.getrefcount(self.protocol), + pprint.pformat(gc.get_referrers(self.protocol))) + self.assertIsNone(tr._loop) + self.assertEqual(2, sys.getrefcount(self.loop), + pprint.pformat(gc.get_referrers(self.loop))) + + def test__call_connection_lost_with_err(self): + tr = unix_events._UnixReadPipeTransport( + self.loop, self.pipe, self.protocol) + + err = OSError() + tr._call_connection_lost(err) + self.protocol.connection_lost.assert_called_with(err) + self.pipe.close.assert_called_with() + + self.assertIsNone(tr._protocol) + self.assertEqual(2, sys.getrefcount(self.protocol), + pprint.pformat(gc.get_referrers(self.protocol))) + self.assertIsNone(tr._loop) + self.assertEqual(2, sys.getrefcount(self.loop), + pprint.pformat(gc.get_referrers(self.loop))) + + +class UnixWritePipeTransportTests(unittest.TestCase): + + def setUp(self): + self.loop = test_utils.TestLoop() + self.protocol = test_utils.make_test_protocol(protocols.BaseProtocol) + self.pipe = unittest.mock.Mock(spec_set=io.RawIOBase) + self.pipe.fileno.return_value = 5 + + fcntl_patcher = unittest.mock.patch('fcntl.fcntl') + fcntl_patcher.start() + self.addCleanup(fcntl_patcher.stop) + + fstat_patcher = unittest.mock.patch('os.fstat') + m_fstat = fstat_patcher.start() + st = unittest.mock.Mock() + st.st_mode = stat.S_IFIFO + m_fstat.return_value = st + self.addCleanup(fstat_patcher.stop) + + def test_ctor(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + self.loop.assert_reader(5, tr._read_ready) + test_utils.run_briefly(self.loop) + self.protocol.connection_made.assert_called_with(tr) + + def test_ctor_with_waiter(self): + fut = futures.Future(loop=self.loop) + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol, fut) + self.loop.assert_reader(5, tr._read_ready) + test_utils.run_briefly(self.loop) + self.assertEqual(None, fut.result()) + + def test_can_write_eof(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + self.assertTrue(tr.can_write_eof()) + + @unittest.mock.patch('os.write') + def test_write(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + m_write.return_value = 4 + tr.write(b'data') + m_write.assert_called_with(5, b'data') + self.assertFalse(self.loop.writers) + self.assertEqual([], tr._buffer) + + @unittest.mock.patch('os.write') + def test_write_no_data(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + tr.write(b'') + self.assertFalse(m_write.called) + self.assertFalse(self.loop.writers) + self.assertEqual([], tr._buffer) + + @unittest.mock.patch('os.write') + def test_write_partial(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + m_write.return_value = 2 + tr.write(b'data') + m_write.assert_called_with(5, b'data') + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'ta'], tr._buffer) + + @unittest.mock.patch('os.write') + def test_write_buffer(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'previous'] + tr.write(b'data') + self.assertFalse(m_write.called) + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'previous', b'data'], tr._buffer) + + @unittest.mock.patch('os.write') + def test_write_again(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + m_write.side_effect = BlockingIOError() + tr.write(b'data') + m_write.assert_called_with(5, b'data') + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'data'], tr._buffer) + + @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('os.write') + def test_write_err(self, m_write, m_log): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + err = OSError() + m_write.side_effect = err + tr._fatal_error = unittest.mock.Mock() + tr.write(b'data') + m_write.assert_called_with(5, b'data') + self.assertFalse(self.loop.writers) + self.assertEqual([], tr._buffer) + tr._fatal_error.assert_called_with(err) + self.assertEqual(1, tr._conn_lost) + + tr.write(b'data') + self.assertEqual(2, tr._conn_lost) + tr.write(b'data') + tr.write(b'data') + tr.write(b'data') + tr.write(b'data') + # This is a bit overspecified. :-( + m_log.warning.assert_called_with( + 'pipe closed by peer or os.write(pipe, data) raised exception.') + + @unittest.mock.patch('os.write') + def test_write_close(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + tr._read_ready() # pipe was closed by peer + + tr.write(b'data') + self.assertEqual(tr._conn_lost, 1) + tr.write(b'data') + self.assertEqual(tr._conn_lost, 2) + + def test__read_ready(self): + tr = unix_events._UnixWritePipeTransport(self.loop, self.pipe, + self.protocol) + tr._read_ready() + self.assertFalse(self.loop.readers) + self.assertFalse(self.loop.writers) + self.assertTrue(tr._closing) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + + @unittest.mock.patch('os.write') + def test__write_ready(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'da', b'ta'] + m_write.return_value = 4 + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.assertFalse(self.loop.writers) + self.assertEqual([], tr._buffer) + + @unittest.mock.patch('os.write') + def test__write_ready_partial(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'da', b'ta'] + m_write.return_value = 3 + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'a'], tr._buffer) + + @unittest.mock.patch('os.write') + def test__write_ready_again(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'da', b'ta'] + m_write.side_effect = BlockingIOError() + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'data'], tr._buffer) + + @unittest.mock.patch('os.write') + def test__write_ready_empty(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'da', b'ta'] + m_write.return_value = 0 + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.loop.assert_writer(5, tr._write_ready) + self.assertEqual([b'data'], tr._buffer) + + @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('os.write') + def test__write_ready_err(self, m_write, m_logexc): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._buffer = [b'da', b'ta'] + m_write.side_effect = err = OSError() + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.assertFalse(self.loop.writers) + self.assertFalse(self.loop.readers) + self.assertEqual([], tr._buffer) + self.assertTrue(tr._closing) + m_logexc.assert_called_with('Fatal error for %s', tr) + self.assertEqual(1, tr._conn_lost) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(err) + + @unittest.mock.patch('os.write') + def test__write_ready_closing(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + tr._closing = True + tr._buffer = [b'da', b'ta'] + m_write.return_value = 4 + tr._write_ready() + m_write.assert_called_with(5, b'data') + self.assertFalse(self.loop.writers) + self.assertFalse(self.loop.readers) + self.assertEqual([], tr._buffer) + self.protocol.connection_lost.assert_called_with(None) + self.pipe.close.assert_called_with() + + @unittest.mock.patch('os.write') + def test_abort(self, m_write): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + self.loop.add_writer(5, tr._write_ready) + self.loop.add_reader(5, tr._read_ready) + tr._buffer = [b'da', b'ta'] + tr.abort() + self.assertFalse(m_write.called) + self.assertFalse(self.loop.readers) + self.assertFalse(self.loop.writers) + self.assertEqual([], tr._buffer) + self.assertTrue(tr._closing) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + + def test__call_connection_lost(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + err = None + tr._call_connection_lost(err) + self.protocol.connection_lost.assert_called_with(err) + self.pipe.close.assert_called_with() + + self.assertIsNone(tr._protocol) + self.assertEqual(2, sys.getrefcount(self.protocol), + pprint.pformat(gc.get_referrers(self.protocol))) + self.assertIsNone(tr._loop) + self.assertEqual(2, sys.getrefcount(self.loop), + pprint.pformat(gc.get_referrers(self.loop))) + + def test__call_connection_lost_with_err(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + err = OSError() + tr._call_connection_lost(err) + self.protocol.connection_lost.assert_called_with(err) + self.pipe.close.assert_called_with() + + self.assertIsNone(tr._protocol) + self.assertEqual(2, sys.getrefcount(self.protocol), + pprint.pformat(gc.get_referrers(self.protocol))) + self.assertIsNone(tr._loop) + self.assertEqual(2, sys.getrefcount(self.loop), + pprint.pformat(gc.get_referrers(self.loop))) + + def test_close(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + tr.write_eof = unittest.mock.Mock() + tr.close() + tr.write_eof.assert_called_with() + + def test_close_closing(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + tr.write_eof = unittest.mock.Mock() + tr._closing = True + tr.close() + self.assertFalse(tr.write_eof.called) + + def test_write_eof(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + + tr.write_eof() + self.assertTrue(tr._closing) + self.assertFalse(self.loop.readers) + test_utils.run_briefly(self.loop) + self.protocol.connection_lost.assert_called_with(None) + + def test_write_eof_pending(self): + tr = unix_events._UnixWritePipeTransport( + self.loop, self.pipe, self.protocol) + tr._buffer = [b'data'] + tr.write_eof() + self.assertTrue(tr._closing) + self.assertFalse(self.protocol.connection_lost.called) diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -0,0 +1,95 @@ +import os +import sys +import unittest + +if sys.platform != 'win32': + raise unittest.SkipTest('Windows only') + +import asyncio + +from asyncio import windows_events +from asyncio import protocols +from asyncio import streams +from asyncio import transports +from asyncio import test_utils + + +class UpperProto(protocols.Protocol): + def __init__(self): + self.buf = [] + + def connection_made(self, trans): + self.trans = trans + + def data_received(self, data): + self.buf.append(data) + if b'\n' in data: + self.trans.write(b''.join(self.buf).upper()) + self.trans.close() + + +class ProactorTests(unittest.TestCase): + + def setUp(self): + self.loop = windows_events.ProactorEventLoop() + asyncio.set_event_loop(None) + + def tearDown(self): + self.loop.close() + self.loop = None + + def test_close(self): + a, b = self.loop._socketpair() + trans = self.loop._make_socket_transport(a, protocols.Protocol()) + f = asyncio.async(self.loop.sock_recv(b, 100)) + trans.close() + self.loop.run_until_complete(f) + self.assertEqual(f.result(), b'') + + def test_double_bind(self): + ADDRESS = r'\\.\pipe\test_double_bind-%s' % os.getpid() + server1 = windows_events.PipeServer(ADDRESS) + with self.assertRaises(PermissionError): + server2 = windows_events.PipeServer(ADDRESS) + server1.close() + + def test_pipe(self): + res = self.loop.run_until_complete(self._test_pipe()) + self.assertEqual(res, 'done') + + def _test_pipe(self): + ADDRESS = r'\\.\pipe\_test_pipe-%s' % os.getpid() + + with self.assertRaises(FileNotFoundError): + yield from self.loop.create_pipe_connection( + protocols.Protocol, ADDRESS) + + [server] = yield from self.loop.start_serving_pipe( + UpperProto, ADDRESS) + self.assertIsInstance(server, windows_events.PipeServer) + + clients = [] + for i in range(5): + stream_reader = streams.StreamReader(loop=self.loop) + protocol = streams.StreamReaderProtocol(stream_reader) + trans, proto = yield from self.loop.create_pipe_connection( + lambda:protocol, ADDRESS) + self.assertIsInstance(trans, transports.Transport) + self.assertEqual(protocol, proto) + clients.append((stream_reader, trans)) + + for i, (r, w) in enumerate(clients): + w.write('lower-{}\n'.format(i).encode()) + + for i, (r, w) in enumerate(clients): + response = yield from r.readline() + self.assertEqual(response, 'LOWER-{}\n'.format(i).encode()) + w.close() + + server.close() + + with self.assertRaises(FileNotFoundError): + yield from self.loop.create_pipe_connection( + protocols.Protocol, ADDRESS) + + return 'done' diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -0,0 +1,136 @@ +"""Tests for window_utils""" + +import sys +import test.support +import unittest +import unittest.mock + +if sys.platform != 'win32': + raise unittest.SkipTest('Windows only') + +import _winapi + +from asyncio import windows_utils +from asyncio import _overlapped + + +class WinsocketpairTests(unittest.TestCase): + + def test_winsocketpair(self): + ssock, csock = windows_utils.socketpair() + + csock.send(b'xxx') + self.assertEqual(b'xxx', ssock.recv(1024)) + + csock.close() + ssock.close() + + @unittest.mock.patch('asyncio.windows_utils.socket') + def test_winsocketpair_exc(self, m_socket): + m_socket.socket.return_value.getsockname.return_value = ('', 12345) + m_socket.socket.return_value.accept.return_value = object(), object() + m_socket.socket.return_value.connect.side_effect = OSError() + + self.assertRaises(OSError, windows_utils.socketpair) + + +class PipeTests(unittest.TestCase): + + def test_pipe_overlapped(self): + h1, h2 = windows_utils.pipe(overlapped=(True, True)) + try: + ov1 = _overlapped.Overlapped() + self.assertFalse(ov1.pending) + self.assertEqual(ov1.error, 0) + + ov1.ReadFile(h1, 100) + self.assertTrue(ov1.pending) + self.assertEqual(ov1.error, _winapi.ERROR_IO_PENDING) + ERROR_IO_INCOMPLETE = 996 + try: + ov1.getresult() + except OSError as e: + self.assertEqual(e.winerror, ERROR_IO_INCOMPLETE) + else: + raise RuntimeError('expected ERROR_IO_INCOMPLETE') + + ov2 = _overlapped.Overlapped() + self.assertFalse(ov2.pending) + self.assertEqual(ov2.error, 0) + + ov2.WriteFile(h2, b"hello") + self.assertIn(ov2.error, {0, _winapi.ERROR_IO_PENDING}) + + res = _winapi.WaitForMultipleObjects([ov2.event], False, 100) + self.assertEqual(res, _winapi.WAIT_OBJECT_0) + + self.assertFalse(ov1.pending) + self.assertEqual(ov1.error, ERROR_IO_INCOMPLETE) + self.assertFalse(ov2.pending) + self.assertIn(ov2.error, {0, _winapi.ERROR_IO_PENDING}) + self.assertEqual(ov1.getresult(), b"hello") + finally: + _winapi.CloseHandle(h1) + _winapi.CloseHandle(h2) + + def test_pipe_handle(self): + h, _ = windows_utils.pipe(overlapped=(True, True)) + _winapi.CloseHandle(_) + p = windows_utils.PipeHandle(h) + self.assertEqual(p.fileno(), h) + self.assertEqual(p.handle, h) + + # check garbage collection of p closes handle + del p + test.support.gc_collect() + try: + _winapi.CloseHandle(h) + except OSError as e: + self.assertEqual(e.winerror, 6) # ERROR_INVALID_HANDLE + else: + raise RuntimeError('expected ERROR_INVALID_HANDLE') + + +class PopenTests(unittest.TestCase): + + def test_popen(self): + command = r"""if 1: + import sys + s = sys.stdin.readline() + sys.stdout.write(s.upper()) + sys.stderr.write('stderr') + """ + msg = b"blah\n" + + p = windows_utils.Popen([sys.executable, '-c', command], + stdin=windows_utils.PIPE, + stdout=windows_utils.PIPE, + stderr=windows_utils.PIPE) + + for f in [p.stdin, p.stdout, p.stderr]: + self.assertIsInstance(f, windows_utils.PipeHandle) + + ovin = _overlapped.Overlapped() + ovout = _overlapped.Overlapped() + overr = _overlapped.Overlapped() + + ovin.WriteFile(p.stdin.handle, msg) + ovout.ReadFile(p.stdout.handle, 100) + overr.ReadFile(p.stderr.handle, 100) + + events = [ovin.event, ovout.event, overr.event] + res = _winapi.WaitForMultipleObjects(events, True, 2000) + self.assertEqual(res, _winapi.WAIT_OBJECT_0) + self.assertFalse(ovout.pending) + self.assertFalse(overr.pending) + self.assertFalse(ovin.pending) + + self.assertEqual(ovin.getresult(), len(msg)) + out = ovout.getresult().rstrip() + err = overr.getresult().rstrip() + + self.assertGreater(len(out), 0) + self.assertGreater(len(err), 0) + # allow for partial reads... + self.assertTrue(msg.upper().rstrip().startswith(out)) + self.assertTrue(b"stderr".startswith(err)) diff --git a/Lib/test/test_asyncio/tests.txt b/Lib/test/test_asyncio/tests.txt new file mode 100644 --- /dev/null +++ b/Lib/test/test_asyncio/tests.txt @@ -0,0 +1,14 @@ +test_asyncio.test_base_events +test_asyncio.test_events +test_asyncio.test_futures +test_asyncio.test_locks +test_asyncio.test_proactor_events +test_asyncio.test_queues +test_asyncio.test_selector_events +test_asyncio.test_selectors +test_asyncio.test_streams +test_asyncio.test_tasks +test_asyncio.test_transports +test_asyncio.test_unix_events +test_asyncio.test_windows_events +test_asyncio.test_windows_utils diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,12 @@ Library ------- + +- Issue #19262: Initial check in of the 'asyncio' package (a.k.a. Tulip, + a.k.a. PEP 3156). There are no docs yet, and the PEP is slightly + out of date with the code. This module will have *provisional* status + in Python 3.4. + - Issue #19276: Fixed the wave module on 64-bit big-endian platforms. - Issue #19266: Rename the new-in-3.4 ``contextlib.ignore`` context manager diff --git a/Modules/overlapped.c b/Modules/overlapped.c new file mode 100644 --- /dev/null +++ b/Modules/overlapped.c @@ -0,0 +1,1202 @@ +/* + * Support for overlapped IO + * + * Some code borrowed from Modules/_winapi.c of CPython + */ + +/* XXX check overflow and DWORD <-> Py_ssize_t conversions + Check itemsize */ + +#include "Python.h" +#include "structmember.h" + +#define WINDOWS_LEAN_AND_MEAN +#include +#include +#include + +#if defined(MS_WIN32) && !defined(MS_WIN64) +# define F_POINTER "k" +# define T_POINTER T_ULONG +#else +# define F_POINTER "K" +# define T_POINTER T_ULONGLONG +#endif + +#define F_HANDLE F_POINTER +#define F_ULONG_PTR F_POINTER +#define F_DWORD "k" +#define F_BOOL "i" +#define F_UINT "I" + +#define T_HANDLE T_POINTER + +enum {TYPE_NONE, TYPE_NOT_STARTED, TYPE_READ, TYPE_WRITE, TYPE_ACCEPT, + TYPE_CONNECT, TYPE_DISCONNECT, TYPE_CONNECT_NAMED_PIPE, + TYPE_WAIT_NAMED_PIPE_AND_CONNECT}; + +typedef struct { + PyObject_HEAD + OVERLAPPED overlapped; + /* For convenience, we store the file handle too */ + HANDLE handle; + /* Error returned by last method call */ + DWORD error; + /* Type of operation */ + DWORD type; + union { + /* Buffer used for reading (optional) */ + PyObject *read_buffer; + /* Buffer used for writing (optional) */ + Py_buffer write_buffer; + }; +} OverlappedObject; + +typedef struct { + OVERLAPPED *Overlapped; + HANDLE IocpHandle; + char Address[1]; +} WaitNamedPipeAndConnectContext; + +/* + * Map Windows error codes to subclasses of OSError + */ + +static PyObject * +SetFromWindowsErr(DWORD err) +{ + PyObject *exception_type; + + if (err == 0) + err = GetLastError(); + switch (err) { + case ERROR_CONNECTION_REFUSED: + exception_type = PyExc_ConnectionRefusedError; + break; + case ERROR_CONNECTION_ABORTED: + exception_type = PyExc_ConnectionAbortedError; + break; + default: + exception_type = PyExc_OSError; + } + return PyErr_SetExcFromWindowsErr(exception_type, err); +} + +/* + * Some functions should be loaded at runtime + */ + +static LPFN_ACCEPTEX Py_AcceptEx = NULL; +static LPFN_CONNECTEX Py_ConnectEx = NULL; +static LPFN_DISCONNECTEX Py_DisconnectEx = NULL; +static BOOL (CALLBACK *Py_CancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; + +#define GET_WSA_POINTER(s, x) \ + (SOCKET_ERROR != WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, \ + &Guid##x, sizeof(Guid##x), &Py_##x, \ + sizeof(Py_##x), &dwBytes, NULL, NULL)) + +static int +initialize_function_pointers(void) +{ + GUID GuidAcceptEx = WSAID_ACCEPTEX; + GUID GuidConnectEx = WSAID_CONNECTEX; + GUID GuidDisconnectEx = WSAID_DISCONNECTEX; + HINSTANCE hKernel32; + SOCKET s; + DWORD dwBytes; + + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (s == INVALID_SOCKET) { + SetFromWindowsErr(WSAGetLastError()); + return -1; + } + + if (!GET_WSA_POINTER(s, AcceptEx) || + !GET_WSA_POINTER(s, ConnectEx) || + !GET_WSA_POINTER(s, DisconnectEx)) + { + closesocket(s); + SetFromWindowsErr(WSAGetLastError()); + return -1; + } + + closesocket(s); + + /* On WinXP we will have Py_CancelIoEx == NULL */ + hKernel32 = GetModuleHandle("KERNEL32"); + *(FARPROC *)&Py_CancelIoEx = GetProcAddress(hKernel32, "CancelIoEx"); + return 0; +} + +/* + * Completion port stuff + */ + +PyDoc_STRVAR( + CreateIoCompletionPort_doc, + "CreateIoCompletionPort(handle, port, key, concurrency) -> port\n\n" + "Create a completion port or register a handle with a port."); + +static PyObject * +overlapped_CreateIoCompletionPort(PyObject *self, PyObject *args) +{ + HANDLE FileHandle; + HANDLE ExistingCompletionPort; + ULONG_PTR CompletionKey; + DWORD NumberOfConcurrentThreads; + HANDLE ret; + + if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE F_ULONG_PTR F_DWORD, + &FileHandle, &ExistingCompletionPort, &CompletionKey, + &NumberOfConcurrentThreads)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + ret = CreateIoCompletionPort(FileHandle, ExistingCompletionPort, + CompletionKey, NumberOfConcurrentThreads); + Py_END_ALLOW_THREADS + + if (ret == NULL) + return SetFromWindowsErr(0); + return Py_BuildValue(F_HANDLE, ret); +} + +PyDoc_STRVAR( + GetQueuedCompletionStatus_doc, + "GetQueuedCompletionStatus(port, msecs) -> (err, bytes, key, address)\n\n" + "Get a message from completion port. Wait for up to msecs milliseconds."); + +static PyObject * +overlapped_GetQueuedCompletionStatus(PyObject *self, PyObject *args) +{ + HANDLE CompletionPort = NULL; + DWORD NumberOfBytes = 0; + ULONG_PTR CompletionKey = 0; + OVERLAPPED *Overlapped = NULL; + DWORD Milliseconds; + DWORD err; + BOOL ret; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD, + &CompletionPort, &Milliseconds)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + ret = GetQueuedCompletionStatus(CompletionPort, &NumberOfBytes, + &CompletionKey, &Overlapped, Milliseconds); + Py_END_ALLOW_THREADS + + err = ret ? ERROR_SUCCESS : GetLastError(); + if (Overlapped == NULL) { + if (err == WAIT_TIMEOUT) + Py_RETURN_NONE; + else + return SetFromWindowsErr(err); + } + return Py_BuildValue(F_DWORD F_DWORD F_ULONG_PTR F_POINTER, + err, NumberOfBytes, CompletionKey, Overlapped); +} + +PyDoc_STRVAR( + PostQueuedCompletionStatus_doc, + "PostQueuedCompletionStatus(port, bytes, key, address) -> None\n\n" + "Post a message to completion port."); + +static PyObject * +overlapped_PostQueuedCompletionStatus(PyObject *self, PyObject *args) +{ + HANDLE CompletionPort; + DWORD NumberOfBytes; + ULONG_PTR CompletionKey; + OVERLAPPED *Overlapped; + BOOL ret; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD F_ULONG_PTR F_POINTER, + &CompletionPort, &NumberOfBytes, &CompletionKey, + &Overlapped)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + ret = PostQueuedCompletionStatus(CompletionPort, NumberOfBytes, + CompletionKey, Overlapped); + Py_END_ALLOW_THREADS + + if (!ret) + return SetFromWindowsErr(0); + Py_RETURN_NONE; +} + +/* + * Bind socket handle to local port without doing slow getaddrinfo() + */ + +PyDoc_STRVAR( + BindLocal_doc, + "BindLocal(handle, family) -> None\n\n" + "Bind a socket handle to an arbitrary local port.\n" + "family should AF_INET or AF_INET6.\n"); + +static PyObject * +overlapped_BindLocal(PyObject *self, PyObject *args) +{ + SOCKET Socket; + int Family; + BOOL ret; + + if (!PyArg_ParseTuple(args, F_HANDLE "i", &Socket, &Family)) + return NULL; + + if (Family == AF_INET) { + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = 0; + addr.sin_addr.S_un.S_addr = INADDR_ANY; + ret = bind(Socket, (SOCKADDR*)&addr, sizeof(addr)) != SOCKET_ERROR; + } else if (Family == AF_INET6) { + struct sockaddr_in6 addr; + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + addr.sin6_port = 0; + addr.sin6_addr = in6addr_any; + ret = bind(Socket, (SOCKADDR*)&addr, sizeof(addr)) != SOCKET_ERROR; + } else { + PyErr_SetString(PyExc_ValueError, "expected tuple of length 2 or 4"); + return NULL; + } + + if (!ret) + return SetFromWindowsErr(WSAGetLastError()); + Py_RETURN_NONE; +} + +/* + * Windows equivalent of os.strerror() -- compare _ctypes/callproc.c + */ + +PyDoc_STRVAR( + FormatMessage_doc, + "FormatMessage(error_code) -> error_message\n\n" + "Return error message for an error code."); + +static PyObject * +overlapped_FormatMessage(PyObject *ignore, PyObject *args) +{ + DWORD code, n; + WCHAR *lpMsgBuf; + PyObject *res; + + if (!PyArg_ParseTuple(args, F_DWORD, &code)) + return NULL; + + n = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR) &lpMsgBuf, + 0, + NULL); + if (n) { + while (iswspace(lpMsgBuf[n-1])) + --n; + lpMsgBuf[n] = L'\0'; + res = Py_BuildValue("u", lpMsgBuf); + } else { + res = PyUnicode_FromFormat("unknown error code %u", code); + } + LocalFree(lpMsgBuf); + return res; +} + + +/* + * Mark operation as completed - used when reading produces ERROR_BROKEN_PIPE + */ + +static void +mark_as_completed(OVERLAPPED *ov) +{ + ov->Internal = 0; + if (ov->hEvent != NULL) + SetEvent(ov->hEvent); +} + +/* + * A Python object wrapping an OVERLAPPED structure and other useful data + * for overlapped I/O + */ + +PyDoc_STRVAR( + Overlapped_doc, + "Overlapped object"); + +static PyObject * +Overlapped_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + OverlappedObject *self; + HANDLE event = INVALID_HANDLE_VALUE; + static char *kwlist[] = {"event", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|" F_HANDLE, kwlist, &event)) + return NULL; + + if (event == INVALID_HANDLE_VALUE) { + event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (event == NULL) + return SetFromWindowsErr(0); + } + + self = PyObject_New(OverlappedObject, type); + if (self == NULL) { + if (event != NULL) + CloseHandle(event); + return NULL; + } + + self->handle = NULL; + self->error = 0; + self->type = TYPE_NONE; + self->read_buffer = NULL; + memset(&self->overlapped, 0, sizeof(OVERLAPPED)); + memset(&self->write_buffer, 0, sizeof(Py_buffer)); + if (event) + self->overlapped.hEvent = event; + return (PyObject *)self; +} + +static void +Overlapped_dealloc(OverlappedObject *self) +{ + DWORD bytes; + DWORD olderr = GetLastError(); + BOOL wait = FALSE; + BOOL ret; + + if (!HasOverlappedIoCompleted(&self->overlapped) && + self->type != TYPE_NOT_STARTED) + { + if (Py_CancelIoEx && Py_CancelIoEx(self->handle, &self->overlapped)) + wait = TRUE; + + Py_BEGIN_ALLOW_THREADS + ret = GetOverlappedResult(self->handle, &self->overlapped, + &bytes, wait); + Py_END_ALLOW_THREADS + + switch (ret ? ERROR_SUCCESS : GetLastError()) { + case ERROR_SUCCESS: + case ERROR_NOT_FOUND: + case ERROR_OPERATION_ABORTED: + break; + default: + PyErr_Format( + PyExc_RuntimeError, + "%R still has pending operation at " + "deallocation, the process may crash", self); + PyErr_WriteUnraisable(NULL); + } + } + + if (self->overlapped.hEvent != NULL) + CloseHandle(self->overlapped.hEvent); + + if (self->write_buffer.obj) + PyBuffer_Release(&self->write_buffer); + + switch (self->type) { + case TYPE_READ: + case TYPE_ACCEPT: + Py_CLEAR(self->read_buffer); + } + PyObject_Del(self); + SetLastError(olderr); +} + +PyDoc_STRVAR( + Overlapped_cancel_doc, + "cancel() -> None\n\n" + "Cancel overlapped operation"); + +static PyObject * +Overlapped_cancel(OverlappedObject *self) +{ + BOOL ret = TRUE; + + if (self->type == TYPE_NOT_STARTED + || self->type == TYPE_WAIT_NAMED_PIPE_AND_CONNECT) + Py_RETURN_NONE; + + if (!HasOverlappedIoCompleted(&self->overlapped)) { + Py_BEGIN_ALLOW_THREADS + if (Py_CancelIoEx) + ret = Py_CancelIoEx(self->handle, &self->overlapped); + else + ret = CancelIo(self->handle); + Py_END_ALLOW_THREADS + } + + /* CancelIoEx returns ERROR_NOT_FOUND if the I/O completed in-between */ + if (!ret && GetLastError() != ERROR_NOT_FOUND) + return SetFromWindowsErr(0); + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + Overlapped_getresult_doc, + "getresult(wait=False) -> result\n\n" + "Retrieve result of operation. If wait is true then it blocks\n" + "until the operation is finished. If wait is false and the\n" + "operation is still pending then an error is raised."); + +static PyObject * +Overlapped_getresult(OverlappedObject *self, PyObject *args) +{ + BOOL wait = FALSE; + DWORD transferred = 0; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, "|" F_BOOL, &wait)) + return NULL; + + if (self->type == TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation not yet attempted"); + return NULL; + } + + if (self->type == TYPE_NOT_STARTED) { + PyErr_SetString(PyExc_ValueError, "operation failed to start"); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS + ret = GetOverlappedResult(self->handle, &self->overlapped, &transferred, + wait); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : GetLastError(); + switch (err) { + case ERROR_SUCCESS: + case ERROR_MORE_DATA: + break; + case ERROR_BROKEN_PIPE: + if (self->read_buffer != NULL) + break; + /* fall through */ + default: + return SetFromWindowsErr(err); + } + + switch (self->type) { + case TYPE_READ: + assert(PyBytes_CheckExact(self->read_buffer)); + if (transferred != PyBytes_GET_SIZE(self->read_buffer) && + _PyBytes_Resize(&self->read_buffer, transferred)) + return NULL; + Py_INCREF(self->read_buffer); + return self->read_buffer; + default: + return PyLong_FromUnsignedLong((unsigned long) transferred); + } +} + +PyDoc_STRVAR( + Overlapped_ReadFile_doc, + "ReadFile(handle, size) -> Overlapped[message]\n\n" + "Start overlapped read"); + +static PyObject * +Overlapped_ReadFile(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + DWORD size; + DWORD nread; + PyObject *buf; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD, &handle, &size)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + +#if SIZEOF_SIZE_T <= SIZEOF_LONG + size = Py_MIN(size, (DWORD)PY_SSIZE_T_MAX); +#endif + buf = PyBytes_FromStringAndSize(NULL, Py_MAX(size, 1)); + if (buf == NULL) + return NULL; + + self->type = TYPE_READ; + self->handle = handle; + self->read_buffer = buf; + + Py_BEGIN_ALLOW_THREADS + ret = ReadFile(handle, PyBytes_AS_STRING(buf), size, &nread, + &self->overlapped); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : GetLastError(); + switch (err) { + case ERROR_BROKEN_PIPE: + mark_as_completed(&self->overlapped); + Py_RETURN_NONE; + case ERROR_SUCCESS: + case ERROR_MORE_DATA: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_WSARecv_doc, + "RecvFile(handle, size, flags) -> Overlapped[message]\n\n" + "Start overlapped receive"); + +static PyObject * +Overlapped_WSARecv(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + DWORD size; + DWORD flags = 0; + DWORD nread; + PyObject *buf; + WSABUF wsabuf; + int ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD "|" F_DWORD, + &handle, &size, &flags)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + +#if SIZEOF_SIZE_T <= SIZEOF_LONG + size = Py_MIN(size, (DWORD)PY_SSIZE_T_MAX); +#endif + buf = PyBytes_FromStringAndSize(NULL, Py_MAX(size, 1)); + if (buf == NULL) + return NULL; + + self->type = TYPE_READ; + self->handle = handle; + self->read_buffer = buf; + wsabuf.len = size; + wsabuf.buf = PyBytes_AS_STRING(buf); + + Py_BEGIN_ALLOW_THREADS + ret = WSARecv((SOCKET)handle, &wsabuf, 1, &nread, &flags, + &self->overlapped, NULL); + Py_END_ALLOW_THREADS + + self->error = err = (ret < 0 ? WSAGetLastError() : ERROR_SUCCESS); + switch (err) { + case ERROR_BROKEN_PIPE: + mark_as_completed(&self->overlapped); + Py_RETURN_NONE; + case ERROR_SUCCESS: + case ERROR_MORE_DATA: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_WriteFile_doc, + "WriteFile(handle, buf) -> Overlapped[bytes_transferred]\n\n" + "Start overlapped write"); + +static PyObject * +Overlapped_WriteFile(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + PyObject *bufobj; + DWORD written; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE "O", &handle, &bufobj)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + if (!PyArg_Parse(bufobj, "y*", &self->write_buffer)) + return NULL; + +#if SIZEOF_SIZE_T > SIZEOF_LONG + if (self->write_buffer.len > (Py_ssize_t)ULONG_MAX) { + PyBuffer_Release(&self->write_buffer); + PyErr_SetString(PyExc_ValueError, "buffer to large"); + return NULL; + } +#endif + + self->type = TYPE_WRITE; + self->handle = handle; + + Py_BEGIN_ALLOW_THREADS + ret = WriteFile(handle, self->write_buffer.buf, + (DWORD)self->write_buffer.len, + &written, &self->overlapped); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : GetLastError(); + switch (err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_WSASend_doc, + "WSASend(handle, buf, flags) -> Overlapped[bytes_transferred]\n\n" + "Start overlapped send"); + +static PyObject * +Overlapped_WSASend(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + PyObject *bufobj; + DWORD flags; + DWORD written; + WSABUF wsabuf; + int ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE "O" F_DWORD, + &handle, &bufobj, &flags)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + if (!PyArg_Parse(bufobj, "y*", &self->write_buffer)) + return NULL; + +#if SIZEOF_SIZE_T > SIZEOF_LONG + if (self->write_buffer.len > (Py_ssize_t)ULONG_MAX) { + PyBuffer_Release(&self->write_buffer); + PyErr_SetString(PyExc_ValueError, "buffer to large"); + return NULL; + } +#endif + + self->type = TYPE_WRITE; + self->handle = handle; + wsabuf.len = (DWORD)self->write_buffer.len; + wsabuf.buf = self->write_buffer.buf; + + Py_BEGIN_ALLOW_THREADS + ret = WSASend((SOCKET)handle, &wsabuf, 1, &written, flags, + &self->overlapped, NULL); + Py_END_ALLOW_THREADS + + self->error = err = (ret < 0 ? WSAGetLastError() : ERROR_SUCCESS); + switch (err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_AcceptEx_doc, + "AcceptEx(listen_handle, accept_handle) -> Overlapped[address_as_bytes]\n\n" + "Start overlapped wait for client to connect"); + +static PyObject * +Overlapped_AcceptEx(OverlappedObject *self, PyObject *args) +{ + SOCKET ListenSocket; + SOCKET AcceptSocket; + DWORD BytesReceived; + DWORD size; + PyObject *buf; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE, + &ListenSocket, &AcceptSocket)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + size = sizeof(struct sockaddr_in6) + 16; + buf = PyBytes_FromStringAndSize(NULL, size*2); + if (!buf) + return NULL; + + self->type = TYPE_ACCEPT; + self->handle = (HANDLE)ListenSocket; + self->read_buffer = buf; + + Py_BEGIN_ALLOW_THREADS + ret = Py_AcceptEx(ListenSocket, AcceptSocket, PyBytes_AS_STRING(buf), + 0, size, size, &BytesReceived, &self->overlapped); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : WSAGetLastError(); + switch (err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + + +static int +parse_address(PyObject *obj, SOCKADDR *Address, int Length) +{ + char *Host; + unsigned short Port; + unsigned long FlowInfo; + unsigned long ScopeId; + + memset(Address, 0, Length); + + if (PyArg_ParseTuple(obj, "sH", &Host, &Port)) + { + Address->sa_family = AF_INET; + if (WSAStringToAddressA(Host, AF_INET, NULL, Address, &Length) < 0) { + SetFromWindowsErr(WSAGetLastError()); + return -1; + } + ((SOCKADDR_IN*)Address)->sin_port = htons(Port); + return Length; + } + else if (PyArg_ParseTuple(obj, "sHkk", &Host, &Port, &FlowInfo, &ScopeId)) + { + PyErr_Clear(); + Address->sa_family = AF_INET6; + if (WSAStringToAddressA(Host, AF_INET6, NULL, Address, &Length) < 0) { + SetFromWindowsErr(WSAGetLastError()); + return -1; + } + ((SOCKADDR_IN6*)Address)->sin6_port = htons(Port); + ((SOCKADDR_IN6*)Address)->sin6_flowinfo = FlowInfo; + ((SOCKADDR_IN6*)Address)->sin6_scope_id = ScopeId; + return Length; + } + + return -1; +} + + +PyDoc_STRVAR( + Overlapped_ConnectEx_doc, + "ConnectEx(client_handle, address_as_bytes) -> Overlapped[None]\n\n" + "Start overlapped connect. client_handle should be unbound."); + +static PyObject * +Overlapped_ConnectEx(OverlappedObject *self, PyObject *args) +{ + SOCKET ConnectSocket; + PyObject *AddressObj; + char AddressBuf[sizeof(struct sockaddr_in6)]; + SOCKADDR *Address = (SOCKADDR*)AddressBuf; + int Length; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE "O", &ConnectSocket, &AddressObj)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + Length = sizeof(AddressBuf); + Length = parse_address(AddressObj, Address, Length); + if (Length < 0) + return NULL; + + self->type = TYPE_CONNECT; + self->handle = (HANDLE)ConnectSocket; + + Py_BEGIN_ALLOW_THREADS + ret = Py_ConnectEx(ConnectSocket, Address, Length, + NULL, 0, NULL, &self->overlapped); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : WSAGetLastError(); + switch (err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_DisconnectEx_doc, + "DisconnectEx(handle, flags) -> Overlapped[None]\n\n" + "Start overlapped connect. client_handle should be unbound."); + +static PyObject * +Overlapped_DisconnectEx(OverlappedObject *self, PyObject *args) +{ + SOCKET Socket; + DWORD flags; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD, &Socket, &flags)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + self->type = TYPE_DISCONNECT; + self->handle = (HANDLE)Socket; + + Py_BEGIN_ALLOW_THREADS + ret = Py_DisconnectEx(Socket, &self->overlapped, flags, 0); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : WSAGetLastError(); + switch (err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +PyDoc_STRVAR( + Overlapped_ConnectNamedPipe_doc, + "ConnectNamedPipe(handle) -> Overlapped[None]\n\n" + "Start overlapped wait for a client to connect."); + +static PyObject * +Overlapped_ConnectNamedPipe(OverlappedObject *self, PyObject *args) +{ + HANDLE Pipe; + BOOL ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE, &Pipe)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + self->type = TYPE_CONNECT_NAMED_PIPE; + self->handle = Pipe; + + Py_BEGIN_ALLOW_THREADS + ret = ConnectNamedPipe(Pipe, &self->overlapped); + Py_END_ALLOW_THREADS + + self->error = err = ret ? ERROR_SUCCESS : GetLastError(); + switch (err) { + case ERROR_PIPE_CONNECTED: + mark_as_completed(&self->overlapped); + Py_RETURN_NONE; + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + +/* Unfortunately there is no way to do an overlapped connect to a + pipe. We instead use WaitNamedPipe() and CreateFile() in a thread + pool thread. If a connection succeeds within a time limit (10 + seconds) then PostQueuedCompletionStatus() is used to return the + pipe handle to the completion port. */ + +static DWORD WINAPI +WaitNamedPipeAndConnectInThread(WaitNamedPipeAndConnectContext *ctx) +{ + HANDLE PipeHandle = INVALID_HANDLE_VALUE; + DWORD Start = GetTickCount(); + DWORD Deadline = Start + 10*1000; + DWORD Error = 0; + DWORD Timeout; + BOOL Success; + + for ( ; ; ) { + Timeout = Deadline - GetTickCount(); + if ((int)Timeout < 0) + break; + Success = WaitNamedPipe(ctx->Address, Timeout); + Error = Success ? ERROR_SUCCESS : GetLastError(); + switch (Error) { + case ERROR_SUCCESS: + PipeHandle = CreateFile(ctx->Address, + GENERIC_READ | GENERIC_WRITE, + 0, NULL, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, NULL); + if (PipeHandle == INVALID_HANDLE_VALUE) + continue; + break; + case ERROR_SEM_TIMEOUT: + continue; + } + break; + } + if (!PostQueuedCompletionStatus(ctx->IocpHandle, Error, + (ULONG_PTR)PipeHandle, ctx->Overlapped)) + CloseHandle(PipeHandle); + free(ctx); + return 0; +} + +PyDoc_STRVAR( + Overlapped_WaitNamedPipeAndConnect_doc, + "WaitNamedPipeAndConnect(addr, iocp_handle) -> Overlapped[pipe_handle]\n\n" + "Start overlapped connection to address, notifying iocp_handle when\n" + "finished"); + +static PyObject * +Overlapped_WaitNamedPipeAndConnect(OverlappedObject *self, PyObject *args) +{ + char *Address; + Py_ssize_t AddressLength; + HANDLE IocpHandle; + OVERLAPPED Overlapped; + BOOL ret; + DWORD err; + WaitNamedPipeAndConnectContext *ctx; + Py_ssize_t ContextLength; + + if (!PyArg_ParseTuple(args, "s#" F_HANDLE F_POINTER, + &Address, &AddressLength, &IocpHandle, &Overlapped)) + return NULL; + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + ContextLength = (AddressLength + + offsetof(WaitNamedPipeAndConnectContext, Address)); + ctx = calloc(1, ContextLength + 1); + if (ctx == NULL) + return PyErr_NoMemory(); + memcpy(ctx->Address, Address, AddressLength + 1); + ctx->Overlapped = &self->overlapped; + ctx->IocpHandle = IocpHandle; + + self->type = TYPE_WAIT_NAMED_PIPE_AND_CONNECT; + self->handle = NULL; + + Py_BEGIN_ALLOW_THREADS + ret = QueueUserWorkItem(WaitNamedPipeAndConnectInThread, ctx, + WT_EXECUTELONGFUNCTION); + Py_END_ALLOW_THREADS + + mark_as_completed(&self->overlapped); + + self->error = err = ret ? ERROR_SUCCESS : GetLastError(); + if (!ret) + return SetFromWindowsErr(err); + Py_RETURN_NONE; +} + +static PyObject* +Overlapped_getaddress(OverlappedObject *self) +{ + return PyLong_FromVoidPtr(&self->overlapped); +} + +static PyObject* +Overlapped_getpending(OverlappedObject *self) +{ + return PyBool_FromLong(!HasOverlappedIoCompleted(&self->overlapped) && + self->type != TYPE_NOT_STARTED); +} + +static PyMethodDef Overlapped_methods[] = { + {"getresult", (PyCFunction) Overlapped_getresult, + METH_VARARGS, Overlapped_getresult_doc}, + {"cancel", (PyCFunction) Overlapped_cancel, + METH_NOARGS, Overlapped_cancel_doc}, + {"ReadFile", (PyCFunction) Overlapped_ReadFile, + METH_VARARGS, Overlapped_ReadFile_doc}, + {"WSARecv", (PyCFunction) Overlapped_WSARecv, + METH_VARARGS, Overlapped_WSARecv_doc}, + {"WriteFile", (PyCFunction) Overlapped_WriteFile, + METH_VARARGS, Overlapped_WriteFile_doc}, + {"WSASend", (PyCFunction) Overlapped_WSASend, + METH_VARARGS, Overlapped_WSASend_doc}, + {"AcceptEx", (PyCFunction) Overlapped_AcceptEx, + METH_VARARGS, Overlapped_AcceptEx_doc}, + {"ConnectEx", (PyCFunction) Overlapped_ConnectEx, + METH_VARARGS, Overlapped_ConnectEx_doc}, + {"DisconnectEx", (PyCFunction) Overlapped_DisconnectEx, + METH_VARARGS, Overlapped_DisconnectEx_doc}, + {"ConnectNamedPipe", (PyCFunction) Overlapped_ConnectNamedPipe, + METH_VARARGS, Overlapped_ConnectNamedPipe_doc}, + {"WaitNamedPipeAndConnect", + (PyCFunction) Overlapped_WaitNamedPipeAndConnect, + METH_VARARGS, Overlapped_WaitNamedPipeAndConnect_doc}, + {NULL} +}; + +static PyMemberDef Overlapped_members[] = { + {"error", T_ULONG, + offsetof(OverlappedObject, error), + READONLY, "Error from last operation"}, + {"event", T_HANDLE, + offsetof(OverlappedObject, overlapped) + offsetof(OVERLAPPED, hEvent), + READONLY, "Overlapped event handle"}, + {NULL} +}; + +static PyGetSetDef Overlapped_getsets[] = { + {"address", (getter)Overlapped_getaddress, NULL, + "Address of overlapped structure"}, + {"pending", (getter)Overlapped_getpending, NULL, + "Whether the operation is pending"}, + {NULL}, +}; + +PyTypeObject OverlappedType = { + PyVarObject_HEAD_INIT(NULL, 0) + /* tp_name */ "_overlapped.Overlapped", + /* tp_basicsize */ sizeof(OverlappedObject), + /* tp_itemsize */ 0, + /* tp_dealloc */ (destructor) Overlapped_dealloc, + /* tp_print */ 0, + /* tp_getattr */ 0, + /* tp_setattr */ 0, + /* tp_reserved */ 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 */ 0, + /* tp_flags */ Py_TPFLAGS_DEFAULT, + /* tp_doc */ "OVERLAPPED structure wrapper", + /* tp_traverse */ 0, + /* tp_clear */ 0, + /* tp_richcompare */ 0, + /* tp_weaklistoffset */ 0, + /* tp_iter */ 0, + /* tp_iternext */ 0, + /* tp_methods */ Overlapped_methods, + /* tp_members */ Overlapped_members, + /* tp_getset */ Overlapped_getsets, + /* tp_base */ 0, + /* tp_dict */ 0, + /* tp_descr_get */ 0, + /* tp_descr_set */ 0, + /* tp_dictoffset */ 0, + /* tp_init */ 0, + /* tp_alloc */ 0, + /* tp_new */ Overlapped_new, +}; + +static PyMethodDef overlapped_functions[] = { + {"CreateIoCompletionPort", overlapped_CreateIoCompletionPort, + METH_VARARGS, CreateIoCompletionPort_doc}, + {"GetQueuedCompletionStatus", overlapped_GetQueuedCompletionStatus, + METH_VARARGS, GetQueuedCompletionStatus_doc}, + {"PostQueuedCompletionStatus", overlapped_PostQueuedCompletionStatus, + METH_VARARGS, PostQueuedCompletionStatus_doc}, + {"FormatMessage", overlapped_FormatMessage, + METH_VARARGS, FormatMessage_doc}, + {"BindLocal", overlapped_BindLocal, + METH_VARARGS, BindLocal_doc}, + {NULL} +}; + +static struct PyModuleDef overlapped_module = { + PyModuleDef_HEAD_INIT, + "_overlapped", + NULL, + -1, + overlapped_functions, + NULL, + NULL, + NULL, + NULL +}; + +#define WINAPI_CONSTANT(fmt, con) \ + PyDict_SetItemString(d, #con, Py_BuildValue(fmt, con)) + +PyMODINIT_FUNC +PyInit__overlapped(void) +{ + PyObject *m, *d; + + /* Ensure WSAStartup() called before initializing function pointers */ + m = PyImport_ImportModule("_socket"); + if (!m) + return NULL; + Py_DECREF(m); + + if (initialize_function_pointers() < 0) + return NULL; + + if (PyType_Ready(&OverlappedType) < 0) + return NULL; + + m = PyModule_Create(&overlapped_module); + if (PyModule_AddObject(m, "Overlapped", (PyObject *)&OverlappedType) < 0) + return NULL; + + d = PyModule_GetDict(m); + + WINAPI_CONSTANT(F_DWORD, ERROR_IO_PENDING); + WINAPI_CONSTANT(F_DWORD, ERROR_NETNAME_DELETED); + WINAPI_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT); + WINAPI_CONSTANT(F_DWORD, INFINITE); + WINAPI_CONSTANT(F_HANDLE, INVALID_HANDLE_VALUE); + WINAPI_CONSTANT(F_HANDLE, NULL); + WINAPI_CONSTANT(F_DWORD, SO_UPDATE_ACCEPT_CONTEXT); + WINAPI_CONSTANT(F_DWORD, SO_UPDATE_CONNECT_CONTEXT); + WINAPI_CONSTANT(F_DWORD, TF_REUSE_SOCKET); + + return m; +} diff --git a/PCbuild/_overlapped.vcxproj b/PCbuild/_overlapped.vcxproj new file mode 100644 --- /dev/null +++ b/PCbuild/_overlapped.vcxproj @@ -0,0 +1,234 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + Win32 + + + Release + x64 + + + + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E} + _overlapped + Win32Proj + + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + true + + + DynamicLibrary + NotSet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + X64 + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + X64 + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + X64 + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + MachineX64 + + + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + + + + + X64 + + + ws2_32.lib;%(AdditionalDependencies) + libc;%(IgnoreSpecificDefaultLibraries) + 0x1D110000 + MachineX64 + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + false + + + + + + \ No newline at end of file diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -76,6 +76,8 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sha3", "_sha3.vcxproj", "{254A0C05-6696-4B08-8CB2-EF7D533AEE01}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_overlapped", "_overlapped.vcxproj", "{EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 17 23:23:25 2013 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 17 Oct 2013 23:23:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Make_asyncio_tests_run_on_?= =?utf-8?q?Windows=2E?= Message-ID: <3d13JY5s8cz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/18c9d0b130c2 changeset: 86414:18c9d0b130c2 user: Guido van Rossum date: Thu Oct 17 14:23:17 2013 -0700 summary: Make asyncio tests run on Windows. files: Lib/test/test_asyncio/test_streams.py | 5 ++++- Lib/test/test_asyncio/test_unix_events.py | 3 +++ Lib/test/test_asyncio/test_windows_utils.py | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1,9 +1,12 @@ """Tests for streams.py.""" import gc -import ssl import unittest import unittest.mock +try: + import ssl +except ImportError: + ssl = None from asyncio import events from asyncio import streams diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -10,6 +10,9 @@ import unittest import unittest.mock +if sys.platform == 'win32': + raise unittest.SkipTest('UNIX only') + from asyncio import events from asyncio import futures diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py --- a/Lib/test/test_asyncio/test_windows_utils.py +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -11,7 +11,11 @@ import _winapi from asyncio import windows_utils -from asyncio import _overlapped + +try: + import _overlapped +except ImportError: + from asyncio import _overlapped class WinsocketpairTests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 00:22:22 2013 From: python-checkins at python.org (ned.deily) Date: Fri, 18 Oct 2013 00:22:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319275=3A_Fix_test?= =?utf-8?q?=5Fsite_failure_on_OS_X_due_to_typo=2E?= Message-ID: <3d14cZ0TnFz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/510bf951210f changeset: 86415:510bf951210f user: Ned Deily date: Thu Oct 17 15:21:40 2013 -0700 summary: Issue #19275: Fix test_site failure on OS X due to typo. files: Lib/test/test_site.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -450,7 +450,7 @@ collection_mods = {'_collections', 'collections', 'functools', 'heapq', 'itertools', 'keyword', 'operator', 'reprlib', 'types', 'weakref'} - self.assertFalse(modules.intersection(re_mods), stderr) + self.assertFalse(modules.intersection(collection_mods), stderr) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 00:39:52 2013 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 18 Oct 2013 00:39:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Rename_the_logger_to_plain?= =?utf-8?q?_=22logger=22=2E?= Message-ID: <3d150m4sCfz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/f08aa173f228 changeset: 86416:f08aa173f228 user: Guido van Rossum date: Thu Oct 17 15:39:45 2013 -0700 summary: Rename the logger to plain "logger". files: Lib/asyncio/base_events.py | 4 +- Lib/asyncio/events.py | 6 +- Lib/asyncio/futures.py | 6 +- Lib/asyncio/log.py | 3 +- Lib/asyncio/proactor_events.py | 10 +++--- Lib/asyncio/selector_events.py | 14 ++++---- Lib/asyncio/tasks.py | 6 +- Lib/asyncio/unix_events.py | 16 +++++----- Lib/asyncio/windows_events.py | 6 +- Lib/test/test_asyncio/test_base_events.py | 4 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_futures.py | 12 +++--- Lib/test/test_asyncio/test_proactor_events.py | 6 +- Lib/test/test_asyncio/test_selector_events.py | 12 +++--- Lib/test/test_asyncio/test_unix_events.py | 14 ++++---- 15 files changed, 61 insertions(+), 60 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -27,7 +27,7 @@ from . import events from . import futures from . import tasks -from .log import asyncio_log +from .log import logger __all__ = ['BaseEventLoop', 'Server'] @@ -580,7 +580,7 @@ level = logging.INFO else: level = logging.DEBUG - asyncio_log.log(level, 'poll%s took %.3f seconds', argstr, t1-t0) + logger.log(level, 'poll%s took %.3f seconds', argstr, t1-t0) self._process_events(event_list) # Handle 'later' callbacks that are ready. diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -12,7 +12,7 @@ import threading import socket -from .log import asyncio_log +from .log import logger class Handle: @@ -36,8 +36,8 @@ try: self._callback(*self._args) except Exception: - asyncio_log.exception('Exception in callback %s %r', - self._callback, self._args) + logger.exception('Exception in callback %s %r', + self._callback, self._args) self = None # Needed to break cycles when an exception occurs. diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -10,7 +10,7 @@ import traceback from . import events -from .log import asyncio_log +from .log import logger # States for Future. _PENDING = 'PENDING' @@ -99,8 +99,8 @@ def __del__(self): if self.tb: - asyncio_log.error('Future/Task exception was never retrieved:\n%s', - ''.join(self.tb)) + logger.error('Future/Task exception was never retrieved:\n%s', + ''.join(self.tb)) class Future: diff --git a/Lib/asyncio/log.py b/Lib/asyncio/log.py --- a/Lib/asyncio/log.py +++ b/Lib/asyncio/log.py @@ -3,4 +3,5 @@ import logging -asyncio_log = logging.getLogger("asyncio") +# Name the logger after the package. +logger = logging.getLogger(__package__) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -10,7 +10,7 @@ from . import constants from . import futures from . import transports -from .log import asyncio_log +from .log import logger class _ProactorBasePipeTransport(transports.BaseTransport): @@ -50,7 +50,7 @@ self._read_fut.cancel() def _fatal_error(self, exc): - asyncio_log.exception('Fatal error for %s', self) + logger.exception('Fatal error for %s', self) self._force_close(exc) def _force_close(self, exc): @@ -164,7 +164,7 @@ if self._conn_lost: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: - asyncio_log.warning('socket.send() raised exception.') + logger.warning('socket.send() raised exception.') self._conn_lost += 1 return self._buffer.append(data) @@ -246,7 +246,7 @@ def __init__(self, proactor): super().__init__() - asyncio_log.debug('Using proactor: %s', proactor.__class__.__name__) + logger.debug('Using proactor: %s', proactor.__class__.__name__) self._proactor = proactor self._selector = proactor # convenient alias proactor.set_loop(self) @@ -335,7 +335,7 @@ f = self._proactor.accept(sock) except OSError: if sock.fileno() != -1: - asyncio_log.exception('Accept failed') + logger.exception('Accept failed') sock.close() except futures.CancelledError: sock.close() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -17,7 +17,7 @@ from . import futures from . import selectors from . import transports -from .log import asyncio_log +from .log import logger class BaseSelectorEventLoop(base_events.BaseEventLoop): @@ -31,7 +31,7 @@ if selector is None: selector = selectors.DefaultSelector() - asyncio_log.debug('Using selector: %s', selector.__class__.__name__) + logger.debug('Using selector: %s', selector.__class__.__name__) self._selector = selector self._make_self_pipe() @@ -105,7 +105,7 @@ sock.close() # There's nowhere to send the error, so just log it. # TODO: Someone will want an error handler for this. - asyncio_log.exception('Accept failed') + logger.exception('Accept failed') else: if ssl: self._make_ssl_transport( @@ -363,7 +363,7 @@ def _fatal_error(self, exc): # should be called from exception handler only - asyncio_log.exception('Fatal error for %s', self) + logger.exception('Fatal error for %s', self) self._force_close(exc) def _force_close(self, exc): @@ -444,7 +444,7 @@ if self._conn_lost: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: - asyncio_log.warning('socket.send() raised exception.') + logger.warning('socket.send() raised exception.') self._conn_lost += 1 return @@ -667,7 +667,7 @@ if self._conn_lost: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: - asyncio_log.warning('socket.send() raised exception.') + logger.warning('socket.send() raised exception.') self._conn_lost += 1 return @@ -714,7 +714,7 @@ if self._conn_lost and self._address: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: - asyncio_log.warning('socket.send() raised exception.') + logger.warning('socket.send() raised exception.') self._conn_lost += 1 return diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -16,7 +16,7 @@ from . import events from . import futures -from .log import asyncio_log +from .log import logger # If you set _DEBUG to true, @coroutine will wrap the resulting # generator objects in a CoroWrapper instance (defined below). That @@ -62,8 +62,8 @@ code = func.__code__ filename = code.co_filename lineno = code.co_firstlineno - asyncio_log.error('Coroutine %r defined at %s:%s was never yielded from', - func.__name__, filename, lineno) + logger.error('Coroutine %r defined at %s:%s was never yielded from', + func.__name__, filename, lineno) def coroutine(func): diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -18,7 +18,7 @@ from . import selector_events from . import tasks from . import transports -from .log import asyncio_log +from .log import logger __all__ = ['SelectorEventLoop', 'STDIN', 'STDOUT', 'STDERR'] @@ -79,7 +79,7 @@ try: signal.set_wakeup_fd(-1) except ValueError as nexc: - asyncio_log.info('set_wakeup_fd(-1) failed: %s', nexc) + logger.info('set_wakeup_fd(-1) failed: %s', nexc) if exc.errno == errno.EINVAL: raise RuntimeError('sig {} cannot be caught'.format(sig)) @@ -124,7 +124,7 @@ try: signal.set_wakeup_fd(-1) except ValueError as exc: - asyncio_log.info('set_wakeup_fd(-1) failed: %s', exc) + logger.info('set_wakeup_fd(-1) failed: %s', exc) return True @@ -185,7 +185,7 @@ if transp is not None: transp._process_exited(returncode) except Exception: - asyncio_log.exception('Unknown exception in SIGCHLD handler') + logger.exception('Unknown exception in SIGCHLD handler') def _subprocess_closed(self, transport): pid = transport.get_pid() @@ -244,7 +244,7 @@ def _fatal_error(self, exc): # should be called by exception handler only - asyncio_log.exception('Fatal error for %s', self) + logger.exception('Fatal error for %s', self) self._close(exc) def _close(self, exc): @@ -294,8 +294,8 @@ if self._conn_lost or self._closing: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: - asyncio_log.warning('pipe closed by peer or ' - 'os.write(pipe, data) raised exception.') + logger.warning('pipe closed by peer or ' + 'os.write(pipe, data) raised exception.') self._conn_lost += 1 return @@ -369,7 +369,7 @@ def _fatal_error(self, exc): # should be called by exception handler only - asyncio_log.exception('Fatal error for %s', self) + logger.exception('Fatal error for %s', self) self._close(exc) def _close(self, exc=None): diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -11,7 +11,7 @@ from . import selector_events from . import tasks from . import windows_utils -from .log import asyncio_log +from .log import logger try: import _overlapped @@ -139,7 +139,7 @@ f = self._proactor.accept_pipe(pipe) except OSError: if pipe and pipe.fileno() != -1: - asyncio_log.exception('Pipe accept failed') + logger.exception('Pipe accept failed') pipe.close() except futures.CancelledError: if pipe: @@ -367,7 +367,7 @@ while self._cache: if not self._poll(1): - asyncio_log.debug('taking long time to close proactor') + logger.debug('taking long time to close proactor') self._results = [] if self._iocp is not None: diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -183,7 +183,7 @@ self.assertTrue(self.loop._process_events.called) @unittest.mock.patch('asyncio.base_events.time') - @unittest.mock.patch('asyncio.base_events.asyncio_log') + @unittest.mock.patch('asyncio.base_events.logger') def test__run_once_logging(self, m_logging, m_time): # Log to INFO level if timeout > 1.0 sec. idx = -1 @@ -579,7 +579,7 @@ self.loop._accept_connection(MyProto, sock) self.assertFalse(sock.close.called) - @unittest.mock.patch('asyncio.selector_events.asyncio_log') + @unittest.mock.patch('asyncio.selector_events.logger') def test_accept_connection_exception(self, m_log): sock = unittest.mock.Mock() sock.fileno.return_value = 10 diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1320,7 +1320,7 @@ self.assertRaises( AssertionError, events.make_handle, h1, ()) - @unittest.mock.patch('asyncio.events.asyncio_log') + @unittest.mock.patch('asyncio.events.logger') def test_callback_with_exception(self, log): def callback(): raise ValueError() diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -170,20 +170,20 @@ self.assertRaises(AssertionError, test) fut.cancel() - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_abandoned(self, m_log): fut = futures.Future(loop=self.loop) del fut self.assertFalse(m_log.error.called) - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_result_unretrieved(self, m_log): fut = futures.Future(loop=self.loop) fut.set_result(42) del fut self.assertFalse(m_log.error.called) - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_result_retrieved(self, m_log): fut = futures.Future(loop=self.loop) fut.set_result(42) @@ -191,7 +191,7 @@ del fut self.assertFalse(m_log.error.called) - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_exception_unretrieved(self, m_log): fut = futures.Future(loop=self.loop) fut.set_exception(RuntimeError('boom')) @@ -199,7 +199,7 @@ test_utils.run_briefly(self.loop) self.assertTrue(m_log.error.called) - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_exception_retrieved(self, m_log): fut = futures.Future(loop=self.loop) fut.set_exception(RuntimeError('boom')) @@ -207,7 +207,7 @@ del fut self.assertFalse(m_log.error.called) - @unittest.mock.patch('asyncio.futures.asyncio_log') + @unittest.mock.patch('asyncio.futures.logger') def test_tb_logger_exception_result_retrieved(self, m_log): fut = futures.Future(loop=self.loop) fut.set_exception(RuntimeError('boom')) diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -135,7 +135,7 @@ self.loop._proactor.send.return_value.add_done_callback.\ assert_called_with(tr._loop_writing) - @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + @unittest.mock.patch('asyncio.proactor_events.logger') def test_loop_writing_err(self, m_log): err = self.loop._proactor.send.side_effect = OSError() tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) @@ -207,7 +207,7 @@ test_utils.run_briefly(self.loop) self.assertFalse(self.protocol.connection_lost.called) - @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + @unittest.mock.patch('asyncio.proactor_events.logger') def test_fatal_error(self, m_logging): tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol) tr._force_close = unittest.mock.Mock() @@ -432,7 +432,7 @@ def test_process_events(self): self.loop._process_events([]) - @unittest.mock.patch('asyncio.proactor_events.asyncio_log') + @unittest.mock.patch('asyncio.proactor_events.logger') def test_create_server(self, m_log): pf = unittest.mock.Mock() call_soon = self.loop.call_soon = unittest.mock.Mock() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -626,7 +626,7 @@ self.assertFalse(self.loop.readers) self.assertEqual(1, self.loop.remove_reader_count[7]) - @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('asyncio.log.logger.exception') def test_fatal_error(self, m_exc): exc = OSError() tr = _SelectorTransport(self.loop, self.sock, self.protocol, None) @@ -823,7 +823,7 @@ self.loop.assert_writer(7, transport._write_ready) self.assertEqual(collections.deque([b'data']), transport._buffer) - @unittest.mock.patch('asyncio.selector_events.asyncio_log') + @unittest.mock.patch('asyncio.selector_events.logger') def test_write_exception(self, m_log): err = self.sock.send.side_effect = OSError() @@ -937,7 +937,7 @@ transport._write_ready() transport._fatal_error.assert_called_with(err) - @unittest.mock.patch('asyncio.selector_events.asyncio_log') + @unittest.mock.patch('asyncio.selector_events.logger') def test_write_ready_exception_and_close(self, m_log): self.sock.send.side_effect = OSError() remove_writer = self.loop.remove_writer = unittest.mock.Mock() @@ -1072,7 +1072,7 @@ transport.write(b'data') self.assertEqual(transport._conn_lost, 2) - @unittest.mock.patch('asyncio.selector_events.asyncio_log') + @unittest.mock.patch('asyncio.selector_events.logger') def test_write_exception(self, m_log): transport = self._make_one() transport._conn_lost = 1 @@ -1325,7 +1325,7 @@ self.assertEqual( [(b'data', ('0.0.0.0', 12345))], list(transport._buffer)) - @unittest.mock.patch('asyncio.selector_events.asyncio_log') + @unittest.mock.patch('asyncio.selector_events.logger') def test_sendto_exception(self, m_log): data = b'data' err = self.sock.sendto.side_effect = OSError() @@ -1475,7 +1475,7 @@ self.assertTrue(transport._fatal_error.called) - @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('asyncio.log.logger.exception') def test_fatal_error_connected(self, m_exc): transport = _SelectorDatagramTransport( self.loop, self.sock, self.protocol, ('0.0.0.0', 1)) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -87,7 +87,7 @@ signal.SIGINT, lambda: True) @unittest.mock.patch('asyncio.unix_events.signal') - @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('asyncio.unix_events.logger') def test_add_signal_handler_install_error2(self, m_logging, m_signal): m_signal.NSIG = signal.NSIG @@ -104,7 +104,7 @@ self.assertEqual(1, m_signal.set_wakeup_fd.call_count) @unittest.mock.patch('asyncio.unix_events.signal') - @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('asyncio.unix_events.logger') def test_add_signal_handler_install_error3(self, m_logging, m_signal): class Err(OSError): errno = errno.EINVAL @@ -149,7 +149,7 @@ m_signal.signal.call_args[0]) @unittest.mock.patch('asyncio.unix_events.signal') - @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('asyncio.unix_events.logger') def test_remove_signal_handler_cleanup_error(self, m_logging, m_signal): m_signal.NSIG = signal.NSIG self.loop.add_signal_handler(signal.SIGHUP, lambda: True) @@ -270,7 +270,7 @@ self.assertFalse(m_WEXITSTATUS.called) self.assertFalse(m_WTERMSIG.called) - @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('asyncio.unix_events.logger') @unittest.mock.patch('os.WTERMSIG') @unittest.mock.patch('os.WEXITSTATUS') @unittest.mock.patch('os.WIFSIGNALED') @@ -360,7 +360,7 @@ test_utils.run_briefly(self.loop) self.assertFalse(self.protocol.data_received.called) - @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('asyncio.log.logger.exception') @unittest.mock.patch('os.read') def test__read_ready_error(self, m_read, m_logexc): tr = unix_events._UnixReadPipeTransport( @@ -550,7 +550,7 @@ self.loop.assert_writer(5, tr._write_ready) self.assertEqual([b'data'], tr._buffer) - @unittest.mock.patch('asyncio.unix_events.asyncio_log') + @unittest.mock.patch('asyncio.unix_events.logger') @unittest.mock.patch('os.write') def test_write_err(self, m_write, m_log): tr = unix_events._UnixWritePipeTransport( @@ -648,7 +648,7 @@ self.loop.assert_writer(5, tr._write_ready) self.assertEqual([b'data'], tr._buffer) - @unittest.mock.patch('asyncio.log.asyncio_log.exception') + @unittest.mock.patch('asyncio.log.logger.exception') @unittest.mock.patch('os.write') def test__write_ready_err(self, m_write, m_logexc): tr = unix_events._UnixWritePipeTransport( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 03:09:10 2013 From: python-checkins at python.org (ned.deily) Date: Fri, 18 Oct 2013 03:09:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319262=3A_Install_?= =?utf-8?q?asyncio_and_test=5Fasyncio_directories=2E?= Message-ID: <3d18K25lnCz7Lk5@mail.python.org> http://hg.python.org/cpython/rev/30f33e6a04c1 changeset: 86417:30f33e6a04c1 user: Ned Deily date: Thu Oct 17 18:08:00 2013 -0700 summary: Issue #19262: Install asyncio and test_asyncio directories. files: Makefile.pre.in | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1085,6 +1085,8 @@ test/namespace_pkgs/project3/parent/child \ test/namespace_pkgs/module_and_namespace_package \ test/namespace_pkgs/module_and_namespace_package/a_test \ + asyncio \ + test/test_asyncio \ collections concurrent concurrent/futures encodings \ email email/mime test/test_email test/test_email/data \ html json test/test_json http dbm xmlrpc \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 04:34:19 2013 From: python-checkins at python.org (ethan.furman) Date: Fri, 18 Oct 2013 04:34:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Catching_up_on_NEWS_entrie?= =?utf-8?q?s=2E?= Message-ID: <3d1BCH6qwyz7Lks@mail.python.org> http://hg.python.org/cpython/rev/42f013173f48 changeset: 86418:42f013173f48 user: Ethan Furman date: Thu Oct 17 19:34:12 2013 -0700 summary: Catching up on NEWS entries. I'll make sure and include them in future patches. files: Misc/NEWS | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -58,6 +58,8 @@ - Issue #18891: Completed the new email package (provisional) API additions by adding new classes EmailMessage, MIMEPart, and ContentManager. +- Issue #18281: Unused stat constants removed from `tarfile`. + - Issue #18468: The re.split, re.findall, and re.sub functions and the group() and groups() methods of match object now always return a string or a bytes object. @@ -183,6 +185,9 @@ Library ------- +- Issue #18929: `inspect.classify_class_attrs()` now correctly finds class + attributes returned by `dir()` that are located in the metaclass. + - Issue #18950: Fix miscellaneous bugs in the sunau module. Au_read.readframes() now updates current file position and reads correct number of frames from multichannel stream. Au_write.writeframesraw() now @@ -296,6 +301,9 @@ - Issue #18942: sys._debugmallocstats() output was damaged on Windows. +- Issue #18780: %-formatting now prints value instead of str for + int subclasses when using %d, %i, and %u codes. + - Issue #18571: Implementation of the PEP 446: file descriptors and file handles are now created non-inheritable; add functions os.get/set_inheritable(), os.get/set_handle_inheritable() and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 09:27:45 2013 From: python-checkins at python.org (ethan.furman) Date: Fri, 18 Oct 2013 09:27:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319030=3A_inspect?= =?utf-8?q?=2Egetmembers_and_inspect=2Eclassify=5Fclass=5Fattrs?= Message-ID: <3d1Jjs442Zz7LjT@mail.python.org> http://hg.python.org/cpython/rev/39b06c3fbe2e changeset: 86419:39b06c3fbe2e user: Ethan Furman date: Fri Oct 18 00:27:39 2013 -0700 summary: Close #19030: inspect.getmembers and inspect.classify_class_attrs Order of search is now: 1. Try getattr 2. If that throws an exception, check __dict__ directly 3. If still not found, walk the mro looking for the eldest class that has the attribute (e.g. things returned by __getattr__) 4. If none of that works (e.g. due to a buggy __dir__, __getattr__, etc. method or missing __slot__ attribute), ignore the attribute entirely. files: Doc/library/inspect.rst | 6 +- Lib/inspect.py | 57 ++++++++------ Lib/test/test_inspect.py | 100 ++++++++++++++++++++++++-- Lib/types.py | 2 +- Misc/NEWS | 5 + 5 files changed, 131 insertions(+), 39 deletions(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -173,9 +173,9 @@ .. note:: - :func:`getmembers` will only return metaclass attributes when the - argument is a class and those attributes have been listed in a custom - :meth:`__dir__`. + :func:`getmembers` will only return class attributes defined in the + metaclass when the argument is a class and those attributes have been + listed in the metaclass' custom :meth:`__dir__`. .. function:: getmoduleinfo(path) diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -280,18 +280,22 @@ except AttributeError: pass for key in names: - # First try to get the value via __dict__. Some descriptors don't - # like calling their __get__ (see bug #1785). - for base in mro: - if key in base.__dict__ and key not in processed: - # handle the normal case first; if duplicate entries exist - # they will be handled second - value = base.__dict__[key] - break - else: - try: - value = getattr(object, key) - except AttributeError: + # First try to get the value via getattr. Some descriptors don't + # like calling their __get__ (see bug #1785), so fall back to + # looking in the __dict__. + try: + value = getattr(object, key) + # handle the duplicate key + if key in processed: + raise AttributeError + except AttributeError: + for base in mro: + if key in base.__dict__: + value = base.__dict__[key] + break + else: + # could be a (currently) missing slot member, or a buggy + # __dir__; discard and move on continue if not predicate or predicate(value): results.append((key, value)) @@ -336,7 +340,7 @@ # add any virtual attributes to the list of names # this may result in duplicate entries if, for example, a virtual # attribute with the same name as a member property exists - for base in cls.__bases__: + for base in mro: for k, v in base.__dict__.items(): if isinstance(v, types.DynamicClassAttribute): names.append(k) @@ -356,36 +360,43 @@ homecls = None get_obj = sentinel dict_obj = sentinel - - if name not in processed: try: get_obj = getattr(cls, name) except Exception as exc: pass else: - homecls = getattr(get_obj, "__class__") homecls = getattr(get_obj, "__objclass__", homecls) if homecls not in possible_bases: # if the resulting object does not live somewhere in the - # mro, drop it and go with the dict_obj version only + # mro, drop it and search the mro manually homecls = None - get_obj = sentinel - + last_cls = None + last_obj = None + for srch_cls in ((cls,) + mro): + srch_obj = getattr(srch_cls, name, None) + if srch_obj is get_obj: + last_cls = srch_cls + last_obj = srch_obj + if last_cls is not None: + homecls = last_cls for base in possible_bases: if name in base.__dict__: dict_obj = base.__dict__[name] homecls = homecls or base break - + if homecls is None: + # unable to locate the attribute anywhere, most likely due to + # buggy custom __dir__; discard and move on + continue # Classify the object or its descriptor. if get_obj is not sentinel: obj = get_obj else: obj = dict_obj - if isinstance(obj, staticmethod): + if isinstance(dict_obj, staticmethod): kind = "static method" - elif isinstance(obj, classmethod): + elif isinstance(dict_obj, classmethod): kind = "class method" elif isinstance(obj, property): kind = "property" @@ -393,10 +404,8 @@ kind = "method" else: kind = "data" - result.append(Attribute(name, kind, homecls, obj)) processed.add(name) - return result # ----------------------------------------------------------- class helpers diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -126,7 +126,6 @@ def test_get_slot_members(self): class C(object): __slots__ = ("a", "b") - x = C() x.a = 42 members = dict(inspect.getmembers(x)) @@ -469,13 +468,13 @@ A broken data descriptor. See bug #1785. """ def __get__(*args): - raise AssertionError("should not __get__ data descriptors") + raise AttributeError("broken data descriptor") def __set__(*args): raise RuntimeError def __getattr__(*args): - raise AssertionError("should not __getattr__ data descriptors") + raise AttributeError("broken data descriptor") class _BrokenMethodDescriptor(object): @@ -483,10 +482,10 @@ A broken method descriptor. See bug #1785. """ def __get__(*args): - raise AssertionError("should not __get__ method descriptors") + raise AttributeError("broken method descriptor") def __getattr__(*args): - raise AssertionError("should not __getattr__ method descriptors") + raise AttributeError("broken method descriptor") # Helper for testing classify_class_attrs. @@ -656,13 +655,77 @@ if isinstance(builtin, type): inspect.classify_class_attrs(builtin) - def test_classify_VirtualAttribute(self): - class VA: + def test_classify_DynamicClassAttribute(self): + class Meta(type): + def __getattr__(self, name): + if name == 'ham': + return 'spam' + return super().__getattr__(name) + class VA(metaclass=Meta): @types.DynamicClassAttribute def ham(self): return 'eggs' - should_find = inspect.Attribute('ham', 'data', VA, VA.__dict__['ham']) - self.assertIn(should_find, inspect.classify_class_attrs(VA)) + should_find_dca = inspect.Attribute('ham', 'data', VA, VA.__dict__['ham']) + self.assertIn(should_find_dca, inspect.classify_class_attrs(VA)) + should_find_ga = inspect.Attribute('ham', 'data', VA, 'spam') + self.assertIn(should_find_ga, inspect.classify_class_attrs(VA)) + + def test_classify_VirtualAttribute(self): + class Meta(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'BOOM'] + def __getattr__(self, name): + if name =='BOOM': + return 42 + return super().__getattr(name) + class Class(metaclass=Meta): + pass + should_find = inspect.Attribute('BOOM', 'data', Class, 42) + self.assertIn(should_find, inspect.classify_class_attrs(Class)) + + def test_classify_VirtualAttribute_multi_classes(self): + class Meta1(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'one'] + def __getattr__(self, name): + if name =='one': + return 1 + return super().__getattr__(name) + class Meta2(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'two'] + def __getattr__(self, name): + if name =='two': + return 2 + return super().__getattr__(name) + class Meta3(Meta1, Meta2): + def __dir__(cls): + return list(sorted(set(['__class__', '__module__', '__name__', 'three'] + + Meta1.__dir__(cls) + Meta2.__dir__(cls)))) + def __getattr__(self, name): + if name =='three': + return 3 + return super().__getattr__(name) + class Class1(metaclass=Meta1): + pass + class Class2(Class1, metaclass=Meta3): + pass + + should_find1 = inspect.Attribute('one', 'data', Class1, 1) + should_find2 = inspect.Attribute('two', 'data', Class2, 2) + should_find3 = inspect.Attribute('three', 'data', Class2, 3) + cca = inspect.classify_class_attrs(Class2) + for sf in (should_find1, should_find2, should_find3): + self.assertIn(sf, cca) + + def test_classify_class_attrs_with_buggy_dir(self): + class M(type): + def __dir__(cls): + return ['__class__', '__name__', 'missing'] + class C(metaclass=M): + pass + attrs = [a[0] for a in inspect.classify_class_attrs(C)] + self.assertNotIn('missing', attrs) def test_getmembers_descriptors(self): class A(object): @@ -708,11 +771,26 @@ self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) def test_getmembers_VirtualAttribute(self): - class A: + class M(type): + def __getattr__(cls, name): + if name == 'eggs': + return 'scrambled' + return super().__getattr__(name) + class A(metaclass=M): @types.DynamicClassAttribute def eggs(self): return 'spam' - self.assertIn(('eggs', A.__dict__['eggs']), inspect.getmembers(A)) + self.assertIn(('eggs', 'scrambled'), inspect.getmembers(A)) + self.assertIn(('eggs', 'spam'), inspect.getmembers(A())) + + def test_getmembers_with_buggy_dir(self): + class M(type): + def __dir__(cls): + return ['__class__', '__name__', 'missing'] + class C(metaclass=M): + pass + attrs = [a[0] for a in inspect.getmembers(C)] + self.assertNotIn('missing', attrs) _global_ref = object() diff --git a/Lib/types.py b/Lib/types.py --- a/Lib/types.py +++ b/Lib/types.py @@ -117,7 +117,7 @@ self.fset = fset self.fdel = fdel # next two lines make DynamicClassAttribute act the same as property - self.__doc__ = doc or fget.__doc__ or self.__doc__ + self.__doc__ = doc or fget.__doc__ self.overwrite_doc = doc is None # support for abstract methods self.__isabstractmethod__ = bool(getattr(fget, '__isabstractmethod__', False)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -135,6 +135,11 @@ - Issue #4366: Fix building extensions on all platforms when --enable-shared is used. +- Issue #19030: Fixed `inspect.getmembers` and `inspect.classify_class_attrs` + to attempt activating descriptors before falling back to a __dict__ search + for faulty descriptors. `inspect.classify_class_attrs` no longer returns + Attributes whose home class is None. + C API ----- -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 18 09:31:49 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 18 Oct 2013 09:31:49 +0200 Subject: [Python-checkins] Daily reference leaks (30f33e6a04c1): sum=975756 Message-ID: results for 30f33e6a04c1 on branch "default" -------------------------------------------- test_unittest leaked [317, 317, 317] references, sum=951 test_unittest leaked [196, 197, 197] memory blocks, sum=590 test_doctest leaked [2232, 2232, 2232] references, sum=6696 test_doctest leaked [1667, 1669, 1669] memory blocks, sum=5005 test_argparse leaked [70935, 70935, 70935] references, sum=212805 test_argparse leaked [43489, 43491, 43491] memory blocks, sum=130471 test_asyncio leaked [2577, -2577, 0] references, sum=0 test_asyncio leaked [786, -1103, 2] memory blocks, sum=-315 test_cgitb leaked [90, 90, 90] references, sum=270 test_cgitb leaked [65, 65, 65] memory blocks, sum=195 test_cmd leaked [41, 41, 41] references, sum=123 test_cmd leaked [20, 20, 20] memory blocks, sum=60 test_cmd_line leaked [34, 34, 34] references, sum=102 test_cmd_line leaked [34, 34, 34] memory blocks, sum=102 test_cmd_line_script leaked [24, 24, 24] references, sum=72 test_cmd_line_script leaked [19, 19, 19] memory blocks, sum=57 test_compileall leaked [6, 6, 6] references, sum=18 test_compileall leaked [6, 6, 6] memory blocks, sum=18 test_configparser leaked [34560, 34560, 34560] references, sum=103680 test_configparser leaked [16778, 16780, 16780] memory blocks, sum=50338 test_contextlib leaked [10, 10, 10] references, sum=30 test_contextlib leaked [5, 5, 5] memory blocks, sum=15 test_ctypes leaked [137, 137, 137] references, sum=411 test_ctypes leaked [105, 105, 105] memory blocks, sum=315 test_decimal leaked [10, 10, 10] references, sum=30 test_decimal leaked [8, 8, 8] memory blocks, sum=24 test_difflib leaked [401, 401, 401] references, sum=1203 test_difflib leaked [267, 269, 269] memory blocks, sum=805 test_distutils leaked [533, 533, 533] references, sum=1599 test_distutils leaked [389, 391, 391] memory blocks, sum=1171 test_docxmlrpc leaked [60, 60, 60] references, sum=180 test_docxmlrpc leaked [60, 60, 60] memory blocks, sum=180 test_email leaked [4307, 4307, 4307] references, sum=12921 test_email leaked [2419, 2421, 2421] memory blocks, sum=7261 test_faulthandler leaked [111, 111, 111] references, sum=333 test_faulthandler leaked [98, 98, 98] memory blocks, sum=294 test_gc leaked [4, 4, 4] references, sum=12 test_gc leaked [4, 4, 4] memory blocks, sum=12 test_generators leaked [5, 5, 5] references, sum=15 test_generators leaked [4, 4, 4] memory blocks, sum=12 test_genexps leaked [5, 5, 5] references, sum=15 test_genexps leaked [4, 4, 4] memory blocks, sum=12 test_gettext leaked [134, 134, 134] references, sum=402 test_gettext leaked [128, 128, 128] memory blocks, sum=384 test_htmlparser leaked [2177, 2177, 2177] references, sum=6531 test_htmlparser leaked [40, 41, 41] memory blocks, sum=122 test_http_cookiejar leaked [2805, 2805, 2805] references, sum=8415 test_http_cookiejar leaked [1808, 1810, 1810] memory blocks, sum=5428 test_imp leaked [1, -1, 0] references, sum=0 test_import leaked [16, 16, 16] references, sum=48 test_import leaked [10, 10, 10] memory blocks, sum=30 test_inspect leaked [2, 2, 2] references, sum=6 test_inspect leaked [2, 2, 2] memory blocks, sum=6 test_json leaked [2553, 2553, 2553] references, sum=7659 test_json leaked [1323, 1325, 1325] memory blocks, sum=3973 test_keyword leaked [39, 39, 39] references, sum=117 test_keyword leaked [20, 20, 20] memory blocks, sum=60 test_lib2to3 leaked [57052, 57052, 57052] references, sum=171156 test_lib2to3 leaked [46298, 46300, 46300] memory blocks, sum=138898 test_listcomps leaked [10, 10, 10] references, sum=30 test_listcomps leaked [8, 8, 8] memory blocks, sum=24 test_locale leaked [43, 43, 43] references, sum=129 test_locale leaked [19, 19, 19] memory blocks, sum=57 test_logging leaked [706, 706, 706] references, sum=2118 test_logging leaked [362, 364, 364] memory blocks, sum=1090 test_mailbox leaked [46, 46, 46] references, sum=138 test_mailbox leaked [41, 41, 41] memory blocks, sum=123 test_multiprocessing_forkserver leaked [2, 2, 2] references, sum=6 test_multiprocessing_forkserver leaked [2, 2, 2] memory blocks, sum=6 test_multiprocessing_spawn leaked [2, 2, 2] references, sum=6 test_multiprocessing_spawn leaked [2, 2, 2] memory blocks, sum=6 test_netrc leaked [96, 96, 96] references, sum=288 test_netrc leaked [59, 59, 59] memory blocks, sum=177 test_nntplib leaked [1774, 1774, 1774] references, sum=5322 test_nntplib leaked [902, 904, 904] memory blocks, sum=2710 test_parser leaked [2, 2, 2] references, sum=6 test_parser leaked [2, 2, 2] memory blocks, sum=6 test_pep292 leaked [174, 174, 174] references, sum=522 test_pep292 leaked [107, 107, 107] memory blocks, sum=321 test_pkg leaked [57, 57, 57] references, sum=171 test_pkg leaked [31, 31, 31] memory blocks, sum=93 test_pydoc leaked [1804, 1804, 1804] references, sum=5412 test_pydoc leaked [684, 686, 686] memory blocks, sum=2056 test_re leaked [10539, 10539, 10539] references, sum=31617 test_re leaked [135, 136, 136] memory blocks, sum=407 test_regrtest leaked [5005, 5005, 5005] references, sum=15015 test_regrtest leaked [2704, 2706, 2706] memory blocks, sum=8116 test_robotparser leaked [4, 4, 4] references, sum=12 test_robotparser leaked [4, 4, 4] memory blocks, sum=12 test_setcomps leaked [10, 10, 10] references, sum=30 test_setcomps leaked [8, 8, 8] memory blocks, sum=24 test_site leaked [0, 2, 2] references, sum=4 test_site leaked [0, 2, 2] memory blocks, sum=4 test_smtplib leaked [65, 65, 65] references, sum=195 test_smtplib leaked [45, 45, 45] memory blocks, sum=135 test_ssl leaked [15, 15, 15] references, sum=45 test_ssl leaked [10, 10, 10] memory blocks, sum=30 test_strptime leaked [627, 627, 627] references, sum=1881 test_strptime leaked [433, 435, 435] memory blocks, sum=1303 test_subprocess leaked [138, 138, 138] references, sum=414 test_subprocess leaked [102, 102, 102] memory blocks, sum=306 test_sys leaked [22, 22, 22] references, sum=66 test_sys leaked [12, 12, 12] memory blocks, sum=36 test_textwrap leaked [192, 192, 192] references, sum=576 test_textwrap leaked [116, 116, 116] memory blocks, sum=348 test_threading leaked [2, 2, 2] references, sum=6 test_threading leaked [2, 2, 2] memory blocks, sum=6 test_time leaked [100, 100, 100] references, sum=300 test_time leaked [94, 94, 94] memory blocks, sum=282 test_timeit leaked [34, 34, 34] references, sum=102 test_timeit leaked [20, 20, 20] memory blocks, sum=60 test_tokenize leaked [5, 5, 5] references, sum=15 test_tokenize leaked [4, 4, 4] memory blocks, sum=12 test_tools leaked [398, 398, 398] references, sum=1194 test_tools leaked [214, 215, 215] memory blocks, sum=644 test_urllib leaked [16, 16, 16] references, sum=48 test_urllib leaked [11, 11, 11] memory blocks, sum=33 test_urllib2 leaked [333, 333, 333] references, sum=999 test_urllib2 leaked [216, 217, 217] memory blocks, sum=650 test_urllib2_localnet leaked [61, 61, 61] references, sum=183 test_urllib2_localnet leaked [41, 41, 41] memory blocks, sum=123 test_urllib2net leaked [38, 38, 38] references, sum=114 test_urllib2net leaked [29, 29, 29] memory blocks, sum=87 test_urllibnet leaked [38, 38, 38] references, sum=114 test_urllibnet leaked [24, 24, 24] memory blocks, sum=72 test_warnings leaked [4, 4, 4] references, sum=12 test_warnings leaked [4, 4, 4] memory blocks, sum=12 test_weakref leaked [2, 2, 2] references, sum=6 test_weakref leaked [2, 2, 2] memory blocks, sum=6 test_xmlrpc leaked [2, 2, 2] references, sum=6 test_zipfile leaked [8, 8, 8] references, sum=24 test_zipfile leaked [4, 4, 4] memory blocks, sum=12 test_zipimport_support leaked [1492, 1492, 1492] references, sum=4476 test_zipimport_support leaked [1146, 1148, 1148] memory blocks, sum=3442 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog6vlxGJ', '-x'] From python-checkins at python.org Fri Oct 18 09:45:53 2013 From: python-checkins at python.org (ethan.furman) Date: Fri, 18 Oct 2013 09:45:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319272=3A_slight_c?= =?utf-8?q?larification_of_pickle_docs_with_regard_to_lambda=2E?= Message-ID: <3d1K6n1LWrz7LjS@mail.python.org> http://hg.python.org/cpython/rev/d103ba56710e changeset: 86420:d103ba56710e user: Ethan Furman date: Fri Oct 18 00:45:40 2013 -0700 summary: Issue #19272: slight clarification of pickle docs with regard to lambda. files: Doc/library/pickle.rst | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -384,7 +384,8 @@ * tuples, lists, sets, and dictionaries containing only picklable objects -* functions defined at the top level of a module +* functions defined at the top level of a module (using :keyword:`def`, not + :keyword:`lambda`) * built-in functions defined at the top level of a module @@ -402,7 +403,7 @@ :func:`sys.setrecursionlimit`. Note that functions (built-in and user-defined) are pickled by "fully qualified" -name reference, not by value. This means that only the function name is +name reference, not by value. [#]_ This means that only the function name is pickled, along with the name of the module the function is defined in. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module @@ -850,6 +851,9 @@ .. [#] Don't confuse this with the :mod:`marshal` module +.. [#] This is why :keyword:`lambda` functions cannot be pickled: all + :keyword:`lambda` functions share the same name: ````. + .. [#] The exception raised will likely be an :exc:`ImportError` or an :exc:`AttributeError` but it could be something else. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 10:22:14 2013 From: python-checkins at python.org (ethan.furman) Date: Fri, 18 Oct 2013 10:22:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319030=3A__special?= =?utf-8?q?-cased_=5F=5Fdict=5F=5F_as_the_actual_dict_is_not_returned=2C_a?= Message-ID: <3d1Kwk72q3z7Lk2@mail.python.org> http://hg.python.org/cpython/rev/02c9d26d231f changeset: 86421:02c9d26d231f user: Ethan Furman date: Fri Oct 18 01:22:08 2013 -0700 summary: Issue #19030: special-cased __dict__ as the actual dict is not returned, a proxy is. files: Lib/inspect.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -362,6 +362,8 @@ dict_obj = sentinel if name not in processed: try: + if name == '__dict__': + raise Exception("__dict__ is special, we don't want the proxy") get_obj = getattr(cls, name) except Exception as exc: pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 10:57:12 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 10:57:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_markup=2E?= Message-ID: <3d1Lj40VDYz7Lk5@mail.python.org> http://hg.python.org/cpython/rev/62b5269f0ddb changeset: 86422:62b5269f0ddb branch: 2.7 parent: 86410:9d2605f24a86 user: Serhiy Storchaka date: Fri Oct 18 11:54:52 2013 +0300 summary: Fix markup. files: Doc/library/aifc.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\**samplesize* bytes, and a second's worth of audio consists of -*nchannels*\**samplesize*\**framerate* bytes. +*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of +*nchannels*\*\ *samplesize*\*\ *framerate* bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 10:57:13 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 10:57:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_markup=2E?= Message-ID: <3d1Lj529Rxz7LkS@mail.python.org> http://hg.python.org/cpython/rev/c8d57d0ee398 changeset: 86423:c8d57d0ee398 branch: 3.3 parent: 86411:a1a4a527c699 user: Serhiy Storchaka date: Fri Oct 18 11:55:02 2013 +0300 summary: Fix markup. files: Doc/library/aifc.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\**samplesize* bytes, and a second's worth of audio consists of -*nchannels*\**samplesize*\**framerate* bytes. +*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of +*nchannels*\*\ *samplesize*\*\ *framerate* bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 10:57:14 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 10:57:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Fix_markup=2E?= Message-ID: <3d1Lj63xVhz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/72837ba10a83 changeset: 86424:72837ba10a83 parent: 86421:02c9d26d231f parent: 86423:c8d57d0ee398 user: Serhiy Storchaka date: Fri Oct 18 11:55:30 2013 +0300 summary: Fix markup. files: Doc/library/aifc.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\**samplesize* bytes, and a second's worth of audio consists of -*nchannels*\**samplesize*\**framerate* bytes. +*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of +*nchannels*\*\ *samplesize*\*\ *framerate* bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 13:54:26 2013 From: python-checkins at python.org (victor.stinner) Date: Fri, 18 Oct 2013 13:54:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_remove_DisplayTop_?= =?utf-8?q?and_TakeSnapshot_classes=2C_and_tasks_and_metric?= Message-ID: <3d1QdZ4Zhvz7LjT@mail.python.org> http://hg.python.org/peps/rev/2c457e382f89 changeset: 5196:2c457e382f89 user: Victor Stinner date: Fri Oct 18 13:54:17 2013 +0200 summary: PEP 454: remove DisplayTop and TakeSnapshot classes, and tasks and metric functions Metric.format does not no list available formats, the format is now undefined (each tool can use its own format). files: pep-0454.txt | 634 ++++---------------------------------- 1 files changed, 77 insertions(+), 557 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -21,7 +21,7 @@ ========= Common debug tools tracing memory allocations record the C filename -and line number where the allocation occurs. Using such a tool to +and line number where the allocation occurs. Using such tools to analyze Python memory allocations does not help because most memory blocks are allocated in the same C function, in ``PyMem_Malloc()`` for example. @@ -46,8 +46,8 @@ set up a hook on Python memory allocators. A hook can inspect Python internals to retrieve Python tracebacks. -This PEP proposes to add a new ``tracemalloc`` module, as a debug -tool to trace memory blocks allocated by Python. The module provides the +This PEP proposes to add a new ``tracemalloc`` module, as a debug tool +to trace memory blocks allocated by Python. The module provides the following information: * Computed differences between two snapshots to detect memory leaks @@ -70,43 +70,18 @@ API === -To trace most memory blocks allocated by Python, the module should be -enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` -environment variable to ``1``, or by using ``-X tracemalloc`` command -line option. The ``tracemalloc.enable()`` function can also be called -to start tracing Python memory allocations. - -By default, a trace of an allocated memory block only stores one -frame. Use the ``set_traceback_limit()`` function to store additional -frames. - -Python memory blocks allocated in the ``tracemalloc`` module itself are -also traced by default. Use ``add_exclude_filter(tracemalloc.__file__)`` -to ignore these these memory allocations. - -At fork, the module is automatically disabled in the child process. - - Main Functions -------------- -``cancel_tasks()`` function: - - Cancel all scheduled tasks. - - See also the ``get_tasks()`` function. - - ``clear_traces()`` function: - Clear all traces and statistics on Python memory allocations, and - reset the ``get_arena_size()`` and ``get_traced_memory()`` - counters. + Clear traces and statistics on Python memory allocations, and reset + the ``get_traced_memory()`` counter. ``disable()`` function: - Stop tracing Python memory allocations and cancel scheduled tasks. + Stop tracing Python memory allocations. See also ``enable()`` and ``is_enabled()`` functions. @@ -133,9 +108,20 @@ See also the ``get_traces()`` function. -``get_tasks()`` function: +``get_traced_memory()`` function: - Get the list of scheduled tasks, list of ``Task`` instances. + Get the current size and maximum size of memory blocks traced by the + ``tracemalloc`` module as a tuple: ``(size: int, max_size: int)``. + + +``get_tracemalloc_memory()`` function: + + Get the memory usage in bytes of the ``tracemalloc`` module as a + tuple: ``(size: int, free: int)``. + + * *size*: total size of bytes allocated by the module, + including *free* bytes + * *free*: number of free bytes available to store data ``is_enabled()`` function: @@ -151,35 +137,31 @@ ``get_traceback_limit()`` function: - Get the maximum number of frames stored in the traceback of a - trace of a memory block. + Get the maximum number of frames stored in the traceback of a trace + of a memory block. Use the ``set_traceback_limit()`` function to change the limit. ``get_object_address(obj)`` function: - Get the address of the memory block of the specified Python - object. + Get the address of the main memory block of the specified Python object. A Python object can be composed by multiple memory blocks, the function only returns the address of the main memory block. - See also ``get_object_trace()`` and ``gc.get_referrers()`` - functions. + See also ``get_object_trace()`` and ``gc.get_referrers()`` functions. ``get_object_trace(obj)`` function: Get the trace of a Python object *obj* as a ``(size: int, - traceback)`` tuple where *traceback* is a tuple of ``(filename: - str, lineno: int)`` tuples, *filename* and *lineno* can be - ``None``. + traceback)`` tuple where *traceback* is a tuple of ``(filename: str, + lineno: int)`` tuples, *filename* and *lineno* can be ``None``. - The function only returns the trace of the main memory block of - the object. The *size* of the trace is smaller than the total - size of the object if the object is composed by more than one - memory block. + The function only returns the trace of the main memory block of the + object. The *size* of the trace is smaller than the total size of + the object if the object is composed by more than one memory block. Return ``None`` if the ``tracemalloc`` module did not trace the allocation of the object. @@ -204,23 +186,21 @@ ``get_traces()`` function: - Get all traces of Python memory allocations as a dictionary - ``{address (int): trace}`` where *trace* is a ``(size: int, - traceback)`` and *traceback* is a list of ``(filename: str, - lineno: int)``. *traceback* can be empty, *filename* and *lineno* - can be ``None``. + Get traces of Python memory allocations as a dictionary ``{address + (int): trace}`` where *trace* is a ``(size: int, traceback)`` and + *traceback* is a list of ``(filename: str, lineno: int)``. + *traceback* can be empty, *filename* and *lineno* can be None. - Return an empty dictionary if the ``tracemalloc`` module is - disabled. + Return an empty dictionary if the ``tracemalloc`` module is disabled. - See also ``get_object_trace()``, ``get_stats()`` and - ``get_trace()`` functions. + See also ``get_object_trace()``, ``get_stats()`` and ``get_trace()`` + functions. ``set_traceback_limit(nframe: int)`` function: - Set the maximum number of frames stored in the traceback of a - trace of a memory block. + Set the maximum number of frames stored in the traceback of a trace + of a memory block. Storing the traceback of each memory allocation has an important overhead on the memory usage. Use the ``get_tracemalloc_memory()`` @@ -239,30 +219,29 @@ ``Filter`` instance. All inclusive filters are applied at once, a memory allocation is - only ignored if no inclusive filter match its trace. A memory + only ignored if no inclusive filters match its trace. A memory allocation is ignored if at least one exclusive filter matchs its trace. The new filter is not applied on already collected traces. Use the - ``clear_traces()`` function to ensure that all traces match the - new filter. + ``clear_traces()`` function to ensure that all traces match the new + filter. ``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: Add an inclusive filter: helper for the ``add_filter()`` method - creating a ``Filter`` instance with the ``Filter.include`` - attribute set to ``True``. + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``True``. Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` - only includes memory blocks allocated by the ``tracemalloc`` - module. + only includes memory blocks allocated by the ``tracemalloc`` module. ``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: Add an exclusive filter: helper for the ``add_filter()`` method - creating a ``Filter`` instance with the ``Filter.include`` - attribute set to ``False``. + creating a ``Filter`` instance with the ``Filter.include`` attribute + set to ``False``. Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` ignores memory blocks allocated by the ``tracemalloc`` module. @@ -283,242 +262,14 @@ See also the ``clear_filters()`` function. -Metric Functions ----------------- - -The following functions can be used to add metrics to a snapshot, see -the ``Snapshot.add_metric()`` method. - -``get_arena_size()`` function: - - Get the size in bytes of traced arenas. - - See also the ``get_pymalloc_stats()`` function. - - -``get_process_memory()`` function: - - Get the memory usage of the current process as a ``(rss: int, vms: - int)`` tuple, *rss* is the "Resident Set Size" in bytes and *vms* is - the size of the virtual memory in bytes - - Return ``None`` if the platform is not supported. - - -``get_pymalloc_stats()`` function: - - Get statistics on the ``pymalloc`` allocator as a dictionary. - - +---------------------+-------------------------------------------------------+ - | Key | Description | - +=====================+=======================================================+ - | ``alignment`` | Alignment of addresses returned to the user. | - +---------------------+-------------------------------------------------------+ - | ``threshold`` | Small block threshold in bytes: pymalloc uses | - | | PyMem_RawMalloc() for allocation greater than | - | | threshold. | - +---------------------+-------------------------------------------------------+ - | ``nalloc`` | Number of times object malloc called | - +---------------------+-------------------------------------------------------+ - | ``arena_size`` | Arena size in bytes | - +---------------------+-------------------------------------------------------+ - | ``total_arenas`` | Number of calls to new_arena(): total number of | - | | allocated arenas, including released arenas | - +---------------------+-------------------------------------------------------+ - | ``max_arenas`` | Maximum number of arenas | - +---------------------+-------------------------------------------------------+ - | ``arenas`` | Number of arenas currently allocated | - +---------------------+-------------------------------------------------------+ - | ``allocated_bytes`` | Number of bytes in allocated blocks | - +---------------------+-------------------------------------------------------+ - | ``available_bytes`` | Number of bytes in available blocks in used pools | - +---------------------+-------------------------------------------------------+ - | ``pool_size`` | Pool size in bytes | - +---------------------+-------------------------------------------------------+ - | ``free_pools`` | Number of unused pools | - +---------------------+-------------------------------------------------------+ - | ``pool_headers`` | Number of bytes wasted in pool headers | - +---------------------+-------------------------------------------------------+ - | ``quantization`` | Number of bytes in used and full pools wasted due to | - | | quantization, i.e. the necessarily leftover space at | - | | the ends of used and full pools. | - +---------------------+-------------------------------------------------------+ - | ``arena_alignment`` | Number of bytes for arena alignment padding | - +---------------------+-------------------------------------------------------+ - - The function is not available if Python is compiled without - ``pymalloc``. - - See also the ``get_arena_size()`` and ``sys._debugmallocstats()`` - functions. - - -``get_traced_memory()`` function: - - Get the current size and maximum size of memory blocks traced by - the ``tracemalloc`` module as a tuple: ``(size: int, max_size: - int)``. - - -``get_tracemalloc_memory()`` function: - - Get the memory usage in bytes of the ``tracemalloc`` module as a - tuple: ``(size: int, free: int)``. - - * *size*: total size of bytes allocated by the module, - including *free* bytes - * *free*: number of free bytes available to store data - - -``get_unicode_interned()`` function: - - Get the size in bytes and the length of the dictionary of Unicode - interned strings as a ``(size: int, length: int)`` tuple. - - The size is the size of the dictionary, excluding the size of - strings. - - -DisplayTop ----------- - -``DisplayTop()`` class: - - Display the "top-n" biggest allocated memory blocks. - -``display(count=10, group_by="line", cumulative=False, file=None, callback=None)`` method: - - Take a snapshot and display the top *count* biggest allocated - memory blocks grouped by *group_by*. - - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the - newly created snapshot instance. Use the ``Snapshot.add_metric()`` - method to add new metric. - - Return the snapshot, a ``Snapshot`` instance. - -``display_snapshot(snapshot, count=10, group_by="line", cumulative=False, file=None)`` method: - - Display a snapshot of memory blocks allocated by Python, *snapshot* - is a ``Snapshot`` instance. - -``display_top_diff(top_diff, count=10, file=None)`` method: - - Display differences between two ``GroupedStats`` instances, - *top_diff* is a ``StatsDiff`` instance. - -``display_top_stats(top_stats, count=10, file=None)`` method: - - Display the top of allocated memory blocks grouped by the - ``GroupedStats.group_by`` attribute of *top_stats*, *top_stats* is - a ``GroupedStats`` instance. - -``average`` attribute: - - If ``True`` (default value), display the average size of memory - blocks. - -``color`` attribute: - - If ``True``, always use colors. If ``False``, never use colors. The - default value is ``None``: use colors if the *file* parameter is a - TTY device. - -``compare_to_previous`` attribute: - - If ``True`` (default value), compare to the previous snapshot. If - ``False``, compare to the first snapshot. - -``filename_parts`` attribute: - - Number of displayed filename parts (int, default: ``3``). Extra - parts are replaced with ``'...'``. - -``metrics`` attribute: - - If ``True`` (default value), display metrics: see - ``Snapshot.metrics``. - -``previous_top_stats`` attribute: - - Previous ``GroupedStats`` instance, or first ``GroupedStats`` - instance if ``compare_to_previous`` is ``False``, used to display - the differences between two snapshots. - -``size`` attribute: - - If ``True`` (default value), display the size of memory blocks. - - -DisplayTopTask --------------- - -``DisplayTopTask(count=10, group_by="line", cumulative=False, file=sys.stdout, callback=None)`` class: - - Task taking temporary snapshots and displaying the top *count* memory - allocations grouped by *group_by*. - - ``DisplayTopTask`` is based on the ``Task`` class and so inherit - all attributes and methods, especially: - - * ``Task.cancel()`` - * ``Task.schedule()`` - * ``Task.set_delay()`` - * ``Task.set_memory_threshold()`` - - Modify the ``display_top`` attribute to customize the display. - -``display()`` method: - - Take a snapshot and display the top ``count`` biggest allocated - memory blocks grouped by ``group_by`` using the ``display_top`` - attribute. - - Return the snapshot, a ``Snapshot`` instance. - -``callback`` attribute: - - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the - newly created snapshot instance. Use the ``Snapshot.add_metric()`` - method to add new metric. - -``count`` attribute: - - Maximum number of displayed memory blocks. - -``cumulative`` attribute: - - If ``True``, cumulate size and count of memory blocks of all frames - of each trace, not only the most recent frame. The default value is - ``False``. - - The option is ignored if the traceback limit is less than ``2``, see - the ``get_traceback_limit()`` function. - -``display_top`` attribute: - - Instance of ``DisplayTop``. - -``file`` attribute: - - The top is written into *file*. - -``group_by`` attribute: - - Determine how memory allocations are grouped: see - ``Snapshot.top_by()`` for the available values. - - Filter ------ ``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class: - Filter to select which memory allocations are traced. Filters can be - used to reduce the memory usage of the ``tracemalloc`` module, which - can be read using the ``get_tracemalloc_memory()`` function. + Filter to select which memory allocations are traced. Filters can be + used to reduce the memory usage of the ``tracemalloc`` module, which + can be read using the ``get_tracemalloc_memory()`` function. ``match(filename: str, lineno: int)`` method: @@ -527,8 +278,7 @@ ``match_filename(filename: str)`` method: - Return ``True`` if the filter matchs the filename, ``False`` - otherwise. + Return ``True`` if the filter matchs the filename, ``False`` otherwise. ``match_lineno(lineno: int)`` method: @@ -549,8 +299,7 @@ ``lineno``. If *include* is ``False``, ignore memory blocks allocated in a file - with a name matching filename :attr`pattern` at line number - ``lineno``. + with a name matching filename ``pattern`` at line number ``lineno``. ``lineno`` attribute: @@ -579,9 +328,11 @@ ``GroupedStats(timestamp: datetime.datetime, stats: dict, group_by: str, cumulative=False, metrics: dict=None)`` class: - Top of allocated memory blocks grouped by *group_by* as a dictionary. + Top of allocated memory blocks grouped by *group_by* as a + dictionary. - The ``Snapshot.top_by()`` method creates a ``GroupedStats`` instance. + The ``Snapshot.top_by()`` method creates a ``GroupedStats`` + instance. ``compare_to(old_stats: GroupedStats=None)`` method: @@ -589,7 +340,7 @@ ``StatsDiff`` instance. The ``StatsDiff.differences`` list is not sorted: call the - ``StatsDiff.sort`` method to sort the list. + ``StatsDiff.sort()`` method to sort the list. ``None`` values are replaced with an empty string for filenames or zero for line numbers, because ``str`` and ``int`` cannot be @@ -641,31 +392,15 @@ ``format`` attribute: - Format of the metric: - - * ``'int'``: a number - * ``'percent'``: percentage, ``1.0`` means ``100%`` - * ``'size'``: a size in bytes + Format of the metric (``str``). Snapshot -------- -``Snapshot(timestamp: datetime.datetime, pid: int, traces: dict=None, stats: dict=None, metrics: dict=None)`` class: +``Snapshot(timestamp: datetime.datetime, traces: dict=None, stats: dict=None)`` class: - Snapshot of traces and statistics on memory blocks allocated by - Python. - - Use ``TakeSnapshotTask`` to take regulary snapshots. - -``add_gc_metrics()`` method: - - Add a metric on garbage collector: - - * ``gc.objects``: total number of Python objects - - See the ``gc`` module. - + Snapshot of traces and statistics on memory blocks allocated by Python. ``add_metric(name: str, value: int, format: str)`` method: @@ -676,90 +411,21 @@ ``Snapshot.metrics``. -``add_process_memory_metrics()`` method: - - Add metrics on the process memory: - - * ``process_memory.rss``: Resident Set Size - * ``process_memory.vms``: Virtual Memory Size - - These metrics are only available if the ``get_process_memory()`` - function is available on the platform. - - -``add_pymalloc_metrics()`` method: - - Add metrics on the Python memory allocator (``pymalloc``): - - * ``pymalloc.blocks``: number of allocated memory blocks - * ``pymalloc.size``: size of ``pymalloc`` arenas - * ``pymalloc.max_size``: maximum size of ``pymalloc`` arenas - * ``pymalloc.allocated``: number of allocated bytes - * ``pymalloc.free``: number of free bytes - * ``pymalloc.fragmentation``: fragmentation percentage of the arenas - - These metrics are only available if Python is compiled in debug - mode, except ``pymalloc.blocks`` which is always available. - - -``add_tracemalloc_metrics()`` method: - - Add metrics on the ``tracemalloc`` module: - - * ``tracemalloc.traced.size``: size of memory blocks traced by the - ``tracemalloc`` module - * ``tracemalloc.traced.max_size``: maximum size of memory blocks - traced by the ``tracemalloc`` module - * ``tracemalloc.traces``: number of traces of Python memory blocks - * ``tracemalloc.module.size``: total size of bytes allocated by the - ``tracemalloc`` module, including free bytes - * ``tracemalloc.module.free``: number of free bytes available for - the ``tracemalloc`` module - * ``tracemalloc.module.fragmentation``: percentage of fragmentation - of the memory allocated by the ``tracemalloc`` module - * ``tracemalloc.arena_size``: size of traced arenas - - ``tracemalloc.traces`` metric is only present if the snapshot was - created with traces. - - -``add_unicode_metrics()`` method: - - Add metrics on the Unicode interned strings: - - * ``unicode_interned.size``: size of the dictionary, excluding size - of strings - * ``unicode_interned.len``: length of the dictionary - - ``apply_filters(filters)`` method: Apply filters on the ``traces`` and ``stats`` dictionaries, *filters* is a list of ``Filter`` instances. -``create(traces=False, metrics=True)`` classmethod: +``create(traces=False)`` classmethod: - Take a snapshot of traces and/or statistics of allocated memory - blocks. + Take a snapshot of traces and/or statistics of allocated memory blocks. - If *traces* is ``True``, ``get_traces`` is called and its result is - stored in the ``Snapshot.traces`` attribute. This attribute contains - more information than ``Snapshot.stats`` and uses more memory and - more disk space. If *traces* is ``False``, ``Snapshot.traces`` is - set to ``None``. - - If *metrics* is ``True``, fill ``Snapshot.metrics`` with metrics - using the following methods: - - * ``add_gc_metrics`` - * ``add_process_memory_metrics`` - * ``add_pymalloc_metrics`` - * ``add_tracemalloc_metrics`` - * ``add_unicode_metrics`` - - If *metrics* is ``False``, ``Snapshot.metrics`` is set to an empty - dictionary. + If *traces* is ``True``, ``get_traces()`` is called and its result + is stored in the ``Snapshot.traces`` attribute. This attribute + contains more information than ``Snapshot.stats`` and uses more + memory and more disk space. If *traces* is ``False``, + ``Snapshot.traces`` is set to ``None``. Tracebacks of traces are limited to ``traceback_limit`` frames. Call ``set_traceback_limit()`` before calling ``Snapshot.create()`` to @@ -786,13 +452,17 @@ Compute top statistics grouped by *group_by* as a ``GroupedStats`` instance: - ===================== ======================== ============== + ===================== ======================== ================================ group_by description key type - ===================== ======================== ============== + ===================== ======================== ================================ ``'filename'`` filename ``str`` - ``'line'`` filename and line number ``(str, int)`` + ``'line'`` filename and line number ``(filename: str, lineno: int)`` ``'address'`` memory block address ``int`` - ===================== ======================== ============== + ``'traceback'`` traceback ``(address: int, traceback)`` + ===================== ======================== ================================ + + The ``traceback`` type is a tuple of ``(filename: str, lineno: + int)`` tuples, *filename* and *lineno* can be ``None``. If *cumulative* is ``True``, cumulate size and count of memory blocks of all frames of the traceback of a trace, not only the most @@ -802,7 +472,7 @@ ``write(filename)`` method: - Write the snapshot into a file. + Write the snapshot into a file. ``metrics`` attribute: @@ -810,11 +480,6 @@ Dictionary storing metrics read when the snapshot was created: ``{name (str): metric}`` where *metric* type is ``Metric``. -``pid`` attribute: - - Identifier of the process which created the snapshot, result of - ``os.getpid()``. - ``stats`` attribute: Statistics on traced Python memory, result of the ``get_stats()`` @@ -843,7 +508,7 @@ Differences between two ``GroupedStats`` instances. - The ``GroupedStats.compare_to`` method creates a ``StatsDiff`` + The ``GroupedStats.compare_to()`` method creates a ``StatsDiff`` instance. ``sort()`` method: @@ -857,8 +522,8 @@ Differences between ``old_stats`` and ``new_stats`` as a list of ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, *size*, *count_diff* and *count* are ``int``. The key type depends - on the ``GroupedStats.group_by`` attribute of ``new_stats``: see - the ``Snapshot.top_by()`` method. + on the ``GroupedStats.group_by`` attribute of ``new_stats``: see the + ``Snapshot.top_by()`` method. ``old_stats`` attribute: @@ -869,151 +534,6 @@ New ``GroupedStats`` instance. -Task ----- - -``Task(func, *args, **kw)`` class: - - Task calling ``func(*args, **kw)``. When scheduled, the task is - called when the traced memory is increased or decreased by more - than *threshold* bytes, or after *delay* seconds. - -``call()`` method: - - Call ``func(*args, **kw)`` and return the result. - - -``cancel()`` method: - - Cancel the task. - - Do nothing if the task is not scheduled. - - -``get_delay()`` method: - - Get the delay in seconds. If the delay is ``None``, the timer is - disabled. - - -``get_memory_threshold()`` method: - - Get the threshold of the traced memory. When scheduled, the task - is called when the traced memory is increased or decreased by more - than *threshold* bytes. The memory threshold is disabled if - *threshold* is ``None``. - - See also the ``set_memory_threshold()`` method and the - ``get_traced_memory()`` function. - - -``schedule(repeat: int=None)`` method: - - Schedule the task *repeat* times. If *repeat* is ``None``, the - task is rescheduled after each call until it is cancelled. - - If the method is called twice, the task is rescheduled with the - new *repeat* parameter. - - The task must have a memory threshold or a delay: see - ``set_delay()`` and ``set_memory_threshold()`` methods. The - ``tracemalloc`` must be enabled to schedule a task: see the - ``enable`` function. - - The task is cancelled if the ``call()`` method raises an - exception. The task can be cancelled using the ``cancel()`` - method or the ``cancel_tasks()`` function. - - -``set_delay(seconds: int)`` method: - - Set the delay in seconds before the task will be called. Set the - delay to ``None`` to disable the timer. - - The timer is based on the Python memory allocator, it is not real - time. The task is called after at least *delay* seconds, it is - not called exactly after *delay* seconds if no Python memory - allocation occurred. The timer has a resolution of 1 second. - - The task is rescheduled if it was scheduled. - - -``set_memory_threshold(size: int)`` method: - - Set the threshold of the traced memory. When scheduled, the task - is called when the traced memory is increased or decreased by more - than *threshold* bytes. Set the threshold to ``None`` to disable - it. - - The task is rescheduled if it was scheduled. - - See also the ``get_memory_threshold()`` method and the - ``get_traced_memory()`` function. - - -``func`` attribute: - - Function, callable object. - -``func_args`` attribute: - - Function arguments, ``tuple``. - -``func_kwargs`` attribute: - - Function keyword arguments, ``dict``. It can be ``None``. - - -TakeSnapshotTask ----------------- - -``TakeSnapshotTask(filename_template: str="tracemalloc-$counter.pickle", traces: bool=False, metrics: bool=True, callback: callable=None)`` class: - - Task taking snapshots of Python memory allocations and writing them - into files. - - ``TakeSnapshotTask`` is based on the ``Task`` class and so inherit - all attributes and methods, especially: - - * ``Task.cancel()`` - * ``Task.schedule()`` - * ``Task.set_delay()`` - * ``Task.set_memory_threshold()`` - -``take_snapshot()`` method: - - Take a snapshot and write it into a file. Return ``(snapshot, - filename)`` where *snapshot* is a ``Snapshot`` instance and - filename type is ``str``. - -``callback`` attribute: - - *callback* is an optional callable object which can be used to add - metrics to a snapshot. It is called with only one parameter: the - newly created snapshot instance. Use the ``Snapshot.add_metric()`` - method to add new metric. - -``filename_template`` attribute: - - Template to create a filename. The template supports the following - variables: - - * ``$pid``: identifier of the current process - * ``$timestamp``: current date and time - * ``$counter``: counter starting at 1 and incremented at each - snapshot, formatted as 4 decimal digits - - The default template is ``'tracemalloc-$counter.pickle'``. - -``metrics`` attribute: - - Parameter passed to the ``Snapshot.create()`` function. - -``traces`` attribute: - - Parameter passed to the ``Snapshot.create()`` function. - - Links ===== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 18 14:40:21 2013 From: python-checkins at python.org (nick.coghlan) Date: Fri, 18 Oct 2013 14:40:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319284=3A_Handle_-?= =?utf-8?q?R_properly_in_flag_helper?= Message-ID: <3d1RfY4lqmz7LjW@mail.python.org> http://hg.python.org/cpython/rev/0ba7280545fe changeset: 86425:0ba7280545fe user: Nick Coghlan date: Fri Oct 18 22:39:50 2013 +1000 summary: Close #19284: Handle -R properly in flag helper Previously, the -R option would be specified multiple times if PYTHONHASHSEED was set. files: Lib/subprocess.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -506,6 +506,8 @@ for flag, opt in flag_opt_map.items(): v = getattr(sys.flags, flag) if v > 0: + if flag == 'hash_randomization': + v = 1 # Handle specification of an exact seed args.append('-' + opt * v) for opt in sys.warnoptions: args.append('-W' + opt) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 15:13:18 2013 From: python-checkins at python.org (nick.coghlan) Date: Fri, 18 Oct 2013 15:13:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316129=3A_Py=5FSet?= =?utf-8?q?StandardStreamEncoding_cleanups?= Message-ID: <3d1SNZ6zPQzPb6@mail.python.org> http://hg.python.org/cpython/rev/12d7b6171b28 changeset: 86426:12d7b6171b28 user: Nick Coghlan date: Fri Oct 18 23:11:47 2013 +1000 summary: Issue #16129: Py_SetStandardStreamEncoding cleanups - don't call PyErr_NoMemory with interpreter is not initialised - note that it's OK to call _PyMem_RawStrDup here - don't include this in the limited API - capitalise "IO" - be explicit that a non-zero return indicates an error - include versionadded marker in docs files: Doc/c-api/init.rst | 13 ++++++++----- Include/pythonrun.h | 5 +++++ Python/pythonrun.c | 13 +++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -93,12 +93,12 @@ single: main() triple: stdin; stdout; sdterr - This function should be called before :c:func:`Py_Initialize`. It - specifies which encoding and error handling to use with standard io, - with the same meanings as in :func:`str.encode`. + This function should be called before :c:func:`Py_Initialize`, if it is + called at all. It specifies which encoding and error handling to use + with standard IO, with the same meanings as in :func:`str.encode`. It overrides :envvar:`PYTHONIOENCODING` values, and allows embedding code - to control io encoding when the environment variable does not work. + to control IO encoding when the environment variable does not work. ``encoding`` and/or ``errors`` may be NULL to use :envvar:`PYTHONIOENCODING` and/or default values (depending on other @@ -110,7 +110,10 @@ If :c:func:`Py_Finalize` is called, this function will need to be called again in order to affect subsequent calls to :c:func:`Py_Initialize`. - Returns 0 if successful. + Returns 0 if successful, a nonzero value on error (e.g. calling after the + interpreter has already been initialized). + + .. versionadded:: 3.4 .. c:function:: void Py_SetProgramName(wchar_t *name) diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -28,8 +28,13 @@ PyAPI_FUNC(void) Py_SetPythonHome(wchar_t *); PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); +#ifndef Py_LIMITED_API +/* Only used by applications that embed the interpreter and need to + * override the standard encoding determination mechanism + */ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, const char *errors); +#endif PyAPI_FUNC(void) Py_Initialize(void); PyAPI_FUNC(void) Py_InitializeEx(int); diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -148,11 +148,17 @@ /* This is too late to have any effect */ return -1; } + /* Can't call PyErr_NoMemory() on errors, as Python hasn't been + * initialised yet. + * + * However, the raw memory allocators are initialised appropriately + * as C static variables, so _PyMem_RawStrdup is OK even though + * Py_Initialize hasn't been called yet. + */ if (encoding) { _Py_StandardStreamEncoding = _PyMem_RawStrdup(encoding); if (!_Py_StandardStreamEncoding) { - PyErr_NoMemory(); - return -1; + return -2; } } if (errors) { @@ -161,8 +167,7 @@ if (_Py_StandardStreamEncoding) { PyMem_RawFree(_Py_StandardStreamEncoding); } - PyErr_NoMemory(); - return -1; + return -3; } } return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 15:44:20 2013 From: python-checkins at python.org (richard.oudkerk) Date: Fri, 18 Oct 2013 15:44:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_test=5Fsigterm=28?= =?utf-8?b?KS4=?= Message-ID: <3d1T4N07DJz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/6bf7a6387c30 changeset: 86427:6bf7a6387c30 user: Richard Oudkerk date: Fri Oct 18 14:42:56 2013 +0100 summary: Remove test_sigterm(). files: Lib/test/_test_multiprocessing.py | 41 ------------------- 1 files changed, 0 insertions(+), 41 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -273,11 +273,7 @@ @classmethod def _test_terminate(cls): - print('signal.getsignal(SIGTERM) =', - signal.getsignal(signal.SIGTERM), file=sys.stderr) - print('starting sleep', file=sys.stderr) time.sleep(100) - print('finished sleep', file=sys.stderr) def test_terminate(self): if self.TYPE == 'threads': @@ -315,10 +311,6 @@ try: signal.alarm(10) self.assertEqual(join(), None) - except RuntimeError: - print('os.waitpid() =', - os.waitpid(p.pid, os.WNOHANG), file=sys.stderr) - raise finally: signal.alarm(0) signal.signal(signal.SIGALRM, old_handler) @@ -335,39 +327,6 @@ # XXX sometimes get p.exitcode == 0 on Windows ... #self.assertEqual(p.exitcode, -signal.SIGTERM) - @unittest.skipIf(WIN32, 'Unix only') - def test_sigterm(self): - # A test for the Gentoo build bot which does not directly use - # multiprocessing. Start and terminate child processes. - if self.TYPE != 'processes': - return - for i in range(10): - pid = os.fork() - if pid == 0: - try: - print('sleeping', file=sys.stderr) - time.sleep(100) - print('waking', file=sys.stderr) - finally: - sys.stderr.flush() - os._exit(0) - else: - os.kill(pid, signal.SIGTERM) - def handler(*args): - raise RuntimeError('waitpid() took too long') - old_handler = signal.signal(signal.SIGALRM, handler) - try: - signal.alarm(10) - pid_status = os.waitpid(pid, 0) - self.assertEqual(pid_status[0], pid) - except RuntimeError: - print('os.waitpid() =', - os.waitpid(pid, os.WNOHANG), file=sys.stderr) - raise - finally: - signal.alarm(0) - signal.signal(signal.SIGALRM, old_handler) - def test_cpu_count(self): try: cpus = multiprocessing.cpu_count() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:00:48 2013 From: python-checkins at python.org (nick.coghlan) Date: Fri, 18 Oct 2013 16:00:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316129=3A_this_sho?= =?utf-8?q?uld_appease_the_buildbots?= Message-ID: <3d1TRN5FYVz7LjR@mail.python.org> http://hg.python.org/cpython/rev/4af20969c592 changeset: 86428:4af20969c592 user: Nick Coghlan date: Fri Oct 18 23:59:58 2013 +1000 summary: Issue #16129: this should appease the buildbots files: Lib/test/test_capi.py | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -260,7 +260,6 @@ print(out) print(err) - @unittest.skip def test_forced_io_encoding(self): # Checks forced configuration of embedded interpreter IO streams out, err = self.run_embedded_interpreter("forced_io_encoding") @@ -272,15 +271,15 @@ --- Use defaults --- Expected encoding: default Expected errors: default - stdin: {0.stdin.encoding}:strict - stdout: {0.stdout.encoding}:strict - stderr: {0.stderr.encoding}:backslashreplace + stdin: {0.__stdin__.encoding}:strict + stdout: {0.__stdout__.encoding}:strict + stderr: {0.__stderr__.encoding}:backslashreplace --- Set errors only --- Expected encoding: default Expected errors: surrogateescape - stdin: {0.stdin.encoding}:surrogateescape - stdout: {0.stdout.encoding}:surrogateescape - stderr: {0.stderr.encoding}:backslashreplace + stdin: {0.__stdin__.encoding}:surrogateescape + stdout: {0.__stdout__.encoding}:surrogateescape + stderr: {0.__stderr__.encoding}:backslashreplace --- Set encoding only --- Expected encoding: latin-1 Expected errors: default @@ -293,7 +292,7 @@ stdin: latin-1:surrogateescape stdout: latin-1:surrogateescape stderr: latin-1:backslashreplace""").format(sys) - # Looks like this overspecifies the output :( + # This is useful if we ever trip over odd platform behaviour self.maxDiff = None self.assertEqual(out.strip(), expected_output) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:06:07 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 16:06:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Remove_a_duplicate=2E?= Message-ID: <3d1TYW3qBkz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/41f8b7cf8df2 changeset: 86429:41f8b7cf8df2 user: Serhiy Storchaka date: Fri Oct 18 17:05:41 2013 +0300 summary: Remove a duplicate. files: Misc/NEWS | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2569,8 +2569,6 @@ - Issue #17977: The documentation for the cadefault argument's default value in urllib.request.urlopen() is fixed to match the code. -- Issue #15940: Specify effect of locale on time functions. - - Issue #6696: add documentation for the Profile objects, and improve profile/cProfile docs. Patch by Tom Pinckney. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:18:04 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 16:18:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Remove_redunda?= =?utf-8?q?nt_empty_lines=2E?= Message-ID: <3d1TqJ1xmmz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/8a9f9cfc1d9d changeset: 86430:8a9f9cfc1d9d branch: 2.7 parent: 86422:62b5269f0ddb user: Serhiy Storchaka date: Fri Oct 18 17:16:04 2013 +0300 summary: Remove redundant empty lines. files: Misc/NEWS | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -230,7 +230,6 @@ existing directory caused mkstemp and related APIs to fail instead of retrying. Report and fix by Vlad Shcherbina. - Tools/Demos ----------- @@ -3301,7 +3300,6 @@ - Issue #7567: Don't call `setupterm' twice. - Tools/Demos ----------- @@ -4539,7 +4537,6 @@ - Issue #7466: Segmentation fault when the garbage collector is called in the middle of populating a tuple. Patch by Florent Xicluna. - Library ------- @@ -7013,7 +7010,6 @@ - Issue #3215: Build sqlite3 as sqlite3.dll, not sqlite3.pyd. - Documentation ------------- @@ -7079,7 +7075,6 @@ only available if asserts are left in the code, in cases where they can't be triggered from Python code. - Extension Modules ----------------- - Issue #1179: [CVE-2007-4965] Integer overflow in imageop module. @@ -7387,7 +7382,6 @@ NOTE: 64-bit and 4-way builds are only suppported on Mac OS X 10.5 (or later). - C API ----- @@ -8263,7 +8257,6 @@ threading.enumerate() list after the join() for a brief period until it actually exited. - Library ------- @@ -9356,7 +9349,6 @@ platform.python_implementation(); this will now be saved in the benchmark pickle. - Documentation ------------- @@ -9407,7 +9399,6 @@ applied to a newly created list object and add notes that this isn't a good idea. - Tools/Demos ----------- @@ -9420,7 +9411,6 @@ - Bug #1546372: Fixed small bugglet in pybench that caused a missing file not to get reported properly. - Build ----- @@ -9503,7 +9493,6 @@ pybuildbot.identify to include some information about the build environment. - C API ----- @@ -9566,7 +9555,6 @@ - Bug #1542693: remove semi-colon at end of PyImport_ImportModuleEx macro so it can be used as an expression. - Windows ------- @@ -9580,7 +9568,6 @@ - Bug #1216: Restore support for Visual Studio 2002. - Mac --- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:18:05 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 16:18:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Remove_redunda?= =?utf-8?q?nt_empty_lines=2E?= Message-ID: <3d1TqK4mS5z7LjS@mail.python.org> http://hg.python.org/cpython/rev/2776169bb644 changeset: 86431:2776169bb644 branch: 3.3 parent: 86423:c8d57d0ee398 user: Serhiy Storchaka date: Fri Oct 18 17:16:40 2013 +0300 summary: Remove redundant empty lines. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -557,6 +557,7 @@ - Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1 on Windows. + What's New in Python 3.3.2? =========================== @@ -998,7 +999,6 @@ is imported as a side-effect of using fromlist tries to import a module that cannot be found. - Library ------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:18:07 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 18 Oct 2013 16:18:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Remove_redundant_empty_lines=2E?= Message-ID: <3d1TqM0R8Lz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/65fa067ca731 changeset: 86432:65fa067ca731 parent: 86429:41f8b7cf8df2 parent: 86431:2776169bb644 user: Serhiy Storchaka date: Fri Oct 18 17:17:31 2013 +0300 summary: Remove redundant empty lines. files: Misc/NEWS | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,7 +42,6 @@ Library ------- - - Issue #19262: Initial check in of the 'asyncio' package (a.k.a. Tulip, a.k.a. PEP 3156). There are no docs yet, and the PEP is slightly out of date with the code. This module will have *provisional* status @@ -178,7 +177,6 @@ Release date: 2013-09-29 - Core and Builtins ----------------- @@ -260,7 +258,6 @@ the local variables of all the stack frames referenced by a traceback object. - Tests ----- @@ -728,7 +725,6 @@ - Issue #14439: Python now prints the traceback on runpy failure at startup. - - Issue #17469: Fix _Py_GetAllocatedBlocks() and sys.getallocatedblocks() when running on valgrind. @@ -1123,7 +1119,6 @@ - Issue #18357: add tests for dictview set difference. Patch by Fraser Tweedale. - - importlib.abc.SourceLoader.get_source() no longer changes SyntaxError or UnicodeDecodeError into ImportError. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:46:07 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 16:46:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_test=2Et?= =?utf-8?q?est=5Fimportlib=2Etest=5Fapi_now_runs_under_frozen_and?= Message-ID: <3d1VRg2jHvz7LjS@mail.python.org> http://hg.python.org/cpython/rev/9d96a3163dbf changeset: 86433:9d96a3163dbf user: Brett Cannon date: Fri Oct 18 10:45:59 2013 -0400 summary: Issue #16803: test.test_importlib.test_api now runs under frozen and source. files: Lib/test/test_importlib/test_api.py | 106 ++++++++++----- 1 files changed, 69 insertions(+), 37 deletions(-) diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py --- a/Lib/test/test_importlib/test_api.py +++ b/Lib/test/test_importlib/test_api.py @@ -1,15 +1,15 @@ from . import util -import importlib -from importlib import _bootstrap -from importlib import machinery +frozen_init, source_init = util.import_importlib('importlib') +frozen_machinery, source_machinery = util.import_importlib('importlib.machinery') + import sys from test import support import types import unittest -class ImportModuleTests(unittest.TestCase): +class ImportModuleTests: """Test importlib.import_module.""" @@ -17,7 +17,7 @@ # Test importing a top-level module. with util.mock_modules('top_level') as mock: with util.import_state(meta_path=[mock]): - module = importlib.import_module('top_level') + module = self.init.import_module('top_level') self.assertEqual(module.__name__, 'top_level') def test_absolute_package_import(self): @@ -27,7 +27,7 @@ name = '{0}.mod'.format(pkg_name) with util.mock_modules(pkg_long_name, name) as mock: with util.import_state(meta_path=[mock]): - module = importlib.import_module(name) + module = self.init.import_module(name) self.assertEqual(module.__name__, name) def test_shallow_relative_package_import(self): @@ -39,17 +39,17 @@ relative_name = '.{0}'.format(module_name) with util.mock_modules(pkg_long_name, absolute_name) as mock: with util.import_state(meta_path=[mock]): - importlib.import_module(pkg_name) - module = importlib.import_module(relative_name, pkg_name) + self.init.import_module(pkg_name) + module = self.init.import_module(relative_name, pkg_name) self.assertEqual(module.__name__, absolute_name) def test_deep_relative_package_import(self): modules = ['a.__init__', 'a.b.__init__', 'a.c'] with util.mock_modules(*modules) as mock: with util.import_state(meta_path=[mock]): - importlib.import_module('a') - importlib.import_module('a.b') - module = importlib.import_module('..c', 'a.b') + self.init.import_module('a') + self.init.import_module('a.b') + module = self.init.import_module('..c', 'a.b') self.assertEqual(module.__name__, 'a.c') def test_absolute_import_with_package(self): @@ -60,15 +60,15 @@ name = '{0}.mod'.format(pkg_name) with util.mock_modules(pkg_long_name, name) as mock: with util.import_state(meta_path=[mock]): - importlib.import_module(pkg_name) - module = importlib.import_module(name, pkg_name) + self.init.import_module(pkg_name) + module = self.init.import_module(name, pkg_name) self.assertEqual(module.__name__, name) def test_relative_import_wo_package(self): # Relative imports cannot happen without the 'package' argument being # set. with self.assertRaises(TypeError): - importlib.import_module('.support') + self.init.import_module('.support') def test_loaded_once(self): @@ -77,7 +77,7 @@ # module currently being imported. b_load_count = 0 def load_a(): - importlib.import_module('a.b') + self.init.import_module('a.b') def load_b(): nonlocal b_load_count b_load_count += 1 @@ -85,11 +85,17 @@ modules = ['a.__init__', 'a.b'] with util.mock_modules(*modules, module_code=code) as mock: with util.import_state(meta_path=[mock]): - importlib.import_module('a.b') + self.init.import_module('a.b') self.assertEqual(b_load_count, 1) +class Frozen_ImportModuleTests(ImportModuleTests, unittest.TestCase): + init = frozen_init -class FindLoaderTests(unittest.TestCase): +class Source_ImportModuleTests(ImportModuleTests, unittest.TestCase): + init = source_init + + +class FindLoaderTests: class FakeMetaFinder: @staticmethod @@ -103,7 +109,7 @@ loader = 'a loader!' module.__loader__ = loader sys.modules[name] = module - found = importlib.find_loader(name) + found = self.init.find_loader(name) self.assertEqual(loader, found) def test_sys_modules_loader_is_None(self): @@ -114,7 +120,7 @@ module.__loader__ = None sys.modules[name] = module with self.assertRaises(ValueError): - importlib.find_loader(name) + self.init.find_loader(name) def test_sys_modules_loader_is_not_set(self): # Should raise ValueError @@ -128,14 +134,14 @@ pass sys.modules[name] = module with self.assertRaises(ValueError): - importlib.find_loader(name) + self.init.find_loader(name) def test_success(self): # Return the loader found on sys.meta_path. name = 'some_mod' with util.uncache(name): with util.import_state(meta_path=[self.FakeMetaFinder]): - self.assertEqual((name, None), importlib.find_loader(name)) + self.assertEqual((name, None), self.init.find_loader(name)) def test_success_path(self): # Searching on a path should work. @@ -144,14 +150,20 @@ with util.uncache(name): with util.import_state(meta_path=[self.FakeMetaFinder]): self.assertEqual((name, path), - importlib.find_loader(name, path)) + self.init.find_loader(name, path)) def test_nothing(self): # None is returned upon failure to find a loader. - self.assertIsNone(importlib.find_loader('nevergoingtofindthismodule')) + self.assertIsNone(self.init.find_loader('nevergoingtofindthismodule')) +class Frozen_FindLoaderTests(FindLoaderTests, unittest.TestCase): + init = frozen_init -class ReloadTests(unittest.TestCase): +class Source_FindLoaderTests(FindLoaderTests, unittest.TestCase): + init = source_init + + +class ReloadTests: """Test module reloading for builtin and extension modules.""" @@ -159,8 +171,8 @@ for mod in ('tokenize', 'time', 'marshal'): with self.subTest(module=mod): with support.CleanImport(mod): - module = importlib.import_module(mod) - importlib.reload(module) + module = self.init.import_module(mod) + self.init.reload(module) def test_module_replaced(self): def code(): @@ -172,14 +184,20 @@ module_code={'top_level': code}) with mock: with util.import_state(meta_path=[mock]): - module = importlib.import_module('top_level') - reloaded = importlib.reload(module) + module = self.init.import_module('top_level') + reloaded = self.init.reload(module) actual = sys.modules['top_level'] self.assertEqual(actual.spam, 3) self.assertEqual(reloaded.spam, 3) +class Frozen_ReloadTests(ReloadTests, unittest.TestCase): + init = frozen_init -class InvalidateCacheTests(unittest.TestCase): +class Source_ReloadTests(ReloadTests, unittest.TestCase): + init = source_init + + +class InvalidateCacheTests: def test_method_called(self): # If defined the method should be called. @@ -198,7 +216,7 @@ self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) sys.path_importer_cache[key] = path_ins self.addCleanup(lambda: sys.meta_path.remove(meta_ins)) - importlib.invalidate_caches() + self.init.invalidate_caches() self.assertTrue(meta_ins.called) self.assertTrue(path_ins.called) @@ -207,19 +225,27 @@ key = 'gobbledeegook' sys.path_importer_cache[key] = None self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) - importlib.invalidate_caches() # Shouldn't trigger an exception. + self.init.invalidate_caches() # Shouldn't trigger an exception. + +class Frozen_InvalidateCacheTests(InvalidateCacheTests, unittest.TestCase): + init = frozen_init + +class Source_InvalidateCacheTests(InvalidateCacheTests, unittest.TestCase): + init = source_init class FrozenImportlibTests(unittest.TestCase): def test_no_frozen_importlib(self): # Should be able to import w/o _frozen_importlib being defined. - module = support.import_fresh_module('importlib', blocked=['_frozen_importlib']) - self.assertFalse(isinstance(module.__loader__, - machinery.FrozenImporter)) + # Can't do an isinstance() check since separate copies of importlib + # may have been used for import, so just check the name is not for the + # frozen loader. + self.assertNotEqual(source_init.__loader__.__class__.__name__, + 'FrozenImporter') -class StartupTests(unittest.TestCase): +class StartupTests: def test_everyone_has___loader__(self): # Issue #17098: all modules should have __loader__ defined. @@ -227,11 +253,17 @@ if isinstance(module, types.ModuleType): self.assertTrue(hasattr(module, '__loader__'), '{!r} lacks a __loader__ attribute'.format(name)) - if importlib.machinery.BuiltinImporter.find_module(name): + if self.machinery.BuiltinImporter.find_module(name): self.assertIsNot(module.__loader__, None) - elif importlib.machinery.FrozenImporter.find_module(name): + elif self.machinery.FrozenImporter.find_module(name): self.assertIsNot(module.__loader__, None) +class Frozen_StartupTests(StartupTests, unittest.TestCase): + machinery = frozen_machinery + +class Source_StartupTests(StartupTests, unittest.TestCase): + machinery = source_machinery + if __name__ == '__main__': unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 16:58:27 2013 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 18 Oct 2013 16:58:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Rename_Transport=2Epause/r?= =?utf-8?q?esume_to_pause=5Freading/pause=5Fwriting=2E_Also_relax?= Message-ID: <3d1Vjv4LQtz7LjS@mail.python.org> http://hg.python.org/cpython/rev/bbb82783af72 changeset: 86434:bbb82783af72 user: Guido van Rossum date: Fri Oct 18 07:58:20 2013 -0700 summary: Rename Transport.pause/resume to pause_reading/pause_writing. Also relax timeout in test_call_later(). files: Lib/asyncio/proactor_events.py | 6 ++-- Lib/asyncio/selector_events.py | 14 +++++----- Lib/asyncio/streams.py | 4 +- Lib/asyncio/transports.py | 6 ++-- Lib/asyncio/unix_events.py | 4 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_proactor_events.py | 6 ++-- Lib/test/test_asyncio/test_selector_events.py | 12 ++++---- Lib/test/test_asyncio/test_transports.py | 4 +- Lib/test/test_asyncio/test_unix_events.py | 8 ++-- 10 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -94,12 +94,12 @@ self._paused = False self._loop.call_soon(self._loop_reading) - def pause(self): - assert not self._closing, 'Cannot pause() when closing' + def pause_reading(self): + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -406,13 +406,13 @@ if waiter is not None: self._loop.call_soon(waiter.set_result, None) - def pause(self): - assert not self._closing, 'Cannot pause() when closing' + def pause_reading(self): + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True self._loop.remove_reader(self._sock_fd) - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: @@ -590,19 +590,19 @@ if self._waiter is not None: self._loop.call_soon(self._waiter.set_result, None) - def pause(self): + def pause_reading(self): # XXX This is a bit icky, given the comment at the top of # _on_ready(). Is it possible to evoke a deadlock? I don't # know, although it doesn't look like it; write() will still # accept more data for the buffer and eventually the app will - # call resume() again, and things will flow again. + # call resume_reading() again, and things will flow again. - assert not self._closing, 'Cannot pause() when closing' + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True self._loop.remove_reader(self._sock_fd) - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -106,7 +106,7 @@ def _maybe_resume_transport(self): if self._paused and self.byte_count <= self.limit: self._paused = False - self._transport.resume() + self._transport.resume_reading() def feed_eof(self): self.eof = True @@ -133,7 +133,7 @@ not self._paused and self.byte_count > 2*self.limit): try: - self._transport.pause() + self._transport.pause_reading() except NotImplementedError: # The transport can't be paused. # We'll just have to buffer all data. diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -29,15 +29,15 @@ class ReadTransport(BaseTransport): """ABC for read-only transports.""" - def pause(self): + def pause_reading(self): """Pause the receiving end. No data will be passed to the protocol's data_received() - method until resume() is called. + method until resume_reading() is called. """ raise NotImplementedError - def resume(self): + def resume_reading(self): """Resume the receiving end. Data received will once again be passed to the protocol's diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -232,10 +232,10 @@ self._loop.call_soon(self._protocol.eof_received) self._loop.call_soon(self._call_connection_lost, None) - def pause(self): + def pause_reading(self): self._loop.remove_reader(self._fileno) - def resume(self): + def resume_reading(self): self._loop.add_reader(self._fileno, self._read_ready) def close(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -238,7 +238,7 @@ self.loop.run_forever() t1 = time.monotonic() self.assertEqual(results, ['hello world']) - self.assertTrue(0.09 <= t1-t0 <= 0.12, t1-t0) + self.assertTrue(0.08 <= t1-t0 <= 0.2, t1-t0) def test_call_soon(self): results = [] diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -308,7 +308,7 @@ tr.write_eof() tr.close() - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = _ProactorSocketTransport( self.loop, self.sock, self.protocol) futures = [] @@ -323,12 +323,12 @@ self.protocol.data_received.assert_called_with(b'data1') self.loop._run_once() self.protocol.data_received.assert_called_with(b'data2') - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) for i in range(10): self.loop._run_once() self.protocol.data_received.assert_called_with(b'data2') - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop._run_once() self.protocol.data_received.assert_called_with(b'data3') diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -676,15 +676,15 @@ test_utils.run_briefly(self.loop) self.assertIsNone(fut.result()) - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = _SelectorSocketTransport( self.loop, self.sock, self.protocol) self.assertFalse(tr._paused) self.loop.assert_reader(7, tr._read_ready) - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) self.assertFalse(7 in self.loop.readers) - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop.assert_reader(7, tr._read_ready) @@ -1044,14 +1044,14 @@ self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = self._make_one() self.assertFalse(tr._paused) self.loop.assert_reader(1, tr._on_ready) - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) self.assertFalse(1 in self.loop.readers) - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop.assert_reader(1, tr._on_ready) diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py --- a/Lib/test/test_asyncio/test_transports.py +++ b/Lib/test/test_asyncio/test_transports.py @@ -33,8 +33,8 @@ self.assertRaises(NotImplementedError, transport.write, 'data') self.assertRaises(NotImplementedError, transport.write_eof) self.assertRaises(NotImplementedError, transport.can_write_eof) - self.assertRaises(NotImplementedError, transport.pause) - self.assertRaises(NotImplementedError, transport.resume) + self.assertRaises(NotImplementedError, transport.pause_reading) + self.assertRaises(NotImplementedError, transport.resume_reading) self.assertRaises(NotImplementedError, transport.close) self.assertRaises(NotImplementedError, transport.abort) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -375,21 +375,21 @@ m_logexc.assert_called_with('Fatal error for %s', tr) @unittest.mock.patch('os.read') - def test_pause(self, m_read): + def test_pause_reading(self, m_read): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) m = unittest.mock.Mock() self.loop.add_reader(5, m) - tr.pause() + tr.pause_reading() self.assertFalse(self.loop.readers) @unittest.mock.patch('os.read') - def test_resume(self, m_read): + def test_resume_reading(self, m_read): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) - tr.resume() + tr.resume_reading() self.loop.assert_reader(5, tr._read_ready) @unittest.mock.patch('os.read') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 17:24:38 2013 From: python-checkins at python.org (richard.oudkerk) Date: Fri, 18 Oct 2013 17:24:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Update_pcbuild=2Esln_to_bu?= =?utf-8?q?ild_=5Foverlapped=2E?= Message-ID: <3d1WJ63rzqz7LjP@mail.python.org> http://hg.python.org/cpython/rev/86d692da927f changeset: 86435:86d692da927f user: Richard Oudkerk date: Fri Oct 18 16:23:01 2013 +0100 summary: Update pcbuild.sln to build _overlapped. files: PCbuild/pcbuild.sln | 26 ++++++++++---------------- 1 files changed, 10 insertions(+), 16 deletions(-) diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -154,22 +154,6 @@ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.ActiveCfg = Debug|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.Build.0 = Debug|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.ActiveCfg = Debug|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.Build.0 = Debug|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.ActiveCfg = Release|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.Build.0 = Release|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.ActiveCfg = Release|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.Build.0 = Release|x64 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.ActiveCfg = Release|Win32 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.Build.0 = Release|Win32 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|x64.ActiveCfg = Release|Win32 @@ -647,6 +631,16 @@ {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|Win32.Build.0 = Release|Win32 {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.ActiveCfg = Release|x64 {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.Build.0 = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 17:39:44 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 17:39:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318416=3A_Have_imp?= =?utf-8?q?ortlib=2Emachinery=2EPathFinder_treat_=27=27_as_the_cwd?= Message-ID: <3d1WdX119Mz7LkB@mail.python.org> http://hg.python.org/cpython/rev/76184b5339f2 changeset: 86436:76184b5339f2 parent: 86433:9d96a3163dbf user: Brett Cannon date: Fri Oct 18 11:39:04 2013 -0400 summary: Issue #18416: Have importlib.machinery.PathFinder treat '' as the cwd and stop importlib.machinery.FileFinder treating '' as '.'. Previous PathFinder transformed '' into '.' which led to __file__ for modules imported from the cwd to always be relative paths. This meant the values of the attribute were wrong as soon as the cwd changed. This change now means that as long as the site module is run (which makes all entries in sys.path absolute) then all values for __file__ will also be absolute unless it's for __main__ when specified by file path in a relative way (modules imported by runpy will have an absolute path). Now that PathFinder is no longer treating '' as '.' it only makes sense for FileFinder to stop doing so as well. Now no transformation is performed for the directory given to the __init__ method. Thanks to Madison May for the initial patch. files: Doc/library/importlib.rst | 7 + Doc/whatsnew/3.4.rst | 11 + Lib/importlib/_bootstrap.py | 4 +- Lib/test/test_importlib/import_/test_path.py | 4 +- Misc/NEWS | 7 + Python/importlib.h | 6665 +++++---- 6 files changed, 3473 insertions(+), 3225 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -722,6 +722,10 @@ Calls :meth:`importlib.abc.PathEntryFinder.invalidate_caches` on all finders stored in :attr:`sys.path_importer_cache`. + .. versionchanged:: 3.4 + Calls objects in :data:sys.path_hooks with the current working directory + for ``''`` (i.e. the empty string). + .. class:: FileFinder(path, \*loader_details) @@ -748,6 +752,9 @@ .. versionadded:: 3.3 + .. versionchange:: 3.4 + The empty string is no longer special-cased to be changed into ``'.'``. + .. attribute:: path The path the finder will search in. diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -675,3 +675,14 @@ :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred, instead of a string allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. +* :cls:`importlib.machinery.PathFinder` now passes on the current working + directory to objects in :data:`sys.path_hooks` for the empty string. This + results in :data:`sys.path_importer_cache` never containing ``''``, thus + iterating through :data:`sys.path_importer_cache` based on :data:`sys.path` + will not find all keys. A module's ``__file__`` when imported in the current + working directory will also now have an absolute path, including when using + ``-m`` with the interpreter (this does not influence when the path to a file + is specified on the command-line). + +* :cls:`importlib.machinery.FileFinder` no longer special-cases the empty string + to be changed to ``'.'``. diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1302,7 +1302,7 @@ """ if path == '': - path = '.' + path = _os.getcwd() try: finder = sys.path_importer_cache[path] except KeyError: @@ -1373,7 +1373,7 @@ loaders.extend((suffix, loader) for suffix in suffixes) self._loaders = loaders # Base (directory) path - self.path = path or '.' + self.path = path self._path_mtime = -1 self._path_cache = set() self._relaxed_path_cache = set() diff --git a/Lib/test/test_importlib/import_/test_path.py b/Lib/test/test_importlib/import_/test_path.py --- a/Lib/test/test_importlib/import_/test_path.py +++ b/Lib/test/test_importlib/import_/test_path.py @@ -82,11 +82,11 @@ path = '' module = '' importer = util.mock_modules(module) - hook = import_util.mock_path_hook(os.curdir, importer=importer) + hook = import_util.mock_path_hook(os.getcwd(), importer=importer) with util.import_state(path=[path], path_hooks=[hook]): loader = machinery.PathFinder.find_module(module) self.assertIs(loader, importer) - self.assertIn(os.curdir, sys.path_importer_cache) + self.assertIn(os.getcwd(), sys.path_importer_cache) def test_None_on_sys_path(self): # Putting None in sys.path[0] caused an import regression from Python diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,13 @@ Core and Builtins ----------------- +- Issue #18416: importlib.machinery.PathFinder now treats '' as the cwd and + importlib.machinery.FileFinder no longer special-cases '' to '.'. This leads + to modules imported from cwd to now possess an absolute file path for + __file__ (this does not affect modules specified by path on the CLI but it + does affect -m/runpy). It also allows FileFinder to be more consistent by not + having an edge case. + - Issue #4555: All exported C symbols are now prefixed with either "Py" or "_Py". diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 17:39:45 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 17:39:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3d1WdY4qqlz7Lk8@mail.python.org> http://hg.python.org/cpython/rev/1e49fd06fcc5 changeset: 86437:1e49fd06fcc5 parent: 86436:76184b5339f2 parent: 86435:86d692da927f user: Brett Cannon date: Fri Oct 18 11:39:32 2013 -0400 summary: merge files: Lib/asyncio/proactor_events.py | 6 +- Lib/asyncio/selector_events.py | 14 ++-- Lib/asyncio/streams.py | 4 +- Lib/asyncio/transports.py | 6 +- Lib/asyncio/unix_events.py | 4 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_proactor_events.py | 6 +- Lib/test/test_asyncio/test_selector_events.py | 12 ++-- Lib/test/test_asyncio/test_transports.py | 4 +- Lib/test/test_asyncio/test_unix_events.py | 8 +- PCbuild/pcbuild.sln | 26 +++------ 11 files changed, 43 insertions(+), 49 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -94,12 +94,12 @@ self._paused = False self._loop.call_soon(self._loop_reading) - def pause(self): - assert not self._closing, 'Cannot pause() when closing' + def pause_reading(self): + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -406,13 +406,13 @@ if waiter is not None: self._loop.call_soon(waiter.set_result, None) - def pause(self): - assert not self._closing, 'Cannot pause() when closing' + def pause_reading(self): + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True self._loop.remove_reader(self._sock_fd) - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: @@ -590,19 +590,19 @@ if self._waiter is not None: self._loop.call_soon(self._waiter.set_result, None) - def pause(self): + def pause_reading(self): # XXX This is a bit icky, given the comment at the top of # _on_ready(). Is it possible to evoke a deadlock? I don't # know, although it doesn't look like it; write() will still # accept more data for the buffer and eventually the app will - # call resume() again, and things will flow again. + # call resume_reading() again, and things will flow again. - assert not self._closing, 'Cannot pause() when closing' + assert not self._closing, 'Cannot pause_reading() when closing' assert not self._paused, 'Already paused' self._paused = True self._loop.remove_reader(self._sock_fd) - def resume(self): + def resume_reading(self): assert self._paused, 'Not paused' self._paused = False if self._closing: diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -106,7 +106,7 @@ def _maybe_resume_transport(self): if self._paused and self.byte_count <= self.limit: self._paused = False - self._transport.resume() + self._transport.resume_reading() def feed_eof(self): self.eof = True @@ -133,7 +133,7 @@ not self._paused and self.byte_count > 2*self.limit): try: - self._transport.pause() + self._transport.pause_reading() except NotImplementedError: # The transport can't be paused. # We'll just have to buffer all data. diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -29,15 +29,15 @@ class ReadTransport(BaseTransport): """ABC for read-only transports.""" - def pause(self): + def pause_reading(self): """Pause the receiving end. No data will be passed to the protocol's data_received() - method until resume() is called. + method until resume_reading() is called. """ raise NotImplementedError - def resume(self): + def resume_reading(self): """Resume the receiving end. Data received will once again be passed to the protocol's diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -232,10 +232,10 @@ self._loop.call_soon(self._protocol.eof_received) self._loop.call_soon(self._call_connection_lost, None) - def pause(self): + def pause_reading(self): self._loop.remove_reader(self._fileno) - def resume(self): + def resume_reading(self): self._loop.add_reader(self._fileno, self._read_ready) def close(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -238,7 +238,7 @@ self.loop.run_forever() t1 = time.monotonic() self.assertEqual(results, ['hello world']) - self.assertTrue(0.09 <= t1-t0 <= 0.12, t1-t0) + self.assertTrue(0.08 <= t1-t0 <= 0.2, t1-t0) def test_call_soon(self): results = [] diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -308,7 +308,7 @@ tr.write_eof() tr.close() - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = _ProactorSocketTransport( self.loop, self.sock, self.protocol) futures = [] @@ -323,12 +323,12 @@ self.protocol.data_received.assert_called_with(b'data1') self.loop._run_once() self.protocol.data_received.assert_called_with(b'data2') - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) for i in range(10): self.loop._run_once() self.protocol.data_received.assert_called_with(b'data2') - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop._run_once() self.protocol.data_received.assert_called_with(b'data3') diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -676,15 +676,15 @@ test_utils.run_briefly(self.loop) self.assertIsNone(fut.result()) - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = _SelectorSocketTransport( self.loop, self.sock, self.protocol) self.assertFalse(tr._paused) self.loop.assert_reader(7, tr._read_ready) - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) self.assertFalse(7 in self.loop.readers) - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop.assert_reader(7, tr._read_ready) @@ -1044,14 +1044,14 @@ self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) - def test_pause_resume(self): + def test_pause_resume_reading(self): tr = self._make_one() self.assertFalse(tr._paused) self.loop.assert_reader(1, tr._on_ready) - tr.pause() + tr.pause_reading() self.assertTrue(tr._paused) self.assertFalse(1 in self.loop.readers) - tr.resume() + tr.resume_reading() self.assertFalse(tr._paused) self.loop.assert_reader(1, tr._on_ready) diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py --- a/Lib/test/test_asyncio/test_transports.py +++ b/Lib/test/test_asyncio/test_transports.py @@ -33,8 +33,8 @@ self.assertRaises(NotImplementedError, transport.write, 'data') self.assertRaises(NotImplementedError, transport.write_eof) self.assertRaises(NotImplementedError, transport.can_write_eof) - self.assertRaises(NotImplementedError, transport.pause) - self.assertRaises(NotImplementedError, transport.resume) + self.assertRaises(NotImplementedError, transport.pause_reading) + self.assertRaises(NotImplementedError, transport.resume_reading) self.assertRaises(NotImplementedError, transport.close) self.assertRaises(NotImplementedError, transport.abort) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -375,21 +375,21 @@ m_logexc.assert_called_with('Fatal error for %s', tr) @unittest.mock.patch('os.read') - def test_pause(self, m_read): + def test_pause_reading(self, m_read): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) m = unittest.mock.Mock() self.loop.add_reader(5, m) - tr.pause() + tr.pause_reading() self.assertFalse(self.loop.readers) @unittest.mock.patch('os.read') - def test_resume(self, m_read): + def test_resume_reading(self, m_read): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) - tr.resume() + tr.resume_reading() self.loop.assert_reader(5, tr._read_ready) @unittest.mock.patch('os.read') diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -154,22 +154,6 @@ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.ActiveCfg = Debug|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.Build.0 = Debug|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.ActiveCfg = Debug|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.Build.0 = Debug|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.ActiveCfg = Release|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.Build.0 = Release|Win32 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.ActiveCfg = Release|x64 - {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.Build.0 = Release|x64 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.ActiveCfg = Release|Win32 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.Build.0 = Release|Win32 {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|x64.ActiveCfg = Release|Win32 @@ -647,6 +631,16 @@ {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|Win32.Build.0 = Release|Win32 {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.ActiveCfg = Release|x64 {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.Build.0 = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 17:49:19 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 17:49:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Document_formatter_as_depreca?= =?utf-8?q?ted?= Message-ID: <3d1Wrb4l7qzSXw@mail.python.org> http://hg.python.org/peps/rev/f1fde6ef92e2 changeset: 5197:f1fde6ef92e2 user: Brett Cannon date: Fri Oct 18 11:49:14 2013 -0400 summary: Document formatter as deprecated files: pep-0004.txt | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pep-0004.txt b/pep-0004.txt --- a/pep-0004.txt +++ b/pep-0004.txt @@ -113,17 +113,17 @@ Module name: rgbimgmodule Rationale: In a 2001-04-24 c.l.py post, Jason Petrone mentions - that he occasionally uses it; no other references to + that he occasionally uses it; no other references to its use can be found as of 2003-11-19. Date: 1-Oct-2000 Documentation: Documented as deprecated since Python 2.5. Removed in Python 2.6. Module name: pre - Rationale: The underlying PCRE engine doesn't support Unicode, and + Rationale: The underlying PCRE engine doesn't support Unicode, and has been unmaintained since Python 1.5.2. Date: 10-Apr-2002 - Documentation: It was only mentioned as an implementation detail, + Documentation: It was only mentioned as an implementation detail, and never had a section of its own. This mention has now been removed. @@ -246,18 +246,25 @@ listing in this PEP was neglected. DeprecationWarning added in Python 2.6. - Module name: plat-freebsd2/IN and plat-freebsd3/IN + Module name: plat-freebsd2/IN and plat-freebsd3/IN Rationale: Platforms are obsolete (last released in 2000) Removed from 2.6 Date: 15-May-2007 Documentation: None - Module name: plat-freebsd4/IN and possibly plat-freebsd5/IN + Module name: plat-freebsd4/IN and possibly plat-freebsd5/IN Rationale: Platforms are obsolete/unsupported Date: 15-May-2007 Remove from 2.7 Documentation: None + Module name: formatter + Rationale: Lack of use in the community, no tests to keep + code working. + Documentation: Deprecated as of Python 3.4 by raising + PendingDeprecationWarning. Slated for removal in + Python 3.6. + Deprecation of modules removed in Python 3.0 ============================================ @@ -265,7 +272,7 @@ PEP 3108 lists all modules that have been removed from Python 3.0. They all are documented as deprecated in Python 2.6, and raise a DeprecationWarning if the -3 flag is activated. - + Undeprecated modules ==================== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 18 18:01:15 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 18:01:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318416=3A_Fix_vari?= =?utf-8?q?ous_os_calls_in_importlib=2Emachinery=2EFileFinder?= Message-ID: <3d1X6M5RMjz7LjP@mail.python.org> http://hg.python.org/cpython/rev/33844153cd02 changeset: 86438:33844153cd02 user: Brett Cannon date: Fri Oct 18 12:01:06 2013 -0400 summary: Issue #18416: Fix various os calls in importlib.machinery.FileFinder now that self.path is no longer forced to '.'. files: Lib/importlib/_bootstrap.py | 4 +- Python/importlib.h | 1554 +++++++++++----------- 2 files changed, 780 insertions(+), 778 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1390,7 +1390,7 @@ is_namespace = False tail_module = fullname.rpartition('.')[2] try: - mtime = _os.stat(self.path).st_mtime + mtime = _os.stat(self.path or _os.getcwd()).st_mtime except OSError: mtime = -1 if mtime != self._path_mtime: @@ -1432,7 +1432,7 @@ """Fill the cache of potential modules and packages for this directory.""" path = self.path try: - contents = _os.listdir(path) + contents = _os.listdir(path or _os.getcwd()) except (FileNotFoundError, PermissionError, NotADirectoryError): # Directory has either been removed, turned into a file, or made # unreadable. diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 18:05:58 2013 From: python-checkins at python.org (richard.oudkerk) Date: Fri, 18 Oct 2013 18:05:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Update_more_configurations?= =?utf-8?q?_in_pcbuild=2Esln=2E?= Message-ID: <3d1XCp2mLdz7LjP@mail.python.org> http://hg.python.org/cpython/rev/7172135d60f6 changeset: 86439:7172135d60f6 user: Richard Oudkerk date: Fri Oct 18 17:04:31 2013 +0100 summary: Update more configurations in pcbuild.sln. files: PCbuild/pcbuild.sln | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -632,11 +632,17 @@ {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.ActiveCfg = Release|x64 {254A0C05-6696-4B08-8CB2-EF7D533AEE01}.Release|x64.Build.0 = Release|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.Build.0 = Debug|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.Build.0 = Debug|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.Build.0 = PGInstrument|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.Build.0 = PGUpdate|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 18:35:40 2013 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 18 Oct 2013 18:35:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Various_Tulip_updates=2E?= Message-ID: <3d1Xt43Y72zNdF@mail.python.org> http://hg.python.org/peps/rev/61cb60d84161 changeset: 5198:61cb60d84161 user: Guido van Rossum date: Fri Oct 18 09:35:37 2013 -0700 summary: Various Tulip updates. files: pep-3156.txt | 86 ++++++++++++++++++++++++--------------- 1 files changed, 53 insertions(+), 33 deletions(-) diff --git a/pep-3156.txt b/pep-3156.txt --- a/pep-3156.txt +++ b/pep-3156.txt @@ -198,7 +198,8 @@ loop object depending on the context (in fact, this is the definition of context). It may create a new event loop object if none is set and creation is allowed by the policy. The default policy will create a -new event loop only in the main thread, and only if +new event loop only in the main thread (as defined by threading.py, +which uses a special subclass for the main thread), and only if ``get_event_loop()`` is called before ``set_event_loop()`` is ever called. (To reset this state, reset the policy.) In other threads an event loop must be explicitly set. Other policies may behave @@ -233,11 +234,10 @@ concrete classes are defined: - ``SelectorEventLoop`` is a concrete implementation of the full API - based on the ``selectors`` module. (This module is part of Tulip, - but not specified by this PEP. It is separately proposed for - inclusion in the standard library.) The constructor takes one - optional argument, a ``selectors.Selector`` object. By default an - instance of ``selectors.DefaultSelector`` is created and used. + based on the ``selectors`` module (new in Python 3.4). The + constructor takes one optional argument, a ``selectors.Selector`` + object. By default an instance of ``selectors.DefaultSelector`` is + created and used. - ``ProactorEventLoop`` is a concrete implementation of the API except for the I/O event handling and signal handling methods. It is only @@ -485,7 +485,7 @@ same transport and protocol interface. However, datagram endpoints use a different transport and protocol interface. -- ``create_connection(protocol_factory, host, port, **kwargs)``. +- ``create_connection(protocol_factory, host, port, )``. Creates a stream connection to a given internet host and port. This is a task that is typically called from the client side of the connection. It creates an implementation-dependent (bidirectional @@ -507,11 +507,23 @@ You can also pass a trivial ``lambda`` that returns a previously constructed Protocol instance. - Optional keyword arguments: + The are all specified using optional keyword arguments: - ``ssl``: Pass ``True`` to create an SSL transport (by default a plain TCP transport is created). Or pass an ``ssl.SSLContext`` - object to override the default SSL context object to be used. + object to override the default SSL context object to be used. If + a default context is created it is up to the implementation to + configure reasonable defaults. The reference implementation + currently uses ``PROTOCOL_SSLv23`` and sets the ``OP_NO_SSLv2`` + option, calls ``set_default_verify_paths()`` and sets verify_mode + to ``CERT_REQUIRED``. In addition, whenever the context (default + or otherwise) specifies a verify_mode of ``CERT_REQUIRED``, if a + hostname is given, immediately after a successful handshake + ``ss.ssl.match_hostname(peercert, hostname)`` is called, and if + this raises an exception the conection is closed. (To avoid this + behavior, pass in an context that doesn't have verify_mode set to + ``CERT_REQUIRED``. But this means you are not secure, and + vulnerable to for example man-in-the-middle attacks.) - ``family``, ``proto``, ``flags``: Address family, protocol and flags to be passed through to ``getaddrinfo()``. These all @@ -532,13 +544,15 @@ specific address. This is how you would do that. The host and port are looked up using ``getaddrinfo()``. -- ``start_serving(protocol_factory, host, port, **kwds)``. Enters a - serving loop that accepts connections. This is a coroutine that - completes once the serving loop is set up to serve. The return - value is a list of one or more sockets in listening mode. (Multiple - sockets may be returned if the specified address allows both IPv4 - and IPv6 connections.) You can use ``stop_serving()`` to stop the - serving loop. Each time a connection is accepted, +- ``create_server_serving(protocol_factory, host, port, + )``. Enters a serving loop that accepts connections. + This is a coroutine that completes once the serving loop is set up + to serve. The return value is a ``Server`` object which can be used + to stop the serving loop in a controlled fashion by calling its + ``close()`` method. + + Multiple sockets may be bound if the specified address allows + both IPv4 and IPv6 connections. Each time a connection is accepted, ``protocol_factory`` is called without arguments(*) to create a Protocol, a (bidirectional stream) Transport is created to represent the network side of the connection, and the two are tied together by @@ -549,7 +563,7 @@ connection, it should return a new Protocol object each time it is called. - Optional keyword arguments: + The are all specified using optional keyword arguments: - ``ssl``: Pass an ``ssl.SSLContext`` object to override the default SSL context object to be used. (Unlike ``create_connection()``, @@ -583,8 +597,8 @@ return a list of opaque objects that can be passed to ``stop_serving()``.) -- ``create_datagram_endpoint(protocol_factory, local_addr, - remote_addr, **kwds)``. Creates an endpoint for sending and +- ``create_datagram_endpoint(protocol_factory, local_addr=None, + remote_addr=None, **kwds)``. Creates an endpoint for sending and receiving datagrams (typically UDP packets). Because of the nature of datagram traffic, there are no separate calls to set up client and server side, since usually a single endpoint acts as both client @@ -1027,12 +1041,12 @@ is known ahead of time, the best approach in both cases is to use the Content-Length header.) -- ``pause()``. Suspend delivery of data to the protocol until a - subsequent ``resume()`` call. Between ``pause()`` and ``resume()``, - the protocol's ``data_received()`` method will not be called. This - has no effect on ``write()``. +- ``pause_reading()``. Suspend delivery of data to the protocol until + a subsequent ``resume_reading()`` call. Between ``pause_reading()`` + and ``resume_reading()``, the protocol's ``data_received()`` method + will not be called. This has no effect on ``write()``. -- ``resume()``. Restart delivery of data to the protocol via +- ``resume_reading()``. Restart delivery of data to the protocol via ``data_received()``. - ``close()``. Sever the connection with the entity at the other end. @@ -1053,8 +1067,8 @@ TBD: Provide flow control the other way -- the transport may need to suspend the protocol if the amount of data buffered becomes a burden. -Proposal: let the transport call ``protocol.pause()`` and -``protocol.resume()`` if they exist; if they don't exist, the +Proposal: let the transport call ``protocol.pause_writing()`` and +``protocol.resume_writing()`` if they exist; if they don't exist, the protocol doesn't support flow control. (Perhaps different names to avoid confusion between protocols and transports?) @@ -1065,8 +1079,9 @@ ``write_eof()``, ``can_write_eof()``, close() and ``abort()`` methods described for bidrectional stream transports. -A reading stream transport supports the ``pause()``, ``resume()`` and -``close()`` methods described for bidrectional stream transports. +A reading stream transport supports the ``pause_reading()``, +``resume_reading()`` and ``close()`` methods described for +bidrectional stream transports. A writing stream transport calls only ``connection_made()`` and ``connection_lost()`` on its associated protocol. @@ -1146,9 +1161,11 @@ p.data_received(b'def') - ``eof_received()``. This is called when the other end called - ``write_eof()`` (or something equivalent). The default - implementation calls ``close()`` on the transport, which causes - ``connection_lost()`` to be called (eventually) on the protocol. + ``write_eof()`` (or something equivalent). If this returns a false + value (including None), the transport will close itself. If it + returns a true value, closing the transport is up to the protocol. + + The default implementation returns None. - ``connection_lost(exc)``. The transport has been closed or aborted, has detected that the other end has closed the connection cleanly, @@ -1412,6 +1429,9 @@ Open Issues =========== +- Make ``loop.stop()`` optional (and hence + ``loop.run_until_complete()`` too). + - A fuller public API for Handle? What's the use case? - Should we require all event loops to implement ``sock_recv()`` and @@ -1434,8 +1454,8 @@ - Locks and queues? The Tulip implementation contains implementations of most types of locks and queues modeled after the standard library - ``threading`` and ``queue`` modules. Should we incorporate these in - the PEP? + ``threading`` and ``queue`` modules. These should be incorporated + into the PEP. - Probably need more socket I/O methods, e.g. ``sock_sendto()`` and ``sock_recvfrom()``, and perhaps others like ``pipe_read()``. Or -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 18 18:58:24 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 18 Oct 2013 18:58:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_fix_descriptio?= =?utf-8?q?n_of_super=28=29_behavior_on_descriptors?= Message-ID: <3d1YNJ0mlvzSs5@mail.python.org> http://hg.python.org/cpython/rev/247344a0d12e changeset: 86440:247344a0d12e branch: 3.3 parent: 86431:2776169bb644 user: Benjamin Peterson date: Fri Oct 18 12:57:55 2013 -0400 summary: fix description of super() behavior on descriptors files: Doc/howto/descriptor.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -119,7 +119,7 @@ The object returned by ``super()`` also has a custom :meth:`__getattribute__` method for invoking descriptors. The call ``super(B, obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, A)``. If not a descriptor, +and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a search using :meth:`object.__getattribute__`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 18:58:25 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 18 Oct 2013 18:58:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_fix_descriptio?= =?utf-8?q?n_of_super=28=29_behavior_on_descriptors?= Message-ID: <3d1YNK2hhPz7LjR@mail.python.org> http://hg.python.org/cpython/rev/d22c03988e58 changeset: 86441:d22c03988e58 branch: 2.7 parent: 86430:8a9f9cfc1d9d user: Benjamin Peterson date: Fri Oct 18 12:57:55 2013 -0400 summary: fix description of super() behavior on descriptors files: Doc/howto/descriptor.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -124,7 +124,7 @@ The object returned by ``super()`` also has a custom :meth:`__getattribute__` method for invoking descriptors. The call ``super(B, obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, A)``. If not a descriptor, +and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a search using :meth:`object.__getattribute__`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 18:58:26 2013 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 18 Oct 2013 18:58:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy4z?= Message-ID: <3d1YNL4QGPz7LjP@mail.python.org> http://hg.python.org/cpython/rev/ea4add053054 changeset: 86442:ea4add053054 parent: 86439:7172135d60f6 parent: 86440:247344a0d12e user: Benjamin Peterson date: Fri Oct 18 12:58:17 2013 -0400 summary: merge 3.3 files: Doc/howto/descriptor.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -119,7 +119,7 @@ The object returned by ``super()`` also has a custom :meth:`__getattribute__` method for invoking descriptors. The call ``super(B, obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, A)``. If not a descriptor, +and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a search using :meth:`object.__getattribute__`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 19:10:42 2013 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 18 Oct 2013 19:10:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Important_race_condition_f?= =?utf-8?q?ix_for_Tulip=2E?= Message-ID: <3d1YfV25KJz7LjP@mail.python.org> http://hg.python.org/cpython/rev/6be52811947c changeset: 86443:6be52811947c user: Guido van Rossum date: Fri Oct 18 10:10:36 2013 -0700 summary: Important race condition fix for Tulip. files: Lib/asyncio/selector_events.py | 51 +++++++-------------- 1 files changed, 18 insertions(+), 33 deletions(-) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -344,7 +344,7 @@ self._protocol = protocol self._server = server self._buffer = collections.deque() - self._conn_lost = 0 + self._conn_lost = 0 # Set when call to connection_lost scheduled. self._closing = False # Set when close() called. if server is not None: server.attach(self) @@ -356,27 +356,27 @@ if self._closing: return self._closing = True - self._conn_lost += 1 self._loop.remove_reader(self._sock_fd) if not self._buffer: + self._conn_lost += 1 self._loop.call_soon(self._call_connection_lost, None) def _fatal_error(self, exc): - # should be called from exception handler only - logger.exception('Fatal error for %s', self) + # Should be called from exception handler only. + if not isinstance(exc, (BrokenPipeError, ConnectionResetError)): + logger.exception('Fatal error for %s', self) self._force_close(exc) def _force_close(self, exc): + if self._conn_lost: + return if self._buffer: self._buffer.clear() self._loop.remove_writer(self._sock_fd) - - if self._closing: - return - - self._closing = True + if not self._closing: + self._closing = True + self._loop.remove_reader(self._sock_fd) self._conn_lost += 1 - self._loop.remove_reader(self._sock_fd) self._loop.call_soon(self._call_connection_lost, exc) def _call_connection_lost(self, exc): @@ -424,8 +424,6 @@ data = self._sock.recv(self.max_size) except (BlockingIOError, InterruptedError): pass - except ConnectionResetError as exc: - self._force_close(exc) except Exception as exc: self._fatal_error(exc) else: @@ -453,17 +451,15 @@ try: n = self._sock.send(data) except (BlockingIOError, InterruptedError): - n = 0 - except (BrokenPipeError, ConnectionResetError) as exc: - self._force_close(exc) - return - except OSError as exc: + pass + except Exception as exc: self._fatal_error(exc) return else: data = data[n:] if not data: return + # Start async I/O. self._loop.add_writer(self._sock_fd, self._write_ready) @@ -478,9 +474,6 @@ n = self._sock.send(data) except (BlockingIOError, InterruptedError): self._buffer.append(data) - except (BrokenPipeError, ConnectionResetError) as exc: - self._loop.remove_writer(self._sock_fd) - self._force_close(exc) except Exception as exc: self._loop.remove_writer(self._sock_fd) self._fatal_error(exc) @@ -493,7 +486,6 @@ elif self._eof: self._sock.shutdown(socket.SHUT_WR) return - self._buffer.append(data) # Try again later. def write_eof(self): @@ -622,8 +614,6 @@ except (BlockingIOError, InterruptedError, ssl.SSLWantReadError, ssl.SSLWantWriteError): pass - except ConnectionResetError as exc: - self._force_close(exc) except Exception as exc: self._fatal_error(exc) else: @@ -644,10 +634,6 @@ except (BlockingIOError, InterruptedError, ssl.SSLWantReadError, ssl.SSLWantWriteError): n = 0 - except (BrokenPipeError, ConnectionResetError) as exc: - self._loop.remove_writer(self._sock_fd) - self._force_close(exc) - return except Exception as exc: self._loop.remove_writer(self._sock_fd) self._fatal_error(exc) @@ -726,12 +712,12 @@ else: self._sock.sendto(data, addr) return + except (BlockingIOError, InterruptedError): + self._loop.add_writer(self._sock_fd, self._sendto_ready) except ConnectionRefusedError as exc: if self._address: self._fatal_error(exc) return - except (BlockingIOError, InterruptedError): - self._loop.add_writer(self._sock_fd, self._sendto_ready) except Exception as exc: self._fatal_error(exc) return @@ -746,13 +732,13 @@ self._sock.send(data) else: self._sock.sendto(data, addr) + except (BlockingIOError, InterruptedError): + self._buffer.appendleft((data, addr)) # Try again later. + break except ConnectionRefusedError as exc: if self._address: self._fatal_error(exc) return - except (BlockingIOError, InterruptedError): - self._buffer.appendleft((data, addr)) # Try again later. - break except Exception as exc: self._fatal_error(exc) return @@ -765,5 +751,4 @@ def _force_close(self, exc): if self._address and isinstance(exc, ConnectionRefusedError): self._protocol.connection_refused(exc) - super()._force_close(exc) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 19:24:23 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 19:24:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318810=3A_Be_optim?= =?utf-8?q?istic_with_stat_calls_when_seeing_if_a_directory?= Message-ID: <3d1YyH4L2tz7LjP@mail.python.org> http://hg.python.org/cpython/rev/11f2f4af1979 changeset: 86444:11f2f4af1979 user: Brett Cannon date: Fri Oct 18 13:24:13 2013 -0400 summary: Issue #18810: Be optimistic with stat calls when seeing if a directory exists when checking for a package. Before there was an isdir check and then various isfile checks for possible __init__ files when looking for a package. This change drops the isdir check by leaning on the assumption that a directory will not contain something named after the module being imported which is not a directory. If the module is a package then it saves a stat call. If there is nothing in the directory with the potential package name it also saves a stat call. Only if there is something in the directory named the same thing as the potential package will the number of stat calls increase (due to more wasteful __init__ checks). Semantically there is no change as the isdir check moved down so that namespace packages continue to have no chance of accidentally collecting non-existent directories. files: Lib/importlib/_bootstrap.py | 19 +- Python/importlib.h | 1537 +++++++++++----------- 2 files changed, 777 insertions(+), 779 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1406,16 +1406,15 @@ # Check if the module is the name of a directory (and thus a package). if cache_module in cache: base_path = _path_join(self.path, tail_module) - if _path_isdir(base_path): - for suffix, loader in self._loaders: - init_filename = '__init__' + suffix - full_path = _path_join(base_path, init_filename) - if _path_isfile(full_path): - return (loader(fullname, full_path), [base_path]) - else: - # A namespace package, return the path if we don't also - # find a module in the next section. - is_namespace = True + for suffix, loader in self._loaders: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + return (loader(fullname, full_path), [base_path]) + else: + # If a namespace package, return the path if we don't + # find a module in the next section. + is_namespace = _path_isdir(base_path) # Check for a file w/ a proper suffix exists. for suffix, loader in self._loaders: full_path = _path_join(self.path, tail_module + suffix) diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 19:25:06 2013 From: python-checkins at python.org (barry.warsaw) Date: Fri, 18 Oct 2013 19:25:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Spell_check_and_wrap=2E?= Message-ID: <3d1Yz63d4Zz7Ljs@mail.python.org> http://hg.python.org/peps/rev/929b45d8e044 changeset: 5199:929b45d8e044 user: Barry Warsaw date: Fri Oct 18 13:24:59 2013 -0400 summary: Spell check and wrap. files: pep-0447.txt | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pep-0447.txt b/pep-0447.txt --- a/pep-0447.txt +++ b/pep-0447.txt @@ -48,7 +48,7 @@ peeks in the class ``__dict__``), and that can be problematic for dynamic classes that can grow new methods on demand. -The ``__locallookup__`` method makes it possible to dynamicly add +The ``__locallookup__`` method makes it possible to dynamically add attributes even when looking them up using the `super class`_. The new method affects ``object.__getattribute__`` (and @@ -138,8 +138,9 @@ PyObject* (*locallookupfunc)(PyTypeObject* cls, PyObject* name); -This method should lookup *name* in the namespace of *cls*, without looking -at superclasses, and should not invoke descriptors. The method returns ``NULL`` without setting an exception when the *name* cannot be found, and returns a +This method should lookup *name* in the namespace of *cls*, without looking at +superclasses, and should not invoke descriptors. The method returns ``NULL`` +without setting an exception when the *name* cannot be found, and returns a new reference otherwise (not a borrowed reference). Use of this hook by the interpreter @@ -173,7 +174,7 @@ machine an Core i7 processor running Centos 6.4. Even though the machine was idle there were clear differences between runs, -I've seen difference in "minimum time" vary from -0.1% to +1.5%, with simular +I've seen difference in "minimum time" vary from -0.1% to +1.5%, with similar (but slightly smaller) differences in the "average time" difference. :: @@ -395,8 +396,8 @@ def __getattribute_super__(cls, name, object, owner): pass -This method performed name lookup as well as invoking descriptors and was necessarily -limited to working only with ``super.__getattribute__``. +This method performed name lookup as well as invoking descriptors and was +necessarily limited to working only with ``super.__getattribute__``. Reuse ``tp_getattro`` -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 18 19:29:11 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 19:29:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_NEWS_entry_for_issue_?= =?utf-8?q?=2318810?= Message-ID: <3d1Z3q6xfZz7LjY@mail.python.org> http://hg.python.org/cpython/rev/9895a9c20e8a changeset: 86445:9895a9c20e8a user: Brett Cannon date: Fri Oct 18 13:29:04 2013 -0400 summary: Add NEWS entry for issue #18810 files: Misc/NEWS | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,11 @@ Core and Builtins ----------------- +- Issue #18810: Shift stat calls in importlib.machinery.FileFinder such that + the code is optimistic that if something exists in a directory named exactly + like the possible package being searched for that it's in actuality a + directory. + - Issue #18416: importlib.machinery.PathFinder now treats '' as the cwd and importlib.machinery.FileFinder no longer special-cases '' to '.'. This leads to modules imported from cwd to now possess an absolute file path for -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 20:03:23 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 20:03:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_a_refleak_in_=5Fsre?= Message-ID: <3d1ZqH1xd6z7LjP@mail.python.org> http://hg.python.org/cpython/rev/5010e0c13aa3 changeset: 86446:5010e0c13aa3 user: Brett Cannon date: Fri Oct 18 14:03:16 2013 -0400 summary: Fix a refleak in _sre files: Misc/NEWS | 2 ++ Modules/_sre.c | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,8 @@ Library ------- +- Fix a reference count leak in _sre. + - Issue #19262: Initial check in of the 'asyncio' package (a.k.a. Tulip, a.k.a. PEP 3156). There are no docs yet, and the PEP is slightly out of date with the code. This module will have *provisional* status diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2427,6 +2427,7 @@ else item = PyUnicode_Join(joiner, list); Py_DECREF(joiner); + Py_DECREF(list); if (!item) return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 21:12:29 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 21:12:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Have_tes?= =?utf-8?q?t=5Fimportlib=2Etest=5Flocks_use_frozen_and_source?= Message-ID: <3d1cM10GVRz7LjS@mail.python.org> http://hg.python.org/cpython/rev/66e219519279 changeset: 86447:66e219519279 user: Brett Cannon date: Fri Oct 18 15:12:21 2013 -0400 summary: Issue #16803: Have test_importlib.test_locks use frozen and source code. files: Lib/test/test_importlib/test_locks.py | 69 ++++++++++---- 1 files changed, 48 insertions(+), 21 deletions(-) diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py --- a/Lib/test/test_importlib/test_locks.py +++ b/Lib/test/test_importlib/test_locks.py @@ -1,4 +1,8 @@ -from importlib import _bootstrap +from . import util +frozen_init, source_init = util.import_importlib('importlib') +frozen_bootstrap = frozen_init._bootstrap +source_bootstrap = source_init._bootstrap + import sys import time import unittest @@ -13,14 +17,9 @@ else: from test import lock_tests - -LockType = _bootstrap._ModuleLock -DeadlockError = _bootstrap._DeadlockError - - if threading is not None: class ModuleLockAsRLockTests(lock_tests.RLockTests): - locktype = staticmethod(lambda: LockType("some_lock")) + locktype = classmethod(lambda cls: cls.LockType("some_lock")) # _is_owned() unsupported test__is_owned = None @@ -34,13 +33,21 @@ # _release_save() unsupported test_release_save_unacquired = None + class Frozen_ModuleLockAsRLockTests(ModuleLockAsRLockTests, lock_tests.RLockTests): + LockType = frozen_bootstrap._ModuleLock + + class Source_ModuleLockAsRLockTests(ModuleLockAsRLockTests, lock_tests.RLockTests): + LockType = source_bootstrap._ModuleLock + else: - class ModuleLockAsRLockTests(unittest.TestCase): + class Frozen_ModuleLockAsRLockTests(unittest.TestCase): pass + class Source_ModuleLockAsRLockTests(unittest.TestCase): + pass - at unittest.skipUnless(threading, "threads needed for this test") -class DeadlockAvoidanceTests(unittest.TestCase): + +class DeadlockAvoidanceTests: def setUp(self): try: @@ -55,7 +62,7 @@ def run_deadlock_avoidance_test(self, create_deadlock): NLOCKS = 10 - locks = [LockType(str(i)) for i in range(NLOCKS)] + locks = [self.LockType(str(i)) for i in range(NLOCKS)] pairs = [(locks[i], locks[(i+1)%NLOCKS]) for i in range(NLOCKS)] if create_deadlock: NTHREADS = NLOCKS @@ -67,7 +74,7 @@ """Try to acquire the lock. Return True on success, False on deadlock.""" try: lock.acquire() - except DeadlockError: + except self.DeadlockError: return False else: return True @@ -99,30 +106,50 @@ self.assertEqual(results.count((True, False)), 0) self.assertEqual(results.count((True, True)), len(results)) + at unittest.skipUnless(threading, "threads needed for this test") +class Frozen_DeadlockAvoidanceTests(DeadlockAvoidanceTests, unittest.TestCase): + LockType = frozen_bootstrap._ModuleLock + DeadlockError = frozen_bootstrap._DeadlockError -class LifetimeTests(unittest.TestCase): + at unittest.skipUnless(threading, "threads needed for this test") +class Source_DeadlockAvoidanceTests(DeadlockAvoidanceTests, unittest.TestCase): + LockType = source_bootstrap._ModuleLock + DeadlockError = source_bootstrap._DeadlockError + + +class LifetimeTests: def test_lock_lifetime(self): name = "xyzzy" - self.assertNotIn(name, _bootstrap._module_locks) - lock = _bootstrap._get_module_lock(name) - self.assertIn(name, _bootstrap._module_locks) + self.assertNotIn(name, self.bootstrap._module_locks) + lock = self.bootstrap._get_module_lock(name) + self.assertIn(name, self.bootstrap._module_locks) wr = weakref.ref(lock) del lock support.gc_collect() - self.assertNotIn(name, _bootstrap._module_locks) + self.assertNotIn(name, self.bootstrap._module_locks) self.assertIsNone(wr()) def test_all_locks(self): support.gc_collect() - self.assertEqual(0, len(_bootstrap._module_locks), _bootstrap._module_locks) + self.assertEqual(0, len(self.bootstrap._module_locks), + self.bootstrap._module_locks) + +class Frozen_LifetimeTests(LifetimeTests, unittest.TestCase): + bootstrap = frozen_bootstrap + +class Source_LifetimeTests(LifetimeTests, unittest.TestCase): + bootstrap = source_bootstrap @support.reap_threads def test_main(): - support.run_unittest(ModuleLockAsRLockTests, - DeadlockAvoidanceTests, - LifetimeTests) + support.run_unittest(Frozen_ModuleLockAsRLockTests, + Source_ModuleLockAsRLockTests, + Frozen_DeadlockAvoidanceTests, + Source_DeadlockAvoidanceTests, + Frozen_LifetimeTests, + Source_LifetimeTests) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 21:40:19 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 21:40:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Move_tes?= =?utf-8?q?t=5Fimportlib=2Etest=5Futil_to_use_both_frozen_and?= Message-ID: <3d1cz75SwXzShK@mail.python.org> http://hg.python.org/cpython/rev/862043d74fae changeset: 86448:862043d74fae user: Brett Cannon date: Fri Oct 18 15:40:11 2013 -0400 summary: Issue #16803: Move test_importlib.test_util to use both frozen and source code. files: Lib/test/test_importlib/test_util.py | 135 +++++++++----- Lib/test/test_importlib/util.py | 11 + 2 files changed, 96 insertions(+), 50 deletions(-) diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -1,5 +1,6 @@ from importlib import util from . import util as test_util +frozen_util, source_util = test_util.import_importlib('importlib.util') import os import sys @@ -9,28 +10,31 @@ import warnings -class DecodeSourceBytesTests(unittest.TestCase): +class DecodeSourceBytesTests: source = "string ='?'" def test_ut8_default(self): source_bytes = self.source.encode('utf-8') - self.assertEqual(util.decode_source(source_bytes), self.source) + self.assertEqual(self.util.decode_source(source_bytes), self.source) def test_specified_encoding(self): source = '# coding=latin-1\n' + self.source source_bytes = source.encode('latin-1') assert source_bytes != source.encode('utf-8') - self.assertEqual(util.decode_source(source_bytes), source) + self.assertEqual(self.util.decode_source(source_bytes), source) def test_universal_newlines(self): source = '\r\n'.join([self.source, self.source]) source_bytes = source.encode('utf-8') - self.assertEqual(util.decode_source(source_bytes), + self.assertEqual(self.util.decode_source(source_bytes), '\n'.join([self.source, self.source])) +Frozen_DecodeSourceBytesTests, Source_DecodeSourceBytesTests = test_util.test_both( + DecodeSourceBytesTests, util=[frozen_util, source_util]) -class ModuleToLoadTests(unittest.TestCase): + +class ModuleToLoadTests: module_name = 'ModuleManagerTest_module' @@ -42,7 +46,7 @@ # Test a new module is created, inserted into sys.modules, has # __initializing__ set to True after entering the context manager, # and __initializing__ set to False after exiting. - with util.module_to_load(self.module_name) as module: + with self.util.module_to_load(self.module_name) as module: self.assertIn(self.module_name, sys.modules) self.assertIs(sys.modules[self.module_name], module) self.assertTrue(module.__initializing__) @@ -51,7 +55,7 @@ def test_new_module_failed(self): # Test the module is removed from sys.modules. try: - with util.module_to_load(self.module_name) as module: + with self.util.module_to_load(self.module_name) as module: self.assertIn(self.module_name, sys.modules) raise exception except Exception: @@ -63,7 +67,7 @@ # Test that the same module is in sys.modules. created_module = types.ModuleType(self.module_name) sys.modules[self.module_name] = created_module - with util.module_to_load(self.module_name) as module: + with self.util.module_to_load(self.module_name) as module: self.assertIs(module, created_module) def test_reload_failed(self): @@ -71,7 +75,7 @@ created_module = types.ModuleType(self.module_name) sys.modules[self.module_name] = created_module try: - with util.module_to_load(self.module_name) as module: + with self.util.module_to_load(self.module_name) as module: raise Exception except Exception: self.assertIn(self.module_name, sys.modules) @@ -84,29 +88,33 @@ created_module = types.ModuleType(self.module_name) created_module.__name__ = odd_name sys.modules[self.module_name] = created_module - with util.module_to_load(self.module_name) as module: + with self.util.module_to_load(self.module_name) as module: self.assertEqual(module.__name__, self.module_name) created_module.__name__ = odd_name - with util.module_to_load(self.module_name, reset_name=False) as module: + with self.util.module_to_load(self.module_name, reset_name=False) as module: self.assertEqual(module.__name__, odd_name) +Frozen_ModuleToLoadTests, Source_ModuleToLoadTests = test_util.test_both( + ModuleToLoadTests, + util=[frozen_util, source_util]) -class ModuleForLoaderTests(unittest.TestCase): + +class ModuleForLoaderTests: """Tests for importlib.util.module_for_loader.""" - @staticmethod - def module_for_loader(func): + @classmethod + def module_for_loader(cls, func): with warnings.catch_warnings(): warnings.simplefilter('ignore', PendingDeprecationWarning) - return util.module_for_loader(func) + return cls.util.module_for_loader(func) def test_warning(self): # Should raise a PendingDeprecationWarning when used. with warnings.catch_warnings(): warnings.simplefilter('error', PendingDeprecationWarning) with self.assertRaises(PendingDeprecationWarning): - func = util.module_for_loader(lambda x: x) + func = self.util.module_for_loader(lambda x: x) def return_module(self, name): fxn = self.module_for_loader(lambda self, module: module) @@ -216,8 +224,11 @@ self.assertIs(module.__loader__, loader) self.assertEqual(module.__package__, name) +Frozen_ModuleForLoaderTests, Source_ModuleForLoaderTests = test_util.test_both( + ModuleForLoaderTests, util=[frozen_util, source_util]) -class SetPackageTests(unittest.TestCase): + +class SetPackageTests: """Tests for importlib.util.set_package.""" @@ -225,7 +236,7 @@ """Verify the module has the expected value for __package__ after passing through set_package.""" fxn = lambda: module - wrapped = util.set_package(fxn) + wrapped = self.util.set_package(fxn) wrapped() self.assertTrue(hasattr(module, '__package__')) self.assertEqual(expect, module.__package__) @@ -266,12 +277,15 @@ def test_decorator_attrs(self): def fxn(module): pass - wrapped = util.set_package(fxn) + wrapped = self.util.set_package(fxn) self.assertEqual(wrapped.__name__, fxn.__name__) self.assertEqual(wrapped.__qualname__, fxn.__qualname__) +Frozen_SetPackageTests, Source_SetPackageTests = test_util.test_both( + SetPackageTests, util=[frozen_util, source_util]) -class SetLoaderTests(unittest.TestCase): + +class SetLoaderTests: """Tests importlib.util.set_loader().""" @@ -301,56 +315,73 @@ loader.module.__loader__ = 42 self.assertEqual(42, loader.load_module('blah').__loader__) +class Frozen_SetLoaderTests(SetLoaderTests, unittest.TestCase): + class DummyLoader: + @frozen_util.set_loader + def load_module(self, module): + return self.module -class ResolveNameTests(unittest.TestCase): +class Source_SetLoaderTests(SetLoaderTests, unittest.TestCase): + class DummyLoader: + @source_util.set_loader + def load_module(self, module): + return self.module + + +class ResolveNameTests: """Tests importlib.util.resolve_name().""" def test_absolute(self): # bacon - self.assertEqual('bacon', util.resolve_name('bacon', None)) + self.assertEqual('bacon', self.util.resolve_name('bacon', None)) def test_aboslute_within_package(self): # bacon in spam - self.assertEqual('bacon', util.resolve_name('bacon', 'spam')) + self.assertEqual('bacon', self.util.resolve_name('bacon', 'spam')) def test_no_package(self): # .bacon in '' with self.assertRaises(ValueError): - util.resolve_name('.bacon', '') + self.util.resolve_name('.bacon', '') def test_in_package(self): # .bacon in spam self.assertEqual('spam.eggs.bacon', - util.resolve_name('.bacon', 'spam.eggs')) + self.util.resolve_name('.bacon', 'spam.eggs')) def test_other_package(self): # ..bacon in spam.bacon self.assertEqual('spam.bacon', - util.resolve_name('..bacon', 'spam.eggs')) + self.util.resolve_name('..bacon', 'spam.eggs')) def test_escape(self): # ..bacon in spam with self.assertRaises(ValueError): - util.resolve_name('..bacon', 'spam') + self.util.resolve_name('..bacon', 'spam') +Frozen_ResolveNameTests, Source_ResolveNameTests = test_util.test_both( + ResolveNameTests, + util=[frozen_util, source_util]) -class MagicNumberTests(unittest.TestCase): + +class MagicNumberTests: def test_length(self): # Should be 4 bytes. - self.assertEqual(len(util.MAGIC_NUMBER), 4) + self.assertEqual(len(self.util.MAGIC_NUMBER), 4) def test_incorporates_rn(self): # The magic number uses \r\n to come out wrong when splitting on lines. - self.assertTrue(util.MAGIC_NUMBER.endswith(b'\r\n')) + self.assertTrue(self.util.MAGIC_NUMBER.endswith(b'\r\n')) +Frozen_MagicNumberTests, Source_MagicNumberTests = test_util.test_both( + MagicNumberTests, util=[frozen_util, source_util]) -class PEP3147Tests(unittest.TestCase): - """Tests of PEP 3147-related functions: - cache_from_source and source_from_cache. - """ +class PEP3147Tests: + + """Tests of PEP 3147-related functions: cache_from_source and source_from_cache.""" tag = sys.implementation.cache_tag @@ -362,20 +393,20 @@ path = os.path.join('foo', 'bar', 'baz', 'qux.py') expect = os.path.join('foo', 'bar', 'baz', '__pycache__', 'qux.{}.pyc'.format(self.tag)) - self.assertEqual(util.cache_from_source(path, True), expect) + self.assertEqual(self.util.cache_from_source(path, True), expect) def test_cache_from_source_no_cache_tag(self): # No cache tag means NotImplementedError. with support.swap_attr(sys.implementation, 'cache_tag', None): with self.assertRaises(NotImplementedError): - util.cache_from_source('whatever.py') + self.util.cache_from_source('whatever.py') def test_cache_from_source_no_dot(self): # Directory with a dot, filename without dot. path = os.path.join('foo.bar', 'file') expect = os.path.join('foo.bar', '__pycache__', 'file{}.pyc'.format(self.tag)) - self.assertEqual(util.cache_from_source(path, True), expect) + self.assertEqual(self.util.cache_from_source(path, True), expect) def test_cache_from_source_optimized(self): # Given the path to a .py file, return the path to its PEP 3147 @@ -383,12 +414,12 @@ path = os.path.join('foo', 'bar', 'baz', 'qux.py') expect = os.path.join('foo', 'bar', 'baz', '__pycache__', 'qux.{}.pyo'.format(self.tag)) - self.assertEqual(util.cache_from_source(path, False), expect) + self.assertEqual(self.util.cache_from_source(path, False), expect) def test_cache_from_source_cwd(self): path = 'foo.py' expect = os.path.join('__pycache__', 'foo.{}.pyc'.format(self.tag)) - self.assertEqual(util.cache_from_source(path, True), expect) + self.assertEqual(self.util.cache_from_source(path, True), expect) def test_cache_from_source_override(self): # When debug_override is not None, it can be any true-ish or false-ish @@ -396,22 +427,22 @@ path = os.path.join('foo', 'bar', 'baz.py') partial_expect = os.path.join('foo', 'bar', '__pycache__', 'baz.{}.py'.format(self.tag)) - self.assertEqual(util.cache_from_source(path, []), partial_expect + 'o') - self.assertEqual(util.cache_from_source(path, [17]), + self.assertEqual(self.util.cache_from_source(path, []), partial_expect + 'o') + self.assertEqual(self.util.cache_from_source(path, [17]), partial_expect + 'c') # However if the bool-ishness can't be determined, the exception # propagates. class Bearish: def __bool__(self): raise RuntimeError with self.assertRaises(RuntimeError): - util.cache_from_source('/foo/bar/baz.py', Bearish()) + self.util.cache_from_source('/foo/bar/baz.py', Bearish()) @unittest.skipUnless(os.sep == '\\' and os.altsep == '/', 'test meaningful only where os.altsep is defined') def test_sep_altsep_and_sep_cache_from_source(self): # Windows path and PEP 3147 where sep is right of altsep. self.assertEqual( - util.cache_from_source('\\foo\\bar\\baz/qux.py', True), + self.util.cache_from_source('\\foo\\bar\\baz/qux.py', True), '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag)) @unittest.skipUnless(sys.implementation.cache_tag is not None, @@ -423,43 +454,47 @@ path = os.path.join('foo', 'bar', 'baz', '__pycache__', 'qux.{}.pyc'.format(self.tag)) expect = os.path.join('foo', 'bar', 'baz', 'qux.py') - self.assertEqual(util.source_from_cache(path), expect) + self.assertEqual(self.util.source_from_cache(path), expect) def test_source_from_cache_no_cache_tag(self): # If sys.implementation.cache_tag is None, raise NotImplementedError. path = os.path.join('blah', '__pycache__', 'whatever.pyc') with support.swap_attr(sys.implementation, 'cache_tag', None): with self.assertRaises(NotImplementedError): - util.source_from_cache(path) + self.util.source_from_cache(path) def test_source_from_cache_bad_path(self): # When the path to a pyc file is not in PEP 3147 format, a ValueError # is raised. self.assertRaises( - ValueError, util.source_from_cache, '/foo/bar/bazqux.pyc') + ValueError, self.util.source_from_cache, '/foo/bar/bazqux.pyc') def test_source_from_cache_no_slash(self): # No slashes at all in path -> ValueError self.assertRaises( - ValueError, util.source_from_cache, 'foo.cpython-32.pyc') + ValueError, self.util.source_from_cache, 'foo.cpython-32.pyc') def test_source_from_cache_too_few_dots(self): # Too few dots in final path component -> ValueError self.assertRaises( - ValueError, util.source_from_cache, '__pycache__/foo.pyc') + ValueError, self.util.source_from_cache, '__pycache__/foo.pyc') def test_source_from_cache_too_many_dots(self): # Too many dots in final path component -> ValueError self.assertRaises( - ValueError, util.source_from_cache, + ValueError, self.util.source_from_cache, '__pycache__/foo.cpython-32.foo.pyc') def test_source_from_cache_no__pycache__(self): # Another problem with the path -> ValueError self.assertRaises( - ValueError, util.source_from_cache, + ValueError, self.util.source_from_cache, '/foo/bar/foo.cpython-32.foo.pyc') +Frozen_PEP3147Tests, Source_PEP3147Tests = test_util.test_both( + PEP3147Tests, + util=[frozen_util, source_util]) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -15,6 +15,17 @@ return frozen, source +def test_both(test_class, **kwargs): + frozen_tests = types.new_class('Frozen_'+test_class.__name__, + (test_class, unittest.TestCase)) + source_tests = types.new_class('Source_'+test_class.__name__, + (test_class, unittest.TestCase)) + for attr, (frozen_value, source_value) in kwargs.items(): + setattr(frozen_tests, attr, frozen_value) + setattr(source_tests, attr, source_value) + return frozen_tests, source_tests + + CASE_INSENSITIVE_FS = True # Windows is the only OS that is *always* case-insensitive # (OS X *can* be case-sensitive). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 18 22:55:21 2013 From: python-checkins at python.org (brett.cannon) Date: Fri, 18 Oct 2013 22:55:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_test_to_not_consider_m?= =?utf-8?q?ixin_a_standalone_test?= Message-ID: <3d1fdj5MQTzNN5@mail.python.org> http://hg.python.org/cpython/rev/bea507fbcd81 changeset: 86449:bea507fbcd81 user: Brett Cannon date: Fri Oct 18 16:55:15 2013 -0400 summary: Fix test to not consider mixin a standalone test files: Lib/test/test_importlib/test_locks.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py --- a/Lib/test/test_importlib/test_locks.py +++ b/Lib/test/test_importlib/test_locks.py @@ -18,7 +18,7 @@ from test import lock_tests if threading is not None: - class ModuleLockAsRLockTests(lock_tests.RLockTests): + class ModuleLockAsRLockTests: locktype = classmethod(lambda cls: cls.LockType("some_lock")) # _is_owned() unsupported -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 00:11:39 2013 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 19 Oct 2013 00:11:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319201=3A_Add_supp?= =?utf-8?q?ort_for_the_=27x=27_mode_to_the_lzma_module=2E?= Message-ID: <3d1hKl6Q1fz7LjM@mail.python.org> http://hg.python.org/cpython/rev/b7948aaca1dd changeset: 86450:b7948aaca1dd user: Nadeem Vawda date: Sat Oct 19 00:06:19 2013 +0200 summary: Issue #19201: Add support for the 'x' mode to the lzma module. Patch by Tim Heaney and Vajrasky Kok. files: Doc/library/lzma.rst | 15 ++++++++++--- Lib/lzma.py | 13 ++++++----- Lib/test/test_lzma.py | 32 ++++++++++++++++++++++++++++-- Misc/ACKS | 1 + Misc/NEWS | 3 ++ 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -39,8 +39,8 @@ opened, or it can be an existing file object to read from or write to. The *mode* argument can be any of ``"r"``, ``"rb"``, ``"w"``, ``"wb"``, - ``"a"`` or ``"ab"`` for binary mode, or ``"rt"``, ``"wt"``, or ``"at"`` for - text mode. The default is ``"rb"``. + ``"x"``, ``"xb"``, ``"a"`` or ``"ab"`` for binary mode, or ``"rt"``, + ``"wt"``, ``"xt"``, or ``"at"`` for text mode. The default is ``"rb"``. When opening a file for reading, the *format* and *filters* arguments have the same meanings as for :class:`LZMADecompressor`. In this case, the *check* @@ -57,6 +57,9 @@ :class:`io.TextIOWrapper` instance with the specified encoding, error handling behavior, and line ending(s). + .. versionchanged:: 3.4 + Added support for the ``"x"``, ``"xb"`` and ``"xt"`` modes. + .. class:: LZMAFile(filename=None, mode="r", \*, format=None, check=-1, preset=None, filters=None) @@ -69,8 +72,9 @@ file will not be closed when the :class:`LZMAFile` is closed. The *mode* argument can be either ``"r"`` for reading (default), ``"w"`` for - overwriting, or ``"a"`` for appending. These can equivalently be given as - ``"rb"``, ``"wb"``, and ``"ab"`` respectively. + overwriting, ``"x"`` for exclusive creation, or ``"a"`` for appending. These + can equivalently be given as ``"rb"``, ``"wb"``, ``"xb"`` and ``"ab"`` + respectively. If *filename* is a file object (rather than an actual file name), a mode of ``"w"`` does not truncate the file, and is instead equivalent to ``"a"``. @@ -98,6 +102,9 @@ byte of data will be returned, unless EOF has been reached. The exact number of bytes returned is unspecified (the *size* argument is ignored). + .. versionchanged:: 3.4 + Added support for the ``"x"`` and ``"xb"`` modes. + Compressing and decompressing data in memory -------------------------------------------- diff --git a/Lib/lzma.py b/Lib/lzma.py --- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -54,9 +54,9 @@ bytes object), in which case the named file is opened, or it can be an existing file object to read from or write to. - mode can be "r" for reading (default), "w" for (over)writing, or - "a" for appending. These can equivalently be given as "rb", "wb" - and "ab" respectively. + mode can be "r" for reading (default), "w" for (over)writing, + "x" for creating exclusively, or "a" for appending. These can + equivalently be given as "rb", "wb", "xb" and "ab" respectively. format specifies the container format to use for the file. If mode is "r", this defaults to FORMAT_AUTO. Otherwise, the @@ -112,7 +112,7 @@ self._decompressor = LZMADecompressor(**self._init_args) self._buffer = b"" self._buffer_offset = 0 - elif mode in ("w", "wb", "a", "ab"): + elif mode in ("w", "wb", "a", "ab", "x", "xb"): if format is None: format = FORMAT_XZ mode_code = _MODE_WRITE @@ -426,8 +426,9 @@ object), in which case the named file is opened, or it can be an existing file object to read from or write to. - The mode argument can be "r", "rb" (default), "w", "wb", "a" or "ab" - for binary mode, or "rt", "wt" or "at" for text mode. + The mode argument can be "r", "rb" (default), "w", "wb", "x", "xb", + "a", or "ab" for binary mode, or "rt", "wt", "xt", or "at" for text + mode. The format, check, preset and filters arguments specify the compression settings, as for LZMACompressor, LZMADecompressor and diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -362,6 +362,8 @@ pass with LZMAFile(BytesIO(), "w") as f: pass + with LZMAFile(BytesIO(), "x") as f: + pass with LZMAFile(BytesIO(), "a") as f: pass @@ -389,13 +391,29 @@ with LZMAFile(TESTFN, "ab"): pass + def test_init_with_x_mode(self): + self.addCleanup(unlink, TESTFN) + for mode in ("x", "xb"): + unlink(TESTFN) + with LZMAFile(TESTFN, mode): + pass + with self.assertRaises(FileExistsError): + with LZMAFile(TESTFN, mode): + pass + def test_init_bad_mode(self): with self.assertRaises(ValueError): LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x")) with self.assertRaises(ValueError): LZMAFile(BytesIO(COMPRESSED_XZ), "") with self.assertRaises(ValueError): - LZMAFile(BytesIO(COMPRESSED_XZ), "x") + LZMAFile(BytesIO(COMPRESSED_XZ), "xt") + with self.assertRaises(ValueError): + LZMAFile(BytesIO(COMPRESSED_XZ), "x+") + with self.assertRaises(ValueError): + LZMAFile(BytesIO(COMPRESSED_XZ), "rx") + with self.assertRaises(ValueError): + LZMAFile(BytesIO(COMPRESSED_XZ), "wx") with self.assertRaises(ValueError): LZMAFile(BytesIO(COMPRESSED_XZ), "rt") with self.assertRaises(ValueError): @@ -1022,8 +1040,6 @@ with self.assertRaises(ValueError): lzma.open(TESTFN, "") with self.assertRaises(ValueError): - lzma.open(TESTFN, "x") - with self.assertRaises(ValueError): lzma.open(TESTFN, "rbt") with self.assertRaises(ValueError): lzma.open(TESTFN, "rb", encoding="utf-8") @@ -1072,6 +1088,16 @@ with lzma.open(bio, "rt", newline="\r") as f: self.assertEqual(f.readlines(), [text]) + def test_x_mode(self): + self.addCleanup(unlink, TESTFN) + for mode in ("x", "xb", "xt"): + unlink(TESTFN) + with lzma.open(TESTFN, mode): + pass + with self.assertRaises(FileExistsError): + with lzma.open(TESTFN, mode): + pass + class MiscellaneousTestCase(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -506,6 +506,7 @@ Rycharde Hawkes Ben Hayden Jochen Hayek +Tim Heaney Henrik Heimbuerger Christian Heimes Thomas Heller diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,9 @@ Library ------- +- Issue #19201: Add "x" mode (exclusive creation) in opening file to lzma + module. Patch by Tim Heaney and Vajrasky Kok. + - Fix a reference count leak in _sre. - Issue #19262: Initial check in of the 'asyncio' package (a.k.a. Tulip, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 00:11:41 2013 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 19 Oct 2013 00:11:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319223=3A_Add_supp?= =?utf-8?q?ort_for_the_=27x=27_mode_to_the_bz2_module=2E?= Message-ID: <3d1hKn2B1Dz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/5abc04e6579b changeset: 86451:5abc04e6579b user: Nadeem Vawda date: Sat Oct 19 00:11:06 2013 +0200 summary: Issue #19223: Add support for the 'x' mode to the bz2 module. Patch by Tim Heaney and Vajrasky Kok. files: Doc/library/bz2.rst | 15 +++- Lib/bz2.py | 16 +++-- Lib/test/test_bz2.py | 93 +++++++++++++++++++------------ Misc/NEWS | 4 +- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -37,8 +37,8 @@ file object to read from or write to. The *mode* argument can be any of ``'r'``, ``'rb'``, ``'w'``, ``'wb'``, - ``'a'``, or ``'ab'`` for binary mode, or ``'rt'``, ``'wt'``, or ``'at'`` for - text mode. The default is ``'rb'``. + ``'x'``, ``'xb'``, ``'a'`` or ``'ab'`` for binary mode, or ``'rt'``, + ``'wt'``, ``'xt'``, or ``'at'`` for text mode. The default is ``'rb'``. The *compresslevel* argument is an integer from 1 to 9, as for the :class:`BZ2File` constructor. @@ -54,6 +54,9 @@ .. versionadded:: 3.3 + .. versionchanged:: 3.4 + The ``'x'`` (exclusive creation) mode was added. + .. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9) @@ -64,8 +67,9 @@ be used to read or write the compressed data. The *mode* argument can be either ``'r'`` for reading (default), ``'w'`` for - overwriting, or ``'a'`` for appending. These can equivalently be given as - ``'rb'``, ``'wb'``, and ``'ab'`` respectively. + overwriting, ``'x'`` for exclusive creation, or ``'a'`` for appending. These + can equivalently be given as ``'rb'``, ``'wb'``, ``'xb'`` and ``'ab'`` + respectively. If *filename* is a file object (rather than an actual file name), a mode of ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. @@ -108,6 +112,9 @@ The ``'a'`` (append) mode was added, along with support for reading multi-stream files. + .. versionchanged:: 3.4 + The ``'x'`` (exclusive creation) mode was added. + Incremental (de)compression --------------------------- diff --git a/Lib/bz2.py b/Lib/bz2.py --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -49,12 +49,12 @@ which will be used to read or write the compressed data. mode can be 'r' for reading (default), 'w' for (over)writing, - or 'a' for appending. These can equivalently be given as 'rb', - 'wb', and 'ab'. + 'x' for creating exclusively, or 'a' for appending. These can + equivalently be given as 'rb', 'wb', 'xb', and 'ab'. buffering is ignored. Its use is deprecated. - If mode is 'w' or 'a', compresslevel can be a number between 1 + If mode is 'w', 'x' or 'a', compresslevel can be a number between 1 and 9 specifying the level of compression: 1 produces the least compression, and 9 (default) produces the most compression. @@ -87,6 +87,10 @@ mode = "wb" mode_code = _MODE_WRITE self._compressor = BZ2Compressor(compresslevel) + elif mode in ("x", "xb"): + mode = "xb" + mode_code = _MODE_WRITE + self._compressor = BZ2Compressor(compresslevel) elif mode in ("a", "ab"): mode = "ab" mode_code = _MODE_WRITE @@ -443,9 +447,9 @@ The filename argument can be an actual filename (a str or bytes object), or an existing file object to read from or write to. - The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for - binary mode, or "rt", "wt" or "at" for text mode. The default mode - is "rb", and the default compresslevel is 9. + The mode argument can be "r", "rb", "w", "wb", "x", "xb", "a" or + "ab" for binary mode, or "rt", "wt", "xt" or "at" for text mode. + The default mode is "rb", and the default compresslevel is 9. For binary mode, this function is equivalent to the BZ2File constructor: BZ2File(filename, mode, compresslevel). In this case, diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -8,6 +8,7 @@ import random import subprocess import sys +from test.support import unlink try: import threading @@ -715,49 +716,67 @@ return bz2.open(*args, **kwargs) def test_binary_modes(self): - with self.open(self.filename, "wb") as f: - f.write(self.TEXT) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()) - self.assertEqual(file_data, self.TEXT) - with self.open(self.filename, "rb") as f: - self.assertEqual(f.read(), self.TEXT) - with self.open(self.filename, "ab") as f: - f.write(self.TEXT) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()) - self.assertEqual(file_data, self.TEXT * 2) + for mode in ("wb", "xb"): + if mode == "xb": + unlink(self.filename) + with self.open(self.filename, mode) as f: + f.write(self.TEXT) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()) + self.assertEqual(file_data, self.TEXT) + with self.open(self.filename, "rb") as f: + self.assertEqual(f.read(), self.TEXT) + with self.open(self.filename, "ab") as f: + f.write(self.TEXT) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()) + self.assertEqual(file_data, self.TEXT * 2) def test_implicit_binary_modes(self): # Test implicit binary modes (no "b" or "t" in mode string). - with self.open(self.filename, "w") as f: - f.write(self.TEXT) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()) - self.assertEqual(file_data, self.TEXT) - with self.open(self.filename, "r") as f: - self.assertEqual(f.read(), self.TEXT) - with self.open(self.filename, "a") as f: - f.write(self.TEXT) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()) - self.assertEqual(file_data, self.TEXT * 2) + for mode in ("w", "x"): + if mode == "x": + unlink(self.filename) + with self.open(self.filename, mode) as f: + f.write(self.TEXT) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()) + self.assertEqual(file_data, self.TEXT) + with self.open(self.filename, "r") as f: + self.assertEqual(f.read(), self.TEXT) + with self.open(self.filename, "a") as f: + f.write(self.TEXT) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()) + self.assertEqual(file_data, self.TEXT * 2) def test_text_modes(self): text = self.TEXT.decode("ascii") text_native_eol = text.replace("\n", os.linesep) - with self.open(self.filename, "wt") as f: - f.write(text) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()).decode("ascii") - self.assertEqual(file_data, text_native_eol) - with self.open(self.filename, "rt") as f: - self.assertEqual(f.read(), text) - with self.open(self.filename, "at") as f: - f.write(text) - with open(self.filename, "rb") as f: - file_data = self.decompress(f.read()).decode("ascii") - self.assertEqual(file_data, text_native_eol * 2) + for mode in ("wt", "xt"): + if mode == "xt": + unlink(self.filename) + with self.open(self.filename, mode) as f: + f.write(text) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()).decode("ascii") + self.assertEqual(file_data, text_native_eol) + with self.open(self.filename, "rt") as f: + self.assertEqual(f.read(), text) + with self.open(self.filename, "at") as f: + f.write(text) + with open(self.filename, "rb") as f: + file_data = self.decompress(f.read()).decode("ascii") + self.assertEqual(file_data, text_native_eol * 2) + + def test_x_mode(self): + for mode in ("x", "xb", "xt"): + unlink(self.filename) + with self.open(self.filename, mode) as f: + pass + with self.assertRaises(FileExistsError): + with self.open(self.filename, mode) as f: + pass def test_fileobj(self): with self.open(BytesIO(self.DATA), "r") as f: @@ -773,6 +792,8 @@ self.assertRaises(ValueError, self.open, self.filename, "wbt") self.assertRaises(ValueError, + self.open, self.filename, "xbt") + self.assertRaises(ValueError, self.open, self.filename, "rb", encoding="utf-8") self.assertRaises(ValueError, self.open, self.filename, "rb", errors="ignore") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,8 +54,8 @@ Library ------- -- Issue #19201: Add "x" mode (exclusive creation) in opening file to lzma - module. Patch by Tim Heaney and Vajrasky Kok. +- Issues #19201, #19223: Add "x" mode (exclusive creation) in opening file to + bz2 and lzma modules. Patches by Tim Heaney and Vajrasky Kok. - Fix a reference count leak in _sre. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 00:11:42 2013 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 19 Oct 2013 00:11:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319222=3A_Add_supp?= =?utf-8?q?ort_for_the_=27x=27_mode_to_the_gzip_module=2E?= Message-ID: <3d1hKp5B1wz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/a728a7d46553 changeset: 86452:a728a7d46553 user: Nadeem Vawda date: Sat Oct 19 00:11:13 2013 +0200 summary: Issue #19222: Add support for the 'x' mode to the gzip module. Original patch by Tim Heaney. files: Doc/library/gzip.rst | 15 +++++++++--- Lib/gzip.py | 14 +++++----- Lib/test/test_gzip.py | 37 +++++++++++++++++++++++++++++++ Misc/NEWS | 4 +- 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -35,8 +35,8 @@ :class:`bytes` object), or an existing file object to read from or write to. The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, - ``'w'``, or ``'wb'`` for binary mode, or ``'rt'``, ``'at'``, or ``'wt'`` for - text mode. The default is ``'rb'``. + ``'w'``, ``'wb'``, ``'x'`` or ``'xb'`` for binary mode, or ``'rt'``, + ``'at'``, ``'wt'``, or ``'xt'`` for text mode. The default is ``'rb'``. The *compresslevel* argument is an integer from 0 to 9, as for the :class:`GzipFile` constructor. @@ -53,6 +53,9 @@ Added support for *filename* being a file object, support for text mode, and the *encoding*, *errors* and *newline* arguments. + .. versionchanged:: 3.4 + Added support for the ``'x'``, ``'xb'`` and ``'xt'`` modes. + .. class:: GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None) @@ -73,8 +76,9 @@ original filename is not included in the header. The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, - or ``'wb'``, depending on whether the file will be read or written. The default - is the mode of *fileobj* if discernible; otherwise, the default is ``'rb'``. + ``'wb'``, ``'x'``, or ``'xb'``, depending on whether the file will be read or + written. The default is the mode of *fileobj* if discernible; otherwise, the + default is ``'rb'``. Note that the file is always opened in binary mode. To open a compressed file in text mode, use :func:`.open` (or wrap your :class:`GzipFile` with an @@ -125,6 +129,9 @@ .. versionchanged:: 3.3 The :meth:`io.BufferedIOBase.read1` method is now implemented. + .. versionchanged:: 3.4 + Added support for the ``'x'`` and ``'xb'`` modes. + .. function:: compress(data, compresslevel=9) diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -23,9 +23,9 @@ The filename argument can be an actual filename (a str or bytes object), or an existing file object to read from or write to. - The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for binary mode, - or "rt", "wt" or "at" for text mode. The default mode is "rb", and the - default compresslevel is 9. + The mode argument can be "r", "rb", "w", "wb", "x", "xb", "a" or "ab" for + binary mode, or "rt", "wt", "xt" or "at" for text mode. The default mode is + "rb", and the default compresslevel is 9. For binary mode, this function is equivalent to the GzipFile constructor: GzipFile(filename, mode, compresslevel). In this case, the encoding, errors @@ -151,11 +151,11 @@ fileobj, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. - The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', or 'wb', - depending on whether the file will be read or written. The default + The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', or + 'xb' depending on whether the file will be read or written. The default is the mode of fileobj if discernible; otherwise, the default is 'rb'. A mode of 'r' is equivalent to one of 'rb', and similarly for 'w' and - 'wb', and 'a' and 'ab'. + 'wb', 'a' and 'ab', and 'x' and 'xb'. The compresslevel argument is an integer from 0 to 9 controlling the level of compression; 1 is fastest and produces the least compression, @@ -201,7 +201,7 @@ self.min_readsize = 100 fileobj = _PaddedFile(fileobj) - elif mode.startswith(('w', 'a')): + elif mode.startswith(('w', 'a', 'x')): self.mode = WRITE self._init_write(filename) self.compress = zlib.compressobj(compresslevel, diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -131,6 +131,14 @@ if not ztxt: break self.assertEqual(contents, b'a'*201) + def test_exclusive_write(self): + with gzip.GzipFile(self.filename, 'xb') as f: + f.write(data1 * 50) + with gzip.GzipFile(self.filename, 'rb') as f: + self.assertEqual(f.read(), data1 * 50) + with self.assertRaises(FileExistsError): + gzip.GzipFile(self.filename, 'xb') + def test_buffered_reader(self): # Issue #7471: a GzipFile can be wrapped in a BufferedReader for # performance. @@ -206,6 +214,9 @@ self.test_write() with gzip.GzipFile(self.filename, 'r') as f: self.assertEqual(f.myfileobj.mode, 'rb') + support.unlink(self.filename) + with gzip.GzipFile(self.filename, 'x') as f: + self.assertEqual(f.myfileobj.mode, 'xb') def test_1647484(self): for mode in ('wb', 'rb'): @@ -414,35 +425,59 @@ class TestOpen(BaseTest): def test_binary_modes(self): uncompressed = data1 * 50 + with gzip.open(self.filename, "wb") as f: f.write(uncompressed) with open(self.filename, "rb") as f: file_data = gzip.decompress(f.read()) self.assertEqual(file_data, uncompressed) + with gzip.open(self.filename, "rb") as f: self.assertEqual(f.read(), uncompressed) + with gzip.open(self.filename, "ab") as f: f.write(uncompressed) with open(self.filename, "rb") as f: file_data = gzip.decompress(f.read()) self.assertEqual(file_data, uncompressed * 2) + with self.assertRaises(FileExistsError): + gzip.open(self.filename, "xb") + support.unlink(self.filename) + with gzip.open(self.filename, "xb") as f: + f.write(uncompressed) + with open(self.filename, "rb") as f: + file_data = gzip.decompress(f.read()) + self.assertEqual(file_data, uncompressed) + def test_implicit_binary_modes(self): # Test implicit binary modes (no "b" or "t" in mode string). uncompressed = data1 * 50 + with gzip.open(self.filename, "w") as f: f.write(uncompressed) with open(self.filename, "rb") as f: file_data = gzip.decompress(f.read()) self.assertEqual(file_data, uncompressed) + with gzip.open(self.filename, "r") as f: self.assertEqual(f.read(), uncompressed) + with gzip.open(self.filename, "a") as f: f.write(uncompressed) with open(self.filename, "rb") as f: file_data = gzip.decompress(f.read()) self.assertEqual(file_data, uncompressed * 2) + with self.assertRaises(FileExistsError): + gzip.open(self.filename, "x") + support.unlink(self.filename) + with gzip.open(self.filename, "x") as f: + f.write(uncompressed) + with open(self.filename, "rb") as f: + file_data = gzip.decompress(f.read()) + self.assertEqual(file_data, uncompressed) + def test_text_modes(self): uncompressed = data1.decode("ascii") * 50 uncompressed_raw = uncompressed.replace("\n", os.linesep) @@ -477,6 +512,8 @@ with self.assertRaises(ValueError): gzip.open(self.filename, "wbt") with self.assertRaises(ValueError): + gzip.open(self.filename, "xbt") + with self.assertRaises(ValueError): gzip.open(self.filename, "rb", encoding="utf-8") with self.assertRaises(ValueError): gzip.open(self.filename, "rb", errors="ignore") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,8 +54,8 @@ Library ------- -- Issues #19201, #19223: Add "x" mode (exclusive creation) in opening file to - bz2 and lzma modules. Patches by Tim Heaney and Vajrasky Kok. +- Issues #19201, #19222, #19223: Add "x" mode (exclusive creation) in opening + file to bz2, gzip and lzma modules. Patches by Tim Heaney and Vajrasky Kok. - Fix a reference count leak in _sre. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 00:17:37 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 19 Oct 2013 00:17:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Relax_some_asyncio_test_ti?= =?utf-8?q?meouts_=28http=3A//bugs=2Epython=2Eorg/issue19285=29=2E?= Message-ID: <3d1hSd4QJlz7LjP@mail.python.org> http://hg.python.org/cpython/rev/e042deeeb703 changeset: 86453:e042deeeb703 user: Guido van Rossum date: Fri Oct 18 15:15:56 2013 -0700 summary: Relax some asyncio test timeouts (http://bugs.python.org/issue19285). files: Lib/test/test_asyncio/test_base_events.py | 2 +- Lib/test/test_asyncio/test_events.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -121,7 +121,7 @@ t0 = self.loop.time() self.loop.run_forever() t1 = self.loop.time() - self.assertTrue(0.09 <= t1-t0 <= 0.12, t1-t0) + self.assertTrue(0.09 <= t1-t0 <= 0.9, t1-t0) def test_run_once_in_executor_handle(self): def cb(): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -215,7 +215,7 @@ t0 = self.loop.time() self.loop.run_until_complete(tasks.sleep(0.1, loop=self.loop)) t1 = self.loop.time() - self.assertTrue(0.08 <= t1-t0 <= 0.12, t1-t0) + self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) def test_run_until_complete_stopped(self): @tasks.coroutine @@ -238,7 +238,7 @@ self.loop.run_forever() t1 = time.monotonic() self.assertEqual(results, ['hello world']) - self.assertTrue(0.08 <= t1-t0 <= 0.2, t1-t0) + self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) def test_call_soon(self): results = [] @@ -462,8 +462,8 @@ self.loop.add_signal_handler(signal.SIGALRM, my_handler, *some_args) - signal.setitimer(signal.ITIMER_REAL, 0.01, 0) # Send SIGALRM once. - self.loop.call_later(0.015, self.loop.stop) + signal.setitimer(signal.ITIMER_REAL, 0.1, 0) # Send SIGALRM once. + self.loop.call_later(0.5, self.loop.stop) self.loop.run_forever() self.assertEqual(caught, 1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 00:17:39 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 19 Oct 2013 00:17:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Write_flow_control_for_asy?= =?utf-8?q?ncio_=28includes_asyncio=2Estreams_overhaul=29=2E?= Message-ID: <3d1hSg1NkTz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/42fdc146889c changeset: 86454:42fdc146889c user: Guido van Rossum date: Fri Oct 18 15:17:11 2013 -0700 summary: Write flow control for asyncio (includes asyncio.streams overhaul). files: Lib/asyncio/protocols.py | 28 + Lib/asyncio/selector_events.py | 78 ++++- Lib/asyncio/streams.py | 208 ++++++++++--- Lib/asyncio/transports.py | 25 + Lib/test/test_asyncio/test_streams.py | 42 +- 5 files changed, 288 insertions(+), 93 deletions(-) diff --git a/Lib/asyncio/protocols.py b/Lib/asyncio/protocols.py --- a/Lib/asyncio/protocols.py +++ b/Lib/asyncio/protocols.py @@ -29,6 +29,34 @@ aborted or closed). """ + def pause_writing(self): + """Called when the transport's buffer goes over the high-water mark. + + Pause and resume calls are paired -- pause_writing() is called + once when the buffer goes strictly over the high-water mark + (even if subsequent writes increases the buffer size even + more), and eventually resume_writing() is called once when the + buffer size reaches the low-water mark. + + Note that if the buffer size equals the high-water mark, + pause_writing() is not called -- it must go strictly over. + Conversely, resume_writing() is called when the buffer size is + equal or lower than the low-water mark. These end conditions + are important to ensure that things go as expected when either + mark is zero. + + NOTE: This is the only Protocol callback that is not called + through EventLoop.call_soon() -- if it were, it would have no + effect when it's most needed (when the app keeps writing + without yielding until pause_writing() is called). + """ + + def resume_writing(self): + """Called when the transport's buffer drains below the low-water mark. + + See pause_writing() for details. + """ + class Protocol(BaseProtocol): """ABC representing a protocol. diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -346,8 +346,10 @@ self._buffer = collections.deque() self._conn_lost = 0 # Set when call to connection_lost scheduled. self._closing = False # Set when close() called. - if server is not None: - server.attach(self) + self._protocol_paused = False + self.set_write_buffer_limits() + if self._server is not None: + self._server.attach(self) def abort(self): self._force_close(None) @@ -392,6 +394,40 @@ server.detach(self) self._server = None + def _maybe_pause_protocol(self): + size = self.get_write_buffer_size() + if size <= self._high_water: + return + if not self._protocol_paused: + self._protocol_paused = True + try: + self._protocol.pause_writing() + except Exception: + tulip_log.exception('pause_writing() failed') + + def _maybe_resume_protocol(self): + if self._protocol_paused and self.get_write_buffer_size() <= self._low_water: + self._protocol_paused = False + try: + self._protocol.resume_writing() + except Exception: + tulip_log.exception('resume_writing() failed') + + def set_write_buffer_limits(self, high=None, low=None): + if high is None: + if low is None: + high = 64*1024 + else: + high = 4*low + if low is None: + low = high // 4 + assert 0 <= low <= high, repr((low, high)) + self._high_water = high + self._low_water = low + + def get_write_buffer_size(self): + return sum(len(data) for data in self._buffer) + class _SelectorSocketTransport(_SelectorTransport): @@ -447,7 +483,7 @@ return if not self._buffer: - # Attempt to send it right away first. + # Optimization: try to send now. try: n = self._sock.send(data) except (BlockingIOError, InterruptedError): @@ -459,34 +495,36 @@ data = data[n:] if not data: return - - # Start async I/O. + # Not all was written; register write handler. self._loop.add_writer(self._sock_fd, self._write_ready) + # Add it to the buffer. self._buffer.append(data) + self._maybe_pause_protocol() def _write_ready(self): data = b''.join(self._buffer) assert data, 'Data should not be empty' - self._buffer.clear() + self._buffer.clear() # Optimistically; may have to put it back later. try: n = self._sock.send(data) except (BlockingIOError, InterruptedError): - self._buffer.append(data) + self._buffer.append(data) # Still need to write this. except Exception as exc: self._loop.remove_writer(self._sock_fd) self._fatal_error(exc) else: data = data[n:] - if not data: + if data: + self._buffer.append(data) # Still need to write this. + self._maybe_resume_protocol() # May append to buffer. + if not self._buffer: self._loop.remove_writer(self._sock_fd) if self._closing: self._call_connection_lost(None) elif self._eof: self._sock.shutdown(socket.SHUT_WR) - return - self._buffer.append(data) # Try again later. def write_eof(self): if self._eof: @@ -546,16 +584,23 @@ self._loop.add_writer(self._sock_fd, self._on_handshake) return except Exception as exc: + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) return except BaseException as exc: + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) raise + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) + # Verify hostname if requested. peercert = self._sock.getpeercert() if (self._server_hostname is not None and @@ -574,8 +619,6 @@ compression=self._sock.compression(), ) - self._loop.remove_reader(self._sock_fd) - self._loop.remove_writer(self._sock_fd) self._loop.add_reader(self._sock_fd, self._on_ready) self._loop.add_writer(self._sock_fd, self._on_ready) self._loop.call_soon(self._protocol.connection_made, self) @@ -642,6 +685,8 @@ if n < len(data): self._buffer.append(data[n:]) + self._maybe_resume_protocol() # May append to buffer. + if self._closing and not self._buffer: self._loop.remove_writer(self._sock_fd) self._call_connection_lost(None) @@ -657,8 +702,9 @@ self._conn_lost += 1 return + # We could optimize, but the callback can do this for now. self._buffer.append(data) - # We could optimize, but the callback can do this for now. + self._maybe_pause_protocol() def can_write_eof(self): return False @@ -675,11 +721,13 @@ def __init__(self, loop, sock, protocol, address=None, extra=None): super().__init__(loop, sock, protocol, extra) - self._address = address self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) + def get_write_buffer_size(self): + return sum(len(data) for data, _ in self._buffer) + def _read_ready(self): try: data, addr = self._sock.recvfrom(self.max_size) @@ -723,6 +771,7 @@ return self._buffer.append((data, addr)) + self._maybe_pause_protocol() def _sendto_ready(self): while self._buffer: @@ -743,6 +792,7 @@ self._fatal_error(exc) return + self._maybe_resume_protocol() # May append to buffer. if not self._buffer: self._loop.remove_writer(self._sock_fd) if self._closing: diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -39,7 +39,8 @@ protocol = StreamReaderProtocol(reader) transport, _ = yield from loop.create_connection( lambda: protocol, host, port, **kwds) - return reader, transport # (reader, writer) + writer = StreamWriter(transport, protocol, reader, loop) + return reader, writer class StreamReaderProtocol(protocols.Protocol): @@ -52,22 +53,113 @@ """ def __init__(self, stream_reader): - self.stream_reader = stream_reader + self._stream_reader = stream_reader + self._drain_waiter = None + self._paused = False def connection_made(self, transport): - self.stream_reader.set_transport(transport) + self._stream_reader.set_transport(transport) def connection_lost(self, exc): if exc is None: - self.stream_reader.feed_eof() + self._stream_reader.feed_eof() else: - self.stream_reader.set_exception(exc) + self._stream_reader.set_exception(exc) + # Also wake up the writing side. + if self._paused: + waiter = self._drain_waiter + if waiter is not None: + self._drain_waiter = None + if not waiter.done(): + if exc is None: + waiter.set_result(None) + else: + waiter.set_exception(exc) def data_received(self, data): - self.stream_reader.feed_data(data) + self._stream_reader.feed_data(data) def eof_received(self): - self.stream_reader.feed_eof() + self._stream_reader.feed_eof() + + def pause_writing(self): + assert not self._paused + self._paused = True + + def resume_writing(self): + assert self._paused + self._paused = False + waiter = self._drain_waiter + if waiter is not None: + self._drain_waiter = None + if not waiter.done(): + waiter.set_result(None) + + +class StreamWriter: + """Wraps a Transport. + + This exposes write(), writelines(), [can_]write_eof(), + get_extra_info() and close(). It adds drain() which returns an + optional Future on which you can wait for flow control. It also + adds a transport attribute which references the Transport + directly. + """ + + def __init__(self, transport, protocol, reader, loop): + self._transport = transport + self._protocol = protocol + self._reader = reader + self._loop = loop + + @property + def transport(self): + return self._transport + + def write(self, data): + self._transport.write(data) + + def writelines(self, data): + self._transport.writelines(data) + + def write_eof(self): + return self._transport.write_eof() + + def can_write_eof(self): + return self._transport.can_write_eof() + + def close(self): + return self._transport.close() + + def get_extra_info(self, name, default=None): + return self._transport.get_extra_info(name, default) + + def drain(self): + """This method has an unusual return value. + + The intended use is to write + + w.write(data) + yield from w.drain() + + When there's nothing to wait for, drain() returns (), and the + yield-from continues immediately. When the transport buffer + is full (the protocol is paused), drain() creates and returns + a Future and the yield-from will block until that Future is + completed, which will happen when the buffer is (partially) + drained and the protocol is resumed. + """ + if self._reader._exception is not None: + raise self._writer._exception + if self._transport._conn_lost: # Uses private variable. + raise ConnectionResetError('Connection lost') + if not self._protocol._paused: + return () + waiter = self._protocol._drain_waiter + assert waiter is None or waiter.cancelled() + waiter = futures.Future(loop=self._loop) + self._protocol._drain_waiter = waiter + return waiter class StreamReader: @@ -75,14 +167,14 @@ def __init__(self, limit=_DEFAULT_LIMIT, loop=None): # The line length limit is a security feature; # it also doubles as half the buffer limit. - self.limit = limit + self._limit = limit if loop is None: loop = events.get_event_loop() - self.loop = loop - self.buffer = collections.deque() # Deque of bytes objects. - self.byte_count = 0 # Bytes in buffer. - self.eof = False # Whether we're done. - self.waiter = None # A future. + self._loop = loop + self._buffer = collections.deque() # Deque of bytes objects. + self._byte_count = 0 # Bytes in buffer. + self._eof = False # Whether we're done. + self._waiter = None # A future. self._exception = None self._transport = None self._paused = False @@ -93,9 +185,9 @@ def set_exception(self, exc): self._exception = exc - waiter = self.waiter + waiter = self._waiter if waiter is not None: - self.waiter = None + self._waiter = None if not waiter.cancelled(): waiter.set_exception(exc) @@ -104,15 +196,15 @@ self._transport = transport def _maybe_resume_transport(self): - if self._paused and self.byte_count <= self.limit: + if self._paused and self._byte_count <= self._limit: self._paused = False self._transport.resume_reading() def feed_eof(self): - self.eof = True - waiter = self.waiter + self._eof = True + waiter = self._waiter if waiter is not None: - self.waiter = None + self._waiter = None if not waiter.cancelled(): waiter.set_result(True) @@ -120,18 +212,18 @@ if not data: return - self.buffer.append(data) - self.byte_count += len(data) + self._buffer.append(data) + self._byte_count += len(data) - waiter = self.waiter + waiter = self._waiter if waiter is not None: - self.waiter = None + self._waiter = None if not waiter.cancelled(): waiter.set_result(False) if (self._transport is not None and not self._paused and - self.byte_count > 2*self.limit): + self._byte_count > 2*self._limit): try: self._transport.pause_reading() except NotImplementedError: @@ -152,8 +244,8 @@ not_enough = True while not_enough: - while self.buffer and not_enough: - data = self.buffer.popleft() + while self._buffer and not_enough: + data = self._buffer.popleft() ichar = data.find(b'\n') if ichar < 0: parts.append(data) @@ -162,29 +254,29 @@ ichar += 1 head, tail = data[:ichar], data[ichar:] if tail: - self.buffer.appendleft(tail) + self._buffer.appendleft(tail) not_enough = False parts.append(head) parts_size += len(head) - if parts_size > self.limit: - self.byte_count -= parts_size + if parts_size > self._limit: + self._byte_count -= parts_size self._maybe_resume_transport() raise ValueError('Line is too long') - if self.eof: + if self._eof: break if not_enough: - assert self.waiter is None - self.waiter = futures.Future(loop=self.loop) + assert self._waiter is None + self._waiter = futures.Future(loop=self._loop) try: - yield from self.waiter + yield from self._waiter finally: - self.waiter = None + self._waiter = None line = b''.join(parts) - self.byte_count -= parts_size + self._byte_count -= parts_size self._maybe_resume_transport() return line @@ -198,42 +290,42 @@ return b'' if n < 0: - while not self.eof: - assert not self.waiter - self.waiter = futures.Future(loop=self.loop) + while not self._eof: + assert not self._waiter + self._waiter = futures.Future(loop=self._loop) try: - yield from self.waiter + yield from self._waiter finally: - self.waiter = None + self._waiter = None else: - if not self.byte_count and not self.eof: - assert not self.waiter - self.waiter = futures.Future(loop=self.loop) + if not self._byte_count and not self._eof: + assert not self._waiter + self._waiter = futures.Future(loop=self._loop) try: - yield from self.waiter + yield from self._waiter finally: - self.waiter = None + self._waiter = None - if n < 0 or self.byte_count <= n: - data = b''.join(self.buffer) - self.buffer.clear() - self.byte_count = 0 + if n < 0 or self._byte_count <= n: + data = b''.join(self._buffer) + self._buffer.clear() + self._byte_count = 0 self._maybe_resume_transport() return data parts = [] parts_bytes = 0 - while self.buffer and parts_bytes < n: - data = self.buffer.popleft() + while self._buffer and parts_bytes < n: + data = self._buffer.popleft() data_bytes = len(data) if n < parts_bytes + data_bytes: data_bytes = n - parts_bytes data, rest = data[:data_bytes], data[data_bytes:] - self.buffer.appendleft(rest) + self._buffer.appendleft(rest) parts.append(data) parts_bytes += data_bytes - self.byte_count -= data_bytes + self._byte_count -= data_bytes self._maybe_resume_transport() return b''.join(parts) @@ -246,12 +338,12 @@ if n <= 0: return b'' - while self.byte_count < n and not self.eof: - assert not self.waiter - self.waiter = futures.Future(loop=self.loop) + while self._byte_count < n and not self._eof: + assert not self._waiter + self._waiter = futures.Future(loop=self._loop) try: - yield from self.waiter + yield from self._waiter finally: - self.waiter = None + self._waiter = None return (yield from self.read(n)) diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -49,6 +49,31 @@ class WriteTransport(BaseTransport): """ABC for write-only transports.""" + def set_write_buffer_limits(self, high=None, low=None): + """Set the high- and low-water limits for write flow control. + + These two values control when to call the protocol's + pause_writing() and resume_writing() methods. If specified, + the low-water limit must be less than or equal to the + high-water limit. Neither value can be negative. + + The defaults are implementation-specific. If only the + high-water limit is given, the low-water limit defaults to a + implementation-specific value less than or equal to the + high-water limit. Setting high to zero forces low to zero as + well, and causes pause_writing() to be called whenever the + buffer becomes non-empty. Setting low to zero causes + resume_writing() to be called only once the buffer is empty. + Use of zero for either limit is generally sub-optimal as it + reduces opportunities for doing I/O and computation + concurrently. + """ + raise NotImplementedError + + def get_write_buffer_size(self): + """Return the current size of the write buffer.""" + raise NotImplementedError + def write(self, data): """Write some data bytes to the transport. diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -32,7 +32,7 @@ @unittest.mock.patch('asyncio.streams.events') def test_ctor_global_loop(self, m_events): stream = streams.StreamReader() - self.assertIs(stream.loop, m_events.get_event_loop.return_value) + self.assertIs(stream._loop, m_events.get_event_loop.return_value) def test_open_connection(self): with test_utils.run_test_server() as httpd: @@ -81,13 +81,13 @@ stream = streams.StreamReader(loop=self.loop) stream.feed_data(b'') - self.assertEqual(0, stream.byte_count) + self.assertEqual(0, stream._byte_count) def test_feed_data_byte_count(self): stream = streams.StreamReader(loop=self.loop) stream.feed_data(self.DATA) - self.assertEqual(len(self.DATA), stream.byte_count) + self.assertEqual(len(self.DATA), stream._byte_count) def test_read_zero(self): # Read zero bytes. @@ -96,7 +96,7 @@ data = self.loop.run_until_complete(stream.read(0)) self.assertEqual(b'', data) - self.assertEqual(len(self.DATA), stream.byte_count) + self.assertEqual(len(self.DATA), stream._byte_count) def test_read(self): # Read bytes. @@ -109,7 +109,7 @@ data = self.loop.run_until_complete(read_task) self.assertEqual(self.DATA, data) - self.assertFalse(stream.byte_count) + self.assertFalse(stream._byte_count) def test_read_line_breaks(self): # Read bytes without line breaks. @@ -120,7 +120,7 @@ data = self.loop.run_until_complete(stream.read(5)) self.assertEqual(b'line1', data) - self.assertEqual(5, stream.byte_count) + self.assertEqual(5, stream._byte_count) def test_read_eof(self): # Read bytes, stop at eof. @@ -133,7 +133,7 @@ data = self.loop.run_until_complete(read_task) self.assertEqual(b'', data) - self.assertFalse(stream.byte_count) + self.assertFalse(stream._byte_count) def test_read_until_eof(self): # Read all bytes until eof. @@ -149,7 +149,7 @@ data = self.loop.run_until_complete(read_task) self.assertEqual(b'chunk1\nchunk2', data) - self.assertFalse(stream.byte_count) + self.assertFalse(stream._byte_count) def test_read_exception(self): stream = streams.StreamReader(loop=self.loop) @@ -176,7 +176,7 @@ line = self.loop.run_until_complete(read_task) self.assertEqual(b'chunk1 chunk2 chunk3 \n', line) - self.assertEqual(len(b'\n chunk4')-1, stream.byte_count) + self.assertEqual(len(b'\n chunk4')-1, stream._byte_count) def test_readline_limit_with_existing_data(self): stream = streams.StreamReader(3, loop=self.loop) @@ -185,7 +185,7 @@ self.assertRaises( ValueError, self.loop.run_until_complete, stream.readline()) - self.assertEqual([b'line2\n'], list(stream.buffer)) + self.assertEqual([b'line2\n'], list(stream._buffer)) stream = streams.StreamReader(3, loop=self.loop) stream.feed_data(b'li') @@ -194,8 +194,8 @@ self.assertRaises( ValueError, self.loop.run_until_complete, stream.readline()) - self.assertEqual([b'li'], list(stream.buffer)) - self.assertEqual(2, stream.byte_count) + self.assertEqual([b'li'], list(stream._buffer)) + self.assertEqual(2, stream._byte_count) def test_readline_limit(self): stream = streams.StreamReader(7, loop=self.loop) @@ -209,8 +209,8 @@ self.assertRaises( ValueError, self.loop.run_until_complete, stream.readline()) - self.assertEqual([b'chunk3\n'], list(stream.buffer)) - self.assertEqual(7, stream.byte_count) + self.assertEqual([b'chunk3\n'], list(stream._buffer)) + self.assertEqual(7, stream._byte_count) def test_readline_line_byte_count(self): stream = streams.StreamReader(loop=self.loop) @@ -220,7 +220,7 @@ line = self.loop.run_until_complete(stream.readline()) self.assertEqual(b'line1\n', line) - self.assertEqual(len(self.DATA) - len(b'line1\n'), stream.byte_count) + self.assertEqual(len(self.DATA) - len(b'line1\n'), stream._byte_count) def test_readline_eof(self): stream = streams.StreamReader(loop=self.loop) @@ -248,7 +248,7 @@ self.assertEqual(b'line2\nl', data) self.assertEqual( len(self.DATA) - len(b'line1\n') - len(b'line2\nl'), - stream.byte_count) + stream._byte_count) def test_readline_exception(self): stream = streams.StreamReader(loop=self.loop) @@ -268,11 +268,11 @@ data = self.loop.run_until_complete(stream.readexactly(0)) self.assertEqual(b'', data) - self.assertEqual(len(self.DATA), stream.byte_count) + self.assertEqual(len(self.DATA), stream._byte_count) data = self.loop.run_until_complete(stream.readexactly(-1)) self.assertEqual(b'', data) - self.assertEqual(len(self.DATA), stream.byte_count) + self.assertEqual(len(self.DATA), stream._byte_count) def test_readexactly(self): # Read exact number of bytes. @@ -289,7 +289,7 @@ data = self.loop.run_until_complete(read_task) self.assertEqual(self.DATA + self.DATA, data) - self.assertEqual(len(self.DATA), stream.byte_count) + self.assertEqual(len(self.DATA), stream._byte_count) def test_readexactly_eof(self): # Read exact number of bytes (eof). @@ -304,7 +304,7 @@ data = self.loop.run_until_complete(read_task) self.assertEqual(self.DATA, data) - self.assertFalse(stream.byte_count) + self.assertFalse(stream._byte_count) def test_readexactly_exception(self): stream = streams.StreamReader(loop=self.loop) @@ -357,7 +357,7 @@ # The following line fails if set_exception() isn't careful. stream.set_exception(RuntimeError('message')) test_utils.run_briefly(self.loop) - self.assertIs(stream.waiter, None) + self.assertIs(stream._waiter, None) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 02:40:56 2013 From: python-checkins at python.org (victor.stinner) Date: Sat, 19 Oct 2013 02:40:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316742=3A_My_fix_o?= =?utf-8?q?n_PyOS=5FStdioReadline=28=29_was_incomplete=2C_PyMem=5FFREE=28?= =?utf-8?q?=29_was?= Message-ID: <3d1lf02rhVz7LjM@mail.python.org> http://hg.python.org/cpython/rev/6c9050ad1afc changeset: 86455:6c9050ad1afc user: Victor Stinner date: Sat Oct 19 02:40:16 2013 +0200 summary: Issue #16742: My fix on PyOS_StdioReadline() was incomplete, PyMem_FREE() was not patched files: Parser/myreadline.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Parser/myreadline.c b/Parser/myreadline.c --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -140,13 +140,13 @@ while (n > 0 && p[n-1] != '\n') { size_t incr = n+2; if (incr > INT_MAX) { - PyMem_FREE(p); + PyMem_RawFree(p); PyErr_SetString(PyExc_OverflowError, "input line too long"); return NULL; } pr = (char *)PyMem_RawRealloc(p, n + incr); if (pr == NULL) { - PyMem_FREE(p); + PyMem_RawFree(p); PyErr_NoMemory(); return NULL; } @@ -157,7 +157,7 @@ } pr = (char *)PyMem_RawRealloc(p, n+1); if (pr == NULL) { - PyMem_FREE(p); + PyMem_RawFree(p); PyErr_NoMemory(); return NULL; } -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Sat Oct 19 02:55:41 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 19 Oct 2013 10:55:41 +1000 Subject: [Python-checkins] cpython: Issue #18416: Fix various os calls in importlib.machinery.FileFinder In-Reply-To: <3d1X6M5RMjz7LjP@mail.python.org> References: <3d1X6M5RMjz7LjP@mail.python.org> Message-ID: On 19 Oct 2013 02:01, "brett.cannon" wrote: > > http://hg.python.org/cpython/rev/33844153cd02 > changeset: 86438:33844153cd02 > user: Brett Cannon > date: Fri Oct 18 12:01:06 2013 -0400 > summary: > Issue #18416: Fix various os calls in importlib.machinery.FileFinder > now that self.path is no longer forced to '.'. Hmm, could this break subclasses in a similar way? It may be safer to keep the empty string -> period conversion, even though PathFinder itself doesn't rely on it any more. Cheers, Nick. > > files: > Lib/importlib/_bootstrap.py | 4 +- > Python/importlib.h | 1554 +++++++++++----------- > 2 files changed, 780 insertions(+), 778 deletions(-) > > > diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py > --- a/Lib/importlib/_bootstrap.py > +++ b/Lib/importlib/_bootstrap.py > @@ -1390,7 +1390,7 @@ > is_namespace = False > tail_module = fullname.rpartition('.')[2] > try: > - mtime = _os.stat(self.path).st_mtime > + mtime = _os.stat(self.path or _os.getcwd()).st_mtime > except OSError: > mtime = -1 > if mtime != self._path_mtime: > @@ -1432,7 +1432,7 @@ > """Fill the cache of potential modules and packages for this directory.""" > path = self.path > try: > - contents = _os.listdir(path) > + contents = _os.listdir(path or _os.getcwd()) > except (FileNotFoundError, PermissionError, NotADirectoryError): > # Directory has either been removed, turned into a file, or made > # unreadable. > diff --git a/Python/importlib.h b/Python/importlib.h > --- a/Python/importlib.h > +++ b/Python/importlib.h > [stripped] > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > -------------- next part -------------- An HTML attachment was scrubbed... URL: From ncoghlan at gmail.com Sat Oct 19 03:06:19 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 19 Oct 2013 11:06:19 +1000 Subject: [Python-checkins] cpython: Issue #18810: Be optimistic with stat calls when seeing if a directory In-Reply-To: <3d1YyH4L2tz7LjP@mail.python.org> References: <3d1YyH4L2tz7LjP@mail.python.org> Message-ID: On 19 Oct 2013 03:24, "brett.cannon" wrote: > > http://hg.python.org/cpython/rev/11f2f4af1979 > changeset: 86444:11f2f4af1979 > user: Brett Cannon > date: Fri Oct 18 13:24:13 2013 -0400 > summary: > Issue #18810: Be optimistic with stat calls when seeing if a directory > exists when checking for a package. > > Before there was an isdir check and then various isfile checks for > possible __init__ files when looking for a package. > This change drops the isdir check by leaning > on the assumption that a directory will not contain something named > after the module being imported which is not a directory. If the module > is a package then it saves a stat call. If there is nothing in the > directory with the potential package name it also saves a stat call. > Only if there is something in the directory named the same thing as > the potential package will the number of stat calls increase > (due to more wasteful __init__ checks). I don't follow this logic. There's now not even an existence check for the base name, so it reads to me like we will look for all the possible init file extensions even if there's *no* directory with an appropriate name. What am I missing? Cheers, Nick. > > Semantically there is no change as the isdir check moved > down so that namespace packages continue to have no chance of > accidentally collecting non-existent directories. > > files: > Lib/importlib/_bootstrap.py | 19 +- > Python/importlib.h | 1537 +++++++++++----------- > 2 files changed, 777 insertions(+), 779 deletions(-) > > > diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py > --- a/Lib/importlib/_bootstrap.py > +++ b/Lib/importlib/_bootstrap.py > @@ -1406,16 +1406,15 @@ > # Check if the module is the name of a directory (and thus a package). > if cache_module in cache: > base_path = _path_join(self.path, tail_module) > - if _path_isdir(base_path): > - for suffix, loader in self._loaders: > - init_filename = '__init__' + suffix > - full_path = _path_join(base_path, init_filename) > - if _path_isfile(full_path): > - return (loader(fullname, full_path), [base_path]) > - else: > - # A namespace package, return the path if we don't also > - # find a module in the next section. > - is_namespace = True > + for suffix, loader in self._loaders: > + init_filename = '__init__' + suffix > + full_path = _path_join(base_path, init_filename) > + if _path_isfile(full_path): > + return (loader(fullname, full_path), [base_path]) > + else: > + # If a namespace package, return the path if we don't > + # find a module in the next section. > + is_namespace = _path_isdir(base_path) > # Check for a file w/ a proper suffix exists. > for suffix, loader in self._loaders: > full_path = _path_join(self.path, tail_module + suffix) > diff --git a/Python/importlib.h b/Python/importlib.h > --- a/Python/importlib.h > +++ b/Python/importlib.h > [stripped] > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sat Oct 19 06:36:26 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Update_OS_X_in?= =?utf-8?q?staller_for_building_on_10=2E9=2E?= Message-ID: <3d1rsk5DxBz7LjS@mail.python.org> http://hg.python.org/cpython/rev/dbecb1f60965 changeset: 86456:dbecb1f60965 branch: 2.7 parent: 86441:d22c03988e58 user: Ned Deily date: Fri Oct 18 20:40:23 2013 -0700 summary: Update OS X installer for building on 10.9. files: Mac/BuildScript/build-installer.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -155,6 +155,7 @@ '10.6': ('gcc-4.2', 'g++-4.2'), '10.7': ('clang', 'clang++'), '10.8': ('clang', 'clang++'), + '10.9': ('clang', 'clang++'), } CC, CXX = target_cc_map[DEPTARGET] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:27 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Update_OS_X_in?= =?utf-8?q?staller_for_building_on_10=2E9=2E?= Message-ID: <3d1rsl6tlYz7LjS@mail.python.org> http://hg.python.org/cpython/rev/b3501bdfc164 changeset: 86457:b3501bdfc164 branch: 3.3 parent: 86440:247344a0d12e user: Ned Deily date: Fri Oct 18 20:41:16 2013 -0700 summary: Update OS X installer for building on 10.9. files: Mac/BuildScript/build-installer.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -155,6 +155,7 @@ '10.6': ('gcc-4.2', 'g++-4.2'), '10.7': ('clang', 'clang++'), '10.8': ('clang', 'clang++'), + '10.9': ('clang', 'clang++'), } CC, CXX = target_cc_map[DEPTARGET] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:29 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Update_OS_X_installer_for_building_on_10=2E9=2E?= Message-ID: <3d1rsn1Wp5z7Ljr@mail.python.org> http://hg.python.org/cpython/rev/286a0e47bdb8 changeset: 86458:286a0e47bdb8 parent: 86455:6c9050ad1afc parent: 86457:b3501bdfc164 user: Ned Deily date: Fri Oct 18 20:42:32 2013 -0700 summary: Update OS X installer for building on 10.9. files: Mac/BuildScript/build-installer.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -155,6 +155,7 @@ '10.6': ('gcc-4.2', 'g++-4.2'), '10.7': ('clang', 'clang++'), '10.8': ('clang', 'clang++'), + '10.9': ('clang', 'clang++'), } CC, CXX = target_cc_map[DEPTARGET] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:30 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2315663=3A_Update_O?= =?utf-8?q?S_X_installer_to_use_Tcl/Tk_8=2E5=2E15=2E?= Message-ID: <3d1rsp3LLtz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/7f69f4fadfd8 changeset: 86459:7f69f4fadfd8 user: Ned Deily date: Fri Oct 18 20:49:27 2013 -0700 summary: Issue #15663: Update OS X installer to use Tcl/Tk 8.5.15. files: Mac/BuildScript/README.txt | 8 ++++---- Mac/BuildScript/build-installer.py | 12 ++++++------ Misc/NEWS | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt --- a/Mac/BuildScript/README.txt +++ b/Mac/BuildScript/README.txt @@ -57,18 +57,18 @@ * NCurses 5.9 (http://bugs.python.org/issue15037) * SQLite 3.7.13 - * Tcl 8.5.14 - * Tk 8.5.14 + * Tcl 8.5.15 + * Tk 8.5.15 * XZ 5.0.3 - uses system-supplied versions of third-party libraries * readline module links with Apple BSD editline (libedit) - - requires ActiveState Tcl/Tk 8.5.14 (or later) to be installed for building + - requires ActiveState Tcl/Tk 8.5.15 (or later) to be installed for building * Beginning with Python 3.4 alpha2, this installer now includes its own - private copy of Tcl and Tk 8.5.14 libraries and thus is no longer + private copy of Tcl and Tk 8.5.15 libraries and thus is no longer dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with OS X 10.6 or on installing a newer third-party version of Tcl/Tk in /Library/Frameworks, such as from ActiveState. Because this diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -196,9 +196,9 @@ if DEPTARGET > '10.5': result.extend([ dict( - name="Tcl 8.5.14", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tcl8.5.14-src.tar.gz", - checksum='44b50e58ab45dd272f6714dce2129123', + name="Tcl 8.5.15", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tcl8.5.15-src.tar.gz", + checksum='f3df162f92c69b254079c4d0af7a690f', buildDir="unix", configure_pre=[ '--enable-shared', @@ -212,9 +212,9 @@ }, ), dict( - name="Tk 8.5.14", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.14-src.tar.gz", - checksum='a9c48921b3688020470cd3a6dd4e867d', + name="Tk 8.5.15", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz", + checksum='55b8e33f903210a4e1c8bce0f820657f', buildDir="unix", configure_pre=[ '--enable-aqua', diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -188,6 +188,7 @@ - Issue #19130: Correct PCbuild/readme.txt, Python 3.3 and 3.4 require VS 2010. +- Issue #15663: Update OS X 10.6+ installer to use Tcl/Tk 8.5.15. What's New in Python 3.4.0 Alpha 3? =================================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:32 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2314499=3A_Fix_seve?= =?utf-8?q?ral_problems_with_OS_X_universal_build_support=3A?= Message-ID: <3d1rsr0WV2z7LjW@mail.python.org> http://hg.python.org/cpython/rev/73532f33fbb3 changeset: 86460:73532f33fbb3 user: Ned Deily date: Fri Oct 18 21:09:56 2013 -0700 summary: Issue #14499: Fix several problems with OS X universal build support: 1. ppc arch detection for extension module builds broke with Xcode 5 2. ppc arch detection in configure did not work on OS X 10.4 3. -sysroot and -arch flags were unnecessarily duplicated 4. there was no obvious way to configure an intel-32 only build. files: Lib/_osx_support.py | 20 +- Mac/README | 10 +- Misc/NEWS | 6 + configure | 253 ++++++++++++++++--------------- configure.ac | 245 +++++++++++++++--------------- 5 files changed, 279 insertions(+), 255 deletions(-) diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -235,13 +235,19 @@ if re.search('-arch\s+ppc', _config_vars['CFLAGS']) is not None: # NOTE: Cannot use subprocess here because of bootstrap # issues when building Python itself - status = os.system("'%s' -arch ppc -x c /dev/null 2>/dev/null"%( - _config_vars['CC'].replace("'", "'\"'\"'"),)) - # The Apple compiler drivers return status 255 if no PPC - if (status >> 8) == 255: - # Compiler doesn't support PPC, remove the related - # '-arch' flags if not explicitly overridden by an - # environment variable + status = os.system( + """echo 'int main{};' | """ + """'%s' -c -arch ppc -x c -o /dev/null /dev/null 2>/dev/null""" + %(_config_vars['CC'].replace("'", "'\"'\"'"),)) + if status: + # The compile failed for some reason. Because of differences + # across Xcode and compiler versions, there is no reliable way + # to be sure why it failed. Assume here it was due to lack of + # PPC support and remove the related '-arch' flags from each + # config variables not explicitly overriden by an environment + # variable. If the error was for some other reason, we hope the + # failure will show up again when trying to compile an extension + # module. for cv in _UNIVERSAL_CONFIG_VARS: if cv in _config_vars and cv not in os.environ: flags = _config_vars[cv] diff --git a/Mac/README b/Mac/README --- a/Mac/README +++ b/Mac/README @@ -7,7 +7,7 @@ Ronald Oussoren (2010-04), Ned Deily (2012-06) -:Version: 3.3.0 +:Version: 3.4.0 This document provides a quick overview of some Mac OS X specific features in the Python distribution. @@ -99,6 +99,8 @@ * ``intel``: ``i386``, ``x86_64`` + * ``intel-32``: ``i386`` + * ``32-bit``: ``ppc``, ``i386`` * ``3-way``: ``i386``, ``x86_64``, ``ppc`` @@ -125,7 +127,7 @@ * 10.7 and 10.8 SDKs with Xcode 4 support ``intel`` only -The makefile for a framework build will also install ``python3.3-32`` +The makefile for a framework build will also install ``python3.4-32`` binaries when the universal architecture includes at least one 32-bit architecture (that is, for all flavors but ``64-bit``). @@ -149,7 +151,7 @@ not automatically carry through to subprocesses launched by programs and tests under that Python. If you want to ensure that Python interpreters launched in subprocesses also run in 32-bit-mode if the main interpreter does, use -a ``python3.3-32`` binary and use the value of ``sys.executable`` as the +a ``python3.4-32`` binary and use the value of ``sys.executable`` as the ``subprocess`` ``Popen`` executable value. @@ -169,7 +171,7 @@ A second reason for using frameworks is that they put Python-related items in only two places: "/Library/Framework/Python.framework" and -"/Applications/Python " where ```` can be e.g. "3.3", +"/Applications/Python " where ```` can be e.g. "3.4", "2.7", etc. This simplifies matters for users installing Python from a binary distribution if they want to get rid of it again. Moreover, due to the way frameworks work, a user without admin privileges can install a diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -190,6 +190,12 @@ - Issue #15663: Update OS X 10.6+ installer to use Tcl/Tk 8.5.15. +- Issue #14499: Fix several problems with OS X universal build support: + 1. ppc arch detection for extension module builds broke with Xcode 5 + 2. ppc arch detection in configure did not work on OS X 10.4 + 3. -sysroot and -arch flags were unnecessarily duplicated + 4. there was no obvious way to configure an intel-32 only build. + What's New in Python 3.4.0 Alpha 3? =================================== diff --git a/configure b/configure --- a/configure +++ b/configure @@ -1455,7 +1455,7 @@ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH select architectures for universal build ("32-bit", - "64-bit", "3-way", "intel" or "all") + "64-bit", "3-way", "intel", "intel-32", or "all") --with-framework-name=FRAMEWORK specify an alternate name of the framework built with --enable-framework @@ -3037,7 +3037,7 @@ # Locate the best usable SDK, see Mac/README.txt for more # information enableval="`/usr/bin/xcodebuild -version -sdk macosx Path 2>/dev/null`" - if test -z "${enableval}" + if ! ( echo $enableval | grep -E '\.sdk' 1>/dev/null ) then enableval=/Developer/SDKs/MacOSX10.4u.sdk if test ! -d "${enableval}" @@ -3080,6 +3080,7 @@ +ARCH_RUN_32BIT="" # For backward compatibility reasons we prefer to select '32-bit' if available, # otherwise use 'intel' @@ -3088,7 +3089,7 @@ then if test -n "${UNIVERSALSDK}" then - if test -z "`/usr/bin/file "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`" + if test -z "`/usr/bin/file -L "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`" then UNIVERSAL_ARCHS="intel" fi @@ -3102,19 +3103,18 @@ # Check whether --with-universal-archs was given. if test "${with_universal_archs+set}" = set; then : withval=$with_universal_archs; - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -$as_echo "$withval" >&6; } UNIVERSAL_ARCHS="$withval" -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${UNIVERSAL_ARCHS}" >&5 +fi + +if test -n "${UNIVERSALSDK}" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${UNIVERSAL_ARCHS}" >&5 $as_echo "${UNIVERSAL_ARCHS}" >&6; } - -fi - - - +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi # Check whether --with-framework-name was given. @@ -6441,113 +6441,124 @@ SCO_SV*) BASECFLAGS="$BASECFLAGS -m486 -DSCO5" ;; - # is there any other compiler on Darwin besides gcc? - 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 "${CC}" = gcc - then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 + + # is there any other compiler on Darwin besides gcc? + 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 "${CC}" = gcc + then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 $as_echo_n "checking which compiler should be used... " >&6; } - case "${UNIVERSALSDK}" in - */MacOSX10.4u.sdk) - # Build using 10.4 SDK, force usage of gcc when the - # compiler is gcc, otherwise the user will get very - # confusing error messages when building on OSX 10.6 - CC=gcc-4.0 - CPP=cpp-4.0 - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } - fi - - - if test "${enable_universalsdk}"; then - UNIVERSAL_ARCH_FLAGS="" - if test "$UNIVERSAL_ARCHS" = "32-bit" ; then - UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" - ARCH_RUN_32BIT="" - LIPO_32BIT_FLAGS="" - elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then - UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" - LIPO_32BIT_FLAGS="" - ARCH_RUN_32BIT="true" - - elif test "$UNIVERSAL_ARCHS" = "all" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" - LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" - - elif test "$UNIVERSAL_ARCHS" = "intel" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" - LIPO_32BIT_FLAGS="-extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386" - - elif test "$UNIVERSAL_ARCHS" = "3-way" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" - LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" - - else - as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 - - fi - - - CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" - if test "${UNIVERSALSDK}" != "/" - then - CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" - LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" - CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" - 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 && \ - test ${cur_target} '<' 10.6 - then - cur_target=10.3 - if test ${enable_universalsdk}; then - 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' - - elif test "${UNIVERSAL_ARCHS}" = "3-way"; then - cur_target='10.5' - - elif test "${UNIVERSAL_ARCHS}" = "intel"; then - cur_target='10.5' - - elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then - cur_target='10.5' - fi - else - if test `/usr/bin/arch` = "i386"; then - # On Intel macs default to a deployment - # target of 10.4, that's the first OSX - # release with Intel support. - cur_target="10.4" - fi - fi - 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='' - - ;; + fi + + if test "${enable_universalsdk}" + then + case "$UNIVERSAL_ARCHS" in + 32-bit) + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="" + ;; + 64-bit) + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; + all) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + ;; + intel) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + ;; + intel-32) + UNIVERSAL_ARCH_FLAGS="-arch i386" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="" + ;; + 3-way) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + ;; + *) + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + ;; + esac + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi + fi + + # Calculate an appropriate deployment target for this build: + # The deployment target value is used explicitly to enable certain + # features are enabled (such as builtin libedit support for readline) + # through the use of Apple's Availabiliy Macros and is used as a + # component of the string returned by distutils.get_platform(). + # + # Use the value from: + # 1. the MACOSX_DEPLOYMENT_TARGET environment variable if specified + # 2. the operating system version of the build machine if >= 10.6 + # 3. If running on OS X 10.3 through 10.5, use the legacy tests + # below to pick either 10.3, 10.4, or 10.5 as the target. + # 4. If we are running on OS X 10.2 or earlier, good luck! + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which MACOSX_DEPLOYMENT_TARGET to use" >&5 +$as_echo_n "checking which MACOSX_DEPLOYMENT_TARGET to use... " >&6; } + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk} + then + case "$UNIVERSAL_ARCHS" in + all|3-way|intel|64-bit) + # These configurations were first supported in 10.5 + cur_target='10.5' + ;; + esac + else + if test `/usr/bin/arch` = "i386" + then + # 10.4 was the first release to support Intel archs + cur_target="10.4" + fi + fi + 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='' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MACOSX_DEPLOYMENT_TARGET" >&5 +$as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } + + # end of Darwin* tests + ;; esac ;; @@ -8285,7 +8296,6 @@ esac -ARCH_RUN_32BIT="" case $ac_sys_system/$ac_sys_release in Darwin/[01567]\..*) @@ -8357,14 +8367,12 @@ ;; esac - #ARCH_RUN_32BIT="true" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only ${MACOSX_DEFAULT_ARCH}" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-framework" >&5 $as_echo_n "checking for --enable-framework... " >&6; } if test "$enable_framework" @@ -8492,9 +8500,6 @@ if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then - if test "${enable_universalsdk}"; then - LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" - fi LDSHARED='$(CC) -bundle -undefined dynamic_lookup' LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' BLDSHARED="$LDSHARED" diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -152,7 +152,7 @@ # Locate the best usable SDK, see Mac/README.txt for more # information enableval="`/usr/bin/xcodebuild -version -sdk macosx Path 2>/dev/null`" - if test -z "${enableval}" + if ! ( echo $enableval | grep -E '\.sdk' 1>/dev/null ) then enableval=/Developer/SDKs/MacOSX10.4u.sdk if test ! -d "${enableval}" @@ -189,6 +189,7 @@ AC_SUBST(UNIVERSALSDK) AC_SUBST(ARCH_RUN_32BIT) +ARCH_RUN_32BIT="" # For backward compatibility reasons we prefer to select '32-bit' if available, # otherwise use 'intel' @@ -197,7 +198,7 @@ then if test -n "${UNIVERSALSDK}" then - if test -z "`/usr/bin/file "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`" + if test -z "`/usr/bin/file -L "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`" then UNIVERSAL_ARCHS="intel" fi @@ -207,16 +208,17 @@ AC_SUBST(LIPO_32BIT_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, - AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel" or "all")]), + AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel", "intel-32", or "all")]), [ - AC_MSG_RESULT($withval) UNIVERSAL_ARCHS="$withval" ], -[ - AC_MSG_RESULT(${UNIVERSAL_ARCHS}) -]) - - +[]) +if test -n "${UNIVERSALSDK}" +then + AC_MSG_RESULT(${UNIVERSAL_ARCHS}) +else + AC_MSG_RESULT(no) +fi AC_ARG_WITH(framework-name, AS_HELP_STRING([--with-framework-name=FRAMEWORK], @@ -1219,111 +1221,120 @@ SCO_SV*) BASECFLAGS="$BASECFLAGS -m486 -DSCO5" ;; - # is there any other compiler on Darwin besides gcc? - 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 "${CC}" = gcc - then - AC_MSG_CHECKING(which compiler should be used) - case "${UNIVERSALSDK}" in - */MacOSX10.4u.sdk) - # Build using 10.4 SDK, force usage of gcc when the - # compiler is gcc, otherwise the user will get very - # confusing error messages when building on OSX 10.6 - CC=gcc-4.0 - CPP=cpp-4.0 - ;; - esac - AC_MSG_RESULT($CC) - fi - - - if test "${enable_universalsdk}"; then - UNIVERSAL_ARCH_FLAGS="" - if test "$UNIVERSAL_ARCHS" = "32-bit" ; then - UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" - ARCH_RUN_32BIT="" - LIPO_32BIT_FLAGS="" - elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then - UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" - LIPO_32BIT_FLAGS="" - ARCH_RUN_32BIT="true" - - elif test "$UNIVERSAL_ARCHS" = "all" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" - LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" - - elif test "$UNIVERSAL_ARCHS" = "intel" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" - LIPO_32BIT_FLAGS="-extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386" - - elif test "$UNIVERSAL_ARCHS" = "3-way" ; then - UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" - LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" - ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" - - else - AC_MSG_ERROR([proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way]) - - fi - - - CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" - if test "${UNIVERSALSDK}" != "/" - then - CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" - LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" - CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" - 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 && \ - test ${cur_target} '<' 10.6 - then - cur_target=10.3 - if test ${enable_universalsdk}; then - 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' - - elif test "${UNIVERSAL_ARCHS}" = "3-way"; then - cur_target='10.5' - - elif test "${UNIVERSAL_ARCHS}" = "intel"; then - cur_target='10.5' - - elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then - cur_target='10.5' - fi - else - if test `/usr/bin/arch` = "i386"; then - # On Intel macs default to a deployment - # target of 10.4, that's the first OSX - # release with Intel support. - cur_target="10.4" - fi - fi - 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='' - - ;; + + # is there any other compiler on Darwin besides gcc? + 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 "${CC}" = gcc + then + AC_MSG_CHECKING(which compiler should be used) + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + AC_MSG_RESULT($CC) + fi + + if test "${enable_universalsdk}" + then + case "$UNIVERSAL_ARCHS" in + 32-bit) + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="" + ;; + 64-bit) + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; + all) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + ;; + intel) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + ;; + intel-32) + UNIVERSAL_ARCH_FLAGS="-arch i386" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="" + ;; + 3-way) + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + ;; + *) + AC_MSG_ERROR([proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way]) + ;; + esac + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi + fi + + # Calculate an appropriate deployment target for this build: + # The deployment target value is used explicitly to enable certain + # features are enabled (such as builtin libedit support for readline) + # through the use of Apple's Availabiliy Macros and is used as a + # component of the string returned by distutils.get_platform(). + # + # Use the value from: + # 1. the MACOSX_DEPLOYMENT_TARGET environment variable if specified + # 2. the operating system version of the build machine if >= 10.6 + # 3. If running on OS X 10.3 through 10.5, use the legacy tests + # below to pick either 10.3, 10.4, or 10.5 as the target. + # 4. If we are running on OS X 10.2 or earlier, good luck! + + AC_MSG_CHECKING(which MACOSX_DEPLOYMENT_TARGET to use) + cur_target=`sw_vers -productVersion | sed 's/\(10\.[[0-9]]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk} + then + case "$UNIVERSAL_ARCHS" in + all|3-way|intel|64-bit) + # These configurations were first supported in 10.5 + cur_target='10.5' + ;; + esac + else + if test `/usr/bin/arch` = "i386" + then + # 10.4 was the first release to support Intel archs + cur_target="10.4" + fi + fi + 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='' + AC_MSG_RESULT($MACOSX_DEPLOYMENT_TARGET) + + # end of Darwin* tests + ;; esac ;; @@ -1804,7 +1815,6 @@ esac -ARCH_RUN_32BIT="" AC_SUBST(LIBTOOL_CRUFT) case $ac_sys_system/$ac_sys_release in Darwin/@<:@01567@:>@\..*) @@ -1861,14 +1871,12 @@ ;; esac - #ARCH_RUN_32BIT="true" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only ${MACOSX_DEFAULT_ARCH}" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac - AC_MSG_CHECKING(for --enable-framework) if test "$enable_framework" then @@ -1988,9 +1996,6 @@ if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then - if test "${enable_universalsdk}"; then - LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" - fi LDSHARED='$(CC) -bundle -undefined dynamic_lookup' LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' BLDSHARED="$LDSHARED" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:33 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319019=3A_Change_t?= =?utf-8?q?he_OS_X_installer_build_script_to_use_CFLAGS_instead?= Message-ID: <3d1rss2fQVz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/5e385dcfbd32 changeset: 86461:5e385dcfbd32 user: Ned Deily date: Fri Oct 18 21:16:05 2013 -0700 summary: Issue #19019: Change the OS X installer build script to use CFLAGS instead of OPT for special build options. By setting OPT, some compiler-specific options like -fwrapv were overridden and thus not used, which could result in broken interpreters when building with clang. files: Mac/BuildScript/build-installer.py | 2 +- Misc/NEWS | 5 +++++ 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -952,7 +952,7 @@ "--with-universal-archs=%s " "%s " "LDFLAGS='-g -L%s/libraries/usr/local/lib' " - "OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%( + "CFLAGS='-g -I%s/libraries/usr/local/include' 2>&1"%( shellQuote(os.path.join(SRCDIR, 'configure')), shellQuote(SDKPATH), UNIVERSALARCHS, (' ', '--with-computed-gotos ')[PYTHON_3], diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -196,6 +196,11 @@ 3. -sysroot and -arch flags were unnecessarily duplicated 4. there was no obvious way to configure an intel-32 only build. +- Issue #19019: Change the OS X installer build script to use CFLAGS instead + of OPT for special build options. By setting OPT, some compiler-specific + options like -fwrapv were overridden and thus not used, which could result + in broken interpreters when building with clang. + What's New in Python 3.4.0 Alpha 3? =================================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:34 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Ensure_setup?= =?utf-8?q?=2Epy_looks_for_zlib=2Eh_in_an_OS_X_SDK=2E?= Message-ID: <3d1rst4VWNz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/c207ac413457 changeset: 86462:c207ac413457 branch: 2.7 parent: 86456:dbecb1f60965 user: Ned Deily date: Fri Oct 18 21:33:57 2013 -0700 summary: Ensure setup.py looks for zlib.h in an OS X SDK. files: setup.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1389,6 +1389,8 @@ zlib_h = zlib_inc[0] + '/zlib.h' version = '"0.0.0"' version_req = '"1.1.3"' + if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h): + zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:]) fp = open(zlib_h) while 1: line = fp.readline() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:35 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Ensure_setup?= =?utf-8?q?=2Epy_looks_for_zlib=2Eh_in_an_OS_X_SDK=2E?= Message-ID: <3d1rsv6LyLz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/2d8d5fea6194 changeset: 86463:2d8d5fea6194 branch: 3.3 parent: 86457:b3501bdfc164 user: Ned Deily date: Fri Oct 18 21:32:00 2013 -0700 summary: Ensure setup.py looks for zlib.h in an OS X SDK. files: setup.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1313,6 +1313,8 @@ zlib_h = zlib_inc[0] + '/zlib.h' version = '"0.0.0"' version_req = '"1.1.3"' + if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h): + zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:]) with open(zlib_h) as fp: while 1: line = fp.readline() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 06:36:37 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 06:36:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Ensure_setup=2Epy_looks_for_zlib=2Eh_in_an_OS_X_SDK=2E?= Message-ID: <3d1rsx149Hz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/f3a2dab1623b changeset: 86464:f3a2dab1623b parent: 86461:5e385dcfbd32 parent: 86463:2d8d5fea6194 user: Ned Deily date: Fri Oct 18 21:34:58 2013 -0700 summary: Ensure setup.py looks for zlib.h in an OS X SDK. files: setup.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1326,6 +1326,8 @@ zlib_h = zlib_inc[0] + '/zlib.h' version = '"0.0.0"' version_req = '"1.1.3"' + if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h): + zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:]) with open(zlib_h) as fp: while 1: line = fp.readline() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 19 07:39:29 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 19 Oct 2013 07:39:29 +0200 Subject: [Python-checkins] Daily reference leaks (6c9050ad1afc): sum=491 Message-ID: results for 6c9050ad1afc on branch "default" -------------------------------------------- test_asyncio leaked [474, -316, 159] references, sum=317 test_asyncio leaked [574, -367, -33] memory blocks, sum=174 test_site leaked [0, -2, 2] references, sum=0 test_site leaked [0, -2, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogvL4znZ', '-x'] From python-checkins at python.org Sat Oct 19 09:09:52 2013 From: python-checkins at python.org (larry.hastings) Date: Sat, 19 Oct 2013 09:09:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316612=3A_Add_=22A?= =?utf-8?q?rgument_Clinic=22=2C_a_compile-time_preprocessor?= Message-ID: <3d1wGm5g61zSB7@mail.python.org> http://hg.python.org/cpython/rev/8fde1a2c94dc changeset: 86465:8fde1a2c94dc user: Larry Hastings date: Sat Oct 19 00:09:25 2013 -0700 summary: Issue #16612: Add "Argument Clinic", a compile-time preprocessor for C files to generate argument parsing code. (See PEP 436.) files: Misc/NEWS | 3 + Modules/_cursesmodule.c | 155 +- Modules/_datetimemodule.c | 76 +- Modules/_dbmmodule.c | 71 +- Modules/_weakref.c | 58 +- Modules/posixmodule.c | 417 ++- Modules/unicodedata.c | 64 +- Modules/zlibmodule.c | 183 +- Objects/dictobject.c | 30 +- Objects/unicodeobject.c | 83 +- Tools/clinic/clinic.py | 2477 +++++++++++++++++++++++ Tools/clinic/clinic_test.py | 699 ++++++ 12 files changed, 4028 insertions(+), 288 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #16612: Add "Argument Clinic", a compile-time preprocessor for + C files to generate argument parsing code. (See PEP 436.) + - Issue #18810: Shift stat calls in importlib.machinery.FileFinder such that the code is optimistic that if something exists in a directory named exactly like the possible package being searched for that it's in actuality a diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -549,68 +549,141 @@ /* Addch, Addstr, Addnstr */ +/*[clinic] +module curses + +class curses.window + +curses.window.addch + + [ + x: int + X-coordinate. + y: int + Y-coordinate. + ] + + ch: object + Character to add. + + [ + attr: long + Attributes for the character. + ] + / + +Paint character ch at (y, x) with attributes attr. + +Paint character ch at (y, x) with attributes attr, +overwriting any character previously painted at that location. +By default, the character position and attributes are the +current settings for the window object. +[clinic]*/ + +PyDoc_STRVAR(curses_window_addch__doc__, +"Paint character ch at (y, x) with attributes attr.\n" +"\n" +"curses.window.addch([x, y,] ch, [attr])\n" +" x\n" +" X-coordinate.\n" +" y\n" +" Y-coordinate.\n" +" ch\n" +" Character to add.\n" +" attr\n" +" Attributes for the character.\n" +"\n" +"Paint character ch at (y, x) with attributes attr,\n" +"overwriting any character previously painted at that location.\n" +"By default, the character position and attributes are the\n" +"current settings for the window object."); + +#define CURSES_WINDOW_ADDCH_METHODDEF \ + {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__}, + static PyObject * -PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args) +curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr); + +static PyObject * +curses_window_addch(PyObject *self, PyObject *args) { - int rtn, x, y, use_xy = FALSE; - PyObject *chobj; + PyObject *return_value = NULL; + int group_left_1 = 0; + int x; + int y; + PyObject *ch; + int group_right_1 = 0; + long attr; + + switch (PyTuple_Size(args)) { + case 1: + if (!PyArg_ParseTuple(args, "O:addch", &ch)) + return NULL; + break; + case 2: + if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr)) + return NULL; + group_right_1 = 1; + break; + case 3: + if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch)) + return NULL; + group_left_1 = 1; + break; + case 4: + if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr)) + return NULL; + group_right_1 = 1; + group_left_1 = 1; + break; + default: + PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments"); + return NULL; + } + return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr); + + return return_value; +} + +static PyObject * +curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr) +/*[clinic checksum: 98ade780397a48d0be48439763424b3b00c92089]*/ +{ + PyCursesWindowObject *cwself = (PyCursesWindowObject *)self; + int coordinates_group = group_left_1; + int attr_group = group_right_1; + int rtn; int type; - chtype ch; + chtype cch; #ifdef HAVE_NCURSESW cchar_t wch; #endif - attr_t attr = A_NORMAL; - long lattr; const char *funcname; - switch (PyTuple_Size(args)) { - case 1: - if (!PyArg_ParseTuple(args, "O;ch or int", &chobj)) - return NULL; - break; - case 2: - if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &chobj, &lattr)) - return NULL; - attr = lattr; - break; - case 3: - if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &chobj)) - return NULL; - use_xy = TRUE; - break; - case 4: - if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", - &y, &x, &chobj, &lattr)) - return NULL; - attr = lattr; - use_xy = TRUE; - break; - default: - PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments"); - return NULL; - } + if (!attr_group) + attr = A_NORMAL; #ifdef HAVE_NCURSESW - type = PyCurses_ConvertToCchar_t(self, chobj, &ch, &wch); + type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch); if (type == 2) { funcname = "add_wch"; wch.attr = attr; - if (use_xy == TRUE) - rtn = mvwadd_wch(self->win,y,x, &wch); + if (coordinates_group) + rtn = mvwadd_wch(cwself->win,y,x, &wch); else { - rtn = wadd_wch(self->win, &wch); + rtn = wadd_wch(cwself->win, &wch); } } else #else - type = PyCurses_ConvertToCchar_t(self, chobj, &ch); + type = PyCurses_ConvertToCchar_t(cwself, chobj, &cch); #endif if (type == 1) { funcname = "addch"; - if (use_xy == TRUE) - rtn = mvwaddch(self->win,y,x, ch | attr); + if (coordinates_group) + rtn = mvwaddch(cwself->win,y,x, cch | attr); else { - rtn = waddch(self->win, ch | attr); + rtn = waddch(cwself->win, cch | attr); } } else { @@ -1954,7 +2027,7 @@ static PyMethodDef PyCursesWindow_Methods[] = { - {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS}, + CURSES_WINDOW_ADDCH_METHODDEF {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS}, {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS}, {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS}, diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4143,31 +4143,73 @@ tzinfo); } -/* Return best possible local time -- this isn't constrained by the - * precision of a timestamp. - */ +/*[clinic] +module datetime + + at classmethod +datetime.now + + tz: object = None + Timezone object. + +Returns new datetime object representing current time local to tz. + +If no tz is specified, uses local timezone. +[clinic]*/ + +PyDoc_STRVAR(datetime_now__doc__, +"Returns new datetime object representing current time local to tz.\n" +"\n" +"datetime.now(tz=None)\n" +" tz\n" +" Timezone object.\n" +"\n" +"If no tz is specified, uses local timezone."); + +#define DATETIME_NOW_METHODDEF \ + {"now", (PyCFunction)datetime_now, METH_VARARGS|METH_KEYWORDS|METH_CLASS, datetime_now__doc__}, + static PyObject * -datetime_now(PyObject *cls, PyObject *args, PyObject *kw) +datetime_now_impl(PyObject *cls, PyObject *tz); + +static PyObject * +datetime_now(PyObject *cls, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static char *_keywords[] = {"tz", NULL}; + PyObject *tz = Py_None; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:now", _keywords, + &tz)) + goto exit; + return_value = datetime_now_impl(cls, tz); + +exit: + return return_value; +} + +static PyObject * +datetime_now_impl(PyObject *cls, PyObject *tz) +/*[clinic checksum: 328b54387f4c2f8cb534997e1bd55f8cb38c4992]*/ { PyObject *self; - PyObject *tzinfo = Py_None; - static char *keywords[] = {"tz", NULL}; - - if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords, - &tzinfo)) + + /* Return best possible local time -- this isn't constrained by the + * precision of a timestamp. + */ + if (check_tzinfo_subclass(tz) < 0) return NULL; - if (check_tzinfo_subclass(tzinfo) < 0) - return NULL; self = datetime_best_possible(cls, - tzinfo == Py_None ? localtime : gmtime, - tzinfo); - if (self != NULL && tzinfo != Py_None) { + tz == Py_None ? localtime : gmtime, + tz); + if (self != NULL && tz != Py_None) { /* Convert UTC to tzinfo's zone. */ PyObject *temp = self; _Py_IDENTIFIER(fromutc); - self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self); + self = _PyObject_CallMethodId(tz, &PyId_fromutc, "O", self); Py_DECREF(temp); } return self; @@ -5001,9 +5043,7 @@ /* Class methods: */ - {"now", (PyCFunction)datetime_now, - METH_VARARGS | METH_KEYWORDS | METH_CLASS, - PyDoc_STR("[tz] -> new datetime with tz's local day and time.")}, + DATETIME_NOW_METHODDEF {"utcnow", (PyCFunction)datetime_utcnow, METH_NOARGS | METH_CLASS, diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -44,7 +44,7 @@ static PyObject *DbmError; static PyObject * -newdbmobject(char *file, int flags, int mode) +newdbmobject(const char *file, int flags, int mode) { dbmobject *dp; @@ -361,16 +361,69 @@ /* ----------------------------------------------------------------- */ +/*[clinic] +module dbm + +dbm.open as dbmopen + + filename: str + The filename to open. + + flags: str="r" + How to open the file. "r" for reading, "w" for writing, etc. + + mode: int(doc_default="0o666") = 0o666 + If creating a new file, the mode bits for the new file + (e.g. os.O_RDWR). + + / + +Return a database object. + +[clinic]*/ + +PyDoc_STRVAR(dbmopen__doc__, +"Return a database object.\n" +"\n" +"dbm.open(filename, flags=\'r\', mode=0o666)\n" +" filename\n" +" The filename to open.\n" +" flags\n" +" How to open the file. \"r\" for reading, \"w\" for writing, etc.\n" +" mode\n" +" If creating a new file, the mode bits for the new file\n" +" (e.g. os.O_RDWR)."); + +#define DBMOPEN_METHODDEF \ + {"open", (PyCFunction)dbmopen, METH_VARARGS, dbmopen__doc__}, + +static PyObject * +dbmopen_impl(PyObject *self, const char *filename, const char *flags, int mode); + static PyObject * dbmopen(PyObject *self, PyObject *args) { - char *name; - char *flags = "r"; + PyObject *return_value = NULL; + const char *filename; + const char *flags = "r"; + int mode = 438; + + if (!PyArg_ParseTuple(args, + "s|si:open", + &filename, &flags, &mode)) + goto exit; + return_value = dbmopen_impl(self, filename, flags, mode); + +exit: + return return_value; +} + +static PyObject * +dbmopen_impl(PyObject *self, const char *filename, const char *flags, int mode) +/*[clinic checksum: 61007c796d38af85c8035afa769fb4bb453429ee]*/ +{ int iflags; - int mode = 0666; - if ( !PyArg_ParseTuple(args, "s|si:open", &name, &flags, &mode) ) - return NULL; if ( strcmp(flags, "r") == 0 ) iflags = O_RDONLY; else if ( strcmp(flags, "w") == 0 ) @@ -386,13 +439,11 @@ "arg 2 to open should be 'r', 'w', 'c', or 'n'"); return NULL; } - return newdbmobject(name, iflags, mode); + return newdbmobject(filename, iflags, mode); } static PyMethodDef dbmmodule_methods[] = { - { "open", (PyCFunction)dbmopen, METH_VARARGS, - "open(path[, flag[, mode]]) -> mapping\n" - "Return a database object."}, + DBMOPEN_METHODDEF { 0, 0 }, }; diff --git a/Modules/_weakref.c b/Modules/_weakref.c --- a/Modules/_weakref.c +++ b/Modules/_weakref.c @@ -4,25 +4,54 @@ #define GET_WEAKREFS_LISTPTR(o) \ ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) +/*[clinic] -PyDoc_STRVAR(weakref_getweakrefcount__doc__, -"getweakrefcount(object) -- return the number of weak references\n" -"to 'object'."); +module _weakref + +_weakref.getweakrefcount -> Py_ssize_t + + object: object + / + +Return the number of weak references to 'object'. +[clinic]*/ + +PyDoc_STRVAR(_weakref_getweakrefcount__doc__, +"Return the number of weak references to \'object\'.\n" +"\n" +"_weakref.getweakrefcount(object)"); + +#define _WEAKREF_GETWEAKREFCOUNT_METHODDEF \ + {"getweakrefcount", (PyCFunction)_weakref_getweakrefcount, METH_O, _weakref_getweakrefcount__doc__}, + +static Py_ssize_t +_weakref_getweakrefcount_impl(PyObject *self, PyObject *object); static PyObject * -weakref_getweakrefcount(PyObject *self, PyObject *object) +_weakref_getweakrefcount(PyObject *self, PyObject *object) { - PyObject *result = NULL; + PyObject *return_value = NULL; + Py_ssize_t _return_value; + _return_value = _weakref_getweakrefcount_impl(self, object); + if ((_return_value == -1) && PyErr_Occurred()) + goto exit; + return_value = PyLong_FromSsize_t(_return_value); - if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) { - PyWeakReference **list = GET_WEAKREFS_LISTPTR(object); +exit: + return return_value; +} - result = PyLong_FromSsize_t(_PyWeakref_GetWeakrefCount(*list)); - } - else - result = PyLong_FromLong(0); +static Py_ssize_t +_weakref_getweakrefcount_impl(PyObject *self, PyObject *object) +/*[clinic checksum: 0b7e7ddd87d483719ebac0fba364fff0ed0182d9]*/ +{ + PyWeakReference **list; - return result; + if (!PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) + return 0; + + list = GET_WEAKREFS_LISTPTR(object); + return _PyWeakref_GetWeakrefCount(*list); } @@ -78,8 +107,7 @@ static PyMethodDef weakref_functions[] = { - {"getweakrefcount", weakref_getweakrefcount, METH_O, - weakref_getweakrefcount__doc__}, + _WEAKREF_GETWEAKREFCOUNT_METHODDEF {"getweakrefs", weakref_getweakrefs, METH_O, weakref_getweakrefs__doc__}, {"proxy", weakref_proxy, METH_VARARGS, @@ -106,7 +134,7 @@ PyObject *m; m = PyModule_Create(&weakrefmodule); - + if (m != NULL) { Py_INCREF(&_PyWeakref_RefType); PyModule_AddObject(m, "ref", diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8,6 +8,8 @@ of the compiler used. Different compilers define their own feature test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */ + + #ifdef __APPLE__ /* * Step 1 of support for weak-linking a number of symbols existing on @@ -712,7 +714,7 @@ * path.function_name * If non-NULL, path_converter will use that as the name * of the function in error messages. - * (If path.argument_name is NULL it omits the function name.) + * (If path.function_name is NULL it omits the function name.) * path.argument_name * If non-NULL, path_converter will use that as the name * of the parameter in error messages. @@ -776,6 +778,9 @@ PyObject *cleanup; } path_t; +#define PATH_T_INITIALIZE(function_name, nullable, allow_fd) \ + {function_name, NULL, nullable, allow_fd, NULL, NULL, 0, 0, NULL, NULL} + static void path_cleanup(path_t *path) { if (path->cleanup) { @@ -1313,6 +1318,7 @@ #endif } + /* POSIX generic methods */ static PyObject * @@ -2347,48 +2353,145 @@ return _pystat_fromstructstat(&st); } -PyDoc_STRVAR(posix_stat__doc__, -"stat(path, *, dir_fd=None, follow_symlinks=True) -> stat result\n\n\ -Perform a stat system call on the given path.\n\ -\n\ -path may be specified as either a string or as an open file descriptor.\n\ -\n\ -If dir_fd is not None, it should be a file descriptor open to a directory,\n\ - and path should be relative; path will then be relative to that directory.\n\ - dir_fd may not be supported on your platform; if it is unavailable, using\n\ - it will raise a NotImplementedError.\n\ -If follow_symlinks is False, and the last element of the path is a symbolic\n\ - link, stat will examine the symbolic link itself instead of the file the\n\ - link points to.\n\ -It is an error to use dir_fd or follow_symlinks when specifying path as\n\ - an open file descriptor."); - -static PyObject * -posix_stat(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *keywords[] = {"path", "dir_fd", "follow_symlinks", NULL}; - path_t path; +#ifdef HAVE_FSTATAT + #define OS_STAT_DIR_FD_CONVERTER dir_fd_converter +#else + #define OS_STAT_DIR_FD_CONVERTER dir_fd_unavailable +#endif + + +/*[python] + +class path_t_converter(CConverter): + + type = "path_t" + impl_by_reference = True + parse_by_reference = True + + converter = 'path_converter' + + def converter_init(self, *, allow_fd=False, nullable=False): + def strify(value): + return str(int(bool(value))) + + # right now path_t doesn't support default values. + # to support a default value, you'll need to override initialize(). + + assert self.default is unspecified + + self.nullable = nullable + self.allow_fd = allow_fd + + self.c_default = 'PATH_T_INITIALIZE("{}", {}, {})'.format( + self.function.name, + strify(nullable), + strify(allow_fd), + ) + + def cleanup(self): + return "path_cleanup(&" + self.name + ");\n" + + +class dir_fd_converter(CConverter): + type = 'int' + converter = 'OS_STAT_DIR_FD_CONVERTER' + + def converter_init(self): + if self.default in (unspecified, None): + self.c_default = 'DEFAULT_DIR_FD' + + +[python]*/ +/*[python checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ + +/*[clinic] +module os + +os.stat -> object(doc_default='stat_result') + + path : path_t(allow_fd=True) + Path to be examined; can be string, bytes, or open-file-descriptor int. + + * + + dir_fd : dir_fd = None + If not None, it should be a file descriptor open to a directory, + and path should be a relative string; path will then be relative to + that directory. + + follow_symlinks: bool = True + If False, and the last element of the path is a symbolic link, + stat will examine the symbolic link itself instead of the file + the link points to. + +Perform a stat system call on the given path. + +dir_fd and follow_symlinks may not be implemented + on your platform. If they are unavailable, using them will raise a + NotImplementedError. + +It's an error to use dir_fd or follow_symlinks when specifying path as + an open file descriptor. + +[clinic]*/ + +PyDoc_STRVAR(os_stat__doc__, +"Perform a stat system call on the given path.\n" +"\n" +"os.stat(path, *, dir_fd=None, follow_symlinks=True) -> stat_result\n" +" path\n" +" Path to be examined; can be string, bytes, or open-file-descriptor int.\n" +" dir_fd\n" +" If not None, it should be a file descriptor open to a directory,\n" +" and path should be a relative string; path will then be relative to\n" +" that directory.\n" +" follow_symlinks\n" +" If False, and the last element of the path is a symbolic link,\n" +" stat will examine the symbolic link itself instead of the file\n" +" the link points to.\n" +"\n" +"dir_fd and follow_symlinks may not be implemented\n" +" on your platform. If they are unavailable, using them will raise a\n" +" NotImplementedError.\n" +"\n" +"It\'s an error to use dir_fd or follow_symlinks when specifying path as\n" +" an open file descriptor."); + +#define OS_STAT_METHODDEF \ + {"stat", (PyCFunction)os_stat, METH_VARARGS|METH_KEYWORDS, os_stat__doc__}, + +static PyObject * +os_stat_impl(PyObject *self, path_t *path, int dir_fd, int follow_symlinks); + +static PyObject * +os_stat(PyObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static char *_keywords[] = {"path", "dir_fd", "follow_symlinks", NULL}; + path_t path = PATH_T_INITIALIZE("stat", 0, 1); int dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - PyObject *return_value; - - memset(&path, 0, sizeof(path)); - path.function_name = "stat"; - path.allow_fd = 1; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&p:stat", keywords, - path_converter, &path, -#ifdef HAVE_FSTATAT - dir_fd_converter, &dir_fd, -#else - dir_fd_unavailable, &dir_fd, -#endif - &follow_symlinks)) - return NULL; - return_value = posix_do_stat("stat", &path, dir_fd, follow_symlinks); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "O&|$O&p:stat", _keywords, + path_converter, &path, OS_STAT_DIR_FD_CONVERTER, &dir_fd, &follow_symlinks)) + goto exit; + return_value = os_stat_impl(self, &path, dir_fd, follow_symlinks); + +exit: + /* Cleanup for path */ path_cleanup(&path); + return return_value; } +static PyObject * +os_stat_impl(PyObject *self, path_t *path, int dir_fd, int follow_symlinks) +/*[clinic checksum: 9d9af08e8cfafd12f94e73ea3065eb3056f99515]*/ +{ + return posix_do_stat("stat", path, dir_fd, follow_symlinks); +} + PyDoc_STRVAR(posix_lstat__doc__, "lstat(path, *, dir_fd=None) -> stat result\n\n\ Like stat(), but do not follow symbolic links.\n\ @@ -2414,44 +2517,120 @@ #endif )) return NULL; - return_value = posix_do_stat("stat", &path, dir_fd, follow_symlinks); + return_value = posix_do_stat("lstat", &path, dir_fd, follow_symlinks); path_cleanup(&path); return return_value; } -PyDoc_STRVAR(posix_access__doc__, -"access(path, mode, *, dir_fd=None, effective_ids=False,\ - follow_symlinks=True)\n\n\ -Use the real uid/gid to test for access to a path. Returns True if granted,\n\ -False otherwise.\n\ -\n\ -If dir_fd is not None, it should be a file descriptor open to a directory,\n\ - and path should be relative; path will then be relative to that directory.\n\ -If effective_ids is True, access will use the effective uid/gid instead of\n\ - the real uid/gid.\n\ -If follow_symlinks is False, and the last element of the path is a symbolic\n\ - link, access will examine the symbolic link itself instead of the file the\n\ - link points to.\n\ -dir_fd, effective_ids, and follow_symlinks may not be implemented\n\ - on your platform. If they are unavailable, using them will raise a\n\ - NotImplementedError.\n\ -\n\ -Note that most operations will use the effective uid/gid, therefore this\n\ - routine can be used in a suid/sgid environment to test if the invoking user\n\ - has the specified access to the path.\n\ -The mode argument can be F_OK to test existence, or the inclusive-OR\n\ - of R_OK, W_OK, and X_OK."); - -static PyObject * -posix_access(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *keywords[] = {"path", "mode", "dir_fd", "effective_ids", - "follow_symlinks", NULL}; - path_t path; + +#ifdef HAVE_FACCESSAT + #define OS_ACCESS_DIR_FD_CONVERTER dir_fd_converter +#else + #define OS_ACCESS_DIR_FD_CONVERTER dir_fd_unavailable +#endif +/*[clinic] +os.access -> object(doc_default='True if granted, False otherwise') + + path: path_t(allow_fd=True) + Path to be tested; can be string, bytes, or open-file-descriptor int. + + mode: int + Operating-system mode bitfield. Can be F_OK to test existence, + or the inclusive-OR of R_OK, W_OK, and X_OK. + + * + + dir_fd : dir_fd = None + If not None, it should be a file descriptor open to a directory, + and path should be relative; path will then be relative to that + directory. + + effective_ids: bool = False + If True, access will use the effective uid/gid instead of + the real uid/gid. + + follow_symlinks: bool = True + If False, and the last element of the path is a symbolic link, + access will examine the symbolic link itself instead of the file + the link points to. + +Use the real uid/gid to test for access to a path. + +{parameters} +dir_fd, effective_ids, and follow_symlinks may not be implemented + on your platform. If they are unavailable, using them will raise a + NotImplementedError. + +Note that most operations will use the effective uid/gid, therefore this + routine can be used in a suid/sgid environment to test if the invoking user + has the specified access to the path. + +[clinic]*/ + +PyDoc_STRVAR(os_access__doc__, +"Use the real uid/gid to test for access to a path.\n" +"\n" +"os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True) -> True if granted, False otherwise\n" +" path\n" +" Path to be tested; can be string, bytes, or open-file-descriptor int.\n" +" mode\n" +" Operating-system mode bitfield. Can be F_OK to test existence,\n" +" or the inclusive-OR of R_OK, W_OK, and X_OK.\n" +" dir_fd\n" +" If not None, it should be a file descriptor open to a directory,\n" +" and path should be relative; path will then be relative to that\n" +" directory.\n" +" effective_ids\n" +" If True, access will use the effective uid/gid instead of\n" +" the real uid/gid.\n" +" follow_symlinks\n" +" If False, and the last element of the path is a symbolic link,\n" +" access will examine the symbolic link itself instead of the file\n" +" the link points to.\n" +"\n" +"{parameters}\n" +"dir_fd, effective_ids, and follow_symlinks may not be implemented\n" +" on your platform. If they are unavailable, using them will raise a\n" +" NotImplementedError.\n" +"\n" +"Note that most operations will use the effective uid/gid, therefore this\n" +" routine can be used in a suid/sgid environment to test if the invoking user\n" +" has the specified access to the path."); + +#define OS_ACCESS_METHODDEF \ + {"access", (PyCFunction)os_access, METH_VARARGS|METH_KEYWORDS, os_access__doc__}, + +static PyObject * +os_access_impl(PyObject *self, path_t *path, int mode, int dir_fd, int effective_ids, int follow_symlinks); + +static PyObject * +os_access(PyObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static char *_keywords[] = {"path", "mode", "dir_fd", "effective_ids", "follow_symlinks", NULL}; + path_t path = PATH_T_INITIALIZE("access", 0, 1); int mode; int dir_fd = DEFAULT_DIR_FD; int effective_ids = 0; int follow_symlinks = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "O&i|$O&pp:access", _keywords, + path_converter, &path, &mode, OS_STAT_DIR_FD_CONVERTER, &dir_fd, &effective_ids, &follow_symlinks)) + goto exit; + return_value = os_access_impl(self, &path, mode, dir_fd, effective_ids, follow_symlinks); + +exit: + /* Cleanup for path */ + path_cleanup(&path); + + return return_value; +} + +static PyObject * +os_access_impl(PyObject *self, path_t *path, int mode, int dir_fd, int effective_ids, int follow_symlinks) +/*[clinic checksum: 0147557eb43243df57ba616cc7c35f232c69bc6a]*/ +{ PyObject *return_value = NULL; #ifdef MS_WINDOWS @@ -2460,17 +2639,6 @@ int result; #endif - memset(&path, 0, sizeof(path)); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|$O&pp:access", keywords, - path_converter, &path, &mode, -#ifdef HAVE_FACCESSAT - dir_fd_converter, &dir_fd, -#else - dir_fd_unavailable, &dir_fd, -#endif - &effective_ids, &follow_symlinks)) - return NULL; - #ifndef HAVE_FACCESSAT if (follow_symlinks_specified("access", follow_symlinks)) goto exit; @@ -2514,11 +2682,11 @@ flags |= AT_SYMLINK_NOFOLLOW; if (effective_ids) flags |= AT_EACCESS; - result = faccessat(dir_fd, path.narrow, mode, flags); + result = faccessat(dir_fd, path->narrow, mode, flags); } else #endif - result = access(path.narrow, mode); + result = access(path->narrow, mode); Py_END_ALLOW_THREADS return_value = PyBool_FromLong(!result); #endif @@ -2526,7 +2694,6 @@ #ifndef HAVE_FACCESSAT exit: #endif - path_cleanup(&path); return return_value; } @@ -2543,35 +2710,76 @@ #define X_OK 1 #endif + #ifdef HAVE_TTYNAME -PyDoc_STRVAR(posix_ttyname__doc__, -"ttyname(fd) -> string\n\n\ -Return the name of the terminal device connected to 'fd'."); - -static PyObject * -posix_ttyname(PyObject *self, PyObject *args) -{ - int id; + +/*[clinic] +os.ttyname -> DecodeFSDefault + + fd: int + Integer file descriptor handle. + + / + +Return the name of the terminal device connected to 'fd'. +[clinic]*/ + +PyDoc_STRVAR(os_ttyname__doc__, +"Return the name of the terminal device connected to \'fd\'.\n" +"\n" +"os.ttyname(fd)\n" +" fd\n" +" Integer file descriptor handle."); + +#define OS_TTYNAME_METHODDEF \ + {"ttyname", (PyCFunction)os_ttyname, METH_VARARGS, os_ttyname__doc__}, + +static char * +os_ttyname_impl(PyObject *self, int fd); + +static PyObject * +os_ttyname(PyObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + int fd; + char *_return_value; + + if (!PyArg_ParseTuple(args, + "i:ttyname", + &fd)) + goto exit; + _return_value = os_ttyname_impl(self, fd); + if (_return_value == NULL) + goto exit; + return_value = PyUnicode_DecodeFSDefault(_return_value); + +exit: + return return_value; +} + +static char * +os_ttyname_impl(PyObject *self, int fd) +/*[clinic checksum: ea680155d87bb733f542d67653eca732dd0981a8]*/ +{ char *ret; - if (!PyArg_ParseTuple(args, "i:ttyname", &id)) - return NULL; - #if defined(__VMS) /* file descriptor 0 only, the default input device (stdin) */ - if (id == 0) { + if (fd == 0) { ret = ttyname(); } else { ret = NULL; } #else - ret = ttyname(id); + ret = ttyname(fd); #endif if (ret == NULL) - return posix_error(); - return PyUnicode_DecodeFSDefault(ret); -} + posix_error(); + return ret; +} +#else +#define OS_TTYNAME_METHODDEF #endif #ifdef HAVE_CTERMID @@ -10912,13 +11120,13 @@ #endif /* MS_WINDOWS */ + static PyMethodDef posix_methods[] = { - {"access", (PyCFunction)posix_access, - METH_VARARGS | METH_KEYWORDS, - posix_access__doc__}, -#ifdef HAVE_TTYNAME - {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__}, -#endif + + OS_STAT_METHODDEF + OS_ACCESS_METHODDEF + OS_TTYNAME_METHODDEF + {"chdir", (PyCFunction)posix_chdir, METH_VARARGS | METH_KEYWORDS, posix_chdir__doc__}, @@ -11002,9 +11210,6 @@ {"rmdir", (PyCFunction)posix_rmdir, METH_VARARGS | METH_KEYWORDS, posix_rmdir__doc__}, - {"stat", (PyCFunction)posix_stat, - METH_VARARGS | METH_KEYWORDS, - posix_stat__doc__}, {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__}, #if defined(HAVE_SYMLINK) {"symlink", (PyCFunction)posix_symlink, diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -107,24 +107,62 @@ /* --- Module API --------------------------------------------------------- */ +/*[clinic] +module unicodedata +unicodedata.decimal + + unichr: object(type='str') + default: object=NULL + / + +Converts a Unicode character into its equivalent decimal value. + +Returns the decimal value assigned to the Unicode character unichr +as integer. If no such value is defined, default is returned, or, if +not given, ValueError is raised. +[clinic]*/ + PyDoc_STRVAR(unicodedata_decimal__doc__, -"decimal(unichr[, default])\n\ -\n\ -Returns the decimal value assigned to the Unicode character unichr\n\ -as integer. If no such value is defined, default is returned, or, if\n\ -not given, ValueError is raised."); +"Converts a Unicode character into its equivalent decimal value.\n" +"\n" +"unicodedata.decimal(unichr, default=None)\n" +"\n" +"Returns the decimal value assigned to the Unicode character unichr\n" +"as integer. If no such value is defined, default is returned, or, if\n" +"not given, ValueError is raised."); + +#define UNICODEDATA_DECIMAL_METHODDEF \ + {"decimal", (PyCFunction)unicodedata_decimal, METH_VARARGS, unicodedata_decimal__doc__}, + +static PyObject * +unicodedata_decimal_impl(PyObject *self, PyObject *unichr, PyObject *default_value); static PyObject * unicodedata_decimal(PyObject *self, PyObject *args) { - PyUnicodeObject *v; - PyObject *defobj = NULL; + PyObject *return_value = NULL; + PyObject *unichr; + PyObject *default_value = NULL; + + if (!PyArg_ParseTuple(args, + "O!|O:decimal", + &PyUnicode_Type, &unichr, &default_value)) + goto exit; + return_value = unicodedata_decimal_impl(self, unichr, default_value); + +exit: + return return_value; +} + +static PyObject * +unicodedata_decimal_impl(PyObject *self, PyObject *unichr, PyObject *default_value) +/*[clinic checksum: 76c8d1c3dbee495d4cfd86ca6829543a3129344a]*/ +{ + PyUnicodeObject *v = (PyUnicodeObject *)unichr; int have_old = 0; long rc; Py_UCS4 c; - if (!PyArg_ParseTuple(args, "O!|O:decimal", &PyUnicode_Type, &v, &defobj)) - return NULL; c = getuchar(v); if (c == (Py_UCS4)-1) return NULL; @@ -145,14 +183,14 @@ if (!have_old) rc = Py_UNICODE_TODECIMAL(c); if (rc < 0) { - if (defobj == NULL) { + if (default_value == NULL) { PyErr_SetString(PyExc_ValueError, "not a decimal"); return NULL; } else { - Py_INCREF(defobj); - return defobj; + Py_INCREF(default_value); + return default_value; } } return PyLong_FromLong(rc); @@ -1250,7 +1288,7 @@ /* XXX Add doc strings. */ static PyMethodDef unicodedata_functions[] = { - {"decimal", unicodedata_decimal, METH_VARARGS, unicodedata_decimal__doc__}, + UNICODEDATA_DECIMAL_METHODDEF {"digit", unicodedata_digit, METH_VARARGS, unicodedata_digit__doc__}, {"numeric", unicodedata_numeric, METH_VARARGS, unicodedata_numeric__doc__}, {"category", unicodedata_category, METH_VARARGS, diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -8,6 +8,7 @@ #include "structmember.h" #include "zlib.h" + #ifdef WITH_THREAD #include "pythread.h" #define ENTER_ZLIB(obj) \ @@ -626,87 +627,136 @@ return 0; } -PyDoc_STRVAR(decomp_decompress__doc__, -"decompress(data, max_length) -- Return a string containing the decompressed\n" -"version of the data.\n" +/*[clinic] + +module zlib + +zlib.decompress + + data: Py_buffer + The binary data to decompress. + max_length: int = 0 + The maximum allowable length of the decompressed data. + Unconsumed input data will be stored in + the unconsumed_tail attribute. + / + +Return a string containing the decompressed version of the data. + +After calling this function, some of the input data may still be stored in +internal buffers for later processing. +Call the flush() method to clear these buffers. +[clinic]*/ + +PyDoc_STRVAR(zlib_decompress__doc__, +"Return a string containing the decompressed version of the data.\n" +"\n" +"zlib.decompress(data, max_length=0)\n" +" data\n" +" The binary data to decompress.\n" +" max_length\n" +" The maximum allowable length of the decompressed data.\n" +" Unconsumed input data will be stored in\n" +" the unconsumed_tail attribute.\n" "\n" "After calling this function, some of the input data may still be stored in\n" "internal buffers for later processing.\n" -"Call the flush() method to clear these buffers.\n" -"If the max_length parameter is specified then the return value will be\n" -"no longer than max_length. Unconsumed input data will be stored in\n" -"the unconsumed_tail attribute."); +"Call the flush() method to clear these buffers."); + +#define ZLIB_DECOMPRESS_METHODDEF \ + {"decompress", (PyCFunction)zlib_decompress, METH_VARARGS, zlib_decompress__doc__}, static PyObject * -PyZlib_objdecompress(compobject *self, PyObject *args) +zlib_decompress_impl(PyObject *self, Py_buffer *data, int max_length); + +static PyObject * +zlib_decompress(PyObject *self, PyObject *args) { - int err, max_length = 0; + PyObject *return_value = NULL; + Py_buffer data; + int max_length = 0; + + if (!PyArg_ParseTuple(args, + "y*|i:decompress", + &data, &max_length)) + goto exit; + return_value = zlib_decompress_impl(self, &data, max_length); + +exit: + /* Cleanup for data */ + PyBuffer_Release(&data); + + return return_value; +} + +static PyObject * +zlib_decompress_impl(PyObject *self, Py_buffer *data, int max_length) +/*[clinic checksum: 168d093d400739dde947cca1f4fb0f9d51cdc2c9]*/ +{ + compobject *zself = (compobject *)self; + int err; unsigned int inplen; Py_ssize_t old_length, length = DEFAULTALLOC; PyObject *RetVal = NULL; - Py_buffer pinput; Byte *input; unsigned long start_total_out; - if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput, - &max_length)) - return NULL; - if (pinput.len > UINT_MAX) { + if (data->len > UINT_MAX) { PyErr_SetString(PyExc_OverflowError, "Size does not fit in an unsigned int"); - goto error_outer; + return NULL; } - input = pinput.buf; - inplen = pinput.len; + input = data->buf; + inplen = data->len; if (max_length < 0) { PyErr_SetString(PyExc_ValueError, "max_length must be greater than zero"); - goto error_outer; + return NULL; } /* limit amount of data allocated to max_length */ if (max_length && length > max_length) length = max_length; if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) - goto error_outer; + return NULL; - ENTER_ZLIB(self); + ENTER_ZLIB(zself); - start_total_out = self->zst.total_out; - self->zst.avail_in = inplen; - self->zst.next_in = input; - self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); + start_total_out = zself->zst.total_out; + zself->zst.avail_in = inplen; + zself->zst.next_in = input; + zself->zst.avail_out = length; + zself->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS - err = inflate(&(self->zst), Z_SYNC_FLUSH); + err = inflate(&(zself->zst), Z_SYNC_FLUSH); Py_END_ALLOW_THREADS - if (err == Z_NEED_DICT && self->zdict != NULL) { + if (err == Z_NEED_DICT && zself->zdict != NULL) { Py_buffer zdict_buf; - if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) { + if (PyObject_GetBuffer(zself->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) { Py_DECREF(RetVal); RetVal = NULL; goto error; } - err = inflateSetDictionary(&(self->zst), zdict_buf.buf, zdict_buf.len); + err = inflateSetDictionary(&(zself->zst), zdict_buf.buf, zdict_buf.len); PyBuffer_Release(&zdict_buf); if (err != Z_OK) { - zlib_error(self->zst, err, "while decompressing data"); + zlib_error(zself->zst, err, "while decompressing data"); Py_DECREF(RetVal); RetVal = NULL; goto error; } /* Repeat the call to inflate. */ Py_BEGIN_ALLOW_THREADS - err = inflate(&(self->zst), Z_SYNC_FLUSH); + err = inflate(&(zself->zst), Z_SYNC_FLUSH); Py_END_ALLOW_THREADS } /* While Z_OK and the output buffer is full, there might be more output. So extend the output buffer and try again. */ - while (err == Z_OK && self->zst.avail_out == 0) { + while (err == Z_OK && zself->zst.avail_out == 0) { /* If max_length set, don't continue decompressing if we've already reached the limit. */ @@ -723,16 +773,16 @@ Py_CLEAR(RetVal); goto error; } - self->zst.next_out = + zself->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length; - self->zst.avail_out = length - old_length; + zself->zst.avail_out = length - old_length; Py_BEGIN_ALLOW_THREADS - err = inflate(&(self->zst), Z_SYNC_FLUSH); + err = inflate(&(zself->zst), Z_SYNC_FLUSH); Py_END_ALLOW_THREADS } - if (save_unconsumed_input(self, err) < 0) { + if (save_unconsumed_input(zself, err) < 0) { Py_DECREF(RetVal); RetVal = NULL; goto error; @@ -741,26 +791,24 @@ if (err == Z_STREAM_END) { /* This is the logical place to call inflateEnd, but the old behaviour of only calling it on flush() is preserved. */ - self->eof = 1; + zself->eof = 1; } else if (err != Z_OK && err != Z_BUF_ERROR) { /* We will only get Z_BUF_ERROR if the output buffer was full but there wasn't more output when we tried again, so it is not an error condition. */ - zlib_error(self->zst, err, "while decompressing data"); + zlib_error(zself->zst, err, "while decompressing data"); Py_DECREF(RetVal); RetVal = NULL; goto error; } - if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { + if (_PyBytes_Resize(&RetVal, zself->zst.total_out - start_total_out) < 0) { Py_CLEAR(RetVal); } error: - LEAVE_ZLIB(self); - error_outer: - PyBuffer_Release(&pinput); + LEAVE_ZLIB(zself); return RetVal; } @@ -856,12 +904,27 @@ } #ifdef HAVE_ZLIB_COPY -PyDoc_STRVAR(comp_copy__doc__, -"copy() -- Return a copy of the compression object."); + +/*[clinic] + +zlib.copy + +Return a copy of the compression object. +[clinic]*/ + +PyDoc_STRVAR(zlib_copy__doc__, +"Return a copy of the compression object.\n" +"\n" +"zlib.copy()"); + +#define ZLIB_COPY_METHODDEF \ + {"copy", (PyCFunction)zlib_copy, METH_NOARGS, zlib_copy__doc__}, static PyObject * -PyZlib_copy(compobject *self) +zlib_copy(PyObject *self) +/*[clinic checksum: 7b648de2c1f933ba2b9fa17331ff1a44d9a4a740]*/ { + compobject *zself = (compobject *)self; compobject *retval = NULL; int err; @@ -871,8 +934,8 @@ /* Copy the zstream state * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe */ - ENTER_ZLIB(self); - err = deflateCopy(&retval->zst, &self->zst); + ENTER_ZLIB(zself); + err = deflateCopy(&retval->zst, &zself->zst); switch(err) { case(Z_OK): break; @@ -884,28 +947,28 @@ "Can't allocate memory for compression object"); goto error; default: - zlib_error(self->zst, err, "while copying compression object"); + zlib_error(zself->zst, err, "while copying compression object"); goto error; } - Py_INCREF(self->unused_data); - Py_INCREF(self->unconsumed_tail); - Py_XINCREF(self->zdict); + Py_INCREF(zself->unused_data); + Py_INCREF(zself->unconsumed_tail); + Py_XINCREF(zself->zdict); Py_XDECREF(retval->unused_data); Py_XDECREF(retval->unconsumed_tail); Py_XDECREF(retval->zdict); - retval->unused_data = self->unused_data; - retval->unconsumed_tail = self->unconsumed_tail; - retval->zdict = self->zdict; - retval->eof = self->eof; + retval->unused_data = zself->unused_data; + retval->unconsumed_tail = zself->unconsumed_tail; + retval->zdict = zself->zdict; + retval->eof = zself->eof; /* Mark it as being initialized */ retval->is_initialised = 1; - LEAVE_ZLIB(self); + LEAVE_ZLIB(zself); return (PyObject *)retval; error: - LEAVE_ZLIB(self); + LEAVE_ZLIB(zself); Py_XDECREF(retval); return NULL; } @@ -1055,16 +1118,14 @@ {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS, comp_flush__doc__}, #ifdef HAVE_ZLIB_COPY - {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS, - comp_copy__doc__}, + ZLIB_COPY_METHODDEF #endif {NULL, NULL} }; static PyMethodDef Decomp_methods[] = { - {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS, - decomp_decompress__doc__}, + ZLIB_DECOMPRESS_METHODDEF {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS, decomp_flush__doc__}, #ifdef HAVE_ZLIB_COPY diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2160,9 +2160,31 @@ return res; } +/*[clinic] +module dict + + at coexist +dict.__contains__ + + key: object + / + +True if D has a key k, else False" +[clinic]*/ + +PyDoc_STRVAR(dict___contains____doc__, +"True if D has a key k, else False\"\n" +"\n" +"dict.__contains__(key)"); + +#define DICT___CONTAINS___METHODDEF \ + {"__contains__", (PyCFunction)dict___contains__, METH_O|METH_COEXIST, dict___contains____doc__}, + static PyObject * -dict_contains(PyDictObject *mp, PyObject *key) +dict___contains__(PyObject *self, PyObject *key) +/*[clinic checksum: 61c5c802ea1d35699a1a754f1f3538ea9b259cf4]*/ { + register PyDictObject *mp = (PyDictObject *)self; Py_hash_t hash; PyDictKeyEntry *ep; PyObject **value_addr; @@ -2447,9 +2469,6 @@ return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry); } -PyDoc_STRVAR(contains__doc__, -"D.__contains__(k) -> True if D has a key k, else False"); - PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]"); PyDoc_STRVAR(sizeof__doc__, @@ -2498,8 +2517,7 @@ "D.values() -> an object providing a view on D's values"); static PyMethodDef mapp_methods[] = { - {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST, - contains__doc__}, + DICT___CONTAINS___METHODDEF {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST, getitem__doc__}, {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12656,28 +12656,76 @@ return case_operation(self, do_swapcase); } -PyDoc_STRVAR(maketrans__doc__, - "str.maketrans(x[, y[, z]]) -> dict (static method)\n\ -\n\ -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 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\ -must be a string, whose characters will be mapped to None in the result."); - -static PyObject* +/*[clinic] +module str + + at staticmethod +str.maketrans as unicode_maketrans + + x: object + + y: unicode=NULL + + z: unicode=NULL + + / + +Return a translation table usable for str.translate(). + +If there is only one argument, it must be a dictionary mapping Unicode +ordinals (integers) or characters to Unicode ordinals, strings or None. +Character keys will be then converted to ordinals. +If there are two arguments, they must be strings of equal length, and +in the resulting dictionary, each character in x will be mapped to the +character at the same position in y. If there is a third argument, it +must be a string, whose characters will be mapped to None in the result. +[clinic]*/ + +PyDoc_STRVAR(unicode_maketrans__doc__, +"Return a translation table usable for str.translate().\n" +"\n" +"str.maketrans(x, y=None, z=None)\n" +"\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 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" +"must be a string, whose characters will be mapped to None in the result."); + +#define UNICODE_MAKETRANS_METHODDEF \ + {"maketrans", (PyCFunction)unicode_maketrans, METH_VARARGS|METH_STATIC, unicode_maketrans__doc__}, + +static PyObject * +unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z); + +static PyObject * unicode_maketrans(PyObject *null, PyObject *args) { - PyObject *x, *y = NULL, *z = NULL; + PyObject *return_value = NULL; + PyObject *x; + PyObject *y = NULL; + PyObject *z = NULL; + + if (!PyArg_ParseTuple(args, + "O|UU:maketrans", + &x, &y, &z)) + goto exit; + return_value = unicode_maketrans_impl(x, y, z); + +exit: + return return_value; +} + +static PyObject * +unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z) +/*[clinic checksum: 137db9c3199e7906b7967009f511c24fa3235b5f]*/ +{ PyObject *new = NULL, *key, *value; Py_ssize_t i = 0; int res; - if (!PyArg_ParseTuple(args, "O|UU:maketrans", &x, &y, &z)) - return NULL; new = PyDict_New(); if (!new) return NULL; @@ -13317,8 +13365,7 @@ {"format", (PyCFunction) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__}, {"format_map", (PyCFunction) do_string_format_map, METH_O, format_map__doc__}, {"__format__", (PyCFunction) unicode__format__, METH_VARARGS, p_format__doc__}, - {"maketrans", (PyCFunction) unicode_maketrans, - METH_VARARGS | METH_STATIC, maketrans__doc__}, + UNICODE_MAKETRANS_METHODDEF {"__sizeof__", (PyCFunction) unicode__sizeof__, METH_NOARGS, sizeof__doc__}, #if 0 /* These methods are just used for debugging the implementation. */ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py new file mode 100755 --- /dev/null +++ b/Tools/clinic/clinic.py @@ -0,0 +1,2477 @@ +#!/usr/bin/env python3 +# +# Argument Clinic +# Copyright 2012-2013 by Larry Hastings. +# Licensed to the PSF under a contributor agreement. +# + +import abc +import ast +import atexit +import clinic +import collections +import contextlib +import functools +import hashlib +import inspect +import io +import itertools +import os +import re +import shlex +import sys +import tempfile +import textwrap + + +# TODO: +# converters for +# +# es +# es# +# et +# et# +# s# +# u# +# y# +# z# +# Z# +# +# soon: +# +# * allow mixing any two of {positional-only, positional-or-keyword, +# keyword-only} +# * dict constructor uses positional-only and keyword-only +# * max and min use positional only with an optional group +# and keyword-only +# +# * Generate forward slash for docstring first line +# (if I get positional-only syntax pep accepted) +# +# * Add "version" directive, so we can complain if the file +# is too new for us. +# + +_empty = inspect._empty +_void = inspect._void + + +class Unspecified: + def __repr__(self): + return '' + +unspecified = Unspecified() + + +class Null: + def __repr__(self): + return '' + +NULL = Null() + + +def _text_accumulator(): + text = [] + def output(): + s = ''.join(text) + text.clear() + return s + return text, text.append, output + + +def text_accumulator(): + """ + Creates a simple text accumulator / joiner. + + Returns a pair of callables: + append, output + "append" appends a string to the accumulator. + "output" returns the contents of the accumulator + joined together (''.join(accumulator)) and + empties the accumulator. + """ + text, append, output = _text_accumulator() + return append, output + + +def fail(*args, filename=None, line_number=None): + joined = " ".join([str(a) for a in args]) + add, output = text_accumulator() + add("Error") + if clinic: + if filename is None: + filename = clinic.filename + if clinic.block_parser and (line_number is None): + line_number = clinic.block_parser.line_number + if filename is not None: + add(' in file "' + filename + '"') + if line_number is not None: + add(" on line " + str(line_number)) + add(':\n') + add(joined) + print(output()) + sys.exit(-1) + + + +def quoted_for_c_string(s): + for old, new in ( + ('"', '\\"'), + ("'", "\\'"), + ): + s = s.replace(old, new) + return s + +# added "self", "cls", and "null" just to be safe +# (clinic will generate variables with these names) +c_keywords = set(""" +asm auto break case char cls const continue default do double +else enum extern float for goto if inline int long null register +return self short signed sizeof static struct switch typedef +typeof union unsigned void volatile while +""".strip().split()) + +def legal_c_identifier(s): + # if we picked a C keyword, pick something else + if s in c_keywords: + return s + "_value" + return s + +def rstrip_lines(s): + text, add, output = _text_accumulator() + for line in s.split('\n'): + add(line.rstrip()) + add('\n') + text.pop() + return output() + +def linear_format(s, **kwargs): + """ + Perform str.format-like substitution, except: + * The strings substituted must be on lines by + themselves. (This line is the "source line".) + * If the substitution text is empty, the source line + is removed in the output. + * If the substitution text is not empty: + * Each line of the substituted text is indented + by the indent of the source line. + * A newline will be added to the end. + """ + + add, output = text_accumulator() + for line in s.split('\n'): + indent, curly, trailing = line.partition('{') + if not curly: + add(line) + add('\n') + continue + + name, curl, trailing = trailing.partition('}') + if not curly or name not in kwargs: + add(line) + add('\n') + continue + + if trailing: + fail("Text found after {" + name + "} block marker! It must be on a line by itself.") + if indent.strip(): + fail("Non-whitespace characters found before {" + name + "} block marker! It must be on a line by itself.") + + value = kwargs[name] + if not value: + continue + + value = textwrap.indent(rstrip_lines(value), indent) + add(value) + add('\n') + + return output()[:-1] + + +class CRenderData: + def __init__(self): + + # The C statements to declare variables. + # Should be full lines with \n eol characters. + self.declarations = [] + + # The C statements required to initialize the variables before the parse call. + # Should be full lines with \n eol characters. + self.initializers = [] + + # The entries for the "keywords" array for PyArg_ParseTuple. + # Should be individual strings representing the names. + self.keywords = [] + + # The "format units" for PyArg_ParseTuple. + # Should be individual strings that will get + self.format_units = [] + + # The varargs arguments for PyArg_ParseTuple. + self.parse_arguments = [] + + # The parameter declarations for the impl function. + self.impl_parameters = [] + + # The arguments to the impl function at the time it's called. + self.impl_arguments = [] + + # For return converters: the name of the variable that + # should receive the value returned by the impl. + self.return_value = "return_value" + + # For return converters: the code to convert the return + # value from the parse function. This is also where + # you should check the _return_value for errors, and + # "goto exit" if there are any. + self.return_conversion = [] + + # The C statements required to clean up after the impl call. + self.cleanup = [] + + +class Language(metaclass=abc.ABCMeta): + + start_line = "" + body_prefix = "" + stop_line = "" + checksum_line = "" + + @abc.abstractmethod + def render(self, block): + pass + + def validate(self): + def assert_only_one(field, token='dsl_name'): + line = getattr(self, field) + token = '{' + token + '}' + if len(line.split(token)) != 2: + fail(self.__class__.__name__ + " " + field + " must contain " + token + " exactly once!") + assert_only_one('start_line') + assert_only_one('stop_line') + assert_only_one('checksum_line') + assert_only_one('checksum_line', 'checksum') + + if len(self.body_prefix.split('{dsl_name}')) >= 3: + fail(self.__class__.__name__ + " body_prefix may contain " + token + " once at most!") + + + +class PythonLanguage(Language): + + language = 'Python' + start_line = "#/*[{dsl_name}]" + body_prefix = "#" + stop_line = "#[{dsl_name}]*/" + checksum_line = "#/*[{dsl_name} checksum: {checksum}]*/" + + +def permute_left_option_groups(l): + """ + Given [1, 2, 3], should yield: + () + (3,) + (2, 3) + (1, 2, 3) + """ + yield tuple() + accumulator = [] + for group in reversed(l): + accumulator = list(group) + accumulator + yield tuple(accumulator) + + +def permute_right_option_groups(l): + """ + Given [1, 2, 3], should yield: + () + (1,) + (1, 2) + (1, 2, 3) + """ + yield tuple() + accumulator = [] + for group in l: + accumulator.extend(group) + yield tuple(accumulator) + + +def permute_optional_groups(left, required, right): + """ + Generator function that computes the set of acceptable + argument lists for the provided iterables of + argument groups. (Actually it generates a tuple of tuples.) + + Algorithm: prefer left options over right options. + + If required is empty, left must also be empty. + """ + required = tuple(required) + result = [] + + if not required: + assert not left + + accumulator = [] + counts = set() + for r in permute_right_option_groups(right): + for l in permute_left_option_groups(left): + t = l + required + r + if len(t) in counts: + continue + counts.add(len(t)) + accumulator.append(t) + + accumulator.sort(key=len) + return tuple(accumulator) + + +class CLanguage(Language): + + language = 'C' + start_line = "/*[{dsl_name}]" + body_prefix = "" + stop_line = "[{dsl_name}]*/" + checksum_line = "/*[{dsl_name} checksum: {checksum}]*/" + + def render(self, signatures): + function = None + for o in signatures: + if isinstance(o, Function): + if function: + fail("You may specify at most one function per block.\nFound a block containing at least two:\n\t" + repr(function) + " and " + repr(o)) + function = o + return self.render_function(function) + + def docstring_for_c_string(self, f): + text, add, output = _text_accumulator() + # turn docstring into a properly quoted C string + for line in f.docstring.split('\n'): + add('"') + add(quoted_for_c_string(line)) + add('\\n"\n') + + text.pop() + add('"') + return ''.join(text) + + impl_prototype_template = "{c_basename}_impl({impl_parameters})" + + @staticmethod + def template_base(*args): + flags = '|'.join(f for f in args if f) + return """ +PyDoc_STRVAR({c_basename}__doc__, +{docstring}); + +#define {methoddef_name} \\ + {{"{name}", (PyCFunction){c_basename}, {meth_flags}, {c_basename}__doc__}}, +""".replace('{meth_flags}', flags) + + def meth_noargs_pyobject_template(self, meth_flags=""): + return self.template_base("METH_NOARGS", meth_flags) + """ +static PyObject * +{c_basename}(PyObject *{self_name}) +""" + + def meth_noargs_template(self, meth_flags=""): + return self.template_base("METH_NOARGS", meth_flags) + """ +static {impl_return_type} +{impl_prototype}; + +static PyObject * +{c_basename}(PyObject *{self_name}) +{{ + PyObject *return_value = NULL; + {declarations} + {initializers} + + {return_value} = {c_basename}_impl({impl_arguments}); + {return_conversion} + +{exit_label} + {cleanup} + return return_value; +}} + +static {impl_return_type} +{impl_prototype} +""" + + def meth_o_template(self, meth_flags=""): + return self.template_base("METH_O", meth_flags) + """ +static PyObject * +{c_basename}({impl_parameters}) +""" + + def meth_o_return_converter_template(self, meth_flags=""): + return self.template_base("METH_O", meth_flags) + """ +static {impl_return_type} +{impl_prototype}; + +static PyObject * +{c_basename}({impl_parameters}) +{{ + PyObject *return_value = NULL; + {declarations} + {initializers} + _return_value = {c_basename}_impl({impl_arguments}); + {return_conversion} + +{exit_label} + {cleanup} + return return_value; +}} + +static {impl_return_type} +{impl_prototype} +""" + + def option_group_template(self, meth_flags=""): + return self.template_base("METH_VARARGS", meth_flags) + """ +static {impl_return_type} +{impl_prototype}; + +static PyObject * +{c_basename}(PyObject *{self_name}, PyObject *args) +{{ + PyObject *return_value = NULL; + {declarations} + {initializers} + + {option_group_parsing} + {return_value} = {c_basename}_impl({impl_arguments}); + {return_conversion} + +{exit_label} + {cleanup} + return return_value; +}} + +static {impl_return_type} +{impl_prototype} +""" + + def keywords_template(self, meth_flags=""): + return self.template_base("METH_VARARGS|METH_KEYWORDS", meth_flags) + """ +static {impl_return_type} +{impl_prototype}; + +static PyObject * +{c_basename}(PyObject *{self_name}, PyObject *args, PyObject *kwargs) +{{ + PyObject *return_value = NULL; + static char *_keywords[] = {{{keywords}, NULL}}; + {declarations} + {initializers} + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "{format_units}:{name}", _keywords, + {parse_arguments})) + goto exit; + {return_value} = {c_basename}_impl({impl_arguments}); + {return_conversion} + +{exit_label} + {cleanup} + return return_value; +}} + +static {impl_return_type} +{impl_prototype} +""" + + def positional_only_template(self, meth_flags=""): + return self.template_base("METH_VARARGS", meth_flags) + """ +static {impl_return_type} +{impl_prototype}; + +static PyObject * +{c_basename}(PyObject *{self_name}, PyObject *args) +{{ + PyObject *return_value = NULL; + {declarations} + {initializers} + + if (!PyArg_ParseTuple(args, + "{format_units}:{name}", + {parse_arguments})) + goto exit; + {return_value} = {c_basename}_impl({impl_arguments}); + {return_conversion} + +{exit_label} + {cleanup} + return return_value; +}} + +static {impl_return_type} +{impl_prototype} +""" + + @staticmethod + def group_to_variable_name(group): + adjective = "left_" if group < 0 else "right_" + return "group_" + adjective + str(abs(group)) + + def render_option_group_parsing(self, f, template_dict): + # positional only, grouped, optional arguments! + # can be optional on the left or right. + # here's an example: + # + # [ [ [ A1 A2 ] B1 B2 B3 ] C1 C2 ] D1 D2 D3 [ E1 E2 E3 [ F1 F2 F3 ] ] + # + # Here group D are required, and all other groups are optional. + # (Group D's "group" is actually None.) + # We can figure out which sets of arguments we have based on + # how many arguments are in the tuple. + # + # Note that you need to count up on both sides. For example, + # you could have groups C+D, or C+D+E, or C+D+E+F. + # + # What if the number of arguments leads us to an ambiguous result? + # Clinic prefers groups on the left. So in the above example, + # five arguments would map to B+C, not C+D. + + add, output = text_accumulator() + parameters = list(f.parameters.values()) + + groups = [] + group = None + left = [] + right = [] + required = [] + last = unspecified + + for p in parameters: + group_id = p.group + if group_id != last: + last = group_id + group = [] + if group_id < 0: + left.append(group) + elif group_id == 0: + group = required + else: + right.append(group) + group.append(p) + + count_min = sys.maxsize + count_max = -1 + + add("switch (PyTuple_Size(args)) {{\n") + for subset in permute_optional_groups(left, required, right): + count = len(subset) + count_min = min(count_min, count) + count_max = max(count_max, count) + + group_ids = {p.group for p in subset} # eliminate duplicates + d = {} + d['count'] = count + d['name'] = f.name + d['groups'] = sorted(group_ids) + d['format_units'] = "".join(p.converter.format_unit for p in subset) + + parse_arguments = [] + for p in subset: + p.converter.parse_argument(parse_arguments) + d['parse_arguments'] = ", ".join(parse_arguments) + + group_ids.discard(0) + lines = [self.group_to_variable_name(g) + " = 1;" for g in group_ids] + lines = "\n".join(lines) + + s = """ + case {count}: + if (!PyArg_ParseTuple(args, "{format_units}:{name}", {parse_arguments})) + return NULL; + {group_booleans} + break; +"""[1:] + s = linear_format(s, group_booleans=lines) + s = s.format_map(d) + add(s) + + add(" default:\n") + s = ' PyErr_SetString(PyExc_TypeError, "{} requires {} to {} arguments");\n' + add(s.format(f.full_name, count_min, count_max)) + add(' return NULL;\n') + add("}}") + template_dict['option_group_parsing'] = output() + + def render_function(self, f): + if not f: + return "" + + add, output = text_accumulator() + data = CRenderData() + + if f.kind == STATIC_METHOD: + meth_flags = 'METH_STATIC' + self_name = "null" + else: + if f.kind == CALLABLE: + meth_flags = '' + self_name = "self" + elif f.kind == CLASS_METHOD: + meth_flags = 'METH_CLASS' + self_name = "cls" + else: + fail("Unrecognized 'kind' " + repr(f.kind) + " for function " + f.name) + + data.impl_parameters.append("PyObject *" + self_name) + data.impl_arguments.append(self_name) + + if f.coexist: + if meth_flags: + meth_flags += '|' + meth_flags += 'METH_COEXIST' + + parameters = list(f.parameters.values()) + converters = [p.converter for p in parameters] + + template_dict = {} + + full_name = f.full_name + template_dict['full_name'] = full_name + + name = full_name.rpartition('.')[2] + template_dict['name'] = name + + c_basename = f.c_basename or full_name.replace(".", "_") + template_dict['c_basename'] = c_basename + + methoddef_name = "{}_METHODDEF".format(c_basename.upper()) + template_dict['methoddef_name'] = methoddef_name + + template_dict['docstring'] = self.docstring_for_c_string(f) + + template_dict['self_name'] = self_name + + positional = has_option_groups = False + + if parameters: + last_group = 0 + + for p in parameters: + c = p.converter + + # insert group variable + group = p.group + if last_group != group: + last_group = group + if group: + group_name = self.group_to_variable_name(group) + data.impl_arguments.append(group_name) + data.declarations.append("int " + group_name + " = 0;") + data.impl_parameters.append("int " + group_name) + has_option_groups = True + c.render(p, data) + + positional = parameters[-1].kind == inspect.Parameter.POSITIONAL_ONLY + if has_option_groups: + assert positional + + f.return_converter.render(f, data) + template_dict['impl_return_type'] = f.return_converter.type + + template_dict['declarations'] = "\n".join(data.declarations) + template_dict['initializers'] = "\n\n".join(data.initializers) + template_dict['keywords'] = '"' + '", "'.join(data.keywords) + '"' + template_dict['format_units'] = ''.join(data.format_units) + template_dict['parse_arguments'] = ', '.join(data.parse_arguments) + template_dict['impl_parameters'] = ", ".join(data.impl_parameters) + template_dict['impl_arguments'] = ", ".join(data.impl_arguments) + template_dict['return_conversion'] = "".join(data.return_conversion).rstrip() + template_dict['cleanup'] = "".join(data.cleanup) + template_dict['return_value'] = data.return_value + + template_dict['impl_prototype'] = self.impl_prototype_template.format_map(template_dict) + + default_return_converter = (not f.return_converter or + f.return_converter.type == 'PyObject *') + + if not parameters: + if default_return_converter: + template = self.meth_noargs_pyobject_template(meth_flags) + else: + template = self.meth_noargs_template(meth_flags) + elif (len(parameters) == 1 and + parameters[0].kind == inspect.Parameter.POSITIONAL_ONLY and + not converters[0].is_optional() and + isinstance(converters[0], object_converter) and + converters[0].format_unit == 'O'): + if default_return_converter: + template = self.meth_o_template(meth_flags) + else: + # HACK + # we're using "impl_parameters" for the + # non-impl function, because that works + # better for METH_O. but that means we + # must surpress actually declaring the + # impl's parameters as variables in the + # non-impl. but since it's METH_O, we + # only have one anyway, and it's the first one. + declarations_copy = list(data.declarations) + before, pyobject, after = declarations_copy[0].partition('PyObject *') + assert not before, "hack failed, see comment" + assert pyobject, "hack failed, see comment" + assert after and after[0].isalpha(), "hack failed, see comment" + del declarations_copy[0] + template_dict['declarations'] = "\n".join(declarations_copy) + template = self.meth_o_return_converter_template(meth_flags) + elif has_option_groups: + self.render_option_group_parsing(f, template_dict) + template = self.option_group_template(meth_flags) + template = linear_format(template, + option_group_parsing=template_dict['option_group_parsing']) + elif positional: + template = self.positional_only_template(meth_flags) + else: + template = self.keywords_template(meth_flags) + + template = linear_format(template, + declarations=template_dict['declarations'], + return_conversion=template_dict['return_conversion'], + initializers=template_dict['initializers'], + cleanup=template_dict['cleanup'], + ) + + # Only generate the "exit:" label + # if we have any gotos + need_exit_label = "goto exit;" in template + template = linear_format(template, + exit_label="exit:" if need_exit_label else '' + ) + + return template.format_map(template_dict) + + + at contextlib.contextmanager +def OverrideStdioWith(stdout): + saved_stdout = sys.stdout + sys.stdout = stdout + try: + yield + finally: + assert sys.stdout is stdout + sys.stdout = saved_stdout + + +def create_regex(before, after): + """Create an re object for matching marker lines.""" + pattern = r'^{}(\w+){}$' + return re.compile(pattern.format(re.escape(before), re.escape(after))) + + +class Block: + r""" + Represents a single block of text embedded in + another file. If dsl_name is None, the block represents + verbatim text, raw original text from the file, in + which case "input" will be the only non-false member. + If dsl_name is not None, the block represents a Clinic + block. + + input is always str, with embedded \n characters. + input represents the original text from the file; + if it's a Clinic block, it is the original text with + the body_prefix and redundant leading whitespace removed. + + dsl_name is either str or None. If str, it's the text + found on the start line of the block between the square + brackets. + + signatures is either list or None. If it's a list, + it may only contain clinic.Module, clinic.Class, and + clinic.Function objects. At the moment it should + contain at most one of each. + + output is either str or None. If str, it's the output + from this block, with embedded '\n' characters. + + indent is either str or None. It's the leading whitespace + that was found on every line of input. (If body_prefix is + not empty, this is the indent *after* removing the + body_prefix.) + + preindent is either str or None. It's the whitespace that + was found in front of every line of input *before* the + "body_prefix" (see the Language object). If body_prefix + is empty, preindent must always be empty too. + + To illustrate indent and preindent: Assume that '_' + represents whitespace. If the block processed was in a + Python file, and looked like this: + ____#/*[python] + ____#__for a in range(20): + ____#____print(a) + ____#[python]*/ + "preindent" would be "____" and "indent" would be "__". + + """ + def __init__(self, input, dsl_name=None, signatures=None, output=None, indent='', preindent=''): + assert isinstance(input, str) + self.input = input + self.dsl_name = dsl_name + self.signatures = signatures or [] + self.output = output + self.indent = indent + self.preindent = preindent + + +class BlockParser: + """ + Block-oriented parser for Argument Clinic. + Iterator, yields Block objects. + """ + + def __init__(self, input, language, *, verify=True): + """ + "input" should be a str object + with embedded \n characters. + + "language" should be a Language object. + """ + language.validate() + + self.input = collections.deque(reversed(input.splitlines(keepends=True))) + self.block_start_line_number = self.line_number = 0 + + self.language = language + before, _, after = language.start_line.partition('{dsl_name}') + assert _ == '{dsl_name}' + self.start_re = create_regex(before, after) + self.verify = verify + self.last_checksum_re = None + self.last_dsl_name = None + self.dsl_name = None + + def __iter__(self): + return self + + def __next__(self): + if not self.input: + raise StopIteration + + if self.dsl_name: + return_value = self.parse_clinic_block(self.dsl_name) + self.dsl_name = None + return return_value + return self.parse_verbatim_block() + + def is_start_line(self, line): + match = self.start_re.match(line.lstrip()) + return match.group(1) if match else None + + def _line(self): + self.line_number += 1 + return self.input.pop() + + def parse_verbatim_block(self): + add, output = text_accumulator() + self.block_start_line_number = self.line_number + + while self.input: + line = self._line() + dsl_name = self.is_start_line(line) + if dsl_name: + self.dsl_name = dsl_name + break + add(line) + + return Block(output()) + + def parse_clinic_block(self, dsl_name): + input_add, input_output = text_accumulator() + self.block_start_line_number = self.line_number + 1 + stop_line = self.language.stop_line.format(dsl_name=dsl_name) + '\n' + body_prefix = self.language.body_prefix.format(dsl_name=dsl_name) + + # consume body of program + while self.input: + line = self._line() + if line == stop_line or self.is_start_line(line): + break + if body_prefix: + line = line.lstrip() + assert line.startswith(body_prefix) + line = line[len(body_prefix):] + input_add(line) + + # consume output and checksum line, if present. + if self.last_dsl_name == dsl_name: + checksum_re = self.last_checksum_re + else: + before, _, after = self.language.checksum_line.format(dsl_name=dsl_name, checksum='{checksum}').partition('{checksum}') + assert _ == '{checksum}' + checksum_re = create_regex(before, after) + self.last_dsl_name = dsl_name + self.last_checksum_re = checksum_re + + # scan forward for checksum line + output_add, output_output = text_accumulator() + checksum = None + while self.input: + line = self._line() + match = checksum_re.match(line.lstrip()) + checksum = match.group(1) if match else None + if checksum: + break + output_add(line) + if self.is_start_line(line): + break + + if checksum: + output = output_output() + if self.verify: + computed = compute_checksum(output) + if checksum != computed: + fail("Checksum mismatch!\nExpected: {}\nComputed: {}".format(checksum, computed)) + else: + # put back output + self.input.extend(reversed(output.splitlines(keepends=True))) + self.line_number -= len(output) + output = None + + return Block(input_output(), dsl_name, output=output) + + +class BlockPrinter: + + def __init__(self, language, f=None): + self.language = language + self.f = f or io.StringIO() + + def print_block(self, block): + input = block.input + output = block.output + dsl_name = block.dsl_name + write = self.f.write + + assert (not input) or (input.endswith('\n')) + assert not ((dsl_name == None) ^ (output == None)), "you must specify dsl_name and output together, dsl_name " + repr(dsl_name) + + if not dsl_name: + write(input) + return + + write(self.language.start_line.format(dsl_name=dsl_name)) + write("\n") + + body_prefix = self.language.body_prefix.format(dsl_name=dsl_name) + if not body_prefix: + write(input) + else: + for line in input.split('\n'): + write(body_prefix) + write(line) + write("\n") + + write(self.language.stop_line.format(dsl_name=dsl_name)) + write("\n") + + output = block.output + if output: + write(output) + if not output.endswith('\n'): + write('\n') + + write(self.language.checksum_line.format(dsl_name=dsl_name, checksum=compute_checksum(output))) + write("\n") + + +# maps strings to Language objects. +# "languages" maps the name of the language ("C", "Python"). +# "extensions" maps the file extension ("c", "py"). +languages = { 'C': CLanguage, 'Python': PythonLanguage } +extensions = { 'c': CLanguage, 'h': CLanguage, 'py': PythonLanguage } + + +# maps strings to callables. +# these callables must be of the form: +# def foo(name, default, *, ...) +# The callable may have any number of keyword-only parameters. +# The callable must return a CConverter object. +# The callable should not call builtins.print. +converters = {} + +# maps strings to callables. +# these callables follow the same rules as those for "converters" above. +# note however that they will never be called with keyword-only parameters. +legacy_converters = {} + + +# maps strings to callables. +# these callables must be of the form: +# def foo(*, ...) +# The callable may have any number of keyword-only parameters. +# The callable must return a CConverter object. +# The callable should not call builtins.print. +return_converters = {} + +class Clinic: + def __init__(self, language, printer=None, *, verify=True, filename=None): + # maps strings to Parser objects. + # (instantiated from the "parsers" global.) + self.parsers = {} + self.language = language + self.printer = printer or BlockPrinter(language) + self.verify = verify + self.filename = filename + self.modules = collections.OrderedDict() + + global clinic + clinic = self + + def parse(self, input): + printer = self.printer + self.block_parser = BlockParser(input, self.language, verify=self.verify) + for block in self.block_parser: + dsl_name = block.dsl_name + if dsl_name: + if dsl_name not in self.parsers: + assert dsl_name in parsers, "No parser to handle {!r} block.".format(dsl_name) + self.parsers[dsl_name] = parsers[dsl_name](self) + parser = self.parsers[dsl_name] + parser.parse(block) + printer.print_block(block) + return printer.f.getvalue() + + def _module_and_class(self, fields): + """ + fields should be an iterable of field names. + returns a tuple of (module, class). + the module object could actually be self (a clinic object). + this function is only ever used to find the parent of where + a new class/module should go. + """ + in_classes = False + parent = module = self + cls = None + so_far = [] + + for field in fields: + so_far.append(field) + if not in_classes: + child = parent.modules.get(field) + if child: + module = child + continue + in_classes = True + if not hasattr(parent, 'classes'): + return module, cls + child = parent.classes.get(field) + if not child: + fail('Parent class or module ' + '.'.join(so_far) + " does not exist.") + cls = parent = child + + return module, cls + + +def parse_file(filename, *, verify=True, output=None, encoding='utf-8'): + extension = os.path.splitext(filename)[1][1:] + if not extension: + fail("Can't extract file type for file " + repr(filename)) + + try: + language = extensions[extension]() + except KeyError: + fail("Can't identify file type for file " + repr(filename)) + + clinic = Clinic(language, verify=verify, filename=filename) + + with open(filename, 'r', encoding=encoding) as f: + text = clinic.parse(f.read()) + + directory = os.path.dirname(filename) or '.' + + with tempfile.TemporaryDirectory(prefix="clinic", dir=directory) as tmpdir: + bytes = text.encode(encoding) + tmpfilename = os.path.join(tmpdir, os.path.basename(filename)) + with open(tmpfilename, "wb") as f: + f.write(bytes) + os.replace(tmpfilename, output or filename) + + +def compute_checksum(input): + input = input or '' + return hashlib.sha1(input.encode('utf-8')).hexdigest() + + + + +class PythonParser: + def __init__(self, clinic): + pass + + def parse(self, block): + s = io.StringIO() + with OverrideStdioWith(s): + exec(block.input) + block.output = s.getvalue() + + +class Module: + def __init__(self, name, module=None): + self.name = name + self.module = self.parent = module + + self.modules = collections.OrderedDict() + self.classes = collections.OrderedDict() + self.functions = [] + +class Class: + def __init__(self, name, module=None, cls=None): + self.name = name + self.module = module + self.cls = cls + self.parent = cls or module + + self.classes = collections.OrderedDict() + self.functions = [] + +DATA, CALLABLE, METHOD, STATIC_METHOD, CLASS_METHOD = range(5) + +class Function: + """ + Mutable duck type for inspect.Function. + + docstring - a str containing + * embedded line breaks + * text outdented to the left margin + * no trailing whitespace. + It will always be true that + (not docstring) or ((not docstring[0].isspace()) and (docstring.rstrip() == docstring)) + """ + + def __init__(self, parameters=None, *, name, + module, cls=None, c_basename=None, + full_name=None, + return_converter, return_annotation=_empty, + docstring=None, kind=CALLABLE, coexist=False): + self.parameters = parameters or collections.OrderedDict() + self.return_annotation = return_annotation + self.name = name + self.full_name = full_name + self.module = module + self.cls = cls + self.parent = cls or module + self.c_basename = c_basename + self.return_converter = return_converter + self.docstring = docstring or '' + self.kind = kind + self.coexist = coexist + + def __repr__(self): + return '' + + +class Parameter: + """ + Mutable duck type of inspect.Parameter. + """ + + def __init__(self, name, kind, *, default=_empty, + function, converter, annotation=_empty, + docstring=None, group=0): + self.name = name + self.kind = kind + self.default = default + self.function = function + self.converter = converter + self.annotation = annotation + self.docstring = docstring or '' + self.group = group + + def __repr__(self): + return '' + + def is_keyword_only(self): + return self.kind == inspect.Parameter.KEYWORD_ONLY + +py_special_values = { + NULL: "None", +} + +def py_repr(o): + special = py_special_values.get(o) + if special: + return special + return repr(o) + + +c_special_values = { + NULL: "NULL", + None: "Py_None", +} + +def c_repr(o): + special = c_special_values.get(o) + if special: + return special + if isinstance(o, str): + return '"' + quoted_for_c_string(o) + '"' + return repr(o) + +def add_c_converter(f, name=None): + if not name: + name = f.__name__ + if not name.endswith('_converter'): + return f + name = name[:-len('_converter')] + converters[name] = f + return f + +def add_default_legacy_c_converter(cls): + # automatically add converter for default format unit + # (but without stomping on the existing one if it's already + # set, in case you subclass) + if ((cls.format_unit != 'O&') and + (cls.format_unit not in legacy_converters)): + legacy_converters[cls.format_unit] = cls + return cls + +def add_legacy_c_converter(format_unit, **kwargs): + """ + Adds a legacy converter. + """ + def closure(f): + if not kwargs: + added_f = f + else: + added_f = functools.partial(f, **kwargs) + legacy_converters[format_unit] = added_f + return f + return closure + +class CConverterAutoRegister(type): + def __init__(cls, name, bases, classdict): + add_c_converter(cls) + add_default_legacy_c_converter(cls) + +class CConverter(metaclass=CConverterAutoRegister): + """ + For the init function, self, name, function, and default + must be keyword-or-positional parameters. All other + parameters (including "required" and "doc_default") + must be keyword-only. + """ + + type = None + format_unit = 'O&' + + # The Python default value for this parameter, as a Python value. + # Or "unspecified" if there is no default. + default = unspecified + + # "default" converted into a str for rendering into Python code. + py_default = None + + # "default" as it should appear in the documentation, as a string. + # Or None if there is no default. + doc_default = None + + # "default" converted into a C value, as a string. + # Or None if there is no default. + c_default = None + + # The C converter *function* to be used, if any. + # (If this is not None, format_unit must be 'O&'.) + converter = None + encoding = None + impl_by_reference = False + parse_by_reference = True + length = False + + def __init__(self, name, function, default=unspecified, *, doc_default=None, required=False, annotation=unspecified, **kwargs): + self.function = function + self.name = name + + if default is not unspecified: + self.default = default + self.py_default = py_repr(default) + self.doc_default = doc_default if doc_default is not None else self.py_default + self.c_default = c_repr(default) + elif doc_default is not None: + fail(function.fullname + " argument " + name + " specified a 'doc_default' without having a 'default'") + if annotation != unspecified: + fail("The 'annotation' parameter is not currently permitted.") + self.required = required + self.converter_init(**kwargs) + + def converter_init(self): + pass + + def is_optional(self): + return (self.default is not unspecified) and (not self.required) + + def render(self, parameter, data): + """ + parameter is a clinic.Parameter instance. + data is a CRenderData instance. + """ + name = legal_c_identifier(self.name) + + # declarations + d = self.declaration() + data.declarations.append(d) + + # initializers + initializers = self.initialize() + if initializers: + data.initializers.append('/* initializers for ' + name + ' */\n' + initializers.rstrip()) + + # impl_arguments + s = ("&" if self.impl_by_reference else "") + name + data.impl_arguments.append(s) + + # keywords + data.keywords.append(name) + + # format_units + if self.is_optional() and '|' not in data.format_units: + data.format_units.append('|') + if parameter.is_keyword_only() and '$' not in data.format_units: + data.format_units.append('$') + data.format_units.append(self.format_unit) + + # parse_arguments + self.parse_argument(data.parse_arguments) + + # impl_parameters + data.impl_parameters.append(self.simple_declaration(by_reference=self.impl_by_reference)) + + # cleanup + cleanup = self.cleanup() + if cleanup: + data.cleanup.append('/* Cleanup for ' + name + ' */\n' + cleanup.rstrip() + "\n") + + # Why is this one broken out separately? + # For "positional-only" function parsing, + # which generates a bunch of PyArg_ParseTuple calls. + def parse_argument(self, list): + assert not (self.converter and self.encoding) + if self.format_unit == 'O&': + assert self.converter + list.append(self.converter) + + if self.encoding: + list.append(self.encoding) + + s = ("&" if self.parse_by_reference else "") + legal_c_identifier(self.name) + list.append(s) + + # + # All the functions after here are intended as extension points. + # + + def simple_declaration(self, by_reference=False): + """ + Computes the basic declaration of the variable. + Used in computing the prototype declaration and the + variable declaration. + """ + prototype = [self.type] + if by_reference or not self.type.endswith('*'): + prototype.append(" ") + if by_reference: + prototype.append('*') + prototype.append(legal_c_identifier(self.name)) + return "".join(prototype) + + def declaration(self): + """ + The C statement to declare this variable. + """ + declaration = [self.simple_declaration()] + if self.c_default: + declaration.append(" = ") + declaration.append(self.c_default) + declaration.append(";") + return "".join(declaration) + + def initialize(self): + """ + The C statements required to set up this variable before parsing. + Returns a string containing this code indented at column 0. + If no initialization is necessary, returns an empty string. + """ + return "" + + def cleanup(self): + """ + The C statements required to clean up after this variable. + Returns a string containing this code indented at column 0. + If no cleanup is necessary, returns an empty string. + """ + return "" + + +class bool_converter(CConverter): + type = 'int' + format_unit = 'p' + + def converter_init(self): + self.default = bool(self.default) + self.c_default = str(int(self.default)) + +class char_converter(CConverter): + type = 'char' + format_unit = 'c' + + at add_legacy_c_converter('B', bitwise=True) +class byte_converter(CConverter): + type = 'byte' + format_unit = 'b' + + def converter_init(self, *, bitwise=False): + if bitwise: + format_unit = 'B' + +class short_converter(CConverter): + type = 'short' + format_unit = 'h' + +class unsigned_short_converter(CConverter): + type = 'unsigned short' + format_unit = 'H' + + def converter_init(self, *, bitwise=False): + if not bitwise: + fail("Unsigned shorts must be bitwise (for now).") + + at add_legacy_c_converter('C', from_str=True) +class int_converter(CConverter): + type = 'int' + format_unit = 'i' + + def converter_init(self, *, from_str=False): + if from_str: + format_unit = 'C' + +class unsigned_int_converter(CConverter): + type = 'unsigned int' + format_unit = 'I' + + def converter_init(self, *, bitwise=False): + if not bitwise: + fail("Unsigned ints must be bitwise (for now).") + +class long_converter(CConverter): + type = 'long' + format_unit = 'l' + +class unsigned_long_converter(CConverter): + type = 'unsigned long' + format_unit = 'k' + + def converter_init(self, *, bitwise=False): + if not bitwise: + fail("Unsigned longs must be bitwise (for now).") + +class PY_LONG_LONG_converter(CConverter): + type = 'PY_LONG_LONG' + format_unit = 'L' + +class unsigned_PY_LONG_LONG_converter(CConverter): + type = 'unsigned PY_LONG_LONG' + format_unit = 'K' + + def converter_init(self, *, bitwise=False): + if not bitwise: + fail("Unsigned PY_LONG_LONGs must be bitwise (for now).") + +class Py_ssize_t_converter(CConverter): + type = 'Py_ssize_t' + format_unit = 'n' + + +class float_converter(CConverter): + type = 'float' + format_unit = 'f' + +class double_converter(CConverter): + type = 'double' + format_unit = 'd' + + +class Py_complex_converter(CConverter): + type = 'Py_complex' + format_unit = 'D' + + +class object_converter(CConverter): + type = 'PyObject *' + format_unit = 'O' + + def converter_init(self, *, type=None): + if type: + assert isinstance(type, str) + assert type.isidentifier() + try: + type = eval(type) + # need more of these! + type = { + str: '&PyUnicode_Type', + }[type] + except NameError: + type = type + self.format_unit = 'O!' + self.encoding = type + + + at add_legacy_c_converter('y', from_bytes=True) + at add_legacy_c_converter('z', nullable=True) +class str_converter(CConverter): + type = 'const char *' + format_unit = 's' + + def converter_init(self, *, nullable=False, from_bytes=False): + if from_bytes: + assert not nullable + format_unit = 'y' + if nullable: + format_unit = 'z' + + +class PyBytesObject_converter(CConverter): + type = 'PyBytesObject *' + format_unit = 'S' + +class PyByteArrayObject_converter(CConverter): + type = 'PyByteArrayObject *' + format_unit = 'Y' + +class unicode_converter(CConverter): + type = 'PyObject *' + format_unit = 'U' + + at add_legacy_c_converter('Z', nullable=True) +class Py_UNICODE_converter(CConverter): + type = 'Py_UNICODE *' + format_unit = 'u' + + def converter_init(self, *, nullable=False): + if nullable: + format_unit = 'Z' + + at add_legacy_c_converter('s*', zeroes=True) + at add_legacy_c_converter('w*', read_write=True) + at add_legacy_c_converter('z*', zeroes=True, nullable=True) +class Py_buffer_converter(CConverter): + type = 'Py_buffer' + format_unit = 'y*' + impl_by_reference = True + + def converter_init(self, *, str=False, zeroes=False, nullable=False, read_write=False): + if not str: + assert not (zeroes or nullable or read_write) + elif read_write: + assert not (zeroes or nullable) + self.format_unit = 'w*' + else: + assert zeroes + self.format_unit = 'z*' if nullable else 's*' + + def cleanup(self): + return "PyBuffer_Release(&" + legal_c_identifier(self.name) + ");\n" + + +def add_c_return_converter(f, name=None): + if not name: + name = f.__name__ + if not name.endswith('_return_converter'): + return f + name = name[:-len('_return_converter')] + return_converters[name] = f + return f + + +class CReturnConverterAutoRegister(type): + def __init__(cls, name, bases, classdict): + add_c_return_converter(cls) + +class CReturnConverter(metaclass=CReturnConverterAutoRegister): + + type = 'PyObject *' + default = None + + def __init__(self, *, doc_default=None, **kwargs): + self.doc_default = doc_default + try: + self.return_converter_init(**kwargs) + except TypeError as e: + s = ', '.join(name + '=' + repr(value) for name, value in kwargs.items()) + sys.exit(self.__class__.__name__ + '(' + s + ')\n' + str(e)) + + def return_converter_init(self): + pass + + def declare(self, data, name="_return_value"): + line = [] + add = line.append + add(self.type) + if not self.type.endswith('*'): + add(' ') + add(name + ';') + data.declarations.append(''.join(line)) + data.return_value = name + + def err_occurred_if(self, expr, data): + data.return_conversion.append('if (({}) && PyErr_Occurred())\n goto exit;\n'.format(expr)) + + def err_occurred_if_null_pointer(self, variable, data): + data.return_conversion.append('if ({} == NULL)\n goto exit;\n'.format(variable)) + + def render(self, function, data): + """ + function is a clinic.Function instance. + data is a CRenderData instance. + """ + pass + +add_c_return_converter(CReturnConverter, 'object') + +class int_return_converter(CReturnConverter): + type = 'int' + + def render(self, function, data): + self.declare(data) + self.err_occurred_if("_return_value == -1", data) + data.return_conversion.append( + 'return_value = PyLong_FromLong((long)_return_value);\n') + + +class long_return_converter(CReturnConverter): + type = 'long' + + def render(self, function, data): + self.declare(data) + self.err_occurred_if("_return_value == -1", data) + data.return_conversion.append( + 'return_value = PyLong_FromLong(_return_value);\n') + + +class Py_ssize_t_return_converter(CReturnConverter): + type = 'Py_ssize_t' + + def render(self, function, data): + self.declare(data) + self.err_occurred_if("_return_value == -1", data) + data.return_conversion.append( + 'return_value = PyLong_FromSsize_t(_return_value);\n') + + +class DecodeFSDefault_return_converter(CReturnConverter): + type = 'char *' + + def render(self, function, data): + self.declare(data) + self.err_occurred_if_null_pointer("_return_value", data) + data.return_conversion.append( + 'return_value = PyUnicode_DecodeFSDefault(_return_value);\n') + + +class IndentStack: + def __init__(self): + self.indents = [] + self.margin = None + + def _ensure(self): + if not self.indents: + fail('IndentStack expected indents, but none are defined.') + + def measure(self, line): + """ + Returns the length of the line's margin. + """ + if '\t' in line: + fail('Tab characters are illegal in the Clinic DSL.') + stripped = line.lstrip() + if not len(stripped): + # we can't tell anything from an empty line + # so just pretend it's indented like our current indent + self._ensure() + return self.indents[-1] + return len(line) - len(stripped) + + def infer(self, line): + """ + Infer what is now the current margin based on this line. + Returns: + 1 if we have indented (or this is the first margin) + 0 if the margin has not changed + -N if we have dedented N times + """ + indent = self.measure(line) + margin = ' ' * indent + if not self.indents: + self.indents.append(indent) + self.margin = margin + return 1 + current = self.indents[-1] + if indent == current: + return 0 + if indent > current: + self.indents.append(indent) + self.margin = margin + return 1 + # indent < current + if indent not in self.indents: + fail("Illegal outdent.") + outdent_count = 0 + while indent != current: + self.indents.pop() + current = self.indents[-1] + outdent_count -= 1 + self.margin = margin + return outdent_count + + @property + def depth(self): + """ + Returns how many margins are currently defined. + """ + return len(self.indents) + + def indent(self, line): + """ + Indents a line by the currently defined margin. + """ + return self.margin + line + + def dedent(self, line): + """ + Dedents a line by the currently defined margin. + (The inverse of 'indent'.) + """ + margin = self.margin + indent = self.indents[-1] + if not line.startswith(margin): + fail('Cannot dedent, line does not start with the previous margin:') + return line[indent:] + + +class DSLParser: + def __init__(self, clinic): + self.clinic = clinic + + self.directives = {} + for name in dir(self): + # functions that start with directive_ are added to directives + _, s, key = name.partition("directive_") + if s: + self.directives[key] = getattr(self, name) + + # functions that start with at_ are too, with an @ in front + _, s, key = name.partition("at_") + if s: + self.directives['@' + key] = getattr(self, name) + + self.reset() + + def reset(self): + self.function = None + self.state = self.state_dsl_start + self.parameter_indent = None + self.keyword_only = False + self.group = 0 + self.parameter_state = self.ps_start + self.indent = IndentStack() + self.kind = CALLABLE + self.coexist = False + + def directive_module(self, name): + fields = name.split('.') + new = fields.pop() + module, cls = self.clinic._module_and_class(fields) + if cls: + fail("Can't nest a module inside a class!") + m = Module(name, module) + module.modules[name] = m + self.block.signatures.append(m) + + def directive_class(self, name): + fields = name.split('.') + in_classes = False + parent = self + name = fields.pop() + so_far = [] + module, cls = self.clinic._module_and_class(fields) + + if not module: + fail("You must explicitly specify the module for the class.") + + c = Class(name, module, cls) + module.classes[name] = c + if cls: + cls.classes[name] = c + self.block.signatures.append(c) + + def at_classmethod(self): + assert self.kind is CALLABLE + self.kind = CLASS_METHOD + + def at_staticmethod(self): + assert self.kind is CALLABLE + self.kind = STATIC_METHOD + + def at_coexist(self): + assert self.coexist == False + self.coexist = True + + def parse(self, block): + self.reset() + self.block = block + block_start = self.clinic.block_parser.line_number + lines = block.input.split('\n') + for line_number, line in enumerate(lines, self.clinic.block_parser.block_start_line_number): + if '\t' in line: + fail('Tab characters are illegal in the Clinic DSL.\n\t' + repr(line), line_number=block_start) + self.state(line) + + self.next(self.state_terminal) + self.state(None) + + block.output = self.clinic.language.render(block.signatures) + + @staticmethod + def ignore_line(line): + # ignore comment-only lines + if line.lstrip().startswith('#'): + return True + + # Ignore empty lines too + # (but not in docstring sections!) + if not line.strip(): + return True + + return False + + @staticmethod + def calculate_indent(line): + return len(line) - len(line.strip()) + + def next(self, state, line=None): + # real_print(self.state.__name__, "->", state.__name__, ", line=", line) + self.state = state + if line is not None: + self.state(line) + + def state_dsl_start(self, line): + # self.block = self.ClinicOutputBlock(self) + if self.ignore_line(line): + return + self.next(self.state_modulename_name, line) + + def state_modulename_name(self, line): + # looking for declaration, which establishes the leftmost column + # line should be + # modulename.fnname [as c_basename] [-> return annotation] + # square brackets denote optional syntax. + # + # (but we might find a directive first!) + # + # this line is permitted to start with whitespace. + # we'll call this number of spaces F (for "function"). + + if not line.strip(): + return + + self.indent.infer(line) + + # is it a directive? + fields = shlex.split(line) + directive_name = fields[0] + directive = self.directives.get(directive_name, None) + if directive: + directive(*fields[1:]) + return + + line, _, returns = line.partition('->') + + full_name, _, c_basename = line.partition(' as ') + full_name = full_name.strip() + c_basename = c_basename.strip() or None + + if not returns: + return_converter = CReturnConverter() + else: + ast_input = "def x() -> {}: pass".format(returns) + module = None + try: + module = ast.parse(ast_input) + except SyntaxError: + pass + if not module: + fail("Badly-formed annotation for " + full_name + ": " + returns) + try: + name, legacy, kwargs = self.parse_converter(module.body[0].returns) + assert not legacy + if name not in return_converters: + fail("Error: No available return converter called " + repr(name)) + return_converter = return_converters[name](**kwargs) + except ValueError: + fail("Badly-formed annotation for " + full_name + ": " + returns) + + fields = [x.strip() for x in full_name.split('.')] + function_name = fields.pop() + module, cls = self.clinic._module_and_class(fields) + + if not module: + fail("Undefined module used in declaration of " + repr(full_name.strip()) + ".") + self.function = Function(name=function_name, full_name=full_name, module=module, cls=cls, c_basename=c_basename, + return_converter=return_converter, kind=self.kind, coexist=self.coexist) + self.block.signatures.append(self.function) + self.next(self.state_parameters_start) + + # Now entering the parameters section. The rules, formally stated: + # + # * All lines must be indented with spaces only. + # * The first line must be a parameter declaration. + # * The first line must be indented. + # * This first line establishes the indent for parameters. + # * We'll call this number of spaces P (for "parameter"). + # * Thenceforth: + # * Lines indented with P spaces specify a parameter. + # * Lines indented with > P spaces are docstrings for the previous + # parameter. + # * We'll call this number of spaces D (for "docstring"). + # * All subsequent lines indented with >= D spaces are stored as + # part of the per-parameter docstring. + # * All lines will have the first D spaces of the indent stripped + # before they are stored. + # * It's illegal to have a line starting with a number of spaces X + # such that P < X < D. + # * A line with < P spaces is the first line of the function + # docstring, which ends processing for parameters and per-parameter + # docstrings. + # * The first line of the function docstring must be at the same + # indent as the function declaration. + # * It's illegal to have any line in the parameters section starting + # with X spaces such that F < X < P. (As before, F is the indent + # of the function declaration.) + # + ############## + # + # Also, currently Argument Clinic places the following restrictions on groups: + # * Each group must contain at least one parameter. + # * Each group may contain at most one group, which must be the furthest + # thing in the group from the required parameters. (The nested group + # must be the first in the group when it's before the required + # parameters, and the last thing in the group when after the required + # parameters.) + # * There may be at most one (top-level) group to the left or right of + # the required parameters. + # * You must specify a slash, and it must be after all parameters. + # (In other words: either all parameters are positional-only, + # or none are.) + # + # Said another way: + # * Each group must contain at least one parameter. + # * All left square brackets before the required parameters must be + # consecutive. (You can't have a left square bracket followed + # by a parameter, then another left square bracket. You can't + # have a left square bracket, a parameter, a right square bracket, + # and then a left square bracket.) + # * All right square brackets after the required parameters must be + # consecutive. + # + # These rules are enforced with a single state variable: + # "parameter_state". (Previously the code was a miasma of ifs and + # separate boolean state variables.) The states are: + # + # [ [ a, b, ] c, ] d, e, f, [ g, h, [ i ] ] / <- line + # 01 2 3 4 5 6 <- state transitions + # + # 0: ps_start. before we've seen anything. legal transitions are to 1 or 3. + # 1: ps_left_square_before. left square brackets before required parameters. + # 2: ps_group_before. in a group, before required parameters. + # 3: ps_required. required parameters. (renumber left groups!) + # 4: ps_group_after. in a group, after required parameters. + # 5: ps_right_square_after. right square brackets after required parameters. + # 6: ps_seen_slash. seen slash. + ps_start, ps_left_square_before, ps_group_before, ps_required, \ + ps_group_after, ps_right_square_after, ps_seen_slash = range(7) + + def state_parameters_start(self, line): + if self.ignore_line(line): + return + + # if this line is not indented, we have no parameters + if not self.indent.infer(line): + return self.next(self.state_function_docstring, line) + + return self.next(self.state_parameter, line) + + + def to_required(self): + """ + Transition to the "required" parameter state. + """ + if self.parameter_state != self.ps_required: + self.parameter_state = self.ps_required + for p in self.function.parameters.values(): + p.group = -p.group + + def state_parameter(self, line): + if self.ignore_line(line): + return + + assert self.indent.depth == 2 + indent = self.indent.infer(line) + if indent == -1: + # we outdented, must be to definition column + return self.next(self.state_function_docstring, line) + + if indent == 1: + # we indented, must be to new parameter docstring column + return self.next(self.state_parameter_docstring_start, line) + + line = line.lstrip() + + if line in ('*', '/', '[', ']'): + self.parse_special_symbol(line) + return + + if self.parameter_state in (self.ps_start, self.ps_required): + self.to_required() + elif self.parameter_state == self.ps_left_square_before: + self.parameter_state = self.ps_group_before + elif self.parameter_state == self.ps_group_before: + if not self.group: + self.to_required() + elif self.parameter_state == self.ps_group_after: + pass + else: + fail("Function " + self.function.name + " has an unsupported group configuration. (Unexpected state " + str(self.parameter_state) + ")") + + ast_input = "def x({}): pass".format(line) + module = None + try: + module = ast.parse(ast_input) + except SyntaxError: + pass + if not module: + fail("Function " + clinic.name + " has an invalid parameter declaration:\n\t" + line) + + function_args = module.body[0].args + parameter = function_args.args[0] + + if function_args.defaults: + expr = function_args.defaults[0] + # mild hack: explicitly support NULL as a default value + if isinstance(expr, ast.Name) and expr.id == 'NULL': + value = NULL + else: + value = ast.literal_eval(expr) + else: + value = unspecified + + parameter_name = parameter.arg + name, legacy, kwargs = self.parse_converter(parameter.annotation) + dict = legacy_converters if legacy else converters + legacy_str = "legacy " if legacy else "" + if name not in dict: + fail('{} is not a valid {}converter'.format(name, legacy_str)) + converter = dict[name](parameter_name, self.function, value, **kwargs) + + kind = inspect.Parameter.KEYWORD_ONLY if self.keyword_only else inspect.Parameter.POSITIONAL_OR_KEYWORD + p = Parameter(parameter_name, kind, function=self.function, converter=converter, default=value, group=self.group) + self.function.parameters[parameter_name] = p + + def parse_converter(self, annotation): + if isinstance(annotation, ast.Str): + return annotation.s, True, {} + + if isinstance(annotation, ast.Name): + return annotation.id, False, {} + + assert isinstance(annotation, ast.Call) + + name = annotation.func.id + kwargs = {node.arg: ast.literal_eval(node.value) for node in annotation.keywords} + return name, False, kwargs + + def parse_special_symbol(self, symbol): + if self.parameter_state == self.ps_seen_slash: + fail("Function " + self.function.name + " specifies " + symbol + " after /, which is unsupported.") + + if symbol == '*': + if self.keyword_only: + fail("Function " + self.function.name + " uses '*' more than once.") + self.keyword_only = True + elif symbol == '[': + if self.parameter_state in (self.ps_start, self.ps_left_square_before): + self.parameter_state = self.ps_left_square_before + elif self.parameter_state in (self.ps_required, self.ps_group_after): + self.parameter_state = self.ps_group_after + else: + fail("Function " + self.function.name + " has an unsupported group configuration. (Unexpected state " + str(self.parameter_state) + ")") + self.group += 1 + elif symbol == ']': + if not self.group: + fail("Function " + self.function.name + " has a ] without a matching [.") + if not any(p.group == self.group for p in self.function.parameters.values()): + fail("Function " + self.function.name + " has an empty group.\nAll groups must contain at least one parameter.") + self.group -= 1 + if self.parameter_state in (self.ps_left_square_before, self.ps_group_before): + self.parameter_state = self.ps_group_before + elif self.parameter_state in (self.ps_group_after, self.ps_right_square_after): + self.parameter_state = self.ps_right_square_after + else: + fail("Function " + self.function.name + " has an unsupported group configuration. (Unexpected state " + str(self.parameter_state) + ")") + elif symbol == '/': + # ps_required is allowed here, that allows positional-only without option groups + # to work (and have default values!) + if (self.parameter_state not in (self.ps_required, self.ps_right_square_after, self.ps_group_before)) or self.group: + fail("Function " + self.function.name + " has an unsupported group configuration. (Unexpected state " + str(self.parameter_state) + ")") + if self.keyword_only: + fail("Function " + self.function.name + " mixes keyword-only and positional-only parameters, which is unsupported.") + self.parameter_state = self.ps_seen_slash + # fixup preceeding parameters + for p in self.function.parameters.values(): + if p.kind != inspect.Parameter.POSITIONAL_OR_KEYWORD: + fail("Function " + self.function.name + " mixes keyword-only and positional-only parameters, which is unsupported.") + p.kind = inspect.Parameter.POSITIONAL_ONLY + + def state_parameter_docstring_start(self, line): + self.parameter_docstring_indent = len(self.indent.margin) + assert self.indent.depth == 3 + return self.next(self.state_parameter_docstring, line) + + # every line of the docstring must start with at least F spaces, + # where F > P. + # these F spaces will be stripped. + def state_parameter_docstring(self, line): + stripped = line.strip() + if stripped.startswith('#'): + return + + indent = self.indent.measure(line) + if indent < self.parameter_docstring_indent: + self.indent.infer(line) + assert self.indent.depth < 3 + if self.indent.depth == 2: + # back to a parameter + return self.next(self.state_parameter, line) + assert self.indent.depth == 1 + return self.next(self.state_function_docstring, line) + + assert self.function.parameters + last_parameter = next(reversed(list(self.function.parameters.values()))) + + new_docstring = last_parameter.docstring + + if new_docstring: + new_docstring += '\n' + if stripped: + new_docstring += self.indent.dedent(line) + + last_parameter.docstring = new_docstring + + # the final stanza of the DSL is the docstring. + def state_function_docstring(self, line): + if self.group: + fail("Function " + self.function.name + " has a ] without a matching [.") + + stripped = line.strip() + if stripped.startswith('#'): + return + + new_docstring = self.function.docstring + if new_docstring: + new_docstring += "\n" + if stripped: + line = self.indent.dedent(line).rstrip() + else: + line = '' + new_docstring += line + self.function.docstring = new_docstring + + def format_docstring(self): + f = self.function + + add, output = text_accumulator() + parameters = list(f.parameters.values()) + + ## + ## docstring first line + ## + + add(f.full_name) + add('(') + + # populate "right_bracket_count" field for every parameter + if parameters: + # for now, the only way Clinic supports positional-only parameters + # is if all of them are positional-only. + positional_only_parameters = [p.kind == inspect.Parameter.POSITIONAL_ONLY for p in parameters] + if parameters[0].kind == inspect.Parameter.POSITIONAL_ONLY: + assert all(positional_only_parameters) + for p in parameters: + p.right_bracket_count = abs(p.group) + else: + # don't put any right brackets around non-positional-only parameters, ever. + for p in parameters: + p.right_bracket_count = 0 + + right_bracket_count = 0 + + def fix_right_bracket_count(desired): + nonlocal right_bracket_count + s = '' + while right_bracket_count < desired: + s += '[' + right_bracket_count += 1 + while right_bracket_count > desired: + s += ']' + right_bracket_count -= 1 + return s + + added_star = False + add_comma = False + + for p in parameters: + assert p.name + + if p.is_keyword_only() and not added_star: + added_star = True + if add_comma: + add(', ') + add('*') + + a = [p.name] + if p.converter.is_optional(): + a.append('=') + value = p.converter.default + a.append(p.converter.doc_default) + s = fix_right_bracket_count(p.right_bracket_count) + s += "".join(a) + if add_comma: + add(', ') + add(s) + add_comma = True + + add(fix_right_bracket_count(0)) + add(')') + + if f.return_converter.doc_default: + add(' -> ') + add(f.return_converter.doc_default) + + docstring_first_line = output() + + # now fix up the places where the brackets look wrong + docstring_first_line = docstring_first_line.replace(', ]', ',] ') + + # okay. now we're officially building the + # "prototype" section. + add(docstring_first_line) + + # create substitution text for {parameters} + for p in parameters: + if not p.docstring.strip(): + continue + add('\n') + add(" ") + add(p.name) + add('\n') + add(textwrap.indent(rstrip_lines(p.docstring.rstrip()), " ")) + prototype = output() + + ## + ## docstring body + ## + + docstring = f.docstring.rstrip() + lines = [line.rstrip() for line in docstring.split('\n')] + + # Enforce the summary line! + # The first line of a docstring should be a summary of the function. + # It should fit on one line (80 columns? 79 maybe?) and be a paragraph + # by itself. + # + # Argument Clinic enforces the following rule: + # * either the docstring is empty, + # * or it must have a summary line. + # + # Guido said Clinic should enforce this: + # http://mail.python.org/pipermail/python-dev/2013-June/127110.html + + if len(lines) >= 2: + if lines[1]: + fail("Docstring for " + f.full_name + " does not have a summary line!\n" + + "Every non-blank function docstring must start with\n" + + "a single line summary followed by an empty line.") + elif len(lines) == 1: + # the docstring is only one line right now--the summary line. + # add an empty line after the summary line so we have space + # between it and the {prototype} we're about to add. + lines.append('') + + prototype_marker_count = len(docstring.split('{prototype}')) - 1 + if prototype_marker_count: + fail('You may not specify {prototype} in a docstring!') + # insert *after* the summary line + lines.insert(2, '{prototype}\n') + + docstring = "\n".join(lines) + + add(docstring) + docstring = output() + + docstring = linear_format(docstring, prototype=prototype) + docstring = docstring.rstrip() + + return docstring + + def state_terminal(self, line): + """ + Called when processing the block is done. + """ + assert not line + + if not self.function: + return + + if self.keyword_only: + values = self.function.parameters.values() + if not values: + no_parameter_after_star = True + else: + last_parameter = next(reversed(list(values))) + no_parameter_after_star = last_parameter.kind != inspect.Parameter.KEYWORD_ONLY + if no_parameter_after_star: + fail("Function " + self.function.name + " specifies '*' without any parameters afterwards.") + + # remove trailing whitespace from all parameter docstrings + for name, value in self.function.parameters.items(): + if not value: + continue + value.docstring = value.docstring.rstrip() + + self.function.docstring = self.format_docstring() + + +# maps strings to callables. +# the callable should return an object +# that implements the clinic parser +# interface (__init__ and parse). +# +# example parsers: +# "clinic", handles the Clinic DSL +# "python", handles running Python code +# +parsers = {'clinic' : DSLParser, 'python': PythonParser} + + +clinic = None + + +def main(argv): + import sys + + if sys.version_info.major < 3 or sys.version_info.minor < 3: + sys.exit("Error: clinic.py requires Python 3.3 or greater.") + + import argparse + cmdline = argparse.ArgumentParser() + cmdline.add_argument("-f", "--force", action='store_true') + cmdline.add_argument("-o", "--output", type=str) + cmdline.add_argument("--converters", action='store_true') + cmdline.add_argument("filename", type=str, nargs="*") + ns = cmdline.parse_args(argv) + + if ns.converters: + if ns.filename: + print("Usage error: can't specify --converters and a filename at the same time.") + print() + cmdline.print_usage() + sys.exit(-1) + converters = [] + return_converters = [] + ignored = set(""" + add_c_converter + add_c_return_converter + add_default_legacy_c_converter + add_legacy_c_converter + """.strip().split()) + module = globals() + for name in module: + for suffix, ids in ( + ("_return_converter", return_converters), + ("_converter", converters), + ): + if name in ignored: + continue + if name.endswith(suffix): + ids.append((name, name[:-len(suffix)])) + break + print() + + print("Legacy converters:") + legacy = sorted(legacy_converters) + print(' ' + ' '.join(c for c in legacy if c[0].isupper())) + print(' ' + ' '.join(c for c in legacy if c[0].islower())) + print() + + for title, attribute, ids in ( + ("Converters", 'converter_init', converters), + ("Return converters", 'return_converter_init', return_converters), + ): + print(title + ":") + longest = -1 + for name, short_name in ids: + longest = max(longest, len(short_name)) + for name, short_name in sorted(ids, key=lambda x: x[1].lower()): + cls = module[name] + callable = getattr(cls, attribute, None) + if not callable: + continue + signature = inspect.signature(callable) + parameters = [] + for parameter_name, parameter in signature.parameters.items(): + if parameter.kind == inspect.Parameter.KEYWORD_ONLY: + if parameter.default != inspect.Parameter.empty: + s = '{}={!r}'.format(parameter_name, parameter.default) + else: + s = parameter_name + parameters.append(s) + print(' {}({})'.format(short_name, ', '.join(parameters))) + # add_comma = False + # for parameter_name, parameter in signature.parameters.items(): + # if parameter.kind == inspect.Parameter.KEYWORD_ONLY: + # if add_comma: + # parameters.append(', ') + # else: + # add_comma = True + # s = parameter_name + # if parameter.default != inspect.Parameter.empty: + # s += '=' + repr(parameter.default) + # parameters.append(s) + # parameters.append(')') + + # print(" ", short_name + "".join(parameters)) + print() + print("All converters also accept (doc_default=None, required=False).") + print("All return converters also accept (doc_default=None).") + sys.exit(0) + + if not ns.filename: + cmdline.print_usage() + sys.exit(-1) + + if ns.output and len(ns.filename) > 1: + print("Usage error: can't use -o with multiple filenames.") + print() + cmdline.print_usage() + sys.exit(-1) + + for filename in ns.filename: + parse_file(filename, output=ns.output, verify=not ns.force) + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/Tools/clinic/clinic_test.py b/Tools/clinic/clinic_test.py new file mode 100644 --- /dev/null +++ b/Tools/clinic/clinic_test.py @@ -0,0 +1,699 @@ +#!/usr/bin/env python3 +# +# Argument Clinic +# Copyright 2012-2013 by Larry Hastings. +# Licensed to the PSF under a contributor agreement. +# + +import builtins +import clinic +from clinic import DSLParser +import collections +import inspect +from test import support +import unittest +from unittest import TestCase + +class FakeConverter: + def __init__(self, name, args): + self.name = name + self.args = args + + +class FakeConverterFactory: + def __init__(self, name): + self.name = name + + def __call__(self, name, default, **kwargs): + return FakeConverter(self.name, kwargs) + + +class FakeConvertersDict: + def __init__(self): + self.used_converters = {} + + def get(self, name, default): + return self.used_converters.setdefault(name, FakeConverterFactory(name)) + +class FakeClinic: + def __init__(self): + self.converters = FakeConvertersDict() + self.legacy_converters = FakeConvertersDict() + self.language = clinic.CLanguage() + self.filename = None + self.block_parser = clinic.BlockParser('', self.language) + self.modules = collections.OrderedDict() + clinic.clinic = self + self.name = "FakeClinic" + + def is_directive(self, name): + return name == "module" + + def directive(self, name, args): + self.called_directives[name] = args + + _module_and_class = clinic.Clinic._module_and_class + + + +class ClinicGroupPermuterTest(TestCase): + def _test(self, l, m, r, output): + computed = clinic.permute_optional_groups(l, m, r) + self.assertEqual(output, computed) + + def test_range(self): + self._test([['start']], ['stop'], [['step']], + ( + ('stop',), + ('start', 'stop',), + ('start', 'stop', 'step',), + )) + + def test_add_window(self): + self._test([['x', 'y']], ['ch'], [['attr']], + ( + ('ch',), + ('ch', 'attr'), + ('x', 'y', 'ch',), + ('x', 'y', 'ch', 'attr'), + )) + + def test_ludicrous(self): + self._test([['a1', 'a2', 'a3'], ['b1', 'b2']], ['c1'], [['d1', 'd2'], ['e1', 'e2', 'e3']], + ( + ('c1',), + ('b1', 'b2', 'c1'), + ('b1', 'b2', 'c1', 'd1', 'd2'), + ('a1', 'a2', 'a3', 'b1', 'b2', 'c1'), + ('a1', 'a2', 'a3', 'b1', 'b2', 'c1', 'd1', 'd2'), + ('a1', 'a2', 'a3', 'b1', 'b2', 'c1', 'd1', 'd2', 'e1', 'e2', 'e3'), + )) + + def test_right_only(self): + self._test([], [], [['a'],['b'],['c']], + ( + (), + ('a',), + ('a', 'b'), + ('a', 'b', 'c') + )) + + def test_have_left_options_but_required_is_empty(self): + def fn(): + clinic.permute_optional_groups(['a'], [], []) + self.assertRaises(AssertionError, fn) + + +class ClinicLinearFormatTest(TestCase): + def _test(self, input, output, **kwargs): + computed = clinic.linear_format(input, **kwargs) + self.assertEqual(output, computed) + + def test_empty_strings(self): + self._test('', '') + + def test_solo_newline(self): + self._test('\n', '\n') + + def test_no_substitution(self): + self._test(""" + abc + """, """ + abc + """) + + def test_empty_substitution(self): + self._test(""" + abc + {name} + def + """, """ + abc + def + """, name='') + + def test_single_line_substitution(self): + self._test(""" + abc + {name} + def + """, """ + abc + GARGLE + def + """, name='GARGLE') + + def test_multiline_substitution(self): + self._test(""" + abc + {name} + def + """, """ + abc + bingle + bungle + + def + """, name='bingle\nbungle\n') + +class InertParser: + def __init__(self, clinic): + pass + + def parse(self, block): + pass + +class CopyParser: + def __init__(self, clinic): + pass + + def parse(self, block): + block.output = block.input + + +class ClinicBlockParserTest(TestCase): + def _test(self, input, output): + language = clinic.CLanguage() + + blocks = list(clinic.BlockParser(input, language)) + writer = clinic.BlockPrinter(language) + for block in blocks: + writer.print_block(block) + output = writer.f.getvalue() + assert output == input, "output != input!\n\noutput " + repr(output) + "\n\n input " + repr(input) + + def round_trip(self, input): + return self._test(input, input) + + def test_round_trip_1(self): + self.round_trip(""" + verbatim text here + lah dee dah +""") + def test_round_trip_2(self): + self.round_trip(""" + verbatim text here + lah dee dah +/*[inert] +abc +[inert]*/ +def +/*[inert checksum: 7b18d017f89f61cf17d47f92749ea6930a3f1deb]*/ +xyz +""") + + def _test_clinic(self, input, output): + language = clinic.CLanguage() + c = clinic.Clinic(language) + c.parsers['inert'] = InertParser(c) + c.parsers['copy'] = CopyParser(c) + computed = c.parse(input) + self.assertEqual(output, computed) + + def test_clinic_1(self): + self._test_clinic(""" + verbatim text here + lah dee dah +/*[copy] +def +[copy]*/ +abc +/*[copy checksum: 03cfd743661f07975fa2f1220c5194cbaff48451]*/ +xyz +""", """ + verbatim text here + lah dee dah +/*[copy] +def +[copy]*/ +def +/*[copy checksum: 7b18d017f89f61cf17d47f92749ea6930a3f1deb]*/ +xyz +""") + + +class ClinicParserTest(TestCase): + def test_trivial(self): + parser = DSLParser(FakeClinic()) + block = clinic.Block("module os\nos.access") + parser.parse(block) + module, function = block.signatures + self.assertEqual("access", function.name) + self.assertEqual("os", module.name) + + def test_ignore_line(self): + block = self.parse("#\nmodule os\nos.access") + module, function = block.signatures + self.assertEqual("access", function.name) + self.assertEqual("os", module.name) + + def test_param(self): + function = self.parse_function("module os\nos.access\n path: int") + self.assertEqual("access", function.name) + self.assertEqual(1, len(function.parameters)) + p = function.parameters['path'] + self.assertEqual('path', p.name) + self.assertIsInstance(p.converter, clinic.int_converter) + + def test_param_default(self): + function = self.parse_function("module os\nos.access\n follow_symlinks: bool = True") + p = function.parameters['follow_symlinks'] + self.assertEqual(True, p.default) + + def test_param_no_docstring(self): + function = self.parse_function(""" +module os +os.access + follow_symlinks: bool = True + something_else: str""") + p = function.parameters['follow_symlinks'] + self.assertEqual(2, len(function.parameters)) + self.assertIsInstance(function.parameters['something_else'].converter, clinic.str_converter) + + def disabled_test_converter_arguments(self): + function = self.parse_function("module os\nos.access\n path: path_t(allow_fd=1)") + p = function.parameters['path'] + self.assertEqual(1, p.converter.args['allow_fd']) + + def test_param_docstring(self): + function = self.parse_function(""" +module os +os.stat as os_stat_fn -> object(doc_default='stat_result') + + path: str + Path to be examined""") + p = function.parameters['path'] + self.assertEqual("Path to be examined", p.docstring) + self.assertEqual(function.return_converter.doc_default, 'stat_result') + + def test_function_docstring(self): + function = self.parse_function(""" +module os +os.stat as os_stat_fn + + path: str + Path to be examined + +Perform a stat system call on the given path.""") + self.assertEqual(""" +Perform a stat system call on the given path. + +os.stat(path) + path + Path to be examined +""".strip(), function.docstring) + + def test_explicit_parameters_in_docstring(self): + function = self.parse_function(""" +module foo +foo.bar + x: int + Documentation for x. + y: int + +This is the documentation for foo. + +Okay, we're done here. +""") + self.assertEqual(""" +This is the documentation for foo. + +foo.bar(x, y) + x + Documentation for x. + +Okay, we're done here. +""".strip(), function.docstring) + + def test_parser_regression_special_character_in_parameter_column_of_docstring_first_line(self): + function = self.parse_function(""" +module os +os.stat + path: str +This/used to break Clinic! +""") + self.assertEqual("os.stat(path)\n\nThis/used to break Clinic!", function.docstring) + + def test_c_name(self): + function = self.parse_function("module os\nos.stat as os_stat_fn") + self.assertEqual("os_stat_fn", function.c_basename) + + def test_return_converter(self): + function = self.parse_function("module os\nos.stat -> int") + self.assertIsInstance(function.return_converter, clinic.int_return_converter) + + def test_star(self): + function = self.parse_function("module os\nos.access\n *\n follow_symlinks: bool = True") + p = function.parameters['follow_symlinks'] + self.assertEqual(inspect.Parameter.KEYWORD_ONLY, p.kind) + self.assertEqual(0, p.group) + + def test_group(self): + function = self.parse_function("module window\nwindow.border\n [\n ls : int\n ]\n /\n") + p = function.parameters['ls'] + self.assertEqual(1, p.group) + + def test_left_group(self): + function = self.parse_function(""" +module curses +curses.window.addch + [ + y: int + Y-coordinate. + x: int + X-coordinate. + ] + ch: char + Character to add. + [ + attr: long + Attributes for the character. + ] + / +""") + for name, group in ( + ('y', -1), ('x', -1), + ('ch', 0), + ('attr', 1), + ): + p = function.parameters[name] + self.assertEqual(p.group, group) + self.assertEqual(p.kind, inspect.Parameter.POSITIONAL_ONLY) + self.assertEqual(function.docstring.strip(), """ +curses.window.addch([y, x,] ch, [attr]) + y + Y-coordinate. + x + X-coordinate. + ch + Character to add. + attr + Attributes for the character. + """.strip()) + + def test_nested_groups(self): + function = self.parse_function(""" +module curses +curses.window.imaginary + [ + [ + y1: int + Y-coordinate. + y2: int + Y-coordinate. + ] + x1: int + X-coordinate. + x2: int + X-coordinate. + ] + ch: char + Character to add. + [ + attr1: long + Attributes for the character. + attr2: long + Attributes for the character. + attr3: long + Attributes for the character. + [ + attr4: long + Attributes for the character. + attr5: long + Attributes for the character. + attr6: long + Attributes for the character. + ] + ] + / +""") + for name, group in ( + ('y1', -2), ('y2', -2), + ('x1', -1), ('x2', -1), + ('ch', 0), + ('attr1', 1), ('attr2', 1), ('attr3', 1), + ('attr4', 2), ('attr5', 2), ('attr6', 2), + ): + p = function.parameters[name] + self.assertEqual(p.group, group) + self.assertEqual(p.kind, inspect.Parameter.POSITIONAL_ONLY) + + self.assertEqual(function.docstring.strip(), """ +curses.window.imaginary([[y1, y2,] x1, x2,] ch, [attr1, attr2, attr3, [attr4, attr5, attr6]]) + y1 + Y-coordinate. + y2 + Y-coordinate. + x1 + X-coordinate. + x2 + X-coordinate. + ch + Character to add. + attr1 + Attributes for the character. + attr2 + Attributes for the character. + attr3 + Attributes for the character. + attr4 + Attributes for the character. + attr5 + Attributes for the character. + attr6 + Attributes for the character. + """.strip()) + + def parse_function_should_fail(self, s): + with support.captured_stdout() as stdout: + with self.assertRaises(SystemExit): + self.parse_function(s) + return stdout.getvalue() + + def test_disallowed_grouping__two_top_groups_on_left(self): + s = self.parse_function_should_fail(""" +module foo +foo.two_top_groups_on_left + [ + group1 : int + ] + [ + group2 : int + ] + param: int + """) + self.assertEqual(s, + ('Error on line 0:\n' + 'Function two_top_groups_on_left has an unsupported group configuration. (Unexpected state 2)\n')) + + def test_disallowed_grouping__two_top_groups_on_right(self): + self.parse_function_should_fail(""" +module foo +foo.two_top_groups_on_right + param: int + [ + group1 : int + ] + [ + group2 : int + ] + """) + + def test_disallowed_grouping__parameter_after_group_on_right(self): + self.parse_function_should_fail(""" +module foo +foo.parameter_after_group_on_right + param: int + [ + [ + group1 : int + ] + group2 : int + ] + """) + + def test_disallowed_grouping__group_after_parameter_on_left(self): + self.parse_function_should_fail(""" +module foo +foo.group_after_parameter_on_left + [ + group2 : int + [ + group1 : int + ] + ] + param: int + """) + + def test_disallowed_grouping__empty_group_on_left(self): + self.parse_function_should_fail(""" +module foo +foo.empty_group + [ + [ + ] + group2 : int + ] + param: int + """) + + def test_disallowed_grouping__empty_group_on_right(self): + self.parse_function_should_fail(""" +module foo +foo.empty_group + param: int + [ + [ + ] + group2 : int + ] + """) + + def test_no_parameters(self): + function = self.parse_function(""" +module foo +foo.bar + +Docstring + +""") + self.assertEqual("Docstring\n\nfoo.bar()", function.docstring) + self.assertEqual(0, len(function.parameters)) + + def test_single_star(self): + self.parse_function_should_fail(""" +module foo +foo.bar + * + * +""") + + def test_parameters_required_after_star_without_initial_parameters_or_docstring(self): + self.parse_function_should_fail(""" +module foo +foo.bar + * +""") + + def test_parameters_required_after_star_without_initial_parameters_with_docstring(self): + self.parse_function_should_fail(""" +module foo +foo.bar + * +Docstring here. +""") + + def test_parameters_required_after_star_with_initial_parameters_without_docstring(self): + self.parse_function_should_fail(""" +module foo +foo.bar + this: int + * +""") + + def test_parameters_required_after_star_with_initial_parameters_and_docstring(self): + self.parse_function_should_fail(""" +module foo +foo.bar + this: int + * +Docstring. +""") + + def test_single_slash(self): + self.parse_function_should_fail(""" +module foo +foo.bar + / + / +""") + + def test_mix_star_and_slash(self): + self.parse_function_should_fail(""" +module foo +foo.bar + x: int + y: int + * + z: int + / +""") + + def test_parameters_not_permitted_after_slash_for_now(self): + self.parse_function_should_fail(""" +module foo +foo.bar + / + x: int +""") + + def test_function_not_at_column_0(self): + function = self.parse_function(""" + module foo + foo.bar + x: int + Nested docstring here, goeth. + * + y: str + Not at column 0! +""") + self.assertEqual(""" +Not at column 0! + +foo.bar(x, *, y) + x + Nested docstring here, goeth. +""".strip(), function.docstring) + + def test_parser_regression_special_character_in_parameter_column_of_docstring_first_line(self): + function = self.parse_function(""" +module os +os.stat + path: str +This/used to break Clinic! +""") + self.assertEqual("This/used to break Clinic!\n\nos.stat(path)", function.docstring) + + def test_directive(self): + c = FakeClinic() + parser = DSLParser(c) + parser.flag = False + parser.directives['setflag'] = lambda : setattr(parser, 'flag', True) + block = clinic.Block("setflag") + parser.parse(block) + self.assertTrue(parser.flag) + + def test_legacy_converters(self): + block = self.parse('module os\nos.access\n path: "s"') + module, function = block.signatures + self.assertIsInstance((function.parameters['path']).converter, clinic.str_converter) + + def parse(self, text): + c = FakeClinic() + parser = DSLParser(c) + block = clinic.Block(text) + parser.parse(block) + return block + + def parse_function(self, text): + block = self.parse(text) + s = block.signatures + assert len(s) == 2 + assert isinstance(s[0], clinic.Module) + assert isinstance(s[1], clinic.Function) + return s[1] + + def test_scaffolding(self): + # test repr on special values + self.assertEqual(repr(clinic.unspecified), '') + self.assertEqual(repr(clinic.NULL), '') + + # test that fail fails + with support.captured_stdout() as stdout: + with self.assertRaises(SystemExit): + clinic.fail('The igloos are melting!', filename='clown.txt', line_number=69) + self.assertEqual(stdout.getvalue(), 'Error in file "clown.txt" on line 69:\nThe igloos are melting!\n') + + +if __name__ == "__main__": + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 09:47:11 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 09:47:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_compilation_of_the_cur?= =?utf-8?q?ses_module_=28broken_by_issue_=2316612=29=2E?= Message-ID: <3d1x5q0vyhz7LjY@mail.python.org> http://hg.python.org/cpython/rev/47618b00405b changeset: 86466:47618b00405b user: Serhiy Storchaka date: Sat Oct 19 10:45:48 2013 +0300 summary: Fix compilation of the curses module (broken by issue #16612). files: Modules/_cursesmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -676,7 +676,7 @@ } else #else - type = PyCurses_ConvertToCchar_t(cwself, chobj, &cch); + type = PyCurses_ConvertToCchar_t(cwself, ch, &cch); #endif if (type == 1) { funcname = "addch"; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 14:12:13 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 14:12:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319254=3A_Provide_?= =?utf-8?q?an_optimized_Python_implementation_of_PBKDF2=5FHMAC?= Message-ID: <3d22zd0Rs9z7LjP@mail.python.org> http://hg.python.org/cpython/rev/e73627483d2f changeset: 86467:e73627483d2f user: Christian Heimes date: Sat Oct 19 14:12:02 2013 +0200 summary: Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC files: Doc/library/hashlib.rst | 6 ++- Lib/hashlib.py | 69 +++++++++++++++++++++++++-- Lib/test/test_hashlib.py | 20 ++++++- Misc/NEWS | 2 + 4 files changed, 86 insertions(+), 11 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -212,7 +212,11 @@ .. versionadded:: 3.4 - .. note:: *pbkdf2_hmac* is only available with OpenSSL 1.0 and newer. + .. note:: A fast implementation of *pbkdf2_hmac* is only available with + OpenSSL 1.0 and newer. The Python implementation uses an inline + version of :mod:`hmac` and is about three times slower. Contrary to + OpenSSL's current code the length of the password has only a minimal + impact on the runtime of the Python implementation. .. seealso:: diff --git a/Lib/hashlib.py b/Lib/hashlib.py --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -1,4 +1,4 @@ -# Copyright (C) 2005-2010 Gregory P. Smith (greg at krypto.org) +#. Copyright (C) 2005-2010 Gregory P. Smith (greg at krypto.org) # Licensed to PSF under a Contributor Agreement. # @@ -61,7 +61,7 @@ algorithms_available = set(__always_supported) __all__ = __always_supported + ('new', 'algorithms_guaranteed', - 'algorithms_available') + 'algorithms_available', 'pbkdf2_hmac') def __get_builtin_constructor(name): @@ -147,13 +147,70 @@ new = __py_new __get_hash = __get_builtin_constructor -# PBKDF2 requires OpenSSL 1.0+ with HMAC and SHA try: + # OpenSSL's PKCS5_PBKDF2_HMAC requires OpenSSL 1.0+ with HMAC and SHA from _hashlib import pbkdf2_hmac except ImportError: - pass -else: - __all__ += ('pbkdf2_hmac',) + _trans_5C = bytes((x ^ 0x5C) for x in range(256)) + _trans_36 = bytes((x ^ 0x36) for x in range(256)) + + def pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None): + """Password based key derivation function 2 (PKCS #5 v2.0) + + This Python implementations based on the hmac module about as fast + as OpenSSL's PKCS5_PBKDF2_HMAC for short passwords and much faster + for long passwords. + """ + if not isinstance(hash_name, str): + raise TypeError(hash_name) + + if not isinstance(password, (bytes, bytearray)): + password = bytes(memoryview(password)) + if not isinstance(salt, (bytes, bytearray)): + salt = bytes(memoryview(salt)) + + # Fast inline HMAC implementation + inner = new(hash_name) + outer = new(hash_name) + blocksize = getattr(inner, 'block_size', 64) + if len(password) > blocksize: + password = new(hash_name, password).digest() + password = password + b'\x00' * (blocksize - len(password)) + inner.update(password.translate(_trans_36)) + outer.update(password.translate(_trans_5C)) + + def prf(msg, inner=inner, outer=outer): + # PBKDF2_HMAC uses the password as key. We can re-use the same + # digest objects and and just update copies to skip initialization. + icpy = inner.copy() + ocpy = outer.copy() + icpy.update(msg) + ocpy.update(icpy.digest()) + return ocpy.digest() + + if iterations < 1: + raise ValueError(iterations) + if dklen is None: + dklen = outer.digest_size + if dklen < 1: + raise ValueError(dklen) + + dkey = b'' + loop = 1 + from_bytes = int.from_bytes + while len(dkey) < dklen: + prev = prf(salt + loop.to_bytes(4, 'big')) + # endianess doesn't matter here as long to / from use the same + rkey = int.from_bytes(prev, 'big') + for i in range(iterations - 1): + prev = prf(prev) + # rkey = rkey ^ prev + rkey ^= from_bytes(prev, 'big') + loop += 1 + dkey += rkey.to_bytes(inner.digest_size, 'big') + + return dkey[:dklen] + for __func_name in __always_supported: # try them all, some may not work due to the OpenSSL diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -18,11 +18,13 @@ import unittest import warnings from test import support -from test.support import _4G, bigmemtest +from test.support import _4G, bigmemtest, import_fresh_module # Were we compiled --with-pydebug or with #define Py_DEBUG? COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') +c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) +py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib']) def hexstr(s): assert isinstance(s, bytes), repr(s) @@ -545,6 +547,10 @@ self.assertEqual(expected_hash, hasher.hexdigest()) + +class KDFTests: + hashlibmod = None + pbkdf2_test_vectors = [ (b'password', b'salt', 1, None), (b'password', b'salt', 2, None), @@ -594,10 +600,8 @@ (bytes.fromhex('9d9e9c4cd21fe4be24d5b8244c759665'), None),], } - @unittest.skipUnless(hasattr(hashlib, 'pbkdf2_hmac'), - 'pbkdf2_hmac required for this test.') def test_pbkdf2_hmac(self): - pbkdf2 = hashlib.pbkdf2_hmac + pbkdf2 = self.hashlibmod.pbkdf2_hmac for digest_name, results in self.pbkdf2_results.items(): for i, vector in enumerate(self.pbkdf2_test_vectors): @@ -628,5 +632,13 @@ pbkdf2('unknown', b'pass', b'salt', 1) +class PyKDFTests(KDFTests, unittest.TestCase): + hashlibmod = py_hashlib + + +class CKDFTests(KDFTests, unittest.TestCase): + hashlibmod = c_hashlib + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -57,6 +57,8 @@ Library ------- +- Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC. + - Issues #19201, #19222, #19223: Add "x" mode (exclusive creation) in opening file to bz2, gzip and lzma modules. Patches by Tim Heaney and Vajrasky Kok. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 14:25:27 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 14:25:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_lower_case_pbkdf2=5Fhmac?= Message-ID: <3d23Gv2FsBz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/b8987863f74d changeset: 86468:b8987863f74d user: Christian Heimes date: Sat Oct 19 14:24:03 2013 +0200 summary: lower case pbkdf2_hmac files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -57,7 +57,7 @@ Library ------- -- Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC. +- Issue #19254: Provide an optimized Python implementation of pbkdf2_hmac. - Issues #19201, #19222, #19223: Add "x" mode (exclusive creation) in opening file to bz2, gzip and lzma modules. Patches by Tim Heaney and Vajrasky Kok. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 14:25:28 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 14:25:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318582=3A_provide_?= =?utf-8?q?a_faster_C_implementation_of_pbkdf2=5Fhmac_that_works_with?= Message-ID: <3d23Gw4zz8z7LkS@mail.python.org> http://hg.python.org/cpython/rev/0a26ef834a49 changeset: 86469:0a26ef834a49 user: Christian Heimes date: Sat Oct 19 14:24:44 2013 +0200 summary: Issue #18582: provide a faster C implementation of pbkdf2_hmac that works with OpenSSL < 1.0 files: Doc/library/hashlib.rst | 8 +- Modules/_hashopenssl.c | 100 ++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 11 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -212,11 +212,9 @@ .. versionadded:: 3.4 - .. note:: A fast implementation of *pbkdf2_hmac* is only available with - OpenSSL 1.0 and newer. The Python implementation uses an inline - version of :mod:`hmac` and is about three times slower. Contrary to - OpenSSL's current code the length of the password has only a minimal - impact on the runtime of the Python implementation. + .. note:: A fast implementation of *pbkdf2_hmac* is available with OpenSSL. + The Python implementation uses an inline version of :mod:`hmac`. It is + about three times slower and doesn't release the GIL. .. seealso:: diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -20,6 +20,7 @@ /* EVP is the preferred interface to hashing in OpenSSL */ #include +#include /* We use the object interface to discover what hashes OpenSSL supports. */ #include #include "openssl/err.h" @@ -495,10 +496,97 @@ return ret_obj; } -#if (OPENSSL_VERSION_NUMBER >= 0x10000000 && !defined(OPENSSL_NO_HMAC) \ - && !defined(OPENSSL_NO_SHA)) + + +#if (!defined(OPENSSL_NO_HMAC) && !defined(OPENSSL_NO_SHA)) + #define PY_PBKDF2_HMAC 1 +/* Improved implementation of PKCS5_PBKDF2_HMAC() + * + * PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of + * `iter` times. Today (2013) the iteration count is typically 100,000 or + * more. The improved algorithm is not subject to a Denial-of-Service + * vulnerability with overly large passwords. + * + * Also OpenSSL < 1.0 don't provide PKCS5_PBKDF2_HMAC(), only + * PKCS5_PBKDF2_SHA1. + */ +int PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, + const unsigned char *salt, int saltlen, + int iter, const EVP_MD *digest, + int keylen, unsigned char *out) +{ + unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; + int cplen, j, k, tkeylen, mdlen; + unsigned long i = 1; + HMAC_CTX hctx_tpl, hctx; + + mdlen = EVP_MD_size(digest); + if (mdlen < 0) + return 0; + + HMAC_CTX_init(&hctx_tpl); + HMAC_CTX_init(&hctx); + p = out; + tkeylen = keylen; + if (!pass) + passlen = 0; + else if(passlen == -1) + passlen = strlen(pass); + if (!HMAC_Init_ex(&hctx_tpl, pass, passlen, digest, NULL)) { + HMAC_CTX_cleanup(&hctx_tpl); + return 0; + } + while(tkeylen) { + if(tkeylen > mdlen) + cplen = mdlen; + else + cplen = tkeylen; + /* We are unlikely to ever use more than 256 blocks (5120 bits!) + * but just in case... + */ + itmp[0] = (unsigned char)((i >> 24) & 0xff); + itmp[1] = (unsigned char)((i >> 16) & 0xff); + itmp[2] = (unsigned char)((i >> 8) & 0xff); + itmp[3] = (unsigned char)(i & 0xff); + if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) { + HMAC_CTX_cleanup(&hctx_tpl); + return 0; + } + if (!HMAC_Update(&hctx, salt, saltlen) + || !HMAC_Update(&hctx, itmp, 4) + || !HMAC_Final(&hctx, digtmp, NULL)) { + HMAC_CTX_cleanup(&hctx_tpl); + HMAC_CTX_cleanup(&hctx); + return 0; + } + memcpy(p, digtmp, cplen); + for (j = 1; j < iter; j++) { + if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) { + HMAC_CTX_cleanup(&hctx_tpl); + return 0; + } + if (!HMAC_Update(&hctx, digtmp, mdlen) + || !HMAC_Final(&hctx, digtmp, NULL)) { + HMAC_CTX_cleanup(&hctx_tpl); + HMAC_CTX_cleanup(&hctx); + return 0; + } + HMAC_CTX_cleanup(&hctx); + for (k = 0; k < cplen; k++) { + p[k] ^= digtmp[k]; + } + } + tkeylen-= cplen; + i++; + p+= cplen; + } + HMAC_CTX_cleanup(&hctx_tpl); + return 1; +} + + PyDoc_STRVAR(pbkdf2_hmac__doc__, "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\ \n\ @@ -579,10 +667,10 @@ key = PyBytes_AS_STRING(key_obj); Py_BEGIN_ALLOW_THREADS - retval = PKCS5_PBKDF2_HMAC((char*)password.buf, password.len, - (unsigned char *)salt.buf, salt.len, - iterations, digest, dklen, - (unsigned char *)key); + retval = PKCS5_PBKDF2_HMAC_fast((char*)password.buf, password.len, + (unsigned char *)salt.buf, salt.len, + iterations, digest, dklen, + (unsigned char *)key); Py_END_ALLOW_THREADS if (!retval) { -- Repository URL: http://hg.python.org/cpython From brett at python.org Sat Oct 19 15:54:07 2013 From: brett at python.org (Brett Cannon) Date: Sat, 19 Oct 2013 09:54:07 -0400 Subject: [Python-checkins] cpython: Issue #18810: Be optimistic with stat calls when seeing if a directory In-Reply-To: References: <3d1YyH4L2tz7LjP@mail.python.org> Message-ID: On Fri, Oct 18, 2013 at 9:06 PM, Nick Coghlan wrote: > > On 19 Oct 2013 03:24, "brett.cannon" wrote: > > > > http://hg.python.org/cpython/rev/11f2f4af1979 > > changeset: 86444:11f2f4af1979 > > user: Brett Cannon > > date: Fri Oct 18 13:24:13 2013 -0400 > > summary: > > Issue #18810: Be optimistic with stat calls when seeing if a directory > > exists when checking for a package. > > > > Before there was an isdir check and then various isfile checks for > > possible __init__ files when looking for a package. > > This change drops the isdir check by leaning > > on the assumption that a directory will not contain something named > > after the module being imported which is not a directory. If the module > > is a package then it saves a stat call. If there is nothing in the > > directory with the potential package name it also saves a stat call. > > Only if there is something in the directory named the same thing as > > the potential package will the number of stat calls increase > > (due to more wasteful __init__ checks). > > I don't follow this logic. There's now not even an existence check for the > base name, so it reads to me like we will look for all the possible init > file extensions even if there's *no* directory with an appropriate name. > > What am I missing? > ``if cache_module in cache:``, the line above the _path_join() call and the guard that blocks the entire package search. -Brett > Cheers, > Nick. > > > > > Semantically there is no change as the isdir check moved > > down so that namespace packages continue to have no chance of > > accidentally collecting non-existent directories. > > > > files: > > Lib/importlib/_bootstrap.py | 19 +- > > Python/importlib.h | 1537 +++++++++++----------- > > 2 files changed, 777 insertions(+), 779 deletions(-) > > > > > > diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py > > --- a/Lib/importlib/_bootstrap.py > > +++ b/Lib/importlib/_bootstrap.py > > @@ -1406,16 +1406,15 @@ > > # Check if the module is the name of a directory (and thus a > package). > > if cache_module in cache: > > base_path = _path_join(self.path, tail_module) > > - if _path_isdir(base_path): > > - for suffix, loader in self._loaders: > > - init_filename = '__init__' + suffix > > - full_path = _path_join(base_path, init_filename) > > - if _path_isfile(full_path): > > - return (loader(fullname, full_path), > [base_path]) > > - else: > > - # A namespace package, return the path if we don't > also > > - # find a module in the next section. > > - is_namespace = True > > + for suffix, loader in self._loaders: > > + init_filename = '__init__' + suffix > > + full_path = _path_join(base_path, init_filename) > > + if _path_isfile(full_path): > > + return (loader(fullname, full_path), [base_path]) > > + else: > > + # If a namespace package, return the path if we don't > > + # find a module in the next section. > > + is_namespace = _path_isdir(base_path) > > # Check for a file w/ a proper suffix exists. > > for suffix, loader in self._loaders: > > full_path = _path_join(self.path, tail_module + suffix) > > diff --git a/Python/importlib.h b/Python/importlib.h > > --- a/Python/importlib.h > > +++ b/Python/importlib.h > > [stripped] > > > > -- > > Repository URL: http://hg.python.org/cpython > > > > _______________________________________________ > > Python-checkins mailing list > > Python-checkins at python.org > > https://mail.python.org/mailman/listinfo/python-checkins > > > > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From brett at python.org Sat Oct 19 15:54:52 2013 From: brett at python.org (Brett Cannon) Date: Sat, 19 Oct 2013 09:54:52 -0400 Subject: [Python-checkins] cpython: Issue #18416: Fix various os calls in importlib.machinery.FileFinder In-Reply-To: References: <3d1X6M5RMjz7LjP@mail.python.org> Message-ID: On Fri, Oct 18, 2013 at 8:55 PM, Nick Coghlan wrote: > > On 19 Oct 2013 02:01, "brett.cannon" wrote: > > > > http://hg.python.org/cpython/rev/33844153cd02 > > changeset: 86438:33844153cd02 > > user: Brett Cannon > > date: Fri Oct 18 12:01:06 2013 -0400 > > summary: > > Issue #18416: Fix various os calls in importlib.machinery.FileFinder > > now that self.path is no longer forced to '.'. > > Hmm, could this break subclasses in a similar way? It may be safer to keep > the empty string -> period conversion, even though PathFinder itself > doesn't rely on it any more. > Good point. I'll revert it. -Brett > Cheers, > Nick. > > > > > files: > > Lib/importlib/_bootstrap.py | 4 +- > > Python/importlib.h | 1554 +++++++++++----------- > > 2 files changed, 780 insertions(+), 778 deletions(-) > > > > > > diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py > > --- a/Lib/importlib/_bootstrap.py > > +++ b/Lib/importlib/_bootstrap.py > > @@ -1390,7 +1390,7 @@ > > is_namespace = False > > tail_module = fullname.rpartition('.')[2] > > try: > > - mtime = _os.stat(self.path).st_mtime > > + mtime = _os.stat(self.path or _os.getcwd()).st_mtime > > except OSError: > > mtime = -1 > > if mtime != self._path_mtime: > > @@ -1432,7 +1432,7 @@ > > """Fill the cache of potential modules and packages for this > directory.""" > > path = self.path > > try: > > - contents = _os.listdir(path) > > + contents = _os.listdir(path or _os.getcwd()) > > except (FileNotFoundError, PermissionError, NotADirectoryError): > > # Directory has either been removed, turned into a file, or > made > > # unreadable. > > diff --git a/Python/importlib.h b/Python/importlib.h > > --- a/Python/importlib.h > > +++ b/Python/importlib.h > > [stripped] > > > > -- > > Repository URL: http://hg.python.org/cpython > > > > _______________________________________________ > > Python-checkins mailing list > > Python-checkins at python.org > > https://mail.python.org/mailman/listinfo/python-checkins > > > > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sat Oct 19 16:37:30 2013 From: python-checkins at python.org (nick.coghlan) Date: Sat, 19 Oct 2013 16:37:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_contextlib_doc_updates_and?= =?utf-8?q?_refactoring?= Message-ID: <3d26CG4tkWzNVN@mail.python.org> http://hg.python.org/cpython/rev/124a7ba1e911 changeset: 86470:124a7ba1e911 user: Nick Coghlan date: Sun Oct 20 00:30:51 2013 +1000 summary: contextlib doc updates and refactoring - explain single use, reusable and reentrant in docs - converted suppress to a reentrant class based impl - converted redirect_stdout to a reusable impl - moved both suppress and redirect_stdout behind a functional facade - added reentrancy tests for the updated suppress - added reusability tests for the updated redirect_stdio - slightly cleaned up an exception from contextmanager files: Doc/library/contextlib.rst | 116 ++++++++++++++++++++++++ Lib/contextlib.py | 79 ++++++++++----- Lib/test/test_contextlib.py | 48 +++++++++- Misc/NEWS | 2 +- 4 files changed, 212 insertions(+), 33 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -128,6 +128,8 @@ except FileNotFoundError: pass + This context manager is :ref:`reentrant `. + .. versionadded:: 3.4 @@ -165,6 +167,8 @@ applications. It also has no effect on the output of subprocesses. However, it is still a useful approach for many utility scripts. + This context manager is :ref:`reusable but not reentrant `. + .. versionadded:: 3.4 @@ -593,3 +597,115 @@ The specification, background, and examples for the Python :keyword:`with` statement. + +Reusable and reentrant context managers +--------------------------------------- + +Most context managers are written in a way that means they can only be +used effectively in a :keyword:`with` statement once. These single use +context managers must be created afresh each time they're used - +attempting to use them a second time will trigger an exception or +otherwise not work correctly. + +This common limitation means that it is generally advisable to create +context managers directly in the header of the :keyword:`with` statement +where they are used (as shown in all of the usage examples above). + +Files are an example of effectively single use context managers, since +the first :keyword:`with` statement will close the file, preventing any +further IO operations using that file object. + +Context managers created using :func:`contextmanager` are also single use +context managers, and will complain about the underlying generator failing +to yield if an attempt is made to use them a second time:: + + >>> from contextlib import contextmanager + >>> @contextmanager + ... def singleuse(): + ... print("Before") + ... yield + ... print("After") + ... + >>> cm = singleuse() + >>> with cm: + ... pass + ... + Before + After + >>> with cm: + ... pass + ... + Traceback (most recent call last): + ... + RuntimeError: generator didn't yield + + +.. _reentrant-cms: + +Reentrant context managers +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +More sophisticated context managers may be "reentrant". These context +managers can not only be used in multiple :keyword:`with` statements, +but may also be used *inside* a :keyword:`with` statement that is already +using the same context manager. + +:class:`threading.RLock` is an example of a reentrant context manager, as is +:func:`suppress`. Here's a toy example of reentrant use (real world +examples of reentrancy are more likely to occur with objects like recursive +locks and are likely to be far more complicated than this example):: + + >>> from contextlib import suppress + >>> ignore_raised_exception = suppress(ZeroDivisionError) + >>> with ignore_raised_exception: + ... with ignore_raised_exception: + ... 1/0 + ... print("This line runs") + ... 1/0 + ... print("This is skipped") + ... + This line runs + >>> # The second exception is also suppressed + + +.. _reusable-cms: + +Reusable context managers +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Distinct from both single use and reentrant context managers are "reusable" +context managers (or, to be completely explicit, "reusable, but not +reentrant" context managers, since reentrant context managers are also +reusable). These context managers support being used multiple times, but +will fail (or otherwise not work correctly) if the specific context manager +instance has already been used in a containing with statement. + +An example of a reusable context manager is :func:`redirect_stdout`:: + + >>> from contextlib import redirect_stdout + >>> from io import StringIO + >>> f = StringIO() + >>> collect_output = redirect_stdout(f) + >>> with collect_output: + ... print("Collected") + ... + >>> print("Not collected") + Not collected + >>> with collect_output: + ... print("Also collected") + ... + >>> print(f.getvalue()) + Collected + Also collected + +However, this context manager is not reentrant, so attempting to reuse it +within a containing with statement fails: + + >>> with collect_output: + ... # Nested reuse is not permitted + ... with collect_output: + ... pass + ... + Traceback (most recent call last): + ... + RuntimeError: Cannot reenter <...> diff --git a/Lib/contextlib.py b/Lib/contextlib.py --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -48,7 +48,7 @@ try: return next(self.gen) except StopIteration: - raise RuntimeError("generator didn't yield") + raise RuntimeError("generator didn't yield") from None def __exit__(self, type, value, traceback): if type is None: @@ -117,6 +117,9 @@ return helper +# Unfortunately, this was originally published as a class, so +# backwards compatibility prevents the use of the wrapper function +# approach used for the other classes class closing(object): """Context to automatically close something at the end of a block. @@ -141,55 +144,75 @@ def __exit__(self, *exc_info): self.thing.close() -class redirect_stdout: +class _RedirectStdout: + """Helper for redirect_stdout.""" + + def __init__(self, new_target): + self._new_target = new_target + self._old_target = self._sentinel = object() + + def __enter__(self): + if self._old_target is not self._sentinel: + raise RuntimeError("Cannot reenter {!r}".format(self)) + self._old_target = sys.stdout + sys.stdout = self._new_target + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + restore_stdout = self._old_target + self._old_target = self._sentinel + sys.stdout = restore_stdout + +# Use a wrapper function since we don't care about supporting inheritance +# and a function gives much cleaner output in help() +def redirect_stdout(target): """Context manager for temporarily redirecting stdout to another file # How to send help() to stderr - with redirect_stdout(sys.stderr): help(dir) # How to write help() to a file - with open('help.txt', 'w') as f: with redirect_stdout(f): help(pow) + """ + return _RedirectStdout(target) - # How to capture disassembly to a string - import dis - import io - - f = io.StringIO() - with redirect_stdout(f): - dis.dis('x**2 - y**2') - s = f.getvalue() - - """ - - def __init__(self, new_target): - self.new_target = new_target +class _SuppressExceptions: + """Helper for suppress.""" + def __init__(self, *exceptions): + self._exceptions = exceptions def __enter__(self): - self.old_target = sys.stdout - sys.stdout = self.new_target - return self.new_target + pass def __exit__(self, exctype, excinst, exctb): - sys.stdout = self.old_target + # Unlike isinstance and issubclass, exception handling only + # looks at the concrete type heirarchy (ignoring the instance + # and subclass checking hooks). However, all exceptions are + # also required to be concrete subclasses of BaseException, so + # if there's a discrepancy in behaviour, we currently consider it + # the fault of the strange way the exception has been defined rather + # than the fact that issubclass can be customised while the + # exception checks can't. + # See http://bugs.python.org/issue12029 for more details + return exctype is not None and issubclass(exctype, self._exceptions) - at contextmanager +# Use a wrapper function since we don't care about supporting inheritance +# and a function gives much cleaner output in help() def suppress(*exceptions): """Context manager to suppress specified exceptions - with suppress(OSError): + After the exception is suppressed, execution proceeds with the next + statement following the with statement. + + with suppress(FileNotFoundError): os.remove(somefile) - + # Execution still resumes here if the file was already removed """ - try: - yield - except exceptions: - pass + return _SuppressExceptions(*exceptions) # Inspired by discussions on http://bugs.python.org/issue13585 class ExitStack(object): diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -641,27 +641,67 @@ s = f.getvalue() self.assertIn('pow', s) + def test_enter_result_is_target(self): + f = io.StringIO() + with redirect_stdout(f) as enter_result: + self.assertIs(enter_result, f) + + def test_cm_is_reusable(self): + f = io.StringIO() + write_to_f = redirect_stdout(f) + with write_to_f: + print("Hello", end=" ") + with write_to_f: + print("World!") + s = f.getvalue() + self.assertEqual(s, "Hello World!\n") + + # If this is ever made reentrant, update the reusable-but-not-reentrant + # example at the end of the contextlib docs accordingly. + def test_nested_reentry_fails(self): + f = io.StringIO() + write_to_f = redirect_stdout(f) + with self.assertRaisesRegex(RuntimeError, "Cannot reenter"): + with write_to_f: + print("Hello", end=" ") + with write_to_f: + print("World!") + + class TestSuppress(unittest.TestCase): + def test_no_result_from_enter(self): + with suppress(ValueError) as enter_result: + self.assertIsNone(enter_result) + def test_no_exception(self): - with suppress(ValueError): self.assertEqual(pow(2, 5), 32) def test_exact_exception(self): - with suppress(TypeError): len(5) def test_multiple_exception_args(self): - + with suppress(ZeroDivisionError, TypeError): + 1/0 with suppress(ZeroDivisionError, TypeError): len(5) def test_exception_hierarchy(self): - with suppress(LookupError): 'Hello'[50] + def test_cm_is_reentrant(self): + ignore_exceptions = suppress(Exception) + with ignore_exceptions: + pass + with ignore_exceptions: + len(5) + with ignore_exceptions: + 1/0 + with ignore_exceptions: # Check nested usage + len(5) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,7 +74,7 @@ - Issue #19266: Rename the new-in-3.4 ``contextlib.ignore`` context manager to ``contextlib.suppress`` in order to be more consistent with existing descriptions of that operation elsewhere in the language and standard - library documentation (Patch by Zero Piraeus) + library documentation (Patch by Zero Piraeus). - Issue #18891: Completed the new email package (provisional) API additions by adding new classes EmailMessage, MIMEPart, and ContentManager. -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Sat Oct 19 16:42:30 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sun, 20 Oct 2013 00:42:30 +1000 Subject: [Python-checkins] cpython: Issue #18810: Be optimistic with stat calls when seeing if a directory In-Reply-To: References: <3d1YyH4L2tz7LjP@mail.python.org> Message-ID: On 19 October 2013 23:54, Brett Cannon wrote: >> I don't follow this logic. There's now not even an existence check for the >> base name, so it reads to me like we will look for all the possible init >> file extensions even if there's *no* directory with an appropriate name. >> >> What am I missing? > > > ``if cache_module in cache:``, the line above the _path_join() call and the > guard that blocks the entire package search. Ah, that's what I get for reviewing diffs on my phone and hence not looking up the full context :) Thanks for the clarification. Cheers, Nick. -- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia From ncoghlan at gmail.com Sat Oct 19 17:15:05 2013 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sun, 20 Oct 2013 01:15:05 +1000 Subject: [Python-checkins] cpython: Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC In-Reply-To: <3d22zd0Rs9z7LjP@mail.python.org> References: <3d22zd0Rs9z7LjP@mail.python.org> Message-ID: On 19 October 2013 22:12, christian.heimes wrote: > http://hg.python.org/cpython/rev/e73627483d2f > changeset: 86467:e73627483d2f > user: Christian Heimes > date: Sat Oct 19 14:12:02 2013 +0200 > summary: > Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC > > files: > Doc/library/hashlib.rst | 6 ++- > Lib/hashlib.py | 69 +++++++++++++++++++++++++-- > Lib/test/test_hashlib.py | 20 ++++++- > Misc/NEWS | 2 + > 4 files changed, 86 insertions(+), 11 deletions(-) > diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py > --- a/Lib/test/test_hashlib.py > +++ b/Lib/test/test_hashlib.py > @@ -18,11 +18,13 @@ > import unittest > import warnings > from test import support > -from test.support import _4G, bigmemtest > +from test.support import _4G, bigmemtest, import_fresh_module > > # Were we compiled --with-pydebug or with #define Py_DEBUG? > COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') > > +c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) Looks like this import is failing on at least some platforms: http://buildbot.python.org/all/builders/AMD64%20OpenIndiana%203.x/builds/6535/steps/test/logs/stdio http://buildbot.python.org/all/builders/AMD64%20Snow%20Leop%203.x/builds/204/steps/test/logs/stdio Due to the build failing: http://buildbot.python.org/all/builders/AMD64%20OpenIndiana%203.x/builds/6535/steps/compile/logs/stdio http://buildbot.python.org/all/builders/AMD64%20Snow%20Leop%203.x/builds/204/steps/compile/logs/stdio Cheers, Nick. -- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia From python-checkins at python.org Sat Oct 19 17:45:44 2013 From: python-checkins at python.org (georg.brandl) Date: Sat, 19 Oct 2013 17:45:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Doc_markup_fixes=2E?= Message-ID: <3d27k03BYdzSjM@mail.python.org> http://hg.python.org/cpython/rev/a081694595c5 changeset: 86471:a081694595c5 user: Georg Brandl date: Sat Oct 19 17:46:38 2013 +0200 summary: Doc markup fixes. files: Doc/library/importlib.rst | 4 ++-- Doc/whatsnew/3.4.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -723,7 +723,7 @@ finders stored in :attr:`sys.path_importer_cache`. .. versionchanged:: 3.4 - Calls objects in :data:sys.path_hooks with the current working directory + Calls objects in :data:`sys.path_hooks` with the current working directory for ``''`` (i.e. the empty string). @@ -752,7 +752,7 @@ .. versionadded:: 3.3 - .. versionchange:: 3.4 + .. versionchanged:: 3.4 The empty string is no longer special-cased to be changed into ``'.'``. .. attribute:: path diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -675,7 +675,7 @@ :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred, instead of a string allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. -* :cls:`importlib.machinery.PathFinder` now passes on the current working +* :class:`importlib.machinery.PathFinder` now passes on the current working directory to objects in :data:`sys.path_hooks` for the empty string. This results in :data:`sys.path_importer_cache` never containing ``''``, thus iterating through :data:`sys.path_importer_cache` based on :data:`sys.path` @@ -684,5 +684,5 @@ ``-m`` with the interpreter (this does not influence when the path to a file is specified on the command-line). -* :cls:`importlib.machinery.FileFinder` no longer special-cases the empty string +* :class:`importlib.machinery.FileFinder` no longer special-cases the empty string to be changed to ``'.'``. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 17:49:21 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 19 Oct 2013 17:49:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Skip_the_asyncio_tests_whe?= =?utf-8?q?n_threads_are_not_available=2E?= Message-ID: <3d27p92RwDz7LjX@mail.python.org> http://hg.python.org/cpython/rev/1c281f3de48f changeset: 86472:1c281f3de48f user: Guido van Rossum date: Sat Oct 19 08:47:26 2013 -0700 summary: Skip the asyncio tests when threads are not available. See http://bugs.python.org/issue19295 files: Lib/test/test_asyncio/__init__.py | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py --- a/Lib/test/test_asyncio/__init__.py +++ b/Lib/test/test_asyncio/__init__.py @@ -3,6 +3,11 @@ import unittest from test.support import run_unittest +try: + import threading +except ImportError: + raise unittest.SkipTest("No module named '_thread'") + def suite(): tests_file = os.path.join(os.path.dirname(__file__), 'tests.txt') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 17:59:57 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 17:59:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318582=3A_HMAC=5FC?= =?utf-8?q?TX=5Fcopy=28=29_is_not_available_on_OpenSSL_=3C_1=2E0?= Message-ID: <3d282P0JwGz7LjX@mail.python.org> http://hg.python.org/cpython/rev/88fac1574049 changeset: 86473:88fac1574049 user: Christian Heimes date: Sat Oct 19 17:59:48 2013 +0200 summary: Issue #18582: HMAC_CTX_copy() is not available on OpenSSL < 1.0 files: Modules/_hashopenssl.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -498,7 +498,8 @@ -#if (!defined(OPENSSL_NO_HMAC) && !defined(OPENSSL_NO_SHA)) +#if (OPENSSL_VERSION_NUMBER >= 0x10000000 && !defined(OPENSSL_NO_HMAC) \ + && !defined(OPENSSL_NO_SHA)) #define PY_PBKDF2_HMAC 1 -- Repository URL: http://hg.python.org/cpython From christian at python.org Sat Oct 19 18:01:26 2013 From: christian at python.org (Christian Heimes) Date: Sat, 19 Oct 2013 18:01:26 +0200 Subject: [Python-checkins] cpython: Issue #19254: Provide an optimized Python implementation of PBKDF2_HMAC In-Reply-To: References: <3d22zd0Rs9z7LjP@mail.python.org> Message-ID: <5262ACD6.2020002@python.org> Am 19.10.2013 17:15, schrieb Nick Coghlan: >> +c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) > > Looks like this import is failing on at least some platforms: > > http://buildbot.python.org/all/builders/AMD64%20OpenIndiana%203.x/builds/6535/steps/test/logs/stdio > http://buildbot.python.org/all/builders/AMD64%20Snow%20Leop%203.x/builds/204/steps/test/logs/stdio > > Due to the build failing: > http://buildbot.python.org/all/builders/AMD64%20OpenIndiana%203.x/builds/6535/steps/compile/logs/stdio > http://buildbot.python.org/all/builders/AMD64%20Snow%20Leop%203.x/builds/204/steps/compile/logs/stdio Thanks Nick! Actually it was http://hg.python.org/cpython/rev/0a26ef834a49. The fix in http://hg.python.org/cpython/rev/88fac1574049 should have taken care of the issue. Sorry for the noise, I don't have OpenSSL 0.9.8 on this machine. Christian From python-checkins at python.org Sat Oct 19 18:10:47 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 19 Oct 2013 18:10:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Disable_some_subprocess_te?= =?utf-8?q?sts_that_hang_on_AIX=2E?= Message-ID: <3d28Gv3kgmz7LjX@mail.python.org> http://hg.python.org/cpython/rev/41a841fac7fb changeset: 86474:41a841fac7fb user: Guido van Rossum date: Sat Oct 19 09:10:13 2013 -0700 summary: Disable some subprocess tests that hang on AIX. See http://bugs.python.org/issue19293 files: Lib/test/test_asyncio/test_events.py | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -983,6 +983,9 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") + # Issue #19293 + @unittest.skipIf(sys.platform.startswith("aix"), + 'cannot be interrupted with signal on AIX') def test_subprocess_interactive(self): proto = None transp = None @@ -1081,6 +1084,9 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") + # Issue #19293 + @unittest.skipIf(sys.platform.startswith("aix"), + 'cannot be interrupted with signal on AIX') def test_subprocess_kill(self): proto = None transp = None @@ -1104,6 +1110,9 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") + # Issue #19293 + @unittest.skipIf(sys.platform.startswith("aix"), + 'cannot be interrupted with signal on AIX') def test_subprocess_send_signal(self): proto = None transp = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 18:52:15 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 19 Oct 2013 18:52:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Verify_hostname_if_verify?= =?utf-8?q?=5Fmode_is_CERT=5FOPTIONAL_too=2E?= Message-ID: <3d29Bl6BQFzQhg@mail.python.org> http://hg.python.org/cpython/rev/b8c5964cadc1 changeset: 86475:b8c5964cadc1 user: Guido van Rossum date: Sat Oct 19 09:52:09 2013 -0700 summary: Verify hostname if verify_mode is CERT_OPTIONAL too. files: Lib/asyncio/selector_events.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -604,7 +604,7 @@ # Verify hostname if requested. peercert = self._sock.getpeercert() if (self._server_hostname is not None and - self._sslcontext.verify_mode == ssl.CERT_REQUIRED): + self._sslcontext.verify_mode != ssl.CERT_NONE): try: ssl.match_hostname(peercert, self._server_hostname) except Exception as exc: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:39:56 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 19:39:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5Mjc5?= =?utf-8?q?=3A_UTF-7_decoder_no_more_produces_illegal_unicode_strings=2E?= Message-ID: <3d2BFm3Kx1zQmw@mail.python.org> http://hg.python.org/cpython/rev/214c0aac7540 changeset: 86476:214c0aac7540 branch: 2.7 parent: 86462:c207ac413457 user: Serhiy Storchaka date: Sat Oct 19 20:37:49 2013 +0300 summary: Issue #19279: UTF-7 decoder no more produces illegal unicode strings. files: Lib/test/test_codecs.py | 29 +++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ Objects/unicodeobject.c | 2 ++ 3 files changed, 33 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -611,6 +611,35 @@ ] ) + def test_errors(self): + tests = [ + ('a\xffb', u'a\ufffdb'), + ('a+IK', u'a\ufffd'), + ('a+IK-b', u'a\ufffdb'), + ('a+IK,b', u'a\ufffdb'), + ('a+IKx', u'a\u20ac\ufffd'), + ('a+IKx-b', u'a\u20ac\ufffdb'), + ('a+IKwgr', u'a\u20ac\ufffd'), + ('a+IKwgr-b', u'a\u20ac\ufffdb'), + ('a+IKwgr,', u'a\u20ac\ufffd'), + ('a+IKwgr,-b', u'a\u20ac\ufffd-b'), + ('a+IKwgrB', u'a\u20ac\u20ac\ufffd'), + ('a+IKwgrB-b', u'a\u20ac\u20ac\ufffdb'), + ('a+/,+IKw-b', u'a\ufffd\u20acb'), + ('a+//,+IKw-b', u'a\ufffd\u20acb'), + ('a+///,+IKw-b', u'a\uffff\ufffd\u20acb'), + ('a+////,+IKw-b', u'a\uffff\ufffd\u20acb'), + ] + for raw, expected in tests: + self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, + raw, 'strict', True) + self.assertEqual(raw.decode('utf-7', 'replace'), expected) + + def test_nonbmp(self): + self.assertEqual(u'\U000104A0'.encode(self.encoding), '+2AHcoA-') + self.assertEqual(u'\ud801\udca0'.encode(self.encoding), '+2AHcoA-') + self.assertEqual('+2AHcoA-'.decode(self.encoding), u'\U000104A0') + class UTF16ExTest(unittest.TestCase): def test_errors(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,8 @@ Core and Builtins ----------------- +- Issue #19279: UTF-7 decoder no more produces illegal unicode strings. + - Issue #18739: Fix an inconsistency between math.log(n) and math.log(long(n)); the results could be off from one another by a ulp or two. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1671,6 +1671,7 @@ (base64buffer >> (base64bits-16)); base64bits -= 16; base64buffer &= (1 << base64bits) - 1; /* clear high bits */ + assert(outCh <= 0xffff); if (surrogate) { /* expecting a second surrogate */ if (outCh >= 0xDC00 && outCh <= 0xDFFF) { @@ -1737,6 +1738,7 @@ inShift = 1; shiftOutStart = p; base64bits = 0; + base64buffer = 0; } } else if (DECODE_DIRECT(ch)) { /* character decodes as itself */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:39:57 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 19:39:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mjc5?= =?utf-8?q?=3A_UTF-7_decoder_no_more_produces_illegal_strings=2E?= Message-ID: <3d2BFn5RH2z7LjX@mail.python.org> http://hg.python.org/cpython/rev/f471f2f05621 changeset: 86477:f471f2f05621 branch: 3.3 parent: 86463:2d8d5fea6194 user: Serhiy Storchaka date: Sat Oct 19 20:38:19 2013 +0300 summary: Issue #19279: UTF-7 decoder no more produces illegal strings. files: Lib/test/test_codecs.py | 30 +++++++++++++++++++++++++++++ Misc/NEWS | 2 + Objects/unicodeobject.c | 2 + 3 files changed, 34 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -820,6 +820,36 @@ ] ) + def test_errors(self): + tests = [ + (b'a\xffb', 'a\ufffdb'), + (b'a+IK', 'a\ufffd'), + (b'a+IK-b', 'a\ufffdb'), + (b'a+IK,b', 'a\ufffdb'), + (b'a+IKx', 'a\u20ac\ufffd'), + (b'a+IKx-b', 'a\u20ac\ufffdb'), + (b'a+IKwgr', 'a\u20ac\ufffd'), + (b'a+IKwgr-b', 'a\u20ac\ufffdb'), + (b'a+IKwgr,', 'a\u20ac\ufffd'), + (b'a+IKwgr,-b', 'a\u20ac\ufffd-b'), + (b'a+IKwgrB', 'a\u20ac\u20ac\ufffd'), + (b'a+IKwgrB-b', 'a\u20ac\u20ac\ufffdb'), + (b'a+/,+IKw-b', 'a\ufffd\u20acb'), + (b'a+//,+IKw-b', 'a\ufffd\u20acb'), + (b'a+///,+IKw-b', 'a\uffff\ufffd\u20acb'), + (b'a+////,+IKw-b', 'a\uffff\ufffd\u20acb'), + ] + for raw, expected in tests: + with self.subTest(raw=raw): + self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, + raw, 'strict', True) + self.assertEqual(raw.decode('utf-7', 'replace'), expected) + + def test_nonbmp(self): + self.assertEqual('\U000104A0'.encode(self.encoding), b'+2AHcoA-') + self.assertEqual('\ud801\udca0'.encode(self.encoding), b'+2AHcoA-') + self.assertEqual(b'+2AHcoA-'.decode(self.encoding), '\U000104A0') + class UTF16ExTest(unittest.TestCase): def test_errors(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ Core and Builtins ----------------- +- Issue #19279: UTF-7 decoder no more produces illegal strings. + - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4359,6 +4359,7 @@ Py_UCS4 outCh = (Py_UCS4)(base64buffer >> (base64bits-16)); base64bits -= 16; base64buffer &= (1 << base64bits) - 1; /* clear high bits */ + assert(outCh <= 0xffff); if (surrogate) { /* expecting a second surrogate */ if (Py_UNICODE_IS_LOW_SURROGATE(outCh)) { @@ -4426,6 +4427,7 @@ inShift = 1; shiftOutStart = outpos; base64bits = 0; + base64buffer = 0; } } else if (DECODE_DIRECT(ch)) { /* character decodes as itself */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:39:59 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 19:39:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319279=3A_UTF-7_decoder_no_more_produces_illegal?= =?utf-8?q?_strings=2E?= Message-ID: <3d2BFq0RM3z7Ljb@mail.python.org> http://hg.python.org/cpython/rev/7dde9c553f16 changeset: 86478:7dde9c553f16 parent: 86475:b8c5964cadc1 parent: 86477:f471f2f05621 user: Serhiy Storchaka date: Sat Oct 19 20:39:28 2013 +0300 summary: Issue #19279: UTF-7 decoder no more produces illegal strings. files: Lib/test/test_codecs.py | 30 +++++++++++++++++++++++++++++ Misc/NEWS | 2 + Objects/unicodeobject.c | 2 + 3 files changed, 34 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -820,6 +820,36 @@ ] ) + def test_errors(self): + tests = [ + (b'a\xffb', 'a\ufffdb'), + (b'a+IK', 'a\ufffd'), + (b'a+IK-b', 'a\ufffdb'), + (b'a+IK,b', 'a\ufffdb'), + (b'a+IKx', 'a\u20ac\ufffd'), + (b'a+IKx-b', 'a\u20ac\ufffdb'), + (b'a+IKwgr', 'a\u20ac\ufffd'), + (b'a+IKwgr-b', 'a\u20ac\ufffdb'), + (b'a+IKwgr,', 'a\u20ac\ufffd'), + (b'a+IKwgr,-b', 'a\u20ac\ufffd-b'), + (b'a+IKwgrB', 'a\u20ac\u20ac\ufffd'), + (b'a+IKwgrB-b', 'a\u20ac\u20ac\ufffdb'), + (b'a+/,+IKw-b', 'a\ufffd\u20acb'), + (b'a+//,+IKw-b', 'a\ufffd\u20acb'), + (b'a+///,+IKw-b', 'a\uffff\ufffd\u20acb'), + (b'a+////,+IKw-b', 'a\uffff\ufffd\u20acb'), + ] + for raw, expected in tests: + with self.subTest(raw=raw): + self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, + raw, 'strict', True) + self.assertEqual(raw.decode('utf-7', 'replace'), expected) + + def test_nonbmp(self): + self.assertEqual('\U000104A0'.encode(self.encoding), b'+2AHcoA-') + self.assertEqual('\ud801\udca0'.encode(self.encoding), b'+2AHcoA-') + self.assertEqual(b'+2AHcoA-'.decode(self.encoding), '\U000104A0') + class UTF16ExTest(unittest.TestCase): def test_errors(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #19279: UTF-7 decoder no more produces illegal strings. + - Issue #16612: Add "Argument Clinic", a compile-time preprocessor for C files to generate argument parsing code. (See PEP 436.) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4341,6 +4341,7 @@ Py_UCS4 outCh = (Py_UCS4)(base64buffer >> (base64bits-16)); base64bits -= 16; base64buffer &= (1 << base64bits) - 1; /* clear high bits */ + assert(outCh <= 0xffff); if (surrogate) { /* expecting a second surrogate */ if (Py_UNICODE_IS_LOW_SURROGATE(outCh)) { @@ -4408,6 +4409,7 @@ inShift = 1; shiftOutStart = writer.pos; base64bits = 0; + base64buffer = 0; } } else if (DECODE_DIRECT(ch)) { /* character decodes as itself */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:40:58 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 19:40:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318582=3A_skip_tes?= =?utf-8?q?t_of_=5Fhashlib=2Epbkdf2=5Fhmac_if_OpenSSL_is_not_available_or?= Message-ID: <3d2BGy6tqzz7LjX@mail.python.org> http://hg.python.org/cpython/rev/a15fcb847515 changeset: 86479:a15fcb847515 user: Christian Heimes date: Sat Oct 19 19:40:49 2013 +0200 summary: Issue #18582: skip test of _hashlib.pbkdf2_hmac if OpenSSL is not available or too old files: Lib/test/test_hashlib.py | 19 ++++++++----------- 1 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -548,8 +548,7 @@ self.assertEqual(expected_hash, hasher.hexdigest()) -class KDFTests: - hashlibmod = None +class KDFTests(unittest.TestCase): pbkdf2_test_vectors = [ (b'password', b'salt', 1, None), @@ -600,9 +599,7 @@ (bytes.fromhex('9d9e9c4cd21fe4be24d5b8244c759665'), None),], } - def test_pbkdf2_hmac(self): - pbkdf2 = self.hashlibmod.pbkdf2_hmac - + def _test_pbkdf2_hmac(self, pbkdf2): for digest_name, results in self.pbkdf2_results.items(): for i, vector in enumerate(self.pbkdf2_test_vectors): password, salt, rounds, dklen = vector @@ -631,13 +628,13 @@ with self.assertRaisesRegex(ValueError, 'unsupported hash type'): pbkdf2('unknown', b'pass', b'salt', 1) + def test_pbkdf2_hmac_py(self): + self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac) -class PyKDFTests(KDFTests, unittest.TestCase): - hashlibmod = py_hashlib - - -class CKDFTests(KDFTests, unittest.TestCase): - hashlibmod = c_hashlib + @unittest.skipUnless(hasattr(c_hashlib, 'pbkdf2_hmac'), + ' test requires OpenSSL > 1.0') + def test_pbkdf2_hmac_c(self): + self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:56:36 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 19:56:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Ignore_PyCharm?= =?utf-8?q?_project_directory?= Message-ID: <3d2Bd03KvMz7LjX@mail.python.org> http://hg.python.org/cpython/rev/6971d55fff29 changeset: 86480:6971d55fff29 branch: 3.3 parent: 86477:f471f2f05621 user: Christian Heimes date: Sat Oct 19 19:55:27 2013 +0200 summary: Ignore PyCharm project directory files: .hgignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,7 @@ .gdb_history .purify .svn/ +^.idea/ .DS_Store Makefile$ Makefile.pre$ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:56:37 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 19:56:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Ignore_PyCharm_project_directory?= Message-ID: <3d2Bd15Dxbz7LjX@mail.python.org> http://hg.python.org/cpython/rev/23d735df0af0 changeset: 86481:23d735df0af0 parent: 86479:a15fcb847515 parent: 86480:6971d55fff29 user: Christian Heimes date: Sat Oct 19 19:55:38 2013 +0200 summary: Ignore PyCharm project directory files: .hgignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,7 @@ .gdb_history .purify .svn/ +^.idea/ .DS_Store Makefile$ Makefile.pre$ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:56:38 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 19:56:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Ignore_PyCharm?= =?utf-8?q?_project_directory?= Message-ID: <3d2Bd26wHJz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/36c9651aea22 changeset: 86482:36c9651aea22 branch: 2.7 parent: 86377:d7ebe03fa752 user: Christian Heimes date: Sat Oct 19 19:55:27 2013 +0200 summary: Ignore PyCharm project directory files: .hgignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,7 @@ .gdb_history .purify .svn/ +^.idea/ .DS_Store Makefile$ Makefile.pre$ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 19:56:40 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 19:56:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf-8?q?_merge?= Message-ID: <3d2Bd43HFXz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/625ece68d79a changeset: 86483:625ece68d79a branch: 2.7 parent: 86482:36c9651aea22 parent: 86476:214c0aac7540 user: Christian Heimes date: Sat Oct 19 19:56:27 2013 +0200 summary: merge files: Doc/howto/descriptor.rst | 2 +- Doc/library/aifc.rst | 4 +- Doc/library/zlib.rst | 17 +++++++++- Lib/logging/__init__.py | 2 +- Lib/test/test_codecs.py | 29 ++++++++++++++++++ Lib/test/test_logging.py | 18 +++++++++++ Lib/test/test_wave.py | 13 ++++++- Lib/wave.py | 4 +- Mac/BuildScript/build-installer.py | 1 + Misc/NEWS | 20 ++++-------- Objects/unicodeobject.c | 2 + setup.py | 2 + 12 files changed, 92 insertions(+), 22 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -124,7 +124,7 @@ The object returned by ``super()`` also has a custom :meth:`__getattribute__` method for invoking descriptors. The call ``super(B, obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, A)``. If not a descriptor, +and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a search using :meth:`object.__getattribute__`. diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\**samplesize* bytes, and a second's worth of audio consists of -*nchannels*\**samplesize*\**framerate* bytes. +*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of +*nchannels*\*\ *samplesize*\*\ *framerate* bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -68,7 +68,7 @@ Raises the :exc:`error` exception if any error occurs. -.. function:: compressobj([level]) +.. function:: compressobj([level[, method[, wbits[, memlevel[, strategy]]]]]) Returns a compression object, to be used for compressing data streams that won't fit into memory at once. *level* is an integer from ``0`` to ``9`` controlling @@ -76,6 +76,21 @@ ``9`` is slowest and produces the most. ``0`` is no compression. The default value is ``6``. + *method* is the compression algorithm. Currently, the only supported value is + ``DEFLATED``. + + *wbits* is the base two logarithm of the size of the window buffer. This + should be an integer from ``8`` to ``15``. Higher values give better + compression, but use more memory. The default is 15. + + *memlevel* controls the amount of memory used for internal compression state. + Valid values range from ``1`` to ``9``. Higher values using more memory, + but are faster and produce smaller output. The default is 8. + + *strategy* is used to tune the compression algorithm. Possible values are + ``Z_DEFAULT_STRATEGY``, ``Z_FILTERED``, and ``Z_HUFFMAN_ONLY``. The default + is ``Z_DEFAULT_STRATEGY``. + .. function:: crc32(data[, value]) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -857,7 +857,7 @@ try: if (isinstance(msg, unicode) and getattr(stream, 'encoding', None)): - ufs = fs.decode(stream.encoding) + ufs = u'%s\n' try: stream.write(ufs % msg) except UnicodeEncodeError: diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -611,6 +611,35 @@ ] ) + def test_errors(self): + tests = [ + ('a\xffb', u'a\ufffdb'), + ('a+IK', u'a\ufffd'), + ('a+IK-b', u'a\ufffdb'), + ('a+IK,b', u'a\ufffdb'), + ('a+IKx', u'a\u20ac\ufffd'), + ('a+IKx-b', u'a\u20ac\ufffdb'), + ('a+IKwgr', u'a\u20ac\ufffd'), + ('a+IKwgr-b', u'a\u20ac\ufffdb'), + ('a+IKwgr,', u'a\u20ac\ufffd'), + ('a+IKwgr,-b', u'a\u20ac\ufffd-b'), + ('a+IKwgrB', u'a\u20ac\u20ac\ufffd'), + ('a+IKwgrB-b', u'a\u20ac\u20ac\ufffdb'), + ('a+/,+IKw-b', u'a\ufffd\u20acb'), + ('a+//,+IKw-b', u'a\ufffd\u20acb'), + ('a+///,+IKw-b', u'a\uffff\ufffd\u20acb'), + ('a+////,+IKw-b', u'a\uffff\ufffd\u20acb'), + ] + for raw, expected in tests: + self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, + raw, 'strict', True) + self.assertEqual(raw.decode('utf-7', 'replace'), expected) + + def test_nonbmp(self): + self.assertEqual(u'\U000104A0'.encode(self.encoding), '+2AHcoA-') + self.assertEqual(u'\ud801\udca0'.encode(self.encoding), '+2AHcoA-') + self.assertEqual('+2AHcoA-'.decode(self.encoding), u'\U000104A0') + class UTF16ExTest(unittest.TestCase): def test_errors(self): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1060,6 +1060,24 @@ #Compare against what the data should be when encoded in CP-1251 self.assertEqual(s, '\xe4\xee \xf1\xe2\xe8\xe4\xe0\xed\xe8\xff\n') + def test_encoding_utf16_unicode(self): + # Issue #19267 + log = logging.getLogger("test") + message = u'b\u0142\u0105d' + writer_class = codecs.getwriter('utf-16-le') + writer_class.encoding = 'utf-16-le' + stream = cStringIO.StringIO() + writer = writer_class(stream, 'strict') + handler = logging.StreamHandler(writer) + log.addHandler(handler) + try: + log.warning(message) + finally: + log.removeHandler(handler) + handler.close() + s = stream.getvalue() + self.assertEqual(s, 'b\x00B\x01\x05\x01d\x00\n\x00') + class WarningsTest(BaseTest): diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,6 +1,7 @@ from test.test_support import TESTFN, run_unittest import unittest from test import audiotests +import sys import wave @@ -44,9 +45,13 @@ EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \ E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \ """) - frames = audiotests.byteswap2(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap2(frames) + at unittest.skipIf(sys.byteorder == 'big', + '24-bit wave files are supported only on little-endian ' + 'platforms') class WavePCM24Test(audiotests.AudioWriteTests, audiotests.AudioTestsWithSourceFile, unittest.TestCase): @@ -73,7 +78,8 @@ E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ """) - frames = audiotests.byteswap3(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap3(frames) class WavePCM32Test(audiotests.AudioWriteTests, @@ -102,7 +108,8 @@ E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ """) - frames = audiotests.byteswap4(frames) + if sys.byteorder != 'big': + frames = audiotests.byteswap4(frames) def test_main(): diff --git a/Lib/wave.py b/Lib/wave.py --- a/Lib/wave.py +++ b/Lib/wave.py @@ -80,7 +80,7 @@ WAVE_FORMAT_PCM = 0x0001 -_array_fmts = None, 'b', 'h', None, 'l' +_array_fmts = None, 'b', 'h', None, 'i' # Determine endian-ness import struct @@ -238,6 +238,7 @@ import array chunk = self._data_chunk data = array.array(_array_fmts[self._sampwidth]) + assert data.itemsize == self._sampwidth nitems = nframes * self._nchannels if nitems * self._sampwidth > chunk.chunksize - chunk.size_read: nitems = (chunk.chunksize - chunk.size_read) / self._sampwidth @@ -421,6 +422,7 @@ if self._sampwidth > 1 and big_endian: import array data = array.array(_array_fmts[self._sampwidth], data) + assert data.itemsize == self._sampwidth data.byteswap() data.tofile(self._file) self._datawritten = self._datawritten + len(data) * self._sampwidth diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -155,6 +155,7 @@ '10.6': ('gcc-4.2', 'g++-4.2'), '10.7': ('clang', 'clang++'), '10.8': ('clang', 'clang++'), + '10.9': ('clang', 'clang++'), } CC, CXX = target_cc_map[DEPTARGET] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,8 @@ Core and Builtins ----------------- +- Issue #19279: UTF-7 decoder no more produces illegal unicode strings. + - Issue #18739: Fix an inconsistency between math.log(n) and math.log(long(n)); the results could be off from one another by a ulp or two. @@ -35,6 +37,8 @@ Library ------- +- Issue #19276: Fixed the wave module on 64-bit big-endian platforms. + - Issue #18458: Prevent crashes with newer versions of libedit. Its readline emulation has changed from 0-based indexing to 1-based like gnu readline. Original patch by Ronald Oussoren. @@ -228,7 +232,6 @@ existing directory caused mkstemp and related APIs to fail instead of retrying. Report and fix by Vlad Shcherbina. - Tools/Demos ----------- @@ -370,6 +373,9 @@ - Issue #17926: Fix dbm.__contains__ on 64-bit big-endian machines. +- Issue #19267: Fix support of multibyte encoding (ex: UTF-16) in the logging + module. + - Issue #17918: When using SSLSocket.accept(), if the SSL handshake failed on the new socket, the socket would linger indefinitely. Thanks to Peter Saveliev for reporting. @@ -3296,7 +3302,6 @@ - Issue #7567: Don't call `setupterm' twice. - Tools/Demos ----------- @@ -4534,7 +4539,6 @@ - Issue #7466: Segmentation fault when the garbage collector is called in the middle of populating a tuple. Patch by Florent Xicluna. - Library ------- @@ -7008,7 +7012,6 @@ - Issue #3215: Build sqlite3 as sqlite3.dll, not sqlite3.pyd. - Documentation ------------- @@ -7074,7 +7077,6 @@ only available if asserts are left in the code, in cases where they can't be triggered from Python code. - Extension Modules ----------------- - Issue #1179: [CVE-2007-4965] Integer overflow in imageop module. @@ -7382,7 +7384,6 @@ NOTE: 64-bit and 4-way builds are only suppported on Mac OS X 10.5 (or later). - C API ----- @@ -8258,7 +8259,6 @@ threading.enumerate() list after the join() for a brief period until it actually exited. - Library ------- @@ -9351,7 +9351,6 @@ platform.python_implementation(); this will now be saved in the benchmark pickle. - Documentation ------------- @@ -9402,7 +9401,6 @@ applied to a newly created list object and add notes that this isn't a good idea. - Tools/Demos ----------- @@ -9415,7 +9413,6 @@ - Bug #1546372: Fixed small bugglet in pybench that caused a missing file not to get reported properly. - Build ----- @@ -9498,7 +9495,6 @@ pybuildbot.identify to include some information about the build environment. - C API ----- @@ -9561,7 +9557,6 @@ - Bug #1542693: remove semi-colon at end of PyImport_ImportModuleEx macro so it can be used as an expression. - Windows ------- @@ -9575,7 +9570,6 @@ - Bug #1216: Restore support for Visual Studio 2002. - Mac --- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1671,6 +1671,7 @@ (base64buffer >> (base64bits-16)); base64bits -= 16; base64buffer &= (1 << base64bits) - 1; /* clear high bits */ + assert(outCh <= 0xffff); if (surrogate) { /* expecting a second surrogate */ if (outCh >= 0xDC00 && outCh <= 0xDFFF) { @@ -1737,6 +1738,7 @@ inShift = 1; shiftOutStart = p; base64bits = 0; + base64buffer = 0; } } else if (DECODE_DIRECT(ch)) { /* character decodes as itself */ diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1389,6 +1389,8 @@ zlib_h = zlib_inc[0] + '/zlib.h' version = '"0.0.0"' version_req = '"1.1.3"' + if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h): + zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:]) fp = open(zlib_h) while 1: line = fp.readline() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:04:05 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 20:04:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=231772673=3A_The_ty?= =?utf-8?q?pe_of_=60char*=60_arguments_now_changed_to_=60const_char*=60=2E?= Message-ID: <3d2Bnd5LK1zR4L@mail.python.org> http://hg.python.org/cpython/rev/3055e61f1e66 changeset: 86484:3055e61f1e66 parent: 86481:23d735df0af0 user: Serhiy Storchaka date: Sat Oct 19 21:03:34 2013 +0300 summary: Issue #1772673: The type of `char*` arguments now changed to `const char*`. files: Doc/c-api/dict.rst | 2 +- Doc/c-api/file.rst | 2 +- Doc/c-api/import.rst | 8 +++--- Doc/c-api/long.rst | 2 +- Doc/c-api/mapping.rst | 6 ++-- Doc/c-api/veryhigh.rst | 2 +- Doc/data/refcounts.dat | 18 ++++++++-------- Include/abstract.h | 19 +++++++++-------- Include/fileobject.h | 5 ++- Include/grammar.h | 6 ++-- Include/import.h | 18 ++++++++-------- Include/longobject.h | 6 ++-- Include/marshal.h | 3 +- Include/parsetok.h | 15 +++++++------ Include/pyport.h | 6 +++- Include/pythonrun.h | 4 +- Misc/NEWS | 2 + Modules/_sqlite/statement.c | 2 +- Modules/cjkcodecs/cjkcodecs.h | 2 +- Modules/readline.c | 4 +- Objects/abstract.c | 8 +++--- Objects/bytesobject.c | 2 +- Objects/exceptions.c | 8 +++--- Objects/fileobject.c | 4 +- Objects/longobject.c | 16 +++++++------- Objects/unicodeobject.c | 2 +- Parser/grammar.c | 6 ++-- Parser/myreadline.c | 6 ++-- Parser/parser.c | 4 +- Parser/parsetok.c | 15 ++++++++----- Parser/pgenmain.c | 2 +- Parser/tokenizer.c | 7 +++-- Parser/tokenizer.h | 6 ++-- Python/ast.c | 14 +++++------- Python/bltinmodule.c | 2 +- Python/codecs.c | 4 +- Python/import.c | 17 ++++++++------- Python/marshal.c | 6 ++-- Python/mystrtoul.c | 24 +++++++++++----------- 39 files changed, 148 insertions(+), 137 deletions(-) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -84,7 +84,7 @@ on failure. -.. c:function:: int PyDict_DelItemString(PyObject *p, char *key) +.. c:function:: int PyDict_DelItemString(PyObject *p, const char *key) Remove the entry in dictionary *p* which has a key specified by the string *key*. Return ``0`` on success or ``-1`` on failure. diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -17,7 +17,7 @@ the :mod:`io` APIs instead. -.. c:function:: PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding, char *errors, char *newline, int closefd) +.. c:function:: PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd) Create a Python file object from the file descriptor of an already opened file *fd*. The arguments *name*, *encoding*, *errors* and *newline* diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -118,7 +118,7 @@ encoded string instead of a Unicode object. -.. c:function:: PyObject* PyImport_ExecCodeModule(char *name, PyObject *co) +.. c:function:: PyObject* PyImport_ExecCodeModule(const char *name, PyObject *co) .. index:: builtin: compile @@ -145,7 +145,7 @@ :c:func:`PyImport_ExecCodeModuleWithPathnames`. -.. c:function:: PyObject* PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname) +.. c:function:: PyObject* PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname) Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`__file__` attribute of the module object is set to *pathname* if it is non-``NULL``. @@ -162,7 +162,7 @@ .. versionadded:: 3.3 -.. c:function:: PyObject* PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, char *cpathname) +.. c:function:: PyObject* PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname) Like :c:func:`PyImport_ExecCodeModuleObject`, but *name*, *pathname* and *cpathname* are UTF-8 encoded strings. Attempts are also made to figure out @@ -246,7 +246,7 @@ .. versionadded:: 3.3 -.. c:function:: int PyImport_ImportFrozenModule(char *name) +.. c:function:: int PyImport_ImportFrozenModule(const char *name) Similar to :c:func:`PyImport_ImportFrozenModuleObject`, but the name is a UTF-8 encoded string instead of a Unicode object. diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -80,7 +80,7 @@ *NULL* on failure. -.. c:function:: PyObject* PyLong_FromString(char *str, char **pend, int base) +.. c:function:: PyObject* PyLong_FromString(const char *str, char **pend, int base) Return a new :c:type:`PyLongObject` based on the string value in *str*, which is interpreted according to the radix in *base*. If *pend* is non-*NULL*, diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -22,7 +22,7 @@ expression ``len(o)``. -.. c:function:: int PyMapping_DelItemString(PyObject *o, char *key) +.. c:function:: int PyMapping_DelItemString(PyObject *o, const char *key) Remove the mapping for object *key* from the object *o*. Return ``-1`` on failure. This is equivalent to the Python statement ``del o[key]``. @@ -67,13 +67,13 @@ the Python expression ``list(o.items())``. -.. c:function:: PyObject* PyMapping_GetItemString(PyObject *o, char *key) +.. c:function:: PyObject* PyMapping_GetItemString(PyObject *o, const char *key) Return element of *o* corresponding to the object *key* or *NULL* on failure. This is the equivalent of the Python expression ``o[key]``. -.. c:function:: int PyMapping_SetItemString(PyObject *o, char *key, PyObject *v) +.. c:function:: int PyMapping_SetItemString(PyObject *o, const char *key, PyObject *v) Map the object *key* to the value *v* in object *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``o[key] = v``. diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -155,7 +155,7 @@ Python source code. -.. c:var:: char* (*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *) +.. c:var:: char* (*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *) Can be set to point to a function with the prototype ``char *func(FILE *stdin, FILE *stdout, char *prompt)``, diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -508,13 +508,13 @@ PyImport_Cleanup:void::: PyImport_ExecCodeModule:PyObject*::+1: -PyImport_ExecCodeModule:char*:name:: +PyImport_ExecCodeModule:const char*:name:: PyImport_ExecCodeModule:PyObject*:co:0: PyImport_ExecCodeModuleEx:PyObject*::+1: -PyImport_ExecCodeModuleEx:char*:name:: +PyImport_ExecCodeModuleEx:const char*:name:: PyImport_ExecCodeModuleEx:PyObject*:co:0: -PyImport_ExecCodeModuleEx:char*:pathname:: +PyImport_ExecCodeModuleEx:const char*:pathname:: PyImport_GetMagicNumber:long::: @@ -524,7 +524,7 @@ PyImport_Import:PyObject*:name:0: PyImport_ImportFrozenModule:int::: -PyImport_ImportFrozenModule:char*::: +PyImport_ImportFrozenModule:const char*::: PyImport_ImportModule:PyObject*::+1: PyImport_ImportModule:const char*:name:: @@ -673,7 +673,7 @@ PyLong_FromUnsignedLongLong:unsigned long long:v:: PyLong_FromString:PyObject*::+1: -PyLong_FromString:char*:str:: +PyLong_FromString:const char*:str:: PyLong_FromString:char**:pend:: PyLong_FromString:int:base:: @@ -701,7 +701,7 @@ PyMapping_GetItemString:PyObject*::+1: PyMapping_GetItemString:PyObject*:o:0: -PyMapping_GetItemString:char*:key:: +PyMapping_GetItemString:const char*:key:: PyMapping_HasKey:int::: PyMapping_HasKey:PyObject*:o:0: @@ -709,7 +709,7 @@ PyMapping_HasKeyString:int::: PyMapping_HasKeyString:PyObject*:o:0: -PyMapping_HasKeyString:char*:key:: +PyMapping_HasKeyString:const char*:key:: PyMapping_Items:PyObject*::+1: PyMapping_Items:PyObject*:o:0: @@ -722,7 +722,7 @@ PyMapping_SetItemString:int::: PyMapping_SetItemString:PyObject*:o:0: -PyMapping_SetItemString:char*:key:: +PyMapping_SetItemString:const char*:key:: PyMapping_SetItemString:PyObject*:v:+1: PyMapping_Values:PyObject*::+1: @@ -735,7 +735,7 @@ PyMarshal_ReadObjectFromFile:FILE*:file:: PyMarshal_ReadObjectFromString:PyObject*::+1: -PyMarshal_ReadObjectFromString:char*:string:: +PyMarshal_ReadObjectFromString:const char*:string:: PyMarshal_ReadObjectFromString:int:len:: PyMarshal_WriteObjectToString:PyObject*::+1: diff --git a/Include/abstract.h b/Include/abstract.h --- a/Include/abstract.h +++ b/Include/abstract.h @@ -144,7 +144,7 @@ /* Implemented elsewhere: - int PyObject_HasAttrString(PyObject *o, char *attr_name); + int PyObject_HasAttrString(PyObject *o, const char *attr_name); Returns 1 if o has the attribute attr_name, and 0 otherwise. This is equivalent to the Python expression: @@ -156,7 +156,7 @@ /* Implemented elsewhere: - PyObject* PyObject_GetAttrString(PyObject *o, char *attr_name); + PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name); Retrieve an attributed named attr_name form object o. Returns the attribute value on success, or NULL on failure. @@ -189,7 +189,7 @@ /* Implemented elsewhere: - int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v); + int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v); Set the value of the attribute named attr_name, for object o, to the value, v. Returns -1 on failure. This is @@ -209,7 +209,7 @@ /* implemented as a macro: - int PyObject_DelAttrString(PyObject *o, char *attr_name); + int PyObject_DelAttrString(PyObject *o, const char *attr_name); Delete attribute named attr_name, for object o. Returns -1 on failure. This is the equivalent of the Python @@ -434,7 +434,7 @@ statement: o[key]=v. */ - PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, char *key); + PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); /* Remove the mapping for object, key, from the object *o. @@ -1156,7 +1156,7 @@ /* implemented as a macro: - int PyMapping_DelItemString(PyObject *o, char *key); + int PyMapping_DelItemString(PyObject *o, const char *key); Remove the mapping for object, key, from the object *o. Returns -1 on failure. This is equivalent to @@ -1174,7 +1174,7 @@ */ #define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) - PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, char *key); + PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); /* On success, return 1 if the mapping object has the key, key, @@ -1218,7 +1218,8 @@ */ - PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, char *key); + PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, + const char *key); /* Return element of o corresponding to the object, key, or NULL @@ -1226,7 +1227,7 @@ o[key]. */ - PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, char *key, + PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value); /* diff --git a/Include/fileobject.h b/Include/fileobject.h --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -8,8 +8,9 @@ #define PY_STDIOTEXTMODE "b" -PyAPI_FUNC(PyObject *) PyFile_FromFd(int, char *, char *, int, char *, char *, - char *, int); +PyAPI_FUNC(PyObject *) PyFile_FromFd(int, const char *, const char *, int, + const char *, const char *, + const char *, int); PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); diff --git a/Include/grammar.h b/Include/grammar.h --- a/Include/grammar.h +++ b/Include/grammar.h @@ -69,13 +69,13 @@ /* FUNCTIONS */ grammar *newgrammar(int start); -dfa *adddfa(grammar *g, int type, char *name); +dfa *adddfa(grammar *g, int type, const char *name); int addstate(dfa *d); void addarc(dfa *d, int from, int to, int lbl); dfa *PyGrammar_FindDFA(grammar *g, int type); -int addlabel(labellist *ll, int type, char *str); -int findlabel(labellist *ll, int type, char *str); +int addlabel(labellist *ll, int type, const char *str); +int findlabel(labellist *ll, int type, const char *str); const char *PyGrammar_LabelRepr(label *lb); void translatelabels(grammar *g); diff --git a/Include/import.h b/Include/import.h --- a/Include/import.h +++ b/Include/import.h @@ -13,19 +13,19 @@ PyAPI_FUNC(long) PyImport_GetMagicNumber(void); PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( - char *name, /* UTF-8 encoded string */ + const char *name, /* UTF-8 encoded string */ PyObject *co ); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( - char *name, /* UTF-8 encoded string */ + const char *name, /* UTF-8 encoded string */ PyObject *co, - char *pathname /* decoded from the filesystem encoding */ + const char *pathname /* decoded from the filesystem encoding */ ); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames( - char *name, /* UTF-8 encoded string */ + const char *name, /* UTF-8 encoded string */ PyObject *co, - char *pathname, /* decoded from the filesystem encoding */ - char *cpathname /* decoded from the filesystem encoding */ + const char *pathname, /* decoded from the filesystem encoding */ + const char *cpathname /* decoded from the filesystem encoding */ ); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject( PyObject *name, @@ -72,7 +72,7 @@ PyObject *name ); PyAPI_FUNC(int) PyImport_ImportFrozenModule( - char *name /* UTF-8 encoded string */ + const char *name /* UTF-8 encoded string */ ); #ifndef Py_LIMITED_API @@ -92,12 +92,12 @@ PyAPI_FUNC(PyObject *)_PyImport_FindExtensionObject(PyObject *, PyObject *); PyAPI_FUNC(int)_PyImport_FixupBuiltin( PyObject *mod, - char *name /* UTF-8 encoded string */ + const char *name /* UTF-8 encoded string */ ); PyAPI_FUNC(int)_PyImport_FixupExtensionObject(PyObject*, PyObject *, PyObject *); struct _inittab { - char *name; /* ASCII encoded string */ + const char *name; /* ASCII encoded string */ PyObject* (*initfunc)(void); }; PyAPI_DATA(struct _inittab *) PyImport_Inittab; diff --git a/Include/longobject.h b/Include/longobject.h --- a/Include/longobject.h +++ b/Include/longobject.h @@ -93,7 +93,7 @@ PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLongAndOverflow(PyObject *, int *); #endif /* HAVE_LONG_LONG */ -PyAPI_FUNC(PyObject *) PyLong_FromString(char *, char **, int); +PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); @@ -189,8 +189,8 @@ /* These aren't really part of the int object, but they're handy. The functions are in Python/mystrtoul.c. */ -PyAPI_FUNC(unsigned long) PyOS_strtoul(char *, char **, int); -PyAPI_FUNC(long) PyOS_strtol(char *, char **, int); +PyAPI_FUNC(unsigned long) PyOS_strtoul(const char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(const char *, char **, int); #ifdef __cplusplus } diff --git a/Include/marshal.h b/Include/marshal.h --- a/Include/marshal.h +++ b/Include/marshal.h @@ -19,7 +19,8 @@ PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); #endif -PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, + Py_ssize_t); #ifdef __cplusplus } diff --git a/Include/parsetok.h b/Include/parsetok.h --- a/Include/parsetok.h +++ b/Include/parsetok.h @@ -38,7 +38,8 @@ PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, perrdetail *); PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, - char *, char *, perrdetail *); + const char *, const char *, + perrdetail *); PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, perrdetail *, int); @@ -48,8 +49,8 @@ const char *enc, grammar *g, int start, - char *ps1, - char *ps2, + const char *ps1, + const char *ps2, perrdetail *err_ret, int flags); PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx( @@ -58,8 +59,8 @@ const char *enc, grammar *g, int start, - char *ps1, - char *ps2, + const char *ps1, + const char *ps2, perrdetail *err_ret, int *flags); PyAPI_FUNC(node *) PyParser_ParseFileObject( @@ -68,8 +69,8 @@ const char *enc, grammar *g, int start, - char *ps1, - char *ps2, + const char *ps1, + const char *ps2, perrdetail *err_ret, int *flags); diff --git a/Include/pyport.h b/Include/pyport.h --- a/Include/pyport.h +++ b/Include/pyport.h @@ -673,8 +673,10 @@ /* BSDI does not supply a prototype for the 'openpty' and 'forkpty' functions, even though they are included in libutil. */ #include -extern int openpty(int *, int *, char *, struct termios *, struct winsize *); -extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); +extern int openpty(int *, int *, char *, + const struct termios *, const struct winsize *); +extern pid_t forkpty(int *, char *, + const struct termios *, const struct winsize *); #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -261,10 +261,10 @@ /* Stuff with no proper home (yet) */ #ifndef Py_LIMITED_API -PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, char *); +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); #endif PyAPI_DATA(int) (*PyOS_InputHook)(void); -PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); #ifndef Py_LIMITED_API PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; #endif diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -166,6 +166,8 @@ C API ----- +- Issue #1772673: The type of `char*` arguments now changed to `const char*`. + - Issue #16129: Added a `Py_SetStandardStreamEncoding` pre-initialization API to allow embedding applications like Blender to force a particular encoding and error handler for the standard IO streams (initial patch by diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -248,7 +248,7 @@ current_param = PyDict_GetItemString(parameters, binding_name); Py_XINCREF(current_param); } else { - current_param = PyMapping_GetItemString(parameters, (char*)binding_name); + current_param = PyMapping_GetItemString(parameters, binding_name); } if (!current_param) { PyErr_Format(pysqlite_ProgrammingError, "You did not supply a value for binding %d.", i); diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -371,7 +371,7 @@ { PyObject *o, *mod; - mod = PyImport_ImportModule((char *)modname); + mod = PyImport_ImportModule(modname); if (mod == NULL) return -1; diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1043,7 +1043,7 @@ extern PyThreadState* _PyOS_ReadlineTState; static char * -readline_until_enter_or_signal(char *prompt, int *signal) +readline_until_enter_or_signal(const char *prompt, int *signal) { char * not_done_reading = ""; fd_set selectset; @@ -1145,7 +1145,7 @@ static char * -call_readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) +call_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) { size_t n; char *p, *q; diff --git a/Objects/abstract.c b/Objects/abstract.c --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -223,7 +223,7 @@ } int -PyObject_DelItemString(PyObject *o, char *key) +PyObject_DelItemString(PyObject *o, const char *key) { PyObject *okey; int ret; @@ -1950,7 +1950,7 @@ #define PyMapping_Length PyMapping_Size PyObject * -PyMapping_GetItemString(PyObject *o, char *key) +PyMapping_GetItemString(PyObject *o, const char *key) { PyObject *okey, *r; @@ -1966,7 +1966,7 @@ } int -PyMapping_SetItemString(PyObject *o, char *key, PyObject *value) +PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value) { PyObject *okey; int r; @@ -1985,7 +1985,7 @@ } int -PyMapping_HasKeyString(PyObject *o, char *key) +PyMapping_HasKeyString(PyObject *o, const char *key) { PyObject *v; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1347,7 +1347,7 @@ { PyObject *sep = NULL; - if (!PyArg_ParseTuple(args, (char *)stripformat[striptype], &sep)) + if (!PyArg_ParseTuple(args, stripformat[striptype], &sep)) return NULL; if (sep != NULL && sep != Py_None) { diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -121,11 +121,11 @@ static PyObject * BaseException_repr(PyBaseExceptionObject *self) { - char *name; - char *dot; + const char *name; + const char *dot; - name = (char *)Py_TYPE(self)->tp_name; - dot = strrchr(name, '.'); + name = Py_TYPE(self)->tp_name; + dot = (const char *) strrchr(name, '.'); if (dot != NULL) name = dot+1; return PyUnicode_FromFormat("%s%R", name, self->args); diff --git a/Objects/fileobject.c b/Objects/fileobject.c --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -26,8 +26,8 @@ /* External C interface */ PyObject * -PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding, - char *errors, char *newline, int closefd) +PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, + const char *errors, const char *newline, int closefd) { PyObject *io, *stream; _Py_IDENTIFIER(open); diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1941,10 +1941,10 @@ * string characters. */ static PyLongObject * -long_from_binary_base(char **str, int base) +long_from_binary_base(const char **str, int base) { - char *p = *str; - char *start = p; + const char *p = *str; + const char *start = p; int bits_per_char; Py_ssize_t n; PyLongObject *z; @@ -2009,10 +2009,10 @@ * If unsuccessful, NULL will be returned. */ PyObject * -PyLong_FromString(char *str, char **pend, int base) +PyLong_FromString(const char *str, char **pend, int base) { int sign = 1, error_if_nonzero = 0; - char *start, *orig_str = str; + const char *start, *orig_str = str; PyLongObject *z = NULL; PyObject *strobj; Py_ssize_t slen; @@ -2147,7 +2147,7 @@ int convwidth; twodigits convmultmax, convmult; digit *pz, *pzstop; - char* scan; + const char* scan; static double log_base_BASE[37] = {0.0e0,}; static int convwidth_base[37] = {0,}; @@ -2275,12 +2275,12 @@ if (z == NULL) return NULL; if (pend != NULL) - *pend = str; + *pend = (char *)str; return (PyObject *) z; onError: if (pend != NULL) - *pend = str; + *pend = (char *)str; Py_XDECREF(z); slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200; strobj = PyUnicode_FromStringAndSize(orig_str, slen); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11874,7 +11874,7 @@ { PyObject *sep = NULL; - if (!PyArg_ParseTuple(args, (char *)stripformat[striptype], &sep)) + if (!PyArg_ParseTuple(args, stripformat[striptype], &sep)) return NULL; if (sep != NULL && sep != Py_None) { diff --git a/Parser/grammar.c b/Parser/grammar.c --- a/Parser/grammar.c +++ b/Parser/grammar.c @@ -29,7 +29,7 @@ } dfa * -adddfa(grammar *g, int type, char *name) +adddfa(grammar *g, int type, const char *name) { dfa *d; @@ -85,7 +85,7 @@ } int -addlabel(labellist *ll, int type, char *str) +addlabel(labellist *ll, int type, const char *str) { int i; label *lb; @@ -111,7 +111,7 @@ /* Same, but rather dies than adds */ int -findlabel(labellist *ll, int type, char *str) +findlabel(labellist *ll, int type, const char *str) { int i; diff --git a/Parser/myreadline.c b/Parser/myreadline.c --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -109,7 +109,7 @@ /* Readline implementation using fgets() */ char * -PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) +PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) { size_t n; char *p, *pr; @@ -170,13 +170,13 @@ Note: Python expects in return a buffer allocated with PyMem_Malloc. */ -char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *); +char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); /* Interface used by tokenizer.c and bltinmodule.c */ char * -PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) +PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) { char *rv, *res; size_t len; diff --git a/Parser/parser.c b/Parser/parser.c --- a/Parser/parser.c +++ b/Parser/parser.c @@ -134,13 +134,13 @@ /* PARSER PROPER */ static int -classify(parser_state *ps, int type, char *str) +classify(parser_state *ps, int type, const char *str) { grammar *g = ps->p_grammar; int n = g->g_ll.ll_nlabels; if (type == NAME) { - char *s = str; + const char *s = str; label *l = g->g_ll.ll_label; int i; for (i = n; i > 0; i--, l++) { diff --git a/Parser/parsetok.c b/Parser/parsetok.c --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -94,7 +94,8 @@ node * PyParser_ParseFile(FILE *fp, const char *filename, grammar *g, int start, - char *ps1, char *ps2, perrdetail *err_ret) + const char *ps1, const char *ps2, + perrdetail *err_ret) { return PyParser_ParseFileFlags(fp, filename, NULL, g, start, ps1, ps2, err_ret, 0); @@ -103,7 +104,8 @@ node * PyParser_ParseFileFlags(FILE *fp, const char *filename, const char *enc, grammar *g, int start, - char *ps1, char *ps2, perrdetail *err_ret, int flags) + const char *ps1, const char *ps2, + perrdetail *err_ret, int flags) { int iflags = flags; return PyParser_ParseFileFlagsEx(fp, filename, enc, g, start, ps1, @@ -113,15 +115,15 @@ node * PyParser_ParseFileObject(FILE *fp, PyObject *filename, const char *enc, grammar *g, int start, - char *ps1, char *ps2, perrdetail *err_ret, - int *flags) + const char *ps1, const char *ps2, + perrdetail *err_ret, int *flags) { struct tok_state *tok; if (initerr(err_ret, filename) < 0) return NULL; - if ((tok = PyTokenizer_FromFile(fp, (char *)enc, ps1, ps2)) == NULL) { + if ((tok = PyTokenizer_FromFile(fp, enc, ps1, ps2)) == NULL) { err_ret->error = E_NOMEM; return NULL; } @@ -135,7 +137,8 @@ node * PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, const char *enc, grammar *g, int start, - char *ps1, char *ps2, perrdetail *err_ret, int *flags) + const char *ps1, const char *ps2, + perrdetail *err_ret, int *flags) { node *n; PyObject *fileobj = NULL; diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c --- a/Parser/pgenmain.c +++ b/Parser/pgenmain.c @@ -138,7 +138,7 @@ /* No-nonsense my_readline() for tokenizer.c */ char * -PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) +PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) { size_t n = 1000; char *p = (char *)PyMem_MALLOC(n); diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -31,7 +31,7 @@ || c == '_'\ || (c >= 128)) -extern char *PyOS_Readline(FILE *, FILE *, char *); +extern char *PyOS_Readline(FILE *, FILE *, const char *); /* Return malloc'ed string including trailing \n; empty malloc'ed string for EOF; NULL if interrupted */ @@ -780,7 +780,7 @@ struct tok_state *tok = tok_new(); if (tok == NULL) return NULL; - str = (char *)decode_str(str, exec_input, tok); + str = decode_str(str, exec_input, tok); if (str == NULL) { PyTokenizer_Free(tok); return NULL; @@ -823,7 +823,8 @@ /* Set up tokenizer for file */ struct tok_state * -PyTokenizer_FromFile(FILE *fp, char* enc, char *ps1, char *ps2) +PyTokenizer_FromFile(FILE *fp, const char* enc, + const char *ps1, const char *ps2) { struct tok_state *tok = tok_new(); if (tok == NULL) diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -35,7 +35,7 @@ int indstack[MAXINDENT]; /* Stack of indents */ int atbol; /* Nonzero if at begin of new line */ int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ - char *prompt, *nextprompt; /* For interactive prompting */ + const char *prompt, *nextprompt; /* For interactive prompting */ int lineno; /* Current line number */ int level; /* () [] {} Parentheses nesting level */ /* Used to allow free continuations inside them */ @@ -69,8 +69,8 @@ extern struct tok_state *PyTokenizer_FromString(const char *, int); extern struct tok_state *PyTokenizer_FromUTF8(const char *, int); -extern struct tok_state *PyTokenizer_FromFile(FILE *, char*, - char *, char *); +extern struct tok_state *PyTokenizer_FromFile(FILE *, const char*, + const char *, const char *); extern void PyTokenizer_Free(struct tok_state *); extern int PyTokenizer_Get(struct tok_state *, char **, char **); extern char * PyTokenizer_RestoreEncoding(struct tok_state* tok, diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -3651,18 +3651,16 @@ end = s + strlen(s) - 1; imflag = *end == 'j' || *end == 'J'; if (s[0] == '0') { - x = (long) PyOS_strtoul((char *)s, (char **)&end, 0); + x = (long) PyOS_strtoul(s, (char **)&end, 0); if (x < 0 && errno == 0) { - return PyLong_FromString((char *)s, - (char **)0, - 0); + return PyLong_FromString(s, (char **)0, 0); } } else - x = PyOS_strtol((char *)s, (char **)&end, 0); + x = PyOS_strtol(s, (char **)&end, 0); if (*end == '\0') { if (errno != 0) - return PyLong_FromString((char *)s, (char **)0, 0); + return PyLong_FromString(s, (char **)0, 0); return PyLong_FromLong(x); } /* XXX Huge floats may silently fail */ @@ -3685,8 +3683,8 @@ static PyObject * decode_utf8(struct compiling *c, const char **sPtr, const char *end) { - char *s, *t; - t = s = (char *)*sPtr; + const char *s, *t; + t = s = *sPtr; /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */ while (s < end && (*s & 0x80)) s++; *sPtr = s; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1335,7 +1335,7 @@ if (positional) v = args; - else if (!PyArg_UnpackTuple(args, (char *)name, 1, 1, &v)) + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) return NULL; emptytuple = PyTuple_New(0); diff --git a/Python/codecs.c b/Python/codecs.c --- a/Python/codecs.c +++ b/Python/codecs.c @@ -441,7 +441,7 @@ return -1; } return PyDict_SetItemString(interp->codec_error_registry, - (char *)name, error); + name, error); } /* Lookup the error handling callback function registered under the @@ -457,7 +457,7 @@ if (name==NULL) name = "strict"; - handler = PyDict_GetItemString(interp->codec_error_registry, (char *)name); + handler = PyDict_GetItemString(interp->codec_error_registry, name); if (!handler) PyErr_Format(PyExc_LookupError, "unknown error handler name '%.400s'", name); else diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -517,7 +517,7 @@ } int -_PyImport_FixupBuiltin(PyObject *mod, char *name) +_PyImport_FixupBuiltin(PyObject *mod, const char *name) { int res; PyObject *nameobj; @@ -656,22 +656,23 @@ * interface. The other two exist primarily for backward compatibility. */ PyObject * -PyImport_ExecCodeModule(char *name, PyObject *co) +PyImport_ExecCodeModule(const char *name, PyObject *co) { return PyImport_ExecCodeModuleWithPathnames( name, co, (char *)NULL, (char *)NULL); } PyObject * -PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname) +PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname) { return PyImport_ExecCodeModuleWithPathnames( name, co, pathname, (char *)NULL); } PyObject * -PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, - char *cpathname) +PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, + const char *pathname, + const char *cpathname) { PyObject *m = NULL; PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; @@ -1019,7 +1020,7 @@ size = p->size; if (size < 0) size = -size; - return PyMarshal_ReadObjectFromString((char *)p->code, size); + return PyMarshal_ReadObjectFromString((const char *)p->code, size); } static PyObject * @@ -1071,7 +1072,7 @@ ispackage = (size < 0); if (ispackage) size = -size; - co = PyMarshal_ReadObjectFromString((char *)p->code, size); + co = PyMarshal_ReadObjectFromString((const char *)p->code, size); if (co == NULL) return -1; if (!PyCode_Check(co)) { @@ -1113,7 +1114,7 @@ } int -PyImport_ImportFrozenModule(char *name) +PyImport_ImportFrozenModule(const char *name) { PyObject *nameobj; int ret; diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1466,15 +1466,15 @@ } PyObject * -PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len) +PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len) { RFILE rf; PyObject *result; rf.fp = NULL; rf.readable = NULL; rf.current_filename = NULL; - rf.ptr = str; - rf.end = str + len; + rf.ptr = (char *)str; + rf.end = (char *)str + len; rf.buf = NULL; rf.depth = 0; rf.refs = PyList_New(0); diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -92,7 +92,7 @@ ** exceptions - we don't check for them. */ unsigned long -PyOS_strtoul(char *str, char **ptr, int base) +PyOS_strtoul(const char *str, char **ptr, int base) { unsigned long result = 0; /* return value of the function */ int c; /* current input character */ @@ -111,7 +111,7 @@ /* there must be at least one digit after 0x */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -120,7 +120,7 @@ /* there must be at least one digit after 0o */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -129,7 +129,7 @@ /* there must be at least one digit after 0b */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -141,7 +141,7 @@ while (Py_ISSPACE(Py_CHARMASK(*str))) ++str; if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } } @@ -157,7 +157,7 @@ /* there must be at least one digit after 0x */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -171,7 +171,7 @@ /* there must be at least one digit after 0o */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -185,7 +185,7 @@ /* there must be at least one digit after 0b */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -197,7 +197,7 @@ /* catch silly bases */ if (base < 2 || base > 36) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } @@ -239,7 +239,7 @@ /* set pointer to point to the last character scanned */ if (ptr) - *ptr = str; + *ptr = (char *)str; return result; @@ -248,7 +248,7 @@ /* spool through remaining digit characters */ while (_PyLong_DigitValue[Py_CHARMASK(*str)] < base) ++str; - *ptr = str; + *ptr = (char *)str; } errno = ERANGE; return (unsigned long)-1; @@ -260,7 +260,7 @@ #define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN) long -PyOS_strtol(char *str, char **ptr, int base) +PyOS_strtol(const char *str, char **ptr, int base) { long result; unsigned long uresult; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:11:10 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 20:11:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2312866=3A_The_audi?= =?utf-8?q?oop_module_now_supports_24-bit_samples=2E?= Message-ID: <3d2Bxp5qZrz7LjY@mail.python.org> http://hg.python.org/cpython/rev/e1fa70053828 changeset: 86485:e1fa70053828 user: Serhiy Storchaka date: Sat Oct 19 21:10:46 2013 +0300 summary: Issue #12866: The audioop module now supports 24-bit samples. files: Doc/library/audioop.rst | 19 +- Doc/whatsnew/3.4.rst | 6 + Lib/test/test_audioop.py | 60 ++- Misc/NEWS | 2 + Modules/audioop.c | 423 ++++++++++++-------------- 5 files changed, 252 insertions(+), 258 deletions(-) diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -6,9 +6,12 @@ The :mod:`audioop` module contains some useful operations on sound fragments. -It operates on sound fragments consisting of signed integer samples 8, 16 or 32 -bits wide, stored in bytes objects. All scalar items are integers, unless -specified otherwise. +It operates on sound fragments consisting of signed integer samples 8, 16, 24 +or 32 bits wide, stored in bytes objects. All scalar items are integers, +unless specified otherwise. + +.. versionchanged:: 3.4 + Support for 24-bit samples was added. .. index:: single: Intel/DVI ADPCM @@ -35,7 +38,7 @@ .. function:: add(fragment1, fragment2, width) Return a fragment which is the addition of the two samples passed as parameters. - *width* is the sample width in bytes, either ``1``, ``2`` or ``4``. Both + *width* is the sample width in bytes, either ``1``, ``2``, ``3`` or ``4``. Both fragments should have the same length. Samples are truncated in case of overflow. @@ -133,19 +136,19 @@ .. function:: lin2lin(fragment, width, newwidth) - Convert samples between 1-, 2- and 4-byte formats. + Convert samples between 1-, 2-, 3- and 4-byte formats. .. note:: - In some audio formats, such as .WAV files, 16 and 32 bit samples are + In some audio formats, such as .WAV files, 16, 24 and 32 bit samples are signed, but 8 bit samples are unsigned. So when converting to 8 bit wide samples for these formats, you need to also add 128 to the result:: new_frames = audioop.lin2lin(frames, old_width, 1) new_frames = audioop.bias(new_frames, 1, 128) - The same, in reverse, has to be applied when converting from 8 to 16 or 32 - bit width samples. + The same, in reverse, has to be applied when converting from 8 to 16, 24 + or 32 bit width samples. .. function:: lin2ulaw(fragment, width) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -197,6 +197,12 @@ plain tuple. (Contributed by Claudiu Popa in :issue:`17818`.) +audioop +------- + +Added support for 24-bit samples (:issue:`12866`). + + codecs ------ diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -6,13 +6,18 @@ def pack(width, data): return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data) -packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 4)} -maxvalues = {w: (1 << (8 * w - 1)) - 1 for w in (1, 2, 4)} -minvalues = {w: -1 << (8 * w - 1) for w in (1, 2, 4)} +def unpack(width, data): + return [int.from_bytes(data[i: i + width], sys.byteorder, signed=True) + for i in range(0, len(data), width)] + +packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 3, 4)} +maxvalues = {w: (1 << (8 * w - 1)) - 1 for w in (1, 2, 3, 4)} +minvalues = {w: -1 << (8 * w - 1) for w in (1, 2, 3, 4)} datas = { 1: b'\x00\x12\x45\xbb\x7f\x80\xff', 2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1), + 3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1), 4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab, 0x7fffffff, -0x80000000, -1), } @@ -20,6 +25,7 @@ INVALID_DATA = [ (b'abc', 0), (b'abc', 2), + (b'ab', 3), (b'abc', 4), ] @@ -27,7 +33,7 @@ class TestAudioop(unittest.TestCase): def test_max(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.max(b'', w), 0) p = packs[w] self.assertEqual(audioop.max(p(5), w), 5) @@ -37,7 +43,7 @@ self.assertEqual(audioop.max(datas[w], w), -minvalues[w]) def test_minmax(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.minmax(b'', w), (0x7fffffff, -0x80000000)) p = packs[w] @@ -51,7 +57,7 @@ (minvalues[w], maxvalues[w])) def test_maxpp(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.maxpp(b'', w), 0) self.assertEqual(audioop.maxpp(packs[w](*range(100)), w), 0) self.assertEqual(audioop.maxpp(packs[w](9, 10, 5, 5, 0, 1), w), 10) @@ -59,7 +65,7 @@ maxvalues[w] - minvalues[w]) def test_avg(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.avg(b'', w), 0) p = packs[w] self.assertEqual(audioop.avg(p(5), w), 5) @@ -75,7 +81,7 @@ -0x60000000) def test_avgpp(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.avgpp(b'', w), 0) self.assertEqual(audioop.avgpp(packs[w](*range(100)), w), 0) self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10) @@ -84,7 +90,7 @@ self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002) def test_rms(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.rms(b'', w), 0) p = packs[w] self.assertEqual(audioop.rms(p(*range(100)), w), 57) @@ -97,7 +103,7 @@ self.assertEqual(audioop.rms(datas[4], 4), 1310854152) def test_cross(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.cross(b'', w), -1) p = packs[w] self.assertEqual(audioop.cross(p(0, 1, 2), w), 0) @@ -107,7 +113,7 @@ self.assertEqual(audioop.cross(p(minvalues[w], maxvalues[w]), w), 1) def test_add(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.add(b'', b'', w), b'') self.assertEqual(audioop.add(datas[w], b'\0' * len(datas[w]), w), datas[w]) @@ -120,7 +126,7 @@ 0x7fffffff, -0x80000000, -2)) def test_bias(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: for bias in 0, 1, -1, 127, -128, 0x7fffffff, -0x80000000: self.assertEqual(audioop.bias(b'', w, bias), b'') self.assertEqual(audioop.bias(datas[1], 1, 1), @@ -153,7 +159,7 @@ -1, 0, 0x7fffffff)) def test_lin2lin(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.lin2lin(datas[w], w, w), datas[w]) self.assertEqual(audioop.lin2lin(datas[1], 1, 2), @@ -181,7 +187,7 @@ -0xb30000), (-179, 40))) # Very cursory test - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.adpcm2lin(b'\0' * 5, w, None), (b'\0' * w * 10, (0, 0))) @@ -194,7 +200,7 @@ (b'\x07\x7f\x7f', (31, 39))) # Very cursory test - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.lin2adpcm(b'\0' * w * 10, w, None), (b'\0' * 5, (0, 0))) @@ -211,12 +217,12 @@ b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff' src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106, 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106] - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.alaw2lin(encoded, w), packs[w](*(x << (w * 8) >> 13 for x in src))) encoded = bytes(range(256)) - for w in 2, 4: + for w in 2, 3, 4: decoded = audioop.alaw2lin(encoded, w) self.assertEqual(audioop.lin2alaw(decoded, w), encoded) @@ -233,18 +239,18 @@ b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff' src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0, 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0] - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.ulaw2lin(encoded, w), packs[w](*(x << (w * 8) >> 14 for x in src))) # Current u-law implementation has two codes fo 0: 0x7f and 0xff. encoded = bytes(range(127)) + bytes(range(128, 256)) - for w in 2, 4: + for w in 2, 3, 4: decoded = audioop.ulaw2lin(encoded, w) self.assertEqual(audioop.lin2ulaw(decoded, w), encoded) def test_mul(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.mul(b'', w, 2), b'') self.assertEqual(audioop.mul(datas[w], w, 0), b'\0' * len(datas[w])) @@ -259,7 +265,7 @@ 0x7fffffff, -0x80000000, -2)) def test_ratecv(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None), (b'', (-1, ((0, 0),)))) self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None), @@ -273,7 +279,7 @@ d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state) self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002') - for w in 1, 2, 4: + for w in 1, 2, 3, 4: d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None) d, state = b'', None for i in range(0, len(datas[w]), w): @@ -284,13 +290,13 @@ self.assertEqual(state, state0) def test_reverse(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: self.assertEqual(audioop.reverse(b'', w), b'') self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w), packs[w](2, 1, 0)) def test_tomono(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: data1 = datas[w] data2 = bytearray(2 * len(data1)) for k in range(w): @@ -302,7 +308,7 @@ self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1) def test_tostereo(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: data1 = datas[w] data2 = bytearray(2 * len(data1)) for k in range(w): @@ -329,7 +335,7 @@ self.assertEqual(audioop.findmax(datas[2], 1), 5) def test_getsample(self): - for w in 1, 2, 4: + for w in 1, 2, 3, 4: data = packs[w](0, 1, -1, maxvalues[w], minvalues[w]) self.assertEqual(audioop.getsample(data, w, 0), 0) self.assertEqual(audioop.getsample(data, w, 1), 1) @@ -369,7 +375,7 @@ def test_wrongsize(self): data = b'abcdefgh' state = None - for size in (-1, 0, 3, 5, 1024): + for size in (-1, 0, 5, 1024): self.assertRaises(audioop.error, audioop.ulaw2lin, data, size) self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -59,6 +59,8 @@ Library ------- +- Issue #12866: The audioop module now supports 24-bit samples. + - Issue #19254: Provide an optimized Python implementation of pbkdf2_hmac. - Issues #19201, #19222, #19223: Add "x" mode (exclusive creation) in opening diff --git a/Modules/audioop.c b/Modules/audioop.c --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -5,18 +5,6 @@ #include "Python.h" -#if SIZEOF_INT == 4 -typedef int Py_Int32; -typedef unsigned int Py_UInt32; -#else -#if SIZEOF_LONG == 4 -typedef long Py_Int32; -typedef unsigned long Py_UInt32; -#else -#error "No 4-byte integral type" -#endif -#endif - typedef short PyInt16; #if defined(__CHAR_UNSIGNED__) @@ -160,9 +148,6 @@ PyInt16 seg; unsigned char uval; - /* The original sox code does this in the calling function, not here */ - pcm_val = pcm_val >> 2; - /* u-law inverts all bits */ /* Get the sign and the magnitude of the value. */ if (pcm_val < 0) { @@ -257,9 +242,6 @@ short seg; unsigned char aval; - /* The original sox code does this in the calling function, not here */ - pcm_val = pcm_val >> 3; - /* A-law using even bit inversion */ if (pcm_val >= 0) { mask = 0xD5; /* sign (7th) bit = 1 */ @@ -304,19 +286,91 @@ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 }; -#define CHARP(cp, i) ((signed char *)(cp+i)) -#define SHORTP(cp, i) ((short *)(cp+i)) -#define LONGP(cp, i) ((Py_Int32 *)(cp+i)) +#define GETINTX(T, cp, i) (*(T *)((cp) + (i))) +#define SETINTX(T, cp, i, val) do { \ + *(T *)((cp) + (i)) = (T)(val); \ + } while (0) +#define GETINT8(cp, i) GETINTX(signed char, (cp), (i)) +#define GETINT16(cp, i) GETINTX(short, (cp), (i)) +#define GETINT32(cp, i) GETINTX(PY_INT32_T, (cp), (i)) + +#if WORDS_BIGENDIAN +#define GETINT24(cp, i) ( \ + ((unsigned char *)(cp) + (i))[2] + \ + (((unsigned char *)(cp) + (i))[1] << 8) + \ + (((signed char *)(cp) + (i))[0] << 16) ) +#else +#define GETINT24(cp, i) ( \ + ((unsigned char *)(cp) + (i))[0] + \ + (((unsigned char *)(cp) + (i))[1] << 8) + \ + (((signed char *)(cp) + (i))[2] << 16) ) +#endif + + +#define SETINT8(cp, i, val) SETINTX(signed char, (cp), (i), (val)) +#define SETINT16(cp, i, val) SETINTX(short, (cp), (i), (val)) +#define SETINT32(cp, i, val) SETINTX(PY_INT32_T, (cp), (i), (val)) + +#if WORDS_BIGENDIAN +#define SETINT24(cp, i, val) do { \ + ((unsigned char *)(cp) + (i))[2] = (int)(val); \ + ((unsigned char *)(cp) + (i))[1] = (int)(val) >> 8; \ + ((signed char *)(cp) + (i))[0] = (int)(val) >> 16; \ + } while (0) +#else +#define SETINT24(cp, i, val) do { \ + ((unsigned char *)(cp) + (i))[0] = (int)(val); \ + ((unsigned char *)(cp) + (i))[1] = (int)(val) >> 8; \ + ((signed char *)(cp) + (i))[2] = (int)(val) >> 16; \ + } while (0) +#endif + + +#define GETRAWSAMPLE(size, cp, i) ( \ + (size == 1) ? (int)GETINT8((cp), (i)) : \ + (size == 2) ? (int)GETINT16((cp), (i)) : \ + (size == 3) ? (int)GETINT24((cp), (i)) : \ + (int)GETINT32((cp), (i))) + +#define SETRAWSAMPLE(size, cp, i, val) do { \ + if (size == 1) \ + SETINT8((cp), (i), (val)); \ + else if (size == 2) \ + SETINT16((cp), (i), (val)); \ + else if (size == 3) \ + SETINT24((cp), (i), (val)); \ + else \ + SETINT32((cp), (i), (val)); \ + } while(0) + + +#define GETSAMPLE32(size, cp, i) ( \ + (size == 1) ? (int)GETINT8((cp), (i)) << 24 : \ + (size == 2) ? (int)GETINT16((cp), (i)) << 16 : \ + (size == 3) ? (int)GETINT24((cp), (i)) << 8 : \ + (int)GETINT32((cp), (i))) + +#define SETSAMPLE32(size, cp, i, val) do { \ + if (size == 1) \ + SETINT8((cp), (i), (val) >> 24); \ + else if (size == 2) \ + SETINT16((cp), (i), (val) >> 16); \ + else if (size == 3) \ + SETINT24((cp), (i), (val) >> 8); \ + else \ + SETINT32((cp), (i), (val)); \ + } while(0) + static PyObject *AudioopError; static int audioop_check_size(int size) { - if (size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + if (size < 1 || size > 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2, 3 or 4"); return 0; } else @@ -340,7 +394,7 @@ { signed char *cp; Py_ssize_t len, i; - int size, val = 0; + int size; if ( !PyArg_ParseTuple(args, "s#in:getsample", &cp, &len, &size, &i) ) return 0; @@ -350,10 +404,7 @@ PyErr_SetString(AudioopError, "Index out of range"); return 0; } - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i*2); - else if ( size == 4 ) val = (int)*LONGP(cp, i*4); - return PyLong_FromLong(val); + return PyLong_FromLong(GETRAWSAMPLE(size, cp, i*size)); } static PyObject * @@ -361,17 +412,15 @@ { signed char *cp; Py_ssize_t len, i; - int size, val = 0; + int size; unsigned int absval, max = 0; if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) ) return 0; if (!audioop_check_parameters(len, size)) return NULL; - for ( i=0; i max) max = absval; @@ -384,7 +433,7 @@ { signed char *cp; Py_ssize_t len, i; - int size, val = 0; + int size; int min = 0x7fffffff, max = -0x80000000; if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size)) @@ -392,9 +441,7 @@ if (!audioop_check_parameters(len, size)) return NULL; for (i = 0; i < len; i += size) { - if (size == 1) val = (int) *CHARP(cp, i); - else if (size == 2) val = (int) *SHORTP(cp, i); - else if (size == 4) val = (int) *LONGP(cp, i); + int val = GETRAWSAMPLE(size, cp, i); if (val > max) max = val; if (val < min) min = val; } @@ -406,24 +453,20 @@ { signed char *cp; Py_ssize_t len, i; - int size, val = 0; - double avg = 0.0; + int size, avg; + double sum = 0.0; if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) ) return 0; if (!audioop_check_parameters(len, size)) return NULL; - for ( i=0; i 0,1 */ - for ( i=0; i> 7; - else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15; - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31; - val = val & 1; - if ( val != prevval ) ncross++; + for (i = 0; i < len; i += size) { + int val = GETRAWSAMPLE(size, cp, i) < 0; + if (val != prevval) ncross++; prevval = val; } return PyLong_FromSsize_t(ncross); @@ -762,8 +797,8 @@ { signed char *cp, *ncp; Py_ssize_t len, i; - int size, val = 0; - double factor, fval, maxval, minval; + int size; + double factor, maxval, minval; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size, &factor ) ) @@ -779,16 +814,11 @@ return 0; ncp = (signed char *)PyBytes_AsString(rv); - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = (int)*LONGP(cp, i); - fval = (double)val*factor; - val = (int)floor(fbound(fval, minval, maxval)); - if ( size == 1 ) *CHARP(ncp, i) = (signed char)val; - else if ( size == 2 ) *SHORTP(ncp, i) = (short)val; - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val; + for (i = 0; i < len; i += size) { + double val = GETRAWSAMPLE(size, cp, i); + val *= factor; + val = floor(fbound(val, minval, maxval)); + SETRAWSAMPLE(size, ncp, i, (int)val); } return rv; } @@ -799,8 +829,8 @@ Py_buffer pcp; signed char *cp, *ncp; Py_ssize_t len, i; - int size, val1 = 0, val2 = 0; - double fac1, fac2, fval, maxval, minval; + int size; + double fac1, fac2, maxval, minval; PyObject *rv; if ( !PyArg_ParseTuple(args, "s*idd:tomono", @@ -828,19 +858,12 @@ } ncp = (signed char *)PyBytes_AsString(rv); - - for ( i=0; i < len; i += size*2 ) { - if ( size == 1 ) val1 = (int)*CHARP(cp, i); - else if ( size == 2 ) val1 = (int)*SHORTP(cp, i); - else if ( size == 4 ) val1 = (int)*LONGP(cp, i); - if ( size == 1 ) val2 = (int)*CHARP(cp, i+1); - else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2); - else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4); - fval = (double)val1*fac1 + (double)val2*fac2; - val1 = (int)floor(fbound(fval, minval, maxval)); - if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1; - else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1; - else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1; + for (i = 0; i < len; i += size*2) { + double val1 = GETRAWSAMPLE(size, cp, i); + double val2 = GETRAWSAMPLE(size, cp, i + size); + double val = val1*fac1 + val2*fac2; + val = floor(fbound(val, minval, maxval)); + SETRAWSAMPLE(size, ncp, i/2, val); } PyBuffer_Release(&pcp); return rv; @@ -851,8 +874,8 @@ { signed char *cp, *ncp; Py_ssize_t len, i; - int size, val1, val2, val = 0; - double fac1, fac2, fval, maxval, minval; + int size; + double fac1, fac2, maxval, minval; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#idd:tostereo", @@ -875,25 +898,12 @@ return 0; ncp = (signed char *)PyBytes_AsString(rv); - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = (int)*LONGP(cp, i); - - fval = (double)val*fac1; - val1 = (int)floor(fbound(fval, minval, maxval)); - - fval = (double)val*fac2; - val2 = (int)floor(fbound(fval, minval, maxval)); - - if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1; - else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1; - else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1; - - if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2; - else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2; - else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2; + for (i = 0; i < len; i += size) { + double val = GETRAWSAMPLE(size, cp, i); + int val1 = (int)floor(fbound(val*fac1, minval, maxval)); + int val2 = (int)floor(fbound(val*fac2, minval, maxval)); + SETRAWSAMPLE(size, ncp, i*2, val1); + SETRAWSAMPLE(size, ncp, i*2 + size, val2); } return rv; } @@ -903,7 +913,7 @@ { signed char *cp1, *cp2, *ncp; Py_ssize_t len1, len2, i; - int size, val1 = 0, val2 = 0, minval, maxval, newval; + int size, minval, maxval, newval; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#s#i:add", @@ -924,14 +934,9 @@ return 0; ncp = (signed char *)PyBytes_AsString(rv); - for ( i=0; i < len1; i += size ) { - if ( size == 1 ) val1 = (int)*CHARP(cp1, i); - else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i); - else if ( size == 4 ) val1 = (int)*LONGP(cp1, i); - - if ( size == 1 ) val2 = (int)*CHARP(cp2, i); - else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i); - else if ( size == 4 ) val2 = (int)*LONGP(cp2, i); + for (i = 0; i < len1; i += size) { + int val1 = GETRAWSAMPLE(size, cp1, i); + int val2 = GETRAWSAMPLE(size, cp2, i); if (size < 4) { newval = val1 + val2; @@ -947,9 +952,7 @@ newval = (int)floor(fbound(fval, minval, maxval)); } - if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval; - else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval; - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval; + SETRAWSAMPLE(size, ncp, i, newval); } return rv; } @@ -977,18 +980,28 @@ mask = masks[size]; - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (unsigned int)(unsigned char)*CHARP(cp, i); - else if ( size == 2 ) val = (unsigned int)(unsigned short)*SHORTP(cp, i); - else if ( size == 4 ) val = (unsigned int)(Py_UInt32)*LONGP(cp, i); + for (i = 0; i < len; i += size) { + if (size == 1) + val = GETINTX(unsigned char, cp, i); + else if (size == 2) + val = GETINTX(unsigned short, cp, i); + else if (size == 2) + val = ((unsigned int)GETINT24(cp, i)) & 0xffffffu; + else + val = GETINTX(PY_UINT32_T, cp, i); val += (unsigned int)bias; /* wrap around in case of overflow */ val &= mask; - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(unsigned char)val; - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(unsigned short)val; - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(Py_UInt32)val; + if (size == 1) + SETINTX(unsigned char, ncp, i, val); + else if (size == 2) + SETINTX(unsigned short, ncp, i, val); + else if (size == 2) + SETINT24(ncp, i, (int)val); + else + SETINTX(PY_UINT32_T, ncp, i, val); } return rv; } @@ -998,8 +1011,8 @@ { signed char *cp; unsigned char *ncp; - Py_ssize_t len, i, j; - int size, val = 0; + Py_ssize_t len, i; + int size; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#i:reverse", @@ -1014,16 +1027,9 @@ return 0; ncp = (unsigned char *)PyBytes_AsString(rv); - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 24; - else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) << 16; - else if ( size == 4 ) val = (int)*LONGP(cp, i); - - j = len - i - size; - - if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 24); - else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val >> 16); - else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)val; + for (i = 0; i < len; i += size) { + int val = GETRAWSAMPLE(size, cp, i); + SETRAWSAMPLE(size, ncp, len - i - size, val); } return rv; } @@ -1034,7 +1040,7 @@ signed char *cp; unsigned char *ncp; Py_ssize_t len, i, j; - int size, size2, val = 0; + int size, size2; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#ii:lin2lin", @@ -1056,14 +1062,9 @@ return 0; ncp = (unsigned char *)PyBytes_AsString(rv); - for ( i=0, j=0; i < len; i += size, j += size2 ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 24; - else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) << 16; - else if ( size == 4 ) val = (int)*LONGP(cp, i); - - if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 24); - else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val >> 16); - else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)val; + for (i = j = 0; i < len; i += size, j += size2) { + int val = GETSAMPLE32(size, cp, i); + SETSAMPLE32(size2, ncp, j, val); } return rv; } @@ -1224,12 +1225,7 @@ } for (chan = 0; chan < nchannels; chan++) { prev_i[chan] = cur_i[chan]; - if (size == 1) - cur_i[chan] = ((int)*CHARP(cp, 0)) << 24; - else if (size == 2) - cur_i[chan] = ((int)*SHORTP(cp, 0)) << 16; - else if (size == 4) - cur_i[chan] = (int)*LONGP(cp, 0); + cur_i[chan] = GETSAMPLE32(size, cp, 0); cp += size; /* implements a simple digital filter */ cur_i[chan] = (int)( @@ -1245,12 +1241,7 @@ cur_o = (int)(((double)prev_i[chan] * (double)d + (double)cur_i[chan] * (double)(outrate - d)) / (double)outrate); - if (size == 1) - *CHARP(ncp, 0) = (signed char)(cur_o >> 24); - else if (size == 2) - *SHORTP(ncp, 0) = (short)(cur_o >> 16); - else if (size == 4) - *LONGP(ncp, 0) = (Py_Int32)(cur_o); + SETSAMPLE32(size, ncp, 0, cur_o); ncp += size; } d -= inrate; @@ -1268,7 +1259,7 @@ signed char *cp; unsigned char *ncp; Py_ssize_t len, i; - int size, val = 0; + int size; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw", @@ -1283,12 +1274,9 @@ return 0; ncp = (unsigned char *)PyBytes_AsString(rv); - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - *ncp++ = st_14linear2ulaw(val); + for (i = 0; i < len; i += size) { + int val = GETSAMPLE32(size, cp, i); + *ncp++ = st_14linear2ulaw(val >> 18); } return rv; } @@ -1297,10 +1285,9 @@ audioop_ulaw2lin(PyObject *self, PyObject *args) { unsigned char *cp; - unsigned char cval; signed char *ncp; Py_ssize_t len, i; - int size, val; + int size; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin", @@ -1320,13 +1307,9 @@ return 0; ncp = (signed char *)PyBytes_AsString(rv); - for ( i=0; i < len*size; i += size ) { - cval = *cp++; - val = st_ulaw2linear16(cval); - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); + for (i = 0; i < len*size; i += size) { + int val = st_ulaw2linear16(*cp++) << 16; + SETSAMPLE32(size, ncp, i, val); } return rv; } @@ -1337,7 +1320,7 @@ signed char *cp; unsigned char *ncp; Py_ssize_t len, i; - int size, val = 0; + int size; PyObject *rv; if ( !PyArg_ParseTuple(args, "s#i:lin2alaw", @@ -1352,12 +1335,9 @@ return 0; ncp = (unsigned char *)PyBytes_AsString(rv); - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - *ncp++ = st_linear2alaw(val); + for (i = 0; i < len; i += size) { + int val = GETSAMPLE32(size, cp, i); + *ncp++ = st_linear2alaw(val >> 19); } return rv; } @@ -1366,7 +1346,6 @@ audioop_alaw2lin(PyObject *self, PyObject *args) { unsigned char *cp; - unsigned char cval; signed char *ncp; Py_ssize_t len, i; int size, val; @@ -1389,13 +1368,9 @@ return 0; ncp = (signed char *)PyBytes_AsString(rv); - for ( i=0; i < len*size; i += size ) { - cval = *cp++; - val = st_alaw2linear16(cval); - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); + for (i = 0; i < len*size; i += size) { + val = st_alaw2linear16(*cp++) << 16; + SETSAMPLE32(size, ncp, i, val); } return rv; } @@ -1406,7 +1381,7 @@ signed char *cp; signed char *ncp; Py_ssize_t len, i; - int size, val = 0, step, valpred, delta, + int size, step, valpred, delta, index, sign, vpdiff, diff; PyObject *rv, *state, *str; int outputbuffer = 0, bufferstep; @@ -1434,15 +1409,18 @@ step = stepsizeTable[index]; bufferstep = 1; - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + for (i = 0; i < len; i += size) { + int val = GETSAMPLE32(size, cp, i) >> 16; /* Step 1 - compute difference with previous value */ - diff = val - valpred; - sign = (diff < 0) ? 8 : 0; - if ( sign ) diff = (-diff); + if (val < valpred) { + diff = valpred - val; + sign = 8; + } + else { + diff = val - valpred; + sign = 0; + } /* Step 2 - Divide and clamp */ /* Note: @@ -1511,7 +1489,7 @@ { signed char *cp; signed char *ncp; - Py_ssize_t len, i; + Py_ssize_t len, i, outlen; int size, valpred, step, delta, index, sign, vpdiff; PyObject *rv, *str, *state; int inputbuffer = 0, bufferstep; @@ -1536,7 +1514,8 @@ "not enough memory for output buffer"); return 0; } - str = PyBytes_FromStringAndSize(NULL, len*size*2); + outlen = len*size*2; + str = PyBytes_FromStringAndSize(NULL, outlen); if ( str == 0 ) return 0; ncp = (signed char *)PyBytes_AsString(str); @@ -1544,7 +1523,7 @@ step = stepsizeTable[index]; bufferstep = 0; - for ( i=0; i < len*size*2; i += size ) { + for (i = 0; i < outlen; i += size) { /* Step 1 - get the delta value and compute next index */ if ( bufferstep ) { delta = inputbuffer & 0xf; @@ -1589,9 +1568,7 @@ step = stepsizeTable[index]; /* Step 6 - Output value */ - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16); + SETSAMPLE32(size, ncp, i, valpred << 16); } rv = Py_BuildValue("(O(ii))", str, valpred, index); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:17:20 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 20:17:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fixed_tests_fo?= =?utf-8?q?r_issue_=2319279=2E?= Message-ID: <3d2C4w5x3tzR4L@mail.python.org> http://hg.python.org/cpython/rev/73ab6aba24e5 changeset: 86486:73ab6aba24e5 branch: 3.3 parent: 86480:6971d55fff29 user: Serhiy Storchaka date: Sat Oct 19 21:14:57 2013 +0300 summary: Fixed tests for issue #19279. files: Lib/test/test_codecs.py | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -840,10 +840,9 @@ (b'a+////,+IKw-b', 'a\uffff\ufffd\u20acb'), ] for raw, expected in tests: - with self.subTest(raw=raw): - self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, - raw, 'strict', True) - self.assertEqual(raw.decode('utf-7', 'replace'), expected) + self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode, + raw, 'strict', True) + self.assertEqual(raw.decode('utf-7', 'replace'), expected) def test_nonbmp(self): self.assertEqual('\U000104A0'.encode(self.encoding), b'+2AHcoA-') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:17:22 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 20:17:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3d2C4y0gPCzR4L@mail.python.org> http://hg.python.org/cpython/rev/53c4b7132a19 changeset: 86487:53c4b7132a19 parent: 86485:e1fa70053828 parent: 86486:73ab6aba24e5 user: Serhiy Storchaka date: Sat Oct 19 21:15:55 2013 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:39:54 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sat, 19 Oct 2013 20:39:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Restore_prototypes_for_the?= =?utf-8?q?_=27openpty=27_and_=27forkpty=27_on_BSDI_=28broken_in_issue?= Message-ID: <3d2CZy7241z7LjS@mail.python.org> http://hg.python.org/cpython/rev/8bd69bd6e129 changeset: 86488:8bd69bd6e129 user: Serhiy Storchaka date: Sat Oct 19 21:39:31 2013 +0300 summary: Restore prototypes for the 'openpty' and 'forkpty' on BSDI (broken in issue #1772673). files: Include/pyport.h | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h --- a/Include/pyport.h +++ b/Include/pyport.h @@ -673,10 +673,8 @@ /* BSDI does not supply a prototype for the 'openpty' and 'forkpty' functions, even though they are included in libutil. */ #include -extern int openpty(int *, int *, char *, - const struct termios *, const struct winsize *); -extern pid_t forkpty(int *, char *, - const struct termios *, const struct winsize *); +extern int openpty(int *, int *, char *, struct termios *, struct winsize *); +extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 20:50:27 2013 From: python-checkins at python.org (larry.hastings) Date: Sat, 19 Oct 2013 20:50:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318606=3A_Add_the_?= =?utf-8?q?new_=22statistics=22_module_=28PEP_450=29=2E__Contributed?= Message-ID: <3d2Cq7412nz7LjR@mail.python.org> http://hg.python.org/cpython/rev/685e044bed5e changeset: 86489:685e044bed5e user: Larry Hastings date: Sat Oct 19 11:50:09 2013 -0700 summary: Issue #18606: Add the new "statistics" module (PEP 450). Contributed by Steven D'Aprano. files: Doc/library/numeric.rst | 1 + Doc/library/statistics.rst | 463 ++++++ Lib/statistics.py | 612 +++++++++ Lib/test/test_statistics.py | 1534 +++++++++++++++++++++++ Misc/NEWS | 3 + 5 files changed, 2613 insertions(+), 0 deletions(-) diff --git a/Doc/library/numeric.rst b/Doc/library/numeric.rst --- a/Doc/library/numeric.rst +++ b/Doc/library/numeric.rst @@ -23,3 +23,4 @@ decimal.rst fractions.rst random.rst + statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst new file mode 100644 --- /dev/null +++ b/Doc/library/statistics.rst @@ -0,0 +1,463 @@ +:mod:`statistics` --- Mathematical statistics functions +======================================================= + +.. module:: statistics + :synopsis: mathematical statistics functions +.. moduleauthor:: Steven D'Aprano +.. sectionauthor:: Steven D'Aprano + +.. versionadded:: 3.4 + +.. testsetup:: * + + from statistics import * + __name__ = '' + +**Source code:** :source:`Lib/statistics.py` + +-------------- + +This module provides functions for calculating mathematical statistics of +numeric (:class:`Real`-valued) data. + +Averages and measures of central location +----------------------------------------- + +These functions calculate an average or typical value from a population +or sample. + +======================= ============================================= +:func:`mean` Arithmetic mean ("average") of data. +:func:`median` Median (middle value) of data. +:func:`median_low` Low median of data. +:func:`median_high` High median of data. +:func:`median_grouped` Median, or 50th percentile, of grouped data. +:func:`mode` Mode (most common value) of discrete data. +======================= ============================================= + +:func:`mean` +~~~~~~~~~~~~ + +The :func:`mean` function calculates the arithmetic mean, commonly known +as the average, of its iterable argument: + +.. function:: mean(data) + + Return the sample arithmetic mean of *data*, a sequence or iterator + of real-valued numbers. + + The arithmetic mean is the sum of the data divided by the number of + data points. It is commonly called "the average", although it is only + one of many different mathematical averages. It is a measure of the + central location of the data. + + Some examples of use: + + .. doctest:: + + >>> mean([1, 2, 3, 4, 4]) + 2.8 + >>> mean([-1.0, 2.5, 3.25, 5.75]) + 2.625 + + >>> from fractions import Fraction as F + >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)]) + Fraction(13, 21) + + >>> from decimal import Decimal as D + >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")]) + Decimal('0.5625') + + .. note:: + + The mean is strongly effected by outliers and is not a robust + estimator for central location: the mean is not necessarily a + typical example of the data points. For more robust, although less + efficient, measures of central location, see :func:`median` and + :func:`mode`. (In this case, "efficient" refers to statistical + efficiency rather than computational efficiency.) + + The sample mean gives an unbiased estimate of the true population + mean, which means that, taken on average over all the possible + samples, ``mean(sample)`` converges on the true mean of the entire + population. If *data* represents the entire population rather than + a sample, then ``mean(data)`` is equivalent to calculating the true + population mean ?. + + If ``data`` is empty, :exc:`StatisticsError` will be raised. + +:func:`median` +~~~~~~~~~~~~~~ + +The :func:`median` function calculates the median, or middle, data point, +using the common "mean of middle two" method. + + .. seealso:: + + :func:`median_low` + + :func:`median_high` + + :func:`median_grouped` + +.. function:: median(data) + + Return the median (middle value) of numeric data. + + The median is a robust measure of central location, and is less affected + by the presence of outliers in your data. When the number of data points + is odd, the middle data point is returned: + + .. doctest:: + + >>> median([1, 3, 5]) + 3 + + When the number of data points is even, the median is interpolated by + taking the average of the two middle values: + + .. doctest:: + + >>> median([1, 3, 5, 7]) + 4.0 + + This is suited for when your data is discrete, and you don't mind that + the median may not be an actual data point. + + If data is empty, :exc:`StatisticsError` is raised. + +:func:`median_low` +~~~~~~~~~~~~~~~~~~ + +The :func:`median_low` function calculates the low median without +interpolation. + +.. function:: median_low(data) + + Return the low median of numeric data. + + The low median is always a member of the data set. When the number + of data points is odd, the middle value is returned. When it is + even, the smaller of the two middle values is returned. + + .. doctest:: + + >>> median_low([1, 3, 5]) + 3 + >>> median_low([1, 3, 5, 7]) + 3 + + Use the low median when your data are discrete and you prefer the median + to be an actual data point rather than interpolated. + + If data is empty, :exc:`StatisticsError` is raised. + +:func:`median_high` +~~~~~~~~~~~~~~~~~~~ + +The :func:`median_high` function calculates the high median without +interpolation. + +.. function:: median_high(data) + + Return the high median of data. + + The high median is always a member of the data set. When the number of + data points is odd, the middle value is returned. When it is even, the + larger of the two middle values is returned. + + .. doctest:: + + >>> median_high([1, 3, 5]) + 3 + >>> median_high([1, 3, 5, 7]) + 5 + + Use the high median when your data are discrete and you prefer the median + to be an actual data point rather than interpolated. + + If data is empty, :exc:`StatisticsError` is raised. + +:func:`median_grouped` +~~~~~~~~~~~~~~~~~~~~~~ + +The :func:`median_grouped` function calculates the median of grouped data +as the 50th percentile, using interpolation. + +.. function:: median_grouped(data [, interval]) + + Return the median of grouped continuous data, calculated as the + 50th percentile. + + .. doctest:: + + >>> median_grouped([52, 52, 53, 54]) + 52.5 + + In the following example, the data are rounded, so that each value + represents the midpoint of data classes, e.g. 1 is the midpoint of the + class 0.5-1.5, 2 is the midpoint of 1.5-2.5, 3 is the midpoint of + 2.5-3.5, etc. With the data given, the middle value falls somewhere in + the class 3.5-4.5, and interpolation is used to estimate it: + + .. doctest:: + + >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) + 3.7 + + Optional argument ``interval`` represents the class interval, and + defaults to 1. Changing the class interval naturally will change the + interpolation: + + .. doctest:: + + >>> median_grouped([1, 3, 3, 5, 7], interval=1) + 3.25 + >>> median_grouped([1, 3, 3, 5, 7], interval=2) + 3.5 + + This function does not check whether the data points are at least + ``interval`` apart. + + .. impl-detail:: + + Under some circumstances, :func:`median_grouped` may coerce data + points to floats. This behaviour is likely to change in the future. + + .. seealso:: + + * "Statistics for the Behavioral Sciences", Frederick J Gravetter + and Larry B Wallnau (8th Edition). + + * Calculating the `median `_. + + * The `SSMEDIAN `_ + function in the Gnome Gnumeric spreadsheet, including + `this discussion `_. + + If data is empty, :exc:`StatisticsError` is raised. + +:func:`mode` +~~~~~~~~~~~~ + +The :func:`mode` function calculates the mode, or most common element, of +discrete or nominal data. The mode (when it exists) is the most typical +value, and is a robust measure of central location. + +.. function:: mode(data) + + Return the most common data point from discrete or nominal data. + + ``mode`` assumes discrete data, and returns a single value. This is the + standard treatment of the mode as commonly taught in schools: + + .. doctest:: + + >>> mode([1, 1, 2, 3, 3, 3, 3, 4]) + 3 + + The mode is unique in that it is the only statistic which also applies + to nominal (non-numeric) data: + + .. doctest:: + + >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) + 'red' + + If data is empty, or if there is not exactly one most common value, + :exc:`StatisticsError` is raised. + +Measures of spread +------------------ + +These functions calculate a measure of how much the population or sample +tends to deviate from the typical or average values. + +======================= ============================================= +:func:`pstdev` Population standard deviation of data. +:func:`pvariance` Population variance of data. +:func:`stdev` Sample standard deviation of data. +:func:`variance` Sample variance of data. +======================= ============================================= + +:func:`pstdev` +~~~~~~~~~~~~~~ + +The :func:`pstdev` function calculates the standard deviation of a +population. The standard deviation is equivalent to the square root of +the variance. + +.. function:: pstdev(data [, mu]) + + Return the square root of the population variance. See :func:`pvariance` + for arguments and other details. + + .. doctest:: + + >>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) + 0.986893273527251 + +:func:`pvariance` +~~~~~~~~~~~~~~~~~ + +The :func:`pvariance` function calculates the variance of a population. +Variance, or second moment about the mean, is a measure of the variability +(spread or dispersion) of data. A large variance indicates that the data is +spread out; a small variance indicates it is clustered closely around the +mean. + +.. function:: pvariance(data [, mu]) + + Return the population variance of *data*, a non-empty iterable of + real-valued numbers. + + If the optional second argument *mu* is given, it should be the mean + of *data*. If it is missing or None (the default), the mean is + automatically caclulated. + + Use this function to calculate the variance from the entire population. + To estimate the variance from a sample, the :func:`variance` function is + usually a better choice. + + Examples: + + .. doctest:: + + >>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25] + >>> pvariance(data) + 1.25 + + If you have already calculated the mean of your data, you can pass + it as the optional second argument *mu* to avoid recalculation: + + .. doctest:: + + >>> mu = mean(data) + >>> pvariance(data, mu) + 1.25 + + This function does not attempt to verify that you have passed the actual + mean as *mu*. Using arbitrary values for *mu* may lead to invalid or + impossible results. + + Decimals and Fractions are supported: + + .. doctest:: + + >>> from decimal import Decimal as D + >>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) + Decimal('24.815') + + >>> from fractions import Fraction as F + >>> pvariance([F(1, 4), F(5, 4), F(1, 2)]) + Fraction(13, 72) + + .. note:: + + When called with the entire population, this gives the population + variance ??. When called on a sample instead, this is the biased + sample variance s?, also known as variance with N degrees of freedom. + + If you somehow know the true population mean ?, you may use this + function to calculate the variance of a sample, giving the known + population mean as the second argument. Provided the data points are + representative (e.g. independent and identically distributed), the + result will be an unbiased estimate of the population variance. + + Raises :exc:`StatisticsError` if *data* is empty. + +:func:`stdev` +~~~~~~~~~~~~~~ + +The :func:`stdev` function calculates the standard deviation of a sample. +The standard deviation is equivalent to the square root of the variance. + +.. function:: stdev(data [, xbar]) + + Return the square root of the sample variance. See :func:`variance` for + arguments and other details. + + .. doctest:: + + >>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) + 1.0810874155219827 + +:func:`variance` +~~~~~~~~~~~~~~~~~ + +The :func:`variance` function calculates the variance of a sample. Variance, +or second moment about the mean, is a measure of the variability (spread or +dispersion) of data. A large variance indicates that the data is spread out; +a small variance indicates it is clustered closely around the mean. + +.. function:: variance(data [, xbar]) + + Return the sample variance of *data*, an iterable of at least two + real-valued numbers. + + If the optional second argument *xbar* is given, it should be the mean + of *data*. If it is missing or None (the default), the mean is + automatically caclulated. + + Use this function when your data is a sample from a population. To + calculate the variance from the entire population, see :func:`pvariance`. + + Examples: + + .. doctest:: + + >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5] + >>> variance(data) + 1.3720238095238095 + + If you have already calculated the mean of your data, you can pass + it as the optional second argument *xbar* to avoid recalculation: + + .. doctest:: + + >>> m = mean(data) + >>> variance(data, m) + 1.3720238095238095 + + This function does not attempt to verify that you have passed the actual + mean as *xbar*. Using arbitrary values for *xbar* can lead to invalid or + impossible results. + + Decimal and Fraction values are supported: + + .. doctest:: + + >>> from decimal import Decimal as D + >>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) + Decimal('31.01875') + + >>> from fractions import Fraction as F + >>> variance([F(1, 6), F(1, 2), F(5, 3)]) + Fraction(67, 108) + + .. note:: + + This is the sample variance s? with Bessel's correction, also known + as variance with N-1 degrees of freedom. Provided that the data + points are representative (e.g. independent and identically + distributed), the result should be an unbiased estimate of the true + population variance. + + If you somehow know the actual population mean ? you should pass it + to the :func:`pvariance` function as the *mu* parameter to get + the variance of a sample. + + Raises :exc:`StatisticsError` if *data* has fewer than two values. + +Exceptions +---------- + +A single exception is defined: + +:exc:`StatisticsError` + +Subclass of :exc:`ValueError` for statistics-related exceptions. + +.. + # This modelines must appear within the last ten lines of the file. + kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8; diff --git a/Lib/statistics.py b/Lib/statistics.py new file mode 100644 --- /dev/null +++ b/Lib/statistics.py @@ -0,0 +1,612 @@ +## Module statistics.py +## +## Copyright (c) 2013 Steven D'Aprano . +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + + +""" +Basic statistics module. + +This module provides functions for calculating statistics of data, including +averages, variance, and standard deviation. + +Calculating averages +-------------------- + +================== ============================================= +Function Description +================== ============================================= +mean Arithmetic mean (average) of data. +median Median (middle value) of data. +median_low Low median of data. +median_high High median of data. +median_grouped Median, or 50th percentile, of grouped data. +mode Mode (most common value) of data. +================== ============================================= + +Calculate the arithmetic mean ("the average") of data: + +>>> mean([-1.0, 2.5, 3.25, 5.75]) +2.625 + + +Calculate the standard median of discrete data: + +>>> median([2, 3, 4, 5]) +3.5 + + +Calculate the median, or 50th percentile, of data grouped into class intervals +centred on the data values provided. E.g. if your data points are rounded to +the nearest whole number: + +>>> median_grouped([2, 2, 3, 3, 3, 4]) #doctest: +ELLIPSIS +2.8333333333... + +This should be interpreted in this way: you have two data points in the class +interval 1.5-2.5, three data points in the class interval 2.5-3.5, and one in +the class interval 3.5-4.5. The median of these data points is 2.8333... + + +Calculating variability or spread +--------------------------------- + +================== ============================================= +Function Description +================== ============================================= +pvariance Population variance of data. +variance Sample variance of data. +pstdev Population standard deviation of data. +stdev Sample standard deviation of data. +================== ============================================= + +Calculate the standard deviation of sample data: + +>>> stdev([2.5, 3.25, 5.5, 11.25, 11.75]) #doctest: +ELLIPSIS +4.38961843444... + +If you have previously calculated the mean, you can pass it as the optional +second argument to the four "spread" functions to avoid recalculating it: + +>>> data = [1, 2, 2, 4, 4, 4, 5, 6] +>>> mu = mean(data) +>>> pvariance(data, mu) +2.5 + + +Exceptions +---------- + +A single exception is defined: StatisticsError is a subclass of ValueError. + +""" + +__all__ = [ 'StatisticsError', + 'pstdev', 'pvariance', 'stdev', 'variance', + 'median', 'median_low', 'median_high', 'median_grouped', + 'mean', 'mode', + ] + + +import collections +import math +import numbers +import operator + +from fractions import Fraction +from decimal import Decimal + + +# === Exceptions === + +class StatisticsError(ValueError): + pass + + +# === Private utilities === + +def _sum(data, start=0): + """_sum(data [, start]) -> value + + Return a high-precision sum of the given numeric data. If optional + argument ``start`` is given, it is added to the total. If ``data`` is + empty, ``start`` (defaulting to 0) is returned. + + + Examples + -------- + + >>> _sum([3, 2.25, 4.5, -0.5, 1.0], 0.75) + 11.0 + + Some sources of round-off error will be avoided: + + >>> _sum([1e50, 1, -1e50] * 1000) # Built-in sum returns zero. + 1000.0 + + Fractions and Decimals are also supported: + + >>> from fractions import Fraction as F + >>> _sum([F(2, 3), F(7, 5), F(1, 4), F(5, 6)]) + Fraction(63, 20) + + >>> from decimal import Decimal as D + >>> data = [D("0.1375"), D("0.2108"), D("0.3061"), D("0.0419")] + >>> _sum(data) + Decimal('0.6963') + + """ + n, d = _exact_ratio(start) + T = type(start) + partials = {d: n} # map {denominator: sum of numerators} + # Micro-optimizations. + coerce_types = _coerce_types + exact_ratio = _exact_ratio + partials_get = partials.get + # Add numerators for each denominator, and track the "current" type. + for x in data: + T = _coerce_types(T, type(x)) + n, d = exact_ratio(x) + partials[d] = partials_get(d, 0) + n + if None in partials: + assert issubclass(T, (float, Decimal)) + assert not math.isfinite(partials[None]) + return T(partials[None]) + total = Fraction() + for d, n in sorted(partials.items()): + total += Fraction(n, d) + if issubclass(T, int): + assert total.denominator == 1 + return T(total.numerator) + if issubclass(T, Decimal): + return T(total.numerator)/total.denominator + return T(total) + + +def _exact_ratio(x): + """Convert Real number x exactly to (numerator, denominator) pair. + + >>> _exact_ratio(0.25) + (1, 4) + + x is expected to be an int, Fraction, Decimal or float. + """ + try: + try: + # int, Fraction + return (x.numerator, x.denominator) + except AttributeError: + # float + try: + return x.as_integer_ratio() + except AttributeError: + # Decimal + try: + return _decimal_to_ratio(x) + except AttributeError: + msg = "can't convert type '{}' to numerator/denominator" + raise TypeError(msg.format(type(x).__name__)) from None + except (OverflowError, ValueError): + # INF or NAN + if __debug__: + # Decimal signalling NANs cannot be converted to float :-( + if isinstance(x, Decimal): + assert not x.is_finite() + else: + assert not math.isfinite(x) + return (x, None) + + +# FIXME This is faster than Fraction.from_decimal, but still too slow. +def _decimal_to_ratio(d): + """Convert Decimal d to exact integer ratio (numerator, denominator). + + >>> from decimal import Decimal + >>> _decimal_to_ratio(Decimal("2.6")) + (26, 10) + + """ + sign, digits, exp = d.as_tuple() + if exp in ('F', 'n', 'N'): # INF, NAN, sNAN + assert not d.is_finite() + raise ValueError + num = 0 + for digit in digits: + num = num*10 + digit + if sign: + num = -num + den = 10**-exp + return (num, den) + + +def _coerce_types(T1, T2): + """Coerce types T1 and T2 to a common type. + + >>> _coerce_types(int, float) + + + Coercion is performed according to this table, where "N/A" means + that a TypeError exception is raised. + + +----------+-----------+-----------+-----------+----------+ + | | int | Fraction | Decimal | float | + +----------+-----------+-----------+-----------+----------+ + | int | int | Fraction | Decimal | float | + | Fraction | Fraction | Fraction | N/A | float | + | Decimal | Decimal | N/A | Decimal | float | + | float | float | float | float | float | + +----------+-----------+-----------+-----------+----------+ + + Subclasses trump their parent class; two subclasses of the same + base class will be coerced to the second of the two. + + """ + # Get the common/fast cases out of the way first. + if T1 is T2: return T1 + if T1 is int: return T2 + if T2 is int: return T1 + # Subclasses trump their parent class. + if issubclass(T2, T1): return T2 + if issubclass(T1, T2): return T1 + # Floats trump everything else. + if issubclass(T2, float): return T2 + if issubclass(T1, float): return T1 + # Subclasses of the same base class give priority to the second. + if T1.__base__ is T2.__base__: return T2 + # Otherwise, just give up. + raise TypeError('cannot coerce types %r and %r' % (T1, T2)) + + +def _counts(data): + # Generate a table of sorted (value, frequency) pairs. + if data is None: + raise TypeError('None is not iterable') + table = collections.Counter(data).most_common() + if not table: + return table + # Extract the values with the highest frequency. + maxfreq = table[0][1] + for i in range(1, len(table)): + if table[i][1] != maxfreq: + table = table[:i] + break + return table + + +# === Measures of central tendency (averages) === + +def mean(data): + """Return the sample arithmetic mean of data. + + >>> mean([1, 2, 3, 4, 4]) + 2.8 + + >>> from fractions import Fraction as F + >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)]) + Fraction(13, 21) + + >>> from decimal import Decimal as D + >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")]) + Decimal('0.5625') + + If ``data`` is empty, StatisticsError will be raised. + """ + if iter(data) is data: + data = list(data) + n = len(data) + if n < 1: + raise StatisticsError('mean requires at least one data point') + return _sum(data)/n + + +# FIXME: investigate ways to calculate medians without sorting? Quickselect? +def median(data): + """Return the median (middle value) of numeric data. + + When the number of data points is odd, return the middle data point. + When the number of data points is even, the median is interpolated by + taking the average of the two middle values: + + >>> median([1, 3, 5]) + 3 + >>> median([1, 3, 5, 7]) + 4.0 + + """ + data = sorted(data) + n = len(data) + if n == 0: + raise StatisticsError("no median for empty data") + if n%2 == 1: + return data[n//2] + else: + i = n//2 + return (data[i - 1] + data[i])/2 + + +def median_low(data): + """Return the low median of numeric data. + + When the number of data points is odd, the middle value is returned. + When it is even, the smaller of the two middle values is returned. + + >>> median_low([1, 3, 5]) + 3 + >>> median_low([1, 3, 5, 7]) + 3 + + """ + data = sorted(data) + n = len(data) + if n == 0: + raise StatisticsError("no median for empty data") + if n%2 == 1: + return data[n//2] + else: + return data[n//2 - 1] + + +def median_high(data): + """Return the high median of data. + + When the number of data points is odd, the middle value is returned. + When it is even, the larger of the two middle values is returned. + + >>> median_high([1, 3, 5]) + 3 + >>> median_high([1, 3, 5, 7]) + 5 + + """ + data = sorted(data) + n = len(data) + if n == 0: + raise StatisticsError("no median for empty data") + return data[n//2] + + +def median_grouped(data, interval=1): + """"Return the 50th percentile (median) of grouped continuous data. + + >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) + 3.7 + >>> median_grouped([52, 52, 53, 54]) + 52.5 + + This calculates the median as the 50th percentile, and should be + used when your data is continuous and grouped. In the above example, + the values 1, 2, 3, etc. actually represent the midpoint of classes + 0.5-1.5, 1.5-2.5, 2.5-3.5, etc. The middle value falls somewhere in + class 3.5-4.5, and interpolation is used to estimate it. + + Optional argument ``interval`` represents the class interval, and + defaults to 1. Changing the class interval naturally will change the + interpolated 50th percentile value: + + >>> median_grouped([1, 3, 3, 5, 7], interval=1) + 3.25 + >>> median_grouped([1, 3, 3, 5, 7], interval=2) + 3.5 + + This function does not check whether the data points are at least + ``interval`` apart. + """ + data = sorted(data) + n = len(data) + if n == 0: + raise StatisticsError("no median for empty data") + elif n == 1: + return data[0] + # Find the value at the midpoint. Remember this corresponds to the + # centre of the class interval. + x = data[n//2] + for obj in (x, interval): + if isinstance(obj, (str, bytes)): + raise TypeError('expected number but got %r' % obj) + try: + L = x - interval/2 # The lower limit of the median interval. + except TypeError: + # Mixed type. For now we just coerce to float. + L = float(x) - float(interval)/2 + cf = data.index(x) # Number of values below the median interval. + # FIXME The following line could be more efficient for big lists. + f = data.count(x) # Number of data points in the median interval. + return L + interval*(n/2 - cf)/f + + +def mode(data): + """Return the most common data point from discrete or nominal data. + + ``mode`` assumes discrete data, and returns a single value. This is the + standard treatment of the mode as commonly taught in schools: + + >>> mode([1, 1, 2, 3, 3, 3, 3, 4]) + 3 + + This also works with nominal (non-numeric) data: + + >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) + 'red' + + If there is not exactly one most common value, ``mode`` will raise + StatisticsError. + """ + # Generate a table of sorted (value, frequency) pairs. + table = _counts(data) + if len(table) == 1: + return table[0][0] + elif table: + raise StatisticsError( + 'no unique mode; found %d equally common values' % len(table) + ) + else: + raise StatisticsError('no mode for empty data') + + +# === Measures of spread === + +# See http://mathworld.wolfram.com/Variance.html +# http://mathworld.wolfram.com/SampleVariance.html +# http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance +# +# Under no circumstances use the so-called "computational formula for +# variance", as that is only suitable for hand calculations with a small +# amount of low-precision data. It has terrible numeric properties. +# +# See a comparison of three computational methods here: +# http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ + +def _ss(data, c=None): + """Return sum of square deviations of sequence data. + + If ``c`` is None, the mean is calculated in one pass, and the deviations + from the mean are calculated in a second pass. Otherwise, deviations are + calculated from ``c`` as given. Use the second case with care, as it can + lead to garbage results. + """ + if c is None: + c = mean(data) + ss = _sum((x-c)**2 for x in data) + # The following sum should mathematically equal zero, but due to rounding + # error may not. + ss -= _sum((x-c) for x in data)**2/len(data) + assert not ss < 0, 'negative sum of square deviations: %f' % ss + return ss + + +def variance(data, xbar=None): + """Return the sample variance of data. + + data should be an iterable of Real-valued numbers, with at least two + values. The optional argument xbar, if given, should be the mean of + the data. If it is missing or None, the mean is automatically calculated. + + Use this function when your data is a sample from a population. To + calculate the variance from the entire population, see ``pvariance``. + + Examples: + + >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5] + >>> variance(data) + 1.3720238095238095 + + If you have already calculated the mean of your data, you can pass it as + the optional second argument ``xbar`` to avoid recalculating it: + + >>> m = mean(data) + >>> variance(data, m) + 1.3720238095238095 + + This function does not check that ``xbar`` is actually the mean of + ``data``. Giving arbitrary values for ``xbar`` may lead to invalid or + impossible results. + + Decimals and Fractions are supported: + + >>> from decimal import Decimal as D + >>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) + Decimal('31.01875') + + >>> from fractions import Fraction as F + >>> variance([F(1, 6), F(1, 2), F(5, 3)]) + Fraction(67, 108) + + """ + if iter(data) is data: + data = list(data) + n = len(data) + if n < 2: + raise StatisticsError('variance requires at least two data points') + ss = _ss(data, xbar) + return ss/(n-1) + + +def pvariance(data, mu=None): + """Return the population variance of ``data``. + + data should be an iterable of Real-valued numbers, with at least one + value. The optional argument mu, if given, should be the mean of + the data. If it is missing or None, the mean is automatically calculated. + + Use this function to calculate the variance from the entire population. + To estimate the variance from a sample, the ``variance`` function is + usually a better choice. + + Examples: + + >>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25] + >>> pvariance(data) + 1.25 + + If you have already calculated the mean of the data, you can pass it as + the optional second argument to avoid recalculating it: + + >>> mu = mean(data) + >>> pvariance(data, mu) + 1.25 + + This function does not check that ``mu`` is actually the mean of ``data``. + Giving arbitrary values for ``mu`` may lead to invalid or impossible + results. + + Decimals and Fractions are supported: + + >>> from decimal import Decimal as D + >>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) + Decimal('24.815') + + >>> from fractions import Fraction as F + >>> pvariance([F(1, 4), F(5, 4), F(1, 2)]) + Fraction(13, 72) + + """ + if iter(data) is data: + data = list(data) + n = len(data) + if n < 1: + raise StatisticsError('pvariance requires at least one data point') + ss = _ss(data, mu) + return ss/n + + +def stdev(data, xbar=None): + """Return the square root of the sample variance. + + See ``variance`` for arguments and other details. + + >>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) + 1.0810874155219827 + + """ + var = variance(data, xbar) + try: + return var.sqrt() + except AttributeError: + return math.sqrt(var) + + +def pstdev(data, mu=None): + """Return the square root of the population variance. + + See ``pvariance`` for arguments and other details. + + >>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) + 0.986893273527251 + + """ + var = pvariance(data, mu) + try: + return var.sqrt() + except AttributeError: + return math.sqrt(var) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_statistics.py @@ -0,0 +1,1534 @@ +"""Test suite for statistics module, including helper NumericTestCase and +approx_equal function. + +""" + +import collections +import decimal +import doctest +import math +import random +import types +import unittest + +from decimal import Decimal +from fractions import Fraction + + +# Module to be tested. +import statistics + + +# === Helper functions and class === + +def _calc_errors(actual, expected): + """Return the absolute and relative errors between two numbers. + + >>> _calc_errors(100, 75) + (25, 0.25) + >>> _calc_errors(100, 100) + (0, 0.0) + + Returns the (absolute error, relative error) between the two arguments. + """ + base = max(abs(actual), abs(expected)) + abs_err = abs(actual - expected) + rel_err = abs_err/base if base else float('inf') + return (abs_err, rel_err) + + +def approx_equal(x, y, tol=1e-12, rel=1e-7): + """approx_equal(x, y [, tol [, rel]]) => True|False + + Return True if numbers x and y are approximately equal, to within some + margin of error, otherwise return False. Numbers which compare equal + will also compare approximately equal. + + x is approximately equal to y if the difference between them is less than + an absolute error tol or a relative error rel, whichever is bigger. + + If given, both tol and rel must be finite, non-negative numbers. If not + given, default values are tol=1e-12 and rel=1e-7. + + >>> approx_equal(1.2589, 1.2587, tol=0.0003, rel=0) + True + >>> approx_equal(1.2589, 1.2587, tol=0.0001, rel=0) + False + + Absolute error is defined as abs(x-y); if that is less than or equal to + tol, x and y are considered approximately equal. + + Relative error is defined as abs((x-y)/x) or abs((x-y)/y), whichever is + smaller, provided x or y are not zero. If that figure is less than or + equal to rel, x and y are considered approximately equal. + + Complex numbers are not directly supported. If you wish to compare to + complex numbers, extract their real and imaginary parts and compare them + individually. + + NANs always compare unequal, even with themselves. Infinities compare + approximately equal if they have the same sign (both positive or both + negative). Infinities with different signs compare unequal; so do + comparisons of infinities with finite numbers. + """ + if tol < 0 or rel < 0: + raise ValueError('error tolerances must be non-negative') + # NANs are never equal to anything, approximately or otherwise. + if math.isnan(x) or math.isnan(y): + return False + # Numbers which compare equal also compare approximately equal. + if x == y: + # This includes the case of two infinities with the same sign. + return True + if math.isinf(x) or math.isinf(y): + # This includes the case of two infinities of opposite sign, or + # one infinity and one finite number. + return False + # Two finite numbers. + actual_error = abs(x - y) + allowed_error = max(tol, rel*max(abs(x), abs(y))) + return actual_error <= allowed_error + + +# This class exists only as somewhere to stick a docstring containing +# doctests. The following docstring and tests were originally in a separate +# module. Now that it has been merged in here, I need somewhere to hang the. +# docstring. Ultimately, this class will die, and the information below will +# either become redundant, or be moved into more appropriate places. +class _DoNothing: + """ + When doing numeric work, especially with floats, exact equality is often + not what you want. Due to round-off error, it is often a bad idea to try + to compare floats with equality. Instead the usual procedure is to test + them with some (hopefully small!) allowance for error. + + The ``approx_equal`` function allows you to specify either an absolute + error tolerance, or a relative error, or both. + + Absolute error tolerances are simple, but you need to know the magnitude + of the quantities being compared: + + >>> approx_equal(12.345, 12.346, tol=1e-3) + True + >>> approx_equal(12.345e6, 12.346e6, tol=1e-3) # tol is too small. + False + + Relative errors are more suitable when the values you are comparing can + vary in magnitude: + + >>> approx_equal(12.345, 12.346, rel=1e-4) + True + >>> approx_equal(12.345e6, 12.346e6, rel=1e-4) + True + + but a naive implementation of relative error testing can run into trouble + around zero. + + If you supply both an absolute tolerance and a relative error, the + comparison succeeds if either individual test succeeds: + + >>> approx_equal(12.345e6, 12.346e6, tol=1e-3, rel=1e-4) + True + + """ + pass + + + +# We prefer this for testing numeric values that may not be exactly equal, +# and avoid using TestCase.assertAlmostEqual, because it sucks :-) + +class NumericTestCase(unittest.TestCase): + """Unit test class for numeric work. + + This subclasses TestCase. In addition to the standard method + ``TestCase.assertAlmostEqual``, ``assertApproxEqual`` is provided. + """ + # By default, we expect exact equality, unless overridden. + tol = rel = 0 + + def assertApproxEqual( + self, first, second, tol=None, rel=None, msg=None + ): + """Test passes if ``first`` and ``second`` are approximately equal. + + This test passes if ``first`` and ``second`` are equal to + within ``tol``, an absolute error, or ``rel``, a relative error. + + If either ``tol`` or ``rel`` are None or not given, they default to + test attributes of the same name (by default, 0). + + The objects may be either numbers, or sequences of numbers. Sequences + are tested element-by-element. + + >>> class MyTest(NumericTestCase): + ... def test_number(self): + ... x = 1.0/6 + ... y = sum([x]*6) + ... self.assertApproxEqual(y, 1.0, tol=1e-15) + ... def test_sequence(self): + ... a = [1.001, 1.001e-10, 1.001e10] + ... b = [1.0, 1e-10, 1e10] + ... self.assertApproxEqual(a, b, rel=1e-3) + ... + >>> import unittest + >>> from io import StringIO # Suppress test runner output. + >>> suite = unittest.TestLoader().loadTestsFromTestCase(MyTest) + >>> unittest.TextTestRunner(stream=StringIO()).run(suite) + + + """ + if tol is None: + tol = self.tol + if rel is None: + rel = self.rel + if ( + isinstance(first, collections.Sequence) and + isinstance(second, collections.Sequence) + ): + check = self._check_approx_seq + else: + check = self._check_approx_num + check(first, second, tol, rel, msg) + + def _check_approx_seq(self, first, second, tol, rel, msg): + if len(first) != len(second): + standardMsg = ( + "sequences differ in length: %d items != %d items" + % (len(first), len(second)) + ) + msg = self._formatMessage(msg, standardMsg) + raise self.failureException(msg) + for i, (a,e) in enumerate(zip(first, second)): + self._check_approx_num(a, e, tol, rel, msg, i) + + def _check_approx_num(self, first, second, tol, rel, msg, idx=None): + if approx_equal(first, second, tol, rel): + # Test passes. Return early, we are done. + return None + # Otherwise we failed. + standardMsg = self._make_std_err_msg(first, second, tol, rel, idx) + msg = self._formatMessage(msg, standardMsg) + raise self.failureException(msg) + + @staticmethod + def _make_std_err_msg(first, second, tol, rel, idx): + # Create the standard error message for approx_equal failures. + assert first != second + template = ( + ' %r != %r\n' + ' values differ by more than tol=%r and rel=%r\n' + ' -> absolute error = %r\n' + ' -> relative error = %r' + ) + if idx is not None: + header = 'numeric sequences first differ at index %d.\n' % idx + template = header + template + # Calculate actual errors: + abs_err, rel_err = _calc_errors(first, second) + return template % (first, second, tol, rel, abs_err, rel_err) + + +# ======================== +# === Test the helpers === +# ======================== + + +# --- Tests for approx_equal --- + +class ApproxEqualSymmetryTest(unittest.TestCase): + # Test symmetry of approx_equal. + + def test_relative_symmetry(self): + # Check that approx_equal treats relative error symmetrically. + # (a-b)/a is usually not equal to (a-b)/b. Ensure that this + # doesn't matter. + # + # Note: the reason for this test is that an early version + # of approx_equal was not symmetric. A relative error test + # would pass, or fail, depending on which value was passed + # as the first argument. + # + args1 = [2456, 37.8, -12.45, Decimal('2.54'), Fraction(17, 54)] + args2 = [2459, 37.2, -12.41, Decimal('2.59'), Fraction(15, 54)] + assert len(args1) == len(args2) + for a, b in zip(args1, args2): + self.do_relative_symmetry(a, b) + + def do_relative_symmetry(self, a, b): + a, b = min(a, b), max(a, b) + assert a < b + delta = b - a # The absolute difference between the values. + rel_err1, rel_err2 = abs(delta/a), abs(delta/b) + # Choose an error margin halfway between the two. + rel = (rel_err1 + rel_err2)/2 + # Now see that values a and b compare approx equal regardless of + # which is given first. + self.assertTrue(approx_equal(a, b, tol=0, rel=rel)) + self.assertTrue(approx_equal(b, a, tol=0, rel=rel)) + + def test_symmetry(self): + # Test that approx_equal(a, b) == approx_equal(b, a) + args = [-23, -2, 5, 107, 93568] + delta = 2 + for x in args: + for type_ in (int, float, Decimal, Fraction): + x = type_(x)*100 + y = x + delta + r = abs(delta/max(x, y)) + # There are five cases to check: + # 1) actual error <= tol, <= rel + self.do_symmetry_test(x, y, tol=delta, rel=r) + self.do_symmetry_test(x, y, tol=delta+1, rel=2*r) + # 2) actual error > tol, > rel + self.do_symmetry_test(x, y, tol=delta-1, rel=r/2) + # 3) actual error <= tol, > rel + self.do_symmetry_test(x, y, tol=delta, rel=r/2) + # 4) actual error > tol, <= rel + self.do_symmetry_test(x, y, tol=delta-1, rel=r) + self.do_symmetry_test(x, y, tol=delta-1, rel=2*r) + # 5) exact equality test + self.do_symmetry_test(x, x, tol=0, rel=0) + self.do_symmetry_test(x, y, tol=0, rel=0) + + def do_symmetry_test(self, a, b, tol, rel): + template = "approx_equal comparisons don't match for %r" + flag1 = approx_equal(a, b, tol, rel) + flag2 = approx_equal(b, a, tol, rel) + self.assertEqual(flag1, flag2, template.format((a, b, tol, rel))) + + +class ApproxEqualExactTest(unittest.TestCase): + # Test the approx_equal function with exactly equal values. + # Equal values should compare as approximately equal. + # Test cases for exactly equal values, which should compare approx + # equal regardless of the error tolerances given. + + def do_exactly_equal_test(self, x, tol, rel): + result = approx_equal(x, x, tol=tol, rel=rel) + self.assertTrue(result, 'equality failure for x=%r' % x) + result = approx_equal(-x, -x, tol=tol, rel=rel) + self.assertTrue(result, 'equality failure for x=%r' % -x) + + def test_exactly_equal_ints(self): + # Test that equal int values are exactly equal. + for n in [42, 19740, 14974, 230, 1795, 700245, 36587]: + self.do_exactly_equal_test(n, 0, 0) + + def test_exactly_equal_floats(self): + # Test that equal float values are exactly equal. + for x in [0.42, 1.9740, 1497.4, 23.0, 179.5, 70.0245, 36.587]: + self.do_exactly_equal_test(x, 0, 0) + + def test_exactly_equal_fractions(self): + # Test that equal Fraction values are exactly equal. + F = Fraction + for f in [F(1, 2), F(0), F(5, 3), F(9, 7), F(35, 36), F(3, 7)]: + self.do_exactly_equal_test(f, 0, 0) + + def test_exactly_equal_decimals(self): + # Test that equal Decimal values are exactly equal. + D = Decimal + for d in map(D, "8.2 31.274 912.04 16.745 1.2047".split()): + self.do_exactly_equal_test(d, 0, 0) + + def test_exactly_equal_absolute(self): + # Test that equal values are exactly equal with an absolute error. + for n in [16, 1013, 1372, 1198, 971, 4]: + # Test as ints. + self.do_exactly_equal_test(n, 0.01, 0) + # Test as floats. + self.do_exactly_equal_test(n/10, 0.01, 0) + # Test as Fractions. + f = Fraction(n, 1234) + self.do_exactly_equal_test(f, 0.01, 0) + + def test_exactly_equal_absolute_decimals(self): + # Test equal Decimal values are exactly equal with an absolute error. + self.do_exactly_equal_test(Decimal("3.571"), Decimal("0.01"), 0) + self.do_exactly_equal_test(-Decimal("81.3971"), Decimal("0.01"), 0) + + def test_exactly_equal_relative(self): + # Test that equal values are exactly equal with a relative error. + for x in [8347, 101.3, -7910.28, Fraction(5, 21)]: + self.do_exactly_equal_test(x, 0, 0.01) + self.do_exactly_equal_test(Decimal("11.68"), 0, Decimal("0.01")) + + def test_exactly_equal_both(self): + # Test that equal values are equal when both tol and rel are given. + for x in [41017, 16.742, -813.02, Fraction(3, 8)]: + self.do_exactly_equal_test(x, 0.1, 0.01) + D = Decimal + self.do_exactly_equal_test(D("7.2"), D("0.1"), D("0.01")) + + +class ApproxEqualUnequalTest(unittest.TestCase): + # Unequal values should compare unequal with zero error tolerances. + # Test cases for unequal values, with exact equality test. + + def do_exactly_unequal_test(self, x): + for a in (x, -x): + result = approx_equal(a, a+1, tol=0, rel=0) + self.assertFalse(result, 'inequality failure for x=%r' % a) + + def test_exactly_unequal_ints(self): + # Test unequal int values are unequal with zero error tolerance. + for n in [951, 572305, 478, 917, 17240]: + self.do_exactly_unequal_test(n) + + def test_exactly_unequal_floats(self): + # Test unequal float values are unequal with zero error tolerance. + for x in [9.51, 5723.05, 47.8, 9.17, 17.24]: + self.do_exactly_unequal_test(x) + + def test_exactly_unequal_fractions(self): + # Test that unequal Fractions are unequal with zero error tolerance. + F = Fraction + for f in [F(1, 5), F(7, 9), F(12, 11), F(101, 99023)]: + self.do_exactly_unequal_test(f) + + def test_exactly_unequal_decimals(self): + # Test that unequal Decimals are unequal with zero error tolerance. + for d in map(Decimal, "3.1415 298.12 3.47 18.996 0.00245".split()): + self.do_exactly_unequal_test(d) + + +class ApproxEqualInexactTest(unittest.TestCase): + # Inexact test cases for approx_error. + # Test cases when comparing two values that are not exactly equal. + + # === Absolute error tests === + + def do_approx_equal_abs_test(self, x, delta): + template = "Test failure for x={!r}, y={!r}" + for y in (x + delta, x - delta): + msg = template.format(x, y) + self.assertTrue(approx_equal(x, y, tol=2*delta, rel=0), msg) + self.assertFalse(approx_equal(x, y, tol=delta/2, rel=0), msg) + + def test_approx_equal_absolute_ints(self): + # Test approximate equality of ints with an absolute error. + for n in [-10737, -1975, -7, -2, 0, 1, 9, 37, 423, 9874, 23789110]: + self.do_approx_equal_abs_test(n, 10) + self.do_approx_equal_abs_test(n, 2) + + def test_approx_equal_absolute_floats(self): + # Test approximate equality of floats with an absolute error. + for x in [-284.126, -97.1, -3.4, -2.15, 0.5, 1.0, 7.8, 4.23, 3817.4]: + self.do_approx_equal_abs_test(x, 1.5) + self.do_approx_equal_abs_test(x, 0.01) + self.do_approx_equal_abs_test(x, 0.0001) + + def test_approx_equal_absolute_fractions(self): + # Test approximate equality of Fractions with an absolute error. + delta = Fraction(1, 29) + numerators = [-84, -15, -2, -1, 0, 1, 5, 17, 23, 34, 71] + for f in (Fraction(n, 29) for n in numerators): + self.do_approx_equal_abs_test(f, delta) + self.do_approx_equal_abs_test(f, float(delta)) + + def test_approx_equal_absolute_decimals(self): + # Test approximate equality of Decimals with an absolute error. + delta = Decimal("0.01") + for d in map(Decimal, "1.0 3.5 36.08 61.79 7912.3648".split()): + self.do_approx_equal_abs_test(d, delta) + self.do_approx_equal_abs_test(-d, delta) + + def test_cross_zero(self): + # Test for the case of the two values having opposite signs. + self.assertTrue(approx_equal(1e-5, -1e-5, tol=1e-4, rel=0)) + + # === Relative error tests === + + def do_approx_equal_rel_test(self, x, delta): + template = "Test failure for x={!r}, y={!r}" + for y in (x*(1+delta), x*(1-delta)): + msg = template.format(x, y) + self.assertTrue(approx_equal(x, y, tol=0, rel=2*delta), msg) + self.assertFalse(approx_equal(x, y, tol=0, rel=delta/2), msg) + + def test_approx_equal_relative_ints(self): + # Test approximate equality of ints with a relative error. + self.assertTrue(approx_equal(64, 47, tol=0, rel=0.36)) + self.assertTrue(approx_equal(64, 47, tol=0, rel=0.37)) + # --- + self.assertTrue(approx_equal(449, 512, tol=0, rel=0.125)) + self.assertTrue(approx_equal(448, 512, tol=0, rel=0.125)) + self.assertFalse(approx_equal(447, 512, tol=0, rel=0.125)) + + def test_approx_equal_relative_floats(self): + # Test approximate equality of floats with a relative error. + for x in [-178.34, -0.1, 0.1, 1.0, 36.97, 2847.136, 9145.074]: + self.do_approx_equal_rel_test(x, 0.02) + self.do_approx_equal_rel_test(x, 0.0001) + + def test_approx_equal_relative_fractions(self): + # Test approximate equality of Fractions with a relative error. + F = Fraction + delta = Fraction(3, 8) + for f in [F(3, 84), F(17, 30), F(49, 50), F(92, 85)]: + for d in (delta, float(delta)): + self.do_approx_equal_rel_test(f, d) + self.do_approx_equal_rel_test(-f, d) + + def test_approx_equal_relative_decimals(self): + # Test approximate equality of Decimals with a relative error. + for d in map(Decimal, "0.02 1.0 5.7 13.67 94.138 91027.9321".split()): + self.do_approx_equal_rel_test(d, Decimal("0.001")) + self.do_approx_equal_rel_test(-d, Decimal("0.05")) + + # === Both absolute and relative error tests === + + # There are four cases to consider: + # 1) actual error <= both absolute and relative error + # 2) actual error <= absolute error but > relative error + # 3) actual error <= relative error but > absolute error + # 4) actual error > both absolute and relative error + + def do_check_both(self, a, b, tol, rel, tol_flag, rel_flag): + check = self.assertTrue if tol_flag else self.assertFalse + check(approx_equal(a, b, tol=tol, rel=0)) + check = self.assertTrue if rel_flag else self.assertFalse + check(approx_equal(a, b, tol=0, rel=rel)) + check = self.assertTrue if (tol_flag or rel_flag) else self.assertFalse + check(approx_equal(a, b, tol=tol, rel=rel)) + + def test_approx_equal_both1(self): + # Test actual error <= both absolute and relative error. + self.do_check_both(7.955, 7.952, 0.004, 3.8e-4, True, True) + self.do_check_both(-7.387, -7.386, 0.002, 0.0002, True, True) + + def test_approx_equal_both2(self): + # Test actual error <= absolute error but > relative error. + self.do_check_both(7.955, 7.952, 0.004, 3.7e-4, True, False) + + def test_approx_equal_both3(self): + # Test actual error <= relative error but > absolute error. + self.do_check_both(7.955, 7.952, 0.001, 3.8e-4, False, True) + + def test_approx_equal_both4(self): + # Test actual error > both absolute and relative error. + self.do_check_both(2.78, 2.75, 0.01, 0.001, False, False) + self.do_check_both(971.44, 971.47, 0.02, 3e-5, False, False) + + +class ApproxEqualSpecialsTest(unittest.TestCase): + # Test approx_equal with NANs and INFs and zeroes. + + def test_inf(self): + for type_ in (float, Decimal): + inf = type_('inf') + self.assertTrue(approx_equal(inf, inf)) + self.assertTrue(approx_equal(inf, inf, 0, 0)) + self.assertTrue(approx_equal(inf, inf, 1, 0.01)) + self.assertTrue(approx_equal(-inf, -inf)) + self.assertFalse(approx_equal(inf, -inf)) + self.assertFalse(approx_equal(inf, 1000)) + + def test_nan(self): + for type_ in (float, Decimal): + nan = type_('nan') + for other in (nan, type_('inf'), 1000): + self.assertFalse(approx_equal(nan, other)) + + def test_float_zeroes(self): + nzero = math.copysign(0.0, -1) + self.assertTrue(approx_equal(nzero, 0.0, tol=0.1, rel=0.1)) + + def test_decimal_zeroes(self): + nzero = Decimal("-0.0") + self.assertTrue(approx_equal(nzero, Decimal(0), tol=0.1, rel=0.1)) + + +class TestApproxEqualErrors(unittest.TestCase): + # Test error conditions of approx_equal. + + def test_bad_tol(self): + # Test negative tol raises. + self.assertRaises(ValueError, approx_equal, 100, 100, -1, 0.1) + + def test_bad_rel(self): + # Test negative rel raises. + self.assertRaises(ValueError, approx_equal, 100, 100, 1, -0.1) + + +# --- Tests for NumericTestCase --- + +# The formatting routine that generates the error messages is complex enough +# that it too needs testing. + +class TestNumericTestCase(unittest.TestCase): + # The exact wording of NumericTestCase error messages is *not* guaranteed, + # but we need to give them some sort of test to ensure that they are + # generated correctly. As a compromise, we look for specific substrings + # that are expected to be found even if the overall error message changes. + + def do_test(self, args): + actual_msg = NumericTestCase._make_std_err_msg(*args) + expected = self.generate_substrings(*args) + for substring in expected: + self.assertIn(substring, actual_msg) + + def test_numerictestcase_is_testcase(self): + # Ensure that NumericTestCase actually is a TestCase. + self.assertTrue(issubclass(NumericTestCase, unittest.TestCase)) + + def test_error_msg_numeric(self): + # Test the error message generated for numeric comparisons. + args = (2.5, 4.0, 0.5, 0.25, None) + self.do_test(args) + + def test_error_msg_sequence(self): + # Test the error message generated for sequence comparisons. + args = (3.75, 8.25, 1.25, 0.5, 7) + self.do_test(args) + + def generate_substrings(self, first, second, tol, rel, idx): + """Return substrings we expect to see in error messages.""" + abs_err, rel_err = _calc_errors(first, second) + substrings = [ + 'tol=%r' % tol, + 'rel=%r' % rel, + 'absolute error = %r' % abs_err, + 'relative error = %r' % rel_err, + ] + if idx is not None: + substrings.append('differ at index %d' % idx) + return substrings + + +# ======================================= +# === Tests for the statistics module === +# ======================================= + + +class GlobalsTest(unittest.TestCase): + module = statistics + expected_metadata = ["__doc__", "__all__"] + + def test_meta(self): + # Test for the existence of metadata. + for meta in self.expected_metadata: + self.assertTrue(hasattr(self.module, meta), + "%s not present" % meta) + + def test_check_all(self): + # Check everything in __all__ exists and is public. + module = self.module + for name in module.__all__: + # No private names in __all__: + self.assertFalse(name.startswith("_"), + 'private name "%s" in __all__' % name) + # And anything in __all__ must exist: + self.assertTrue(hasattr(module, name), + 'missing name "%s" in __all__' % name) + + +class DocTests(unittest.TestCase): + def test_doc_tests(self): + failed, tried = doctest.testmod(statistics) + self.assertGreater(tried, 0) + self.assertEqual(failed, 0) + +class StatisticsErrorTest(unittest.TestCase): + def test_has_exception(self): + errmsg = ( + "Expected StatisticsError to be a ValueError, but got a" + " subclass of %r instead." + ) + self.assertTrue(hasattr(statistics, 'StatisticsError')) + self.assertTrue( + issubclass(statistics.StatisticsError, ValueError), + errmsg % statistics.StatisticsError.__base__ + ) + + +# === Tests for private utility functions === + +class ExactRatioTest(unittest.TestCase): + # Test _exact_ratio utility. + + def test_int(self): + for i in (-20, -3, 0, 5, 99, 10**20): + self.assertEqual(statistics._exact_ratio(i), (i, 1)) + + def test_fraction(self): + numerators = (-5, 1, 12, 38) + for n in numerators: + f = Fraction(n, 37) + self.assertEqual(statistics._exact_ratio(f), (n, 37)) + + def test_float(self): + self.assertEqual(statistics._exact_ratio(0.125), (1, 8)) + self.assertEqual(statistics._exact_ratio(1.125), (9, 8)) + data = [random.uniform(-100, 100) for _ in range(100)] + for x in data: + num, den = statistics._exact_ratio(x) + self.assertEqual(x, num/den) + + def test_decimal(self): + D = Decimal + _exact_ratio = statistics._exact_ratio + self.assertEqual(_exact_ratio(D("0.125")), (125, 1000)) + self.assertEqual(_exact_ratio(D("12.345")), (12345, 1000)) + self.assertEqual(_exact_ratio(D("-1.98")), (-198, 100)) + + +class DecimalToRatioTest(unittest.TestCase): + # Test _decimal_to_ratio private function. + + def testSpecialsRaise(self): + # Test that NANs and INFs raise ValueError. + # Non-special values are covered by _exact_ratio above. + for d in (Decimal('NAN'), Decimal('sNAN'), Decimal('INF')): + self.assertRaises(ValueError, statistics._decimal_to_ratio, d) + + + +# === Tests for public functions === + +class UnivariateCommonMixin: + # Common tests for most univariate functions that take a data argument. + + def test_no_args(self): + # Fail if given no arguments. + self.assertRaises(TypeError, self.func) + + def test_empty_data(self): + # Fail when the data argument (first argument) is empty. + for empty in ([], (), iter([])): + self.assertRaises(statistics.StatisticsError, self.func, empty) + + def prepare_data(self): + """Return int data for various tests.""" + data = list(range(10)) + while data == sorted(data): + random.shuffle(data) + return data + + def test_no_inplace_modifications(self): + # Test that the function does not modify its input data. + data = self.prepare_data() + assert len(data) != 1 # Necessary to avoid infinite loop. + assert data != sorted(data) + saved = data[:] + assert data is not saved + _ = self.func(data) + self.assertListEqual(data, saved, "data has been modified") + + def test_order_doesnt_matter(self): + # Test that the order of data points doesn't change the result. + + # CAUTION: due to floating point rounding errors, the result actually + # may depend on the order. Consider this test representing an ideal. + # To avoid this test failing, only test with exact values such as ints + # or Fractions. + data = [1, 2, 3, 3, 3, 4, 5, 6]*100 + expected = self.func(data) + random.shuffle(data) + actual = self.func(data) + self.assertEqual(expected, actual) + + def test_type_of_data_collection(self): + # Test that the type of iterable data doesn't effect the result. + class MyList(list): + pass + class MyTuple(tuple): + pass + def generator(data): + return (obj for obj in data) + data = self.prepare_data() + expected = self.func(data) + for kind in (list, tuple, iter, MyList, MyTuple, generator): + result = self.func(kind(data)) + self.assertEqual(result, expected) + + def test_range_data(self): + # Test that functions work with range objects. + data = range(20, 50, 3) + expected = self.func(list(data)) + self.assertEqual(self.func(data), expected) + + def test_bad_arg_types(self): + # Test that function raises when given data of the wrong type. + + # Don't roll the following into a loop like this: + # for bad in list_of_bad: + # self.check_for_type_error(bad) + # + # Since assertRaises doesn't show the arguments that caused the test + # failure, it is very difficult to debug these test failures when the + # following are in a loop. + self.check_for_type_error(None) + self.check_for_type_error(23) + self.check_for_type_error(42.0) + self.check_for_type_error(object()) + + def check_for_type_error(self, *args): + self.assertRaises(TypeError, self.func, *args) + + def test_type_of_data_element(self): + # Check the type of data elements doesn't affect the numeric result. + # This is a weaker test than UnivariateTypeMixin.testTypesConserved, + # because it checks the numeric result by equality, but not by type. + class MyFloat(float): + def __truediv__(self, other): + return type(self)(super().__truediv__(other)) + def __add__(self, other): + return type(self)(super().__add__(other)) + __radd__ = __add__ + + raw = self.prepare_data() + expected = self.func(raw) + for kind in (float, MyFloat, Decimal, Fraction): + data = [kind(x) for x in raw] + result = type(expected)(self.func(data)) + self.assertEqual(result, expected) + + +class UnivariateTypeMixin: + """Mixin class for type-conserving functions. + + This mixin class holds test(s) for functions which conserve the type of + individual data points. E.g. the mean of a list of Fractions should itself + be a Fraction. + + Not all tests to do with types need go in this class. Only those that + rely on the function returning the same type as its input data. + """ + def test_types_conserved(self): + # Test that functions keeps the same type as their data points. + # (Excludes mixed data types.) This only tests the type of the return + # result, not the value. + class MyFloat(float): + def __truediv__(self, other): + return type(self)(super().__truediv__(other)) + def __sub__(self, other): + return type(self)(super().__sub__(other)) + def __rsub__(self, other): + return type(self)(super().__rsub__(other)) + def __pow__(self, other): + return type(self)(super().__pow__(other)) + def __add__(self, other): + return type(self)(super().__add__(other)) + __radd__ = __add__ + + data = self.prepare_data() + for kind in (float, Decimal, Fraction, MyFloat): + d = [kind(x) for x in data] + result = self.func(d) + self.assertIs(type(result), kind) + + +class TestSum(NumericTestCase, UnivariateCommonMixin, UnivariateTypeMixin): + # Test cases for statistics._sum() function. + + def setUp(self): + self.func = statistics._sum + + def test_empty_data(self): + # Override test for empty data. + for data in ([], (), iter([])): + self.assertEqual(self.func(data), 0) + self.assertEqual(self.func(data, 23), 23) + self.assertEqual(self.func(data, 2.3), 2.3) + + def test_ints(self): + self.assertEqual(self.func([1, 5, 3, -4, -8, 20, 42, 1]), 60) + self.assertEqual(self.func([4, 2, 3, -8, 7], 1000), 1008) + + def test_floats(self): + self.assertEqual(self.func([0.25]*20), 5.0) + self.assertEqual(self.func([0.125, 0.25, 0.5, 0.75], 1.5), 3.125) + + def test_fractions(self): + F = Fraction + self.assertEqual(self.func([Fraction(1, 1000)]*500), Fraction(1, 2)) + + def test_decimals(self): + D = Decimal + data = [D("0.001"), D("5.246"), D("1.702"), D("-0.025"), + D("3.974"), D("2.328"), D("4.617"), D("2.843"), + ] + self.assertEqual(self.func(data), Decimal("20.686")) + + def test_compare_with_math_fsum(self): + # Compare with the math.fsum function. + # Ideally we ought to get the exact same result, but sometimes + # we differ by a very slight amount :-( + data = [random.uniform(-100, 1000) for _ in range(1000)] + self.assertApproxEqual(self.func(data), math.fsum(data), rel=2e-16) + + def test_start_argument(self): + # Test that the optional start argument works correctly. + data = [random.uniform(1, 1000) for _ in range(100)] + t = self.func(data) + self.assertEqual(t+42, self.func(data, 42)) + self.assertEqual(t-23, self.func(data, -23)) + self.assertEqual(t+1e20, self.func(data, 1e20)) + + def test_strings_fail(self): + # Sum of strings should fail. + self.assertRaises(TypeError, self.func, [1, 2, 3], '999') + self.assertRaises(TypeError, self.func, [1, 2, 3, '999']) + + def test_bytes_fail(self): + # Sum of bytes should fail. + self.assertRaises(TypeError, self.func, [1, 2, 3], b'999') + self.assertRaises(TypeError, self.func, [1, 2, 3, b'999']) + + def test_mixed_sum(self): + # Mixed sums are allowed. + + # Careful here: order matters. Can't mix Fraction and Decimal directly, + # only after they're converted to float. + data = [1, 2, Fraction(1, 2), 3.0, Decimal("0.25")] + self.assertEqual(self.func(data), 6.75) + + +class SumInternalsTest(NumericTestCase): + # Test internals of the sum function. + + def test_ignore_instance_float_method(self): + # Test that __float__ methods on data instances are ignored. + + # Python typically calls __dunder__ methods on the class, not the + # instance. The ``sum`` implementation calls __float__ directly. To + # better match the behaviour of Python, we call it only on the class, + # not the instance. This test will fail if somebody "fixes" that code. + + # Create a fake __float__ method. + def __float__(self): + raise AssertionError('test fails') + + # Inject it into an instance. + class MyNumber(Fraction): + pass + x = MyNumber(3) + x.__float__ = types.MethodType(__float__, x) + + # Check it works as expected. + self.assertRaises(AssertionError, x.__float__) + self.assertEqual(float(x), 3.0) + # And now test the function. + self.assertEqual(statistics._sum([1.0, 2.0, x, 4.0]), 10.0) + + +class SumTortureTest(NumericTestCase): + def test_torture(self): + # Tim Peters' torture test for sum, and variants of same. + self.assertEqual(statistics._sum([1, 1e100, 1, -1e100]*10000), 20000.0) + self.assertEqual(statistics._sum([1e100, 1, 1, -1e100]*10000), 20000.0) + self.assertApproxEqual( + statistics._sum([1e-100, 1, 1e-100, -1]*10000), 2.0e-96, rel=5e-16 + ) + + +class SumSpecialValues(NumericTestCase): + # Test that sum works correctly with IEEE-754 special values. + + def test_nan(self): + for type_ in (float, Decimal): + nan = type_('nan') + result = statistics._sum([1, nan, 2]) + self.assertIs(type(result), type_) + self.assertTrue(math.isnan(result)) + + def check_infinity(self, x, inf): + """Check x is an infinity of the same type and sign as inf.""" + self.assertTrue(math.isinf(x)) + self.assertIs(type(x), type(inf)) + self.assertEqual(x > 0, inf > 0) + assert x == inf + + def do_test_inf(self, inf): + # Adding a single infinity gives infinity. + result = statistics._sum([1, 2, inf, 3]) + self.check_infinity(result, inf) + # Adding two infinities of the same sign also gives infinity. + result = statistics._sum([1, 2, inf, 3, inf, 4]) + self.check_infinity(result, inf) + + def test_float_inf(self): + inf = float('inf') + for sign in (+1, -1): + self.do_test_inf(sign*inf) + + def test_decimal_inf(self): + inf = Decimal('inf') + for sign in (+1, -1): + self.do_test_inf(sign*inf) + + def test_float_mismatched_infs(self): + # Test that adding two infinities of opposite sign gives a NAN. + inf = float('inf') + result = statistics._sum([1, 2, inf, 3, -inf, 4]) + self.assertTrue(math.isnan(result)) + + def test_decimal_mismatched_infs_to_nan(self): + # Test adding Decimal INFs with opposite sign returns NAN. + inf = Decimal('inf') + data = [1, 2, inf, 3, -inf, 4] + with decimal.localcontext(decimal.ExtendedContext): + self.assertTrue(math.isnan(statistics._sum(data))) + + def test_decimal_mismatched_infs_to_nan(self): + # Test adding Decimal INFs with opposite sign raises InvalidOperation. + inf = Decimal('inf') + data = [1, 2, inf, 3, -inf, 4] + with decimal.localcontext(decimal.BasicContext): + self.assertRaises(decimal.InvalidOperation, statistics._sum, data) + + def test_decimal_snan_raises(self): + # Adding sNAN should raise InvalidOperation. + sNAN = Decimal('sNAN') + data = [1, sNAN, 2] + self.assertRaises(decimal.InvalidOperation, statistics._sum, data) + + +# === Tests for averages === + +class AverageMixin(UnivariateCommonMixin): + # Mixin class holding common tests for averages. + + def test_single_value(self): + # Average of a single value is the value itself. + for x in (23, 42.5, 1.3e15, Fraction(15, 19), Decimal('0.28')): + self.assertEqual(self.func([x]), x) + + def test_repeated_single_value(self): + # The average of a single repeated value is the value itself. + for x in (3.5, 17, 2.5e15, Fraction(61, 67), Decimal('4.9712')): + for count in (2, 5, 10, 20): + data = [x]*count + self.assertEqual(self.func(data), x) + + +class TestMean(NumericTestCase, AverageMixin, UnivariateTypeMixin): + def setUp(self): + self.func = statistics.mean + + def test_torture_pep(self): + # "Torture Test" from PEP-450. + self.assertEqual(self.func([1e100, 1, 3, -1e100]), 1) + + def test_ints(self): + # Test mean with ints. + data = [0, 1, 2, 3, 3, 3, 4, 5, 5, 6, 7, 7, 7, 7, 8, 9] + random.shuffle(data) + self.assertEqual(self.func(data), 4.8125) + + def test_floats(self): + # Test mean with floats. + data = [17.25, 19.75, 20.0, 21.5, 21.75, 23.25, 25.125, 27.5] + random.shuffle(data) + self.assertEqual(self.func(data), 22.015625) + + def test_decimals(self): + # Test mean with ints. + D = Decimal + data = [D("1.634"), D("2.517"), D("3.912"), D("4.072"), D("5.813")] + random.shuffle(data) + self.assertEqual(self.func(data), D("3.5896")) + + def test_fractions(self): + # Test mean with Fractions. + F = Fraction + data = [F(1, 2), F(2, 3), F(3, 4), F(4, 5), F(5, 6), F(6, 7), F(7, 8)] + random.shuffle(data) + self.assertEqual(self.func(data), F(1479, 1960)) + + def test_inf(self): + # Test mean with infinities. + raw = [1, 3, 5, 7, 9] # Use only ints, to avoid TypeError later. + for kind in (float, Decimal): + for sign in (1, -1): + inf = kind("inf")*sign + data = raw + [inf] + result = self.func(data) + self.assertTrue(math.isinf(result)) + self.assertEqual(result, inf) + + def test_mismatched_infs(self): + # Test mean with infinities of opposite sign. + data = [2, 4, 6, float('inf'), 1, 3, 5, float('-inf')] + result = self.func(data) + self.assertTrue(math.isnan(result)) + + def test_nan(self): + # Test mean with NANs. + raw = [1, 3, 5, 7, 9] # Use only ints, to avoid TypeError later. + for kind in (float, Decimal): + inf = kind("nan") + data = raw + [inf] + result = self.func(data) + self.assertTrue(math.isnan(result)) + + def test_big_data(self): + # Test adding a large constant to every data point. + c = 1e9 + data = [3.4, 4.5, 4.9, 6.7, 6.8, 7.2, 8.0, 8.1, 9.4] + expected = self.func(data) + c + assert expected != c + result = self.func([x+c for x in data]) + self.assertEqual(result, expected) + + def test_doubled_data(self): + # Mean of [a,b,c...z] should be same as for [a,a,b,b,c,c...z,z]. + data = [random.uniform(-3, 5) for _ in range(1000)] + expected = self.func(data) + actual = self.func(data*2) + self.assertApproxEqual(actual, expected) + + +class TestMedian(NumericTestCase, AverageMixin): + # Common tests for median and all median.* functions. + def setUp(self): + self.func = statistics.median + + def prepare_data(self): + """Overload method from UnivariateCommonMixin.""" + data = super().prepare_data() + if len(data)%2 != 1: + data.append(2) + return data + + def test_even_ints(self): + # Test median with an even number of int data points. + data = [1, 2, 3, 4, 5, 6] + assert len(data)%2 == 0 + self.assertEqual(self.func(data), 3.5) + + def test_odd_ints(self): + # Test median with an odd number of int data points. + data = [1, 2, 3, 4, 5, 6, 9] + assert len(data)%2 == 1 + self.assertEqual(self.func(data), 4) + + def test_odd_fractions(self): + # Test median works with an odd number of Fractions. + F = Fraction + data = [F(1, 7), F(2, 7), F(3, 7), F(4, 7), F(5, 7)] + assert len(data)%2 == 1 + random.shuffle(data) + self.assertEqual(self.func(data), F(3, 7)) + + def test_even_fractions(self): + # Test median works with an even number of Fractions. + F = Fraction + data = [F(1, 7), F(2, 7), F(3, 7), F(4, 7), F(5, 7), F(6, 7)] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), F(1, 2)) + + def test_odd_decimals(self): + # Test median works with an odd number of Decimals. + D = Decimal + data = [D('2.5'), D('3.1'), D('4.2'), D('5.7'), D('5.8')] + assert len(data)%2 == 1 + random.shuffle(data) + self.assertEqual(self.func(data), D('4.2')) + + def test_even_decimals(self): + # Test median works with an even number of Decimals. + D = Decimal + data = [D('1.2'), D('2.5'), D('3.1'), D('4.2'), D('5.7'), D('5.8')] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), D('3.65')) + + +class TestMedianDataType(NumericTestCase, UnivariateTypeMixin): + # Test conservation of data element type for median. + def setUp(self): + self.func = statistics.median + + def prepare_data(self): + data = list(range(15)) + assert len(data)%2 == 1 + while data == sorted(data): + random.shuffle(data) + return data + + +class TestMedianLow(TestMedian, UnivariateTypeMixin): + def setUp(self): + self.func = statistics.median_low + + def test_even_ints(self): + # Test median_low with an even number of ints. + data = [1, 2, 3, 4, 5, 6] + assert len(data)%2 == 0 + self.assertEqual(self.func(data), 3) + + def test_even_fractions(self): + # Test median_low works with an even number of Fractions. + F = Fraction + data = [F(1, 7), F(2, 7), F(3, 7), F(4, 7), F(5, 7), F(6, 7)] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), F(3, 7)) + + def test_even_decimals(self): + # Test median_low works with an even number of Decimals. + D = Decimal + data = [D('1.1'), D('2.2'), D('3.3'), D('4.4'), D('5.5'), D('6.6')] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), D('3.3')) + + +class TestMedianHigh(TestMedian, UnivariateTypeMixin): + def setUp(self): + self.func = statistics.median_high + + def test_even_ints(self): + # Test median_high with an even number of ints. + data = [1, 2, 3, 4, 5, 6] + assert len(data)%2 == 0 + self.assertEqual(self.func(data), 4) + + def test_even_fractions(self): + # Test median_high works with an even number of Fractions. + F = Fraction + data = [F(1, 7), F(2, 7), F(3, 7), F(4, 7), F(5, 7), F(6, 7)] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), F(4, 7)) + + def test_even_decimals(self): + # Test median_high works with an even number of Decimals. + D = Decimal + data = [D('1.1'), D('2.2'), D('3.3'), D('4.4'), D('5.5'), D('6.6')] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), D('4.4')) + + +class TestMedianGrouped(TestMedian): + # Test median_grouped. + # Doesn't conserve data element types, so don't use TestMedianType. + def setUp(self): + self.func = statistics.median_grouped + + def test_odd_number_repeated(self): + # Test median.grouped with repeated median values. + data = [12, 13, 14, 14, 14, 15, 15] + assert len(data)%2 == 1 + self.assertEqual(self.func(data), 14) + #--- + data = [12, 13, 14, 14, 14, 14, 15] + assert len(data)%2 == 1 + self.assertEqual(self.func(data), 13.875) + #--- + data = [5, 10, 10, 15, 20, 20, 20, 20, 25, 25, 30] + assert len(data)%2 == 1 + self.assertEqual(self.func(data, 5), 19.375) + #--- + data = [16, 18, 18, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 26, 28] + assert len(data)%2 == 1 + self.assertApproxEqual(self.func(data, 2), 20.66666667, tol=1e-8) + + def test_even_number_repeated(self): + # Test median.grouped with repeated median values. + data = [5, 10, 10, 15, 20, 20, 20, 25, 25, 30] + assert len(data)%2 == 0 + self.assertApproxEqual(self.func(data, 5), 19.16666667, tol=1e-8) + #--- + data = [2, 3, 4, 4, 4, 5] + assert len(data)%2 == 0 + self.assertApproxEqual(self.func(data), 3.83333333, tol=1e-8) + #--- + data = [2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6] + assert len(data)%2 == 0 + self.assertEqual(self.func(data), 4.5) + #--- + data = [3, 4, 4, 4, 5, 5, 5, 5, 6, 6] + assert len(data)%2 == 0 + self.assertEqual(self.func(data), 4.75) + + def test_repeated_single_value(self): + # Override method from AverageMixin. + # Yet again, failure of median_grouped to conserve the data type + # causes me headaches :-( + for x in (5.3, 68, 4.3e17, Fraction(29, 101), Decimal('32.9714')): + for count in (2, 5, 10, 20): + data = [x]*count + self.assertEqual(self.func(data), float(x)) + + def test_odd_fractions(self): + # Test median_grouped works with an odd number of Fractions. + F = Fraction + data = [F(5, 4), F(9, 4), F(13, 4), F(13, 4), F(17, 4)] + assert len(data)%2 == 1 + random.shuffle(data) + self.assertEqual(self.func(data), 3.0) + + def test_even_fractions(self): + # Test median_grouped works with an even number of Fractions. + F = Fraction + data = [F(5, 4), F(9, 4), F(13, 4), F(13, 4), F(17, 4), F(17, 4)] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), 3.25) + + def test_odd_decimals(self): + # Test median_grouped works with an odd number of Decimals. + D = Decimal + data = [D('5.5'), D('6.5'), D('6.5'), D('7.5'), D('8.5')] + assert len(data)%2 == 1 + random.shuffle(data) + self.assertEqual(self.func(data), 6.75) + + def test_even_decimals(self): + # Test median_grouped works with an even number of Decimals. + D = Decimal + data = [D('5.5'), D('5.5'), D('6.5'), D('6.5'), D('7.5'), D('8.5')] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), 6.5) + #--- + data = [D('5.5'), D('5.5'), D('6.5'), D('7.5'), D('7.5'), D('8.5')] + assert len(data)%2 == 0 + random.shuffle(data) + self.assertEqual(self.func(data), 7.0) + + def test_interval(self): + # Test median_grouped with interval argument. + data = [2.25, 2.5, 2.5, 2.75, 2.75, 3.0, 3.0, 3.25, 3.5, 3.75] + self.assertEqual(self.func(data, 0.25), 2.875) + data = [2.25, 2.5, 2.5, 2.75, 2.75, 2.75, 3.0, 3.0, 3.25, 3.5, 3.75] + self.assertApproxEqual(self.func(data, 0.25), 2.83333333, tol=1e-8) + data = [220, 220, 240, 260, 260, 260, 260, 280, 280, 300, 320, 340] + self.assertEqual(self.func(data, 20), 265.0) + + +class TestMode(NumericTestCase, AverageMixin, UnivariateTypeMixin): + # Test cases for the discrete version of mode. + def setUp(self): + self.func = statistics.mode + + def prepare_data(self): + """Overload method from UnivariateCommonMixin.""" + # Make sure test data has exactly one mode. + return [1, 1, 1, 1, 3, 4, 7, 9, 0, 8, 2] + + def test_range_data(self): + # Override test from UnivariateCommonMixin. + data = range(20, 50, 3) + self.assertRaises(statistics.StatisticsError, self.func, data) + + def test_nominal_data(self): + # Test mode with nominal data. + data = 'abcbdb' + self.assertEqual(self.func(data), 'b') + data = 'fe fi fo fum fi fi'.split() + self.assertEqual(self.func(data), 'fi') + + def test_discrete_data(self): + # Test mode with discrete numeric data. + data = list(range(10)) + for i in range(10): + d = data + [i] + random.shuffle(d) + self.assertEqual(self.func(d), i) + + def test_bimodal_data(self): + # Test mode with bimodal data. + data = [1, 1, 2, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 9] + assert data.count(2) == data.count(6) == 4 + # Check for an exception. + self.assertRaises(statistics.StatisticsError, self.func, data) + + def test_unique_data_failure(self): + # Test mode exception when data points are all unique. + data = list(range(10)) + self.assertRaises(statistics.StatisticsError, self.func, data) + + def test_none_data(self): + # Test that mode raises TypeError if given None as data. + + # This test is necessary because the implementation of mode uses + # collections.Counter, which accepts None and returns an empty dict. + self.assertRaises(TypeError, self.func, None) + + +# === Tests for variances and standard deviations === + +class VarianceStdevMixin(UnivariateCommonMixin): + # Mixin class holding common tests for variance and std dev. + + # Subclasses should inherit from this before NumericTestClass, in order + # to see the rel attribute below. See testShiftData for an explanation. + + rel = 1e-12 + + def test_single_value(self): + # Deviation of a single value is zero. + for x in (11, 19.8, 4.6e14, Fraction(21, 34), Decimal('8.392')): + self.assertEqual(self.func([x]), 0) + + def test_repeated_single_value(self): + # The deviation of a single repeated value is zero. + for x in (7.2, 49, 8.1e15, Fraction(3, 7), Decimal('62.4802')): + for count in (2, 3, 5, 15): + data = [x]*count + self.assertEqual(self.func(data), 0) + + def test_domain_error_regression(self): + # Regression test for a domain error exception. + # (Thanks to Geremy Condra.) + data = [0.123456789012345]*10000 + # All the items are identical, so variance should be exactly zero. + # We allow some small round-off error, but not much. + result = self.func(data) + self.assertApproxEqual(result, 0.0, tol=5e-17) + self.assertGreaterEqual(result, 0) # A negative result must fail. + + def test_shift_data(self): + # Test that shifting the data by a constant amount does not affect + # the variance or stdev. Or at least not much. + + # Due to rounding, this test should be considered an ideal. We allow + # some tolerance away from "no change at all" by setting tol and/or rel + # attributes. Subclasses may set tighter or looser error tolerances. + raw = [1.03, 1.27, 1.94, 2.04, 2.58, 3.14, 4.75, 4.98, 5.42, 6.78] + expected = self.func(raw) + # Don't set shift too high, the bigger it is, the more rounding error. + shift = 1e5 + data = [x + shift for x in raw] + self.assertApproxEqual(self.func(data), expected) + + def test_shift_data_exact(self): + # Like test_shift_data, but result is always exact. + raw = [1, 3, 3, 4, 5, 7, 9, 10, 11, 16] + assert all(x==int(x) for x in raw) + expected = self.func(raw) + shift = 10**9 + data = [x + shift for x in raw] + self.assertEqual(self.func(data), expected) + + def test_iter_list_same(self): + # Test that iter data and list data give the same result. + + # This is an explicit test that iterators and lists are treated the + # same; justification for this test over and above the similar test + # in UnivariateCommonMixin is that an earlier design had variance and + # friends swap between one- and two-pass algorithms, which would + # sometimes give different results. + data = [random.uniform(-3, 8) for _ in range(1000)] + expected = self.func(data) + self.assertEqual(self.func(iter(data)), expected) + + +class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin): + # Tests for population variance. + def setUp(self): + self.func = statistics.pvariance + + def test_exact_uniform(self): + # Test the variance against an exact result for uniform data. + data = list(range(10000)) + random.shuffle(data) + expected = (10000**2 - 1)/12 # Exact value. + self.assertEqual(self.func(data), expected) + + def test_ints(self): + # Test population variance with int data. + data = [4, 7, 13, 16] + exact = 22.5 + self.assertEqual(self.func(data), exact) + + def test_fractions(self): + # Test population variance with Fraction data. + F = Fraction + data = [F(1, 4), F(1, 4), F(3, 4), F(7, 4)] + exact = F(3, 8) + result = self.func(data) + self.assertEqual(result, exact) + self.assertIsInstance(result, Fraction) + + def test_decimals(self): + # Test population variance with Decimal data. + D = Decimal + data = [D("12.1"), D("12.2"), D("12.5"), D("12.9")] + exact = D('0.096875') + result = self.func(data) + self.assertEqual(result, exact) + self.assertIsInstance(result, Decimal) + + +class TestVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin): + # Tests for sample variance. + def setUp(self): + self.func = statistics.variance + + def test_single_value(self): + # Override method from VarianceStdevMixin. + for x in (35, 24.7, 8.2e15, Fraction(19, 30), Decimal('4.2084')): + self.assertRaises(statistics.StatisticsError, self.func, [x]) + + def test_ints(self): + # Test sample variance with int data. + data = [4, 7, 13, 16] + exact = 30 + self.assertEqual(self.func(data), exact) + + def test_fractions(self): + # Test sample variance with Fraction data. + F = Fraction + data = [F(1, 4), F(1, 4), F(3, 4), F(7, 4)] + exact = F(1, 2) + result = self.func(data) + self.assertEqual(result, exact) + self.assertIsInstance(result, Fraction) + + def test_decimals(self): + # Test sample variance with Decimal data. + D = Decimal + data = [D(2), D(2), D(7), D(9)] + exact = 4*D('9.5')/D(3) + result = self.func(data) + self.assertEqual(result, exact) + self.assertIsInstance(result, Decimal) + + +class TestPStdev(VarianceStdevMixin, NumericTestCase): + # Tests for population standard deviation. + def setUp(self): + self.func = statistics.pstdev + + def test_compare_to_variance(self): + # Test that stdev is, in fact, the square root of variance. + data = [random.uniform(-17, 24) for _ in range(1000)] + expected = math.sqrt(statistics.pvariance(data)) + self.assertEqual(self.func(data), expected) + + +class TestStdev(VarianceStdevMixin, NumericTestCase): + # Tests for sample standard deviation. + def setUp(self): + self.func = statistics.stdev + + def test_single_value(self): + # Override method from VarianceStdevMixin. + for x in (81, 203.74, 3.9e14, Fraction(5, 21), Decimal('35.719')): + self.assertRaises(statistics.StatisticsError, self.func, [x]) + + def test_compare_to_variance(self): + # Test that stdev is, in fact, the square root of variance. + data = [random.uniform(-2, 9) for _ in range(1000)] + expected = math.sqrt(statistics.variance(data)) + self.assertEqual(self.func(data), expected) + + +# === Run tests === + +def load_tests(loader, tests, ignore): + """Used for doctest/unittest integration.""" + tests.addTests(doctest.DocTestSuite()) + return tests + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -59,6 +59,9 @@ Library ------- +- Issue #18606: Add the new "statistics" module (PEP 450). Contributed + by Steven D'Aprano. + - Issue #12866: The audioop module now supports 24-bit samples. - Issue #19254: Provide an optimized Python implementation of pbkdf2_hmac. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 21:10:32 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 21:10:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319304=3A_Fix_typo?= =?utf-8?q?s_noted_by_Claudiu_Popa=2E?= Message-ID: <3d2DGJ70j8z7LjR@mail.python.org> http://hg.python.org/cpython/rev/900460f0fb2a changeset: 86490:900460f0fb2a user: Ned Deily date: Sat Oct 19 12:10:01 2013 -0700 summary: Issue #19304: Fix typos noted by Claudiu Popa. files: Doc/library/statistics.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -313,7 +313,7 @@ If the optional second argument *mu* is given, it should be the mean of *data*. If it is missing or None (the default), the mean is - automatically caclulated. + automatically calculated. Use this function to calculate the variance from the entire population. To estimate the variance from a sample, the :func:`variance` function is @@ -397,7 +397,7 @@ If the optional second argument *xbar* is given, it should be the mean of *data*. If it is missing or None (the default), the mean is - automatically caclulated. + automatically calculated. Use this function when your data is a sample from a population. To calculate the variance from the entire population, see :func:`pvariance`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 21:20:23 2013 From: python-checkins at python.org (ned.deily) Date: Sat, 19 Oct 2013 21:20:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Issue_=2319303=3A_Fix_typ?= =?utf-8?q?o_noted_by_Martin_Matusiak=2E?= Message-ID: <3d2DTg3MNZz7LjX@mail.python.org> http://hg.python.org/devguide/rev/72c9907e208e changeset: 644:72c9907e208e user: Ned Deily date: Sat Oct 19 12:19:54 2013 -0700 summary: Issue #19303: Fix typo noted by Martin Matusiak. files: coverage.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/coverage.rst b/coverage.rst --- a/coverage.rst +++ b/coverage.rst @@ -90,7 +90,7 @@ hg clone https://bitbucket.org/ned/coveragepy -Another option is to use an installed copy of coverage.py if you already an +Another option is to use an installed copy of coverage.py if you already have an installed copy. But if you do not already have it installed then it is preferred you use a clone of coverage.py for gathering coverage results. -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sat Oct 19 22:06:18 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 19 Oct 2013 22:06:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_give_explicitly_global_fun?= =?utf-8?q?ctions_and_classes_a_global_=5F=5Fqualname=5F=5F_=28closes?= Message-ID: <3d2FVf5363z7LjX@mail.python.org> http://hg.python.org/cpython/rev/35b384ed594b changeset: 86491:35b384ed594b user: Benjamin Peterson date: Sat Oct 19 16:01:13 2013 -0400 summary: give explicitly global functions and classes a global __qualname__ (closes #19301) files: Lib/importlib/_bootstrap.py | 3 +- Lib/test/test_descr.py | 5 + Lib/test/test_funcattrs.py | 4 + Misc/NEWS | 3 + Python/compile.c | 54 +- Python/importlib.h | 6645 +++++++++++----------- 6 files changed, 3262 insertions(+), 3452 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -369,12 +369,13 @@ # free vars) # Python 3.4a1 3270 (various tweaks to the __class__ closure) # Python 3.4a1 3280 (remove implicit class argument) +# Python 3.4a4 3290 (changes to __qualname__ computation) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually # due to the addition of new opcodes). -MAGIC_NUMBER = (3280).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3290).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4517,6 +4517,11 @@ self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__, str, 'Oink') + global Y + class Y: + pass + self.assertEqual(Y.__qualname__, 'Y') + def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} tp = type('Foo', (), ns) diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -7,6 +7,9 @@ def inner_function(): class LocalClass: pass + global inner_global_function + def inner_global_function(): + pass return LocalClass return lambda: inner_function @@ -116,6 +119,7 @@ 'global_function..inner_function') self.assertEqual(global_function()()().__qualname__, 'global_function..inner_function..LocalClass') + self.assertEqual(inner_global_function.__qualname__, 'inner_global_function') self.b.__qualname__ = 'c' self.assertEqual(self.b.__qualname__, 'c') self.b.__qualname__ = 'd' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #19301: Give classes and functions that are explicitly marked global a + global qualname. + - Issue #19279: UTF-7 decoder no more produces illegal strings. - Issue #16612: Add "Argument Clinic", a compile-time preprocessor for diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -650,9 +650,10 @@ } static PyObject * -compiler_scope_qualname(struct compiler *c) +compiler_scope_qualname(struct compiler *c, identifier scope_name) { - Py_ssize_t stack_size, i; + Py_ssize_t stack_size; + int global_scope; _Py_static_string(dot, "."); _Py_static_string(locals, ""); struct compiler_unit *u; @@ -669,22 +670,41 @@ return NULL; stack_size = PyList_GET_SIZE(c->c_stack); - for (i = 0; i < stack_size; i++) { - capsule = PyList_GET_ITEM(c->c_stack, i); + global_scope = stack_size <= 1; + if (scope_name != NULL && !global_scope) { + int scope; + PyObject *mangled; + capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1); u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); assert(u); - if (u->u_scope_type == COMPILER_SCOPE_MODULE) - continue; - if (PyList_Append(seq, u->u_name)) - goto _error; - if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { - locals_str = _PyUnicode_FromId(&locals); - if (locals_str == NULL) + mangled = _Py_Mangle(u->u_private, scope_name); + if (!mangled) + return NULL; + scope = PyST_GetScope(u->u_ste, mangled); + Py_DECREF(mangled); + assert(scope != GLOBAL_IMPLICIT); + if (scope == GLOBAL_EXPLICIT) + global_scope = 1; + } + if (!global_scope) { + Py_ssize_t i; + for (i = 1; i < stack_size; i++) { + capsule = PyList_GET_ITEM(c->c_stack, i); + u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); + assert(u); + assert(u->u_scope_type != COMPILER_SCOPE_MODULE); + if (PyList_Append(seq, u->u_name)) goto _error; - if (PyList_Append(seq, locals_str)) - goto _error; + if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { + locals_str = _PyUnicode_FromId(&locals); + if (locals_str == NULL) + goto _error; + if (PyList_Append(seq, locals_str)) + goto _error; + } } } + u = c->u; if (PyList_Append(seq, u->u_name)) goto _error; @@ -1649,7 +1669,7 @@ VISIT_IN_SCOPE(c, stmt, st); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = compiler_scope_qualname(c, s->v.FunctionDef.name); compiler_exit_scope(c); if (qualname == NULL || co == NULL) { Py_XDECREF(qualname); @@ -1722,7 +1742,7 @@ } Py_DECREF(str); /* store the __qualname__ */ - str = compiler_scope_qualname(c); + str = compiler_scope_qualname(c, s->v.ClassDef.name); if (!str) { compiler_exit_scope(c); return 0; @@ -1862,7 +1882,7 @@ ADDOP_IN_SCOPE(c, RETURN_VALUE); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = compiler_scope_qualname(c, NULL); compiler_exit_scope(c); if (qualname == NULL || co == NULL) return 0; @@ -3139,7 +3159,7 @@ } co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = compiler_scope_qualname(c, NULL); compiler_exit_scope(c); if (qualname == NULL || co == NULL) goto error; diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 22:07:55 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 19 Oct 2013 22:07:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4MjM1?= =?utf-8?q?=3A_Fix_the_sysconfig_variables_LDSHARED_and_BLDSHARED_under_AI?= =?utf-8?q?X=2E?= Message-ID: <3d2FXW4b6tz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/c554194240fc changeset: 86492:c554194240fc branch: 3.3 parent: 86486:73ab6aba24e5 user: Antoine Pitrou date: Sat Oct 19 22:05:05 2013 +0200 summary: Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. Patch by David Edelsohn. files: Lib/sysconfig.py | 2 +- Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -388,7 +388,7 @@ # -- these paths are relative to the Python source, but when installed # the scripts are in another directory. if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] + vars['BLDSHARED'] = vars['LDSHARED'] # There's a chicken-and-egg situation on OS X with regards to the # _sysconfigdata module after the changes introduced by #15298: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -78,6 +78,9 @@ Library ------- +- Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. + Patch by David Edelsohn. + - Issue #19276: Fixed the wave module on 64-bit big-endian platforms. - Issue #18776: atexit callbacks now display their full traceback when they -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 22:07:56 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 19 Oct 2013 22:07:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318235=3A_Fix_the_sysconfig_variables_LDSHARED_a?= =?utf-8?q?nd_BLDSHARED_under_AIX=2E?= Message-ID: <3d2FXX6c0Jz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/e3ac917fcf9c changeset: 86493:e3ac917fcf9c parent: 86491:35b384ed594b parent: 86492:c554194240fc user: Antoine Pitrou date: Sat Oct 19 22:06:26 2013 +0200 summary: Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. Patch by David Edelsohn. files: Lib/sysconfig.py | 2 +- Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -368,7 +368,7 @@ # -- these paths are relative to the Python source, but when installed # the scripts are in another directory. if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] + vars['BLDSHARED'] = vars['LDSHARED'] # There's a chicken-and-egg situation on OS X with regards to the # _sysconfigdata module after the changes introduced by #15298: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,9 @@ Library ------- +- Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. + Patch by David Edelsohn. + - Issue #18606: Add the new "statistics" module (PEP 450). Contributed by Steven D'Aprano. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 22:36:25 2013 From: python-checkins at python.org (christian.heimes) Date: Sat, 19 Oct 2013 22:36:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_fix_compile_issue_on_windo?= =?utf-8?q?ws=2E_path_is_now_a_struct_ptr?= Message-ID: <3d2G9P1qfHz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/441737b6711b changeset: 86494:441737b6711b user: Christian Heimes date: Sat Oct 19 22:36:17 2013 +0200 summary: fix compile issue on windows. path is now a struct ptr files: Modules/posixmodule.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2651,10 +2651,10 @@ #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS - if (path.wide != NULL) - attr = GetFileAttributesW(path.wide); + if (path->wide != NULL) + attr = GetFileAttributesW(path->wide); else - attr = GetFileAttributesA(path.narrow); + attr = GetFileAttributesA(path->narrow); Py_END_ALLOW_THREADS /* -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 22:38:31 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 19 Oct 2013 22:38:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_strengthen_condition_and_a?= =?utf-8?q?dd_assertion?= Message-ID: <3d2GCq0jyGz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/50bb4300bf2b changeset: 86495:50bb4300bf2b user: Benjamin Peterson date: Sat Oct 19 16:14:39 2013 -0400 summary: strengthen condition and add assertion files: Python/compile.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -670,7 +670,8 @@ return NULL; stack_size = PyList_GET_SIZE(c->c_stack); - global_scope = stack_size <= 1; + assert(stack_size >= 1); + global_scope = stack_size == 1; if (scope_name != NULL && !global_scope) { int scope; PyObject *mangled; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 19 22:38:32 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 19 Oct 2013 22:38:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_removal_u=5Fqualname=2C_si?= =?utf-8?q?nce_compiler=5Fscope=5Fqualname_is_only_ever_called_once?= Message-ID: <3d2GCr2S08z7Ljq@mail.python.org> http://hg.python.org/cpython/rev/b4a325275fb0 changeset: 86496:b4a325275fb0 user: Benjamin Peterson date: Sat Oct 19 16:15:58 2013 -0400 summary: removal u_qualname, since compiler_scope_qualname is only ever called once files: Python/compile.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -104,7 +104,6 @@ PySTEntryObject *u_ste; PyObject *u_name; - PyObject *u_qualname; /* dot-separated qualified name (lazy) */ int u_scope_type; /* The following fields are dicts that map objects to @@ -507,7 +506,6 @@ } Py_CLEAR(u->u_ste); Py_CLEAR(u->u_name); - Py_CLEAR(u->u_qualname); Py_CLEAR(u->u_consts); Py_CLEAR(u->u_names); Py_CLEAR(u->u_varnames); @@ -660,11 +658,6 @@ PyObject *capsule, *name, *seq, *dot_str, *locals_str; u = c->u; - if (u->u_qualname != NULL) { - Py_INCREF(u->u_qualname); - return u->u_qualname; - } - seq = PyList_New(0); if (seq == NULL) return NULL; @@ -714,7 +707,6 @@ goto _error; name = PyUnicode_Join(dot_str, seq); Py_DECREF(seq); - u->u_qualname = name; Py_XINCREF(name); return name; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 00:55:06 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 00:55:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319299=3A_fix_refl?= =?utf-8?q?eak_test_failures_in_test=5Fasyncio?= Message-ID: <3d2KFQ3w0Vz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/4019694a1ce4 changeset: 86497:4019694a1ce4 user: Antoine Pitrou date: Sun Oct 20 00:54:10 2013 +0200 summary: Issue #19299: fix refleak test failures in test_asyncio files: Lib/asyncio/base_events.py | 8 ++++++++ Lib/asyncio/proactor_events.py | 1 + Lib/asyncio/selector_events.py | 1 + 3 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -185,6 +185,14 @@ """ self.call_soon(_raise_stop_error) + def close(self): + self._ready.clear() + self._scheduled.clear() + executor = self._default_executor + if executor is not None: + self._default_executor = None + executor.shutdown(wait=False) + def is_running(self): """Returns running status of event loop.""" return self._running diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -276,6 +276,7 @@ self._proactor.close() self._proactor = None self._selector = None + super().close() def sock_recv(self, sock, n): return self._proactor.recv(sock, n) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -56,6 +56,7 @@ self._close_self_pipe() self._selector.close() self._selector = None + super().close() def _socketpair(self): raise NotImplementedError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 01:11:02 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 01:11:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Try_to_fix_test=5Fasyncio_?= =?utf-8?q?dual_stack_test_when_creating_an_IPv6_socket_fails?= Message-ID: <3d2Kbp1WfQz7LkL@mail.python.org> http://hg.python.org/cpython/rev/e3ec6b17260c changeset: 86498:e3ec6b17260c user: Antoine Pitrou date: Sun Oct 20 01:10:52 2013 +0200 summary: Try to fix test_asyncio dual stack test when creating an IPv6 socket fails files: Lib/test/test_asyncio/test_events.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -17,7 +17,7 @@ import errno import unittest import unittest.mock -from test.support import find_unused_port +from test.support import find_unused_port, IPV6_ENABLED from asyncio import futures @@ -684,7 +684,7 @@ server.close() - @unittest.skipUnless(socket.has_ipv6, 'IPv6 not supported') + @unittest.skipUnless(IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_server_dual_stack(self): f_proto = futures.Future(loop=self.loop) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 01:51:34 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 01:51:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319305=3A_try_to_f?= =?utf-8?q?ix_sporadic_test=5Fasyncio_failure_on_FreeBSD_10=2E0?= Message-ID: <3d2LVZ3QMHz7LjR@mail.python.org> http://hg.python.org/cpython/rev/f1447c152fb7 changeset: 86499:f1447c152fb7 user: Antoine Pitrou date: Sun Oct 20 01:51:25 2013 +0200 summary: Issue #19305: try to fix sporadic test_asyncio failure on FreeBSD 10.0 files: Lib/asyncio/test_utils.py | 15 +++++++++++++++ Lib/test/test_asyncio/test_events.py | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -7,6 +7,7 @@ import os import sys import threading +import time import unittest import unittest.mock from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer @@ -46,6 +47,20 @@ gen.close() +def run_until(loop, pred, timeout=None): + if timeout is not None: + deadline = time.time() + timeout + while not pred(): + if timeout is not None: + timeout = deadline - time.time() + if timeout <= 0: + return False + loop.run_until_complete(tasks.sleep(timeout, loop=loop)) + else: + run_briefly(loop) + return True + + def run_once(loop): """loop.stop() schedules _raise_stop_error() and run_forever() runs until _raise_stop_error() callback. diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -558,13 +558,14 @@ self.assertEqual(host, '0.0.0.0') client = socket.socket() client.connect(('127.0.0.1', port)) - client.send(b'xxx') + client.sendall(b'xxx') test_utils.run_briefly(self.loop) self.assertIsInstance(proto, MyProto) self.assertEqual('INITIAL', proto.state) test_utils.run_briefly(self.loop) self.assertEqual('CONNECTED', proto.state) - test_utils.run_briefly(self.loop) # windows iocp + test_utils.run_until(self.loop, lambda: proto.nbytes > 0, + timeout=10) self.assertEqual(3, proto.nbytes) # extra info is available @@ -623,6 +624,8 @@ self.assertIsInstance(proto, MyProto) test_utils.run_briefly(self.loop) self.assertEqual('CONNECTED', proto.state) + test_utils.run_until(self.loop, lambda: proto.nbytes > 0, + timeout=10) self.assertEqual(3, proto.nbytes) # extra info is available -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 02:04:36 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sun, 20 Oct 2013 02:04:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=28Hopefully=29_proper_fix?= =?utf-8?q?_for_gentoo_buildbot_failure_due_to_lacking_AF=5FINET6?= Message-ID: <3d2Lnc4nGwz7LjR@mail.python.org> http://hg.python.org/cpython/rev/02f6922e6a7e changeset: 86500:02f6922e6a7e user: Guido van Rossum date: Sat Oct 19 17:04:25 2013 -0700 summary: (Hopefully) proper fix for gentoo buildbot failure due to lacking AF_INET6 support. This should supersede revision e3ec6b17260c (but please test before removing that). files: Lib/asyncio/base_events.py | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -464,7 +464,11 @@ try: for res in infos: af, socktype, proto, canonname, sa = res - sock = socket.socket(af, socktype, proto) + try: + sock = socket.socket(af, socktype, proto) + except socket.error: + # Assume it's a bad family/type/protocol combination. + continue sockets.append(sock) if reuse_address: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 02:09:26 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 02:09:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Backout_e3ec6b17260c_after?= =?utf-8?q?_Guido=27s_fix?= Message-ID: <3d2LvB1kydzR1R@mail.python.org> http://hg.python.org/cpython/rev/8a1e9b67089a changeset: 86501:8a1e9b67089a user: Antoine Pitrou date: Sun Oct 20 02:09:08 2013 +0200 summary: Backout e3ec6b17260c after Guido's fix files: Lib/test/test_asyncio/test_events.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -17,7 +17,7 @@ import errno import unittest import unittest.mock -from test.support import find_unused_port, IPV6_ENABLED +from test.support import find_unused_port from asyncio import futures @@ -687,7 +687,7 @@ server.close() - @unittest.skipUnless(IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket.has_ipv6, 'IPv6 not supported') def test_create_server_dual_stack(self): f_proto = futures.Future(loop=self.loop) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 02:17:27 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 02:17:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Un-backout_e3ec6b17260c_-_?= =?utf-8?q?the_test_fix_was_actually_also_necessary?= Message-ID: <3d2M4R2hzrzT1q@mail.python.org> http://hg.python.org/cpython/rev/68a7bc8bb663 changeset: 86502:68a7bc8bb663 user: Antoine Pitrou date: Sun Oct 20 02:16:40 2013 +0200 summary: Un-backout e3ec6b17260c - the test fix was actually also necessary files: Lib/test/test_asyncio/test_events.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -17,7 +17,7 @@ import errno import unittest import unittest.mock -from test.support import find_unused_port +from test.support import find_unused_port, IPV6_ENABLED from asyncio import futures @@ -687,7 +687,7 @@ server.close() - @unittest.skipUnless(socket.has_ipv6, 'IPv6 not supported') + @unittest.skipUnless(IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_server_dual_stack(self): f_proto = futures.Future(loop=self.loop) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 05:22:33 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 05:22:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Tweak_=27provisional=27_in?= =?utf-8?q?_glossary?= Message-ID: <3d2RB14Yzwz7LjN@mail.python.org> http://hg.python.org/cpython/rev/f08392929c0d changeset: 86503:f08392929c0d user: Nick Coghlan date: Sun Oct 20 13:22:04 2013 +1000 summary: Tweak 'provisional' in glossary files: Doc/glossary.rst | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -670,20 +670,27 @@ positional argument See :term:`argument`. - provisional package - A provisional package is one which has been deliberately excluded from + provisional API + A provisional API is one which has been deliberately excluded from the standard library's backwards compatibility guarantees. While major - changes to such packages are not expected, as long as they are marked + changes to such interfaces are not expected, as long as they are marked provisional, backwards incompatible changes (up to and including removal - of the package) may occur if deemed necessary by core developers. Such + of the interface) may occur if deemed necessary by core developers. Such changes will not be made gratuitously -- they will occur only if serious - flaws are uncovered that were missed prior to the inclusion of the - package. + fundamental flaws are uncovered that were missed prior to the inclusion + of the API. + + Even for provisional APIs, backwards incompatible changes are seen as + a "solution of last resort" - every attempt will still be made to find + a backwards compatible resolution to any identified problems. This process allows the standard library to continue to evolve over time, without locking in problematic design errors for extended periods of time. See :pep:`411` for more details. + provisional package + See :term:`provisional API`. + Python 3000 Nickname for the Python 3.x release line (coined long ago when the release of version 3 was something in the distant future.) This is also -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 05:22:35 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 05:22:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_What=27s_New_updates_prior?= =?utf-8?q?_to_alpha?= Message-ID: <3d2RB30CLkz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/635001d5005f changeset: 86504:635001d5005f user: Nick Coghlan date: Sun Oct 20 13:22:21 2013 +1000 summary: What's New updates prior to alpha files: Doc/library/contextlib.rst | 5 +- Doc/whatsnew/3.4.rst | 69 ++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -597,9 +597,10 @@ The specification, background, and examples for the Python :keyword:`with` statement. +.. _single-use-reusable-and-reentrant-cms: -Reusable and reentrant context managers ---------------------------------------- +Single use, reusable and reentrant context managers +--------------------------------------------------- Most context managers are written in a way that means they can only be used effectively in a :keyword:`with` statement once. These single use diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -86,13 +86,15 @@ New syntax features: -* None yet. +* No new syntax features are planned for Python 3.4. New library modules: -* :mod:`enum`: Implementation of the :pep:`435`. +* :mod:`asyncio`: New provisonal API for asynchronous IO (:pep:`3156`). +* :mod:`enum`: Support for enumeration types (:pep:`435`). * :mod:`selectors`: High-level and efficient I/O multiplexing, built upon the :mod:`select` module primitives. +* :mod:`statistics`: A basic numerically stable statistics library (:pep:`450`). New built-in features: @@ -105,6 +107,8 @@ * A more efficient :mod:`marshal` format (:issue:`16475`). * Improve finalization of Python modules to avoid setting their globals to None, in most cases (:issue:`18214`). +* "Argument Clinic", providing improved introspection support for builtin + and standard library extension types implemented in C (:pep:`436`) Significantly Improved Library Modules: @@ -176,15 +180,50 @@ * Module objects are now :mod:`weakref`'able. +* Module ``__file__`` attributes (and related values) should now always + contain absolute paths by default, with the sole exception of + ``__main__.__file__`` when a script has been executed directly using + a relative path (Contributed by Brett Cannon in :issue:`18416`). + New Modules =========== + +asyncio +------- + +The new :mod:`asyncio` module (defined in :pep:`3156`) provides a standard +pluggable event loop model for Python, providing solid asynchronous IO +support in the standard library, and making it easier for other event loop +implementations to interoperate with the standard library and each other. + +For Python 3.4, this module is considered a :term:`provisional API`. + +enum +---- + +The new :mod:`enum` module provides a standard implementation of enumeration +types, allowing other modules (such as :mod:`socket`) to provide more +informative error messages and better debugging support by replacing opaque +integer constants with backwards compatible enumeration values. + + selectors --------- -The new :mod:`selectors` module allows high-level and efficient I/O -multiplexing, built upon the :mod:`select` module primitives. +The new :mod:`selectors` module (created as part of implementing :pep:`3156`) +allows high-level and efficient I/O multiplexing, built upon the +:mod:`select` module primitives. + + +statistics +---------- + +The new :mod:`statistics` module (defined in :pep:`450`) offers some core +statistics functionality directly in the standard library. This module +supports calculation of the mean, median, mode, variance and standard +deviation of a data series. Improved Modules @@ -232,12 +271,16 @@ statement. (Contributed by Raymond Hettinger in :issue:`15806` and Zero Piraeus in :issue:`19266`) - The new :class:`contextlib.redirect_stdio` context manager makes it easier for utility scripts to handle inflexible APIs that don't provide any options to retrieve their output as a string or direct it to somewhere -other than :data:`sys.stdout`. (Contribute by Raymond Hettinger in -:issue:`15805`) +other than :data:`sys.stdout`. In conjunction with :class:`io.StringIO`, +this context manager is also useful for checking expected output from +command line utilities. (Contribute by Raymond Hettinger in :issue:`15805`) + +The :mod:`contextlib` documentation has also been updated to include a +:ref:`discussion ` of the +differences between single use, reusable and reentrant context managers. dis @@ -567,7 +610,6 @@ :issue:`9548`) - Build and C API Changes ======================= @@ -578,6 +620,15 @@ a particular encoding and error handler for the standard streams (Contributed by Bastien Montagne and Nick Coghlan in :issue:`16129`) +* Most Python C APIs that don't mutate string arguments are now correctly + marked as accepting ``const char *`` rather than ``char *`` (Contributed + by Serhiy Storchaka in :issue:`1772673`). + +* "Argument Clinic" (:pep:`436`) is now part of the CPython build process + and can be used to simplify the process of defining and maintaining + accurate signatures for builtins and standard library extension modules + implemented in C. + Deprecated ========== @@ -618,7 +669,7 @@ Deprecated features ------------------- -* None yet. +* No feature deprecations are planned for Python 3.4. Porting to Python 3.4 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 05:45:53 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 05:45:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Update_CLA_handling_docs?= Message-ID: <3d2Rhx0c8Wz7LjR@mail.python.org> http://hg.python.org/devguide/rev/62d20fdf16f4 changeset: 645:62d20fdf16f4 user: Nick Coghlan date: Sun Oct 20 13:45:44 2013 +1000 summary: Update CLA handling docs files: committing.rst | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-) diff --git a/committing.rst b/committing.rst --- a/committing.rst +++ b/committing.rst @@ -104,6 +104,13 @@ and ``NEWS`` in a subsequent checkin (don't worry about trying to fix the original checkin message in that case). +Finally, especially for larger patches, check if the submitter of the +patch has a CLA in place (indicated by an asterisk following their username +in the issue tracker). If the asterisk is missing and the patch is +non-trivial, direct them to the electronic `Contributor Licensing Agreement`_ +to ensure the PSF has the appropriate authorizations in place to relicense +and redistribute their code. + Contributor Licensing Agreements -------------------------------- @@ -114,17 +121,20 @@ comments, docstrings and documentation are far more likely to reach a copyrightable standard. -For Python sprints we now recommend collecting CLAs as a matter of course, as -the folks leading the sprints can then handle the task of scanning (or otherwise -digitising) the forms and passing them on to the PSF secretary. (Yes, we -realise this process is quite archaic. Yes, we're in the process of fixing -it. No, it's not fixed yet). +These days, the CLA can be signed electronically through the form linked +above, and this process is strongly preferred to the old mechanism that +involved sending a scanned copy of the signed paper form. As discussed on the PSF Contribution_ page, it is the CLA itself that gives the PSF the necessary relicensing rights to redistribute contributions under the Python license stack. This is an additional permission granted above and beyond the normal permissions provided by the chosen open source license. +Some developers may object to the relicensing permissions granted to the PSF +by the CLA. They're entirely within their rights to refuse to sign the CLA +on that basis, but that refusal *does* mean we can't accept their patches +for inclusion. + .. _Contribution: http://www.python.org/psf/contrib/ .. _Contributor Licensing Agreement: http://www.python.org/psf/contrib/contrib-form/ -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sun Oct 20 06:26:45 2013 From: python-checkins at python.org (guido.van.rossum) Date: Sun, 20 Oct 2013 06:26:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Break_out_of_loop_on_EOF_i?= =?utf-8?q?n_asyncio_echo_test_programs=2E?= Message-ID: <3d2Sc54Tkpz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/96bf980b0f60 changeset: 86505:96bf980b0f60 user: Guido van Rossum date: Sat Oct 19 21:26:34 2013 -0700 summary: Break out of loop on EOF in asyncio echo test programs. files: Lib/test/test_asyncio/echo.py | 2 ++ Lib/test/test_asyncio/echo3.py | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/echo.py b/Lib/test/test_asyncio/echo.py --- a/Lib/test/test_asyncio/echo.py +++ b/Lib/test/test_asyncio/echo.py @@ -3,4 +3,6 @@ if __name__ == '__main__': while True: buf = os.read(0, 1024) + if not buf: + break os.write(1, buf) diff --git a/Lib/test/test_asyncio/echo3.py b/Lib/test/test_asyncio/echo3.py --- a/Lib/test/test_asyncio/echo3.py +++ b/Lib/test/test_asyncio/echo3.py @@ -3,6 +3,8 @@ if __name__ == '__main__': while True: buf = os.read(0, 1024) + if not buf: + break try: os.write(1, b'OUT:'+buf) except OSError as ex: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 07:03:14 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 07:03:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_453_updates?= Message-ID: <3d2TQB343Nz7LjN@mail.python.org> http://hg.python.org/peps/rev/bd49f3710045 changeset: 5200:bd49f3710045 user: Nick Coghlan date: Sun Oct 20 15:00:20 2013 +1000 summary: PEP 453 updates - remove proposal to change the script installation directory on Windows due to the backwards incompatility issues pointed out by Paul Moore - include an explicit requirement to resolve the requests certificate management issues prior to beta 2 - cleaner formatting of the integration timeline files: pep-0453.txt | 87 ++++++++++++++++++++++++++------------- 1 files changed, 57 insertions(+), 30 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -344,6 +344,11 @@ need to pay attention to the additional security considerations that come with doing so. +However, the core CPython team will also assist with reviewing and +resolving the `certificate update management issue +`__ currently +affecting the ``requests`` project (and hence ``pip``) [#cert-verification]_. + Reliability considerations -------------------------- @@ -408,44 +413,49 @@ If this PEP is accepted, the proposed time frame for integration of ``pip`` into the CPython release is as follows: -* as soon as possible +* as soon as possible after the release of 3.4.0 alpha 4 - Documentation updated and ``ensurepip`` implemented based on a pre-release - version of ``pip`` 1.5. + * Documentation updated and ``ensurepip`` implemented based on a + pre-release version of ``pip`` 1.5. - All other proposed functional changes for Python 3.4 implemented, - including the installer updates to invoke ``ensurepip``. + * All other proposed functional changes for Python 3.4 implemented, + including the installer updates to invoke ``ensurepip``. * by November 20th (3 days prior to the scheduled date of 3.4.0 beta 1) - ``ensurepip`` updated to use a beta release of ``pip`` 1.5. + * ``ensurepip`` updated to use a ``pip`` 1.5 release candidate. - PEP 101 updated to cover ensuring the bundled version of ``pip`` is up - to date. + * PEP 101 updated to cover ensuring the bundled version of ``pip`` is up + to date. * by November 24th (scheduled date of 3.4.0 beta 1) - As with any other new feature, all proposed functional changes for - Python 3.4 must be implemented prior to the beta feature freeze. + * As with any other new feature, all proposed functional changes for + Python 3.4 must be implemented prior to the beta feature freeze. * by December 29th (1 week prior to the scheduled date of 3.4.0 beta 2) - ``ensurepip`` updated to the final release of pip 1.5 + * ``requests`` certificate management issue resolved + * ``ensurepip`` updated to the final release of ``pip`` 1.5, or a + subsequent maintenance release (including a suitably updated vendored + copy of ``requests``) (See PEP 429 for the current official scheduled dates of each release. Dates -listed above are accurate as of October 15th.) +listed above are accurate as of October 20th, 2013.) -If there is no final release of ``pip`` 1.5 available by one week before the -scheduled Python 3.4 beta 2 release, then implementation of this PEP will -be deferred to Python 3.5. Note that this scenario is unlikely - the -tentative date for the ``pip`` 1.5 release is currently December 1st. +If there is no final or maintenance release of ``pip`` 1.5 with a suitable +updated version of ``requests`` available by one week before the scheduled +Python 3.4 beta 2 release, then implementation of this PEP will +be deferred to Python 3.5. Note that this scenario is considered unlikely - +the tentative date for the ``pip`` 1.5 release is currently December 1st. In future CPython releases, this kind of coordinated scheduling shouldn't be needed: the CPython release manager will be able to just update to the latest released version of ``pip``. However, in this case, some fixes are needed in -``pip`` in order to allow the bundling to work correctly, so the ``pip`` 1.5 -release cycle needs to be properly aligned with the CPython 3.4 beta -releases. +``pip`` in order to allow the bundling to work correctly, and the +certificate update mechanism for ``requests`` needs to be improved, so the +``pip`` 1.5 release cycle needs to be properly aligned with the CPython 3.4 +beta releases. Proposed CLI @@ -688,20 +698,16 @@ While the Windows installer was updated in Python 3.3 to optionally make ``python`` available on the PATH, no such change was made to -include the Scripts directory. Independently of this PEP, a proposal has -also been made to rename the ``Tools\Scripts`` subdirectory to ``bin`` in -order to improve consistency with the typical script installation directory -names on \*nix systems. +include the script installation directory returned by +``sysconfig.get_path("scripts")``. Accordingly, in addition to adding the option to extract and install ``pip`` -during installation, this PEP proposes that the Windows installer (and -``sysconfig``) in Python 3.4 and later be updated to: +during installation, this PEP proposes that the Windows installer in +Python 3.4 and later be updated to also add the path returned by +``sysconfig.get_path("scripts")`` to the Windows PATH when the PATH +modification option is enabled during installation -- install scripts to PythonXY\bin rather than PythonXY\Tools\Scripts -- add PythonXY\bin to the Windows PATH (in addition to PythonXY) when the - PATH modification option is enabled during installation - -Note that these changes will only be available in Python 3.4 and later. +Note that this change will only be available in Python 3.4 and later. This means that, for Python 3.3, the most reliable way to invoke pip globally on Windows (without tinkering manually with PATH) will still remain @@ -867,6 +873,21 @@ Appendix: Rejected Proposals ============================ + +Changing the name of the scripts directory on Windows +----------------------------------------------------- + +Earlier versions of this PEP proposed changing the name of the script +installation directory on Windows from "Scripts" to "bin" in order to +improve the cross-platform consistency of the virtual environments created +by ``pyvenv``. + +However, Paul Moore determined that this change was likely backwards +incompatible with cross-version Windows installers created with previous +versions of Python, so the change has been removed from this PEP +[#windows-incompatibility]_. + + Including ensurepip in Python 2.7, and 3.3 ------------------------------------------ @@ -1006,6 +1027,12 @@ .. [5] Discussion thread 5 (python-dev) (https://mail.python.org/pipermail/python-dev/2013-September/128894.html) +.. [#cert-verification] pip/requests certificate management concerns + (https://mail.python.org/pipermail/python-dev/2013-October/129755.html) + +.. [#windows-incompatibility] Windows installer compatibility concerns + (https://mail.python.org/pipermail/distutils-sig/2013-October/022855.html) + .. [#ubuntu] `Ubuntu ` .. [#debian] `Debian ` .. [#fedora] `Fedora ` -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sun Oct 20 07:40:15 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 20 Oct 2013 07:40:15 +0200 Subject: [Python-checkins] Daily reference leaks (68a7bc8bb663): sum=51687 Message-ID: results for 68a7bc8bb663 on branch "default" -------------------------------------------- test_grammar leaked [3, 3, 3] references, sum=9 test_opcodes leaked [16, 16, 16] references, sum=48 test_builtin leaked [11, 11, 11] references, sum=33 test_unittest leaked [7, 7, 7] references, sum=21 test_doctest leaked [55, 55, 55] references, sum=165 test_doctest leaked [3, 3, 3] memory blocks, sum=9 test_support leaked [9, 9, 9] references, sum=27 test_support leaked [8, 8, 8] memory blocks, sum=24 test_ast leaked [6885, 6885, 6885] references, sum=20655 test_ast leaked [4888, 4890, 4890] memory blocks, sum=14668 test_atexit leaked [2, 2, 2] references, sum=6 test_cgi leaked [9, 9, 9] references, sum=27 test_cgi leaked [8, 8, 8] memory blocks, sum=24 test_cmd leaked [2, 2, 2] references, sum=6 test_cmd_line_script leaked [12, 12, 12] references, sum=36 test_code leaked [7, 7, 7] references, sum=21 test_codeop leaked [44, 44, 44] references, sum=132 test_codeop leaked [4, 4, 4] memory blocks, sum=12 test_collections leaked [243, 243, 243] references, sum=729 test_collections leaked [216, 216, 216] memory blocks, sum=648 test_compile leaked [122, 122, 122] references, sum=366 test_compile leaked [108, 108, 108] memory blocks, sum=324 test_ctypes leaked [1, 1, 1] references, sum=3 test_decorators leaked [4, 4, 4] references, sum=12 test_deque leaked [4, 4, 4] references, sum=12 test_descrtut leaked [39, 39, 39] references, sum=117 test_descrtut leaked [19, 19, 19] memory blocks, sum=57 test_difflib leaked [2, 2, 2] references, sum=6 test_dis leaked [769, 769, 769] references, sum=2307 test_distutils leaked [2, 2, 2] references, sum=6 test_dynamic leaked [1, 1, 1] references, sum=3 test_extcall leaked [35, 35, 35] references, sum=105 test_extcall leaked [9, 9, 9] memory blocks, sum=27 test_funcattrs leaked [1, 1, 1] references, sum=3 test_gc leaked [1, 1, 1] references, sum=3 test_generators leaked [110, 110, 110] references, sum=330 test_generators leaked [25, 25, 25] memory blocks, sum=75 test_genexps leaked [30, 30, 30] references, sum=90 test_genexps leaked [4, 4, 4] memory blocks, sum=12 test_gettext leaked [25, 25, 25] references, sum=75 test_import leaked [4, 4, 4] references, sum=12 test_importlib leaked [36, 36, 36] references, sum=108 test_importlib leaked [32, 32, 32] memory blocks, sum=96 test_inspect leaked [45, 45, 45] references, sum=135 test_itertools leaked [22, 22, 22] references, sum=66 test_itertools leaked [2, 2, 2] memory blocks, sum=6 test_json leaked [2, 2, 2] references, sum=6 test_keywordonlyarg leaked [1, 1, 1] references, sum=3 test_listcomps leaked [39, 39, 39] references, sum=117 test_listcomps leaked [19, 19, 19] memory blocks, sum=57 test_marshal leaked [2, 2, 2] references, sum=6 test_math leaked [1, 1, 1] references, sum=3 test_metaclass leaked [38, 38, 38] references, sum=114 test_metaclass leaked [10, 10, 10] memory blocks, sum=30 test_module leaked [3, 3, 3] references, sum=9 test_module leaked [2, 2, 2] memory blocks, sum=6 test_modulefinder leaked [17, 17, 17] references, sum=51 test_modulefinder leaked [12, 12, 12] memory blocks, sum=36 test_peepholer leaked [1, 1, 1] references, sum=3 test_pydoc leaked [9, 9, 9] references, sum=27 test_pydoc leaked [8, 8, 8] memory blocks, sum=24 test_runpy leaked [35, 35, 35] references, sum=105 test_scope leaked [27, 27, 27] references, sum=81 test_scope leaked [18, 18, 18] memory blocks, sum=54 test_setcomps leaked [40, 40, 40] references, sum=120 test_setcomps leaked [19, 19, 19] memory blocks, sum=57 test_site leaked [0, 0, 2] references, sum=2 test_site leaked [0, 0, 2] memory blocks, sum=2 test_super leaked [2, 2, 2] references, sum=6 test_syntax leaked [4, 4, 4] references, sum=12 test_sys_settrace leaked [2, 2, 2] references, sum=6 test_threaded_import leaked [1, 1, 1] references, sum=3 test_threading leaked [22, 22, 22] references, sum=66 test_threading leaked [17, 17, 17] memory blocks, sum=51 test_threading_local leaked [10, 10, 10] references, sum=30 test_threading_local leaked [4, 4, 4] memory blocks, sum=12 test_timeit leaked [22, 22, 22] references, sum=66 test_tools leaked [44, 44, 44] references, sum=132 test_tools leaked [18, 18, 18] memory blocks, sum=54 test_trace leaked [1599, 1599, 1599] references, sum=4797 test_trace leaked [1125, 1127, 1127] memory blocks, sum=3379 test_unpack leaked [5, 5, 5] references, sum=15 test_unpack leaked [2, 2, 2] memory blocks, sum=6 test_unpack_ex leaked [7, 7, 7] references, sum=21 test_unpack_ex leaked [2, 2, 2] memory blocks, sum=6 test_weakref leaked [8, 8, 8] references, sum=24 test_weakref leaked [2, 2, 2] memory blocks, sum=6 test_zipimport leaked [38, 38, 38] references, sum=114 test_zipimport_support leaked [84, 84, 84] references, sum=252 test_zipimport_support leaked [20, 20, 20] memory blocks, sum=60 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogYgMGKS', '-x'] From python-checkins at python.org Sun Oct 20 08:43:08 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 08:43:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2312866=3A_Fix_bias?= =?utf-8?q?=28=29_for_24-bit=2E_Add_more_tests=2E?= Message-ID: <3d2WdS61bNz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/97ad9af5d5e7 changeset: 86506:97ad9af5d5e7 user: Serhiy Storchaka date: Sun Oct 20 09:42:26 2013 +0300 summary: Issue #12866: Fix bias() for 24-bit. Add more tests. files: Lib/test/test_audioop.py | 36 ++++++++++++++++++++++++++++ Modules/audioop.c | 12 ++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -121,6 +121,9 @@ b'\x00\x24\x7f\x80\x7f\x80\xfe') self.assertEqual(audioop.add(datas[2], datas[2], 2), packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2)) + self.assertEqual(audioop.add(datas[3], datas[3], 3), + packs[3](0, 0x2468ac, 0x7fffff, -0x800000, + 0x7fffff, -0x800000, -2)) self.assertEqual(audioop.add(datas[4], datas[4], 4), packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000, 0x7fffffff, -0x80000000, -2)) @@ -145,6 +148,17 @@ packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2)) self.assertEqual(audioop.bias(datas[2], 2, -0x80000000), datas[2]) + self.assertEqual(audioop.bias(datas[3], 3, 1), + packs[3](1, 0x123457, 0x45678a, -0x456788, + -0x800000, -0x7fffff, 0)) + self.assertEqual(audioop.bias(datas[3], 3, -1), + packs[3](-1, 0x123455, 0x456788, -0x45678a, + 0x7ffffe, 0x7fffff, -2)) + self.assertEqual(audioop.bias(datas[3], 3, 0x7fffffff), + packs[3](-1, 0x123455, 0x456788, -0x45678a, + 0x7ffffe, 0x7fffff, -2)) + self.assertEqual(audioop.bias(datas[3], 3, -0x80000000), + datas[3]) self.assertEqual(audioop.bias(datas[4], 4, 1), packs[4](1, 0x12345679, 0x456789ac, -0x456789aa, -0x80000000, -0x7fffffff, 0)) @@ -164,24 +178,43 @@ self.assertEqual(audioop.lin2lin(datas[1], 1, 2), packs[2](0, 0x1200, 0x4500, -0x4500, 0x7f00, -0x8000, -0x100)) + self.assertEqual(audioop.lin2lin(datas[1], 1, 3), + packs[3](0, 0x120000, 0x450000, -0x450000, + 0x7f0000, -0x800000, -0x10000)) self.assertEqual(audioop.lin2lin(datas[1], 1, 4), packs[4](0, 0x12000000, 0x45000000, -0x45000000, 0x7f000000, -0x80000000, -0x1000000)) self.assertEqual(audioop.lin2lin(datas[2], 2, 1), b'\x00\x12\x45\xba\x7f\x80\xff') + self.assertEqual(audioop.lin2lin(datas[2], 2, 3), + packs[3](0, 0x123400, 0x456700, -0x456700, + 0x7fff00, -0x800000, -0x100)) self.assertEqual(audioop.lin2lin(datas[2], 2, 4), packs[4](0, 0x12340000, 0x45670000, -0x45670000, 0x7fff0000, -0x80000000, -0x10000)) + self.assertEqual(audioop.lin2lin(datas[3], 3, 1), + b'\x00\x12\x45\xba\x7f\x80\xff') + self.assertEqual(audioop.lin2lin(datas[3], 3, 2), + packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1)) + self.assertEqual(audioop.lin2lin(datas[3], 3, 4), + packs[4](0, 0x12345600, 0x45678900, -0x45678900, + 0x7fffff00, -0x80000000, -0x100)) self.assertEqual(audioop.lin2lin(datas[4], 4, 1), b'\x00\x12\x45\xba\x7f\x80\xff') self.assertEqual(audioop.lin2lin(datas[4], 4, 2), packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1)) + self.assertEqual(audioop.lin2lin(datas[4], 4, 3), + packs[3](0, 0x123456, 0x456789, -0x45678a, + 0x7fffff, -0x800000, -1)) def test_adpcm2lin(self): self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 1, None), (b'\x00\x00\x00\xff\x00\xff', (-179, 40))) self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 2, None), (packs[2](0, 0xb, 0x29, -0x16, 0x72, -0xb3), (-179, 40))) + self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 3, None), + (packs[3](0, 0xb00, 0x2900, -0x1600, 0x7200, + -0xb300), (-179, 40))) self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 4, None), (packs[4](0, 0xb0000, 0x290000, -0x160000, 0x720000, -0xb30000), (-179, 40))) @@ -260,6 +293,9 @@ b'\x00\x24\x7f\x80\x7f\x80\xfe') self.assertEqual(audioop.mul(datas[2], 2, 2), packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2)) + self.assertEqual(audioop.mul(datas[3], 3, 2), + packs[3](0, 0x2468ac, 0x7fffff, -0x800000, + 0x7fffff, -0x800000, -2)) self.assertEqual(audioop.mul(datas[4], 4, 2), packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000, 0x7fffffff, -0x80000000, -2)) diff --git a/Modules/audioop.c b/Modules/audioop.c --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -985,10 +985,12 @@ val = GETINTX(unsigned char, cp, i); else if (size == 2) val = GETINTX(unsigned short, cp, i); - else if (size == 2) + else if (size == 3) val = ((unsigned int)GETINT24(cp, i)) & 0xffffffu; - else + else { + assert(size == 4); val = GETINTX(PY_UINT32_T, cp, i); + } val += (unsigned int)bias; /* wrap around in case of overflow */ @@ -998,10 +1000,12 @@ SETINTX(unsigned char, ncp, i, val); else if (size == 2) SETINTX(unsigned short, ncp, i, val); - else if (size == 2) + else if (size == 3) SETINT24(ncp, i, (int)val); - else + else { + assert(size == 4); SETINTX(PY_UINT32_T, ncp, i, val); + } } return rv; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 11:49:27 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 11:49:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_yet_some_24-bit_tests?= =?utf-8?q?=2E?= Message-ID: <3d2bmR4bCjz7LjY@mail.python.org> http://hg.python.org/cpython/rev/727107721f4f changeset: 86507:727107721f4f user: Serhiy Storchaka date: Sun Oct 20 12:49:04 2013 +0300 summary: Add yet some 24-bit tests. files: Lib/test/test_audioop.py | 23 +++++++++++------------ 1 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -87,6 +87,7 @@ self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10) self.assertEqual(audioop.avgpp(datas[1], 1), 196) self.assertEqual(audioop.avgpp(datas[2], 2), 50534) + self.assertEqual(audioop.avgpp(datas[3], 3), 12937096) self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002) def test_rms(self): @@ -100,6 +101,7 @@ -minvalues[w], delta=1) self.assertEqual(audioop.rms(datas[1], 1), 77) self.assertEqual(audioop.rms(datas[2], 2), 20001) + self.assertEqual(audioop.rms(datas[3], 3), 5120523) self.assertEqual(audioop.rms(datas[4], 4), 1310854152) def test_cross(self): @@ -227,10 +229,9 @@ def test_lin2adpcm(self): self.assertEqual(audioop.lin2adpcm(datas[1], 1, None), (b'\x07\x7f\x7f', (-221, 39))) - self.assertEqual(audioop.lin2adpcm(datas[2], 2, None), - (b'\x07\x7f\x7f', (31, 39))) - self.assertEqual(audioop.lin2adpcm(datas[4], 4, None), - (b'\x07\x7f\x7f', (31, 39))) + for w in 2, 3, 4: + self.assertEqual(audioop.lin2adpcm(datas[w], w, None), + (b'\x07\x7f\x7f', (31, 39))) # Very cursory test for w in 1, 2, 3, 4: @@ -240,10 +241,9 @@ def test_lin2alaw(self): self.assertEqual(audioop.lin2alaw(datas[1], 1), b'\xd5\x87\xa4\x24\xaa\x2a\x5a') - self.assertEqual(audioop.lin2alaw(datas[2], 2), - b'\xd5\x87\xa4\x24\xaa\x2a\x55') - self.assertEqual(audioop.lin2alaw(datas[4], 4), - b'\xd5\x87\xa4\x24\xaa\x2a\x55') + for w in 2, 3, 4: + self.assertEqual(audioop.lin2alaw(datas[w], w), + b'\xd5\x87\xa4\x24\xaa\x2a\x55') def test_alaw2lin(self): encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\ @@ -262,10 +262,9 @@ def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(datas[1], 1), b'\xff\xad\x8e\x0e\x80\x00\x67') - self.assertEqual(audioop.lin2ulaw(datas[2], 2), - b'\xff\xad\x8e\x0e\x80\x00\x7e') - self.assertEqual(audioop.lin2ulaw(datas[4], 4), - b'\xff\xad\x8e\x0e\x80\x00\x7e') + for w in 2, 3, 4: + self.assertEqual(audioop.lin2ulaw(datas[w], w), + b'\xff\xad\x8e\x0e\x80\x00\x7e') def test_ulaw2lin(self): encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 12:13:53 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 12:13:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2317087=3A_Improved?= =?utf-8?q?_the_repr_for_regular_expression_match_objects=2E?= Message-ID: <3d2cJd351dz7LjT@mail.python.org> http://hg.python.org/cpython/rev/29764a7bd6ba changeset: 86508:29764a7bd6ba user: Serhiy Storchaka date: Sun Oct 20 13:13:31 2013 +0300 summary: Issue #17087: Improved the repr for regular expression match objects. files: Lib/test/test_re.py | 22 ++++++++++++++++++++++ Misc/NEWS | 2 ++ Modules/_sre.c | 18 +++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1104,6 +1104,28 @@ self.assertEqual(re.compile(pattern, re.S).findall(b'xyz'), [b'xyz'], msg=pattern) + def test_match_repr(self): + for string in '[abracadabra]', S('[abracadabra]'): + m = re.search(r'(.+)(.*?)\1', string) + self.assertEqual(repr(m), "<%s.%s object; " + "span=(1, 12), match='abracadabra'>" % + (type(m).__module__, type(m).__qualname__)) + for string in (b'[abracadabra]', B(b'[abracadabra]'), + bytearray(b'[abracadabra]'), + memoryview(b'[abracadabra]')): + m = re.search(rb'(.+)(.*?)\1', string) + self.assertEqual(repr(m), "<%s.%s object; " + "span=(1, 12), match=b'abracadabra'>" % + (type(m).__module__, type(m).__qualname__)) + + first, second = list(re.finditer("(aa)|(bb)", "aa bb")) + self.assertEqual(repr(first), "<%s.%s object; " + "span=(0, 2), match='aa'>" % + (type(second).__module__, type(first).__qualname__)) + self.assertEqual(repr(second), "<%s.%s object; " + "span=(3, 5), match='bb'>" % + (type(second).__module__, type(second).__qualname__)) + def test_bug_2537(self): # issue 2537: empty submatches diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,8 @@ Library ------- +- Issue #17087: Improved the repr for regular expression match objects. + - Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. Patch by David Edelsohn. diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -3637,6 +3637,22 @@ return match_regs(self); } +static PyObject * +match_repr(MatchObject *self) +{ + PyObject *result; + PyObject *group0 = match_getslice_by_index(self, 0, Py_None); + if (group0 == NULL) + return NULL; + result = PyUnicode_FromFormat( + "<%s object; span=(%d, %d), match=%.50R>", + Py_TYPE(self)->tp_name, + self->mark[0], self->mark[1], group0); + Py_DECREF(group0); + return result; +} + + static PyGetSetDef match_getset[] = { {"lastindex", (getter)match_lastindex_get, (setter)NULL}, {"lastgroup", (getter)match_lastgroup_get, (setter)NULL}, @@ -3665,7 +3681,7 @@ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ - 0, /* tp_repr */ + (reprfunc)match_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 14:21:01 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 14:21:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_453_postdate_and_wording_?= =?utf-8?q?tweaks?= Message-ID: <3d2g7K4YY1z7LjT@mail.python.org> http://hg.python.org/peps/rev/8b5da3b25a42 changeset: 5201:8b5da3b25a42 user: Nick Coghlan date: Sun Oct 20 22:20:53 2013 +1000 summary: PEP 453 postdate and wording tweaks files: pep-0453.txt | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -10,7 +10,7 @@ Content-Type: text/x-rst Created: 10-Aug-2013 Post-History: 30-Aug-2013, 15-Sep-2013, 18-Sep-2013, 19-Sep-2013, - 23-Sep-2013, 29-Sep-2013, 13-Oct-2013 + 23-Sep-2013, 29-Sep-2013, 13-Oct-2013, 20-Oct-2013 Abstract @@ -344,10 +344,12 @@ need to pay attention to the additional security considerations that come with doing so. -However, the core CPython team will also assist with reviewing and -resolving the `certificate update management issue +However, the core CPython team will still assist with reviewing and +resolving at least the `certificate update management issue `__ currently -affecting the ``requests`` project (and hence ``pip``) [#cert-verification]_. +affecting the ``requests`` project (and hence ``pip``), and may also be +able to offer assistance in resolving other identified security concerns +[#cert-verification]_. Reliability considerations @@ -403,8 +405,7 @@ installation option for Python 3.4. * the ``venv`` module and ``pyvenv`` command would be updated to make use of ``ensurepip`` in Python 3.4 -* the PATH handling and ``sysconfig`` directory layout on Windows would be - updated for Python 3.4+ +* the PATH handling on Windows would be updated for Python 3.4+ Integration timeline -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 20 14:44:15 2013 From: python-checkins at python.org (nick.coghlan) Date: Sun, 20 Oct 2013 14:44:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319313=3A_remove_n?= =?utf-8?q?o_longer_needed_Py=5FXINCREF?= Message-ID: <3d2gf73Rqzz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/84a8b797c5c5 changeset: 86509:84a8b797c5c5 user: Nick Coghlan date: Sun Oct 20 22:43:53 2013 +1000 summary: Close #19313: remove no longer needed Py_XINCREF Eliminates a refleak introduced in commit b4a325275fb0 files: Python/compile.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -707,7 +707,6 @@ goto _error; name = PyUnicode_Join(dot_str, seq); Py_DECREF(seq); - Py_XINCREF(name); return name; _error: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 16:02:37 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 16:02:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE2MDM4?= =?utf-8?q?=3A_CVE-2013-1752=3A_ftplib=3A_Limit_amount_of_data_read_by?= Message-ID: <3d2jNY5gWDz7LjM@mail.python.org> http://hg.python.org/cpython/rev/44ac81e6d584 changeset: 86510:44ac81e6d584 branch: 2.7 parent: 86483:625ece68d79a user: Serhiy Storchaka date: Sun Oct 20 16:57:07 2013 +0300 summary: Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. files: Lib/ftplib.py | 27 +++++++++++++++++++++------ Lib/test/test_ftplib.py | 22 +++++++++++++++++++++- Misc/NEWS | 4 ++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -55,6 +55,8 @@ # The standard FTP server control port FTP_PORT = 21 +# The sizehint parameter passed to readline() calls +MAXLINE = 8192 # Exception raised when an error or invalid response is received @@ -101,6 +103,7 @@ debugging = 0 host = '' port = FTP_PORT + maxline = MAXLINE sock = None file = None welcome = None @@ -180,7 +183,9 @@ # Internal: return one line from the server, stripping CRLF. # Raise EOFError if the connection is closed def getline(self): - line = self.file.readline() + line = self.file.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 1: print '*get*', self.sanitize(line) if not line: raise EOFError @@ -432,7 +437,9 @@ conn = self.transfercmd(cmd) fp = conn.makefile('rb') while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print '*retr*', repr(line) if not line: break @@ -485,7 +492,9 @@ self.voidcmd('TYPE A') conn = self.transfercmd(cmd) while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != CRLF: if buf[-1] in CRLF: buf = buf[:-1] @@ -710,7 +719,9 @@ fp = conn.makefile('rb') try: while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print '*retr*', repr(line) if not line: break @@ -748,7 +759,9 @@ conn = self.transfercmd(cmd) try: while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != CRLF: if buf[-1] in CRLF: buf = buf[:-1] @@ -905,7 +918,9 @@ fp = open(filename, "r") in_macro = 0 while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not line: break if in_macro and line.strip(): macro_lines.append(line) diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -65,6 +65,7 @@ self.last_received_data = '' self.next_response = '' self.rest = None + self.next_retr_data = RETR_DATA self.push('220 welcome') def collect_incoming_data(self, data): @@ -189,7 +190,7 @@ offset = int(self.rest) else: offset = 0 - self.dtp.push(RETR_DATA[offset:]) + self.dtp.push(self.next_retr_data[offset:]) self.dtp.close_when_done() self.rest = None @@ -203,6 +204,11 @@ self.dtp.push(NLST_DATA) self.dtp.close_when_done() + def cmd_setlongretr(self, arg): + # For testing. Next RETR will return long line. + self.next_retr_data = 'x' * int(arg) + self.push('125 setlongretr ok') + class DummyFTPServer(asyncore.dispatcher, threading.Thread): @@ -558,6 +564,20 @@ # IPv4 is in use, just make sure send_epsv has not been used self.assertEqual(self.server.handler.last_received_cmd, 'pasv') + def test_line_too_long(self): + self.assertRaises(ftplib.Error, self.client.sendcmd, + 'x' * self.client.maxline * 2) + + def test_retrlines_too_long(self): + self.client.sendcmd('SETLONGRETR %d' % (self.client.maxline * 2)) + received = [] + self.assertRaises(ftplib.Error, + self.client.retrlines, 'retr', received.append) + + def test_storlines_too_long(self): + f = StringIO.StringIO('x' * self.client.maxline * 2) + self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) + class TestIPv6Environment(TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -37,6 +37,10 @@ Library ------- +- Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by + limiting the call to readline(). Original patch by Micha? + Jastrz?bski and Giampaolo Rodola. + - Issue #19276: Fixed the wave module on 64-bit big-endian platforms. - Issue #18458: Prevent crashes with newer versions of libedit. Its readline -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 16:02:39 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 16:02:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE2MDM4?= =?utf-8?q?=3A_CVE-2013-1752=3A_ftplib=3A_Limit_amount_of_data_read_by?= Message-ID: <3d2jNb1b8qz7LkB@mail.python.org> http://hg.python.org/cpython/rev/38db4d0726bd changeset: 86511:38db4d0726bd branch: 3.3 parent: 86492:c554194240fc user: Serhiy Storchaka date: Sun Oct 20 16:58:27 2013 +0300 summary: Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. files: Lib/ftplib.py | 23 ++++++++++++++++++----- Lib/test/test_ftplib.py | 22 +++++++++++++++++++++- Misc/NEWS | 4 ++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -49,6 +49,8 @@ # The standard FTP server control port FTP_PORT = 21 +# The sizehint parameter passed to readline() calls +MAXLINE = 8192 # Exception raised when an error or invalid response is received @@ -96,6 +98,7 @@ debugging = 0 host = '' port = FTP_PORT + maxline = MAXLINE sock = None file = None welcome = None @@ -194,7 +197,9 @@ # Internal: return one line from the server, stripping CRLF. # Raise EOFError if the connection is closed def getline(self): - line = self.file.readline() + line = self.file.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 1: print('*get*', self.sanitize(line)) if not line: raise EOFError @@ -446,7 +451,9 @@ with self.transfercmd(cmd) as conn, \ conn.makefile('r', encoding=self.encoding) as fp: while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print('*retr*', repr(line)) if not line: break @@ -496,7 +503,9 @@ self.voidcmd('TYPE A') with self.transfercmd(cmd) as conn: while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != B_CRLF: if buf[-1] in B_CRLF: buf = buf[:-1] @@ -773,7 +782,9 @@ fp = conn.makefile('r', encoding=self.encoding) with fp, conn: while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print('*retr*', repr(line)) if not line: break @@ -804,7 +815,9 @@ self.voidcmd('TYPE A') with self.transfercmd(cmd) as conn: while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != B_CRLF: if buf[-1] in B_CRLF: buf = buf[:-1] diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -91,6 +91,7 @@ self.next_response = '' self.next_data = None self.rest = None + self.next_retr_data = RETR_DATA self.push('220 welcome') def collect_incoming_data(self, data): @@ -220,7 +221,7 @@ offset = int(self.rest) else: offset = 0 - self.dtp.push(RETR_DATA[offset:]) + self.dtp.push(self.next_retr_data[offset:]) self.dtp.close_when_done() self.rest = None @@ -242,6 +243,11 @@ self.dtp.push(MLSD_DATA) self.dtp.close_when_done() + def cmd_setlongretr(self, arg): + # For testing. Next RETR will return long line. + self.next_retr_data = 'x' * int(arg) + self.push('125 setlongretr ok') + class DummyFTPServer(asyncore.dispatcher, threading.Thread): @@ -758,6 +764,20 @@ self.assertEqual(ftplib.parse257('257 "/foo/b""ar"'), '/foo/b"ar') self.assertEqual(ftplib.parse257('257 "/foo/b""ar" created'), '/foo/b"ar') + def test_line_too_long(self): + self.assertRaises(ftplib.Error, self.client.sendcmd, + 'x' * self.client.maxline * 2) + + def test_retrlines_too_long(self): + self.client.sendcmd('SETLONGRETR %d' % (self.client.maxline * 2)) + received = [] + self.assertRaises(ftplib.Error, + self.client.retrlines, 'retr', received.append) + + def test_storlines_too_long(self): + f = io.BytesIO(b'x' * self.client.maxline * 2) + self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) + class TestIPv6Environment(TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -78,6 +78,10 @@ Library ------- +- Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by + limiting the call to readline(). Original patch by Micha? + Jastrz?bski and Giampaolo Rodola. + - Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. Patch by David Edelsohn. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 16:02:40 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 16:02:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2316038=3A_CVE-2013-1752=3A_ftplib=3A_Limit_amoun?= =?utf-8?q?t_of_data_read_by?= Message-ID: <3d2jNc4ffWz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/0c48fe975c54 changeset: 86512:0c48fe975c54 parent: 86509:84a8b797c5c5 parent: 86511:38db4d0726bd user: Serhiy Storchaka date: Sun Oct 20 17:02:10 2013 +0300 summary: Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. files: Lib/ftplib.py | 15 ++++++++++++--- Lib/test/test_ftplib.py | 22 +++++++++++++++++++++- Misc/NEWS | 4 ++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -50,6 +50,8 @@ # The standard FTP server control port FTP_PORT = 21 +# The sizehint parameter passed to readline() calls +MAXLINE = 8192 # Exception raised when an error or invalid response is received @@ -97,6 +99,7 @@ debugging = 0 host = '' port = FTP_PORT + maxline = MAXLINE sock = None file = None welcome = None @@ -197,7 +200,9 @@ # Internal: return one line from the server, stripping CRLF. # Raise EOFError if the connection is closed def getline(self): - line = self.file.readline() + line = self.file.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 1: print('*get*', self.sanitize(line)) if not line: @@ -463,7 +468,9 @@ with self.transfercmd(cmd) as conn, \ conn.makefile('r', encoding=self.encoding) as fp: while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print('*retr*', repr(line)) if not line: @@ -522,7 +529,9 @@ self.voidcmd('TYPE A') with self.transfercmd(cmd) as conn: while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != B_CRLF: diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -92,6 +92,7 @@ self.next_response = '' self.next_data = None self.rest = None + self.next_retr_data = RETR_DATA self.push('220 welcome') def collect_incoming_data(self, data): @@ -221,7 +222,7 @@ offset = int(self.rest) else: offset = 0 - self.dtp.push(RETR_DATA[offset:]) + self.dtp.push(self.next_retr_data[offset:]) self.dtp.close_when_done() self.rest = None @@ -243,6 +244,11 @@ self.dtp.push(MLSD_DATA) self.dtp.close_when_done() + def cmd_setlongretr(self, arg): + # For testing. Next RETR will return long line. + self.next_retr_data = 'x' * int(arg) + self.push('125 setlongretr ok') + class DummyFTPServer(asyncore.dispatcher, threading.Thread): @@ -759,6 +765,20 @@ self.assertEqual(ftplib.parse257('257 "/foo/b""ar"'), '/foo/b"ar') self.assertEqual(ftplib.parse257('257 "/foo/b""ar" created'), '/foo/b"ar') + def test_line_too_long(self): + self.assertRaises(ftplib.Error, self.client.sendcmd, + 'x' * self.client.maxline * 2) + + def test_retrlines_too_long(self): + self.client.sendcmd('SETLONGRETR %d' % (self.client.maxline * 2)) + received = [] + self.assertRaises(ftplib.Error, + self.client.retrlines, 'retr', received.append) + + def test_storlines_too_long(self): + f = io.BytesIO(b'x' * self.client.maxline * 2) + self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) + class TestIPv6Environment(TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,10 @@ Library ------- +- Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by + limiting the call to readline(). Original patch by Micha? + Jastrz?bski and Giampaolo Rodola. + - Issue #17087: Improved the repr for regular expression match objects. - Issue #18235: Fix the sysconfig variables LDSHARED and BLDSHARED under AIX. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 16:25:56 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 16:25:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogTWFrZSB0ZXN0X2F1?= =?utf-8?q?dioop_discoverable_by_unittest=2E?= Message-ID: <3d2jvS1vnHz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/849ed3ea215b changeset: 86513:849ed3ea215b branch: 3.3 parent: 86511:38db4d0726bd user: Serhiy Storchaka date: Sun Oct 20 17:24:42 2013 +0300 summary: Make test_audioop discoverable by unittest. files: Lib/test/test_audioop.py | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -1,7 +1,6 @@ import audioop import sys import unittest -from test.support import run_unittest def pack(width, data): return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data) @@ -374,8 +373,5 @@ self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state) -def test_main(): - run_unittest(TestAudioop) - if __name__ == '__main__': - test_main() + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 16:25:57 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Sun, 20 Oct 2013 16:25:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Make_test=5Faudioop_discoverable_by_unittest=2E?= Message-ID: <3d2jvT3rB8z7Lkf@mail.python.org> http://hg.python.org/cpython/rev/34986f55a32d changeset: 86514:34986f55a32d parent: 86512:0c48fe975c54 parent: 86513:849ed3ea215b user: Serhiy Storchaka date: Sun Oct 20 17:25:34 2013 +0300 summary: Make test_audioop discoverable by unittest. files: Lib/test/test_audioop.py | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -1,7 +1,6 @@ import audioop import sys import unittest -from test.support import run_unittest def pack(width, data): return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data) @@ -415,8 +414,5 @@ self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state) -def test_main(): - run_unittest(TestAudioop) - if __name__ == '__main__': - test_main() + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 20:30:31 2013 From: python-checkins at python.org (charles-francois.natali) Date: Sun, 20 Oct 2013 20:30:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319309=3A_asyncio?= =?utf-8?q?=3A_make_waitpid=28=29_wait_for_all_child_processes=2C_not_only?= Message-ID: <3d2qKg6sQ1z7LjX@mail.python.org> http://hg.python.org/cpython/rev/4cdb9f04494b changeset: 86515:4cdb9f04494b user: Charles-Fran?ois Natali date: Sun Oct 20 20:31:43 2013 +0200 summary: Issue #19309: asyncio: make waitpid() wait for all child processes, not only those in the same process group. files: Lib/asyncio/unix_events.py | 2 +- Lib/test/test_asyncio/test_events.py | 20 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -168,7 +168,7 @@ def _sig_chld(self): try: try: - pid, status = os.waitpid(0, os.WNOHANG) + pid, status = os.waitpid(-1, os.WNOHANG) except ChildProcessError: return if pid == 0: diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1233,6 +1233,26 @@ self.loop.run_until_complete(proto.completed) self.assertEqual(-signal.SIGTERM, proto.returncode) + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_wait_no_same_group(self): + proto = None + transp = None + + @tasks.coroutine + def connect(): + nonlocal proto + # start the new process in a new session + transp, proto = yield from self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'exit 7', stdin=None, stdout=None, stderr=None, + start_new_session=True) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.completed) + self.assertEqual(7, proto.returncode) + if sys.platform == 'win32': from asyncio import windows_events -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 21:33:04 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 21:33:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Make_various_asyncio_test_?= =?utf-8?q?files_individually_runnable?= Message-ID: <3d2rjr0g6hz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/2a2b983c3d4a changeset: 86516:2a2b983c3d4a user: Antoine Pitrou date: Sun Oct 20 21:02:53 2013 +0200 summary: Make various asyncio test files individually runnable files: Lib/test/test_asyncio/test_base_events.py | 4 ++++ Lib/test/test_asyncio/test_proactor_events.py | 4 ++++ Lib/test/test_asyncio/test_selector_events.py | 4 ++++ Lib/test/test_asyncio/test_selectors.py | 4 ++++ Lib/test/test_asyncio/test_transports.py | 4 ++++ Lib/test/test_asyncio/test_unix_events.py | 4 ++++ Lib/test/test_asyncio/test_windows_events.py | 4 ++++ Lib/test/test_asyncio/test_windows_utils.py | 4 ++++ 8 files changed, 32 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -588,3 +588,7 @@ self.loop._accept_connection(MyProto, sock) self.assertTrue(sock.close.called) self.assertTrue(m_log.exception.called) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -478,3 +478,7 @@ self.loop._stop_serving(sock) self.assertTrue(sock.close.called) self.proactor._stop_serving.assert_called_with(sock) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1483,3 +1483,7 @@ transport._fatal_error(err) self.protocol.connection_refused.assert_called_with(err) m_exc.assert_called_with('Fatal error for %s', transport) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_selectors.py b/Lib/test/test_asyncio/test_selectors.py --- a/Lib/test/test_asyncio/test_selectors.py +++ b/Lib/test/test_asyncio/test_selectors.py @@ -143,3 +143,7 @@ if hasattr(selectors.DefaultSelector, 'fileno'): def test_fileno(self): self.assertIsInstance(selectors.DefaultSelector().fileno(), int) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py --- a/Lib/test/test_asyncio/test_transports.py +++ b/Lib/test/test_asyncio/test_transports.py @@ -53,3 +53,7 @@ self.assertRaises(NotImplementedError, transport.send_signal, 1) self.assertRaises(NotImplementedError, transport.terminate) self.assertRaises(NotImplementedError, transport.kill) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -768,3 +768,7 @@ tr.write_eof() self.assertTrue(tr._closing) self.assertFalse(self.protocol.connection_lost.called) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -93,3 +93,7 @@ protocols.Protocol, ADDRESS) return 'done' + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py --- a/Lib/test/test_asyncio/test_windows_utils.py +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -138,3 +138,7 @@ # allow for partial reads... self.assertTrue(msg.upper().rstrip().startswith(out)) self.assertTrue(b"stderr".startswith(err)) + + +if __name__ == '__main__': + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 21:45:39 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 21:45:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Skip_one_asyncio_test_when?= =?utf-8?q?_IPv6_isn=27t_supported_=28Windows_buildbots=29?= Message-ID: <3d2s0M13VQz7LjX@mail.python.org> http://hg.python.org/cpython/rev/f43c48129ec6 changeset: 86517:f43c48129ec6 user: Antoine Pitrou date: Sun Oct 20 21:45:29 2013 +0200 summary: Skip one asyncio test when IPv6 isn't supported (Windows buildbots) files: Lib/test/test_asyncio/test_base_events.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -5,6 +5,7 @@ import time import unittest import unittest.mock +from test.support import find_unused_port, IPV6_ENABLED from asyncio import base_events from asyncio import events @@ -533,6 +534,7 @@ self.assertRaises( OSError, self.loop.run_until_complete, coro) + @unittest.skipUnless(IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_no_matching_family(self): coro = self.loop.create_datagram_endpoint( protocols.DatagramProtocol, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 21:53:17 2013 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 20 Oct 2013 21:53:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Grammar_fix?= Message-ID: <3d2s9945Fpz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/3dd7a39780bf changeset: 86518:3dd7a39780bf user: Andrew Kuchling date: Sun Oct 20 15:53:08 2013 -0400 summary: Grammar fix files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,7 +13,7 @@ - Issue #19301: Give classes and functions that are explicitly marked global a global qualname. -- Issue #19279: UTF-7 decoder no more produces illegal strings. +- Issue #19279: UTF-7 decoder no longer produces illegal strings. - Issue #16612: Add "Argument Clinic", a compile-time preprocessor for C files to generate argument parsing code. (See PEP 436.) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 23:23:40 2013 From: python-checkins at python.org (charles-francois.natali) Date: Sun, 20 Oct 2013 23:23:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319310=3A_asyncio?= =?utf-8?q?=3A_fix_child_processes_reaping_logic=2E?= Message-ID: <3d2v9S2rm7zT1q@mail.python.org> http://hg.python.org/cpython/rev/28397ecf2316 changeset: 86519:28397ecf2316 user: Charles-Fran?ois Natali date: Sun Oct 20 23:23:44 2013 +0200 summary: Issue #19310: asyncio: fix child processes reaping logic. files: Lib/asyncio/unix_events.py | 36 +++++++++++++------------ 1 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -167,23 +167,25 @@ def _sig_chld(self): try: - try: - pid, status = os.waitpid(-1, os.WNOHANG) - except ChildProcessError: - return - if pid == 0: - self.call_soon(self._sig_chld) - return - elif os.WIFSIGNALED(status): - returncode = -os.WTERMSIG(status) - elif os.WIFEXITED(status): - returncode = os.WEXITSTATUS(status) - else: - self.call_soon(self._sig_chld) - return - transp = self._subprocesses.get(pid) - if transp is not None: - transp._process_exited(returncode) + # because of signal coalescing, we must keep calling waitpid() as + # long as we're able to reap a child + while True: + try: + pid, status = os.waitpid(-1, os.WNOHANG) + except ChildProcessError: + break + if pid == 0: + break + elif os.WIFSIGNALED(status): + returncode = -os.WTERMSIG(status) + elif os.WIFEXITED(status): + returncode = os.WEXITSTATUS(status) + else: + # shouldn't happen + continue + transp = self._subprocesses.get(pid) + if transp is not None: + transp._process_exited(returncode) except Exception: logger.exception('Unknown exception in SIGCHLD handler') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 23:26:30 2013 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 20 Oct 2013 23:26:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319297=3A_fix_reso?= =?utf-8?q?urce_warnings_in_test=5Fasyncio=2E__Patch_by_Vajrasky_Kok=2E?= Message-ID: <3d2vDk266pz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/8ad3e9cf9590 changeset: 86520:8ad3e9cf9590 user: Antoine Pitrou date: Sun Oct 20 23:26:23 2013 +0200 summary: Close #19297: fix resource warnings in test_asyncio. Patch by Vajrasky Kok. files: Lib/asyncio/test_utils.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -126,6 +126,7 @@ yield httpd finally: httpd.shutdown() + httpd.server_close() server_thread.join() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 23:51:01 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Oct 2013 23:51:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_cleanup_the_construction_o?= =?utf-8?b?ZiBfX3F1YWxuYW1lX18gKGNsb3NlcyAjMTkzMDEgYWdhaW4p?= Message-ID: <3d2vn148hVz7LjX@mail.python.org> http://hg.python.org/cpython/rev/bb2affc1e317 changeset: 86521:bb2affc1e317 user: Benjamin Peterson date: Sun Oct 20 17:50:28 2013 -0400 summary: cleanup the construction of __qualname__ (closes #19301 again) files: Lib/importlib/_bootstrap.py | 3 +- Lib/test/test_descr.py | 4 +- Lib/test/test_funcattrs.py | 5 +- Python/compile.c | 154 +++++++------ Python/importlib.h | 270 ++++++++++++------------ 5 files changed, 227 insertions(+), 209 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -370,12 +370,13 @@ # Python 3.4a1 3270 (various tweaks to the __class__ closure) # Python 3.4a1 3280 (remove implicit class argument) # Python 3.4a4 3290 (changes to __qualname__ computation) +# Python 3.4a4 3300 (more changes to __qualname__ computation) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually # due to the addition of new opcodes). -MAGIC_NUMBER = (3290).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3300).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4519,8 +4519,10 @@ global Y class Y: - pass + class Inside: + pass self.assertEqual(Y.__qualname__, 'Y') + self.assertEqual(Y.Inside.__qualname__, 'Y.Inside') def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -9,7 +9,9 @@ pass global inner_global_function def inner_global_function(): - pass + def inner_function2(): + pass + return inner_function2 return LocalClass return lambda: inner_function @@ -120,6 +122,7 @@ self.assertEqual(global_function()()().__qualname__, 'global_function..inner_function..LocalClass') self.assertEqual(inner_global_function.__qualname__, 'inner_global_function') + self.assertEqual(inner_global_function().__qualname__, 'inner_global_function..inner_function2') self.b.__qualname__ = 'c' self.assertEqual(self.b.__qualname__, 'c') self.b.__qualname__ = 'd' diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -94,6 +94,7 @@ COMPILER_SCOPE_MODULE, COMPILER_SCOPE_CLASS, COMPILER_SCOPE_FUNCTION, + COMPILER_SCOPE_LAMBDA, COMPILER_SCOPE_COMPREHENSION, }; @@ -104,6 +105,7 @@ PySTEntryObject *u_ste; PyObject *u_name; + PyObject *u_qualname; /* dot-separated qualified name (lazy) */ int u_scope_type; /* The following fields are dicts that map objects to @@ -199,6 +201,7 @@ expr_ty starargs, expr_ty kwargs); static int compiler_try_except(struct compiler *, stmt_ty); +static int compiler_set_qualname(struct compiler *); static PyCodeObject *assemble(struct compiler *, int addNone); static PyObject *__doc__; @@ -506,6 +509,7 @@ } Py_CLEAR(u->u_ste); Py_CLEAR(u->u_name); + Py_CLEAR(u->u_qualname); Py_CLEAR(u->u_consts); Py_CLEAR(u->u_names); Py_CLEAR(u->u_varnames); @@ -620,6 +624,11 @@ if (compiler_use_new_block(c) == NULL) return 0; + if (u->u_scope_type != COMPILER_SCOPE_MODULE) { + if (!compiler_set_qualname(c)) + return 0; + } + return 1; } @@ -647,71 +656,77 @@ } -static PyObject * -compiler_scope_qualname(struct compiler *c, identifier scope_name) +static int +compiler_set_qualname(struct compiler *c) { + _Py_static_string(dot, "."); + _Py_static_string(dot_locals, "."); Py_ssize_t stack_size; - int global_scope; - _Py_static_string(dot, "."); - _Py_static_string(locals, ""); - struct compiler_unit *u; - PyObject *capsule, *name, *seq, *dot_str, *locals_str; - - u = c->u; - seq = PyList_New(0); - if (seq == NULL) - return NULL; - + struct compiler_unit *u = c->u; + PyObject *name, *base, *dot_str, *dot_locals_str; + + base = NULL; stack_size = PyList_GET_SIZE(c->c_stack); assert(stack_size >= 1); - global_scope = stack_size == 1; - if (scope_name != NULL && !global_scope) { - int scope; - PyObject *mangled; + if (stack_size > 1) { + int scope, force_global = 0; + struct compiler_unit *parent; + PyObject *mangled, *capsule; + capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1); - u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); - assert(u); - mangled = _Py_Mangle(u->u_private, scope_name); - if (!mangled) - return NULL; - scope = PyST_GetScope(u->u_ste, mangled); - Py_DECREF(mangled); - assert(scope != GLOBAL_IMPLICIT); - if (scope == GLOBAL_EXPLICIT) - global_scope = 1; - } - if (!global_scope) { - Py_ssize_t i; - for (i = 1; i < stack_size; i++) { - capsule = PyList_GET_ITEM(c->c_stack, i); - u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); - assert(u); - assert(u->u_scope_type != COMPILER_SCOPE_MODULE); - if (PyList_Append(seq, u->u_name)) - goto _error; - if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { - locals_str = _PyUnicode_FromId(&locals); - if (locals_str == NULL) - goto _error; - if (PyList_Append(seq, locals_str)) - goto _error; + parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); + assert(parent); + + if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) { + assert(u->u_name); + mangled = _Py_Mangle(parent->u_private, u->u_name); + if (!mangled) + return 0; + scope = PyST_GetScope(parent->u_ste, mangled); + Py_DECREF(mangled); + assert(scope != GLOBAL_IMPLICIT); + if (scope == GLOBAL_EXPLICIT) + force_global = 1; + } + + if (!force_global) { + if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION + || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) { + dot_locals_str = _PyUnicode_FromId(&dot_locals); + if (dot_locals_str == NULL) + return 0; + base = PyUnicode_Concat(parent->u_qualname, dot_locals_str); + if (base == NULL) + return 0; + } + else { + Py_INCREF(parent->u_qualname); + base = parent->u_qualname; } } } - u = c->u; - if (PyList_Append(seq, u->u_name)) - goto _error; - dot_str = _PyUnicode_FromId(&dot); - if (dot_str == NULL) - goto _error; - name = PyUnicode_Join(dot_str, seq); - Py_DECREF(seq); - return name; - -_error: - Py_XDECREF(seq); - return NULL; + if (base != NULL) { + dot_str = _PyUnicode_FromId(&dot); + if (dot_str == NULL) { + Py_DECREF(base); + return 0; + } + name = PyUnicode_Concat(base, dot_str); + Py_DECREF(base); + if (name == NULL) + return 0; + PyUnicode_Append(&name, u->u_name); + if (name == NULL) + return 0; + } + else { + Py_INCREF(u->u_name); + name = u->u_name; + } + u->u_qualname = name; + + return 1; } /* Allocate a new block and return a pointer to it. @@ -1661,9 +1676,10 @@ VISIT_IN_SCOPE(c, stmt, st); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, s->v.FunctionDef.name); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) { + if (co == NULL) { Py_XDECREF(qualname); Py_XDECREF(co); return 0; @@ -1733,14 +1749,8 @@ return 0; } Py_DECREF(str); - /* store the __qualname__ */ - str = compiler_scope_qualname(c, s->v.ClassDef.name); - if (!str) { - compiler_exit_scope(c); - return 0; - } - ADDOP_O(c, LOAD_CONST, str, consts); - Py_DECREF(str); + assert(c->u->u_qualname); + ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts); str = PyUnicode_InternFromString("__qualname__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); @@ -1855,7 +1865,7 @@ if (res < 0) return 0; kw_default_count = res; } - if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, + if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA, (void *)e, e->lineno)) return 0; @@ -1874,9 +1884,10 @@ ADDOP_IN_SCOPE(c, RETURN_VALUE); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, NULL); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) return 0; arglength = asdl_seq_LEN(args->defaults); @@ -3151,9 +3162,10 @@ } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, NULL); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) goto error; if (!compiler_make_closure(c, co, 0, qualname)) diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 23:52:20 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Oct 2013 23:52:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_fix_declaration_of_Statist?= =?utf-8?q?icsError?= Message-ID: <3d2vpX0yxGz7LjX@mail.python.org> http://hg.python.org/cpython/rev/8654e9b63f77 changeset: 86522:8654e9b63f77 user: Benjamin Peterson date: Sun Oct 20 17:52:09 2013 -0400 summary: fix declaration of StatisticsError files: Doc/library/statistics.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -454,9 +454,9 @@ A single exception is defined: -:exc:`StatisticsError` +.. exception:: `StatisticsError` -Subclass of :exc:`ValueError` for statistics-related exceptions. + Subclass of :exc:`ValueError` for statistics-related exceptions. .. # This modelines must appear within the last ten lines of the file. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 20 23:53:04 2013 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Oct 2013 23:53:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_remove_backticks?= Message-ID: <3d2vqN72Hcz7LjX@mail.python.org> http://hg.python.org/cpython/rev/e9b4e57fabaf changeset: 86523:e9b4e57fabaf user: Benjamin Peterson date: Sun Oct 20 17:52:54 2013 -0400 summary: remove backticks files: Doc/library/statistics.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -454,7 +454,7 @@ A single exception is defined: -.. exception:: `StatisticsError` +.. exception:: StatisticsError Subclass of :exc:`ValueError` for statistics-related exceptions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 00:38:44 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 00:38:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_=2319311=3A_mention_hg_up?= =?utf-8?q?date_in_the_bisect_faq=2E?= Message-ID: <3d2wr44Py0zN1Q@mail.python.org> http://hg.python.org/devguide/rev/24c2cfee3b06 changeset: 646:24c2cfee3b06 user: Ezio Melotti date: Mon Oct 21 01:38:32 2013 +0300 summary: #19311: mention hg update in the bisect faq. files: faq.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/faq.rst b/faq.rst --- a/faq.rst +++ b/faq.rst @@ -687,9 +687,9 @@ hg bisect --bad -Then you must find a changeset that doesn't have the bug. You can conveniently -choose a faraway changeset (for example a former release), and check that it -is indeed "good". Then type:: +Then you must ``update`` to a previous changeset that doesn't have the bug. +You can conveniently choose a faraway changeset (for example a former release), +and check that it is indeed "good". Then type:: hg bisect --good -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Mon Oct 21 00:52:47 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 00:52:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2319307=3A_Improve_error_?= =?utf-8?q?message_for_json=2Eload=28s=29_while_passing_objects_of_the?= Message-ID: <3d2x8H3m79z7Ljg@mail.python.org> http://hg.python.org/cpython/rev/241996bd3c6b changeset: 86524:241996bd3c6b user: Ezio Melotti date: Mon Oct 21 01:52:33 2013 +0300 summary: #19307: Improve error message for json.load(s) while passing objects of the wrong type. files: Lib/json/__init__.py | 3 +++ Lib/test/test_json/test_decode.py | 9 ++++++++- Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 1 deletions(-) diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -310,6 +310,9 @@ The ``encoding`` argument is ignored and deprecated. """ + if not isinstance(s, str): + raise TypeError('the JSON object must be str, not {!r}'.format( + s.__class__.__name__)) if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -1,5 +1,5 @@ import decimal -from io import StringIO +from io import StringIO, BytesIO from collections import OrderedDict from test.test_json import PyTest, CTest @@ -70,5 +70,12 @@ msg = 'escape' self.assertRaisesRegex(ValueError, msg, self.loads, s) + def test_invalid_input_type(self): + msg = 'the JSON object must be str' + for value in [1, 3.14, b'bytes', b'\xff\x00', [], {}, None]: + self.assertRaisesRegex(TypeError, msg, self.loads, value) + with self.assertRaisesRegex(TypeError, msg): + self.json.load(BytesIO(b'[1,2,3]')) + class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,9 @@ Library ------- +- Issue #19307: Improve error message for json.load(s) while passing objects + of the wrong type. + - Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 01:11:10 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 01:11:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2318958=3A_Improve_error_?= =?utf-8?q?message_for_json=2Eload=28s=29_while_passing_a_string_that?= Message-ID: <3d2xYV2XZQz7LlG@mail.python.org> http://hg.python.org/cpython/rev/ac016cba7e64 changeset: 86525:ac016cba7e64 user: Ezio Melotti date: Mon Oct 21 02:10:55 2013 +0300 summary: #18958: Improve error message for json.load(s) while passing a string that starts with a UTF-8 BOM. files: Lib/json/__init__.py | 2 ++ Lib/test/test_json/test_decode.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 19 insertions(+), 0 deletions(-) diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -313,6 +313,8 @@ if not isinstance(s, str): raise TypeError('the JSON object must be str, not {!r}'.format( s.__class__.__name__)) + if s.startswith(u'\ufeff'): + raise ValueError("Unexpected UTF-8 BOM (decode using utf-8-sig)") if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -77,5 +77,19 @@ with self.assertRaisesRegex(TypeError, msg): self.json.load(BytesIO(b'[1,2,3]')) + def test_string_with_utf8_bom(self): + # see #18958 + bom_json = "[1,2,3]".encode('utf-8-sig').decode('utf-8') + with self.assertRaises(ValueError) as cm: + self.loads(bom_json) + self.assertIn('BOM', str(cm.exception)) + with self.assertRaises(ValueError) as cm: + self.json.load(StringIO(bom_json)) + self.assertIn('BOM', str(cm.exception)) + # make sure that the BOM is not detected in the middle of a string + bom_in_str = '"{}"'.format(''.encode('utf-8-sig').decode('utf-8')) + self.assertEqual(self.loads(bom_in_str), '\ufeff') + self.assertEqual(self.json.load(StringIO(bom_in_str)), '\ufeff') + class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,9 @@ Library ------- +- Issue #18958: Improve error message for json.load(s) while passing a string + that starts with a UTF-8 BOM. + - Issue #19307: Improve error message for json.load(s) while passing objects of the wrong type. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 01:54:14 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 01:54:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MjM4LCAjMTky?= =?utf-8?q?89=3A_fix_description_of_the_align_and_fill_values_of_the_forma?= =?utf-8?q?t?= Message-ID: <3d2yWB3RjDz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/e3ff2065c548 changeset: 86526:e3ff2065c548 branch: 3.3 parent: 86513:849ed3ea215b user: Ezio Melotti date: Mon Oct 21 02:53:07 2013 +0300 summary: #19238, #19289: fix description of the align and fill values of the format specification. files: Doc/library/string.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -293,18 +293,18 @@ .. productionlist:: sf format_spec: [[`fill`]`align`][`sign`][#][0][`width`][,][.`precision`][`type`] - fill: + fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " width: `integer` precision: `integer` type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" -The *fill* character can be any character other than '{' or '}'. The presence -of a fill character is signaled by the character following it, which must be -one of the alignment options. If the second character of *format_spec* is not -a valid alignment option, then it is assumed that both the fill character and -the alignment option are absent. +If a valid *align* value is specified, it can be preceeded by a *fill* +character that can be any character and defaults to a space if omitted. +Note that it is not possible to use ``{`` and ``}`` as *fill* char while +using the :meth:`str.format` method; this limitation however doesn't +affect the :func:`format` function. The meaning of the various alignment options is as follows: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 01:54:15 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 01:54:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MjM4LCAjMTkyODk6IG1lcmdlIHdpdGggMy4zLg==?= Message-ID: <3d2yWC5Lrhz7LkB@mail.python.org> http://hg.python.org/cpython/rev/f52892642c15 changeset: 86527:f52892642c15 parent: 86525:ac016cba7e64 parent: 86526:e3ff2065c548 user: Ezio Melotti date: Mon Oct 21 02:53:30 2013 +0300 summary: #19238, #19289: merge with 3.3. files: Doc/library/string.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -293,18 +293,18 @@ .. productionlist:: sf format_spec: [[`fill`]`align`][`sign`][#][0][`width`][,][.`precision`][`type`] - fill: + fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " width: `integer` precision: `integer` type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" -The *fill* character can be any character other than '{' or '}'. The presence -of a fill character is signaled by the character following it, which must be -one of the alignment options. If the second character of *format_spec* is not -a valid alignment option, then it is assumed that both the fill character and -the alignment option are absent. +If a valid *align* value is specified, it can be preceeded by a *fill* +character that can be any character and defaults to a space if omitted. +Note that it is not possible to use ``{`` and ``}`` as *fill* char while +using the :meth:`str.format` method; this limitation however doesn't +affect the :func:`format` function. The meaning of the various alignment options is as follows: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 01:54:17 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 01:54:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MjM4LCAjMTky?= =?utf-8?q?89=3A_fix_description_of_the_align_and_fill_values_of_the_forma?= =?utf-8?q?t?= Message-ID: <3d2yWF02rBz7LkW@mail.python.org> http://hg.python.org/cpython/rev/0592dc076bb7 changeset: 86528:0592dc076bb7 branch: 2.7 parent: 86510:44ac81e6d584 user: Ezio Melotti date: Mon Oct 21 02:53:07 2013 +0300 summary: #19238, #19289: fix description of the align and fill values of the format specification. files: Doc/library/string.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -323,18 +323,18 @@ .. productionlist:: sf format_spec: [[`fill`]`align`][`sign`][#][0][`width`][,][.`precision`][`type`] - fill: + fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " width: `integer` precision: `integer` type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" -The *fill* character can be any character other than '{' or '}'. The presence -of a fill character is signaled by the character following it, which must be -one of the alignment options. If the second character of *format_spec* is not -a valid alignment option, then it is assumed that both the fill character and -the alignment option are absent. +If a valid *align* value is specified, it can be preceeded by a *fill* +character that can be any character and defaults to a space if omitted. +Note that it is not possible to use ``{`` and ``}`` as *fill* char while +using the :meth:`str.format` method; this limitation however doesn't +affect the :func:`format` function. The meaning of the various alignment options is as follows: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 02:06:02 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 02:06:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzg5NjQ6IGZpeCBw?= =?utf-8?q?latform=2E=5Fsys=5Fversion_to_handle_IronPython_2=2E6+=2E?= Message-ID: <3d2ymp27yczQmw@mail.python.org> http://hg.python.org/cpython/rev/04a163f93ad4 changeset: 86529:04a163f93ad4 branch: 2.7 user: Ezio Melotti date: Mon Oct 21 03:03:32 2013 +0300 summary: #8964: fix platform._sys_version to handle IronPython 2.6+. files: Lib/platform.py | 19 ++++++++++++++++--- Lib/test/test_platform.py | 13 +++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1371,6 +1371,14 @@ '(?: \(([\d\.]+)\))?' ' on (.NET [\d\.]+)') +# IronPython covering 2.6 and 2.7 +_ironpython26_sys_version_parser = re.compile( + r'([\d.]+)\s*' + '\(IronPython\s*' + '[\d.]+\s*' + '\(([\d.]+)\) on ([\w.]+ [\d.]+(?: \(\d+-bit\))?)\)' +) + _pypy_sys_version_parser = re.compile( r'([\w.+]+)\s*' '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*' @@ -1408,19 +1416,24 @@ return result # Parse it - if sys_version[:10] == 'IronPython': + if 'IronPython' in sys_version: # IronPython name = 'IronPython' - match = _ironpython_sys_version_parser.match(sys_version) + if sys_version.startswith('IronPython'): + match = _ironpython_sys_version_parser.match(sys_version) + else: + match = _ironpython26_sys_version_parser.match(sys_version) + if match is None: raise ValueError( 'failed to parse IronPython sys.version: %s' % repr(sys_version)) + version, alt_version, compiler = match.groups() buildno = '' builddate = '' - elif sys.platform[:4] == 'java': + elif sys.platform.startswith('java'): # Jython name = 'Jython' match = _sys_version_parser.match(sys_version) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -84,15 +84,28 @@ ("CPython", "2.6.1", "tags/r261", "67515", ('r261:67515', 'Dec 6 2008 15:26:00'), 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'), + ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli") : ("IronPython", "2.0.0", "", "", ("", ""), ".NET 2.0.50727.3053"), + + ("2.6.1 (IronPython 2.6.1 (2.6.10920.0) on .NET 2.0.50727.1433)", None, "cli") + : + ("IronPython", "2.6.1", "", "", ("", ""), + ".NET 2.0.50727.1433"), + + ("2.7.4 (IronPython 2.7.4 (2.7.0.40) on Mono 4.0.30319.1 (32-bit))", None, "cli") + : + ("IronPython", "2.7.4", "", "", ("", ""), + "Mono 4.0.30319.1 (32-bit)"), + ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]", ('Jython', 'trunk', '6107'), "java1.5.0_16") : ("Jython", "2.5.0", "trunk", "6107", ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"), + ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]", ('PyPy', 'trunk', '63378'), self.save_platform) : diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -663,6 +663,7 @@ Nick Mathewson Laura Matson Graham Matthews +Martin Matusiak Dieter Maurer Daniel May Arnaud Mazin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -37,6 +37,9 @@ Library ------- +- Issue #8964: fix platform._sys_version to handle IronPython 2.6+. + Patch by Martin Matusiak. + - Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 02:06:03 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 02:06:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzg5NjQ6IGZpeCBw?= =?utf-8?q?latform=2E=5Fsys=5Fversion_to_handle_IronPython_2=2E6+=2E?= Message-ID: <3d2ymq57BmzQmw@mail.python.org> http://hg.python.org/cpython/rev/10a261824b62 changeset: 86530:10a261824b62 branch: 3.3 parent: 86526:e3ff2065c548 user: Ezio Melotti date: Mon Oct 21 03:03:32 2013 +0300 summary: #8964: fix platform._sys_version to handle IronPython 2.6+. files: Lib/platform.py | 19 ++++++++++++++++--- Lib/test/test_platform.py | 13 +++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1248,6 +1248,14 @@ '(?: \(([\d\.]+)\))?' ' on (.NET [\d\.]+)', re.ASCII) +# IronPython covering 2.6 and 2.7 +_ironpython26_sys_version_parser = re.compile( + r'([\d.]+)\s*' + '\(IronPython\s*' + '[\d.]+\s*' + '\(([\d.]+)\) on ([\w.]+ [\d.]+(?: \(\d+-bit\))?)\)' +) + _pypy_sys_version_parser = re.compile( r'([\w.+]+)\s*' '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*' @@ -1285,19 +1293,24 @@ return result # Parse it - if sys_version[:10] == 'IronPython': + if 'IronPython' in sys_version: # IronPython name = 'IronPython' - match = _ironpython_sys_version_parser.match(sys_version) + if sys_version.startswith('IronPython'): + match = _ironpython_sys_version_parser.match(sys_version) + else: + match = _ironpython26_sys_version_parser.match(sys_version) + if match is None: raise ValueError( 'failed to parse IronPython sys.version: %s' % repr(sys_version)) + version, alt_version, compiler = match.groups() buildno = '' builddate = '' - elif sys.platform[:4] == 'java': + elif sys.platform.startswith('java'): # Jython name = 'Jython' match = _sys_version_parser.match(sys_version) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -91,15 +91,28 @@ ("CPython", "2.6.1", "tags/r261", "67515", ('r261:67515', 'Dec 6 2008 15:26:00'), 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'), + ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli") : ("IronPython", "2.0.0", "", "", ("", ""), ".NET 2.0.50727.3053"), + + ("2.6.1 (IronPython 2.6.1 (2.6.10920.0) on .NET 2.0.50727.1433)", None, "cli") + : + ("IronPython", "2.6.1", "", "", ("", ""), + ".NET 2.0.50727.1433"), + + ("2.7.4 (IronPython 2.7.4 (2.7.0.40) on Mono 4.0.30319.1 (32-bit))", None, "cli") + : + ("IronPython", "2.7.4", "", "", ("", ""), + "Mono 4.0.30319.1 (32-bit)"), + ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]", ('Jython', 'trunk', '6107'), "java1.5.0_16") : ("Jython", "2.5.0", "trunk", "6107", ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"), + ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]", ('PyPy', 'trunk', '63378'), self.save_platform) : diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -791,6 +791,7 @@ Simon Mathieu Laura Matson Graham Matthews +Martin Matusiak Dieter Maurer Daniel May Madison May diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -78,6 +78,9 @@ Library ------- +- Issue #8964: fix platform._sys_version to handle IronPython 2.6+. + Patch by Martin Matusiak. + - Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by limiting the call to readline(). Original patch by Micha? Jastrz?bski and Giampaolo Rodola. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 02:06:04 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 02:06:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzg5NjQ6IG1lcmdlIHdpdGggMy4zLg==?= Message-ID: <3d2yms011hz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/1f7d8a42904c changeset: 86531:1f7d8a42904c parent: 86527:f52892642c15 parent: 86530:10a261824b62 user: Ezio Melotti date: Mon Oct 21 03:05:46 2013 +0300 summary: #8964: merge with 3.3. files: Lib/platform.py | 19 ++++++++++++++++--- Lib/test/test_platform.py | 13 +++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1183,6 +1183,14 @@ '(?: \(([\d\.]+)\))?' ' on (.NET [\d\.]+)', re.ASCII) +# IronPython covering 2.6 and 2.7 +_ironpython26_sys_version_parser = re.compile( + r'([\d.]+)\s*' + '\(IronPython\s*' + '[\d.]+\s*' + '\(([\d.]+)\) on ([\w.]+ [\d.]+(?: \(\d+-bit\))?)\)' +) + _pypy_sys_version_parser = re.compile( r'([\w.+]+)\s*' '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*' @@ -1220,19 +1228,24 @@ return result # Parse it - if sys_version[:10] == 'IronPython': + if 'IronPython' in sys_version: # IronPython name = 'IronPython' - match = _ironpython_sys_version_parser.match(sys_version) + if sys_version.startswith('IronPython'): + match = _ironpython_sys_version_parser.match(sys_version) + else: + match = _ironpython26_sys_version_parser.match(sys_version) + if match is None: raise ValueError( 'failed to parse IronPython sys.version: %s' % repr(sys_version)) + version, alt_version, compiler = match.groups() buildno = '' builddate = '' - elif sys.platform[:4] == 'java': + elif sys.platform.startswith('java'): # Jython name = 'Jython' match = _sys_version_parser.match(sys_version) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -91,15 +91,28 @@ ("CPython", "2.6.1", "tags/r261", "67515", ('r261:67515', 'Dec 6 2008 15:26:00'), 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'), + ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli") : ("IronPython", "2.0.0", "", "", ("", ""), ".NET 2.0.50727.3053"), + + ("2.6.1 (IronPython 2.6.1 (2.6.10920.0) on .NET 2.0.50727.1433)", None, "cli") + : + ("IronPython", "2.6.1", "", "", ("", ""), + ".NET 2.0.50727.1433"), + + ("2.7.4 (IronPython 2.7.4 (2.7.0.40) on Mono 4.0.30319.1 (32-bit))", None, "cli") + : + ("IronPython", "2.7.4", "", "", ("", ""), + "Mono 4.0.30319.1 (32-bit)"), + ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]", ('Jython', 'trunk', '6107'), "java1.5.0_16") : ("Jython", "2.5.0", "trunk", "6107", ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"), + ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]", ('PyPy', 'trunk', '63378'), self.save_platform) : diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -818,6 +818,7 @@ Simon Mathieu Laura Matson Graham Matthews +Martin Matusiak Dieter Maurer Daniel May Madison May diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -62,6 +62,9 @@ Library ------- +- Issue #8964: fix platform._sys_version to handle IronPython 2.6+. + Patch by Martin Matusiak. + - Issue #18958: Improve error message for json.load(s) while passing a string that starts with a UTF-8 BOM. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 02:14:19 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 02:14:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_=2313515=3A_document_secu?= =?utf-8?q?rity-related_documentation_practices=2E?= Message-ID: <3d2yyM51BwzQXg@mail.python.org> http://hg.python.org/devguide/rev/8bb5f4301e01 changeset: 647:8bb5f4301e01 user: Ezio Melotti date: Mon Oct 21 03:14:07 2013 +0300 summary: #13515: document security-related documentation practices. files: documenting.rst | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/documenting.rst b/documenting.rst --- a/documenting.rst +++ b/documenting.rst @@ -189,6 +189,27 @@ text. Long descriptions full of corner cases and caveats can create the impression that a function is more complex or harder to use than it actually is. +Security Considerations (and Other Concerns) +-------------------------------------------- + +Some modules provided with Python are inherently exposed to security issues +(e.g. shell injection vulnerabilities) due to the purpose of the module +(e.g. :mod:`ssl`). Littering the documentation of these modules with red +warning boxes for problems that are due to the task at hand, rather than +specifically to Python's support for that task, doesn't make for a good +reading experience. + +Instead, these security concerns should be gathered into a dedicated +"Security Considerations" section within the module's documentation, and +cross-referenced from the documentation of affected interfaces with a note +similar to ``"Please refer to the :ref:`security-considerations` section +for important information on how to avoid common mistakes."``. + +Similarly, if there is a common error that affects many interfaces in a +module (e.g. OS level pipe buffers filling up and stalling child processes), +these can be documented in a "Common Errors" section and cross-referenced +rather than repeated for every affected interface. + Code Examples ------------- -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Mon Oct 21 02:20:45 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 02:20:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?ZGV2Z3VpZGU6ICMxOTMxMiwgIzE5MzE0OiBm?= =?utf-8?q?ix_a_couple_of_typos_in_the_compiler_page_of_the_devguide=2E?= Message-ID: <3d2z5n29Bfz7Ljq@mail.python.org> http://hg.python.org/devguide/rev/640fae50d1bb changeset: 648:640fae50d1bb user: Ezio Melotti date: Mon Oct 21 03:20:32 2013 +0300 summary: #19312, #19314: fix a couple of typos in the compiler page of the devguide. Patch by Martin Matusiak. files: compiler.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler.rst b/compiler.rst --- a/compiler.rst +++ b/compiler.rst @@ -24,7 +24,7 @@ Starting with Python 2.5, the above steps are now used. This change was done to simplify compilation by breaking it into three steps. The purpose of this document is to outline how the latter three steps -of the process works. +of the process work. This document does not touch on how parsing works beyond what is needed to explain what is needed for compilation. It is also not exhaustive @@ -45,7 +45,7 @@ ``node *`` structs (as defined in Include/node.h). Querying data from the node structs can be done with the following -macros (which are all defined in Include/token.h): +macros (which are all defined in Include/node.h): ``CHILD(node *, int)`` Returns the nth child of the node using zero-offset indexing -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Mon Oct 21 03:21:11 2013 From: python-checkins at python.org (guido.van.rossum) Date: Mon, 21 Oct 2013 03:21:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_19306=3A_Add_extra_h?= =?utf-8?q?ints_to_faulthandler_stack_dumps_that_they_are_upside?= Message-ID: <3d30RW6kvCz7LlB@mail.python.org> http://hg.python.org/cpython/rev/cc8c37b5b449 changeset: 86532:cc8c37b5b449 user: Guido van Rossum date: Sun Oct 20 18:21:02 2013 -0700 summary: Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down. files: Lib/test/test_faulthandler.py | 18 +++++++++--------- Misc/NEWS | 17 ++++++++++++++--- Python/traceback.c | 16 ++++++++-------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -72,9 +72,9 @@ Raise an error if the output doesn't match the expected format. """ if all_threads: - header = 'Current thread XXX' + header = 'Current thread XXX (most recent call first)' else: - header = 'Traceback (most recent call first)' + header = 'Stack (most recent call first)' regex = """ ^Fatal Python error: {name} @@ -306,7 +306,7 @@ else: lineno = 8 expected = [ - 'Traceback (most recent call first):', + 'Stack (most recent call first):', ' File "", line %s in funcB' % lineno, ' File "", line 11 in funcA', ' File "", line 13 in ' @@ -338,7 +338,7 @@ func_name=func_name, ) expected = [ - 'Traceback (most recent call first):', + 'Stack (most recent call first):', ' File "", line 4 in %s' % truncated, ' File "", line 6 in ' ] @@ -392,13 +392,13 @@ else: lineno = 10 regex = """ -^Thread 0x[0-9a-f]+: +^Thread 0x[0-9a-f]+ \(most recent call first\): (?: File ".*threading.py", line [0-9]+ in [_a-z]+ ){{1,3}} File "", line 23 in run File ".*threading.py", line [0-9]+ in _bootstrap_inner File ".*threading.py", line [0-9]+ in _bootstrap -Current thread XXX: +Current thread XXX \(most recent call first\): File "", line {lineno} in dump File "", line 28 in $ """.strip() @@ -461,7 +461,7 @@ count = loops if repeat: count *= 2 - header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+:\n' % timeout_str + header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n' % timeout_str regex = expected_traceback(9, 20, header, min_count=count) self.assertRegex(trace, regex) else: @@ -563,9 +563,9 @@ trace = '\n'.join(trace) if not unregister: if all_threads: - regex = 'Current thread XXX:\n' + regex = 'Current thread XXX \(most recent call first\):\n' else: - regex = 'Traceback \(most recent call first\):\n' + regex = 'Stack \(most recent call first\):\n' regex = expected_traceback(7, 28, regex) self.assertRegex(trace, regex) else: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,10 +2,21 @@ Python News +++++++++++ +What's New in Python 3.4.0 Beta 1? +================================== + +Projected release date: 2013-11-24 + +Core and Builtins +----------------- + +- Issue 19306: Add extra hints to the faulthandler module's stack + dumps that these are "upside down". + What's New in Python 3.4.0 Alpha 4? -================================ - -Projected release date: 2013-10-20 +=================================== + +Release date: 2013-10-20 Core and Builtins ----------------- diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -471,13 +471,13 @@ write(fd, buffer, len); } -/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits, +/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits, and write it into the file fd. This function is signal safe. */ static void -dump_hexadecimal(int width, unsigned long value, int fd) +dump_hexadecimal(int fd, unsigned long value, int width) { int len; char buffer[sizeof(unsigned long) * 2 + 1]; @@ -544,15 +544,15 @@ } else if (ch < 0xff) { PUTS(fd, "\\x"); - dump_hexadecimal(2, ch, fd); + dump_hexadecimal(fd, ch, 2); } else if (ch < 0xffff) { PUTS(fd, "\\u"); - dump_hexadecimal(4, ch, fd); + dump_hexadecimal(fd, ch, 4); } else { PUTS(fd, "\\U"); - dump_hexadecimal(8, ch, fd); + dump_hexadecimal(fd, ch, 8); } } if (truncated) @@ -603,7 +603,7 @@ unsigned int depth; if (write_header) - PUTS(fd, "Traceback (most recent call first):\n"); + PUTS(fd, "Stack (most recent call first):\n"); frame = _PyThreadState_GetFrame(tstate); if (frame == NULL) @@ -641,8 +641,8 @@ PUTS(fd, "Current thread 0x"); else PUTS(fd, "Thread 0x"); - dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd); - PUTS(fd, ":\n"); + dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2); + PUTS(fd, " (most recent call first):\n"); } const char* -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 03:42:25 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 03:42:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzE5MzE5OiBmaXgg?= =?utf-8?q?ctypes_docs=3A_sizeof_is_an_operator_in_C=2C_not_a_function=2E?= Message-ID: <3d30w10h88z7LjY@mail.python.org> http://hg.python.org/cpython/rev/737b79e524aa changeset: 86533:737b79e524aa branch: 2.7 parent: 86529:04a163f93ad4 user: Ezio Melotti date: Mon Oct 21 04:41:40 2013 +0300 summary: #19319: fix ctypes docs: sizeof is an operator in C, not a function. files: Doc/library/ctypes.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -2006,8 +2006,8 @@ .. function:: sizeof(obj_or_type) - Returns the size in bytes of a ctypes type or instance memory buffer. Does the - same as the C ``sizeof()`` function. + Returns the size in bytes of a ctypes type or instance memory buffer. + Does the same as the C ``sizeof`` operator. .. function:: string_at(address[, size]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 03:42:26 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 03:42:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5MzE5OiBmaXgg?= =?utf-8?q?ctypes_docs=3A_sizeof_is_an_operator_in_C=2C_not_a_function=2E?= Message-ID: <3d30w22Z91z7Ljq@mail.python.org> http://hg.python.org/cpython/rev/d8e352e2f110 changeset: 86534:d8e352e2f110 branch: 3.3 parent: 86530:10a261824b62 user: Ezio Melotti date: Mon Oct 21 04:41:40 2013 +0300 summary: #19319: fix ctypes docs: sizeof is an operator in C, not a function. files: Doc/library/ctypes.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1909,8 +1909,8 @@ .. function:: sizeof(obj_or_type) - Returns the size in bytes of a ctypes type or instance memory buffer. Does the - same as the C ``sizeof()`` function. + Returns the size in bytes of a ctypes type or instance memory buffer. + Does the same as the C ``sizeof`` operator. .. function:: string_at(address, size=-1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 03:42:27 2013 From: python-checkins at python.org (ezio.melotti) Date: Mon, 21 Oct 2013 03:42:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?b?KTogIzE5MzE5OiBtZXJnZSB3aXRoIDMuMy4=?= Message-ID: <3d30w34QJFz7LjY@mail.python.org> http://hg.python.org/cpython/rev/49f8d07b6c5c changeset: 86535:49f8d07b6c5c parent: 86532:cc8c37b5b449 parent: 86534:d8e352e2f110 user: Ezio Melotti date: Mon Oct 21 04:42:12 2013 +0300 summary: #19319: merge with 3.3. files: Doc/library/ctypes.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1909,8 +1909,8 @@ .. function:: sizeof(obj_or_type) - Returns the size in bytes of a ctypes type or instance memory buffer. Does the - same as the C ``sizeof()`` function. + Returns the size in bytes of a ctypes type or instance memory buffer. + Does the same as the C ``sizeof`` operator. .. function:: string_at(address, size=-1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 03:59:36 2013 From: python-checkins at python.org (christian.tismer) Date: Mon, 21 Oct 2013 03:59:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_add_a_filterfunc_to_zip_fi?= =?utf-8?q?le=2EPyZipFile=2Ewritepy=2C_issue_19274?= Message-ID: <3d31Hr0h9Rz7LjX@mail.python.org> http://hg.python.org/cpython/rev/34fb83421119 changeset: 86536:34fb83421119 user: Christian Tismer date: Mon Oct 21 03:59:23 2013 +0200 summary: add a filterfunc to zip file.PyZipFile.writepy, issue 19274 files: Doc/library/zipfile.rst | 10 +- Doc/whatsnew/3.4.rst | 10 + Lib/test/test_zipfile.py | 182 +++++++++++++++----------- Lib/zipfile.py | 161 ++++++++++++----------- 4 files changed, 204 insertions(+), 159 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -382,7 +382,10 @@ Instances have one method in addition to those of :class:`ZipFile` objects: - .. method:: PyZipFile.writepy(pathname, basename='') + .. method:: PyZipFile.writepy(pathname, basename='', filterfunc=None) + + .. versionadded:: 3.4 + The *filterfunc* parameter. Search for files :file:`\*.py` and add the corresponding file to the archive. @@ -404,7 +407,10 @@ package directory, then all :file:`\*.py[co]` are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. *basename* is intended for internal - use only. The :meth:`writepy` method makes archives with file names like + use only. When *filterfunc(pathname)* is given, it will be called for every + invocation. When it returns a False value, that path and its subpaths will + be ignored. + The :meth:`writepy` method makes archives with file names like this:: string.pyc # Top level name diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -564,6 +564,16 @@ (Contributed by Antoine Pitrou in :issue:`17741`.) + +zipfile.PyZipfile +----------------- + +Add a filter function to ignore some packages (tests for instance), +:meth:`~zipfile.PyZipFile.writepy`. + +(Contributed by Christian Tismer in :issue:`19274`.) + + Other improvements ================== diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -591,6 +591,28 @@ self.assertCompiledIn('email/__init__.py', names) self.assertCompiledIn('email/mime/text.py', names) + def test_write_filtered_python_package(self): + import test + packagedir = os.path.dirname(test.__file__) + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + + stdout = sys.stdout + + # first make sure that the test folder gives error messages + sys.stdout = reportSIO = io.StringIO() + zipfp.writepy(packagedir) + reportStr = reportSIO.getvalue() + self.assertTrue('SyntaxError' in reportStr) + + # then check that the filter works + sys.stdout = reportSIO = io.StringIO() + zipfp.writepy(packagedir, filterfunc=lambda whatever:False) + reportStr = reportSIO.getvalue() + self.assertTrue('SyntaxError' not in reportStr) + + sys.stdout = stdout + def test_write_with_optimization(self): import email packagedir = os.path.dirname(email.__file__) @@ -600,7 +622,7 @@ ext = '.pyo' if optlevel == 1 else '.pyc' with TemporaryFile() as t, \ - zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp: + zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp: zipfp.writepy(packagedir) names = zipfp.namelist() @@ -733,25 +755,25 @@ def test_extract_hackers_arcnames_windows_only(self): """Test combination of path fixing and windows name sanitization.""" windows_hacknames = [ - (r'..\foo\bar', 'foo/bar'), - (r'..\/foo\/bar', 'foo/bar'), - (r'foo/\..\/bar', 'foo/bar'), - (r'foo\/../\bar', 'foo/bar'), - (r'C:foo/bar', 'foo/bar'), - (r'C:/foo/bar', 'foo/bar'), - (r'C://foo/bar', 'foo/bar'), - (r'C:\foo\bar', 'foo/bar'), - (r'//conky/mountpoint/foo/bar', 'foo/bar'), - (r'\\conky\mountpoint\foo\bar', 'foo/bar'), - (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), - (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), - (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), - (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), - (r'//?/C:/foo/bar', 'foo/bar'), - (r'\\?\C:\foo\bar', 'foo/bar'), - (r'C:/../C:/foo/bar', 'C_/foo/bar'), - (r'a:b\ce|f"g?h*i', 'b/c_d_e_f_g_h_i'), - ('../../foo../../ba..r', 'foo/ba..r'), + (r'..\foo\bar', 'foo/bar'), + (r'..\/foo\/bar', 'foo/bar'), + (r'foo/\..\/bar', 'foo/bar'), + (r'foo\/../\bar', 'foo/bar'), + (r'C:foo/bar', 'foo/bar'), + (r'C:/foo/bar', 'foo/bar'), + (r'C://foo/bar', 'foo/bar'), + (r'C:\foo\bar', 'foo/bar'), + (r'//conky/mountpoint/foo/bar', 'foo/bar'), + (r'\\conky\mountpoint\foo\bar', 'foo/bar'), + (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), + (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), + (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), + (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), + (r'//?/C:/foo/bar', 'foo/bar'), + (r'\\?\C:\foo\bar', 'foo/bar'), + (r'C:/../C:/foo/bar', 'C_/foo/bar'), + (r'a:b\ce|f"g?h*i', 'b/c_d_e_f_g_h_i'), + ('../../foo../../ba..r', 'foo/ba..r'), ] self._test_extract_hackers_arcnames(windows_hacknames) @@ -877,10 +899,10 @@ def test_unsupported_version(self): # File has an extract_version of 120 data = (b'PK\x03\x04x\x00\x00\x00\x00\x00!p\xa1@\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00' - b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06' - b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00') + b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00' + b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06' + b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00') self.assertRaises(NotImplementedError, zipfile.ZipFile, io.BytesIO(data), 'r') @@ -1066,11 +1088,11 @@ def test_unsupported_compression(self): # data is declared as shrunk, but actually deflated data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00' - b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' - b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' - b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' - b'/\x00\x00\x00!\x00\x00\x00\x00\x00') + b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' + b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' + b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' + b'/\x00\x00\x00!\x00\x00\x00\x00\x00') with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: self.assertRaises(NotImplementedError, zipf.open, 'x') @@ -1232,57 +1254,57 @@ class StoredBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_STORED zip_with_bad_crc = ( - b'PK\003\004\024\0\0\0\0\0 \213\212;:r' - b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' - b'ilehello,AworldP' - b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' - b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' - b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' - b'lePK\005\006\0\0\0\0\001\0\001\0003\000' - b'\0\0/\0\0\0\0\0') + b'PK\003\004\024\0\0\0\0\0 \213\212;:r' + b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' + b'ilehello,AworldP' + b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' + b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' + b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' + b'lePK\005\006\0\0\0\0\001\0\001\0003\000' + b'\0\0/\0\0\0\0\0') @requires_zlib class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED zip_with_bad_crc = ( - b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' - b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' - b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' - b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' - b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' - b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') + b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' + b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' + b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' + b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' + b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' + b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') @requires_bz2 class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 zip_with_bad_crc = ( - b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA' - b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ileBZh91AY&SY\xd4\xa8\xca' - b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5' - b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f' - b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14' - b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8' - b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK' - b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' - b'\x00\x00\x00\x00') + b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA' + b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ileBZh91AY&SY\xd4\xa8\xca' + b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5' + b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f' + b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14' + b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8' + b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK' + b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' + b'\x00\x00\x00\x00') @requires_lzma class LzmaBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_LZMA zip_with_bad_crc = ( - b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA' - b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I' - b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK' - b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA' - b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil' - b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00' - b'\x00>\x00\x00\x00\x00\x00') + b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA' + b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I' + b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK' + b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA' + b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil' + b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00' + b'\x00>\x00\x00\x00\x00\x00') class DecryptionTests(unittest.TestCase): @@ -1291,22 +1313,22 @@ ZIP file.""" data = ( - b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' - b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' - b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' - b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' - b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' - b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' - b'\x00\x00L\x00\x00\x00\x00\x00' ) + b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' + b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' + b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' + b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' + b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' + b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' + b'\x00\x00L\x00\x00\x00\x00\x00' ) data2 = ( - b'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02' - b'\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04' - b'\x00\xe8\x03\xe8\x03\xc7 ZIP64_LIMIT or compress_size > ZIP64_LIMIT: if not zip64: raise LargeZipFile("Filesize would require ZIP64 extensions") @@ -395,10 +395,10 @@ self.create_version = max(min_version, self.create_version) filename, flag_bits = self._encodeFilenameFlags() header = struct.pack(structFileHeader, stringFileHeader, - self.extract_version, self.reserved, flag_bits, - self.compress_type, dostime, dosdate, CRC, - compress_size, file_size, - len(filename), len(extra)) + self.extract_version, self.reserved, flag_bits, + self.compress_type, dostime, dosdate, CRC, + compress_size, file_size, + len(filename), len(extra)) return header + filename + extra def _encodeFilenameFlags(self): @@ -511,7 +511,7 @@ def _init(self): props = lzma._encode_filter_properties({'id': lzma.FILTER_LZMA1}) self._comp = lzma.LZMACompressor(lzma.FORMAT_RAW, filters=[ - lzma._decode_filter_properties(lzma.FILTER_LZMA1, props) + lzma._decode_filter_properties(lzma.FILTER_LZMA1, props) ]) return struct.pack(' MAX_EXTRACT_VERSION: raise NotImplementedError("zip file version %.1f" % (x.extract_version / 10)) @@ -1025,7 +1025,7 @@ # Convert date/time code to (year, month, day, hour, min, sec) x._raw_time = t x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, - t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) + t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) x._decodeExtra() x.header_offset = x.header_offset + concat @@ -1103,7 +1103,7 @@ if len(comment) >= ZIP_MAX_COMMENT: if self.debug: print('Archive comment is too long; truncating to %d bytes' - % ZIP_MAX_COMMENT) + % ZIP_MAX_COMMENT) comment = comment[:ZIP_MAX_COMMENT] self._comment = comment self._didModify = True @@ -1121,7 +1121,7 @@ raise TypeError("pwd: expected bytes, got %s" % type(pwd)) if not self.fp: raise RuntimeError( - "Attempt to read ZIP archive that was already closed") + "Attempt to read ZIP archive that was already closed") # Only open a new file for instances where we were not # given a file object in the constructor @@ -1294,7 +1294,7 @@ raise RuntimeError('write() requires mode "w" or "a"') if not self.fp: raise RuntimeError( - "Attempt to write ZIP archive that was already closed") + "Attempt to write ZIP archive that was already closed") _check_compression(zinfo.compress_type) if zinfo.file_size > ZIP64_LIMIT: if not self._allowZip64: @@ -1302,14 +1302,14 @@ if zinfo.header_offset > ZIP64_LIMIT: if not self._allowZip64: raise LargeZipFile( - "Zipfile size would require ZIP64 extensions") + "Zipfile size would require ZIP64 extensions") def write(self, filename, arcname=None, compress_type=None): """Put the bytes from filename into the archive under the name arcname.""" if not self.fp: raise RuntimeError( - "Attempt to write to ZIP archive that was already closed") + "Attempt to write to ZIP archive that was already closed") st = os.stat(filename) isdir = stat.S_ISDIR(st.st_mode) @@ -1356,7 +1356,7 @@ zinfo.compress_size = compress_size = 0 # Compressed size can be larger than uncompressed size zip64 = self._allowZip64 and \ - zinfo.file_size * 1.05 > ZIP64_LIMIT + zinfo.file_size * 1.05 > ZIP64_LIMIT self.fp.write(zinfo.FileHeader(zip64)) file_size = 0 while 1: @@ -1410,7 +1410,7 @@ if not self.fp: raise RuntimeError( - "Attempt to write to ZIP archive that was already closed") + "Attempt to write to ZIP archive that was already closed") zinfo.file_size = len(data) # Uncompressed size zinfo.header_offset = self.fp.tell() # Start of header data @@ -1430,7 +1430,7 @@ else: zinfo.compress_size = zinfo.file_size zip64 = zinfo.file_size > ZIP64_LIMIT or \ - zinfo.compress_size > ZIP64_LIMIT + zinfo.compress_size > ZIP64_LIMIT if zip64 and not self._allowZip64: raise LargeZipFile("Filesize would require ZIP64 extensions") self.fp.write(zinfo.FileHeader(zip64)) @@ -1439,7 +1439,7 @@ # Write CRC and file sizes after the file data fmt = ' ZIP64_LIMIT \ - or zinfo.compress_size > ZIP64_LIMIT: + or zinfo.compress_size > ZIP64_LIMIT: extra.append(zinfo.file_size) extra.append(zinfo.compress_size) file_size = 0xffffffff @@ -1485,8 +1485,8 @@ if extra: # Append a ZIP64 field to the extra's extra_data = struct.pack( - ' ZIP64_LIMIT): # Need to write the ZIP64 end-of-archive records zip64endrec = struct.pack( - structEndArchive64, stringEndArchive64, - 44, 45, 45, 0, 0, centDirCount, centDirCount, - centDirSize, centDirOffset) + structEndArchive64, stringEndArchive64, + 44, 45, 45, 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset) self.fp.write(zip64endrec) zip64locrec = struct.pack( - structEndArchive64Locator, - stringEndArchive64Locator, 0, pos2, 1) + structEndArchive64Locator, + stringEndArchive64Locator, 0, pos2, 1) self.fp.write(zip64locrec) centDirCount = min(centDirCount, 0xFFFF) centDirSize = min(centDirSize, 0xFFFFFFFF) centDirOffset = min(centDirOffset, 0xFFFFFFFF) endrec = struct.pack(structEndArchive, stringEndArchive, - 0, 0, centDirCount, centDirCount, - centDirSize, centDirOffset, len(self._comment)) + 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset, len(self._comment)) self.fp.write(endrec) self.fp.write(self._comment) self.fp.flush() @@ -1566,7 +1566,7 @@ allowZip64=allowZip64) self._optimize = optimize - def writepy(self, pathname, basename=""): + def writepy(self, pathname, basename="", filterfunc=None): """Add all files from "pathname" to the ZIP archive. If pathname is a package directory, search the directory and @@ -1577,7 +1577,13 @@ archive. Added modules are always module.pyo or module.pyc. This method will compile the module.py into module.pyc if necessary. + If filterfunc(pathname) is given, it is called with every argument. + When it is False, the file or directory is skipped. """ + if filterfunc and not filterfunc(pathname): + if self.debug: + print('pathname "%s" skipped by filterfunc' % pathname) + return dir, name = os.path.split(pathname) if os.path.isdir(pathname): initname = os.path.join(pathname, "__init__.py") @@ -1602,10 +1608,11 @@ if os.path.isdir(path): if os.path.isfile(os.path.join(path, "__init__.py")): # This is a package directory, add it - self.writepy(path, basename) # Recursive call + self.writepy(path, basename, + filterfunc=filterfunc) # Recursive call elif ext == ".py": fname, arcname = self._get_codename(path[0:-3], - basename) + basename) if self.debug: print("Adding", arcname) self.write(fname, arcname) @@ -1618,14 +1625,14 @@ root, ext = os.path.splitext(filename) if ext == ".py": fname, arcname = self._get_codename(path[0:-3], - basename) + basename) if self.debug: print("Adding", arcname) self.write(fname, arcname) else: if pathname[-3:] != ".py": raise RuntimeError( - 'Files added with writepy() must end with ".py"') + 'Files added with writepy() must end with ".py"') fname, arcname = self._get_codename(pathname[0:-3], basename) if self.debug: print("Adding file", arcname) @@ -1764,7 +1771,7 @@ elif os.path.isdir(path): for nm in os.listdir(path): addToZip(zf, - os.path.join(path, nm), os.path.join(zippath, nm)) + os.path.join(path, nm), os.path.join(zippath, nm)) # else: ignore with ZipFile(args[1], 'w', allowZip64=True) as zf: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 04:15:29 2013 From: python-checkins at python.org (guido.van.rossum) Date: Mon, 21 Oct 2013 04:15:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Update_faulthandler_docs?= =?utf-8?q?=2E?= Message-ID: <3d31f968Dqz7LjX@mail.python.org> http://hg.python.org/cpython/rev/5dc65f8d29a2 changeset: 86537:5dc65f8d29a2 user: Guido van Rossum date: Sun Oct 20 19:15:19 2013 -0700 summary: Update faulthandler docs. files: Doc/library/faulthandler.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -27,6 +27,7 @@ * Only the filename, the function name and the line number are displayed. (no source code) * It is limited to 100 frames and 100 threads. +* The order is reversed: the most recent call is shown first. By default, the Python traceback is written to :data:`sys.stderr`. To see tracebacks, applications must be run in the terminal. A log file can @@ -129,7 +130,7 @@ >>> ctypes.string_at(0) Fatal Python error: Segmentation fault - Current thread 0x00007fb899f39700: + Current thread 0x00007fb899f39700 (most recent call first): File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at File "", line 1 in Segmentation fault -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 05:42:17 2013 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 21 Oct 2013 05:42:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319271=3A__By_Pyth?= =?utf-8?q?on3=2E4=2C_the_Python_2=2E4_backport_links_are_no_longer_of?= Message-ID: <3d33ZK0Sjwz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/9e322a8f80d9 changeset: 86538:9e322a8f80d9 user: Raymond Hettinger date: Sun Oct 20 20:42:07 2013 -0700 summary: Issue #19271: By Python3.4, the Python 2.4 backport links are no longer of much interest. files: Doc/library/collections.rst | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -374,10 +374,6 @@ .. seealso:: - * `Counter class `_ - adapted for Python 2.5 and an early `Bag recipe - `_ for Python 2.4. - * `Bag class `_ in Smalltalk. @@ -920,11 +916,6 @@ >>> class Status: open, pending, closed = range(3) -.. seealso:: - - * `Named tuple recipe `_ - adapted for Python 2.4. - * `Recipe for named tuple abstract base class with a metaclass mix-in `_ by Jan Kaliszewski. Besides providing an :term:`abstract base class` for @@ -987,10 +978,6 @@ keyword arguments, but their order is lost because Python's function call semantics pass-in keyword arguments using a regular unordered dictionary. -.. seealso:: - - `Equivalent OrderedDict recipe `_ - that runs on Python 2.4 or later. :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 21 07:37:23 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 21 Oct 2013 07:37:23 +0200 Subject: [Python-checkins] Daily reference leaks (cc8c37b5b449): sum=4 Message-ID: results for cc8c37b5b449 on branch "default" -------------------------------------------- test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogzw3o__', '-x'] From python-checkins at python.org Mon Oct 21 07:37:48 2013 From: python-checkins at python.org (ethan.furman) Date: Mon, 21 Oct 2013 07:37:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319030=3A_final_pi?= =?utf-8?q?eces_for_proper_location_of_various_class_attributes?= Message-ID: <3d367c6jf1z7LjY@mail.python.org> http://hg.python.org/cpython/rev/2f09a6980e1a changeset: 86539:2f09a6980e1a user: Ethan Furman date: Sun Oct 20 22:37:39 2013 -0700 summary: Issue #19030: final pieces for proper location of various class attributes located in the metaclass. Okay, hopefully the very last patch for this issue. :/ I realized when playing with Enum that the metaclass attributes weren't always displayed properly. New patch properly locates DynamicClassAttributes, virtual class attributes (returned by __getattr__ and friends), and metaclass class attributes (if they are also in the metaclass __dir__ method). Also had to change one line in pydoc to get this to work. Added tests in test_inspect and test_pydoc to cover these situations. files: Lib/inspect.py | 55 ++++--- Lib/pydoc.py | 7 +- Lib/test/test_inspect.py | 20 ++- Lib/test/test_pydoc.py | 175 +++++++++++++++++++++++++++ 4 files changed, 226 insertions(+), 31 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -269,9 +269,9 @@ results = [] processed = set() names = dir(object) - # add any virtual attributes to the list of names if object is a class + # :dd any DynamicClassAttributes to the list of names if object is a class; # this may result in duplicate entries if, for example, a virtual - # attribute with the same name as a member property exists + # attribute with the same name as a DynamicClassAttribute exists try: for base in object.__bases__: for k, v in base.__dict__.items(): @@ -329,79 +329,88 @@ If one of the items in dir(cls) is stored in the metaclass it will now be discovered and not have None be listed as the class in which it was - defined. + defined. Any items whose home class cannot be discovered are skipped. """ mro = getmro(cls) metamro = getmro(type(cls)) # for attributes stored in the metaclass metamro = tuple([cls for cls in metamro if cls not in (type, object)]) - possible_bases = (cls,) + mro + metamro + class_bases = (cls,) + mro + all_bases = class_bases + metamro names = dir(cls) - # add any virtual attributes to the list of names + # :dd any DynamicClassAttributes to the list of names; # this may result in duplicate entries if, for example, a virtual - # attribute with the same name as a member property exists + # attribute with the same name as a DynamicClassAttribute exists. for base in mro: for k, v in base.__dict__.items(): if isinstance(v, types.DynamicClassAttribute): names.append(k) result = [] processed = set() - sentinel = object() + for name in names: # Get the object associated with the name, and where it was defined. # Normal objects will be looked up with both getattr and directly in # its class' dict (in case getattr fails [bug #1785], and also to look # for a docstring). - # For VirtualAttributes on the second pass we only look in the + # For DynamicClassAttributes on the second pass we only look in the # class's dict. # # Getting an obj from the __dict__ sometimes reveals more than # using getattr. Static and class methods are dramatic examples. homecls = None - get_obj = sentinel - dict_obj = sentinel + get_obj = None + dict_obj = None if name not in processed: try: if name == '__dict__': - raise Exception("__dict__ is special, we don't want the proxy") + raise Exception("__dict__ is special, don't want the proxy") get_obj = getattr(cls, name) except Exception as exc: pass else: homecls = getattr(get_obj, "__objclass__", homecls) - if homecls not in possible_bases: + if homecls not in class_bases: # if the resulting object does not live somewhere in the # mro, drop it and search the mro manually homecls = None last_cls = None - last_obj = None - for srch_cls in ((cls,) + mro): + # first look in the classes + for srch_cls in class_bases: srch_obj = getattr(srch_cls, name, None) - if srch_obj is get_obj: + if srch_obj == get_obj: last_cls = srch_cls - last_obj = srch_obj + # then check the metaclasses + for srch_cls in metamro: + try: + srch_obj = srch_cls.__getattr__(cls, name) + except AttributeError: + continue + if srch_obj == get_obj: + last_cls = srch_cls if last_cls is not None: homecls = last_cls - for base in possible_bases: + for base in all_bases: if name in base.__dict__: dict_obj = base.__dict__[name] - homecls = homecls or base + if homecls not in metamro: + homecls = base break if homecls is None: # unable to locate the attribute anywhere, most likely due to # buggy custom __dir__; discard and move on continue + obj = get_obj or dict_obj # Classify the object or its descriptor. - if get_obj is not sentinel: - obj = get_obj - else: - obj = dict_obj if isinstance(dict_obj, staticmethod): kind = "static method" + obj = dict_obj elif isinstance(dict_obj, classmethod): kind = "class method" - elif isinstance(obj, property): + obj = dict_obj + elif isinstance(dict_obj, property): kind = "property" + obj = dict_obj elif isfunction(obj) or ismethoddescriptor(obj): kind = "method" else: diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -1235,8 +1235,9 @@ doc = getdoc(value) else: doc = None - push(self.docother(getattr(object, name), - name, mod, maxlen=70, doc=doc) + '\n') + push(self.docother( + getattr(object, name, None) or homecls.__dict__[name], + name, mod, maxlen=70, doc=doc) + '\n') return attrs attrs = [(name, kind, cls, value) @@ -1258,7 +1259,6 @@ else: tag = "inherited from %s" % classname(thisclass, object.__module__) - # Sort attrs by name. attrs.sort() @@ -1273,6 +1273,7 @@ lambda t: t[1] == 'data descriptor') attrs = spilldata("Data and other attributes %s:\n" % tag, attrs, lambda t: t[1] == 'data') + assert attrs == [] attrs = inherited diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -667,9 +667,19 @@ return 'eggs' should_find_dca = inspect.Attribute('ham', 'data', VA, VA.__dict__['ham']) self.assertIn(should_find_dca, inspect.classify_class_attrs(VA)) - should_find_ga = inspect.Attribute('ham', 'data', VA, 'spam') + should_find_ga = inspect.Attribute('ham', 'data', Meta, 'spam') self.assertIn(should_find_ga, inspect.classify_class_attrs(VA)) + def test_classify_metaclass_class_attribute(self): + class Meta(type): + fish = 'slap' + def __dir__(self): + return ['__class__', '__modules__', '__name__', 'fish'] + class Class(metaclass=Meta): + pass + should_find = inspect.Attribute('fish', 'data', Meta, 'slap') + self.assertIn(should_find, inspect.classify_class_attrs(Class)) + def test_classify_VirtualAttribute(self): class Meta(type): def __dir__(cls): @@ -680,7 +690,7 @@ return super().__getattr(name) class Class(metaclass=Meta): pass - should_find = inspect.Attribute('BOOM', 'data', Class, 42) + should_find = inspect.Attribute('BOOM', 'data', Meta, 42) self.assertIn(should_find, inspect.classify_class_attrs(Class)) def test_classify_VirtualAttribute_multi_classes(self): @@ -711,9 +721,9 @@ class Class2(Class1, metaclass=Meta3): pass - should_find1 = inspect.Attribute('one', 'data', Class1, 1) - should_find2 = inspect.Attribute('two', 'data', Class2, 2) - should_find3 = inspect.Attribute('three', 'data', Class2, 3) + should_find1 = inspect.Attribute('one', 'data', Meta1, 1) + should_find2 = inspect.Attribute('two', 'data', Meta2, 2) + should_find3 = inspect.Attribute('three', 'data', Meta3, 3) cca = inspect.classify_class_attrs(Class2) for sf in (should_find1, should_find2, should_find3): self.assertIn(sf, cca) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -11,6 +11,7 @@ import string import test.support import time +import types import unittest import xml.etree import textwrap @@ -208,6 +209,77 @@ # output pattern for module with bad imports badimport_pattern = "problem in %s - ImportError: No module named %r" +expected_dynamicattribute_pattern = """ +Help on class DA in module %s: + +class DA(builtins.object) + | Data descriptors defined here: + | + | __dict__ + | dictionary for instance variables (if defined) + | + | __weakref__ + | list of weak references to the object (if defined) + | + | ham + | + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta: + | + | ham = 'spam' +""".strip() + +expected_virtualattribute_pattern1 = """ +Help on class Class in module %s: + +class Class(builtins.object) + | Data and other attributes inherited from Meta: + | + | LIFE = 42 +""".strip() + +expected_virtualattribute_pattern2 = """ +Help on class Class1 in module %s: + +class Class1(builtins.object) + | Data and other attributes inherited from Meta1: + | + | one = 1 +""".strip() + +expected_virtualattribute_pattern3 = """ +Help on class Class2 in module %s: + +class Class2(Class1) + | Method resolution order: + | Class2 + | Class1 + | builtins.object + | + | Data and other attributes inherited from Meta1: + | + | one = 1 + | + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta3: + | + | three = 3 + | + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta2: + | + | two = 2 +""".strip() + +expected_missingattribute_pattern = """ +Help on class C in module %s: + +class C(builtins.object) + | Data and other attributes defined here: + | + | here = 'present!' +""".strip() + def run_pydoc(module_name, *args, **env): """ Runs pydoc on the specified module. Returns the stripped @@ -636,6 +708,108 @@ self.assertEqual(sorted(pydoc.Helper.keywords), sorted(keyword.kwlist)) +class PydocWithMetaClasses(unittest.TestCase): + def test_DynamicClassAttribute(self): + class Meta(type): + def __getattr__(self, name): + if name == 'ham': + return 'spam' + return super().__getattr__(name) + class DA(metaclass=Meta): + @types.DynamicClassAttribute + def ham(self): + return 'eggs' + output = StringIO() + helper = pydoc.Helper(output=output) + helper(DA) + expected_text = expected_dynamicattribute_pattern % __name__ + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + def test_virtualClassAttributeWithOneMeta(self): + class Meta(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'LIFE'] + def __getattr__(self, name): + if name =='LIFE': + return 42 + return super().__getattr(name) + class Class(metaclass=Meta): + pass + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class) + expected_text = expected_virtualattribute_pattern1 % __name__ + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + def test_virtualClassAttributeWithTwoMeta(self): + class Meta1(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'one'] + def __getattr__(self, name): + if name =='one': + return 1 + return super().__getattr__(name) + class Meta2(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'two'] + def __getattr__(self, name): + if name =='two': + return 2 + return super().__getattr__(name) + class Meta3(Meta1, Meta2): + def __dir__(cls): + return list(sorted(set( + ['__class__', '__module__', '__name__', 'three'] + + Meta1.__dir__(cls) + Meta2.__dir__(cls)))) + def __getattr__(self, name): + if name =='three': + return 3 + return super().__getattr__(name) + class Class1(metaclass=Meta1): + pass + class Class2(Class1, metaclass=Meta3): + pass + fail1 = fail2 = False + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class1) + expected_text1 = expected_virtualattribute_pattern2 % __name__ + result1 = output.getvalue().strip() + if result1 != expected_text1: + print_diffs(expected_text1, result1) + fail1 = True + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class2) + expected_text2 = expected_virtualattribute_pattern3 % __name__ + result2 = output.getvalue().strip() + if result2 != expected_text2: + print_diffs(expected_text2, result2) + fail2 = True + if fail1 or fail2: + self.fail("outputs are not equal, see diff above") + + def test_buggy_dir(self): + class M(type): + def __dir__(cls): + return ['__class__', '__name__', 'missing', 'here'] + class C(metaclass=M): + here = 'present!' + output = StringIO() + helper = pydoc.Helper(output=output) + helper(C) + expected_text = expected_missingattribute_pattern % __name__ + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + @reap_threads def test_main(): try: @@ -645,6 +819,7 @@ PydocServerTest, PydocUrlHandlerTest, TestHelper, + PydocWithMetaClasses, ) finally: reap_children() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 08:41:58 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 21 Oct 2013 08:41:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2319274=3A_use_captured?= =?utf-8?q?=5Fstdout=28=29_in_the_test_suite=3B_add_NEWS_entry=2E?= Message-ID: <3d37Yf6cP2z7LjR@mail.python.org> http://hg.python.org/cpython/rev/2d39b3555951 changeset: 86540:2d39b3555951 user: Georg Brandl date: Mon Oct 21 08:29:29 2013 +0200 summary: #19274: use captured_stdout() in the test suite; add NEWS entry. files: Doc/library/zipfile.rst | 6 +++--- Lib/test/test_zipfile.py | 13 +++++-------- Misc/NEWS | 8 +++++++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -384,9 +384,6 @@ .. method:: PyZipFile.writepy(pathname, basename='', filterfunc=None) - .. versionadded:: 3.4 - The *filterfunc* parameter. - Search for files :file:`\*.py` and add the corresponding file to the archive. @@ -419,6 +416,9 @@ test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile + .. versionadded:: 3.4 + The *filterfunc* parameter. + .. _zipinfo-objects: diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -597,22 +597,19 @@ with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: - stdout = sys.stdout - # first make sure that the test folder gives error messages - sys.stdout = reportSIO = io.StringIO() - zipfp.writepy(packagedir) + # (on the badsyntax_... files) + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir) reportStr = reportSIO.getvalue() self.assertTrue('SyntaxError' in reportStr) # then check that the filter works - sys.stdout = reportSIO = io.StringIO() - zipfp.writepy(packagedir, filterfunc=lambda whatever:False) + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir, filterfunc=lambda whatever: False) reportStr = reportSIO.getvalue() self.assertTrue('SyntaxError' not in reportStr) - sys.stdout = stdout - def test_write_with_optimization(self): import email packagedir = os.path.dirname(email.__file__) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,9 +10,15 @@ Core and Builtins ----------------- -- Issue 19306: Add extra hints to the faulthandler module's stack +- Issue #19306: Add extra hints to the faulthandler module's stack dumps that these are "upside down". +Library +------- + +- Issue #19274: Add a filterfunc parameter to PyZipFile.writepy. + + What's New in Python 3.4.0 Alpha 4? =================================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 08:56:35 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 21 Oct 2013 08:56:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Reformat_statistics=2Erst_?= =?utf-8?q?and_remove_unnecessary_headings_for_each_function=2E?= Message-ID: <3d37tW0ty0z7LjN@mail.python.org> http://hg.python.org/cpython/rev/195dc7f303fe changeset: 86541:195dc7f303fe user: Georg Brandl date: Mon Oct 21 08:57:26 2013 +0200 summary: Reformat statistics.rst and remove unnecessary headings for each function. files: Doc/library/statistics.rst | 336 ++++++++++-------------- 1 files changed, 139 insertions(+), 197 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -35,21 +35,34 @@ :func:`mode` Mode (most common value) of discrete data. ======================= ============================================= -:func:`mean` -~~~~~~~~~~~~ +Measures of spread +------------------ -The :func:`mean` function calculates the arithmetic mean, commonly known -as the average, of its iterable argument: +These functions calculate a measure of how much the population or sample +tends to deviate from the typical or average values. + +======================= ============================================= +:func:`pstdev` Population standard deviation of data. +:func:`pvariance` Population variance of data. +:func:`stdev` Sample standard deviation of data. +:func:`variance` Sample variance of data. +======================= ============================================= + + +Function details +---------------- .. function:: mean(data) - Return the sample arithmetic mean of *data*, a sequence or iterator - of real-valued numbers. + Return the sample arithmetic mean of *data*, a sequence or iterator of + real-valued numbers. - The arithmetic mean is the sum of the data divided by the number of - data points. It is commonly called "the average", although it is only - one of many different mathematical averages. It is a measure of the - central location of the data. + The arithmetic mean is the sum of the data divided by the number of data + points. It is commonly called "the average", although it is only one of many + different mathematical averages. It is a measure of the central location of + the data. + + If *data* is empty, :exc:`StatisticsError` will be raised. Some examples of use: @@ -70,75 +83,56 @@ .. note:: - The mean is strongly effected by outliers and is not a robust - estimator for central location: the mean is not necessarily a - typical example of the data points. For more robust, although less - efficient, measures of central location, see :func:`median` and - :func:`mode`. (In this case, "efficient" refers to statistical - efficiency rather than computational efficiency.) + The mean is strongly effected by outliers and is not a robust estimator + for central location: the mean is not necessarily a typical example of the + data points. For more robust, although less efficient, measures of + central location, see :func:`median` and :func:`mode`. (In this case, + "efficient" refers to statistical efficiency rather than computational + efficiency.) - The sample mean gives an unbiased estimate of the true population - mean, which means that, taken on average over all the possible - samples, ``mean(sample)`` converges on the true mean of the entire - population. If *data* represents the entire population rather than - a sample, then ``mean(data)`` is equivalent to calculating the true - population mean ?. + The sample mean gives an unbiased estimate of the true population mean, + which means that, taken on average over all the possible samples, + ``mean(sample)`` converges on the true mean of the entire population. If + *data* represents the entire population rather than a sample, then + ``mean(data)`` is equivalent to calculating the true population mean ?. - If ``data`` is empty, :exc:`StatisticsError` will be raised. - -:func:`median` -~~~~~~~~~~~~~~ - -The :func:`median` function calculates the median, or middle, data point, -using the common "mean of middle two" method. - - .. seealso:: - - :func:`median_low` - - :func:`median_high` - - :func:`median_grouped` .. function:: median(data) - Return the median (middle value) of numeric data. + Return the median (middle value) of numeric data, using the common "mean of + middle two" method. If *data* is empty, :exc:`StatisticsError` is raised. - The median is a robust measure of central location, and is less affected - by the presence of outliers in your data. When the number of data points - is odd, the middle data point is returned: + The median is a robust measure of central location, and is less affected by + the presence of outliers in your data. When the number of data points is + odd, the middle data point is returned: .. doctest:: >>> median([1, 3, 5]) 3 - When the number of data points is even, the median is interpolated by - taking the average of the two middle values: + When the number of data points is even, the median is interpolated by taking + the average of the two middle values: .. doctest:: >>> median([1, 3, 5, 7]) 4.0 - This is suited for when your data is discrete, and you don't mind that - the median may not be an actual data point. + This is suited for when your data is discrete, and you don't mind that the + median may not be an actual data point. - If data is empty, :exc:`StatisticsError` is raised. + .. seealso:: :func:`median_low`, :func:`median_high`, :func:`median_grouped` -:func:`median_low` -~~~~~~~~~~~~~~~~~~ - -The :func:`median_low` function calculates the low median without -interpolation. .. function:: median_low(data) - Return the low median of numeric data. + Return the low median of numeric data. If *data* is empty, + :exc:`StatisticsError` is raised. - The low median is always a member of the data set. When the number - of data points is odd, the middle value is returned. When it is - even, the smaller of the two middle values is returned. + The low median is always a member of the data set. When the number of data + points is odd, the middle value is returned. When it is even, the smaller of + the two middle values is returned. .. doctest:: @@ -147,24 +141,18 @@ >>> median_low([1, 3, 5, 7]) 3 - Use the low median when your data are discrete and you prefer the median - to be an actual data point rather than interpolated. + Use the low median when your data are discrete and you prefer the median to + be an actual data point rather than interpolated. - If data is empty, :exc:`StatisticsError` is raised. - -:func:`median_high` -~~~~~~~~~~~~~~~~~~~ - -The :func:`median_high` function calculates the high median without -interpolation. .. function:: median_high(data) - Return the high median of data. + Return the high median of data. If *data* is empty, :exc:`StatisticsError` + is raised. - The high median is always a member of the data set. When the number of - data points is odd, the middle value is returned. When it is even, the - larger of the two middle values is returned. + The high median is always a member of the data set. When the number of data + points is odd, the middle value is returned. When it is even, the larger of + the two middle values is returned. .. doctest:: @@ -173,41 +161,34 @@ >>> median_high([1, 3, 5, 7]) 5 - Use the high median when your data are discrete and you prefer the median - to be an actual data point rather than interpolated. + Use the high median when your data are discrete and you prefer the median to + be an actual data point rather than interpolated. - If data is empty, :exc:`StatisticsError` is raised. -:func:`median_grouped` -~~~~~~~~~~~~~~~~~~~~~~ +.. function:: median_grouped(data, interval=1) -The :func:`median_grouped` function calculates the median of grouped data -as the 50th percentile, using interpolation. - -.. function:: median_grouped(data [, interval]) - - Return the median of grouped continuous data, calculated as the - 50th percentile. + Return the median of grouped continuous data, calculated as the 50th + percentile, using interpolation. If *data* is empty, :exc:`StatisticsError` + is raised. .. doctest:: >>> median_grouped([52, 52, 53, 54]) 52.5 - In the following example, the data are rounded, so that each value - represents the midpoint of data classes, e.g. 1 is the midpoint of the - class 0.5-1.5, 2 is the midpoint of 1.5-2.5, 3 is the midpoint of - 2.5-3.5, etc. With the data given, the middle value falls somewhere in - the class 3.5-4.5, and interpolation is used to estimate it: + In the following example, the data are rounded, so that each value represents + the midpoint of data classes, e.g. 1 is the midpoint of the class 0.5-1.5, 2 + is the midpoint of 1.5-2.5, 3 is the midpoint of 2.5-3.5, etc. With the data + given, the middle value falls somewhere in the class 3.5-4.5, and + interpolation is used to estimate it: .. doctest:: >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) 3.7 - Optional argument ``interval`` represents the class interval, and - defaults to 1. Changing the class interval naturally will change the - interpolation: + Optional argument *interval* represents the class interval, and defaults + to 1. Changing the class interval naturally will change the interpolation: .. doctest:: @@ -217,36 +198,34 @@ 3.5 This function does not check whether the data points are at least - ``interval`` apart. + *interval* apart. .. impl-detail:: - Under some circumstances, :func:`median_grouped` may coerce data - points to floats. This behaviour is likely to change in the future. + Under some circumstances, :func:`median_grouped` may coerce data points to + floats. This behaviour is likely to change in the future. .. seealso:: - * "Statistics for the Behavioral Sciences", Frederick J Gravetter - and Larry B Wallnau (8th Edition). + * "Statistics for the Behavioral Sciences", Frederick J Gravetter and + Larry B Wallnau (8th Edition). * Calculating the `median `_. - * The `SSMEDIAN `_ - function in the Gnome Gnumeric spreadsheet, including - `this discussion `_. + * The `SSMEDIAN + `_ + function in the Gnome Gnumeric spreadsheet, including `this discussion + `_. - If data is empty, :exc:`StatisticsError` is raised. - -:func:`mode` -~~~~~~~~~~~~ - -The :func:`mode` function calculates the mode, or most common element, of -discrete or nominal data. The mode (when it exists) is the most typical -value, and is a robust measure of central location. .. function:: mode(data) - Return the most common data point from discrete or nominal data. + Return the most common data point from discrete or nominal *data*. The mode + (when it exists) is the most typical value, and is a robust measure of + central location. + + If *data* is empty, or if there is not exactly one most common value, + :exc:`StatisticsError` is raised. ``mode`` assumes discrete data, and returns a single value. This is the standard treatment of the mode as commonly taught in schools: @@ -264,60 +243,35 @@ >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' - If data is empty, or if there is not exactly one most common value, - :exc:`StatisticsError` is raised. -Measures of spread ------------------- +.. function:: pstdev(data, mu=None) -These functions calculate a measure of how much the population or sample -tends to deviate from the typical or average values. - -======================= ============================================= -:func:`pstdev` Population standard deviation of data. -:func:`pvariance` Population variance of data. -:func:`stdev` Sample standard deviation of data. -:func:`variance` Sample variance of data. -======================= ============================================= - -:func:`pstdev` -~~~~~~~~~~~~~~ - -The :func:`pstdev` function calculates the standard deviation of a -population. The standard deviation is equivalent to the square root of -the variance. - -.. function:: pstdev(data [, mu]) - - Return the square root of the population variance. See :func:`pvariance` - for arguments and other details. + Return the population standard deviation (the square root of the population + variance). See :func:`pvariance` for arguments and other details. .. doctest:: >>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 0.986893273527251 -:func:`pvariance` -~~~~~~~~~~~~~~~~~ -The :func:`pvariance` function calculates the variance of a population. -Variance, or second moment about the mean, is a measure of the variability -(spread or dispersion) of data. A large variance indicates that the data is -spread out; a small variance indicates it is clustered closely around the -mean. +.. function:: pvariance(data, mu=None) -.. function:: pvariance(data [, mu]) + Return the population variance of *data*, a non-empty iterable of real-valued + numbers. Variance, or second moment about the mean, is a measure of the + variability (spread or dispersion) of data. A large variance indicates that + the data is spread out; a small variance indicates it is clustered closely + around the mean. - Return the population variance of *data*, a non-empty iterable of - real-valued numbers. - - If the optional second argument *mu* is given, it should be the mean - of *data*. If it is missing or None (the default), the mean is + If the optional second argument *mu* is given, it should be the mean of + *data*. If it is missing or ``None`` (the default), the mean is automatically calculated. - Use this function to calculate the variance from the entire population. - To estimate the variance from a sample, the :func:`variance` function is - usually a better choice. + Use this function to calculate the variance from the entire population. To + estimate the variance from a sample, the :func:`variance` function is usually + a better choice. + + Raises :exc:`StatisticsError` if *data* is empty. Examples: @@ -327,8 +281,8 @@ >>> pvariance(data) 1.25 - If you have already calculated the mean of your data, you can pass - it as the optional second argument *mu* to avoid recalculation: + If you have already calculated the mean of your data, you can pass it as the + optional second argument *mu* to avoid recalculation: .. doctest:: @@ -336,9 +290,9 @@ >>> pvariance(data, mu) 1.25 - This function does not attempt to verify that you have passed the actual - mean as *mu*. Using arbitrary values for *mu* may lead to invalid or - impossible results. + This function does not attempt to verify that you have passed the actual mean + as *mu*. Using arbitrary values for *mu* may lead to invalid or impossible + results. Decimals and Fractions are supported: @@ -354,53 +308,44 @@ .. note:: - When called with the entire population, this gives the population - variance ??. When called on a sample instead, this is the biased - sample variance s?, also known as variance with N degrees of freedom. + When called with the entire population, this gives the population variance + ??. When called on a sample instead, this is the biased sample variance + s?, also known as variance with N degrees of freedom. - If you somehow know the true population mean ?, you may use this - function to calculate the variance of a sample, giving the known - population mean as the second argument. Provided the data points are - representative (e.g. independent and identically distributed), the - result will be an unbiased estimate of the population variance. + If you somehow know the true population mean ?, you may use this function + to calculate the variance of a sample, giving the known population mean as + the second argument. Provided the data points are representative + (e.g. independent and identically distributed), the result will be an + unbiased estimate of the population variance. - Raises :exc:`StatisticsError` if *data* is empty. -:func:`stdev` -~~~~~~~~~~~~~~ +.. function:: stdev(data, xbar=None) -The :func:`stdev` function calculates the standard deviation of a sample. -The standard deviation is equivalent to the square root of the variance. - -.. function:: stdev(data [, xbar]) - - Return the square root of the sample variance. See :func:`variance` for - arguments and other details. + Return the sample standard deviation (the square root of the sample + variance). See :func:`variance` for arguments and other details. .. doctest:: >>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 1.0810874155219827 -:func:`variance` -~~~~~~~~~~~~~~~~~ -The :func:`variance` function calculates the variance of a sample. Variance, -or second moment about the mean, is a measure of the variability (spread or -dispersion) of data. A large variance indicates that the data is spread out; -a small variance indicates it is clustered closely around the mean. +.. function:: variance(data, xbar=None) -.. function:: variance(data [, xbar]) + Return the sample variance of *data*, an iterable of at least two real-valued + numbers. Variance, or second moment about the mean, is a measure of the + variability (spread or dispersion) of data. A large variance indicates that + the data is spread out; a small variance indicates it is clustered closely + around the mean. - Return the sample variance of *data*, an iterable of at least two - real-valued numbers. - - If the optional second argument *xbar* is given, it should be the mean - of *data*. If it is missing or None (the default), the mean is + If the optional second argument *xbar* is given, it should be the mean of + *data*. If it is missing or ``None`` (the default), the mean is automatically calculated. - Use this function when your data is a sample from a population. To - calculate the variance from the entire population, see :func:`pvariance`. + Use this function when your data is a sample from a population. To calculate + the variance from the entire population, see :func:`pvariance`. + + Raises :exc:`StatisticsError` if *data* has fewer than two values. Examples: @@ -410,8 +355,8 @@ >>> variance(data) 1.3720238095238095 - If you have already calculated the mean of your data, you can pass - it as the optional second argument *xbar* to avoid recalculation: + If you have already calculated the mean of your data, you can pass it as the + optional second argument *xbar* to avoid recalculation: .. doctest:: @@ -419,8 +364,8 @@ >>> variance(data, m) 1.3720238095238095 - This function does not attempt to verify that you have passed the actual - mean as *xbar*. Using arbitrary values for *xbar* can lead to invalid or + This function does not attempt to verify that you have passed the actual mean + as *xbar*. Using arbitrary values for *xbar* can lead to invalid or impossible results. Decimal and Fraction values are supported: @@ -437,17 +382,14 @@ .. note:: - This is the sample variance s? with Bessel's correction, also known - as variance with N-1 degrees of freedom. Provided that the data - points are representative (e.g. independent and identically - distributed), the result should be an unbiased estimate of the true - population variance. + This is the sample variance s? with Bessel's correction, also known as + variance with N-1 degrees of freedom. Provided that the data points are + representative (e.g. independent and identically distributed), the result + should be an unbiased estimate of the true population variance. - If you somehow know the actual population mean ? you should pass it - to the :func:`pvariance` function as the *mu* parameter to get - the variance of a sample. - - Raises :exc:`StatisticsError` if *data* has fewer than two values. + If you somehow know the actual population mean ? you should pass it to the + :func:`pvariance` function as the *mu* parameter to get the variance of a + sample. Exceptions ---------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 09:06:36 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 21 Oct 2013 09:06:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Simplify_markup=2E?= Message-ID: <3d3864122yz7LjR@mail.python.org> http://hg.python.org/cpython/rev/c19d0ddf6741 changeset: 86542:c19d0ddf6741 user: Georg Brandl date: Mon Oct 21 09:07:31 2013 +0200 summary: Simplify markup. files: Doc/library/aifc.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of -*nchannels*\*\ *samplesize*\*\ *framerate* bytes. +``nchannels * samplesize`` bytes, and a second's worth of audio consists of +``nchannels * samplesize * framerate`` bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 09:07:44 2013 From: python-checkins at python.org (georg.brandl) Date: Mon, 21 Oct 2013 09:07:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_=2319323=3A_fix_typ?= =?utf-8?q?o=2E_Thanks_to_Michael_Merickel=2E?= Message-ID: <3d387N6Chfz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/1f466354a85b changeset: 86543:1f466354a85b user: Georg Brandl date: Mon Oct 21 09:08:39 2013 +0200 summary: Closes #19323: fix typo. Thanks to Michael Merickel. files: Doc/library/statistics.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -83,7 +83,7 @@ .. note:: - The mean is strongly effected by outliers and is not a robust estimator + The mean is strongly affected by outliers and is not a robust estimator for central location: the mean is not necessarily a typical example of the data points. For more robust, although less efficient, measures of central location, see :func:`median` and :func:`mode`. (In this case, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 11:59:47 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 21 Oct 2013 11:59:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Make_PKCS5=5FPBKDF2=5FHMAC?= =?utf-8?q?=5Ffast=28=29_a_static_function?= Message-ID: <3d3Cxv5Vy3z7LkF@mail.python.org> http://hg.python.org/cpython/rev/7f4e0c869c2e changeset: 86544:7f4e0c869c2e parent: 86508:29764a7bd6ba user: Christian Heimes date: Sun Oct 20 13:23:03 2013 +0200 summary: Make PKCS5_PBKDF2_HMAC_fast() a static function files: Modules/_hashopenssl.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -513,10 +513,11 @@ * Also OpenSSL < 1.0 don't provide PKCS5_PBKDF2_HMAC(), only * PKCS5_PBKDF2_SHA1. */ -int PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, - const unsigned char *salt, int saltlen, - int iter, const EVP_MD *digest, - int keylen, unsigned char *out) +static int +PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, + const unsigned char *salt, int saltlen, + int iter, const EVP_MD *digest, + int keylen, unsigned char *out) { unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; int cplen, j, k, tkeylen, mdlen; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 11:59:49 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 21 Oct 2013 11:59:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3d3Cxx05Jgz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/bdca806a0649 changeset: 86545:bdca806a0649 parent: 86543:1f466354a85b parent: 86544:7f4e0c869c2e user: Christian Heimes date: Mon Oct 21 11:59:34 2013 +0200 summary: merge files: Modules/_hashopenssl.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -513,10 +513,11 @@ * Also OpenSSL < 1.0 don't provide PKCS5_PBKDF2_HMAC(), only * PKCS5_PBKDF2_SHA1. */ -int PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, - const unsigned char *salt, int saltlen, - int iter, const EVP_MD *digest, - int keylen, unsigned char *out) +static int +PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, + const unsigned char *salt, int saltlen, + int iter, const EVP_MD *digest, + int keylen, unsigned char *out) { unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; int cplen, j, k, tkeylen, mdlen; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 12:03:28 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 21 Oct 2013 12:03:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318527=3A_Upgrade_?= =?utf-8?q?internal_copy_of_zlib_to_1=2E2=2E8?= Message-ID: <3d3D283rx2z7Ll6@mail.python.org> http://hg.python.org/cpython/rev/224aa49f22f1 changeset: 86546:224aa49f22f1 user: Christian Heimes date: Mon Oct 21 12:03:09 2013 +0200 summary: Issue #18527: Upgrade internal copy of zlib to 1.2.8 files: Misc/NEWS | 2 + Modules/zlib/ChangeLog | 266 +++++- Modules/zlib/FAQ | 12 +- Modules/zlib/INDEX | 13 +- Modules/zlib/Makefile.in | 111 +- Modules/zlib/README | 24 +- Modules/zlib/adler32.c | 70 +- Modules/zlib/algorithm.txt | 4 +- Modules/zlib/compress.c | 2 +- Modules/zlib/configure | 571 ++++++++--- Modules/zlib/crc32.c | 83 +- Modules/zlib/crc32.h | 2 +- Modules/zlib/deflate.c | 265 ++++- Modules/zlib/deflate.h | 12 +- Modules/zlib/example.c | 90 +- Modules/zlib/gzguts.h | 103 +- Modules/zlib/gzio.c | 1026 ---------------------- Modules/zlib/gzlib.c | 205 +++- Modules/zlib/gzread.c | 431 +++----- Modules/zlib/gzwrite.c | 334 ++++--- Modules/zlib/infback.c | 16 +- Modules/zlib/inffast.c | 6 +- Modules/zlib/inffixed.h | 6 +- Modules/zlib/inflate.c | 156 ++- Modules/zlib/inftrees.c | 54 +- Modules/zlib/inftrees.h | 2 +- Modules/zlib/make_vms.com | 405 +++++--- Modules/zlib/minigzip.c | 213 ++++- Modules/zlib/trees.c | 54 +- Modules/zlib/uncompr.c | 2 +- Modules/zlib/zconf.h | 201 +++- Modules/zlib/zconf.h.cmakein | 201 +++- Modules/zlib/zconf.h.in | 201 +++- Modules/zlib/zconf.in.h | 332 ------- Modules/zlib/zlib.3 | 18 +- Modules/zlib/zlib.h | 343 +++++-- Modules/zlib/zlib.map | 15 + Modules/zlib/zutil.c | 26 +- Modules/zlib/zutil.h | 103 +- PC/VS9.0/pythoncore.vcproj | 68 - 40 files changed, 3081 insertions(+), 2967 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,8 @@ Library ------- +- Issue #18527: Upgrade internal copy of zlib to 1.2.8. + - Issue #19274: Add a filterfunc parameter to PyZipFile.writepy. diff --git a/Modules/zlib/ChangeLog b/Modules/zlib/ChangeLog --- a/Modules/zlib/ChangeLog +++ b/Modules/zlib/ChangeLog @@ -1,12 +1,276 @@ ChangeLog file for zlib +Changes in 1.2.8 (28 Apr 2013) +- Update contrib/minizip/iowin32.c for Windows RT [Vollant] +- Do not force Z_CONST for C++ +- Clean up contrib/vstudio [Ro?] +- Correct spelling error in zlib.h +- Fix mixed line endings in contrib/vstudio + +Changes in 1.2.7.3 (13 Apr 2013) +- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc + +Changes in 1.2.7.2 (13 Apr 2013) +- Change check for a four-byte type back to hexadecimal +- Fix typo in win32/Makefile.msc +- Add casts in gzwrite.c for pointer differences + +Changes in 1.2.7.1 (24 Mar 2013) +- Replace use of unsafe string functions with snprintf if available +- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] +- Fix gzgetc undefine when Z_PREFIX set [Turk] +- Eliminate use of mktemp in Makefile (not always available) +- Fix bug in 'F' mode for gzopen() +- Add inflateGetDictionary() function +- Correct comment in deflate.h +- Use _snprintf for snprintf in Microsoft C +- On Darwin, only use /usr/bin/libtool if libtool is not Apple +- Delete "--version" file if created by "ar --version" [Richard G.] +- Fix configure check for veracity of compiler error return codes +- Fix CMake compilation of static lib for MSVC2010 x64 +- Remove unused variable in infback9.c +- Fix argument checks in gzlog_compress() and gzlog_write() +- Clean up the usage of z_const and respect const usage within zlib +- Clean up examples/gzlog.[ch] comparisons of different types +- Avoid shift equal to bits in type (caused endless loop) +- Fix unintialized value bug in gzputc() introduced by const patches +- Fix memory allocation error in examples/zran.c [Nor] +- Fix bug where gzopen(), gzclose() would write an empty file +- Fix bug in gzclose() when gzwrite() runs out of memory +- Check for input buffer malloc failure in examples/gzappend.c +- Add note to contrib/blast to use binary mode in stdio +- Fix comparisons of differently signed integers in contrib/blast +- Check for invalid code length codes in contrib/puff +- Fix serious but very rare decompression bug in inftrees.c +- Update inflateBack() comments, since inflate() can be faster +- Use underscored I/O function names for WINAPI_FAMILY +- Add _tr_flush_bits to the external symbols prefixed by --zprefix +- Add contrib/vstudio/vc10 pre-build step for static only +- Quote --version-script argument in CMakeLists.txt +- Don't specify --version-script on Apple platforms in CMakeLists.txt +- Fix casting error in contrib/testzlib/testzlib.c +- Fix types in contrib/minizip to match result of get_crc_table() +- Simplify contrib/vstudio/vc10 with 'd' suffix +- Add TOP support to win32/Makefile.msc +- Suport i686 and amd64 assembler builds in CMakeLists.txt +- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h +- Add vc11 and vc12 build files to contrib/vstudio +- Add gzvprintf() as an undocumented function in zlib +- Fix configure for Sun shell +- Remove runtime check in configure for four-byte integer type +- Add casts and consts to ease user conversion to C++ +- Add man pages for minizip and miniunzip +- In Makefile uninstall, don't rm if preceding cd fails +- Do not return Z_BUF_ERROR if deflateParam() has nothing to write + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no libary use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + Changes in 1.2.5 (19 Apr 2010) - Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] - Default to libdir as sharedlibdir in configure [Nieder] - Update copyright dates on modified source files - Update trees.c to be able to generate modified trees.h - Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] Changes in 1.2.4.5 (18 Apr 2010) - Set sharedlibdir in configure [Torok] @@ -261,7 +525,7 @@ - Clear bytes after deflate lookahead to avoid use of uninitialized data - Change a limit in inftrees.c to be more transparent to Coverity Prevent - Update win32/zlib.def with exported symbols from zlib.h -- Correct spelling error in zlib.h [Willem] +- Correct spelling errors in zlib.h [Willem, Sobrado] - Allow Z_BLOCK for deflate() to force a new block - Allow negative bits in inflatePrime() to delete existing bit buffer - Add Z_TREES flush option to inflate() to return at end of trees diff --git a/Modules/zlib/FAQ b/Modules/zlib/FAQ --- a/Modules/zlib/FAQ +++ b/Modules/zlib/FAQ @@ -44,8 +44,8 @@ 6. Where's the zlib documentation (man pages, etc.)? - It's in zlib.h . Examples of zlib usage are in the files example.c and - minigzip.c, with more in examples/ . + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . 7. Why don't you use GNU autoconf or libtool or ...? @@ -84,8 +84,10 @@ 13. How can I make a Unix shared library? - make clean - ./configure -s + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure make 14. How do I install a shared zlib library on Unix? @@ -325,7 +327,7 @@ correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate - specficiation in RFC 1951, most notably Microsoft. So even though the + specification in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to diff --git a/Modules/zlib/INDEX b/Modules/zlib/INDEX --- a/Modules/zlib/INDEX +++ b/Modules/zlib/INDEX @@ -7,6 +7,9 @@ README guess what configure configure script for Unix make_vms.com makefile for VMS +test/example.c zlib usages examples for build testing +test/minigzip.c minimal gzip-like functionality for build testing +test/infcover.c inf*.c code coverage for build coverage testing treebuild.xml XML description of source file dependencies zconf.h.cmakein zconf.h template for cmake zconf.h.in zconf.h template for configure @@ -14,9 +17,11 @@ zlib.3.pdf Man page in PDF format zlib.map Linux symbol information zlib.pc.in Template for pkg-config descriptor +zlib.pc.cmakein zlib.pc template for cmake zlib2ansi perl script to convert source files for C++ compilation amiga/ makefiles for Amiga SAS C +as400/ makefiles for AS/400 doc/ documentation for formats and algorithms msdos/ makefiles for MSDOS nintendods/ makefile for Nintendo DS @@ -56,10 +61,8 @@ zutil.c zutil.h - source files for sample programs: -example.c -minigzip.c -See examples/README.examples for more + source files for sample programs +See examples/README.examples - unsupported contribution by third parties + unsupported contributions by third parties See contrib/README.contrib diff --git a/Modules/zlib/Makefile.in b/Modules/zlib/Makefile.in --- a/Modules/zlib/Makefile.in +++ b/Modules/zlib/Makefile.in @@ -1,5 +1,5 @@ # Makefile for zlib -# Copyright (C) 1995-2010 Jean-loup Gailly. +# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler # For conditions of distribution and use, see copyright notice in zlib.h # To compile and test, type: @@ -32,11 +32,12 @@ STATICLIB=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.5 +SHAREDLIBV=libz.so.1.2.8 SHAREDLIBM=libz.so.1 LIBS=$(STATICLIB) $(SHAREDLIBV) -AR=ar rc +AR=ar +ARFLAGS=rc RANLIB=ranlib LDCONFIG=ldconfig LDSHAREDLIBC=-lc @@ -53,11 +54,13 @@ man3dir = ${mandir}/man3 pkgconfigdir = ${libdir}/pkgconfig -OBJC = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ - gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) -PIC_OBJC = adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo \ - gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) # to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo OBJA = @@ -80,35 +83,49 @@ test: all teststatic testshared teststatic: static - @if echo hello world | ./minigzip | ./minigzip -d && ./example; then \ + @TMPST=tmpst_$$; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ echo ' *** zlib test OK ***'; \ else \ echo ' *** zlib test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMPST testshared: shared @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh; then \ + TMPSH=tmpsh_$$; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ echo ' *** zlib shared test OK ***'; \ else \ echo ' *** zlib shared test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMPSH test64: all64 - @if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64; then \ + @TMP64=tmp64_$$; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ echo ' *** zlib 64-bit test OK ***'; \ else \ echo ' *** zlib 64-bit test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMP64 + +infcover.o: test/infcover.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c libz.a: $(OBJS) - $(AR) $@ $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 match.o: match.S @@ -123,11 +140,17 @@ mv _match.o match.lo rm -f _match.s -example64.o: example.c zlib.h zconf.h - $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ example.c +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c -minigzip64.o: minigzip.c zlib.h zconf.h - $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ minigzip.c +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +example64.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/example.c + +minigzip64.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/minigzip.c .SUFFIXES: .lo @@ -136,7 +159,7 @@ $(CC) $(SFLAGS) -DPIC -c -o objs/$*.o $< - at mv objs/$*.o $@ -$(SHAREDLIBV): $(PIC_OBJS) +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) rm -f $(SHAREDLIB) $(SHAREDLIBM) ln -s $@ $(SHAREDLIB) @@ -168,14 +191,16 @@ - at if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi - at if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi cp $(STATICLIB) $(DESTDIR)$(libdir) - cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir) - cd $(DESTDIR)$(libdir); chmod u=rw,go=r $(STATICLIB) - -@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - - at cd $(DESTDIR)$(sharedlibdir); if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ - chmod 755 $(SHAREDLIBV); \ - rm -f $(SHAREDLIB) $(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + - at if test -n "$(SHAREDLIBV)"; then \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ ($(LDCONFIG) || true) >/dev/null 2>&1; \ fi cp zlib.3 $(DESTDIR)$(man3dir) @@ -191,22 +216,25 @@ chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h uninstall: - cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h - cd $(DESTDIR)$(libdir); rm -f libz.a; \ - if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir) && rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ fi - cd $(DESTDIR)$(man3dir); rm -f zlib.3 - cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc + cd $(DESTDIR)$(man3dir) && rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc docs: zlib.3.pdf zlib.3.pdf: zlib.3 groff -mandoc -f H -T ps zlib.3 | ps2pdf - zlib.3.pdf -zconf.h.in: zconf.h.cmakein - sed "/^#cmakedefine/D" < zconf.h.cmakein > zconf.h.in - touch -r zconf.h.cmakein zconf.h.in +zconf.h.cmakein: zconf.h.in + -@ TEMPFILE=zconfh_$$; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE zconf.h.in > zconf.h.cmakein &&\ + touch -r zconf.h.in zconf.h.cmakein &&\ + rm $$TEMPFILE zconf: zconf.h.in cp -p zconf.h.in zconf.h @@ -216,13 +244,16 @@ rm -f *.o *.lo *~ \ example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ example64$(EXE) minigzip64$(EXE) \ + infcover \ libz.* foo.gz so_locations \ _match.s maketree contrib/infback9/*.o rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov maintainer-clean: distclean -distclean: clean zconf docs - rm -f Makefile zlib.pc +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log - at rm -f .DS_Store - at printf 'all:\n\t- at echo "Please use ./configure first. Thank you."\n' > Makefile - at printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile diff --git a/Modules/zlib/README b/Modules/zlib/README --- a/Modules/zlib/README +++ b/Modules/zlib/README @@ -1,22 +1,22 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.5 is a general purpose data compression library. All the code is +zlib 1.2.8 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib at gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. To compile all files and run the test program, follow the instructions given at the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use one -of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant @@ -31,7 +31,7 @@ issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.5 are documented in the file ChangeLog. +The changes made in version 1.2.8 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -44,7 +44,7 @@ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html . +http://docs.python.org/library/zlib.html . zlib is built into tcl: http://wiki.tcl.tk/4610 . @@ -84,7 +84,7 @@ Copyright notice: - (C) 1995-2010 Jean-loup Gailly and Mark Adler + (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/Modules/zlib/adler32.c b/Modules/zlib/adler32.c --- a/Modules/zlib/adler32.c +++ b/Modules/zlib/adler32.c @@ -1,5 +1,5 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2007 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,9 +9,9 @@ #define local static -local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); -#define BASE 65521UL /* largest prime smaller than 65536 */ +#define BASE 65521 /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -21,39 +21,44 @@ #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); -/* use NO_DIVIDE if your processor does not do division in hardware */ +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ #ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) # define MOD(a) \ do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ + CHOP(a); \ + MOD28(a); \ } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE -# define MOD4(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE #endif /* ========================================================================= */ @@ -92,7 +97,7 @@ } if (adler >= BASE) adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ + MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } @@ -137,8 +142,13 @@ unsigned long sum2; unsigned rem; + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); diff --git a/Modules/zlib/algorithm.txt b/Modules/zlib/algorithm.txt --- a/Modules/zlib/algorithm.txt +++ b/Modules/zlib/algorithm.txt @@ -121,7 +121,7 @@ kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code would take too long if you're only decoding several thousand symbols. At the other extreme, you could make a new table for every bit in the code. In fact, -that's essentially a Huffman tree. But then you spend two much time +that's essentially a Huffman tree. But then you spend too much time traversing the tree while decoding, even for short symbols. So the number of bits for the first lookup table is a trade of the time to @@ -206,4 +206,4 @@ pp. 337-343. ``DEFLATE Compressed Data Format Specification'' available in -http://www.ietf.org/rfc/rfc1951.txt +http://tools.ietf.org/html/rfc1951 diff --git a/Modules/zlib/compress.c b/Modules/zlib/compress.c --- a/Modules/zlib/compress.c +++ b/Modules/zlib/compress.c @@ -29,7 +29,7 @@ z_stream stream; int err; - stream.next_in = (Bytef*)source; + stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ diff --git a/Modules/zlib/configure b/Modules/zlib/configure --- a/Modules/zlib/configure +++ b/Modules/zlib/configure @@ -13,39 +13,52 @@ # If you have problems, try without defining CC and CFLAGS before reporting # an error. +# start off configure.log +echo -------------------- >> configure.log +echo $0 $* >> configure.log +date >> configure.log + +# set command prefix for cross-compilation if [ -n "${CHOST}" ]; then - uname="$(echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')" + uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" CROSS_PREFIX="${CHOST}-" fi +# destination name for static library STATICLIB=libz.a -LDFLAGS="${LDFLAGS} -L. ${STATICLIB}" + +# extract zlib version numbers from zlib.h VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h` VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` + +# establish commands for library building if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then AR=${AR-"${CROSS_PREFIX}ar"} - test -n "${CROSS_PREFIX}" && echo Using ${AR} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log else AR=${AR-"ar"} - test -n "${CROSS_PREFIX}" && echo Using ${AR} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log fi -AR_RC="${AR} rc" +ARFLAGS=${ARFLAGS-"rc"} if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} - test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log else RANLIB=${RANLIB-"ranlib"} fi if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then NM=${NM-"${CROSS_PREFIX}nm"} - test -n "${CROSS_PREFIX}" && echo Using ${NM} + test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log else NM=${NM-"nm"} fi + +# set defaults before processing command line options LDCONFIG=${LDCONFIG-"ldconfig"} LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +ARCHS= prefix=${prefix-/usr/local} exec_prefix=${exec_prefix-'${prefix}'} libdir=${libdir-'${exec_prefix}/lib'} @@ -54,20 +67,39 @@ mandir=${mandir-'${prefix}/share/man'} shared_ext='.so' shared=1 +solo=0 +cover=0 zprefix=0 +zconst=0 build64=0 gcc=0 old_cc="$CC" old_cflags="$CFLAGS" +OBJC='$(OBJZ) $(OBJG)' +PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)' +# leave this script, optionally in a bad way +leave() +{ + if test "$*" != "0"; then + echo "** $0 aborting." | tee -a configure.log + fi + rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version + echo -------------------- >> configure.log + echo >> configure.log + echo >> configure.log + exit $1 +} + +# process command line options while test $# -ge 1 do case "$1" in -h* | --help) - echo 'usage:' - echo ' configure [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' - echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' - echo ' [--includedir=INCLUDEDIR]' + echo 'usage:' | tee -a configure.log + echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log exit 0 ;; -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; @@ -81,51 +113,88 @@ -i* | --includedir) includedir="$2"; shift; shift ;; -s* | --shared | --enable-shared) shared=1; shift ;; -t | --static) shared=0; shift ;; + --solo) solo=1; shift ;; + --cover) cover=1; shift ;; -z* | --zprefix) zprefix=1; shift ;; -6* | --64) build64=1; shift ;; - --sysconfdir=*) echo "ignored option: --sysconfdir"; shift ;; - --localstatedir=*) echo "ignored option: --localstatedir"; shift ;; - *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1 ;; + -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;; + -c* | --const) zconst=1; shift ;; + *) + echo "unknown option: $1" | tee -a configure.log + echo "$0 --help for help" | tee -a configure.log + leave 1;; esac done +# temporary file name test=ztest$$ + +# put arguments in log, also put test file in log if used in arguments +show() +{ + case "$*" in + *$test.c*) + echo === $test.c === >> configure.log + cat $test.c >> configure.log + echo === >> configure.log;; + esac + echo $* >> configure.log +} + +# check for gcc vs. cc and set compile and link flags based on the system identified by uname cat > $test.c <&1` in + *gcc*) gcc=1 ;; esac -if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then +show $cc -c $test.c +if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then + echo ... using gcc >> configure.log CC="$cc" + CFLAGS="${CFLAGS--O3} ${ARCHS}" SFLAGS="${CFLAGS--O3} -fPIC" - CFLAGS="${CFLAGS--O3}" + LDFLAGS="${LDFLAGS} ${ARCHS}" if test $build64 -eq 1; then CFLAGS="${CFLAGS} -m64" SFLAGS="${SFLAGS} -m64" fi if test "${ZLIBGCCWARN}" = "YES"; then - CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + if test "$zconst" -eq 1; then + CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST" + else + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi fi if test -z "$uname"; then uname=`(uname -s || echo unknown) 2>/dev/null` fi case "$uname" in - Linux* | linux* | GNU | GNU/* | *BSD | DragonFly) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + Linux* | linux* | GNU | GNU/* | solaris*) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + *BSD | *bsd* | DragonFly) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} + LDCONFIG="ldconfig -m" ;; CYGWIN* | Cygwin* | cygwin* | OS/2*) EXE='.exe' ;; - MINGW*|mingw*) + MINGW* | mingw*) # temporary bypass rm -f $test.[co] $test $test$shared_ext - echo "Please use win32/Makefile.gcc instead." - exit 1 + echo "Please use win32/Makefile.gcc instead." | tee -a configure.log + leave 1 LDSHARED=${LDSHARED-"$cc -shared"} LDSHAREDLIBC="" EXE='.exe' ;; @@ -142,17 +211,25 @@ shared_ext='.sl' SHAREDLIB='libz.sl' ;; esac ;; - Darwin*) shared_ext='.dylib' + Darwin* | darwin*) + shared_ext='.dylib' SHAREDLIB=libz$shared_ext SHAREDLIBV=libz.$VER$shared_ext SHAREDLIBM=libz.$VER1$shared_ext - LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} ;; + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + if libtool -V 2>&1 | grep Apple > /dev/null; then + AR="libtool" + else + AR="/usr/bin/libtool" + fi + ARFLAGS="-o" ;; *) LDSHARED=${LDSHARED-"$cc -shared"} ;; esac else # find system name and corresponding cc options CC=${CC-cc} gcc=0 + echo ... using $CC >> configure.log if test -z "$uname"; then uname=`(uname -sr || echo unknown) 2>/dev/null` fi @@ -183,19 +260,34 @@ CFLAGS=${CFLAGS-"-4 -O"} LDSHARED=${LDSHARED-"cc"} RANLIB=${RANLIB-"true"} - AR_RC="cc -A" ;; + AR="cc" + ARFLAGS="-A" ;; SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} CFLAGS=${CFLAGS-"-O3"} LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; - SunOS\ 5*) LDSHARED=${LDSHARED-"cc -G"} - case `(uname -m || echo unknown) 2>/dev/null` in - i86*) - SFLAGS=${CFLAGS-"-xpentium -fast -KPIC -R."} - CFLAGS=${CFLAGS-"-xpentium -fast"} ;; - *) - SFLAGS=${CFLAGS-"-fast -xcg92 -KPIC -R."} - CFLAGS=${CFLAGS-"-fast -xcg92"} ;; - esac ;; + SunOS\ 5* | solaris*) + LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"} + SFLAGS=${CFLAGS-"-fast -KPIC"} + CFLAGS=${CFLAGS-"-fast"} + if test $build64 -eq 1; then + # old versions of SunPRO/Workshop/Studio don't support -m64, + # but newer ones do. Check for it. + flag64=`$CC -flags | egrep -- '^-m64'` + if test x"$flag64" != x"" ; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + else + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS="$SFLAGS -xarch=amd64" + CFLAGS="$CFLAGS -xarch=amd64" ;; + *) + SFLAGS="$SFLAGS -xarch=v9" + CFLAGS="$CFLAGS -xarch=v9" ;; + esac + fi + fi + ;; SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} CFLAGS=${CFLAGS-"-O2"} LDSHARED=${LDSHARED-"ld"} ;; @@ -225,25 +317,79 @@ esac fi +# destination names for shared library if not defined above SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} +echo >> configure.log + +# define functions for testing compiler and library characteristics and logging the results + +cat > $test.c </dev/null; then + try() + { + show $* + test "`( $* ) 2>&1 | tee -a configure.log`" = "" + } + echo - using any output from compiler to indicate an error >> configure.log +else +try() +{ + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret +} +fi + +tryboth() +{ + show $* + got=`( $* ) 2>&1` + ret=$? + printf %s "$got" >> configure.log + if test $ret -ne 0; then + return $ret + fi + test "$got" = "" +} + +cat > $test.c << EOF +int foo() { return 0; } +EOF +echo "Checking for obsessive-compulsive compiler options..." >> configure.log +if try $CC -c $CFLAGS $test.c; then + : +else + echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log + leave 1 +fi + +echo >> configure.log + +# see if shared library build supported +cat > $test.c <&1`" = "" && - test "`($LDSHARED $SFLAGS -o $test$shared_ext $test.o) 2>&1`" = ""; then - echo Building shared library $SHAREDLIBV with $CC. + if try $CC -w -c $SFLAGS $test.c && + try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then + echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log elif test -z "$old_cc" -a -z "$old_cflags"; then - echo No shared library support. + echo No shared library support. | tee -a configure.log shared=0; else - echo Tested $CC -w -c $SFLAGS $test.c - $CC -w -c $SFLAGS $test.c - echo Tested $LDSHARED $SFLAGS -o $test$shared_ext $test.o - $LDSHARED $SFLAGS -o $test$shared_ext $test.o - echo 'No shared library support; try without defining CC and CFLAGS' + echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log shared=0; fi fi @@ -254,25 +400,43 @@ SHAREDLIB="" SHAREDLIBV="" SHAREDLIBM="" - echo Building static library $STATICLIB version $VER with $CC. + echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log else ALL="static shared" TEST="all teststatic testshared" fi +# check for underscores in external names for use by assembler code +CPP=${CPP-"$CC -E"} +case $CFLAGS in + *ASMV*) + echo >> configure.log + show "$NM $test.o | grep _hello" + if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. | tee -a configure.log + else + echo Checking for underline in external names... Yes. | tee -a configure.log + fi ;; +esac + +echo >> configure.log + +# check for large file support, and if none, check for fseeko() cat > $test.c < off64_t dummy = 0; EOF -if test "`($CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c) 2>&1`" = ""; then +if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" ALL="${ALL} all64" TEST="${TEST} test64" - echo "Checking for off64_t... Yes." - echo "Checking for fseeko... Yes." + echo "Checking for off64_t... Yes." | tee -a configure.log + echo "Checking for fseeko... Yes." | tee -a configure.log else - echo "Checking for off64_t... No." + echo "Checking for off64_t... No." | tee -a configure.log + echo >> configure.log cat > $test.c < int main(void) { @@ -280,272 +444,335 @@ return 0; } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for fseeko... Yes." + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for fseeko... Yes." | tee -a configure.log else CFLAGS="${CFLAGS} -DNO_FSEEKO" SFLAGS="${SFLAGS} -DNO_FSEEKO" - echo "Checking for fseeko... No." + echo "Checking for fseeko... No." | tee -a configure.log fi fi +echo >> configure.log + +# check for strerror() for use by gz* functions +cat > $test.c < +#include +int main() { return strlen(strerror(errno)); } +EOF +if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for strerror... Yes." | tee -a configure.log +else + CFLAGS="${CFLAGS} -DNO_STRERROR" + SFLAGS="${SFLAGS} -DNO_STRERROR" + echo "Checking for strerror... No." | tee -a configure.log +fi + +# copy clean zconf.h for subsequent edits cp -p zconf.h.in zconf.h +echo >> configure.log + +# check for unistd.h and save result in zconf.h cat > $test.c < int main() { return 0; } EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then +if try $CC -c $CFLAGS $test.c; then sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h mv zconf.temp.h zconf.h - echo "Checking for unistd.h... Yes." + echo "Checking for unistd.h... Yes." | tee -a configure.log else - echo "Checking for unistd.h... No." + echo "Checking for unistd.h... No." | tee -a configure.log fi +echo >> configure.log + +# check for stdarg.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for stdarg.h... Yes." | tee -a configure.log +else + echo "Checking for stdarg.h... No." | tee -a configure.log +fi + +# if the z_ prefix was requested, save that in zconf.h if test $zprefix -eq 1; then sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h mv zconf.temp.h zconf.h - echo "Using z_ prefix on all symbols." + echo >> configure.log + echo "Using z_ prefix on all symbols." | tee -a configure.log fi +# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists +if test $solo -eq 1; then + sed '/#define ZCONF_H/a\ +#define Z_SOLO + +' < zconf.h > zconf.temp.h + mv zconf.temp.h zconf.h +OBJC='$(OBJZ)' +PIC_OBJC='$(PIC_OBJZ)' +fi + +# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X +if test $cover -eq 1; then + CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" + if test -n "$GCC_CLASSIC"; then + CC=$GCC_CLASSIC + fi +fi + +echo >> configure.log + +# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions +# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a +# return value. The most secure result is vsnprintf() with a return value. snprintf() with a +# return value is secure as well, but then gzprintf() will be limited to 20 arguments. cat > $test.c < #include #include "zconf.h" - int main() { #ifndef STDC choke me #endif - return 0; } EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." - + echo >> configure.log cat > $test.c < #include - int mytest(const char *fmt, ...) { char buf[20]; va_list ap; - va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return 0; } +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for vsnprintf() in stdio.h... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_vsnprintf" + SFLAGS="$SFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < #include - int mytest(const char *fmt, ...) { int n; char buf[20]; va_list ap; - va_start(ap, fmt); - n = vsnprintf(buf, sizeof(buf), fmt, ap); + n = vsprintf(buf, fmt, ap); va_end(ap); return n; } - int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsnprintf()... Yes." - else - CFLAGS="$CFLAGS -DHAS_vsnprintf_void" - SFLAGS="$SFLAGS -DHAS_vsnprintf_void" - echo "Checking for return value of vsnprintf()... No." - echo " WARNING: apparently vsnprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." - fi - else - CFLAGS="$CFLAGS -DNO_vsnprintf" - SFLAGS="$SFLAGS -DNO_vsnprintf" - echo "Checking for vsnprintf() in stdio.h... No." - echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." - - cat >$test.c < -#include - -int mytest(const char *fmt, ...) -{ - int n; - char buf[20]; - va_list ap; - - va_start(ap, fmt); - n = vsprintf(buf, fmt, ap); - va_end(ap); - return n; -} - -int main() -{ - return (mytest("Hello%d\n", 1)); -} -EOF - - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_vsprintf_void" SFLAGS="$SFLAGS -DHAS_vsprintf_void" - echo "Checking for return value of vsprintf()... No." - echo " WARNING: apparently vsprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of vsprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi else - echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - snprintf(buf, sizeof(buf), "%s", "foo"); return 0; } - int main() { return (mytest()); } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for snprintf() in stdio.h... Yes." + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return snprintf(buf, sizeof(buf), "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of snprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of snprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_snprintf_void" SFLAGS="$SFLAGS -DHAS_snprintf_void" - echo "Checking for return value of snprintf()... No." - echo " WARNING: apparently snprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of snprintf()... No." | tee -a configure.log + echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi else CFLAGS="$CFLAGS -DNO_snprintf" SFLAGS="$SFLAGS -DNO_snprintf" - echo "Checking for snprintf() in stdio.h... No." - echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." + echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return sprintf(buf, "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of sprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of sprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_sprintf_void" SFLAGS="$SFLAGS -DHAS_sprintf_void" - echo "Checking for return value of sprintf()... No." - echo " WARNING: apparently sprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of sprintf()... No." | tee -a configure.log + echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi fi +# see if we can hide zlib internal symbols that are linked between separate source files if test "$gcc" -eq 1; then + echo >> configure.log cat > $test.c <= 33) -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif +#define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) int ZLIB_INTERNAL foo; int main() { return 0; } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for attribute(visibility) support... Yes." + if tryboth $CC -c $CFLAGS $test.c; then + CFLAGS="$CFLAGS -DHAVE_HIDDEN" + SFLAGS="$SFLAGS -DHAVE_HIDDEN" + echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log else - CFLAGS="$CFLAGS -DNO_VIZ" - SFLAGS="$SFLAGS -DNO_VIZ" - echo "Checking for attribute(visibility) support... No." + echo "Checking for attribute(visibility) support... No." | tee -a configure.log fi fi -CPP=${CPP-"$CC -E"} -case $CFLAGS in - *ASMV*) - if test "`$NM $test.o | grep _hello`" = ""; then - CPP="$CPP -DNO_UNDERLINE" - echo Checking for underline in external names... No. - else - echo Checking for underline in external names... Yes. - fi ;; -esac +# show the results in the log +echo >> configure.log +echo ALL = $ALL >> configure.log +echo AR = $AR >> configure.log +echo ARFLAGS = $ARFLAGS >> configure.log +echo CC = $CC >> configure.log +echo CFLAGS = $CFLAGS >> configure.log +echo CPP = $CPP >> configure.log +echo EXE = $EXE >> configure.log +echo LDCONFIG = $LDCONFIG >> configure.log +echo LDFLAGS = $LDFLAGS >> configure.log +echo LDSHARED = $LDSHARED >> configure.log +echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log +echo OBJC = $OBJC >> configure.log +echo PIC_OBJC = $PIC_OBJC >> configure.log +echo RANLIB = $RANLIB >> configure.log +echo SFLAGS = $SFLAGS >> configure.log +echo SHAREDLIB = $SHAREDLIB >> configure.log +echo SHAREDLIBM = $SHAREDLIBM >> configure.log +echo SHAREDLIBV = $SHAREDLIBV >> configure.log +echo STATICLIB = $STATICLIB >> configure.log +echo TEST = $TEST >> configure.log +echo VER = $VER >> configure.log +echo Z_U4 = $Z_U4 >> configure.log +echo exec_prefix = $exec_prefix >> configure.log +echo includedir = $includedir >> configure.log +echo libdir = $libdir >> configure.log +echo mandir = $mandir >> configure.log +echo prefix = $prefix >> configure.log +echo sharedlibdir = $sharedlibdir >> configure.log +echo uname = $uname >> configure.log -rm -f $test.[co] $test $test$shared_ext - -# udpate Makefile +# udpate Makefile with the configure results sed < Makefile.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# @@ -557,7 +784,8 @@ /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR_RC# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# /^RANLIB *=/s#=.*#=$RANLIB# /^LDCONFIG *=/s#=.*#=$LDCONFIG# /^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# @@ -568,10 +796,13 @@ /^sharedlibdir *=/s#=.*#=$sharedlibdir# /^includedir *=/s#=.*#=$includedir# /^mandir *=/s#=.*#=$mandir# +/^OBJC *=/s#=.*#= $OBJC# +/^PIC_OBJC *=/s#=.*#= $PIC_OBJC# /^all: */s#:.*#: $ALL# /^test: */s#:.*#: $TEST# " > Makefile +# create zlib.pc with the configure results sed < zlib.pc.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# @@ -581,7 +812,8 @@ /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR_RC# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# /^RANLIB *=/s#=.*#=$RANLIB# /^EXE *=/s#=.*#=$EXE# /^prefix *=/s#=.*#=$prefix# @@ -594,3 +826,6 @@ " | sed -e " s/\@VERSION\@/$VER/g; " > zlib.pc + +# done +leave 0 diff --git a/Modules/zlib/crc32.c b/Modules/zlib/crc32.c --- a/Modules/zlib/crc32.c +++ b/Modules/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -17,6 +17,8 @@ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH @@ -30,31 +32,11 @@ #define local static -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - /* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif #ifdef BYFOUR -# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, @@ -68,16 +50,16 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: @@ -107,9 +89,9 @@ */ local void make_crc_table() { - unsigned long c; + z_crc_t c; int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ + z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -121,13 +103,13 @@ first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { - c = (unsigned long)n; + c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; @@ -138,11 +120,11 @@ and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; - crc_table[4][n] = REV(c); + crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); + crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ @@ -164,7 +146,7 @@ if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); + fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR @@ -184,12 +166,13 @@ #ifdef MAKECRCH local void write_table(out, table) FILE *out; - const unsigned long FAR *table; + const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ @@ -204,13 +187,13 @@ /* ========================================================================= * This function can be used by asm versions of crc32() */ -const unsigned long FAR * ZEXPORT get_crc_table() +const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ @@ -232,7 +215,7 @@ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; + z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) @@ -266,17 +249,17 @@ const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = (u4)crc; + c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; @@ -306,17 +289,17 @@ const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = REV((u4)crc); + c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; @@ -333,7 +316,7 @@ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; - return (unsigned long)(REV(c)); + return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ diff --git a/Modules/zlib/crc32.h b/Modules/zlib/crc32.h --- a/Modules/zlib/crc32.h +++ b/Modules/zlib/crc32.h @@ -2,7 +2,7 @@ * Generated automatically by crc32.c */ -local const unsigned long FAR crc_table[TBLS][256] = +local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, diff --git a/Modules/zlib/deflate.c b/Modules/zlib/deflate.c --- a/Modules/zlib/deflate.c +++ b/Modules/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -37,7 +37,7 @@ * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt + * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -155,9 +155,12 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + /* =========================================================================== * Update a hash value with the given input byte - * IN assertion: all calls to UPDATE_HASH are made with consecutive + * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ @@ -170,7 +173,7 @@ * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. - * IN assertion: all calls to INSERT_STRING are made with consecutive + * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ @@ -235,10 +238,19 @@ strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif #ifdef FASTEST if (level != 0) level = 1; @@ -293,7 +305,7 @@ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + strm->msg = ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } @@ -314,43 +326,70 @@ uInt dictLength; { deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; - s = strm->state; - if (s->wrap) + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - if (length < MIN_MATCH) return Z_OK; - if (length > s->w_size) { - length = s->w_size; - dictionary += dictLength - length; /* use the tail of the dictionary */ + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); } - if (hash_head) hash_head = 0; /* to make compiler happy */ + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; return Z_OK; } /* ========================================================================= */ -int ZEXPORT deflateReset (strm) +int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; @@ -380,12 +419,23 @@ s->last_flush = Z_NO_FLUSH; _tr_init(s); - lm_init(s); return Z_OK; } /* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; @@ -397,14 +447,42 @@ } /* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { + deflate_state *s; + int put; + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); return Z_OK; } @@ -435,6 +513,8 @@ strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_BLOCK); + if (err == Z_BUF_ERROR && s->pending == 0) + err = Z_OK; } if (s->level != level) { s->level = level; @@ -562,19 +642,22 @@ local void flush_pending(strm) z_streamp strm; { - unsigned len = strm->state->pending; + unsigned len; + deflate_state *s = strm->state; + _tr_flush_bits(s); + len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; - zmemcpy(strm->next_out, strm->state->pending_out, len); + zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; - strm->state->pending_out += len; + s->pending_out += len; strm->total_out += len; strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; } } @@ -801,7 +884,7 @@ * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ - } else if (strm->avail_in == 0 && flush <= old_flush && + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } @@ -850,6 +933,7 @@ if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; + s->insert = 0; } } } @@ -945,12 +1029,12 @@ ss = source->state; - zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); @@ -966,8 +1050,8 @@ } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); @@ -1001,15 +1085,15 @@ strm->avail_in -= len; + zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); + strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); + strm->adler = crc32(strm->adler, buf, len); } #endif - zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; @@ -1036,6 +1120,7 @@ s->strstart = 0; s->block_start = 0L; s->lookahead = 0; + s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; @@ -1310,6 +1395,8 @@ unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); @@ -1362,7 +1449,7 @@ #endif more += wsize; } - if (s->strm->avail_in == 0) return; + if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && @@ -1381,12 +1468,24 @@ s->lookahead += n; /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. @@ -1427,6 +1526,9 @@ s->high_water += init; } } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); } /* =========================================================================== @@ -1506,8 +1608,14 @@ FLUSH_BLOCK(s, 0); } } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1603,8 +1711,14 @@ } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #ifndef FASTEST @@ -1728,8 +1842,14 @@ _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #endif /* FASTEST */ @@ -1749,11 +1869,11 @@ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. + * for the longest run, plus one for the unrolled loop. */ - if (s->lookahead < MAX_MATCH) { + if (s->lookahead <= MAX_MATCH) { fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ @@ -1776,6 +1896,7 @@ if (s->match_length > s->lookahead) s->match_length = s->lookahead; } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -1796,8 +1917,14 @@ } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1829,6 +1956,12 @@ s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } diff --git a/Modules/zlib/deflate.h b/Modules/zlib/deflate.h --- a/Modules/zlib/deflate.h +++ b/Modules/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -48,6 +48,9 @@ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 @@ -101,7 +104,7 @@ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ + Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ @@ -188,7 +191,7 @@ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ + /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ @@ -244,7 +247,7 @@ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ + uInt insert; /* bytes at end of window left to insert */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ @@ -294,6 +297,7 @@ int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); diff --git a/Modules/zlib/example.c b/Modules/zlib/example.c --- a/Modules/zlib/example.c +++ b/Modules/zlib/example.c @@ -1,5 +1,5 @@ /* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-2006 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -26,7 +26,7 @@ } \ } -const char hello[] = "hello, hello!"; +z_const char hello[] = "hello, hello!"; /* "hello world" would be more standard, but the repeated "hello" * stresses the compression code better, sorry... */ @@ -34,10 +34,6 @@ const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, - Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); @@ -53,6 +49,39 @@ Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + q = Z_NULL; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + /* =========================================================================== * Test compress() and uncompress() */ @@ -163,6 +192,8 @@ #endif } +#endif /* Z_SOLO */ + /* =========================================================================== * Test deflate() with small buffers */ @@ -174,14 +205,14 @@ int err; uLong len = (uLong)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { @@ -213,8 +244,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -252,8 +283,8 @@ z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); @@ -309,8 +340,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -349,14 +380,14 @@ int err; uInt len = (uInt)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (uInt)*comprLen; @@ -388,8 +419,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -430,22 +461,22 @@ z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, - (const Bytef*)dictionary, sizeof(dictionary)); + (const Bytef*)dictionary, (int)sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.avail_in = (uInt)strlen(hello)+1; err = deflate(&c_stream, Z_FINISH); @@ -469,8 +500,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -491,7 +522,7 @@ exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, - sizeof(dictionary)); + (int)sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } @@ -540,10 +571,15 @@ printf("out of memory\n"); exit(1); } + +#ifdef Z_SOLO + argc = strlen(argv[0]); +#else test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); +#endif test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); diff --git a/Modules/zlib/gzguts.h b/Modules/zlib/gzguts.h --- a/Modules/zlib/gzguts.h +++ b/Modules/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -12,7 +12,7 @@ # endif #endif -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -27,13 +27,80 @@ #endif #include +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99, yet still not supported by + Microsoft more than a decade later!), _snprintf does not guarantee null + termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ #ifdef _MSC_VER -# include -# define vsnprintf _vsnprintf +# define snprintf _snprintf #endif #ifndef local @@ -52,7 +119,7 @@ # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else -# ifdef STDC +# ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else @@ -68,7 +135,15 @@ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); #endif -/* default i/o buffer size -- double this for output when reading */ +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ #define GZBUFSIZE 8192 /* gzip modes, also provide a little integrity check on the passed structure */ @@ -84,23 +159,25 @@ /* internal gzip file state data structure */ typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ /* used for both reading and writing */ int mode; /* see gzip modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ - z_off64_t pos; /* current position in uncompressed data */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ unsigned char *in; /* input buffer */ unsigned char *out; /* output buffer (double-sized when reading) */ - unsigned char *next; /* next output data to deliver or write */ + int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ - unsigned have; /* amount of output data unused at next */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ int eof; /* true if end of input file reached */ - z_off64_t start; /* where the gzip data started, for rewinding */ - z_off64_t raw; /* where the raw data started, for seeking */ - int how; /* 0: get header, 1: copy, 2: decompress */ - int direct; /* true if last read direct, false if gzip */ + int past; /* true if read requested past end */ /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ diff --git a/Modules/zlib/gzio.c b/Modules/zlib/gzio.c deleted file mode 100644 --- a/Modules/zlib/gzio.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. - */ - -/* @(#) $Id$ */ - -#include - -#include "zutil.h" - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -#ifndef Z_BUFSIZE -# ifdef MAXSEG_64K -# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ -# else -# define Z_BUFSIZE 16384 -# endif -#endif -#ifndef Z_PRINTF_BUFSIZE -# define Z_PRINTF_BUFSIZE 4096 -#endif - -#ifdef __MVS__ -# pragma map (fdopen , "\174\174FDOPEN") - FILE *fdopen(int, const char *); -#endif - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern void free OF((voidpf ptr)); -#endif - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - z_off_t start; /* start of compressed data in file (header skipped) */ - z_off_t in; /* bytes into deflate or inflate */ - z_off_t out; /* bytes out of deflate or inflate */ - int back; /* one character push-back */ - int last; /* true if push-back is last character */ -} gz_stream; - - -local gzFile gz_open OF((const char *path, const char *mode, int fd)); -local int do_flush OF((gzFile file, int flush)); -local int get_byte OF((gz_stream *s)); -local void check_header OF((gz_stream *s)); -local int destroy OF((gz_stream *s)); -local void putLong OF((FILE *file, uLong x)); -local uLong getLong OF((gz_stream *s)); - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb"). The file is given either by file descriptor - or path name (if fd == -1). - gz_open returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). -*/ -local gzFile gz_open (path, mode, fd) - const char *path; - const char *mode; - int fd; -{ - int err; - int level = Z_DEFAULT_COMPRESSION; /* compression level */ - int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ - char *p = (char*)mode; - gz_stream *s; - char fmode[80]; /* copy of mode, without the compression level */ - char *m = fmode; - - if (!path || !mode) return Z_NULL; - - s = (gz_stream *)ALLOC(sizeof(gz_stream)); - if (!s) return Z_NULL; - - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; - s->stream.next_in = s->inbuf = Z_NULL; - s->stream.next_out = s->outbuf = Z_NULL; - s->stream.avail_in = s->stream.avail_out = 0; - s->file = NULL; - s->z_err = Z_OK; - s->z_eof = 0; - s->in = 0; - s->out = 0; - s->back = EOF; - s->crc = crc32(0L, Z_NULL, 0); - s->msg = NULL; - s->transparent = 0; - - s->path = (char*)ALLOC(strlen(path)+1); - if (s->path == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - strcpy(s->path, path); /* do this early for debugging */ - - s->mode = '\0'; - do { - if (*p == 'r') s->mode = 'r'; - if (*p == 'w' || *p == 'a') s->mode = 'w'; - if (*p >= '0' && *p <= '9') { - level = *p - '0'; - } else if (*p == 'f') { - strategy = Z_FILTERED; - } else if (*p == 'h') { - strategy = Z_HUFFMAN_ONLY; - } else if (*p == 'R') { - strategy = Z_RLE; - } else { - *m++ = *p; /* copy the mode */ - } - } while (*p++ && m != fmode + sizeof(fmode)); - if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateInit2(&(s->stream), level, - Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); - /* windowBits is passed < 0 to suppress zlib header */ - - s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); -#endif - if (err != Z_OK || s->outbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } else { - s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); - - err = inflateInit2(&(s->stream), -MAX_WBITS); - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are - * present after the compressed stream. - */ - if (err != Z_OK || s->inbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } - s->stream.avail_out = Z_BUFSIZE; - - errno = 0; - s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); - - if (s->file == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - if (s->mode == 'w') { - /* Write a very simple .gz header: - */ - fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); - s->start = 10L; - /* We use 10L instead of ftell(s->file) to because ftell causes an - * fflush on some systems. This version of the library doesn't use - * start anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->start = ftell(s->file) - s->stream.avail_in; - } - - return (gzFile)s; -} - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. -*/ -gzFile ZEXPORT gzopen (path, mode) - const char *path; - const char *mode; -{ - return gz_open (path, mode, -1); -} - -/* =========================================================================== - Associate a gzFile with the file descriptor fd. fd is not dup'ed here - to mimic the behavio(u)r of fdopen. -*/ -gzFile ZEXPORT gzdopen (fd, mode) - int fd; - const char *mode; -{ - char name[46]; /* allow for up to 128-bit integers */ - - if (fd < 0) return (gzFile)Z_NULL; - sprintf(name, "", fd); /* for debugging */ - - return gz_open (name, mode, fd); -} - -/* =========================================================================== - * Update the compression level and strategy - */ -int ZEXPORT gzsetparams (file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - /* Make room to allow flushing */ - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - } - s->stream.avail_out = Z_BUFSIZE; - } - - return deflateParams (&(s->stream), level, strategy); -} - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ -local int get_byte(s) - gz_stream *s; -{ - if (s->z_eof) return EOF; - if (s->stream.avail_in == 0) { - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) s->z_err = Z_ERRNO; - return EOF; - } - s->stream.next_in = s->inbuf; - } - s->stream.avail_in--; - return *(s->stream.next_in)++; -} - -/* =========================================================================== - Check the gzip header of a gz_stream opened for reading. Set the stream - mode to transparent if the gzip magic header is not present; set s->err - to Z_DATA_ERROR if the magic header is present but the rest of the header - is incorrect. - IN assertion: the stream s has already been created sucessfully; - s->stream.avail_in is zero for the first time, but may be non-zero - for concatenated .gz files. -*/ -local void check_header(s) - gz_stream *s; -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - /* Assure two bytes in the buffer so we can peek ahead -- handle case - where first byte of header is at the end of the buffer after the last - gzip segment */ - len = s->stream.avail_in; - if (len < 2) { - if (len) s->inbuf[0] = s->stream.next_in[0]; - errno = 0; - len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); - if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; - s->stream.avail_in += len; - s->stream.next_in = s->inbuf; - if (s->stream.avail_in < 2) { - s->transparent = s->stream.avail_in; - return; - } - } - - /* Peek ahead to check the gzip magic header */ - if (s->stream.next_in[0] != gz_magic[0] || - s->stream.next_in[1] != gz_magic[1]) { - s->transparent = 1; - return; - } - s->stream.avail_in -= 2; - s->stream.next_in += 2; - - /* Check the rest of the gzip header */ - method = get_byte(s); - flags = get_byte(s); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - s->z_err = Z_DATA_ERROR; - return; - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(s); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(s); - len += ((uInt)get_byte(s))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(s) != EOF) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) (void)get_byte(s); - } - s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; -} - - /* =========================================================================== - * Cleanup then free the given gz_stream. Return a zlib error code. - Try freeing in the reverse order of allocations. - */ -local int destroy (s) - gz_stream *s; -{ - int err = Z_OK; - - if (!s) return Z_STREAM_ERROR; - - TRYFREE(s->msg); - - if (s->stream.state != NULL) { - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateEnd(&(s->stream)); -#endif - } else if (s->mode == 'r') { - err = inflateEnd(&(s->stream)); - } - } - if (s->file != NULL && fclose(s->file)) { -#ifdef ESPIPE - if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ -#endif - err = Z_ERRNO; - } - if (s->z_err < 0) err = s->z_err; - - TRYFREE(s->inbuf); - TRYFREE(s->outbuf); - TRYFREE(s->path); - TRYFREE(s); - return err; -} - -/* =========================================================================== - Reads the given number of uncompressed bytes from the compressed file. - gzread returns the number of bytes actually read (0 for end of file). -*/ -int ZEXPORT gzread (file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - Bytef *start = (Bytef*)buf; /* starting point for crc computation */ - Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ - - if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; - - if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; - if (s->z_err == Z_STREAM_END) return 0; /* EOF */ - - next_out = (Byte*)buf; - s->stream.next_out = (Bytef*)buf; - s->stream.avail_out = len; - - if (s->stream.avail_out && s->back != EOF) { - *next_out++ = s->back; - s->stream.next_out++; - s->stream.avail_out--; - s->back = EOF; - s->out++; - start++; - if (s->last) { - s->z_err = Z_STREAM_END; - return 1; - } - } - - while (s->stream.avail_out != 0) { - - if (s->transparent) { - /* Copy first the lookahead bytes: */ - uInt n = s->stream.avail_in; - if (n > s->stream.avail_out) n = s->stream.avail_out; - if (n > 0) { - zmemcpy(s->stream.next_out, s->stream.next_in, n); - next_out += n; - s->stream.next_out = next_out; - s->stream.next_in += n; - s->stream.avail_out -= n; - s->stream.avail_in -= n; - } - if (s->stream.avail_out > 0) { - s->stream.avail_out -= - (uInt)fread(next_out, 1, s->stream.avail_out, s->file); - } - len -= s->stream.avail_out; - s->in += len; - s->out += len; - if (len == 0) s->z_eof = 1; - return (int)len; - } - if (s->stream.avail_in == 0 && !s->z_eof) { - - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) { - s->z_err = Z_ERRNO; - break; - } - } - s->stream.next_in = s->inbuf; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = inflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - - if (s->z_err == Z_STREAM_END) { - /* Check CRC and original size */ - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - start = s->stream.next_out; - - if (getLong(s) != s->crc) { - s->z_err = Z_DATA_ERROR; - } else { - (void)getLong(s); - /* The uncompressed length returned by above getlong() may be - * different from s->out in case of concatenated .gz files. - * Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - inflateReset(&(s->stream)); - s->crc = crc32(0L, Z_NULL, 0); - } - } - } - if (s->z_err != Z_OK || s->z_eof) break; - } - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - - if (len == s->stream.avail_out && - (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) - return -1; - return (int)(len - s->stream.avail_out); -} - - -/* =========================================================================== - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ -int ZEXPORT gzgetc(file) - gzFile file; -{ - unsigned char c; - - return gzread(file, &c, 1) == 1 ? c : -1; -} - - -/* =========================================================================== - Push one byte back onto the stream. -*/ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; - s->back = c; - s->out--; - s->last = (s->z_err == Z_STREAM_END); - if (s->last) s->z_err = Z_OK; - s->z_eof = 0; - return c; -} - - -/* =========================================================================== - Reads bytes from the compressed file until len-1 characters are - read, or a newline character is read and transferred to buf, or an - end-of-file condition is encountered. The string is then terminated - with a null character. - gzgets returns buf, or Z_NULL in case of error. - - The current implementation is not optimized at all. -*/ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - char *b = buf; - if (buf == Z_NULL || len <= 0) return Z_NULL; - - while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; - *buf = '\0'; - return b == buf && len > 0 ? Z_NULL : b; -} - - -#ifndef NO_GZCOMPRESS -/* =========================================================================== - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of bytes actually written (0 in case of error). -*/ -int ZEXPORT gzwrite (file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.next_in = (Bytef*)buf; - s->stream.avail_in = len; - - while (s->stream.avail_in != 0) { - - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - break; - } - s->stream.avail_out = Z_BUFSIZE; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - if (s->z_err != Z_OK) break; - } - s->crc = crc32(s->crc, (const Bytef *)buf, len); - - return (int)(len - s->stream.avail_in); -} - - -/* =========================================================================== - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ -#ifdef STDC -#include - -int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) -{ - char buf[Z_PRINTF_BUFSIZE]; - va_list va; - int len; - - buf[sizeof(buf) - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(buf, format, va); - va_end(va); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = vsprintf(buf, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(buf, sizeof(buf), format, va); - va_end(va); - len = strlen(buf); -# else - len = vsnprintf(buf, sizeof(buf), format, va); - va_end(va); -# endif -#endif - if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, (unsigned)len); -} -#else /* not ANSI C */ - -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - char buf[Z_PRINTF_BUFSIZE]; - int len; - - buf[sizeof(buf) - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(buf); -# else - len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, len); -} -#endif - -/* =========================================================================== - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char cc = (unsigned char) c; /* required for big endian systems */ - - return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; -} - - -/* =========================================================================== - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ - return gzwrite(file, (char*)s, (unsigned)strlen(s)); -} - - -/* =========================================================================== - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. -*/ -local int do_flush (file, flush) - gzFile file; - int flush; -{ - uInt len; - int done = 0; - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.avail_in = 0; /* should be zero already anyway */ - - for (;;) { - len = Z_BUFSIZE - s->stream.avail_out; - - if (len != 0) { - if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { - s->z_err = Z_ERRNO; - return Z_ERRNO; - } - s->stream.next_out = s->outbuf; - s->stream.avail_out = Z_BUFSIZE; - } - if (done) break; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), flush); - s->out -= s->stream.avail_out; - - /* Ignore the second of two consecutive flushes: */ - if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; - - /* deflate has finished flushing only when it hasn't used up - * all the available space in the output buffer: - */ - done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); - - if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; - } - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} - -int ZEXPORT gzflush (file, flush) - gzFile file; - int flush; -{ - gz_stream *s = (gz_stream*)file; - int err = do_flush (file, flush); - - if (err) return err; - fflush(s->file); - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} -#endif /* NO_GZCOMPRESS */ - -/* =========================================================================== - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error. - SEEK_END is not implemented, returns error. - In this version of the library, gzseek can be extremely slow. -*/ -z_off_t ZEXPORT gzseek (file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || whence == SEEK_END || - s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { - return -1L; - } - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->in; - } - if (offset < 0) return -1L; - - /* At this point, offset is the number of zero bytes to write. */ - if (s->inbuf == Z_NULL) { - s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ - if (s->inbuf == Z_NULL) return -1L; - zmemzero(s->inbuf, Z_BUFSIZE); - } - while (offset > 0) { - uInt size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (uInt)offset; - - size = gzwrite(file, s->inbuf, size); - if (size == 0) return -1L; - - offset -= size; - } - return s->in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->in = s->out = offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if (offset >= s->out) { - offset -= s->out; - } else if (gzrewind(file) < 0) { - return -1L; - } - /* offset is now the number of bytes to skip. */ - - if (offset != 0 && s->outbuf == Z_NULL) { - s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); - if (s->outbuf == Z_NULL) return -1L; - } - if (offset && s->back != EOF) { - s->back = EOF; - s->out++; - offset--; - if (s->last) s->z_err = Z_STREAM_END; - } - while (offset > 0) { - int size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (int)offset; - - size = gzread(file, s->outbuf, (uInt)size); - if (size <= 0) return -1L; - offset -= size; - } - return s->out; -} - -/* =========================================================================== - Rewinds input file. -*/ -int ZEXPORT gzrewind (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return -1; - - s->z_err = Z_OK; - s->z_eof = 0; - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - if (!s->transparent) (void)inflateReset(&s->stream); - s->in = 0; - s->out = 0; - return fseek(s->file, s->start, SEEK_SET); -} - -/* =========================================================================== - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. -*/ -z_off_t ZEXPORT gztell (file) - gzFile file; -{ - return gzseek(file, 0L, SEEK_CUR); -} - -/* =========================================================================== - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ -int ZEXPORT gzeof (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - /* With concatenated compressed files that can have embedded - * crc trailers, z_eof is no longer the only/best indicator of EOF - * on a gz_stream. Handle end-of-stream error explicitly here. - */ - if (s == NULL || s->mode != 'r') return 0; - if (s->z_eof) return 1; - return s->z_err == Z_STREAM_END; -} - -/* =========================================================================== - Returns 1 if reading and doing so transparently, otherwise zero. -*/ -int ZEXPORT gzdirect (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return 0; - return s->transparent; -} - -/* =========================================================================== - Outputs a long in LSB order to the given file -*/ -local void putLong (file, x) - FILE *file; - uLong x; -{ - int n; - for (n = 0; n < 4; n++) { - fputc((int)(x & 0xff), file); - x >>= 8; - } -} - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets z_err in case - of error. -*/ -local uLong getLong (s) - gz_stream *s; -{ - uLong x = (uLong)get_byte(s); - int c; - - x += ((uLong)get_byte(s))<<8; - x += ((uLong)get_byte(s))<<16; - c = get_byte(s); - if (c == EOF) s->z_err = Z_DATA_ERROR; - x += ((uLong)c)<<24; - return x; -} - -/* =========================================================================== - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. -*/ -int ZEXPORT gzclose (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return Z_STREAM_ERROR; -#else - if (do_flush (file, Z_FINISH) != Z_OK) - return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, (uLong)(s->in & 0xffffffff)); -#endif - } - return destroy((gz_stream*)file); -} - -#ifdef STDC -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -/* =========================================================================== - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ -const char * ZEXPORT gzerror (file, errnum) - gzFile file; - int *errnum; -{ - char *m; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) { - *errnum = Z_STREAM_ERROR; - return (const char*)ERR_MSG(Z_STREAM_ERROR); - } - *errnum = s->z_err; - if (*errnum == Z_OK) return (const char*)""; - - m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); - - if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); - - TRYFREE(s->msg); - s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); - if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} - -/* =========================================================================== - Clear the error and end-of-file flags, and do the same for the real file. -*/ -void ZEXPORT gzclearerr (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return; - if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; - s->z_eof = 0; - clearerr(s->file); -} diff --git a/Modules/zlib/gzlib.c b/Modules/zlib/gzlib.c --- a/Modules/zlib/gzlib.c +++ b/Modules/zlib/gzlib.c @@ -1,19 +1,23 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010 Mark Adler + * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif +#endif /* Local functions */ local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const char *, int, const char *)); +local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE @@ -71,28 +75,40 @@ local void gz_reset(state) gz_statep state; { + state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ - state->have = 0; /* no output data available */ state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ - state->direct = 1; /* default for empty file */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ - state->pos = 0; /* no uncompressed data yet */ + state->x.pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) - const char *path; + const void *path; int fd; const char *mode; { gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; /* allocate gzFile structure to return */ - state = malloc(sizeof(gz_state)); + state = (gz_statep)malloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ @@ -103,6 +119,7 @@ state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; @@ -124,6 +141,16 @@ return NULL; case 'b': /* ignore -- will request binary anyway */ break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif case 'f': state->strategy = Z_FILTERED; break; @@ -135,6 +162,10 @@ break; case 'F': state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; default: /* could consider as an error, but just ignore */ ; } @@ -147,30 +178,71 @@ return NULL; } + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + /* save the path name for error messages */ - state->path = malloc(strlen(path) + 1); +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } - strcpy(state->path, path); +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif - /* open the file with the appropriate mode (or just use fd) */ - state->fd = fd != -1 ? fd : - open(path, + /* compute the flags for open() */ + oflag = #ifdef O_LARGEFILE - O_LARGEFILE | + O_LARGEFILE | #endif #ifdef O_BINARY - O_BINARY | + O_BINARY | #endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | ( - state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))), - 0666); +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); @@ -216,15 +288,29 @@ char *path; /* identifier for error messages */ gzFile gz; - if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ +#else sprintf(path, "", fd); /* for debugging */ +#endif gz = gz_open(path, fd, mode); free(path); return gz; } /* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; unsigned size; @@ -243,8 +329,8 @@ return -1; /* check and set requested size */ - if (size == 0) - return -1; + if (size < 2) + size = 2; /* need two bytes to check magic header */ state->want = size; return 0; } @@ -261,7 +347,8 @@ state = (gz_statep)file; /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* back up and start over */ @@ -289,7 +376,7 @@ return -1; /* check that there's no error */ - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* can only seek from start or relative to current position */ @@ -298,31 +385,32 @@ /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) - offset -= state->pos; + offset -= state->x.pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && - state->pos + offset >= state->raw) { - ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); if (ret == -1) return -1; - state->have = 0; + state->x.have = 0; state->eof = 0; + state->past = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; - state->pos += offset; - return state->pos; + state->x.pos += offset; + return state->x.pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; - offset += state->pos; + offset += state->x.pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ @@ -331,11 +419,11 @@ /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { - n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? - (unsigned)offset : state->have; - state->have -= n; - state->next += n; - state->pos += n; + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; offset -= n; } @@ -344,7 +432,7 @@ state->seek = 1; state->skip = offset; } - return state->pos + offset; + return state->x.pos + offset; } /* -- see zlib.h -- */ @@ -373,7 +461,7 @@ return -1; /* return position */ - return state->pos + (state->seek ? state->skip : 0); + return state->x.pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ @@ -433,8 +521,7 @@ return 0; /* return end-of-file state */ - return state->mode == GZ_READ ? - (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; + return state->mode == GZ_READ ? state->past : 0; } /* -- see zlib.h -- */ @@ -454,7 +541,8 @@ /* return error information */ if (errnum != NULL) *errnum = state->err; - return state->msg == NULL ? "" : state->msg; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); } /* -- see zlib.h -- */ @@ -471,8 +559,10 @@ return; /* clear error and end-of-file */ - if (state->mode == GZ_READ) + if (state->mode == GZ_READ) { state->eof = 0; + state->past = 0; + } gz_error(state, Z_OK, NULL); } @@ -494,26 +584,33 @@ state->msg = NULL; } + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; - /* for an out of memory error, save as static string */ - if (err == Z_MEM_ERROR) { - state->msg = (char *)msg; + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; return; } - - /* construct error message with path */ - if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { - state->err = Z_MEM_ERROR; - state->msg = (char *)"out of memory"; - return; - } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); +#endif return; } diff --git a/Modules/zlib/gzread.c b/Modules/zlib/gzread.c --- a/Modules/zlib/gzread.c +++ b/Modules/zlib/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,10 +8,9 @@ /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); -local int gz_next4 OF((gz_statep, unsigned long *)); -local int gz_head OF((gz_statep)); +local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); -local int gz_make OF((gz_statep)); +local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from @@ -46,73 +45,54 @@ error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. - gz_avail() assumes that strm->avail_in == 0. */ + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ local int gz_avail(state) gz_statep state; { + unsigned got; z_streamp strm = &(state->strm); - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { - if (gz_load(state, state->in, state->size, - (unsigned *)&(strm->avail_in)) == -1) + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) return -1; + strm->avail_in += got; strm->next_in = state->in; } return 0; } -/* Get next byte from input, or -1 if end or error. */ -#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ - (strm->avail_in == 0 ? -1 : \ - (strm->avail_in--, *(strm->next_in)++))) - -/* Get a four-byte little-endian integer and return 0 on success and the value - in *ret. Otherwise -1 is returned and *ret is not modified. */ -local int gz_next4(state, ret) - gz_statep state; - unsigned long *ret; -{ - int ch; - unsigned long val; - z_streamp strm = &(state->strm); - - val = NEXT(); - val += (unsigned)NEXT() << 8; - val += (unsigned long)NEXT() << 16; - ch = NEXT(); - if (ch == -1) - return -1; - val += (unsigned long)ch << 24; - *ret = val; - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->have must be zero. +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression, and the gzip header will be skipped so - that the next available input data is the raw deflate stream. If direct - copying, then leftover input data from the input buffer will be copied to - the output buffer. In that case, all further file reads will be directly to - either the output buffer or a user buffer. If decompressing, the inflate - state and the check value will be initialized. gz_head() will return 0 on - success or -1 on failure. Failures may include read errors or gzip header - errors. */ -local int gz_head(state) + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) gz_statep state; { z_streamp strm = &(state->strm); - int flags; - unsigned len; /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ - state->in = malloc(state->want); - state->out = malloc(state->want << 1); + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) free(state->out); @@ -129,7 +109,7 @@ state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ free(state->out); free(state->in); state->size = 0; @@ -138,83 +118,45 @@ } } - /* get some data in the input buffer */ - if (strm->avail_in == 0) { + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } - /* look for the gzip magic header bytes 31 and 139 */ - if (strm->next_in[0] == 31) { - strm->avail_in--; - strm->next_in++; - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in && strm->next_in[0] == 139) { - /* we have a gzip header, woo hoo! */ - strm->avail_in--; - strm->next_in++; - - /* skip rest of header */ - if (NEXT() != 8) { /* compression method */ - gz_error(state, Z_DATA_ERROR, "unknown compression method"); - return -1; - } - flags = NEXT(); - if (flags & 0xe0) { /* reserved flag bits */ - gz_error(state, Z_DATA_ERROR, "unknown header flags set"); - return -1; - } - NEXT(); /* modification time */ - NEXT(); - NEXT(); - NEXT(); - NEXT(); /* extra flags */ - NEXT(); /* operating system */ - if (flags & 4) { /* extra field */ - len = (unsigned)NEXT(); - len += (unsigned)NEXT() << 8; - while (len--) - if (NEXT() < 0) - break; - } - if (flags & 8) /* file name */ - while (NEXT() > 0) - ; - if (flags & 16) /* comment */ - while (NEXT() > 0) - ; - if (flags & 2) { /* header crc */ - NEXT(); - NEXT(); - } - /* an unexpected end of file is not checked for here -- it will be - noticed on the first request for uncompressed data */ - - /* set up for decompression */ - inflateReset(strm); - strm->adler = crc32(0L, Z_NULL, 0); - state->how = GZIP; - state->direct = 0; - return 0; - } - else { - /* not a gzip file -- save first byte (31) and fall to raw i/o */ - state->out[0] = 31; - state->have = 1; - } + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; } - /* doing raw i/o, save start of raw data for seeking, copy any leftover - input to output -- this assumes that the output buffer is larger than - the input buffer, which also assures space for gzungetc() */ - state->raw = state->pos; - state->next = state->out; + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; if (strm->avail_in) { - memcpy(state->next + state->have, strm->next_in, strm->avail_in); - state->have += strm->avail_in; + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; strm->avail_in = 0; } state->how = COPY; @@ -223,19 +165,15 @@ } /* Decompress from input to the provided next_out and avail_out in the state. - If the end of the compressed data is reached, then verify the gzip trailer - check value and length (modulo 2^32). state->have and state->next are set - to point to the just decompressed data, and the crc is updated. If the - trailer is verified, state->how is reset to LOOK to look for the next gzip - stream or raw data, once state->have is depleted. Returns 0 on success, -1 - on failure. Failures may include invalid compressed data or a failed gzip - trailer verification. */ + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ local int gz_decomp(state) gz_statep state; { - int ret; + int ret = Z_OK; unsigned had; - unsigned long crc, len; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ @@ -245,15 +183,15 @@ if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); + "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { @@ -262,67 +200,55 @@ } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); + strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); - /* update available output and crc check value */ - state->have = had - strm->avail_out; - state->next = strm->next_out - state->have; - strm->adler = crc32(strm->adler, state->next, state->have); + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; - /* check gzip trailer if at end of deflate stream */ - if (ret == Z_STREAM_END) { - if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; - } - if (crc != strm->adler) { - gz_error(state, Z_DATA_ERROR, "incorrect data check"); - return -1; - } - if (len != (strm->total_out & 0xffffffffL)) { - gz_error(state, Z_DATA_ERROR, "incorrect length check"); - return -1; - } - state->how = LOOK; /* ready for next stream, once have is 0 (leave - state->direct unchanged to remember how) */ - } + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; /* good decompression */ return 0; } -/* Make data and put in the output buffer. Assumes that state->have == 0. +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is - looked for (and skipped if found) to determine wither to copy or decompress. - Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY - or GZIP unless the end of the input file has been reached and all data has - been processed. */ -local int gz_make(state) + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) gz_statep state; { z_streamp strm = &(state->strm); - if (state->how == LOOK) { /* look for gzip header */ - if (gz_head(state) == -1) - return -1; - if (state->have) /* got some data from gz_head() */ + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; return 0; - } - if (state->how == COPY) { /* straight copy */ - if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) - return -1; - state->next = state->out; - } - else if (state->how == GZIP) { /* decompress */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); return 0; } @@ -336,12 +262,12 @@ /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ - if (state->have) { - n = GT_OFF(state->have) || (z_off64_t)state->have > len ? - (unsigned)len : state->have; - state->have -= n; - state->next += n; - state->pos += n; + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; len -= n; } @@ -352,7 +278,7 @@ /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; } return 0; @@ -374,14 +300,15 @@ state = (gz_statep)file; strm = &(state->strm); - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return -1; } @@ -400,49 +327,51 @@ got = 0; do { /* first just try copying data from the output buffer */ - if (state->have) { - n = state->have > len ? len : state->have; - memcpy(buf, state->next, n); - state->next += n; - state->have -= n; + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ break; + } /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; - continue; /* no progress yet -- go back to memcpy() above */ + continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ - if (gz_load(state, buf, len, &n) == -1) + if (gz_load(state, (unsigned char *)buf, len, &n) == -1) return -1; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ strm->avail_out = len; - strm->next_out = buf; + strm->next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) return -1; - n = state->have; - state->have = 0; + n = state->x.have; + state->x.have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; - state->pos += n; + state->x.pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ @@ -450,6 +379,11 @@ } /* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif int ZEXPORT gzgetc(file) gzFile file; { @@ -462,15 +396,16 @@ return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* try output buffer (no need to check for skip request) */ - if (state->have) { - state->have--; - state->pos++; - return *(state->next)++; + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; } /* nothing there -- try gzread() */ @@ -478,6 +413,12 @@ return ret < 1 ? -1 : buf[0]; } +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; @@ -490,8 +431,9 @@ return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* process a skip request */ @@ -506,32 +448,34 @@ return -1; /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->have == 0) { - state->have = 1; - state->next = state->out + (state->size << 1) - 1; - state->next[0] = c; - state->pos--; + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } /* if no room, give up (must have already done a gzungetc()) */ - if (state->have == (state->size << 1)) { - gz_error(state, Z_BUF_ERROR, "out of room to push characters"); + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ - if (state->next == state->out) { - unsigned char *src = state->out + state->have; + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; - state->next = dest; + state->x.next = dest; } - state->have++; - state->next--; - state->next[0] = c; - state->pos--; + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } @@ -551,8 +495,9 @@ return NULL; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return NULL; /* process a skip request */ @@ -569,32 +514,31 @@ left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ - if (state->have == 0) { - if (gz_make(state) == -1) - return NULL; /* error */ - if (state->have == 0) { /* end of file */ - if (buf == str) /* got bupkus */ - return NULL; - break; /* got something -- return it */ - } + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ } /* look for end-of-line in current output buffer */ - n = state->have > left ? left : state->have; - eol = memchr(state->next, '\n', n); + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); if (eol != NULL) - n = (unsigned)(eol - state->next) + 1; + n = (unsigned)(eol - state->x.next) + 1; /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->next, n); - state->have -= n; - state->next += n; - state->pos += n; + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; left -= n; buf += n; } while (left && eol == NULL); - /* found end-of-line or out of space -- terminate string and return it */ + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; buf[0] = 0; return str; } @@ -610,16 +554,12 @@ return 0; state = (gz_statep)file; - /* check that we're reading */ - if (state->mode != GZ_READ) - return 0; - /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ - if (state->how == LOOK && state->have == 0) - (void)gz_head(state); + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); - /* return 1 if reading direct, 0 if decompressing a gzip stream */ + /* return 1 if transparent, 0 if processing a gzip stream */ return state->direct; } @@ -627,7 +567,7 @@ int ZEXPORT gzclose_r(file) gzFile file; { - int ret; + int ret, err; gz_statep state; /* get internal structure */ @@ -645,9 +585,10 @@ free(state->out); free(state->in); } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); - return ret ? Z_ERRNO : Z_OK; + return ret ? Z_ERRNO : err; } diff --git a/Modules/zlib/gzwrite.c b/Modules/zlib/gzwrite.c --- a/Modules/zlib/gzwrite.c +++ b/Modules/zlib/gzwrite.c @@ -1,5 +1,5 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -18,44 +18,55 @@ int ret; z_streamp strm = &(state->strm); - /* allocate input and output buffers */ - state->in = malloc(state->want); - state->out = malloc(state->want); - if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); + /* allocate input buffer */ + state->in = (unsigned char *)malloc(state->want); + if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - 15 + 16, 8, state->strategy); - if (ret != Z_OK) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } } /* mark state as initialized */ state->size = state->want; - /* initialize write buffer */ - strm->avail_out = state->size; - strm->next_out = state->out; - state->next = strm->next_out; + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. */ + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; @@ -68,6 +79,17 @@ if (state->size == 0 && gz_init(state) == -1) return -1; + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -75,8 +97,8 @@ doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->next); - if (have && ((got = write(state->fd, state->next, have)) < 0 || + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || (unsigned)got != have)) { gz_error(state, Z_ERRNO, zstrerror()); return -1; @@ -85,7 +107,7 @@ strm->avail_out = state->size; strm->next_out = state->out; } - state->next = strm->next_out; + state->x.next = strm->next_out; } /* compress */ @@ -131,7 +153,7 @@ } strm->avail_in = n; strm->next_in = state->in; - state->pos += n; + state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; @@ -146,7 +168,6 @@ unsigned len; { unsigned put = len; - unsigned n; gz_statep state; z_streamp strm; @@ -163,7 +184,7 @@ /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return 0; } @@ -186,16 +207,19 @@ if (len < state->size) { /* copy to input buffer, compress when full */ do { + unsigned have, copy; + if (strm->avail_in == 0) strm->next_in = state->in; - n = state->size - strm->avail_in; - if (n > len) - n = len; - memcpy(strm->next_in + strm->avail_in, buf, n); - strm->avail_in += n; - state->pos += n; - buf = (char *)buf + n; - len -= n; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + strm->avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; if (len && gz_comp(state, Z_NO_FLUSH) == -1) return 0; } while (len); @@ -207,8 +231,8 @@ /* directly compress user buffer to file */ strm->avail_in = len; - strm->next_in = (voidp)buf; - state->pos += len; + strm->next_in = (z_const Bytef *)buf; + state->x.pos += len; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; } @@ -222,6 +246,7 @@ gzFile file; int c; { + unsigned have; unsigned char buf[1]; gz_statep state; z_streamp strm; @@ -245,19 +270,23 @@ /* try writing to input buffer for speed (state->size == 0 if buffer not initialized) */ - if (strm->avail_in < state->size) { + if (state->size) { if (strm->avail_in == 0) strm->next_in = state->in; - strm->next_in[strm->avail_in++] = c; - state->pos++; - return c; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } } /* no room in buffer or not initialized, use gz_write() */ buf[0] = c; if (gzwrite(file, buf, 1) != 1) return -1; - return c; + return c & 0xff; } /* -- see zlib.h -- */ @@ -274,87 +303,11 @@ return ret == 0 && len != 0 ? -1 : ret; } -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) -{ - int size, len; - gz_statep state; - z_streamp strm; - va_list va; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(state->in, format, va); - va_end(va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = vsprintf(state->in, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(state->in, size, format, va); - va_end(va); - len = strlen(state->in); -# else - len = vsnprintf((char *)(state->in), size, format, va); - va_end(va); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->pos += len; - return len; -} - -#else /* !STDC */ - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int size, len; gz_statep state; @@ -388,24 +341,20 @@ /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = vsprintf((char *)(state->in), format, va); # endif #else -# ifdef HAS_snprintf_void - snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(state->in); +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + len = strlen((char *)(state->in)); # else - len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = vsnprintf((char *)(state->in), size, format, va); # endif #endif @@ -416,7 +365,97 @@ /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; - state->pos += len; + state->x.pos += len; + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; return len; } @@ -500,7 +539,7 @@ int ZEXPORT gzclose_w(file) gzFile file; { - int ret = 0; + int ret = Z_OK; gz_statep state; /* get internal structure */ @@ -515,17 +554,24 @@ /* check for seek request */ if (state->seek) { state->seek = 0; - ret += gz_zero(state, state->skip); + if (gz_zero(state, state->skip) == -1) + ret = state->err; } /* flush, free memory, and close file */ - ret += gz_comp(state, Z_FINISH); - (void)deflateEnd(&(state->strm)); - free(state->out); - free(state->in); + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } gz_error(state, Z_OK, NULL); free(state->path); - ret += close(state->fd); + if (close(state->fd) == -1) + ret = Z_ERRNO; free(state); - return ret ? Z_ERRNO : Z_OK; + return ret; } diff --git a/Modules/zlib/infback.c b/Modules/zlib/infback.c --- a/Modules/zlib/infback.c +++ b/Modules/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2009 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -42,10 +42,19 @@ return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -246,7 +255,7 @@ void FAR *out_desc; { struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ + z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ @@ -394,7 +403,6 @@ PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } diff --git a/Modules/zlib/inffast.c b/Modules/zlib/inffast.c --- a/Modules/zlib/inffast.c +++ b/Modules/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010 Mark Adler + * Copyright (C) 1995-2008, 2010, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -69,8 +69,8 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ diff --git a/Modules/zlib/inffixed.h b/Modules/zlib/inffixed.h --- a/Modules/zlib/inffixed.h +++ b/Modules/zlib/inffixed.h @@ -2,9 +2,9 @@ * Generated automatically by makefixed(). */ - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { diff --git a/Modules/zlib/inflate.c b/Modules/zlib/inflate.c --- a/Modules/zlib/inflate.c +++ b/Modules/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -93,13 +93,39 @@ /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); #ifdef BUILDFIXED void makefixed OF((void)); #endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + int ZEXPORT inflateReset(strm) z_streamp strm; { @@ -107,24 +133,10 @@ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->wnext = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; + return inflateResetKeep(strm); } int ZEXPORT inflateReset2(strm, windowBits) @@ -180,10 +192,19 @@ if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -321,8 +342,8 @@ low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } @@ -355,12 +376,13 @@ output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, out) +local int updatewindow(strm, end, copy) z_streamp strm; -unsigned out; +const Bytef *end; +unsigned copy; { struct inflate_state FAR *state; - unsigned copy, dist; + unsigned dist; state = (struct inflate_state FAR *)strm->state; @@ -380,19 +402,18 @@ } /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + zmemcpy(state->window, end - state->wsize, state->wsize); state->wnext = 0; state->whave = state->wsize; } else { dist = state->wsize - state->wnext; if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); + zmemcpy(state->window + state->wnext, end - copy, dist); copy -= dist; if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); + zmemcpy(state->window, end - copy, copy); state->wnext = copy; state->whave = state->wsize; } @@ -499,11 +520,6 @@ bits -= bits & 7; \ } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -591,7 +607,7 @@ int flush; { struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ + z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ @@ -797,7 +813,7 @@ #endif case DICTID: NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); + strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: @@ -905,7 +921,7 @@ while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; - state->lencode = (code const FAR *)(state->next); + state->lencode = (const code FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); @@ -925,7 +941,6 @@ PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } @@ -980,7 +995,7 @@ values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; - state->lencode = (code const FAR *)(state->next); + state->lencode = (const code FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); @@ -989,7 +1004,7 @@ state->mode = BAD; break; } - state->distcode = (code const FAR *)(state->next); + state->distcode = (const code FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); @@ -1170,7 +1185,7 @@ #ifdef GUNZIP state->flags ? hold : #endif - REVERSE(hold)) != state->check) { + ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; @@ -1214,8 +1229,9 @@ */ inf_leave: RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } @@ -1249,13 +1265,37 @@ return Z_OK; } +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; - unsigned long id; + unsigned long dictid; + int ret; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; @@ -1263,29 +1303,21 @@ if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; - /* check for correct dictionary id */ + /* check for correct dictionary identifier */ if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) return Z_DATA_ERROR; } - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { state->mode = MEM; return Z_MEM_ERROR; } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; @@ -1321,7 +1353,7 @@ */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; -unsigned char FAR *buf; +const unsigned char FAR *buf; unsigned len; { unsigned got; @@ -1433,8 +1465,8 @@ } /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); diff --git a/Modules/zlib/inftrees.c b/Modules/zlib/inftrees.c --- a/Modules/zlib/inftrees.c +++ b/Modules/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; + " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -208,8 +208,8 @@ mask = used - 1; /* mask for comparing low */ /* check available table space */ - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ @@ -277,8 +277,8 @@ /* check for enough space */ used += 1U << curr; - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ @@ -289,38 +289,14 @@ } } - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - here.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = here; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; } /* set return parameters */ diff --git a/Modules/zlib/inftrees.h b/Modules/zlib/inftrees.h --- a/Modules/zlib/inftrees.h +++ b/Modules/zlib/inftrees.h @@ -41,7 +41,7 @@ examples/enough.c found in the zlib distribtution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns 852, and "enough 30 6 15" for distance codes returns 592. + returns returns 852, and "enough 30 6 15" for distance codes returns 592. The initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and diff --git a/Modules/zlib/make_vms.com b/Modules/zlib/make_vms.com --- a/Modules/zlib/make_vms.com +++ b/Modules/zlib/make_vms.com @@ -3,7 +3,7 @@ $! $! In case of problems with the install you might contact me at $! zinser at zinser.no-ip.info(preferred) or -$! zinser at sysdev.deutsche-boerse.com (work) +$! martin.zinser at eurexchange.com (work) $! $! Make procedure history for Zlib $! @@ -14,9 +14,16 @@ $! 0.03 20091224 Add support for large file check $! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite $! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! subdir path, update module search in makefile.in +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! shared image creation +$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared +$! image +$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). +$! "" -> automatic, preference: MMK, MMS, built-in. $! $ on error then goto err_exit -$ set proc/parse=ext $! $ true = 1 $ false = 0 @@ -32,31 +39,43 @@ $! $! Setup variables holding "config" information $! -$ Make = "" +$ Make = "''p1'" $ name = "Zlib" $ version = "?.?.?" $ v_string = "ZLIB_VERSION" $ v_file = "zlib.h" -$ ccopt = "" +$ ccopt = "/include = []" $ lopts = "" $ dnsrl = "" -$ aconf_in_file = "zconf.h.in#zconf.h_in" +$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" $ conf_check_string = "" $ linkonly = false $ optfile = name + ".opt" +$ mapfile = name + ".map" $ libdefs = "" +$ vax = f$getsyi("HW_MODEL").lt.1024 $ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$ ia64 = f$getsyi("HW_MODEL").ge.4096 $! -$ whoami = f$parse(f$enviornment("Procedure"),,,,"NO_CONCEAL") +$! 2012-03-05 SMS. +$! Why is this needed? And if it is needed, why not simply ".not. vax"? +$! +$!!! if axp .or. ia64 then set proc/parse=extended +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") $ mydef = F$parse(whoami,,,"DEVICE") $ mydir = f$parse(whoami,,,"DIRECTORY") - "][" $ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") $! $! Check for MMK/MMS $! -$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" -$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" -$! +$ if (Make .eqs. "") +$ then +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$ else +$ Make = f$edit( Make, "trim") +$ endif $! $ gosub find_version $! @@ -69,6 +88,7 @@ $! $ gosub check_compiler $ close topt +$ close optf $! $ if its_decc $ then @@ -83,6 +103,15 @@ $ define sys decc$library_include: $ endif $ endif +$! +$! 2012-03-05 SMS. +$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? +$! +$ if axp .or. ia64 +$ then +$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" +$ s_case = true +$ endif $ endif $ if its_vaxc .or. its_gnuc $ then @@ -122,15 +151,20 @@ $ endif $ goto aconf_loop $ACONF_EXIT: +$ write aconf "" +$ write aconf "/* VMS specifics added by make_vms.com: */" $ write aconf "#define VMS 1" $ write aconf "#include " $ write aconf "#include " $ write aconf "#ifdef _LARGEFILE" -$ write aconf "#define off64_t __off64_t" -$ write aconf "#define fopen64 fopen" -$ write aconf "#define fseeko64 fseeko" -$ write aconf "#define lseek64 lseek" -$ write aconf "#define ftello64 ftell" +$ write aconf "# define off64_t __off64_t" +$ write aconf "# define fopen64 fopen" +$ write aconf "# define fseeko64 fseeko" +$ write aconf "# define lseek64 lseek" +$ write aconf "# define ftello64 ftell" +$ write aconf "#endif" +$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" +$ write aconf "# define HAVE_VSNPRINTF" $ write aconf "#endif" $ close aconf_in $ close aconf @@ -139,8 +173,9 @@ $! $ write sys$output "Compiling Zlib sources ..." $ if make.eqs."" -$ then -$ dele example.obj;*,minigzip.obj;* +$ then +$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* +$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* $ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - adler32.c zlib.h zconf.h $ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - @@ -174,41 +209,34 @@ $ write sys$output "Building Zlib ..." $ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ $ write sys$output "Building example..." -$ CALL MAKE example.OBJ "CC ''CCOPT' example" - - example.c zlib.h zconf.h +$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - + [.test]example.c zlib.h zconf.h $ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb -$ if f$search("x11vms:xvmsutils.olb") .nes. "" -$ then -$ write sys$output "Building minigzip..." -$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - - minigzip.c zlib.h zconf.h -$ call make minigzip.exe - - "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - - minigzip.obj libz.olb -$ endif -$ else +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - + [.test]minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib" - + minigzip.obj libz.olb +$ else $ gosub crea_mms $ write sys$output "Make ''name' ''version' with ''Make' " $ 'make' -$ endif +$ endif $! -$! Alpha gets a shareable image +$! Create shareable image $! -$ If axp -$ Then -$ gosub crea_olist -$ write sys$output "Creating libzshr.exe" -$ call anal_obj_axp modules.opt _link.opt -$ if s_case -$ then -$ open/append optf modules.opt -$ write optf "case_sensitive=YES" -$ close optf -$ endif -$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt -$ endif +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call map_2_shopt 'mapfile' 'optfile' +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt $ write sys$output "Zlib build completed" +$ delete/nolog tmp.opt;* $ exit +$AMISS_ERR: +$ write sys$output "No source for config.hin found." +$ write sys$output "Tried any of ''aconf_in_file'" +$ goto err_exit $CC_ERR: $ write sys$output "C compiler required to build ''name'" $ goto err_exit @@ -216,7 +244,6 @@ $ set message/facil/ident/sever/text $ close/nolog optf $ close/nolog topt -$ close/nolog conf_hin $ close/nolog aconf_in $ close/nolog aconf $ close/nolog out @@ -397,7 +424,7 @@ $ deck # descrip.mms: MMS description file for building zlib on VMS # written by Martin P.J. Zinser -# +# OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ @@ -407,10 +434,9 @@ $ eod $ write out "CFLAGS=", ccopt $ write out "LOPTS=", lopts +$ write out "all : example.exe minigzip.exe libz.olb" $ copy sys$input: out $ deck - -all : example.exe minigzip.exe libz.olb @ write sys$output " Example applications available" libz.olb : libz.olb($(OBJS)) @@ -420,7 +446,7 @@ link $(LOPTS) example,libz.olb/lib minigzip.exe : minigzip.obj libz.olb - link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + link $(LOPTS) minigzip,libz.olb/lib clean : delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* @@ -431,7 +457,7 @@ compress.obj : compress.c zlib.h zconf.h crc32.obj : crc32.c zutil.h zlib.h zconf.h deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h -example.obj : example.c zlib.h zconf.h +example.obj : [.test]example.c zlib.h zconf.h gzclose.obj : gzclose.c zutil.h zlib.h zconf.h gzlib.obj : gzlib.c zutil.h zlib.h zconf.h gzread.obj : gzread.c zutil.h zlib.h zconf.h @@ -439,7 +465,7 @@ inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h inflate.obj : inflate.c zutil.h zlib.h zconf.h inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h -minigzip.obj : minigzip.c zlib.h zconf.h +minigzip.obj : [.test]minigzip.c zlib.h zconf.h trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h uncompr.obj : uncompr.c zlib.h zconf.h zutil.obj : zutil.c zutil.h zlib.h zconf.h @@ -455,13 +481,18 @@ $CREA_OLIST: $ open/read min makefile.in $ open/write mod modules.opt -$ src_check = "OBJC =" +$ src_check_list = "OBJZ =#OBJG =" $MRLOOP: $ read/end=mrdone min rec -$ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop +$ i = 0 +$SRC_CHECK_LOOP: +$ src_check = f$element(i, "#", src_check_list) +$ i = i+1 +$ if src_check .eqs. "#" then goto mrloop +$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop $ rec = rec - src_check $ gosub extra_filnam -$ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop $MRSLOOP: $ read/end=mrdone min rec $ gosub extra_filnam @@ -672,124 +703,6 @@ $ return $!------------------------------------------------------------------------------ $! -$! Analyze Object files for OpenVMS AXP to extract Procedure and Data -$! information to build a symbol vector for a shareable image -$! All the "brains" of this logic was suggested by Hartmut Becker -$! (Hartmut.Becker at compaq.com). All the bugs were introduced by me -$! (zinser at zinser.no-ip.info), so if you do have problem reports please do not -$! bother Hartmut/HP, but get in touch with me -$! -$! Version history -$! 0.01 20040406 Skip over shareable images in option file -$! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES -$! 0.03 20050107 Skip over Identification labels in option file -$! 0.04 20060117 Add uppercase alias to code compiled with /name=as_is -$! -$ ANAL_OBJ_AXP: Subroutine -$ V = 'F$Verify(0) -$ SAY := "WRITE_ SYS$OUTPUT" -$ -$ IF F$SEARCH("''P1'") .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" -$ goto exit_aa -$ ENDIF -$ IF "''P2'" .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP: Error, no output file provided" -$ goto exit_aa -$ ENDIF -$ -$ open/read in 'p1 -$ create a.tmp -$ open/append atmp a.tmp -$ loop: -$ read/end=end_loop in line -$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" -$ goto loop -$ endif -$ if f$locate("IDENTIFICATION=",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write sys$output "ANAL_OBJ_AXP-i-ident: Identification ", - - f$element(1,"=",line) -$ goto loop -$ endif -$ f= f$search(line) -$ if f .eqs. "" -$ then -$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" -$ goto loop -$ endif -$ define/user sys$output nl: -$ define/user sys$error nl: -$ anal/obj/gsd 'f /out=x.tmp -$ open/read xtmp x.tmp -$ XLOOP: -$ read/end=end_xloop xtmp xline -$ xline = f$edit(xline,"compress") -$ write atmp xline -$ goto xloop -$ END_XLOOP: -$ close xtmp -$ goto loop -$ end_loop: -$ close in -$ close atmp -$ if f$search("a.tmp") .eqs. "" - - then $ exit -$ ! all global definitions -$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp -$ ! all procedures -$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp -$ search c.tmp "symbol:"/out=d.tmp -$ define/user sys$output nl: -$ edito/edt/command=sys$input d.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=PROCEDURE)/whole -exit -$ ! all data -$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp -$ search e.tmp "symbol:"/out=f.tmp -$ define/user sys$output nl: -$ edito/edt/command=sys$input f.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=DATA)/whole -exit -$ sort/nodupl d.tmp,f.tmp g.tmp -$ open/read raw_vector g.tmp -$ open/write case_vector 'p2' -$ RAWLOOP: -$ read/end=end_rawloop raw_vector raw_element -$ write case_vector raw_element -$ if f$locate("=PROCEDURE)",raw_element) .lt. f$length(raw_element) -$ then -$ name = f$element(1,"=",raw_element) - "(" -$ if f$edit(name,"UPCASE") .nes. name then - - write case_vector f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)", - - f$edit(name,"UPCASE"), name) -$ endif -$ if f$locate("=DATA)",raw_element) .lt. f$length(raw_element) -$ then -$ name = f$element(1,"=",raw_element) - "(" -$ if f$edit(name,"UPCASE") .nes. name then - - write case_vector f$fao(" symbol_vector=(!AS/!AS=DATA)", - - f$edit(name,"UPCASE"), name) -$ endif -$ goto rawloop -$ END_RAWLOOP: -$ close raw_vector -$ close case_vector -$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*,g.tmp;* -$ if f$search("x.tmp") .nes. "" - - then $ delete x.tmp;* -$! -$ EXIT_AA: -$ if V then set verify -$ endsubroutine -$!------------------------------------------------------------------------------ -$! $! Write configuration to both permanent and temporary config file $! $! Version history @@ -802,3 +715,153 @@ $ close confh $ENDSUBROUTINE $!------------------------------------------------------------------------------ +$! +$! Analyze the project map file and create the symbol vector for a shareable +$! image from it +$! +$! Version history +$! 0.01 20120128 First version +$! 0.02 20120226 Add pre-load logic +$! +$ MAP_2_SHOPT: Subroutine +$! +$ SAY := "WRITE_ SYS$OUTPUT" +$! +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_m2s +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT: Error, no output file provided" +$ goto exit_m2s +$ ENDIF +$! +$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" +$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" +$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" +$ module4 = "inflateSync#uncompress#zlibVersion#compress" +$ open/read map 'p1 +$ if axp .or. ia64 +$ then +$ open/write aopt a.opt +$ open/write bopt b.opt +$ write aopt " CASE_SENSITIVE=YES" +$ write bopt "SYMBOL_VECTOR= (-" +$ mod_sym_num = 1 +$ MOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ MOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ mod_in = mod_in + 1 +$ goto mod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto mod_sym_loop +$ endif +$MAP_LOOP: +$ read/end=map_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto map_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ endif +$ goto map_loop +$MAP_END: +$ close/nolog aopt +$ close/nolog bopt +$ open/append libopt 'p2' +$ open/read aopt a.opt +$ open/read bopt b.opt +$ALOOP: +$ read/end=aloop_end aopt line +$ write libopt line +$ goto aloop +$ALOOP_END: +$ close/nolog aopt +$ sv = "" +$BLOOP: +$ read/end=bloop_end bopt svn +$ if (svn.nes."") +$ then +$ if (sv.nes."") then write libopt sv +$ sv = svn +$ endif +$ goto bloop +$BLOOP_END: +$ write libopt f$extract(0,f$length(sv)-2,sv), "-" +$ write libopt ")" +$ close/nolog bopt +$ delete/nolog/noconf a.opt;*,b.opt;* +$ else +$ if vax +$ then +$ open/append libopt 'p2' +$ mod_sym_num = 1 +$ VMOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ VMOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ mod_in = mod_in + 1 +$ goto vmod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto vmod_sym_loop +$ endif +$VMAP_LOOP: +$ read/end=vmap_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto vmap_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ endif +$ goto vmap_loop +$VMAP_END: +$ else +$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" +$ write sys$output "No options file created" +$ endif +$ endif +$ EXIT_M2S: +$ close/nolog map +$ close/nolog libopt +$ endsubroutine diff --git a/Modules/zlib/minigzip.c b/Modules/zlib/minigzip.c --- a/Modules/zlib/minigzip.c +++ b/Modules/zlib/minigzip.c @@ -1,5 +1,5 @@ /* minigzip.c -- simulate gzip using the zlib compression library - * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -40,6 +40,10 @@ # define SET_BINARY_MODE(file) #endif +#ifdef _MSC_VER +# define snprintf _snprintf +#endif + #ifdef VMS # define unlink delete # define GZ_SUFFIX "-gz" @@ -138,6 +142,197 @@ # define local #endif +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + q = Z_NULL; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + char *prog; void error OF((const char *msg)); @@ -272,8 +467,12 @@ exit(1); } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); +#else strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); +#endif in = fopen(file, "rb"); if (in == NULL) { @@ -308,7 +507,11 @@ exit(1); } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf, sizeof(buf), "%s", file); +#else strcpy(buf, file); +#endif if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { infile = file; @@ -317,7 +520,11 @@ } else { outfile = file; infile = buf; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); +#else strcat(infile, GZ_SUFFIX); +#endif } in = gzopen(infile, "rb"); if (in == NULL) { @@ -355,7 +562,11 @@ gzFile file; char *bname, outmode[20]; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outmode, sizeof(outmode), "%s", "wb6 "); +#else strcpy(outmode, "wb6 "); +#endif prog = argv[0]; bname = strrchr(argv[0], '/'); diff --git a/Modules/zlib/trees.c b/Modules/zlib/trees.c --- a/Modules/zlib/trees.c +++ b/Modules/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -74,11 +74,6 @@ * probability, to avoid transmitting the lengths for unused bit length codes. */ -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - /* =========================================================================== * Local data. These are initialized only once. */ @@ -151,8 +146,8 @@ local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); @@ -399,7 +394,6 @@ s->bi_buf = 0; s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; @@ -883,15 +877,17 @@ } /* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; @@ -902,20 +898,6 @@ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; } /* =========================================================================== @@ -990,7 +972,8 @@ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+last, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif @@ -998,7 +981,8 @@ send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif @@ -1075,8 +1059,8 @@ */ local void compress_block(s, ltree, dtree) deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ @@ -1118,7 +1102,6 @@ } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== @@ -1226,7 +1209,6 @@ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); diff --git a/Modules/zlib/uncompr.c b/Modules/zlib/uncompr.c --- a/Modules/zlib/uncompr.c +++ b/Modules/zlib/uncompr.c @@ -30,7 +30,7 @@ z_stream stream; int err; - stream.next_in = (Bytef*)source; + stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; diff --git a/Modules/zlib/zconf.h b/Modules/zlib/zconf.h --- a/Modules/zlib/zconf.h +++ b/Modules/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,11 +15,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -27,9 +29,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -40,44 +44,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -92,16 +105,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -111,7 +130,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -197,6 +218,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -243,6 +270,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -356,12 +391,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -370,21 +440,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -394,18 +481,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.h.cmakein b/Modules/zlib/zconf.h.cmakein --- a/Modules/zlib/zconf.h.cmakein +++ b/Modules/zlib/zconf.h.cmakein @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -17,11 +17,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -29,9 +31,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -42,44 +46,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -94,16 +107,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -113,7 +132,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -199,6 +220,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -245,6 +272,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -358,12 +393,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -372,21 +442,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -396,18 +483,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.h.in b/Modules/zlib/zconf.h.in --- a/Modules/zlib/zconf.h.in +++ b/Modules/zlib/zconf.h.in @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,11 +15,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -27,9 +29,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -40,44 +44,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -92,16 +105,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -111,7 +130,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -197,6 +218,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -243,6 +270,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -356,12 +391,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -370,21 +440,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -394,18 +481,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.in.h b/Modules/zlib/zconf.in.h deleted file mode 100644 --- a/Modules/zlib/zconf.in.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/Modules/zlib/zlib.3 b/Modules/zlib/zlib.3 --- a/Modules/zlib/zlib.3 +++ b/Modules/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "19 Apr 2010" +.TH ZLIB 3 "28 Apr 2013" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -36,9 +36,9 @@ .IR zlib.h . The distribution source includes examples of use of the library in the files -.I example.c +.I test/example.c and -.IR minigzip.c, +.IR test/minigzip.c, as well as other examples in the .IR examples/ directory. @@ -65,7 +65,7 @@ written by A.M. Kuchling (amk at magnet.com), is available in Python 1.5 and later versions: .IP -http://www.python.org/doc/lib/module-zlib.html +http://docs.python.org/library/zlib.html .LP .I zlib is built into @@ -95,11 +95,11 @@ The data format used by the zlib library is described by RFC (Request for Comments) 1950 to 1952 in the files: .IP -http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format) +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) .br -http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format) +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) .br -http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format) +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) .LP Mark Nelson wrote an article about .I zlib @@ -125,8 +125,8 @@ Send questions and/or comments to zlib at gzip.org, or (for the Windows DLL version) to Gilles Vollant (info at winimage.com). .SH AUTHORS -Version 1.2.5 -Copyright (C) 1995-2010 Jean-loup Gailly (jloup at gzip.org) +Version 1.2.8 +Copyright (C) 1995-2013 Jean-loup Gailly (jloup at gzip.org) and Mark Adler (madler at alumni.caltech.edu). .LP This software is provided "as-is," diff --git a/Modules/zlib/zlib.h b/Modules/zlib/zlib.h --- a/Modules/zlib/zlib.h +++ b/Modules/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.5, April 19th, 2010 + version 1.2.8, April 28th, 2013 - Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,8 +24,8 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.5" -#define ZLIB_VERNUM 0x1250 +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_REVISION 8 #define ZLIB_VER_SUBREVISION 0 /* @@ -83,15 +83,15 @@ struct internal_state; typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ + z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + uLong total_out; /* total number of bytes output so far */ - char *msg; /* last error message, NULL if no error */ + z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ @@ -327,8 +327,9 @@ Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). @@ -451,23 +452,29 @@ error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is never required, but can be - used to inform inflate that a faster approach may be used for the single - inflate() call. + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK or Z_TREES is used. + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, + strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END @@ -478,7 +485,9 @@ initializing with inflateInit2(). Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -580,10 +589,15 @@ uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any call - of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly @@ -610,8 +624,8 @@ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, @@ -688,9 +702,29 @@ deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. */ +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); @@ -703,8 +737,9 @@ than or equal to 16, and that many of the least significant bits of value will be inserted in the output. - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, @@ -790,10 +825,11 @@ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is @@ -803,19 +839,38 @@ inflate(). */ +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been - found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the - success case, the application may save the current value of total_in - which indicates where valid compressed data was found. In the error case, - the application may repeatedly call inflateSync, providing more input each - time, until success or end of the input data. + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -962,12 +1017,13 @@ See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + the parameters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, @@ -975,11 +1031,12 @@ out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. @@ -1088,6 +1145,7 @@ 27-31: 0 (reserved) */ +#ifndef Z_SOLO /* utility functions */ @@ -1149,10 +1207,11 @@ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. */ - /* gzip file access functions */ /* @@ -1162,7 +1221,7 @@ wrapper, documented in RFC 1952, wrapped around a deflate stream. */ -typedef voidp gzFile; /* opaque gzip file descriptor */ +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); @@ -1172,13 +1231,28 @@ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) Also "a" - can be used instead of "w" to request that the gzip stream that will be - written be appended to the file. "+" will result in an error, since reading - and writing to the same gzip file is not supported. + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was @@ -1197,7 +1271,11 @@ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not @@ -1235,14 +1313,26 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If - the input file was not in gzip format, gzread copies the given number of - bytes into the buffer. + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream, or failing that, reading the rest - of the input file directly without decompression. The entire input file - will be read if gzread is called until it returns less than the requested - len. + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. @@ -1256,7 +1346,7 @@ error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of @@ -1301,7 +1391,10 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); @@ -1397,9 +1490,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. This state can change from - false to true while reading the input file if the end of a gzip stream is - reached, but is followed by data that is not another gzip stream. + (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. @@ -1408,6 +1499,13 @@ cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); @@ -1419,7 +1517,8 @@ must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, or Z_OK on success. + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); @@ -1457,6 +1556,7 @@ file that is being written concurrently. */ +#endif /* !Z_SOLO */ /* checksum functions */ @@ -1492,16 +1592,17 @@ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. Usage example: @@ -1544,17 +1645,42 @@ const char *version, int stream_size)); #define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if @@ -1562,7 +1688,7 @@ * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); @@ -1571,14 +1697,23 @@ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# ifdef _LARGEFILE64_SOURCE +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); @@ -1595,6 +1730,13 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + /* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; @@ -1603,8 +1745,21 @@ /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif #ifdef __cplusplus } diff --git a/Modules/zlib/zlib.map b/Modules/zlib/zlib.map --- a/Modules/zlib/zlib.map +++ b/Modules/zlib/zlib.map @@ -66,3 +66,18 @@ gzclose_r; gzclose_w; } ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; diff --git a/Modules/zlib/zutil.c b/Modules/zlib/zutil.c --- a/Modules/zlib/zutil.c +++ b/Modules/zlib/zutil.c @@ -1,17 +1,20 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif -const char * const z_errmsg[10] = { +z_const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ @@ -85,27 +88,27 @@ #ifdef FASTEST flags += 1L << 21; #endif -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_vsprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #else - flags += 1L << 24; + flags += 1L << 24; # ifdef NO_snprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_sprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #endif @@ -181,6 +184,7 @@ } #endif +#ifndef Z_SOLO #ifdef SYS16BIT @@ -316,3 +320,5 @@ } #endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/Modules/zlib/zutil.h b/Modules/zlib/zutil.h --- a/Modules/zlib/zutil.h +++ b/Modules/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,7 +13,7 @@ #ifndef ZUTIL_H #define ZUTIL_H -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -21,7 +21,7 @@ #include "zlib.h" -#ifdef STDC +#if defined(STDC) && !defined(Z_SOLO) # if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif @@ -29,6 +29,10 @@ # include #endif +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + #ifndef local # define local static #endif @@ -40,13 +44,13 @@ typedef ush FAR ushf; typedef unsigned long ulg; -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) + return (strm->msg = ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ @@ -78,16 +82,18 @@ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include # endif -# else /* MSC or DJGPP */ -# include # endif #endif @@ -107,18 +113,20 @@ #ifdef OS2 # define OS_CODE 0x06 -# ifdef M_I86 +# if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif # endif # endif #endif @@ -153,14 +161,15 @@ # endif #endif -#if defined(__BORLANDC__) +#if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 #pragma warn -8066 #endif /* provide prototypes for these when building zlib without LFS */ -#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); #endif @@ -177,42 +186,7 @@ /* functions */ -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# define vsnprintf _vsnprintf -# endif -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) +#if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) @@ -261,14 +235,19 @@ # define Tracecv(c,x) #endif - -voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); -void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + #endif /* ZUTIL_H */ diff --git a/PC/VS9.0/pythoncore.vcproj b/PC/VS9.0/pythoncore.vcproj --- a/PC/VS9.0/pythoncore.vcproj +++ b/PC/VS9.0/pythoncore.vcproj @@ -1246,74 +1246,6 @@ > - - - - - - - - - - - - - - - - - - - - - - - - - - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 12:32:29 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 21 Oct 2013 12:32:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_typo_in_whatsnew?= Message-ID: <3d3Dgd69j5z7LjN@mail.python.org> http://hg.python.org/cpython/rev/2c7cb8b2bd50 changeset: 86547:2c7cb8b2bd50 user: Christian Heimes date: Mon Oct 21 12:32:21 2013 +0200 summary: Fix typo in whatsnew files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -434,7 +434,7 @@ pprint ------ -The :mod::`pprint` module now supports *compact* mode for formatting long +The :mod:`pprint` module now supports *compact* mode for formatting long sequences (:issue:`19132`). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 13:28:44 2013 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Oct 2013 13:28:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_fix_typo_in_what=27s_new_i?= =?utf-8?q?n_3=2E4?= Message-ID: <3d3FwX2PFNz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/10dbe5591e62 changeset: 86548:10dbe5591e62 user: Victor Stinner date: Mon Oct 21 13:27:11 2013 +0200 summary: fix typo in what's new in 3.4 files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -271,7 +271,7 @@ statement. (Contributed by Raymond Hettinger in :issue:`15806` and Zero Piraeus in :issue:`19266`) -The new :class:`contextlib.redirect_stdio` context manager makes it easier +The new :func:`contextlib.redirect_stdout` context manager makes it easier for utility scripts to handle inflexible APIs that don't provide any options to retrieve their output as a string or direct it to somewhere other than :data:`sys.stdout`. In conjunction with :class:`io.StringIO`, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 14:00:52 2013 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 21 Oct 2013 14:00:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319170=3A_telnetli?= =?utf-8?q?b=3A_use_selectors=2E?= Message-ID: <3d3Gdc5gYqz7Ljj@mail.python.org> http://hg.python.org/cpython/rev/f713d9b6393c changeset: 86549:f713d9b6393c user: Charles-Fran?ois Natali date: Mon Oct 21 14:02:12 2013 +0200 summary: Issue #19170: telnetlib: use selectors. files: Lib/telnetlib.py | 273 +++++++----------------- Lib/test/test_telnetlib.py | 101 ++------- 2 files changed, 100 insertions(+), 274 deletions(-) diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py --- a/Lib/telnetlib.py +++ b/Lib/telnetlib.py @@ -17,13 +17,12 @@ Note that read_all() won't read until eof -- it just reads some data -- but it guarantees to read at least one byte unless EOF is hit. -It is possible to pass a Telnet object to select.select() in order to -wait until more data is available. Note that in this case, -read_eager() may return b'' even if there was data on the socket, -because the protocol negotiation may have eaten the data. This is why -EOFError is needed in some cases to distinguish between "no data" and -"connection closed" (since the socket also appears ready for reading -when it is closed). +It is possible to pass a Telnet object to a selector in order to wait until +more data is available. Note that in this case, read_eager() may return b'' +even if there was data on the socket, because the protocol negotiation may have +eaten the data. This is why EOFError is needed in some cases to distinguish +between "no data" and "connection closed" (since the socket also appears ready +for reading when it is closed). To do: - option negotiation @@ -34,10 +33,9 @@ # Imported modules -import errno import sys import socket -import select +import selectors __all__ = ["Telnet"] @@ -130,6 +128,15 @@ EXOPL = bytes([255]) # Extended-Options-List NOOPT = bytes([0]) + +# poll/select have the advantage of not requiring any extra file descriptor, +# contrarily to epoll/kqueue (also, they require a single syscall). +if hasattr(selectors, 'PollSelector'): + _TelnetSelector = selectors.PollSelector +else: + _TelnetSelector = selectors.SelectSelector + + class Telnet: """Telnet interface class. @@ -206,7 +213,6 @@ self.sb = 0 # flag for SB and SE sequence. self.sbdataq = b'' self.option_callback = None - self._has_poll = hasattr(select, 'poll') if host is not None: self.open(host, port, timeout) @@ -289,61 +295,6 @@ is closed and no cooked data is available. """ - if self._has_poll: - return self._read_until_with_poll(match, timeout) - else: - return self._read_until_with_select(match, timeout) - - def _read_until_with_poll(self, match, timeout): - """Read until a given string is encountered or until timeout. - - This method uses select.poll() to implement the timeout. - """ - n = len(match) - call_timeout = timeout - if timeout is not None: - from time import time - time_start = time() - self.process_rawq() - i = self.cookedq.find(match) - if i < 0: - poller = select.poll() - poll_in_or_priority_flags = select.POLLIN | select.POLLPRI - poller.register(self, poll_in_or_priority_flags) - while i < 0 and not self.eof: - try: - ready = poller.poll(call_timeout) - except OSError as e: - if e.errno == errno.EINTR: - if timeout is not None: - elapsed = time() - time_start - call_timeout = timeout-elapsed - continue - raise - for fd, mode in ready: - if mode & poll_in_or_priority_flags: - i = max(0, len(self.cookedq)-n) - self.fill_rawq() - self.process_rawq() - i = self.cookedq.find(match, i) - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - call_timeout = timeout-elapsed - poller.unregister(self) - if i >= 0: - i = i + n - buf = self.cookedq[:i] - self.cookedq = self.cookedq[i:] - return buf - return self.read_very_lazy() - - def _read_until_with_select(self, match, timeout=None): - """Read until a given string is encountered or until timeout. - - The timeout is implemented using select.select(). - """ n = len(match) self.process_rawq() i = self.cookedq.find(match) @@ -352,27 +303,26 @@ buf = self.cookedq[:i] self.cookedq = self.cookedq[i:] return buf - s_reply = ([self], [], []) - s_args = s_reply if timeout is not None: - s_args = s_args + (timeout,) from time import time - time_start = time() - while not self.eof and select.select(*s_args) == s_reply: - i = max(0, len(self.cookedq)-n) - self.fill_rawq() - self.process_rawq() - i = self.cookedq.find(match, i) - if i >= 0: - i = i+n - buf = self.cookedq[:i] - self.cookedq = self.cookedq[i:] - return buf - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - s_args = s_reply + (timeout-elapsed,) + deadline = time() + timeout + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + while not self.eof: + if selector.select(timeout): + i = max(0, len(self.cookedq)-n) + self.fill_rawq() + self.process_rawq() + i = self.cookedq.find(match, i) + if i >= 0: + i = i+n + buf = self.cookedq[:i] + self.cookedq = self.cookedq[i:] + return buf + if timeout is not None: + timeout = deadline - time() + if timeout < 0: + break return self.read_very_lazy() def read_all(self): @@ -577,29 +527,35 @@ def sock_avail(self): """Test whether data is available on the socket.""" - return select.select([self], [], [], 0) == ([self], [], []) + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + return bool(selector.select(0)) def interact(self): """Interaction function, emulates a very dumb telnet client.""" if sys.platform == "win32": self.mt_interact() return - while 1: - rfd, wfd, xfd = select.select([self, sys.stdin], [], []) - if self in rfd: - try: - text = self.read_eager() - except EOFError: - print('*** Connection closed by remote host ***') - break - if text: - sys.stdout.write(text.decode('ascii')) - sys.stdout.flush() - if sys.stdin in rfd: - line = sys.stdin.readline().encode('ascii') - if not line: - break - self.write(line) + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + selector.register(sys.stdin, selectors.EVENT_READ) + + while True: + for key, events in selector.select(): + if key.fileobj is self: + try: + text = self.read_eager() + except EOFError: + print('*** Connection closed by remote host ***') + return + if text: + sys.stdout.write(text.decode('ascii')) + sys.stdout.flush() + elif key.fileobj is sys.stdin: + line = sys.stdin.readline().encode('ascii') + if not line: + return + self.write(line) def mt_interact(self): """Multithreaded version of interact().""" @@ -646,79 +602,6 @@ results are undeterministic, and may depend on the I/O timing. """ - if self._has_poll: - return self._expect_with_poll(list, timeout) - else: - return self._expect_with_select(list, timeout) - - def _expect_with_poll(self, expect_list, timeout=None): - """Read until one from a list of a regular expressions matches. - - This method uses select.poll() to implement the timeout. - """ - re = None - expect_list = expect_list[:] - indices = range(len(expect_list)) - for i in indices: - if not hasattr(expect_list[i], "search"): - if not re: import re - expect_list[i] = re.compile(expect_list[i]) - call_timeout = timeout - if timeout is not None: - from time import time - time_start = time() - self.process_rawq() - m = None - for i in indices: - m = expect_list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - break - if not m: - poller = select.poll() - poll_in_or_priority_flags = select.POLLIN | select.POLLPRI - poller.register(self, poll_in_or_priority_flags) - while not m and not self.eof: - try: - ready = poller.poll(call_timeout) - except OSError as e: - if e.errno == errno.EINTR: - if timeout is not None: - elapsed = time() - time_start - call_timeout = timeout-elapsed - continue - raise - for fd, mode in ready: - if mode & poll_in_or_priority_flags: - self.fill_rawq() - self.process_rawq() - for i in indices: - m = expect_list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - break - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - call_timeout = timeout-elapsed - poller.unregister(self) - if m: - return (i, m, text) - text = self.read_very_lazy() - if not text and self.eof: - raise EOFError - return (-1, None, text) - - def _expect_with_select(self, list, timeout=None): - """Read until one from a list of a regular expressions matches. - - The timeout is implemented using select.select(). - """ re = None list = list[:] indices = range(len(list)) @@ -728,27 +611,27 @@ list[i] = re.compile(list[i]) if timeout is not None: from time import time - time_start = time() - while 1: - self.process_rawq() - for i in indices: - m = list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - return (i, m, text) - if self.eof: - break - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - s_args = ([self.fileno()], [], [], timeout-elapsed) - r, w, x = select.select(*s_args) - if not r: - break - self.fill_rawq() + deadline = time() + timeout + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + while not self.eof: + self.process_rawq() + for i in indices: + m = list[i].search(self.cookedq) + if m: + e = m.end() + text = self.cookedq[:e] + self.cookedq = self.cookedq[e:] + return (i, m, text) + if timeout is not None: + ready = selector.select(timeout) + timeout = deadline - time() + if not ready: + if timeout < 0: + break + else: + continue + self.fill_rawq() text = self.read_very_lazy() if not text and self.eof: raise EOFError diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -1,10 +1,9 @@ import socket -import select +import selectors import telnetlib import time import contextlib -import unittest from unittest import TestCase from test import support threading = support.import_module('threading') @@ -112,40 +111,32 @@ self._messages += out.getvalue() return -def mock_select(*s_args): - block = False - for l in s_args: - for fob in l: - if isinstance(fob, TelnetAlike): - block = fob.sock.block - if block: - return [[], [], []] - else: - return s_args - -class MockPoller(object): - test_case = None # Set during TestCase setUp. +class MockSelector(selectors.BaseSelector): def __init__(self): - self._file_objs = [] + super().__init__() + self.keys = {} - def register(self, fd, eventmask): - self.test_case.assertTrue(hasattr(fd, 'fileno'), fd) - self.test_case.assertEqual(eventmask, select.POLLIN|select.POLLPRI) - self._file_objs.append(fd) + def register(self, fileobj, events, data=None): + key = selectors.SelectorKey(fileobj, 0, events, data) + self.keys[fileobj] = key + return key - def poll(self, timeout=None): + def unregister(self, fileobj): + key = self.keys.pop(fileobj) + return key + + def select(self, timeout=None): block = False - for fob in self._file_objs: - if isinstance(fob, TelnetAlike): - block = fob.sock.block + for fileobj in self.keys: + if isinstance(fileobj, TelnetAlike): + block = fileobj.sock.block + break if block: return [] else: - return zip(self._file_objs, [select.POLLIN]*len(self._file_objs)) + return [(key, key.events) for key in self.keys.values()] - def unregister(self, fd): - self._file_objs.remove(fd) @contextlib.contextmanager def test_socket(reads): @@ -159,7 +150,7 @@ socket.create_connection = old_conn return -def test_telnet(reads=(), cls=TelnetAlike, use_poll=None): +def test_telnet(reads=(), cls=TelnetAlike): ''' return a telnetlib.Telnet object that uses a SocketStub with reads queued up to be read ''' for x in reads: @@ -167,29 +158,14 @@ with test_socket(reads): telnet = cls('dummy', 0) telnet._messages = '' # debuglevel output - if use_poll is not None: - if use_poll and not telnet._has_poll: - raise unittest.SkipTest('select.poll() required.') - telnet._has_poll = use_poll return telnet - class ExpectAndReadTestCase(TestCase): def setUp(self): - self.old_select = select.select - select.select = mock_select - self.old_poll = False - if hasattr(select, 'poll'): - self.old_poll = select.poll - select.poll = MockPoller - MockPoller.test_case = self - + self.old_selector = telnetlib._TelnetSelector + telnetlib._TelnetSelector = MockSelector def tearDown(self): - if self.old_poll: - MockPoller.test_case = None - select.poll = self.old_poll - select.select = self.old_select - + telnetlib._TelnetSelector = self.old_selector class ReadTests(ExpectAndReadTestCase): def test_read_until(self): @@ -208,22 +184,6 @@ data = telnet.read_until(b'match') self.assertEqual(data, expect) - def test_read_until_with_poll(self): - """Use select.poll() to implement telnet.read_until().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=True) - select.select = lambda *_: self.fail('unexpected select() call.') - data = telnet.read_until(b'match') - self.assertEqual(data, b''.join(want[:-1])) - - def test_read_until_with_select(self): - """Use select.select() to implement telnet.read_until().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=False) - if self.old_poll: - select.poll = lambda *_: self.fail('unexpected poll() call.') - data = telnet.read_until(b'match') - self.assertEqual(data, b''.join(want[:-1])) def test_read_all(self): """ @@ -427,23 +387,6 @@ (_,_,data) = telnet.expect([b'match']) self.assertEqual(data, b''.join(want[:-1])) - def test_expect_with_poll(self): - """Use select.poll() to implement telnet.expect().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=True) - select.select = lambda *_: self.fail('unexpected select() call.') - (_,_,data) = telnet.expect([b'match']) - self.assertEqual(data, b''.join(want[:-1])) - - def test_expect_with_select(self): - """Use select.select() to implement telnet.expect().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=False) - if self.old_poll: - select.poll = lambda *_: self.fail('unexpected poll() call.') - (_,_,data) = telnet.expect([b'match']) - self.assertEqual(data, b''.join(want[:-1])) - def test_main(verbose=None): support.run_unittest(GeneralTests, ReadTests, WriteTests, OptionTests, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 14:45:32 2013 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 21 Oct 2013 14:45:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_test=5Fpydoc_failure_i?= =?utf-8?q?ntroduced_by_2f09a6980e1a_=28issue_=2319030=29=2E?= Message-ID: <3d3Hd82qWvz7LjR@mail.python.org> http://hg.python.org/cpython/rev/dad1debba93c changeset: 86550:dad1debba93c user: Charles-Fran?ois Natali date: Mon Oct 21 14:46:34 2013 +0200 summary: Fix test_pydoc failure introduced by 2f09a6980e1a (issue #19030). files: Lib/test/test_pydoc.py | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -214,18 +214,18 @@ class DA(builtins.object) | Data descriptors defined here: - | + |\x20\x20 | __dict__ | dictionary for instance variables (if defined) - | + |\x20\x20 | __weakref__ | list of weak references to the object (if defined) - | + |\x20\x20 | ham - | + |\x20\x20 | ---------------------------------------------------------------------- | Data and other attributes inherited from Meta: - | + |\x20\x20 | ham = 'spam' """.strip() @@ -234,7 +234,7 @@ class Class(builtins.object) | Data and other attributes inherited from Meta: - | + |\x20\x20 | LIFE = 42 """.strip() @@ -243,7 +243,7 @@ class Class1(builtins.object) | Data and other attributes inherited from Meta1: - | + |\x20\x20 | one = 1 """.strip() @@ -255,19 +255,19 @@ | Class2 | Class1 | builtins.object - | + |\x20\x20 | Data and other attributes inherited from Meta1: - | + |\x20\x20 | one = 1 - | + |\x20\x20 | ---------------------------------------------------------------------- | Data and other attributes inherited from Meta3: - | + |\x20\x20 | three = 3 - | + |\x20\x20 | ---------------------------------------------------------------------- | Data and other attributes inherited from Meta2: - | + |\x20\x20 | two = 2 """.strip() @@ -276,7 +276,7 @@ class C(builtins.object) | Data and other attributes defined here: - | + |\x20\x20 | here = 'present!' """.strip() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 19:48:31 2013 From: python-checkins at python.org (christian.heimes) Date: Mon, 21 Oct 2013 19:48:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Load_SSL=27s_error_strings?= =?utf-8?q?_in_hashlib=2E?= Message-ID: <3d3QLl6DHkz7LjN@mail.python.org> http://hg.python.org/cpython/rev/1581d69453d6 changeset: 86551:1581d69453d6 user: Christian Heimes date: Mon Oct 21 19:48:22 2013 +0200 summary: Load SSL's error strings in hashlib. Without ERR_load_crypto_strings() functions like ERR_lib_error_string() return NULL. files: Misc/NEWS | 2 ++ Modules/_hashopenssl.c | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,8 @@ Library ------- +- Load SSL's error strings in hashlib. + - Issue #18527: Upgrade internal copy of zlib to 1.2.8. - Issue #19274: Add a filterfunc parameter to PyZipFile.writepy. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -847,6 +847,7 @@ PyObject *m, *openssl_md_meth_names; OpenSSL_add_all_digests(); + ERR_load_crypto_strings(); /* TODO build EVP_functions openssl_* entries dynamically based * on what hashes are supported rather than listing many -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 21 23:15:38 2013 From: python-checkins at python.org (peter.moody) Date: Mon, 21 Oct 2013 23:15:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2317400=3B_ipaddress_shou?= =?utf-8?q?ld_make_it_easy_to_identify_rfc6598_addresses?= Message-ID: <3d3Vxk1RJ1z7LlC@mail.python.org> http://hg.python.org/cpython/rev/2e8dd5c240b7 changeset: 86552:2e8dd5c240b7 user: Peter Moody date: Mon Oct 21 13:58:06 2013 -0700 summary: #17400; ipaddress should make it easy to identify rfc6598 addresses files: Lib/ipaddress.py | 76 ++++++++++++++++++++++--- Lib/test/test_ipaddress.py | 9 +++ 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -975,13 +975,25 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 4193. + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. """ return (self.network_address.is_private and self.broadcast_address.is_private) @property + def is_global(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property def is_unspecified(self): """Test if the address is unspecified. @@ -1225,15 +1237,37 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 1918. + A boolean, True if the address is reserved per + iana-ipv4-special-registry. """ - private_10 = IPv4Network('10.0.0.0/8') - private_172 = IPv4Network('172.16.0.0/12') - private_192 = IPv4Network('192.168.0.0/16') - return (self in private_10 or - self in private_172 or - self in private_192) + return (self in IPv4Network('0.0.0.0/8') or + self in IPv4Network('10.0.0.0/8') or + self in IPv4Network('100.64.0.0/10') or + self in IPv4Network('127.0.0.0/8') or + self in IPv4Network('169.254.0.0/16') or + self in IPv4Network('172.16.0.0/12') or + self in IPv4Network('192.0.0.0/29') or + self in IPv4Network('192.0.0.170/31') or + self in IPv4Network('192.0.2.0/24') or + self in IPv4Network('192.168.0.0/16') or + self in IPv4Network('198.18.0.0/15') or + self in IPv4Network('198.51.100.0/24') or + self in IPv4Network('203.0.113.0/24') or + self in IPv4Network('240.0.0.0/4') or + self in IPv4Network('255.255.255.255/32')) + + @property + def is_global(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return not self.is_private + @property def is_multicast(self): @@ -1826,11 +1860,31 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 4193. + A boolean, True if the address is reserved per + iana-ipv6-special-registry. """ - private_network = IPv6Network('fc00::/7') - return self in private_network + return (self in IPv6Network('::1/128') or + self in IPv6Network('::/128') or + self in IPv6Network('::ffff:0:0/96') or + self in IPv6Network('100::/64') or + self in IPv6Network('2001::/23') or + self in IPv6Network('2001:2::/48') or + self in IPv6Network('2001:db8::/32') or + self in IPv6Network('2001:10::/28') or + self in IPv6Network('fc00::/7') or + self in IPv6Network('fe80::/10')) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private @property def is_unspecified(self): diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1319,6 +1319,11 @@ self.assertEqual(True, ipaddress.ip_network( '127.42.0.0/16').is_loopback) self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) + self.assertEqual(True, ipaddress.ip_network('100.64.0.0/10').is_private) + self.assertEqual(True, + ipaddress.ip_network('192.0.2.128/25').is_private) + self.assertEqual(True, + ipaddress.ip_network('192.0.3.0/24').is_global) # test addresses self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified) @@ -1384,6 +1389,10 @@ self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified) self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified) + self.assertEqual(True, + ipaddress.ip_network('2001::1/128').is_private) + self.assertEqual(True, + ipaddress.ip_network('200::1/128').is_global) # test addresses self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast) self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 00:00:52 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 22 Oct 2013 00:00:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_be_more_lenient?= =?utf-8?q?_if_we_don=27t_understand_status_returned_by_waitpid=28=29=2E?= Message-ID: <3d3Wxw57jTz7LlZ@mail.python.org> http://hg.python.org/cpython/rev/44e2e78b05f8 changeset: 86553:44e2e78b05f8 user: Guido van Rossum date: Mon Oct 21 15:00:44 2013 -0700 summary: asyncio: be more lenient if we don't understand status returned by waitpid(). This should have no effect, it's a "shouldn't happe" case. Also tidied up some comments. files: Lib/asyncio/unix_events.py | 26 +++++----- Lib/test/test_asyncio/test_unix_events.py | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -3,7 +3,6 @@ import collections import errno import fcntl -import functools import os import signal import socket @@ -167,22 +166,26 @@ def _sig_chld(self): try: - # because of signal coalescing, we must keep calling waitpid() as - # long as we're able to reap a child + # Because of signal coalescing, we must keep calling waitpid() as + # long as we're able to reap a child. while True: try: pid, status = os.waitpid(-1, os.WNOHANG) except ChildProcessError: - break + break # No more child processes exist. if pid == 0: - break + break # All remaining child processes are still alive. elif os.WIFSIGNALED(status): + # A child process died because of a signal. returncode = -os.WTERMSIG(status) elif os.WIFEXITED(status): + # A child process exited (e.g. sys.exit()). returncode = os.WEXITSTATUS(status) else: - # shouldn't happen - continue + # A child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + returncode = status transp = self._subprocesses.get(pid) if transp is not None: transp._process_exited(returncode) @@ -480,18 +483,15 @@ loop = self._loop if proc.stdin is not None: transp, proto = yield from loop.connect_write_pipe( - functools.partial( - _UnixWriteSubprocessPipeProto, self, STDIN), + lambda: _UnixWriteSubprocessPipeProto(self, STDIN), proc.stdin) if proc.stdout is not None: transp, proto = yield from loop.connect_read_pipe( - functools.partial( - _UnixReadSubprocessPipeProto, self, STDOUT), + lambda: _UnixReadSubprocessPipeProto(self, STDOUT), proc.stdout) if proc.stderr is not None: transp, proto = yield from loop.connect_read_pipe( - functools.partial( - _UnixReadSubprocessPipeProto, self, STDERR), + lambda: _UnixReadSubprocessPipeProto(self, STDERR), proc.stderr) if not self._pipes: self._try_connected() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -266,7 +266,7 @@ self.loop._subprocesses[7] = transp self.loop._sig_chld() - self.assertFalse(transp._process_exited.called) + self.assertTrue(transp._process_exited.called) self.assertFalse(m_WEXITSTATUS.called) self.assertFalse(m_WTERMSIG.called) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 01:17:04 2013 From: python-checkins at python.org (peter.moody) Date: Tue, 22 Oct 2013 01:17:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2317400=3B_NEWS_and_ipadd?= =?utf-8?q?ress=2Erst_change?= Message-ID: <3d3Ydr55lPz7Lln@mail.python.org> http://hg.python.org/cpython/rev/07a5610bae9d changeset: 86554:07a5610bae9d user: Peter Moody date: Mon Oct 21 16:16:51 2013 -0700 summary: #17400; NEWS and ipaddress.rst change files: Doc/library/ipaddress.rst | 7 +++++-- Misc/NEWS | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -158,10 +158,13 @@ ``True`` if the address is reserved for multicast use. See :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6). - .. attribute:: is_private + .. attribute:: is_global ``True`` if the address is allocated for private networks. See - :RFC:`1918` (for IPv4) or :RFC:`4193` (for IPv6). + iana-ipv4-special-registry (for IPv4) or iana-ipv6-special-registry + (for IPv6). + + .. versionadded:: 3.4 .. attribute:: is_unspecified diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,8 @@ Library ------- +- Issue #17400: ipaddress should make it easy to identify rfc6598 addresses. + - Load SSL's error strings in hashlib. - Issue #18527: Upgrade internal copy of zlib to 1.2.8. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 02:42:26 2013 From: python-checkins at python.org (victor.stinner) Date: Tue, 22 Oct 2013 02:42:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_Prior_Work?= Message-ID: <3d3bXL30cSz7LjY@mail.python.org> http://hg.python.org/peps/rev/367f82455a8e changeset: 5202:367f82455a8e user: Victor Stinner date: Tue Oct 22 02:30:12 2013 +0200 summary: PEP 454: Prior Work files: pep-0454.txt | 52 +++++++++++++++++++++++++++++---------- 1 files changed, 38 insertions(+), 14 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -534,6 +534,44 @@ New ``GroupedStats`` instance. +Prior Work +========== + +* `Python Memory Validator + `_ (2005-2013): + commercial Python memory validator developed by Software Verification. + It uses the Python Reflection API. +* `PySizer `_: Google Summer of Code 2005 project by + Nick Smallbone. +* `Heapy + `_ (2006-2013): + part of the Guppy-PE project written by Sverker Nilsson. +* Draft PEP: `Support Tracking Low-Level Memory Usage in CPython + `_ + (Brett Canon, 2006) +* Muppy: project developed in 2008 by Robert Schuppenies. +* `asizeof `_: + a pure Python module to estimate the size of objects by Jean + Brouwers (2008). +* `Heapmonitor `_: + It provides facilities to size individual objects and can track all objects + of certain classes. It was developed in 2008 by Ludwig Haehne. +* `Pympler `_ (2008-2011): + project based on asizeof, muppy and HeapMonitor +* `objgraph `_ (2008-2012) +* `Dozer `_: WSGI Middleware version + of the CherryPy memory leak debugger, written by Marius Gedminas (2008-2013) +* `Meliae + `_: + Python Memory Usage Analyzer developed by John A Meinel since 2009 +* `caulk `_: written by Ben Timby in 2012 +* `memory_profiler `_: + written by Fabian Pedregosa (2011-2013) + +See also `Pympler Related Work +`_. + + Links ===== @@ -544,20 +582,6 @@ * `pytracemalloc on PyPI `_ -Similar projects: - -* `Meliae: Python Memory Usage Analyzer - `_ -* `Guppy-PE: umbrella package combining Heapy and GSL - `_ -* `PySizer `_: developed for Python 2.4 -* `memory_profiler `_ -* `pympler `_ -* `Dozer `_: WSGI Middleware version - of the CherryPy memory leak debugger -* `objgraph `_ -* `caulk `_ - Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 22 04:09:37 2013 From: python-checkins at python.org (christian.tismer) Date: Tue, 22 Oct 2013 04:09:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_add_filtering_of_individua?= =?utf-8?q?l_files_to_PyZipFile?= Message-ID: <3d3dSx2qVdz7LjY@mail.python.org> http://hg.python.org/cpython/rev/4f1121ae1cb5 changeset: 86555:4f1121ae1cb5 user: Christian Tismer date: Tue Oct 22 04:09:28 2013 +0200 summary: add filtering of individual files to PyZipFile changed output of debug messages to say "path" or "file" extended test for filtering certain files in a package added test for filtering files in a python dir (no package) files: Lib/test/test_zipfile.py | 31 +++++++++++++++++++++++++++- Lib/zipfile.py | 11 +++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -604,12 +604,21 @@ reportStr = reportSIO.getvalue() self.assertTrue('SyntaxError' in reportStr) - # then check that the filter works + # then check that the filter works on the whole package with captured_stdout() as reportSIO: zipfp.writepy(packagedir, filterfunc=lambda whatever: False) reportStr = reportSIO.getvalue() self.assertTrue('SyntaxError' not in reportStr) + # then check that the filter works on individual files + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir, filterfunc=lambda fn: + 'bad' not in fn) + reportStr = reportSIO.getvalue() + if reportStr: + print(reportStr) + self.assertTrue('SyntaxError' not in reportStr) + def test_write_with_optimization(self): import email packagedir = os.path.dirname(email.__file__) @@ -649,6 +658,26 @@ finally: shutil.rmtree(TESTFN2) + def test_write_python_directory_filtered(self): + os.mkdir(TESTFN2) + try: + with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: + fp.write("print(42)\n") + + with open(os.path.join(TESTFN2, "mod2.py"), "w") as fp: + fp.write("print(42 * 42)\n") + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + zipfp.writepy(TESTFN2, filterfunc=lambda fn: + not fn.endswith('mod2.py')) + + names = zipfp.namelist() + self.assertCompiledIn('mod1.py', names) + self.assertNotIn('mod2.py', names) + + finally: + shutil.rmtree(TESTFN2) + def test_write_non_pyfile(self): with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: with open(TESTFN, 'w') as f: diff --git a/Lib/zipfile.py b/Lib/zipfile.py --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1582,7 +1582,8 @@ """ if filterfunc and not filterfunc(pathname): if self.debug: - print('pathname "%s" skipped by filterfunc' % pathname) + label = 'path' if os.path.isdir(pathname) else 'file' + print('%s "%s" skipped by filterfunc' % (label, pathname)) return dir, name = os.path.split(pathname) if os.path.isdir(pathname): @@ -1611,6 +1612,10 @@ self.writepy(path, basename, filterfunc=filterfunc) # Recursive call elif ext == ".py": + if filterfunc and not filterfunc(path): + if self.debug: + print('file "%s" skipped by filterfunc' % path) + continue fname, arcname = self._get_codename(path[0:-3], basename) if self.debug: @@ -1624,6 +1629,10 @@ path = os.path.join(pathname, filename) root, ext = os.path.splitext(filename) if ext == ".py": + if filterfunc and not filterfunc(path): + if self.debug: + print('file "%s" skipped by filterfunc' % path) + continue fname, arcname = self._get_codename(path[0:-3], basename) if self.debug: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 05:26:21 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 22 Oct 2013 05:26:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Avoid_test=5Fasyncio_hang_?= =?utf-8?q?on_AIX=2E?= Message-ID: <3d3g9T3yt0z7Llj@mail.python.org> http://hg.python.org/cpython/rev/df2b2b1f1289 changeset: 86556:df2b2b1f1289 user: Guido van Rossum date: Mon Oct 21 20:26:12 2013 -0700 summary: Avoid test_asyncio hang on AIX. files: Lib/test/test_asyncio/test_events.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1200,6 +1200,9 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") + # Issue #19293 + @unittest.skipIf(sys.platform.startswith("aix"), + 'cannot be interrupted with signal on AIX') def test_subprocess_close_client_stream(self): proto = None transp = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 05:37:24 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 22 Oct 2013 05:37:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Switch_subprocess_stdin_to?= =?utf-8?q?_a_socketpair=2C_attempting_to_fix_issue_=2319293_=28AIX?= Message-ID: <3d3gQD1pkkz7LmM@mail.python.org> http://hg.python.org/cpython/rev/2a0bda8d283d changeset: 86557:2a0bda8d283d user: Guido van Rossum date: Mon Oct 21 20:37:14 2013 -0700 summary: Switch subprocess stdin to a socketpair, attempting to fix issue #19293 (AIX hang). files: Lib/asyncio/unix_events.py | 29 +++++++++- Lib/test/test_asyncio/test_unix_events.py | 7 ++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -213,6 +213,9 @@ self._loop = loop self._pipe = pipe self._fileno = pipe.fileno() + mode = os.fstat(self._fileno).st_mode + if not (stat.S_ISFIFO(mode) or stat.S_ISSOCK(mode)): + raise ValueError("Pipe transport is for pipes/sockets only.") _set_nonblocking(self._fileno) self._protocol = protocol self._closing = False @@ -275,21 +278,29 @@ self._loop = loop self._pipe = pipe self._fileno = pipe.fileno() - if not stat.S_ISFIFO(os.fstat(self._fileno).st_mode): - raise ValueError("Pipe transport is for pipes only.") + mode = os.fstat(self._fileno).st_mode + is_socket = stat.S_ISSOCK(mode) + is_pipe = stat.S_ISFIFO(mode) + if not (is_socket or is_pipe): + raise ValueError("Pipe transport is for pipes/sockets only.") _set_nonblocking(self._fileno) self._protocol = protocol self._buffer = [] self._conn_lost = 0 self._closing = False # Set when close() or write_eof() called. - self._loop.add_reader(self._fileno, self._read_ready) + + # On AIX, the reader trick only works for sockets. + # On other platforms it works for pipes and sockets. + # (Exception: OS X 10.4? Issue #19294.) + if is_socket or not sys.platform.startswith("aix"): + self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: self._loop.call_soon(waiter.set_result, None) def _read_ready(self): - # pipe was closed by peer + # Pipe was closed by peer. self._close() def write(self, data): @@ -435,8 +446,15 @@ self._loop = loop self._pipes = {} + stdin_w = None if stdin == subprocess.PIPE: self._pipes[STDIN] = None + # Use a socket pair for stdin, since not all platforms + # support selecting read events on the write end of a + # socket (which we use in order to detect closing of the + # other end). Notably this is needed on AIX, and works + # just fine on other platforms. + stdin, stdin_w = self._loop._socketpair() if stdout == subprocess.PIPE: self._pipes[STDOUT] = None if stderr == subprocess.PIPE: @@ -448,6 +466,9 @@ self._proc = subprocess.Popen( args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, universal_newlines=False, bufsize=bufsize, **kwargs) + if stdin_w is not None: + stdin.close() + self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize) self._extra['subprocess'] = self._proc def close(self): diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -312,6 +312,13 @@ fcntl_patcher.start() self.addCleanup(fcntl_patcher.stop) + fstat_patcher = unittest.mock.patch('os.fstat') + m_fstat = fstat_patcher.start() + st = unittest.mock.Mock() + st.st_mode = stat.S_IFIFO + m_fstat.return_value = st + self.addCleanup(fstat_patcher.stop) + def test_ctor(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 05:46:04 2013 From: python-checkins at python.org (ethan.furman) Date: Tue, 22 Oct 2013 05:46:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319263=3A__add_tes?= =?utf-8?q?ts_to_ensure_=5F=5Fobjclass=5F=5F_correctly_set=2E?= Message-ID: <3d3gcD4xYTz7Lm3@mail.python.org> http://hg.python.org/cpython/rev/b9019b942435 changeset: 86558:b9019b942435 user: Ethan Furman date: Mon Oct 21 20:45:55 2013 -0700 summary: Close #19263: add tests to ensure __objclass__ correctly set. files: Lib/test/test_enum.py | 117 +++++++++++++++++++++++++++++- 1 files changed, 116 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1,8 +1,11 @@ import enum +import inspect +import pydoc import unittest from collections import OrderedDict +from enum import Enum, IntEnum, EnumMeta, unique +from io import StringIO from pickle import dumps, loads, PicklingError -from enum import Enum, IntEnum, unique # for pickle tests try: @@ -1195,5 +1198,117 @@ turkey = 3 +expected_help_output = """ +Help on class Color in module %s: + +class Color(enum.Enum) + | Method resolution order: + | Color + | enum.Enum + | builtins.object + |\x20\x20 + | Data and other attributes defined here: + |\x20\x20 + | blue = + |\x20\x20 + | green = + |\x20\x20 + | red = + |\x20\x20 + | ---------------------------------------------------------------------- + | Data descriptors inherited from enum.Enum: + |\x20\x20 + | name + | The name of the Enum member. + |\x20\x20 + | value + | The value of the Enum member. + |\x20\x20 + | ---------------------------------------------------------------------- + | Data descriptors inherited from enum.EnumMeta: + |\x20\x20 + | __members__ + | Returns a mapping of member name->value. + |\x20\x20\x20\x20\x20\x20 + | This mapping lists all enum members, including aliases. Note that this + | is a read-only view of the internal mapping. +""".strip() + +class TestStdLib(unittest.TestCase): + + class Color(Enum): + red = 1 + green = 2 + blue = 3 + + def test_pydoc(self): + # indirectly test __objclass__ + expected_text = expected_help_output % __name__ + output = StringIO() + helper = pydoc.Helper(output=output) + helper(self.Color) + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + def test_inspect_getmembers(self): + values = dict(( + ('__class__', EnumMeta), + ('__doc__', None), + ('__members__', self.Color.__members__), + ('__module__', __name__), + ('blue', self.Color.blue), + ('green', self.Color.green), + ('name', Enum.__dict__['name']), + ('red', self.Color.red), + ('value', Enum.__dict__['value']), + )) + result = dict(inspect.getmembers(self.Color)) + self.assertEqual(values.keys(), result.keys()) + failed = False + for k in values.keys(): + if result[k] != values[k]: + print() + print('\n%s\n key: %s\n result: %s\nexpected: %s\n%s\n' % + ('=' * 75, k, result[k], values[k], '=' * 75), sep='') + failed = True + if failed: + self.fail("result does not equal expected, see print above") + + def test_inspect_classify_class_attrs(self): + # indirectly test __objclass__ + from inspect import Attribute + values = [ + Attribute(name='__class__', kind='data', + defining_class=object, object=EnumMeta), + Attribute(name='__doc__', kind='data', + defining_class=self.Color, object=None), + Attribute(name='__members__', kind='property', + defining_class=EnumMeta, object=EnumMeta.__members__), + Attribute(name='__module__', kind='data', + defining_class=self.Color, object=__name__), + Attribute(name='blue', kind='data', + defining_class=self.Color, object=self.Color.blue), + Attribute(name='green', kind='data', + defining_class=self.Color, object=self.Color.green), + Attribute(name='red', kind='data', + defining_class=self.Color, object=self.Color.red), + Attribute(name='name', kind='data', + defining_class=Enum, object=Enum.__dict__['name']), + Attribute(name='value', kind='data', + defining_class=Enum, object=Enum.__dict__['value']), + ] + values.sort(key=lambda item: item.name) + result = list(inspect.classify_class_attrs(self.Color)) + result.sort(key=lambda item: item.name) + failed = False + for v, r in zip(values, result): + if r != v: + print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='') + failed = True + if failed: + self.fail("result does not equal expected, see print above") + if __name__ == '__main__': unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 05:58:14 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 22 Oct 2013 05:58:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Unsilence_several_asyncio_?= =?utf-8?q?AIX_tests_that_no_longer_hang=2C_and_silence_a_new_hang=2E?= Message-ID: <3d3gtG5W3xzT1q@mail.python.org> http://hg.python.org/cpython/rev/f33cc4a175a4 changeset: 86559:f33cc4a175a4 user: Guido van Rossum date: Mon Oct 21 20:57:25 2013 -0700 summary: Unsilence several asyncio AIX tests that no longer hang, and silence a new hang. files: Lib/test/test_asyncio/test_events.py | 15 +++------------ 1 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -887,6 +887,9 @@ @unittest.skipUnless(sys.platform != 'win32', "Don't support pipes for Windows") + # Issue #19293 + @unittest.skipIf(sys.platform.startswith("aix"), + 'cannot be interrupted with signal on AIX') def test_write_pipe_disconnect_on_close(self): proto = None transport = None @@ -986,9 +989,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_interactive(self): proto = None transp = None @@ -1087,9 +1087,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_kill(self): proto = None transp = None @@ -1113,9 +1110,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_send_signal(self): proto = None transp = None @@ -1200,9 +1194,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_close_client_stream(self): proto = None transp = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 06:29:20 2013 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 22 Oct 2013 06:29:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_asyncio_issue_=2319293?= =?utf-8?q?_=28hangs_on_AIX=29=2E?= Message-ID: <3d3hZ81tPNz7LkM@mail.python.org> http://hg.python.org/cpython/rev/c2e018c54689 changeset: 86560:c2e018c54689 user: Guido van Rossum date: Mon Oct 21 21:28:45 2013 -0700 summary: Fix asyncio issue #19293 (hangs on AIX). files: Lib/test/test_asyncio/test_events.py | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -887,9 +887,6 @@ @unittest.skipUnless(sys.platform != 'win32', "Don't support pipes for Windows") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_write_pipe_disconnect_on_close(self): proto = None transport = None @@ -899,8 +896,8 @@ proto = MyWritePipeProto(loop=self.loop) return proto - rpipe, wpipe = os.pipe() - pipeobj = io.open(wpipe, 'wb', 1024) + rsock, wsock = self.loop._socketpair() + pipeobj = io.open(wsock.detach(), 'wb', 1024) @tasks.coroutine def connect(): @@ -916,11 +913,10 @@ self.assertEqual('CONNECTED', proto.state) transport.write(b'1') - test_utils.run_briefly(self.loop) - data = os.read(rpipe, 1024) + data = self.loop.run_until_complete(self.loop.sock_recv(rsock, 1024)) self.assertEqual(b'1', data) - os.close(rpipe) + rsock.close() self.loop.run_until_complete(proto.done) self.assertEqual('CLOSED', proto.state) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 22 07:39:23 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 22 Oct 2013 07:39:23 +0200 Subject: [Python-checkins] Daily reference leaks (07a5610bae9d): sum=0 Message-ID: results for 07a5610bae9d on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_site leaked [-2, 0, 0] references, sum=-2 test_site leaked [-2, 0, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogwv2Nxh', '-x'] From python-checkins at python.org Tue Oct 22 10:26:56 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 10:26:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NjAz?= =?utf-8?q?=3A_Ensure_that_PyOS=5Fmystricmp_and_PyOS=5Fmystrnicmp_are_in_t?= =?utf-8?q?he?= Message-ID: <3d3nrJ4Q7Mz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/4c4f31a1b706 changeset: 86561:4c4f31a1b706 branch: 3.3 parent: 86534:d8e352e2f110 user: Christian Heimes date: Tue Oct 22 10:22:29 2013 +0200 summary: Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the Python executable and not removed by the linker's optimizer. files: Misc/NEWS | 3 +++ Python/pythonrun.c | 4 ++++ 2 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the + Python executable and not removed by the linker's optimizer. + - Issue #19279: UTF-7 decoder no more produces illegal strings. - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -96,6 +96,10 @@ PyThreadState *_Py_Finalizing = NULL; +/* Hack to force loading of object files */ +int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \ + PyOS_mystrnicmp; /* Python/pystrcmp.o */ + /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 10:26:57 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 10:26:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318603=3A_Ensure_that_PyOS=5Fmystricmp_and_PyOS?= =?utf-8?q?=5Fmystrnicmp_are_in_the?= Message-ID: <3d3nrK6Pcxz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/b5cc822d5bf0 changeset: 86562:b5cc822d5bf0 parent: 86560:c2e018c54689 parent: 86561:4c4f31a1b706 user: Christian Heimes date: Tue Oct 22 10:23:12 2013 +0200 summary: Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the Python executable and not removed by the linker's optimizer. files: Misc/NEWS | 6 ++++++ Python/pythonrun.c | 4 ++++ 2 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the + Python executable and not removed by the linker's optimizer. + - Issue #19306: Add extra hints to the faulthandler module's stack dumps that these are "upside down". @@ -67,6 +70,9 @@ PyMem_Realloc(). - Issue #19199: Remove ``PyThreadState.tick_counter`` field +======= +- Issue #19279: UTF-7 decoder no more produces illegal strings. +>>>>>>> other - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -116,6 +116,10 @@ PyThreadState *_Py_Finalizing = NULL; +/* Hack to force loading of object files */ +int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \ + PyOS_mystrnicmp; /* Python/pystrcmp.o */ + /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 10:26:59 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 10:26:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NjAz?= =?utf-8?q?=3A_Ensure_that_PyOS=5Fmystricmp_and_PyOS=5Fmystrnicmp_are_in_t?= =?utf-8?q?he?= Message-ID: <3d3nrM1kvGz7LkD@mail.python.org> http://hg.python.org/cpython/rev/dc9f17f10899 changeset: 86563:dc9f17f10899 branch: 2.7 parent: 86533:737b79e524aa user: Christian Heimes date: Tue Oct 22 10:22:29 2013 +0200 summary: Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the Python executable and not removed by the linker's optimizer. files: Misc/NEWS | 3 +++ Python/pythonrun.c | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the + Python executable and not removed by the linker's optimizer. + - Issue #19279: UTF-7 decoder no more produces illegal unicode strings. - Issue #18739: Fix an inconsistency between math.log(n) and math.log(long(n)); diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -91,6 +91,11 @@ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ + +/* Hack to force loading of object files */ +int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \ + PyOS_mystrnicmp; /* Python/pystrcmp.o */ + /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 10:45:44 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 10:45:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_Misc/NEWS_merge_confli?= =?utf-8?q?ct=2C_hurray?= Message-ID: <3d3pG02rfXz7LjX@mail.python.org> http://hg.python.org/cpython/rev/9b2d5d186144 changeset: 86564:9b2d5d186144 parent: 86562:b5cc822d5bf0 user: Christian Heimes date: Tue Oct 22 10:45:31 2013 +0200 summary: Fix Misc/NEWS merge conflict, hurray files: Misc/NEWS | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -70,9 +70,6 @@ PyMem_Realloc(). - Issue #19199: Remove ``PyThreadState.tick_counter`` field -======= -- Issue #19279: UTF-7 decoder no more produces illegal strings. ->>>>>>> other - Fix macro expansion of _PyErr_OCCURRED(), and make sure to use it in at least one place so as to avoid regressions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 11:09:39 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 11:09:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319324=3A_Expose_L?= =?utf-8?q?inux-specific_constants_in_resource_module?= Message-ID: <3d3pnb0hVyz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/aec95b369e60 changeset: 86565:aec95b369e60 user: Christian Heimes date: Tue Oct 22 11:09:27 2013 +0200 summary: Issue #19324: Expose Linux-specific constants in resource module files: Doc/library/resource.rst | 46 +++++++++++++++++++++++++++ Lib/test/test_resource.py | 10 +++++ Misc/NEWS | 2 + Modules/resource.c | 22 ++++++++++++ 4 files changed, 80 insertions(+), 0 deletions(-) diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -151,6 +151,52 @@ The maximum area (in bytes) of address space which may be taken by the process. +.. data:: RLIMIT_MSGQUEUE + + The number of bytes that can be allocated for POSIX message queues. + + Availability: Linux 2.6.8 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_NICE + + The ceiling for the process's nice level (calculated as 20 - rlim_cur). + + Availability: Linux 2.6.12 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_RTPRIO + + The ceiling of the real-time priority. + + Availability: Linux 2.6.12 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_RTTIME + + The time limit (in microseconds) on CPU time that a process can spend + under real-time scheduling without making a blocking syscall. + + Availability: Linux 2.6.25 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_SIGPENDING + + The number of signals which the process may queue. + + Availability: Linux 2.6.8 or later. + + .. versionadded:: 3.4 + + Resource Usage -------------- diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py --- a/Lib/test/test_resource.py +++ b/Lib/test/test_resource.py @@ -1,3 +1,4 @@ +import sys import unittest from test import support import time @@ -129,6 +130,15 @@ self.assertIsInstance(pagesize, int) self.assertGreaterEqual(pagesize, 0) + @unittest.skipUnless(sys.platform == 'linux', 'test requires Linux') + def test_linux_constants(self): + self.assertIsInstance(resource.RLIMIT_MSGQUEUE, int) + self.assertIsInstance(resource.RLIMIT_NICE, int) + self.assertIsInstance(resource.RLIMIT_RTPRIO, int) + self.assertIsInstance(resource.RLIMIT_RTTIME, int) + self.assertIsInstance(resource.RLIMIT_SIGPENDING, int) + + def test_main(verbose=None): support.run_unittest(ResourceTest) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,8 @@ Library ------- +- Issue #19324: Expose Linux-specific constants in resource module. + - Issue #17400: ipaddress should make it easy to identify rfc6598 addresses. - Load SSL's error strings in hashlib. diff --git a/Modules/resource.c b/Modules/resource.c --- a/Modules/resource.c +++ b/Modules/resource.c @@ -326,6 +326,28 @@ PyModule_AddIntMacro(m, RLIMIT_SBSIZE); #endif +/* Linux specific */ +#ifdef RLIMIT_MSGQUEUE + PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE); +#endif + +#ifdef RLIMIT_NICE + PyModule_AddIntMacro(m, RLIMIT_NICE); +#endif + +#ifdef RLIMIT_RTPRIO + PyModule_AddIntMacro(m, RLIMIT_RTPRIO); +#endif + +#ifdef RLIMIT_RTTIME + PyModule_AddIntMacro(m, RLIMIT_RTTIME); +#endif + +#ifdef RLIMIT_SIGPENDING + PyModule_AddIntMacro(m, RLIMIT_SIGPENDING); +#endif + +/* target */ #ifdef RUSAGE_SELF PyModule_AddIntMacro(m, RUSAGE_SELF); #endif -- Repository URL: http://hg.python.org/cpython From victor.stinner at gmail.com Tue Oct 22 10:54:03 2013 From: victor.stinner at gmail.com (Victor Stinner) Date: Tue, 22 Oct 2013 10:54:03 +0200 Subject: [Python-checkins] cpython: Switch subprocess stdin to a socketpair, attempting to fix issue #19293 (AIX In-Reply-To: <3d3gQD1pkkz7LmM@mail.python.org> References: <3d3gQD1pkkz7LmM@mail.python.org> Message-ID: Hi, Would it be possible to use os.pipe() on all OSes except AIX? Pipes and socket pairs may have minor differences, but some applications may rely on these minor differences. For example, is the buffer size the same? For example, in test.support, we have two constants: PIPE_MAX_SIZE (4 MB) and SOCK_MAX_SIZE (16 MB). Victor 2013/10/22 guido.van.rossum : > http://hg.python.org/cpython/rev/2a0bda8d283d > changeset: 86557:2a0bda8d283d > user: Guido van Rossum > date: Mon Oct 21 20:37:14 2013 -0700 > summary: > Switch subprocess stdin to a socketpair, attempting to fix issue #19293 (AIX hang). > > files: > Lib/asyncio/unix_events.py | 29 +++++++++- > Lib/test/test_asyncio/test_unix_events.py | 7 ++ > 2 files changed, 32 insertions(+), 4 deletions(-) > > > diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py > --- a/Lib/asyncio/unix_events.py > +++ b/Lib/asyncio/unix_events.py > if stdin == subprocess.PIPE: > self._pipes[STDIN] = None > + # Use a socket pair for stdin, since not all platforms > + # support selecting read events on the write end of a > + # socket (which we use in order to detect closing of the > + # other end). Notably this is needed on AIX, and works > + # just fine on other platforms. > + stdin, stdin_w = self._loop._socketpair() > if stdout == subprocess.PIPE: > self._pipes[STDOUT] = None > if stderr == subprocess.PIPE: From python-checkins at python.org Tue Oct 22 11:22:31 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 11:22:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316595=3A_Add_prli?= =?utf-8?q?mit=28=29_to_resource_module?= Message-ID: <3d3q4R21jlz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/796c21e27a92 changeset: 86566:796c21e27a92 user: Christian Heimes date: Tue Oct 22 11:21:54 2013 +0200 summary: Issue #16595: Add prlimit() to resource module prlimit() is a Linux specific command that combines setrlimit, getrlimit and can set the limit of other processes. files: Doc/library/resource.rst | 21 ++++ Doc/whatsnew/3.4.rst | 6 + Lib/test/test_resource.py | 12 ++ Misc/NEWS | 2 + Modules/resource.c | 112 +++++++++++++++++++------ configure | 29 ++++++ configure.ac | 10 ++ pyconfig.h.in | 3 + 8 files changed, 169 insertions(+), 26 deletions(-) diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -74,6 +74,27 @@ ``setrlimit`` may also raise :exc:`error` if the underlying system call fails. +.. function:: prlimit(pid, resource[, limits]) + + Combines :func:`setrlimit` and :func:`getrlimit` in one function and + supports to get and set the resources limits of an arbitrary process. If + *pid* is 0, then the call applies to the current process. *resource* and + *limits* have the same meaning as in :func:`setrlimit`, except that + *limits* is optional. + + When *limits* is not given the function returns the *resource* limit of the + process *pid*. When *limits* is given the *resource* limit of the process is + set and the former resource limit is returned. + + Raises :exc:`ProcessLookupError` when *pid* can't be found and + :exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for + the process. + + Availability: Linux (glibc 2.13+) + + .. versionadded:: 3.4 + + These symbols define resources whose consumption can be controlled using the :func:`setrlimit` and :func:`getrlimit` functions described below. The values of these symbols are exactly the constants used by C programs. diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -438,6 +438,12 @@ sequences (:issue:`19132`). +resource +-------- + +New :func:`resource.prlimit` function and Linux specific constants. +(Contributed by Christian Heimes in :issue:`16595` and :issue:`19324`.) + smtplib ------- diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py --- a/Lib/test/test_resource.py +++ b/Lib/test/test_resource.py @@ -139,6 +139,18 @@ self.assertIsInstance(resource.RLIMIT_SIGPENDING, int) + @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit') + def test_prlimit(self): + self.assertRaises(TypeError, resource.prlimit) + self.assertRaises(PermissionError, resource.prlimit, + 1, resource.RLIMIT_AS) + self.assertRaises(ProcessLookupError, resource.prlimit, + -1, resource.RLIMIT_AS) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS), (-1, -1)) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS, (-1, -1)), + (-1, -1)) + + def test_main(verbose=None): support.run_unittest(ResourceTest) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,8 @@ Library ------- +- Issue #16595: Add prlimit() to resource module. + - Issue #19324: Expose Linux-specific constants in resource module. - Issue #17400: ipaddress should make it easy to identify rfc6598 addresses. diff --git a/Modules/resource.c b/Modules/resource.c --- a/Modules/resource.c +++ b/Modules/resource.c @@ -106,6 +106,44 @@ return result; } +static int +py2rlimit(PyObject *curobj, PyObject *maxobj, struct rlimit *rl_out) +{ +#if !defined(HAVE_LARGEFILE_SUPPORT) + rl_out->rlim_cur = PyLong_AsLong(curobj); + if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + return -1; + rl_out->rlim_max = PyLong_AsLong(maxobj); + if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) + return -1; +#else + /* The limits are probably bigger than a long */ + rl_out->rlim_cur = PyLong_AsLongLong(curobj); + if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + return -1; + rl_out->rlim_max = PyLong_AsLongLong(maxobj); + if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) + return -1; +#endif + + rl_out->rlim_cur = rl_out->rlim_cur & RLIM_INFINITY; + rl_out->rlim_max = rl_out->rlim_max & RLIM_INFINITY; + return 0; + +} + +static PyObject* +rlimit2py(struct rlimit rl) +{ +#if defined(HAVE_LONG_LONG) + if (sizeof(rl.rlim_cur) > sizeof(long)) { + return Py_BuildValue("LL", + (PY_LONG_LONG) rl.rlim_cur, + (PY_LONG_LONG) rl.rlim_max); + } +#endif + return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); +} static PyObject * resource_getrlimit(PyObject *self, PyObject *args) @@ -126,15 +164,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - -#if defined(HAVE_LONG_LONG) - if (sizeof(rl.rlim_cur) > sizeof(long)) { - return Py_BuildValue("LL", - (PY_LONG_LONG) rl.rlim_cur, - (PY_LONG_LONG) rl.rlim_max); - } -#endif - return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); + return rlimit2py(rl); } static PyObject * @@ -166,25 +196,10 @@ curobj = PyTuple_GET_ITEM(limits, 0); maxobj = PyTuple_GET_ITEM(limits, 1); -#if !defined(HAVE_LARGEFILE_SUPPORT) - rl.rlim_cur = PyLong_AsLong(curobj); - if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + if (py2rlimit(curobj, maxobj, &rl) < 0) { goto error; - rl.rlim_max = PyLong_AsLong(maxobj); - if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) - goto error; -#else - /* The limits are probably bigger than a long */ - rl.rlim_cur = PyLong_AsLongLong(curobj); - if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) - goto error; - rl.rlim_max = PyLong_AsLongLong(maxobj); - if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) - goto error; -#endif + } - rl.rlim_cur = rl.rlim_cur & RLIM_INFINITY; - rl.rlim_max = rl.rlim_max & RLIM_INFINITY; if (setrlimit(resource, &rl) == -1) { if (errno == EINVAL) PyErr_SetString(PyExc_ValueError, @@ -205,6 +220,48 @@ return NULL; } +#ifdef HAVE_PRLIMIT +static PyObject * +resource_prlimit(PyObject *self, PyObject *args) +{ + struct rlimit old_limit, new_limit; + int resource, retval; + pid_t pid; + PyObject *curobj=NULL, *maxobj=NULL; + + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i|(OO):prlimit", + &pid, &resource, &curobj, &maxobj)) + return NULL; + + if (resource < 0 || resource >= RLIM_NLIMITS) { + PyErr_SetString(PyExc_ValueError, + "invalid resource specified"); + return NULL; + } + + if (curobj != NULL) { + if (py2rlimit(curobj, maxobj, &new_limit) < 0) { + return NULL; + } + retval = prlimit(pid, resource, &new_limit, &old_limit); + } + else { + retval = prlimit(pid, resource, NULL, &old_limit); + } + + if (retval == -1) { + if (errno == EINVAL) { + PyErr_SetString(PyExc_ValueError, + "current limit exceeds maximum limit"); + } else { + PyErr_SetFromErrno(PyExc_OSError); + } + return NULL; + } + return rlimit2py(old_limit); +} +#endif /* HAVE_PRLIMIT */ + static PyObject * resource_getpagesize(PyObject *self, PyObject *unused) { @@ -229,6 +286,9 @@ resource_methods[] = { {"getrusage", resource_getrusage, METH_VARARGS}, {"getrlimit", resource_getrlimit, METH_VARARGS}, +#ifdef HAVE_PRLIMIT + {"prlimit", resource_prlimit, METH_VARARGS}, +#endif {"setrlimit", resource_setrlimit, METH_VARARGS}, {"getpagesize", resource_getpagesize, METH_NOARGS}, {NULL, NULL} /* sentinel */ diff --git a/configure b/configure --- a/configure +++ b/configure @@ -10601,6 +10601,35 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for prlimit" >&5 +$as_echo_n "checking for prlimit... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +void *x=prlimit + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_PRLIMIT 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -2927,6 +2927,16 @@ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for prlimit) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include + ]], [[void *x=prlimit]])], + [AC_DEFINE(HAVE_PRLIMIT, 1, Define if you have the 'prlimit' functions.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -627,6 +627,9 @@ /* Define to 1 if you have the `pread' function. */ #undef HAVE_PREAD +/* Define if you have the 'prlimit' functions. */ +#undef HAVE_PRLIMIT + /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 11:45:38 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 11:45:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Make_resource_tests_more_r?= =?utf-8?q?obust=2E?= Message-ID: <3d3qb65HxrzT1q@mail.python.org> http://hg.python.org/cpython/rev/8c77117f41a9 changeset: 86567:8c77117f41a9 user: Christian Heimes date: Tue Oct 22 11:45:30 2013 +0200 summary: Make resource tests more robust. files: Lib/test/test_resource.py | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py --- a/Lib/test/test_resource.py +++ b/Lib/test/test_resource.py @@ -1,4 +1,5 @@ import sys +import os import unittest from test import support import time @@ -142,13 +143,15 @@ @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit') def test_prlimit(self): self.assertRaises(TypeError, resource.prlimit) - self.assertRaises(PermissionError, resource.prlimit, - 1, resource.RLIMIT_AS) + if os.geteuid() != 0: + self.assertRaises(PermissionError, resource.prlimit, + 1, resource.RLIMIT_AS) self.assertRaises(ProcessLookupError, resource.prlimit, -1, resource.RLIMIT_AS) - self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS), (-1, -1)) - self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS, (-1, -1)), - (-1, -1)) + limit = resource.getrlimit(resource.RLIMIT_AS) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS), limit) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS, limit), + limit) def test_main(verbose=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 11:50:20 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 11:50:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319344=3A_fix_mark?= =?utf-8?q?up_error_in_whatsnew?= Message-ID: <3d3qhX0QlczMQF@mail.python.org> http://hg.python.org/cpython/rev/af628ab4272a changeset: 86568:af628ab4272a user: Christian Heimes date: Tue Oct 22 11:49:34 2013 +0200 summary: Issue #19344: fix markup error in whatsnew Thanks to Marius Gedminas files: Doc/whatsnew/3.4.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -613,7 +613,7 @@ LINEAR_PROBES to be any value. Set LINEAR_PROBES=0 to turn-off linear probing entirely. - (Contributed by Raymond Hettinger in :issue"`18771`.) + (Contributed by Raymond Hettinger in :issue:`18771`.) * The interpreter starts about 30% faster. A couple of measures lead to the speedup. The interpreter loads fewer modules on startup, e.g. the :mod:`re`, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 13:51:44 2013 From: python-checkins at python.org (nick.coghlan) Date: Tue, 22 Oct 2013 13:51:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_MvL_accepted_PEP_453!_=5Co/?= Message-ID: <3d3tNc3wzWz7LjV@mail.python.org> http://hg.python.org/peps/rev/66cb4c9b33bc changeset: 5203:66cb4c9b33bc user: Nick Coghlan date: Tue Oct 22 21:51:28 2013 +1000 summary: MvL accepted PEP 453! \o/ files: pep-0453.txt | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/pep-0453.txt b/pep-0453.txt --- a/pep-0453.txt +++ b/pep-0453.txt @@ -5,12 +5,13 @@ Author: Donald Stufft , Nick Coghlan BDFL-Delegate: Martin von L?wis -Status: Draft +Status: Accepted Type: Process Content-Type: text/x-rst Created: 10-Aug-2013 Post-History: 30-Aug-2013, 15-Sep-2013, 18-Sep-2013, 19-Sep-2013, 23-Sep-2013, 29-Sep-2013, 13-Oct-2013, 20-Oct-2013 +Resolution: https://mail.python.org/pipermail/python-dev/2013-October/129810.html Abstract @@ -24,6 +25,16 @@ that recommendation. +PEP Acceptance +============== + +This PEP was accepted for inclusion in Python 3.4 by Martin von L?wis on +Tuesday 22nd October, 2013. + +`Issue 19347 `__ has been created to +track the implementation of this PEP. + + Rationale ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 22 13:58:28 2013 From: python-checkins at python.org (victor.stinner) Date: Tue, 22 Oct 2013 13:58:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_rationale?= Message-ID: <3d3tXN4HYRz7Ljg@mail.python.org> http://hg.python.org/peps/rev/efe592075b52 changeset: 5204:efe592075b52 user: Victor Stinner date: Tue Oct 22 13:57:53 2013 +0200 summary: PEP 454: rationale files: pep-0454.txt | 34 ++++++++++++++++++++++++---------- 1 files changed, 24 insertions(+), 10 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -20,18 +20,23 @@ Rationale ========= -Common debug tools tracing memory allocations record the C filename -and line number where the allocation occurs. Using such tools to -analyze Python memory allocations does not help because most memory -blocks are allocated in the same C function, in ``PyMem_Malloc()`` for -example. +Classic generic tools like Valgrind can get the C traceback where a +memory block was allocated. Using such tools to analyze Python memory +allocations does not help because most memory blocks are allocated in +the same C function, in ``PyMem_Malloc()`` for example. Moreover, Python +has an allocator for small object called "pymalloc" which keeps free +blocks for efficiency. This is not well handled by these tools. There are debug tools dedicated to the Python language like ``Heapy`` -and ``PySizer``. These tools analyze objects type and/or content. -They are useful when most memory leaks are instances of the same type -and this type is only instantiated in a few functions. Problems arise -when the object type is very common like ``str`` or ``tuple``, and it -is hard to identify where these objects are instantiated. +``Pympler`` and ``Meliae`` which lists all live objects using the +garbage module (functions like ``gc.get_objects()``, +``gc.get_referrers()`` and ``gc.get_referents()``), compute their size +(ex: using ``sys.getsizeof()``) and group objects by type. These tools +provide a better estimation of the memory usage of an application. They +are useful when most memory leaks are instances of the same type and +this type is only instantiated in a few functions. Problems arise when +the object type is very common like ``str`` or ``tuple``, and it is hard +to identify where these objects are instantiated. Finding reference cycles is also a difficult problem. There are different tools to draw a diagram of all references. These tools @@ -63,6 +68,15 @@ `documentation of the faulthandler module `_. +The idea of tracing memory allocations is not new. It was first +implemented in the PySizer project in 2005. PySizer was implemented +differently: the traceback was stored in frame objects and some Python +types were linked the trace with the name of object type. PySizer patch +on CPython adds a overhead on performances and memory footprint, even if +the PySizer was not used. tracemalloc attachs a traceback to the +underlying layer, to memory blocks, and has no overhead when the module +is disabled. + The tracemalloc module has been written for CPython. Other implementations of Python may not be able to provide it. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 22 14:59:24 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 14:59:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318742=3A_Rework_t?= =?utf-8?q?he_internal_hashlib_construtor_to_pave_the_road_for_ABCs=2E?= Message-ID: <3d3vth2HhZz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/72d7b2185771 changeset: 86569:72d7b2185771 user: Christian Heimes date: Tue Oct 22 14:59:12 2013 +0200 summary: Issue #18742: Rework the internal hashlib construtor to pave the road for ABCs. files: Lib/hashlib.py | 41 +++++++++++++-------------- Lib/test/test_hashlib.py | 35 +++++++++++++++-------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/Lib/hashlib.py b/Lib/hashlib.py --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -64,43 +64,42 @@ 'algorithms_available', 'pbkdf2_hmac') +__builtin_constructor_cache = {} + def __get_builtin_constructor(name): + cache = __builtin_constructor_cache + constructor = cache.get(name) + if constructor is not None: + return constructor try: if name in ('SHA1', 'sha1'): import _sha1 - return _sha1.sha1 + cache['SHA1'] = cache['sha1'] = _sha1.sha1 elif name in ('MD5', 'md5'): import _md5 - return _md5.md5 + cache['MD5'] = cache['md5'] = _md5.md5 elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): import _sha256 - bs = name[3:] - if bs == '256': - return _sha256.sha256 - elif bs == '224': - return _sha256.sha224 + cache['SHA224'] = cache['sha224'] = _sha256.sha224 + cache['SHA256'] = cache['sha256'] = _sha256.sha256 elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): import _sha512 - bs = name[3:] - if bs == '512': - return _sha512.sha512 - elif bs == '384': - return _sha512.sha384 + cache['SHA384'] = cache['sha384'] = _sha512.sha384 + cache['SHA512'] = cache['sha512'] = _sha512.sha512 elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512'}: import _sha3 - bs = name[5:] - if bs == '224': - return _sha3.sha3_224 - elif bs == '256': - return _sha3.sha3_256 - elif bs == '384': - return _sha3.sha3_384 - elif bs == '512': - return _sha3.sha3_512 + cache['SHA3_224'] = cache['sha3_224'] = _sha3.sha3_224 + cache['SHA3_256'] = cache['sha3_256'] = _sha3.sha3_256 + cache['SHA3_384'] = cache['sha3_384'] = _sha3.sha3_384 + cache['SHA3_512'] = cache['sha3_512'] = _sha3.sha3_512 except ImportError: pass # no extension module, this hash is unsupported. + constructor = cache.get(name) + if constructor is not None: + return constructor + raise ValueError('unsupported hash type ' + name) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -84,26 +84,30 @@ if constructor: constructors.add(constructor) + def add_builtin_constructor(name): + constructor = getattr(hashlib, "__get_builtin_constructor")(name) + self.constructors_to_test[name].add(constructor) + _md5 = self._conditional_import_module('_md5') if _md5: - self.constructors_to_test['md5'].add(_md5.md5) + add_builtin_constructor('md5') _sha1 = self._conditional_import_module('_sha1') if _sha1: - self.constructors_to_test['sha1'].add(_sha1.sha1) + add_builtin_constructor('sha1') _sha256 = self._conditional_import_module('_sha256') if _sha256: - self.constructors_to_test['sha224'].add(_sha256.sha224) - self.constructors_to_test['sha256'].add(_sha256.sha256) + add_builtin_constructor('sha224') + add_builtin_constructor('sha256') _sha512 = self._conditional_import_module('_sha512') if _sha512: - self.constructors_to_test['sha384'].add(_sha512.sha384) - self.constructors_to_test['sha512'].add(_sha512.sha512) + add_builtin_constructor('sha384') + add_builtin_constructor('sha512') _sha3 = self._conditional_import_module('_sha3') if _sha3: - self.constructors_to_test['sha3_224'].add(_sha3.sha3_224) - self.constructors_to_test['sha3_256'].add(_sha3.sha3_256) - self.constructors_to_test['sha3_384'].add(_sha3.sha3_384) - self.constructors_to_test['sha3_512'].add(_sha3.sha3_512) + add_builtin_constructor('sha3_224') + add_builtin_constructor('sha3_256') + add_builtin_constructor('sha3_384') + add_builtin_constructor('sha3_512') super(HashLibTestCase, self).__init__(*args, **kwargs) @@ -132,8 +136,10 @@ self.assertRaises(TypeError, hashlib.new, 1) def test_get_builtin_constructor(self): - get_builtin_constructor = hashlib.__dict__[ - '__get_builtin_constructor'] + get_builtin_constructor = getattr(hashlib, + '__get_builtin_constructor') + builtin_constructor_cache = getattr(hashlib, + '__builtin_constructor_cache') self.assertRaises(ValueError, get_builtin_constructor, 'test') try: import _md5 @@ -141,6 +147,8 @@ pass # This forces an ImportError for "import _md5" statements sys.modules['_md5'] = None + # clear the cache + builtin_constructor_cache.clear() try: self.assertRaises(ValueError, get_builtin_constructor, 'md5') finally: @@ -149,6 +157,9 @@ else: del sys.modules['_md5'] self.assertRaises(TypeError, get_builtin_constructor, 3) + constructor = get_builtin_constructor('md5') + self.assertIs(constructor, _md5.md5) + self.assertEqual(sorted(builtin_constructor_cache), ['MD5', 'md5']) def test_hexdigest(self): for cons in self.hash_constructors: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 15:05:34 2013 From: python-checkins at python.org (christian.heimes) Date: Tue, 22 Oct 2013 15:05:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318742=3A_Expose_t?= =?utf-8?q?he_internal_hash_type_object_for_ABCs=2E?= Message-ID: <3d3w1p6kBNz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/27da6e790c41 changeset: 86570:27da6e790c41 user: Christian Heimes date: Tue Oct 22 15:05:23 2013 +0200 summary: Issue #18742: Expose the internal hash type object for ABCs. files: Modules/_hashopenssl.c | 4 +--- Modules/_sha3/sha3module.c | 10 +++++++++- Modules/md5module.c | 11 ++++++++++- Modules/sha1module.c | 11 ++++++++++- Modules/sha256module.c | 14 +++++++++++++- Modules/sha512module.c | 13 ++++++++++++- 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -872,10 +872,8 @@ return NULL; } -#if HASH_OBJ_CONSTRUCTOR - Py_INCREF(&EVPtype); + Py_INCREF((PyObject *)&EVPtype); PyModule_AddObject(m, "HASH", (PyObject *)&EVPtype); -#endif /* these constants are used by the convenience constructors */ INIT_CONSTRUCTOR_CONSTANTS(md5); diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -576,10 +576,18 @@ PyMODINIT_FUNC PyInit__sha3(void) { + PyObject *m; + Py_TYPE(&SHA3type) = &PyType_Type; if (PyType_Ready(&SHA3type) < 0) { return NULL; } - return PyModule_Create(&_SHA3module); + m = PyModule_Create(&_SHA3module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA3type); + PyModule_AddObject(m, "SHA3Type", (PyObject *)&SHA3type); + return m; } diff --git a/Modules/md5module.c b/Modules/md5module.c --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -572,8 +572,17 @@ PyMODINIT_FUNC PyInit__md5(void) { + PyObject *m; + Py_TYPE(&MD5type) = &PyType_Type; if (PyType_Ready(&MD5type) < 0) return NULL; - return PyModule_Create(&_md5module); + + m = PyModule_Create(&_md5module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&MD5type); + PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); + return m; } diff --git a/Modules/sha1module.c b/Modules/sha1module.c --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -544,8 +544,17 @@ PyMODINIT_FUNC PyInit__sha1(void) { + PyObject *m; + Py_TYPE(&SHA1type) = &PyType_Type; if (PyType_Ready(&SHA1type) < 0) return NULL; - return PyModule_Create(&_sha1module); + + m = PyModule_Create(&_sha1module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA1type); + PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); + return m; } diff --git a/Modules/sha256module.c b/Modules/sha256module.c --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -706,11 +706,23 @@ PyMODINIT_FUNC PyInit__sha256(void) { + PyObject *m; + Py_TYPE(&SHA224type) = &PyType_Type; if (PyType_Ready(&SHA224type) < 0) return NULL; Py_TYPE(&SHA256type) = &PyType_Type; if (PyType_Ready(&SHA256type) < 0) return NULL; - return PyModule_Create(&_sha256module); + + m = PyModule_Create(&_sha256module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA224type); + PyModule_AddObject(m, "SHA224Type", (PyObject *)&SHA224type); + Py_INCREF((PyObject *)&SHA256type); + PyModule_AddObject(m, "SHA256Type", (PyObject *)&SHA256type); + return m; + } diff --git a/Modules/sha512module.c b/Modules/sha512module.c --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -772,13 +772,24 @@ PyMODINIT_FUNC PyInit__sha512(void) { + PyObject *m; + Py_TYPE(&SHA384type) = &PyType_Type; if (PyType_Ready(&SHA384type) < 0) return NULL; Py_TYPE(&SHA512type) = &PyType_Type; if (PyType_Ready(&SHA512type) < 0) return NULL; - return PyModule_Create(&_sha512module); + + m = PyModule_Create(&_sha512module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA384type); + PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); + Py_INCREF((PyObject *)&SHA512type); + PyModule_AddObject(m, "SHA512Type", (PyObject *)&SHA512type); + return m; } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 16:30:29 2013 From: python-checkins at python.org (ethan.furman) Date: Tue, 22 Oct 2013 16:30:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319030=3A_fix_new_?= =?utf-8?q?pydoc_tests_for_--without-doc-strings?= Message-ID: <3d3xvn0LZ4z7Ljg@mail.python.org> http://hg.python.org/cpython/rev/64d94b21e731 changeset: 86571:64d94b21e731 user: Ethan Furman date: Tue Oct 22 07:30:24 2013 -0700 summary: Issue #19030: fix new pydoc tests for --without-doc-strings files: Lib/test/test_pydoc.py | 27 ++++++++++++++++++++++----- 1 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -215,11 +215,9 @@ class DA(builtins.object) | Data descriptors defined here: |\x20\x20 - | __dict__ - | dictionary for instance variables (if defined) + | __dict__%s |\x20\x20 - | __weakref__ - | list of weak references to the object (if defined) + | __weakref__%s |\x20\x20 | ham |\x20\x20 @@ -709,6 +707,10 @@ sorted(keyword.kwlist)) class PydocWithMetaClasses(unittest.TestCase): + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') def test_DynamicClassAttribute(self): class Meta(type): def __getattr__(self, name): @@ -719,15 +721,22 @@ @types.DynamicClassAttribute def ham(self): return 'eggs' + expected_text_data_docstrings = tuple('\n | ' + s if s else '' + for s in expected_data_docstrings) output = StringIO() helper = pydoc.Helper(output=output) helper(DA) - expected_text = expected_dynamicattribute_pattern % __name__ + expected_text = expected_dynamicattribute_pattern % ( + (__name__,) + expected_text_data_docstrings[:2]) result = output.getvalue().strip() if result != expected_text: print_diffs(expected_text, result) self.fail("outputs are not equal, see diff above") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') def test_virtualClassAttributeWithOneMeta(self): class Meta(type): def __dir__(cls): @@ -747,6 +756,10 @@ print_diffs(expected_text, result) self.fail("outputs are not equal, see diff above") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') def test_virtualClassAttributeWithTwoMeta(self): class Meta1(type): def __dir__(cls): @@ -795,6 +808,10 @@ if fail1 or fail2: self.fail("outputs are not equal, see diff above") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') def test_buggy_dir(self): class M(type): def __dir__(cls): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 17:41:21 2013 From: python-checkins at python.org (eric.snow) Date: Tue, 22 Oct 2013 17:41:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Don=27t_change_?= =?utf-8?q?the_signature_of_the_file-based_finders=2E?= Message-ID: <3d3zTY5lwWz7LkY@mail.python.org> http://hg.python.org/peps/rev/cf6ea6105d47 changeset: 5205:cf6ea6105d47 user: Eric Snow date: Tue Oct 22 09:37:20 2013 -0600 summary: [PEP 451] Don't change the signature of the file-based finders. The "Open Issues" section is also cleaned up. files: pep-0451.txt | 39 +++++++++++++++++++-------------------- 1 files changed, 19 insertions(+), 20 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -278,8 +278,9 @@ * spec_from_file_location(name, location, \*, loader=None, submodule_search_locations=None) - build a spec from file-oriented information and loader APIs. -* from_loader(name, loader, \*, origin=None, is_package=None) - build - a spec with missing information filled in by using loader APIs. +* spec_from_loader(name, loader, \*, origin=None, is_package=None) + - build a spec with missing information filled in by using loader + APIs. Other API Additions ------------------- @@ -313,8 +314,6 @@ * importlib.abc.PathEntryFinder.find_loader() * importlib.abc.Loader.load_module() * importlib.abc.Loader.module_repr() -* The parameters and attributes of the various loaders in - importlib.machinery * importlib.util.set_package() * importlib.util.set_loader() * importlib.find_loader() @@ -756,12 +755,6 @@ can use it to populate its own is_package if that information is not otherwise available. Still, it will be made optional. -One consequence of ModuleSpec is that loader ``__init__`` methods will -no longer need to accommodate per-module state. The path-based loaders -in importlib take arguments in their ``__init__()`` and have -corresponding attributes. However, the need for those values is -eliminated by module specs. - In addition to executing a module during loading, loaders will still be directly responsible for providing APIs concerning module-related data. @@ -775,11 +768,10 @@ was started. For instance, with ``-m`` the spec's name will be that of the run module, while ``__main__.__name__`` will still be "__main__". -* We add importlib.find_spec() to mirror - importlib.find_loader() (which becomes deprecated). +* We will add importlib.find_spec() to mirror importlib.find_loader() + (which becomes deprecated). * importlib.reload() is changed to use ModuleSpec.load(). -* importlib.reload() will now make use of the per-module import - lock. +* importlib.reload() will now make use of the per-module import lock. Reference Implementation @@ -792,10 +784,19 @@ Open Issues ============== -\* The impact of this change on pkgutil (and setuptools) needs looking -into. It has some generic function-based extensions to PEP 302. These -may break if importlib starts wrapping loaders without the tools' -knowledge. +\* Impact on some kinds of lazy loading modules. [lazy_import_concerns]_ + +This should not be an issue since the PEP does not change the semantics +of this behavior. + + +Implementation Notes +==================== + +\* The implementation of this PEP needs to be cognizant of its impact on +pkgutil (and setuptools). pkgutil has some generic function-based +extensions to PEP 302 which may break if importlib starts wrapping +loaders without the tools' knowledge. \* Other modules to look at: runpy (and pythonrun.c), pickle, pydoc, inspect. @@ -803,8 +804,6 @@ For instance, pickle should be updated in the ``__main__`` case to look at ``module.__spec__.name``. -\* Impact on some kinds of lazy loading modules. [lazy_import_concerns]_ - References ========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 22 19:49:45 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 19:49:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Rebuild_pydoc_topics_for_3?= =?utf-8?b?LjQuMGE0IHJlbGVhc2Uu?= Message-ID: <3d42Kj067pz7LjX@mail.python.org> http://hg.python.org/cpython/rev/5545ee916678 changeset: 86572:5545ee916678 parent: 86506:97ad9af5d5e7 user: Larry Hastings date: Sun Oct 20 01:59:09 2013 -0700 summary: Rebuild pydoc topics for 3.4.0a4 release. files: Lib/pydoc_data/topics.py | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sat Sep 28 23:37:53 2013 +# Autogenerated by Sphinx on Sun Oct 20 01:58:36 2013 topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names. In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O). The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime. Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n', 'assignment': '\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" target_list "]"\n | attributeref\n | subscription\n | slicing\n | "*" target\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is a single target: The object is assigned to\n that target.\n\n* If the target list is a comma-separated list of targets: The object\n must be an iterable with the same number of items as there are\n targets in the target list, and the items are assigned, from left to\n right, to the corresponding targets.\n\n * If the target list contains one target prefixed with an asterisk,\n called a "starred" target: The object must be a sequence with at\n least as many items as there are targets in the target list, minus\n one. The first items of the sequence are assigned, from left to\n right, to the targets before the starred target. The final items\n of the sequence are assigned to the targets after the starred\n target. A list of the remaining items in the sequence is then\n assigned to the starred target (the list can be empty).\n\n * Else: The object must be a sequence with the same number of items\n as there are targets in the target list, and the items are\n assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a ``global`` or ``nonlocal``\n statement in the current code block: the name is bound to the\n object in the current local namespace.\n\n * Otherwise: the name is bound to the object in the global namespace\n or the outer namespace determined by ``nonlocal``, respectively.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n brackets: The object must be an iterable with the same number of\n items as there are targets in the target list, and its items are\n assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, ``TypeError`` is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily ``AttributeError``).\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n ``a.x`` can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target ``a.x`` is\n always set as an instance attribute, creating it if necessary.\n Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n same attribute: if the RHS expression refers to a class attribute,\n the LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield an integer. If it is negative, the sequence\'s\n length is added to it. The resulting value must be a nonnegative\n integer less than the sequence\'s length, and the sequence is asked\n to assign the assigned object to its item with that index. If the\n index is out of range, ``IndexError`` is raised (assignment to a\n subscripted sequence cannot add new items to a list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n For user-defined objects, the ``__setitem__()`` method is called\n with appropriate arguments.\n\n* If the target is a slicing: The primary expression in the reference\n is evaluated. It should yield a mutable sequence object (such as a\n list). The assigned object should be a sequence object of the same\n type. Next, the lower and upper bound expressions are evaluated,\n insofar they are present; defaults are zero and the sequence\'s\n length. The bounds should evaluate to integers. If either bound is\n negative, the sequence\'s length is added to it. The resulting\n bounds are clipped to lie between zero and the sequence\'s length,\n inclusive. Finally, the sequence object is asked to replace the\n slice with the items of the assigned sequence. The length of the\n slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the object\n allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe! For instance, the\nfollowing program prints ``[0, 2]``:\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2\n print(x)\n\nSee also:\n\n **PEP 3132** - Extended Iterable Unpacking\n The specification for the ``*target`` feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', 'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name. For example, the identifier\n``__spam`` occurring in a class named ``Ham`` will be transformed to\n``_Ham__spam``. This transformation is independent of the syntactical\ncontext in which the identifier is used. If the transformed name is\nextremely long (longer than 255 characters), implementation defined\ntruncation may happen. If the class name consists only of underscores,\nno transformation is done.\n', @@ -7,7 +7,7 @@ 'attribute-access': '\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n', 'attribute-references': '\nAttribute references\n********************\n\nAn attribute reference is a primary followed by a period and a name:\n\n attributeref ::= primary "." identifier\n\nThe primary must evaluate to an object of a type that supports\nattribute references, which most objects do. This object is then\nasked to produce the attribute whose name is the identifier (which can\nbe customized by overriding the ``__getattr__()`` method). If this\nattribute is not available, the exception ``AttributeError`` is\nraised. Otherwise, the type and value of the object produced is\ndetermined by the object. Multiple evaluations of the same attribute\nreference may yield different objects.\n', 'augassign': '\nAugmented assignment statements\n*******************************\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', - 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels. Note that some of these operations also apply to certain non-\nnumeric types. Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n | m_expr "%" u_expr\n a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments. The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether. In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments. The numeric arguments are first\nconverted to a common type. Integer division yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult. Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second. The numeric arguments are first\nconverted to a common type. A zero right argument raises the\n``ZeroDivisionError`` exception. The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.) The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``. Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation). The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers. Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments. The\narguments must either both be numbers or both sequences of the same\ntype. In the former case, the numbers are converted to a common type\nand then added together. In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments. The numeric arguments are first converted to a common\ntype.\n', + 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels. Note that some of these operations also apply to certain non-\nnumeric types. Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n | m_expr "%" u_expr\n a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments. The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether. In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments. The numeric arguments are first\nconverted to a common type. Division of integers yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult. Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second. The numeric arguments are first\nconverted to a common type. A zero right argument raises the\n``ZeroDivisionError`` exception. The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.) The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``. Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation). The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers. Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments. The\narguments must either both be numbers or both sequences of the same\ntype. In the former case, the numbers are converted to a common type\nand then added together. In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments. The numeric arguments are first converted to a common\ntype.\n', 'bitwise': '\nBinary bitwise operations\n*************************\n\nEach of the three bitwise operations has a different priority level:\n\n and_expr ::= shift_expr | and_expr "&" shift_expr\n xor_expr ::= and_expr | xor_expr "^" and_expr\n or_expr ::= xor_expr | or_expr "|" xor_expr\n\nThe ``&`` operator yields the bitwise AND of its arguments, which must\nbe integers.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be integers.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be integers.\n', 'bltin-code-objects': '\nCode Objects\n************\n\nCode objects are used by the implementation to represent "pseudo-\ncompiled" executable Python code such as a function body. They differ\nfrom function objects because they don\'t contain a reference to their\nglobal execution environment. Code objects are returned by the built-\nin ``compile()`` function and can be extracted from function objects\nthrough their ``__code__`` attribute. See also the ``code`` module.\n\nA code object can be executed or evaluated by passing it (instead of a\nsource string) to the ``exec()`` or ``eval()`` built-in functions.\n\nSee *The standard type hierarchy* for more information.\n', 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is commonly used by slicing (see *Slicings*). It supports\nno special operations. There is exactly one ellipsis object, named\n``Ellipsis`` (a built-in name). ``type(Ellipsis)()`` produces the\n``Ellipsis`` singleton.\n\nIt is written as ``Ellipsis`` or ``...``.\n', @@ -19,12 +19,12 @@ 'calls': '\nCalls\n*****\n\nA call calls a callable object (e.g., a *function*) with a possibly\nempty series of *arguments*:\n\n call ::= primary "(" [argument_list [","] | comprehension] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," keyword_arguments] ["," "**" expression]\n | "*" expression ["," keyword_arguments] ["," "**" expression]\n | "**" expression\n positional_arguments ::= expression ("," expression)*\n keyword_arguments ::= keyword_item ("," keyword_item)*\n keyword_item ::= identifier "=" expression\n\nA trailing comma may be present after the positional and keyword\narguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and all objects having a\n``__call__()`` method are callable). All argument expressions are\nevaluated before the call is attempted. Please refer to section\n*Function definitions* for the syntax of formal *parameter* lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows. First, a list of unfilled slots is\ncreated for the formal parameters. If there are N positional\narguments, they are placed in the first N slots. Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on). If the slot is\nalready filled, a ``TypeError`` exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is ``None``, it fills the slot). When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition. (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.) If there are any\nunfilled slots for which no default value is specified, a\n``TypeError`` exception is raised. Otherwise, the list of filled\nslots is used as the argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword. In CPython, this is the case\nfor functions implemented in C that use ``PyArg_ParseTuple()`` to\nparse their arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``*identifier`` is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``**identifier`` is present; in this case, that\nformal parameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax ``*expression`` appears in the function call,\n``expression`` must evaluate to an iterable. Elements from this\niterable are treated as if they were additional positional arguments;\nif there are positional arguments *x1*, ..., *xN*, and ``expression``\nevaluates to a sequence *y1*, ..., *yM*, this is equivalent to a call\nwith M+N positional arguments *x1*, ..., *xN*, *y1*, ..., *yM*.\n\nA consequence of this is that although the ``*expression`` syntax may\nappear *after* some keyword arguments, it is processed *before* the\nkeyword arguments (and the ``**expression`` argument, if any -- see\nbelow). So:\n\n >>> def f(a, b):\n ... print(a, b)\n ...\n >>> f(b=1, *(2,))\n 2 1\n >>> f(a=1, *(2,))\n Traceback (most recent call last):\n File "", line 1, in ?\n TypeError: f() got multiple values for keyword argument \'a\'\n >>> f(1, *(2,))\n 1 2\n\nIt is unusual for both keyword arguments and the ``*expression``\nsyntax to be used in the same call, so in practice this confusion does\nnot arise.\n\nIf the syntax ``**expression`` appears in the function call,\n``expression`` must evaluate to a mapping, the contents of which are\ntreated as additional keyword arguments. In the case of a keyword\nappearing in both ``expression`` and as an explicit keyword argument,\na ``TypeError`` exception is raised.\n\nFormal parameters using the syntax ``*identifier`` or ``**identifier``\ncannot be used as positional argument slots or as keyword argument\nnames.\n\nA call always returns some value, possibly ``None``, unless it raises\nan exception. How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n The code block for the function is executed, passing it the\n argument list. The first thing the code block will do is bind the\n formal parameters to the arguments; this is described in section\n *Function definitions*. When the code block executes a ``return``\n statement, this specifies the return value of the function call.\n\na built-in function or method:\n The result is up to the interpreter; see *Built-in Functions* for\n the descriptions of built-in functions and methods.\n\na class object:\n A new instance of that class is returned.\n\na class instance method:\n The corresponding user-defined function is called, with an argument\n list that is one longer than the argument list of the call: the\n instance becomes the first argument.\n\na class instance:\n The class must define a ``__call__()`` method; the effect is then\n the same as if that method was called.\n', 'class': '\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n', 'comparisons': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another. When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n', - 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause. If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n', + 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause. If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda\nexpressions, described in section *Lambdas*. Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression. The "``def``" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around. Free variables used\nin the nested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n', 'context-managers': '\nWith Statement Context Managers\n*******************************\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n', 'continue': '\nThe ``continue`` statement\n**************************\n\n continue_stmt ::= "continue"\n\n``continue`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition or\n``finally`` clause within that loop. It continues with the next cycle\nof the nearest enclosing loop.\n\nWhen ``continue`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nstarting the next loop cycle.\n', 'conversions': '\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," this means\nthat the operator implementation for built-in types works that way:\n\n* If either argument is a complex number, the other is converted to\n complex;\n\n* otherwise, if either argument is a floating point number, the other\n is converted to floating point;\n\n* otherwise, both must be integers and no conversion is necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions must define their own\nconversion behavior.\n', 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected and cleaned up when the cyclic garbage collector is\n enabled (it\'s on by default). Refer to the documentation for the\n ``gc`` module for more information about this topic.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n Note: ``hash()`` truncates the value returned from an object\'s custom\n ``__hash__()`` method to the size of a ``Py_ssize_t``. This is\n typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n If an object\'s ``__hash__()`` must interoperate on builds of\n different bit sizes, be sure to check the width on all supported\n builds. An easy way to do this is with ``python -c "import sys;\n print(sys.hash_info.width)"``\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n .__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n', - 'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source. The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\nChanged in version 3.3: Tab-completion via the ``readline`` module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the ``print`` command.\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "", line 1, in ?\n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type ``continue``, or you can\n step through the statement using ``step`` or ``next`` (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module ``__main__`` is used. (See\n the explanation of the built-in ``exec()`` or ``eval()``\n functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When ``runeval()`` returns, it returns the\n value of the expression. Otherwise this function is similar to\n ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When ``runcall()`` returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname. If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n ``Pdb`` is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying ``cmd.Cmd`` class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses Ctrl-C on the console) when you give a\n ``continue`` command. This allows you to break into the debugger\n again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT\n handler, set *nosigint* tot true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``). Arguments to commands must be separated by whitespace\n(spaces or tabs). Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint (``!``). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``. (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.) No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``. Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. ``help pdb``\n displays the full documentation (the docstring of the ``pdb``\n module). Since the *command* argument must be an identifier,\n ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on ``sys.path``. Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just ``end`` to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) print some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with ``end``; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint--which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between ``next`` and\n ``step`` is that ``step`` stops inside a called function, while\n ``next`` executes called functions at (nearly) full speed, only\n stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a ``for`` loop or out\n of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With ``.`` as argument, list 11 lines around the current line.\n With one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by ``->``. If\n an exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ``>>``, if it\n differs from the current line.\n\n New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for ``list``.\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np(rint) expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\npp expression\n\n Like the ``print`` command, except the value of the expression is\n pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interative interpreter (using the ``code`` module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n all the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ``.pdbrc`` file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n ``global`` statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with ``shlex`` and the result is used as the new\n ``sys.argv``. History, breakpoints, actions and debugger options\n are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n determined by the ``__name__`` in the frame globals.\n', + 'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source. The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\nChanged in version 3.3: Tab-completion via the ``readline`` module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the ``p`` command.\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "", line 1, in ?\n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type ``continue``, or you can\n step through the statement using ``step`` or ``next`` (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module ``__main__`` is used. (See\n the explanation of the built-in ``exec()`` or ``eval()``\n functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When ``runeval()`` returns, it returns the\n value of the expression. Otherwise this function is similar to\n ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When ``runcall()`` returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname. If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n ``Pdb`` is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying ``cmd.Cmd`` class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses Ctrl-C on the console) when you give a\n ``continue`` command. This allows you to break into the debugger\n again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT\n handler, set *nosigint* tot true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``). Arguments to commands must be separated by whitespace\n(spaces or tabs). Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint (``!``). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``. (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.) No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``. Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. ``help pdb``\n displays the full documentation (the docstring of the ``pdb``\n module). Since the *command* argument must be an identifier,\n ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on ``sys.path``. Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just ``end`` to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) p some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with ``end``; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint--which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between ``next`` and\n ``step`` is that ``step`` stops inside a called function, while\n ``next`` executes called functions at (nearly) full speed, only\n stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a ``for`` loop or out\n of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With ``.`` as argument, list 11 lines around the current line.\n With one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by ``->``. If\n an exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ``>>``, if it\n differs from the current line.\n\n New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for ``list``.\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\n Note: ``print()`` can also be used, but is not a debugger command ---\n this executes the Python ``print()`` function.\n\npp expression\n\n Like the ``p`` command, except the value of the expression is\n pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interative interpreter (using the ``code`` module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n all the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ``.pdbrc`` file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n ``global`` statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with ``shlex`` and the result is used as the new\n ``sys.argv``. History, breakpoints, actions and debugger options\n are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n determined by the ``__name__`` in the frame globals.\n', 'del': '\nThe ``del`` statement\n*********************\n\n del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a ``global``\nstatement in the same code block. If the name is unbound, a\n``NameError`` exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2: Previously it was illegal to delete a name\nfrom the local namespace if it occurs as a free variable in a nested\nblock.\n', 'dict': '\nDictionary displays\n*******************\n\nA dictionary display is a possibly empty series of key/datum pairs\nenclosed in curly braces:\n\n dict_display ::= "{" [key_datum_list | dict_comprehension] "}"\n key_datum_list ::= key_datum ("," key_datum)* [","]\n key_datum ::= expression ":" expression\n dict_comprehension ::= expression ":" expression comp_for\n\nA dictionary display yields a new dictionary object.\n\nIf a comma-separated sequence of key/datum pairs is given, they are\nevaluated from left to right to define the entries of the dictionary:\neach key object is used as a key into the dictionary to store the\ncorresponding datum. This means that you can specify the same key\nmultiple times in the key/datum list, and the final dictionary\'s value\nfor that key will be the last one given.\n\nA dict comprehension, in contrast to list and set comprehensions,\nneeds two expressions separated with a colon followed by the usual\n"for" and "if" clauses. When the comprehension is run, the resulting\nkey and value elements are inserted in the new dictionary in the order\nthey are produced.\n\nRestrictions on the types of the key values are listed earlier in\nsection *The standard type hierarchy*. (To summarize, the key type\nshould be *hashable*, which excludes all mutable objects.) Clashes\nbetween duplicate keys are not detected; the last datum (textually\nrightmost in the display) stored for a given key value prevails.\n', 'dynamic-features': '\nInteraction with dynamic features\n*********************************\n\nThere are several cases where Python statements are illegal when used\nin conjunction with nested scopes that contain free variables.\n\nIf a variable is referenced in an enclosing scope, it is illegal to\ndelete the name. An error will be reported at compile time.\n\nIf the wild card form of import --- ``import *`` --- is used in a\nfunction and the function contains or is a nested block with free\nvariables, the compiler will raise a ``SyntaxError``.\n\nThe ``eval()`` and ``exec()`` functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe ``exec()`` and ``eval()`` functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n', @@ -35,7 +35,7 @@ 'floating': '\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n floatnumber ::= pointfloat | exponentfloat\n pointfloat ::= [intpart] fraction | intpart "."\n exponentfloat ::= (intpart | pointfloat) exponent\n intpart ::= digit+\n fraction ::= "." digit+\n exponent ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts are always interpreted using\nradix 10. For example, ``077e010`` is legal, and denotes the same\nnumber as ``77e10``. The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n 3.14 10. .001 1e100 3.14e-10 0e0\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator ``-`` and the\nliteral ``1``.\n', 'for': '\nThe ``for`` statement\n*********************\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n', 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``. These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself. However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting. By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed. The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in ``format()`` function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= \n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'. The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'<\'`` | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | ``\'>\'`` | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | ``\'=\'`` | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. |\n +-----------+------------------------------------------------------------+\n | ``\'^\'`` | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'+\'`` | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | ``\'-\'`` | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types. This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'s\'`` | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'s\'``. |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'b\'`` | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | ``\'c\'`` | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | ``\'d\'`` | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | ``\'o\'`` | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | ``\'x\'`` | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'X\'`` | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'d\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'d\'``. |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'e\'`` | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n | | The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'E\'`` | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | ``\'f\'`` | Fixed point. Displays the number as a fixed-point number. |\n | | The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'F\'`` | Fixed point. Same as ``\'f\'``, but converts ``nan`` to |\n | | ``NAN`` and ``inf`` to ``INF``. |\n +-----------+------------------------------------------------------------+\n | ``\'g\'`` | General format. For a given precision ``p >= 1``, this |\n | | rounds the number to ``p`` significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1`` would have exponent ``exp``. Then if ``-4 <= exp |\n | | < p``, the number is formatted with presentation type |\n | | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number |\n | | is formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1``. In both cases insignificant trailing zeros are |\n | | removed from the significand, and the decimal point is |\n | | also removed if there are no remaining digits following |\n | | it. Positive and negative infinity, positive and negative |\n | | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n | | ``-0`` and ``nan`` respectively, regardless of the |\n | | precision. A precision of ``0`` is treated as equivalent |\n | | to a precision of ``1``. The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'G\'`` | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n | | if the number gets too large. The representations of |\n | | infinity and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'g\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | ``\'%\'`` | Percentage. Multiplies the number by 100 and displays in |\n | | fixed (``\'f\'``) format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to ``\'g\'``, except with at least one digit past |\n | | the decimal point and a default precision of 12. This is |\n | | intended to match ``str()``, except you can add the other |\n | | format modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n', - 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n', + 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda\nexpressions, described in section *Lambdas*. Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression. The "``def``" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around. Free variables used\nin the nested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n', 'global': '\nThe ``global`` statement\n************************\n\n global_stmt ::= "global" identifier ("," identifier)*\n\nThe ``global`` statement is a declaration which holds for the entire\ncurrent code block. It means that the listed identifiers are to be\ninterpreted as globals. It would be impossible to assign to a global\nvariable without ``global``, although free variables may refer to\nglobals without being declared global.\n\nNames listed in a ``global`` statement must not be used in the same\ncode block textually preceding that ``global`` statement.\n\nNames listed in a ``global`` statement must not be defined as formal\nparameters or in a ``for`` loop control target, ``class`` definition,\nfunction definition, or ``import`` statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the latter two restrictions, but programs should not abuse\nthis freedom, as future implementations may enforce them or silently\nchange the meaning of the program.\n\n**Programmer\'s note:** the ``global`` is a directive to the parser.\nIt applies only to code parsed at the same time as the ``global``\nstatement. In particular, a ``global`` statement contained in a string\nor code object supplied to the built-in ``exec()`` function does not\naffect the code block *containing* the function call, and code\ncontained in such a string is unaffected by ``global`` statements in\nthe code containing the function call. The same applies to the\n``eval()`` and ``compile()`` functions.\n', 'id-classes': '\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n', 'identifiers': '\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions.\n\nThe syntax of identifiers in Python is based on the Unicode standard\nannex UAX-31, with elaboration and changes as defined below; see also\n**PEP 3131** for further details.\n\nWithin the ASCII range (U+0001..U+007F), the valid characters for\nidentifiers are the same as in Python 2.x: the uppercase and lowercase\nletters ``A`` through ``Z``, the underscore ``_`` and, except for the\nfirst character, the digits ``0`` through ``9``.\n\nPython 3.0 introduces additional characters from outside the ASCII\nrange (see **PEP 3131**). For these characters, the classification\nuses the version of the Unicode Character Database as included in the\n``unicodedata`` module.\n\nIdentifiers are unlimited in length. Case is significant.\n\n identifier ::= xid_start xid_continue*\n id_start ::= \n id_continue ::= \n xid_start ::= \n xid_continue ::= \n\nThe Unicode category codes mentioned above stand for:\n\n* *Lu* - uppercase letters\n\n* *Ll* - lowercase letters\n\n* *Lt* - titlecase letters\n\n* *Lm* - modifier letters\n\n* *Lo* - other letters\n\n* *Nl* - letter numbers\n\n* *Mn* - nonspacing marks\n\n* *Mc* - spacing combining marks\n\n* *Nd* - decimal numbers\n\n* *Pc* - connector punctuations\n\n* *Other_ID_Start* - explicit list of characters in PropList.txt to\n support backwards compatibility\n\n* *Other_ID_Continue* - likewise\n\nAll identifiers are converted into the normal form NFKC while parsing;\ncomparison of identifiers is based on NFKC.\n\nA non-normative HTML file listing all valid identifier characters for\nUnicode 4.1 can be found at http://www.dcl.hpi.uni-\npotsdam.de/home/loewis/table-3131.html.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers. They must\nbe spelled exactly as written here:\n\n False class finally is return\n None continue for lambda try\n True def from nonlocal while\n and del global not with\n as elif if or yield\n assert else import pass\n break except in raise\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n', @@ -44,7 +44,7 @@ 'import': '\nThe ``import`` statement\n************************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n top level module, the module\'s name is bound in the local namespace\n as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n name of the top level package that contains the module is bound in\n the local namespace as a reference to the top level package. The\n imported module must be accessed using its full qualified name\n rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n 1. check if the imported module has an attribute by that name\n\n 2. if not, attempt to import a submodule with that name and then\n check the imported module again for that attribute\n\n 3. if the attribute is not found, ``ImportError`` is raised.\n\n 4. otherwise, a reference to that value is bound in the local\n namespace, using the name in the ``as`` clause if it is present,\n otherwise using the attribute name\n\nExamples:\n\n import foo # foo imported and bound locally\n import foo.bar.baz # foo.bar.baz imported, foo bound locally\n import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb\n from foo.bar import baz # foo.bar.baz imported and bound as baz\n from foo import attr # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope. The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python. The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language. It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``. They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement. This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n **PEP 236** - Back to the __future__\n The original proposal for the __future__ mechanism.\n', 'in': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another. When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n', 'integers': '\nInteger literals\n****************\n\nInteger literals are described by the following lexical definitions:\n\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"+\n nonzerodigit ::= "1"..."9"\n digit ::= "0"..."9"\n octinteger ::= "0" ("o" | "O") octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n octdigit ::= "0"..."7"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n bindigit ::= "0" | "1"\n\nThere is no limit for the length of integer literals apart from what\ncan be stored in available memory.\n\nNote that leading zeros in a non-zero decimal number are not allowed.\nThis is for disambiguation with C-style octal literals, which Python\nused before version 3.0.\n\nSome examples of integer literals:\n\n 7 2147483647 0o177 0b100110111\n 3 79228162514264337593543950336 0o377 0x100000000\n 79228162514264337593543950336 0xdeadbeef\n', - 'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n lambda_form_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda forms (lambda expressions) have the same syntactic position as\nexpressions. They are a shorthand to create anonymous functions; the\nexpression ``lambda arguments: expression`` yields a function object.\nThe unnamed object behaves like a function object defined with\n\n def (arguments):\n return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda forms cannot contain\nstatements or annotations.\n', + 'lambda': '\nLambdas\n*******\n\n lambda_expr ::= "lambda" [parameter_list]: expression\n lambda_expr_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda expressions (sometimes called lambda forms) have the same\nsyntactic position as expressions. They are a shorthand to create\nanonymous functions; the expression ``lambda arguments: expression``\nyields a function object. The unnamed object behaves like a function\nobject defined with\n\n def (arguments):\n return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda expressions cannot contain\nstatements or annotations.\n', 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | comprehension] "]"\n\nA list display yields a new list object, the contents being specified\nby either a list of expressions or a comprehension. When a comma-\nseparated list of expressions is supplied, its elements are evaluated\nfrom left to right and placed into the list object in that order.\nWhen a comprehension is supplied, the list is constructed from the\nelements resulting from the comprehension.\n', 'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The string argument passed\nto the built-in functions ``eval()`` and ``exec()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes comprehensions and generator\nexpressions since they are implemented using a function scope. This\nmeans that the following will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block,\nunless declared as ``nonlocal``. If a name is bound at the module\nlevel, it is a global variable. (The variables of the module code\nblock are local and global.) If a variable is used in a code block\nbut not defined there, it is a *free variable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, or\nafter ``as`` in a ``with`` statement or ``except`` clause. The\n``import`` statement of the form ``from ... import *`` binds all names\ndefined in the imported module, except those beginning with an\nunderscore. This form may only be used at the module level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name).\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the ``global`` statement occurs within a block, all uses of the\nname specified in the statement refer to the binding of that name in\nthe top-level namespace. Names are resolved in the top-level\nnamespace by searching the global namespace, i.e. the namespace of the\nmodule containing the code block, and the builtins namespace, the\nnamespace of the module ``builtins``. The global namespace is\nsearched first. If the name is not found there, the builtins\nnamespace is searched. The global statement must precede all uses of\nthe name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``builtins``; when in any other module, ``__builtins__`` is an alias\nfor the dictionary of the ``builtins`` module itself.\n``__builtins__`` can be set to a user-created dictionary to create a\nweak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``builtins`` module and modify its attributes appropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\nInteraction with dynamic features\n=================================\n\nThere are several cases where Python statements are illegal when used\nin conjunction with nested scopes that contain free variables.\n\nIf a variable is referenced in an enclosing scope, it is illegal to\ndelete the name. An error will be reported at compile time.\n\nIf the wild card form of import --- ``import *`` --- is used in a\nfunction and the function contains or is a nested block with free\nvariables, the compiler will raise a ``SyntaxError``.\n\nThe ``eval()`` and ``exec()`` functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe ``exec()`` and ``eval()`` functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n", 'nonlocal': '\nThe ``nonlocal`` statement\n**************************\n\n nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n\nThe ``nonlocal`` statement causes the listed identifiers to refer to\npreviously bound variables in the nearest enclosing scope. This is\nimportant because the default behavior for binding is to search the\nlocal namespace first. The statement allows encapsulated code to\nrebind variables outside of the local scope besides the global\n(module) scope.\n\nNames listed in a ``nonlocal`` statement, unlike to those listed in a\n``global`` statement, must refer to pre-existing bindings in an\nenclosing scope (the scope in which a new binding should be created\ncannot be determined unambiguously).\n\nNames listed in a ``nonlocal`` statement must not collide with pre-\nexisting bindings in the local scope.\n\nSee also:\n\n **PEP 3104** - Access to Names in Outer Scopes\n The specification for the ``nonlocal`` statement.\n', @@ -57,7 +57,7 @@ 'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["from" expression]]\n\nIf no expressions are present, ``raise`` re-raises the last exception\nthat was active in the current scope. If no exception is active in\nthe current scope, a ``RuntimeError`` exception is raised indicating\nthat this is an error.\n\nOtherwise, ``raise`` evaluates the first expression as the exception\nobject. It must be either a subclass or an instance of\n``BaseException``. If it is a class, the exception instance will be\nobtained when needed by instantiating the class with no arguments.\n\nThe *type* of the exception is the exception instance\'s class, the\n*value* is the instance itself.\n\nA traceback object is normally created automatically when an exception\nis raised and attached to it as the ``__traceback__`` attribute, which\nis writable. You can create an exception and set your own traceback in\none step using the ``with_traceback()`` exception method (which\nreturns the same exception instance, with its traceback set to its\nargument), like so:\n\n raise Exception("foo occurred").with_traceback(tracebackobj)\n\nThe ``from`` clause is used for exception chaining: if given, the\nsecond *expression* must be another exception class or instance, which\nwill then be attached to the raised exception as the ``__cause__``\nattribute (which is writable). If the raised exception is not\nhandled, both exceptions will be printed:\n\n >>> try:\n ... print(1 / 0)\n ... except Exception as exc:\n ... raise RuntimeError("Something bad happened") from exc\n ...\n Traceback (most recent call last):\n File "", line 2, in \n ZeroDivisionError: int division or modulo by zero\n\n The above exception was the direct cause of the following exception:\n\n Traceback (most recent call last):\n File "", line 4, in \n RuntimeError: Something bad happened\n\nA similar mechanism works implicitly if an exception is raised inside\nan exception handler: the previous exception is then attached as the\nnew exception\'s ``__context__`` attribute:\n\n >>> try:\n ... print(1 / 0)\n ... except:\n ... raise RuntimeError("Something bad happened")\n ...\n Traceback (most recent call last):\n File "", line 2, in \n ZeroDivisionError: int division or modulo by zero\n\n During handling of the above exception, another exception occurred:\n\n Traceback (most recent call last):\n File "", line 4, in \n RuntimeError: Something bad happened\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information about handling exceptions is in section\n*The try statement*.\n', 'return': '\nThe ``return`` statement\n************************\n\n return_stmt ::= "return" [expression_list]\n\n``return`` may only occur syntactically nested in a function\ndefinition, not within a nested class definition.\n\nIf an expression list is present, it is evaluated, else ``None`` is\nsubstituted.\n\n``return`` leaves the current function call with the expression list\n(or ``None``) as return value.\n\nWhen ``return`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the function.\n\nIn a generator function, the ``return`` statement indicates that the\ngenerator is done and will cause ``StopIteration`` to be raised. The\nreturned value (if any) is used as an argument to construct\n``StopIteration`` and becomes the ``StopIteration.value`` attribute.\n', 'sequence-types': "\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python's standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping's keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn't define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nobject.__length_hint__(self)\n\n Called to implement ``operator.length_hint()``. Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ``>=`` 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don't define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n", - 'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments. They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as division by ``pow(2,n)``. A\nleft shift by *n* bits is defined as multiplication with ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n be at most ``sys.maxsize``. If the right-hand operand is larger\n than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n', + 'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments. They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as floor division by\n``pow(2,n)``. A left shift by *n* bits is defined as multiplication\nwith ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n be at most ``sys.maxsize``. If the right-hand operand is larger\n than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n', 'slicings': '\nSlicings\n********\n\nA slicing selects a range of items in a sequence object (e.g., a\nstring, tuple or list). Slicings may be used as expressions or as\ntargets in assignment or ``del`` statements. The syntax for a\nslicing:\n\n slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice\n proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n\nThere is ambiguity in the formal syntax here: anything that looks like\nan expression list also looks like a slice list, so any subscription\ncan be interpreted as a slicing. Rather than further complicating the\nsyntax, this is disambiguated by defining that in this case the\ninterpretation as a subscription takes priority over the\ninterpretation as a slicing (this is the case if the slice list\ncontains no proper slice).\n\nThe semantics for a slicing are as follows. The primary must evaluate\nto a mapping object, and it is indexed (using the same\n``__getitem__()`` method as normal subscription) with a key that is\nconstructed from the slice list, as follows. If the slice list\ncontains at least one comma, the key is a tuple containing the\nconversion of the slice items; otherwise, the conversion of the lone\nslice item is the key. The conversion of a slice item that is an\nexpression is that expression. The conversion of a proper slice is a\nslice object (see section *The standard type hierarchy*) whose\n``start``, ``stop`` and ``step`` attributes are the values of the\nexpressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n', 'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant. Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n A dictionary or other mapping object used to store an object\'s\n (writable) attributes.\n\ninstance.__class__\n\n The class to which a class instance belongs.\n\nclass.__bases__\n\n The tuple of base classes of a class object.\n\nclass.__name__\n\n The name of the class or type.\n\nclass.__qualname__\n\n The *qualified name* of the class or type.\n\n New in version 3.3.\n\nclass.__mro__\n\n This attribute is a tuple of classes that are considered when\n looking for base classes during method resolution.\n\nclass.mro()\n\n This method can be overridden by a metaclass to customize the\n method resolution order for its instances. It is called at class\n instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n Each class keeps a list of weak references to its immediate\n subclasses. This method returns a list of all those references\n still alive. Example:\n\n >>> int.__subclasses__()\n []\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n operands.\n\n[4] Cased characters are those with general category property being\n one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n', 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``. Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected and cleaned up when the cyclic garbage collector is\n enabled (it\'s on by default). Refer to the documentation for the\n ``gc`` module for more information about this topic.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n Note: ``hash()`` truncates the value returned from an object\'s custom\n ``__hash__()`` method to the size of a ``Py_ssize_t``. This is\n typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n If an object\'s ``__hash__()`` must interoperate on builds of\n different bit sizes, be sure to check the width on all supported\n builds. An easy way to do this is with ``python -c "import sys;\n print(sys.hash_info.width)"``\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n .__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n class Meta(type):\n pass\n\n class MyClass(metaclass=Meta):\n pass\n\n class MySubclass(MyClass):\n pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n used\n\n* if an explicit metaclass is given and it is *not* an instance of\n ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3000\n Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n **PEP 3135** - New super\n Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, namespace, **kwds):\n result = type.__new__(cls, name, bases, dict(namespace))\n result.members = tuple(namespace)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``. That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n **PEP 3119** - Introducing Abstract Base Classes\n Includes the specification for customizing ``isinstance()`` and\n ``issubclass()`` behavior through ``__instancecheck__()`` and\n ``__subclasscheck__()``, with motivation for this functionality\n in the context of adding Abstract Base Classes (see the ``abc``\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nobject.__length_hint__(self)\n\n Called to implement ``operator.length_hint()``. Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ``>=`` 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left operand\'s\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand\'s\n non-reflected method. This behavior allows subclasses to\n override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "", line 1, in \n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n certain controlled conditions. It generally isn\'t a good idea\n though, since it can lead to some very strange behaviour if it is\n handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n reflected method (such as ``__add__()``) fails the operation is\n not supported, which is why the reflected method is not called.\n', @@ -66,12 +66,12 @@ 'subscriptions': '\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object that supports subscription,\ne.g. a list or dictionary. User-defined objects can support\nsubscription by defining a ``__getitem__()`` method.\n\nFor built-in objects, there are two types of objects that support\nsubscription:\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey. (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to\nan integer or a slice (as discussed in the following section).\n\nThe formal syntax makes no special provision for negative indices in\nsequences; however, built-in sequences all provide a ``__getitem__()``\nmethod that interprets negative indices by adding the length of the\nsequence to the index (so that ``x[-1]`` selects the last item of\n``x``). The resulting value must be a nonnegative integer less than\nthe number of items in the sequence, and the subscription selects the\nitem whose index is that value (counting from zero). Since the support\nfor negative indices and slicing occurs in the object\'s\n``__getitem__()`` method, subclasses overriding this method will need\nto explicitly add that support.\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n', 'truth': "\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an ``if`` or\n``while`` condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* ``None``\n\n* ``False``\n\n* zero of any numeric type, for example, ``0``, ``0.0``, ``0j``.\n\n* any empty sequence, for example, ``''``, ``()``, ``[]``.\n\n* any empty mapping, for example, ``{}``.\n\n* instances of user-defined classes, if the class defines a\n ``__bool__()`` or ``__len__()`` method, when that method returns the\n integer zero or ``bool`` value ``False``. [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn ``0`` or ``False`` for false and ``1`` or ``True`` for true,\nunless otherwise stated. (Important exception: the Boolean operations\n``or`` and ``and`` always return one of their operands.)\n", 'try': '\nThe ``try`` statement\n*********************\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause. If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n', - 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python. Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types. Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\' These are attributes that provide access to the\nimplementation and are not intended for general use. Their definition\nmay change in the future.\n\nNone\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name ``None``.\n It is used to signify the absence of a value in many situations,\n e.g., it is returned from functions that don\'t explicitly return\n anything. Its truth value is false.\n\nNotImplemented\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name\n ``NotImplemented``. Numeric methods and rich comparison methods may\n return this value if they do not implement the operation for the\n operands provided. (The interpreter will then try the reflected\n operation, or some other fallback, depending on the operator.) Its\n truth value is true.\n\nEllipsis\n This type has a single value. There is a single object with this\n value. This object is accessed through the literal ``...`` or the\n built-in name ``Ellipsis``. Its truth value is true.\n\n``numbers.Number``\n These are created by numeric literals and returned as results by\n arithmetic operators and arithmetic built-in functions. Numeric\n objects are immutable; once created their value never changes.\n Python numbers are of course strongly related to mathematical\n numbers, but subject to the limitations of numerical representation\n in computers.\n\n Python distinguishes between integers, floating point numbers, and\n complex numbers:\n\n ``numbers.Integral``\n These represent elements from the mathematical set of integers\n (positive and negative).\n\n There are two types of integers:\n\n Integers (``int``)\n\n These represent numbers in an unlimited range, subject to\n available (virtual) memory only. For the purpose of shift\n and mask operations, a binary representation is assumed, and\n negative numbers are represented in a variant of 2\'s\n complement which gives the illusion of an infinite string of\n sign bits extending to the left.\n\n Booleans (``bool``)\n These represent the truth values False and True. The two\n objects representing the values False and True are the only\n Boolean objects. The Boolean type is a subtype of the integer\n type, and Boolean values behave like the values 0 and 1,\n respectively, in almost all contexts, the exception being\n that when converted to a string, the strings ``"False"`` or\n ``"True"`` are returned, respectively.\n\n The rules for integer representation are intended to give the\n most meaningful interpretation of shift and mask operations\n involving negative integers.\n\n ``numbers.Real`` (``float``)\n These represent machine-level double precision floating point\n numbers. You are at the mercy of the underlying machine\n architecture (and C or Java implementation) for the accepted\n range and handling of overflow. Python does not support single-\n precision floating point numbers; the savings in processor and\n memory usage that are usually the reason for using these is\n dwarfed by the overhead of using objects in Python, so there is\n no reason to complicate the language with two kinds of floating\n point numbers.\n\n ``numbers.Complex`` (``complex``)\n These represent complex numbers as a pair of machine-level\n double precision floating point numbers. The same caveats apply\n as for floating point numbers. The real and imaginary parts of a\n complex number ``z`` can be retrieved through the read-only\n attributes ``z.real`` and ``z.imag``.\n\nSequences\n These represent finite ordered sets indexed by non-negative\n numbers. The built-in function ``len()`` returns the number of\n items of a sequence. When the length of a sequence is *n*, the\n index set contains the numbers 0, 1, ..., *n*-1. Item *i* of\n sequence *a* is selected by ``a[i]``.\n\n Sequences also support slicing: ``a[i:j]`` selects all items with\n index *k* such that *i* ``<=`` *k* ``<`` *j*. When used as an\n expression, a slice is a sequence of the same type. This implies\n that the index set is renumbered so that it starts at 0.\n\n Some sequences also support "extended slicing" with a third "step"\n parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n *j*.\n\n Sequences are distinguished according to their mutability:\n\n Immutable sequences\n An object of an immutable sequence type cannot change once it is\n created. (If the object contains references to other objects,\n these other objects may be mutable and may be changed; however,\n the collection of objects directly referenced by an immutable\n object cannot change.)\n\n The following types are immutable sequences:\n\n Strings\n A string is a sequence of values that represent Unicode\n codepoints. All the codepoints in range ``U+0000 - U+10FFFF``\n can be represented in a string. Python doesn\'t have a\n ``chr`` type, and every character in the string is\n represented as a string object with length ``1``. The built-\n in function ``ord()`` converts a character to its codepoint\n (as an integer); ``chr()`` converts an integer in range ``0 -\n 10FFFF`` to the corresponding character. ``str.encode()`` can\n be used to convert a ``str`` to ``bytes`` using the given\n encoding, and ``bytes.decode()`` can be used to achieve the\n opposite.\n\n Tuples\n The items of a tuple are arbitrary Python objects. Tuples of\n two or more items are formed by comma-separated lists of\n expressions. A tuple of one item (a \'singleton\') can be\n formed by affixing a comma to an expression (an expression by\n itself does not create a tuple, since parentheses must be\n usable for grouping of expressions). An empty tuple can be\n formed by an empty pair of parentheses.\n\n Bytes\n A bytes object is an immutable array. The items are 8-bit\n bytes, represented by integers in the range 0 <= x < 256.\n Bytes literals (like ``b\'abc\'``) and the built-in function\n ``bytes()`` can be used to construct bytes objects. Also,\n bytes objects can be decoded to strings via the ``decode()``\n method.\n\n Mutable sequences\n Mutable sequences can be changed after they are created. The\n subscription and slicing notations can be used as the target of\n assignment and ``del`` (delete) statements.\n\n There are currently two intrinsic mutable sequence types:\n\n Lists\n The items of a list are arbitrary Python objects. Lists are\n formed by placing a comma-separated list of expressions in\n square brackets. (Note that there are no special cases needed\n to form lists of length 0 or 1.)\n\n Byte Arrays\n A bytearray object is a mutable array. They are created by\n the built-in ``bytearray()`` constructor. Aside from being\n mutable (and hence unhashable), byte arrays otherwise provide\n the same interface and functionality as immutable bytes\n objects.\n\n The extension module ``array`` provides an additional example of\n a mutable sequence type, as does the ``collections`` module.\n\nSet types\n These represent unordered, finite sets of unique, immutable\n objects. As such, they cannot be indexed by any subscript. However,\n they can be iterated over, and the built-in function ``len()``\n returns the number of items in a set. Common uses for sets are fast\n membership testing, removing duplicates from a sequence, and\n computing mathematical operations such as intersection, union,\n difference, and symmetric difference.\n\n For set elements, the same immutability rules apply as for\n dictionary keys. Note that numeric types obey the normal rules for\n numeric comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``), only one of them can be contained in a set.\n\n There are currently two intrinsic set types:\n\n Sets\n These represent a mutable set. They are created by the built-in\n ``set()`` constructor and can be modified afterwards by several\n methods, such as ``add()``.\n\n Frozen sets\n These represent an immutable set. They are created by the\n built-in ``frozenset()`` constructor. As a frozenset is\n immutable and *hashable*, it can be used again as an element of\n another set, or as a dictionary key.\n\nMappings\n These represent finite sets of objects indexed by arbitrary index\n sets. The subscript notation ``a[k]`` selects the item indexed by\n ``k`` from the mapping ``a``; this can be used in expressions and\n as the target of assignments or ``del`` statements. The built-in\n function ``len()`` returns the number of items in a mapping.\n\n There is currently a single intrinsic mapping type:\n\n Dictionaries\n These represent finite sets of objects indexed by nearly\n arbitrary values. The only types of values not acceptable as\n keys are values containing lists or dictionaries or other\n mutable types that are compared by value rather than by object\n identity, the reason being that the efficient implementation of\n dictionaries requires a key\'s hash value to remain constant.\n Numeric types used for keys obey the normal rules for numeric\n comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``) then they can be used interchangeably to index the same\n dictionary entry.\n\n Dictionaries are mutable; they can be created by the ``{...}``\n notation (see section *Dictionary displays*).\n\n The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n additional examples of mapping types, as does the\n ``collections`` module.\n\nCallable types\n These are the types to which the function call operation (see\n section *Calls*) can be applied:\n\n User-defined functions\n A user-defined function object is created by a function\n definition (see section *Function definitions*). It should be\n called with an argument list containing the same number of items\n as the function\'s formal parameter list.\n\n Special attributes:\n\n +---------------------------+---------------------------------+-------------+\n | Attribute | Meaning | |\n +===========================+=================================+=============+\n | ``__doc__`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +---------------------------+---------------------------------+-------------+\n | ``__name__`` | The function\'s name | Writable |\n +---------------------------+---------------------------------+-------------+\n | ``__qualname__`` | The function\'s *qualified name* | Writable |\n | | New in version 3.3. | |\n +---------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +---------------------------+---------------------------------+-------------+\n | ``__defaults__`` | A tuple containing default | Writable |\n | | argument values for those | |\n | | arguments that have defaults, | |\n | | or ``None`` if no arguments | |\n | | have a default value | |\n +---------------------------+---------------------------------+-------------+\n | ``__code__`` | The code object representing | Writable |\n | | the compiled function body. | |\n +---------------------------+---------------------------------+-------------+\n | ``__globals__`` | A reference to the dictionary | Read-only |\n | | that holds the function\'s | |\n | | global variables --- the global | |\n | | namespace of the module in | |\n | | which the function was defined. | |\n +---------------------------+---------------------------------+-------------+\n | ``__dict__`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +---------------------------+---------------------------------+-------------+\n | ``__closure__`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +---------------------------+---------------------------------+-------------+\n | ``__annotations__`` | A dict containing annotations | Writable |\n | | of parameters. The keys of the | |\n | | dict are the parameter names, | |\n | | or ``\'return\'`` for the return | |\n | | annotation, if provided. | |\n +---------------------------+---------------------------------+-------------+\n | ``__kwdefaults__`` | A dict containing defaults for | Writable |\n | | keyword-only parameters. | |\n +---------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Function objects also support getting and setting arbitrary\n attributes, which can be used, for example, to attach metadata\n to functions. Regular attribute dot-notation is used to get and\n set such attributes. *Note that the current implementation only\n supports function attributes on user-defined functions. Function\n attributes on built-in functions may be supported in the\n future.*\n\n Additional information about a function\'s definition can be\n retrieved from its code object; see the description of internal\n types below.\n\n Instance methods\n An instance method object combines a class, a class instance and\n any callable object (normally a user-defined function).\n\n Special read-only attributes: ``__self__`` is the class instance\n object, ``__func__`` is the function object; ``__doc__`` is the\n method\'s documentation (same as ``__func__.__doc__``);\n ``__name__`` is the method name (same as ``__func__.__name__``);\n ``__module__`` is the name of the module the method was defined\n in, or ``None`` if unavailable.\n\n Methods also support accessing (but not setting) the arbitrary\n function attributes on the underlying function object.\n\n User-defined method objects may be created when getting an\n attribute of a class (perhaps via an instance of that class), if\n that attribute is a user-defined function object or a class\n method object.\n\n When an instance method object is created by retrieving a user-\n defined function object from a class via one of its instances,\n its ``__self__`` attribute is the instance, and the method\n object is said to be bound. The new method\'s ``__func__``\n attribute is the original function object.\n\n When a user-defined method object is created by retrieving\n another method object from a class or instance, the behaviour is\n the same as for a function object, except that the ``__func__``\n attribute of the new instance is not the original method object\n but its ``__func__`` attribute.\n\n When an instance method object is created by retrieving a class\n method object from a class or instance, its ``__self__``\n attribute is the class itself, and its ``__func__`` attribute is\n the function object underlying the class method.\n\n When an instance method object is called, the underlying\n function (``__func__``) is called, inserting the class instance\n (``__self__``) in front of the argument list. For instance,\n when ``C`` is a class which contains a definition for a function\n ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n is equivalent to calling ``C.f(x, 1)``.\n\n When an instance method object is derived from a class method\n object, the "class instance" stored in ``__self__`` will\n actually be the class itself, so that calling either ``x.f(1)``\n or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n the underlying function.\n\n Note that the transformation from function object to instance\n method object happens each time the attribute is retrieved from\n the instance. In some cases, a fruitful optimization is to\n assign the attribute to a local variable and call that local\n variable. Also notice that this transformation only happens for\n user-defined functions; other callable objects (and all non-\n callable objects) are retrieved without transformation. It is\n also important to note that user-defined functions which are\n attributes of a class instance are not converted to bound\n methods; this *only* happens when the function is an attribute\n of the class.\n\n Generator functions\n A function or method which uses the ``yield`` statement (see\n section *The yield statement*) is called a *generator function*.\n Such a function, when called, always returns an iterator object\n which can be used to execute the body of the function: calling\n the iterator\'s ``iterator__next__()`` method will cause the\n function to execute until it provides a value using the\n ``yield`` statement. When the function executes a ``return``\n statement or falls off the end, a ``StopIteration`` exception is\n raised and the iterator will have reached the end of the set of\n values to be returned.\n\n Built-in functions\n A built-in function object is a wrapper around a C function.\n Examples of built-in functions are ``len()`` and ``math.sin()``\n (``math`` is a standard built-in module). The number and type of\n the arguments are determined by the C function. Special read-\n only attributes: ``__doc__`` is the function\'s documentation\n string, or ``None`` if unavailable; ``__name__`` is the\n function\'s name; ``__self__`` is set to ``None`` (but see the\n next item); ``__module__`` is the name of the module the\n function was defined in or ``None`` if unavailable.\n\n Built-in methods\n This is really a different disguise of a built-in function, this\n time containing an object passed to the C function as an\n implicit extra argument. An example of a built-in method is\n ``alist.append()``, assuming *alist* is a list object. In this\n case, the special read-only attribute ``__self__`` is set to the\n object denoted by *alist*.\n\n Classes\n Classes are callable. These objects normally act as factories\n for new instances of themselves, but variations are possible for\n class types that override ``__new__()``. The arguments of the\n call are passed to ``__new__()`` and, in the typical case, to\n ``__init__()`` to initialize the new instance.\n\n Class Instances\n Instances of arbitrary classes can be made callable by defining\n a ``__call__()`` method in their class.\n\nModules\n Modules are a basic organizational unit of Python code, and are\n created by the *import system* as invoked either by the ``import``\n statement (see ``import``), or by calling functions such as\n ``importlib.import_module()`` and built-in ``__import__()``. A\n module object has a namespace implemented by a dictionary object\n (this is the dictionary referenced by the ``__globals__`` attribute\n of functions defined in the module). Attribute references are\n translated to lookups in this dictionary, e.g., ``m.x`` is\n equivalent to ``m.__dict__["x"]``. A module object does not contain\n the code object used to initialize the module (since it isn\'t\n needed once the initialization is done).\n\n Attribute assignment updates the module\'s namespace dictionary,\n e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n Special read-only attribute: ``__dict__`` is the module\'s namespace\n as a dictionary object.\n\n **CPython implementation detail:** Because of the way CPython\n clears module dictionaries, the module dictionary will be cleared\n when the module falls out of scope even if the dictionary still has\n live references. To avoid this, copy the dictionary or keep the\n module around while using its dictionary directly.\n\n Predefined (writable) attributes: ``__name__`` is the module\'s\n name; ``__doc__`` is the module\'s documentation string, or ``None``\n if unavailable; ``__file__`` is the pathname of the file from which\n the module was loaded, if it was loaded from a file. The\n ``__file__`` attribute may be missing for certain types of modules,\n such as C modules that are statically linked into the interpreter;\n for extension modules loaded dynamically from a shared library, it\n is the pathname of the shared library file.\n\nCustom classes\n Custom class types are typically created by class definitions (see\n section *Class definitions*). A class has a namespace implemented\n by a dictionary object. Class attribute references are translated\n to lookups in this dictionary, e.g., ``C.x`` is translated to\n ``C.__dict__["x"]`` (although there are a number of hooks which\n allow for other means of locating attributes). When the attribute\n name is not found there, the attribute search continues in the base\n classes. This search of the base classes uses the C3 method\n resolution order which behaves correctly even in the presence of\n \'diamond\' inheritance structures where there are multiple\n inheritance paths leading back to a common ancestor. Additional\n details on the C3 MRO used by Python can be found in the\n documentation accompanying the 2.3 release at\n http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a class method object, it is transformed into an instance method\n object whose ``__self__`` attributes is ``C``. When it would yield\n a static method object, it is transformed into the object wrapped\n by the static method object. See section *Implementing Descriptors*\n for another way in which attributes retrieved from a class may\n differ from those actually contained in its ``__dict__``.\n\n Class attribute assignments update the class\'s dictionary, never\n the dictionary of a base class.\n\n A class object can be called (see above) to yield a class instance\n (see below).\n\n Special attributes: ``__name__`` is the class name; ``__module__``\n is the module name in which the class was defined; ``__dict__`` is\n the dictionary containing the class\'s namespace; ``__bases__`` is a\n tuple (possibly empty or a singleton) containing the base classes,\n in the order of their occurrence in the base class list;\n ``__doc__`` is the class\'s documentation string, or None if\n undefined.\n\nClass instances\n A class instance is created by calling a class object (see above).\n A class instance has a namespace implemented as a dictionary which\n is the first place in which attribute references are searched.\n When an attribute is not found there, and the instance\'s class has\n an attribute by that name, the search continues with the class\n attributes. If a class attribute is found that is a user-defined\n function object, it is transformed into an instance method object\n whose ``__self__`` attribute is the instance. Static method and\n class method objects are also transformed; see above under\n "Classes". See section *Implementing Descriptors* for another way\n in which attributes of a class retrieved via its instances may\n differ from the objects actually stored in the class\'s\n ``__dict__``. If no class attribute is found, and the object\'s\n class has a ``__getattr__()`` method, that is called to satisfy the\n lookup.\n\n Attribute assignments and deletions update the instance\'s\n dictionary, never a class\'s dictionary. If the class has a\n ``__setattr__()`` or ``__delattr__()`` method, this is called\n instead of updating the instance dictionary directly.\n\n Class instances can pretend to be numbers, sequences, or mappings\n if they have methods with certain special names. See section\n *Special method names*.\n\n Special attributes: ``__dict__`` is the attribute dictionary;\n ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n A *file object* represents an open file. Various shortcuts are\n available to create file objects: the ``open()`` built-in function,\n and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n method of socket objects (and perhaps by other functions or methods\n provided by extension modules).\n\n The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n initialized to file objects corresponding to the interpreter\'s\n standard input, output and error streams; they are all open in text\n mode and therefore follow the interface defined by the\n ``io.TextIOBase`` abstract class.\n\nInternal types\n A few types used internally by the interpreter are exposed to the\n user. Their definitions may change with future versions of the\n interpreter, but they are mentioned here for completeness.\n\n Code objects\n Code objects represent *byte-compiled* executable Python code,\n or *bytecode*. The difference between a code object and a\n function object is that the function object contains an explicit\n reference to the function\'s globals (the module in which it was\n defined), while a code object contains no context; also the\n default argument values are stored in the function object, not\n in the code object (because they represent values calculated at\n run-time). Unlike function objects, code objects are immutable\n and contain no references (directly or indirectly) to mutable\n objects.\n\n Special read-only attributes: ``co_name`` gives the function\n name; ``co_argcount`` is the number of positional arguments\n (including arguments with default values); ``co_nlocals`` is the\n number of local variables used by the function (including\n arguments); ``co_varnames`` is a tuple containing the names of\n the local variables (starting with the argument names);\n ``co_cellvars`` is a tuple containing the names of local\n variables that are referenced by nested functions;\n ``co_freevars`` is a tuple containing the names of free\n variables; ``co_code`` is a string representing the sequence of\n bytecode instructions; ``co_consts`` is a tuple containing the\n literals used by the bytecode; ``co_names`` is a tuple\n containing the names used by the bytecode; ``co_filename`` is\n the filename from which the code was compiled;\n ``co_firstlineno`` is the first line number of the function;\n ``co_lnotab`` is a string encoding the mapping from bytecode\n offsets to line numbers (for details see the source code of the\n interpreter); ``co_stacksize`` is the required stack size\n (including local variables); ``co_flags`` is an integer encoding\n a number of flags for the interpreter.\n\n The following flag bits are defined for ``co_flags``: bit\n ``0x04`` is set if the function uses the ``*arguments`` syntax\n to accept an arbitrary number of positional arguments; bit\n ``0x08`` is set if the function uses the ``**keywords`` syntax\n to accept arbitrary keyword arguments; bit ``0x20`` is set if\n the function is a generator.\n\n Future feature declarations (``from __future__ import\n division``) also use bits in ``co_flags`` to indicate whether a\n code object was compiled with a particular feature enabled: bit\n ``0x2000`` is set if the function was compiled with future\n division enabled; bits ``0x10`` and ``0x1000`` were used in\n earlier versions of Python.\n\n Other bits in ``co_flags`` are reserved for internal use.\n\n If a code object represents a function, the first item in\n ``co_consts`` is the documentation string of the function, or\n ``None`` if undefined.\n\n Frame objects\n Frame objects represent execution frames. They may occur in\n traceback objects (see below).\n\n Special read-only attributes: ``f_back`` is to the previous\n stack frame (towards the caller), or ``None`` if this is the\n bottom stack frame; ``f_code`` is the code object being executed\n in this frame; ``f_locals`` is the dictionary used to look up\n local variables; ``f_globals`` is used for global variables;\n ``f_builtins`` is used for built-in (intrinsic) names;\n ``f_lasti`` gives the precise instruction (this is an index into\n the bytecode string of the code object).\n\n Special writable attributes: ``f_trace``, if not ``None``, is a\n function called at the start of each source code line (this is\n used by the debugger); ``f_lineno`` is the current line number\n of the frame --- writing to this from within a trace function\n jumps to the given line (only for the bottom-most frame). A\n debugger can implement a Jump command (aka Set Next Statement)\n by writing to f_lineno.\n\n Frame objects support one method:\n\n frame.clear()\n\n This method clears all references to local variables held by\n the frame. Also, if the frame belonged to a generator, the\n generator is finalized. This helps break reference cycles\n involving frame objects (for example when catching an\n exception and storing its traceback for later use).\n\n ``RuntimeError`` is raised if the frame is currently\n executing.\n\n New in version 3.4.\n\n Traceback objects\n Traceback objects represent a stack trace of an exception. A\n traceback object is created when an exception occurs. When the\n search for an exception handler unwinds the execution stack, at\n each unwound level a traceback object is inserted in front of\n the current traceback. When an exception handler is entered,\n the stack trace is made available to the program. (See section\n *The try statement*.) It is accessible as the third item of the\n tuple returned by ``sys.exc_info()``. When the program contains\n no suitable handler, the stack trace is written (nicely\n formatted) to the standard error stream; if the interpreter is\n interactive, it is also made available to the user as\n ``sys.last_traceback``.\n\n Special read-only attributes: ``tb_next`` is the next level in\n the stack trace (towards the frame where the exception\n occurred), or ``None`` if there is no next level; ``tb_frame``\n points to the execution frame of the current level;\n ``tb_lineno`` gives the line number where the exception\n occurred; ``tb_lasti`` indicates the precise instruction. The\n line number and last instruction in the traceback may differ\n from the line number of its frame object if the exception\n occurred in a ``try`` statement with no matching except clause\n or with a finally clause.\n\n Slice objects\n Slice objects are used to represent slices for ``__getitem__()``\n methods. They are also created by the built-in ``slice()``\n function.\n\n Special read-only attributes: ``start`` is the lower bound;\n ``stop`` is the upper bound; ``step`` is the step value; each is\n ``None`` if omitted. These attributes can have any type.\n\n Slice objects support one method:\n\n slice.indices(self, length)\n\n This method takes a single integer argument *length* and\n computes information about the slice that the slice object\n would describe if applied to a sequence of *length* items.\n It returns a tuple of three integers; respectively these are\n the *start* and *stop* indices and the *step* or stride\n length of the slice. Missing or out-of-bounds indices are\n handled in a manner consistent with regular slices.\n\n Static method objects\n Static method objects provide a way of defeating the\n transformation of function objects to method objects described\n above. A static method object is a wrapper around any other\n object, usually a user-defined method object. When a static\n method object is retrieved from a class or a class instance, the\n object actually returned is the wrapped object, which is not\n subject to any further transformation. Static method objects are\n not themselves callable, although the objects they wrap usually\n are. Static method objects are created by the built-in\n ``staticmethod()`` constructor.\n\n Class method objects\n A class method object, like a static method object, is a wrapper\n around another object that alters the way in which that object\n is retrieved from classes and class instances. The behaviour of\n class method objects upon such retrieval is described above,\n under "User-defined methods". Class method objects are created\n by the built-in ``classmethod()`` constructor.\n', + 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python. Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types. Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\' These are attributes that provide access to the\nimplementation and are not intended for general use. Their definition\nmay change in the future.\n\nNone\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name ``None``.\n It is used to signify the absence of a value in many situations,\n e.g., it is returned from functions that don\'t explicitly return\n anything. Its truth value is false.\n\nNotImplemented\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name\n ``NotImplemented``. Numeric methods and rich comparison methods may\n return this value if they do not implement the operation for the\n operands provided. (The interpreter will then try the reflected\n operation, or some other fallback, depending on the operator.) Its\n truth value is true.\n\nEllipsis\n This type has a single value. There is a single object with this\n value. This object is accessed through the literal ``...`` or the\n built-in name ``Ellipsis``. Its truth value is true.\n\n``numbers.Number``\n These are created by numeric literals and returned as results by\n arithmetic operators and arithmetic built-in functions. Numeric\n objects are immutable; once created their value never changes.\n Python numbers are of course strongly related to mathematical\n numbers, but subject to the limitations of numerical representation\n in computers.\n\n Python distinguishes between integers, floating point numbers, and\n complex numbers:\n\n ``numbers.Integral``\n These represent elements from the mathematical set of integers\n (positive and negative).\n\n There are two types of integers:\n\n Integers (``int``)\n\n These represent numbers in an unlimited range, subject to\n available (virtual) memory only. For the purpose of shift\n and mask operations, a binary representation is assumed, and\n negative numbers are represented in a variant of 2\'s\n complement which gives the illusion of an infinite string of\n sign bits extending to the left.\n\n Booleans (``bool``)\n These represent the truth values False and True. The two\n objects representing the values False and True are the only\n Boolean objects. The Boolean type is a subtype of the integer\n type, and Boolean values behave like the values 0 and 1,\n respectively, in almost all contexts, the exception being\n that when converted to a string, the strings ``"False"`` or\n ``"True"`` are returned, respectively.\n\n The rules for integer representation are intended to give the\n most meaningful interpretation of shift and mask operations\n involving negative integers.\n\n ``numbers.Real`` (``float``)\n These represent machine-level double precision floating point\n numbers. You are at the mercy of the underlying machine\n architecture (and C or Java implementation) for the accepted\n range and handling of overflow. Python does not support single-\n precision floating point numbers; the savings in processor and\n memory usage that are usually the reason for using these is\n dwarfed by the overhead of using objects in Python, so there is\n no reason to complicate the language with two kinds of floating\n point numbers.\n\n ``numbers.Complex`` (``complex``)\n These represent complex numbers as a pair of machine-level\n double precision floating point numbers. The same caveats apply\n as for floating point numbers. The real and imaginary parts of a\n complex number ``z`` can be retrieved through the read-only\n attributes ``z.real`` and ``z.imag``.\n\nSequences\n These represent finite ordered sets indexed by non-negative\n numbers. The built-in function ``len()`` returns the number of\n items of a sequence. When the length of a sequence is *n*, the\n index set contains the numbers 0, 1, ..., *n*-1. Item *i* of\n sequence *a* is selected by ``a[i]``.\n\n Sequences also support slicing: ``a[i:j]`` selects all items with\n index *k* such that *i* ``<=`` *k* ``<`` *j*. When used as an\n expression, a slice is a sequence of the same type. This implies\n that the index set is renumbered so that it starts at 0.\n\n Some sequences also support "extended slicing" with a third "step"\n parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n *j*.\n\n Sequences are distinguished according to their mutability:\n\n Immutable sequences\n An object of an immutable sequence type cannot change once it is\n created. (If the object contains references to other objects,\n these other objects may be mutable and may be changed; however,\n the collection of objects directly referenced by an immutable\n object cannot change.)\n\n The following types are immutable sequences:\n\n Strings\n A string is a sequence of values that represent Unicode\n codepoints. All the codepoints in range ``U+0000 - U+10FFFF``\n can be represented in a string. Python doesn\'t have a\n ``chr`` type, and every character in the string is\n represented as a string object with length ``1``. The built-\n in function ``ord()`` converts a character to its codepoint\n (as an integer); ``chr()`` converts an integer in range ``0 -\n 10FFFF`` to the corresponding character. ``str.encode()`` can\n be used to convert a ``str`` to ``bytes`` using the given\n encoding, and ``bytes.decode()`` can be used to achieve the\n opposite.\n\n Tuples\n The items of a tuple are arbitrary Python objects. Tuples of\n two or more items are formed by comma-separated lists of\n expressions. A tuple of one item (a \'singleton\') can be\n formed by affixing a comma to an expression (an expression by\n itself does not create a tuple, since parentheses must be\n usable for grouping of expressions). An empty tuple can be\n formed by an empty pair of parentheses.\n\n Bytes\n A bytes object is an immutable array. The items are 8-bit\n bytes, represented by integers in the range 0 <= x < 256.\n Bytes literals (like ``b\'abc\'``) and the built-in function\n ``bytes()`` can be used to construct bytes objects. Also,\n bytes objects can be decoded to strings via the ``decode()``\n method.\n\n Mutable sequences\n Mutable sequences can be changed after they are created. The\n subscription and slicing notations can be used as the target of\n assignment and ``del`` (delete) statements.\n\n There are currently two intrinsic mutable sequence types:\n\n Lists\n The items of a list are arbitrary Python objects. Lists are\n formed by placing a comma-separated list of expressions in\n square brackets. (Note that there are no special cases needed\n to form lists of length 0 or 1.)\n\n Byte Arrays\n A bytearray object is a mutable array. They are created by\n the built-in ``bytearray()`` constructor. Aside from being\n mutable (and hence unhashable), byte arrays otherwise provide\n the same interface and functionality as immutable bytes\n objects.\n\n The extension module ``array`` provides an additional example of\n a mutable sequence type, as does the ``collections`` module.\n\nSet types\n These represent unordered, finite sets of unique, immutable\n objects. As such, they cannot be indexed by any subscript. However,\n they can be iterated over, and the built-in function ``len()``\n returns the number of items in a set. Common uses for sets are fast\n membership testing, removing duplicates from a sequence, and\n computing mathematical operations such as intersection, union,\n difference, and symmetric difference.\n\n For set elements, the same immutability rules apply as for\n dictionary keys. Note that numeric types obey the normal rules for\n numeric comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``), only one of them can be contained in a set.\n\n There are currently two intrinsic set types:\n\n Sets\n These represent a mutable set. They are created by the built-in\n ``set()`` constructor and can be modified afterwards by several\n methods, such as ``add()``.\n\n Frozen sets\n These represent an immutable set. They are created by the\n built-in ``frozenset()`` constructor. As a frozenset is\n immutable and *hashable*, it can be used again as an element of\n another set, or as a dictionary key.\n\nMappings\n These represent finite sets of objects indexed by arbitrary index\n sets. The subscript notation ``a[k]`` selects the item indexed by\n ``k`` from the mapping ``a``; this can be used in expressions and\n as the target of assignments or ``del`` statements. The built-in\n function ``len()`` returns the number of items in a mapping.\n\n There is currently a single intrinsic mapping type:\n\n Dictionaries\n These represent finite sets of objects indexed by nearly\n arbitrary values. The only types of values not acceptable as\n keys are values containing lists or dictionaries or other\n mutable types that are compared by value rather than by object\n identity, the reason being that the efficient implementation of\n dictionaries requires a key\'s hash value to remain constant.\n Numeric types used for keys obey the normal rules for numeric\n comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``) then they can be used interchangeably to index the same\n dictionary entry.\n\n Dictionaries are mutable; they can be created by the ``{...}``\n notation (see section *Dictionary displays*).\n\n The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n additional examples of mapping types, as does the\n ``collections`` module.\n\nCallable types\n These are the types to which the function call operation (see\n section *Calls*) can be applied:\n\n User-defined functions\n A user-defined function object is created by a function\n definition (see section *Function definitions*). It should be\n called with an argument list containing the same number of items\n as the function\'s formal parameter list.\n\n Special attributes:\n\n +---------------------------+---------------------------------+-------------+\n | Attribute | Meaning | |\n +===========================+=================================+=============+\n | ``__doc__`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +---------------------------+---------------------------------+-------------+\n | ``__name__`` | The function\'s name | Writable |\n +---------------------------+---------------------------------+-------------+\n | ``__qualname__`` | The function\'s *qualified name* | Writable |\n | | New in version 3.3. | |\n +---------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +---------------------------+---------------------------------+-------------+\n | ``__defaults__`` | A tuple containing default | Writable |\n | | argument values for those | |\n | | arguments that have defaults, | |\n | | or ``None`` if no arguments | |\n | | have a default value | |\n +---------------------------+---------------------------------+-------------+\n | ``__code__`` | The code object representing | Writable |\n | | the compiled function body. | |\n +---------------------------+---------------------------------+-------------+\n | ``__globals__`` | A reference to the dictionary | Read-only |\n | | that holds the function\'s | |\n | | global variables --- the global | |\n | | namespace of the module in | |\n | | which the function was defined. | |\n +---------------------------+---------------------------------+-------------+\n | ``__dict__`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +---------------------------+---------------------------------+-------------+\n | ``__closure__`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +---------------------------+---------------------------------+-------------+\n | ``__annotations__`` | A dict containing annotations | Writable |\n | | of parameters. The keys of the | |\n | | dict are the parameter names, | |\n | | or ``\'return\'`` for the return | |\n | | annotation, if provided. | |\n +---------------------------+---------------------------------+-------------+\n | ``__kwdefaults__`` | A dict containing defaults for | Writable |\n | | keyword-only parameters. | |\n +---------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Function objects also support getting and setting arbitrary\n attributes, which can be used, for example, to attach metadata\n to functions. Regular attribute dot-notation is used to get and\n set such attributes. *Note that the current implementation only\n supports function attributes on user-defined functions. Function\n attributes on built-in functions may be supported in the\n future.*\n\n Additional information about a function\'s definition can be\n retrieved from its code object; see the description of internal\n types below.\n\n Instance methods\n An instance method object combines a class, a class instance and\n any callable object (normally a user-defined function).\n\n Special read-only attributes: ``__self__`` is the class instance\n object, ``__func__`` is the function object; ``__doc__`` is the\n method\'s documentation (same as ``__func__.__doc__``);\n ``__name__`` is the method name (same as ``__func__.__name__``);\n ``__module__`` is the name of the module the method was defined\n in, or ``None`` if unavailable.\n\n Methods also support accessing (but not setting) the arbitrary\n function attributes on the underlying function object.\n\n User-defined method objects may be created when getting an\n attribute of a class (perhaps via an instance of that class), if\n that attribute is a user-defined function object or a class\n method object.\n\n When an instance method object is created by retrieving a user-\n defined function object from a class via one of its instances,\n its ``__self__`` attribute is the instance, and the method\n object is said to be bound. The new method\'s ``__func__``\n attribute is the original function object.\n\n When a user-defined method object is created by retrieving\n another method object from a class or instance, the behaviour is\n the same as for a function object, except that the ``__func__``\n attribute of the new instance is not the original method object\n but its ``__func__`` attribute.\n\n When an instance method object is created by retrieving a class\n method object from a class or instance, its ``__self__``\n attribute is the class itself, and its ``__func__`` attribute is\n the function object underlying the class method.\n\n When an instance method object is called, the underlying\n function (``__func__``) is called, inserting the class instance\n (``__self__``) in front of the argument list. For instance,\n when ``C`` is a class which contains a definition for a function\n ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n is equivalent to calling ``C.f(x, 1)``.\n\n When an instance method object is derived from a class method\n object, the "class instance" stored in ``__self__`` will\n actually be the class itself, so that calling either ``x.f(1)``\n or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n the underlying function.\n\n Note that the transformation from function object to instance\n method object happens each time the attribute is retrieved from\n the instance. In some cases, a fruitful optimization is to\n assign the attribute to a local variable and call that local\n variable. Also notice that this transformation only happens for\n user-defined functions; other callable objects (and all non-\n callable objects) are retrieved without transformation. It is\n also important to note that user-defined functions which are\n attributes of a class instance are not converted to bound\n methods; this *only* happens when the function is an attribute\n of the class.\n\n Generator functions\n A function or method which uses the ``yield`` statement (see\n section *The yield statement*) is called a *generator function*.\n Such a function, when called, always returns an iterator object\n which can be used to execute the body of the function: calling\n the iterator\'s ``iterator.__next__()`` method will cause the\n function to execute until it provides a value using the\n ``yield`` statement. When the function executes a ``return``\n statement or falls off the end, a ``StopIteration`` exception is\n raised and the iterator will have reached the end of the set of\n values to be returned.\n\n Built-in functions\n A built-in function object is a wrapper around a C function.\n Examples of built-in functions are ``len()`` and ``math.sin()``\n (``math`` is a standard built-in module). The number and type of\n the arguments are determined by the C function. Special read-\n only attributes: ``__doc__`` is the function\'s documentation\n string, or ``None`` if unavailable; ``__name__`` is the\n function\'s name; ``__self__`` is set to ``None`` (but see the\n next item); ``__module__`` is the name of the module the\n function was defined in or ``None`` if unavailable.\n\n Built-in methods\n This is really a different disguise of a built-in function, this\n time containing an object passed to the C function as an\n implicit extra argument. An example of a built-in method is\n ``alist.append()``, assuming *alist* is a list object. In this\n case, the special read-only attribute ``__self__`` is set to the\n object denoted by *alist*.\n\n Classes\n Classes are callable. These objects normally act as factories\n for new instances of themselves, but variations are possible for\n class types that override ``__new__()``. The arguments of the\n call are passed to ``__new__()`` and, in the typical case, to\n ``__init__()`` to initialize the new instance.\n\n Class Instances\n Instances of arbitrary classes can be made callable by defining\n a ``__call__()`` method in their class.\n\nModules\n Modules are a basic organizational unit of Python code, and are\n created by the *import system* as invoked either by the ``import``\n statement (see ``import``), or by calling functions such as\n ``importlib.import_module()`` and built-in ``__import__()``. A\n module object has a namespace implemented by a dictionary object\n (this is the dictionary referenced by the ``__globals__`` attribute\n of functions defined in the module). Attribute references are\n translated to lookups in this dictionary, e.g., ``m.x`` is\n equivalent to ``m.__dict__["x"]``. A module object does not contain\n the code object used to initialize the module (since it isn\'t\n needed once the initialization is done).\n\n Attribute assignment updates the module\'s namespace dictionary,\n e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n Special read-only attribute: ``__dict__`` is the module\'s namespace\n as a dictionary object.\n\n **CPython implementation detail:** Because of the way CPython\n clears module dictionaries, the module dictionary will be cleared\n when the module falls out of scope even if the dictionary still has\n live references. To avoid this, copy the dictionary or keep the\n module around while using its dictionary directly.\n\n Predefined (writable) attributes: ``__name__`` is the module\'s\n name; ``__doc__`` is the module\'s documentation string, or ``None``\n if unavailable; ``__file__`` is the pathname of the file from which\n the module was loaded, if it was loaded from a file. The\n ``__file__`` attribute may be missing for certain types of modules,\n such as C modules that are statically linked into the interpreter;\n for extension modules loaded dynamically from a shared library, it\n is the pathname of the shared library file.\n\nCustom classes\n Custom class types are typically created by class definitions (see\n section *Class definitions*). A class has a namespace implemented\n by a dictionary object. Class attribute references are translated\n to lookups in this dictionary, e.g., ``C.x`` is translated to\n ``C.__dict__["x"]`` (although there are a number of hooks which\n allow for other means of locating attributes). When the attribute\n name is not found there, the attribute search continues in the base\n classes. This search of the base classes uses the C3 method\n resolution order which behaves correctly even in the presence of\n \'diamond\' inheritance structures where there are multiple\n inheritance paths leading back to a common ancestor. Additional\n details on the C3 MRO used by Python can be found in the\n documentation accompanying the 2.3 release at\n http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a class method object, it is transformed into an instance method\n object whose ``__self__`` attributes is ``C``. When it would yield\n a static method object, it is transformed into the object wrapped\n by the static method object. See section *Implementing Descriptors*\n for another way in which attributes retrieved from a class may\n differ from those actually contained in its ``__dict__``.\n\n Class attribute assignments update the class\'s dictionary, never\n the dictionary of a base class.\n\n A class object can be called (see above) to yield a class instance\n (see below).\n\n Special attributes: ``__name__`` is the class name; ``__module__``\n is the module name in which the class was defined; ``__dict__`` is\n the dictionary containing the class\'s namespace; ``__bases__`` is a\n tuple (possibly empty or a singleton) containing the base classes,\n in the order of their occurrence in the base class list;\n ``__doc__`` is the class\'s documentation string, or None if\n undefined.\n\nClass instances\n A class instance is created by calling a class object (see above).\n A class instance has a namespace implemented as a dictionary which\n is the first place in which attribute references are searched.\n When an attribute is not found there, and the instance\'s class has\n an attribute by that name, the search continues with the class\n attributes. If a class attribute is found that is a user-defined\n function object, it is transformed into an instance method object\n whose ``__self__`` attribute is the instance. Static method and\n class method objects are also transformed; see above under\n "Classes". See section *Implementing Descriptors* for another way\n in which attributes of a class retrieved via its instances may\n differ from the objects actually stored in the class\'s\n ``__dict__``. If no class attribute is found, and the object\'s\n class has a ``__getattr__()`` method, that is called to satisfy the\n lookup.\n\n Attribute assignments and deletions update the instance\'s\n dictionary, never a class\'s dictionary. If the class has a\n ``__setattr__()`` or ``__delattr__()`` method, this is called\n instead of updating the instance dictionary directly.\n\n Class instances can pretend to be numbers, sequences, or mappings\n if they have methods with certain special names. See section\n *Special method names*.\n\n Special attributes: ``__dict__`` is the attribute dictionary;\n ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n A *file object* represents an open file. Various shortcuts are\n available to create file objects: the ``open()`` built-in function,\n and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n method of socket objects (and perhaps by other functions or methods\n provided by extension modules).\n\n The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n initialized to file objects corresponding to the interpreter\'s\n standard input, output and error streams; they are all open in text\n mode and therefore follow the interface defined by the\n ``io.TextIOBase`` abstract class.\n\nInternal types\n A few types used internally by the interpreter are exposed to the\n user. Their definitions may change with future versions of the\n interpreter, but they are mentioned here for completeness.\n\n Code objects\n Code objects represent *byte-compiled* executable Python code,\n or *bytecode*. The difference between a code object and a\n function object is that the function object contains an explicit\n reference to the function\'s globals (the module in which it was\n defined), while a code object contains no context; also the\n default argument values are stored in the function object, not\n in the code object (because they represent values calculated at\n run-time). Unlike function objects, code objects are immutable\n and contain no references (directly or indirectly) to mutable\n objects.\n\n Special read-only attributes: ``co_name`` gives the function\n name; ``co_argcount`` is the number of positional arguments\n (including arguments with default values); ``co_nlocals`` is the\n number of local variables used by the function (including\n arguments); ``co_varnames`` is a tuple containing the names of\n the local variables (starting with the argument names);\n ``co_cellvars`` is a tuple containing the names of local\n variables that are referenced by nested functions;\n ``co_freevars`` is a tuple containing the names of free\n variables; ``co_code`` is a string representing the sequence of\n bytecode instructions; ``co_consts`` is a tuple containing the\n literals used by the bytecode; ``co_names`` is a tuple\n containing the names used by the bytecode; ``co_filename`` is\n the filename from which the code was compiled;\n ``co_firstlineno`` is the first line number of the function;\n ``co_lnotab`` is a string encoding the mapping from bytecode\n offsets to line numbers (for details see the source code of the\n interpreter); ``co_stacksize`` is the required stack size\n (including local variables); ``co_flags`` is an integer encoding\n a number of flags for the interpreter.\n\n The following flag bits are defined for ``co_flags``: bit\n ``0x04`` is set if the function uses the ``*arguments`` syntax\n to accept an arbitrary number of positional arguments; bit\n ``0x08`` is set if the function uses the ``**keywords`` syntax\n to accept arbitrary keyword arguments; bit ``0x20`` is set if\n the function is a generator.\n\n Future feature declarations (``from __future__ import\n division``) also use bits in ``co_flags`` to indicate whether a\n code object was compiled with a particular feature enabled: bit\n ``0x2000`` is set if the function was compiled with future\n division enabled; bits ``0x10`` and ``0x1000`` were used in\n earlier versions of Python.\n\n Other bits in ``co_flags`` are reserved for internal use.\n\n If a code object represents a function, the first item in\n ``co_consts`` is the documentation string of the function, or\n ``None`` if undefined.\n\n Frame objects\n Frame objects represent execution frames. They may occur in\n traceback objects (see below).\n\n Special read-only attributes: ``f_back`` is to the previous\n stack frame (towards the caller), or ``None`` if this is the\n bottom stack frame; ``f_code`` is the code object being executed\n in this frame; ``f_locals`` is the dictionary used to look up\n local variables; ``f_globals`` is used for global variables;\n ``f_builtins`` is used for built-in (intrinsic) names;\n ``f_lasti`` gives the precise instruction (this is an index into\n the bytecode string of the code object).\n\n Special writable attributes: ``f_trace``, if not ``None``, is a\n function called at the start of each source code line (this is\n used by the debugger); ``f_lineno`` is the current line number\n of the frame --- writing to this from within a trace function\n jumps to the given line (only for the bottom-most frame). A\n debugger can implement a Jump command (aka Set Next Statement)\n by writing to f_lineno.\n\n Frame objects support one method:\n\n frame.clear()\n\n This method clears all references to local variables held by\n the frame. Also, if the frame belonged to a generator, the\n generator is finalized. This helps break reference cycles\n involving frame objects (for example when catching an\n exception and storing its traceback for later use).\n\n ``RuntimeError`` is raised if the frame is currently\n executing.\n\n New in version 3.4.\n\n Traceback objects\n Traceback objects represent a stack trace of an exception. A\n traceback object is created when an exception occurs. When the\n search for an exception handler unwinds the execution stack, at\n each unwound level a traceback object is inserted in front of\n the current traceback. When an exception handler is entered,\n the stack trace is made available to the program. (See section\n *The try statement*.) It is accessible as the third item of the\n tuple returned by ``sys.exc_info()``. When the program contains\n no suitable handler, the stack trace is written (nicely\n formatted) to the standard error stream; if the interpreter is\n interactive, it is also made available to the user as\n ``sys.last_traceback``.\n\n Special read-only attributes: ``tb_next`` is the next level in\n the stack trace (towards the frame where the exception\n occurred), or ``None`` if there is no next level; ``tb_frame``\n points to the execution frame of the current level;\n ``tb_lineno`` gives the line number where the exception\n occurred; ``tb_lasti`` indicates the precise instruction. The\n line number and last instruction in the traceback may differ\n from the line number of its frame object if the exception\n occurred in a ``try`` statement with no matching except clause\n or with a finally clause.\n\n Slice objects\n Slice objects are used to represent slices for ``__getitem__()``\n methods. They are also created by the built-in ``slice()``\n function.\n\n Special read-only attributes: ``start`` is the lower bound;\n ``stop`` is the upper bound; ``step`` is the step value; each is\n ``None`` if omitted. These attributes can have any type.\n\n Slice objects support one method:\n\n slice.indices(self, length)\n\n This method takes a single integer argument *length* and\n computes information about the slice that the slice object\n would describe if applied to a sequence of *length* items.\n It returns a tuple of three integers; respectively these are\n the *start* and *stop* indices and the *step* or stride\n length of the slice. Missing or out-of-bounds indices are\n handled in a manner consistent with regular slices.\n\n Static method objects\n Static method objects provide a way of defeating the\n transformation of function objects to method objects described\n above. A static method object is a wrapper around any other\n object, usually a user-defined method object. When a static\n method object is retrieved from a class or a class instance, the\n object actually returned is the wrapped object, which is not\n subject to any further transformation. Static method objects are\n not themselves callable, although the objects they wrap usually\n are. Static method objects are created by the built-in\n ``staticmethod()`` constructor.\n\n Class method objects\n A class method object, like a static method object, is a wrapper\n around another object that alters the way in which that object\n is retrieved from classes and class instances. The behaviour of\n class method objects upon such retrieval is described above,\n under "User-defined methods". Class method objects are created\n by the built-in ``classmethod()`` constructor.\n', 'typesfunctions': '\nFunctions\n*********\n\nFunction objects are created by function definitions. The only\noperation on a function object is to call it: ``func(argument-list)``.\n\nThere are really two flavors of function objects: built-in functions\nand user-defined functions. Both support the same operation (to call\nthe function), but the implementation is different, hence the\ndifferent object types.\n\nSee *Function definitions* for more information.\n', 'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects. There is currently only one standard\nmapping type, the *dictionary*. (For other containers see the built-\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values. Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys. Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry. (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict(**kwarg)\nclass class dict(mapping, **kwarg)\nclass class dict(iterable, **kwarg)\n\n Return a new dictionary initialized from an optional positional\n argument and a possibly empty set of keyword arguments.\n\n If no positional argument is given, an empty dictionary is created.\n If a positional argument is given and it is a mapping object, a\n dictionary is created with the same key-value pairs as the mapping\n object. Otherwise, the positional argument must be an *iterator*\n object. Each item in the iterable must itself be an iterator with\n exactly two objects. The first object of each item becomes a key\n in the new dictionary, and the second object the corresponding\n value. If a key occurs more than once, the last value for that key\n becomes the corresponding value in the new dictionary.\n\n If keyword arguments are given, the keyword arguments and their\n values are added to the dictionary created from the positional\n argument. If a key being added is already present, the value from\n the keyword argument replaces the value from the positional\n argument.\n\n To illustrate, the following examples all return a dictionary equal\n to ``{"one": 1, "two": 2, "three": 3}``:\n\n >>> a = dict(one=1, two=2, three=3)\n >>> b = {\'one\': 1, \'two\': 2, \'three\': 3}\n >>> c = dict(zip([\'one\', \'two\', \'three\'], [1, 2, 3]))\n >>> d = dict([(\'two\', 2), (\'one\', 1), (\'three\', 3)])\n >>> e = dict({\'three\': 3, \'one\': 1, \'two\': 2})\n >>> a == b == c == d == e\n True\n\n Providing keyword arguments as in the first example only works for\n keys that are valid Python identifiers. Otherwise, any valid keys\n can be used.\n\n These are the operations that dictionaries support (and therefore,\n custom mapping types should support too):\n\n len(d)\n\n Return the number of items in the dictionary *d*.\n\n d[key]\n\n Return the item of *d* with key *key*. Raises a ``KeyError`` if\n *key* is not in the map.\n\n If a subclass of dict defines a method ``__missing__()``, if the\n key *key* is not present, the ``d[key]`` operation calls that\n method with the key *key* as argument. The ``d[key]`` operation\n then returns or raises whatever is returned or raised by the\n ``__missing__(key)`` call if the key is not present. No other\n operations or methods invoke ``__missing__()``. If\n ``__missing__()`` is not defined, ``KeyError`` is raised.\n ``__missing__()`` must be a method; it cannot be an instance\n variable:\n\n >>> class Counter(dict):\n ... def __missing__(self, key):\n ... return 0\n >>> c = Counter()\n >>> c[\'red\']\n 0\n >>> c[\'red\'] += 1\n >>> c[\'red\']\n 1\n\n See ``collections.Counter`` for a complete implementation\n including other methods helpful for accumulating and managing\n tallies.\n\n d[key] = value\n\n Set ``d[key]`` to *value*.\n\n del d[key]\n\n Remove ``d[key]`` from *d*. Raises a ``KeyError`` if *key* is\n not in the map.\n\n key in d\n\n Return ``True`` if *d* has a key *key*, else ``False``.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iter(d.keys())``.\n\n clear()\n\n Remove all items from the dictionary.\n\n copy()\n\n Return a shallow copy of the dictionary.\n\n classmethod fromkeys(seq[, value])\n\n Create a new dictionary with keys from *seq* and values set to\n *value*.\n\n ``fromkeys()`` is a class method that returns a new dictionary.\n *value* defaults to ``None``.\n\n get(key[, default])\n\n Return the value for *key* if *key* is in the dictionary, else\n *default*. If *default* is not given, it defaults to ``None``,\n so that this method never raises a ``KeyError``.\n\n items()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See the *documentation of view objects*.\n\n keys()\n\n Return a new view of the dictionary\'s keys. See the\n *documentation of view objects*.\n\n pop(key[, default])\n\n If *key* is in the dictionary, remove it and return its value,\n else return *default*. If *default* is not given and *key* is\n not in the dictionary, a ``KeyError`` is raised.\n\n popitem()\n\n Remove and return an arbitrary ``(key, value)`` pair from the\n dictionary.\n\n ``popitem()`` is useful to destructively iterate over a\n dictionary, as often used in set algorithms. If the dictionary\n is empty, calling ``popitem()`` raises a ``KeyError``.\n\n setdefault(key[, default])\n\n If *key* is in the dictionary, return its value. If not, insert\n *key* with a value of *default* and return *default*. *default*\n defaults to ``None``.\n\n update([other])\n\n Update the dictionary with the key/value pairs from *other*,\n overwriting existing keys. Return ``None``.\n\n ``update()`` accepts either another dictionary object or an\n iterable of key/value pairs (as tuples or other iterables of\n length two). If keyword arguments are specified, the dictionary\n is then updated with those key/value pairs: ``d.update(red=1,\n blue=2)``.\n\n values()\n\n Return a new view of the dictionary\'s values. See the\n *documentation of view objects*.\n\nSee also:\n\n ``types.MappingProxyType`` can be used to create a read-only view\n of a ``dict``.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.keys()``, ``dict.values()`` and\n``dict.items()`` are *view objects*. They provide a dynamic view on\nthe dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n Return the number of entries in the dictionary.\n\niter(dictview)\n\n Return an iterator over the keys, values or items (represented as\n tuples of ``(key, value)``) in the dictionary.\n\n Keys and values are iterated over in an arbitrary order which is\n non-random, varies across Python implementations, and depends on\n the dictionary\'s history of insertions and deletions. If keys,\n values and items views are iterated over with no intervening\n modifications to the dictionary, the order of items will directly\n correspond. This allows the creation of ``(value, key)`` pairs\n using ``zip()``: ``pairs = zip(d.values(), d.keys())``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.items()]``.\n\n Iterating views while adding or deleting entries in the dictionary\n may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n Return ``True`` if *x* is in the underlying dictionary\'s keys,\n values or items (in the latter case, *x* should be a ``(key,\n value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that ``(key, value)`` pairs are unique\nand hashable, then the items view is also set-like. (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class ``collections.abc.Set`` are available (for example, ``==``,\n``<``, or ``^``).\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.keys()\n >>> values = dishes.values()\n\n >>> # iteration\n >>> n = 0\n >>> for val in values:\n ... n += val\n >>> print(n)\n 504\n\n >>> # keys and values are iterated over in the same order\n >>> list(keys)\n [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n >>> list(values)\n [2, 1, 1, 500]\n\n >>> # view objects are dynamic and reflect dict changes\n >>> del dishes[\'eggs\']\n >>> del dishes[\'sausage\']\n >>> list(keys)\n [\'spam\', \'bacon\']\n\n >>> # set operations\n >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n {\'bacon\'}\n >>> keys ^ {\'sausage\', \'juice\'}\n {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n', 'typesmethods': '\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as ``append()`` on\nlists) and class instance methods. Built-in methods are described\nwith the types that support them.\n\nIf you access a method (a function defined in a class namespace)\nthrough an instance, you get a special object: a *bound method* (also\ncalled *instance method*) object. When called, it will add the\n``self`` argument to the argument list. Bound methods have two\nspecial read-only attributes: ``m.__self__`` is the object on which\nthe method operates, and ``m.__func__`` is the function implementing\nthe method. Calling ``m(arg-1, arg-2, ..., arg-n)`` is completely\nequivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, ...,\narg-n)``.\n\nLike function objects, bound method objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.__func__``), setting method\nattributes on bound methods is disallowed. Attempting to set an\nattribute on a method results in an ``AttributeError`` being raised.\nIn order to set a method attribute, you need to explicitly set it on\nthe underlying function object:\n\n >>> class C:\n ... def method(self):\n ... pass\n ...\n >>> c = C()\n >>> c.method.whoami = \'my name is method\' # can\'t set on the method\n Traceback (most recent call last):\n File "", line 1, in \n AttributeError: \'method\' object has no attribute \'whoami\'\n >>> c.method.__func__.whoami = \'my name is method\'\n >>> c.method.whoami\n \'my name is method\'\n\nSee *The standard type hierarchy* for more information.\n', 'typesmodules': "\nModules\n*******\n\nThe only special operation on a module is attribute access:\n``m.name``, where *m* is a module and *name* accesses a name defined\nin *m*'s symbol table. Module attributes can be assigned to. (Note\nthat the ``import`` statement is not, strictly speaking, an operation\non a module object; ``import foo`` does not require a module object\nnamed *foo* to exist, rather it requires an (external) *definition*\nfor a module named *foo* somewhere.)\n\nA special attribute of every module is ``__dict__``. This is the\ndictionary containing the module's symbol table. Modifying this\ndictionary will actually change the module's symbol table, but direct\nassignment to the ``__dict__`` attribute is not possible (you can\nwrite ``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but\nyou can't write ``m.__dict__ = {}``). Modifying ``__dict__`` directly\nis not recommended.\n\nModules built into the interpreter are written like this: ````. If loaded from a file, they are written as\n````.\n", - 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+----------------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+----------------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s`` | *n* shallow copies of *s* | (2)(7) |\n| | concatenated | |\n+----------------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])`` | index of the first occurrence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)`` | total number of occurrences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n This means that building up a sequence by repeated concatenation\n will have a quadratic runtime cost in the total sequence length.\n To get a linear runtime cost, you must switch to one of the\n alternatives below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end or else write to a ``io.StringIO``\n instance and retrieve its value when complete\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n concatenation with a ``bytearray`` object. ``bytearray`` objects\n are mutable and have an efficient overallocation mechanism\n\n * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n that follow specific patterns, and hence don\'t support sequence\n concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: ``[]``\n\n * Using square brackets, separating items with commas: ``[a]``,\n ``[a, b, c]``\n\n * Using a list comprehension: ``[x for x in iterable]``\n\n * Using the type constructor: ``list()`` or ``list(iterable)``\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n 2, 3]``. If no argument is given, the constructor creates a new\n empty list, ``[]``.\n\n Many other operations also produce lists, including the\n ``sorted()`` built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only ``<``\n comparisons between items. Exceptions are not suppressed - if\n any comparison operations fail, the entire sort operation will\n fail (and the list will likely be left in a partially modified\n state).\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n ``key=str.lower``). The key corresponding to each item in the\n list is calculated once and then used for the entire sorting\n process. The default value of ``None`` means that list items are\n sorted directly without calculating a separate key value.\n\n The ``functools.cmp_to_key()`` utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n ``sorted()`` to explicitly request a new sorted list instance).\n\n The ``sort()`` method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can\n detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: ``()``\n\n * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n * Using the ``tuple()`` built-in: ``tuple()`` or\n ``tuple(iterable)``\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n argument is given, the constructor creates a new empty tuple,\n ``()``.\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, ``f(a, b, c)`` is a function call with three\n arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n as the sole argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in ``int`` or any object that implements the ``__index__``\n special method). If the *step* argument is omitted, it defaults to\n ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n *step* is zero, ``ValueError`` is raised.\n\n For a positive *step*, the contents of a range ``r`` are determined\n by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n ``r[i] < stop``.\n\n For a negative *step*, the contents of the range are still\n determined by the formula ``r[i] = start + step*i``, but the\n constraints are ``i >= 0`` and ``r[i] > stop``.\n\n A range object will be empty if ``r[0]`` does not meet the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than ``sys.maxsize`` are\n permitted but some features (such as ``len()``) may raise\n ``OverflowError``.\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.Sequence`` ABC, and provide\nfeatures such as containment tests, element index lookup, slicing and\nsupport for negative indices (see *Sequence Types --- list, tuple,\nrange*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences. That is, two range objects are considered equal if\nthey represent the same sequence of values. (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n', + 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+----------------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+----------------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s`` | *n* shallow copies of *s* | (2)(7) |\n| | concatenated | |\n+----------------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])`` | index of the first occurrence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)`` | total number of occurrences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n This means that building up a sequence by repeated concatenation\n will have a quadratic runtime cost in the total sequence length.\n To get a linear runtime cost, you must switch to one of the\n alternatives below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end or else write to a ``io.StringIO``\n instance and retrieve its value when complete\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n concatenation with a ``bytearray`` object. ``bytearray`` objects\n are mutable and have an efficient overallocation mechanism\n\n * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n that follow specific patterns, and hence don\'t support sequence\n concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: ``[]``\n\n * Using square brackets, separating items with commas: ``[a]``,\n ``[a, b, c]``\n\n * Using a list comprehension: ``[x for x in iterable]``\n\n * Using the type constructor: ``list()`` or ``list(iterable)``\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n 2, 3]``. If no argument is given, the constructor creates a new\n empty list, ``[]``.\n\n Many other operations also produce lists, including the\n ``sorted()`` built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only ``<``\n comparisons between items. Exceptions are not suppressed - if\n any comparison operations fail, the entire sort operation will\n fail (and the list will likely be left in a partially modified\n state).\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n ``key=str.lower``). The key corresponding to each item in the\n list is calculated once and then used for the entire sorting\n process. The default value of ``None`` means that list items are\n sorted directly without calculating a separate key value.\n\n The ``functools.cmp_to_key()`` utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n ``sorted()`` to explicitly request a new sorted list instance).\n\n The ``sort()`` method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can\n detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: ``()``\n\n * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n * Using the ``tuple()`` built-in: ``tuple()`` or\n ``tuple(iterable)``\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n argument is given, the constructor creates a new empty tuple,\n ``()``.\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, ``f(a, b, c)`` is a function call with three\n arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n as the sole argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in ``int`` or any object that implements the ``__index__``\n special method). If the *step* argument is omitted, it defaults to\n ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n *step* is zero, ``ValueError`` is raised.\n\n For a positive *step*, the contents of a range ``r`` are determined\n by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n ``r[i] < stop``.\n\n For a negative *step*, the contents of the range are still\n determined by the formula ``r[i] = start + step*i``, but the\n constraints are ``i >= 0`` and ``r[i] > stop``.\n\n A range object will be empty if ``r[0]`` does not meet the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than ``sys.maxsize`` are\n permitted but some features (such as ``len()``) may raise\n ``OverflowError``.\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.abc.Sequence`` ABC, and\nprovide features such as containment tests, element index lookup,\nslicing and support for negative indices (see *Sequence Types ---\nlist, tuple, range*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences. That is, two range objects are considered equal if\nthey represent the same sequence of values. (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n', 'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don't support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n", 'unary': '\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary ``-`` (minus) operator yields the negation of its numeric\nargument.\n\nThe unary ``+`` (plus) operator yields its numeric argument unchanged.\n\nThe unary ``~`` (invert) operator yields the bitwise inversion of its\ninteger argument. The bitwise inversion of ``x`` is defined as\n``-(x+1)``. It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n``TypeError`` exception is raised.\n', 'while': '\nThe ``while`` statement\n***********************\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 19:49:46 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 19:49:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Version_bump_for_3=2E4=2E0?= =?utf-8?b?YTQu?= Message-ID: <3d42Kk3RdZz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/e245b0d7209b changeset: 86573:e245b0d7209b tag: v3.4.0a4 user: Larry Hastings date: Sun Oct 20 02:01:29 2013 -0700 summary: Version bump for 3.4.0a4. files: Include/patchlevel.h | 4 ++-- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 2 +- Misc/RPM/python-3.4.spec | 2 +- README | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 4 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 3 +#define PY_RELEASE_SERIAL 4 /* Version as a string */ -#define PY_VERSION "3.4.0a3+" +#define PY_VERSION "3.4.0a4" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -13,5 +13,5 @@ # Updated automatically by the Python release process. # #--start constants-- -__version__ = "3.4.0a3" +__version__ = "3.4.0a4" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "3.4.0a3" +IDLE_VERSION = "3.4.0a4" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -5,7 +5,7 @@ What's New in Python 3.4.0 Alpha 4? ================================ -Projected release date: 2013-10-20 +Release date: 2013-10-20 Core and Builtins ----------------- diff --git a/Misc/RPM/python-3.4.spec b/Misc/RPM/python-3.4.spec --- a/Misc/RPM/python-3.4.spec +++ b/Misc/RPM/python-3.4.spec @@ -39,7 +39,7 @@ %define name python #--start constants-- -%define version 3.4.0a3 +%define version 3.4.0a4 %define libvers 3.4 #--end constants-- %define release 1pydotorg diff --git a/README b/README --- a/README +++ b/README @@ -1,4 +1,4 @@ -This is Python version 3.4.0 alpha 3 +This is Python version 3.4.0 alpha 4 ==================================== Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 19:49:47 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 19:49:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Added_tag_v3=2E4=2E0a4_for?= =?utf-8?q?_changeset_e245b0d7209b?= Message-ID: <3d42Kl6K5dz7Lm8@mail.python.org> http://hg.python.org/cpython/rev/1572751f6b26 changeset: 86574:1572751f6b26 user: Larry Hastings date: Sun Oct 20 02:02:01 2013 -0700 summary: Added tag v3.4.0a4 for changeset e245b0d7209b files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -118,3 +118,4 @@ 46535f65e7f3bcdcf176f36d34bc1fed719ffd2b v3.4.0a1 9265a2168e2cb2a84785d8717792acc661e6b692 v3.4.0a2 dd9cdf90a5073510877e9dd5112f8e6cf20d5e89 v3.4.0a3 +e245b0d7209bb6d0e19316e1e2af1aa9c2139104 v3.4.0a4 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 19:49:49 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 19:49:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Post-release_updates_for_3?= =?utf-8?b?LjQuMGE0Lg==?= Message-ID: <3d42Kn6Yvzz7Lmj@mail.python.org> http://hg.python.org/cpython/rev/c9574b714e2c changeset: 86575:c9574b714e2c user: Larry Hastings date: Tue Oct 22 10:44:35 2013 -0700 summary: Post-release updates for 3.4.0a4. files: Include/patchlevel.h | 2 +- Misc/NEWS | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 4 /* Version as a string */ -#define PY_VERSION "3.4.0a4" +#define PY_VERSION "3.4.0a4+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,18 @@ Python News +++++++++++ +What's New in Python 3.4.0 Beta 1? +================================ + +Projected release date: 2013-11-24 + +Core and Builtins +----------------- + +Library +------- + + What's New in Python 3.4.0 Alpha 4? ================================ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 19:49:54 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 19:49:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_3=2E4=2E0a4_release_head_back_into_trunk=2E?= Message-ID: <3d42Kt2RYsz7LmC@mail.python.org> http://hg.python.org/cpython/rev/0917f6c62c62 changeset: 86576:0917f6c62c62 parent: 86575:c9574b714e2c parent: 86571:64d94b21e731 user: Larry Hastings date: Tue Oct 22 10:49:20 2013 -0700 summary: Merge 3.4.0a4 release head back into trunk. files: Doc/library/aifc.rst | 4 +- Doc/library/collections.rst | 13 - Doc/library/ctypes.rst | 4 +- Doc/library/faulthandler.rst | 3 +- Doc/library/ipaddress.rst | 7 +- Doc/library/resource.rst | 67 + Doc/library/statistics.rst | 340 +- Doc/library/string.rst | 12 +- Doc/library/zipfile.rst | 10 +- Doc/whatsnew/3.4.rst | 22 +- Lib/asyncio/test_utils.py | 1 + Lib/asyncio/unix_events.py | 79 +- Lib/ftplib.py | 15 +- Lib/hashlib.py | 41 +- Lib/importlib/_bootstrap.py | 3 +- Lib/inspect.py | 55 +- Lib/ipaddress.py | 76 +- Lib/json/__init__.py | 5 + Lib/platform.py | 19 +- Lib/pydoc.py | 7 +- Lib/telnetlib.py | 273 +- Lib/test/test_asyncio/test_base_events.py | 6 + Lib/test/test_asyncio/test_events.py | 38 +- Lib/test/test_asyncio/test_proactor_events.py | 4 + Lib/test/test_asyncio/test_selector_events.py | 4 + Lib/test/test_asyncio/test_selectors.py | 4 + Lib/test/test_asyncio/test_transports.py | 4 + Lib/test/test_asyncio/test_unix_events.py | 13 +- Lib/test/test_asyncio/test_windows_events.py | 4 + Lib/test/test_asyncio/test_windows_utils.py | 4 + Lib/test/test_audioop.py | 29 +- Lib/test/test_descr.py | 4 +- Lib/test/test_enum.py | 117 +- Lib/test/test_faulthandler.py | 18 +- Lib/test/test_ftplib.py | 22 +- Lib/test/test_funcattrs.py | 5 +- Lib/test/test_hashlib.py | 35 +- Lib/test/test_inspect.py | 20 +- Lib/test/test_ipaddress.py | 9 + Lib/test/test_json/test_decode.py | 23 +- Lib/test/test_platform.py | 13 + Lib/test/test_pydoc.py | 192 + Lib/test/test_re.py | 22 + Lib/test/test_resource.py | 25 + Lib/test/test_telnetlib.py | 101 +- Lib/test/test_zipfile.py | 208 +- Lib/zipfile.py | 170 +- Misc/ACKS | 1 + Misc/NEWS | 39 +- Modules/_hashopenssl.c | 14 +- Modules/_sha3/sha3module.c | 10 +- Modules/_sre.c | 18 +- Modules/md5module.c | 11 +- Modules/resource.c | 134 +- Modules/sha1module.c | 11 +- Modules/sha256module.c | 14 +- Modules/sha512module.c | 13 +- Modules/zlib/ChangeLog | 266 ++- Modules/zlib/FAQ | 12 +- Modules/zlib/INDEX | 13 +- Modules/zlib/Makefile.in | 111 +- Modules/zlib/README | 24 +- Modules/zlib/adler32.c | 70 +- Modules/zlib/algorithm.txt | 4 +- Modules/zlib/compress.c | 2 +- Modules/zlib/configure | 571 +++- Modules/zlib/crc32.c | 83 +- Modules/zlib/crc32.h | 2 +- Modules/zlib/deflate.c | 265 +- Modules/zlib/deflate.h | 12 +- Modules/zlib/example.c | 90 +- Modules/zlib/gzguts.h | 103 +- Modules/zlib/gzio.c | 1026 ---------- Modules/zlib/gzlib.c | 205 +- Modules/zlib/gzread.c | 431 +-- Modules/zlib/gzwrite.c | 334 +- Modules/zlib/infback.c | 16 +- Modules/zlib/inffast.c | 6 +- Modules/zlib/inffixed.h | 6 +- Modules/zlib/inflate.c | 156 +- Modules/zlib/inftrees.c | 54 +- Modules/zlib/inftrees.h | 2 +- Modules/zlib/make_vms.com | 405 ++- Modules/zlib/minigzip.c | 213 ++- Modules/zlib/trees.c | 54 +- Modules/zlib/uncompr.c | 2 +- Modules/zlib/zconf.h | 201 +- Modules/zlib/zconf.h.cmakein | 201 +- Modules/zlib/zconf.h.in | 201 +- Modules/zlib/zconf.in.h | 332 --- Modules/zlib/zlib.3 | 18 +- Modules/zlib/zlib.h | 343 ++- Modules/zlib/zlib.map | 15 + Modules/zlib/zutil.c | 26 +- Modules/zlib/zutil.h | 103 +- PC/VS9.0/pythoncore.vcproj | 68 - Python/compile.c | 155 +- Python/importlib.h | 270 +- Python/pythonrun.c | 4 + Python/traceback.c | 16 +- configure | 29 + configure.ac | 10 + pyconfig.h.in | 3 + 103 files changed, 4907 insertions(+), 4041 deletions(-) diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -30,8 +30,8 @@ sampled. The number of channels indicate if the audio is mono, stereo, or quadro. Each frame consists of one sample per channel. The sample size is the size in bytes of each sample. Thus a frame consists of -*nchannels*\*\ *samplesize* bytes, and a second's worth of audio consists of -*nchannels*\*\ *samplesize*\*\ *framerate* bytes. +``nchannels * samplesize`` bytes, and a second's worth of audio consists of +``nchannels * samplesize * framerate`` bytes. For example, CD quality audio has a sample size of two bytes (16 bits), uses two channels (stereo) and has a frame rate of 44,100 frames/second. This gives a diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -374,10 +374,6 @@ .. seealso:: - * `Counter class `_ - adapted for Python 2.5 and an early `Bag recipe - `_ for Python 2.4. - * `Bag class `_ in Smalltalk. @@ -920,11 +916,6 @@ >>> class Status: open, pending, closed = range(3) -.. seealso:: - - * `Named tuple recipe `_ - adapted for Python 2.4. - * `Recipe for named tuple abstract base class with a metaclass mix-in `_ by Jan Kaliszewski. Besides providing an :term:`abstract base class` for @@ -987,10 +978,6 @@ keyword arguments, but their order is lost because Python's function call semantics pass-in keyword arguments using a regular unordered dictionary. -.. seealso:: - - `Equivalent OrderedDict recipe `_ - that runs on Python 2.4 or later. :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1909,8 +1909,8 @@ .. function:: sizeof(obj_or_type) - Returns the size in bytes of a ctypes type or instance memory buffer. Does the - same as the C ``sizeof()`` function. + Returns the size in bytes of a ctypes type or instance memory buffer. + Does the same as the C ``sizeof`` operator. .. function:: string_at(address, size=-1) diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -27,6 +27,7 @@ * Only the filename, the function name and the line number are displayed. (no source code) * It is limited to 100 frames and 100 threads. +* The order is reversed: the most recent call is shown first. By default, the Python traceback is written to :data:`sys.stderr`. To see tracebacks, applications must be run in the terminal. A log file can @@ -129,7 +130,7 @@ >>> ctypes.string_at(0) Fatal Python error: Segmentation fault - Current thread 0x00007fb899f39700: + Current thread 0x00007fb899f39700 (most recent call first): File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at File "", line 1 in Segmentation fault diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -158,10 +158,13 @@ ``True`` if the address is reserved for multicast use. See :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6). - .. attribute:: is_private + .. attribute:: is_global ``True`` if the address is allocated for private networks. See - :RFC:`1918` (for IPv4) or :RFC:`4193` (for IPv6). + iana-ipv4-special-registry (for IPv4) or iana-ipv6-special-registry + (for IPv6). + + .. versionadded:: 3.4 .. attribute:: is_unspecified diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -74,6 +74,27 @@ ``setrlimit`` may also raise :exc:`error` if the underlying system call fails. +.. function:: prlimit(pid, resource[, limits]) + + Combines :func:`setrlimit` and :func:`getrlimit` in one function and + supports to get and set the resources limits of an arbitrary process. If + *pid* is 0, then the call applies to the current process. *resource* and + *limits* have the same meaning as in :func:`setrlimit`, except that + *limits* is optional. + + When *limits* is not given the function returns the *resource* limit of the + process *pid*. When *limits* is given the *resource* limit of the process is + set and the former resource limit is returned. + + Raises :exc:`ProcessLookupError` when *pid* can't be found and + :exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for + the process. + + Availability: Linux (glibc 2.13+) + + .. versionadded:: 3.4 + + These symbols define resources whose consumption can be controlled using the :func:`setrlimit` and :func:`getrlimit` functions described below. The values of these symbols are exactly the constants used by C programs. @@ -151,6 +172,52 @@ The maximum area (in bytes) of address space which may be taken by the process. +.. data:: RLIMIT_MSGQUEUE + + The number of bytes that can be allocated for POSIX message queues. + + Availability: Linux 2.6.8 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_NICE + + The ceiling for the process's nice level (calculated as 20 - rlim_cur). + + Availability: Linux 2.6.12 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_RTPRIO + + The ceiling of the real-time priority. + + Availability: Linux 2.6.12 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_RTTIME + + The time limit (in microseconds) on CPU time that a process can spend + under real-time scheduling without making a blocking syscall. + + Availability: Linux 2.6.25 or later. + + .. versionadded:: 3.4 + + +.. data:: RLIMIT_SIGPENDING + + The number of signals which the process may queue. + + Availability: Linux 2.6.8 or later. + + .. versionadded:: 3.4 + + Resource Usage -------------- diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -35,21 +35,34 @@ :func:`mode` Mode (most common value) of discrete data. ======================= ============================================= -:func:`mean` -~~~~~~~~~~~~ +Measures of spread +------------------ -The :func:`mean` function calculates the arithmetic mean, commonly known -as the average, of its iterable argument: +These functions calculate a measure of how much the population or sample +tends to deviate from the typical or average values. + +======================= ============================================= +:func:`pstdev` Population standard deviation of data. +:func:`pvariance` Population variance of data. +:func:`stdev` Sample standard deviation of data. +:func:`variance` Sample variance of data. +======================= ============================================= + + +Function details +---------------- .. function:: mean(data) - Return the sample arithmetic mean of *data*, a sequence or iterator - of real-valued numbers. + Return the sample arithmetic mean of *data*, a sequence or iterator of + real-valued numbers. - The arithmetic mean is the sum of the data divided by the number of - data points. It is commonly called "the average", although it is only - one of many different mathematical averages. It is a measure of the - central location of the data. + The arithmetic mean is the sum of the data divided by the number of data + points. It is commonly called "the average", although it is only one of many + different mathematical averages. It is a measure of the central location of + the data. + + If *data* is empty, :exc:`StatisticsError` will be raised. Some examples of use: @@ -70,75 +83,56 @@ .. note:: - The mean is strongly effected by outliers and is not a robust - estimator for central location: the mean is not necessarily a - typical example of the data points. For more robust, although less - efficient, measures of central location, see :func:`median` and - :func:`mode`. (In this case, "efficient" refers to statistical - efficiency rather than computational efficiency.) + The mean is strongly affected by outliers and is not a robust estimator + for central location: the mean is not necessarily a typical example of the + data points. For more robust, although less efficient, measures of + central location, see :func:`median` and :func:`mode`. (In this case, + "efficient" refers to statistical efficiency rather than computational + efficiency.) - The sample mean gives an unbiased estimate of the true population - mean, which means that, taken on average over all the possible - samples, ``mean(sample)`` converges on the true mean of the entire - population. If *data* represents the entire population rather than - a sample, then ``mean(data)`` is equivalent to calculating the true - population mean ??. + The sample mean gives an unbiased estimate of the true population mean, + which means that, taken on average over all the possible samples, + ``mean(sample)`` converges on the true mean of the entire population. If + *data* represents the entire population rather than a sample, then + ``mean(data)`` is equivalent to calculating the true population mean ??. - If ``data`` is empty, :exc:`StatisticsError` will be raised. - -:func:`median` -~~~~~~~~~~~~~~ - -The :func:`median` function calculates the median, or middle, data point, -using the common "mean of middle two" method. - - .. seealso:: - - :func:`median_low` - - :func:`median_high` - - :func:`median_grouped` .. function:: median(data) - Return the median (middle value) of numeric data. + Return the median (middle value) of numeric data, using the common "mean of + middle two" method. If *data* is empty, :exc:`StatisticsError` is raised. - The median is a robust measure of central location, and is less affected - by the presence of outliers in your data. When the number of data points - is odd, the middle data point is returned: + The median is a robust measure of central location, and is less affected by + the presence of outliers in your data. When the number of data points is + odd, the middle data point is returned: .. doctest:: >>> median([1, 3, 5]) 3 - When the number of data points is even, the median is interpolated by - taking the average of the two middle values: + When the number of data points is even, the median is interpolated by taking + the average of the two middle values: .. doctest:: >>> median([1, 3, 5, 7]) 4.0 - This is suited for when your data is discrete, and you don't mind that - the median may not be an actual data point. + This is suited for when your data is discrete, and you don't mind that the + median may not be an actual data point. - If data is empty, :exc:`StatisticsError` is raised. + .. seealso:: :func:`median_low`, :func:`median_high`, :func:`median_grouped` -:func:`median_low` -~~~~~~~~~~~~~~~~~~ - -The :func:`median_low` function calculates the low median without -interpolation. .. function:: median_low(data) - Return the low median of numeric data. + Return the low median of numeric data. If *data* is empty, + :exc:`StatisticsError` is raised. - The low median is always a member of the data set. When the number - of data points is odd, the middle value is returned. When it is - even, the smaller of the two middle values is returned. + The low median is always a member of the data set. When the number of data + points is odd, the middle value is returned. When it is even, the smaller of + the two middle values is returned. .. doctest:: @@ -147,24 +141,18 @@ >>> median_low([1, 3, 5, 7]) 3 - Use the low median when your data are discrete and you prefer the median - to be an actual data point rather than interpolated. + Use the low median when your data are discrete and you prefer the median to + be an actual data point rather than interpolated. - If data is empty, :exc:`StatisticsError` is raised. - -:func:`median_high` -~~~~~~~~~~~~~~~~~~~ - -The :func:`median_high` function calculates the high median without -interpolation. .. function:: median_high(data) - Return the high median of data. + Return the high median of data. If *data* is empty, :exc:`StatisticsError` + is raised. - The high median is always a member of the data set. When the number of - data points is odd, the middle value is returned. When it is even, the - larger of the two middle values is returned. + The high median is always a member of the data set. When the number of data + points is odd, the middle value is returned. When it is even, the larger of + the two middle values is returned. .. doctest:: @@ -173,41 +161,34 @@ >>> median_high([1, 3, 5, 7]) 5 - Use the high median when your data are discrete and you prefer the median - to be an actual data point rather than interpolated. + Use the high median when your data are discrete and you prefer the median to + be an actual data point rather than interpolated. - If data is empty, :exc:`StatisticsError` is raised. -:func:`median_grouped` -~~~~~~~~~~~~~~~~~~~~~~ +.. function:: median_grouped(data, interval=1) -The :func:`median_grouped` function calculates the median of grouped data -as the 50th percentile, using interpolation. - -.. function:: median_grouped(data [, interval]) - - Return the median of grouped continuous data, calculated as the - 50th percentile. + Return the median of grouped continuous data, calculated as the 50th + percentile, using interpolation. If *data* is empty, :exc:`StatisticsError` + is raised. .. doctest:: >>> median_grouped([52, 52, 53, 54]) 52.5 - In the following example, the data are rounded, so that each value - represents the midpoint of data classes, e.g. 1 is the midpoint of the - class 0.5-1.5, 2 is the midpoint of 1.5-2.5, 3 is the midpoint of - 2.5-3.5, etc. With the data given, the middle value falls somewhere in - the class 3.5-4.5, and interpolation is used to estimate it: + In the following example, the data are rounded, so that each value represents + the midpoint of data classes, e.g. 1 is the midpoint of the class 0.5-1.5, 2 + is the midpoint of 1.5-2.5, 3 is the midpoint of 2.5-3.5, etc. With the data + given, the middle value falls somewhere in the class 3.5-4.5, and + interpolation is used to estimate it: .. doctest:: >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) 3.7 - Optional argument ``interval`` represents the class interval, and - defaults to 1. Changing the class interval naturally will change the - interpolation: + Optional argument *interval* represents the class interval, and defaults + to 1. Changing the class interval naturally will change the interpolation: .. doctest:: @@ -217,36 +198,34 @@ 3.5 This function does not check whether the data points are at least - ``interval`` apart. + *interval* apart. .. impl-detail:: - Under some circumstances, :func:`median_grouped` may coerce data - points to floats. This behaviour is likely to change in the future. + Under some circumstances, :func:`median_grouped` may coerce data points to + floats. This behaviour is likely to change in the future. .. seealso:: - * "Statistics for the Behavioral Sciences", Frederick J Gravetter - and Larry B Wallnau (8th Edition). + * "Statistics for the Behavioral Sciences", Frederick J Gravetter and + Larry B Wallnau (8th Edition). * Calculating the `median `_. - * The `SSMEDIAN `_ - function in the Gnome Gnumeric spreadsheet, including - `this discussion `_. + * The `SSMEDIAN + `_ + function in the Gnome Gnumeric spreadsheet, including `this discussion + `_. - If data is empty, :exc:`StatisticsError` is raised. - -:func:`mode` -~~~~~~~~~~~~ - -The :func:`mode` function calculates the mode, or most common element, of -discrete or nominal data. The mode (when it exists) is the most typical -value, and is a robust measure of central location. .. function:: mode(data) - Return the most common data point from discrete or nominal data. + Return the most common data point from discrete or nominal *data*. The mode + (when it exists) is the most typical value, and is a robust measure of + central location. + + If *data* is empty, or if there is not exactly one most common value, + :exc:`StatisticsError` is raised. ``mode`` assumes discrete data, and returns a single value. This is the standard treatment of the mode as commonly taught in schools: @@ -264,60 +243,35 @@ >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' - If data is empty, or if there is not exactly one most common value, - :exc:`StatisticsError` is raised. -Measures of spread ------------------- +.. function:: pstdev(data, mu=None) -These functions calculate a measure of how much the population or sample -tends to deviate from the typical or average values. - -======================= ============================================= -:func:`pstdev` Population standard deviation of data. -:func:`pvariance` Population variance of data. -:func:`stdev` Sample standard deviation of data. -:func:`variance` Sample variance of data. -======================= ============================================= - -:func:`pstdev` -~~~~~~~~~~~~~~ - -The :func:`pstdev` function calculates the standard deviation of a -population. The standard deviation is equivalent to the square root of -the variance. - -.. function:: pstdev(data [, mu]) - - Return the square root of the population variance. See :func:`pvariance` - for arguments and other details. + Return the population standard deviation (the square root of the population + variance). See :func:`pvariance` for arguments and other details. .. doctest:: >>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 0.986893273527251 -:func:`pvariance` -~~~~~~~~~~~~~~~~~ -The :func:`pvariance` function calculates the variance of a population. -Variance, or second moment about the mean, is a measure of the variability -(spread or dispersion) of data. A large variance indicates that the data is -spread out; a small variance indicates it is clustered closely around the -mean. +.. function:: pvariance(data, mu=None) -.. function:: pvariance(data [, mu]) + Return the population variance of *data*, a non-empty iterable of real-valued + numbers. Variance, or second moment about the mean, is a measure of the + variability (spread or dispersion) of data. A large variance indicates that + the data is spread out; a small variance indicates it is clustered closely + around the mean. - Return the population variance of *data*, a non-empty iterable of - real-valued numbers. - - If the optional second argument *mu* is given, it should be the mean - of *data*. If it is missing or None (the default), the mean is + If the optional second argument *mu* is given, it should be the mean of + *data*. If it is missing or ``None`` (the default), the mean is automatically calculated. - Use this function to calculate the variance from the entire population. - To estimate the variance from a sample, the :func:`variance` function is - usually a better choice. + Use this function to calculate the variance from the entire population. To + estimate the variance from a sample, the :func:`variance` function is usually + a better choice. + + Raises :exc:`StatisticsError` if *data* is empty. Examples: @@ -327,8 +281,8 @@ >>> pvariance(data) 1.25 - If you have already calculated the mean of your data, you can pass - it as the optional second argument *mu* to avoid recalculation: + If you have already calculated the mean of your data, you can pass it as the + optional second argument *mu* to avoid recalculation: .. doctest:: @@ -336,9 +290,9 @@ >>> pvariance(data, mu) 1.25 - This function does not attempt to verify that you have passed the actual - mean as *mu*. Using arbitrary values for *mu* may lead to invalid or - impossible results. + This function does not attempt to verify that you have passed the actual mean + as *mu*. Using arbitrary values for *mu* may lead to invalid or impossible + results. Decimals and Fractions are supported: @@ -354,53 +308,44 @@ .. note:: - When called with the entire population, this gives the population - variance ????. When called on a sample instead, this is the biased - sample variance s??, also known as variance with N degrees of freedom. + When called with the entire population, this gives the population variance + ????. When called on a sample instead, this is the biased sample variance + s??, also known as variance with N degrees of freedom. - If you somehow know the true population mean ??, you may use this - function to calculate the variance of a sample, giving the known - population mean as the second argument. Provided the data points are - representative (e.g. independent and identically distributed), the - result will be an unbiased estimate of the population variance. + If you somehow know the true population mean ??, you may use this function + to calculate the variance of a sample, giving the known population mean as + the second argument. Provided the data points are representative + (e.g. independent and identically distributed), the result will be an + unbiased estimate of the population variance. - Raises :exc:`StatisticsError` if *data* is empty. -:func:`stdev` -~~~~~~~~~~~~~~ +.. function:: stdev(data, xbar=None) -The :func:`stdev` function calculates the standard deviation of a sample. -The standard deviation is equivalent to the square root of the variance. - -.. function:: stdev(data [, xbar]) - - Return the square root of the sample variance. See :func:`variance` for - arguments and other details. + Return the sample standard deviation (the square root of the sample + variance). See :func:`variance` for arguments and other details. .. doctest:: >>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 1.0810874155219827 -:func:`variance` -~~~~~~~~~~~~~~~~~ -The :func:`variance` function calculates the variance of a sample. Variance, -or second moment about the mean, is a measure of the variability (spread or -dispersion) of data. A large variance indicates that the data is spread out; -a small variance indicates it is clustered closely around the mean. +.. function:: variance(data, xbar=None) -.. function:: variance(data [, xbar]) + Return the sample variance of *data*, an iterable of at least two real-valued + numbers. Variance, or second moment about the mean, is a measure of the + variability (spread or dispersion) of data. A large variance indicates that + the data is spread out; a small variance indicates it is clustered closely + around the mean. - Return the sample variance of *data*, an iterable of at least two - real-valued numbers. - - If the optional second argument *xbar* is given, it should be the mean - of *data*. If it is missing or None (the default), the mean is + If the optional second argument *xbar* is given, it should be the mean of + *data*. If it is missing or ``None`` (the default), the mean is automatically calculated. - Use this function when your data is a sample from a population. To - calculate the variance from the entire population, see :func:`pvariance`. + Use this function when your data is a sample from a population. To calculate + the variance from the entire population, see :func:`pvariance`. + + Raises :exc:`StatisticsError` if *data* has fewer than two values. Examples: @@ -410,8 +355,8 @@ >>> variance(data) 1.3720238095238095 - If you have already calculated the mean of your data, you can pass - it as the optional second argument *xbar* to avoid recalculation: + If you have already calculated the mean of your data, you can pass it as the + optional second argument *xbar* to avoid recalculation: .. doctest:: @@ -419,8 +364,8 @@ >>> variance(data, m) 1.3720238095238095 - This function does not attempt to verify that you have passed the actual - mean as *xbar*. Using arbitrary values for *xbar* can lead to invalid or + This function does not attempt to verify that you have passed the actual mean + as *xbar*. Using arbitrary values for *xbar* can lead to invalid or impossible results. Decimal and Fraction values are supported: @@ -437,26 +382,23 @@ .. note:: - This is the sample variance s?? with Bessel's correction, also known - as variance with N-1 degrees of freedom. Provided that the data - points are representative (e.g. independent and identically - distributed), the result should be an unbiased estimate of the true - population variance. + This is the sample variance s?? with Bessel's correction, also known as + variance with N-1 degrees of freedom. Provided that the data points are + representative (e.g. independent and identically distributed), the result + should be an unbiased estimate of the true population variance. - If you somehow know the actual population mean ?? you should pass it - to the :func:`pvariance` function as the *mu* parameter to get - the variance of a sample. - - Raises :exc:`StatisticsError` if *data* has fewer than two values. + If you somehow know the actual population mean ?? you should pass it to the + :func:`pvariance` function as the *mu* parameter to get the variance of a + sample. Exceptions ---------- A single exception is defined: -:exc:`StatisticsError` +.. exception:: StatisticsError -Subclass of :exc:`ValueError` for statistics-related exceptions. + Subclass of :exc:`ValueError` for statistics-related exceptions. .. # This modelines must appear within the last ten lines of the file. diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -293,18 +293,18 @@ .. productionlist:: sf format_spec: [[`fill`]`align`][`sign`][#][0][`width`][,][.`precision`][`type`] - fill: + fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " width: `integer` precision: `integer` type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" -The *fill* character can be any character other than '{' or '}'. The presence -of a fill character is signaled by the character following it, which must be -one of the alignment options. If the second character of *format_spec* is not -a valid alignment option, then it is assumed that both the fill character and -the alignment option are absent. +If a valid *align* value is specified, it can be preceeded by a *fill* +character that can be any character and defaults to a space if omitted. +Note that it is not possible to use ``{`` and ``}`` as *fill* char while +using the :meth:`str.format` method; this limitation however doesn't +affect the :func:`format` function. The meaning of the various alignment options is as follows: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -382,7 +382,7 @@ Instances have one method in addition to those of :class:`ZipFile` objects: - .. method:: PyZipFile.writepy(pathname, basename='') + .. method:: PyZipFile.writepy(pathname, basename='', filterfunc=None) Search for files :file:`\*.py` and add the corresponding file to the archive. @@ -404,7 +404,10 @@ package directory, then all :file:`\*.py[co]` are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. *basename* is intended for internal - use only. The :meth:`writepy` method makes archives with file names like + use only. When *filterfunc(pathname)* is given, it will be called for every + invocation. When it returns a False value, that path and its subpaths will + be ignored. + The :meth:`writepy` method makes archives with file names like this:: string.pyc # Top level name @@ -413,6 +416,9 @@ test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile + .. versionadded:: 3.4 + The *filterfunc* parameter. + .. _zipinfo-objects: diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -271,7 +271,7 @@ statement. (Contributed by Raymond Hettinger in :issue:`15806` and Zero Piraeus in :issue:`19266`) -The new :class:`contextlib.redirect_stdio` context manager makes it easier +The new :func:`contextlib.redirect_stdout` context manager makes it easier for utility scripts to handle inflexible APIs that don't provide any options to retrieve their output as a string or direct it to somewhere other than :data:`sys.stdout`. In conjunction with :class:`io.StringIO`, @@ -434,10 +434,16 @@ pprint ------ -The :mod::`pprint` module now supports *compact* mode for formatting long +The :mod:`pprint` module now supports *compact* mode for formatting long sequences (:issue:`19132`). +resource +-------- + +New :func:`resource.prlimit` function and Linux specific constants. +(Contributed by Christian Heimes in :issue:`16595` and :issue:`19324`.) + smtplib ------- @@ -564,6 +570,16 @@ (Contributed by Antoine Pitrou in :issue:`17741`.) + +zipfile.PyZipfile +----------------- + +Add a filter function to ignore some packages (tests for instance), +:meth:`~zipfile.PyZipFile.writepy`. + +(Contributed by Christian Tismer in :issue:`19274`.) + + Other improvements ================== @@ -597,7 +613,7 @@ LINEAR_PROBES to be any value. Set LINEAR_PROBES=0 to turn-off linear probing entirely. - (Contributed by Raymond Hettinger in :issue"`18771`.) + (Contributed by Raymond Hettinger in :issue:`18771`.) * The interpreter starts about 30% faster. A couple of measures lead to the speedup. The interpreter loads fewer modules on startup, e.g. the :mod:`re`, diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -126,6 +126,7 @@ yield httpd finally: httpd.shutdown() + httpd.server_close() server_thread.join() diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -3,7 +3,6 @@ import collections import errno import fcntl -import functools import os import signal import socket @@ -167,23 +166,29 @@ def _sig_chld(self): try: - try: - pid, status = os.waitpid(0, os.WNOHANG) - except ChildProcessError: - return - if pid == 0: - self.call_soon(self._sig_chld) - return - elif os.WIFSIGNALED(status): - returncode = -os.WTERMSIG(status) - elif os.WIFEXITED(status): - returncode = os.WEXITSTATUS(status) - else: - self.call_soon(self._sig_chld) - return - transp = self._subprocesses.get(pid) - if transp is not None: - transp._process_exited(returncode) + # Because of signal coalescing, we must keep calling waitpid() as + # long as we're able to reap a child. + while True: + try: + pid, status = os.waitpid(-1, os.WNOHANG) + except ChildProcessError: + break # No more child processes exist. + if pid == 0: + break # All remaining child processes are still alive. + elif os.WIFSIGNALED(status): + # A child process died because of a signal. + returncode = -os.WTERMSIG(status) + elif os.WIFEXITED(status): + # A child process exited (e.g. sys.exit()). + returncode = os.WEXITSTATUS(status) + else: + # A child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + returncode = status + transp = self._subprocesses.get(pid) + if transp is not None: + transp._process_exited(returncode) except Exception: logger.exception('Unknown exception in SIGCHLD handler') @@ -208,6 +213,9 @@ self._loop = loop self._pipe = pipe self._fileno = pipe.fileno() + mode = os.fstat(self._fileno).st_mode + if not (stat.S_ISFIFO(mode) or stat.S_ISSOCK(mode)): + raise ValueError("Pipe transport is for pipes/sockets only.") _set_nonblocking(self._fileno) self._protocol = protocol self._closing = False @@ -270,21 +278,29 @@ self._loop = loop self._pipe = pipe self._fileno = pipe.fileno() - if not stat.S_ISFIFO(os.fstat(self._fileno).st_mode): - raise ValueError("Pipe transport is for pipes only.") + mode = os.fstat(self._fileno).st_mode + is_socket = stat.S_ISSOCK(mode) + is_pipe = stat.S_ISFIFO(mode) + if not (is_socket or is_pipe): + raise ValueError("Pipe transport is for pipes/sockets only.") _set_nonblocking(self._fileno) self._protocol = protocol self._buffer = [] self._conn_lost = 0 self._closing = False # Set when close() or write_eof() called. - self._loop.add_reader(self._fileno, self._read_ready) + + # On AIX, the reader trick only works for sockets. + # On other platforms it works for pipes and sockets. + # (Exception: OS X 10.4? Issue #19294.) + if is_socket or not sys.platform.startswith("aix"): + self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: self._loop.call_soon(waiter.set_result, None) def _read_ready(self): - # pipe was closed by peer + # Pipe was closed by peer. self._close() def write(self, data): @@ -430,8 +446,15 @@ self._loop = loop self._pipes = {} + stdin_w = None if stdin == subprocess.PIPE: self._pipes[STDIN] = None + # Use a socket pair for stdin, since not all platforms + # support selecting read events on the write end of a + # socket (which we use in order to detect closing of the + # other end). Notably this is needed on AIX, and works + # just fine on other platforms. + stdin, stdin_w = self._loop._socketpair() if stdout == subprocess.PIPE: self._pipes[STDOUT] = None if stderr == subprocess.PIPE: @@ -443,6 +466,9 @@ self._proc = subprocess.Popen( args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, universal_newlines=False, bufsize=bufsize, **kwargs) + if stdin_w is not None: + stdin.close() + self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize) self._extra['subprocess'] = self._proc def close(self): @@ -478,18 +504,15 @@ loop = self._loop if proc.stdin is not None: transp, proto = yield from loop.connect_write_pipe( - functools.partial( - _UnixWriteSubprocessPipeProto, self, STDIN), + lambda: _UnixWriteSubprocessPipeProto(self, STDIN), proc.stdin) if proc.stdout is not None: transp, proto = yield from loop.connect_read_pipe( - functools.partial( - _UnixReadSubprocessPipeProto, self, STDOUT), + lambda: _UnixReadSubprocessPipeProto(self, STDOUT), proc.stdout) if proc.stderr is not None: transp, proto = yield from loop.connect_read_pipe( - functools.partial( - _UnixReadSubprocessPipeProto, self, STDERR), + lambda: _UnixReadSubprocessPipeProto(self, STDERR), proc.stderr) if not self._pipes: self._try_connected() diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -50,6 +50,8 @@ # The standard FTP server control port FTP_PORT = 21 +# The sizehint parameter passed to readline() calls +MAXLINE = 8192 # Exception raised when an error or invalid response is received @@ -97,6 +99,7 @@ debugging = 0 host = '' port = FTP_PORT + maxline = MAXLINE sock = None file = None welcome = None @@ -197,7 +200,9 @@ # Internal: return one line from the server, stripping CRLF. # Raise EOFError if the connection is closed def getline(self): - line = self.file.readline() + line = self.file.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 1: print('*get*', self.sanitize(line)) if not line: @@ -463,7 +468,9 @@ with self.transfercmd(cmd) as conn, \ conn.makefile('r', encoding=self.encoding) as fp: while 1: - line = fp.readline() + line = fp.readline(self.maxline + 1) + if len(line) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if self.debugging > 2: print('*retr*', repr(line)) if not line: @@ -522,7 +529,9 @@ self.voidcmd('TYPE A') with self.transfercmd(cmd) as conn: while 1: - buf = fp.readline() + buf = fp.readline(self.maxline + 1) + if len(buf) > self.maxline: + raise Error("got more than %d bytes" % self.maxline) if not buf: break if buf[-2:] != B_CRLF: diff --git a/Lib/hashlib.py b/Lib/hashlib.py --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -64,43 +64,42 @@ 'algorithms_available', 'pbkdf2_hmac') +__builtin_constructor_cache = {} + def __get_builtin_constructor(name): + cache = __builtin_constructor_cache + constructor = cache.get(name) + if constructor is not None: + return constructor try: if name in ('SHA1', 'sha1'): import _sha1 - return _sha1.sha1 + cache['SHA1'] = cache['sha1'] = _sha1.sha1 elif name in ('MD5', 'md5'): import _md5 - return _md5.md5 + cache['MD5'] = cache['md5'] = _md5.md5 elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): import _sha256 - bs = name[3:] - if bs == '256': - return _sha256.sha256 - elif bs == '224': - return _sha256.sha224 + cache['SHA224'] = cache['sha224'] = _sha256.sha224 + cache['SHA256'] = cache['sha256'] = _sha256.sha256 elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): import _sha512 - bs = name[3:] - if bs == '512': - return _sha512.sha512 - elif bs == '384': - return _sha512.sha384 + cache['SHA384'] = cache['sha384'] = _sha512.sha384 + cache['SHA512'] = cache['sha512'] = _sha512.sha512 elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512'}: import _sha3 - bs = name[5:] - if bs == '224': - return _sha3.sha3_224 - elif bs == '256': - return _sha3.sha3_256 - elif bs == '384': - return _sha3.sha3_384 - elif bs == '512': - return _sha3.sha3_512 + cache['SHA3_224'] = cache['sha3_224'] = _sha3.sha3_224 + cache['SHA3_256'] = cache['sha3_256'] = _sha3.sha3_256 + cache['SHA3_384'] = cache['sha3_384'] = _sha3.sha3_384 + cache['SHA3_512'] = cache['sha3_512'] = _sha3.sha3_512 except ImportError: pass # no extension module, this hash is unsupported. + constructor = cache.get(name) + if constructor is not None: + return constructor + raise ValueError('unsupported hash type ' + name) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -370,12 +370,13 @@ # Python 3.4a1 3270 (various tweaks to the __class__ closure) # Python 3.4a1 3280 (remove implicit class argument) # Python 3.4a4 3290 (changes to __qualname__ computation) +# Python 3.4a4 3300 (more changes to __qualname__ computation) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually # due to the addition of new opcodes). -MAGIC_NUMBER = (3290).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3300).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -269,9 +269,9 @@ results = [] processed = set() names = dir(object) - # add any virtual attributes to the list of names if object is a class + # :dd any DynamicClassAttributes to the list of names if object is a class; # this may result in duplicate entries if, for example, a virtual - # attribute with the same name as a member property exists + # attribute with the same name as a DynamicClassAttribute exists try: for base in object.__bases__: for k, v in base.__dict__.items(): @@ -329,79 +329,88 @@ If one of the items in dir(cls) is stored in the metaclass it will now be discovered and not have None be listed as the class in which it was - defined. + defined. Any items whose home class cannot be discovered are skipped. """ mro = getmro(cls) metamro = getmro(type(cls)) # for attributes stored in the metaclass metamro = tuple([cls for cls in metamro if cls not in (type, object)]) - possible_bases = (cls,) + mro + metamro + class_bases = (cls,) + mro + all_bases = class_bases + metamro names = dir(cls) - # add any virtual attributes to the list of names + # :dd any DynamicClassAttributes to the list of names; # this may result in duplicate entries if, for example, a virtual - # attribute with the same name as a member property exists + # attribute with the same name as a DynamicClassAttribute exists. for base in mro: for k, v in base.__dict__.items(): if isinstance(v, types.DynamicClassAttribute): names.append(k) result = [] processed = set() - sentinel = object() + for name in names: # Get the object associated with the name, and where it was defined. # Normal objects will be looked up with both getattr and directly in # its class' dict (in case getattr fails [bug #1785], and also to look # for a docstring). - # For VirtualAttributes on the second pass we only look in the + # For DynamicClassAttributes on the second pass we only look in the # class's dict. # # Getting an obj from the __dict__ sometimes reveals more than # using getattr. Static and class methods are dramatic examples. homecls = None - get_obj = sentinel - dict_obj = sentinel + get_obj = None + dict_obj = None if name not in processed: try: if name == '__dict__': - raise Exception("__dict__ is special, we don't want the proxy") + raise Exception("__dict__ is special, don't want the proxy") get_obj = getattr(cls, name) except Exception as exc: pass else: homecls = getattr(get_obj, "__objclass__", homecls) - if homecls not in possible_bases: + if homecls not in class_bases: # if the resulting object does not live somewhere in the # mro, drop it and search the mro manually homecls = None last_cls = None - last_obj = None - for srch_cls in ((cls,) + mro): + # first look in the classes + for srch_cls in class_bases: srch_obj = getattr(srch_cls, name, None) - if srch_obj is get_obj: + if srch_obj == get_obj: last_cls = srch_cls - last_obj = srch_obj + # then check the metaclasses + for srch_cls in metamro: + try: + srch_obj = srch_cls.__getattr__(cls, name) + except AttributeError: + continue + if srch_obj == get_obj: + last_cls = srch_cls if last_cls is not None: homecls = last_cls - for base in possible_bases: + for base in all_bases: if name in base.__dict__: dict_obj = base.__dict__[name] - homecls = homecls or base + if homecls not in metamro: + homecls = base break if homecls is None: # unable to locate the attribute anywhere, most likely due to # buggy custom __dir__; discard and move on continue + obj = get_obj or dict_obj # Classify the object or its descriptor. - if get_obj is not sentinel: - obj = get_obj - else: - obj = dict_obj if isinstance(dict_obj, staticmethod): kind = "static method" + obj = dict_obj elif isinstance(dict_obj, classmethod): kind = "class method" - elif isinstance(obj, property): + obj = dict_obj + elif isinstance(dict_obj, property): kind = "property" + obj = dict_obj elif isfunction(obj) or ismethoddescriptor(obj): kind = "method" else: diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -975,13 +975,25 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 4193. + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. """ return (self.network_address.is_private and self.broadcast_address.is_private) @property + def is_global(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property def is_unspecified(self): """Test if the address is unspecified. @@ -1225,15 +1237,37 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 1918. + A boolean, True if the address is reserved per + iana-ipv4-special-registry. """ - private_10 = IPv4Network('10.0.0.0/8') - private_172 = IPv4Network('172.16.0.0/12') - private_192 = IPv4Network('192.168.0.0/16') - return (self in private_10 or - self in private_172 or - self in private_192) + return (self in IPv4Network('0.0.0.0/8') or + self in IPv4Network('10.0.0.0/8') or + self in IPv4Network('100.64.0.0/10') or + self in IPv4Network('127.0.0.0/8') or + self in IPv4Network('169.254.0.0/16') or + self in IPv4Network('172.16.0.0/12') or + self in IPv4Network('192.0.0.0/29') or + self in IPv4Network('192.0.0.170/31') or + self in IPv4Network('192.0.2.0/24') or + self in IPv4Network('192.168.0.0/16') or + self in IPv4Network('198.18.0.0/15') or + self in IPv4Network('198.51.100.0/24') or + self in IPv4Network('203.0.113.0/24') or + self in IPv4Network('240.0.0.0/4') or + self in IPv4Network('255.255.255.255/32')) + + @property + def is_global(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return not self.is_private + @property def is_multicast(self): @@ -1826,11 +1860,31 @@ """Test if this address is allocated for private networks. Returns: - A boolean, True if the address is reserved per RFC 4193. + A boolean, True if the address is reserved per + iana-ipv6-special-registry. """ - private_network = IPv6Network('fc00::/7') - return self in private_network + return (self in IPv6Network('::1/128') or + self in IPv6Network('::/128') or + self in IPv6Network('::ffff:0:0/96') or + self in IPv6Network('100::/64') or + self in IPv6Network('2001::/23') or + self in IPv6Network('2001:2::/48') or + self in IPv6Network('2001:db8::/32') or + self in IPv6Network('2001:10::/28') or + self in IPv6Network('fc00::/7') or + self in IPv6Network('fe80::/10')) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private @property def is_unspecified(self): diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -310,6 +310,11 @@ The ``encoding`` argument is ignored and deprecated. """ + if not isinstance(s, str): + raise TypeError('the JSON object must be str, not {!r}'.format( + s.__class__.__name__)) + if s.startswith(u'\ufeff'): + raise ValueError("Unexpected UTF-8 BOM (decode using utf-8-sig)") if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1183,6 +1183,14 @@ '(?: \(([\d\.]+)\))?' ' on (.NET [\d\.]+)', re.ASCII) +# IronPython covering 2.6 and 2.7 +_ironpython26_sys_version_parser = re.compile( + r'([\d.]+)\s*' + '\(IronPython\s*' + '[\d.]+\s*' + '\(([\d.]+)\) on ([\w.]+ [\d.]+(?: \(\d+-bit\))?)\)' +) + _pypy_sys_version_parser = re.compile( r'([\w.+]+)\s*' '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*' @@ -1220,19 +1228,24 @@ return result # Parse it - if sys_version[:10] == 'IronPython': + if 'IronPython' in sys_version: # IronPython name = 'IronPython' - match = _ironpython_sys_version_parser.match(sys_version) + if sys_version.startswith('IronPython'): + match = _ironpython_sys_version_parser.match(sys_version) + else: + match = _ironpython26_sys_version_parser.match(sys_version) + if match is None: raise ValueError( 'failed to parse IronPython sys.version: %s' % repr(sys_version)) + version, alt_version, compiler = match.groups() buildno = '' builddate = '' - elif sys.platform[:4] == 'java': + elif sys.platform.startswith('java'): # Jython name = 'Jython' match = _sys_version_parser.match(sys_version) diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -1235,8 +1235,9 @@ doc = getdoc(value) else: doc = None - push(self.docother(getattr(object, name), - name, mod, maxlen=70, doc=doc) + '\n') + push(self.docother( + getattr(object, name, None) or homecls.__dict__[name], + name, mod, maxlen=70, doc=doc) + '\n') return attrs attrs = [(name, kind, cls, value) @@ -1258,7 +1259,6 @@ else: tag = "inherited from %s" % classname(thisclass, object.__module__) - # Sort attrs by name. attrs.sort() @@ -1273,6 +1273,7 @@ lambda t: t[1] == 'data descriptor') attrs = spilldata("Data and other attributes %s:\n" % tag, attrs, lambda t: t[1] == 'data') + assert attrs == [] attrs = inherited diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py --- a/Lib/telnetlib.py +++ b/Lib/telnetlib.py @@ -17,13 +17,12 @@ Note that read_all() won't read until eof -- it just reads some data -- but it guarantees to read at least one byte unless EOF is hit. -It is possible to pass a Telnet object to select.select() in order to -wait until more data is available. Note that in this case, -read_eager() may return b'' even if there was data on the socket, -because the protocol negotiation may have eaten the data. This is why -EOFError is needed in some cases to distinguish between "no data" and -"connection closed" (since the socket also appears ready for reading -when it is closed). +It is possible to pass a Telnet object to a selector in order to wait until +more data is available. Note that in this case, read_eager() may return b'' +even if there was data on the socket, because the protocol negotiation may have +eaten the data. This is why EOFError is needed in some cases to distinguish +between "no data" and "connection closed" (since the socket also appears ready +for reading when it is closed). To do: - option negotiation @@ -34,10 +33,9 @@ # Imported modules -import errno import sys import socket -import select +import selectors __all__ = ["Telnet"] @@ -130,6 +128,15 @@ EXOPL = bytes([255]) # Extended-Options-List NOOPT = bytes([0]) + +# poll/select have the advantage of not requiring any extra file descriptor, +# contrarily to epoll/kqueue (also, they require a single syscall). +if hasattr(selectors, 'PollSelector'): + _TelnetSelector = selectors.PollSelector +else: + _TelnetSelector = selectors.SelectSelector + + class Telnet: """Telnet interface class. @@ -206,7 +213,6 @@ self.sb = 0 # flag for SB and SE sequence. self.sbdataq = b'' self.option_callback = None - self._has_poll = hasattr(select, 'poll') if host is not None: self.open(host, port, timeout) @@ -289,61 +295,6 @@ is closed and no cooked data is available. """ - if self._has_poll: - return self._read_until_with_poll(match, timeout) - else: - return self._read_until_with_select(match, timeout) - - def _read_until_with_poll(self, match, timeout): - """Read until a given string is encountered or until timeout. - - This method uses select.poll() to implement the timeout. - """ - n = len(match) - call_timeout = timeout - if timeout is not None: - from time import time - time_start = time() - self.process_rawq() - i = self.cookedq.find(match) - if i < 0: - poller = select.poll() - poll_in_or_priority_flags = select.POLLIN | select.POLLPRI - poller.register(self, poll_in_or_priority_flags) - while i < 0 and not self.eof: - try: - ready = poller.poll(call_timeout) - except OSError as e: - if e.errno == errno.EINTR: - if timeout is not None: - elapsed = time() - time_start - call_timeout = timeout-elapsed - continue - raise - for fd, mode in ready: - if mode & poll_in_or_priority_flags: - i = max(0, len(self.cookedq)-n) - self.fill_rawq() - self.process_rawq() - i = self.cookedq.find(match, i) - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - call_timeout = timeout-elapsed - poller.unregister(self) - if i >= 0: - i = i + n - buf = self.cookedq[:i] - self.cookedq = self.cookedq[i:] - return buf - return self.read_very_lazy() - - def _read_until_with_select(self, match, timeout=None): - """Read until a given string is encountered or until timeout. - - The timeout is implemented using select.select(). - """ n = len(match) self.process_rawq() i = self.cookedq.find(match) @@ -352,27 +303,26 @@ buf = self.cookedq[:i] self.cookedq = self.cookedq[i:] return buf - s_reply = ([self], [], []) - s_args = s_reply if timeout is not None: - s_args = s_args + (timeout,) from time import time - time_start = time() - while not self.eof and select.select(*s_args) == s_reply: - i = max(0, len(self.cookedq)-n) - self.fill_rawq() - self.process_rawq() - i = self.cookedq.find(match, i) - if i >= 0: - i = i+n - buf = self.cookedq[:i] - self.cookedq = self.cookedq[i:] - return buf - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - s_args = s_reply + (timeout-elapsed,) + deadline = time() + timeout + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + while not self.eof: + if selector.select(timeout): + i = max(0, len(self.cookedq)-n) + self.fill_rawq() + self.process_rawq() + i = self.cookedq.find(match, i) + if i >= 0: + i = i+n + buf = self.cookedq[:i] + self.cookedq = self.cookedq[i:] + return buf + if timeout is not None: + timeout = deadline - time() + if timeout < 0: + break return self.read_very_lazy() def read_all(self): @@ -577,29 +527,35 @@ def sock_avail(self): """Test whether data is available on the socket.""" - return select.select([self], [], [], 0) == ([self], [], []) + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + return bool(selector.select(0)) def interact(self): """Interaction function, emulates a very dumb telnet client.""" if sys.platform == "win32": self.mt_interact() return - while 1: - rfd, wfd, xfd = select.select([self, sys.stdin], [], []) - if self in rfd: - try: - text = self.read_eager() - except EOFError: - print('*** Connection closed by remote host ***') - break - if text: - sys.stdout.write(text.decode('ascii')) - sys.stdout.flush() - if sys.stdin in rfd: - line = sys.stdin.readline().encode('ascii') - if not line: - break - self.write(line) + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + selector.register(sys.stdin, selectors.EVENT_READ) + + while True: + for key, events in selector.select(): + if key.fileobj is self: + try: + text = self.read_eager() + except EOFError: + print('*** Connection closed by remote host ***') + return + if text: + sys.stdout.write(text.decode('ascii')) + sys.stdout.flush() + elif key.fileobj is sys.stdin: + line = sys.stdin.readline().encode('ascii') + if not line: + return + self.write(line) def mt_interact(self): """Multithreaded version of interact().""" @@ -646,79 +602,6 @@ results are undeterministic, and may depend on the I/O timing. """ - if self._has_poll: - return self._expect_with_poll(list, timeout) - else: - return self._expect_with_select(list, timeout) - - def _expect_with_poll(self, expect_list, timeout=None): - """Read until one from a list of a regular expressions matches. - - This method uses select.poll() to implement the timeout. - """ - re = None - expect_list = expect_list[:] - indices = range(len(expect_list)) - for i in indices: - if not hasattr(expect_list[i], "search"): - if not re: import re - expect_list[i] = re.compile(expect_list[i]) - call_timeout = timeout - if timeout is not None: - from time import time - time_start = time() - self.process_rawq() - m = None - for i in indices: - m = expect_list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - break - if not m: - poller = select.poll() - poll_in_or_priority_flags = select.POLLIN | select.POLLPRI - poller.register(self, poll_in_or_priority_flags) - while not m and not self.eof: - try: - ready = poller.poll(call_timeout) - except OSError as e: - if e.errno == errno.EINTR: - if timeout is not None: - elapsed = time() - time_start - call_timeout = timeout-elapsed - continue - raise - for fd, mode in ready: - if mode & poll_in_or_priority_flags: - self.fill_rawq() - self.process_rawq() - for i in indices: - m = expect_list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - break - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - call_timeout = timeout-elapsed - poller.unregister(self) - if m: - return (i, m, text) - text = self.read_very_lazy() - if not text and self.eof: - raise EOFError - return (-1, None, text) - - def _expect_with_select(self, list, timeout=None): - """Read until one from a list of a regular expressions matches. - - The timeout is implemented using select.select(). - """ re = None list = list[:] indices = range(len(list)) @@ -728,27 +611,27 @@ list[i] = re.compile(list[i]) if timeout is not None: from time import time - time_start = time() - while 1: - self.process_rawq() - for i in indices: - m = list[i].search(self.cookedq) - if m: - e = m.end() - text = self.cookedq[:e] - self.cookedq = self.cookedq[e:] - return (i, m, text) - if self.eof: - break - if timeout is not None: - elapsed = time() - time_start - if elapsed >= timeout: - break - s_args = ([self.fileno()], [], [], timeout-elapsed) - r, w, x = select.select(*s_args) - if not r: - break - self.fill_rawq() + deadline = time() + timeout + with _TelnetSelector() as selector: + selector.register(self, selectors.EVENT_READ) + while not self.eof: + self.process_rawq() + for i in indices: + m = list[i].search(self.cookedq) + if m: + e = m.end() + text = self.cookedq[:e] + self.cookedq = self.cookedq[e:] + return (i, m, text) + if timeout is not None: + ready = selector.select(timeout) + timeout = deadline - time() + if not ready: + if timeout < 0: + break + else: + continue + self.fill_rawq() text = self.read_very_lazy() if not text and self.eof: raise EOFError diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -5,6 +5,7 @@ import time import unittest import unittest.mock +from test.support import find_unused_port, IPV6_ENABLED from asyncio import base_events from asyncio import events @@ -533,6 +534,7 @@ self.assertRaises( OSError, self.loop.run_until_complete, coro) + @unittest.skipUnless(IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_no_matching_family(self): coro = self.loop.create_datagram_endpoint( protocols.DatagramProtocol, @@ -588,3 +590,7 @@ self.loop._accept_connection(MyProto, sock) self.assertTrue(sock.close.called) self.assertTrue(m_log.exception.called) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -896,8 +896,8 @@ proto = MyWritePipeProto(loop=self.loop) return proto - rpipe, wpipe = os.pipe() - pipeobj = io.open(wpipe, 'wb', 1024) + rsock, wsock = self.loop._socketpair() + pipeobj = io.open(wsock.detach(), 'wb', 1024) @tasks.coroutine def connect(): @@ -913,11 +913,10 @@ self.assertEqual('CONNECTED', proto.state) transport.write(b'1') - test_utils.run_briefly(self.loop) - data = os.read(rpipe, 1024) + data = self.loop.run_until_complete(self.loop.sock_recv(rsock, 1024)) self.assertEqual(b'1', data) - os.close(rpipe) + rsock.close() self.loop.run_until_complete(proto.done) self.assertEqual('CLOSED', proto.state) @@ -986,9 +985,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_interactive(self): proto = None transp = None @@ -1087,9 +1083,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_kill(self): proto = None transp = None @@ -1113,9 +1106,6 @@ @unittest.skipIf(sys.platform == 'win32', "Don't support subprocess for Windows yet") - # Issue #19293 - @unittest.skipIf(sys.platform.startswith("aix"), - 'cannot be interrupted with signal on AIX') def test_subprocess_send_signal(self): proto = None transp = None @@ -1233,6 +1223,26 @@ self.loop.run_until_complete(proto.completed) self.assertEqual(-signal.SIGTERM, proto.returncode) + @unittest.skipIf(sys.platform == 'win32', + "Don't support subprocess for Windows yet") + def test_subprocess_wait_no_same_group(self): + proto = None + transp = None + + @tasks.coroutine + def connect(): + nonlocal proto + # start the new process in a new session + transp, proto = yield from self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'exit 7', stdin=None, stdout=None, stderr=None, + start_new_session=True) + self.assertIsInstance(proto, MySubprocessProtocol) + + self.loop.run_until_complete(connect()) + self.loop.run_until_complete(proto.completed) + self.assertEqual(7, proto.returncode) + if sys.platform == 'win32': from asyncio import windows_events diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -478,3 +478,7 @@ self.loop._stop_serving(sock) self.assertTrue(sock.close.called) self.proactor._stop_serving.assert_called_with(sock) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1483,3 +1483,7 @@ transport._fatal_error(err) self.protocol.connection_refused.assert_called_with(err) m_exc.assert_called_with('Fatal error for %s', transport) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_selectors.py b/Lib/test/test_asyncio/test_selectors.py --- a/Lib/test/test_asyncio/test_selectors.py +++ b/Lib/test/test_asyncio/test_selectors.py @@ -143,3 +143,7 @@ if hasattr(selectors.DefaultSelector, 'fileno'): def test_fileno(self): self.assertIsInstance(selectors.DefaultSelector().fileno(), int) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py --- a/Lib/test/test_asyncio/test_transports.py +++ b/Lib/test/test_asyncio/test_transports.py @@ -53,3 +53,7 @@ self.assertRaises(NotImplementedError, transport.send_signal, 1) self.assertRaises(NotImplementedError, transport.terminate) self.assertRaises(NotImplementedError, transport.kill) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -266,7 +266,7 @@ self.loop._subprocesses[7] = transp self.loop._sig_chld() - self.assertFalse(transp._process_exited.called) + self.assertTrue(transp._process_exited.called) self.assertFalse(m_WEXITSTATUS.called) self.assertFalse(m_WTERMSIG.called) @@ -312,6 +312,13 @@ fcntl_patcher.start() self.addCleanup(fcntl_patcher.stop) + fstat_patcher = unittest.mock.patch('os.fstat') + m_fstat = fstat_patcher.start() + st = unittest.mock.Mock() + st.st_mode = stat.S_IFIFO + m_fstat.return_value = st + self.addCleanup(fstat_patcher.stop) + def test_ctor(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) @@ -768,3 +775,7 @@ tr.write_eof() self.assertTrue(tr._closing) self.assertFalse(self.protocol.connection_lost.called) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -93,3 +93,7 @@ protocols.Protocol, ADDRESS) return 'done' + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py --- a/Lib/test/test_asyncio/test_windows_utils.py +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -138,3 +138,7 @@ # allow for partial reads... self.assertTrue(msg.upper().rstrip().startswith(out)) self.assertTrue(b"stderr".startswith(err)) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -1,7 +1,6 @@ import audioop import sys import unittest -from test.support import run_unittest def pack(width, data): return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data) @@ -87,6 +86,7 @@ self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10) self.assertEqual(audioop.avgpp(datas[1], 1), 196) self.assertEqual(audioop.avgpp(datas[2], 2), 50534) + self.assertEqual(audioop.avgpp(datas[3], 3), 12937096) self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002) def test_rms(self): @@ -100,6 +100,7 @@ -minvalues[w], delta=1) self.assertEqual(audioop.rms(datas[1], 1), 77) self.assertEqual(audioop.rms(datas[2], 2), 20001) + self.assertEqual(audioop.rms(datas[3], 3), 5120523) self.assertEqual(audioop.rms(datas[4], 4), 1310854152) def test_cross(self): @@ -227,10 +228,9 @@ def test_lin2adpcm(self): self.assertEqual(audioop.lin2adpcm(datas[1], 1, None), (b'\x07\x7f\x7f', (-221, 39))) - self.assertEqual(audioop.lin2adpcm(datas[2], 2, None), - (b'\x07\x7f\x7f', (31, 39))) - self.assertEqual(audioop.lin2adpcm(datas[4], 4, None), - (b'\x07\x7f\x7f', (31, 39))) + for w in 2, 3, 4: + self.assertEqual(audioop.lin2adpcm(datas[w], w, None), + (b'\x07\x7f\x7f', (31, 39))) # Very cursory test for w in 1, 2, 3, 4: @@ -240,10 +240,9 @@ def test_lin2alaw(self): self.assertEqual(audioop.lin2alaw(datas[1], 1), b'\xd5\x87\xa4\x24\xaa\x2a\x5a') - self.assertEqual(audioop.lin2alaw(datas[2], 2), - b'\xd5\x87\xa4\x24\xaa\x2a\x55') - self.assertEqual(audioop.lin2alaw(datas[4], 4), - b'\xd5\x87\xa4\x24\xaa\x2a\x55') + for w in 2, 3, 4: + self.assertEqual(audioop.lin2alaw(datas[w], w), + b'\xd5\x87\xa4\x24\xaa\x2a\x55') def test_alaw2lin(self): encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\ @@ -262,10 +261,9 @@ def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(datas[1], 1), b'\xff\xad\x8e\x0e\x80\x00\x67') - self.assertEqual(audioop.lin2ulaw(datas[2], 2), - b'\xff\xad\x8e\x0e\x80\x00\x7e') - self.assertEqual(audioop.lin2ulaw(datas[4], 4), - b'\xff\xad\x8e\x0e\x80\x00\x7e') + for w in 2, 3, 4: + self.assertEqual(audioop.lin2ulaw(datas[w], w), + b'\xff\xad\x8e\x0e\x80\x00\x7e') def test_ulaw2lin(self): encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\ @@ -416,8 +414,5 @@ self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state) -def test_main(): - run_unittest(TestAudioop) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4519,8 +4519,10 @@ global Y class Y: - pass + class Inside: + pass self.assertEqual(Y.__qualname__, 'Y') + self.assertEqual(Y.Inside.__qualname__, 'Y.Inside') def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1,8 +1,11 @@ import enum +import inspect +import pydoc import unittest from collections import OrderedDict +from enum import Enum, IntEnum, EnumMeta, unique +from io import StringIO from pickle import dumps, loads, PicklingError -from enum import Enum, IntEnum, unique # for pickle tests try: @@ -1195,5 +1198,117 @@ turkey = 3 +expected_help_output = """ +Help on class Color in module %s: + +class Color(enum.Enum) + | Method resolution order: + | Color + | enum.Enum + | builtins.object + |\x20\x20 + | Data and other attributes defined here: + |\x20\x20 + | blue = + |\x20\x20 + | green = + |\x20\x20 + | red = + |\x20\x20 + | ---------------------------------------------------------------------- + | Data descriptors inherited from enum.Enum: + |\x20\x20 + | name + | The name of the Enum member. + |\x20\x20 + | value + | The value of the Enum member. + |\x20\x20 + | ---------------------------------------------------------------------- + | Data descriptors inherited from enum.EnumMeta: + |\x20\x20 + | __members__ + | Returns a mapping of member name->value. + |\x20\x20\x20\x20\x20\x20 + | This mapping lists all enum members, including aliases. Note that this + | is a read-only view of the internal mapping. +""".strip() + +class TestStdLib(unittest.TestCase): + + class Color(Enum): + red = 1 + green = 2 + blue = 3 + + def test_pydoc(self): + # indirectly test __objclass__ + expected_text = expected_help_output % __name__ + output = StringIO() + helper = pydoc.Helper(output=output) + helper(self.Color) + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + def test_inspect_getmembers(self): + values = dict(( + ('__class__', EnumMeta), + ('__doc__', None), + ('__members__', self.Color.__members__), + ('__module__', __name__), + ('blue', self.Color.blue), + ('green', self.Color.green), + ('name', Enum.__dict__['name']), + ('red', self.Color.red), + ('value', Enum.__dict__['value']), + )) + result = dict(inspect.getmembers(self.Color)) + self.assertEqual(values.keys(), result.keys()) + failed = False + for k in values.keys(): + if result[k] != values[k]: + print() + print('\n%s\n key: %s\n result: %s\nexpected: %s\n%s\n' % + ('=' * 75, k, result[k], values[k], '=' * 75), sep='') + failed = True + if failed: + self.fail("result does not equal expected, see print above") + + def test_inspect_classify_class_attrs(self): + # indirectly test __objclass__ + from inspect import Attribute + values = [ + Attribute(name='__class__', kind='data', + defining_class=object, object=EnumMeta), + Attribute(name='__doc__', kind='data', + defining_class=self.Color, object=None), + Attribute(name='__members__', kind='property', + defining_class=EnumMeta, object=EnumMeta.__members__), + Attribute(name='__module__', kind='data', + defining_class=self.Color, object=__name__), + Attribute(name='blue', kind='data', + defining_class=self.Color, object=self.Color.blue), + Attribute(name='green', kind='data', + defining_class=self.Color, object=self.Color.green), + Attribute(name='red', kind='data', + defining_class=self.Color, object=self.Color.red), + Attribute(name='name', kind='data', + defining_class=Enum, object=Enum.__dict__['name']), + Attribute(name='value', kind='data', + defining_class=Enum, object=Enum.__dict__['value']), + ] + values.sort(key=lambda item: item.name) + result = list(inspect.classify_class_attrs(self.Color)) + result.sort(key=lambda item: item.name) + failed = False + for v, r in zip(values, result): + if r != v: + print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='') + failed = True + if failed: + self.fail("result does not equal expected, see print above") + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -72,9 +72,9 @@ Raise an error if the output doesn't match the expected format. """ if all_threads: - header = 'Current thread XXX' + header = 'Current thread XXX (most recent call first)' else: - header = 'Traceback (most recent call first)' + header = 'Stack (most recent call first)' regex = """ ^Fatal Python error: {name} @@ -306,7 +306,7 @@ else: lineno = 8 expected = [ - 'Traceback (most recent call first):', + 'Stack (most recent call first):', ' File "", line %s in funcB' % lineno, ' File "", line 11 in funcA', ' File "", line 13 in ' @@ -338,7 +338,7 @@ func_name=func_name, ) expected = [ - 'Traceback (most recent call first):', + 'Stack (most recent call first):', ' File "", line 4 in %s' % truncated, ' File "", line 6 in ' ] @@ -392,13 +392,13 @@ else: lineno = 10 regex = """ -^Thread 0x[0-9a-f]+: +^Thread 0x[0-9a-f]+ \(most recent call first\): (?: File ".*threading.py", line [0-9]+ in [_a-z]+ ){{1,3}} File "", line 23 in run File ".*threading.py", line [0-9]+ in _bootstrap_inner File ".*threading.py", line [0-9]+ in _bootstrap -Current thread XXX: +Current thread XXX \(most recent call first\): File "", line {lineno} in dump File "", line 28 in $ """.strip() @@ -461,7 +461,7 @@ count = loops if repeat: count *= 2 - header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+:\n' % timeout_str + header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n' % timeout_str regex = expected_traceback(9, 20, header, min_count=count) self.assertRegex(trace, regex) else: @@ -563,9 +563,9 @@ trace = '\n'.join(trace) if not unregister: if all_threads: - regex = 'Current thread XXX:\n' + regex = 'Current thread XXX \(most recent call first\):\n' else: - regex = 'Traceback \(most recent call first\):\n' + regex = 'Stack \(most recent call first\):\n' regex = expected_traceback(7, 28, regex) self.assertRegex(trace, regex) else: diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -92,6 +92,7 @@ self.next_response = '' self.next_data = None self.rest = None + self.next_retr_data = RETR_DATA self.push('220 welcome') def collect_incoming_data(self, data): @@ -221,7 +222,7 @@ offset = int(self.rest) else: offset = 0 - self.dtp.push(RETR_DATA[offset:]) + self.dtp.push(self.next_retr_data[offset:]) self.dtp.close_when_done() self.rest = None @@ -243,6 +244,11 @@ self.dtp.push(MLSD_DATA) self.dtp.close_when_done() + def cmd_setlongretr(self, arg): + # For testing. Next RETR will return long line. + self.next_retr_data = 'x' * int(arg) + self.push('125 setlongretr ok') + class DummyFTPServer(asyncore.dispatcher, threading.Thread): @@ -759,6 +765,20 @@ self.assertEqual(ftplib.parse257('257 "/foo/b""ar"'), '/foo/b"ar') self.assertEqual(ftplib.parse257('257 "/foo/b""ar" created'), '/foo/b"ar') + def test_line_too_long(self): + self.assertRaises(ftplib.Error, self.client.sendcmd, + 'x' * self.client.maxline * 2) + + def test_retrlines_too_long(self): + self.client.sendcmd('SETLONGRETR %d' % (self.client.maxline * 2)) + received = [] + self.assertRaises(ftplib.Error, + self.client.retrlines, 'retr', received.append) + + def test_storlines_too_long(self): + f = io.BytesIO(b'x' * self.client.maxline * 2) + self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) + class TestIPv6Environment(TestCase): diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -9,7 +9,9 @@ pass global inner_global_function def inner_global_function(): - pass + def inner_function2(): + pass + return inner_function2 return LocalClass return lambda: inner_function @@ -120,6 +122,7 @@ self.assertEqual(global_function()()().__qualname__, 'global_function..inner_function..LocalClass') self.assertEqual(inner_global_function.__qualname__, 'inner_global_function') + self.assertEqual(inner_global_function().__qualname__, 'inner_global_function..inner_function2') self.b.__qualname__ = 'c' self.assertEqual(self.b.__qualname__, 'c') self.b.__qualname__ = 'd' diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -84,26 +84,30 @@ if constructor: constructors.add(constructor) + def add_builtin_constructor(name): + constructor = getattr(hashlib, "__get_builtin_constructor")(name) + self.constructors_to_test[name].add(constructor) + _md5 = self._conditional_import_module('_md5') if _md5: - self.constructors_to_test['md5'].add(_md5.md5) + add_builtin_constructor('md5') _sha1 = self._conditional_import_module('_sha1') if _sha1: - self.constructors_to_test['sha1'].add(_sha1.sha1) + add_builtin_constructor('sha1') _sha256 = self._conditional_import_module('_sha256') if _sha256: - self.constructors_to_test['sha224'].add(_sha256.sha224) - self.constructors_to_test['sha256'].add(_sha256.sha256) + add_builtin_constructor('sha224') + add_builtin_constructor('sha256') _sha512 = self._conditional_import_module('_sha512') if _sha512: - self.constructors_to_test['sha384'].add(_sha512.sha384) - self.constructors_to_test['sha512'].add(_sha512.sha512) + add_builtin_constructor('sha384') + add_builtin_constructor('sha512') _sha3 = self._conditional_import_module('_sha3') if _sha3: - self.constructors_to_test['sha3_224'].add(_sha3.sha3_224) - self.constructors_to_test['sha3_256'].add(_sha3.sha3_256) - self.constructors_to_test['sha3_384'].add(_sha3.sha3_384) - self.constructors_to_test['sha3_512'].add(_sha3.sha3_512) + add_builtin_constructor('sha3_224') + add_builtin_constructor('sha3_256') + add_builtin_constructor('sha3_384') + add_builtin_constructor('sha3_512') super(HashLibTestCase, self).__init__(*args, **kwargs) @@ -132,8 +136,10 @@ self.assertRaises(TypeError, hashlib.new, 1) def test_get_builtin_constructor(self): - get_builtin_constructor = hashlib.__dict__[ - '__get_builtin_constructor'] + get_builtin_constructor = getattr(hashlib, + '__get_builtin_constructor') + builtin_constructor_cache = getattr(hashlib, + '__builtin_constructor_cache') self.assertRaises(ValueError, get_builtin_constructor, 'test') try: import _md5 @@ -141,6 +147,8 @@ pass # This forces an ImportError for "import _md5" statements sys.modules['_md5'] = None + # clear the cache + builtin_constructor_cache.clear() try: self.assertRaises(ValueError, get_builtin_constructor, 'md5') finally: @@ -149,6 +157,9 @@ else: del sys.modules['_md5'] self.assertRaises(TypeError, get_builtin_constructor, 3) + constructor = get_builtin_constructor('md5') + self.assertIs(constructor, _md5.md5) + self.assertEqual(sorted(builtin_constructor_cache), ['MD5', 'md5']) def test_hexdigest(self): for cons in self.hash_constructors: diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -667,9 +667,19 @@ return 'eggs' should_find_dca = inspect.Attribute('ham', 'data', VA, VA.__dict__['ham']) self.assertIn(should_find_dca, inspect.classify_class_attrs(VA)) - should_find_ga = inspect.Attribute('ham', 'data', VA, 'spam') + should_find_ga = inspect.Attribute('ham', 'data', Meta, 'spam') self.assertIn(should_find_ga, inspect.classify_class_attrs(VA)) + def test_classify_metaclass_class_attribute(self): + class Meta(type): + fish = 'slap' + def __dir__(self): + return ['__class__', '__modules__', '__name__', 'fish'] + class Class(metaclass=Meta): + pass + should_find = inspect.Attribute('fish', 'data', Meta, 'slap') + self.assertIn(should_find, inspect.classify_class_attrs(Class)) + def test_classify_VirtualAttribute(self): class Meta(type): def __dir__(cls): @@ -680,7 +690,7 @@ return super().__getattr(name) class Class(metaclass=Meta): pass - should_find = inspect.Attribute('BOOM', 'data', Class, 42) + should_find = inspect.Attribute('BOOM', 'data', Meta, 42) self.assertIn(should_find, inspect.classify_class_attrs(Class)) def test_classify_VirtualAttribute_multi_classes(self): @@ -711,9 +721,9 @@ class Class2(Class1, metaclass=Meta3): pass - should_find1 = inspect.Attribute('one', 'data', Class1, 1) - should_find2 = inspect.Attribute('two', 'data', Class2, 2) - should_find3 = inspect.Attribute('three', 'data', Class2, 3) + should_find1 = inspect.Attribute('one', 'data', Meta1, 1) + should_find2 = inspect.Attribute('two', 'data', Meta2, 2) + should_find3 = inspect.Attribute('three', 'data', Meta3, 3) cca = inspect.classify_class_attrs(Class2) for sf in (should_find1, should_find2, should_find3): self.assertIn(sf, cca) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1319,6 +1319,11 @@ self.assertEqual(True, ipaddress.ip_network( '127.42.0.0/16').is_loopback) self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) + self.assertEqual(True, ipaddress.ip_network('100.64.0.0/10').is_private) + self.assertEqual(True, + ipaddress.ip_network('192.0.2.128/25').is_private) + self.assertEqual(True, + ipaddress.ip_network('192.0.3.0/24').is_global) # test addresses self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified) @@ -1384,6 +1389,10 @@ self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified) self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified) + self.assertEqual(True, + ipaddress.ip_network('2001::1/128').is_private) + self.assertEqual(True, + ipaddress.ip_network('200::1/128').is_global) # test addresses self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast) self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast) diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -1,5 +1,5 @@ import decimal -from io import StringIO +from io import StringIO, BytesIO from collections import OrderedDict from test.test_json import PyTest, CTest @@ -70,5 +70,26 @@ msg = 'escape' self.assertRaisesRegex(ValueError, msg, self.loads, s) + def test_invalid_input_type(self): + msg = 'the JSON object must be str' + for value in [1, 3.14, b'bytes', b'\xff\x00', [], {}, None]: + self.assertRaisesRegex(TypeError, msg, self.loads, value) + with self.assertRaisesRegex(TypeError, msg): + self.json.load(BytesIO(b'[1,2,3]')) + + def test_string_with_utf8_bom(self): + # see #18958 + bom_json = "[1,2,3]".encode('utf-8-sig').decode('utf-8') + with self.assertRaises(ValueError) as cm: + self.loads(bom_json) + self.assertIn('BOM', str(cm.exception)) + with self.assertRaises(ValueError) as cm: + self.json.load(StringIO(bom_json)) + self.assertIn('BOM', str(cm.exception)) + # make sure that the BOM is not detected in the middle of a string + bom_in_str = '"{}"'.format(''.encode('utf-8-sig').decode('utf-8')) + self.assertEqual(self.loads(bom_in_str), '\ufeff') + self.assertEqual(self.json.load(StringIO(bom_in_str)), '\ufeff') + class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -91,15 +91,28 @@ ("CPython", "2.6.1", "tags/r261", "67515", ('r261:67515', 'Dec 6 2008 15:26:00'), 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'), + ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli") : ("IronPython", "2.0.0", "", "", ("", ""), ".NET 2.0.50727.3053"), + + ("2.6.1 (IronPython 2.6.1 (2.6.10920.0) on .NET 2.0.50727.1433)", None, "cli") + : + ("IronPython", "2.6.1", "", "", ("", ""), + ".NET 2.0.50727.1433"), + + ("2.7.4 (IronPython 2.7.4 (2.7.0.40) on Mono 4.0.30319.1 (32-bit))", None, "cli") + : + ("IronPython", "2.7.4", "", "", ("", ""), + "Mono 4.0.30319.1 (32-bit)"), + ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]", ('Jython', 'trunk', '6107'), "java1.5.0_16") : ("Jython", "2.5.0", "trunk", "6107", ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"), + ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]", ('PyPy', 'trunk', '63378'), self.save_platform) : diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -11,6 +11,7 @@ import string import test.support import time +import types import unittest import xml.etree import textwrap @@ -208,6 +209,75 @@ # output pattern for module with bad imports badimport_pattern = "problem in %s - ImportError: No module named %r" +expected_dynamicattribute_pattern = """ +Help on class DA in module %s: + +class DA(builtins.object) + | Data descriptors defined here: + |\x20\x20 + | __dict__%s + |\x20\x20 + | __weakref__%s + |\x20\x20 + | ham + |\x20\x20 + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta: + |\x20\x20 + | ham = 'spam' +""".strip() + +expected_virtualattribute_pattern1 = """ +Help on class Class in module %s: + +class Class(builtins.object) + | Data and other attributes inherited from Meta: + |\x20\x20 + | LIFE = 42 +""".strip() + +expected_virtualattribute_pattern2 = """ +Help on class Class1 in module %s: + +class Class1(builtins.object) + | Data and other attributes inherited from Meta1: + |\x20\x20 + | one = 1 +""".strip() + +expected_virtualattribute_pattern3 = """ +Help on class Class2 in module %s: + +class Class2(Class1) + | Method resolution order: + | Class2 + | Class1 + | builtins.object + |\x20\x20 + | Data and other attributes inherited from Meta1: + |\x20\x20 + | one = 1 + |\x20\x20 + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta3: + |\x20\x20 + | three = 3 + |\x20\x20 + | ---------------------------------------------------------------------- + | Data and other attributes inherited from Meta2: + |\x20\x20 + | two = 2 +""".strip() + +expected_missingattribute_pattern = """ +Help on class C in module %s: + +class C(builtins.object) + | Data and other attributes defined here: + |\x20\x20 + | here = 'present!' +""".strip() + def run_pydoc(module_name, *args, **env): """ Runs pydoc on the specified module. Returns the stripped @@ -636,6 +706,127 @@ self.assertEqual(sorted(pydoc.Helper.keywords), sorted(keyword.kwlist)) +class PydocWithMetaClasses(unittest.TestCase): + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + def test_DynamicClassAttribute(self): + class Meta(type): + def __getattr__(self, name): + if name == 'ham': + return 'spam' + return super().__getattr__(name) + class DA(metaclass=Meta): + @types.DynamicClassAttribute + def ham(self): + return 'eggs' + expected_text_data_docstrings = tuple('\n | ' + s if s else '' + for s in expected_data_docstrings) + output = StringIO() + helper = pydoc.Helper(output=output) + helper(DA) + expected_text = expected_dynamicattribute_pattern % ( + (__name__,) + expected_text_data_docstrings[:2]) + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + def test_virtualClassAttributeWithOneMeta(self): + class Meta(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'LIFE'] + def __getattr__(self, name): + if name =='LIFE': + return 42 + return super().__getattr(name) + class Class(metaclass=Meta): + pass + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class) + expected_text = expected_virtualattribute_pattern1 % __name__ + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + def test_virtualClassAttributeWithTwoMeta(self): + class Meta1(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'one'] + def __getattr__(self, name): + if name =='one': + return 1 + return super().__getattr__(name) + class Meta2(type): + def __dir__(cls): + return ['__class__', '__module__', '__name__', 'two'] + def __getattr__(self, name): + if name =='two': + return 2 + return super().__getattr__(name) + class Meta3(Meta1, Meta2): + def __dir__(cls): + return list(sorted(set( + ['__class__', '__module__', '__name__', 'three'] + + Meta1.__dir__(cls) + Meta2.__dir__(cls)))) + def __getattr__(self, name): + if name =='three': + return 3 + return super().__getattr__(name) + class Class1(metaclass=Meta1): + pass + class Class2(Class1, metaclass=Meta3): + pass + fail1 = fail2 = False + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class1) + expected_text1 = expected_virtualattribute_pattern2 % __name__ + result1 = output.getvalue().strip() + if result1 != expected_text1: + print_diffs(expected_text1, result1) + fail1 = True + output = StringIO() + helper = pydoc.Helper(output=output) + helper(Class2) + expected_text2 = expected_virtualattribute_pattern3 % __name__ + result2 = output.getvalue().strip() + if result2 != expected_text2: + print_diffs(expected_text2, result2) + fail2 = True + if fail1 or fail2: + self.fail("outputs are not equal, see diff above") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + def test_buggy_dir(self): + class M(type): + def __dir__(cls): + return ['__class__', '__name__', 'missing', 'here'] + class C(metaclass=M): + here = 'present!' + output = StringIO() + helper = pydoc.Helper(output=output) + helper(C) + expected_text = expected_missingattribute_pattern % __name__ + result = output.getvalue().strip() + if result != expected_text: + print_diffs(expected_text, result) + self.fail("outputs are not equal, see diff above") + @reap_threads def test_main(): try: @@ -645,6 +836,7 @@ PydocServerTest, PydocUrlHandlerTest, TestHelper, + PydocWithMetaClasses, ) finally: reap_children() diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1104,6 +1104,28 @@ self.assertEqual(re.compile(pattern, re.S).findall(b'xyz'), [b'xyz'], msg=pattern) + def test_match_repr(self): + for string in '[abracadabra]', S('[abracadabra]'): + m = re.search(r'(.+)(.*?)\1', string) + self.assertEqual(repr(m), "<%s.%s object; " + "span=(1, 12), match='abracadabra'>" % + (type(m).__module__, type(m).__qualname__)) + for string in (b'[abracadabra]', B(b'[abracadabra]'), + bytearray(b'[abracadabra]'), + memoryview(b'[abracadabra]')): + m = re.search(rb'(.+)(.*?)\1', string) + self.assertEqual(repr(m), "<%s.%s object; " + "span=(1, 12), match=b'abracadabra'>" % + (type(m).__module__, type(m).__qualname__)) + + first, second = list(re.finditer("(aa)|(bb)", "aa bb")) + self.assertEqual(repr(first), "<%s.%s object; " + "span=(0, 2), match='aa'>" % + (type(second).__module__, type(first).__qualname__)) + self.assertEqual(repr(second), "<%s.%s object; " + "span=(3, 5), match='bb'>" % + (type(second).__module__, type(second).__qualname__)) + def test_bug_2537(self): # issue 2537: empty submatches diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py --- a/Lib/test/test_resource.py +++ b/Lib/test/test_resource.py @@ -1,3 +1,5 @@ +import sys +import os import unittest from test import support import time @@ -129,6 +131,29 @@ self.assertIsInstance(pagesize, int) self.assertGreaterEqual(pagesize, 0) + @unittest.skipUnless(sys.platform == 'linux', 'test requires Linux') + def test_linux_constants(self): + self.assertIsInstance(resource.RLIMIT_MSGQUEUE, int) + self.assertIsInstance(resource.RLIMIT_NICE, int) + self.assertIsInstance(resource.RLIMIT_RTPRIO, int) + self.assertIsInstance(resource.RLIMIT_RTTIME, int) + self.assertIsInstance(resource.RLIMIT_SIGPENDING, int) + + + @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit') + def test_prlimit(self): + self.assertRaises(TypeError, resource.prlimit) + if os.geteuid() != 0: + self.assertRaises(PermissionError, resource.prlimit, + 1, resource.RLIMIT_AS) + self.assertRaises(ProcessLookupError, resource.prlimit, + -1, resource.RLIMIT_AS) + limit = resource.getrlimit(resource.RLIMIT_AS) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS), limit) + self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS, limit), + limit) + + def test_main(verbose=None): support.run_unittest(ResourceTest) diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -1,10 +1,9 @@ import socket -import select +import selectors import telnetlib import time import contextlib -import unittest from unittest import TestCase from test import support threading = support.import_module('threading') @@ -112,40 +111,32 @@ self._messages += out.getvalue() return -def mock_select(*s_args): - block = False - for l in s_args: - for fob in l: - if isinstance(fob, TelnetAlike): - block = fob.sock.block - if block: - return [[], [], []] - else: - return s_args - -class MockPoller(object): - test_case = None # Set during TestCase setUp. +class MockSelector(selectors.BaseSelector): def __init__(self): - self._file_objs = [] + super().__init__() + self.keys = {} - def register(self, fd, eventmask): - self.test_case.assertTrue(hasattr(fd, 'fileno'), fd) - self.test_case.assertEqual(eventmask, select.POLLIN|select.POLLPRI) - self._file_objs.append(fd) + def register(self, fileobj, events, data=None): + key = selectors.SelectorKey(fileobj, 0, events, data) + self.keys[fileobj] = key + return key - def poll(self, timeout=None): + def unregister(self, fileobj): + key = self.keys.pop(fileobj) + return key + + def select(self, timeout=None): block = False - for fob in self._file_objs: - if isinstance(fob, TelnetAlike): - block = fob.sock.block + for fileobj in self.keys: + if isinstance(fileobj, TelnetAlike): + block = fileobj.sock.block + break if block: return [] else: - return zip(self._file_objs, [select.POLLIN]*len(self._file_objs)) + return [(key, key.events) for key in self.keys.values()] - def unregister(self, fd): - self._file_objs.remove(fd) @contextlib.contextmanager def test_socket(reads): @@ -159,7 +150,7 @@ socket.create_connection = old_conn return -def test_telnet(reads=(), cls=TelnetAlike, use_poll=None): +def test_telnet(reads=(), cls=TelnetAlike): ''' return a telnetlib.Telnet object that uses a SocketStub with reads queued up to be read ''' for x in reads: @@ -167,29 +158,14 @@ with test_socket(reads): telnet = cls('dummy', 0) telnet._messages = '' # debuglevel output - if use_poll is not None: - if use_poll and not telnet._has_poll: - raise unittest.SkipTest('select.poll() required.') - telnet._has_poll = use_poll return telnet - class ExpectAndReadTestCase(TestCase): def setUp(self): - self.old_select = select.select - select.select = mock_select - self.old_poll = False - if hasattr(select, 'poll'): - self.old_poll = select.poll - select.poll = MockPoller - MockPoller.test_case = self - + self.old_selector = telnetlib._TelnetSelector + telnetlib._TelnetSelector = MockSelector def tearDown(self): - if self.old_poll: - MockPoller.test_case = None - select.poll = self.old_poll - select.select = self.old_select - + telnetlib._TelnetSelector = self.old_selector class ReadTests(ExpectAndReadTestCase): def test_read_until(self): @@ -208,22 +184,6 @@ data = telnet.read_until(b'match') self.assertEqual(data, expect) - def test_read_until_with_poll(self): - """Use select.poll() to implement telnet.read_until().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=True) - select.select = lambda *_: self.fail('unexpected select() call.') - data = telnet.read_until(b'match') - self.assertEqual(data, b''.join(want[:-1])) - - def test_read_until_with_select(self): - """Use select.select() to implement telnet.read_until().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=False) - if self.old_poll: - select.poll = lambda *_: self.fail('unexpected poll() call.') - data = telnet.read_until(b'match') - self.assertEqual(data, b''.join(want[:-1])) def test_read_all(self): """ @@ -427,23 +387,6 @@ (_,_,data) = telnet.expect([b'match']) self.assertEqual(data, b''.join(want[:-1])) - def test_expect_with_poll(self): - """Use select.poll() to implement telnet.expect().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=True) - select.select = lambda *_: self.fail('unexpected select() call.') - (_,_,data) = telnet.expect([b'match']) - self.assertEqual(data, b''.join(want[:-1])) - - def test_expect_with_select(self): - """Use select.select() to implement telnet.expect().""" - want = [b'x' * 10, b'match', b'y' * 10] - telnet = test_telnet(want, use_poll=False) - if self.old_poll: - select.poll = lambda *_: self.fail('unexpected poll() call.') - (_,_,data) = telnet.expect([b'match']) - self.assertEqual(data, b''.join(want[:-1])) - def test_main(verbose=None): support.run_unittest(GeneralTests, ReadTests, WriteTests, OptionTests, diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -591,6 +591,34 @@ self.assertCompiledIn('email/__init__.py', names) self.assertCompiledIn('email/mime/text.py', names) + def test_write_filtered_python_package(self): + import test + packagedir = os.path.dirname(test.__file__) + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + + # first make sure that the test folder gives error messages + # (on the badsyntax_... files) + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir) + reportStr = reportSIO.getvalue() + self.assertTrue('SyntaxError' in reportStr) + + # then check that the filter works on the whole package + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir, filterfunc=lambda whatever: False) + reportStr = reportSIO.getvalue() + self.assertTrue('SyntaxError' not in reportStr) + + # then check that the filter works on individual files + with captured_stdout() as reportSIO: + zipfp.writepy(packagedir, filterfunc=lambda fn: + 'bad' not in fn) + reportStr = reportSIO.getvalue() + if reportStr: + print(reportStr) + self.assertTrue('SyntaxError' not in reportStr) + def test_write_with_optimization(self): import email packagedir = os.path.dirname(email.__file__) @@ -600,7 +628,7 @@ ext = '.pyo' if optlevel == 1 else '.pyc' with TemporaryFile() as t, \ - zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp: + zipfile.PyZipFile(t, "w", optimize=optlevel) as zipfp: zipfp.writepy(packagedir) names = zipfp.namelist() @@ -630,6 +658,26 @@ finally: shutil.rmtree(TESTFN2) + def test_write_python_directory_filtered(self): + os.mkdir(TESTFN2) + try: + with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: + fp.write("print(42)\n") + + with open(os.path.join(TESTFN2, "mod2.py"), "w") as fp: + fp.write("print(42 * 42)\n") + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + zipfp.writepy(TESTFN2, filterfunc=lambda fn: + not fn.endswith('mod2.py')) + + names = zipfp.namelist() + self.assertCompiledIn('mod1.py', names) + self.assertNotIn('mod2.py', names) + + finally: + shutil.rmtree(TESTFN2) + def test_write_non_pyfile(self): with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: with open(TESTFN, 'w') as f: @@ -733,25 +781,25 @@ def test_extract_hackers_arcnames_windows_only(self): """Test combination of path fixing and windows name sanitization.""" windows_hacknames = [ - (r'..\foo\bar', 'foo/bar'), - (r'..\/foo\/bar', 'foo/bar'), - (r'foo/\..\/bar', 'foo/bar'), - (r'foo\/../\bar', 'foo/bar'), - (r'C:foo/bar', 'foo/bar'), - (r'C:/foo/bar', 'foo/bar'), - (r'C://foo/bar', 'foo/bar'), - (r'C:\foo\bar', 'foo/bar'), - (r'//conky/mountpoint/foo/bar', 'foo/bar'), - (r'\\conky\mountpoint\foo\bar', 'foo/bar'), - (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), - (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), - (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), - (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), - (r'//?/C:/foo/bar', 'foo/bar'), - (r'\\?\C:\foo\bar', 'foo/bar'), - (r'C:/../C:/foo/bar', 'C_/foo/bar'), - (r'a:b\ce|f"g?h*i', 'b/c_d_e_f_g_h_i'), - ('../../foo../../ba..r', 'foo/ba..r'), + (r'..\foo\bar', 'foo/bar'), + (r'..\/foo\/bar', 'foo/bar'), + (r'foo/\..\/bar', 'foo/bar'), + (r'foo\/../\bar', 'foo/bar'), + (r'C:foo/bar', 'foo/bar'), + (r'C:/foo/bar', 'foo/bar'), + (r'C://foo/bar', 'foo/bar'), + (r'C:\foo\bar', 'foo/bar'), + (r'//conky/mountpoint/foo/bar', 'foo/bar'), + (r'\\conky\mountpoint\foo\bar', 'foo/bar'), + (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), + (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), + (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), + (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), + (r'//?/C:/foo/bar', 'foo/bar'), + (r'\\?\C:\foo\bar', 'foo/bar'), + (r'C:/../C:/foo/bar', 'C_/foo/bar'), + (r'a:b\ce|f"g?h*i', 'b/c_d_e_f_g_h_i'), + ('../../foo../../ba..r', 'foo/ba..r'), ] self._test_extract_hackers_arcnames(windows_hacknames) @@ -877,10 +925,10 @@ def test_unsupported_version(self): # File has an extract_version of 120 data = (b'PK\x03\x04x\x00\x00\x00\x00\x00!p\xa1@\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00' - b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06' - b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00') + b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00' + b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06' + b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00') self.assertRaises(NotImplementedError, zipfile.ZipFile, io.BytesIO(data), 'r') @@ -1066,11 +1114,11 @@ def test_unsupported_compression(self): # data is declared as shrunk, but actually deflated data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00' - b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' - b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' - b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' - b'/\x00\x00\x00!\x00\x00\x00\x00\x00') + b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01' + b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00' + b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00' + b'/\x00\x00\x00!\x00\x00\x00\x00\x00') with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: self.assertRaises(NotImplementedError, zipf.open, 'x') @@ -1232,57 +1280,57 @@ class StoredBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_STORED zip_with_bad_crc = ( - b'PK\003\004\024\0\0\0\0\0 \213\212;:r' - b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' - b'ilehello,AworldP' - b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' - b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' - b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' - b'lePK\005\006\0\0\0\0\001\0\001\0003\000' - b'\0\0/\0\0\0\0\0') + b'PK\003\004\024\0\0\0\0\0 \213\212;:r' + b'\253\377\f\0\0\0\f\0\0\0\005\0\0\000af' + b'ilehello,AworldP' + b'K\001\002\024\003\024\0\0\0\0\0 \213\212;:' + b'r\253\377\f\0\0\0\f\0\0\0\005\0\0\0\0' + b'\0\0\0\0\0\0\0\200\001\0\0\0\000afi' + b'lePK\005\006\0\0\0\0\001\0\001\0003\000' + b'\0\0/\0\0\0\0\0') @requires_zlib class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED zip_with_bad_crc = ( - b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' - b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' - b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' - b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' - b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' - b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') + b'PK\x03\x04\x14\x00\x00\x00\x08\x00n}\x0c=FA' + b'KE\x10\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ile\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\xc9\xa0' + b'=\x13\x00PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00n' + b'}\x0c=FAKE\x10\x00\x00\x00n\x00\x00\x00\x05' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00' + b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' + b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') @requires_bz2 class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 zip_with_bad_crc = ( - b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA' - b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ileBZh91AY&SY\xd4\xa8\xca' - b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5' - b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f' - b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14' - b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8' - b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK' - b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' - b'\x00\x00\x00\x00') + b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA' + b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ileBZh91AY&SY\xd4\xa8\xca' + b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5' + b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f' + b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14' + b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8' + b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK' + b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' + b'\x00\x00\x00\x00') @requires_lzma class LzmaBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_LZMA zip_with_bad_crc = ( - b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA' - b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' - b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I' - b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK' - b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA' - b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil' - b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00' - b'\x00>\x00\x00\x00\x00\x00') + b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA' + b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af' + b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I' + b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK' + b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA' + b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil' + b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00' + b'\x00>\x00\x00\x00\x00\x00') class DecryptionTests(unittest.TestCase): @@ -1291,22 +1339,22 @@ ZIP file.""" data = ( - b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' - b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' - b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' - b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' - b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' - b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' - b'\x00\x00L\x00\x00\x00\x00\x00' ) + b'PK\x03\x04\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00\x1a\x00' + b'\x00\x00\x08\x00\x00\x00test.txt\xfa\x10\xa0gly|\xfa-\xc5\xc0=\xf9y' + b'\x18\xe0\xa8r\xb3Z}Lg\xbc\xae\xf9|\x9b\x19\xe4\x8b\xba\xbb)\x8c\xb0\xdbl' + b'PK\x01\x02\x14\x00\x14\x00\x01\x00\x00\x00n\x92i.#y\xef?&\x00\x00\x00' + b'\x1a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\xb6\x81' + b'\x00\x00\x00\x00test.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x006\x00' + b'\x00\x00L\x00\x00\x00\x00\x00' ) data2 = ( - b'PK\x03\x04\x14\x00\t\x00\x08\x00\xcf}38xu\xaa\xb2\x14\x00\x00\x00\x00\x02' - b'\x00\x00\x04\x00\x15\x00zeroUT\t\x00\x03\xd6\x8b\x92G\xda\x8b\x92GUx\x04' - b'\x00\xe8\x03\xe8\x03\xc7 ZIP64_LIMIT or compress_size > ZIP64_LIMIT: if not zip64: raise LargeZipFile("Filesize would require ZIP64 extensions") @@ -395,10 +395,10 @@ self.create_version = max(min_version, self.create_version) filename, flag_bits = self._encodeFilenameFlags() header = struct.pack(structFileHeader, stringFileHeader, - self.extract_version, self.reserved, flag_bits, - self.compress_type, dostime, dosdate, CRC, - compress_size, file_size, - len(filename), len(extra)) + self.extract_version, self.reserved, flag_bits, + self.compress_type, dostime, dosdate, CRC, + compress_size, file_size, + len(filename), len(extra)) return header + filename + extra def _encodeFilenameFlags(self): @@ -511,7 +511,7 @@ def _init(self): props = lzma._encode_filter_properties({'id': lzma.FILTER_LZMA1}) self._comp = lzma.LZMACompressor(lzma.FORMAT_RAW, filters=[ - lzma._decode_filter_properties(lzma.FILTER_LZMA1, props) + lzma._decode_filter_properties(lzma.FILTER_LZMA1, props) ]) return struct.pack(' MAX_EXTRACT_VERSION: raise NotImplementedError("zip file version %.1f" % (x.extract_version / 10)) @@ -1025,7 +1025,7 @@ # Convert date/time code to (year, month, day, hour, min, sec) x._raw_time = t x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, - t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) + t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) x._decodeExtra() x.header_offset = x.header_offset + concat @@ -1103,7 +1103,7 @@ if len(comment) >= ZIP_MAX_COMMENT: if self.debug: print('Archive comment is too long; truncating to %d bytes' - % ZIP_MAX_COMMENT) + % ZIP_MAX_COMMENT) comment = comment[:ZIP_MAX_COMMENT] self._comment = comment self._didModify = True @@ -1121,7 +1121,7 @@ raise TypeError("pwd: expected bytes, got %s" % type(pwd)) if not self.fp: raise RuntimeError( - "Attempt to read ZIP archive that was already closed") + "Attempt to read ZIP archive that was already closed") # Only open a new file for instances where we were not # given a file object in the constructor @@ -1294,7 +1294,7 @@ raise RuntimeError('write() requires mode "w" or "a"') if not self.fp: raise RuntimeError( - "Attempt to write ZIP archive that was already closed") + "Attempt to write ZIP archive that was already closed") _check_compression(zinfo.compress_type) if zinfo.file_size > ZIP64_LIMIT: if not self._allowZip64: @@ -1302,14 +1302,14 @@ if zinfo.header_offset > ZIP64_LIMIT: if not self._allowZip64: raise LargeZipFile( - "Zipfile size would require ZIP64 extensions") + "Zipfile size would require ZIP64 extensions") def write(self, filename, arcname=None, compress_type=None): """Put the bytes from filename into the archive under the name arcname.""" if not self.fp: raise RuntimeError( - "Attempt to write to ZIP archive that was already closed") + "Attempt to write to ZIP archive that was already closed") st = os.stat(filename) isdir = stat.S_ISDIR(st.st_mode) @@ -1356,7 +1356,7 @@ zinfo.compress_size = compress_size = 0 # Compressed size can be larger than uncompressed size zip64 = self._allowZip64 and \ - zinfo.file_size * 1.05 > ZIP64_LIMIT + zinfo.file_size * 1.05 > ZIP64_LIMIT self.fp.write(zinfo.FileHeader(zip64)) file_size = 0 while 1: @@ -1410,7 +1410,7 @@ if not self.fp: raise RuntimeError( - "Attempt to write to ZIP archive that was already closed") + "Attempt to write to ZIP archive that was already closed") zinfo.file_size = len(data) # Uncompressed size zinfo.header_offset = self.fp.tell() # Start of header data @@ -1430,7 +1430,7 @@ else: zinfo.compress_size = zinfo.file_size zip64 = zinfo.file_size > ZIP64_LIMIT or \ - zinfo.compress_size > ZIP64_LIMIT + zinfo.compress_size > ZIP64_LIMIT if zip64 and not self._allowZip64: raise LargeZipFile("Filesize would require ZIP64 extensions") self.fp.write(zinfo.FileHeader(zip64)) @@ -1439,7 +1439,7 @@ # Write CRC and file sizes after the file data fmt = ' ZIP64_LIMIT \ - or zinfo.compress_size > ZIP64_LIMIT: + or zinfo.compress_size > ZIP64_LIMIT: extra.append(zinfo.file_size) extra.append(zinfo.compress_size) file_size = 0xffffffff @@ -1485,8 +1485,8 @@ if extra: # Append a ZIP64 field to the extra's extra_data = struct.pack( - ' ZIP64_LIMIT): # Need to write the ZIP64 end-of-archive records zip64endrec = struct.pack( - structEndArchive64, stringEndArchive64, - 44, 45, 45, 0, 0, centDirCount, centDirCount, - centDirSize, centDirOffset) + structEndArchive64, stringEndArchive64, + 44, 45, 45, 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset) self.fp.write(zip64endrec) zip64locrec = struct.pack( - structEndArchive64Locator, - stringEndArchive64Locator, 0, pos2, 1) + structEndArchive64Locator, + stringEndArchive64Locator, 0, pos2, 1) self.fp.write(zip64locrec) centDirCount = min(centDirCount, 0xFFFF) centDirSize = min(centDirSize, 0xFFFFFFFF) centDirOffset = min(centDirOffset, 0xFFFFFFFF) endrec = struct.pack(structEndArchive, stringEndArchive, - 0, 0, centDirCount, centDirCount, - centDirSize, centDirOffset, len(self._comment)) + 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset, len(self._comment)) self.fp.write(endrec) self.fp.write(self._comment) self.fp.flush() @@ -1566,7 +1566,7 @@ allowZip64=allowZip64) self._optimize = optimize - def writepy(self, pathname, basename=""): + def writepy(self, pathname, basename="", filterfunc=None): """Add all files from "pathname" to the ZIP archive. If pathname is a package directory, search the directory and @@ -1577,7 +1577,14 @@ archive. Added modules are always module.pyo or module.pyc. This method will compile the module.py into module.pyc if necessary. + If filterfunc(pathname) is given, it is called with every argument. + When it is False, the file or directory is skipped. """ + if filterfunc and not filterfunc(pathname): + if self.debug: + label = 'path' if os.path.isdir(pathname) else 'file' + print('%s "%s" skipped by filterfunc' % (label, pathname)) + return dir, name = os.path.split(pathname) if os.path.isdir(pathname): initname = os.path.join(pathname, "__init__.py") @@ -1602,10 +1609,15 @@ if os.path.isdir(path): if os.path.isfile(os.path.join(path, "__init__.py")): # This is a package directory, add it - self.writepy(path, basename) # Recursive call + self.writepy(path, basename, + filterfunc=filterfunc) # Recursive call elif ext == ".py": + if filterfunc and not filterfunc(path): + if self.debug: + print('file "%s" skipped by filterfunc' % path) + continue fname, arcname = self._get_codename(path[0:-3], - basename) + basename) if self.debug: print("Adding", arcname) self.write(fname, arcname) @@ -1617,15 +1629,19 @@ path = os.path.join(pathname, filename) root, ext = os.path.splitext(filename) if ext == ".py": + if filterfunc and not filterfunc(path): + if self.debug: + print('file "%s" skipped by filterfunc' % path) + continue fname, arcname = self._get_codename(path[0:-3], - basename) + basename) if self.debug: print("Adding", arcname) self.write(fname, arcname) else: if pathname[-3:] != ".py": raise RuntimeError( - 'Files added with writepy() must end with ".py"') + 'Files added with writepy() must end with ".py"') fname, arcname = self._get_codename(pathname[0:-3], basename) if self.debug: print("Adding file", arcname) @@ -1764,7 +1780,7 @@ elif os.path.isdir(path): for nm in os.listdir(path): addToZip(zf, - os.path.join(path, nm), os.path.join(zippath, nm)) + os.path.join(path, nm), os.path.join(zippath, nm)) # else: ignore with ZipFile(args[1], 'w', allowZip64=True) as zf: diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -818,6 +818,7 @@ Simon Mathieu Laura Matson Graham Matthews +Martin Matusiak Dieter Maurer Daniel May Madison May diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -3,19 +3,52 @@ +++++++++++ What's New in Python 3.4.0 Beta 1? -================================ +================================== Projected release date: 2013-11-24 Core and Builtins ----------------- +- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the + Python executable and not removed by the linker's optimizer. + +- Issue #19306: Add extra hints to the faulthandler module's stack + dumps that these are "upside down". + Library ------- +- Issue #16595: Add prlimit() to resource module. + +- Issue #19324: Expose Linux-specific constants in resource module. + +- Issue #17400: ipaddress should make it easy to identify rfc6598 addresses. + +- Load SSL's error strings in hashlib. + +- Issue #18527: Upgrade internal copy of zlib to 1.2.8. + +- Issue #19274: Add a filterfunc parameter to PyZipFile.writepy. + +- Issue #8964: fix platform._sys_version to handle IronPython 2.6+. + Patch by Martin Matusiak. + +- Issue #18958: Improve error message for json.load(s) while passing a string + that starts with a UTF-8 BOM. + +- Issue #19307: Improve error message for json.load(s) while passing objects + of the wrong type. + +- Issue #16038: CVE-2013-1752: ftplib: Limit amount of data read by + limiting the call to readline(). Original patch by Micha?? + Jastrz??bski and Giampaolo Rodola. + +- Issue #17087: Improved the repr for regular expression match objects. + What's New in Python 3.4.0 Alpha 4? -================================ +=================================== Release date: 2013-10-20 @@ -25,7 +58,7 @@ - Issue #19301: Give classes and functions that are explicitly marked global a global qualname. -- Issue #19279: UTF-7 decoder no more produces illegal strings. +- Issue #19279: UTF-7 decoder no longer produces illegal strings. - Issue #16612: Add "Argument Clinic", a compile-time preprocessor for C files to generate argument parsing code. (See PEP 436.) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -513,10 +513,11 @@ * Also OpenSSL < 1.0 don't provide PKCS5_PBKDF2_HMAC(), only * PKCS5_PBKDF2_SHA1. */ -int PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, - const unsigned char *salt, int saltlen, - int iter, const EVP_MD *digest, - int keylen, unsigned char *out) +static int +PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen, + const unsigned char *salt, int saltlen, + int iter, const EVP_MD *digest, + int keylen, unsigned char *out) { unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; int cplen, j, k, tkeylen, mdlen; @@ -846,6 +847,7 @@ PyObject *m, *openssl_md_meth_names; OpenSSL_add_all_digests(); + ERR_load_crypto_strings(); /* TODO build EVP_functions openssl_* entries dynamically based * on what hashes are supported rather than listing many @@ -870,10 +872,8 @@ return NULL; } -#if HASH_OBJ_CONSTRUCTOR - Py_INCREF(&EVPtype); + Py_INCREF((PyObject *)&EVPtype); PyModule_AddObject(m, "HASH", (PyObject *)&EVPtype); -#endif /* these constants are used by the convenience constructors */ INIT_CONSTRUCTOR_CONSTANTS(md5); diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -576,10 +576,18 @@ PyMODINIT_FUNC PyInit__sha3(void) { + PyObject *m; + Py_TYPE(&SHA3type) = &PyType_Type; if (PyType_Ready(&SHA3type) < 0) { return NULL; } - return PyModule_Create(&_SHA3module); + m = PyModule_Create(&_SHA3module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA3type); + PyModule_AddObject(m, "SHA3Type", (PyObject *)&SHA3type); + return m; } diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -3637,6 +3637,22 @@ return match_regs(self); } +static PyObject * +match_repr(MatchObject *self) +{ + PyObject *result; + PyObject *group0 = match_getslice_by_index(self, 0, Py_None); + if (group0 == NULL) + return NULL; + result = PyUnicode_FromFormat( + "<%s object; span=(%d, %d), match=%.50R>", + Py_TYPE(self)->tp_name, + self->mark[0], self->mark[1], group0); + Py_DECREF(group0); + return result; +} + + static PyGetSetDef match_getset[] = { {"lastindex", (getter)match_lastindex_get, (setter)NULL}, {"lastgroup", (getter)match_lastgroup_get, (setter)NULL}, @@ -3665,7 +3681,7 @@ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ - 0, /* tp_repr */ + (reprfunc)match_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ diff --git a/Modules/md5module.c b/Modules/md5module.c --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -572,8 +572,17 @@ PyMODINIT_FUNC PyInit__md5(void) { + PyObject *m; + Py_TYPE(&MD5type) = &PyType_Type; if (PyType_Ready(&MD5type) < 0) return NULL; - return PyModule_Create(&_md5module); + + m = PyModule_Create(&_md5module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&MD5type); + PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); + return m; } diff --git a/Modules/resource.c b/Modules/resource.c --- a/Modules/resource.c +++ b/Modules/resource.c @@ -106,6 +106,44 @@ return result; } +static int +py2rlimit(PyObject *curobj, PyObject *maxobj, struct rlimit *rl_out) +{ +#if !defined(HAVE_LARGEFILE_SUPPORT) + rl_out->rlim_cur = PyLong_AsLong(curobj); + if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + return -1; + rl_out->rlim_max = PyLong_AsLong(maxobj); + if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) + return -1; +#else + /* The limits are probably bigger than a long */ + rl_out->rlim_cur = PyLong_AsLongLong(curobj); + if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + return -1; + rl_out->rlim_max = PyLong_AsLongLong(maxobj); + if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) + return -1; +#endif + + rl_out->rlim_cur = rl_out->rlim_cur & RLIM_INFINITY; + rl_out->rlim_max = rl_out->rlim_max & RLIM_INFINITY; + return 0; + +} + +static PyObject* +rlimit2py(struct rlimit rl) +{ +#if defined(HAVE_LONG_LONG) + if (sizeof(rl.rlim_cur) > sizeof(long)) { + return Py_BuildValue("LL", + (PY_LONG_LONG) rl.rlim_cur, + (PY_LONG_LONG) rl.rlim_max); + } +#endif + return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); +} static PyObject * resource_getrlimit(PyObject *self, PyObject *args) @@ -126,15 +164,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - -#if defined(HAVE_LONG_LONG) - if (sizeof(rl.rlim_cur) > sizeof(long)) { - return Py_BuildValue("LL", - (PY_LONG_LONG) rl.rlim_cur, - (PY_LONG_LONG) rl.rlim_max); - } -#endif - return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); + return rlimit2py(rl); } static PyObject * @@ -166,25 +196,10 @@ curobj = PyTuple_GET_ITEM(limits, 0); maxobj = PyTuple_GET_ITEM(limits, 1); -#if !defined(HAVE_LARGEFILE_SUPPORT) - rl.rlim_cur = PyLong_AsLong(curobj); - if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) + if (py2rlimit(curobj, maxobj, &rl) < 0) { goto error; - rl.rlim_max = PyLong_AsLong(maxobj); - if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) - goto error; -#else - /* The limits are probably bigger than a long */ - rl.rlim_cur = PyLong_AsLongLong(curobj); - if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) - goto error; - rl.rlim_max = PyLong_AsLongLong(maxobj); - if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) - goto error; -#endif + } - rl.rlim_cur = rl.rlim_cur & RLIM_INFINITY; - rl.rlim_max = rl.rlim_max & RLIM_INFINITY; if (setrlimit(resource, &rl) == -1) { if (errno == EINVAL) PyErr_SetString(PyExc_ValueError, @@ -205,6 +220,48 @@ return NULL; } +#ifdef HAVE_PRLIMIT +static PyObject * +resource_prlimit(PyObject *self, PyObject *args) +{ + struct rlimit old_limit, new_limit; + int resource, retval; + pid_t pid; + PyObject *curobj=NULL, *maxobj=NULL; + + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i|(OO):prlimit", + &pid, &resource, &curobj, &maxobj)) + return NULL; + + if (resource < 0 || resource >= RLIM_NLIMITS) { + PyErr_SetString(PyExc_ValueError, + "invalid resource specified"); + return NULL; + } + + if (curobj != NULL) { + if (py2rlimit(curobj, maxobj, &new_limit) < 0) { + return NULL; + } + retval = prlimit(pid, resource, &new_limit, &old_limit); + } + else { + retval = prlimit(pid, resource, NULL, &old_limit); + } + + if (retval == -1) { + if (errno == EINVAL) { + PyErr_SetString(PyExc_ValueError, + "current limit exceeds maximum limit"); + } else { + PyErr_SetFromErrno(PyExc_OSError); + } + return NULL; + } + return rlimit2py(old_limit); +} +#endif /* HAVE_PRLIMIT */ + static PyObject * resource_getpagesize(PyObject *self, PyObject *unused) { @@ -229,6 +286,9 @@ resource_methods[] = { {"getrusage", resource_getrusage, METH_VARARGS}, {"getrlimit", resource_getrlimit, METH_VARARGS}, +#ifdef HAVE_PRLIMIT + {"prlimit", resource_prlimit, METH_VARARGS}, +#endif {"setrlimit", resource_setrlimit, METH_VARARGS}, {"getpagesize", resource_getpagesize, METH_NOARGS}, {NULL, NULL} /* sentinel */ @@ -326,6 +386,28 @@ PyModule_AddIntMacro(m, RLIMIT_SBSIZE); #endif +/* Linux specific */ +#ifdef RLIMIT_MSGQUEUE + PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE); +#endif + +#ifdef RLIMIT_NICE + PyModule_AddIntMacro(m, RLIMIT_NICE); +#endif + +#ifdef RLIMIT_RTPRIO + PyModule_AddIntMacro(m, RLIMIT_RTPRIO); +#endif + +#ifdef RLIMIT_RTTIME + PyModule_AddIntMacro(m, RLIMIT_RTTIME); +#endif + +#ifdef RLIMIT_SIGPENDING + PyModule_AddIntMacro(m, RLIMIT_SIGPENDING); +#endif + +/* target */ #ifdef RUSAGE_SELF PyModule_AddIntMacro(m, RUSAGE_SELF); #endif diff --git a/Modules/sha1module.c b/Modules/sha1module.c --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -544,8 +544,17 @@ PyMODINIT_FUNC PyInit__sha1(void) { + PyObject *m; + Py_TYPE(&SHA1type) = &PyType_Type; if (PyType_Ready(&SHA1type) < 0) return NULL; - return PyModule_Create(&_sha1module); + + m = PyModule_Create(&_sha1module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA1type); + PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); + return m; } diff --git a/Modules/sha256module.c b/Modules/sha256module.c --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -706,11 +706,23 @@ PyMODINIT_FUNC PyInit__sha256(void) { + PyObject *m; + Py_TYPE(&SHA224type) = &PyType_Type; if (PyType_Ready(&SHA224type) < 0) return NULL; Py_TYPE(&SHA256type) = &PyType_Type; if (PyType_Ready(&SHA256type) < 0) return NULL; - return PyModule_Create(&_sha256module); + + m = PyModule_Create(&_sha256module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA224type); + PyModule_AddObject(m, "SHA224Type", (PyObject *)&SHA224type); + Py_INCREF((PyObject *)&SHA256type); + PyModule_AddObject(m, "SHA256Type", (PyObject *)&SHA256type); + return m; + } diff --git a/Modules/sha512module.c b/Modules/sha512module.c --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -772,13 +772,24 @@ PyMODINIT_FUNC PyInit__sha512(void) { + PyObject *m; + Py_TYPE(&SHA384type) = &PyType_Type; if (PyType_Ready(&SHA384type) < 0) return NULL; Py_TYPE(&SHA512type) = &PyType_Type; if (PyType_Ready(&SHA512type) < 0) return NULL; - return PyModule_Create(&_sha512module); + + m = PyModule_Create(&_sha512module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA384type); + PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); + Py_INCREF((PyObject *)&SHA512type); + PyModule_AddObject(m, "SHA512Type", (PyObject *)&SHA512type); + return m; } #endif diff --git a/Modules/zlib/ChangeLog b/Modules/zlib/ChangeLog --- a/Modules/zlib/ChangeLog +++ b/Modules/zlib/ChangeLog @@ -1,12 +1,276 @@ ChangeLog file for zlib +Changes in 1.2.8 (28 Apr 2013) +- Update contrib/minizip/iowin32.c for Windows RT [Vollant] +- Do not force Z_CONST for C++ +- Clean up contrib/vstudio [Ro?] +- Correct spelling error in zlib.h +- Fix mixed line endings in contrib/vstudio + +Changes in 1.2.7.3 (13 Apr 2013) +- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc + +Changes in 1.2.7.2 (13 Apr 2013) +- Change check for a four-byte type back to hexadecimal +- Fix typo in win32/Makefile.msc +- Add casts in gzwrite.c for pointer differences + +Changes in 1.2.7.1 (24 Mar 2013) +- Replace use of unsafe string functions with snprintf if available +- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] +- Fix gzgetc undefine when Z_PREFIX set [Turk] +- Eliminate use of mktemp in Makefile (not always available) +- Fix bug in 'F' mode for gzopen() +- Add inflateGetDictionary() function +- Correct comment in deflate.h +- Use _snprintf for snprintf in Microsoft C +- On Darwin, only use /usr/bin/libtool if libtool is not Apple +- Delete "--version" file if created by "ar --version" [Richard G.] +- Fix configure check for veracity of compiler error return codes +- Fix CMake compilation of static lib for MSVC2010 x64 +- Remove unused variable in infback9.c +- Fix argument checks in gzlog_compress() and gzlog_write() +- Clean up the usage of z_const and respect const usage within zlib +- Clean up examples/gzlog.[ch] comparisons of different types +- Avoid shift equal to bits in type (caused endless loop) +- Fix unintialized value bug in gzputc() introduced by const patches +- Fix memory allocation error in examples/zran.c [Nor] +- Fix bug where gzopen(), gzclose() would write an empty file +- Fix bug in gzclose() when gzwrite() runs out of memory +- Check for input buffer malloc failure in examples/gzappend.c +- Add note to contrib/blast to use binary mode in stdio +- Fix comparisons of differently signed integers in contrib/blast +- Check for invalid code length codes in contrib/puff +- Fix serious but very rare decompression bug in inftrees.c +- Update inflateBack() comments, since inflate() can be faster +- Use underscored I/O function names for WINAPI_FAMILY +- Add _tr_flush_bits to the external symbols prefixed by --zprefix +- Add contrib/vstudio/vc10 pre-build step for static only +- Quote --version-script argument in CMakeLists.txt +- Don't specify --version-script on Apple platforms in CMakeLists.txt +- Fix casting error in contrib/testzlib/testzlib.c +- Fix types in contrib/minizip to match result of get_crc_table() +- Simplify contrib/vstudio/vc10 with 'd' suffix +- Add TOP support to win32/Makefile.msc +- Suport i686 and amd64 assembler builds in CMakeLists.txt +- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h +- Add vc11 and vc12 build files to contrib/vstudio +- Add gzvprintf() as an undocumented function in zlib +- Fix configure for Sun shell +- Remove runtime check in configure for four-byte integer type +- Add casts and consts to ease user conversion to C++ +- Add man pages for minizip and miniunzip +- In Makefile uninstall, don't rm if preceding cd fails +- Do not return Z_BUF_ERROR if deflateParam() has nothing to write + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no libary use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + Changes in 1.2.5 (19 Apr 2010) - Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] - Default to libdir as sharedlibdir in configure [Nieder] - Update copyright dates on modified source files - Update trees.c to be able to generate modified trees.h - Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] Changes in 1.2.4.5 (18 Apr 2010) - Set sharedlibdir in configure [Torok] @@ -261,7 +525,7 @@ - Clear bytes after deflate lookahead to avoid use of uninitialized data - Change a limit in inftrees.c to be more transparent to Coverity Prevent - Update win32/zlib.def with exported symbols from zlib.h -- Correct spelling error in zlib.h [Willem] +- Correct spelling errors in zlib.h [Willem, Sobrado] - Allow Z_BLOCK for deflate() to force a new block - Allow negative bits in inflatePrime() to delete existing bit buffer - Add Z_TREES flush option to inflate() to return at end of trees diff --git a/Modules/zlib/FAQ b/Modules/zlib/FAQ --- a/Modules/zlib/FAQ +++ b/Modules/zlib/FAQ @@ -44,8 +44,8 @@ 6. Where's the zlib documentation (man pages, etc.)? - It's in zlib.h . Examples of zlib usage are in the files example.c and - minigzip.c, with more in examples/ . + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . 7. Why don't you use GNU autoconf or libtool or ...? @@ -84,8 +84,10 @@ 13. How can I make a Unix shared library? - make clean - ./configure -s + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure make 14. How do I install a shared zlib library on Unix? @@ -325,7 +327,7 @@ correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate - specficiation in RFC 1951, most notably Microsoft. So even though the + specification in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to diff --git a/Modules/zlib/INDEX b/Modules/zlib/INDEX --- a/Modules/zlib/INDEX +++ b/Modules/zlib/INDEX @@ -7,6 +7,9 @@ README guess what configure configure script for Unix make_vms.com makefile for VMS +test/example.c zlib usages examples for build testing +test/minigzip.c minimal gzip-like functionality for build testing +test/infcover.c inf*.c code coverage for build coverage testing treebuild.xml XML description of source file dependencies zconf.h.cmakein zconf.h template for cmake zconf.h.in zconf.h template for configure @@ -14,9 +17,11 @@ zlib.3.pdf Man page in PDF format zlib.map Linux symbol information zlib.pc.in Template for pkg-config descriptor +zlib.pc.cmakein zlib.pc template for cmake zlib2ansi perl script to convert source files for C++ compilation amiga/ makefiles for Amiga SAS C +as400/ makefiles for AS/400 doc/ documentation for formats and algorithms msdos/ makefiles for MSDOS nintendods/ makefile for Nintendo DS @@ -56,10 +61,8 @@ zutil.c zutil.h - source files for sample programs: -example.c -minigzip.c -See examples/README.examples for more + source files for sample programs +See examples/README.examples - unsupported contribution by third parties + unsupported contributions by third parties See contrib/README.contrib diff --git a/Modules/zlib/Makefile.in b/Modules/zlib/Makefile.in --- a/Modules/zlib/Makefile.in +++ b/Modules/zlib/Makefile.in @@ -1,5 +1,5 @@ # Makefile for zlib -# Copyright (C) 1995-2010 Jean-loup Gailly. +# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler # For conditions of distribution and use, see copyright notice in zlib.h # To compile and test, type: @@ -32,11 +32,12 @@ STATICLIB=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.5 +SHAREDLIBV=libz.so.1.2.8 SHAREDLIBM=libz.so.1 LIBS=$(STATICLIB) $(SHAREDLIBV) -AR=ar rc +AR=ar +ARFLAGS=rc RANLIB=ranlib LDCONFIG=ldconfig LDSHAREDLIBC=-lc @@ -53,11 +54,13 @@ man3dir = ${mandir}/man3 pkgconfigdir = ${libdir}/pkgconfig -OBJC = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ - gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) -PIC_OBJC = adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo \ - gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) # to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo OBJA = @@ -80,35 +83,49 @@ test: all teststatic testshared teststatic: static - @if echo hello world | ./minigzip | ./minigzip -d && ./example; then \ + @TMPST=tmpst_$$; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ echo ' *** zlib test OK ***'; \ else \ echo ' *** zlib test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMPST testshared: shared @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh; then \ + TMPSH=tmpsh_$$; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ echo ' *** zlib shared test OK ***'; \ else \ echo ' *** zlib shared test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMPSH test64: all64 - @if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64; then \ + @TMP64=tmp64_$$; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ echo ' *** zlib 64-bit test OK ***'; \ else \ echo ' *** zlib 64-bit test FAILED ***'; false; \ - fi - - at rm -f foo.gz + fi; \ + rm -f $$TMP64 + +infcover.o: test/infcover.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c libz.a: $(OBJS) - $(AR) $@ $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 match.o: match.S @@ -123,11 +140,17 @@ mv _match.o match.lo rm -f _match.s -example64.o: example.c zlib.h zconf.h - $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ example.c +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c -minigzip64.o: minigzip.c zlib.h zconf.h - $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ minigzip.c +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +example64.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/example.c + +minigzip64.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/minigzip.c .SUFFIXES: .lo @@ -136,7 +159,7 @@ $(CC) $(SFLAGS) -DPIC -c -o objs/$*.o $< - at mv objs/$*.o $@ -$(SHAREDLIBV): $(PIC_OBJS) +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) rm -f $(SHAREDLIB) $(SHAREDLIBM) ln -s $@ $(SHAREDLIB) @@ -168,14 +191,16 @@ - at if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi - at if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi cp $(STATICLIB) $(DESTDIR)$(libdir) - cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir) - cd $(DESTDIR)$(libdir); chmod u=rw,go=r $(STATICLIB) - -@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - - at cd $(DESTDIR)$(sharedlibdir); if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ - chmod 755 $(SHAREDLIBV); \ - rm -f $(SHAREDLIB) $(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + - at if test -n "$(SHAREDLIBV)"; then \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ ($(LDCONFIG) || true) >/dev/null 2>&1; \ fi cp zlib.3 $(DESTDIR)$(man3dir) @@ -191,22 +216,25 @@ chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h uninstall: - cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h - cd $(DESTDIR)$(libdir); rm -f libz.a; \ - if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir) && rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ fi - cd $(DESTDIR)$(man3dir); rm -f zlib.3 - cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc + cd $(DESTDIR)$(man3dir) && rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc docs: zlib.3.pdf zlib.3.pdf: zlib.3 groff -mandoc -f H -T ps zlib.3 | ps2pdf - zlib.3.pdf -zconf.h.in: zconf.h.cmakein - sed "/^#cmakedefine/D" < zconf.h.cmakein > zconf.h.in - touch -r zconf.h.cmakein zconf.h.in +zconf.h.cmakein: zconf.h.in + -@ TEMPFILE=zconfh_$$; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE zconf.h.in > zconf.h.cmakein &&\ + touch -r zconf.h.in zconf.h.cmakein &&\ + rm $$TEMPFILE zconf: zconf.h.in cp -p zconf.h.in zconf.h @@ -216,13 +244,16 @@ rm -f *.o *.lo *~ \ example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ example64$(EXE) minigzip64$(EXE) \ + infcover \ libz.* foo.gz so_locations \ _match.s maketree contrib/infback9/*.o rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov maintainer-clean: distclean -distclean: clean zconf docs - rm -f Makefile zlib.pc +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log - at rm -f .DS_Store - at printf 'all:\n\t- at echo "Please use ./configure first. Thank you."\n' > Makefile - at printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile diff --git a/Modules/zlib/README b/Modules/zlib/README --- a/Modules/zlib/README +++ b/Modules/zlib/README @@ -1,22 +1,22 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.5 is a general purpose data compression library. All the code is +zlib 1.2.8 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib at gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. To compile all files and run the test program, follow the instructions given at the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use one -of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant @@ -31,7 +31,7 @@ issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.5 are documented in the file ChangeLog. +The changes made in version 1.2.8 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -44,7 +44,7 @@ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html . +http://docs.python.org/library/zlib.html . zlib is built into tcl: http://wiki.tcl.tk/4610 . @@ -84,7 +84,7 @@ Copyright notice: - (C) 1995-2010 Jean-loup Gailly and Mark Adler + (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/Modules/zlib/adler32.c b/Modules/zlib/adler32.c --- a/Modules/zlib/adler32.c +++ b/Modules/zlib/adler32.c @@ -1,5 +1,5 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2007 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,9 +9,9 @@ #define local static -local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); -#define BASE 65521UL /* largest prime smaller than 65536 */ +#define BASE 65521 /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -21,39 +21,44 @@ #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); -/* use NO_DIVIDE if your processor does not do division in hardware */ +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ #ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) # define MOD(a) \ do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ + CHOP(a); \ + MOD28(a); \ } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE -# define MOD4(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE #endif /* ========================================================================= */ @@ -92,7 +97,7 @@ } if (adler >= BASE) adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ + MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } @@ -137,8 +142,13 @@ unsigned long sum2; unsigned rem; + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); diff --git a/Modules/zlib/algorithm.txt b/Modules/zlib/algorithm.txt --- a/Modules/zlib/algorithm.txt +++ b/Modules/zlib/algorithm.txt @@ -121,7 +121,7 @@ kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code would take too long if you're only decoding several thousand symbols. At the other extreme, you could make a new table for every bit in the code. In fact, -that's essentially a Huffman tree. But then you spend two much time +that's essentially a Huffman tree. But then you spend too much time traversing the tree while decoding, even for short symbols. So the number of bits for the first lookup table is a trade of the time to @@ -206,4 +206,4 @@ pp. 337-343. ``DEFLATE Compressed Data Format Specification'' available in -http://www.ietf.org/rfc/rfc1951.txt +http://tools.ietf.org/html/rfc1951 diff --git a/Modules/zlib/compress.c b/Modules/zlib/compress.c --- a/Modules/zlib/compress.c +++ b/Modules/zlib/compress.c @@ -29,7 +29,7 @@ z_stream stream; int err; - stream.next_in = (Bytef*)source; + stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ diff --git a/Modules/zlib/configure b/Modules/zlib/configure --- a/Modules/zlib/configure +++ b/Modules/zlib/configure @@ -13,39 +13,52 @@ # If you have problems, try without defining CC and CFLAGS before reporting # an error. +# start off configure.log +echo -------------------- >> configure.log +echo $0 $* >> configure.log +date >> configure.log + +# set command prefix for cross-compilation if [ -n "${CHOST}" ]; then - uname="$(echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')" + uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" CROSS_PREFIX="${CHOST}-" fi +# destination name for static library STATICLIB=libz.a -LDFLAGS="${LDFLAGS} -L. ${STATICLIB}" + +# extract zlib version numbers from zlib.h VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h` VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` + +# establish commands for library building if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then AR=${AR-"${CROSS_PREFIX}ar"} - test -n "${CROSS_PREFIX}" && echo Using ${AR} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log else AR=${AR-"ar"} - test -n "${CROSS_PREFIX}" && echo Using ${AR} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log fi -AR_RC="${AR} rc" +ARFLAGS=${ARFLAGS-"rc"} if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} - test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log else RANLIB=${RANLIB-"ranlib"} fi if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then NM=${NM-"${CROSS_PREFIX}nm"} - test -n "${CROSS_PREFIX}" && echo Using ${NM} + test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log else NM=${NM-"nm"} fi + +# set defaults before processing command line options LDCONFIG=${LDCONFIG-"ldconfig"} LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +ARCHS= prefix=${prefix-/usr/local} exec_prefix=${exec_prefix-'${prefix}'} libdir=${libdir-'${exec_prefix}/lib'} @@ -54,20 +67,39 @@ mandir=${mandir-'${prefix}/share/man'} shared_ext='.so' shared=1 +solo=0 +cover=0 zprefix=0 +zconst=0 build64=0 gcc=0 old_cc="$CC" old_cflags="$CFLAGS" +OBJC='$(OBJZ) $(OBJG)' +PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)' +# leave this script, optionally in a bad way +leave() +{ + if test "$*" != "0"; then + echo "** $0 aborting." | tee -a configure.log + fi + rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version + echo -------------------- >> configure.log + echo >> configure.log + echo >> configure.log + exit $1 +} + +# process command line options while test $# -ge 1 do case "$1" in -h* | --help) - echo 'usage:' - echo ' configure [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' - echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' - echo ' [--includedir=INCLUDEDIR]' + echo 'usage:' | tee -a configure.log + echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log exit 0 ;; -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; @@ -81,51 +113,88 @@ -i* | --includedir) includedir="$2"; shift; shift ;; -s* | --shared | --enable-shared) shared=1; shift ;; -t | --static) shared=0; shift ;; + --solo) solo=1; shift ;; + --cover) cover=1; shift ;; -z* | --zprefix) zprefix=1; shift ;; -6* | --64) build64=1; shift ;; - --sysconfdir=*) echo "ignored option: --sysconfdir"; shift ;; - --localstatedir=*) echo "ignored option: --localstatedir"; shift ;; - *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1 ;; + -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;; + -c* | --const) zconst=1; shift ;; + *) + echo "unknown option: $1" | tee -a configure.log + echo "$0 --help for help" | tee -a configure.log + leave 1;; esac done +# temporary file name test=ztest$$ + +# put arguments in log, also put test file in log if used in arguments +show() +{ + case "$*" in + *$test.c*) + echo === $test.c === >> configure.log + cat $test.c >> configure.log + echo === >> configure.log;; + esac + echo $* >> configure.log +} + +# check for gcc vs. cc and set compile and link flags based on the system identified by uname cat > $test.c <&1` in + *gcc*) gcc=1 ;; esac -if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then +show $cc -c $test.c +if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then + echo ... using gcc >> configure.log CC="$cc" + CFLAGS="${CFLAGS--O3} ${ARCHS}" SFLAGS="${CFLAGS--O3} -fPIC" - CFLAGS="${CFLAGS--O3}" + LDFLAGS="${LDFLAGS} ${ARCHS}" if test $build64 -eq 1; then CFLAGS="${CFLAGS} -m64" SFLAGS="${SFLAGS} -m64" fi if test "${ZLIBGCCWARN}" = "YES"; then - CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + if test "$zconst" -eq 1; then + CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST" + else + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi fi if test -z "$uname"; then uname=`(uname -s || echo unknown) 2>/dev/null` fi case "$uname" in - Linux* | linux* | GNU | GNU/* | *BSD | DragonFly) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + Linux* | linux* | GNU | GNU/* | solaris*) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + *BSD | *bsd* | DragonFly) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} + LDCONFIG="ldconfig -m" ;; CYGWIN* | Cygwin* | cygwin* | OS/2*) EXE='.exe' ;; - MINGW*|mingw*) + MINGW* | mingw*) # temporary bypass rm -f $test.[co] $test $test$shared_ext - echo "Please use win32/Makefile.gcc instead." - exit 1 + echo "Please use win32/Makefile.gcc instead." | tee -a configure.log + leave 1 LDSHARED=${LDSHARED-"$cc -shared"} LDSHAREDLIBC="" EXE='.exe' ;; @@ -142,17 +211,25 @@ shared_ext='.sl' SHAREDLIB='libz.sl' ;; esac ;; - Darwin*) shared_ext='.dylib' + Darwin* | darwin*) + shared_ext='.dylib' SHAREDLIB=libz$shared_ext SHAREDLIBV=libz.$VER$shared_ext SHAREDLIBM=libz.$VER1$shared_ext - LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} ;; + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + if libtool -V 2>&1 | grep Apple > /dev/null; then + AR="libtool" + else + AR="/usr/bin/libtool" + fi + ARFLAGS="-o" ;; *) LDSHARED=${LDSHARED-"$cc -shared"} ;; esac else # find system name and corresponding cc options CC=${CC-cc} gcc=0 + echo ... using $CC >> configure.log if test -z "$uname"; then uname=`(uname -sr || echo unknown) 2>/dev/null` fi @@ -183,19 +260,34 @@ CFLAGS=${CFLAGS-"-4 -O"} LDSHARED=${LDSHARED-"cc"} RANLIB=${RANLIB-"true"} - AR_RC="cc -A" ;; + AR="cc" + ARFLAGS="-A" ;; SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} CFLAGS=${CFLAGS-"-O3"} LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; - SunOS\ 5*) LDSHARED=${LDSHARED-"cc -G"} - case `(uname -m || echo unknown) 2>/dev/null` in - i86*) - SFLAGS=${CFLAGS-"-xpentium -fast -KPIC -R."} - CFLAGS=${CFLAGS-"-xpentium -fast"} ;; - *) - SFLAGS=${CFLAGS-"-fast -xcg92 -KPIC -R."} - CFLAGS=${CFLAGS-"-fast -xcg92"} ;; - esac ;; + SunOS\ 5* | solaris*) + LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"} + SFLAGS=${CFLAGS-"-fast -KPIC"} + CFLAGS=${CFLAGS-"-fast"} + if test $build64 -eq 1; then + # old versions of SunPRO/Workshop/Studio don't support -m64, + # but newer ones do. Check for it. + flag64=`$CC -flags | egrep -- '^-m64'` + if test x"$flag64" != x"" ; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + else + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS="$SFLAGS -xarch=amd64" + CFLAGS="$CFLAGS -xarch=amd64" ;; + *) + SFLAGS="$SFLAGS -xarch=v9" + CFLAGS="$CFLAGS -xarch=v9" ;; + esac + fi + fi + ;; SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} CFLAGS=${CFLAGS-"-O2"} LDSHARED=${LDSHARED-"ld"} ;; @@ -225,25 +317,79 @@ esac fi +# destination names for shared library if not defined above SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} +echo >> configure.log + +# define functions for testing compiler and library characteristics and logging the results + +cat > $test.c </dev/null; then + try() + { + show $* + test "`( $* ) 2>&1 | tee -a configure.log`" = "" + } + echo - using any output from compiler to indicate an error >> configure.log +else +try() +{ + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret +} +fi + +tryboth() +{ + show $* + got=`( $* ) 2>&1` + ret=$? + printf %s "$got" >> configure.log + if test $ret -ne 0; then + return $ret + fi + test "$got" = "" +} + +cat > $test.c << EOF +int foo() { return 0; } +EOF +echo "Checking for obsessive-compulsive compiler options..." >> configure.log +if try $CC -c $CFLAGS $test.c; then + : +else + echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log + leave 1 +fi + +echo >> configure.log + +# see if shared library build supported +cat > $test.c <&1`" = "" && - test "`($LDSHARED $SFLAGS -o $test$shared_ext $test.o) 2>&1`" = ""; then - echo Building shared library $SHAREDLIBV with $CC. + if try $CC -w -c $SFLAGS $test.c && + try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then + echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log elif test -z "$old_cc" -a -z "$old_cflags"; then - echo No shared library support. + echo No shared library support. | tee -a configure.log shared=0; else - echo Tested $CC -w -c $SFLAGS $test.c - $CC -w -c $SFLAGS $test.c - echo Tested $LDSHARED $SFLAGS -o $test$shared_ext $test.o - $LDSHARED $SFLAGS -o $test$shared_ext $test.o - echo 'No shared library support; try without defining CC and CFLAGS' + echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log shared=0; fi fi @@ -254,25 +400,43 @@ SHAREDLIB="" SHAREDLIBV="" SHAREDLIBM="" - echo Building static library $STATICLIB version $VER with $CC. + echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log else ALL="static shared" TEST="all teststatic testshared" fi +# check for underscores in external names for use by assembler code +CPP=${CPP-"$CC -E"} +case $CFLAGS in + *ASMV*) + echo >> configure.log + show "$NM $test.o | grep _hello" + if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. | tee -a configure.log + else + echo Checking for underline in external names... Yes. | tee -a configure.log + fi ;; +esac + +echo >> configure.log + +# check for large file support, and if none, check for fseeko() cat > $test.c < off64_t dummy = 0; EOF -if test "`($CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c) 2>&1`" = ""; then +if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" ALL="${ALL} all64" TEST="${TEST} test64" - echo "Checking for off64_t... Yes." - echo "Checking for fseeko... Yes." + echo "Checking for off64_t... Yes." | tee -a configure.log + echo "Checking for fseeko... Yes." | tee -a configure.log else - echo "Checking for off64_t... No." + echo "Checking for off64_t... No." | tee -a configure.log + echo >> configure.log cat > $test.c < int main(void) { @@ -280,272 +444,335 @@ return 0; } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for fseeko... Yes." + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for fseeko... Yes." | tee -a configure.log else CFLAGS="${CFLAGS} -DNO_FSEEKO" SFLAGS="${SFLAGS} -DNO_FSEEKO" - echo "Checking for fseeko... No." + echo "Checking for fseeko... No." | tee -a configure.log fi fi +echo >> configure.log + +# check for strerror() for use by gz* functions +cat > $test.c < +#include +int main() { return strlen(strerror(errno)); } +EOF +if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for strerror... Yes." | tee -a configure.log +else + CFLAGS="${CFLAGS} -DNO_STRERROR" + SFLAGS="${SFLAGS} -DNO_STRERROR" + echo "Checking for strerror... No." | tee -a configure.log +fi + +# copy clean zconf.h for subsequent edits cp -p zconf.h.in zconf.h +echo >> configure.log + +# check for unistd.h and save result in zconf.h cat > $test.c < int main() { return 0; } EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then +if try $CC -c $CFLAGS $test.c; then sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h mv zconf.temp.h zconf.h - echo "Checking for unistd.h... Yes." + echo "Checking for unistd.h... Yes." | tee -a configure.log else - echo "Checking for unistd.h... No." + echo "Checking for unistd.h... No." | tee -a configure.log fi +echo >> configure.log + +# check for stdarg.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for stdarg.h... Yes." | tee -a configure.log +else + echo "Checking for stdarg.h... No." | tee -a configure.log +fi + +# if the z_ prefix was requested, save that in zconf.h if test $zprefix -eq 1; then sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h mv zconf.temp.h zconf.h - echo "Using z_ prefix on all symbols." + echo >> configure.log + echo "Using z_ prefix on all symbols." | tee -a configure.log fi +# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists +if test $solo -eq 1; then + sed '/#define ZCONF_H/a\ +#define Z_SOLO + +' < zconf.h > zconf.temp.h + mv zconf.temp.h zconf.h +OBJC='$(OBJZ)' +PIC_OBJC='$(PIC_OBJZ)' +fi + +# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X +if test $cover -eq 1; then + CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" + if test -n "$GCC_CLASSIC"; then + CC=$GCC_CLASSIC + fi +fi + +echo >> configure.log + +# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions +# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a +# return value. The most secure result is vsnprintf() with a return value. snprintf() with a +# return value is secure as well, but then gzprintf() will be limited to 20 arguments. cat > $test.c < #include #include "zconf.h" - int main() { #ifndef STDC choke me #endif - return 0; } EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." - + echo >> configure.log cat > $test.c < #include - int mytest(const char *fmt, ...) { char buf[20]; va_list ap; - va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return 0; } +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for vsnprintf() in stdio.h... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_vsnprintf" + SFLAGS="$SFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < #include - int mytest(const char *fmt, ...) { int n; char buf[20]; va_list ap; - va_start(ap, fmt); - n = vsnprintf(buf, sizeof(buf), fmt, ap); + n = vsprintf(buf, fmt, ap); va_end(ap); return n; } - int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsnprintf()... Yes." - else - CFLAGS="$CFLAGS -DHAS_vsnprintf_void" - SFLAGS="$SFLAGS -DHAS_vsnprintf_void" - echo "Checking for return value of vsnprintf()... No." - echo " WARNING: apparently vsnprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." - fi - else - CFLAGS="$CFLAGS -DNO_vsnprintf" - SFLAGS="$SFLAGS -DNO_vsnprintf" - echo "Checking for vsnprintf() in stdio.h... No." - echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." - - cat >$test.c < -#include - -int mytest(const char *fmt, ...) -{ - int n; - char buf[20]; - va_list ap; - - va_start(ap, fmt); - n = vsprintf(buf, fmt, ap); - va_end(ap); - return n; -} - -int main() -{ - return (mytest("Hello%d\n", 1)); -} -EOF - - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_vsprintf_void" SFLAGS="$SFLAGS -DHAS_vsprintf_void" - echo "Checking for return value of vsprintf()... No." - echo " WARNING: apparently vsprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of vsprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi else - echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - snprintf(buf, sizeof(buf), "%s", "foo"); return 0; } - int main() { return (mytest()); } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for snprintf() in stdio.h... Yes." + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return snprintf(buf, sizeof(buf), "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of snprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of snprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_snprintf_void" SFLAGS="$SFLAGS -DHAS_snprintf_void" - echo "Checking for return value of snprintf()... No." - echo " WARNING: apparently snprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of snprintf()... No." | tee -a configure.log + echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi else CFLAGS="$CFLAGS -DNO_snprintf" SFLAGS="$SFLAGS -DNO_snprintf" - echo "Checking for snprintf() in stdio.h... No." - echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." + echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return sprintf(buf, "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of sprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of sprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_sprintf_void" SFLAGS="$SFLAGS -DHAS_sprintf_void" - echo "Checking for return value of sprintf()... No." - echo " WARNING: apparently sprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + echo "Checking for return value of sprintf()... No." | tee -a configure.log + echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi fi +# see if we can hide zlib internal symbols that are linked between separate source files if test "$gcc" -eq 1; then + echo >> configure.log cat > $test.c <= 33) -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif +#define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) int ZLIB_INTERNAL foo; int main() { return 0; } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for attribute(visibility) support... Yes." + if tryboth $CC -c $CFLAGS $test.c; then + CFLAGS="$CFLAGS -DHAVE_HIDDEN" + SFLAGS="$SFLAGS -DHAVE_HIDDEN" + echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log else - CFLAGS="$CFLAGS -DNO_VIZ" - SFLAGS="$SFLAGS -DNO_VIZ" - echo "Checking for attribute(visibility) support... No." + echo "Checking for attribute(visibility) support... No." | tee -a configure.log fi fi -CPP=${CPP-"$CC -E"} -case $CFLAGS in - *ASMV*) - if test "`$NM $test.o | grep _hello`" = ""; then - CPP="$CPP -DNO_UNDERLINE" - echo Checking for underline in external names... No. - else - echo Checking for underline in external names... Yes. - fi ;; -esac +# show the results in the log +echo >> configure.log +echo ALL = $ALL >> configure.log +echo AR = $AR >> configure.log +echo ARFLAGS = $ARFLAGS >> configure.log +echo CC = $CC >> configure.log +echo CFLAGS = $CFLAGS >> configure.log +echo CPP = $CPP >> configure.log +echo EXE = $EXE >> configure.log +echo LDCONFIG = $LDCONFIG >> configure.log +echo LDFLAGS = $LDFLAGS >> configure.log +echo LDSHARED = $LDSHARED >> configure.log +echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log +echo OBJC = $OBJC >> configure.log +echo PIC_OBJC = $PIC_OBJC >> configure.log +echo RANLIB = $RANLIB >> configure.log +echo SFLAGS = $SFLAGS >> configure.log +echo SHAREDLIB = $SHAREDLIB >> configure.log +echo SHAREDLIBM = $SHAREDLIBM >> configure.log +echo SHAREDLIBV = $SHAREDLIBV >> configure.log +echo STATICLIB = $STATICLIB >> configure.log +echo TEST = $TEST >> configure.log +echo VER = $VER >> configure.log +echo Z_U4 = $Z_U4 >> configure.log +echo exec_prefix = $exec_prefix >> configure.log +echo includedir = $includedir >> configure.log +echo libdir = $libdir >> configure.log +echo mandir = $mandir >> configure.log +echo prefix = $prefix >> configure.log +echo sharedlibdir = $sharedlibdir >> configure.log +echo uname = $uname >> configure.log -rm -f $test.[co] $test $test$shared_ext - -# udpate Makefile +# udpate Makefile with the configure results sed < Makefile.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# @@ -557,7 +784,8 @@ /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR_RC# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# /^RANLIB *=/s#=.*#=$RANLIB# /^LDCONFIG *=/s#=.*#=$LDCONFIG# /^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# @@ -568,10 +796,13 @@ /^sharedlibdir *=/s#=.*#=$sharedlibdir# /^includedir *=/s#=.*#=$includedir# /^mandir *=/s#=.*#=$mandir# +/^OBJC *=/s#=.*#= $OBJC# +/^PIC_OBJC *=/s#=.*#= $PIC_OBJC# /^all: */s#:.*#: $ALL# /^test: */s#:.*#: $TEST# " > Makefile +# create zlib.pc with the configure results sed < zlib.pc.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# @@ -581,7 +812,8 @@ /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR_RC# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# /^RANLIB *=/s#=.*#=$RANLIB# /^EXE *=/s#=.*#=$EXE# /^prefix *=/s#=.*#=$prefix# @@ -594,3 +826,6 @@ " | sed -e " s/\@VERSION\@/$VER/g; " > zlib.pc + +# done +leave 0 diff --git a/Modules/zlib/crc32.c b/Modules/zlib/crc32.c --- a/Modules/zlib/crc32.c +++ b/Modules/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -17,6 +17,8 @@ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH @@ -30,31 +32,11 @@ #define local static -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - /* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif #ifdef BYFOUR -# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, @@ -68,16 +50,16 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: @@ -107,9 +89,9 @@ */ local void make_crc_table() { - unsigned long c; + z_crc_t c; int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ + z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -121,13 +103,13 @@ first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { - c = (unsigned long)n; + c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; @@ -138,11 +120,11 @@ and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; - crc_table[4][n] = REV(c); + crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); + crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ @@ -164,7 +146,7 @@ if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); + fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR @@ -184,12 +166,13 @@ #ifdef MAKECRCH local void write_table(out, table) FILE *out; - const unsigned long FAR *table; + const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ @@ -204,13 +187,13 @@ /* ========================================================================= * This function can be used by asm versions of crc32() */ -const unsigned long FAR * ZEXPORT get_crc_table() +const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ @@ -232,7 +215,7 @@ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; + z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) @@ -266,17 +249,17 @@ const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = (u4)crc; + c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; @@ -306,17 +289,17 @@ const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = REV((u4)crc); + c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; @@ -333,7 +316,7 @@ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; - return (unsigned long)(REV(c)); + return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ diff --git a/Modules/zlib/crc32.h b/Modules/zlib/crc32.h --- a/Modules/zlib/crc32.h +++ b/Modules/zlib/crc32.h @@ -2,7 +2,7 @@ * Generated automatically by crc32.c */ -local const unsigned long FAR crc_table[TBLS][256] = +local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, diff --git a/Modules/zlib/deflate.c b/Modules/zlib/deflate.c --- a/Modules/zlib/deflate.c +++ b/Modules/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -37,7 +37,7 @@ * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt + * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -155,9 +155,12 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + /* =========================================================================== * Update a hash value with the given input byte - * IN assertion: all calls to UPDATE_HASH are made with consecutive + * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ @@ -170,7 +173,7 @@ * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. - * IN assertion: all calls to INSERT_STRING are made with consecutive + * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ @@ -235,10 +238,19 @@ strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif #ifdef FASTEST if (level != 0) level = 1; @@ -293,7 +305,7 @@ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + strm->msg = ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } @@ -314,43 +326,70 @@ uInt dictLength; { deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; - s = strm->state; - if (s->wrap) + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - if (length < MIN_MATCH) return Z_OK; - if (length > s->w_size) { - length = s->w_size; - dictionary += dictLength - length; /* use the tail of the dictionary */ + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); } - if (hash_head) hash_head = 0; /* to make compiler happy */ + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; return Z_OK; } /* ========================================================================= */ -int ZEXPORT deflateReset (strm) +int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; @@ -380,12 +419,23 @@ s->last_flush = Z_NO_FLUSH; _tr_init(s); - lm_init(s); return Z_OK; } /* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; @@ -397,14 +447,42 @@ } /* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { + deflate_state *s; + int put; + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); return Z_OK; } @@ -435,6 +513,8 @@ strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_BLOCK); + if (err == Z_BUF_ERROR && s->pending == 0) + err = Z_OK; } if (s->level != level) { s->level = level; @@ -562,19 +642,22 @@ local void flush_pending(strm) z_streamp strm; { - unsigned len = strm->state->pending; + unsigned len; + deflate_state *s = strm->state; + _tr_flush_bits(s); + len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; - zmemcpy(strm->next_out, strm->state->pending_out, len); + zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; - strm->state->pending_out += len; + s->pending_out += len; strm->total_out += len; strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; } } @@ -801,7 +884,7 @@ * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ - } else if (strm->avail_in == 0 && flush <= old_flush && + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } @@ -850,6 +933,7 @@ if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; + s->insert = 0; } } } @@ -945,12 +1029,12 @@ ss = source->state; - zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); @@ -966,8 +1050,8 @@ } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); @@ -1001,15 +1085,15 @@ strm->avail_in -= len; + zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); + strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); + strm->adler = crc32(strm->adler, buf, len); } #endif - zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; @@ -1036,6 +1120,7 @@ s->strstart = 0; s->block_start = 0L; s->lookahead = 0; + s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; @@ -1310,6 +1395,8 @@ unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); @@ -1362,7 +1449,7 @@ #endif more += wsize; } - if (s->strm->avail_in == 0) return; + if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && @@ -1381,12 +1468,24 @@ s->lookahead += n; /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. @@ -1427,6 +1526,9 @@ s->high_water += init; } } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); } /* =========================================================================== @@ -1506,8 +1608,14 @@ FLUSH_BLOCK(s, 0); } } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1603,8 +1711,14 @@ } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #ifndef FASTEST @@ -1728,8 +1842,14 @@ _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #endif /* FASTEST */ @@ -1749,11 +1869,11 @@ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. + * for the longest run, plus one for the unrolled loop. */ - if (s->lookahead < MAX_MATCH) { + if (s->lookahead <= MAX_MATCH) { fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ @@ -1776,6 +1896,7 @@ if (s->match_length > s->lookahead) s->match_length = s->lookahead; } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -1796,8 +1917,14 @@ } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1829,6 +1956,12 @@ s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } diff --git a/Modules/zlib/deflate.h b/Modules/zlib/deflate.h --- a/Modules/zlib/deflate.h +++ b/Modules/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -48,6 +48,9 @@ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 @@ -101,7 +104,7 @@ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ + Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ @@ -188,7 +191,7 @@ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ + /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ @@ -244,7 +247,7 @@ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ + uInt insert; /* bytes at end of window left to insert */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ @@ -294,6 +297,7 @@ int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); diff --git a/Modules/zlib/example.c b/Modules/zlib/example.c --- a/Modules/zlib/example.c +++ b/Modules/zlib/example.c @@ -1,5 +1,5 @@ /* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-2006 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -26,7 +26,7 @@ } \ } -const char hello[] = "hello, hello!"; +z_const char hello[] = "hello, hello!"; /* "hello world" would be more standard, but the repeated "hello" * stresses the compression code better, sorry... */ @@ -34,10 +34,6 @@ const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, - Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); @@ -53,6 +49,39 @@ Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + q = Z_NULL; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + /* =========================================================================== * Test compress() and uncompress() */ @@ -163,6 +192,8 @@ #endif } +#endif /* Z_SOLO */ + /* =========================================================================== * Test deflate() with small buffers */ @@ -174,14 +205,14 @@ int err; uLong len = (uLong)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { @@ -213,8 +244,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -252,8 +283,8 @@ z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); @@ -309,8 +340,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -349,14 +380,14 @@ int err; uInt len = (uInt)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (uInt)*comprLen; @@ -388,8 +419,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -430,22 +461,22 @@ z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, - (const Bytef*)dictionary, sizeof(dictionary)); + (const Bytef*)dictionary, (int)sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; - c_stream.next_in = (Bytef*)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.avail_in = (uInt)strlen(hello)+1; err = deflate(&c_stream, Z_FINISH); @@ -469,8 +500,8 @@ strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -491,7 +522,7 @@ exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, - sizeof(dictionary)); + (int)sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } @@ -540,10 +571,15 @@ printf("out of memory\n"); exit(1); } + +#ifdef Z_SOLO + argc = strlen(argv[0]); +#else test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); +#endif test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); diff --git a/Modules/zlib/gzguts.h b/Modules/zlib/gzguts.h --- a/Modules/zlib/gzguts.h +++ b/Modules/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -12,7 +12,7 @@ # endif #endif -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -27,13 +27,80 @@ #endif #include +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99, yet still not supported by + Microsoft more than a decade later!), _snprintf does not guarantee null + termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ #ifdef _MSC_VER -# include -# define vsnprintf _vsnprintf +# define snprintf _snprintf #endif #ifndef local @@ -52,7 +119,7 @@ # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else -# ifdef STDC +# ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else @@ -68,7 +135,15 @@ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); #endif -/* default i/o buffer size -- double this for output when reading */ +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ #define GZBUFSIZE 8192 /* gzip modes, also provide a little integrity check on the passed structure */ @@ -84,23 +159,25 @@ /* internal gzip file state data structure */ typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ /* used for both reading and writing */ int mode; /* see gzip modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ - z_off64_t pos; /* current position in uncompressed data */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ unsigned char *in; /* input buffer */ unsigned char *out; /* output buffer (double-sized when reading) */ - unsigned char *next; /* next output data to deliver or write */ + int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ - unsigned have; /* amount of output data unused at next */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ int eof; /* true if end of input file reached */ - z_off64_t start; /* where the gzip data started, for rewinding */ - z_off64_t raw; /* where the raw data started, for seeking */ - int how; /* 0: get header, 1: copy, 2: decompress */ - int direct; /* true if last read direct, false if gzip */ + int past; /* true if read requested past end */ /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ diff --git a/Modules/zlib/gzio.c b/Modules/zlib/gzio.c deleted file mode 100644 --- a/Modules/zlib/gzio.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. - */ - -/* @(#) $Id$ */ - -#include - -#include "zutil.h" - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -#ifndef Z_BUFSIZE -# ifdef MAXSEG_64K -# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ -# else -# define Z_BUFSIZE 16384 -# endif -#endif -#ifndef Z_PRINTF_BUFSIZE -# define Z_PRINTF_BUFSIZE 4096 -#endif - -#ifdef __MVS__ -# pragma map (fdopen , "\174\174FDOPEN") - FILE *fdopen(int, const char *); -#endif - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern void free OF((voidpf ptr)); -#endif - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - z_off_t start; /* start of compressed data in file (header skipped) */ - z_off_t in; /* bytes into deflate or inflate */ - z_off_t out; /* bytes out of deflate or inflate */ - int back; /* one character push-back */ - int last; /* true if push-back is last character */ -} gz_stream; - - -local gzFile gz_open OF((const char *path, const char *mode, int fd)); -local int do_flush OF((gzFile file, int flush)); -local int get_byte OF((gz_stream *s)); -local void check_header OF((gz_stream *s)); -local int destroy OF((gz_stream *s)); -local void putLong OF((FILE *file, uLong x)); -local uLong getLong OF((gz_stream *s)); - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb"). The file is given either by file descriptor - or path name (if fd == -1). - gz_open returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). -*/ -local gzFile gz_open (path, mode, fd) - const char *path; - const char *mode; - int fd; -{ - int err; - int level = Z_DEFAULT_COMPRESSION; /* compression level */ - int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ - char *p = (char*)mode; - gz_stream *s; - char fmode[80]; /* copy of mode, without the compression level */ - char *m = fmode; - - if (!path || !mode) return Z_NULL; - - s = (gz_stream *)ALLOC(sizeof(gz_stream)); - if (!s) return Z_NULL; - - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; - s->stream.next_in = s->inbuf = Z_NULL; - s->stream.next_out = s->outbuf = Z_NULL; - s->stream.avail_in = s->stream.avail_out = 0; - s->file = NULL; - s->z_err = Z_OK; - s->z_eof = 0; - s->in = 0; - s->out = 0; - s->back = EOF; - s->crc = crc32(0L, Z_NULL, 0); - s->msg = NULL; - s->transparent = 0; - - s->path = (char*)ALLOC(strlen(path)+1); - if (s->path == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - strcpy(s->path, path); /* do this early for debugging */ - - s->mode = '\0'; - do { - if (*p == 'r') s->mode = 'r'; - if (*p == 'w' || *p == 'a') s->mode = 'w'; - if (*p >= '0' && *p <= '9') { - level = *p - '0'; - } else if (*p == 'f') { - strategy = Z_FILTERED; - } else if (*p == 'h') { - strategy = Z_HUFFMAN_ONLY; - } else if (*p == 'R') { - strategy = Z_RLE; - } else { - *m++ = *p; /* copy the mode */ - } - } while (*p++ && m != fmode + sizeof(fmode)); - if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateInit2(&(s->stream), level, - Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); - /* windowBits is passed < 0 to suppress zlib header */ - - s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); -#endif - if (err != Z_OK || s->outbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } else { - s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); - - err = inflateInit2(&(s->stream), -MAX_WBITS); - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are - * present after the compressed stream. - */ - if (err != Z_OK || s->inbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } - s->stream.avail_out = Z_BUFSIZE; - - errno = 0; - s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); - - if (s->file == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - if (s->mode == 'w') { - /* Write a very simple .gz header: - */ - fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); - s->start = 10L; - /* We use 10L instead of ftell(s->file) to because ftell causes an - * fflush on some systems. This version of the library doesn't use - * start anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->start = ftell(s->file) - s->stream.avail_in; - } - - return (gzFile)s; -} - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. -*/ -gzFile ZEXPORT gzopen (path, mode) - const char *path; - const char *mode; -{ - return gz_open (path, mode, -1); -} - -/* =========================================================================== - Associate a gzFile with the file descriptor fd. fd is not dup'ed here - to mimic the behavio(u)r of fdopen. -*/ -gzFile ZEXPORT gzdopen (fd, mode) - int fd; - const char *mode; -{ - char name[46]; /* allow for up to 128-bit integers */ - - if (fd < 0) return (gzFile)Z_NULL; - sprintf(name, "", fd); /* for debugging */ - - return gz_open (name, mode, fd); -} - -/* =========================================================================== - * Update the compression level and strategy - */ -int ZEXPORT gzsetparams (file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - /* Make room to allow flushing */ - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - } - s->stream.avail_out = Z_BUFSIZE; - } - - return deflateParams (&(s->stream), level, strategy); -} - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ -local int get_byte(s) - gz_stream *s; -{ - if (s->z_eof) return EOF; - if (s->stream.avail_in == 0) { - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) s->z_err = Z_ERRNO; - return EOF; - } - s->stream.next_in = s->inbuf; - } - s->stream.avail_in--; - return *(s->stream.next_in)++; -} - -/* =========================================================================== - Check the gzip header of a gz_stream opened for reading. Set the stream - mode to transparent if the gzip magic header is not present; set s->err - to Z_DATA_ERROR if the magic header is present but the rest of the header - is incorrect. - IN assertion: the stream s has already been created sucessfully; - s->stream.avail_in is zero for the first time, but may be non-zero - for concatenated .gz files. -*/ -local void check_header(s) - gz_stream *s; -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - /* Assure two bytes in the buffer so we can peek ahead -- handle case - where first byte of header is at the end of the buffer after the last - gzip segment */ - len = s->stream.avail_in; - if (len < 2) { - if (len) s->inbuf[0] = s->stream.next_in[0]; - errno = 0; - len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); - if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; - s->stream.avail_in += len; - s->stream.next_in = s->inbuf; - if (s->stream.avail_in < 2) { - s->transparent = s->stream.avail_in; - return; - } - } - - /* Peek ahead to check the gzip magic header */ - if (s->stream.next_in[0] != gz_magic[0] || - s->stream.next_in[1] != gz_magic[1]) { - s->transparent = 1; - return; - } - s->stream.avail_in -= 2; - s->stream.next_in += 2; - - /* Check the rest of the gzip header */ - method = get_byte(s); - flags = get_byte(s); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - s->z_err = Z_DATA_ERROR; - return; - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(s); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(s); - len += ((uInt)get_byte(s))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(s) != EOF) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) (void)get_byte(s); - } - s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; -} - - /* =========================================================================== - * Cleanup then free the given gz_stream. Return a zlib error code. - Try freeing in the reverse order of allocations. - */ -local int destroy (s) - gz_stream *s; -{ - int err = Z_OK; - - if (!s) return Z_STREAM_ERROR; - - TRYFREE(s->msg); - - if (s->stream.state != NULL) { - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateEnd(&(s->stream)); -#endif - } else if (s->mode == 'r') { - err = inflateEnd(&(s->stream)); - } - } - if (s->file != NULL && fclose(s->file)) { -#ifdef ESPIPE - if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ -#endif - err = Z_ERRNO; - } - if (s->z_err < 0) err = s->z_err; - - TRYFREE(s->inbuf); - TRYFREE(s->outbuf); - TRYFREE(s->path); - TRYFREE(s); - return err; -} - -/* =========================================================================== - Reads the given number of uncompressed bytes from the compressed file. - gzread returns the number of bytes actually read (0 for end of file). -*/ -int ZEXPORT gzread (file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - Bytef *start = (Bytef*)buf; /* starting point for crc computation */ - Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ - - if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; - - if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; - if (s->z_err == Z_STREAM_END) return 0; /* EOF */ - - next_out = (Byte*)buf; - s->stream.next_out = (Bytef*)buf; - s->stream.avail_out = len; - - if (s->stream.avail_out && s->back != EOF) { - *next_out++ = s->back; - s->stream.next_out++; - s->stream.avail_out--; - s->back = EOF; - s->out++; - start++; - if (s->last) { - s->z_err = Z_STREAM_END; - return 1; - } - } - - while (s->stream.avail_out != 0) { - - if (s->transparent) { - /* Copy first the lookahead bytes: */ - uInt n = s->stream.avail_in; - if (n > s->stream.avail_out) n = s->stream.avail_out; - if (n > 0) { - zmemcpy(s->stream.next_out, s->stream.next_in, n); - next_out += n; - s->stream.next_out = next_out; - s->stream.next_in += n; - s->stream.avail_out -= n; - s->stream.avail_in -= n; - } - if (s->stream.avail_out > 0) { - s->stream.avail_out -= - (uInt)fread(next_out, 1, s->stream.avail_out, s->file); - } - len -= s->stream.avail_out; - s->in += len; - s->out += len; - if (len == 0) s->z_eof = 1; - return (int)len; - } - if (s->stream.avail_in == 0 && !s->z_eof) { - - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) { - s->z_err = Z_ERRNO; - break; - } - } - s->stream.next_in = s->inbuf; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = inflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - - if (s->z_err == Z_STREAM_END) { - /* Check CRC and original size */ - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - start = s->stream.next_out; - - if (getLong(s) != s->crc) { - s->z_err = Z_DATA_ERROR; - } else { - (void)getLong(s); - /* The uncompressed length returned by above getlong() may be - * different from s->out in case of concatenated .gz files. - * Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - inflateReset(&(s->stream)); - s->crc = crc32(0L, Z_NULL, 0); - } - } - } - if (s->z_err != Z_OK || s->z_eof) break; - } - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - - if (len == s->stream.avail_out && - (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) - return -1; - return (int)(len - s->stream.avail_out); -} - - -/* =========================================================================== - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ -int ZEXPORT gzgetc(file) - gzFile file; -{ - unsigned char c; - - return gzread(file, &c, 1) == 1 ? c : -1; -} - - -/* =========================================================================== - Push one byte back onto the stream. -*/ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; - s->back = c; - s->out--; - s->last = (s->z_err == Z_STREAM_END); - if (s->last) s->z_err = Z_OK; - s->z_eof = 0; - return c; -} - - -/* =========================================================================== - Reads bytes from the compressed file until len-1 characters are - read, or a newline character is read and transferred to buf, or an - end-of-file condition is encountered. The string is then terminated - with a null character. - gzgets returns buf, or Z_NULL in case of error. - - The current implementation is not optimized at all. -*/ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - char *b = buf; - if (buf == Z_NULL || len <= 0) return Z_NULL; - - while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; - *buf = '\0'; - return b == buf && len > 0 ? Z_NULL : b; -} - - -#ifndef NO_GZCOMPRESS -/* =========================================================================== - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of bytes actually written (0 in case of error). -*/ -int ZEXPORT gzwrite (file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.next_in = (Bytef*)buf; - s->stream.avail_in = len; - - while (s->stream.avail_in != 0) { - - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - break; - } - s->stream.avail_out = Z_BUFSIZE; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - if (s->z_err != Z_OK) break; - } - s->crc = crc32(s->crc, (const Bytef *)buf, len); - - return (int)(len - s->stream.avail_in); -} - - -/* =========================================================================== - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ -#ifdef STDC -#include - -int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) -{ - char buf[Z_PRINTF_BUFSIZE]; - va_list va; - int len; - - buf[sizeof(buf) - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(buf, format, va); - va_end(va); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = vsprintf(buf, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(buf, sizeof(buf), format, va); - va_end(va); - len = strlen(buf); -# else - len = vsnprintf(buf, sizeof(buf), format, va); - va_end(va); -# endif -#endif - if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, (unsigned)len); -} -#else /* not ANSI C */ - -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - char buf[Z_PRINTF_BUFSIZE]; - int len; - - buf[sizeof(buf) - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(buf); -# else - len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, len); -} -#endif - -/* =========================================================================== - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char cc = (unsigned char) c; /* required for big endian systems */ - - return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; -} - - -/* =========================================================================== - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ - return gzwrite(file, (char*)s, (unsigned)strlen(s)); -} - - -/* =========================================================================== - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. -*/ -local int do_flush (file, flush) - gzFile file; - int flush; -{ - uInt len; - int done = 0; - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.avail_in = 0; /* should be zero already anyway */ - - for (;;) { - len = Z_BUFSIZE - s->stream.avail_out; - - if (len != 0) { - if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { - s->z_err = Z_ERRNO; - return Z_ERRNO; - } - s->stream.next_out = s->outbuf; - s->stream.avail_out = Z_BUFSIZE; - } - if (done) break; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), flush); - s->out -= s->stream.avail_out; - - /* Ignore the second of two consecutive flushes: */ - if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; - - /* deflate has finished flushing only when it hasn't used up - * all the available space in the output buffer: - */ - done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); - - if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; - } - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} - -int ZEXPORT gzflush (file, flush) - gzFile file; - int flush; -{ - gz_stream *s = (gz_stream*)file; - int err = do_flush (file, flush); - - if (err) return err; - fflush(s->file); - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} -#endif /* NO_GZCOMPRESS */ - -/* =========================================================================== - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error. - SEEK_END is not implemented, returns error. - In this version of the library, gzseek can be extremely slow. -*/ -z_off_t ZEXPORT gzseek (file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || whence == SEEK_END || - s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { - return -1L; - } - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->in; - } - if (offset < 0) return -1L; - - /* At this point, offset is the number of zero bytes to write. */ - if (s->inbuf == Z_NULL) { - s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ - if (s->inbuf == Z_NULL) return -1L; - zmemzero(s->inbuf, Z_BUFSIZE); - } - while (offset > 0) { - uInt size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (uInt)offset; - - size = gzwrite(file, s->inbuf, size); - if (size == 0) return -1L; - - offset -= size; - } - return s->in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->in = s->out = offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if (offset >= s->out) { - offset -= s->out; - } else if (gzrewind(file) < 0) { - return -1L; - } - /* offset is now the number of bytes to skip. */ - - if (offset != 0 && s->outbuf == Z_NULL) { - s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); - if (s->outbuf == Z_NULL) return -1L; - } - if (offset && s->back != EOF) { - s->back = EOF; - s->out++; - offset--; - if (s->last) s->z_err = Z_STREAM_END; - } - while (offset > 0) { - int size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (int)offset; - - size = gzread(file, s->outbuf, (uInt)size); - if (size <= 0) return -1L; - offset -= size; - } - return s->out; -} - -/* =========================================================================== - Rewinds input file. -*/ -int ZEXPORT gzrewind (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return -1; - - s->z_err = Z_OK; - s->z_eof = 0; - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - if (!s->transparent) (void)inflateReset(&s->stream); - s->in = 0; - s->out = 0; - return fseek(s->file, s->start, SEEK_SET); -} - -/* =========================================================================== - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. -*/ -z_off_t ZEXPORT gztell (file) - gzFile file; -{ - return gzseek(file, 0L, SEEK_CUR); -} - -/* =========================================================================== - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ -int ZEXPORT gzeof (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - /* With concatenated compressed files that can have embedded - * crc trailers, z_eof is no longer the only/best indicator of EOF - * on a gz_stream. Handle end-of-stream error explicitly here. - */ - if (s == NULL || s->mode != 'r') return 0; - if (s->z_eof) return 1; - return s->z_err == Z_STREAM_END; -} - -/* =========================================================================== - Returns 1 if reading and doing so transparently, otherwise zero. -*/ -int ZEXPORT gzdirect (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return 0; - return s->transparent; -} - -/* =========================================================================== - Outputs a long in LSB order to the given file -*/ -local void putLong (file, x) - FILE *file; - uLong x; -{ - int n; - for (n = 0; n < 4; n++) { - fputc((int)(x & 0xff), file); - x >>= 8; - } -} - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets z_err in case - of error. -*/ -local uLong getLong (s) - gz_stream *s; -{ - uLong x = (uLong)get_byte(s); - int c; - - x += ((uLong)get_byte(s))<<8; - x += ((uLong)get_byte(s))<<16; - c = get_byte(s); - if (c == EOF) s->z_err = Z_DATA_ERROR; - x += ((uLong)c)<<24; - return x; -} - -/* =========================================================================== - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. -*/ -int ZEXPORT gzclose (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return Z_STREAM_ERROR; -#else - if (do_flush (file, Z_FINISH) != Z_OK) - return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, (uLong)(s->in & 0xffffffff)); -#endif - } - return destroy((gz_stream*)file); -} - -#ifdef STDC -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -/* =========================================================================== - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ -const char * ZEXPORT gzerror (file, errnum) - gzFile file; - int *errnum; -{ - char *m; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) { - *errnum = Z_STREAM_ERROR; - return (const char*)ERR_MSG(Z_STREAM_ERROR); - } - *errnum = s->z_err; - if (*errnum == Z_OK) return (const char*)""; - - m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); - - if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); - - TRYFREE(s->msg); - s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); - if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} - -/* =========================================================================== - Clear the error and end-of-file flags, and do the same for the real file. -*/ -void ZEXPORT gzclearerr (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return; - if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; - s->z_eof = 0; - clearerr(s->file); -} diff --git a/Modules/zlib/gzlib.c b/Modules/zlib/gzlib.c --- a/Modules/zlib/gzlib.c +++ b/Modules/zlib/gzlib.c @@ -1,19 +1,23 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010 Mark Adler + * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif +#endif /* Local functions */ local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const char *, int, const char *)); +local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE @@ -71,28 +75,40 @@ local void gz_reset(state) gz_statep state; { + state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ - state->have = 0; /* no output data available */ state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ - state->direct = 1; /* default for empty file */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ - state->pos = 0; /* no uncompressed data yet */ + state->x.pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) - const char *path; + const void *path; int fd; const char *mode; { gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; /* allocate gzFile structure to return */ - state = malloc(sizeof(gz_state)); + state = (gz_statep)malloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ @@ -103,6 +119,7 @@ state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; @@ -124,6 +141,16 @@ return NULL; case 'b': /* ignore -- will request binary anyway */ break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif case 'f': state->strategy = Z_FILTERED; break; @@ -135,6 +162,10 @@ break; case 'F': state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; default: /* could consider as an error, but just ignore */ ; } @@ -147,30 +178,71 @@ return NULL; } + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + /* save the path name for error messages */ - state->path = malloc(strlen(path) + 1); +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } - strcpy(state->path, path); +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif - /* open the file with the appropriate mode (or just use fd) */ - state->fd = fd != -1 ? fd : - open(path, + /* compute the flags for open() */ + oflag = #ifdef O_LARGEFILE - O_LARGEFILE | + O_LARGEFILE | #endif #ifdef O_BINARY - O_BINARY | + O_BINARY | #endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | ( - state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))), - 0666); +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); @@ -216,15 +288,29 @@ char *path; /* identifier for error messages */ gzFile gz; - if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ +#else sprintf(path, "", fd); /* for debugging */ +#endif gz = gz_open(path, fd, mode); free(path); return gz; } /* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; unsigned size; @@ -243,8 +329,8 @@ return -1; /* check and set requested size */ - if (size == 0) - return -1; + if (size < 2) + size = 2; /* need two bytes to check magic header */ state->want = size; return 0; } @@ -261,7 +347,8 @@ state = (gz_statep)file; /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* back up and start over */ @@ -289,7 +376,7 @@ return -1; /* check that there's no error */ - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* can only seek from start or relative to current position */ @@ -298,31 +385,32 @@ /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) - offset -= state->pos; + offset -= state->x.pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && - state->pos + offset >= state->raw) { - ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); if (ret == -1) return -1; - state->have = 0; + state->x.have = 0; state->eof = 0; + state->past = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; - state->pos += offset; - return state->pos; + state->x.pos += offset; + return state->x.pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; - offset += state->pos; + offset += state->x.pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ @@ -331,11 +419,11 @@ /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { - n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? - (unsigned)offset : state->have; - state->have -= n; - state->next += n; - state->pos += n; + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; offset -= n; } @@ -344,7 +432,7 @@ state->seek = 1; state->skip = offset; } - return state->pos + offset; + return state->x.pos + offset; } /* -- see zlib.h -- */ @@ -373,7 +461,7 @@ return -1; /* return position */ - return state->pos + (state->seek ? state->skip : 0); + return state->x.pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ @@ -433,8 +521,7 @@ return 0; /* return end-of-file state */ - return state->mode == GZ_READ ? - (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; + return state->mode == GZ_READ ? state->past : 0; } /* -- see zlib.h -- */ @@ -454,7 +541,8 @@ /* return error information */ if (errnum != NULL) *errnum = state->err; - return state->msg == NULL ? "" : state->msg; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); } /* -- see zlib.h -- */ @@ -471,8 +559,10 @@ return; /* clear error and end-of-file */ - if (state->mode == GZ_READ) + if (state->mode == GZ_READ) { state->eof = 0; + state->past = 0; + } gz_error(state, Z_OK, NULL); } @@ -494,26 +584,33 @@ state->msg = NULL; } + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; - /* for an out of memory error, save as static string */ - if (err == Z_MEM_ERROR) { - state->msg = (char *)msg; + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; return; } - - /* construct error message with path */ - if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { - state->err = Z_MEM_ERROR; - state->msg = (char *)"out of memory"; - return; - } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); +#endif return; } diff --git a/Modules/zlib/gzread.c b/Modules/zlib/gzread.c --- a/Modules/zlib/gzread.c +++ b/Modules/zlib/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,10 +8,9 @@ /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); -local int gz_next4 OF((gz_statep, unsigned long *)); -local int gz_head OF((gz_statep)); +local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); -local int gz_make OF((gz_statep)); +local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from @@ -46,73 +45,54 @@ error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. - gz_avail() assumes that strm->avail_in == 0. */ + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ local int gz_avail(state) gz_statep state; { + unsigned got; z_streamp strm = &(state->strm); - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { - if (gz_load(state, state->in, state->size, - (unsigned *)&(strm->avail_in)) == -1) + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) return -1; + strm->avail_in += got; strm->next_in = state->in; } return 0; } -/* Get next byte from input, or -1 if end or error. */ -#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ - (strm->avail_in == 0 ? -1 : \ - (strm->avail_in--, *(strm->next_in)++))) - -/* Get a four-byte little-endian integer and return 0 on success and the value - in *ret. Otherwise -1 is returned and *ret is not modified. */ -local int gz_next4(state, ret) - gz_statep state; - unsigned long *ret; -{ - int ch; - unsigned long val; - z_streamp strm = &(state->strm); - - val = NEXT(); - val += (unsigned)NEXT() << 8; - val += (unsigned long)NEXT() << 16; - ch = NEXT(); - if (ch == -1) - return -1; - val += (unsigned long)ch << 24; - *ret = val; - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->have must be zero. +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression, and the gzip header will be skipped so - that the next available input data is the raw deflate stream. If direct - copying, then leftover input data from the input buffer will be copied to - the output buffer. In that case, all further file reads will be directly to - either the output buffer or a user buffer. If decompressing, the inflate - state and the check value will be initialized. gz_head() will return 0 on - success or -1 on failure. Failures may include read errors or gzip header - errors. */ -local int gz_head(state) + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) gz_statep state; { z_streamp strm = &(state->strm); - int flags; - unsigned len; /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ - state->in = malloc(state->want); - state->out = malloc(state->want << 1); + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) free(state->out); @@ -129,7 +109,7 @@ state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ free(state->out); free(state->in); state->size = 0; @@ -138,83 +118,45 @@ } } - /* get some data in the input buffer */ - if (strm->avail_in == 0) { + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } - /* look for the gzip magic header bytes 31 and 139 */ - if (strm->next_in[0] == 31) { - strm->avail_in--; - strm->next_in++; - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in && strm->next_in[0] == 139) { - /* we have a gzip header, woo hoo! */ - strm->avail_in--; - strm->next_in++; - - /* skip rest of header */ - if (NEXT() != 8) { /* compression method */ - gz_error(state, Z_DATA_ERROR, "unknown compression method"); - return -1; - } - flags = NEXT(); - if (flags & 0xe0) { /* reserved flag bits */ - gz_error(state, Z_DATA_ERROR, "unknown header flags set"); - return -1; - } - NEXT(); /* modification time */ - NEXT(); - NEXT(); - NEXT(); - NEXT(); /* extra flags */ - NEXT(); /* operating system */ - if (flags & 4) { /* extra field */ - len = (unsigned)NEXT(); - len += (unsigned)NEXT() << 8; - while (len--) - if (NEXT() < 0) - break; - } - if (flags & 8) /* file name */ - while (NEXT() > 0) - ; - if (flags & 16) /* comment */ - while (NEXT() > 0) - ; - if (flags & 2) { /* header crc */ - NEXT(); - NEXT(); - } - /* an unexpected end of file is not checked for here -- it will be - noticed on the first request for uncompressed data */ - - /* set up for decompression */ - inflateReset(strm); - strm->adler = crc32(0L, Z_NULL, 0); - state->how = GZIP; - state->direct = 0; - return 0; - } - else { - /* not a gzip file -- save first byte (31) and fall to raw i/o */ - state->out[0] = 31; - state->have = 1; - } + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; } - /* doing raw i/o, save start of raw data for seeking, copy any leftover - input to output -- this assumes that the output buffer is larger than - the input buffer, which also assures space for gzungetc() */ - state->raw = state->pos; - state->next = state->out; + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; if (strm->avail_in) { - memcpy(state->next + state->have, strm->next_in, strm->avail_in); - state->have += strm->avail_in; + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; strm->avail_in = 0; } state->how = COPY; @@ -223,19 +165,15 @@ } /* Decompress from input to the provided next_out and avail_out in the state. - If the end of the compressed data is reached, then verify the gzip trailer - check value and length (modulo 2^32). state->have and state->next are set - to point to the just decompressed data, and the crc is updated. If the - trailer is verified, state->how is reset to LOOK to look for the next gzip - stream or raw data, once state->have is depleted. Returns 0 on success, -1 - on failure. Failures may include invalid compressed data or a failed gzip - trailer verification. */ + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ local int gz_decomp(state) gz_statep state; { - int ret; + int ret = Z_OK; unsigned had; - unsigned long crc, len; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ @@ -245,15 +183,15 @@ if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); + "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { @@ -262,67 +200,55 @@ } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); + strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); - /* update available output and crc check value */ - state->have = had - strm->avail_out; - state->next = strm->next_out - state->have; - strm->adler = crc32(strm->adler, state->next, state->have); + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; - /* check gzip trailer if at end of deflate stream */ - if (ret == Z_STREAM_END) { - if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; - } - if (crc != strm->adler) { - gz_error(state, Z_DATA_ERROR, "incorrect data check"); - return -1; - } - if (len != (strm->total_out & 0xffffffffL)) { - gz_error(state, Z_DATA_ERROR, "incorrect length check"); - return -1; - } - state->how = LOOK; /* ready for next stream, once have is 0 (leave - state->direct unchanged to remember how) */ - } + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; /* good decompression */ return 0; } -/* Make data and put in the output buffer. Assumes that state->have == 0. +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is - looked for (and skipped if found) to determine wither to copy or decompress. - Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY - or GZIP unless the end of the input file has been reached and all data has - been processed. */ -local int gz_make(state) + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) gz_statep state; { z_streamp strm = &(state->strm); - if (state->how == LOOK) { /* look for gzip header */ - if (gz_head(state) == -1) - return -1; - if (state->have) /* got some data from gz_head() */ + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; return 0; - } - if (state->how == COPY) { /* straight copy */ - if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) - return -1; - state->next = state->out; - } - else if (state->how == GZIP) { /* decompress */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); return 0; } @@ -336,12 +262,12 @@ /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ - if (state->have) { - n = GT_OFF(state->have) || (z_off64_t)state->have > len ? - (unsigned)len : state->have; - state->have -= n; - state->next += n; - state->pos += n; + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; len -= n; } @@ -352,7 +278,7 @@ /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; } return 0; @@ -374,14 +300,15 @@ state = (gz_statep)file; strm = &(state->strm); - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return -1; } @@ -400,49 +327,51 @@ got = 0; do { /* first just try copying data from the output buffer */ - if (state->have) { - n = state->have > len ? len : state->have; - memcpy(buf, state->next, n); - state->next += n; - state->have -= n; + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ break; + } /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; - continue; /* no progress yet -- go back to memcpy() above */ + continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ - if (gz_load(state, buf, len, &n) == -1) + if (gz_load(state, (unsigned char *)buf, len, &n) == -1) return -1; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ strm->avail_out = len; - strm->next_out = buf; + strm->next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) return -1; - n = state->have; - state->have = 0; + n = state->x.have; + state->x.have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; - state->pos += n; + state->x.pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ @@ -450,6 +379,11 @@ } /* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif int ZEXPORT gzgetc(file) gzFile file; { @@ -462,15 +396,16 @@ return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* try output buffer (no need to check for skip request) */ - if (state->have) { - state->have--; - state->pos++; - return *(state->next)++; + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; } /* nothing there -- try gzread() */ @@ -478,6 +413,12 @@ return ret < 1 ? -1 : buf[0]; } +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; @@ -490,8 +431,9 @@ return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* process a skip request */ @@ -506,32 +448,34 @@ return -1; /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->have == 0) { - state->have = 1; - state->next = state->out + (state->size << 1) - 1; - state->next[0] = c; - state->pos--; + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } /* if no room, give up (must have already done a gzungetc()) */ - if (state->have == (state->size << 1)) { - gz_error(state, Z_BUF_ERROR, "out of room to push characters"); + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ - if (state->next == state->out) { - unsigned char *src = state->out + state->have; + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; - state->next = dest; + state->x.next = dest; } - state->have++; - state->next--; - state->next[0] = c; - state->pos--; + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } @@ -551,8 +495,9 @@ return NULL; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return NULL; /* process a skip request */ @@ -569,32 +514,31 @@ left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ - if (state->have == 0) { - if (gz_make(state) == -1) - return NULL; /* error */ - if (state->have == 0) { /* end of file */ - if (buf == str) /* got bupkus */ - return NULL; - break; /* got something -- return it */ - } + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ } /* look for end-of-line in current output buffer */ - n = state->have > left ? left : state->have; - eol = memchr(state->next, '\n', n); + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); if (eol != NULL) - n = (unsigned)(eol - state->next) + 1; + n = (unsigned)(eol - state->x.next) + 1; /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->next, n); - state->have -= n; - state->next += n; - state->pos += n; + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; left -= n; buf += n; } while (left && eol == NULL); - /* found end-of-line or out of space -- terminate string and return it */ + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; buf[0] = 0; return str; } @@ -610,16 +554,12 @@ return 0; state = (gz_statep)file; - /* check that we're reading */ - if (state->mode != GZ_READ) - return 0; - /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ - if (state->how == LOOK && state->have == 0) - (void)gz_head(state); + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); - /* return 1 if reading direct, 0 if decompressing a gzip stream */ + /* return 1 if transparent, 0 if processing a gzip stream */ return state->direct; } @@ -627,7 +567,7 @@ int ZEXPORT gzclose_r(file) gzFile file; { - int ret; + int ret, err; gz_statep state; /* get internal structure */ @@ -645,9 +585,10 @@ free(state->out); free(state->in); } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); - return ret ? Z_ERRNO : Z_OK; + return ret ? Z_ERRNO : err; } diff --git a/Modules/zlib/gzwrite.c b/Modules/zlib/gzwrite.c --- a/Modules/zlib/gzwrite.c +++ b/Modules/zlib/gzwrite.c @@ -1,5 +1,5 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -18,44 +18,55 @@ int ret; z_streamp strm = &(state->strm); - /* allocate input and output buffers */ - state->in = malloc(state->want); - state->out = malloc(state->want); - if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); + /* allocate input buffer */ + state->in = (unsigned char *)malloc(state->want); + if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - 15 + 16, 8, state->strategy); - if (ret != Z_OK) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } } /* mark state as initialized */ state->size = state->want; - /* initialize write buffer */ - strm->avail_out = state->size; - strm->next_out = state->out; - state->next = strm->next_out; + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. */ + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; @@ -68,6 +79,17 @@ if (state->size == 0 && gz_init(state) == -1) return -1; + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -75,8 +97,8 @@ doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->next); - if (have && ((got = write(state->fd, state->next, have)) < 0 || + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || (unsigned)got != have)) { gz_error(state, Z_ERRNO, zstrerror()); return -1; @@ -85,7 +107,7 @@ strm->avail_out = state->size; strm->next_out = state->out; } - state->next = strm->next_out; + state->x.next = strm->next_out; } /* compress */ @@ -131,7 +153,7 @@ } strm->avail_in = n; strm->next_in = state->in; - state->pos += n; + state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; @@ -146,7 +168,6 @@ unsigned len; { unsigned put = len; - unsigned n; gz_statep state; z_streamp strm; @@ -163,7 +184,7 @@ /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return 0; } @@ -186,16 +207,19 @@ if (len < state->size) { /* copy to input buffer, compress when full */ do { + unsigned have, copy; + if (strm->avail_in == 0) strm->next_in = state->in; - n = state->size - strm->avail_in; - if (n > len) - n = len; - memcpy(strm->next_in + strm->avail_in, buf, n); - strm->avail_in += n; - state->pos += n; - buf = (char *)buf + n; - len -= n; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + strm->avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; if (len && gz_comp(state, Z_NO_FLUSH) == -1) return 0; } while (len); @@ -207,8 +231,8 @@ /* directly compress user buffer to file */ strm->avail_in = len; - strm->next_in = (voidp)buf; - state->pos += len; + strm->next_in = (z_const Bytef *)buf; + state->x.pos += len; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; } @@ -222,6 +246,7 @@ gzFile file; int c; { + unsigned have; unsigned char buf[1]; gz_statep state; z_streamp strm; @@ -245,19 +270,23 @@ /* try writing to input buffer for speed (state->size == 0 if buffer not initialized) */ - if (strm->avail_in < state->size) { + if (state->size) { if (strm->avail_in == 0) strm->next_in = state->in; - strm->next_in[strm->avail_in++] = c; - state->pos++; - return c; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } } /* no room in buffer or not initialized, use gz_write() */ buf[0] = c; if (gzwrite(file, buf, 1) != 1) return -1; - return c; + return c & 0xff; } /* -- see zlib.h -- */ @@ -274,87 +303,11 @@ return ret == 0 && len != 0 ? -1 : ret; } -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) -{ - int size, len; - gz_statep state; - z_streamp strm; - va_list va; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(state->in, format, va); - va_end(va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = vsprintf(state->in, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(state->in, size, format, va); - va_end(va); - len = strlen(state->in); -# else - len = vsnprintf((char *)(state->in), size, format, va); - va_end(va); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->pos += len; - return len; -} - -#else /* !STDC */ - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int size, len; gz_statep state; @@ -388,24 +341,20 @@ /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = vsprintf((char *)(state->in), format, va); # endif #else -# ifdef HAS_snprintf_void - snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(state->in); +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + len = strlen((char *)(state->in)); # else - len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = vsnprintf((char *)(state->in), size, format, va); # endif #endif @@ -416,7 +365,97 @@ /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; - state->pos += len; + state->x.pos += len; + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; return len; } @@ -500,7 +539,7 @@ int ZEXPORT gzclose_w(file) gzFile file; { - int ret = 0; + int ret = Z_OK; gz_statep state; /* get internal structure */ @@ -515,17 +554,24 @@ /* check for seek request */ if (state->seek) { state->seek = 0; - ret += gz_zero(state, state->skip); + if (gz_zero(state, state->skip) == -1) + ret = state->err; } /* flush, free memory, and close file */ - ret += gz_comp(state, Z_FINISH); - (void)deflateEnd(&(state->strm)); - free(state->out); - free(state->in); + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } gz_error(state, Z_OK, NULL); free(state->path); - ret += close(state->fd); + if (close(state->fd) == -1) + ret = Z_ERRNO; free(state); - return ret ? Z_ERRNO : Z_OK; + return ret; } diff --git a/Modules/zlib/infback.c b/Modules/zlib/infback.c --- a/Modules/zlib/infback.c +++ b/Modules/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2009 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -42,10 +42,19 @@ return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -246,7 +255,7 @@ void FAR *out_desc; { struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ + z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ @@ -394,7 +403,6 @@ PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } diff --git a/Modules/zlib/inffast.c b/Modules/zlib/inffast.c --- a/Modules/zlib/inffast.c +++ b/Modules/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010 Mark Adler + * Copyright (C) 1995-2008, 2010, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -69,8 +69,8 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ diff --git a/Modules/zlib/inffixed.h b/Modules/zlib/inffixed.h --- a/Modules/zlib/inffixed.h +++ b/Modules/zlib/inffixed.h @@ -2,9 +2,9 @@ * Generated automatically by makefixed(). */ - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { diff --git a/Modules/zlib/inflate.c b/Modules/zlib/inflate.c --- a/Modules/zlib/inflate.c +++ b/Modules/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -93,13 +93,39 @@ /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); #ifdef BUILDFIXED void makefixed OF((void)); #endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + int ZEXPORT inflateReset(strm) z_streamp strm; { @@ -107,24 +133,10 @@ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->wnext = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; + return inflateResetKeep(strm); } int ZEXPORT inflateReset2(strm, windowBits) @@ -180,10 +192,19 @@ if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -321,8 +342,8 @@ low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } @@ -355,12 +376,13 @@ output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, out) +local int updatewindow(strm, end, copy) z_streamp strm; -unsigned out; +const Bytef *end; +unsigned copy; { struct inflate_state FAR *state; - unsigned copy, dist; + unsigned dist; state = (struct inflate_state FAR *)strm->state; @@ -380,19 +402,18 @@ } /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + zmemcpy(state->window, end - state->wsize, state->wsize); state->wnext = 0; state->whave = state->wsize; } else { dist = state->wsize - state->wnext; if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); + zmemcpy(state->window + state->wnext, end - copy, dist); copy -= dist; if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); + zmemcpy(state->window, end - copy, copy); state->wnext = copy; state->whave = state->wsize; } @@ -499,11 +520,6 @@ bits -= bits & 7; \ } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -591,7 +607,7 @@ int flush; { struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ + z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ @@ -797,7 +813,7 @@ #endif case DICTID: NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); + strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: @@ -905,7 +921,7 @@ while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; - state->lencode = (code const FAR *)(state->next); + state->lencode = (const code FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); @@ -925,7 +941,6 @@ PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } @@ -980,7 +995,7 @@ values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; - state->lencode = (code const FAR *)(state->next); + state->lencode = (const code FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); @@ -989,7 +1004,7 @@ state->mode = BAD; break; } - state->distcode = (code const FAR *)(state->next); + state->distcode = (const code FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); @@ -1170,7 +1185,7 @@ #ifdef GUNZIP state->flags ? hold : #endif - REVERSE(hold)) != state->check) { + ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; @@ -1214,8 +1229,9 @@ */ inf_leave: RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } @@ -1249,13 +1265,37 @@ return Z_OK; } +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; - unsigned long id; + unsigned long dictid; + int ret; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; @@ -1263,29 +1303,21 @@ if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; - /* check for correct dictionary id */ + /* check for correct dictionary identifier */ if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) return Z_DATA_ERROR; } - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { state->mode = MEM; return Z_MEM_ERROR; } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; @@ -1321,7 +1353,7 @@ */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; -unsigned char FAR *buf; +const unsigned char FAR *buf; unsigned len; { unsigned got; @@ -1433,8 +1465,8 @@ } /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); diff --git a/Modules/zlib/inftrees.c b/Modules/zlib/inftrees.c --- a/Modules/zlib/inftrees.c +++ b/Modules/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; + " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -208,8 +208,8 @@ mask = used - 1; /* mask for comparing low */ /* check available table space */ - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ @@ -277,8 +277,8 @@ /* check for enough space */ used += 1U << curr; - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ @@ -289,38 +289,14 @@ } } - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - here.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = here; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; } /* set return parameters */ diff --git a/Modules/zlib/inftrees.h b/Modules/zlib/inftrees.h --- a/Modules/zlib/inftrees.h +++ b/Modules/zlib/inftrees.h @@ -41,7 +41,7 @@ examples/enough.c found in the zlib distribtution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns 852, and "enough 30 6 15" for distance codes returns 592. + returns returns 852, and "enough 30 6 15" for distance codes returns 592. The initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and diff --git a/Modules/zlib/make_vms.com b/Modules/zlib/make_vms.com --- a/Modules/zlib/make_vms.com +++ b/Modules/zlib/make_vms.com @@ -3,7 +3,7 @@ $! $! In case of problems with the install you might contact me at $! zinser at zinser.no-ip.info(preferred) or -$! zinser at sysdev.deutsche-boerse.com (work) +$! martin.zinser at eurexchange.com (work) $! $! Make procedure history for Zlib $! @@ -14,9 +14,16 @@ $! 0.03 20091224 Add support for large file check $! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite $! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! subdir path, update module search in makefile.in +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! shared image creation +$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared +$! image +$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). +$! "" -> automatic, preference: MMK, MMS, built-in. $! $ on error then goto err_exit -$ set proc/parse=ext $! $ true = 1 $ false = 0 @@ -32,31 +39,43 @@ $! $! Setup variables holding "config" information $! -$ Make = "" +$ Make = "''p1'" $ name = "Zlib" $ version = "?.?.?" $ v_string = "ZLIB_VERSION" $ v_file = "zlib.h" -$ ccopt = "" +$ ccopt = "/include = []" $ lopts = "" $ dnsrl = "" -$ aconf_in_file = "zconf.h.in#zconf.h_in" +$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" $ conf_check_string = "" $ linkonly = false $ optfile = name + ".opt" +$ mapfile = name + ".map" $ libdefs = "" +$ vax = f$getsyi("HW_MODEL").lt.1024 $ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$ ia64 = f$getsyi("HW_MODEL").ge.4096 $! -$ whoami = f$parse(f$enviornment("Procedure"),,,,"NO_CONCEAL") +$! 2012-03-05 SMS. +$! Why is this needed? And if it is needed, why not simply ".not. vax"? +$! +$!!! if axp .or. ia64 then set proc/parse=extended +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") $ mydef = F$parse(whoami,,,"DEVICE") $ mydir = f$parse(whoami,,,"DIRECTORY") - "][" $ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") $! $! Check for MMK/MMS $! -$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" -$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" -$! +$ if (Make .eqs. "") +$ then +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$ else +$ Make = f$edit( Make, "trim") +$ endif $! $ gosub find_version $! @@ -69,6 +88,7 @@ $! $ gosub check_compiler $ close topt +$ close optf $! $ if its_decc $ then @@ -83,6 +103,15 @@ $ define sys decc$library_include: $ endif $ endif +$! +$! 2012-03-05 SMS. +$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? +$! +$ if axp .or. ia64 +$ then +$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" +$ s_case = true +$ endif $ endif $ if its_vaxc .or. its_gnuc $ then @@ -122,15 +151,20 @@ $ endif $ goto aconf_loop $ACONF_EXIT: +$ write aconf "" +$ write aconf "/* VMS specifics added by make_vms.com: */" $ write aconf "#define VMS 1" $ write aconf "#include " $ write aconf "#include " $ write aconf "#ifdef _LARGEFILE" -$ write aconf "#define off64_t __off64_t" -$ write aconf "#define fopen64 fopen" -$ write aconf "#define fseeko64 fseeko" -$ write aconf "#define lseek64 lseek" -$ write aconf "#define ftello64 ftell" +$ write aconf "# define off64_t __off64_t" +$ write aconf "# define fopen64 fopen" +$ write aconf "# define fseeko64 fseeko" +$ write aconf "# define lseek64 lseek" +$ write aconf "# define ftello64 ftell" +$ write aconf "#endif" +$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" +$ write aconf "# define HAVE_VSNPRINTF" $ write aconf "#endif" $ close aconf_in $ close aconf @@ -139,8 +173,9 @@ $! $ write sys$output "Compiling Zlib sources ..." $ if make.eqs."" -$ then -$ dele example.obj;*,minigzip.obj;* +$ then +$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* +$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* $ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - adler32.c zlib.h zconf.h $ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - @@ -174,41 +209,34 @@ $ write sys$output "Building Zlib ..." $ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ $ write sys$output "Building example..." -$ CALL MAKE example.OBJ "CC ''CCOPT' example" - - example.c zlib.h zconf.h +$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - + [.test]example.c zlib.h zconf.h $ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb -$ if f$search("x11vms:xvmsutils.olb") .nes. "" -$ then -$ write sys$output "Building minigzip..." -$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - - minigzip.c zlib.h zconf.h -$ call make minigzip.exe - - "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - - minigzip.obj libz.olb -$ endif -$ else +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - + [.test]minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib" - + minigzip.obj libz.olb +$ else $ gosub crea_mms $ write sys$output "Make ''name' ''version' with ''Make' " $ 'make' -$ endif +$ endif $! -$! Alpha gets a shareable image +$! Create shareable image $! -$ If axp -$ Then -$ gosub crea_olist -$ write sys$output "Creating libzshr.exe" -$ call anal_obj_axp modules.opt _link.opt -$ if s_case -$ then -$ open/append optf modules.opt -$ write optf "case_sensitive=YES" -$ close optf -$ endif -$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt -$ endif +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call map_2_shopt 'mapfile' 'optfile' +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt $ write sys$output "Zlib build completed" +$ delete/nolog tmp.opt;* $ exit +$AMISS_ERR: +$ write sys$output "No source for config.hin found." +$ write sys$output "Tried any of ''aconf_in_file'" +$ goto err_exit $CC_ERR: $ write sys$output "C compiler required to build ''name'" $ goto err_exit @@ -216,7 +244,6 @@ $ set message/facil/ident/sever/text $ close/nolog optf $ close/nolog topt -$ close/nolog conf_hin $ close/nolog aconf_in $ close/nolog aconf $ close/nolog out @@ -397,7 +424,7 @@ $ deck # descrip.mms: MMS description file for building zlib on VMS # written by Martin P.J. Zinser -# +# OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ @@ -407,10 +434,9 @@ $ eod $ write out "CFLAGS=", ccopt $ write out "LOPTS=", lopts +$ write out "all : example.exe minigzip.exe libz.olb" $ copy sys$input: out $ deck - -all : example.exe minigzip.exe libz.olb @ write sys$output " Example applications available" libz.olb : libz.olb($(OBJS)) @@ -420,7 +446,7 @@ link $(LOPTS) example,libz.olb/lib minigzip.exe : minigzip.obj libz.olb - link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + link $(LOPTS) minigzip,libz.olb/lib clean : delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* @@ -431,7 +457,7 @@ compress.obj : compress.c zlib.h zconf.h crc32.obj : crc32.c zutil.h zlib.h zconf.h deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h -example.obj : example.c zlib.h zconf.h +example.obj : [.test]example.c zlib.h zconf.h gzclose.obj : gzclose.c zutil.h zlib.h zconf.h gzlib.obj : gzlib.c zutil.h zlib.h zconf.h gzread.obj : gzread.c zutil.h zlib.h zconf.h @@ -439,7 +465,7 @@ inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h inflate.obj : inflate.c zutil.h zlib.h zconf.h inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h -minigzip.obj : minigzip.c zlib.h zconf.h +minigzip.obj : [.test]minigzip.c zlib.h zconf.h trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h uncompr.obj : uncompr.c zlib.h zconf.h zutil.obj : zutil.c zutil.h zlib.h zconf.h @@ -455,13 +481,18 @@ $CREA_OLIST: $ open/read min makefile.in $ open/write mod modules.opt -$ src_check = "OBJC =" +$ src_check_list = "OBJZ =#OBJG =" $MRLOOP: $ read/end=mrdone min rec -$ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop +$ i = 0 +$SRC_CHECK_LOOP: +$ src_check = f$element(i, "#", src_check_list) +$ i = i+1 +$ if src_check .eqs. "#" then goto mrloop +$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop $ rec = rec - src_check $ gosub extra_filnam -$ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop $MRSLOOP: $ read/end=mrdone min rec $ gosub extra_filnam @@ -672,124 +703,6 @@ $ return $!------------------------------------------------------------------------------ $! -$! Analyze Object files for OpenVMS AXP to extract Procedure and Data -$! information to build a symbol vector for a shareable image -$! All the "brains" of this logic was suggested by Hartmut Becker -$! (Hartmut.Becker at compaq.com). All the bugs were introduced by me -$! (zinser at zinser.no-ip.info), so if you do have problem reports please do not -$! bother Hartmut/HP, but get in touch with me -$! -$! Version history -$! 0.01 20040406 Skip over shareable images in option file -$! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES -$! 0.03 20050107 Skip over Identification labels in option file -$! 0.04 20060117 Add uppercase alias to code compiled with /name=as_is -$! -$ ANAL_OBJ_AXP: Subroutine -$ V = 'F$Verify(0) -$ SAY := "WRITE_ SYS$OUTPUT" -$ -$ IF F$SEARCH("''P1'") .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" -$ goto exit_aa -$ ENDIF -$ IF "''P2'" .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP: Error, no output file provided" -$ goto exit_aa -$ ENDIF -$ -$ open/read in 'p1 -$ create a.tmp -$ open/append atmp a.tmp -$ loop: -$ read/end=end_loop in line -$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" -$ goto loop -$ endif -$ if f$locate("IDENTIFICATION=",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write sys$output "ANAL_OBJ_AXP-i-ident: Identification ", - - f$element(1,"=",line) -$ goto loop -$ endif -$ f= f$search(line) -$ if f .eqs. "" -$ then -$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" -$ goto loop -$ endif -$ define/user sys$output nl: -$ define/user sys$error nl: -$ anal/obj/gsd 'f /out=x.tmp -$ open/read xtmp x.tmp -$ XLOOP: -$ read/end=end_xloop xtmp xline -$ xline = f$edit(xline,"compress") -$ write atmp xline -$ goto xloop -$ END_XLOOP: -$ close xtmp -$ goto loop -$ end_loop: -$ close in -$ close atmp -$ if f$search("a.tmp") .eqs. "" - - then $ exit -$ ! all global definitions -$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp -$ ! all procedures -$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp -$ search c.tmp "symbol:"/out=d.tmp -$ define/user sys$output nl: -$ edito/edt/command=sys$input d.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=PROCEDURE)/whole -exit -$ ! all data -$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp -$ search e.tmp "symbol:"/out=f.tmp -$ define/user sys$output nl: -$ edito/edt/command=sys$input f.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=DATA)/whole -exit -$ sort/nodupl d.tmp,f.tmp g.tmp -$ open/read raw_vector g.tmp -$ open/write case_vector 'p2' -$ RAWLOOP: -$ read/end=end_rawloop raw_vector raw_element -$ write case_vector raw_element -$ if f$locate("=PROCEDURE)",raw_element) .lt. f$length(raw_element) -$ then -$ name = f$element(1,"=",raw_element) - "(" -$ if f$edit(name,"UPCASE") .nes. name then - - write case_vector f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)", - - f$edit(name,"UPCASE"), name) -$ endif -$ if f$locate("=DATA)",raw_element) .lt. f$length(raw_element) -$ then -$ name = f$element(1,"=",raw_element) - "(" -$ if f$edit(name,"UPCASE") .nes. name then - - write case_vector f$fao(" symbol_vector=(!AS/!AS=DATA)", - - f$edit(name,"UPCASE"), name) -$ endif -$ goto rawloop -$ END_RAWLOOP: -$ close raw_vector -$ close case_vector -$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*,g.tmp;* -$ if f$search("x.tmp") .nes. "" - - then $ delete x.tmp;* -$! -$ EXIT_AA: -$ if V then set verify -$ endsubroutine -$!------------------------------------------------------------------------------ -$! $! Write configuration to both permanent and temporary config file $! $! Version history @@ -802,3 +715,153 @@ $ close confh $ENDSUBROUTINE $!------------------------------------------------------------------------------ +$! +$! Analyze the project map file and create the symbol vector for a shareable +$! image from it +$! +$! Version history +$! 0.01 20120128 First version +$! 0.02 20120226 Add pre-load logic +$! +$ MAP_2_SHOPT: Subroutine +$! +$ SAY := "WRITE_ SYS$OUTPUT" +$! +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_m2s +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT: Error, no output file provided" +$ goto exit_m2s +$ ENDIF +$! +$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" +$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" +$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" +$ module4 = "inflateSync#uncompress#zlibVersion#compress" +$ open/read map 'p1 +$ if axp .or. ia64 +$ then +$ open/write aopt a.opt +$ open/write bopt b.opt +$ write aopt " CASE_SENSITIVE=YES" +$ write bopt "SYMBOL_VECTOR= (-" +$ mod_sym_num = 1 +$ MOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ MOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ mod_in = mod_in + 1 +$ goto mod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto mod_sym_loop +$ endif +$MAP_LOOP: +$ read/end=map_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto map_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ endif +$ goto map_loop +$MAP_END: +$ close/nolog aopt +$ close/nolog bopt +$ open/append libopt 'p2' +$ open/read aopt a.opt +$ open/read bopt b.opt +$ALOOP: +$ read/end=aloop_end aopt line +$ write libopt line +$ goto aloop +$ALOOP_END: +$ close/nolog aopt +$ sv = "" +$BLOOP: +$ read/end=bloop_end bopt svn +$ if (svn.nes."") +$ then +$ if (sv.nes."") then write libopt sv +$ sv = svn +$ endif +$ goto bloop +$BLOOP_END: +$ write libopt f$extract(0,f$length(sv)-2,sv), "-" +$ write libopt ")" +$ close/nolog bopt +$ delete/nolog/noconf a.opt;*,b.opt;* +$ else +$ if vax +$ then +$ open/append libopt 'p2' +$ mod_sym_num = 1 +$ VMOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ VMOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ mod_in = mod_in + 1 +$ goto vmod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto vmod_sym_loop +$ endif +$VMAP_LOOP: +$ read/end=vmap_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto vmap_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ endif +$ goto vmap_loop +$VMAP_END: +$ else +$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" +$ write sys$output "No options file created" +$ endif +$ endif +$ EXIT_M2S: +$ close/nolog map +$ close/nolog libopt +$ endsubroutine diff --git a/Modules/zlib/minigzip.c b/Modules/zlib/minigzip.c --- a/Modules/zlib/minigzip.c +++ b/Modules/zlib/minigzip.c @@ -1,5 +1,5 @@ /* minigzip.c -- simulate gzip using the zlib compression library - * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -40,6 +40,10 @@ # define SET_BINARY_MODE(file) #endif +#ifdef _MSC_VER +# define snprintf _snprintf +#endif + #ifdef VMS # define unlink delete # define GZ_SUFFIX "-gz" @@ -138,6 +142,197 @@ # define local #endif +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + q = Z_NULL; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + char *prog; void error OF((const char *msg)); @@ -272,8 +467,12 @@ exit(1); } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); +#else strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); +#endif in = fopen(file, "rb"); if (in == NULL) { @@ -308,7 +507,11 @@ exit(1); } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf, sizeof(buf), "%s", file); +#else strcpy(buf, file); +#endif if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { infile = file; @@ -317,7 +520,11 @@ } else { outfile = file; infile = buf; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); +#else strcat(infile, GZ_SUFFIX); +#endif } in = gzopen(infile, "rb"); if (in == NULL) { @@ -355,7 +562,11 @@ gzFile file; char *bname, outmode[20]; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outmode, sizeof(outmode), "%s", "wb6 "); +#else strcpy(outmode, "wb6 "); +#endif prog = argv[0]; bname = strrchr(argv[0], '/'); diff --git a/Modules/zlib/trees.c b/Modules/zlib/trees.c --- a/Modules/zlib/trees.c +++ b/Modules/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -74,11 +74,6 @@ * probability, to avoid transmitting the lengths for unused bit length codes. */ -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - /* =========================================================================== * Local data. These are initialized only once. */ @@ -151,8 +146,8 @@ local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); @@ -399,7 +394,6 @@ s->bi_buf = 0; s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; @@ -883,15 +877,17 @@ } /* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; @@ -902,20 +898,6 @@ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; } /* =========================================================================== @@ -990,7 +972,8 @@ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+last, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif @@ -998,7 +981,8 @@ send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif @@ -1075,8 +1059,8 @@ */ local void compress_block(s, ltree, dtree) deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ @@ -1118,7 +1102,6 @@ } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== @@ -1226,7 +1209,6 @@ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); diff --git a/Modules/zlib/uncompr.c b/Modules/zlib/uncompr.c --- a/Modules/zlib/uncompr.c +++ b/Modules/zlib/uncompr.c @@ -30,7 +30,7 @@ z_stream stream; int err; - stream.next_in = (Bytef*)source; + stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; diff --git a/Modules/zlib/zconf.h b/Modules/zlib/zconf.h --- a/Modules/zlib/zconf.h +++ b/Modules/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,11 +15,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -27,9 +29,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -40,44 +44,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -92,16 +105,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -111,7 +130,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -197,6 +218,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -243,6 +270,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -356,12 +391,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -370,21 +440,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -394,18 +481,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.h.cmakein b/Modules/zlib/zconf.h.cmakein --- a/Modules/zlib/zconf.h.cmakein +++ b/Modules/zlib/zconf.h.cmakein @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -17,11 +17,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -29,9 +31,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -42,44 +46,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -94,16 +107,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -113,7 +132,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -199,6 +220,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -245,6 +272,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -358,12 +393,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -372,21 +442,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -396,18 +483,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.h.in b/Modules/zlib/zconf.h.in --- a/Modules/zlib/zconf.h.in +++ b/Modules/zlib/zconf.h.in @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,11 +15,13 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block @@ -27,9 +29,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -40,44 +44,53 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -92,16 +105,22 @@ # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -111,7 +130,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -197,6 +218,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -243,6 +270,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -356,12 +391,47 @@ typedef Byte *voidp; #endif +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -370,21 +440,38 @@ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -394,18 +481,14 @@ # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/Modules/zlib/zconf.in.h b/Modules/zlib/zconf.in.h deleted file mode 100644 --- a/Modules/zlib/zconf.in.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/Modules/zlib/zlib.3 b/Modules/zlib/zlib.3 --- a/Modules/zlib/zlib.3 +++ b/Modules/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "19 Apr 2010" +.TH ZLIB 3 "28 Apr 2013" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -36,9 +36,9 @@ .IR zlib.h . The distribution source includes examples of use of the library in the files -.I example.c +.I test/example.c and -.IR minigzip.c, +.IR test/minigzip.c, as well as other examples in the .IR examples/ directory. @@ -65,7 +65,7 @@ written by A.M. Kuchling (amk at magnet.com), is available in Python 1.5 and later versions: .IP -http://www.python.org/doc/lib/module-zlib.html +http://docs.python.org/library/zlib.html .LP .I zlib is built into @@ -95,11 +95,11 @@ The data format used by the zlib library is described by RFC (Request for Comments) 1950 to 1952 in the files: .IP -http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format) +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) .br -http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format) +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) .br -http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format) +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) .LP Mark Nelson wrote an article about .I zlib @@ -125,8 +125,8 @@ Send questions and/or comments to zlib at gzip.org, or (for the Windows DLL version) to Gilles Vollant (info at winimage.com). .SH AUTHORS -Version 1.2.5 -Copyright (C) 1995-2010 Jean-loup Gailly (jloup at gzip.org) +Version 1.2.8 +Copyright (C) 1995-2013 Jean-loup Gailly (jloup at gzip.org) and Mark Adler (madler at alumni.caltech.edu). .LP This software is provided "as-is," diff --git a/Modules/zlib/zlib.h b/Modules/zlib/zlib.h --- a/Modules/zlib/zlib.h +++ b/Modules/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.5, April 19th, 2010 + version 1.2.8, April 28th, 2013 - Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,8 +24,8 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.5" -#define ZLIB_VERNUM 0x1250 +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_REVISION 8 #define ZLIB_VER_SUBREVISION 0 /* @@ -83,15 +83,15 @@ struct internal_state; typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ + z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + uLong total_out; /* total number of bytes output so far */ - char *msg; /* last error message, NULL if no error */ + z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ @@ -327,8 +327,9 @@ Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). @@ -451,23 +452,29 @@ error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is never required, but can be - used to inform inflate that a faster approach may be used for the single - inflate() call. + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK or Z_TREES is used. + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, + strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END @@ -478,7 +485,9 @@ initializing with inflateInit2(). Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -580,10 +589,15 @@ uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any call - of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly @@ -610,8 +624,8 @@ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, @@ -688,9 +702,29 @@ deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. */ +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); @@ -703,8 +737,9 @@ than or equal to 16, and that many of the least significant bits of value will be inserted in the output. - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, @@ -790,10 +825,11 @@ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is @@ -803,19 +839,38 @@ inflate(). */ +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been - found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the - success case, the application may save the current value of total_in - which indicates where valid compressed data was found. In the error case, - the application may repeatedly call inflateSync, providing more input each - time, until success or end of the input data. + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -962,12 +1017,13 @@ See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + the parameters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, @@ -975,11 +1031,12 @@ out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. @@ -1088,6 +1145,7 @@ 27-31: 0 (reserved) */ +#ifndef Z_SOLO /* utility functions */ @@ -1149,10 +1207,11 @@ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. */ - /* gzip file access functions */ /* @@ -1162,7 +1221,7 @@ wrapper, documented in RFC 1952, wrapped around a deflate stream. */ -typedef voidp gzFile; /* opaque gzip file descriptor */ +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); @@ -1172,13 +1231,28 @@ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) Also "a" - can be used instead of "w" to request that the gzip stream that will be - written be appended to the file. "+" will result in an error, since reading - and writing to the same gzip file is not supported. + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was @@ -1197,7 +1271,11 @@ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not @@ -1235,14 +1313,26 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If - the input file was not in gzip format, gzread copies the given number of - bytes into the buffer. + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream, or failing that, reading the rest - of the input file directly without decompression. The entire input file - will be read if gzread is called until it returns less than the requested - len. + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. @@ -1256,7 +1346,7 @@ error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of @@ -1301,7 +1391,10 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); @@ -1397,9 +1490,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. This state can change from - false to true while reading the input file if the end of a gzip stream is - reached, but is followed by data that is not another gzip stream. + (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. @@ -1408,6 +1499,13 @@ cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); @@ -1419,7 +1517,8 @@ must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, or Z_OK on success. + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); @@ -1457,6 +1556,7 @@ file that is being written concurrently. */ +#endif /* !Z_SOLO */ /* checksum functions */ @@ -1492,16 +1592,17 @@ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. Usage example: @@ -1544,17 +1645,42 @@ const char *version, int stream_size)); #define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if @@ -1562,7 +1688,7 @@ * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); @@ -1571,14 +1697,23 @@ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# ifdef _LARGEFILE64_SOURCE +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); @@ -1595,6 +1730,13 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + /* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; @@ -1603,8 +1745,21 @@ /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif #ifdef __cplusplus } diff --git a/Modules/zlib/zlib.map b/Modules/zlib/zlib.map --- a/Modules/zlib/zlib.map +++ b/Modules/zlib/zlib.map @@ -66,3 +66,18 @@ gzclose_r; gzclose_w; } ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; diff --git a/Modules/zlib/zutil.c b/Modules/zlib/zutil.c --- a/Modules/zlib/zutil.c +++ b/Modules/zlib/zutil.c @@ -1,17 +1,20 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif -const char * const z_errmsg[10] = { +z_const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ @@ -85,27 +88,27 @@ #ifdef FASTEST flags += 1L << 21; #endif -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_vsprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #else - flags += 1L << 24; + flags += 1L << 24; # ifdef NO_snprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_sprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #endif @@ -181,6 +184,7 @@ } #endif +#ifndef Z_SOLO #ifdef SYS16BIT @@ -316,3 +320,5 @@ } #endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/Modules/zlib/zutil.h b/Modules/zlib/zutil.h --- a/Modules/zlib/zutil.h +++ b/Modules/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,7 +13,7 @@ #ifndef ZUTIL_H #define ZUTIL_H -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -21,7 +21,7 @@ #include "zlib.h" -#ifdef STDC +#if defined(STDC) && !defined(Z_SOLO) # if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif @@ -29,6 +29,10 @@ # include #endif +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + #ifndef local # define local static #endif @@ -40,13 +44,13 @@ typedef ush FAR ushf; typedef unsigned long ulg; -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) + return (strm->msg = ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ @@ -78,16 +82,18 @@ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include # endif -# else /* MSC or DJGPP */ -# include # endif #endif @@ -107,18 +113,20 @@ #ifdef OS2 # define OS_CODE 0x06 -# ifdef M_I86 +# if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif # endif # endif #endif @@ -153,14 +161,15 @@ # endif #endif -#if defined(__BORLANDC__) +#if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 #pragma warn -8066 #endif /* provide prototypes for these when building zlib without LFS */ -#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); #endif @@ -177,42 +186,7 @@ /* functions */ -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# define vsnprintf _vsnprintf -# endif -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) +#if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) @@ -261,14 +235,19 @@ # define Tracecv(c,x) #endif - -voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); -void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + #endif /* ZUTIL_H */ diff --git a/PC/VS9.0/pythoncore.vcproj b/PC/VS9.0/pythoncore.vcproj --- a/PC/VS9.0/pythoncore.vcproj +++ b/PC/VS9.0/pythoncore.vcproj @@ -1246,74 +1246,6 @@ > - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -94,6 +94,7 @@ COMPILER_SCOPE_MODULE, COMPILER_SCOPE_CLASS, COMPILER_SCOPE_FUNCTION, + COMPILER_SCOPE_LAMBDA, COMPILER_SCOPE_COMPREHENSION, }; @@ -104,6 +105,7 @@ PySTEntryObject *u_ste; PyObject *u_name; + PyObject *u_qualname; /* dot-separated qualified name (lazy) */ int u_scope_type; /* The following fields are dicts that map objects to @@ -199,6 +201,7 @@ expr_ty starargs, expr_ty kwargs); static int compiler_try_except(struct compiler *, stmt_ty); +static int compiler_set_qualname(struct compiler *); static PyCodeObject *assemble(struct compiler *, int addNone); static PyObject *__doc__; @@ -506,6 +509,7 @@ } Py_CLEAR(u->u_ste); Py_CLEAR(u->u_name); + Py_CLEAR(u->u_qualname); Py_CLEAR(u->u_consts); Py_CLEAR(u->u_names); Py_CLEAR(u->u_varnames); @@ -620,6 +624,11 @@ if (compiler_use_new_block(c) == NULL) return 0; + if (u->u_scope_type != COMPILER_SCOPE_MODULE) { + if (!compiler_set_qualname(c)) + return 0; + } + return 1; } @@ -647,72 +656,77 @@ } -static PyObject * -compiler_scope_qualname(struct compiler *c, identifier scope_name) +static int +compiler_set_qualname(struct compiler *c) { + _Py_static_string(dot, "."); + _Py_static_string(dot_locals, "."); Py_ssize_t stack_size; - int global_scope; - _Py_static_string(dot, "."); - _Py_static_string(locals, ""); - struct compiler_unit *u; - PyObject *capsule, *name, *seq, *dot_str, *locals_str; - - u = c->u; - seq = PyList_New(0); - if (seq == NULL) - return NULL; - + struct compiler_unit *u = c->u; + PyObject *name, *base, *dot_str, *dot_locals_str; + + base = NULL; stack_size = PyList_GET_SIZE(c->c_stack); assert(stack_size >= 1); - global_scope = stack_size == 1; - if (scope_name != NULL && !global_scope) { - int scope; - PyObject *mangled; + if (stack_size > 1) { + int scope, force_global = 0; + struct compiler_unit *parent; + PyObject *mangled, *capsule; + capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1); - u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); - assert(u); - mangled = _Py_Mangle(u->u_private, scope_name); - if (!mangled) - return NULL; - scope = PyST_GetScope(u->u_ste, mangled); - Py_DECREF(mangled); - assert(scope != GLOBAL_IMPLICIT); - if (scope == GLOBAL_EXPLICIT) - global_scope = 1; - } - if (!global_scope) { - Py_ssize_t i; - for (i = 1; i < stack_size; i++) { - capsule = PyList_GET_ITEM(c->c_stack, i); - u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); - assert(u); - assert(u->u_scope_type != COMPILER_SCOPE_MODULE); - if (PyList_Append(seq, u->u_name)) - goto _error; - if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { - locals_str = _PyUnicode_FromId(&locals); - if (locals_str == NULL) - goto _error; - if (PyList_Append(seq, locals_str)) - goto _error; + parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); + assert(parent); + + if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) { + assert(u->u_name); + mangled = _Py_Mangle(parent->u_private, u->u_name); + if (!mangled) + return 0; + scope = PyST_GetScope(parent->u_ste, mangled); + Py_DECREF(mangled); + assert(scope != GLOBAL_IMPLICIT); + if (scope == GLOBAL_EXPLICIT) + force_global = 1; + } + + if (!force_global) { + if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION + || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) { + dot_locals_str = _PyUnicode_FromId(&dot_locals); + if (dot_locals_str == NULL) + return 0; + base = PyUnicode_Concat(parent->u_qualname, dot_locals_str); + if (base == NULL) + return 0; + } + else { + Py_INCREF(parent->u_qualname); + base = parent->u_qualname; } } } - u = c->u; - if (PyList_Append(seq, u->u_name)) - goto _error; - dot_str = _PyUnicode_FromId(&dot); - if (dot_str == NULL) - goto _error; - name = PyUnicode_Join(dot_str, seq); - Py_DECREF(seq); - Py_XINCREF(name); - return name; - -_error: - Py_XDECREF(seq); - return NULL; + if (base != NULL) { + dot_str = _PyUnicode_FromId(&dot); + if (dot_str == NULL) { + Py_DECREF(base); + return 0; + } + name = PyUnicode_Concat(base, dot_str); + Py_DECREF(base); + if (name == NULL) + return 0; + PyUnicode_Append(&name, u->u_name); + if (name == NULL) + return 0; + } + else { + Py_INCREF(u->u_name); + name = u->u_name; + } + u->u_qualname = name; + + return 1; } /* Allocate a new block and return a pointer to it. @@ -1662,9 +1676,10 @@ VISIT_IN_SCOPE(c, stmt, st); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, s->v.FunctionDef.name); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) { + if (co == NULL) { Py_XDECREF(qualname); Py_XDECREF(co); return 0; @@ -1734,14 +1749,8 @@ return 0; } Py_DECREF(str); - /* store the __qualname__ */ - str = compiler_scope_qualname(c, s->v.ClassDef.name); - if (!str) { - compiler_exit_scope(c); - return 0; - } - ADDOP_O(c, LOAD_CONST, str, consts); - Py_DECREF(str); + assert(c->u->u_qualname); + ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts); str = PyUnicode_InternFromString("__qualname__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); @@ -1856,7 +1865,7 @@ if (res < 0) return 0; kw_default_count = res; } - if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, + if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA, (void *)e, e->lineno)) return 0; @@ -1875,9 +1884,10 @@ ADDOP_IN_SCOPE(c, RETURN_VALUE); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, NULL); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) return 0; arglength = asdl_seq_LEN(args->defaults); @@ -3152,9 +3162,10 @@ } co = assemble(c, 1); - qualname = compiler_scope_qualname(c, NULL); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) goto error; if (!compiler_make_closure(c, co, 0, qualname)) diff --git a/Python/importlib.h b/Python/importlib.h --- a/Python/importlib.h +++ b/Python/importlib.h [stripped] diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -116,6 +116,10 @@ PyThreadState *_Py_Finalizing = NULL; +/* Hack to force loading of object files */ +int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \ + PyOS_mystrnicmp; /* Python/pystrcmp.o */ + /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ PyObject * diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -471,13 +471,13 @@ write(fd, buffer, len); } -/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits, +/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits, and write it into the file fd. This function is signal safe. */ static void -dump_hexadecimal(int width, unsigned long value, int fd) +dump_hexadecimal(int fd, unsigned long value, int width) { int len; char buffer[sizeof(unsigned long) * 2 + 1]; @@ -544,15 +544,15 @@ } else if (ch < 0xff) { PUTS(fd, "\\x"); - dump_hexadecimal(2, ch, fd); + dump_hexadecimal(fd, ch, 2); } else if (ch < 0xffff) { PUTS(fd, "\\u"); - dump_hexadecimal(4, ch, fd); + dump_hexadecimal(fd, ch, 4); } else { PUTS(fd, "\\U"); - dump_hexadecimal(8, ch, fd); + dump_hexadecimal(fd, ch, 8); } } if (truncated) @@ -603,7 +603,7 @@ unsigned int depth; if (write_header) - PUTS(fd, "Traceback (most recent call first):\n"); + PUTS(fd, "Stack (most recent call first):\n"); frame = _PyThreadState_GetFrame(tstate); if (frame == NULL) @@ -641,8 +641,8 @@ PUTS(fd, "Current thread 0x"); else PUTS(fd, "Thread 0x"); - dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd); - PUTS(fd, ":\n"); + dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2); + PUTS(fd, " (most recent call first):\n"); } const char* diff --git a/configure b/configure --- a/configure +++ b/configure @@ -10601,6 +10601,35 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for prlimit" >&5 +$as_echo_n "checking for prlimit... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +void *x=prlimit + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_PRLIMIT 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -2927,6 +2927,16 @@ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for prlimit) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include + ]], [[void *x=prlimit]])], + [AC_DEFINE(HAVE_PRLIMIT, 1, Define if you have the 'prlimit' functions.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -627,6 +627,9 @@ /* Define to 1 if you have the `pread' function. */ #undef HAVE_PREAD +/* Define if you have the 'prlimit' functions. */ +#undef HAVE_PRLIMIT + /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 20:22:10 2013 From: python-checkins at python.org (larry.hastings) Date: Tue, 22 Oct 2013 20:22:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Move_3=2E4=2E0a4_from_future_?= =?utf-8?q?releases_to_released=2E?= Message-ID: <3d43360zJrz7Lky@mail.python.org> http://hg.python.org/peps/rev/482e7da0eee3 changeset: 5206:482e7da0eee3 user: Larry Hastings date: Tue Oct 22 11:22:05 2013 -0700 summary: Move 3.4.0a4 from future releases to released. files: pep-0429.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0429.txt b/pep-0429.txt --- a/pep-0429.txt +++ b/pep-0429.txt @@ -39,10 +39,10 @@ - 3.4.0 alpha 1: August 3, 2013 - 3.4.0 alpha 2: September 9, 2013 - 3.4.0 alpha 3: September 29, 2013 +- 3.4.0 alpha 4: October 20, 2013 The anticipated schedule for future releases: -- 3.4.0 alpha 4: October 20, 2013 - 3.4.0 beta 1: November 24, 2013 (Beta 1 is also "feature freeze"--no new features beyond this point.) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Oct 22 21:05:11 2013 From: python-checkins at python.org (tim.golden) Date: Tue, 22 Oct 2013 21:05:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE1MjA3?= =?utf-8?q?=3A_Fix_mimetypes_to_read_from_correct_area_in_Windows_registry?= Message-ID: <3d440l33RJz7Llx@mail.python.org> http://hg.python.org/cpython/rev/95b88273683c changeset: 86577:95b88273683c branch: 3.3 parent: 86561:4c4f31a1b706 user: Tim Golden date: Tue Oct 22 19:27:34 2013 +0100 summary: Issue #15207: Fix mimetypes to read from correct area in Windows registry (Original patch by Dave Chambers) files: Doc/library/mimetypes.rst | 3 +++ Lib/mimetypes.py | 22 ++++++++++++---------- Lib/test/test_mimetypes.py | 3 ++- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -85,6 +85,9 @@ :const:`knownfiles` takes precedence over those named before it. Calling :func:`init` repeatedly is allowed. + Specifying an empty list for *files* will prevent the system defaults from + being applied: only the well-known values will be present from a built-in list. + .. versionchanged:: 3.2 Previously, Windows registry settings were ignored. diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -249,19 +249,21 @@ yield ctype i += 1 - with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, - r'MIME\Database\Content Type') as mimedb: - for ctype in enum_types(mimedb): + with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: + for subkeyname in enum_types(hkcr): try: - with _winreg.OpenKey(mimedb, ctype) as key: - suffix, datatype = _winreg.QueryValueEx(key, - 'Extension') + with _winreg.OpenKey(hkcr, subkeyname) as subkey: + # Only check file extensions + if not subkeyname.startswith("."): + continue + # raises EnvironmentError if no 'Content Type' value + mimetype, datatype = _winreg.QueryValueEx( + subkey, 'Content Type') + if datatype != _winreg.REG_SZ: + continue + self.add_type(mimetype, subkeyname, strict) except EnvironmentError: continue - if datatype != _winreg.REG_SZ: - continue - self.add_type(ctype, suffix, strict) - def guess_type(url, strict=True): """Guess the type of a file based on its URL. diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -98,7 +98,8 @@ # Use file types that should *always* exist: eq = self.assertEqual eq(self.db.guess_type("foo.txt"), ("text/plain", None)) - + eq(self.db.guess_type("image.jpg"), ("image/jpeg", None)) + eq(self.db.guess_type("image.png"), ("image/png", None)) def test_main(): support.run_unittest(MimeTypesTestCase, diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -201,6 +201,7 @@ Matej Cepl Carl Cerecke Octavian Cerna +Dave Chambers Pascal Chambon John Chandler Hye-Shik Chang diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -81,6 +81,9 @@ Library ------- +- Issue #15207: Fix mimetypes to read from correct part of Windows registry + Original patch by Dave Chambers + - Issue #8964: fix platform._sys_version to handle IronPython 2.6+. Patch by Martin Matusiak. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 21:05:13 2013 From: python-checkins at python.org (tim.golden) Date: Tue, 22 Oct 2013 21:05:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2315207=3A_Fix_mimetypes_to_read_from_correct_are?= =?utf-8?q?a_in_Windows_registry?= Message-ID: <3d440n0Nldz7LjP@mail.python.org> http://hg.python.org/cpython/rev/12bf7fc1ba76 changeset: 86578:12bf7fc1ba76 parent: 86576:0917f6c62c62 parent: 86577:95b88273683c user: Tim Golden date: Tue Oct 22 20:03:47 2013 +0100 summary: Issue #15207: Fix mimetypes to read from correct area in Windows registry (Original patch by Dave Chambers) files: Doc/library/mimetypes.rst | 3 +++ Lib/mimetypes.py | 26 ++++++++++++++------------ Lib/test/test_mimetypes.py | 3 ++- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -85,6 +85,9 @@ :const:`knownfiles` takes precedence over those named before it. Calling :func:`init` repeatedly is allowed. + Specifying an empty list for *files* will prevent the system defaults from + being applied: only the well-known values will be present from a built-in list. + .. versionchanged:: 3.2 Previously, Windows registry settings were ignored. diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -243,25 +243,27 @@ while True: try: ctype = _winreg.EnumKey(mimedb, i) - except OSError: + except EnvironmentError: break else: yield ctype i += 1 - with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, - r'MIME\Database\Content Type') as mimedb: - for ctype in enum_types(mimedb): + with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: + for subkeyname in enum_types(hkcr): try: - with _winreg.OpenKey(mimedb, ctype) as key: - suffix, datatype = _winreg.QueryValueEx(key, - 'Extension') - except OSError: + with _winreg.OpenKey(hkcr, subkeyname) as subkey: + # Only check file extensions + if not subkeyname.startswith("."): + continue + # raises EnvironmentError if no 'Content Type' value + mimetype, datatype = _winreg.QueryValueEx( + subkey, 'Content Type') + if datatype != _winreg.REG_SZ: + continue + self.add_type(mimetype, subkeyname, strict) + except EnvironmentError: continue - if datatype != _winreg.REG_SZ: - continue - self.add_type(ctype, suffix, strict) - def guess_type(url, strict=True): """Guess the type of a file based on its URL. diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -98,7 +98,8 @@ # Use file types that should *always* exist: eq = self.assertEqual eq(self.db.guess_type("foo.txt"), ("text/plain", None)) - + eq(self.db.guess_type("image.jpg"), ("image/jpeg", None)) + eq(self.db.guess_type("image.png"), ("image/png", None)) def test_main(): support.run_unittest(MimeTypesTestCase, diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -209,6 +209,7 @@ Matej Cepl Carl Cerecke Octavian Cerna +Dave Chambers Pascal Chambon John Chandler Hye-Shik Chang diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #15207: Fix mimetypes to read from correct part of Windows registry + Original patch by Dave Chambers + - Issue #16595: Add prlimit() to resource module. - Issue #19324: Expose Linux-specific constants in resource module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 21:38:16 2013 From: python-checkins at python.org (peter.moody) Date: Tue, 22 Oct 2013 21:38:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2317400=3A_fix_documentat?= =?utf-8?q?ion=2C_add_cache_to_is=5Fglobal_and_correctly_handle?= Message-ID: <3d44kw0g5Yz7LjN@mail.python.org> http://hg.python.org/cpython/rev/365fd677856f changeset: 86579:365fd677856f user: Peter Moody date: Tue Oct 22 12:36:21 2013 -0700 summary: #17400: fix documentation, add cache to is_global and correctly handle 100.64.0.0/10 files: Doc/library/ipaddress.rst | 2 +- Lib/ipaddress.py | 8 +++++--- Lib/test/test_ipaddress.py | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -160,7 +160,7 @@ .. attribute:: is_global - ``True`` if the address is allocated for private networks. See + ``True`` if the address is allocated for public networks. See iana-ipv4-special-registry (for IPv4) or iana-ipv6-special-registry (for IPv6). diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -984,7 +984,7 @@ @property def is_global(self): - """Test if this address is allocated for private networks. + """Test if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per @@ -1233,6 +1233,7 @@ return self in reserved_network @property + @functools.lru_cache() def is_private(self): """Test if this address is allocated for private networks. @@ -1259,14 +1260,14 @@ @property def is_global(self): - """Test if this address is allocated for private networks. + """Test if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per iana-ipv4-special-registry. """ - return not self.is_private + return self in IPv4Network('100.64.0.0/10') or not self.is_private @property @@ -1856,6 +1857,7 @@ return self in sitelocal_network @property + @functools.lru_cache() def is_private(self): """Test if this address is allocated for private networks. diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1320,6 +1320,7 @@ '127.42.0.0/16').is_loopback) self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) self.assertEqual(True, ipaddress.ip_network('100.64.0.0/10').is_private) + self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global) self.assertEqual(True, ipaddress.ip_network('192.0.2.128/25').is_private) self.assertEqual(True, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 22 21:45:34 2013 From: python-checkins at python.org (tim.golden) Date: Tue, 22 Oct 2013 21:45:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE1MjA3?= =?utf-8?q?=3A_Fix_mimetypes_to_read_from_correct_area_in_Windows_registry?= Message-ID: <3d44vL58kwz7LjN@mail.python.org> http://hg.python.org/cpython/rev/e8cead08c556 changeset: 86580:e8cead08c556 branch: 2.7 parent: 86563:dc9f17f10899 user: Tim Golden date: Tue Oct 22 20:45:13 2013 +0100 summary: Issue #15207: Fix mimetypes to read from correct area in Windows registry (Original patch by Dave Chambers) files: Doc/library/mimetypes.rst | 3 ++ Lib/mimetypes.py | 31 ++++++++++++++----------- Lib/test/test_mimetypes.py | 2 + Misc/ACKS | 1 + Misc/NEWS | 3 ++ 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -85,6 +85,9 @@ :const:`knownfiles` takes precedence over those named before it. Calling :func:`init` repeatedly is allowed. + Specifying an empty list for *files* will prevent the system defaults from + being applied: only the well-known values will be present from a built-in list. + .. versionchanged:: 2.7 Previously, Windows registry settings were ignored. diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -254,23 +254,26 @@ i += 1 default_encoding = sys.getdefaultencoding() - with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, - r'MIME\Database\Content Type') as mimedb: - for ctype in enum_types(mimedb): + with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: + for subkeyname in enum_types(hkcr): try: - with _winreg.OpenKey(mimedb, ctype) as key: - suffix, datatype = _winreg.QueryValueEx(key, - 'Extension') + with _winreg.OpenKey(hkcr, subkeyname) as subkey: + # Only check file extensions + if not subkeyname.startswith("."): + continue + # raises EnvironmentError if no 'Content Type' value + mimetype, datatype = _winreg.QueryValueEx( + subkey, 'Content Type') + if datatype != _winreg.REG_SZ: + continue + try: + mimetype = mimetype.encode(default_encoding) + subkeyname = subkeyname.encode(default_encoding) + except UnicodeEncodeError: + continue + self.add_type(mimetype, subkeyname, strict) except EnvironmentError: continue - if datatype != _winreg.REG_SZ: - continue - try: - suffix = suffix.encode(default_encoding) # omit in 3.x! - except UnicodeEncodeError: - continue - self.add_type(ctype, suffix, strict) - def guess_type(url, strict=True): """Guess the type of a file based on its URL. diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -85,6 +85,8 @@ # Use file types that should *always* exist: eq = self.assertEqual eq(self.db.guess_type("foo.txt"), ("text/plain", None)) + eq(self.db.guess_type("image.jpg"), ("image/jpeg", None)) + eq(self.db.guess_type("image.png"), ("image/png", None)) def test_main(): test_support.run_unittest(MimeTypesTestCase, diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -166,6 +166,7 @@ Per Cederqvist Carl Cerecke Octavian Cerna +Dave Chambers Pascal Chambon John Chandler Hye-Shik Chang diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -40,6 +40,9 @@ Library ------- +- Issue #15207: Fix mimetypes to read from correct part of Windows registry + Original patch by Dave Chambers + - Issue #8964: fix platform._sys_version to handle IronPython 2.6+. Patch by Martin Matusiak. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 02:03:29 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 23 Oct 2013 02:03:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Clarify_about_n?= =?utf-8?q?amespace_packages_and_about_what_ModuleSpec_does?= Message-ID: <3d4Bcx3LMBz7LjN@mail.python.org> http://hg.python.org/peps/rev/363664d77869 changeset: 5207:363664d77869 user: Eric Snow date: Tue Oct 22 17:59:33 2013 -0600 summary: [PEP 451] Clarify about namespace packages and about what ModuleSpec does during loading. files: pep-0451.txt | 42 +++++++++++++++++++++++++-------------- 1 files changed, 27 insertions(+), 15 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -443,32 +443,34 @@ How Loading Will Work ===================== -This is an outline of what happens in ModuleSpec's loading -functionality:: +Here is an outline of what ModuleSpec does during loading:: - def load(spec): - if not hasattr(spec.loader, 'exec_module'): - module = spec.loader.load_module(spec.name) - spec.init_module_attrs(module) - return sys.modules[spec.name] + def load(self): + if not hasattr(self.loader, 'exec_module'): + module = self.loader.load_module(self.name) + self.init_module_attrs(module) + return sys.modules[self.name] module = None - if hasattr(spec.loader, 'create_module'): - module = spec.loader.create_module(spec) + if hasattr(self.loader, 'create_module'): + module = self.loader.create_module(self) if module is None: - module = ModuleType(spec.name) - spec.init_module_attrs(module) + module = ModuleType(self.name) + self.init_module_attrs(module) - sys.modues[spec.name] = module + sys.modules[self.name] = module try: - spec.loader.exec_module(module) + self.loader.exec_module(module) except BaseException: try: - del sys.modules[spec.name] + del sys.modules[self.name] except KeyError: pass raise - return sys.modules[spec.name] + return sys.modules[self.name] + +Note: no "load" method is actually implemented as part of the public +ModuleSpec API. These steps are exactly what Loader.load_module() is already expected to do. Loaders will thus be simplified since they will only @@ -705,6 +707,16 @@ added in Python 3.3. However, the extra complexity and a less-than- explicit method name aren't worth it. +Namespace Packages +------------------ + +Currently a path entry finder may return (None, portions) from +find_loader() to indicate it found part of a possible namespace +package. To achieve the same effect, find_spec() must return a spec +with "loader" set to None (a.k.a. not set) and with +submodule_search_locations set to the same portions as were provided by +find_loader(). It's up to PathFinder how to handle such specs. + Loaders ------- -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 04:13:00 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 23 Oct 2013 04:13:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Fix_some_typos?= =?utf-8?q?=2E?= Message-ID: <3d4FVN6SVDz7LjX@mail.python.org> http://hg.python.org/peps/rev/43da7eb35635 changeset: 5208:43da7eb35635 user: Eric Snow date: Tue Oct 22 20:09:07 2013 -0600 summary: [PEP 451] Fix some typos. files: pep-0451.txt | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -164,7 +164,7 @@ with Python 3.1, now exposes a pure Python implementation of the APIs described by PEP 302, as well as of the full import system. It is now much easier to understand and extend the import system. While a benefit -to the Python community, this greater accessibilty also presents a +to the Python community, this greater accessabilty also presents a challenge. As more developers come to understand and customize the import system, @@ -188,7 +188,7 @@ though the import-related information about a module is likely available without loading the module, it is not otherwise exposed. -Furthermore, the requirements assocated with load_module() are +Furthermore, the requirements associated with load_module() are common to all loaders and mostly are implemented in exactly the same way. This means every loader has to duplicate the same boilerplate code. importlib.util provides some tools that help with this, but @@ -545,7 +545,8 @@ "has_location" may be implied from the existence of a load_data() method on the loader. -Incidently, not all locatable modules will be cachable, but most will. +Incidentally, not all locatable modules will be cache-able, but most +will. **submodule_search_locations** @@ -587,7 +588,7 @@ not passed in. * "loader" can be deduced from suffix if the location is a filename. * "submodule_search_locations" can be deduced from loader.is_package() - and from os.path.dirname(location) if locatin is a filename. + and from os.path.dirname(location) if location is a filename. **from_loader(name, loader, \*, origin=None, is_package=None)** @@ -596,7 +597,7 @@ * "has_location" can be deduced from loader.get_data. * "origin" can be deduced from loader.get_filename(). * "submodule_search_locations" can be deduced from loader.is_package() - and from os.path.dirname(location) if locatin is a filename. + and from os.path.dirname(location) if location is a filename. **spec_from_module(module, loader=None)** -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 05:31:14 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 23 Oct 2013 05:31:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Fix_a_ModuleSpe?= =?utf-8?q?c_attribute_=28parent=29_that_was_named_inconsistently_in?= Message-ID: <3d4HDf1g8Pz7Ljh@mail.python.org> http://hg.python.org/peps/rev/3ed796a8e348 changeset: 5209:3ed796a8e348 user: Eric Snow date: Tue Oct 22 21:27:10 2013 -0600 summary: [PEP 451] Fix a ModuleSpec attribute (parent) that was named inconsistently in different parts. files: pep-0451.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0451.txt b/pep-0451.txt --- a/pep-0451.txt +++ b/pep-0451.txt @@ -502,7 +502,7 @@ ========================== ============== name __name__ loader __loader__ -package __package__ +parent __package__ origin __file__* cached __cached__*,** submodule_search_locations __path__** @@ -513,7 +513,7 @@ | \* Set on the module only if spec.has_location is true. | \*\* Set on the module only if the spec attribute is not None. -While package and has_location are read-only properties, the remaining +While parent and has_location are read-only properties, the remaining attributes can be replaced after the module spec is created and even after import is complete. This allows for unusual cases where directly modifying the spec is the best option. However, typical use should not -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Wed Oct 23 07:40:22 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 23 Oct 2013 07:40:22 +0200 Subject: [Python-checkins] Daily reference leaks (365fd677856f): sum=0 Message-ID: results for 365fd677856f on branch "default" -------------------------------------------- test_site leaked [0, -2, 2] references, sum=0 test_site leaked [0, -2, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogwIUzun', '-x'] From python-checkins at python.org Wed Oct 23 07:52:25 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 23 Oct 2013 07:52:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogW0lzc3VlICMxOTM1?= =?utf-8?q?7=5D_Ensure_module_=22loaded=22_during_tests_gets_forgotten=2E?= Message-ID: <3d4LMY513Hz7Lk3@mail.python.org> http://hg.python.org/cpython/rev/2a62cd8553b5 changeset: 86581:2a62cd8553b5 branch: 3.3 parent: 86577:95b88273683c user: Eric Snow date: Tue Oct 22 23:27:42 2013 -0600 summary: [Issue #19357] Ensure module "loaded" during tests gets forgotten. files: Lib/test/test_importlib/import_/test_caching.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_importlib/import_/test_caching.py b/Lib/test/test_importlib/import_/test_caching.py --- a/Lib/test/test_importlib/import_/test_caching.py +++ b/Lib/test/test_importlib/import_/test_caching.py @@ -24,7 +24,7 @@ def test_using_cache(self): # [use cache] module_to_use = "some module found!" - with util.uncache(module_to_use): + with util.uncache('some_module'): sys.modules['some_module'] = module_to_use module = import_util.import_('some_module') self.assertEqual(id(module_to_use), id(module)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 07:52:26 2013 From: python-checkins at python.org (eric.snow) Date: Wed, 23 Oct 2013 07:52:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_=5BIssue_=2319357=5D_Ensure_module_=22loaded=22_during_t?= =?utf-8?q?ests_gets_forgotten=2E?= Message-ID: <3d4LMZ6p5Nz7Lm1@mail.python.org> http://hg.python.org/cpython/rev/733be92448b0 changeset: 86582:733be92448b0 parent: 86579:365fd677856f parent: 86581:2a62cd8553b5 user: Eric Snow date: Tue Oct 22 23:46:53 2013 -0600 summary: [Issue #19357] Ensure module "loaded" during tests gets forgotten. files: Lib/test/test_importlib/import_/test_caching.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_importlib/import_/test_caching.py b/Lib/test/test_importlib/import_/test_caching.py --- a/Lib/test/test_importlib/import_/test_caching.py +++ b/Lib/test/test_importlib/import_/test_caching.py @@ -24,7 +24,7 @@ def test_using_cache(self): # [use cache] module_to_use = "some module found!" - with util.uncache(module_to_use): + with util.uncache('some_module'): sys.modules['some_module'] = module_to_use module = import_util.import_('some_module') self.assertEqual(id(module_to_use), id(module)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 08:26:28 2013 From: python-checkins at python.org (larry.hastings) Date: Wed, 23 Oct 2013 08:26:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Two_small=2C_quick_bugfixe?= =?utf-8?q?s_for_Argument_Clinic=2E?= Message-ID: <3d4M6r3yTFz7LjM@mail.python.org> http://hg.python.org/cpython/rev/179a3cf73e47 changeset: 86583:179a3cf73e47 user: Larry Hastings date: Tue Oct 22 23:26:23 2013 -0700 summary: Two small, quick bugfixes for Argument Clinic. files: Tools/clinic/clinic.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -922,8 +922,8 @@ if self.is_start_line(line): break + output = output_output() if checksum: - output = output_output() if self.verify: computed = compute_checksum(output) if checksum != computed: @@ -2054,7 +2054,7 @@ except SyntaxError: pass if not module: - fail("Function " + clinic.name + " has an invalid parameter declaration:\n\t" + line) + fail("Function " + self.function.name + " has an invalid parameter declaration:\n\t" + line) function_args = module.body[0].args parameter = function_args.args[0] -- Repository URL: http://hg.python.org/cpython From victor.stinner at gmail.com Wed Oct 23 13:53:40 2013 From: victor.stinner at gmail.com (Victor Stinner) Date: Wed, 23 Oct 2013 13:53:40 +0200 Subject: [Python-checkins] [Python-Dev] cpython: Switch subprocess stdin to a socketpair, attempting to fix issue #19293 (AIX In-Reply-To: <20131023115849.3e0b446c@pitrou.net> References: <3d3gQD1pkkz7LmM@mail.python.org> <20131023115849.3e0b446c@pitrou.net> Message-ID: "For the record, pipe I/O seems a little faster than socket I/O under Linux" In and old (2006) email on LKML (Linux kernel), I read: "as far as I know pipe() is now much faster than socketpair(), because pipe() uses the zero-copy mechanism." https://lkml.org/lkml/2006/9/24/121 On Linux, splice() can also be used with pipes for zero-copy operations. I don't know if splice() works with socketpair(). Well, I don't think that Python uses splice() now, but it may be interesting to use it. Or sendfile() uses it maybe internally? Victor From python-checkins at python.org Wed Oct 23 17:17:08 2013 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 23 Oct 2013 17:17:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Update_a_lot_of_the_intro_tex?= =?utf-8?q?t_in_PEP_3156=2E?= Message-ID: <3d4Zv855PSz7LjY@mail.python.org> http://hg.python.org/peps/rev/b1527461cdc0 changeset: 5210:b1527461cdc0 user: Guido van Rossum date: Wed Oct 23 08:17:05 2013 -0700 summary: Update a lot of the intro text in PEP 3156. files: pep-3156.txt | 207 +++++++++++++++++++++++++------------- 1 files changed, 133 insertions(+), 74 deletions(-) diff --git a/pep-3156.txt b/pep-3156.txt --- a/pep-3156.txt +++ b/pep-3156.txt @@ -13,25 +13,68 @@ Abstract ======== -This is a proposal for asynchronous I/O in Python 3, starting with +This is a proposal for asynchronous I/O in Python 3, starting at Python 3.3. Consider this the concrete proposal that is missing from -PEP 3153. The proposal includes a pluggable event loop API, transport -and protocol abstractions similar to those in Twisted, and a -higher-level scheduler based on ``yield from`` (PEP 380). A reference -implementation is in the works under the code name Tulip. The Tulip -repo is linked from the References section at the end. - -The proposed standard library module name is ``asyncio``, although the -rest of this PEP has not yet been updated to reflect this. +PEP 3153. The proposal includes a pluggable event loop, transport and +protocol abstractions similar to those in Twisted, and a higher-level +scheduler based on ``yield from`` (PEP 380). The proposed package +name is ``asyncio``. Introduction ============ +Status +------ + +A reference implementation exists under the code name Tulip. The +Tulip repo is linked from the References section at the end. Packages +based on this repo will be provided on PyPI (see References) to enable +using the ``asyncio`` package with Python 3.3 installations. + +As of October 20th 2013, the ``asyncio`` package has been checked into +the Python 3.4 repository and released with Python 3.4-alpha-4, with +"provisional" API status. This is an expression of confidence and +intended to increase early feedback on the API, and not intended to +force acceptance of the PEP. The expectation is that the package will +keep provisional status in Python 3.4 and progress to final status in +Python 3.5. Development continues to occur primarily in the Tulip +repo. + +Dependencies +------------ + +Python 3.3 is required for many of the proposed features. The +reference implementation (Tulip) requires no new language or standard +library features beyond Python 3.3, no third-party modules or +packages, and no C code, except for the proactor-based event loop on +Windows. + +Module Namespace +---------------- + +The specification here lives in a new top-level package, ``asyncio``. +Different components live in separate submodules of the package. The +package will import common APIs from their respective submodules and +make them available as package attributes (similar to the way the +email package works). For such common APIs, the name of the submodule +that actually defines them is not part of the specification. Less +common APIs may have to explicitly be imported from their respective +submodule, and in this case the submodule name is part of the +specification. + +Classes and functions defined without a submodule name are assumed to +live in the namespace of the top-level package. (But do not confuse +these with methods of various classes, which for brevity are also used +without a namespace prefix in certain contexts.) + +Interoperability +---------------- + The event loop is the place where most interoperability occurs. It should be easy for (Python 3.3 ports of) frameworks like Twisted, Tornado, or even gevents to either adapt the default event loop -implementation to their needs using a lightweight wrapper or proxy, or +implementation to their needs using a lightweight adapter or proxy, or to replace the default event loop implementation with an adaptation of their own event loop implementation. (Some frameworks, like Twisted, have multiple event loop implementations. This should not be a @@ -62,66 +105,103 @@ - the interface of a conforming event loop and its minimum guarantees An event loop implementation may provide additional methods and -guarantees. +guarantees, as long as these are called out in the documentation as +non-standard. An event loop implementation may also leave certain +methods unimplemented if they cannot be implemented in the given +environment; however, such deviations from the standard API should be +considered only as a last resort, and only if the platform or +environment forces the issue. (An example could be a platform where +there is a system event loop that cannot be started or stopped.) -The event loop interface does not depend on ``yield from``. Rather, it -uses a combination of callbacks, additional interfaces (transports and +The event loop API does not depend on ``yield from``. Rather, it uses +a combination of callbacks, additional interfaces (transports and protocols), and Futures. The latter are similar to those defined in PEP 3148, but have a different implementation and are not tied to threads. In particular, they have no wait() method; the user is expected to use callbacks. +All event loop methods documented as returning a coroutine are allowed +to return either a Future or a coroutine, at the implementation's +choice (the standard implementation always returns coroutines). All +event loop methods documented as accepting coroutine arguments *must* +accept both Futures and coroutines for such arguments. (A convenience +function, ``async()``, exists to convert an argument that is either a +conroutine or a Future into a Future.) + For users (like myself) who don't like using callbacks, a scheduler is provided for writing asynchronous I/O code as coroutines using the PEP 380 ``yield from`` expressions. The scheduler is not pluggable; -pluggability occurs at the event loop level, and the scheduler should -work with any conforming event loop implementation. +pluggability occurs at the event loop level, and the standard +scheduler implementation should work with any conforming event loop +implementation. (In fact this is an important litmus test for +conforming implementations.) For interoperability between code written using coroutines and other -async frameworks, the scheduler has a Task class that behaves like a +async frameworks, the scheduler defines a Task class that behaves like a Future. A framework that interoperates at the event loop level can wait for a Future to complete by adding a callback to the Future. Likewise, the scheduler offers an operation to suspend a coroutine until a callback is called. -Limited interoperability with threads is provided by the event loop -interface; there is an API to submit a function to an executor (see -PEP 3148) which returns a Future that is compatible with the event -loop. +The event loop API provides limited interoperability with threads: +there is an API to submit a function to an executor (see PEP 3148) +which returns a Future that is compatible with the event loop, and +there is a method to schedule a callback with an event loop from +another thread in a thread-safe manner. -A Note About Transports and Protocols -------------------------------------- +Transports and Protocols +------------------------ For those not familiar with Twisted, a quick explanation of the -difference between transports and protocols is in order. At the +relationship between transports and protocols is in order. At the highest level, the transport is concerned with *how* bytes are transmitted, while the protocol determines *which* bytes to transmit (and to some extent when). +A different way of saying the same thing: a transport is an +abstraction for a socket (or similar I/O endpoint) while a protocol is +an abstraction for an application, from the transport's point of view. + +Yet another view is simply that the transport and protocol interfaces +*together* define an abstract interface for using network I/O and +interprocess I/O. + +There is almost always a 1:1 relationship between transport and +protocol objects: the protocol calls transport methods to send data, +while the transport calls protocol methods to pass it data that has +been received. Neither transport not protocol methods "block" -- they +set events into motion and then return. + The most common type of transport is a bidirectional stream transport. -It represents a pair of streams (one in each direction) that each -transmit a sequence of bytes. The most common example of a +It represents a pair of buffered streams (one in each direction) that +each transmit a sequence of bytes. The most common example of a bidirectional stream transport is probably a TCP connection. Another common example is an SSL connection. But there are some other things that can be viewed this way, for example an SSH session or a pair of UNIX pipes. Typically there aren't many different transport implementations, and most of them come with the event loop -implementation. Note that transports don't need to use sockets, not -even if they use TCP -- sockets are a platform-specific implementation -detail. +implementation. (But there is no requirement that all transports must +be created by calling an event loop method -- a third party module may +well implement a new transport and provide a constructor or factory +function for it that simply takes an event loop as an argument.) -A bidirectional stream transport has two "sides": one side talks to +Note that transports don't need to use sockets, not even if they use +TCP -- sockets are a platform-specific implementation detail. + +A bidirectional stream transport has two "ends": one end talks to the network (or another process, or whatever low-level interface it -wraps), and the other side talks to the protocol. The former uses +wraps), and the other end talks to the protocol. The former uses whatever API is necessary to implement the transport; but the interface between transport and protocol is standardized by this PEP. -A protocol represents some kind of "application-level" protocol such -as HTTP or SMTP. Its primary interface is with the transport. While -some popular protocols will probably have a standard implementation, -often applications implement custom protocols. It also makes sense to -have libraries of useful 3rd party protocol implementations that can -be downloaded and installed from pypi.python.org. +A protocol can represent some kind of "application-level" protocol +such as HTTP or SMTP; it can also implement an abstraction shared by +multiple protocols, or a whole application. A protocol's primary +interface is with the transport. While some popular protocols (and +other abstractions) may have standard implementations, often +applications implement custom protocols. It also makes sense to have +libraries of useful third party protocol implementations that can be +downloaded and installed from PyPI. There general notion of transport and protocol includes other interfaces, where the transport wraps some other communication @@ -134,37 +214,10 @@ Details of the interfaces defined by the various standard types of transports and protocols are given later. -Dependencies ------------- - -Python 3.3 is required for many of the proposed features. The -reference implementation (Tulip) requires no new language or standard -library features beyond Python 3.3, no third-party modules or -packages, and no C code, except for the proactor-based event loop on -Windows. - Event Loop Interface Specification ================================== -Module Namespace ----------------- - -The specification here will live in a new toplevel package. Different -components will live in separate submodules of that package. The -package will import common APIs from their respective submodules and -make them available as package attributes (similar to the way the -email package works). - -The name of the toplevel package is currently unspecified. The -reference implementation uses the name 'tulip', but the name will -change to something more boring if and when the implementation is -moved into the standard library (hopefully for Python 3.4). - -Until the boring name is chosen, this PEP will use 'tulip' as the -toplevel package name. Classes and functions given without a module -name are assumed to be accessed via the toplevel package. - Event Loop Policy: Getting and Setting the Current Event Loop ------------------------------------------------------------- @@ -189,7 +242,8 @@ To set the event loop for the current context, use ``set_event_loop(event_loop)``, where ``event_loop`` is an event loop -object. It is okay to set the current event loop to ``None``, in +object, i.e. an instance of ``AbstractEventLoop``, or ``None``. +It is okay to set the current event loop to ``None``, in which case subsequent calls to ``get_event_loop()`` will raise an exception. This is useful for testing code that should not depend on the existence of a default event loop. @@ -213,17 +267,18 @@ this the current event loop, you must call ``set_event_loop()`` with it. -To change the event loop policy, -call ``set_event_loop_policy(policy)``, where ``policy`` is an event -loop policy object or ``None``. The policy object must be an object -that has methods ``get_event_loop()``, ``set_event_loop(loop)`` and +To change the event loop policy, call +``set_event_loop_policy(policy)``, where ``policy`` is an event loop +policy object or ``None``. If not ``None``, the policy object must be +an instance of ``AbstractEventLoopPolicy`` that defines methods +``get_event_loop()``, ``set_event_loop(loop)`` and ``new_event_loop()``, all behaving like the functions described above. + Passing a policy value of ``None`` restores the default event loop policy (overriding the alternate default set by the platform or framework). The default event loop policy is an instance of the class ``DefaultEventLoopPolicy``. The current event loop policy object can -be retrieved by calling ``get_event_loop_policy()``. (TBD: Require -inheriting from ``AbstractEventLoopPolicy``?) +be retrieved by calling ``get_event_loop_policy()``. Event Loop Classes ------------------ @@ -544,8 +599,8 @@ specific address. This is how you would do that. The host and port are looked up using ``getaddrinfo()``. -- ``create_server_serving(protocol_factory, host, port, - )``. Enters a serving loop that accepts connections. +- ``create_server(protocol_factory, host, port, )``. + Enters a serving loop that accepts connections. This is a coroutine that completes once the serving loop is set up to serve. The return value is a ``Server`` object which can be used to stop the serving loop in a controlled fashion by calling its @@ -735,8 +790,10 @@ write half of the bidirectional stream interface. - TBD: A way to run a subprocess with stdin, stdout and stderr - connected to pipe transports. (This is being designed but not yet - ready.) + connected to pipe transports. (This is implemented now but not yet + documented.) (TBD: Document that the subprocess's + connection_closed() won't be called until the process has exited + *and* all pipes are closed, and why -- it's a race condition.) TBD: offer the same interface on Windows for e.g. named pipes. (This should be possible given that the standard library ``subprocess`` @@ -1488,6 +1545,8 @@ - Tulip repo: http://code.google.com/p/tulip/ +- PyPI: the Python Package Index at http://pypi.python.org/ + - Nick Coghlan wrote a nice blog post with some background, thoughts about different approaches to async I/O, gevent, and how to use futures with constructs like ``while``, ``for`` and ``with``: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 18:54:54 2013 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Oct 2013 18:54:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319345=3A_fix_typo?= Message-ID: <3d4d3y2tcGz7LjX@mail.python.org> http://hg.python.org/cpython/rev/5e606f093d8f changeset: 86584:5e606f093d8f user: Victor Stinner date: Wed Oct 23 18:54:43 2013 +0200 summary: Close #19345: fix typo files: Doc/whatsnew/3.4.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -678,8 +678,8 @@ Deprecated functions and types of the C API ------------------------------------------- -* The ``PyThreadState.tick_counter`` field has been value: its value was meaningless - since Python 3.2 ("new GIL"). +* The ``PyThreadState.tick_counter`` field has been removed: its value was + meaningless since Python 3.2 ("new GIL"). Deprecated features -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:08:16 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:08:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzQw?= =?utf-8?q?=3A_Fix_test=5Fsysconfig_when_Python_is_built_with_an_empty_pre?= =?utf-8?q?fix=2E?= Message-ID: <3d4dMN5rHkz7LjR@mail.python.org> http://hg.python.org/cpython/rev/ef6eb5ce4f8e changeset: 86585:ef6eb5ce4f8e branch: 3.3 parent: 86581:2a62cd8553b5 user: Antoine Pitrou date: Wed Oct 23 19:07:40 2013 +0200 summary: Issue #19340: Fix test_sysconfig when Python is built with an empty prefix. Patch by Sunny K. files: Lib/test/test_sysconfig.py | 6 ++++-- Misc/ACKS | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -354,8 +354,10 @@ self.assertTrue(os.path.exists(Python_h), Python_h) self.assertTrue(sysconfig._is_python_source_dir(srcdir)) elif os.name == 'posix': - self.assertEqual(os.path.dirname(sysconfig.get_makefile_filename()), - srcdir) + makefile_dir = os.path.dirname(sysconfig.get_makefile_filename()) + # Issue #19340: srcdir has been realpath'ed already + makefile_dir = os.path.realpath(makefile_dir) + self.assertEqual(makefile_dir, srcdir) def test_srcdir_independent_of_cwd(self): # srcdir should be independent of the current working directory diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -613,6 +613,7 @@ Andreas Jung Tattoo Mabonzo K. Sarah K. +Sunny K Bohuslav Kabrda Bob Kahn Kurt B. Kaiser -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:08:18 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:08:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319340=3A_Fix_test=5Fsysconfig_when_Python_is_bu?= =?utf-8?q?ilt_with_an_empty_prefix=2E?= Message-ID: <3d4dMQ0xYNz7LjR@mail.python.org> http://hg.python.org/cpython/rev/f797a14cbcfd changeset: 86586:f797a14cbcfd parent: 86584:5e606f093d8f parent: 86585:ef6eb5ce4f8e user: Antoine Pitrou date: Wed Oct 23 19:08:07 2013 +0200 summary: Issue #19340: Fix test_sysconfig when Python is built with an empty prefix. Patch by Sunny K. files: Lib/test/test_sysconfig.py | 6 ++++-- Misc/ACKS | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -352,8 +352,10 @@ self.assertTrue(os.path.exists(Python_h), Python_h) self.assertTrue(sysconfig._is_python_source_dir(srcdir)) elif os.name == 'posix': - self.assertEqual(os.path.dirname(sysconfig.get_makefile_filename()), - srcdir) + makefile_dir = os.path.dirname(sysconfig.get_makefile_filename()) + # Issue #19340: srcdir has been realpath'ed already + makefile_dir = os.path.realpath(makefile_dir) + self.assertEqual(makefile_dir, srcdir) def test_srcdir_independent_of_cwd(self): # srcdir should be independent of the current working directory diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -630,6 +630,7 @@ Andreas Jung Tattoo Mabonzo K. Sarah K. +Sunny K Bohuslav Kabrda Alexey Kachayev Bob Kahn -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:12:44 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:12:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MzUy?= =?utf-8?q?=3A_Fix_unittest_discovery_when_a_module_can_be_reached_through?= Message-ID: <3d4dSX33Cxz7LjX@mail.python.org> http://hg.python.org/cpython/rev/d7ec961cea1c changeset: 86587:d7ec961cea1c branch: 2.7 parent: 86580:e8cead08c556 user: Antoine Pitrou date: Wed Oct 23 19:11:29 2013 +0200 summary: Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). files: Lib/unittest/loader.py | 4 +- Lib/unittest/test/test_discovery.py | 24 ++++++++++++++++- Misc/NEWS | 3 ++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -256,8 +256,8 @@ yield _make_failed_import_test(name, self.suiteClass) else: mod_file = os.path.abspath(getattr(module, '__file__', full_path)) - realpath = os.path.splitext(mod_file)[0] - fullpath_noext = os.path.splitext(full_path)[0] + realpath = os.path.splitext(os.path.realpath(mod_file))[0] + fullpath_noext = os.path.splitext(os.path.realpath(full_path))[0] if realpath.lower() != fullpath_noext.lower(): module_dir = os.path.dirname(realpath) mod_name = os.path.splitext(os.path.basename(full_path))[0] diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py +++ b/Lib/unittest/test/test_discovery.py @@ -314,7 +314,7 @@ self.assertTrue(program.failfast) self.assertTrue(program.catchbreak) - def test_detect_module_clash(self): + def setup_module_clash(self): class Module(object): __file__ = 'bar/foo.py' sys.modules['foo'] = Module @@ -341,7 +341,10 @@ os.listdir = listdir os.path.isfile = isfile os.path.isdir = isdir + return full_path + def test_detect_module_clash(self): + full_path = self.setup_module_clash() loader = unittest.TestLoader() mod_dir = os.path.abspath('bar') @@ -354,6 +357,25 @@ ) self.assertEqual(sys.path[0], full_path) + def test_module_symlink_ok(self): + full_path = self.setup_module_clash() + + original_realpath = os.path.realpath + + mod_dir = os.path.abspath('bar') + expected_dir = os.path.abspath('foo') + + def cleanup(): + os.path.realpath = original_realpath + self.addCleanup(cleanup) + + def realpath(path): + if path == os.path.join(mod_dir, 'foo.py'): + return os.path.join(expected_dir, 'foo.py') + return path + os.path.realpath = realpath + loader = unittest.TestLoader() + loader.discover(start_dir='foo', pattern='foo.py') def test_discovery_from_dotted_path(self): loader = unittest.TestLoader() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -40,6 +40,9 @@ Library ------- +- Issue #19352: Fix unittest discovery when a module can be reached + through several paths (e.g. under Debian/Ubuntu with virtualenv). + - Issue #15207: Fix mimetypes to read from correct part of Windows registry Original patch by Dave Chambers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:16:41 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:16:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzUy?= =?utf-8?q?=3A_Fix_unittest_discovery_when_a_module_can_be_reached_through?= Message-ID: <3d4dY55Zm6z7LjP@mail.python.org> http://hg.python.org/cpython/rev/a830cc1c0565 changeset: 86588:a830cc1c0565 branch: 3.3 parent: 86585:ef6eb5ce4f8e user: Antoine Pitrou date: Wed Oct 23 19:11:29 2013 +0200 summary: Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). files: Lib/unittest/loader.py | 4 +- Lib/unittest/test/test_discovery.py | 24 ++++++++++++++++- Misc/NEWS | 3 ++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -263,8 +263,8 @@ yield _make_failed_import_test(name, self.suiteClass) else: mod_file = os.path.abspath(getattr(module, '__file__', full_path)) - realpath = _jython_aware_splitext(mod_file) - fullpath_noext = _jython_aware_splitext(full_path) + realpath = _jython_aware_splitext(os.path.realpath(mod_file)) + fullpath_noext = _jython_aware_splitext(os.path.realpath(full_path)) if realpath.lower() != fullpath_noext.lower(): module_dir = os.path.dirname(realpath) mod_name = _jython_aware_splitext(os.path.basename(full_path)) diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py +++ b/Lib/unittest/test/test_discovery.py @@ -347,7 +347,7 @@ self.assertTrue(program.failfast) self.assertTrue(program.catchbreak) - def test_detect_module_clash(self): + def setup_module_clash(self): class Module(object): __file__ = 'bar/foo.py' sys.modules['foo'] = Module @@ -374,7 +374,10 @@ os.listdir = listdir os.path.isfile = isfile os.path.isdir = isdir + return full_path + def test_detect_module_clash(self): + full_path = self.setup_module_clash() loader = unittest.TestLoader() mod_dir = os.path.abspath('bar') @@ -387,6 +390,25 @@ ) self.assertEqual(sys.path[0], full_path) + def test_module_symlink_ok(self): + full_path = self.setup_module_clash() + + original_realpath = os.path.realpath + + mod_dir = os.path.abspath('bar') + expected_dir = os.path.abspath('foo') + + def cleanup(): + os.path.realpath = original_realpath + self.addCleanup(cleanup) + + def realpath(path): + if path == os.path.join(mod_dir, 'foo.py'): + return os.path.join(expected_dir, 'foo.py') + return path + os.path.realpath = realpath + loader = unittest.TestLoader() + loader.discover(start_dir='foo', pattern='foo.py') def test_discovery_from_dotted_path(self): loader = unittest.TestLoader() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -81,6 +81,9 @@ Library ------- +- Issue #19352: Fix unittest discovery when a module can be reached + through several paths (e.g. under Debian/Ubuntu with virtualenv). + - Issue #15207: Fix mimetypes to read from correct part of Windows registry Original patch by Dave Chambers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:16:43 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:16:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319352=3A_Fix_unittest_discovery_when_a_module_c?= =?utf-8?q?an_be_reached_through?= Message-ID: <3d4dY70YT9z7Ljv@mail.python.org> http://hg.python.org/cpython/rev/ebbe87204114 changeset: 86589:ebbe87204114 parent: 86586:f797a14cbcfd parent: 86588:a830cc1c0565 user: Antoine Pitrou date: Wed Oct 23 19:15:05 2013 +0200 summary: Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). files: Lib/unittest/loader.py | 4 +- Lib/unittest/test/test_discovery.py | 24 ++++++++++++++++- Misc/NEWS | 3 ++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -276,8 +276,8 @@ yield _make_failed_import_test(name, self.suiteClass) else: mod_file = os.path.abspath(getattr(module, '__file__', full_path)) - realpath = _jython_aware_splitext(mod_file) - fullpath_noext = _jython_aware_splitext(full_path) + realpath = _jython_aware_splitext(os.path.realpath(mod_file)) + fullpath_noext = _jython_aware_splitext(os.path.realpath(full_path)) if realpath.lower() != fullpath_noext.lower(): module_dir = os.path.dirname(realpath) mod_name = _jython_aware_splitext(os.path.basename(full_path)) diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py +++ b/Lib/unittest/test/test_discovery.py @@ -366,7 +366,7 @@ self.assertTrue(program.failfast) self.assertTrue(program.catchbreak) - def test_detect_module_clash(self): + def setup_module_clash(self): class Module(object): __file__ = 'bar/foo.py' sys.modules['foo'] = Module @@ -393,7 +393,10 @@ os.listdir = listdir os.path.isfile = isfile os.path.isdir = isdir + return full_path + def test_detect_module_clash(self): + full_path = self.setup_module_clash() loader = unittest.TestLoader() mod_dir = os.path.abspath('bar') @@ -406,6 +409,25 @@ ) self.assertEqual(sys.path[0], full_path) + def test_module_symlink_ok(self): + full_path = self.setup_module_clash() + + original_realpath = os.path.realpath + + mod_dir = os.path.abspath('bar') + expected_dir = os.path.abspath('foo') + + def cleanup(): + os.path.realpath = original_realpath + self.addCleanup(cleanup) + + def realpath(path): + if path == os.path.join(mod_dir, 'foo.py'): + return os.path.join(expected_dir, 'foo.py') + return path + os.path.realpath = realpath + loader = unittest.TestLoader() + loader.discover(start_dir='foo', pattern='foo.py') def test_discovery_from_dotted_path(self): loader = unittest.TestLoader() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #19352: Fix unittest discovery when a module can be reached + through several paths (e.g. under Debian/Ubuntu with virtualenv). + - Issue #15207: Fix mimetypes to read from correct part of Windows registry Original patch by Dave Chambers -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:22:03 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:22:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzU2?= =?utf-8?q?=3A_Avoid_using_a_C_variabled_named_=22=5Fself=22=2C_it=27s_a_r?= =?utf-8?q?eserved_word_in?= Message-ID: <3d4dgH65Hnz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/763af3d957f3 changeset: 86590:763af3d957f3 branch: 3.3 parent: 86588:a830cc1c0565 user: Antoine Pitrou date: Wed Oct 23 19:20:21 2013 +0200 summary: Issue #19356: Avoid using a C variabled named "_self", it's a reserved word in some C compilers. files: Misc/NEWS | 3 + Modules/_ctypes/_ctypes.c | 82 ++++++++++++------------ Modules/_ctypes/callbacks.c | 12 +- Modules/_elementtree.c | 4 +- Modules/_io/textio.c | 4 +- 5 files changed, 54 insertions(+), 51 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -568,6 +568,9 @@ Build ----- +- Issue #19356: Avoid using a C variabled named "_self", it's a reserved + word in some C compilers. + - Issue #19130: Correct PCbuild/readme.txt, Python 3.3 and 3.4 require VS 2010. - Issue #16067: Add description into MSI file to replace installer's temporary name. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -143,18 +143,18 @@ } DictRemoverObject; static void -_DictRemover_dealloc(PyObject *_self) +_DictRemover_dealloc(PyObject *myself) { - DictRemoverObject *self = (DictRemoverObject *)_self; + DictRemoverObject *self = (DictRemoverObject *)myself; Py_XDECREF(self->key); Py_XDECREF(self->dict); - Py_TYPE(self)->tp_free(_self); + Py_TYPE(self)->tp_free(myself); } static PyObject * -_DictRemover_call(PyObject *_self, PyObject *args, PyObject *kw) +_DictRemover_call(PyObject *myself, PyObject *args, PyObject *kw) { - DictRemoverObject *self = (DictRemoverObject *)_self; + DictRemoverObject *self = (DictRemoverObject *)myself; if (self->key && self->dict) { if (-1 == PyDict_DelItem(self->dict, self->key)) /* XXX Error context */ @@ -2471,17 +2471,17 @@ { NULL }, }; -static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags) +static int PyCData_NewGetBuffer(PyObject *myself, Py_buffer *view, int flags) { - CDataObject *self = (CDataObject *)_self; - StgDictObject *dict = PyObject_stgdict(_self); + CDataObject *self = (CDataObject *)myself; + StgDictObject *dict = PyObject_stgdict(myself); Py_ssize_t i; if (view == NULL) return 0; view->buf = self->b_ptr; - view->obj = _self; - Py_INCREF(_self); + view->obj = myself; + Py_INCREF(myself); view->len = self->b_size; view->readonly = 0; /* use default format character if not set */ @@ -2516,36 +2516,36 @@ } static PyObject * -PyCData_reduce(PyObject *_self, PyObject *args) +PyCData_reduce(PyObject *myself, PyObject *args) { - CDataObject *self = (CDataObject *)_self; - - if (PyObject_stgdict(_self)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) { + CDataObject *self = (CDataObject *)myself; + + if (PyObject_stgdict(myself)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) { PyErr_SetString(PyExc_ValueError, "ctypes objects containing pointers cannot be pickled"); return NULL; } return Py_BuildValue("O(O(NN))", _unpickle, - Py_TYPE(_self), - PyObject_GetAttrString(_self, "__dict__"), + Py_TYPE(myself), + PyObject_GetAttrString(myself, "__dict__"), PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); } static PyObject * -PyCData_setstate(PyObject *_self, PyObject *args) +PyCData_setstate(PyObject *myself, PyObject *args) { void *data; Py_ssize_t len; int res; PyObject *dict, *mydict; - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (!PyArg_ParseTuple(args, "Os#", &dict, &data, &len)) return NULL; if (len > self->b_size) len = self->b_size; memmove(self->b_ptr, data, len); - mydict = PyObject_GetAttrString(_self, "__dict__"); + mydict = PyObject_GetAttrString(myself, "__dict__"); res = PyDict_Update(mydict, dict); Py_DECREF(mydict); if (res == -1) @@ -4183,9 +4183,9 @@ } static PyObject * -Array_item(PyObject *_self, Py_ssize_t index) +Array_item(PyObject *myself, Py_ssize_t index) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t offset, size; StgDictObject *stgdict; @@ -4209,9 +4209,9 @@ } static PyObject * -Array_subscript(PyObject *_self, PyObject *item) +Array_subscript(PyObject *myself, PyObject *item) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); @@ -4220,7 +4220,7 @@ return NULL; if (i < 0) i += self->b_length; - return Array_item(_self, i); + return Array_item(myself, i); } else if PySlice_Check(item) { StgDictObject *stgdict, *itemdict; @@ -4297,7 +4297,7 @@ for (cur = start, i = 0; i < slicelen; cur += step, i++) { - PyObject *v = Array_item(_self, cur); + PyObject *v = Array_item(myself, cur); PyList_SET_ITEM(np, i, v); } return np; @@ -4311,9 +4311,9 @@ } static int -Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) +Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size, offset; StgDictObject *stgdict; char *ptr; @@ -4340,9 +4340,9 @@ } static int -Array_ass_subscript(PyObject *_self, PyObject *item, PyObject *value) +Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (value == NULL) { PyErr_SetString(PyExc_TypeError, @@ -4357,7 +4357,7 @@ return -1; if (i < 0) i += self->b_length; - return Array_ass_item(_self, i, value); + return Array_ass_item(myself, i, value); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; @@ -4382,7 +4382,7 @@ int result; if (item == NULL) return -1; - result = Array_ass_item(_self, cur, item); + result = Array_ass_item(myself, cur, item); Py_DECREF(item); if (result == -1) return -1; @@ -4397,9 +4397,9 @@ } static Py_ssize_t -Array_length(PyObject *_self) +Array_length(PyObject *myself) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; return self->b_length; } @@ -4685,9 +4685,9 @@ PyCPointer_Type */ static PyObject * -Pointer_item(PyObject *_self, Py_ssize_t index) +Pointer_item(PyObject *myself, Py_ssize_t index) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size; Py_ssize_t offset; StgDictObject *stgdict, *itemdict; @@ -4716,9 +4716,9 @@ } static int -Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) +Pointer_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size; Py_ssize_t offset; StgDictObject *stgdict, *itemdict; @@ -4848,14 +4848,14 @@ } static PyObject * -Pointer_subscript(PyObject *_self, PyObject *item) +Pointer_subscript(PyObject *myself, PyObject *item) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; - return Pointer_item(_self, i); + return Pointer_item(myself, i); } else if (PySlice_Check(item)) { PySliceObject *slice = (PySliceObject *)item; @@ -4968,7 +4968,7 @@ return NULL; for (cur = start, i = 0; i < len; cur += step, i++) { - PyObject *v = Pointer_item(_self, cur); + PyObject *v = Pointer_item(myself, cur); PyList_SET_ITEM(np, i, v); } return np; diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -10,9 +10,9 @@ /**************************************************************/ static void -CThunkObject_dealloc(PyObject *_self) +CThunkObject_dealloc(PyObject *myself) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; PyObject_GC_UnTrack(self); Py_XDECREF(self->converters); Py_XDECREF(self->callable); @@ -23,9 +23,9 @@ } static int -CThunkObject_traverse(PyObject *_self, visitproc visit, void *arg) +CThunkObject_traverse(PyObject *myself, visitproc visit, void *arg) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; Py_VISIT(self->converters); Py_VISIT(self->callable); Py_VISIT(self->restype); @@ -33,9 +33,9 @@ } static int -CThunkObject_clear(PyObject *_self) +CThunkObject_clear(PyObject *myself) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; Py_CLEAR(self->converters); Py_CLEAR(self->callable); Py_CLEAR(self->restype); diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -809,9 +809,9 @@ } static PyObject* -element_sizeof(PyObject* _self, PyObject* args) +element_sizeof(PyObject* myself, PyObject* args) { - ElementObject *self = (ElementObject*)_self; + ElementObject *self = (ElementObject*)myself; Py_ssize_t result = sizeof(ElementObject); if (self->extra) { result += sizeof(ElementObjectExtra); diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -282,12 +282,12 @@ #define SEEN_ALL (SEEN_CR | SEEN_LF | SEEN_CRLF) PyObject * -_PyIncrementalNewlineDecoder_decode(PyObject *_self, +_PyIncrementalNewlineDecoder_decode(PyObject *myself, PyObject *input, int final) { PyObject *output; Py_ssize_t output_len; - nldecoder_object *self = (nldecoder_object *) _self; + nldecoder_object *self = (nldecoder_object *) myself; if (self->decoder == NULL) { PyErr_SetString(PyExc_ValueError, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 19:22:05 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 19:22:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319356=3A_Avoid_using_a_C_variabled_named_=22=5F?= =?utf-8?q?self=22=2C_it=27s_a_reserved_word_in?= Message-ID: <3d4dgK2H3Vz7Ln2@mail.python.org> http://hg.python.org/cpython/rev/f6430aec5bf2 changeset: 86591:f6430aec5bf2 parent: 86589:ebbe87204114 parent: 86590:763af3d957f3 user: Antoine Pitrou date: Wed Oct 23 19:21:55 2013 +0200 summary: Issue #19356: Avoid using a C variabled named "_self", it's a reserved word in some C compilers. files: Misc/NEWS | 7 +- Modules/_ctypes/_ctypes.c | 82 ++++++++++++------------ Modules/_ctypes/callbacks.c | 12 +- Modules/_elementtree.c | 4 +- Modules/_io/textio.c | 4 +- 5 files changed, 57 insertions(+), 52 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -52,6 +52,12 @@ - Issue #17087: Improved the repr for regular expression match objects. +Build +----- + +- Issue #19356: Avoid using a C variabled named "_self", it's a reserved + word in some C compilers. + What's New in Python 3.4.0 Alpha 4? =================================== @@ -655,7 +661,6 @@ - Issue #18922: Now The Lib/smtpd.py and Tools/i18n/msgfmt.py scripts write their version strings to stdout, and not to sderr. - What's New in Python 3.4.0 Alpha 1? =================================== diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -143,18 +143,18 @@ } DictRemoverObject; static void -_DictRemover_dealloc(PyObject *_self) +_DictRemover_dealloc(PyObject *myself) { - DictRemoverObject *self = (DictRemoverObject *)_self; + DictRemoverObject *self = (DictRemoverObject *)myself; Py_XDECREF(self->key); Py_XDECREF(self->dict); - Py_TYPE(self)->tp_free(_self); + Py_TYPE(self)->tp_free(myself); } static PyObject * -_DictRemover_call(PyObject *_self, PyObject *args, PyObject *kw) +_DictRemover_call(PyObject *myself, PyObject *args, PyObject *kw) { - DictRemoverObject *self = (DictRemoverObject *)_self; + DictRemoverObject *self = (DictRemoverObject *)myself; if (self->key && self->dict) { if (-1 == PyDict_DelItem(self->dict, self->key)) /* XXX Error context */ @@ -2451,17 +2451,17 @@ { NULL }, }; -static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags) +static int PyCData_NewGetBuffer(PyObject *myself, Py_buffer *view, int flags) { - CDataObject *self = (CDataObject *)_self; - StgDictObject *dict = PyObject_stgdict(_self); + CDataObject *self = (CDataObject *)myself; + StgDictObject *dict = PyObject_stgdict(myself); Py_ssize_t i; if (view == NULL) return 0; view->buf = self->b_ptr; - view->obj = _self; - Py_INCREF(_self); + view->obj = myself; + Py_INCREF(myself); view->len = self->b_size; view->readonly = 0; /* use default format character if not set */ @@ -2496,36 +2496,36 @@ } static PyObject * -PyCData_reduce(PyObject *_self, PyObject *args) +PyCData_reduce(PyObject *myself, PyObject *args) { - CDataObject *self = (CDataObject *)_self; - - if (PyObject_stgdict(_self)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) { + CDataObject *self = (CDataObject *)myself; + + if (PyObject_stgdict(myself)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) { PyErr_SetString(PyExc_ValueError, "ctypes objects containing pointers cannot be pickled"); return NULL; } return Py_BuildValue("O(O(NN))", _unpickle, - Py_TYPE(_self), - PyObject_GetAttrString(_self, "__dict__"), + Py_TYPE(myself), + PyObject_GetAttrString(myself, "__dict__"), PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); } static PyObject * -PyCData_setstate(PyObject *_self, PyObject *args) +PyCData_setstate(PyObject *myself, PyObject *args) { void *data; Py_ssize_t len; int res; PyObject *dict, *mydict; - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (!PyArg_ParseTuple(args, "Os#", &dict, &data, &len)) return NULL; if (len > self->b_size) len = self->b_size; memmove(self->b_ptr, data, len); - mydict = PyObject_GetAttrString(_self, "__dict__"); + mydict = PyObject_GetAttrString(myself, "__dict__"); res = PyDict_Update(mydict, dict); Py_DECREF(mydict); if (res == -1) @@ -4163,9 +4163,9 @@ } static PyObject * -Array_item(PyObject *_self, Py_ssize_t index) +Array_item(PyObject *myself, Py_ssize_t index) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t offset, size; StgDictObject *stgdict; @@ -4189,9 +4189,9 @@ } static PyObject * -Array_subscript(PyObject *_self, PyObject *item) +Array_subscript(PyObject *myself, PyObject *item) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); @@ -4200,7 +4200,7 @@ return NULL; if (i < 0) i += self->b_length; - return Array_item(_self, i); + return Array_item(myself, i); } else if (PySlice_Check(item)) { StgDictObject *stgdict, *itemdict; @@ -4277,7 +4277,7 @@ for (cur = start, i = 0; i < slicelen; cur += step, i++) { - PyObject *v = Array_item(_self, cur); + PyObject *v = Array_item(myself, cur); PyList_SET_ITEM(np, i, v); } return np; @@ -4291,9 +4291,9 @@ } static int -Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) +Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size, offset; StgDictObject *stgdict; char *ptr; @@ -4320,9 +4320,9 @@ } static int -Array_ass_subscript(PyObject *_self, PyObject *item, PyObject *value) +Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (value == NULL) { PyErr_SetString(PyExc_TypeError, @@ -4337,7 +4337,7 @@ return -1; if (i < 0) i += self->b_length; - return Array_ass_item(_self, i, value); + return Array_ass_item(myself, i, value); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; @@ -4362,7 +4362,7 @@ int result; if (item == NULL) return -1; - result = Array_ass_item(_self, cur, item); + result = Array_ass_item(myself, cur, item); Py_DECREF(item); if (result == -1) return -1; @@ -4377,9 +4377,9 @@ } static Py_ssize_t -Array_length(PyObject *_self) +Array_length(PyObject *myself) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; return self->b_length; } @@ -4665,9 +4665,9 @@ PyCPointer_Type */ static PyObject * -Pointer_item(PyObject *_self, Py_ssize_t index) +Pointer_item(PyObject *myself, Py_ssize_t index) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size; Py_ssize_t offset; StgDictObject *stgdict, *itemdict; @@ -4696,9 +4696,9 @@ } static int -Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) +Pointer_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; Py_ssize_t size; Py_ssize_t offset; StgDictObject *stgdict, *itemdict; @@ -4828,14 +4828,14 @@ } static PyObject * -Pointer_subscript(PyObject *_self, PyObject *item) +Pointer_subscript(PyObject *myself, PyObject *item) { - CDataObject *self = (CDataObject *)_self; + CDataObject *self = (CDataObject *)myself; if (PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; - return Pointer_item(_self, i); + return Pointer_item(myself, i); } else if (PySlice_Check(item)) { PySliceObject *slice = (PySliceObject *)item; @@ -4948,7 +4948,7 @@ return NULL; for (cur = start, i = 0; i < len; cur += step, i++) { - PyObject *v = Pointer_item(_self, cur); + PyObject *v = Pointer_item(myself, cur); PyList_SET_ITEM(np, i, v); } return np; diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -10,9 +10,9 @@ /**************************************************************/ static void -CThunkObject_dealloc(PyObject *_self) +CThunkObject_dealloc(PyObject *myself) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; PyObject_GC_UnTrack(self); Py_XDECREF(self->converters); Py_XDECREF(self->callable); @@ -23,9 +23,9 @@ } static int -CThunkObject_traverse(PyObject *_self, visitproc visit, void *arg) +CThunkObject_traverse(PyObject *myself, visitproc visit, void *arg) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; Py_VISIT(self->converters); Py_VISIT(self->callable); Py_VISIT(self->restype); @@ -33,9 +33,9 @@ } static int -CThunkObject_clear(PyObject *_self) +CThunkObject_clear(PyObject *myself) { - CThunkObject *self = (CThunkObject *)_self; + CThunkObject *self = (CThunkObject *)myself; Py_CLEAR(self->converters); Py_CLEAR(self->callable); Py_CLEAR(self->restype); diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -816,9 +816,9 @@ } static PyObject* -element_sizeof(PyObject* _self, PyObject* args) +element_sizeof(PyObject* myself, PyObject* args) { - ElementObject *self = (ElementObject*)_self; + ElementObject *self = (ElementObject*)myself; Py_ssize_t result = sizeof(ElementObject); if (self->extra) { result += sizeof(ElementObjectExtra); diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -293,12 +293,12 @@ #define SEEN_ALL (SEEN_CR | SEEN_LF | SEEN_CRLF) PyObject * -_PyIncrementalNewlineDecoder_decode(PyObject *_self, +_PyIncrementalNewlineDecoder_decode(PyObject *myself, PyObject *input, int final) { PyObject *output; Py_ssize_t output_len; - nldecoder_object *self = (nldecoder_object *) _self; + nldecoder_object *self = (nldecoder_object *) myself; if (self->decoder == NULL) { PyErr_SetString(PyExc_ValueError, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 20:04:48 2013 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Oct 2013 20:04:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_the_traceback_idea?= =?utf-8?q?_comes_from_the_faulthandler_module?= Message-ID: <3d4fcc5Jdjz7LjY@mail.python.org> http://hg.python.org/peps/rev/1b18c703c201 changeset: 5211:1b18c703c201 user: Victor Stinner date: Tue Oct 22 17:04:24 2013 +0200 summary: PEP 454: the traceback idea comes from the faulthandler module files: pep-0454.txt | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -49,7 +49,11 @@ Using the customized allocation API from PEP 445, it becomes easy to set up a hook on Python memory allocators. A hook can inspect Python -internals to retrieve Python tracebacks. +internals to retrieve Python tracebacks. The idea of getting the current +traceback comes from the faulthandler module. The faulthandler dumps +the traceback of all Python threads on a crash, here is the idea is to +get the traceback of the current Python thread when a memory block is +allocated by Python. This PEP proposes to add a new ``tracemalloc`` module, as a debug tool to trace memory blocks allocated by Python. The module provides the -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 20:04:50 2013 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Oct 2013 20:04:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454?= Message-ID: <3d4fcf4tCmz7Ljx@mail.python.org> http://hg.python.org/peps/rev/e9a4e4257618 changeset: 5212:e9a4e4257618 user: Victor Stinner date: Wed Oct 23 20:03:33 2013 +0200 summary: PEP 454 * add GroupedStats.traceback_limit attribute * add a Statistic class * add GroupedStats.statistics() method * Grouped.compare_to() first parameter is now mandatory, the list is now sorted by default, add a new optional sort parameter * "-X tracemalloc=NFRAME" command line option and PYTHONTRACEMALLOC=NFRAME environment variable now specify the number of frames. "-X tracemalloc" is still accepted (NFRAME=1) * rename clear_traces() to reset() * rename Snapshot.top_by(group_by) to Snapshot.group_by(key_type); rename GroupedStats.group_by to GroupedStats.key_type * get_tracemalloc_memory() only returns a int (total size), instead of a (size: int, free: int) tuple * mention id() builtin function * rename get_object_trace() to get_object_traceback(), the function now only returns the traceback (no more the size) * rename add_include_filter() to add_inclusive_filter(), and add_exclude_filter() to add_exclusive_filter() * remove the StatsDiff class * Remove match*() methods from the Filter class * remove metrics More details on filename pattern, traces, etc. files: pep-0454.txt | 387 +++++++++++++++++++------------------- 1 files changed, 194 insertions(+), 193 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -59,9 +59,9 @@ to trace memory blocks allocated by Python. The module provides the following information: -* Computed differences between two snapshots to detect memory leaks * Statistics on allocated memory blocks per filename and per line number: total size, number and average size of allocated memory blocks +* Computed differences between two snapshots to detect memory leaks * Traceback where a memory block was allocated The API of the tracemalloc module is similar to the API of the @@ -91,15 +91,17 @@ Main Functions -------------- -``clear_traces()`` function: +``reset()`` function: - Clear traces and statistics on Python memory allocations, and reset - the ``get_traced_memory()`` counter. + Clear traces and statistics on Python memory allocations. + + See also ``disable()``. ``disable()`` function: - Stop tracing Python memory allocations. + Stop tracing Python memory allocations and clear traces and + statistics. See also ``enable()`` and ``is_enabled()`` functions. @@ -108,8 +110,6 @@ Start tracing Python memory allocations. - At fork, the module is automatically disabled in the child process. - See also ``disable()`` and ``is_enabled()`` functions. @@ -120,6 +120,10 @@ ``(size: int, count: int)`` tuple, *filename* and *line_number* can be ``None``. + *size* is the total size in bytes of all memory blocks allocated on + the line, or *count* is the number of memory blocks allocated on the + line. + Return an empty dictionary if the ``tracemalloc`` module is disabled. @@ -134,12 +138,8 @@ ``get_tracemalloc_memory()`` function: - Get the memory usage in bytes of the ``tracemalloc`` module as a - tuple: ``(size: int, free: int)``. - - * *size*: total size of bytes allocated by the module, - including *free* bytes - * *free*: number of free bytes available to store data + Get the memory usage in bytes of the ``tracemalloc`` module used + internally to trace memory allocations. Return an ``int``. ``is_enabled()`` function: @@ -147,78 +147,102 @@ ``True`` if the ``tracemalloc`` module is tracing Python memory allocations, ``False`` otherwise. - See also ``enable()`` and ``disable()`` functions. + See also ``disable()`` and ``enable()`` functions. Trace Functions --------------- -``get_traceback_limit()`` function: +When Python allocates a memory block, ``tracemalloc`` attachs a "trace" to +it to store information on it: its size in bytes and the traceback where the +allocation occured. - Get the maximum number of frames stored in the traceback of a trace - of a memory block. +The following functions give access to these traces. A trace is a ``(size: int, +traceback)`` tuple. *size* is the size of the memory block in bytes. +*traceback* is a tuple of frames sorted from the most recent to the oldest +frame, limited to ``get_traceback_limit()`` frames. A frame is +a ``(filename: str, lineno: int)`` tuple where *filename* and *lineno* can be +``None``. - Use the ``set_traceback_limit()`` function to change the limit. +Example of trace: ``(32, (('x.py', 7), ('x.py', 11)))``. The memory block has +a size of 32 bytes and was allocated at ``x.py:7``, line called from line +``x.py:11``. ``get_object_address(obj)`` function: - Get the address of the main memory block of the specified Python object. + Get the address of the main memory block of the specified Python + object. A Python object can be composed by multiple memory blocks, the - function only returns the address of the main memory block. + function only returns the address of the main memory block. For + example, items of ``dict`` and ``set`` containers are stored in a + second memory block. - See also ``get_object_trace()`` and ``gc.get_referrers()`` functions. + See also ``get_object_traceback()`` and ``gc.get_referrers()`` + functions. + .. note:: -``get_object_trace(obj)`` function: + The builtin function ``id()`` returns a different address for + objects tracked by the garbage collector, because ``id()`` + returns the address after the garbage collector header. - Get the trace of a Python object *obj* as a ``(size: int, - traceback)`` tuple where *traceback* is a tuple of ``(filename: str, - lineno: int)`` tuples, *filename* and *lineno* can be ``None``. - The function only returns the trace of the main memory block of the - object. The *size* of the trace is smaller than the total size of - the object if the object is composed by more than one memory block. +``get_object_traceback(obj)`` function: + + Get the traceback where the Python object *obj* was allocated. + Return a tuple of ``(filename: str, lineno: int)`` tuples, + *filename* and *lineno* can be ``None``. Return ``None`` if the ``tracemalloc`` module did not trace the allocation of the object. - See also ``get_object_address()``, ``get_trace()``, - ``get_traces()``, ``gc.get_referrers()`` and ``sys.getsizeof()`` - functions. + See also ``get_object_address()``, ``gc.get_referrers()`` and + ``sys.getsizeof()`` functions. ``get_trace(address)`` function: - Get the trace of a memory block as a ``(size: int, traceback)`` - tuple where *traceback* is a tuple of ``(filename: str, lineno: - int)`` tuples, *filename* and *lineno* can be ``None``. + Get the trace of a memory block allocated by Python. Return a tuple: + ``(size: int, traceback)``, *traceback* is a tuple of ``(filename: + str, lineno: int)`` tuples, *filename* and *lineno* can be ``None``. Return ``None`` if the ``tracemalloc`` module did not trace the allocation of the memory block. - See also ``get_object_trace()``, ``get_stats()`` and + See also ``get_object_traceback()``, ``get_stats()`` and ``get_traces()`` functions. +``get_traceback_limit()`` function: + + Get the maximum number of frames stored in the traceback of a trace. + + By default, a trace of an allocated memory block only stores the + most recent frame: the limit is ``1``. This limit is enough to get + statistics using ``get_stats()``. + + Use the ``set_traceback_limit()`` function to change the limit. + + ``get_traces()`` function: - Get traces of Python memory allocations as a dictionary ``{address - (int): trace}`` where *trace* is a ``(size: int, traceback)`` and - *traceback* is a list of ``(filename: str, lineno: int)``. - *traceback* can be empty, *filename* and *lineno* can be None. + Get traces of all memory blocks allocated by Python. Return a + dictionary: ``{address (int): trace}``, *trace* is a ``(size: int, + traceback)`` tuple, *traceback* is a tuple of ``(filename: str, + lineno: int)`` tuples, *filename* and *lineno* can be None. - Return an empty dictionary if the ``tracemalloc`` module is disabled. + Return an empty dictionary if the ``tracemalloc`` module is + disabled. - See also ``get_object_trace()``, ``get_stats()`` and ``get_trace()`` - functions. + See also ``get_object_traceback()``, ``get_stats()`` and + ``get_trace()`` functions. ``set_traceback_limit(nframe: int)`` function: - Set the maximum number of frames stored in the traceback of a trace - of a memory block. + Set the maximum number of frames stored in the traceback of a trace. Storing the traceback of each memory allocation has an important overhead on the memory usage. Use the ``get_tracemalloc_memory()`` @@ -227,6 +251,10 @@ Use the ``get_traceback_limit()`` function to get the current limit. + The ``PYTHONTRACEMALLOC`` environment variable and the ``-X`` + ``tracemalloc=NFRAME`` command line option can be used to set a + limit at startup. + Filter Functions ---------------- @@ -242,40 +270,48 @@ trace. The new filter is not applied on already collected traces. Use the - ``clear_traces()`` function to ensure that all traces match the new - filter. + ``reset()`` function to ensure that all traces match the new filter. -``add_include_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: +``add_inclusive_filter(filename_pattern: str, lineno: int=None, traceback: bool=False)`` function: - Add an inclusive filter: helper for the ``add_filter()`` method + Add an inclusive filter: helper for the ``add_filter()`` function creating a ``Filter`` instance with the ``Filter.include`` attribute set to ``True``. - Example: ``tracemalloc.add_include_filter(tracemalloc.__file__)`` - only includes memory blocks allocated by the ``tracemalloc`` module. + The ``*`` joker character can be used in *filename_pattern* to match + any substring, including empty string. + Example: ``tracemalloc.add_inclusive_filter(subprocess.__file__)`` + only includes memory blocks allocated by the ``subprocess`` module. -``add_exclude_filter(filename: str, lineno: int=None, traceback: bool=False)`` function: - Add an exclusive filter: helper for the ``add_filter()`` method +``add_exclusive_filter(filename_pattern: str, lineno: int=None, traceback: bool=False)`` function: + + Add an exclusive filter: helper for the ``add_filter()`` function creating a ``Filter`` instance with the ``Filter.include`` attribute set to ``False``. - Example: ``tracemalloc.add_exclude_filter(tracemalloc.__file__)`` + The ``*`` joker character can be used in *filename_pattern* to match + any substring, including empty string. + + Example: ``tracemalloc.add_exclusive_filter(tracemalloc.__file__)`` ignores memory blocks allocated by the ``tracemalloc`` module. ``clear_filters()`` function: - Reset the filter list. + Clear the filter list. See also the ``get_filters()`` function. ``get_filters()`` function: - Get the filters on Python memory allocations as list of ``Filter`` - instances. + Get the filters on Python memory allocations. Return a list of + ``Filter`` instances. + + By default, there is one exclusive filter to ignore Python memory + blocks allocated by the ``tracemalloc`` module. See also the ``clear_filters()`` function. @@ -283,54 +319,35 @@ Filter ------ -``Filter(include: bool, pattern: str, lineno: int=None, traceback: bool=False)`` class: +``Filter(include: bool, filename_pattern: str, lineno: int=None, traceback: bool=False)`` class: Filter to select which memory allocations are traced. Filters can be used to reduce the memory usage of the ``tracemalloc`` module, which can be read using the ``get_tracemalloc_memory()`` function. -``match(filename: str, lineno: int)`` method: - - Return ``True`` if the filter matchs the filename and line number, - ``False`` otherwise. - -``match_filename(filename: str)`` method: - - Return ``True`` if the filter matchs the filename, ``False`` otherwise. - -``match_lineno(lineno: int)`` method: - - Return ``True`` if the filter matchs the line number, ``False`` - otherwise. - -``match_traceback(traceback)`` method: - - Return ``True`` if the filter matchs the *traceback*, ``False`` - otherwise. - - *traceback* is a tuple of ``(filename: str, lineno: int)`` tuples. + The ``*`` joker character can be used in *filename_pattern* to match + any substring, including empty string. The ``.pyc`` and ``.pyo`` + file extensions are replaced with ``.py``. On Windows, the + comparison is case insensitive and the alternative separator ``/`` + is replaced with the standard separator ``\``. ``include`` attribute: If *include* is ``True``, only trace memory blocks allocated in a - file with a name matching filename ``pattern`` at line number + file with a name matching ``filename_pattern`` at line number ``lineno``. If *include* is ``False``, ignore memory blocks allocated in a file - with a name matching filename ``pattern`` at line number ``lineno``. + with a name matching ``filename_pattern`` at line number ``lineno``. ``lineno`` attribute: - Line number (``int``). If is is ``None`` or less than ``1``, it - matches any line number. + Line number (``int``) of the filter. If *lineno* is is ``None`` or + less than ``1``, the filter matches any line number. -``pattern`` attribute: +``filename_pattern`` attribute: - The filename *pattern* can contain one or many ``*`` joker - characters which match any substring, including an empty string. The - ``.pyc`` and ``.pyo`` file extensions are replaced with ``.py``. On - Windows, the comparison is case insensitive and the alternative - separator ``/`` is replaced with the standard separator ``\``. + Filename pattern (``str``) of the filter. ``traceback`` attribute: @@ -344,48 +361,68 @@ GroupedStats ------------ -``GroupedStats(timestamp: datetime.datetime, stats: dict, group_by: str, cumulative=False, metrics: dict=None)`` class: +``GroupedStats(timestamp: datetime.datetime, traceback_limit: int, stats: dict, key_type: str, cumulative: bool)`` class: - Top of allocated memory blocks grouped by *group_by* as a + Top of allocated memory blocks grouped by *key_type* as a dictionary. - The ``Snapshot.top_by()`` method creates a ``GroupedStats`` + The ``Snapshot.group_by()`` method creates a ``GroupedStats`` instance. -``compare_to(old_stats: GroupedStats=None)`` method: +``compare_to(old_stats: GroupedStats, sort=True)`` method: - Compare to an older ``GroupedStats`` instance. Return a - ``StatsDiff`` instance. + Compare statistics to an older ``GroupedStats`` instance. Return a + list of ``Statistic`` instances. - The ``StatsDiff.differences`` list is not sorted: call the - ``StatsDiff.sort()`` method to sort the list. + The result is sorted in the biggest to the smallest by + ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by + *key*. Set the *sort* parameter to ``False`` to get the list + unsorted. - ``None`` values are replaced with an empty string for filenames or - zero for line numbers, because ``str`` and ``int`` cannot be - compared to ``None``. + ``None`` values in keys are replaced with an empty string for + filenames or zero for line numbers, because ``str`` and ``int`` + cannot be compared to ``None``. + + See also the ``statistics()`` method. + +``statistics(sort=True)`` method: + + Get statistics as a list of ``Statistic`` instances. + ``Statistic.size_diff`` and ``Statistic.count_diff`` attributes are + set to zero. + + The result is sorted in the biggest to the smallest by + ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by + *key*. Set the *sort* parameter to ``False`` to get the list + unsorted. + + ``None`` values in keys are replaced with an empty string for + filenames or zero for line numbers, because ``str`` and ``int`` + cannot be compared to ``None``. + + See also the ``compare_to()`` method. ``cumulative`` attribute: - If ``True``, cumulate size and count of memory blocks of all frames - of the traceback of a trace, not only the most recent frame. + If ``True``, size and count of memory blocks of all frames of the + traceback of a trace were cumulated, not only the most recent frame. -``metrics`` attribute: - - Dictionary storing metrics read when the snapshot was created: - ``{name (str): metric}`` where *metric* type is ``Metric``. - -``group_by`` attribute: +``key_type`` attribute: Determine how memory allocations were grouped: see - ``Snapshot.top_by()`` for the available values. + ``Snapshot.group_by()()`` for the available values. ``stats`` attribute: - Dictionary ``{key: stats}`` where the *key* type depends on the - ``group_by`` attribute and *stats* is a ``(size: int, count: int)`` - tuple. + Dictionary ``{key: (size: int, count: int)}`` where the type of + *key* depends on the ``key_type`` attribute. - See the ``Snapshot.top_by()`` method. + See the ``Snapshot.group_by()`` method. + +``traceback_limit`` attribute: + + Maximum number of frames stored in the traceback of ``traces``, + result of the ``get_traceback_limit()`` function. ``timestamp`` attribute: @@ -393,41 +430,13 @@ instance. -Metric ------- - -``Metric(name: str, value: int, format: str)`` class: - - Value of a metric when a snapshot is created. - -``name`` attribute: - - Name of the metric. - -``value`` attribute: - - Value of the metric. - -``format`` attribute: - - Format of the metric (``str``). - - Snapshot -------- -``Snapshot(timestamp: datetime.datetime, traces: dict=None, stats: dict=None)`` class: +``Snapshot(timestamp: datetime.datetime, traceback_limit: int, stats: dict=None, traces: dict=None)`` class: - Snapshot of traces and statistics on memory blocks allocated by Python. - -``add_metric(name: str, value: int, format: str)`` method: - - Helper to add a ``Metric`` instance to ``Snapshot.metrics``. Return - the newly created ``Metric`` instance. - - Raise an exception if the name is already present in - ``Snapshot.metrics``. - + Snapshot of statistics and traces of memory blocks allocated by + Python. ``apply_filters(filters)`` method: @@ -437,7 +446,8 @@ ``create(traces=False)`` classmethod: - Take a snapshot of traces and/or statistics of allocated memory blocks. + Take a snapshot of statistics and traces of memory blocks allocated + by Python. If *traces* is ``True``, ``get_traces()`` is called and its result is stored in the ``Snapshot.traces`` attribute. This attribute @@ -449,55 +459,46 @@ ``set_traceback_limit()`` before calling ``Snapshot.create()`` to store more frames. - The ``tracemalloc`` module must be enabled to take a snapshot. See + The ``tracemalloc`` module must be enabled to take a snapshot, see the the ``enable()`` function. -``get_metric(name, default=None)`` method: +``dump(filename)`` method: - Get the value of the metric called *name*. Return *default* if the - metric does not exist. + Write the snapshot into a file. + Use ``load()`` to reload the snapshot. -``load(filename, traces=True)`` classmethod: + +``load(filename)`` classmethod: Load a snapshot from a file. - If *traces* is ``False``, don't load traces. + See also ``dump()``. -``top_by(group_by: str, cumulative: bool=False)`` method: +``group_by(key_type: str, cumulative: bool=False)`` method: - Compute top statistics grouped by *group_by* as a ``GroupedStats`` - instance: + Group statistics by *key_type* as a ``GroupedStats`` instance: - ===================== ======================== ================================ - group_by description key type - ===================== ======================== ================================ - ``'filename'`` filename ``str`` - ``'line'`` filename and line number ``(filename: str, lineno: int)`` - ``'address'`` memory block address ``int`` - ``'traceback'`` traceback ``(address: int, traceback)`` - ===================== ======================== ================================ + ===================== =================================== ================================ + key_type description type + ===================== =================================== ================================ + ``'filename'`` filename ``str`` + ``'line'`` filename and line number ``(filename: str, lineno: int)`` + ``'address'`` memory block address ``int`` + ``'traceback'`` memory block address with traceback ``(address: int, traceback)`` + ===================== =================================== ================================ The ``traceback`` type is a tuple of ``(filename: str, lineno: int)`` tuples, *filename* and *lineno* can be ``None``. If *cumulative* is ``True``, cumulate size and count of memory blocks of all frames of the traceback of a trace, not only the most - recent frame. The *cumulative* parameter is ignored if *group_by* - is ``'address'`` or if the traceback limit is less than ``2``. + recent frame. The *cumulative* parameter is set to ``False`` if + *key_type* is ``'address'``, or if the traceback limit is less than + ``2``. -``write(filename)`` method: - - Write the snapshot into a file. - - -``metrics`` attribute: - - Dictionary storing metrics read when the snapshot was created: - ``{name (str): metric}`` where *metric* type is ``Metric``. - ``stats`` attribute: Statistics on traced Python memory, result of the ``get_stats()`` @@ -505,8 +506,8 @@ ``traceback_limit`` attribute: - Maximum number of frames stored in a trace of a memory block - allocated by Python. + Maximum number of frames stored in the traceback of ``traces``, + result of the ``get_traceback_limit()`` function. ``traces`` attribute: @@ -519,37 +520,37 @@ instance. -StatsDiff +Statistic --------- -``StatsDiff(differences, old_stats, new_stats)`` class: +``Statistic(key, size, size_diff, count, count_diff)`` class: - Differences between two ``GroupedStats`` instances. + Statistic on memory allocations. - The ``GroupedStats.compare_to()`` method creates a ``StatsDiff`` - instance. + ``GroupedStats.compare_to()`` and ``GroupedStats.statistics()`` + return a list of ``Statistic`` instances. -``sort()`` method: +``key`` attribute: - Sort the ``differences`` list from the biggest difference to the - smallest difference. Sort by ``abs(size_diff)``, *size*, - ``abs(count_diff)``, *count* and then by *key*. + Key identifying the statistic. The key type depends on + ``GroupedStats.key_type``, see the ``Snapshot.group_by()`` method. -``differences`` attribute: - Differences between ``old_stats`` and ``new_stats`` as a list of - ``(size_diff, size, count_diff, count, key)`` tuples. *size_diff*, - *size*, *count_diff* and *count* are ``int``. The key type depends - on the ``GroupedStats.group_by`` attribute of ``new_stats``: see the - ``Snapshot.top_by()`` method. +``count`` attribute: -``old_stats`` attribute: + Number of memory blocks (``int``). - Old ``GroupedStats`` instance, can be ``None``. +``count_diff`` attribute: -``new_stats`` attribute: + Difference of number of memory blocks (``int``). - New ``GroupedStats`` instance. +``size`` attribute: + + Total size of memory blocks in bytes (``int``). + +``size_diff`` attribute: + + Difference of total size of memory blocks in bytes (``int``). Prior Work -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 20:13:00 2013 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Oct 2013 20:13:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_copy_missing_part_?= =?utf-8?q?of_the_doc?= Message-ID: <3d4fp40PnZz7LjY@mail.python.org> http://hg.python.org/peps/rev/f851d4a1622a changeset: 5213:f851d4a1622a user: Victor Stinner date: Wed Oct 23 20:12:42 2013 +0200 summary: PEP 454: copy missing part of the doc files: pep-0454.txt | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/pep-0454.txt b/pep-0454.txt --- a/pep-0454.txt +++ b/pep-0454.txt @@ -88,6 +88,23 @@ API === +To trace most memory blocks allocated by Python, the module should be +enabled as early as possible by setting the ``PYTHONTRACEMALLOC`` +environment variable to ``1``, or by using ``-X tracemalloc`` command +line option. The ``tracemalloc.enable()`` function can be called at +runtime to start tracing Python memory allocations. + +By default, a trace of an allocated memory block only stores the most +recent frame (1 frame). To store 25 frames at startup: set the +``PYTHONTRACEMALLOC`` environment variable to ``25``, or use the ``-X +tracemalloc=25`` command line option. The ``set_traceback_limit()`` +function can be used at runtime to set the limit. + +By default, Python memory blocks allocated in the ``tracemalloc`` module +are ignored using a filter. Use ``clear_filters()`` to trace also these +memory allocations. + + Main Functions -------------- -- Repository URL: http://hg.python.org/peps From cf.natali at gmail.com Wed Oct 23 20:25:47 2013 From: cf.natali at gmail.com (=?ISO-8859-1?Q?Charles=2DFran=E7ois_Natali?=) Date: Wed, 23 Oct 2013 20:25:47 +0200 Subject: [Python-checkins] [Python-Dev] cpython: Switch subprocess stdin to a socketpair, attempting to fix issue #19293 (AIX In-Reply-To: <20131023115849.3e0b446c@pitrou.net> References: <3d3gQD1pkkz7LmM@mail.python.org> <20131023115849.3e0b446c@pitrou.net> Message-ID: > For the record, pipe I/O seems a little faster than socket I/O under > Linux: > > $ ./python -m timeit -s "import os, socket; a,b = socket.socketpair(); r=a.fileno(); w=b.fileno(); x=b'x'*1000" "os.write(w, x); os.read(r, 1000)" > 1000000 loops, best of 3: 1.1 usec per loop > > $ ./python -m timeit -s "import os, socket; a,b = socket.socketpair(); x=b'x'*1000" > "a.sendall(x); b.recv(1000)" > 1000000 loops, best of 3: 1.02 usec per loop > > $ ./python -m timeit -s "import os; r, w = os.pipe(); x=b'x'*1000" "os.write(w, x); os.read(r, 1000)" > 1000000 loops, best of 3: 0.82 usec per loop That's a raw write()/read() benchmark, but it's not taking something important into account: pipes/socket are usually used to communicate between concurrently running processes. And in this case, an important factor is the pipe/socket buffer size: the smaller it is, the more context switches (due to blocking writes/reads) you'll get, which greatly decreases throughput. And by default, Unix sockets have large buffers than pipes (between 4K and 64K for pipes depending on the OS): I wrote a quick benchmark forking a child process, with the parent writing data through the pipe, and waiting for the child to read it all. here are the results (on Linux): # time python /tmp/test.py pipe real 0m2.479s user 0m1.344s sys 0m1.860s # time python /tmp/test.py socketpair real 0m1.454s user 0m1.242s sys 0m1.234s So socketpair is actually faster. But as noted by Victor, there a slight differences between pipes and sockets I can think of: - pipes guarantee write atomicity if less than PIPE_BUF is written, which is not the case for sockets - more annoying: in subprocess, the pipes are not set non-blocking: after a select()/poll() returns a FD write-ready, we write less than PIPE_BUF at a time to avoid blocking: this likely wouldn't work with a socketpair But this patch doesn't touch subprocess itself, and the FDs is only used by asyncio, which sets them non-blocking: so this could only be an issue for the spawned process, if it does rely on the two pipe-specific behaviors above. OTOH, having a unique implementation on all platforms makes sense, and I don't know if it'll actually be a problem in practice, we we could ship as-is and wait until someone complains ;-) cf From python-checkins at python.org Wed Oct 23 21:10:20 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 21:10:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Remove_openat_support?= Message-ID: <3d4h4D6pKnz7LjR@mail.python.org> http://hg.python.org/peps/rev/00754d360e58 changeset: 5214:00754d360e58 user: Antoine Pitrou date: Wed Oct 23 19:49:13 2013 +0200 summary: Remove openat support files: pep-0428.txt | 19 ------------------- 1 files changed, 0 insertions(+), 19 deletions(-) diff --git a/pep-0428.txt b/pep-0428.txt --- a/pep-0428.txt +++ b/pep-0428.txt @@ -658,25 +658,6 @@ provided, for example some of the functionality of the shutil module. -Experimental openat() support ------------------------------ - -On compatible POSIX systems, the concrete PosixPath class can take advantage -of \*at() functions (`openat()`_ and friends), and manages the bookkeeping of -open file descriptors as necessary. Support is enabled by passing the -*use_openat* argument to the constructor:: - - >>> p = Path(".", use_openat=True) - -Then all paths constructed by navigating this path (either by iteration or -indexing) will also use the openat() family of functions. The point of using -these functions is to avoid race conditions whereby a given directory is -silently replaced with another (often a symbolic link to a sensitive system -location) between two accesses. - -.. _`openat()`: http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - - Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 23 21:28:16 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Oct 2013 21:28:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319365=3A_Optimize?= =?utf-8?q?d_the_parsing_of_long_replacement_string_in_re=2Esub*=28=29?= Message-ID: <3d4hSw64GQz7LjR@mail.python.org> http://hg.python.org/cpython/rev/b322047fec55 changeset: 86592:b322047fec55 user: Serhiy Storchaka date: Wed Oct 23 22:27:52 2013 +0300 summary: Issue #19365: Optimized the parsing of long replacement string in re.sub*() functions. files: Lib/sre_parse.py | 74 ++++++++++++++--------------------- Misc/NEWS | 3 + 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -769,35 +769,33 @@ # group references s = Tokenizer(source) sget = s.get - p = [] - a = p.append - def literal(literal, p=p, pappend=a): - if p and p[-1][0] is LITERAL: - p[-1] = LITERAL, p[-1][1] + literal - else: - pappend((LITERAL, literal)) - sep = source[:0] - if isinstance(sep, str): - makechar = chr - else: - makechar = chr - while 1: + groups = [] + literals = [] + literal = [] + lappend = literal.append + def addgroup(index): + if literal: + literals.append(''.join(literal)) + del literal[:] + groups.append((len(literals), index)) + literals.append(None) + while True: this = sget() if this is None: break # end of replacement string - if this and this[0] == "\\": + if this[0] == "\\": # group - c = this[1:2] + c = this[1] if c == "g": name = "" if s.match("<"): - while 1: + while True: char = sget() if char is None: raise error("unterminated group name") if char == ">": break - name = name + char + name += char if not name: raise error("missing group name") try: @@ -811,50 +809,38 @@ index = pattern.groupindex[name] except KeyError: raise IndexError("unknown group name") - a((MARK, index)) + addgroup(index) elif c == "0": if s.next in OCTDIGITS: - this = this + sget() + this += sget() if s.next in OCTDIGITS: - this = this + sget() - literal(makechar(int(this[1:], 8) & 0xff)) + this += sget() + lappend(chr(int(this[1:], 8) & 0xff)) elif c in DIGITS: isoctal = False if s.next in DIGITS: - this = this + sget() + this += sget() if (c in OCTDIGITS and this[2] in OCTDIGITS and s.next in OCTDIGITS): - this = this + sget() + this += sget() isoctal = True - literal(makechar(int(this[1:], 8) & 0xff)) + lappend(chr(int(this[1:], 8) & 0xff)) if not isoctal: - a((MARK, int(this[1:]))) + addgroup(int(this[1:])) else: try: - this = makechar(ESCAPES[this][1]) + this = chr(ESCAPES[this][1]) except KeyError: pass - literal(this) + lappend(this) else: - literal(this) - # convert template to groups and literals lists - i = 0 - groups = [] - groupsappend = groups.append - literals = [None] * len(p) - if isinstance(source, str): - encode = lambda x: x - else: + lappend(this) + if literal: + literals.append(''.join(literal)) + if not isinstance(source, str): # The tokenizer implicitly decodes bytes objects as latin-1, we must # therefore re-encode the final representation. - encode = lambda x: x.encode('latin-1') - for c, s in p: - if c is MARK: - groupsappend((i, s)) - # literal[i] is already None - else: - literals[i] = encode(s) - i = i + 1 + literals = [None if s is None else s.encode('latin-1') for s in literals] return groups, literals def expand_template(template, match): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #19365: Optimized the parsing of long replacement string in re.sub*() + functions. + - Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 22:04:01 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 22:04:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzYw?= =?utf-8?q?=3A_fix_test=5Fsite_when_Python_is_installed_into_=24HOME/=2Elo?= =?utf-8?q?cal?= Message-ID: <3d4jG96hnxz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/7f465e154b6d changeset: 86593:7f465e154b6d branch: 3.3 parent: 86590:763af3d957f3 user: Antoine Pitrou date: Wed Oct 23 22:03:22 2013 +0200 summary: Issue #19360: fix test_site when Python is installed into $HOME/.local files: Lib/test/test_site.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -179,14 +179,20 @@ rc = subprocess.call([sys.executable, '-s', '-c', 'import sys; sys.exit(%r in sys.path)' % usersite], env=env) - self.assertEqual(rc, 0) + if usersite == site.getsitepackages()[0]: + self.assertEqual(rc, 1) + else: + self.assertEqual(rc, 0) env = os.environ.copy() env["PYTHONNOUSERSITE"] = "1" rc = subprocess.call([sys.executable, '-c', 'import sys; sys.exit(%r in sys.path)' % usersite], env=env) - self.assertEqual(rc, 0) + if usersite == site.getsitepackages()[0]: + self.assertEqual(rc, 1) + else: + self.assertEqual(rc, 0) env = os.environ.copy() env["PYTHONUSERBASE"] = "/tmp" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 23 22:04:03 2013 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 23 Oct 2013 22:04:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319360=3A_fix_test=5Fsite_when_Python_is_install?= =?utf-8?q?ed_into_=24HOME/=2Elocal?= Message-ID: <3d4jGC39Xrz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/61463ff7dc68 changeset: 86594:61463ff7dc68 parent: 86592:b322047fec55 parent: 86593:7f465e154b6d user: Antoine Pitrou date: Wed Oct 23 22:03:45 2013 +0200 summary: Issue #19360: fix test_site when Python is installed into $HOME/.local files: Lib/test/test_site.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -179,14 +179,20 @@ rc = subprocess.call([sys.executable, '-s', '-c', 'import sys; sys.exit(%r in sys.path)' % usersite], env=env) - self.assertEqual(rc, 0) + if usersite == site.getsitepackages()[0]: + self.assertEqual(rc, 1) + else: + self.assertEqual(rc, 0) env = os.environ.copy() env["PYTHONNOUSERSITE"] = "1" rc = subprocess.call([sys.executable, '-c', 'import sys; sys.exit(%r in sys.path)' % usersite], env=env) - self.assertEqual(rc, 0) + if usersite == site.getsitepackages()[0]: + self.assertEqual(rc, 1) + else: + self.assertEqual(rc, 0) env = os.environ.copy() env["PYTHONUSERBASE"] = "/tmp" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 06:55:44 2013 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 24 Oct 2013 06:55:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Increase_macur?= =?utf-8?q?l2path_test_coverage?= Message-ID: <3d4x3h1YCqz7Lmf@mail.python.org> http://hg.python.org/cpython/rev/5fda64d39540 changeset: 86595:5fda64d39540 branch: 2.7 parent: 86587:d7ec961cea1c user: Senthil Kumaran date: Wed Oct 23 21:45:58 2013 -0700 summary: Increase macurl2path test coverage files: Lib/macurl2path.py | 20 --------------- Lib/test/test_macurl2path.py | 31 ++++++++++++++++++++++++ Lib/test/test_sundry.py | 1 - Misc/NEWS | 3 ++ 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/Lib/macurl2path.py b/Lib/macurl2path.py --- a/Lib/macurl2path.py +++ b/Lib/macurl2path.py @@ -75,23 +75,3 @@ def _pncomp2url(component): component = urllib.quote(component[:31], safe='') # We want to quote slashes return component - -def test(): - for url in ["index.html", - "bar/index.html", - "/foo/bar/index.html", - "/foo/bar/", - "/"]: - print '%r -> %r' % (url, url2pathname(url)) - for path in ["drive:", - "drive:dir:", - "drive:dir:file", - "drive:file", - "file", - ":file", - ":dir:", - ":dir:file"]: - print '%r -> %r' % (path, pathname2url(path)) - -if __name__ == '__main__': - test() diff --git a/Lib/test/test_macurl2path.py b/Lib/test/test_macurl2path.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_macurl2path.py @@ -0,0 +1,31 @@ +import macurl2path +import unittest + +class MacUrl2PathTestCase(unittest.TestCase): + def test_url2pathname(self): + self.assertEqual(":index.html", macurl2path.url2pathname("index.html")) + self.assertEqual(":bar:index.html", macurl2path.url2pathname("bar/index.html")) + self.assertEqual("foo:bar:index.html", macurl2path.url2pathname("/foo/bar/index.html")) + self.assertEqual("foo:bar", macurl2path.url2pathname("/foo/bar/")) + self.assertEqual("", macurl2path.url2pathname("/")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "http://foo.com") + self.assertEqual("index.html", macurl2path.url2pathname("///index.html")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "//index.html") + self.assertEqual(":index.html", macurl2path.url2pathname("./index.html")) + self.assertEqual(":index.html", macurl2path.url2pathname("foo/../index.html")) + self.assertEqual("::index.html", macurl2path.url2pathname("../index.html")) + + def test_pathname2url(self): + self.assertEqual("drive", macurl2path.pathname2url("drive:")) + self.assertEqual("drive/dir", macurl2path.pathname2url("drive:dir:")) + self.assertEqual("drive/dir/file", macurl2path.pathname2url("drive:dir:file")) + self.assertEqual("drive/file", macurl2path.pathname2url("drive:file")) + self.assertEqual("file", macurl2path.pathname2url("file")) + self.assertEqual("file", macurl2path.pathname2url(":file")) + self.assertEqual("dir", macurl2path.pathname2url(":dir:")) + self.assertEqual("dir/file", macurl2path.pathname2url(":dir:file")) + self.assertRaises(RuntimeError, macurl2path.pathname2url, "/") + self.assertEqual("dir/../file", macurl2path.pathname2url("dir::file")) + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -53,7 +53,6 @@ import imputil import keyword import linecache - import macurl2path import mailcap import mimify import nntplib diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -40,6 +40,9 @@ Library ------- +- Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin + Williams. + - Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 06:55:45 2013 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 24 Oct 2013 06:55:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Increase_the_c?= =?utf-8?q?overage_of_macurl2path=2E_Patch_by_Colin_Williams=2E?= Message-ID: <3d4x3j4SRWz7Llb@mail.python.org> http://hg.python.org/cpython/rev/06b9a9e75a6c changeset: 86596:06b9a9e75a6c branch: 3.3 parent: 86593:7f465e154b6d user: Senthil Kumaran date: Wed Oct 23 21:50:56 2013 -0700 summary: Increase the coverage of macurl2path. Patch by Colin Williams. files: Lib/macurl2path.py | 20 --------------- Lib/test/test_macurl2path.py | 31 ++++++++++++++++++++++++ Lib/test/test_sundry.py | 1 - Misc/NEWS | 3 ++ 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/Lib/macurl2path.py b/Lib/macurl2path.py --- a/Lib/macurl2path.py +++ b/Lib/macurl2path.py @@ -75,23 +75,3 @@ def _pncomp2url(component): # We want to quote slashes return urllib.parse.quote(component[:31], safe='') - -def test(): - for url in ["index.html", - "bar/index.html", - "/foo/bar/index.html", - "/foo/bar/", - "/"]: - print('%r -> %r' % (url, url2pathname(url))) - for path in ["drive:", - "drive:dir:", - "drive:dir:file", - "drive:file", - "file", - ":file", - ":dir:", - ":dir:file"]: - print('%r -> %r' % (path, pathname2url(path))) - -if __name__ == '__main__': - test() diff --git a/Lib/test/test_macurl2path.py b/Lib/test/test_macurl2path.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_macurl2path.py @@ -0,0 +1,31 @@ +import macurl2path +import unittest + +class MacUrl2PathTestCase(unittest.TestCase): + def test_url2pathname(self): + self.assertEqual(":index.html", macurl2path.url2pathname("index.html")) + self.assertEqual(":bar:index.html", macurl2path.url2pathname("bar/index.html")) + self.assertEqual("foo:bar:index.html", macurl2path.url2pathname("/foo/bar/index.html")) + self.assertEqual("foo:bar", macurl2path.url2pathname("/foo/bar/")) + self.assertEqual("", macurl2path.url2pathname("/")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "http://foo.com") + self.assertEqual("index.html", macurl2path.url2pathname("///index.html")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "//index.html") + self.assertEqual(":index.html", macurl2path.url2pathname("./index.html")) + self.assertEqual(":index.html", macurl2path.url2pathname("foo/../index.html")) + self.assertEqual("::index.html", macurl2path.url2pathname("../index.html")) + + def test_pathname2url(self): + self.assertEqual("drive", macurl2path.pathname2url("drive:")) + self.assertEqual("drive/dir", macurl2path.pathname2url("drive:dir:")) + self.assertEqual("drive/dir/file", macurl2path.pathname2url("drive:dir:file")) + self.assertEqual("drive/file", macurl2path.pathname2url("drive:file")) + self.assertEqual("file", macurl2path.pathname2url("file")) + self.assertEqual("file", macurl2path.pathname2url(":file")) + self.assertEqual("dir", macurl2path.pathname2url(":dir:")) + self.assertEqual("dir/file", macurl2path.pathname2url(":dir:file")) + self.assertRaises(RuntimeError, macurl2path.pathname2url, "/") + self.assertEqual("dir/../file", macurl2path.pathname2url("dir::file")) + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -45,7 +45,6 @@ import html.entities import imghdr import keyword - import macurl2path import mailcap import nturl2path import os2emxpath diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -81,6 +81,9 @@ Library ------- +- Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin + Williams. + - Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 06:55:47 2013 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 24 Oct 2013 06:55:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_merge_from_3=2E3=3A_Increase_the_test_coverage_of_macurl?= =?utf-8?q?2path_module=2E_Patch_by?= Message-ID: <3d4x3l0Ghyz7Lk7@mail.python.org> http://hg.python.org/cpython/rev/060d9b2e4d5e changeset: 86597:060d9b2e4d5e parent: 86594:61463ff7dc68 parent: 86596:06b9a9e75a6c user: Senthil Kumaran date: Wed Oct 23 21:55:35 2013 -0700 summary: merge from 3.3: Increase the test coverage of macurl2path module. Patch by Colin Williams. files: Lib/macurl2path.py | 20 --------------- Lib/test/test_macurl2path.py | 31 ++++++++++++++++++++++++ Lib/test/test_sundry.py | 3 +- Misc/NEWS | 3 ++ 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/Lib/macurl2path.py b/Lib/macurl2path.py --- a/Lib/macurl2path.py +++ b/Lib/macurl2path.py @@ -75,23 +75,3 @@ def _pncomp2url(component): # We want to quote slashes return urllib.parse.quote(component[:31], safe='') - -def test(): - for url in ["index.html", - "bar/index.html", - "/foo/bar/index.html", - "/foo/bar/", - "/"]: - print('%r -> %r' % (url, url2pathname(url))) - for path in ["drive:", - "drive:dir:", - "drive:dir:file", - "drive:file", - "file", - ":file", - ":dir:", - ":dir:file"]: - print('%r -> %r' % (path, pathname2url(path))) - -if __name__ == '__main__': - test() diff --git a/Lib/test/test_macurl2path.py b/Lib/test/test_macurl2path.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_macurl2path.py @@ -0,0 +1,31 @@ +import macurl2path +import unittest + +class MacUrl2PathTestCase(unittest.TestCase): + def test_url2pathname(self): + self.assertEqual(":index.html", macurl2path.url2pathname("index.html")) + self.assertEqual(":bar:index.html", macurl2path.url2pathname("bar/index.html")) + self.assertEqual("foo:bar:index.html", macurl2path.url2pathname("/foo/bar/index.html")) + self.assertEqual("foo:bar", macurl2path.url2pathname("/foo/bar/")) + self.assertEqual("", macurl2path.url2pathname("/")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "http://foo.com") + self.assertEqual("index.html", macurl2path.url2pathname("///index.html")) + self.assertRaises(RuntimeError, macurl2path.url2pathname, "//index.html") + self.assertEqual(":index.html", macurl2path.url2pathname("./index.html")) + self.assertEqual(":index.html", macurl2path.url2pathname("foo/../index.html")) + self.assertEqual("::index.html", macurl2path.url2pathname("../index.html")) + + def test_pathname2url(self): + self.assertEqual("drive", macurl2path.pathname2url("drive:")) + self.assertEqual("drive/dir", macurl2path.pathname2url("drive:dir:")) + self.assertEqual("drive/dir/file", macurl2path.pathname2url("drive:dir:file")) + self.assertEqual("drive/file", macurl2path.pathname2url("drive:file")) + self.assertEqual("file", macurl2path.pathname2url("file")) + self.assertEqual("file", macurl2path.pathname2url(":file")) + self.assertEqual("dir", macurl2path.pathname2url(":dir:")) + self.assertEqual("dir/file", macurl2path.pathname2url(":dir:file")) + self.assertRaises(RuntimeError, macurl2path.pathname2url, "/") + self.assertEqual("dir/../file", macurl2path.pathname2url("dir::file")) + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -7,7 +7,7 @@ class TestUntestedModules(unittest.TestCase): def test_untested_modules_can_be_imported(self): untested = ('bdb', 'encodings', 'formatter', 'imghdr', - 'macurl2path', 'nturl2path', 'tabnanny') + 'nturl2path', 'tabnanny') with support.check_warnings(quiet=True): for name in untested: try: @@ -47,6 +47,7 @@ import distutils.command.upload import html.entities + try: import tty # Not available on Windows except ImportError: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin + Williams. + - Issue #19365: Optimized the parsing of long replacement string in re.sub*() functions. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 24 07:41:01 2013 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 24 Oct 2013 07:41:01 +0200 Subject: [Python-checkins] Daily reference leaks (61463ff7dc68): sum=4 Message-ID: results for 61463ff7dc68 on branch "default" -------------------------------------------- test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogDsvKA4', '-x'] From python-checkins at python.org Thu Oct 24 17:38:24 2013 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 24 Oct 2013 17:38:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Clarify_that_SSL_could_mean_T?= =?utf-8?q?LS=2E_Allow_duck_typing_SSLContext=2E_Allow_missing?= Message-ID: <3d5CKD0j61z7Ljf@mail.python.org> http://hg.python.org/peps/rev/f10b2ffcff9d changeset: 5215:f10b2ffcff9d user: Guido van Rossum date: Thu Oct 24 08:37:55 2013 -0700 summary: Clarify that SSL could mean TLS. Allow duck typing SSLContext. Allow missing run/stop/close functionality. files: pep-3156.txt | 60 +++++++++++++++++++++------------------ 1 files changed, 32 insertions(+), 28 deletions(-) diff --git a/pep-3156.txt b/pep-3156.txt --- a/pep-3156.txt +++ b/pep-3156.txt @@ -176,7 +176,7 @@ It represents a pair of buffered streams (one in each direction) that each transmit a sequence of bytes. The most common example of a bidirectional stream transport is probably a TCP connection. Another -common example is an SSL connection. But there are some other things +common example is an SSL/TLS connection. But there are some other things that can be viewed this way, for example an SSH session or a pair of UNIX pipes. Typically there aren't many different transport implementations, and most of them come with the event loop @@ -302,7 +302,7 @@ ``IocpProactor`` is created and used. (The ``IocpProactor`` class is not specified by this PEP. Its inclusion in the standard library is not currently under consideration; it is just an implementation - detail of the ``ProactorEventLoop`` class. + detail of the ``ProactorEventLoop`` class.) Event Loop Methods Overview --------------------------- @@ -310,9 +310,11 @@ The methods of a conforming event loop are grouped into several categories. A brief overview of the categories. The first set of categories must be supported by all conforming event loop -implementations. (However, in some cases a partially-conforming +implementations. (However, in some cases a partially-conforming implementation may choose not to implement the internet/socket -methods, and still conform to the other methods.) +methods, and still conform to the other methods. Also, it is possible +that a partially-conforming implementation has no way to create, +close, start, or stop a loop.) - Miscellaneous: ``close()``, ``time()``. @@ -564,21 +566,22 @@ The are all specified using optional keyword arguments: - - ``ssl``: Pass ``True`` to create an SSL transport (by default a - plain TCP transport is created). Or pass an ``ssl.SSLContext`` - object to override the default SSL context object to be used. If - a default context is created it is up to the implementation to - configure reasonable defaults. The reference implementation - currently uses ``PROTOCOL_SSLv23`` and sets the ``OP_NO_SSLv2`` - option, calls ``set_default_verify_paths()`` and sets verify_mode - to ``CERT_REQUIRED``. In addition, whenever the context (default - or otherwise) specifies a verify_mode of ``CERT_REQUIRED``, if a - hostname is given, immediately after a successful handshake - ``ss.ssl.match_hostname(peercert, hostname)`` is called, and if - this raises an exception the conection is closed. (To avoid this - behavior, pass in an context that doesn't have verify_mode set to - ``CERT_REQUIRED``. But this means you are not secure, and - vulnerable to for example man-in-the-middle attacks.) + - ``ssl``: Pass ``True`` to create an SSL/TLS transport (by default + a plain TCP transport is created). Or pass an ``ssl.SSLContext`` + object (or something else that implements the same interface) to + override the default SSL context object to be used. If a default + context is created it is up to the implementation to configure + reasonable defaults. The reference implementation currently uses + ``PROTOCOL_SSLv23`` and sets the ``OP_NO_SSLv2`` option, calls + ``set_default_verify_paths()`` and sets verify_mode to + ``CERT_REQUIRED``. In addition, whenever the context (default or + otherwise) specifies a verify_mode of ``CERT_REQUIRED`` or + ``CERT_OPTIONAL``, if a hostname is given, immediately after a + successful handshake ``ssl.match_hostname(peercert, hostname)`` is + called, and if this raises an exception the conection is closed. + (To avoid this behavior, pass in an SSL context that ha + verify_mode set to ``CERT_NONE``. But this means you are not + secure, and vulnerable to for example man-in-the-middle attacks.) - ``family``, ``proto``, ``flags``: Address family, protocol and flags to be passed through to ``getaddrinfo()``. These all @@ -620,10 +623,11 @@ The are all specified using optional keyword arguments: - - ``ssl``: Pass an ``ssl.SSLContext`` object to override the default - SSL context object to be used. (Unlike ``create_connection()``, - passing ``True`` does not make sense -- the ``SSLContext`` object - is required to specify the certificate and key.) + - ``ssl``: Pass an ``ssl.SSLContext`` object (or an object with the + same interface) to override the default SSL context object to be + used. (Unlike ``create_connection()``, passing ``True`` does not + make sense -- the ``SSLContext`` object is required to specify the + certificate and key.) - ``backlog``: Backlog value to be passed to the ``listen()`` call. Defaults to ``100``. @@ -1013,8 +1017,8 @@ typically written without knowing or caring about the exact type of transport used, and transports can be used with a wide variety of protocols. For example, an HTTP client protocol implementation may be -used with either a plain socket transport or an SSL transport. The -plain socket transport can be used with many different protocols +used with either a plain socket transport or an SSL/TLS transport. +The plain socket transport can be used with many different protocols besides HTTP (e.g. SMTP, IMAP, POP, FTP, IRC, SPDY). The most common type of transport is a bidirectional stream transport. @@ -1037,7 +1041,7 @@ ''''''''''''''''''''''''''''''' A bidrectional stream transport is an abstraction on top of a socket -or something similar (for example, a pair of UNIX pipes or an SSL +or something similar (for example, a pair of UNIX pipes or an SSL/TLS connection). Most connections have an asymmetric nature: the client and server @@ -1092,7 +1096,7 @@ because some protocols need to change their behavior when ``write_eof()`` is unavailable. For example, in HTTP, to send data whose size is not known ahead of time, the end of the data is - typically indicated using ``write_eof()``; however, SSL does not + typically indicated using ``write_eof()``; however, SSL/TLS does not support this, and an HTTP protocol implementation would have to use the "chunked" transfer encoding in this case. But if the data size is known ahead of time, the best approach in both cases is to use @@ -1519,7 +1523,7 @@ users can write their own (it's not rocket science). - We may need APIs to control various timeouts. E.g. we may want to - limit the time spent in DNS resolution, connecting, ssl handshake, + limit the time spent in DNS resolution, connecting, ssl/tls handshake, idle connection, close/shutdown, even per session. Possibly it's sufficient to add ``timeout`` keyword arguments to some methods, and other timeouts can probably be implemented by clever use of -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 24 18:47:31 2013 From: python-checkins at python.org (peter.moody) Date: Thu, 24 Oct 2013 18:47:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_=2317400=3A_correct_handli?= =?utf-8?q?ng_of_100=2E64=2E0=2E0/10=2C_fixing_the_docs_and_updating_NEWS?= Message-ID: <3d5Drz4QMLz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/b9623fa5a0dd changeset: 86598:b9623fa5a0dd user: Peter Moody date: Thu Oct 24 09:47:10 2013 -0700 summary: #17400: correct handling of 100.64.0.0/10, fixing the docs and updating NEWS files: Doc/library/ipaddress.rst | 6 +++++ Lib/ipaddress.py | 27 ++++++++++++++----------- Lib/test/test_ipaddress.py | 4 ++- Misc/NEWS | 3 ++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -158,6 +158,12 @@ ``True`` if the address is reserved for multicast use. See :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6). + .. attribute:: is_private + + ``True`` if the address is allocated for private networks. See + iana-ipv4-special-registry (for IPv4) or iana-ipv6-special-registry + (for IPv6). + .. attribute:: is_global ``True`` if the address is allocated for public networks. See diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1244,7 +1244,6 @@ """ return (self in IPv4Network('0.0.0.0/8') or self in IPv4Network('10.0.0.0/8') or - self in IPv4Network('100.64.0.0/10') or self in IPv4Network('127.0.0.0/8') or self in IPv4Network('169.254.0.0/16') or self in IPv4Network('172.16.0.0/12') or @@ -1258,17 +1257,6 @@ self in IPv4Network('240.0.0.0/4') or self in IPv4Network('255.255.255.255/32')) - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry. - - """ - return self in IPv4Network('100.64.0.0/10') or not self.is_private - @property def is_multicast(self): @@ -1501,6 +1489,21 @@ if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + @property + @functools.lru_cache() + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + class _BaseV6: diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1319,8 +1319,10 @@ self.assertEqual(True, ipaddress.ip_network( '127.42.0.0/16').is_loopback) self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) - self.assertEqual(True, ipaddress.ip_network('100.64.0.0/10').is_private) + self.assertEqual(False, + ipaddress.ip_network('100.64.0.0/10').is_private) self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global) + self.assertEqual(True, ipaddress.ip_network('192.0.2.128/25').is_private) self.assertEqual(True, diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #17400: New 'is_global' attribute for ipaddress to tell if an address + is allocated by IANA for global or private networks. + - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin Williams. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 21:05:08 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 24 Oct 2013 21:05:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MzI3?= =?utf-8?q?=3A_Fixed_the_working_of_regular_expressions_with_too_big_chars?= =?utf-8?b?ZXQu?= Message-ID: <3d5Hvm5TWKz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/d2bb0da45c93 changeset: 86599:d2bb0da45c93 branch: 2.7 parent: 86595:5fda64d39540 user: Serhiy Storchaka date: Thu Oct 24 22:02:42 2013 +0300 summary: Issue #19327: Fixed the working of regular expressions with too big charset. files: Lib/sre_compile.py | 2 +- Lib/test/test_re.py | 2 ++ Misc/NEWS | 2 ++ 3 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -343,7 +343,7 @@ else: code = 'I' # Convert block indices to byte array of 256 bytes - mapping = array.array('b', mapping).tostring() + mapping = array.array('B', mapping).tostring() # Convert byte array to word array mapping = array.array(code, mapping) assert mapping.itemsize == _sre.CODESIZE diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -427,6 +427,8 @@ u"\u2222").group(1), u"\u2222") self.assertEqual(re.match(u"([\u2222\u2223])", u"\u2222", re.UNICODE).group(1), u"\u2222") + r = u'[%s]' % u''.join(map(unichr, range(256, 2**16, 255))) + self.assertEqual(re.match(r, u"\uff01", re.UNICODE).group(), u"\uff01") def test_big_codesize(self): # Issue #1160 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -40,6 +40,8 @@ Library ------- +- Issue #19327: Fixed the working of regular expressions with too big charset. + - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin Williams. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 21:05:10 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 24 Oct 2013 21:05:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzI3?= =?utf-8?q?=3A_Fixed_the_working_of_regular_expressions_with_too_big_chars?= =?utf-8?b?ZXQu?= Message-ID: <3d5Hvp5Zbyz7Lk8@mail.python.org> http://hg.python.org/cpython/rev/4431fa917f22 changeset: 86600:4431fa917f22 branch: 3.3 parent: 86596:06b9a9e75a6c user: Serhiy Storchaka date: Thu Oct 24 22:02:58 2013 +0300 summary: Issue #19327: Fixed the working of regular expressions with too big charset. files: Lib/sre_compile.py | 2 +- Lib/test/test_re.py | 3 +++ Misc/NEWS | 2 ++ Modules/_sre.c | 4 ++-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -345,7 +345,7 @@ else: code = 'I' # Convert block indices to byte array of 256 bytes - mapping = array.array('b', mapping).tobytes() + mapping = array.array('B', mapping).tobytes() # Convert byte array to word array mapping = array.array(code, mapping) assert mapping.itemsize == _sre.CODESIZE diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -428,6 +428,9 @@ "\u2222").group(1), "\u2222") self.assertEqual(re.match("([\u2222\u2223])", "\u2222", re.UNICODE).group(1), "\u2222") + r = '[%s]' % ''.join(map(chr, range(256, 2**16, 255))) + self.assertEqual(re.match(r, + "\uff01", re.UNICODE).group(), "\uff01") def test_big_codesize(self): # Issue #1160 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -81,6 +81,8 @@ Library ------- +- Issue #19327: Fixed the working of regular expressions with too big charset. + - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin Williams. diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -451,7 +451,7 @@ count = *(set++); if (sizeof(SRE_CODE) == 2) { - block = ((char*)set)[ch >> 8]; + block = ((unsigned char*)set)[ch >> 8]; set += 128; if (set[block*16 + ((ch & 255)>>4)] & (1 << (ch & 15))) return ok; @@ -461,7 +461,7 @@ /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids * warnings when c's type supports only numbers < N+1 */ if (!(ch & ~65535)) - block = ((char*)set)[ch >> 8]; + block = ((unsigned char*)set)[ch >> 8]; else block = -1; set += 64; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 21:05:12 2013 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 24 Oct 2013 21:05:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319327=3A_Fixed_the_working_of_regular_expressio?= =?utf-8?q?ns_with_too_big_charset=2E?= Message-ID: <3d5Hvr0T8Qz7Lks@mail.python.org> http://hg.python.org/cpython/rev/10081a0ca4bd changeset: 86601:10081a0ca4bd parent: 86598:b9623fa5a0dd parent: 86600:4431fa917f22 user: Serhiy Storchaka date: Thu Oct 24 22:04:37 2013 +0300 summary: Issue #19327: Fixed the working of regular expressions with too big charset. files: Lib/sre_compile.py | 2 +- Lib/test/test_re.py | 3 +++ Misc/NEWS | 2 ++ Modules/_sre.c | 4 ++-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -339,7 +339,7 @@ else: code = 'I' # Convert block indices to byte array of 256 bytes - mapping = array.array('b', mapping).tobytes() + mapping = array.array('B', mapping).tobytes() # Convert byte array to word array mapping = array.array(code, mapping) assert mapping.itemsize == _sre.CODESIZE diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -482,6 +482,9 @@ "\u2222").group(1), "\u2222") self.assertEqual(re.match("([\u2222\u2223])", "\u2222", re.UNICODE).group(1), "\u2222") + r = '[%s]' % ''.join(map(chr, range(256, 2**16, 255))) + self.assertEqual(re.match(r, + "\uff01", re.UNICODE).group(), "\uff01") def test_big_codesize(self): # Issue #1160 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,8 @@ Library ------- +- Issue #19327: Fixed the working of regular expressions with too big charset. + - Issue #17400: New 'is_global' attribute for ipaddress to tell if an address is allocated by IANA for global or private networks. diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -447,7 +447,7 @@ count = *(set++); if (sizeof(SRE_CODE) == 2) { - block = ((char*)set)[ch >> 8]; + block = ((unsigned char*)set)[ch >> 8]; set += 128; if (set[block*16 + ((ch & 255)>>4)] & (1 << (ch & 15))) return ok; @@ -457,7 +457,7 @@ /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids * warnings when c's type supports only numbers < N+1 */ if (!(ch & ~65535)) - block = ((char*)set)[ch >> 8]; + block = ((unsigned char*)set)[ch >> 8]; else block = -1; set += 64; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 24 21:59:23 2013 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 24 Oct 2013 21:59:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?benchmarks=3A_Close_=2319236=3A_add_a?= =?utf-8?q?_Tornado-based_HTTP_benchmark?= Message-ID: <3d5K6M4HzSz7Lps@mail.python.org> http://hg.python.org/benchmarks/rev/9a1136898539 changeset: 216:9a1136898539 user: Antoine Pitrou date: Thu Oct 24 21:59:09 2013 +0200 summary: Close #19236: add a Tornado-based HTTP benchmark files: lib/tornado-3.1.1/MANIFEST.in | 15 + lib/tornado-3.1.1/PKG-INFO | 135 + lib/tornado-3.1.1/README.rst | 116 + lib/tornado-3.1.1/demos/appengine/README | 48 + lib/tornado-3.1.1/demos/appengine/app.yaml | 12 + lib/tornado-3.1.1/demos/appengine/blog.py | 162 + lib/tornado-3.1.1/demos/appengine/static/blog.css | 153 + lib/tornado-3.1.1/demos/appengine/templates/archive.html | 31 + lib/tornado-3.1.1/demos/appengine/templates/base.html | 29 + lib/tornado-3.1.1/demos/appengine/templates/compose.html | 40 + lib/tornado-3.1.1/demos/appengine/templates/entry.html | 5 + lib/tornado-3.1.1/demos/appengine/templates/feed.xml | 26 + lib/tornado-3.1.1/demos/appengine/templates/home.html | 8 + lib/tornado-3.1.1/demos/appengine/templates/modules/entry.html | 8 + lib/tornado-3.1.1/demos/auth/authdemo.py | 90 + lib/tornado-3.1.1/demos/benchmark/benchmark.py | 82 + lib/tornado-3.1.1/demos/benchmark/chunk_benchmark.py | 47 + lib/tornado-3.1.1/demos/benchmark/stack_context_benchmark.py | 75 + lib/tornado-3.1.1/demos/benchmark/template_benchmark.py | 67 + lib/tornado-3.1.1/demos/blog/README | 62 + lib/tornado-3.1.1/demos/blog/blog.py | 196 + lib/tornado-3.1.1/demos/blog/schema.sql | 44 + lib/tornado-3.1.1/demos/blog/static/blog.css | 153 + lib/tornado-3.1.1/demos/blog/templates/archive.html | 31 + lib/tornado-3.1.1/demos/blog/templates/base.html | 27 + lib/tornado-3.1.1/demos/blog/templates/compose.html | 41 + lib/tornado-3.1.1/demos/blog/templates/entry.html | 5 + lib/tornado-3.1.1/demos/blog/templates/feed.xml | 26 + lib/tornado-3.1.1/demos/blog/templates/home.html | 8 + lib/tornado-3.1.1/demos/blog/templates/modules/entry.html | 8 + lib/tornado-3.1.1/demos/chat/chatdemo.py | 159 + lib/tornado-3.1.1/demos/chat/static/chat.css | 56 + lib/tornado-3.1.1/demos/chat/static/chat.js | 135 + lib/tornado-3.1.1/demos/chat/templates/index.html | 37 + lib/tornado-3.1.1/demos/chat/templates/message.html | 1 + lib/tornado-3.1.1/demos/facebook/README | 8 + lib/tornado-3.1.1/demos/facebook/facebook.py | 122 + lib/tornado-3.1.1/demos/facebook/static/facebook.css | 97 + lib/tornado-3.1.1/demos/facebook/static/facebook.js | 0 lib/tornado-3.1.1/demos/facebook/templates/modules/post.html | 17 + lib/tornado-3.1.1/demos/facebook/templates/stream.html | 22 + lib/tornado-3.1.1/demos/helloworld/helloworld.py | 43 + lib/tornado-3.1.1/demos/s3server/s3server.py | 256 + lib/tornado-3.1.1/demos/twitter/home.html | 12 + lib/tornado-3.1.1/demos/twitter/twitterdemo.py | 92 + lib/tornado-3.1.1/demos/websocket/chatdemo.py | 106 + lib/tornado-3.1.1/demos/websocket/static/chat.css | 56 + lib/tornado-3.1.1/demos/websocket/static/chat.js | 68 + lib/tornado-3.1.1/demos/websocket/templates/index.html | 33 + lib/tornado-3.1.1/demos/websocket/templates/message.html | 1 + lib/tornado-3.1.1/runtests.sh | 18 + lib/tornado-3.1.1/setup.cfg | 5 + lib/tornado-3.1.1/setup.py | 73 + lib/tornado-3.1.1/tornado.egg-info/PKG-INFO | 135 + lib/tornado-3.1.1/tornado.egg-info/SOURCES.txt | 131 + lib/tornado-3.1.1/tornado.egg-info/dependency_links.txt | 1 + lib/tornado-3.1.1/tornado.egg-info/top_level.txt | 1 + lib/tornado-3.1.1/tornado/__init__.py | 29 + lib/tornado-3.1.1/tornado/auth.py | 1378 +++ lib/tornado-3.1.1/tornado/autoreload.py | 316 + lib/tornado-3.1.1/tornado/ca-certificates.crt | 3576 ++++++++++ lib/tornado-3.1.1/tornado/concurrent.py | 265 + lib/tornado-3.1.1/tornado/curl_httpclient.py | 478 + lib/tornado-3.1.1/tornado/escape.py | 380 + lib/tornado-3.1.1/tornado/gen.py | 561 + lib/tornado-3.1.1/tornado/httpclient.py | 497 + lib/tornado-3.1.1/tornado/httpserver.py | 529 + lib/tornado-3.1.1/tornado/httputil.py | 445 + lib/tornado-3.1.1/tornado/ioloop.py | 824 ++ lib/tornado-3.1.1/tornado/iostream.py | 1020 ++ lib/tornado-3.1.1/tornado/locale.py | 513 + lib/tornado-3.1.1/tornado/log.py | 205 + lib/tornado-3.1.1/tornado/netutil.py | 459 + lib/tornado-3.1.1/tornado/options.py | 539 + lib/tornado-3.1.1/tornado/platform/__init__.py | 0 lib/tornado-3.1.1/tornado/platform/auto.py | 45 + lib/tornado-3.1.1/tornado/platform/caresresolver.py | 75 + lib/tornado-3.1.1/tornado/platform/common.py | 91 + lib/tornado-3.1.1/tornado/platform/epoll.py | 26 + lib/tornado-3.1.1/tornado/platform/interface.py | 63 + lib/tornado-3.1.1/tornado/platform/kqueue.py | 92 + lib/tornado-3.1.1/tornado/platform/posix.py | 70 + lib/tornado-3.1.1/tornado/platform/select.py | 76 + lib/tornado-3.1.1/tornado/platform/twisted.py | 543 + lib/tornado-3.1.1/tornado/platform/windows.py | 20 + lib/tornado-3.1.1/tornado/process.py | 292 + lib/tornado-3.1.1/tornado/simple_httpclient.py | 497 + lib/tornado-3.1.1/tornado/stack_context.py | 376 + lib/tornado-3.1.1/tornado/tcpserver.py | 244 + lib/tornado-3.1.1/tornado/template.py | 861 ++ lib/tornado-3.1.1/tornado/test/README | 4 + lib/tornado-3.1.1/tornado/test/__init__.py | 0 lib/tornado-3.1.1/tornado/test/auth_test.py | 424 + lib/tornado-3.1.1/tornado/test/concurrent_test.py | 330 + lib/tornado-3.1.1/tornado/test/csv_translations/fr_FR.csv | 1 + lib/tornado-3.1.1/tornado/test/curl_httpclient_test.py | 99 + lib/tornado-3.1.1/tornado/test/escape_test.py | 217 + lib/tornado-3.1.1/tornado/test/gen_test.py | 913 ++ lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo | Bin lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po | 22 + lib/tornado-3.1.1/tornado/test/httpclient_test.py | 471 + lib/tornado-3.1.1/tornado/test/httpserver_test.py | 661 + lib/tornado-3.1.1/tornado/test/httputil_test.py | 255 + lib/tornado-3.1.1/tornado/test/import_test.py | 45 + lib/tornado-3.1.1/tornado/test/ioloop_test.py | 333 + lib/tornado-3.1.1/tornado/test/iostream_test.py | 545 + lib/tornado-3.1.1/tornado/test/locale_test.py | 59 + lib/tornado-3.1.1/tornado/test/log_test.py | 159 + lib/tornado-3.1.1/tornado/test/netutil_test.py | 84 + lib/tornado-3.1.1/tornado/test/options_test.cfg | 2 + lib/tornado-3.1.1/tornado/test/options_test.py | 220 + lib/tornado-3.1.1/tornado/test/process_test.py | 204 + lib/tornado-3.1.1/tornado/test/runtests.py | 123 + lib/tornado-3.1.1/tornado/test/simple_httpclient_test.py | 398 + lib/tornado-3.1.1/tornado/test/stack_context_test.py | 281 + lib/tornado-3.1.1/tornado/test/static/dir/index.html | 1 + lib/tornado-3.1.1/tornado/test/static/robots.txt | 2 + lib/tornado-3.1.1/tornado/test/template_test.py | 391 + lib/tornado-3.1.1/tornado/test/templates/utf8.html | 1 + lib/tornado-3.1.1/tornado/test/test.crt | 15 + lib/tornado-3.1.1/tornado/test/test.key | 16 + lib/tornado-3.1.1/tornado/test/testing_test.py | 159 + lib/tornado-3.1.1/tornado/test/twisted_test.py | 615 + lib/tornado-3.1.1/tornado/test/util.py | 19 + lib/tornado-3.1.1/tornado/test/util_test.py | 164 + lib/tornado-3.1.1/tornado/test/web_test.py | 1570 ++++ lib/tornado-3.1.1/tornado/test/websocket_test.py | 87 + lib/tornado-3.1.1/tornado/test/wsgi_test.py | 87 + lib/tornado-3.1.1/tornado/testing.py | 615 + lib/tornado-3.1.1/tornado/util.py | 270 + lib/tornado-3.1.1/tornado/web.py | 2579 +++++++ lib/tornado-3.1.1/tornado/websocket.py | 862 ++ lib/tornado-3.1.1/tornado/wsgi.py | 320 + perf.py | 14 + performance/bm_tornado_http.py | 91 + 135 files changed, 32548 insertions(+), 0 deletions(-) diff --git a/lib/tornado-3.1.1/MANIFEST.in b/lib/tornado-3.1.1/MANIFEST.in new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/MANIFEST.in @@ -0,0 +1,15 @@ +recursive-include demos *.py *.yaml *.html *.css *.js *.xml *.sql README +include tornado/ca-certificates.crt +include tornado/test/README +include tornado/test/csv_translations/fr_FR.csv +include tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo +include tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po +include tornado/test/options_test.cfg +include tornado/test/static/robots.txt +include tornado/test/static/dir/index.html +include tornado/test/templates/utf8.html +include tornado/test/test.crt +include tornado/test/test.key +include README.rst +include runtests.sh +global-exclude _auto2to3* \ No newline at end of file diff --git a/lib/tornado-3.1.1/PKG-INFO b/lib/tornado-3.1.1/PKG-INFO new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/PKG-INFO @@ -0,0 +1,135 @@ +Metadata-Version: 1.1 +Name: tornado +Version: 3.1.1 +Summary: Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +Home-page: http://www.tornadoweb.org/ +Author: Facebook +Author-email: python-tornado at googlegroups.com +License: http://www.apache.org/licenses/LICENSE-2.0 +Description: Tornado Web Server + ================== + + `Tornado `_ is a Python web framework and + asynchronous networking library, originally developed at `FriendFeed + `_. By using non-blocking network I/O, Tornado + can scale to tens of thousands of open connections, making it ideal for + `long polling `_, + `WebSockets `_, and other + applications that require a long-lived connection to each user. + + + Quick links + ----------- + + * `Documentation `_ + * `Source (github) `_ + * `Mailing list `_ + * `Wiki `_ + + Hello, world + ------------ + + Here is a simple "Hello, world" example web app for Tornado:: + + import tornado.ioloop + import tornado.web + + class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + + application = tornado.web.Application([ + (r"/", MainHandler), + ]) + + if __name__ == "__main__": + application.listen(8888) + tornado.ioloop.IOLoop.instance().start() + + This example does not use any of Tornado's asynchronous features; for + that see this `simple chat room + `_. + + Installation + ------------ + + **Automatic installation**:: + + pip install tornado + + Tornado is listed in `PyPI `_ and + can be installed with ``pip`` or ``easy_install``. Note that the + source distribution includes demo applications that are not present + when Tornado is installed in this way, so you may wish to download a + copy of the source tarball as well. + + **Manual installation**: Download the latest source from `PyPI + `_. + + .. parsed-literal:: + + tar xvzf tornado-$VERSION.tar.gz + cd tornado-$VERSION + python setup.py build + sudo python setup.py install + + The Tornado source code is `hosted on GitHub + `_. + + **Prerequisites**: Tornado runs on Python 2.6, 2.7, 3.2, and 3.3. It has + no strict dependencies outside the Python standard library, although some + features may require one of the following libraries: + + * `unittest2 `_ is needed to run + Tornado's test suite on Python 2.6 (it is unnecessary on more recent + versions of Python) + * `concurrent.futures `_ is the + recommended thread pool for use with Tornado and enables the use of + ``tornado.netutil.ThreadedResolver``. It is needed only on Python 2; + Python 3 includes this package in the standard library. + * `pycurl `_ is used by the optional + ``tornado.curl_httpclient``. Libcurl version 7.18.2 or higher is required; + version 7.21.1 or higher is recommended. + * `Twisted `_ may be used with the classes in + `tornado.platform.twisted`. + * `pycares `_ is an alternative + non-blocking DNS resolver that can be used when threads are not + appropriate. + * `Monotime `_ adds support for + a monotonic clock, which improves reliability in environments + where clock adjustments are frequent. No longer needed in Python 3.3. + + **Platforms**: Tornado should run on any Unix-like platform, although + for the best performance and scalability only Linux (with ``epoll``) + and BSD (with ``kqueue``) are recommended (even though Mac OS X is + derived from BSD and supports kqueue, its networking performance is + generally poor so it is recommended only for development use). + + Discussion and support + ---------------------- + + You can discuss Tornado on `the Tornado developer mailing list + `_, and report bugs on + the `GitHub issue tracker + `_. Links to additional + resources can be found on the `Tornado wiki + `_. + + Tornado is one of `Facebook's open source technologies + `_. It is available under + the `Apache License, Version 2.0 + `_. + + This web site and all documentation is licensed under `Creative + Commons 3.0 `_. + +Platform: UNKNOWN +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy diff --git a/lib/tornado-3.1.1/README.rst b/lib/tornado-3.1.1/README.rst new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/README.rst @@ -0,0 +1,116 @@ +Tornado Web Server +================== + +`Tornado `_ is a Python web framework and +asynchronous networking library, originally developed at `FriendFeed +`_. By using non-blocking network I/O, Tornado +can scale to tens of thousands of open connections, making it ideal for +`long polling `_, +`WebSockets `_, and other +applications that require a long-lived connection to each user. + + +Quick links +----------- + +* `Documentation `_ +* `Source (github) `_ +* `Mailing list `_ +* `Wiki `_ + +Hello, world +------------ + +Here is a simple "Hello, world" example web app for Tornado:: + + import tornado.ioloop + import tornado.web + + class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + + application = tornado.web.Application([ + (r"/", MainHandler), + ]) + + if __name__ == "__main__": + application.listen(8888) + tornado.ioloop.IOLoop.instance().start() + +This example does not use any of Tornado's asynchronous features; for +that see this `simple chat room +`_. + +Installation +------------ + +**Automatic installation**:: + + pip install tornado + +Tornado is listed in `PyPI `_ and +can be installed with ``pip`` or ``easy_install``. Note that the +source distribution includes demo applications that are not present +when Tornado is installed in this way, so you may wish to download a +copy of the source tarball as well. + +**Manual installation**: Download the latest source from `PyPI +`_. + +.. parsed-literal:: + + tar xvzf tornado-$VERSION.tar.gz + cd tornado-$VERSION + python setup.py build + sudo python setup.py install + +The Tornado source code is `hosted on GitHub +`_. + +**Prerequisites**: Tornado runs on Python 2.6, 2.7, 3.2, and 3.3. It has +no strict dependencies outside the Python standard library, although some +features may require one of the following libraries: + +* `unittest2 `_ is needed to run + Tornado's test suite on Python 2.6 (it is unnecessary on more recent + versions of Python) +* `concurrent.futures `_ is the + recommended thread pool for use with Tornado and enables the use of + ``tornado.netutil.ThreadedResolver``. It is needed only on Python 2; + Python 3 includes this package in the standard library. +* `pycurl `_ is used by the optional + ``tornado.curl_httpclient``. Libcurl version 7.18.2 or higher is required; + version 7.21.1 or higher is recommended. +* `Twisted `_ may be used with the classes in + `tornado.platform.twisted`. +* `pycares `_ is an alternative + non-blocking DNS resolver that can be used when threads are not + appropriate. +* `Monotime `_ adds support for + a monotonic clock, which improves reliability in environments + where clock adjustments are frequent. No longer needed in Python 3.3. + +**Platforms**: Tornado should run on any Unix-like platform, although +for the best performance and scalability only Linux (with ``epoll``) +and BSD (with ``kqueue``) are recommended (even though Mac OS X is +derived from BSD and supports kqueue, its networking performance is +generally poor so it is recommended only for development use). + +Discussion and support +---------------------- + +You can discuss Tornado on `the Tornado developer mailing list +`_, and report bugs on +the `GitHub issue tracker +`_. Links to additional +resources can be found on the `Tornado wiki +`_. + +Tornado is one of `Facebook's open source technologies +`_. It is available under +the `Apache License, Version 2.0 +`_. + +This web site and all documentation is licensed under `Creative +Commons 3.0 `_. diff --git a/lib/tornado-3.1.1/demos/appengine/README b/lib/tornado-3.1.1/demos/appengine/README new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/README @@ -0,0 +1,48 @@ +Running the Tornado AppEngine example +===================================== +This example is designed to run in Google AppEngine, so there are a couple +of steps to get it running. You can download the Google AppEngine Python +development environment at http://code.google.com/appengine/downloads.html. + +1. Link or copy the tornado code directory into this directory: + + ln -s ../../tornado tornado + + AppEngine doesn't use the Python modules installed on this machine. + You need to have the 'tornado' module copied or linked for AppEngine + to find it. + +3. Install and run dev_appserver + + If you don't already have the App Engine SDK, download it from + http://code.google.com/appengine/downloads.html + + To start the tornado demo, run the dev server on this directory: + + dev_appserver.py . + +4. Visit http://localhost:8080/ in your browser + + If you sign in as an administrator, you will be able to create and + edit blog posts. If you sign in as anybody else, you will only see + the existing blog posts. + + +If you want to deploy the blog in production: + +1. Register a new appengine application and put its id in app.yaml + + First register a new application at http://appengine.google.com/. + Then edit app.yaml in this directory and change the "application" + setting from "tornado-appenginge" to your new application id. + +2. Deploy to App Engine + + If you registered an application id, you can now upload your new + Tornado blog by running this command: + + appcfg update . + + After that, visit application_id.appspot.com, where application_id + is the application you registered. + diff --git a/lib/tornado-3.1.1/demos/appengine/app.yaml b/lib/tornado-3.1.1/demos/appengine/app.yaml new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/app.yaml @@ -0,0 +1,12 @@ +application: tornado-appengine +version: 2 +runtime: python27 +api_version: 1 +threadsafe: yes + +handlers: +- url: /static/ + static_dir: static + +- url: /.* + script: blog.application diff --git a/lib/tornado-3.1.1/demos/appengine/blog.py b/lib/tornado-3.1.1/demos/appengine/blog.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/blog.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import functools +import os.path +import re +import tornado.escape +import tornado.web +import tornado.wsgi +import unicodedata + +from google.appengine.api import users +from google.appengine.ext import db + + +class Entry(db.Model): + """A single blog entry.""" + author = db.UserProperty() + title = db.StringProperty(required=True) + slug = db.StringProperty(required=True) + body_source = db.TextProperty(required=True) + html = db.TextProperty(required=True) + published = db.DateTimeProperty(auto_now_add=True) + updated = db.DateTimeProperty(auto_now=True) + + +def administrator(method): + """Decorate with this method to restrict to site admins.""" + @functools.wraps(method) + def wrapper(self, *args, **kwargs): + if not self.current_user: + if self.request.method == "GET": + self.redirect(self.get_login_url()) + return + raise tornado.web.HTTPError(403) + elif not self.current_user.administrator: + if self.request.method == "GET": + self.redirect("/") + return + raise tornado.web.HTTPError(403) + else: + return method(self, *args, **kwargs) + return wrapper + + +class BaseHandler(tornado.web.RequestHandler): + """Implements Google Accounts authentication methods.""" + def get_current_user(self): + user = users.get_current_user() + if user: user.administrator = users.is_current_user_admin() + return user + + def get_login_url(self): + return users.create_login_url(self.request.uri) + + def get_template_namespace(self): + # Let the templates access the users module to generate login URLs + ns = super(BaseHandler, self).get_template_namespace() + ns['users'] = users + return ns + + +class HomeHandler(BaseHandler): + def get(self): + entries = db.Query(Entry).order('-published').fetch(limit=5) + if not entries: + if not self.current_user or self.current_user.administrator: + self.redirect("/compose") + return + self.render("home.html", entries=entries) + + +class EntryHandler(BaseHandler): + def get(self, slug): + entry = db.Query(Entry).filter("slug =", slug).get() + if not entry: raise tornado.web.HTTPError(404) + self.render("entry.html", entry=entry) + + +class ArchiveHandler(BaseHandler): + def get(self): + entries = db.Query(Entry).order('-published') + self.render("archive.html", entries=entries) + + +class FeedHandler(BaseHandler): + def get(self): + entries = db.Query(Entry).order('-published').fetch(limit=10) + self.set_header("Content-Type", "application/atom+xml") + self.render("feed.xml", entries=entries) + + +class ComposeHandler(BaseHandler): + @administrator + def get(self): + key = self.get_argument("key", None) + entry = Entry.get(key) if key else None + self.render("compose.html", entry=entry) + + @administrator + def post(self): + key = self.get_argument("key", None) + if key: + entry = Entry.get(key) + entry.title = self.get_argument("title") + entry.body_source = self.get_argument("body_source") + entry.html = tornado.escape.linkify( + self.get_argument("body_source")) + else: + title = self.get_argument("title") + slug = unicodedata.normalize("NFKD", title).encode( + "ascii", "ignore") + slug = re.sub(r"[^\w]+", " ", slug) + slug = "-".join(slug.lower().strip().split()) + if not slug: slug = "entry" + while True: + existing = db.Query(Entry).filter("slug =", slug).get() + if not existing or str(existing.key()) == key: + break + slug += "-2" + entry = Entry( + author=self.current_user, + title=title, + slug=slug, + body_source=self.get_argument("body_source"), + html=tornado.escape.linkify(self.get_argument("body_source")), + ) + entry.put() + self.redirect("/entry/" + entry.slug) + + +class EntryModule(tornado.web.UIModule): + def render(self, entry): + return self.render_string("modules/entry.html", entry=entry) + + +settings = { + "blog_title": u"Tornado Blog", + "template_path": os.path.join(os.path.dirname(__file__), "templates"), + "ui_modules": {"Entry": EntryModule}, + "xsrf_cookies": True, +} +application = tornado.wsgi.WSGIApplication([ + (r"/", HomeHandler), + (r"/archive", ArchiveHandler), + (r"/feed", FeedHandler), + (r"/entry/([^/]+)", EntryHandler), + (r"/compose", ComposeHandler), +], **settings) diff --git a/lib/tornado-3.1.1/demos/appengine/static/blog.css b/lib/tornado-3.1.1/demos/appengine/static/blog.css new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/static/blog.css @@ -0,0 +1,153 @@ +/* + * Copyright 2009 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + background: white; + color: black; + margin: 15px; + margin-top: 0; +} + +body, +input, +textarea { + font-family: Georgia, serif; + font-size: 12pt; +} + +table { + border-collapse: collapse; + border: 0; +} + +td { + border: 0; + padding: 0; +} + +h1, +h2, +h3, +h4 { + font-family: "Helvetica Nue", Helvetica, Arial, sans-serif; + margin: 0; +} + +h1 { + font-size: 20pt; +} + +pre, +code { + font-family: monospace; + color: #060; +} + +pre { + margin-left: 1em; + padding-left: 1em; + border-left: 1px solid silver; + line-height: 14pt; +} + +a, +a code { + color: #00c; +} + +#body { + max-width: 800px; + margin: auto; +} + +#header { + background-color: #3b5998; + padding: 5px; + padding-left: 10px; + padding-right: 10px; + margin-bottom: 1em; +} + +#header, +#header a { + color: white; +} + +#header h1 a { + text-decoration: none; +} + +#footer, +#content { + margin-left: 10px; + margin-right: 10px; +} + +#footer { + margin-top: 3em; +} + +.entry h1 a { + color: black; + text-decoration: none; +} + +.entry { + margin-bottom: 2em; +} + +.entry .date { + margin-top: 3px; +} + +.entry p { + margin: 0; + margin-bottom: 1em; +} + +.entry .body { + margin-top: 1em; + line-height: 16pt; +} + +.compose td { + vertical-align: middle; + padding-bottom: 5px; +} + +.compose td.field { + padding-right: 10px; +} + +.compose .title, +.compose .submit { + font-family: "Helvetica Nue", Helvetica, Arial, sans-serif; + font-weight: bold; +} + +.compose .title { + font-size: 20pt; +} + +.compose .title, +.compose .body_source { + width: 100%; +} + +.compose .body_source { + height: 500px; + line-height: 16pt; +} diff --git a/lib/tornado-3.1.1/demos/appengine/templates/archive.html b/lib/tornado-3.1.1/demos/appengine/templates/archive.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/archive.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block head %} + +{% end %} + +{% block body %} + +{% end %} diff --git a/lib/tornado-3.1.1/demos/appengine/templates/base.html b/lib/tornado-3.1.1/demos/appengine/templates/base.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/base.html @@ -0,0 +1,29 @@ + + + + + {{ handler.settings["blog_title"] }} + + + {% block head %}{% end %} + + +
+ +
{% block body %}{% end %}
+
+ {% block bottom %}{% end %} + + diff --git a/lib/tornado-3.1.1/demos/appengine/templates/compose.html b/lib/tornado-3.1.1/demos/appengine/templates/compose.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/compose.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} + +{% block body %} +
+
+
+ + {% if entry %} + + {% end %} + {% module xsrf_form_html() %} +
+{% end %} + +{% block bottom %} + + +{% end %} diff --git a/lib/tornado-3.1.1/demos/appengine/templates/entry.html b/lib/tornado-3.1.1/demos/appengine/templates/entry.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/entry.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block body %} + {% module Entry(entry) %} +{% end %} diff --git a/lib/tornado-3.1.1/demos/appengine/templates/feed.xml b/lib/tornado-3.1.1/demos/appengine/templates/feed.xml new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/feed.xml @@ -0,0 +1,26 @@ + + + {% set date_format = "%Y-%m-%dT%H:%M:%SZ" %} + {{ handler.settings["blog_title"] }} + {% if len(entries) > 0 %} + {{ max(e.updated for e in entries).strftime(date_format) }} + {% else %} + {{ datetime.datetime.utcnow().strftime(date_format) }} + {% end %} + http://{{ request.host }}/ + + + {{ handler.settings["blog_title"] }} + {% for entry in entries %} + + http://{{ request.host }}/entry/{{ entry.slug }} + {{ entry.title }} + + {{ entry.updated.strftime(date_format) }} + {{ entry.published.strftime(date_format) }} + +
{% raw entry.html %}
+
+
+ {% end %} +
diff --git a/lib/tornado-3.1.1/demos/appengine/templates/home.html b/lib/tornado-3.1.1/demos/appengine/templates/home.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/home.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block body %} + {% for entry in entries %} + {% module Entry(entry) %} + {% end %} + +{% end %} diff --git a/lib/tornado-3.1.1/demos/appengine/templates/modules/entry.html b/lib/tornado-3.1.1/demos/appengine/templates/modules/entry.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/appengine/templates/modules/entry.html @@ -0,0 +1,8 @@ +
+

{{ entry.title }}

+
{{ locale.format_date(entry.published, full_format=True, shorter=True) }}
+
{% raw entry.html %}
+ {% if current_user and current_user.administrator %} + + {% end %} +
diff --git a/lib/tornado-3.1.1/demos/auth/authdemo.py b/lib/tornado-3.1.1/demos/auth/authdemo.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/auth/authdemo.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import tornado.auth +import tornado.escape +import tornado.httpserver +import tornado.ioloop +import tornado.web + +from tornado import gen +from tornado.options import define, options, parse_command_line + +define("port", default=8888, help="run on the given port", type=int) + + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + (r"/", MainHandler), + (r"/auth/login", AuthHandler), + (r"/auth/logout", LogoutHandler), + ] + settings = dict( + cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", + login_url="/auth/login", + ) + tornado.web.Application.__init__(self, handlers, **settings) + + +class BaseHandler(tornado.web.RequestHandler): + def get_current_user(self): + user_json = self.get_secure_cookie("authdemo_user") + if not user_json: return None + return tornado.escape.json_decode(user_json) + + +class MainHandler(BaseHandler): + @tornado.web.authenticated + def get(self): + name = tornado.escape.xhtml_escape(self.current_user["name"]) + self.write("Hello, " + name) + self.write("

Log out") + + +class AuthHandler(BaseHandler, tornado.auth.GoogleMixin): + @tornado.web.asynchronous + @gen.coroutine + def get(self): + if self.get_argument("openid.mode", None): + user = yield self.get_authenticated_user() + self.set_secure_cookie("authdemo_user", + tornado.escape.json_encode(user)) + self.redirect("/") + return + self.authenticate_redirect() + + +class LogoutHandler(BaseHandler): + def get(self): + # This logs the user out of this demo app, but does not log them + # out of Google. Since Google remembers previous authorizations, + # returning to this app will log them back in immediately with no + # interaction (unless they have separately logged out of Google in + # the meantime). + self.clear_cookie("authdemo_user") + self.write('You are now logged out. ' + 'Click here to log back in.') + +def main(): + parse_command_line() + http_server = tornado.httpserver.HTTPServer(Application()) + http_server.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/benchmark/benchmark.py b/lib/tornado-3.1.1/demos/benchmark/benchmark.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/benchmark/benchmark.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# +# A simple benchmark of tornado's HTTP stack. +# Requires 'ab' to be installed. +# +# Running without profiling: +# demos/benchmark/benchmark.py +# demos/benchmark/benchmark.py --quiet --num_runs=5|grep "Requests per second" +# +# Running with profiling: +# +# python -m cProfile -o /tmp/prof demos/benchmark/benchmark.py +# python -m pstats /tmp/prof +# % sort time +# % stats 20 + +from tornado.ioloop import IOLoop +from tornado.options import define, options, parse_command_line +from tornado.web import RequestHandler, Application + +import random +import signal +import subprocess + +# choose a random port to avoid colliding with TIME_WAIT sockets left over +# from previous runs. +define("min_port", type=int, default=8000) +define("max_port", type=int, default=9000) + +# Increasing --n without --keepalive will eventually run into problems +# due to TIME_WAIT sockets +define("n", type=int, default=15000) +define("c", type=int, default=25) +define("keepalive", type=bool, default=False) +define("quiet", type=bool, default=False) + +# Repeat the entire benchmark this many times (on different ports) +# This gives JITs time to warm up, etc. Pypy needs 3-5 runs at +# --n=15000 for its JIT to reach full effectiveness +define("num_runs", type=int, default=1) + +define("ioloop", type=str, default=None) + +class RootHandler(RequestHandler): + def get(self): + self.write("Hello, world") + + def _log(self): + pass + +def handle_sigchld(sig, frame): + IOLoop.instance().add_callback(IOLoop.instance().stop) + +def main(): + parse_command_line() + if options.ioloop: + IOLoop.configure(options.ioloop) + for i in xrange(options.num_runs): + run() + +def run(): + app = Application([("/", RootHandler)]) + port = random.randrange(options.min_port, options.max_port) + app.listen(port, address='127.0.0.1') + signal.signal(signal.SIGCHLD, handle_sigchld) + args = ["ab"] + args.extend(["-n", str(options.n)]) + args.extend(["-c", str(options.c)]) + if options.keepalive: + args.append("-k") + if options.quiet: + # just stops the progress messages printed to stderr + args.append("-q") + args.append("http://127.0.0.1:%d/" % port) + subprocess.Popen(args) + IOLoop.instance().start() + IOLoop.instance().close() + del IOLoop._instance + assert not IOLoop.initialized() + +if __name__ == '__main__': + main() diff --git a/lib/tornado-3.1.1/demos/benchmark/chunk_benchmark.py b/lib/tornado-3.1.1/demos/benchmark/chunk_benchmark.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/benchmark/chunk_benchmark.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# +# Downloads a large file in chunked encoding with both curl and simple clients + +import logging +from tornado.curl_httpclient import CurlAsyncHTTPClient +from tornado.simple_httpclient import SimpleAsyncHTTPClient +from tornado.ioloop import IOLoop +from tornado.options import define, options, parse_command_line +from tornado.web import RequestHandler, Application + +define('port', default=8888) +define('num_chunks', default=1000) +define('chunk_size', default=2048) + +class ChunkHandler(RequestHandler): + def get(self): + for i in xrange(options.num_chunks): + self.write('A' * options.chunk_size) + self.flush() + self.finish() + +def main(): + parse_command_line() + app = Application([('/', ChunkHandler)]) + app.listen(options.port, address='127.0.0.1') + def callback(response): + response.rethrow() + assert len(response.body) == (options.num_chunks * options.chunk_size) + logging.warning("fetch completed in %s seconds", response.request_time) + IOLoop.instance().stop() + + logging.warning("Starting fetch with curl client") + curl_client = CurlAsyncHTTPClient() + curl_client.fetch('http://localhost:%d/' % options.port, + callback=callback) + IOLoop.instance().start() + + logging.warning("Starting fetch with simple client") + simple_client = SimpleAsyncHTTPClient() + simple_client.fetch('http://localhost:%d/' % options.port, + callback=callback) + IOLoop.instance().start() + + +if __name__ == '__main__': + main() diff --git a/lib/tornado-3.1.1/demos/benchmark/stack_context_benchmark.py b/lib/tornado-3.1.1/demos/benchmark/stack_context_benchmark.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/benchmark/stack_context_benchmark.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +"""Benchmark for stack_context functionality.""" +import collections +import contextlib +import functools +import subprocess +import sys + +from tornado import stack_context + +class Benchmark(object): + def enter_exit(self, count): + """Measures the overhead of the nested "with" statements + when using many contexts. + """ + if count < 0: + return + with self.make_context(): + self.enter_exit(count - 1) + + def call_wrapped(self, count): + """Wraps and calls a function at each level of stack depth + to measure the overhead of the wrapped function. + """ + # This queue is analogous to IOLoop.add_callback, but lets us + # benchmark the stack_context in isolation without system call + # overhead. + queue = collections.deque() + self.call_wrapped_inner(queue, count) + while queue: + queue.popleft()() + + def call_wrapped_inner(self, queue, count): + if count < 0: + return + with self.make_context(): + queue.append(stack_context.wrap( + functools.partial(self.call_wrapped_inner, queue, count - 1))) + +class StackBenchmark(Benchmark): + def make_context(self): + return stack_context.StackContext(self.__context) + + @contextlib.contextmanager + def __context(self): + yield + +class ExceptionBenchmark(Benchmark): + def make_context(self): + return stack_context.ExceptionStackContext(self.__handle_exception) + + def __handle_exception(self, typ, value, tb): + pass + +def main(): + base_cmd = [ + sys.executable, '-m', 'timeit', '-s', + 'from stack_context_benchmark import StackBenchmark, ExceptionBenchmark'] + cmds = [ + 'StackBenchmark().enter_exit(50)', + 'StackBenchmark().call_wrapped(50)', + 'StackBenchmark().enter_exit(500)', + 'StackBenchmark().call_wrapped(500)', + + 'ExceptionBenchmark().enter_exit(50)', + 'ExceptionBenchmark().call_wrapped(50)', + 'ExceptionBenchmark().enter_exit(500)', + 'ExceptionBenchmark().call_wrapped(500)', + ] + for cmd in cmds: + print cmd + subprocess.check_call(base_cmd + [cmd]) + +if __name__ == '__main__': + main() diff --git a/lib/tornado-3.1.1/demos/benchmark/template_benchmark.py b/lib/tornado-3.1.1/demos/benchmark/template_benchmark.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/benchmark/template_benchmark.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# +# A simple benchmark of tornado template rendering, based on +# https://github.com/mitsuhiko/jinja2/blob/master/examples/bench.py + +import sys +from timeit import Timer + +from tornado.options import options, define, parse_command_line +from tornado.template import Template + +define('num', default=100, help='number of iterations') +define('dump', default=False, help='print template generated code and exit') + +context = { + 'page_title': 'mitsuhiko\'s benchmark', + 'table': [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10) for x in range(1000)] +} + +tmpl = Template("""\ + + + + {{ page_title }} + + +
+

{{ page_title }}

+
+ +
+ + {% for row in table %} + + {% for cell in row %} + + {% end %} + + {% end %} +
{{ cell }}
+
+ +\ +""") + +def render(): + tmpl.generate(**context) + +def main(): + parse_command_line() + if options.dump: + print tmpl.code + sys.exit(0) + t = Timer(render) + results = t.timeit(options.num) / options.num + print '%0.3f ms per iteration' % (results*1000) + +if __name__ == '__main__': + main() diff --git a/lib/tornado-3.1.1/demos/blog/README b/lib/tornado-3.1.1/demos/blog/README new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/README @@ -0,0 +1,62 @@ +Running the Tornado Blog example app +==================================== +This demo is a simple blogging engine that uses MySQL to store posts and +Google Accounts for author authentication. Since it depends on MySQL, you +need to set up MySQL and the database schema for the demo to run. + +1. Install prerequisites and build tornado + + See http://www.tornadoweb.org/ for installation instructions. If you can + run the "helloworld" example application, your environment is set up + correctly. + +2. Install MySQL if needed + + Consult the documentation for your platform. Under Ubuntu Linux you + can run "apt-get install mysql". Under OS X you can download the + MySQL PKG file from http://dev.mysql.com/downloads/mysql/ + +3. Install Python prerequisites + + Install the packages MySQL-python, torndb, and markdown (e.g. using pip or + easy_install) + +3. Connect to MySQL and create a database and user for the blog. + + Connect to MySQL as a user that can create databases and users: + mysql -u root + + Create a database named "blog": + mysql> CREATE DATABASE blog; + + Allow the "blog" user to connect with the password "blog": + mysql> GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost' IDENTIFIED BY 'blog'; + +4. Create the tables in your new database. + + You can use the provided schema.sql file by running this command: + mysql --user=blog --password=blog --database=blog < schema.sql + + You can run the above command again later if you want to delete the + contents of the blog and start over after testing. + +5. Run the blog example + + With the default user, password, and database you can just run: + ./blog.py + + If you've changed anything, you can alter the default MySQL settings + with arguments on the command line, e.g.: + ./blog.py --mysql_user=casey --mysql_password=happiness --mysql_database=foodblog + +6. Visit your new blog + + Open http://localhost:8888/ in your web browser. You will be redirected to + a Google account sign-in page because the blog uses Google accounts for + authentication. + + Currently the first user to connect will automatically be given the + ability to create and edit posts. + + Once you've created one blog post, subsequent users will not be + prompted to sign in. diff --git a/lib/tornado-3.1.1/demos/blog/blog.py b/lib/tornado-3.1.1/demos/blog/blog.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/blog.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import markdown +import os.path +import re +import torndb +import tornado.auth +import tornado.httpserver +import tornado.ioloop +import tornado.options +import tornado.web +import unicodedata + +from tornado.options import define, options + +define("port", default=8888, help="run on the given port", type=int) +define("mysql_host", default="127.0.0.1:3306", help="blog database host") +define("mysql_database", default="blog", help="blog database name") +define("mysql_user", default="blog", help="blog database user") +define("mysql_password", default="blog", help="blog database password") + + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + (r"/", HomeHandler), + (r"/archive", ArchiveHandler), + (r"/feed", FeedHandler), + (r"/entry/([^/]+)", EntryHandler), + (r"/compose", ComposeHandler), + (r"/auth/login", AuthLoginHandler), + (r"/auth/logout", AuthLogoutHandler), + ] + settings = dict( + blog_title=u"Tornado Blog", + template_path=os.path.join(os.path.dirname(__file__), "templates"), + static_path=os.path.join(os.path.dirname(__file__), "static"), + ui_modules={"Entry": EntryModule}, + xsrf_cookies=True, + cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", + login_url="/auth/login", + debug=True, + ) + tornado.web.Application.__init__(self, handlers, **settings) + + # Have one global connection to the blog DB across all handlers + self.db = torndb.Connection( + host=options.mysql_host, database=options.mysql_database, + user=options.mysql_user, password=options.mysql_password) + + +class BaseHandler(tornado.web.RequestHandler): + @property + def db(self): + return self.application.db + + def get_current_user(self): + user_id = self.get_secure_cookie("blogdemo_user") + if not user_id: return None + return self.db.get("SELECT * FROM authors WHERE id = %s", int(user_id)) + + +class HomeHandler(BaseHandler): + def get(self): + entries = self.db.query("SELECT * FROM entries ORDER BY published " + "DESC LIMIT 5") + if not entries: + self.redirect("/compose") + return + self.render("home.html", entries=entries) + + +class EntryHandler(BaseHandler): + def get(self, slug): + entry = self.db.get("SELECT * FROM entries WHERE slug = %s", slug) + if not entry: raise tornado.web.HTTPError(404) + self.render("entry.html", entry=entry) + + +class ArchiveHandler(BaseHandler): + def get(self): + entries = self.db.query("SELECT * FROM entries ORDER BY published " + "DESC") + self.render("archive.html", entries=entries) + + +class FeedHandler(BaseHandler): + def get(self): + entries = self.db.query("SELECT * FROM entries ORDER BY published " + "DESC LIMIT 10") + self.set_header("Content-Type", "application/atom+xml") + self.render("feed.xml", entries=entries) + + +class ComposeHandler(BaseHandler): + @tornado.web.authenticated + def get(self): + id = self.get_argument("id", None) + entry = None + if id: + entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id)) + self.render("compose.html", entry=entry) + + @tornado.web.authenticated + def post(self): + id = self.get_argument("id", None) + title = self.get_argument("title") + text = self.get_argument("markdown") + html = markdown.markdown(text) + if id: + entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id)) + if not entry: raise tornado.web.HTTPError(404) + slug = entry.slug + self.db.execute( + "UPDATE entries SET title = %s, markdown = %s, html = %s " + "WHERE id = %s", title, text, html, int(id)) + else: + slug = unicodedata.normalize("NFKD", title).encode( + "ascii", "ignore") + slug = re.sub(r"[^\w]+", " ", slug) + slug = "-".join(slug.lower().strip().split()) + if not slug: slug = "entry" + while True: + e = self.db.get("SELECT * FROM entries WHERE slug = %s", slug) + if not e: break + slug += "-2" + self.db.execute( + "INSERT INTO entries (author_id,title,slug,markdown,html," + "published) VALUES (%s,%s,%s,%s,%s,UTC_TIMESTAMP())", + self.current_user.id, title, slug, text, html) + self.redirect("/entry/" + slug) + + +class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin): + @tornado.web.asynchronous + def get(self): + if self.get_argument("openid.mode", None): + self.get_authenticated_user(self.async_callback(self._on_auth)) + return + self.authenticate_redirect() + + def _on_auth(self, user): + if not user: + raise tornado.web.HTTPError(500, "Google auth failed") + author = self.db.get("SELECT * FROM authors WHERE email = %s", + user["email"]) + if not author: + # Auto-create first author + any_author = self.db.get("SELECT * FROM authors LIMIT 1") + if not any_author: + author_id = self.db.execute( + "INSERT INTO authors (email,name) VALUES (%s,%s)", + user["email"], user["name"]) + else: + self.redirect("/") + return + else: + author_id = author["id"] + self.set_secure_cookie("blogdemo_user", str(author_id)) + self.redirect(self.get_argument("next", "/")) + + +class AuthLogoutHandler(BaseHandler): + def get(self): + self.clear_cookie("blogdemo_user") + self.redirect(self.get_argument("next", "/")) + + +class EntryModule(tornado.web.UIModule): + def render(self, entry): + return self.render_string("modules/entry.html", entry=entry) + + +def main(): + tornado.options.parse_command_line() + http_server = tornado.httpserver.HTTPServer(Application()) + http_server.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/blog/schema.sql b/lib/tornado-3.1.1/demos/blog/schema.sql new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/schema.sql @@ -0,0 +1,44 @@ +-- Copyright 2009 FriendFeed +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); you may +-- not use this file except in compliance with the License. You may obtain +-- a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +-- License for the specific language governing permissions and limitations +-- under the License. + +-- To create the database: +-- CREATE DATABASE blog; +-- GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost' IDENTIFIED BY 'blog'; +-- +-- To reload the tables: +-- mysql --user=blog --password=blog --database=blog < schema.sql + +SET SESSION storage_engine = "InnoDB"; +SET SESSION time_zone = "+0:00"; +ALTER DATABASE CHARACTER SET "utf8"; + +DROP TABLE IF EXISTS entries; +CREATE TABLE entries ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + author_id INT NOT NULL REFERENCES authors(id), + slug VARCHAR(100) NOT NULL UNIQUE, + title VARCHAR(512) NOT NULL, + markdown MEDIUMTEXT NOT NULL, + html MEDIUMTEXT NOT NULL, + published DATETIME NOT NULL, + updated TIMESTAMP NOT NULL, + KEY (published) +); + +DROP TABLE IF EXISTS authors; +CREATE TABLE authors ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + email VARCHAR(100) NOT NULL UNIQUE, + name VARCHAR(100) NOT NULL +); diff --git a/lib/tornado-3.1.1/demos/blog/static/blog.css b/lib/tornado-3.1.1/demos/blog/static/blog.css new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/static/blog.css @@ -0,0 +1,153 @@ +/* + * Copyright 2009 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + background: white; + color: black; + margin: 15px; + margin-top: 0; +} + +body, +input, +textarea { + font-family: Georgia, serif; + font-size: 12pt; +} + +table { + border-collapse: collapse; + border: 0; +} + +td { + border: 0; + padding: 0; +} + +h1, +h2, +h3, +h4 { + font-family: "Helvetica Nue", Helvetica, Arial, sans-serif; + margin: 0; +} + +h1 { + font-size: 20pt; +} + +pre, +code { + font-family: monospace; + color: #060; +} + +pre { + margin-left: 1em; + padding-left: 1em; + border-left: 1px solid silver; + line-height: 14pt; +} + +a, +a code { + color: #00c; +} + +#body { + max-width: 800px; + margin: auto; +} + +#header { + background-color: #3b5998; + padding: 5px; + padding-left: 10px; + padding-right: 10px; + margin-bottom: 1em; +} + +#header, +#header a { + color: white; +} + +#header h1 a { + text-decoration: none; +} + +#footer, +#content { + margin-left: 10px; + margin-right: 10px; +} + +#footer { + margin-top: 3em; +} + +.entry h1 a { + color: black; + text-decoration: none; +} + +.entry { + margin-bottom: 2em; +} + +.entry .date { + margin-top: 3px; +} + +.entry p { + margin: 0; + margin-bottom: 1em; +} + +.entry .body { + margin-top: 1em; + line-height: 16pt; +} + +.compose td { + vertical-align: middle; + padding-bottom: 5px; +} + +.compose td.field { + padding-right: 10px; +} + +.compose .title, +.compose .submit { + font-family: "Helvetica Nue", Helvetica, Arial, sans-serif; + font-weight: bold; +} + +.compose .title { + font-size: 20pt; +} + +.compose .title, +.compose .markdown { + width: 100%; +} + +.compose .markdown { + height: 500px; + line-height: 16pt; +} diff --git a/lib/tornado-3.1.1/demos/blog/templates/archive.html b/lib/tornado-3.1.1/demos/blog/templates/archive.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/archive.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block head %} + +{% end %} + +{% block body %} +
    + {% for entry in entries %} +
  • + +
    {{ locale.format_date(entry.published, full_format=True, shorter=True) }}
    +
  • + {% end %} +
+{% end %} diff --git a/lib/tornado-3.1.1/demos/blog/templates/base.html b/lib/tornado-3.1.1/demos/blog/templates/base.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/base.html @@ -0,0 +1,27 @@ + + + + + {{ escape(handler.settings["blog_title"]) }} + + + {% block head %}{% end %} + + +
+ +
{% block body %}{% end %}
+
+ {% block bottom %}{% end %} + + diff --git a/lib/tornado-3.1.1/demos/blog/templates/compose.html b/lib/tornado-3.1.1/demos/blog/templates/compose.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/compose.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block body %} +
+
+
+ + {% if entry %} + + {% end %} + {% module xsrf_form_html() %} +
+{% end %} + +{% block bottom %} + + +{% end %} diff --git a/lib/tornado-3.1.1/demos/blog/templates/entry.html b/lib/tornado-3.1.1/demos/blog/templates/entry.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/entry.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block body %} + {% module Entry(entry) %} +{% end %} diff --git a/lib/tornado-3.1.1/demos/blog/templates/feed.xml b/lib/tornado-3.1.1/demos/blog/templates/feed.xml new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/feed.xml @@ -0,0 +1,26 @@ + + + {% set date_format = "%Y-%m-%dT%H:%M:%SZ" %} + {{ handler.settings["blog_title"] }} + {% if len(entries) > 0 %} + {{ max(e.updated for e in entries).strftime(date_format) }} + {% else %} + {{ datetime.datetime.utcnow().strftime(date_format) }} + {% end %} + http://{{ request.host }}/ + + + {{ handler.settings["blog_title"] }} + {% for entry in entries %} + + http://{{ request.host }}/entry/{{ entry.slug }} + {{ entry.title }} + + {{ entry.updated.strftime(date_format) }} + {{ entry.published.strftime(date_format) }} + +
{% raw entry.html %}
+
+
+ {% end %} +
diff --git a/lib/tornado-3.1.1/demos/blog/templates/home.html b/lib/tornado-3.1.1/demos/blog/templates/home.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/home.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block body %} + {% for entry in entries %} + {% module Entry(entry) %} + {% end %} + +{% end %} diff --git a/lib/tornado-3.1.1/demos/blog/templates/modules/entry.html b/lib/tornado-3.1.1/demos/blog/templates/modules/entry.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/blog/templates/modules/entry.html @@ -0,0 +1,8 @@ +
+

{{ entry.title }}

+
{{ locale.format_date(entry.published, full_format=True, shorter=True) }}
+
{% raw entry.html %}
+ {% if current_user %} + + {% end %} +
diff --git a/lib/tornado-3.1.1/demos/chat/chatdemo.py b/lib/tornado-3.1.1/demos/chat/chatdemo.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/chat/chatdemo.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import tornado.auth +import tornado.escape +import tornado.ioloop +import tornado.web +import os.path +import uuid + +from tornado import gen +from tornado.options import define, options, parse_command_line + +define("port", default=8888, help="run on the given port", type=int) + + +class MessageBuffer(object): + def __init__(self): + self.waiters = set() + self.cache = [] + self.cache_size = 200 + + def wait_for_messages(self, callback, cursor=None): + if cursor: + new_count = 0 + for msg in reversed(self.cache): + if msg["id"] == cursor: + break + new_count += 1 + if new_count: + callback(self.cache[-new_count:]) + return + self.waiters.add(callback) + + def cancel_wait(self, callback): + self.waiters.remove(callback) + + def new_messages(self, messages): + logging.info("Sending new message to %r listeners", len(self.waiters)) + for callback in self.waiters: + try: + callback(messages) + except: + logging.error("Error in waiter callback", exc_info=True) + self.waiters = set() + self.cache.extend(messages) + if len(self.cache) > self.cache_size: + self.cache = self.cache[-self.cache_size:] + + +# Making this a non-singleton is left as an exercise for the reader. +global_message_buffer = MessageBuffer() + + +class BaseHandler(tornado.web.RequestHandler): + def get_current_user(self): + user_json = self.get_secure_cookie("chatdemo_user") + if not user_json: return None + return tornado.escape.json_decode(user_json) + + +class MainHandler(BaseHandler): + @tornado.web.authenticated + def get(self): + self.render("index.html", messages=global_message_buffer.cache) + + +class MessageNewHandler(BaseHandler): + @tornado.web.authenticated + def post(self): + message = { + "id": str(uuid.uuid4()), + "from": self.current_user["first_name"], + "body": self.get_argument("body"), + } + # to_basestring is necessary for Python 3's json encoder, + # which doesn't accept byte strings. + message["html"] = tornado.escape.to_basestring( + self.render_string("message.html", message=message)) + if self.get_argument("next", None): + self.redirect(self.get_argument("next")) + else: + self.write(message) + global_message_buffer.new_messages([message]) + + +class MessageUpdatesHandler(BaseHandler): + @tornado.web.authenticated + @tornado.web.asynchronous + def post(self): + cursor = self.get_argument("cursor", None) + global_message_buffer.wait_for_messages(self.on_new_messages, + cursor=cursor) + + def on_new_messages(self, messages): + # Closed client connection + if self.request.connection.stream.closed(): + return + self.finish(dict(messages=messages)) + + def on_connection_close(self): + global_message_buffer.cancel_wait(self.on_new_messages) + + +class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin): + @tornado.web.asynchronous + @gen.coroutine + def get(self): + if self.get_argument("openid.mode", None): + user = yield self.get_authenticated_user() + self.set_secure_cookie("chatdemo_user", + tornado.escape.json_encode(user)) + self.redirect("/") + return + self.authenticate_redirect(ax_attrs=["name"]) + + +class AuthLogoutHandler(BaseHandler): + def get(self): + self.clear_cookie("chatdemo_user") + self.write("You are now logged out") + + +def main(): + parse_command_line() + app = tornado.web.Application( + [ + (r"/", MainHandler), + (r"/auth/login", AuthLoginHandler), + (r"/auth/logout", AuthLogoutHandler), + (r"/a/message/new", MessageNewHandler), + (r"/a/message/updates", MessageUpdatesHandler), + ], + cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", + login_url="/auth/login", + template_path=os.path.join(os.path.dirname(__file__), "templates"), + static_path=os.path.join(os.path.dirname(__file__), "static"), + xsrf_cookies=True, + ) + app.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/chat/static/chat.css b/lib/tornado-3.1.1/demos/chat/static/chat.css new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/chat/static/chat.css @@ -0,0 +1,56 @@ +/* + * Copyright 2009 FriendFeed + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + background: white; + margin: 10px; +} + +body, +input { + font-family: sans-serif; + font-size: 10pt; + color: black; +} + +table { + border-collapse: collapse; + border: 0; +} + +td { + border: 0; + padding: 0; +} + +#body { + position: absolute; + bottom: 10px; + left: 10px; +} + +#input { + margin-top: 0.5em; +} + +#inbox .message { + padding-top: 0.25em; +} + +#nav { + float: right; + z-index: 99; +} diff --git a/lib/tornado-3.1.1/demos/chat/static/chat.js b/lib/tornado-3.1.1/demos/chat/static/chat.js new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/chat/static/chat.js @@ -0,0 +1,135 @@ +// Copyright 2009 FriendFeed +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +$(document).ready(function() { + if (!window.console) window.console = {}; + if (!window.console.log) window.console.log = function() {}; + + $("#messageform").live("submit", function() { + newMessage($(this)); + return false; + }); + $("#messageform").live("keypress", function(e) { + if (e.keyCode == 13) { + newMessage($(this)); + return false; + } + }); + $("#message").select(); + updater.poll(); +}); + +function newMessage(form) { + var message = form.formToDict(); + var disabled = form.find("input[type=submit]"); + disabled.disable(); + $.postJSON("/a/message/new", message, function(response) { + updater.showMessage(response); + if (message.id) { + form.parent().remove(); + } else { + form.find("input[type=text]").val("").select(); + disabled.enable(); + } + }); +} + +function getCookie(name) { + var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); + return r ? r[1] : undefined; +} + +jQuery.postJSON = function(url, args, callback) { + args._xsrf = getCookie("_xsrf"); + $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", + success: function(response) { + if (callback) callback(eval("(" + response + ")")); + }, error: function(response) { + console.log("ERROR:", response) + }}); +}; + +jQuery.fn.formToDict = function() { + var fields = this.serializeArray(); + var json = {} + for (var i = 0; i < fields.length; i++) { + json[fields[i].name] = fields[i].value; + } + if (json.next) delete json.next; + return json; +}; + +jQuery.fn.disable = function() { + this.enable(false); + return this; +}; + +jQuery.fn.enable = function(opt_enable) { + if (arguments.length && !opt_enable) { + this.attr("disabled", "disabled"); + } else { + this.removeAttr("disabled"); + } + return this; +}; + +var updater = { + errorSleepTime: 500, + cursor: null, + + poll: function() { + var args = {"_xsrf": getCookie("_xsrf")}; + if (updater.cursor) args.cursor = updater.cursor; + $.ajax({url: "/a/message/updates", type: "POST", dataType: "text", + data: $.param(args), success: updater.onSuccess, + error: updater.onError}); + }, + + onSuccess: function(response) { + try { + updater.newMessages(eval("(" + response + ")")); + } catch (e) { + updater.onError(); + return; + } + updater.errorSleepTime = 500; + window.setTimeout(updater.poll, 0); + }, + + onError: function(response) { + updater.errorSleepTime *= 2; + console.log("Poll error; sleeping for", updater.errorSleepTime, "ms"); + window.setTimeout(updater.poll, updater.errorSleepTime); + }, + + newMessages: function(response) { + if (!response.messages) return; + updater.cursor = response.cursor; + var messages = response.messages; + updater.cursor = messages[messages.length - 1].id; + console.log(messages.length, "new messages, cursor:", updater.cursor); + for (var i = 0; i < messages.length; i++) { + updater.showMessage(messages[i]); + } + }, + + showMessage: function(message) { + var existing = $("#m" + message.id); + if (existing.length > 0) return; + var node = $(message.html); + node.hide(); + $("#inbox").append(node); + node.slideDown(); + } +}; diff --git a/lib/tornado-3.1.1/demos/chat/templates/index.html b/lib/tornado-3.1.1/demos/chat/templates/index.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/chat/templates/index.html @@ -0,0 +1,37 @@ + + + + + Tornado Chat Demo + + + + +
+
+ {% for message in messages %} + {% module Template("message.html", message=message) %} + {% end %} +
+
+
+ + + + + +
+ + + {% module xsrf_form_html() %} +
+
+
+
+ + + + diff --git a/lib/tornado-3.1.1/demos/chat/templates/message.html b/lib/tornado-3.1.1/demos/chat/templates/message.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/chat/templates/message.html @@ -0,0 +1,1 @@ +
{{ message["from"] }}: {% module linkify(message["body"]) %}
diff --git a/lib/tornado-3.1.1/demos/facebook/README b/lib/tornado-3.1.1/demos/facebook/README new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/facebook/README @@ -0,0 +1,8 @@ +Running the Tornado Facebook example +===================================== +To work with the provided Facebook api key, this example must be +accessed at http://localhost:8888/ to match the Connect URL set in the +example application. + +To use any other domain, a new Facebook application must be registered +with a Connect URL set to that domain. diff --git a/lib/tornado-3.1.1/demos/facebook/facebook.py b/lib/tornado-3.1.1/demos/facebook/facebook.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/facebook/facebook.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os.path +import tornado.auth +import tornado.escape +import tornado.httpserver +import tornado.ioloop +import tornado.options +import tornado.web + +from tornado.options import define, options + +define("port", default=8888, help="run on the given port", type=int) +define("facebook_api_key", help="your Facebook application API key", + default="9e2ada1b462142c4dfcc8e894ea1e37c") +define("facebook_secret", help="your Facebook application secret", + default="32fc6114554e3c53d5952594510021e2") + + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + (r"/", MainHandler), + (r"/auth/login", AuthLoginHandler), + (r"/auth/logout", AuthLogoutHandler), + ] + settings = dict( + cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", + login_url="/auth/login", + template_path=os.path.join(os.path.dirname(__file__), "templates"), + static_path=os.path.join(os.path.dirname(__file__), "static"), + xsrf_cookies=True, + facebook_api_key=options.facebook_api_key, + facebook_secret=options.facebook_secret, + ui_modules={"Post": PostModule}, + debug=True, + autoescape=None, + ) + tornado.web.Application.__init__(self, handlers, **settings) + + +class BaseHandler(tornado.web.RequestHandler): + def get_current_user(self): + user_json = self.get_secure_cookie("fbdemo_user") + if not user_json: return None + return tornado.escape.json_decode(user_json) + + +class MainHandler(BaseHandler, tornado.auth.FacebookGraphMixin): + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.facebook_request("/me/home", self._on_stream, + access_token=self.current_user["access_token"]) + + def _on_stream(self, stream): + if stream is None: + # Session may have expired + self.redirect("/auth/login") + return + self.render("stream.html", stream=stream) + + +class AuthLoginHandler(BaseHandler, tornado.auth.FacebookGraphMixin): + @tornado.web.asynchronous + def get(self): + my_url = (self.request.protocol + "://" + self.request.host + + "/auth/login?next=" + + tornado.escape.url_escape(self.get_argument("next", "/"))) + if self.get_argument("code", False): + self.get_authenticated_user( + redirect_uri=my_url, + client_id=self.settings["facebook_api_key"], + client_secret=self.settings["facebook_secret"], + code=self.get_argument("code"), + callback=self._on_auth) + return + self.authorize_redirect(redirect_uri=my_url, + client_id=self.settings["facebook_api_key"], + extra_params={"scope": "read_stream"}) + + def _on_auth(self, user): + if not user: + raise tornado.web.HTTPError(500, "Facebook auth failed") + self.set_secure_cookie("fbdemo_user", tornado.escape.json_encode(user)) + self.redirect(self.get_argument("next", "/")) + + +class AuthLogoutHandler(BaseHandler, tornado.auth.FacebookGraphMixin): + def get(self): + self.clear_cookie("fbdemo_user") + self.redirect(self.get_argument("next", "/")) + + +class PostModule(tornado.web.UIModule): + def render(self, post): + return self.render_string("modules/post.html", post=post) + + +def main(): + tornado.options.parse_command_line() + http_server = tornado.httpserver.HTTPServer(Application()) + http_server.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/facebook/static/facebook.css b/lib/tornado-3.1.1/demos/facebook/static/facebook.css new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/facebook/static/facebook.css @@ -0,0 +1,97 @@ +/* + * Copyright 2009 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + background: white; + color: black; + margin: 15px; +} + +body, +input, +textarea { + font-family: "Lucida Grande", Tahoma, Verdana, sans-serif; + font-size: 10pt; +} + +table { + border-collapse: collapse; + border: 0; +} + +td { + border: 0; + padding: 0; +} + +img { + border: 0; +} + +a { + text-decoration: none; + color: #3b5998; +} + +a:hover { + text-decoration: underline; +} + +.post { + border-bottom: 1px solid #eeeeee; + min-height: 50px; + padding-bottom: 10px; + margin-top: 10px; +} + +.post .picture { + float: left; +} + +.post .picture img { + height: 50px; + width: 50px; +} + +.post .body { + margin-left: 60px; +} + +.post .media img { + border: 1px solid #cccccc; + padding: 3px; +} + +.post .media:hover img { + border: 1px solid #3b5998; +} + +.post a.actor { + font-weight: bold; +} + +.post .meta { + font-size: 11px; +} + +.post a.permalink { + color: #777777; +} + +#body { + max-width: 700px; + margin: auto; +} diff --git a/lib/tornado-3.1.1/demos/facebook/static/facebook.js b/lib/tornado-3.1.1/demos/facebook/static/facebook.js new file mode 100644 diff --git a/lib/tornado-3.1.1/demos/facebook/templates/modules/post.html b/lib/tornado-3.1.1/demos/facebook/templates/modules/post.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/facebook/templates/modules/post.html @@ -0,0 +1,17 @@ +
+
+ {% set author_url="http://www.facebook.com/profile.php?id=" + escape(post["from"]["id"]) %} + +
+
+ {{ escape(post["from"]["name"]) }} + {% if "message" in post %} + {{ escape(post["message"]) }} + {% end %} + +
+
diff --git a/lib/tornado-3.1.1/demos/facebook/templates/stream.html b/lib/tornado-3.1.1/demos/facebook/templates/stream.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/facebook/templates/stream.html @@ -0,0 +1,22 @@ + + + + + Tornado Facebook Stream Demo + + + +
+
+ {{ escape(current_user["name"]) }} - + {{ _("Sign out") }} +
+ +
+ {% for post in stream["data"] %} + {{ modules.Post(post) }} + {% end %} +
+
+ + diff --git a/lib/tornado-3.1.1/demos/helloworld/helloworld.py b/lib/tornado-3.1.1/demos/helloworld/helloworld.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/helloworld/helloworld.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import tornado.httpserver +import tornado.ioloop +import tornado.options +import tornado.web + +from tornado.options import define, options + +define("port", default=8888, help="run on the given port", type=int) + + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + + +def main(): + tornado.options.parse_command_line() + application = tornado.web.Application([ + (r"/", MainHandler), + ]) + http_server = tornado.httpserver.HTTPServer(application) + http_server.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/s3server/s3server.py b/lib/tornado-3.1.1/demos/s3server/s3server.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/s3server/s3server.py @@ -0,0 +1,256 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Implementation of an S3-like storage server based on local files. + +Useful to test features that will eventually run on S3, or if you want to +run something locally that was once running on S3. + +We don't support all the features of S3, but it does work with the +standard S3 client for the most basic semantics. To use the standard +S3 client with this module: + + c = S3.AWSAuthConnection("", "", server="localhost", port=8888, + is_secure=False) + c.create_bucket("mybucket") + c.put("mybucket", "mykey", "a value") + print c.get("mybucket", "mykey").body + +""" + +import bisect +import datetime +import hashlib +import os +import os.path +import urllib + +from tornado import escape +from tornado import httpserver +from tornado import ioloop +from tornado import web +from tornado.util import bytes_type + +def start(port, root_directory="/tmp/s3", bucket_depth=0): + """Starts the mock S3 server on the given port at the given path.""" + application = S3Application(root_directory, bucket_depth) + http_server = httpserver.HTTPServer(application) + http_server.listen(port) + ioloop.IOLoop.instance().start() + + +class S3Application(web.Application): + """Implementation of an S3-like storage server based on local files. + + If bucket depth is given, we break files up into multiple directories + to prevent hitting file system limits for number of files in each + directories. 1 means one level of directories, 2 means 2, etc. + """ + def __init__(self, root_directory, bucket_depth=0): + web.Application.__init__(self, [ + (r"/", RootHandler), + (r"/([^/]+)/(.+)", ObjectHandler), + (r"/([^/]+)/", BucketHandler), + ]) + self.directory = os.path.abspath(root_directory) + if not os.path.exists(self.directory): + os.makedirs(self.directory) + self.bucket_depth = bucket_depth + + +class BaseRequestHandler(web.RequestHandler): + SUPPORTED_METHODS = ("PUT", "GET", "DELETE") + + def render_xml(self, value): + assert isinstance(value, dict) and len(value) == 1 + self.set_header("Content-Type", "application/xml; charset=UTF-8") + name = value.keys()[0] + parts = [] + parts.append('<' + escape.utf8(name) + + ' xmlns="http://doc.s3.amazonaws.com/2006-03-01">') + self._render_parts(value.values()[0], parts) + parts.append('') + self.finish('\n' + + ''.join(parts)) + + def _render_parts(self, value, parts=[]): + if isinstance(value, (unicode, bytes_type)): + parts.append(escape.xhtml_escape(value)) + elif isinstance(value, int) or isinstance(value, long): + parts.append(str(value)) + elif isinstance(value, datetime.datetime): + parts.append(value.strftime("%Y-%m-%dT%H:%M:%S.000Z")) + elif isinstance(value, dict): + for name, subvalue in value.iteritems(): + if not isinstance(subvalue, list): + subvalue = [subvalue] + for subsubvalue in subvalue: + parts.append('<' + escape.utf8(name) + '>') + self._render_parts(subsubvalue, parts) + parts.append('') + else: + raise Exception("Unknown S3 value type %r", value) + + def _object_path(self, bucket, object_name): + if self.application.bucket_depth < 1: + return os.path.abspath(os.path.join( + self.application.directory, bucket, object_name)) + hash = hashlib.md5(object_name).hexdigest() + path = os.path.abspath(os.path.join( + self.application.directory, bucket)) + for i in range(self.application.bucket_depth): + path = os.path.join(path, hash[:2 * (i + 1)]) + return os.path.join(path, object_name) + + +class RootHandler(BaseRequestHandler): + def get(self): + names = os.listdir(self.application.directory) + buckets = [] + for name in names: + path = os.path.join(self.application.directory, name) + info = os.stat(path) + buckets.append({ + "Name": name, + "CreationDate": datetime.datetime.utcfromtimestamp( + info.st_ctime), + }) + self.render_xml({"ListAllMyBucketsResult": { + "Buckets": {"Bucket": buckets}, + }}) + + +class BucketHandler(BaseRequestHandler): + def get(self, bucket_name): + prefix = self.get_argument("prefix", u"") + marker = self.get_argument("marker", u"") + max_keys = int(self.get_argument("max-keys", 50000)) + path = os.path.abspath(os.path.join(self.application.directory, + bucket_name)) + terse = int(self.get_argument("terse", 0)) + if not path.startswith(self.application.directory) or \ + not os.path.isdir(path): + raise web.HTTPError(404) + object_names = [] + for root, dirs, files in os.walk(path): + for file_name in files: + object_names.append(os.path.join(root, file_name)) + skip = len(path) + 1 + for i in range(self.application.bucket_depth): + skip += 2 * (i + 1) + 1 + object_names = [n[skip:] for n in object_names] + object_names.sort() + contents = [] + + start_pos = 0 + if marker: + start_pos = bisect.bisect_right(object_names, marker, start_pos) + if prefix: + start_pos = bisect.bisect_left(object_names, prefix, start_pos) + + truncated = False + for object_name in object_names[start_pos:]: + if not object_name.startswith(prefix): + break + if len(contents) >= max_keys: + truncated = True + break + object_path = self._object_path(bucket_name, object_name) + c = {"Key": object_name} + if not terse: + info = os.stat(object_path) + c.update({ + "LastModified": datetime.datetime.utcfromtimestamp( + info.st_mtime), + "Size": info.st_size, + }) + contents.append(c) + marker = object_name + self.render_xml({"ListBucketResult": { + "Name": bucket_name, + "Prefix": prefix, + "Marker": marker, + "MaxKeys": max_keys, + "IsTruncated": truncated, + "Contents": contents, + }}) + + def put(self, bucket_name): + path = os.path.abspath(os.path.join( + self.application.directory, bucket_name)) + if not path.startswith(self.application.directory) or \ + os.path.exists(path): + raise web.HTTPError(403) + os.makedirs(path) + self.finish() + + def delete(self, bucket_name): + path = os.path.abspath(os.path.join( + self.application.directory, bucket_name)) + if not path.startswith(self.application.directory) or \ + not os.path.isdir(path): + raise web.HTTPError(404) + if len(os.listdir(path)) > 0: + raise web.HTTPError(403) + os.rmdir(path) + self.set_status(204) + self.finish() + + +class ObjectHandler(BaseRequestHandler): + def get(self, bucket, object_name): + object_name = urllib.unquote(object_name) + path = self._object_path(bucket, object_name) + if not path.startswith(self.application.directory) or \ + not os.path.isfile(path): + raise web.HTTPError(404) + info = os.stat(path) + self.set_header("Content-Type", "application/unknown") + self.set_header("Last-Modified", datetime.datetime.utcfromtimestamp( + info.st_mtime)) + object_file = open(path, "rb") + try: + self.finish(object_file.read()) + finally: + object_file.close() + + def put(self, bucket, object_name): + object_name = urllib.unquote(object_name) + bucket_dir = os.path.abspath(os.path.join( + self.application.directory, bucket)) + if not bucket_dir.startswith(self.application.directory) or \ + not os.path.isdir(bucket_dir): + raise web.HTTPError(404) + path = self._object_path(bucket, object_name) + if not path.startswith(bucket_dir) or os.path.isdir(path): + raise web.HTTPError(403) + directory = os.path.dirname(path) + if not os.path.exists(directory): + os.makedirs(directory) + object_file = open(path, "w") + object_file.write(self.request.body) + object_file.close() + self.finish() + + def delete(self, bucket, object_name): + object_name = urllib.unquote(object_name) + path = self._object_path(bucket, object_name) + if not path.startswith(self.application.directory) or \ + not os.path.isfile(path): + raise web.HTTPError(404) + os.unlink(path) + self.set_status(204) + self.finish() diff --git a/lib/tornado-3.1.1/demos/twitter/home.html b/lib/tornado-3.1.1/demos/twitter/home.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/twitter/home.html @@ -0,0 +1,12 @@ + + + Tornado Twitter Demo + + +
    + {% for tweet in timeline %} +
  • {{ tweet['user']['screen_name'] }}: {{ tweet['text'] }}
  • + {% end %} +
+ + diff --git a/lib/tornado-3.1.1/demos/twitter/twitterdemo.py b/lib/tornado-3.1.1/demos/twitter/twitterdemo.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/twitter/twitterdemo.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +"""A simplistic Twitter viewer to demonstrate the use of TwitterMixin. + +To run this app, you must first register an application with Twitter: + 1) Go to https://dev.twitter.com/apps and create an application. + Your application must have a callback URL registered with Twitter. + It doesn't matter what it is, but it has to be there (Twitter won't + let you use localhost in a registered callback URL, but that won't stop + you from running this demo on localhost). + 2) Create a file called "secrets.cfg" and put your consumer key and + secret (which Twitter gives you when you register an app) in it: + twitter_consumer_key = 'asdf1234' + twitter_consumer_secret = 'qwer5678' + (you could also generate a random value for "cookie_secret" and put it + in the same file, although it's not necessary to run this demo) + 3) Run this program and go to http://localhost:8888 (by default) in your + browser. +""" + +import logging + +from tornado.auth import TwitterMixin +from tornado.escape import json_decode, json_encode +from tornado.ioloop import IOLoop +from tornado import gen +from tornado.options import define, options, parse_command_line, parse_config_file +from tornado.web import Application, RequestHandler, authenticated + +define('port', default=8888, help="port to listen on") +define('config_file', default='secrets.cfg', + help='filename for additional configuration') + +define('debug', default=False, group='application', + help="run in debug mode (with automatic reloading)") +# The following settings should probably be defined in secrets.cfg +define('twitter_consumer_key', type=str, group='application') +define('twitter_consumer_secret', type=str, group='application') +define('cookie_secret', type=str, group='application', + default='__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE__', + help="signing key for secure cookies") + +class BaseHandler(RequestHandler): + COOKIE_NAME = 'twitterdemo_user' + + def get_current_user(self): + user_json = self.get_secure_cookie(self.COOKIE_NAME) + if not user_json: + return None + return json_decode(user_json) + +class MainHandler(BaseHandler, TwitterMixin): + @authenticated + @gen.coroutine + def get(self): + timeline = yield self.twitter_request( + '/statuses/home_timeline', + access_token=self.current_user['access_token']) + self.render('home.html', timeline=timeline) + +class LoginHandler(BaseHandler, TwitterMixin): + @gen.coroutine + def get(self): + if self.get_argument('oauth_token', None): + user = yield self.get_authenticated_user() + self.set_secure_cookie(self.COOKIE_NAME, json_encode(user)) + self.redirect(self.get_argument('next', '/')) + else: + yield self.authorize_redirect(callback_uri=self.request.full_url()) + +class LogoutHandler(BaseHandler): + def get(self): + self.clear_cookie(self.COOKIE_NAME) + +def main(): + parse_command_line(final=False) + parse_config_file(options.config_file) + + app = Application( + [ + ('/', MainHandler), + ('/login', LoginHandler), + ('/logout', LogoutHandler), + ], + login_url='/login', + **options.group_dict('application')) + app.listen(options.port) + + logging.info('Listening on http://localhost:%d' % options.port) + IOLoop.instance().start() + +if __name__ == '__main__': + main() diff --git a/lib/tornado-3.1.1/demos/websocket/chatdemo.py b/lib/tornado-3.1.1/demos/websocket/chatdemo.py new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/demos/websocket/chatdemo.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Simplified chat demo for websockets. + +Authentication, error handling, etc are left as an exercise for the reader :) +""" + +import logging +import tornado.escape +import tornado.ioloop +import tornado.options +import tornado.web +import tornado.websocket +import os.path +import uuid + +from tornado.options import define, options + +define("port", default=8888, help="run on the given port", type=int) + + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + (r"/", MainHandler), + (r"/chatsocket", ChatSocketHandler), + ] + settings = dict( + cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", + template_path=os.path.join(os.path.dirname(__file__), "templates"), + static_path=os.path.join(os.path.dirname(__file__), "static"), + xsrf_cookies=True, + ) + tornado.web.Application.__init__(self, handlers, **settings) + + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.render("index.html", messages=ChatSocketHandler.cache) + +class ChatSocketHandler(tornado.websocket.WebSocketHandler): + waiters = set() + cache = [] + cache_size = 200 + + def allow_draft76(self): + # for iOS 5.0 Safari + return True + + def open(self): + ChatSocketHandler.waiters.add(self) + + def on_close(self): + ChatSocketHandler.waiters.remove(self) + + @classmethod + def update_cache(cls, chat): + cls.cache.append(chat) + if len(cls.cache) > cls.cache_size: + cls.cache = cls.cache[-cls.cache_size:] + + @classmethod + def send_updates(cls, chat): + logging.info("sending message to %d waiters", len(cls.waiters)) + for waiter in cls.waiters: + try: + waiter.write_message(chat) + except: + logging.error("Error sending message", exc_info=True) + + def on_message(self, message): + logging.info("got message %r", message) + parsed = tornado.escape.json_decode(message) + chat = { + "id": str(uuid.uuid4()), + "body": parsed["body"], + } + chat["html"] = tornado.escape.to_basestring( + self.render_string("message.html", message=chat)) + + ChatSocketHandler.update_cache(chat) + ChatSocketHandler.send_updates(chat) + + +def main(): + tornado.options.parse_command_line() + app = Application() + app.listen(options.port) + tornado.ioloop.IOLoop.instance().start() + + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/demos/websocket/static/chat.css b/lib/tornado-3.1.1/demos/websocket/static/chat.css new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/websocket/static/chat.css @@ -0,0 +1,56 @@ +/* + * Copyright 2009 FriendFeed + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + background: white; + margin: 10px; +} + +body, +input { + font-family: sans-serif; + font-size: 10pt; + color: black; +} + +table { + border-collapse: collapse; + border: 0; +} + +td { + border: 0; + padding: 0; +} + +#body { + position: absolute; + bottom: 10px; + left: 10px; +} + +#input { + margin-top: 0.5em; +} + +#inbox .message { + padding-top: 0.25em; +} + +#nav { + float: right; + z-index: 99; +} diff --git a/lib/tornado-3.1.1/demos/websocket/static/chat.js b/lib/tornado-3.1.1/demos/websocket/static/chat.js new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/websocket/static/chat.js @@ -0,0 +1,68 @@ +// Copyright 2009 FriendFeed +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +$(document).ready(function() { + if (!window.console) window.console = {}; + if (!window.console.log) window.console.log = function() {}; + + $("#messageform").live("submit", function() { + newMessage($(this)); + return false; + }); + $("#messageform").live("keypress", function(e) { + if (e.keyCode == 13) { + newMessage($(this)); + return false; + } + }); + $("#message").select(); + updater.start(); +}); + +function newMessage(form) { + var message = form.formToDict(); + updater.socket.send(JSON.stringify(message)); + form.find("input[type=text]").val("").select(); +} + +jQuery.fn.formToDict = function() { + var fields = this.serializeArray(); + var json = {} + for (var i = 0; i < fields.length; i++) { + json[fields[i].name] = fields[i].value; + } + if (json.next) delete json.next; + return json; +}; + +var updater = { + socket: null, + + start: function() { + var url = "ws://" + location.host + "/chatsocket"; + updater.socket = new WebSocket(url); + updater.socket.onmessage = function(event) { + updater.showMessage(JSON.parse(event.data)); + } + }, + + showMessage: function(message) { + var existing = $("#m" + message.id); + if (existing.length > 0) return; + var node = $(message.html); + node.hide(); + $("#inbox").append(node); + node.slideDown(); + } +}; diff --git a/lib/tornado-3.1.1/demos/websocket/templates/index.html b/lib/tornado-3.1.1/demos/websocket/templates/index.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/websocket/templates/index.html @@ -0,0 +1,33 @@ + + + + + Tornado Chat Demo + + + +
+
+ {% for message in messages %} + {% include "message.html" %} + {% end %} +
+
+
+ + + + + +
+ + + {% module xsrf_form_html() %} +
+
+
+
+ + + + diff --git a/lib/tornado-3.1.1/demos/websocket/templates/message.html b/lib/tornado-3.1.1/demos/websocket/templates/message.html new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/demos/websocket/templates/message.html @@ -0,0 +1,1 @@ +
{% module linkify(message["body"]) %}
diff --git a/lib/tornado-3.1.1/runtests.sh b/lib/tornado-3.1.1/runtests.sh new file mode 100755 --- /dev/null +++ b/lib/tornado-3.1.1/runtests.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Run the Tornado test suite. +# +# Also consider using tox, which uses virtualenv to run the test suite +# under multiple versions of python. +# +# This script requires that `python` is python 2.x; to run the tests under +# python 3 tornado must be installed so that 2to3 is run. The easiest +# way to run the tests under python 3 is with tox: "tox -e py32". + +cd $(dirname $0) + +# "python -m" differs from "python tornado/test/runtests.py" in how it sets +# up the default python path. "python -m" uses the current directory, +# while "python file.py" uses the directory containing "file.py" (which is +# not what you want if file.py appears within a package you want to import +# from) +python -m tornado.test.runtests "$@" diff --git a/lib/tornado-3.1.1/setup.cfg b/lib/tornado-3.1.1/setup.cfg new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/setup.cfg @@ -0,0 +1,5 @@ +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/lib/tornado-3.1.1/setup.py b/lib/tornado-3.1.1/setup.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/setup.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import distutils.core +import sys +# Importing setuptools adds some features like "setup.py develop", but +# it's optional so swallow the error if it's not there. +try: + import setuptools +except ImportError: + pass + +kwargs = {} + +version = "3.1.1" + +with open('README.rst') as f: + long_description = f.read() + +distutils.core.setup( + name="tornado", + version=version, + packages = ["tornado", "tornado.test", "tornado.platform"], + package_data = { + "tornado": ["ca-certificates.crt"], + # data files need to be listed both here (which determines what gets + # installed) and in MANIFEST.in (which determines what gets included + # in the sdist tarball) + "tornado.test": [ + "README", + "csv_translations/fr_FR.csv", + "gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo", + "gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po", + "options_test.cfg", + "static/robots.txt", + "static/dir/index.html", + "templates/utf8.html", + "test.crt", + "test.key", + ], + }, + author="Facebook", + author_email="python-tornado at googlegroups.com", + url="http://www.tornadoweb.org/", + license="http://www.apache.org/licenses/LICENSE-2.0", + description="Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.", + classifiers=[ + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + ], + long_description=long_description, + **kwargs +) diff --git a/lib/tornado-3.1.1/tornado.egg-info/PKG-INFO b/lib/tornado-3.1.1/tornado.egg-info/PKG-INFO new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado.egg-info/PKG-INFO @@ -0,0 +1,135 @@ +Metadata-Version: 1.1 +Name: tornado +Version: 3.1.1 +Summary: Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +Home-page: http://www.tornadoweb.org/ +Author: Facebook +Author-email: python-tornado at googlegroups.com +License: http://www.apache.org/licenses/LICENSE-2.0 +Description: Tornado Web Server + ================== + + `Tornado `_ is a Python web framework and + asynchronous networking library, originally developed at `FriendFeed + `_. By using non-blocking network I/O, Tornado + can scale to tens of thousands of open connections, making it ideal for + `long polling `_, + `WebSockets `_, and other + applications that require a long-lived connection to each user. + + + Quick links + ----------- + + * `Documentation `_ + * `Source (github) `_ + * `Mailing list `_ + * `Wiki `_ + + Hello, world + ------------ + + Here is a simple "Hello, world" example web app for Tornado:: + + import tornado.ioloop + import tornado.web + + class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + + application = tornado.web.Application([ + (r"/", MainHandler), + ]) + + if __name__ == "__main__": + application.listen(8888) + tornado.ioloop.IOLoop.instance().start() + + This example does not use any of Tornado's asynchronous features; for + that see this `simple chat room + `_. + + Installation + ------------ + + **Automatic installation**:: + + pip install tornado + + Tornado is listed in `PyPI `_ and + can be installed with ``pip`` or ``easy_install``. Note that the + source distribution includes demo applications that are not present + when Tornado is installed in this way, so you may wish to download a + copy of the source tarball as well. + + **Manual installation**: Download the latest source from `PyPI + `_. + + .. parsed-literal:: + + tar xvzf tornado-$VERSION.tar.gz + cd tornado-$VERSION + python setup.py build + sudo python setup.py install + + The Tornado source code is `hosted on GitHub + `_. + + **Prerequisites**: Tornado runs on Python 2.6, 2.7, 3.2, and 3.3. It has + no strict dependencies outside the Python standard library, although some + features may require one of the following libraries: + + * `unittest2 `_ is needed to run + Tornado's test suite on Python 2.6 (it is unnecessary on more recent + versions of Python) + * `concurrent.futures `_ is the + recommended thread pool for use with Tornado and enables the use of + ``tornado.netutil.ThreadedResolver``. It is needed only on Python 2; + Python 3 includes this package in the standard library. + * `pycurl `_ is used by the optional + ``tornado.curl_httpclient``. Libcurl version 7.18.2 or higher is required; + version 7.21.1 or higher is recommended. + * `Twisted `_ may be used with the classes in + `tornado.platform.twisted`. + * `pycares `_ is an alternative + non-blocking DNS resolver that can be used when threads are not + appropriate. + * `Monotime `_ adds support for + a monotonic clock, which improves reliability in environments + where clock adjustments are frequent. No longer needed in Python 3.3. + + **Platforms**: Tornado should run on any Unix-like platform, although + for the best performance and scalability only Linux (with ``epoll``) + and BSD (with ``kqueue``) are recommended (even though Mac OS X is + derived from BSD and supports kqueue, its networking performance is + generally poor so it is recommended only for development use). + + Discussion and support + ---------------------- + + You can discuss Tornado on `the Tornado developer mailing list + `_, and report bugs on + the `GitHub issue tracker + `_. Links to additional + resources can be found on the `Tornado wiki + `_. + + Tornado is one of `Facebook's open source technologies + `_. It is available under + the `Apache License, Version 2.0 + `_. + + This web site and all documentation is licensed under `Creative + Commons 3.0 `_. + +Platform: UNKNOWN +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy diff --git a/lib/tornado-3.1.1/tornado.egg-info/SOURCES.txt b/lib/tornado-3.1.1/tornado.egg-info/SOURCES.txt new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado.egg-info/SOURCES.txt @@ -0,0 +1,131 @@ +MANIFEST.in +README.rst +runtests.sh +setup.py +demos/appengine/README +demos/appengine/app.yaml +demos/appengine/blog.py +demos/appengine/static/blog.css +demos/appengine/templates/archive.html +demos/appengine/templates/base.html +demos/appengine/templates/compose.html +demos/appengine/templates/entry.html +demos/appengine/templates/feed.xml +demos/appengine/templates/home.html +demos/appengine/templates/modules/entry.html +demos/auth/authdemo.py +demos/benchmark/benchmark.py +demos/benchmark/chunk_benchmark.py +demos/benchmark/stack_context_benchmark.py +demos/benchmark/template_benchmark.py +demos/blog/README +demos/blog/blog.py +demos/blog/schema.sql +demos/blog/static/blog.css +demos/blog/templates/archive.html +demos/blog/templates/base.html +demos/blog/templates/compose.html +demos/blog/templates/entry.html +demos/blog/templates/feed.xml +demos/blog/templates/home.html +demos/blog/templates/modules/entry.html +demos/chat/chatdemo.py +demos/chat/static/chat.css +demos/chat/static/chat.js +demos/chat/templates/index.html +demos/chat/templates/message.html +demos/facebook/README +demos/facebook/facebook.py +demos/facebook/static/facebook.css +demos/facebook/static/facebook.js +demos/facebook/templates/stream.html +demos/facebook/templates/modules/post.html +demos/helloworld/helloworld.py +demos/s3server/s3server.py +demos/twitter/home.html +demos/twitter/twitterdemo.py +demos/websocket/chatdemo.py +demos/websocket/static/chat.css +demos/websocket/static/chat.js +demos/websocket/templates/index.html +demos/websocket/templates/message.html +tornado/__init__.py +tornado/auth.py +tornado/autoreload.py +tornado/ca-certificates.crt +tornado/concurrent.py +tornado/curl_httpclient.py +tornado/escape.py +tornado/gen.py +tornado/httpclient.py +tornado/httpserver.py +tornado/httputil.py +tornado/ioloop.py +tornado/iostream.py +tornado/locale.py +tornado/log.py +tornado/netutil.py +tornado/options.py +tornado/process.py +tornado/simple_httpclient.py +tornado/stack_context.py +tornado/tcpserver.py +tornado/template.py +tornado/testing.py +tornado/util.py +tornado/web.py +tornado/websocket.py +tornado/wsgi.py +tornado.egg-info/PKG-INFO +tornado.egg-info/SOURCES.txt +tornado.egg-info/dependency_links.txt +tornado.egg-info/top_level.txt +tornado/platform/__init__.py +tornado/platform/auto.py +tornado/platform/caresresolver.py +tornado/platform/common.py +tornado/platform/epoll.py +tornado/platform/interface.py +tornado/platform/kqueue.py +tornado/platform/posix.py +tornado/platform/select.py +tornado/platform/twisted.py +tornado/platform/windows.py +tornado/test/README +tornado/test/__init__.py +tornado/test/auth_test.py +tornado/test/concurrent_test.py +tornado/test/curl_httpclient_test.py +tornado/test/escape_test.py +tornado/test/gen_test.py +tornado/test/httpclient_test.py +tornado/test/httpserver_test.py +tornado/test/httputil_test.py +tornado/test/import_test.py +tornado/test/ioloop_test.py +tornado/test/iostream_test.py +tornado/test/locale_test.py +tornado/test/log_test.py +tornado/test/netutil_test.py +tornado/test/options_test.cfg +tornado/test/options_test.py +tornado/test/process_test.py +tornado/test/runtests.py +tornado/test/simple_httpclient_test.py +tornado/test/stack_context_test.py +tornado/test/template_test.py +tornado/test/test.crt +tornado/test/test.key +tornado/test/testing_test.py +tornado/test/twisted_test.py +tornado/test/util.py +tornado/test/util_test.py +tornado/test/web_test.py +tornado/test/websocket_test.py +tornado/test/wsgi_test.py +tornado/test/csv_translations/fr_FR.csv +tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo +tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po +tornado/test/static/robots.txt +tornado/test/static/dir/index.html +tornado/test/templates/utf8.html \ No newline at end of file diff --git a/lib/tornado-3.1.1/tornado.egg-info/dependency_links.txt b/lib/tornado-3.1.1/tornado.egg-info/dependency_links.txt new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado.egg-info/dependency_links.txt @@ -0,0 +1,1 @@ + diff --git a/lib/tornado-3.1.1/tornado.egg-info/top_level.txt b/lib/tornado-3.1.1/tornado.egg-info/top_level.txt new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado.egg-info/top_level.txt @@ -0,0 +1,1 @@ +tornado diff --git a/lib/tornado-3.1.1/tornado/__init__.py b/lib/tornado-3.1.1/tornado/__init__.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/__init__.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""The Tornado web server and tools.""" + +from __future__ import absolute_import, division, print_function, with_statement + +# version is a human-readable version number. + +# version_info is a four-tuple for programmatic comparison. The first +# three numbers are the components of the version number. The fourth +# is zero for an official release, positive for a development branch, +# or negative for a release candidate or beta (after the base version +# number has been incremented) +version = "3.1.1" +version_info = (3, 1, 1, 0) diff --git a/lib/tornado-3.1.1/tornado/auth.py b/lib/tornado-3.1.1/tornado/auth.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/auth.py @@ -0,0 +1,1378 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""This module contains implementations of various third-party +authentication schemes. + +All the classes in this file are class mixins designed to be used with +the `tornado.web.RequestHandler` class. They are used in two ways: + +* On a login handler, use methods such as ``authenticate_redirect()``, + ``authorize_redirect()``, and ``get_authenticated_user()`` to + establish the user's identity and store authentication tokens to your + database and/or cookies. +* In non-login handlers, use methods such as ``facebook_request()`` + or ``twitter_request()`` to use the authentication tokens to make + requests to the respective services. + +They all take slightly different arguments due to the fact all these +services implement authentication and authorization slightly differently. +See the individual service classes below for complete documentation. + +Example usage for Google OpenID:: + + class GoogleLoginHandler(tornado.web.RequestHandler, + tornado.auth.GoogleMixin): + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + if self.get_argument("openid.mode", None): + user = yield self.get_authenticated_user() + # Save the user with e.g. set_secure_cookie() + else: + yield self.authenticate_redirect() +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import base64 +import binascii +import functools +import hashlib +import hmac +import time +import uuid + +from tornado.concurrent import Future, chain_future, return_future +from tornado import gen +from tornado import httpclient +from tornado import escape +from tornado.httputil import url_concat +from tornado.log import gen_log +from tornado.util import bytes_type, u, unicode_type, ArgReplacer + +try: + import urlparse # py2 +except ImportError: + import urllib.parse as urlparse # py3 + +try: + import urllib.parse as urllib_parse # py3 +except ImportError: + import urllib as urllib_parse # py2 + + +class AuthError(Exception): + pass + + +def _auth_future_to_callback(callback, future): + try: + result = future.result() + except AuthError as e: + gen_log.warning(str(e)) + result = None + callback(result) + + +def _auth_return_future(f): + """Similar to tornado.concurrent.return_future, but uses the auth + module's legacy callback interface. + + Note that when using this decorator the ``callback`` parameter + inside the function will actually be a future. + """ + replacer = ArgReplacer(f, 'callback') + + @functools.wraps(f) + def wrapper(*args, **kwargs): + future = Future() + callback, args, kwargs = replacer.replace(future, args, kwargs) + if callback is not None: + future.add_done_callback( + functools.partial(_auth_future_to_callback, callback)) + f(*args, **kwargs) + return future + return wrapper + + +class OpenIdMixin(object): + """Abstract implementation of OpenID and Attribute Exchange. + + See `GoogleMixin` below for a customized example (which also + includes OAuth support). + + Class attributes: + + * ``_OPENID_ENDPOINT``: the identity provider's URI. + """ + @return_future + def authenticate_redirect(self, callback_uri=None, + ax_attrs=["name", "email", "language", "username"], + callback=None): + """Redirects to the authentication URL for this service. + + After authentication, the service will redirect back to the given + callback URI with additional parameters including ``openid.mode``. + + We request the given attributes for the authenticated user by + default (name, email, language, and username). If you don't need + all those attributes for your app, you can request fewer with + the ax_attrs keyword argument. + + .. versionchanged:: 3.1 + Returns a `.Future` and takes an optional callback. These are + not strictly necessary as this method is synchronous, + but they are supplied for consistency with + `OAuthMixin.authorize_redirect`. + """ + callback_uri = callback_uri or self.request.uri + args = self._openid_args(callback_uri, ax_attrs=ax_attrs) + self.redirect(self._OPENID_ENDPOINT + "?" + urllib_parse.urlencode(args)) + callback() + + @_auth_return_future + def get_authenticated_user(self, callback, http_client=None): + """Fetches the authenticated user data upon redirect. + + This method should be called by the handler that receives the + redirect from the `authenticate_redirect()` method (which is + often the same as the one that calls it; in that case you would + call `get_authenticated_user` if the ``openid.mode`` parameter + is present and `authenticate_redirect` if it is not). + + The result of this method will generally be used to set a cookie. + """ + # Verify the OpenID response via direct request to the OP + args = dict((k, v[-1]) for k, v in self.request.arguments.items()) + args["openid.mode"] = u("check_authentication") + url = self._OPENID_ENDPOINT + if http_client is None: + http_client = self.get_auth_http_client() + http_client.fetch(url, self.async_callback( + self._on_authentication_verified, callback), + method="POST", body=urllib_parse.urlencode(args)) + + def _openid_args(self, callback_uri, ax_attrs=[], oauth_scope=None): + url = urlparse.urljoin(self.request.full_url(), callback_uri) + args = { + "openid.ns": "http://specs.openid.net/auth/2.0", + "openid.claimed_id": + "http://specs.openid.net/auth/2.0/identifier_select", + "openid.identity": + "http://specs.openid.net/auth/2.0/identifier_select", + "openid.return_to": url, + "openid.realm": urlparse.urljoin(url, '/'), + "openid.mode": "checkid_setup", + } + if ax_attrs: + args.update({ + "openid.ns.ax": "http://openid.net/srv/ax/1.0", + "openid.ax.mode": "fetch_request", + }) + ax_attrs = set(ax_attrs) + required = [] + if "name" in ax_attrs: + ax_attrs -= set(["name", "firstname", "fullname", "lastname"]) + required += ["firstname", "fullname", "lastname"] + args.update({ + "openid.ax.type.firstname": + "http://axschema.org/namePerson/first", + "openid.ax.type.fullname": + "http://axschema.org/namePerson", + "openid.ax.type.lastname": + "http://axschema.org/namePerson/last", + }) + known_attrs = { + "email": "http://axschema.org/contact/email", + "language": "http://axschema.org/pref/language", + "username": "http://axschema.org/namePerson/friendly", + } + for name in ax_attrs: + args["openid.ax.type." + name] = known_attrs[name] + required.append(name) + args["openid.ax.required"] = ",".join(required) + if oauth_scope: + args.update({ + "openid.ns.oauth": + "http://specs.openid.net/extensions/oauth/1.0", + "openid.oauth.consumer": self.request.host.split(":")[0], + "openid.oauth.scope": oauth_scope, + }) + return args + + def _on_authentication_verified(self, future, response): + if response.error or b"is_valid:true" not in response.body: + future.set_exception(AuthError( + "Invalid OpenID response: %s" % (response.error or + response.body))) + return + + # Make sure we got back at least an email from attribute exchange + ax_ns = None + for name in self.request.arguments: + if name.startswith("openid.ns.") and \ + self.get_argument(name) == u("http://openid.net/srv/ax/1.0"): + ax_ns = name[10:] + break + + def get_ax_arg(uri): + if not ax_ns: + return u("") + prefix = "openid." + ax_ns + ".type." + ax_name = None + for name in self.request.arguments.keys(): + if self.get_argument(name) == uri and name.startswith(prefix): + part = name[len(prefix):] + ax_name = "openid." + ax_ns + ".value." + part + break + if not ax_name: + return u("") + return self.get_argument(ax_name, u("")) + + email = get_ax_arg("http://axschema.org/contact/email") + name = get_ax_arg("http://axschema.org/namePerson") + first_name = get_ax_arg("http://axschema.org/namePerson/first") + last_name = get_ax_arg("http://axschema.org/namePerson/last") + username = get_ax_arg("http://axschema.org/namePerson/friendly") + locale = get_ax_arg("http://axschema.org/pref/language").lower() + user = dict() + name_parts = [] + if first_name: + user["first_name"] = first_name + name_parts.append(first_name) + if last_name: + user["last_name"] = last_name + name_parts.append(last_name) + if name: + user["name"] = name + elif name_parts: + user["name"] = u(" ").join(name_parts) + elif email: + user["name"] = email.split("@")[0] + if email: + user["email"] = email + if locale: + user["locale"] = locale + if username: + user["username"] = username + claimed_id = self.get_argument("openid.claimed_id", None) + if claimed_id: + user["claimed_id"] = claimed_id + future.set_result(user) + + def get_auth_http_client(self): + """Returns the `.AsyncHTTPClient` instance to be used for auth requests. + + May be overridden by subclasses to use an HTTP client other than + the default. + """ + return httpclient.AsyncHTTPClient() + + +class OAuthMixin(object): + """Abstract implementation of OAuth 1.0 and 1.0a. + + See `TwitterMixin` and `FriendFeedMixin` below for example implementations, + or `GoogleMixin` for an OAuth/OpenID hybrid. + + Class attributes: + + * ``_OAUTH_AUTHORIZE_URL``: The service's OAuth authorization url. + * ``_OAUTH_ACCESS_TOKEN_URL``: The service's OAuth access token url. + * ``_OAUTH_VERSION``: May be either "1.0" or "1.0a". + * ``_OAUTH_NO_CALLBACKS``: Set this to True if the service requires + advance registration of callbacks. + + Subclasses must also override the `_oauth_get_user_future` and + `_oauth_consumer_token` methods. + """ + @return_future + def authorize_redirect(self, callback_uri=None, extra_params=None, + http_client=None, callback=None): + """Redirects the user to obtain OAuth authorization for this service. + + The ``callback_uri`` may be omitted if you have previously + registered a callback URI with the third-party service. For + some sevices (including Friendfeed), you must use a + previously-registered callback URI and cannot specify a + callback via this method. + + This method sets a cookie called ``_oauth_request_token`` which is + subsequently used (and cleared) in `get_authenticated_user` for + security purposes. + + Note that this method is asynchronous, although it calls + `.RequestHandler.finish` for you so it may not be necessary + to pass a callback or use the `.Future` it returns. However, + if this method is called from a function decorated with + `.gen.coroutine`, you must call it with ``yield`` to keep the + response from being closed prematurely. + + .. versionchanged:: 3.1 + Now returns a `.Future` and takes an optional callback, for + compatibility with `.gen.coroutine`. + """ + if callback_uri and getattr(self, "_OAUTH_NO_CALLBACKS", False): + raise Exception("This service does not support oauth_callback") + if http_client is None: + http_client = self.get_auth_http_client() + if getattr(self, "_OAUTH_VERSION", "1.0a") == "1.0a": + http_client.fetch( + self._oauth_request_token_url(callback_uri=callback_uri, + extra_params=extra_params), + self.async_callback( + self._on_request_token, + self._OAUTH_AUTHORIZE_URL, + callback_uri, + callback)) + else: + http_client.fetch( + self._oauth_request_token_url(), + self.async_callback( + self._on_request_token, self._OAUTH_AUTHORIZE_URL, + callback_uri, + callback)) + + @_auth_return_future + def get_authenticated_user(self, callback, http_client=None): + """Gets the OAuth authorized user and access token. + + This method should be called from the handler for your + OAuth callback URL to complete the registration process. We run the + callback with the authenticated user dictionary. This dictionary + will contain an ``access_key`` which can be used to make authorized + requests to this service on behalf of the user. The dictionary will + also contain other fields such as ``name``, depending on the service + used. + """ + future = callback + request_key = escape.utf8(self.get_argument("oauth_token")) + oauth_verifier = self.get_argument("oauth_verifier", None) + request_cookie = self.get_cookie("_oauth_request_token") + if not request_cookie: + future.set_exception(AuthError( + "Missing OAuth request token cookie")) + return + self.clear_cookie("_oauth_request_token") + cookie_key, cookie_secret = [base64.b64decode(escape.utf8(i)) for i in request_cookie.split("|")] + if cookie_key != request_key: + future.set_exception(AuthError( + "Request token does not match cookie")) + return + token = dict(key=cookie_key, secret=cookie_secret) + if oauth_verifier: + token["verifier"] = oauth_verifier + if http_client is None: + http_client = self.get_auth_http_client() + http_client.fetch(self._oauth_access_token_url(token), + self.async_callback(self._on_access_token, callback)) + + def _oauth_request_token_url(self, callback_uri=None, extra_params=None): + consumer_token = self._oauth_consumer_token() + url = self._OAUTH_REQUEST_TOKEN_URL + args = dict( + oauth_consumer_key=escape.to_basestring(consumer_token["key"]), + oauth_signature_method="HMAC-SHA1", + oauth_timestamp=str(int(time.time())), + oauth_nonce=escape.to_basestring(binascii.b2a_hex(uuid.uuid4().bytes)), + oauth_version="1.0", + ) + if getattr(self, "_OAUTH_VERSION", "1.0a") == "1.0a": + if callback_uri == "oob": + args["oauth_callback"] = "oob" + elif callback_uri: + args["oauth_callback"] = urlparse.urljoin( + self.request.full_url(), callback_uri) + if extra_params: + args.update(extra_params) + signature = _oauth10a_signature(consumer_token, "GET", url, args) + else: + signature = _oauth_signature(consumer_token, "GET", url, args) + + args["oauth_signature"] = signature + return url + "?" + urllib_parse.urlencode(args) + + def _on_request_token(self, authorize_url, callback_uri, callback, + response): + if response.error: + raise Exception("Could not get request token: %s" % response.error) + request_token = _oauth_parse_response(response.body) + data = (base64.b64encode(escape.utf8(request_token["key"])) + b"|" + + base64.b64encode(escape.utf8(request_token["secret"]))) + self.set_cookie("_oauth_request_token", data) + args = dict(oauth_token=request_token["key"]) + if callback_uri == "oob": + self.finish(authorize_url + "?" + urllib_parse.urlencode(args)) + callback() + return + elif callback_uri: + args["oauth_callback"] = urlparse.urljoin( + self.request.full_url(), callback_uri) + self.redirect(authorize_url + "?" + urllib_parse.urlencode(args)) + callback() + + def _oauth_access_token_url(self, request_token): + consumer_token = self._oauth_consumer_token() + url = self._OAUTH_ACCESS_TOKEN_URL + args = dict( + oauth_consumer_key=escape.to_basestring(consumer_token["key"]), + oauth_token=escape.to_basestring(request_token["key"]), + oauth_signature_method="HMAC-SHA1", + oauth_timestamp=str(int(time.time())), + oauth_nonce=escape.to_basestring(binascii.b2a_hex(uuid.uuid4().bytes)), + oauth_version="1.0", + ) + if "verifier" in request_token: + args["oauth_verifier"] = request_token["verifier"] + + if getattr(self, "_OAUTH_VERSION", "1.0a") == "1.0a": + signature = _oauth10a_signature(consumer_token, "GET", url, args, + request_token) + else: + signature = _oauth_signature(consumer_token, "GET", url, args, + request_token) + + args["oauth_signature"] = signature + return url + "?" + urllib_parse.urlencode(args) + + def _on_access_token(self, future, response): + if response.error: + future.set_exception(AuthError("Could not fetch access token")) + return + + access_token = _oauth_parse_response(response.body) + self._oauth_get_user_future(access_token).add_done_callback( + self.async_callback(self._on_oauth_get_user, access_token, future)) + + def _oauth_consumer_token(self): + """Subclasses must override this to return their OAuth consumer keys. + + The return value should be a `dict` with keys ``key`` and ``secret``. + """ + raise NotImplementedError() + + @return_future + def _oauth_get_user_future(self, access_token, callback): + """Subclasses must override this to get basic information about the + user. + + Should return a `.Future` whose result is a dictionary + containing information about the user, which may have been + retrieved by using ``access_token`` to make a request to the + service. + + The access token will be added to the returned dictionary to make + the result of `get_authenticated_user`. + + For backwards compatibility, the callback-based ``_oauth_get_user`` + method is also supported. + """ + # By default, call the old-style _oauth_get_user, but new code + # should override this method instead. + self._oauth_get_user(access_token, callback) + + def _oauth_get_user(self, access_token, callback): + raise NotImplementedError() + + def _on_oauth_get_user(self, access_token, future, user_future): + if user_future.exception() is not None: + future.set_exception(user_future.exception()) + return + user = user_future.result() + if not user: + future.set_exception(AuthError("Error getting user")) + return + user["access_token"] = access_token + future.set_result(user) + + def _oauth_request_parameters(self, url, access_token, parameters={}, + method="GET"): + """Returns the OAuth parameters as a dict for the given request. + + parameters should include all POST arguments and query string arguments + that will be sent with the request. + """ + consumer_token = self._oauth_consumer_token() + base_args = dict( + oauth_consumer_key=escape.to_basestring(consumer_token["key"]), + oauth_token=escape.to_basestring(access_token["key"]), + oauth_signature_method="HMAC-SHA1", + oauth_timestamp=str(int(time.time())), + oauth_nonce=escape.to_basestring(binascii.b2a_hex(uuid.uuid4().bytes)), + oauth_version="1.0", + ) + args = {} + args.update(base_args) + args.update(parameters) + if getattr(self, "_OAUTH_VERSION", "1.0a") == "1.0a": + signature = _oauth10a_signature(consumer_token, method, url, args, + access_token) + else: + signature = _oauth_signature(consumer_token, method, url, args, + access_token) + base_args["oauth_signature"] = escape.to_basestring(signature) + return base_args + + def get_auth_http_client(self): + """Returns the `.AsyncHTTPClient` instance to be used for auth requests. + + May be overridden by subclasses to use an HTTP client other than + the default. + """ + return httpclient.AsyncHTTPClient() + + +class OAuth2Mixin(object): + """Abstract implementation of OAuth 2.0. + + See `FacebookGraphMixin` below for an example implementation. + + Class attributes: + + * ``_OAUTH_AUTHORIZE_URL``: The service's authorization url. + * ``_OAUTH_ACCESS_TOKEN_URL``: The service's access token url. + """ + @return_future + def authorize_redirect(self, redirect_uri=None, client_id=None, + client_secret=None, extra_params=None, + callback=None): + """Redirects the user to obtain OAuth authorization for this service. + + Some providers require that you register a redirect URL with + your application instead of passing one via this method. You + should call this method to log the user in, and then call + ``get_authenticated_user`` in the handler for your + redirect URL to complete the authorization process. + + .. versionchanged:: 3.1 + Returns a `.Future` and takes an optional callback. These are + not strictly necessary as this method is synchronous, + but they are supplied for consistency with + `OAuthMixin.authorize_redirect`. + """ + args = { + "redirect_uri": redirect_uri, + "client_id": client_id + } + if extra_params: + args.update(extra_params) + self.redirect( + url_concat(self._OAUTH_AUTHORIZE_URL, args)) + callback() + + def _oauth_request_token_url(self, redirect_uri=None, client_id=None, + client_secret=None, code=None, + extra_params=None): + url = self._OAUTH_ACCESS_TOKEN_URL + args = dict( + redirect_uri=redirect_uri, + code=code, + client_id=client_id, + client_secret=client_secret, + ) + if extra_params: + args.update(extra_params) + return url_concat(url, args) + + +class TwitterMixin(OAuthMixin): + """Twitter OAuth authentication. + + To authenticate with Twitter, register your application with + Twitter at http://twitter.com/apps. Then copy your Consumer Key + and Consumer Secret to the application + `~tornado.web.Application.settings` ``twitter_consumer_key`` and + ``twitter_consumer_secret``. Use this mixin on the handler for the + URL you registered as your application's callback URL. + + When your application is set up, you can use this mixin like this + to authenticate the user with Twitter and get access to their stream:: + + class TwitterLoginHandler(tornado.web.RequestHandler, + tornado.auth.TwitterMixin): + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + if self.get_argument("oauth_token", None): + user = yield self.get_authenticated_user() + # Save the user using e.g. set_secure_cookie() + else: + yield self.authorize_redirect() + + The user object returned by `~OAuthMixin.get_authenticated_user` + includes the attributes ``username``, ``name``, ``access_token``, + and all of the custom Twitter user attributes described at + https://dev.twitter.com/docs/api/1.1/get/users/show + """ + _OAUTH_REQUEST_TOKEN_URL = "https://api.twitter.com/oauth/request_token" + _OAUTH_ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token" + _OAUTH_AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize" + _OAUTH_AUTHENTICATE_URL = "https://api.twitter.com/oauth/authenticate" + _OAUTH_NO_CALLBACKS = False + _TWITTER_BASE_URL = "https://api.twitter.com/1.1" + + @return_future + def authenticate_redirect(self, callback_uri=None, callback=None): + """Just like `~OAuthMixin.authorize_redirect`, but + auto-redirects if authorized. + + This is generally the right interface to use if you are using + Twitter for single-sign on. + + .. versionchanged:: 3.1 + Now returns a `.Future` and takes an optional callback, for + compatibility with `.gen.coroutine`. + """ + http = self.get_auth_http_client() + http.fetch(self._oauth_request_token_url(callback_uri=callback_uri), + self.async_callback( + self._on_request_token, self._OAUTH_AUTHENTICATE_URL, + None, callback)) + + @_auth_return_future + def twitter_request(self, path, callback=None, access_token=None, + post_args=None, **args): + """Fetches the given API path, e.g., ``statuses/user_timeline/btaylor`` + + The path should not include the format or API version number. + (we automatically use JSON format and API version 1). + + If the request is a POST, ``post_args`` should be provided. Query + string arguments should be given as keyword arguments. + + All the Twitter methods are documented at http://dev.twitter.com/ + + Many methods require an OAuth access token which you can + obtain through `~OAuthMixin.authorize_redirect` and + `~OAuthMixin.get_authenticated_user`. The user returned through that + process includes an 'access_token' attribute that can be used + to make authenticated requests via this method. Example + usage:: + + class MainHandler(tornado.web.RequestHandler, + tornado.auth.TwitterMixin): + @tornado.web.authenticated + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + new_entry = yield self.twitter_request( + "/statuses/update", + post_args={"status": "Testing Tornado Web Server"}, + access_token=self.current_user["access_token"]) + if not new_entry: + # Call failed; perhaps missing permission? + yield self.authorize_redirect() + return + self.finish("Posted a message!") + + """ + if path.startswith('http:') or path.startswith('https:'): + # Raw urls are useful for e.g. search which doesn't follow the + # usual pattern: http://search.twitter.com/search.json + url = path + else: + url = self._TWITTER_BASE_URL + path + ".json" + # Add the OAuth resource request signature if we have credentials + if access_token: + all_args = {} + all_args.update(args) + all_args.update(post_args or {}) + method = "POST" if post_args is not None else "GET" + oauth = self._oauth_request_parameters( + url, access_token, all_args, method=method) + args.update(oauth) + if args: + url += "?" + urllib_parse.urlencode(args) + http = self.get_auth_http_client() + http_callback = self.async_callback(self._on_twitter_request, callback) + if post_args is not None: + http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), + callback=http_callback) + else: + http.fetch(url, callback=http_callback) + + def _on_twitter_request(self, future, response): + if response.error: + future.set_exception(AuthError( + "Error response %s fetching %s" % (response.error, + response.request.url))) + return + future.set_result(escape.json_decode(response.body)) + + def _oauth_consumer_token(self): + self.require_setting("twitter_consumer_key", "Twitter OAuth") + self.require_setting("twitter_consumer_secret", "Twitter OAuth") + return dict( + key=self.settings["twitter_consumer_key"], + secret=self.settings["twitter_consumer_secret"]) + + @gen.coroutine + def _oauth_get_user_future(self, access_token): + user = yield self.twitter_request( + "/account/verify_credentials", + access_token=access_token) + if user: + user["username"] = user["screen_name"] + raise gen.Return(user) + + +class FriendFeedMixin(OAuthMixin): + """FriendFeed OAuth authentication. + + To authenticate with FriendFeed, register your application with + FriendFeed at http://friendfeed.com/api/applications. Then copy + your Consumer Key and Consumer Secret to the application + `~tornado.web.Application.settings` ``friendfeed_consumer_key`` + and ``friendfeed_consumer_secret``. Use this mixin on the handler + for the URL you registered as your application's Callback URL. + + When your application is set up, you can use this mixin like this + to authenticate the user with FriendFeed and get access to their feed:: + + class FriendFeedLoginHandler(tornado.web.RequestHandler, + tornado.auth.FriendFeedMixin): + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + if self.get_argument("oauth_token", None): + user = yield self.get_authenticated_user() + # Save the user using e.g. set_secure_cookie() + else: + yield self.authorize_redirect() + + The user object returned by `~OAuthMixin.get_authenticated_user()` includes the + attributes ``username``, ``name``, and ``description`` in addition to + ``access_token``. You should save the access token with the user; + it is required to make requests on behalf of the user later with + `friendfeed_request()`. + """ + _OAUTH_VERSION = "1.0" + _OAUTH_REQUEST_TOKEN_URL = "https://friendfeed.com/account/oauth/request_token" + _OAUTH_ACCESS_TOKEN_URL = "https://friendfeed.com/account/oauth/access_token" + _OAUTH_AUTHORIZE_URL = "https://friendfeed.com/account/oauth/authorize" + _OAUTH_NO_CALLBACKS = True + _OAUTH_VERSION = "1.0" + + @_auth_return_future + def friendfeed_request(self, path, callback, access_token=None, + post_args=None, **args): + """Fetches the given relative API path, e.g., "/bret/friends" + + If the request is a POST, ``post_args`` should be provided. Query + string arguments should be given as keyword arguments. + + All the FriendFeed methods are documented at + http://friendfeed.com/api/documentation. + + Many methods require an OAuth access token which you can + obtain through `~OAuthMixin.authorize_redirect` and + `~OAuthMixin.get_authenticated_user`. The user returned + through that process includes an ``access_token`` attribute that + can be used to make authenticated requests via this + method. + + Example usage:: + + class MainHandler(tornado.web.RequestHandler, + tornado.auth.FriendFeedMixin): + @tornado.web.authenticated + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + new_entry = yield self.friendfeed_request( + "/entry", + post_args={"body": "Testing Tornado Web Server"}, + access_token=self.current_user["access_token"]) + + if not new_entry: + # Call failed; perhaps missing permission? + yield self.authorize_redirect() + return + self.finish("Posted a message!") + + """ + # Add the OAuth resource request signature if we have credentials + url = "http://friendfeed-api.com/v2" + path + if access_token: + all_args = {} + all_args.update(args) + all_args.update(post_args or {}) + method = "POST" if post_args is not None else "GET" + oauth = self._oauth_request_parameters( + url, access_token, all_args, method=method) + args.update(oauth) + if args: + url += "?" + urllib_parse.urlencode(args) + callback = self.async_callback(self._on_friendfeed_request, callback) + http = self.get_auth_http_client() + if post_args is not None: + http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), + callback=callback) + else: + http.fetch(url, callback=callback) + + def _on_friendfeed_request(self, future, response): + if response.error: + future.set_exception(AuthError( + "Error response %s fetching %s" % (response.error, + response.request.url))) + return + future.set_result(escape.json_decode(response.body)) + + def _oauth_consumer_token(self): + self.require_setting("friendfeed_consumer_key", "FriendFeed OAuth") + self.require_setting("friendfeed_consumer_secret", "FriendFeed OAuth") + return dict( + key=self.settings["friendfeed_consumer_key"], + secret=self.settings["friendfeed_consumer_secret"]) + + @gen.coroutine + def _oauth_get_user_future(self, access_token, callback): + user = yield self.friendfeed_request( + "/feedinfo/" + access_token["username"], + include="id,name,description", access_token=access_token) + if user: + user["username"] = user["id"] + callback(user) + + def _parse_user_response(self, callback, user): + if user: + user["username"] = user["id"] + callback(user) + + +class GoogleMixin(OpenIdMixin, OAuthMixin): + """Google Open ID / OAuth authentication. + + No application registration is necessary to use Google for + authentication or to access Google resources on behalf of a user. + + Google implements both OpenID and OAuth in a hybrid mode. If you + just need the user's identity, use + `~OpenIdMixin.authenticate_redirect`. If you need to make + requests to Google on behalf of the user, use + `authorize_redirect`. On return, parse the response with + `~OpenIdMixin.get_authenticated_user`. We send a dict containing + the values for the user, including ``email``, ``name``, and + ``locale``. + + Example usage:: + + class GoogleLoginHandler(tornado.web.RequestHandler, + tornado.auth.GoogleMixin): + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + if self.get_argument("openid.mode", None): + user = yield self.get_authenticated_user() + # Save the user with e.g. set_secure_cookie() + else: + yield self.authenticate_redirect() + """ + _OPENID_ENDPOINT = "https://www.google.com/accounts/o8/ud" + _OAUTH_ACCESS_TOKEN_URL = "https://www.google.com/accounts/OAuthGetAccessToken" + + @return_future + def authorize_redirect(self, oauth_scope, callback_uri=None, + ax_attrs=["name", "email", "language", "username"], + callback=None): + """Authenticates and authorizes for the given Google resource. + + Some of the available resources which can be used in the ``oauth_scope`` + argument are: + + * Gmail Contacts - http://www.google.com/m8/feeds/ + * Calendar - http://www.google.com/calendar/feeds/ + * Finance - http://finance.google.com/finance/feeds/ + + You can authorize multiple resources by separating the resource + URLs with a space. + + .. versionchanged:: 3.1 + Returns a `.Future` and takes an optional callback. These are + not strictly necessary as this method is synchronous, + but they are supplied for consistency with + `OAuthMixin.authorize_redirect`. + """ + callback_uri = callback_uri or self.request.uri + args = self._openid_args(callback_uri, ax_attrs=ax_attrs, + oauth_scope=oauth_scope) + self.redirect(self._OPENID_ENDPOINT + "?" + urllib_parse.urlencode(args)) + callback() + + @_auth_return_future + def get_authenticated_user(self, callback): + """Fetches the authenticated user data upon redirect.""" + # Look to see if we are doing combined OpenID/OAuth + oauth_ns = "" + for name, values in self.request.arguments.items(): + if name.startswith("openid.ns.") and \ + values[-1] == b"http://specs.openid.net/extensions/oauth/1.0": + oauth_ns = name[10:] + break + token = self.get_argument("openid." + oauth_ns + ".request_token", "") + if token: + http = self.get_auth_http_client() + token = dict(key=token, secret="") + http.fetch(self._oauth_access_token_url(token), + self.async_callback(self._on_access_token, callback)) + else: + chain_future(OpenIdMixin.get_authenticated_user(self), + callback) + + def _oauth_consumer_token(self): + self.require_setting("google_consumer_key", "Google OAuth") + self.require_setting("google_consumer_secret", "Google OAuth") + return dict( + key=self.settings["google_consumer_key"], + secret=self.settings["google_consumer_secret"]) + + def _oauth_get_user_future(self, access_token): + return OpenIdMixin.get_authenticated_user(self) + + +class FacebookMixin(object): + """Facebook Connect authentication. + + *Deprecated:* New applications should use `FacebookGraphMixin` + below instead of this class. This class does not support the + Future-based interface seen on other classes in this module. + + To authenticate with Facebook, register your application with + Facebook at http://www.facebook.com/developers/apps.php. Then + copy your API Key and Application Secret to the application settings + ``facebook_api_key`` and ``facebook_secret``. + + When your application is set up, you can use this mixin like this + to authenticate the user with Facebook:: + + class FacebookHandler(tornado.web.RequestHandler, + tornado.auth.FacebookMixin): + @tornado.web.asynchronous + def get(self): + if self.get_argument("session", None): + self.get_authenticated_user(self.async_callback(self._on_auth)) + return + yield self.authenticate_redirect() + + def _on_auth(self, user): + if not user: + raise tornado.web.HTTPError(500, "Facebook auth failed") + # Save the user using, e.g., set_secure_cookie() + + The user object returned by `get_authenticated_user` includes the + attributes ``facebook_uid`` and ``name`` in addition to session attributes + like ``session_key``. You should save the session key with the user; it is + required to make requests on behalf of the user later with + `facebook_request`. + """ + @return_future + def authenticate_redirect(self, callback_uri=None, cancel_uri=None, + extended_permissions=None, callback=None): + """Authenticates/installs this app for the current user. + + .. versionchanged:: 3.1 + Returns a `.Future` and takes an optional callback. These are + not strictly necessary as this method is synchronous, + but they are supplied for consistency with + `OAuthMixin.authorize_redirect`. + """ + self.require_setting("facebook_api_key", "Facebook Connect") + callback_uri = callback_uri or self.request.uri + args = { + "api_key": self.settings["facebook_api_key"], + "v": "1.0", + "fbconnect": "true", + "display": "page", + "next": urlparse.urljoin(self.request.full_url(), callback_uri), + "return_session": "true", + } + if cancel_uri: + args["cancel_url"] = urlparse.urljoin( + self.request.full_url(), cancel_uri) + if extended_permissions: + if isinstance(extended_permissions, (unicode_type, bytes_type)): + extended_permissions = [extended_permissions] + args["req_perms"] = ",".join(extended_permissions) + self.redirect("http://www.facebook.com/login.php?" + + urllib_parse.urlencode(args)) + callback() + + def authorize_redirect(self, extended_permissions, callback_uri=None, + cancel_uri=None, callback=None): + """Redirects to an authorization request for the given FB resource. + + The available resource names are listed at + http://wiki.developers.facebook.com/index.php/Extended_permission. + The most common resource types include: + + * publish_stream + * read_stream + * email + * sms + + extended_permissions can be a single permission name or a list of + names. To get the session secret and session key, call + get_authenticated_user() just as you would with + authenticate_redirect(). + + .. versionchanged:: 3.1 + Returns a `.Future` and takes an optional callback. These are + not strictly necessary as this method is synchronous, + but they are supplied for consistency with + `OAuthMixin.authorize_redirect`. + """ + return self.authenticate_redirect(callback_uri, cancel_uri, + extended_permissions, + callback=callback) + + def get_authenticated_user(self, callback): + """Fetches the authenticated Facebook user. + + The authenticated user includes the special Facebook attributes + 'session_key' and 'facebook_uid' in addition to the standard + user attributes like 'name'. + """ + self.require_setting("facebook_api_key", "Facebook Connect") + session = escape.json_decode(self.get_argument("session")) + self.facebook_request( + method="facebook.users.getInfo", + callback=self.async_callback( + self._on_get_user_info, callback, session), + session_key=session["session_key"], + uids=session["uid"], + fields="uid,first_name,last_name,name,locale,pic_square," + "profile_url,username") + + def facebook_request(self, method, callback, **args): + """Makes a Facebook API REST request. + + We automatically include the Facebook API key and signature, but + it is the callers responsibility to include 'session_key' and any + other required arguments to the method. + + The available Facebook methods are documented here: + http://wiki.developers.facebook.com/index.php/API + + Here is an example for the stream.get() method:: + + class MainHandler(tornado.web.RequestHandler, + tornado.auth.FacebookMixin): + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.facebook_request( + method="stream.get", + callback=self.async_callback(self._on_stream), + session_key=self.current_user["session_key"]) + + def _on_stream(self, stream): + if stream is None: + # Not authorized to read the stream yet? + self.redirect(self.authorize_redirect("read_stream")) + return + self.render("stream.html", stream=stream) + + """ + self.require_setting("facebook_api_key", "Facebook Connect") + self.require_setting("facebook_secret", "Facebook Connect") + if not method.startswith("facebook."): + method = "facebook." + method + args["api_key"] = self.settings["facebook_api_key"] + args["v"] = "1.0" + args["method"] = method + args["call_id"] = str(long(time.time() * 1e6)) + args["format"] = "json" + args["sig"] = self._signature(args) + url = "http://api.facebook.com/restserver.php?" + \ + urllib_parse.urlencode(args) + http = self.get_auth_http_client() + http.fetch(url, callback=self.async_callback( + self._parse_response, callback)) + + def _on_get_user_info(self, callback, session, users): + if users is None: + callback(None) + return + callback({ + "name": users[0]["name"], + "first_name": users[0]["first_name"], + "last_name": users[0]["last_name"], + "uid": users[0]["uid"], + "locale": users[0]["locale"], + "pic_square": users[0]["pic_square"], + "profile_url": users[0]["profile_url"], + "username": users[0].get("username"), + "session_key": session["session_key"], + "session_expires": session.get("expires"), + }) + + def _parse_response(self, callback, response): + if response.error: + gen_log.warning("HTTP error from Facebook: %s", response.error) + callback(None) + return + try: + json = escape.json_decode(response.body) + except Exception: + gen_log.warning("Invalid JSON from Facebook: %r", response.body) + callback(None) + return + if isinstance(json, dict) and json.get("error_code"): + gen_log.warning("Facebook error: %d: %r", json["error_code"], + json.get("error_msg")) + callback(None) + return + callback(json) + + def _signature(self, args): + parts = ["%s=%s" % (n, args[n]) for n in sorted(args.keys())] + body = "".join(parts) + self.settings["facebook_secret"] + if isinstance(body, unicode_type): + body = body.encode("utf-8") + return hashlib.md5(body).hexdigest() + + def get_auth_http_client(self): + """Returns the `.AsyncHTTPClient` instance to be used for auth requests. + + May be overridden by subclasses to use an HTTP client other than + the default. + """ + return httpclient.AsyncHTTPClient() + + +class FacebookGraphMixin(OAuth2Mixin): + """Facebook authentication using the new Graph API and OAuth2.""" + _OAUTH_ACCESS_TOKEN_URL = "https://graph.facebook.com/oauth/access_token?" + _OAUTH_AUTHORIZE_URL = "https://graph.facebook.com/oauth/authorize?" + _OAUTH_NO_CALLBACKS = False + _FACEBOOK_BASE_URL = "https://graph.facebook.com" + + @_auth_return_future + def get_authenticated_user(self, redirect_uri, client_id, client_secret, + code, callback, extra_fields=None): + """Handles the login for the Facebook user, returning a user object. + + Example usage:: + + class FacebookGraphLoginHandler(LoginHandler, tornado.auth.FacebookGraphMixin): + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + if self.get_argument("code", False): + user = yield self.get_authenticated_user( + redirect_uri='/auth/facebookgraph/', + client_id=self.settings["facebook_api_key"], + client_secret=self.settings["facebook_secret"], + code=self.get_argument("code")) + # Save the user with e.g. set_secure_cookie + else: + yield self.authorize_redirect( + redirect_uri='/auth/facebookgraph/', + client_id=self.settings["facebook_api_key"], + extra_params={"scope": "read_stream,offline_access"}) + """ + http = self.get_auth_http_client() + args = { + "redirect_uri": redirect_uri, + "code": code, + "client_id": client_id, + "client_secret": client_secret, + } + + fields = set(['id', 'name', 'first_name', 'last_name', + 'locale', 'picture', 'link']) + if extra_fields: + fields.update(extra_fields) + + http.fetch(self._oauth_request_token_url(**args), + self.async_callback(self._on_access_token, redirect_uri, client_id, + client_secret, callback, fields)) + + def _on_access_token(self, redirect_uri, client_id, client_secret, + future, fields, response): + if response.error: + future.set_exception(AuthError('Facebook auth error: %s' % str(response))) + return + + args = escape.parse_qs_bytes(escape.native_str(response.body)) + session = { + "access_token": args["access_token"][-1], + "expires": args.get("expires") + } + + self.facebook_request( + path="/me", + callback=self.async_callback( + self._on_get_user_info, future, session, fields), + access_token=session["access_token"], + fields=",".join(fields) + ) + + def _on_get_user_info(self, future, session, fields, user): + if user is None: + future.set_result(None) + return + + fieldmap = {} + for field in fields: + fieldmap[field] = user.get(field) + + fieldmap.update({"access_token": session["access_token"], "session_expires": session.get("expires")}) + future.set_result(fieldmap) + + @_auth_return_future + def facebook_request(self, path, callback, access_token=None, + post_args=None, **args): + """Fetches the given relative API path, e.g., "/btaylor/picture" + + If the request is a POST, ``post_args`` should be provided. Query + string arguments should be given as keyword arguments. + + An introduction to the Facebook Graph API can be found at + http://developers.facebook.com/docs/api + + Many methods require an OAuth access token which you can + obtain through `~OAuth2Mixin.authorize_redirect` and + `get_authenticated_user`. The user returned through that + process includes an ``access_token`` attribute that can be + used to make authenticated requests via this method. + + Example usage:: + + class MainHandler(tornado.web.RequestHandler, + tornado.auth.FacebookGraphMixin): + @tornado.web.authenticated + @tornado.web.asynchronous + @tornado.gen.coroutine + def get(self): + new_entry = yield self.facebook_request( + "/me/feed", + post_args={"message": "I am posting from my Tornado application!"}, + access_token=self.current_user["access_token"]) + + if not new_entry: + # Call failed; perhaps missing permission? + yield self.authorize_redirect() + return + self.finish("Posted a message!") + + The given path is relative to ``self._FACEBOOK_BASE_URL``, + by default "https://graph.facebook.com". + + .. versionchanged:: 3.1 + Added the ability to override ``self._FACEBOOK_BASE_URL``. + """ + url = self._FACEBOOK_BASE_URL + path + all_args = {} + if access_token: + all_args["access_token"] = access_token + all_args.update(args) + + if all_args: + url += "?" + urllib_parse.urlencode(all_args) + callback = self.async_callback(self._on_facebook_request, callback) + http = self.get_auth_http_client() + if post_args is not None: + http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), + callback=callback) + else: + http.fetch(url, callback=callback) + + def _on_facebook_request(self, future, response): + if response.error: + future.set_exception(AuthError("Error response %s fetching %s" % + (response.error, response.request.url))) + return + + future.set_result(escape.json_decode(response.body)) + + def get_auth_http_client(self): + """Returns the `.AsyncHTTPClient` instance to be used for auth requests. + + May be overridden by subclasses to use an HTTP client other than + the default. + """ + return httpclient.AsyncHTTPClient() + + +def _oauth_signature(consumer_token, method, url, parameters={}, token=None): + """Calculates the HMAC-SHA1 OAuth signature for the given request. + + See http://oauth.net/core/1.0/#signing_process + """ + parts = urlparse.urlparse(url) + scheme, netloc, path = parts[:3] + normalized_url = scheme.lower() + "://" + netloc.lower() + path + + base_elems = [] + base_elems.append(method.upper()) + base_elems.append(normalized_url) + base_elems.append("&".join("%s=%s" % (k, _oauth_escape(str(v))) + for k, v in sorted(parameters.items()))) + base_string = "&".join(_oauth_escape(e) for e in base_elems) + + key_elems = [escape.utf8(consumer_token["secret"])] + key_elems.append(escape.utf8(token["secret"] if token else "")) + key = b"&".join(key_elems) + + hash = hmac.new(key, escape.utf8(base_string), hashlib.sha1) + return binascii.b2a_base64(hash.digest())[:-1] + + +def _oauth10a_signature(consumer_token, method, url, parameters={}, token=None): + """Calculates the HMAC-SHA1 OAuth 1.0a signature for the given request. + + See http://oauth.net/core/1.0a/#signing_process + """ + parts = urlparse.urlparse(url) + scheme, netloc, path = parts[:3] + normalized_url = scheme.lower() + "://" + netloc.lower() + path + + base_elems = [] + base_elems.append(method.upper()) + base_elems.append(normalized_url) + base_elems.append("&".join("%s=%s" % (k, _oauth_escape(str(v))) + for k, v in sorted(parameters.items()))) + + base_string = "&".join(_oauth_escape(e) for e in base_elems) + key_elems = [escape.utf8(urllib_parse.quote(consumer_token["secret"], safe='~'))] + key_elems.append(escape.utf8(urllib_parse.quote(token["secret"], safe='~') if token else "")) + key = b"&".join(key_elems) + + hash = hmac.new(key, escape.utf8(base_string), hashlib.sha1) + return binascii.b2a_base64(hash.digest())[:-1] + + +def _oauth_escape(val): + if isinstance(val, unicode_type): + val = val.encode("utf-8") + return urllib_parse.quote(val, safe="~") + + +def _oauth_parse_response(body): + # I can't find an officially-defined encoding for oauth responses and + # have never seen anyone use non-ascii. Leave the response in a byte + # string for python 2, and use utf8 on python 3. + body = escape.native_str(body) + p = urlparse.parse_qs(body, keep_blank_values=False) + token = dict(key=p["oauth_token"][0], secret=p["oauth_token_secret"][0]) + + # Add the extra parameters the Provider included to the token + special = ("oauth_token", "oauth_token_secret") + token.update((k, p[k][0]) for k in p if k not in special) + return token diff --git a/lib/tornado-3.1.1/tornado/autoreload.py b/lib/tornado-3.1.1/tornado/autoreload.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/autoreload.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""xAutomatically restart the server when a source file is modified. + +Most applications should not access this module directly. Instead, pass the +keyword argument ``debug=True`` to the `tornado.web.Application` constructor. +This will enable autoreload mode as well as checking for changes to templates +and static resources. Note that restarting is a destructive operation +and any requests in progress will be aborted when the process restarts. + +This module can also be used as a command-line wrapper around scripts +such as unit test runners. See the `main` method for details. + +The command-line wrapper and Application debug modes can be used together. +This combination is encouraged as the wrapper catches syntax errors and +other import-time failures, while debug mode catches changes once +the server has started. + +This module depends on `.IOLoop`, so it will not work in WSGI applications +and Google App Engine. It also will not work correctly when `.HTTPServer`'s +multi-process mode is used. + +Reloading loses any Python interpreter command-line arguments (e.g. ``-u``) +because it re-executes Python using ``sys.executable`` and ``sys.argv``. +Additionally, modifying these variables will cause reloading to behave +incorrectly. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import os +import sys + +# sys.path handling +# ----------------- +# +# If a module is run with "python -m", the current directory (i.e. "") +# is automatically prepended to sys.path, but not if it is run as +# "path/to/file.py". The processing for "-m" rewrites the former to +# the latter, so subsequent executions won't have the same path as the +# original. +# +# Conversely, when run as path/to/file.py, the directory containing +# file.py gets added to the path, which can cause confusion as imports +# may become relative in spite of the future import. +# +# We address the former problem by setting the $PYTHONPATH environment +# variable before re-execution so the new process will see the correct +# path. We attempt to address the latter problem when tornado.autoreload +# is run as __main__, although we can't fix the general case because +# we cannot reliably reconstruct the original command line +# (http://bugs.python.org/issue14208). + +if __name__ == "__main__": + # This sys.path manipulation must come before our imports (as much + # as possible - if we introduced a tornado.sys or tornado.os + # module we'd be in trouble), or else our imports would become + # relative again despite the future import. + # + # There is a separate __main__ block at the end of the file to call main(). + if sys.path[0] == os.path.dirname(__file__): + del sys.path[0] + +import functools +import logging +import os +import pkgutil +import sys +import traceback +import types +import subprocess +import weakref + +from tornado import ioloop +from tornado.log import gen_log +from tornado import process +from tornado.util import exec_in + +try: + import signal +except ImportError: + signal = None + + +_watched_files = set() +_reload_hooks = [] +_reload_attempted = False +_io_loops = weakref.WeakKeyDictionary() + + +def start(io_loop=None, check_time=500): + """Begins watching source files for changes using the given `.IOLoop`. """ + io_loop = io_loop or ioloop.IOLoop.current() + if io_loop in _io_loops: + return + _io_loops[io_loop] = True + if len(_io_loops) > 1: + gen_log.warning("tornado.autoreload started more than once in the same process") + add_reload_hook(functools.partial(io_loop.close, all_fds=True)) + modify_times = {} + callback = functools.partial(_reload_on_update, modify_times) + scheduler = ioloop.PeriodicCallback(callback, check_time, io_loop=io_loop) + scheduler.start() + + +def wait(): + """Wait for a watched file to change, then restart the process. + + Intended to be used at the end of scripts like unit test runners, + to run the tests again after any source file changes (but see also + the command-line interface in `main`) + """ + io_loop = ioloop.IOLoop() + start(io_loop) + io_loop.start() + + +def watch(filename): + """Add a file to the watch list. + + All imported modules are watched by default. + """ + _watched_files.add(filename) + + +def add_reload_hook(fn): + """Add a function to be called before reloading the process. + + Note that for open file and socket handles it is generally + preferable to set the ``FD_CLOEXEC`` flag (using `fcntl` or + ``tornado.platform.auto.set_close_exec``) instead + of using a reload hook to close them. + """ + _reload_hooks.append(fn) + + +def _reload_on_update(modify_times): + if _reload_attempted: + # We already tried to reload and it didn't work, so don't try again. + return + if process.task_id() is not None: + # We're in a child process created by fork_processes. If child + # processes restarted themselves, they'd all restart and then + # all call fork_processes again. + return + for module in sys.modules.values(): + # Some modules play games with sys.modules (e.g. email/__init__.py + # in the standard library), and occasionally this can cause strange + # failures in getattr. Just ignore anything that's not an ordinary + # module. + if not isinstance(module, types.ModuleType): + continue + path = getattr(module, "__file__", None) + if not path: + continue + if path.endswith(".pyc") or path.endswith(".pyo"): + path = path[:-1] + _check_file(modify_times, path) + for path in _watched_files: + _check_file(modify_times, path) + + +def _check_file(modify_times, path): + try: + modified = os.stat(path).st_mtime + except Exception: + return + if path not in modify_times: + modify_times[path] = modified + return + if modify_times[path] != modified: + gen_log.info("%s modified; restarting server", path) + _reload() + + +def _reload(): + global _reload_attempted + _reload_attempted = True + for fn in _reload_hooks: + fn() + if hasattr(signal, "setitimer"): + # Clear the alarm signal set by + # ioloop.set_blocking_log_threshold so it doesn't fire + # after the exec. + signal.setitimer(signal.ITIMER_REAL, 0, 0) + # sys.path fixes: see comments at top of file. If sys.path[0] is an empty + # string, we were (probably) invoked with -m and the effective path + # is about to change on re-exec. Add the current directory to $PYTHONPATH + # to ensure that the new process sees the same path we did. + path_prefix = '.' + os.pathsep + if (sys.path[0] == '' and + not os.environ.get("PYTHONPATH", "").startswith(path_prefix)): + os.environ["PYTHONPATH"] = (path_prefix + + os.environ.get("PYTHONPATH", "")) + if sys.platform == 'win32': + # os.execv is broken on Windows and can't properly parse command line + # arguments and executable name if they contain whitespaces. subprocess + # fixes that behavior. + subprocess.Popen([sys.executable] + sys.argv) + sys.exit(0) + else: + try: + os.execv(sys.executable, [sys.executable] + sys.argv) + except OSError: + # Mac OS X versions prior to 10.6 do not support execv in + # a process that contains multiple threads. Instead of + # re-executing in the current process, start a new one + # and cause the current process to exit. This isn't + # ideal since the new process is detached from the parent + # terminal and thus cannot easily be killed with ctrl-C, + # but it's better than not being able to autoreload at + # all. + # Unfortunately the errno returned in this case does not + # appear to be consistent, so we can't easily check for + # this error specifically. + os.spawnv(os.P_NOWAIT, sys.executable, + [sys.executable] + sys.argv) + sys.exit(0) + +_USAGE = """\ +Usage: + python -m tornado.autoreload -m module.to.run [args...] + python -m tornado.autoreload path/to/script.py [args...] +""" + + +def main(): + """Command-line wrapper to re-run a script whenever its source changes. + + Scripts may be specified by filename or module name:: + + python -m tornado.autoreload -m tornado.test.runtests + python -m tornado.autoreload tornado/test/runtests.py + + Running a script with this wrapper is similar to calling + `tornado.autoreload.wait` at the end of the script, but this wrapper + can catch import-time problems like syntax errors that would otherwise + prevent the script from reaching its call to `wait`. + """ + original_argv = sys.argv + sys.argv = sys.argv[:] + if len(sys.argv) >= 3 and sys.argv[1] == "-m": + mode = "module" + module = sys.argv[2] + del sys.argv[1:3] + elif len(sys.argv) >= 2: + mode = "script" + script = sys.argv[1] + sys.argv = sys.argv[1:] + else: + print(_USAGE, file=sys.stderr) + sys.exit(1) + + try: + if mode == "module": + import runpy + runpy.run_module(module, run_name="__main__", alter_sys=True) + elif mode == "script": + with open(script) as f: + global __file__ + __file__ = script + # Use globals as our "locals" dictionary so that + # something that tries to import __main__ (e.g. the unittest + # module) will see the right things. + exec_in(f.read(), globals(), globals()) + except SystemExit as e: + logging.basicConfig() + gen_log.info("Script exited with status %s", e.code) + except Exception as e: + logging.basicConfig() + gen_log.warning("Script exited with uncaught exception", exc_info=True) + # If an exception occurred at import time, the file with the error + # never made it into sys.modules and so we won't know to watch it. + # Just to make sure we've covered everything, walk the stack trace + # from the exception and watch every file. + for (filename, lineno, name, line) in traceback.extract_tb(sys.exc_info()[2]): + watch(filename) + if isinstance(e, SyntaxError): + # SyntaxErrors are special: their innermost stack frame is fake + # so extract_tb won't see it and we have to get the filename + # from the exception object. + watch(e.filename) + else: + logging.basicConfig() + gen_log.info("Script exited normally") + # restore sys.argv so subsequent executions will include autoreload + sys.argv = original_argv + + if mode == 'module': + # runpy did a fake import of the module as __main__, but now it's + # no longer in sys.modules. Figure out where it is and watch it. + loader = pkgutil.get_loader(module) + if loader is not None: + watch(loader.get_filename()) + + wait() + + +if __name__ == "__main__": + # See also the other __main__ block at the top of the file, which modifies + # sys.path before our imports + main() diff --git a/lib/tornado-3.1.1/tornado/ca-certificates.crt b/lib/tornado-3.1.1/tornado/ca-certificates.crt new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/ca-certificates.crt @@ -0,0 +1,3576 @@ +# This file contains certificates of known certificate authorities +# for use with SimpleAsyncHTTPClient. +# +# It was copied from /etc/ssl/certs/ca-certificates.crt +# on a stock install of Ubuntu 11.04 (ca-certificates package +# version 20090814+nmu2ubuntu0.1). This data file is licensed +# under the MPL/GPL. +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV +BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK +EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq +b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow +djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx +EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG +9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa +F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 +eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV +Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB +k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 +ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV +dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO +txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD +VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD +QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY +S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ +mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR +qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE +TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe +1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG +UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v +U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN +AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw +MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD +VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM +BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m +cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws +ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx +8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ +s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c +9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V +pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ +pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC +aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y +CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ +6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG +A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 +MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF +AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob +sRQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw +gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv +bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv +b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05 +OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG +A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N +LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB +FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM +0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG +PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU +LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs +iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU ++/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB +Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k +qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir +vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ +w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8 +eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ +O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i +805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 +l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B +FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp +kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 +eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa +MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A +AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig +dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk +IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g +UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l +bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k +ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By +b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc +cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA +WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 +7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY +gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb +4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 +CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX +VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD +QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX +DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl +ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU +ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT +CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P +6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM +jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX +2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N +R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j +rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV +HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa +gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1 +bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 +ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy +YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl +ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl +cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 +L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx +CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV +HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ +KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo +Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2 +jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe +1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5 +mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc +tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx +ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf +WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK +xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE +zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F +5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv +OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz +ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME +lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG +Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q +gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k +Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy +MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV +p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw +BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl +5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi +3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ +QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ +2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN +I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL +553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q +10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN +uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv +b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU +cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv +RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M +ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 +1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz +dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl +IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy +bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq +SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD +VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha +Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg +cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu +ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD +QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp +bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP +aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ +spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB +Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O +BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 +PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ +bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt +YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD +aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT +IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB +BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw +cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 +dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB +BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w +NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 +Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W +WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN +HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN +b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw +NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS +zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ +KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb +adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK +Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj +V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ +hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx +MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ +H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr +SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj +mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD +qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 +D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy +r33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 +MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 +m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 +eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 +3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA +AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF +aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL +H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 +MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN +G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn +6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 +2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca +2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI +3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS +AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD +VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT +IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD +Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz +MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE +ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw +FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu +aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY +XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1 +gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4 +Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY +JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU +dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14 +cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr +SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG +A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx +OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy +Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l +dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw +cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh +bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU +aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B +CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY +q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G +A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL +0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ +UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp +cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg +Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD +EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w +HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD +VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw +cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 +dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG +SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U +aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC +AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp +bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF +BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 +6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I +3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y +AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw +TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 +/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ +jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms +Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF +Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw +Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW +w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE +Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD +2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 +MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV +BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy +dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ +ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII +0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI +uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI +hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 +YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc +1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB +wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL +EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO +VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx +OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j +b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1 +dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli +zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU +/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11 +S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/ +AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0 +dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 +cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG +AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW +HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea +w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU +58dzq6wf7iWbwBbtt8pb8BQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw +OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu +ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h +gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K +5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy +9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE +gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 +eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs +YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp +aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp +dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb +sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB +FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W ++sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 +uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf +tXncwKJrMiE3lvgOOBITRzcahirLer4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa +Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g +eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND +IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu +QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui +me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm +RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ +OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G +O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF +BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI +KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh +c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw +HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX +hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV +Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw +6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF +6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e +Pr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE +ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE +AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT +aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl +KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX +GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj +93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ +P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow +ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g +ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN +W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB +IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB +ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA +ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb +MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv +J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW +pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J +HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg +U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN +MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G +A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD +ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts +YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO +4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF +KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL +/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw +EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 +dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh +My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB +BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g +IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 +IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 +dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM +GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ +MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq +bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ +xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU +upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk +GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug +5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma +M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ +HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW +Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 +JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x +W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE +82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx +UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan +ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 +2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV +tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue +Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA +iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE +OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db +w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC +3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM +ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 +7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG +dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF +JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz +1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw +OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu +ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks +ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX +REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D +CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU +YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP +l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 +MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz +dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg +Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg +Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt +L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN +AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI +cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 +CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW +ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB +KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX +DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 +IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg +U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd +uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v +LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c +ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w +bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM +MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH +AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr +YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC +ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf +MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO +Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB +vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 +WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE +AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt +YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 +rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL +VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 +I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV +HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ +vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ +bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl +IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe +BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW +iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms +1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + diff --git a/lib/tornado-3.1.1/tornado/concurrent.py b/lib/tornado-3.1.1/tornado/concurrent.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/concurrent.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python +# +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Utilities for working with threads and ``Futures``. + +``Futures`` are a pattern for concurrent programming introduced in +Python 3.2 in the `concurrent.futures` package (this package has also +been backported to older versions of Python and can be installed with +``pip install futures``). Tornado will use `concurrent.futures.Future` if +it is available; otherwise it will use a compatible class defined in this +module. +""" +from __future__ import absolute_import, division, print_function, with_statement + +import functools +import sys + +from tornado.stack_context import ExceptionStackContext, wrap +from tornado.util import raise_exc_info, ArgReplacer + +try: + from concurrent import futures +except ImportError: + futures = None + + +class ReturnValueIgnoredError(Exception): + pass + + +class _DummyFuture(object): + def __init__(self): + self._done = False + self._result = None + self._exception = None + self._callbacks = [] + + def cancel(self): + return False + + def cancelled(self): + return False + + def running(self): + return not self._done + + def done(self): + return self._done + + def result(self, timeout=None): + self._check_done() + if self._exception: + raise self._exception + return self._result + + def exception(self, timeout=None): + self._check_done() + if self._exception: + return self._exception + else: + return None + + def add_done_callback(self, fn): + if self._done: + fn(self) + else: + self._callbacks.append(fn) + + def set_result(self, result): + self._result = result + self._set_done() + + def set_exception(self, exception): + self._exception = exception + self._set_done() + + def _check_done(self): + if not self._done: + raise Exception("DummyFuture does not support blocking for results") + + def _set_done(self): + self._done = True + for cb in self._callbacks: + # TODO: error handling + cb(self) + self._callbacks = None + +if futures is None: + Future = _DummyFuture +else: + Future = futures.Future + + +class TracebackFuture(Future): + """Subclass of `Future` which can store a traceback with + exceptions. + + The traceback is automatically available in Python 3, but in the + Python 2 futures backport this information is discarded. + """ + def __init__(self): + super(TracebackFuture, self).__init__() + self.__exc_info = None + + def exc_info(self): + return self.__exc_info + + def set_exc_info(self, exc_info): + """Traceback-aware replacement for + `~concurrent.futures.Future.set_exception`. + """ + self.__exc_info = exc_info + self.set_exception(exc_info[1]) + + def result(self): + if self.__exc_info is not None: + raise_exc_info(self.__exc_info) + else: + return super(TracebackFuture, self).result() + + +class DummyExecutor(object): + def submit(self, fn, *args, **kwargs): + future = TracebackFuture() + try: + future.set_result(fn(*args, **kwargs)) + except Exception: + future.set_exc_info(sys.exc_info()) + return future + + def shutdown(self, wait=True): + pass + +dummy_executor = DummyExecutor() + + +def run_on_executor(fn): + """Decorator to run a synchronous method asynchronously on an executor. + + The decorated method may be called with a ``callback`` keyword + argument and returns a future. + """ + @functools.wraps(fn) + def wrapper(self, *args, **kwargs): + callback = kwargs.pop("callback", None) + future = self.executor.submit(fn, self, *args, **kwargs) + if callback: + self.io_loop.add_future(future, + lambda future: callback(future.result())) + return future + return wrapper + + +_NO_RESULT = object() + + +def return_future(f): + """Decorator to make a function that returns via callback return a + `Future`. + + The wrapped function should take a ``callback`` keyword argument + and invoke it with one argument when it has finished. To signal failure, + the function can simply raise an exception (which will be + captured by the `.StackContext` and passed along to the ``Future``). + + From the caller's perspective, the callback argument is optional. + If one is given, it will be invoked when the function is complete + with `Future.result()` as an argument. If the function fails, the + callback will not be run and an exception will be raised into the + surrounding `.StackContext`. + + If no callback is given, the caller should use the ``Future`` to + wait for the function to complete (perhaps by yielding it in a + `.gen.engine` function, or passing it to `.IOLoop.add_future`). + + Usage:: + + @return_future + def future_func(arg1, arg2, callback): + # Do stuff (possibly asynchronous) + callback(result) + + @gen.engine + def caller(callback): + yield future_func(arg1, arg2) + callback() + + Note that ``@return_future`` and ``@gen.engine`` can be applied to the + same function, provided ``@return_future`` appears first. However, + consider using ``@gen.coroutine`` instead of this combination. + """ + replacer = ArgReplacer(f, 'callback') + + @functools.wraps(f) + def wrapper(*args, **kwargs): + future = TracebackFuture() + callback, args, kwargs = replacer.replace( + lambda value=_NO_RESULT: future.set_result(value), + args, kwargs) + + def handle_error(typ, value, tb): + future.set_exc_info((typ, value, tb)) + return True + exc_info = None + with ExceptionStackContext(handle_error): + try: + result = f(*args, **kwargs) + if result is not None: + raise ReturnValueIgnoredError( + "@return_future should not be used with functions " + "that return values") + except: + exc_info = sys.exc_info() + raise + if exc_info is not None: + # If the initial synchronous part of f() raised an exception, + # go ahead and raise it to the caller directly without waiting + # for them to inspect the Future. + raise_exc_info(exc_info) + + # If the caller passed in a callback, schedule it to be called + # when the future resolves. It is important that this happens + # just before we return the future, or else we risk confusing + # stack contexts with multiple exceptions (one here with the + # immediate exception, and again when the future resolves and + # the callback triggers its exception by calling future.result()). + if callback is not None: + def run_callback(future): + result = future.result() + if result is _NO_RESULT: + callback() + else: + callback(future.result()) + future.add_done_callback(wrap(run_callback)) + return future + return wrapper + + +def chain_future(a, b): + """Chain two futures together so that when one completes, so does the other. + + The result (success or failure) of ``a`` will be copied to ``b``. + """ + def copy(future): + assert future is a + if (isinstance(a, TracebackFuture) and isinstance(b, TracebackFuture) + and a.exc_info() is not None): + b.set_exc_info(a.exc_info()) + elif a.exception() is not None: + b.set_exception(a.exception()) + else: + b.set_result(a.result()) + a.add_done_callback(copy) diff --git a/lib/tornado-3.1.1/tornado/curl_httpclient.py b/lib/tornado-3.1.1/tornado/curl_httpclient.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/curl_httpclient.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Non-blocking HTTP client implementation using pycurl.""" + +from __future__ import absolute_import, division, print_function, with_statement + +import collections +import logging +import pycurl +import threading +import time + +from tornado import httputil +from tornado import ioloop +from tornado.log import gen_log +from tornado import stack_context + +from tornado.escape import utf8, native_str +from tornado.httpclient import HTTPResponse, HTTPError, AsyncHTTPClient, main +from tornado.util import bytes_type + +try: + from io import BytesIO # py3 +except ImportError: + from cStringIO import StringIO as BytesIO # py2 + + +class CurlAsyncHTTPClient(AsyncHTTPClient): + def initialize(self, io_loop, max_clients=10, defaults=None): + super(CurlAsyncHTTPClient, self).initialize(io_loop, defaults=defaults) + self._multi = pycurl.CurlMulti() + self._multi.setopt(pycurl.M_TIMERFUNCTION, self._set_timeout) + self._multi.setopt(pycurl.M_SOCKETFUNCTION, self._handle_socket) + self._curls = [_curl_create() for i in range(max_clients)] + self._free_list = self._curls[:] + self._requests = collections.deque() + self._fds = {} + self._timeout = None + + try: + self._socket_action = self._multi.socket_action + except AttributeError: + # socket_action is found in pycurl since 7.18.2 (it's been + # in libcurl longer than that but wasn't accessible to + # python). + gen_log.warning("socket_action method missing from pycurl; " + "falling back to socket_all. Upgrading " + "libcurl and pycurl will improve performance") + self._socket_action = \ + lambda fd, action: self._multi.socket_all() + + # libcurl has bugs that sometimes cause it to not report all + # relevant file descriptors and timeouts to TIMERFUNCTION/ + # SOCKETFUNCTION. Mitigate the effects of such bugs by + # forcing a periodic scan of all active requests. + self._force_timeout_callback = ioloop.PeriodicCallback( + self._handle_force_timeout, 1000, io_loop=io_loop) + self._force_timeout_callback.start() + + # Work around a bug in libcurl 7.29.0: Some fields in the curl + # multi object are initialized lazily, and its destructor will + # segfault if it is destroyed without having been used. Add + # and remove a dummy handle to make sure everything is + # initialized. + dummy_curl_handle = pycurl.Curl() + self._multi.add_handle(dummy_curl_handle) + self._multi.remove_handle(dummy_curl_handle) + + def close(self): + self._force_timeout_callback.stop() + if self._timeout is not None: + self.io_loop.remove_timeout(self._timeout) + for curl in self._curls: + curl.close() + self._multi.close() + self._closed = True + super(CurlAsyncHTTPClient, self).close() + + def fetch_impl(self, request, callback): + self._requests.append((request, callback)) + self._process_queue() + self._set_timeout(0) + + def _handle_socket(self, event, fd, multi, data): + """Called by libcurl when it wants to change the file descriptors + it cares about. + """ + event_map = { + pycurl.POLL_NONE: ioloop.IOLoop.NONE, + pycurl.POLL_IN: ioloop.IOLoop.READ, + pycurl.POLL_OUT: ioloop.IOLoop.WRITE, + pycurl.POLL_INOUT: ioloop.IOLoop.READ | ioloop.IOLoop.WRITE + } + if event == pycurl.POLL_REMOVE: + if fd in self._fds: + self.io_loop.remove_handler(fd) + del self._fds[fd] + else: + ioloop_event = event_map[event] + # libcurl sometimes closes a socket and then opens a new + # one using the same FD without giving us a POLL_NONE in + # between. This is a problem with the epoll IOLoop, + # because the kernel can tell when a socket is closed and + # removes it from the epoll automatically, causing future + # update_handler calls to fail. Since we can't tell when + # this has happened, always use remove and re-add + # instead of update. + if fd in self._fds: + self.io_loop.remove_handler(fd) + self.io_loop.add_handler(fd, self._handle_events, + ioloop_event) + self._fds[fd] = ioloop_event + + def _set_timeout(self, msecs): + """Called by libcurl to schedule a timeout.""" + if self._timeout is not None: + self.io_loop.remove_timeout(self._timeout) + self._timeout = self.io_loop.add_timeout( + self.io_loop.time() + msecs / 1000.0, self._handle_timeout) + + def _handle_events(self, fd, events): + """Called by IOLoop when there is activity on one of our + file descriptors. + """ + action = 0 + if events & ioloop.IOLoop.READ: + action |= pycurl.CSELECT_IN + if events & ioloop.IOLoop.WRITE: + action |= pycurl.CSELECT_OUT + while True: + try: + ret, num_handles = self._socket_action(fd, action) + except pycurl.error as e: + ret = e.args[0] + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + self._finish_pending_requests() + + def _handle_timeout(self): + """Called by IOLoop when the requested timeout has passed.""" + with stack_context.NullContext(): + self._timeout = None + while True: + try: + ret, num_handles = self._socket_action( + pycurl.SOCKET_TIMEOUT, 0) + except pycurl.error as e: + ret = e.args[0] + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + self._finish_pending_requests() + + # In theory, we shouldn't have to do this because curl will + # call _set_timeout whenever the timeout changes. However, + # sometimes after _handle_timeout we will need to reschedule + # immediately even though nothing has changed from curl's + # perspective. This is because when socket_action is + # called with SOCKET_TIMEOUT, libcurl decides internally which + # timeouts need to be processed by using a monotonic clock + # (where available) while tornado uses python's time.time() + # to decide when timeouts have occurred. When those clocks + # disagree on elapsed time (as they will whenever there is an + # NTP adjustment), tornado might call _handle_timeout before + # libcurl is ready. After each timeout, resync the scheduled + # timeout with libcurl's current state. + new_timeout = self._multi.timeout() + if new_timeout >= 0: + self._set_timeout(new_timeout) + + def _handle_force_timeout(self): + """Called by IOLoop periodically to ask libcurl to process any + events it may have forgotten about. + """ + with stack_context.NullContext(): + while True: + try: + ret, num_handles = self._multi.socket_all() + except pycurl.error as e: + ret = e.args[0] + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + self._finish_pending_requests() + + def _finish_pending_requests(self): + """Process any requests that were completed by the last + call to multi.socket_action. + """ + while True: + num_q, ok_list, err_list = self._multi.info_read() + for curl in ok_list: + self._finish(curl) + for curl, errnum, errmsg in err_list: + self._finish(curl, errnum, errmsg) + if num_q == 0: + break + self._process_queue() + + def _process_queue(self): + with stack_context.NullContext(): + while True: + started = 0 + while self._free_list and self._requests: + started += 1 + curl = self._free_list.pop() + (request, callback) = self._requests.popleft() + curl.info = { + "headers": httputil.HTTPHeaders(), + "buffer": BytesIO(), + "request": request, + "callback": callback, + "curl_start_time": time.time(), + } + # Disable IPv6 to mitigate the effects of this bug + # on curl versions <= 7.21.0 + # http://sourceforge.net/tracker/?func=detail&aid=3017819&group_id=976&atid=100976 + if pycurl.version_info()[2] <= 0x71500: # 7.21.0 + curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4) + _curl_setup_request(curl, request, curl.info["buffer"], + curl.info["headers"]) + self._multi.add_handle(curl) + + if not started: + break + + def _finish(self, curl, curl_error=None, curl_message=None): + info = curl.info + curl.info = None + self._multi.remove_handle(curl) + self._free_list.append(curl) + buffer = info["buffer"] + if curl_error: + error = CurlError(curl_error, curl_message) + code = error.code + effective_url = None + buffer.close() + buffer = None + else: + error = None + code = curl.getinfo(pycurl.HTTP_CODE) + effective_url = curl.getinfo(pycurl.EFFECTIVE_URL) + buffer.seek(0) + # the various curl timings are documented at + # http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html + time_info = dict( + queue=info["curl_start_time"] - info["request"].start_time, + namelookup=curl.getinfo(pycurl.NAMELOOKUP_TIME), + connect=curl.getinfo(pycurl.CONNECT_TIME), + pretransfer=curl.getinfo(pycurl.PRETRANSFER_TIME), + starttransfer=curl.getinfo(pycurl.STARTTRANSFER_TIME), + total=curl.getinfo(pycurl.TOTAL_TIME), + redirect=curl.getinfo(pycurl.REDIRECT_TIME), + ) + try: + info["callback"](HTTPResponse( + request=info["request"], code=code, headers=info["headers"], + buffer=buffer, effective_url=effective_url, error=error, + request_time=time.time() - info["curl_start_time"], + time_info=time_info)) + except Exception: + self.handle_callback_exception(info["callback"]) + + def handle_callback_exception(self, callback): + self.io_loop.handle_callback_exception(callback) + + +class CurlError(HTTPError): + def __init__(self, errno, message): + HTTPError.__init__(self, 599, message) + self.errno = errno + + +def _curl_create(): + curl = pycurl.Curl() + if gen_log.isEnabledFor(logging.DEBUG): + curl.setopt(pycurl.VERBOSE, 1) + curl.setopt(pycurl.DEBUGFUNCTION, _curl_debug) + return curl + + +def _curl_setup_request(curl, request, buffer, headers): + curl.setopt(pycurl.URL, native_str(request.url)) + + # libcurl's magic "Expect: 100-continue" behavior causes delays + # with servers that don't support it (which include, among others, + # Google's OpenID endpoint). Additionally, this behavior has + # a bug in conjunction with the curl_multi_socket_action API + # (https://sourceforge.net/tracker/?func=detail&atid=100976&aid=3039744&group_id=976), + # which increases the delays. It's more trouble than it's worth, + # so just turn off the feature (yes, setting Expect: to an empty + # value is the official way to disable this) + if "Expect" not in request.headers: + request.headers["Expect"] = "" + + # libcurl adds Pragma: no-cache by default; disable that too + if "Pragma" not in request.headers: + request.headers["Pragma"] = "" + + # Request headers may be either a regular dict or HTTPHeaders object + if isinstance(request.headers, httputil.HTTPHeaders): + curl.setopt(pycurl.HTTPHEADER, + [native_str("%s: %s" % i) for i in request.headers.get_all()]) + else: + curl.setopt(pycurl.HTTPHEADER, + [native_str("%s: %s" % i) for i in request.headers.items()]) + + if request.header_callback: + curl.setopt(pycurl.HEADERFUNCTION, request.header_callback) + else: + curl.setopt(pycurl.HEADERFUNCTION, + lambda line: _curl_header_callback(headers, line)) + if request.streaming_callback: + write_function = request.streaming_callback + else: + write_function = buffer.write + if bytes_type is str: # py2 + curl.setopt(pycurl.WRITEFUNCTION, write_function) + else: # py3 + # Upstream pycurl doesn't support py3, but ubuntu 12.10 includes + # a fork/port. That version has a bug in which it passes unicode + # strings instead of bytes to the WRITEFUNCTION. This means that + # if you use a WRITEFUNCTION (which tornado always does), you cannot + # download arbitrary binary data. This needs to be fixed in the + # ported pycurl package, but in the meantime this lambda will + # make it work for downloading (utf8) text. + curl.setopt(pycurl.WRITEFUNCTION, lambda s: write_function(utf8(s))) + curl.setopt(pycurl.FOLLOWLOCATION, request.follow_redirects) + curl.setopt(pycurl.MAXREDIRS, request.max_redirects) + curl.setopt(pycurl.CONNECTTIMEOUT_MS, int(1000 * request.connect_timeout)) + curl.setopt(pycurl.TIMEOUT_MS, int(1000 * request.request_timeout)) + if request.user_agent: + curl.setopt(pycurl.USERAGENT, native_str(request.user_agent)) + else: + curl.setopt(pycurl.USERAGENT, "Mozilla/5.0 (compatible; pycurl)") + if request.network_interface: + curl.setopt(pycurl.INTERFACE, request.network_interface) + if request.use_gzip: + curl.setopt(pycurl.ENCODING, "gzip,deflate") + else: + curl.setopt(pycurl.ENCODING, "none") + if request.proxy_host and request.proxy_port: + curl.setopt(pycurl.PROXY, request.proxy_host) + curl.setopt(pycurl.PROXYPORT, request.proxy_port) + if request.proxy_username: + credentials = '%s:%s' % (request.proxy_username, + request.proxy_password) + curl.setopt(pycurl.PROXYUSERPWD, credentials) + else: + curl.setopt(pycurl.PROXY, '') + if request.validate_cert: + curl.setopt(pycurl.SSL_VERIFYPEER, 1) + curl.setopt(pycurl.SSL_VERIFYHOST, 2) + else: + curl.setopt(pycurl.SSL_VERIFYPEER, 0) + curl.setopt(pycurl.SSL_VERIFYHOST, 0) + if request.ca_certs is not None: + curl.setopt(pycurl.CAINFO, request.ca_certs) + else: + # There is no way to restore pycurl.CAINFO to its default value + # (Using unsetopt makes it reject all certificates). + # I don't see any way to read the default value from python so it + # can be restored later. We'll have to just leave CAINFO untouched + # if no ca_certs file was specified, and require that if any + # request uses a custom ca_certs file, they all must. + pass + + if request.allow_ipv6 is False: + # Curl behaves reasonably when DNS resolution gives an ipv6 address + # that we can't reach, so allow ipv6 unless the user asks to disable. + # (but see version check in _process_queue above) + curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4) + + # Set the request method through curl's irritating interface which makes + # up names for almost every single method + curl_options = { + "GET": pycurl.HTTPGET, + "POST": pycurl.POST, + "PUT": pycurl.UPLOAD, + "HEAD": pycurl.NOBODY, + } + custom_methods = set(["DELETE", "OPTIONS", "PATCH"]) + for o in curl_options.values(): + curl.setopt(o, False) + if request.method in curl_options: + curl.unsetopt(pycurl.CUSTOMREQUEST) + curl.setopt(curl_options[request.method], True) + elif request.allow_nonstandard_methods or request.method in custom_methods: + curl.setopt(pycurl.CUSTOMREQUEST, request.method) + else: + raise KeyError('unknown method ' + request.method) + + # Handle curl's cryptic options for every individual HTTP method + if request.method in ("POST", "PUT"): + request_buffer = BytesIO(utf8(request.body)) + curl.setopt(pycurl.READFUNCTION, request_buffer.read) + if request.method == "POST": + def ioctl(cmd): + if cmd == curl.IOCMD_RESTARTREAD: + request_buffer.seek(0) + curl.setopt(pycurl.IOCTLFUNCTION, ioctl) + curl.setopt(pycurl.POSTFIELDSIZE, len(request.body)) + else: + curl.setopt(pycurl.INFILESIZE, len(request.body)) + + if request.auth_username is not None: + userpwd = "%s:%s" % (request.auth_username, request.auth_password or '') + + if request.auth_mode is None or request.auth_mode == "basic": + curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC) + elif request.auth_mode == "digest": + curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_DIGEST) + else: + raise ValueError("Unsupported auth_mode %s" % request.auth_mode) + + curl.setopt(pycurl.USERPWD, native_str(userpwd)) + gen_log.debug("%s %s (username: %r)", request.method, request.url, + request.auth_username) + else: + curl.unsetopt(pycurl.USERPWD) + gen_log.debug("%s %s", request.method, request.url) + + if request.client_cert is not None: + curl.setopt(pycurl.SSLCERT, request.client_cert) + + if request.client_key is not None: + curl.setopt(pycurl.SSLKEY, request.client_key) + + if threading.activeCount() > 1: + # libcurl/pycurl is not thread-safe by default. When multiple threads + # are used, signals should be disabled. This has the side effect + # of disabling DNS timeouts in some environments (when libcurl is + # not linked against ares), so we don't do it when there is only one + # thread. Applications that use many short-lived threads may need + # to set NOSIGNAL manually in a prepare_curl_callback since + # there may not be any other threads running at the time we call + # threading.activeCount. + curl.setopt(pycurl.NOSIGNAL, 1) + if request.prepare_curl_callback is not None: + request.prepare_curl_callback(curl) + + +def _curl_header_callback(headers, header_line): + # header_line as returned by curl includes the end-of-line characters. + header_line = header_line.strip() + if header_line.startswith("HTTP/"): + headers.clear() + return + if not header_line: + return + headers.parse_line(header_line) + + +def _curl_debug(debug_type, debug_msg): + debug_types = ('I', '<', '>', '<', '>') + if debug_type == 0: + gen_log.debug('%s', debug_msg.strip()) + elif debug_type in (1, 2): + for line in debug_msg.splitlines(): + gen_log.debug('%s %s', debug_types[debug_type], line) + elif debug_type == 4: + gen_log.debug('%s %r', debug_types[debug_type], debug_msg) + +if __name__ == "__main__": + AsyncHTTPClient.configure(CurlAsyncHTTPClient) + main() diff --git a/lib/tornado-3.1.1/tornado/escape.py b/lib/tornado-3.1.1/tornado/escape.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/escape.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Escaping/unescaping methods for HTML, JSON, URLs, and others. + +Also includes a few other miscellaneous string manipulation functions that +have crept in over time. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import re +import sys + +from tornado.util import bytes_type, unicode_type, basestring_type, u + +try: + from urllib.parse import parse_qs as _parse_qs # py3 +except ImportError: + from urlparse import parse_qs as _parse_qs # Python 2.6+ + +try: + import htmlentitydefs # py2 +except ImportError: + import html.entities as htmlentitydefs # py3 + +try: + import urllib.parse as urllib_parse # py3 +except ImportError: + import urllib as urllib_parse # py2 + +import json + +try: + unichr +except NameError: + unichr = chr + +_XHTML_ESCAPE_RE = re.compile('[&<>"]') +_XHTML_ESCAPE_DICT = {'&': '&', '<': '<', '>': '>', '"': '"'} + + +def xhtml_escape(value): + """Escapes a string so it is valid within HTML or XML.""" + return _XHTML_ESCAPE_RE.sub(lambda match: _XHTML_ESCAPE_DICT[match.group(0)], + to_basestring(value)) + + +def xhtml_unescape(value): + """Un-escapes an XML-escaped string.""" + return re.sub(r"&(#?)(\w+?);", _convert_entity, _unicode(value)) + + +# The fact that json_encode wraps json.dumps is an implementation detail. +# Please see https://github.com/facebook/tornado/pull/706 +# before sending a pull request that adds **kwargs to this function. +def json_encode(value): + """JSON-encodes the given Python object.""" + # JSON permits but does not require forward slashes to be escaped. + # This is useful when json data is emitted in a tags from prematurely terminating + # the javscript. Some json libraries do this escaping by default, + # although python's standard library does not, so we do it here. + # http://stackoverflow.com/questions/1580647/json-why-are-forward-slashes-escaped + return json.dumps(value).replace("?@\[\]^`{|}~\s]))|(?:\((?:[^\s&()]|&|")*\)))+)""")) + + +def linkify(text, shorten=False, extra_params="", + require_protocol=False, permitted_protocols=["http", "https"]): + """Converts plain text into HTML with links. + + For example: ``linkify("Hello http://tornadoweb.org!")`` would return + ``Hello http://tornadoweb.org!`` + + Parameters: + + * ``shorten``: Long urls will be shortened for display. + + * ``extra_params``: Extra text to include in the link tag, or a callable + taking the link as an argument and returning the extra text + e.g. ``linkify(text, extra_params='rel="nofollow" class="external"')``, + or:: + + def extra_params_cb(url): + if url.startswith("http://example.com"): + return 'class="internal"' + else: + return 'class="external" rel="nofollow"' + linkify(text, extra_params=extra_params_cb) + + * ``require_protocol``: Only linkify urls which include a protocol. If + this is False, urls such as www.facebook.com will also be linkified. + + * ``permitted_protocols``: List (or set) of protocols which should be + linkified, e.g. ``linkify(text, permitted_protocols=["http", "ftp", + "mailto"])``. It is very unsafe to include protocols such as + ``javascript``. + """ + if extra_params and not callable(extra_params): + extra_params = " " + extra_params.strip() + + def make_link(m): + url = m.group(1) + proto = m.group(2) + if require_protocol and not proto: + return url # not protocol, no linkify + + if proto and proto not in permitted_protocols: + return url # bad protocol, no linkify + + href = m.group(1) + if not proto: + href = "http://" + href # no proto specified, use http + + if callable(extra_params): + params = " " + extra_params(href).strip() + else: + params = extra_params + + # clip long urls. max_len is just an approximation + max_len = 30 + if shorten and len(url) > max_len: + before_clip = url + if proto: + proto_len = len(proto) + 1 + len(m.group(3) or "") # +1 for : + else: + proto_len = 0 + + parts = url[proto_len:].split("/") + if len(parts) > 1: + # Grab the whole host part plus the first bit of the path + # The path is usually not that interesting once shortened + # (no more slug, etc), so it really just provides a little + # extra indication of shortening. + url = url[:proto_len] + parts[0] + "/" + \ + parts[1][:8].split('?')[0].split('.')[0] + + if len(url) > max_len * 1.5: # still too long + url = url[:max_len] + + if url != before_clip: + amp = url.rfind('&') + # avoid splitting html char entities + if amp > max_len - 5: + url = url[:amp] + url += "..." + + if len(url) >= len(before_clip): + url = before_clip + else: + # full url is visible on mouse-over (for those who don't + # have a status bar, such as Safari by default) + params += ' title="%s"' % href + + return u('%s') % (href, params, url) + + # First HTML-escape so that our strings are all safe. + # The regex is modified to avoid character entites other than & so + # that we won't pick up ", etc. + text = _unicode(xhtml_escape(text)) + return _URL_RE.sub(make_link, text) + + +def _convert_entity(m): + if m.group(1) == "#": + try: + return unichr(int(m.group(2))) + except ValueError: + return "&#%s;" % m.group(2) + try: + return _HTML_UNICODE_MAP[m.group(2)] + except KeyError: + return "&%s;" % m.group(2) + + +def _build_unicode_map(): + unicode_map = {} + for name, value in htmlentitydefs.name2codepoint.items(): + unicode_map[name] = unichr(value) + return unicode_map + +_HTML_UNICODE_MAP = _build_unicode_map() diff --git a/lib/tornado-3.1.1/tornado/gen.py b/lib/tornado-3.1.1/tornado/gen.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/gen.py @@ -0,0 +1,561 @@ +"""``tornado.gen`` is a generator-based interface to make it easier to +work in an asynchronous environment. Code using the ``gen`` module +is technically asynchronous, but it is written as a single generator +instead of a collection of separate functions. + +For example, the following asynchronous handler:: + + class AsyncHandler(RequestHandler): + @asynchronous + def get(self): + http_client = AsyncHTTPClient() + http_client.fetch("http://example.com", + callback=self.on_fetch) + + def on_fetch(self, response): + do_something_with_response(response) + self.render("template.html") + +could be written with ``gen`` as:: + + class GenAsyncHandler(RequestHandler): + @gen.coroutine + def get(self): + http_client = AsyncHTTPClient() + response = yield http_client.fetch("http://example.com") + do_something_with_response(response) + self.render("template.html") + +Most asynchronous functions in Tornado return a `.Future`; +yielding this object returns its `~.Future.result`. + +For functions that do not return ``Futures``, `Task` works with any +function that takes a ``callback`` keyword argument (most Tornado functions +can be used in either style, although the ``Future`` style is preferred +since it is both shorter and provides better exception handling):: + + @gen.coroutine + def get(self): + yield gen.Task(AsyncHTTPClient().fetch, "http://example.com") + +You can also yield a list of ``Futures`` and/or ``Tasks``, which will be +started at the same time and run in parallel; a list of results will +be returned when they are all finished:: + + @gen.coroutine + def get(self): + http_client = AsyncHTTPClient() + response1, response2 = yield [http_client.fetch(url1), + http_client.fetch(url2)] + +For more complicated interfaces, `Task` can be split into two parts: +`Callback` and `Wait`:: + + class GenAsyncHandler2(RequestHandler): + @asynchronous + @gen.coroutine + def get(self): + http_client = AsyncHTTPClient() + http_client.fetch("http://example.com", + callback=(yield gen.Callback("key")) + response = yield gen.Wait("key") + do_something_with_response(response) + self.render("template.html") + +The ``key`` argument to `Callback` and `Wait` allows for multiple +asynchronous operations to be started at different times and proceed +in parallel: yield several callbacks with different keys, then wait +for them once all the async operations have started. + +The result of a `Wait` or `Task` yield expression depends on how the callback +was run. If it was called with no arguments, the result is ``None``. If +it was called with one argument, the result is that argument. If it was +called with more than one argument or any keyword arguments, the result +is an `Arguments` object, which is a named tuple ``(args, kwargs)``. +""" +from __future__ import absolute_import, division, print_function, with_statement + +import collections +import functools +import itertools +import sys +import types + +from tornado.concurrent import Future, TracebackFuture +from tornado.ioloop import IOLoop +from tornado.stack_context import ExceptionStackContext, wrap + + +class KeyReuseError(Exception): + pass + + +class UnknownKeyError(Exception): + pass + + +class LeakedCallbackError(Exception): + pass + + +class BadYieldError(Exception): + pass + + +class ReturnValueIgnoredError(Exception): + pass + + +def engine(func): + """Callback-oriented decorator for asynchronous generators. + + This is an older interface; for new code that does not need to be + compatible with versions of Tornado older than 3.0 the + `coroutine` decorator is recommended instead. + + This decorator is similar to `coroutine`, except it does not + return a `.Future` and the ``callback`` argument is not treated + specially. + + In most cases, functions decorated with `engine` should take + a ``callback`` argument and invoke it with their result when + they are finished. One notable exception is the + `~tornado.web.RequestHandler` :ref:`HTTP verb methods `, + which use ``self.finish()`` in place of a callback argument. + """ + @functools.wraps(func) + def wrapper(*args, **kwargs): + runner = None + + def handle_exception(typ, value, tb): + # if the function throws an exception before its first "yield" + # (or is not a generator at all), the Runner won't exist yet. + # However, in that case we haven't reached anything asynchronous + # yet, so we can just let the exception propagate. + if runner is not None: + return runner.handle_exception(typ, value, tb) + return False + with ExceptionStackContext(handle_exception) as deactivate: + try: + result = func(*args, **kwargs) + except (Return, StopIteration) as e: + result = getattr(e, 'value', None) + else: + if isinstance(result, types.GeneratorType): + def final_callback(value): + if value is not None: + raise ReturnValueIgnoredError( + "@gen.engine functions cannot return values: " + "%r" % (value,)) + assert value is None + deactivate() + runner = Runner(result, final_callback) + runner.run() + return + if result is not None: + raise ReturnValueIgnoredError( + "@gen.engine functions cannot return values: %r" % + (result,)) + deactivate() + # no yield, so we're done + return wrapper + + +def coroutine(func): + """Decorator for asynchronous generators. + + Any generator that yields objects from this module must be wrapped + in either this decorator or `engine`. + + Coroutines may "return" by raising the special exception + `Return(value) `. In Python 3.3+, it is also possible for + the function to simply use the ``return value`` statement (prior to + Python 3.3 generators were not allowed to also return values). + In all versions of Python a coroutine that simply wishes to exit + early may use the ``return`` statement without a value. + + Functions with this decorator return a `.Future`. Additionally, + they may be called with a ``callback`` keyword argument, which + will be invoked with the future's result when it resolves. If the + coroutine fails, the callback will not be run and an exception + will be raised into the surrounding `.StackContext`. The + ``callback`` argument is not visible inside the decorated + function; it is handled by the decorator itself. + + From the caller's perspective, ``@gen.coroutine`` is similar to + the combination of ``@return_future`` and ``@gen.engine``. + """ + @functools.wraps(func) + def wrapper(*args, **kwargs): + runner = None + future = TracebackFuture() + + if 'callback' in kwargs: + callback = kwargs.pop('callback') + IOLoop.current().add_future( + future, lambda future: callback(future.result())) + + def handle_exception(typ, value, tb): + try: + if runner is not None and runner.handle_exception(typ, value, tb): + return True + except Exception: + typ, value, tb = sys.exc_info() + future.set_exc_info((typ, value, tb)) + return True + with ExceptionStackContext(handle_exception) as deactivate: + try: + result = func(*args, **kwargs) + except (Return, StopIteration) as e: + result = getattr(e, 'value', None) + except Exception: + deactivate() + future.set_exc_info(sys.exc_info()) + return future + else: + if isinstance(result, types.GeneratorType): + def final_callback(value): + deactivate() + future.set_result(value) + runner = Runner(result, final_callback) + runner.run() + return future + deactivate() + future.set_result(result) + return future + return wrapper + + +class Return(Exception): + """Special exception to return a value from a `coroutine`. + + If this exception is raised, its value argument is used as the + result of the coroutine:: + + @gen.coroutine + def fetch_json(url): + response = yield AsyncHTTPClient().fetch(url) + raise gen.Return(json_decode(response.body)) + + In Python 3.3, this exception is no longer necessary: the ``return`` + statement can be used directly to return a value (previously + ``yield`` and ``return`` with a value could not be combined in the + same function). + + By analogy with the return statement, the value argument is optional, + but it is never necessary to ``raise gen.Return()``. The ``return`` + statement can be used with no arguments instead. + """ + def __init__(self, value=None): + super(Return, self).__init__() + self.value = value + + +class YieldPoint(object): + """Base class for objects that may be yielded from the generator. + + Applications do not normally need to use this class, but it may be + subclassed to provide additional yielding behavior. + """ + def start(self, runner): + """Called by the runner after the generator has yielded. + + No other methods will be called on this object before ``start``. + """ + raise NotImplementedError() + + def is_ready(self): + """Called by the runner to determine whether to resume the generator. + + Returns a boolean; may be called more than once. + """ + raise NotImplementedError() + + def get_result(self): + """Returns the value to use as the result of the yield expression. + + This method will only be called once, and only after `is_ready` + has returned true. + """ + raise NotImplementedError() + + +class Callback(YieldPoint): + """Returns a callable object that will allow a matching `Wait` to proceed. + + The key may be any value suitable for use as a dictionary key, and is + used to match ``Callbacks`` to their corresponding ``Waits``. The key + must be unique among outstanding callbacks within a single run of the + generator function, but may be reused across different runs of the same + function (so constants generally work fine). + + The callback may be called with zero or one arguments; if an argument + is given it will be returned by `Wait`. + """ + def __init__(self, key): + self.key = key + + def start(self, runner): + self.runner = runner + runner.register_callback(self.key) + + def is_ready(self): + return True + + def get_result(self): + return self.runner.result_callback(self.key) + + +class Wait(YieldPoint): + """Returns the argument passed to the result of a previous `Callback`.""" + def __init__(self, key): + self.key = key + + def start(self, runner): + self.runner = runner + + def is_ready(self): + return self.runner.is_ready(self.key) + + def get_result(self): + return self.runner.pop_result(self.key) + + +class WaitAll(YieldPoint): + """Returns the results of multiple previous `Callbacks `. + + The argument is a sequence of `Callback` keys, and the result is + a list of results in the same order. + + `WaitAll` is equivalent to yielding a list of `Wait` objects. + """ + def __init__(self, keys): + self.keys = keys + + def start(self, runner): + self.runner = runner + + def is_ready(self): + return all(self.runner.is_ready(key) for key in self.keys) + + def get_result(self): + return [self.runner.pop_result(key) for key in self.keys] + + +class Task(YieldPoint): + """Runs a single asynchronous operation. + + Takes a function (and optional additional arguments) and runs it with + those arguments plus a ``callback`` keyword argument. The argument passed + to the callback is returned as the result of the yield expression. + + A `Task` is equivalent to a `Callback`/`Wait` pair (with a unique + key generated automatically):: + + result = yield gen.Task(func, args) + + func(args, callback=(yield gen.Callback(key))) + result = yield gen.Wait(key) + """ + def __init__(self, func, *args, **kwargs): + assert "callback" not in kwargs + self.args = args + self.kwargs = kwargs + self.func = func + + def start(self, runner): + self.runner = runner + self.key = object() + runner.register_callback(self.key) + self.kwargs["callback"] = runner.result_callback(self.key) + self.func(*self.args, **self.kwargs) + + def is_ready(self): + return self.runner.is_ready(self.key) + + def get_result(self): + return self.runner.pop_result(self.key) + + +class YieldFuture(YieldPoint): + def __init__(self, future, io_loop=None): + self.future = future + self.io_loop = io_loop or IOLoop.current() + + def start(self, runner): + self.runner = runner + self.key = object() + runner.register_callback(self.key) + self.io_loop.add_future(self.future, runner.result_callback(self.key)) + + def is_ready(self): + return self.runner.is_ready(self.key) + + def get_result(self): + return self.runner.pop_result(self.key).result() + + +class Multi(YieldPoint): + """Runs multiple asynchronous operations in parallel. + + Takes a list of ``Tasks`` or other ``YieldPoints`` and returns a list of + their responses. It is not necessary to call `Multi` explicitly, + since the engine will do so automatically when the generator yields + a list of ``YieldPoints``. + """ + def __init__(self, children): + self.children = [] + for i in children: + if isinstance(i, Future): + i = YieldFuture(i) + self.children.append(i) + assert all(isinstance(i, YieldPoint) for i in self.children) + self.unfinished_children = set(self.children) + + def start(self, runner): + for i in self.children: + i.start(runner) + + def is_ready(self): + finished = list(itertools.takewhile( + lambda i: i.is_ready(), self.unfinished_children)) + self.unfinished_children.difference_update(finished) + return not self.unfinished_children + + def get_result(self): + return [i.get_result() for i in self.children] + + +class _NullYieldPoint(YieldPoint): + def start(self, runner): + pass + + def is_ready(self): + return True + + def get_result(self): + return None + + +_null_yield_point = _NullYieldPoint() + + +class Runner(object): + """Internal implementation of `tornado.gen.engine`. + + Maintains information about pending callbacks and their results. + + ``final_callback`` is run after the generator exits. + """ + def __init__(self, gen, final_callback): + self.gen = gen + self.final_callback = final_callback + self.yield_point = _null_yield_point + self.pending_callbacks = set() + self.results = {} + self.running = False + self.finished = False + self.exc_info = None + self.had_exception = False + + def register_callback(self, key): + """Adds ``key`` to the list of callbacks.""" + if key in self.pending_callbacks: + raise KeyReuseError("key %r is already pending" % (key,)) + self.pending_callbacks.add(key) + + def is_ready(self, key): + """Returns true if a result is available for ``key``.""" + if key not in self.pending_callbacks: + raise UnknownKeyError("key %r is not pending" % (key,)) + return key in self.results + + def set_result(self, key, result): + """Sets the result for ``key`` and attempts to resume the generator.""" + self.results[key] = result + self.run() + + def pop_result(self, key): + """Returns the result for ``key`` and unregisters it.""" + self.pending_callbacks.remove(key) + return self.results.pop(key) + + def run(self): + """Starts or resumes the generator, running until it reaches a + yield point that is not ready. + """ + if self.running or self.finished: + return + try: + self.running = True + while True: + if self.exc_info is None: + try: + if not self.yield_point.is_ready(): + return + next = self.yield_point.get_result() + self.yield_point = None + except Exception: + self.exc_info = sys.exc_info() + try: + if self.exc_info is not None: + self.had_exception = True + exc_info = self.exc_info + self.exc_info = None + yielded = self.gen.throw(*exc_info) + else: + yielded = self.gen.send(next) + except (StopIteration, Return) as e: + self.finished = True + self.yield_point = _null_yield_point + if self.pending_callbacks and not self.had_exception: + # If we ran cleanly without waiting on all callbacks + # raise an error (really more of a warning). If we + # had an exception then some callbacks may have been + # orphaned, so skip the check in that case. + raise LeakedCallbackError( + "finished without waiting for callbacks %r" % + self.pending_callbacks) + self.final_callback(getattr(e, 'value', None)) + self.final_callback = None + return + except Exception: + self.finished = True + self.yield_point = _null_yield_point + raise + if isinstance(yielded, list): + yielded = Multi(yielded) + elif isinstance(yielded, Future): + yielded = YieldFuture(yielded) + if isinstance(yielded, YieldPoint): + self.yield_point = yielded + try: + self.yield_point.start(self) + except Exception: + self.exc_info = sys.exc_info() + else: + self.exc_info = (BadYieldError( + "yielded unknown object %r" % (yielded,)),) + finally: + self.running = False + + def result_callback(self, key): + def inner(*args, **kwargs): + if kwargs or len(args) > 1: + result = Arguments(args, kwargs) + elif args: + result = args[0] + else: + result = None + self.set_result(key, result) + return wrap(inner) + + def handle_exception(self, typ, value, tb): + if not self.running and not self.finished: + self.exc_info = (typ, value, tb) + self.run() + return True + else: + return False + +Arguments = collections.namedtuple('Arguments', ['args', 'kwargs']) diff --git a/lib/tornado-3.1.1/tornado/httpclient.py b/lib/tornado-3.1.1/tornado/httpclient.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/httpclient.py @@ -0,0 +1,497 @@ +"""Blocking and non-blocking HTTP client interfaces. + +This module defines a common interface shared by two implementations, +``simple_httpclient`` and ``curl_httpclient``. Applications may either +instantiate their chosen implementation class directly or use the +`AsyncHTTPClient` class from this module, which selects an implementation +that can be overridden with the `AsyncHTTPClient.configure` method. + +The default implementation is ``simple_httpclient``, and this is expected +to be suitable for most users' needs. However, some applications may wish +to switch to ``curl_httpclient`` for reasons such as the following: + +* ``curl_httpclient`` has some features not found in ``simple_httpclient``, + including support for HTTP proxies and the ability to use a specified + network interface. + +* ``curl_httpclient`` is more likely to be compatible with sites that are + not-quite-compliant with the HTTP spec, or sites that use little-exercised + features of HTTP. + +* ``curl_httpclient`` is faster. + +* ``curl_httpclient`` was the default prior to Tornado 2.0. + +Note that if you are using ``curl_httpclient``, it is highly recommended that +you use a recent version of ``libcurl`` and ``pycurl``. Currently the minimum +supported version is 7.18.2, and the recommended version is 7.21.1 or newer. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import functools +import time +import weakref + +from tornado.concurrent import Future +from tornado.escape import utf8 +from tornado import httputil, stack_context +from tornado.ioloop import IOLoop +from tornado.util import Configurable + + +class HTTPClient(object): + """A blocking HTTP client. + + This interface is provided for convenience and testing; most applications + that are running an IOLoop will want to use `AsyncHTTPClient` instead. + Typical usage looks like this:: + + http_client = httpclient.HTTPClient() + try: + response = http_client.fetch("http://www.google.com/") + print response.body + except httpclient.HTTPError as e: + print "Error:", e + http_client.close() + """ + def __init__(self, async_client_class=None, **kwargs): + self._io_loop = IOLoop() + if async_client_class is None: + async_client_class = AsyncHTTPClient + self._async_client = async_client_class(self._io_loop, **kwargs) + self._closed = False + + def __del__(self): + self.close() + + def close(self): + """Closes the HTTPClient, freeing any resources used.""" + if not self._closed: + self._async_client.close() + self._io_loop.close() + self._closed = True + + def fetch(self, request, **kwargs): + """Executes a request, returning an `HTTPResponse`. + + The request may be either a string URL or an `HTTPRequest` object. + If it is a string, we construct an `HTTPRequest` using any additional + kwargs: ``HTTPRequest(request, **kwargs)`` + + If an error occurs during the fetch, we raise an `HTTPError`. + """ + response = self._io_loop.run_sync(functools.partial( + self._async_client.fetch, request, **kwargs)) + response.rethrow() + return response + + +class AsyncHTTPClient(Configurable): + """An non-blocking HTTP client. + + Example usage:: + + def handle_request(response): + if response.error: + print "Error:", response.error + else: + print response.body + + http_client = AsyncHTTPClient() + http_client.fetch("http://www.google.com/", handle_request) + + The constructor for this class is magic in several respects: It + actually creates an instance of an implementation-specific + subclass, and instances are reused as a kind of pseudo-singleton + (one per `.IOLoop`). The keyword argument ``force_instance=True`` + can be used to suppress this singleton behavior. Constructor + arguments other than ``io_loop`` and ``force_instance`` are + deprecated. The implementation subclass as well as arguments to + its constructor can be set with the static method `configure()` + """ + @classmethod + def configurable_base(cls): + return AsyncHTTPClient + + @classmethod + def configurable_default(cls): + from tornado.simple_httpclient import SimpleAsyncHTTPClient + return SimpleAsyncHTTPClient + + @classmethod + def _async_clients(cls): + attr_name = '_async_client_dict_' + cls.__name__ + if not hasattr(cls, attr_name): + setattr(cls, attr_name, weakref.WeakKeyDictionary()) + return getattr(cls, attr_name) + + def __new__(cls, io_loop=None, force_instance=False, **kwargs): + io_loop = io_loop or IOLoop.current() + if io_loop in cls._async_clients() and not force_instance: + return cls._async_clients()[io_loop] + instance = super(AsyncHTTPClient, cls).__new__(cls, io_loop=io_loop, + **kwargs) + if not force_instance: + cls._async_clients()[io_loop] = instance + return instance + + def initialize(self, io_loop, defaults=None): + self.io_loop = io_loop + self.defaults = dict(HTTPRequest._DEFAULTS) + if defaults is not None: + self.defaults.update(defaults) + + def close(self): + """Destroys this HTTP client, freeing any file descriptors used. + Not needed in normal use, but may be helpful in unittests that + create and destroy http clients. No other methods may be called + on the `AsyncHTTPClient` after ``close()``. + """ + if self._async_clients().get(self.io_loop) is self: + del self._async_clients()[self.io_loop] + + def fetch(self, request, callback=None, **kwargs): + """Executes a request, asynchronously returning an `HTTPResponse`. + + The request may be either a string URL or an `HTTPRequest` object. + If it is a string, we construct an `HTTPRequest` using any additional + kwargs: ``HTTPRequest(request, **kwargs)`` + + This method returns a `.Future` whose result is an + `HTTPResponse`. The ``Future`` wil raise an `HTTPError` if + the request returned a non-200 response code. + + If a ``callback`` is given, it will be invoked with the `HTTPResponse`. + In the callback interface, `HTTPError` is not automatically raised. + Instead, you must check the response's ``error`` attribute or + call its `~HTTPResponse.rethrow` method. + """ + if not isinstance(request, HTTPRequest): + request = HTTPRequest(url=request, **kwargs) + # We may modify this (to add Host, Accept-Encoding, etc), + # so make sure we don't modify the caller's object. This is also + # where normal dicts get converted to HTTPHeaders objects. + request.headers = httputil.HTTPHeaders(request.headers) + request = _RequestProxy(request, self.defaults) + future = Future() + if callback is not None: + callback = stack_context.wrap(callback) + + def handle_future(future): + exc = future.exception() + if isinstance(exc, HTTPError) and exc.response is not None: + response = exc.response + elif exc is not None: + response = HTTPResponse( + request, 599, error=exc, + request_time=time.time() - request.start_time) + else: + response = future.result() + self.io_loop.add_callback(callback, response) + future.add_done_callback(handle_future) + + def handle_response(response): + if response.error: + future.set_exception(response.error) + else: + future.set_result(response) + self.fetch_impl(request, handle_response) + return future + + def fetch_impl(self, request, callback): + raise NotImplementedError() + + @classmethod + def configure(cls, impl, **kwargs): + """Configures the `AsyncHTTPClient` subclass to use. + + ``AsyncHTTPClient()`` actually creates an instance of a subclass. + This method may be called with either a class object or the + fully-qualified name of such a class (or ``None`` to use the default, + ``SimpleAsyncHTTPClient``) + + If additional keyword arguments are given, they will be passed + to the constructor of each subclass instance created. The + keyword argument ``max_clients`` determines the maximum number + of simultaneous `~AsyncHTTPClient.fetch()` operations that can + execute in parallel on each `.IOLoop`. Additional arguments + may be supported depending on the implementation class in use. + + Example:: + + AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient") + """ + super(AsyncHTTPClient, cls).configure(impl, **kwargs) + + +class HTTPRequest(object): + """HTTP client request object.""" + + # Default values for HTTPRequest parameters. + # Merged with the values on the request object by AsyncHTTPClient + # implementations. + _DEFAULTS = dict( + connect_timeout=20.0, + request_timeout=20.0, + follow_redirects=True, + max_redirects=5, + use_gzip=True, + proxy_password='', + allow_nonstandard_methods=False, + validate_cert=True) + + def __init__(self, url, method="GET", headers=None, body=None, + auth_username=None, auth_password=None, auth_mode=None, + connect_timeout=None, request_timeout=None, + if_modified_since=None, follow_redirects=None, + max_redirects=None, user_agent=None, use_gzip=None, + network_interface=None, streaming_callback=None, + header_callback=None, prepare_curl_callback=None, + proxy_host=None, proxy_port=None, proxy_username=None, + proxy_password=None, allow_nonstandard_methods=None, + validate_cert=None, ca_certs=None, + allow_ipv6=None, + client_key=None, client_cert=None): + r"""All parameters except ``url`` are optional. + + :arg string url: URL to fetch + :arg string method: HTTP method, e.g. "GET" or "POST" + :arg headers: Additional HTTP headers to pass on the request + :arg body: HTTP body to pass on the request + :type headers: `~tornado.httputil.HTTPHeaders` or `dict` + :arg string auth_username: Username for HTTP authentication + :arg string auth_password: Password for HTTP authentication + :arg string auth_mode: Authentication mode; default is "basic". + Allowed values are implementation-defined; ``curl_httpclient`` + supports "basic" and "digest"; ``simple_httpclient`` only supports + "basic" + :arg float connect_timeout: Timeout for initial connection in seconds + :arg float request_timeout: Timeout for entire request in seconds + :arg if_modified_since: Timestamp for ``If-Modified-Since`` header + :type if_modified_since: `datetime` or `float` + :arg bool follow_redirects: Should redirects be followed automatically + or return the 3xx response? + :arg int max_redirects: Limit for ``follow_redirects`` + :arg string user_agent: String to send as ``User-Agent`` header + :arg bool use_gzip: Request gzip encoding from the server + :arg string network_interface: Network interface to use for request + :arg callable streaming_callback: If set, ``streaming_callback`` will + be run with each chunk of data as it is received, and + ``HTTPResponse.body`` and ``HTTPResponse.buffer`` will be empty in + the final response. + :arg callable header_callback: If set, ``header_callback`` will + be run with each header line as it is received (including the + first line, e.g. ``HTTP/1.0 200 OK\r\n``, and a final line + containing only ``\r\n``. All lines include the trailing newline + characters). ``HTTPResponse.headers`` will be empty in the final + response. This is most useful in conjunction with + ``streaming_callback``, because it's the only way to get access to + header data while the request is in progress. + :arg callable prepare_curl_callback: If set, will be called with + a ``pycurl.Curl`` object to allow the application to make additional + ``setopt`` calls. + :arg string proxy_host: HTTP proxy hostname. To use proxies, + ``proxy_host`` and ``proxy_port`` must be set; ``proxy_username`` and + ``proxy_pass`` are optional. Proxies are currently only supported + with ``curl_httpclient``. + :arg int proxy_port: HTTP proxy port + :arg string proxy_username: HTTP proxy username + :arg string proxy_password: HTTP proxy password + :arg bool allow_nonstandard_methods: Allow unknown values for ``method`` + argument? + :arg bool validate_cert: For HTTPS requests, validate the server's + certificate? + :arg string ca_certs: filename of CA certificates in PEM format, + or None to use defaults. Note that in ``curl_httpclient``, if + any request uses a custom ``ca_certs`` file, they all must (they + don't have to all use the same ``ca_certs``, but it's not possible + to mix requests with ``ca_certs`` and requests that use the defaults. + :arg bool allow_ipv6: Use IPv6 when available? Default is false in + ``simple_httpclient`` and true in ``curl_httpclient`` + :arg string client_key: Filename for client SSL key, if any + :arg string client_cert: Filename for client SSL certificate, if any + + .. versionadded:: 3.1 + The ``auth_mode`` argument. + """ + if headers is None: + headers = httputil.HTTPHeaders() + if if_modified_since: + headers["If-Modified-Since"] = httputil.format_timestamp( + if_modified_since) + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_username = proxy_username + self.proxy_password = proxy_password + self.url = url + self.method = method + self.headers = headers + self.body = utf8(body) + self.auth_username = auth_username + self.auth_password = auth_password + self.auth_mode = auth_mode + self.connect_timeout = connect_timeout + self.request_timeout = request_timeout + self.follow_redirects = follow_redirects + self.max_redirects = max_redirects + self.user_agent = user_agent + self.use_gzip = use_gzip + self.network_interface = network_interface + self.streaming_callback = stack_context.wrap(streaming_callback) + self.header_callback = stack_context.wrap(header_callback) + self.prepare_curl_callback = stack_context.wrap(prepare_curl_callback) + self.allow_nonstandard_methods = allow_nonstandard_methods + self.validate_cert = validate_cert + self.ca_certs = ca_certs + self.allow_ipv6 = allow_ipv6 + self.client_key = client_key + self.client_cert = client_cert + self.start_time = time.time() + + +class HTTPResponse(object): + """HTTP Response object. + + Attributes: + + * request: HTTPRequest object + + * code: numeric HTTP status code, e.g. 200 or 404 + + * reason: human-readable reason phrase describing the status code + (with curl_httpclient, this is a default value rather than the + server's actual response) + + * headers: `tornado.httputil.HTTPHeaders` object + + * buffer: ``cStringIO`` object for response body + + * body: response body as string (created on demand from ``self.buffer``) + + * error: Exception object, if any + + * request_time: seconds from request start to finish + + * time_info: dictionary of diagnostic timing information from the request. + Available data are subject to change, but currently uses timings + available from http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html, + plus ``queue``, which is the delay (if any) introduced by waiting for + a slot under `AsyncHTTPClient`'s ``max_clients`` setting. + """ + def __init__(self, request, code, headers=None, buffer=None, + effective_url=None, error=None, request_time=None, + time_info=None, reason=None): + if isinstance(request, _RequestProxy): + self.request = request.request + else: + self.request = request + self.code = code + self.reason = reason or httputil.responses.get(code, "Unknown") + if headers is not None: + self.headers = headers + else: + self.headers = httputil.HTTPHeaders() + self.buffer = buffer + self._body = None + if effective_url is None: + self.effective_url = request.url + else: + self.effective_url = effective_url + if error is None: + if self.code < 200 or self.code >= 300: + self.error = HTTPError(self.code, response=self) + else: + self.error = None + else: + self.error = error + self.request_time = request_time + self.time_info = time_info or {} + + def _get_body(self): + if self.buffer is None: + return None + elif self._body is None: + self._body = self.buffer.getvalue() + + return self._body + + body = property(_get_body) + + def rethrow(self): + """If there was an error on the request, raise an `HTTPError`.""" + if self.error: + raise self.error + + def __repr__(self): + args = ",".join("%s=%r" % i for i in sorted(self.__dict__.items())) + return "%s(%s)" % (self.__class__.__name__, args) + + +class HTTPError(Exception): + """Exception thrown for an unsuccessful HTTP request. + + Attributes: + + * ``code`` - HTTP error integer error code, e.g. 404. Error code 599 is + used when no HTTP response was received, e.g. for a timeout. + + * ``response`` - `HTTPResponse` object, if any. + + Note that if ``follow_redirects`` is False, redirects become HTTPErrors, + and you can look at ``error.response.headers['Location']`` to see the + destination of the redirect. + """ + def __init__(self, code, message=None, response=None): + self.code = code + message = message or httputil.responses.get(code, "Unknown") + self.response = response + Exception.__init__(self, "HTTP %d: %s" % (self.code, message)) + + +class _RequestProxy(object): + """Combines an object with a dictionary of defaults. + + Used internally by AsyncHTTPClient implementations. + """ + def __init__(self, request, defaults): + self.request = request + self.defaults = defaults + + def __getattr__(self, name): + request_attr = getattr(self.request, name) + if request_attr is not None: + return request_attr + elif self.defaults is not None: + return self.defaults.get(name, None) + else: + return None + + +def main(): + from tornado.options import define, options, parse_command_line + define("print_headers", type=bool, default=False) + define("print_body", type=bool, default=True) + define("follow_redirects", type=bool, default=True) + define("validate_cert", type=bool, default=True) + args = parse_command_line() + client = HTTPClient() + for arg in args: + try: + response = client.fetch(arg, + follow_redirects=options.follow_redirects, + validate_cert=options.validate_cert, + ) + except HTTPError as e: + if e.response is not None: + response = e.response + else: + raise + if options.print_headers: + print(response.headers) + if options.print_body: + print(response.body) + client.close() + +if __name__ == "__main__": + main() diff --git a/lib/tornado-3.1.1/tornado/httpserver.py b/lib/tornado-3.1.1/tornado/httpserver.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/httpserver.py @@ -0,0 +1,529 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""A non-blocking, single-threaded HTTP server. + +Typical applications have little direct interaction with the `HTTPServer` +class except to start a server at the beginning of the process +(and even that is often done indirectly via `tornado.web.Application.listen`). + +This module also defines the `HTTPRequest` class which is exposed via +`tornado.web.RequestHandler.request`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import socket +import ssl +import time + +from tornado.escape import native_str, parse_qs_bytes +from tornado import httputil +from tornado import iostream +from tornado.log import gen_log +from tornado import netutil +from tornado.tcpserver import TCPServer +from tornado import stack_context +from tornado.util import bytes_type + +try: + import Cookie # py2 +except ImportError: + import http.cookies as Cookie # py3 + + +class HTTPServer(TCPServer): + r"""A non-blocking, single-threaded HTTP server. + + A server is defined by a request callback that takes an HTTPRequest + instance as an argument and writes a valid HTTP response with + `HTTPRequest.write`. `HTTPRequest.finish` finishes the request (but does + not necessarily close the connection in the case of HTTP/1.1 keep-alive + requests). A simple example server that echoes back the URI you + requested:: + + import tornado.httpserver + import tornado.ioloop + + def handle_request(request): + message = "You requested %s\n" % request.uri + request.write("HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s" % ( + len(message), message)) + request.finish() + + http_server = tornado.httpserver.HTTPServer(handle_request) + http_server.listen(8888) + tornado.ioloop.IOLoop.instance().start() + + `HTTPServer` is a very basic connection handler. It parses the request + headers and body, but the request callback is responsible for producing + the response exactly as it will appear on the wire. This affords + maximum flexibility for applications to implement whatever parts + of HTTP responses are required. + + `HTTPServer` supports keep-alive connections by default + (automatically for HTTP/1.1, or for HTTP/1.0 when the client + requests ``Connection: keep-alive``). This means that the request + callback must generate a properly-framed response, using either + the ``Content-Length`` header or ``Transfer-Encoding: chunked``. + Applications that are unable to frame their responses properly + should instead return a ``Connection: close`` header in each + response and pass ``no_keep_alive=True`` to the `HTTPServer` + constructor. + + If ``xheaders`` is ``True``, we support the + ``X-Real-Ip``/``X-Forwarded-For`` and + ``X-Scheme``/``X-Forwarded-Proto`` headers, which override the + remote IP and URI scheme/protocol for all requests. These headers + are useful when running Tornado behind a reverse proxy or load + balancer. The ``protocol`` argument can also be set to ``https`` + if Tornado is run behind an SSL-decoding proxy that does not set one of + the supported ``xheaders``. + + To make this server serve SSL traffic, send the ``ssl_options`` dictionary + argument with the arguments required for the `ssl.wrap_socket` method, + including ``certfile`` and ``keyfile``. (In Python 3.2+ you can pass + an `ssl.SSLContext` object instead of a dict):: + + HTTPServer(applicaton, ssl_options={ + "certfile": os.path.join(data_dir, "mydomain.crt"), + "keyfile": os.path.join(data_dir, "mydomain.key"), + }) + + `HTTPServer` initialization follows one of three patterns (the + initialization methods are defined on `tornado.tcpserver.TCPServer`): + + 1. `~tornado.tcpserver.TCPServer.listen`: simple single-process:: + + server = HTTPServer(app) + server.listen(8888) + IOLoop.instance().start() + + In many cases, `tornado.web.Application.listen` can be used to avoid + the need to explicitly create the `HTTPServer`. + + 2. `~tornado.tcpserver.TCPServer.bind`/`~tornado.tcpserver.TCPServer.start`: + simple multi-process:: + + server = HTTPServer(app) + server.bind(8888) + server.start(0) # Forks multiple sub-processes + IOLoop.instance().start() + + When using this interface, an `.IOLoop` must *not* be passed + to the `HTTPServer` constructor. `~.TCPServer.start` will always start + the server on the default singleton `.IOLoop`. + + 3. `~tornado.tcpserver.TCPServer.add_sockets`: advanced multi-process:: + + sockets = tornado.netutil.bind_sockets(8888) + tornado.process.fork_processes(0) + server = HTTPServer(app) + server.add_sockets(sockets) + IOLoop.instance().start() + + The `~.TCPServer.add_sockets` interface is more complicated, + but it can be used with `tornado.process.fork_processes` to + give you more flexibility in when the fork happens. + `~.TCPServer.add_sockets` can also be used in single-process + servers if you want to create your listening sockets in some + way other than `tornado.netutil.bind_sockets`. + + """ + def __init__(self, request_callback, no_keep_alive=False, io_loop=None, + xheaders=False, ssl_options=None, protocol=None, **kwargs): + self.request_callback = request_callback + self.no_keep_alive = no_keep_alive + self.xheaders = xheaders + self.protocol = protocol + TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options, + **kwargs) + + def handle_stream(self, stream, address): + HTTPConnection(stream, address, self.request_callback, + self.no_keep_alive, self.xheaders, self.protocol) + + +class _BadRequestException(Exception): + """Exception class for malformed HTTP requests.""" + pass + + +class HTTPConnection(object): + """Handles a connection to an HTTP client, executing HTTP requests. + + We parse HTTP headers and bodies, and execute the request callback + until the HTTP conection is closed. + """ + def __init__(self, stream, address, request_callback, no_keep_alive=False, + xheaders=False, protocol=None): + self.stream = stream + self.address = address + # Save the socket's address family now so we know how to + # interpret self.address even after the stream is closed + # and its socket attribute replaced with None. + self.address_family = stream.socket.family + self.request_callback = request_callback + self.no_keep_alive = no_keep_alive + self.xheaders = xheaders + self.protocol = protocol + self._clear_request_state() + # Save stack context here, outside of any request. This keeps + # contexts from one request from leaking into the next. + self._header_callback = stack_context.wrap(self._on_headers) + self.stream.set_close_callback(self._on_connection_close) + self.stream.read_until(b"\r\n\r\n", self._header_callback) + + def _clear_request_state(self): + """Clears the per-request state. + + This is run in between requests to allow the previous handler + to be garbage collected (and prevent spurious close callbacks), + and when the connection is closed (to break up cycles and + facilitate garbage collection in cpython). + """ + self._request = None + self._request_finished = False + self._write_callback = None + self._close_callback = None + + def set_close_callback(self, callback): + """Sets a callback that will be run when the connection is closed. + + Use this instead of accessing + `HTTPConnection.stream.set_close_callback + <.BaseIOStream.set_close_callback>` directly (which was the + recommended approach prior to Tornado 3.0). + """ + self._close_callback = stack_context.wrap(callback) + + def _on_connection_close(self): + if self._close_callback is not None: + callback = self._close_callback + self._close_callback = None + callback() + # Delete any unfinished callbacks to break up reference cycles. + self._header_callback = None + self._clear_request_state() + + def close(self): + self.stream.close() + # Remove this reference to self, which would otherwise cause a + # cycle and delay garbage collection of this connection. + self._header_callback = None + self._clear_request_state() + + def write(self, chunk, callback=None): + """Writes a chunk of output to the stream.""" + if not self.stream.closed(): + self._write_callback = stack_context.wrap(callback) + self.stream.write(chunk, self._on_write_complete) + + def finish(self): + """Finishes the request.""" + self._request_finished = True + # No more data is coming, so instruct TCP to send any remaining + # data immediately instead of waiting for a full packet or ack. + self.stream.set_nodelay(True) + if not self.stream.writing(): + self._finish_request() + + def _on_write_complete(self): + if self._write_callback is not None: + callback = self._write_callback + self._write_callback = None + callback() + # _on_write_complete is enqueued on the IOLoop whenever the + # IOStream's write buffer becomes empty, but it's possible for + # another callback that runs on the IOLoop before it to + # simultaneously write more data and finish the request. If + # there is still data in the IOStream, a future + # _on_write_complete will be responsible for calling + # _finish_request. + if self._request_finished and not self.stream.writing(): + self._finish_request() + + def _finish_request(self): + if self.no_keep_alive or self._request is None: + disconnect = True + else: + connection_header = self._request.headers.get("Connection") + if connection_header is not None: + connection_header = connection_header.lower() + if self._request.supports_http_1_1(): + disconnect = connection_header == "close" + elif ("Content-Length" in self._request.headers + or self._request.method in ("HEAD", "GET")): + disconnect = connection_header != "keep-alive" + else: + disconnect = True + self._clear_request_state() + if disconnect: + self.close() + return + try: + # Use a try/except instead of checking stream.closed() + # directly, because in some cases the stream doesn't discover + # that it's closed until you try to read from it. + self.stream.read_until(b"\r\n\r\n", self._header_callback) + + # Turn Nagle's algorithm back on, leaving the stream in its + # default state for the next request. + self.stream.set_nodelay(False) + except iostream.StreamClosedError: + self.close() + + def _on_headers(self, data): + try: + data = native_str(data.decode('latin1')) + eol = data.find("\r\n") + start_line = data[:eol] + try: + method, uri, version = start_line.split(" ") + except ValueError: + raise _BadRequestException("Malformed HTTP request line") + if not version.startswith("HTTP/"): + raise _BadRequestException("Malformed HTTP version in HTTP Request-Line") + try: + headers = httputil.HTTPHeaders.parse(data[eol:]) + except ValueError: + # Probably from split() if there was no ':' in the line + raise _BadRequestException("Malformed HTTP headers") + + # HTTPRequest wants an IP, not a full socket address + if self.address_family in (socket.AF_INET, socket.AF_INET6): + remote_ip = self.address[0] + else: + # Unix (or other) socket; fake the remote address + remote_ip = '0.0.0.0' + + self._request = HTTPRequest( + connection=self, method=method, uri=uri, version=version, + headers=headers, remote_ip=remote_ip, protocol=self.protocol) + + content_length = headers.get("Content-Length") + if content_length: + content_length = int(content_length) + if content_length > self.stream.max_buffer_size: + raise _BadRequestException("Content-Length too long") + if headers.get("Expect") == "100-continue": + self.stream.write(b"HTTP/1.1 100 (Continue)\r\n\r\n") + self.stream.read_bytes(content_length, self._on_request_body) + return + + self.request_callback(self._request) + except _BadRequestException as e: + gen_log.info("Malformed HTTP request from %s: %s", + self.address[0], e) + self.close() + return + + def _on_request_body(self, data): + self._request.body = data + if self._request.method in ("POST", "PATCH", "PUT"): + httputil.parse_body_arguments( + self._request.headers.get("Content-Type", ""), data, + self._request.arguments, self._request.files) + self.request_callback(self._request) + + +class HTTPRequest(object): + """A single HTTP request. + + All attributes are type `str` unless otherwise noted. + + .. attribute:: method + + HTTP request method, e.g. "GET" or "POST" + + .. attribute:: uri + + The requested uri. + + .. attribute:: path + + The path portion of `uri` + + .. attribute:: query + + The query portion of `uri` + + .. attribute:: version + + HTTP version specified in request, e.g. "HTTP/1.1" + + .. attribute:: headers + + `.HTTPHeaders` dictionary-like object for request headers. Acts like + a case-insensitive dictionary with additional methods for repeated + headers. + + .. attribute:: body + + Request body, if present, as a byte string. + + .. attribute:: remote_ip + + Client's IP address as a string. If ``HTTPServer.xheaders`` is set, + will pass along the real IP address provided by a load balancer + in the ``X-Real-Ip`` or ``X-Forwarded-For`` header. + + .. versionchanged:: 3.1 + The list format of ``X-Forwarded-For`` is now supported. + + .. attribute:: protocol + + The protocol used, either "http" or "https". If ``HTTPServer.xheaders`` + is set, will pass along the protocol used by a load balancer if + reported via an ``X-Scheme`` header. + + .. attribute:: host + + The requested hostname, usually taken from the ``Host`` header. + + .. attribute:: arguments + + GET/POST arguments are available in the arguments property, which + maps arguments names to lists of values (to support multiple values + for individual names). Names are of type `str`, while arguments + are byte strings. Note that this is different from + `.RequestHandler.get_argument`, which returns argument values as + unicode strings. + + .. attribute:: files + + File uploads are available in the files property, which maps file + names to lists of `.HTTPFile`. + + .. attribute:: connection + + An HTTP request is attached to a single HTTP connection, which can + be accessed through the "connection" attribute. Since connections + are typically kept open in HTTP/1.1, multiple requests can be handled + sequentially on a single connection. + """ + def __init__(self, method, uri, version="HTTP/1.0", headers=None, + body=None, remote_ip=None, protocol=None, host=None, + files=None, connection=None): + self.method = method + self.uri = uri + self.version = version + self.headers = headers or httputil.HTTPHeaders() + self.body = body or "" + + # set remote IP and protocol + self.remote_ip = remote_ip + if protocol: + self.protocol = protocol + elif connection and isinstance(connection.stream, + iostream.SSLIOStream): + self.protocol = "https" + else: + self.protocol = "http" + + # xheaders can override the defaults + if connection and connection.xheaders: + # Squid uses X-Forwarded-For, others use X-Real-Ip + ip = self.headers.get("X-Forwarded-For", self.remote_ip) + ip = ip.split(',')[-1].strip() + ip = self.headers.get( + "X-Real-Ip", ip) + if netutil.is_valid_ip(ip): + self.remote_ip = ip + # AWS uses X-Forwarded-Proto + proto = self.headers.get( + "X-Scheme", self.headers.get("X-Forwarded-Proto", self.protocol)) + if proto in ("http", "https"): + self.protocol = proto + + self.host = host or self.headers.get("Host") or "127.0.0.1" + self.files = files or {} + self.connection = connection + self._start_time = time.time() + self._finish_time = None + + self.path, sep, self.query = uri.partition('?') + self.arguments = parse_qs_bytes(self.query, keep_blank_values=True) + + def supports_http_1_1(self): + """Returns True if this request supports HTTP/1.1 semantics""" + return self.version == "HTTP/1.1" + + @property + def cookies(self): + """A dictionary of Cookie.Morsel objects.""" + if not hasattr(self, "_cookies"): + self._cookies = Cookie.SimpleCookie() + if "Cookie" in self.headers: + try: + self._cookies.load( + native_str(self.headers["Cookie"])) + except Exception: + self._cookies = {} + return self._cookies + + def write(self, chunk, callback=None): + """Writes the given chunk to the response stream.""" + assert isinstance(chunk, bytes_type) + self.connection.write(chunk, callback=callback) + + def finish(self): + """Finishes this HTTP request on the open connection.""" + self.connection.finish() + self._finish_time = time.time() + + def full_url(self): + """Reconstructs the full URL for this request.""" + return self.protocol + "://" + self.host + self.uri + + def request_time(self): + """Returns the amount of time it took for this request to execute.""" + if self._finish_time is None: + return time.time() - self._start_time + else: + return self._finish_time - self._start_time + + def get_ssl_certificate(self, binary_form=False): + """Returns the client's SSL certificate, if any. + + To use client certificates, the HTTPServer must have been constructed + with cert_reqs set in ssl_options, e.g.:: + + server = HTTPServer(app, + ssl_options=dict( + certfile="foo.crt", + keyfile="foo.key", + cert_reqs=ssl.CERT_REQUIRED, + ca_certs="cacert.crt")) + + By default, the return value is a dictionary (or None, if no + client certificate is present). If ``binary_form`` is true, a + DER-encoded form of the certificate is returned instead. See + SSLSocket.getpeercert() in the standard library for more + details. + http://docs.python.org/library/ssl.html#sslsocket-objects + """ + try: + return self.connection.stream.socket.getpeercert( + binary_form=binary_form) + except ssl.SSLError: + return None + + def __repr__(self): + attrs = ("protocol", "host", "method", "uri", "version", "remote_ip") + args = ", ".join(["%s=%r" % (n, getattr(self, n)) for n in attrs]) + return "%s(%s, headers=%s)" % ( + self.__class__.__name__, args, dict(self.headers)) diff --git a/lib/tornado-3.1.1/tornado/httputil.py b/lib/tornado-3.1.1/tornado/httputil.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/httputil.py @@ -0,0 +1,445 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""HTTP utility code shared by clients and servers.""" + +from __future__ import absolute_import, division, print_function, with_statement + +import calendar +import collections +import datetime +import email.utils +import numbers +import time + +from tornado.escape import native_str, parse_qs_bytes, utf8 +from tornado.log import gen_log +from tornado.util import ObjectDict + +try: + from httplib import responses # py2 +except ImportError: + from http.client import responses # py3 + +# responses is unused in this file, but we re-export it to other files. +# Reference it so pyflakes doesn't complain. +responses + +try: + from urllib import urlencode # py2 +except ImportError: + from urllib.parse import urlencode # py3 + + +class _NormalizedHeaderCache(dict): + """Dynamic cached mapping of header names to Http-Header-Case. + + Implemented as a dict subclass so that cache hits are as fast as a + normal dict lookup, without the overhead of a python function + call. + + >>> normalized_headers = _NormalizedHeaderCache(10) + >>> normalized_headers["coNtent-TYPE"] + 'Content-Type' + """ + def __init__(self, size): + super(_NormalizedHeaderCache, self).__init__() + self.size = size + self.queue = collections.deque() + + def __missing__(self, key): + normalized = "-".join([w.capitalize() for w in key.split("-")]) + self[key] = normalized + self.queue.append(key) + if len(self.queue) > self.size: + # Limit the size of the cache. LRU would be better, but this + # simpler approach should be fine. In Python 2.7+ we could + # use OrderedDict (or in 3.2+, @functools.lru_cache). + old_key = self.queue.popleft() + del self[old_key] + return normalized + +_normalized_headers = _NormalizedHeaderCache(1000) + + +class HTTPHeaders(dict): + """A dictionary that maintains ``Http-Header-Case`` for all keys. + + Supports multiple values per key via a pair of new methods, + `add()` and `get_list()`. The regular dictionary interface + returns a single value per key, with multiple values joined by a + comma. + + >>> h = HTTPHeaders({"content-type": "text/html"}) + >>> list(h.keys()) + ['Content-Type'] + >>> h["Content-Type"] + 'text/html' + + >>> h.add("Set-Cookie", "A=B") + >>> h.add("Set-Cookie", "C=D") + >>> h["set-cookie"] + 'A=B,C=D' + >>> h.get_list("set-cookie") + ['A=B', 'C=D'] + + >>> for (k,v) in sorted(h.get_all()): + ... print('%s: %s' % (k,v)) + ... + Content-Type: text/html + Set-Cookie: A=B + Set-Cookie: C=D + """ + def __init__(self, *args, **kwargs): + # Don't pass args or kwargs to dict.__init__, as it will bypass + # our __setitem__ + dict.__init__(self) + self._as_list = {} + self._last_key = None + if (len(args) == 1 and len(kwargs) == 0 and + isinstance(args[0], HTTPHeaders)): + # Copy constructor + for k, v in args[0].get_all(): + self.add(k, v) + else: + # Dict-style initialization + self.update(*args, **kwargs) + + # new public methods + + def add(self, name, value): + """Adds a new value for the given key.""" + norm_name = _normalized_headers[name] + self._last_key = norm_name + if norm_name in self: + # bypass our override of __setitem__ since it modifies _as_list + dict.__setitem__(self, norm_name, + native_str(self[norm_name]) + ',' + + native_str(value)) + self._as_list[norm_name].append(value) + else: + self[norm_name] = value + + def get_list(self, name): + """Returns all values for the given header as a list.""" + norm_name = _normalized_headers[name] + return self._as_list.get(norm_name, []) + + def get_all(self): + """Returns an iterable of all (name, value) pairs. + + If a header has multiple values, multiple pairs will be + returned with the same name. + """ + for name, values in self._as_list.items(): + for value in values: + yield (name, value) + + def parse_line(self, line): + """Updates the dictionary with a single header line. + + >>> h = HTTPHeaders() + >>> h.parse_line("Content-Type: text/html") + >>> h.get('content-type') + 'text/html' + """ + if line[0].isspace(): + # continuation of a multi-line header + new_part = ' ' + line.lstrip() + self._as_list[self._last_key][-1] += new_part + dict.__setitem__(self, self._last_key, + self[self._last_key] + new_part) + else: + name, value = line.split(":", 1) + self.add(name, value.strip()) + + @classmethod + def parse(cls, headers): + """Returns a dictionary from HTTP header text. + + >>> h = HTTPHeaders.parse("Content-Type: text/html\\r\\nContent-Length: 42\\r\\n") + >>> sorted(h.items()) + [('Content-Length', '42'), ('Content-Type', 'text/html')] + """ + h = cls() + for line in headers.splitlines(): + if line: + h.parse_line(line) + return h + + # dict implementation overrides + + def __setitem__(self, name, value): + norm_name = _normalized_headers[name] + dict.__setitem__(self, norm_name, value) + self._as_list[norm_name] = [value] + + def __getitem__(self, name): + return dict.__getitem__(self, _normalized_headers[name]) + + def __delitem__(self, name): + norm_name = _normalized_headers[name] + dict.__delitem__(self, norm_name) + del self._as_list[norm_name] + + def __contains__(self, name): + norm_name = _normalized_headers[name] + return dict.__contains__(self, norm_name) + + def get(self, name, default=None): + return dict.get(self, _normalized_headers[name], default) + + def update(self, *args, **kwargs): + # dict.update bypasses our __setitem__ + for k, v in dict(*args, **kwargs).items(): + self[k] = v + + def copy(self): + # default implementation returns dict(self), not the subclass + return HTTPHeaders(self) + + +def url_concat(url, args): + """Concatenate url and argument dictionary regardless of whether + url has existing query parameters. + + >>> url_concat("http://example.com/foo?a=b", dict(c="d")) + 'http://example.com/foo?a=b&c=d' + """ + if not args: + return url + if url[-1] not in ('?', '&'): + url += '&' if ('?' in url) else '?' + return url + urlencode(args) + + +class HTTPFile(ObjectDict): + """Represents a file uploaded via a form. + + For backwards compatibility, its instance attributes are also + accessible as dictionary keys. + + * ``filename`` + * ``body`` + * ``content_type`` + """ + pass + + +def _parse_request_range(range_header): + """Parses a Range header. + + Returns either ``None`` or tuple ``(start, end)``. + Note that while the HTTP headers use inclusive byte positions, + this method returns indexes suitable for use in slices. + + >>> start, end = _parse_request_range("bytes=1-2") + >>> start, end + (1, 3) + >>> [0, 1, 2, 3, 4][start:end] + [1, 2] + >>> _parse_request_range("bytes=6-") + (6, None) + >>> _parse_request_range("bytes=-6") + (-6, None) + >>> _parse_request_range("bytes=-0") + (None, 0) + >>> _parse_request_range("bytes=") + (None, None) + >>> _parse_request_range("foo=42") + >>> _parse_request_range("bytes=1-2,6-10") + + Note: only supports one range (ex, ``bytes=1-2,6-10`` is not allowed). + + See [0] for the details of the range header. + + [0]: http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p5-range-latest.html#byte.ranges + """ + unit, _, value = range_header.partition("=") + unit, value = unit.strip(), value.strip() + if unit != "bytes": + return None + start_b, _, end_b = value.partition("-") + try: + start = _int_or_none(start_b) + end = _int_or_none(end_b) + except ValueError: + return None + if end is not None: + if start is None: + if end != 0: + start = -end + end = None + else: + end += 1 + return (start, end) + + +def _get_content_range(start, end, total): + """Returns a suitable Content-Range header: + + >>> print(_get_content_range(None, 1, 4)) + bytes 0-0/4 + >>> print(_get_content_range(1, 3, 4)) + bytes 1-2/4 + >>> print(_get_content_range(None, None, 4)) + bytes 0-3/4 + """ + start = start or 0 + end = (end or total) - 1 + return "bytes %s-%s/%s" % (start, end, total) + + +def _int_or_none(val): + val = val.strip() + if val == "": + return None + return int(val) + + +def parse_body_arguments(content_type, body, arguments, files): + """Parses a form request body. + + Supports ``application/x-www-form-urlencoded`` and + ``multipart/form-data``. The ``content_type`` parameter should be + a string and ``body`` should be a byte string. The ``arguments`` + and ``files`` parameters are dictionaries that will be updated + with the parsed contents. + """ + if content_type.startswith("application/x-www-form-urlencoded"): + uri_arguments = parse_qs_bytes(native_str(body), keep_blank_values=True) + for name, values in uri_arguments.items(): + if values: + arguments.setdefault(name, []).extend(values) + elif content_type.startswith("multipart/form-data"): + fields = content_type.split(";") + for field in fields: + k, sep, v = field.strip().partition("=") + if k == "boundary" and v: + parse_multipart_form_data(utf8(v), body, arguments, files) + break + else: + gen_log.warning("Invalid multipart/form-data") + + +def parse_multipart_form_data(boundary, data, arguments, files): + """Parses a ``multipart/form-data`` body. + + The ``boundary`` and ``data`` parameters are both byte strings. + The dictionaries given in the arguments and files parameters + will be updated with the contents of the body. + """ + # The standard allows for the boundary to be quoted in the header, + # although it's rare (it happens at least for google app engine + # xmpp). I think we're also supposed to handle backslash-escapes + # here but I'll save that until we see a client that uses them + # in the wild. + if boundary.startswith(b'"') and boundary.endswith(b'"'): + boundary = boundary[1:-1] + final_boundary_index = data.rfind(b"--" + boundary + b"--") + if final_boundary_index == -1: + gen_log.warning("Invalid multipart/form-data: no final boundary") + return + parts = data[:final_boundary_index].split(b"--" + boundary + b"\r\n") + for part in parts: + if not part: + continue + eoh = part.find(b"\r\n\r\n") + if eoh == -1: + gen_log.warning("multipart/form-data missing headers") + continue + headers = HTTPHeaders.parse(part[:eoh].decode("utf-8")) + disp_header = headers.get("Content-Disposition", "") + disposition, disp_params = _parse_header(disp_header) + if disposition != "form-data" or not part.endswith(b"\r\n"): + gen_log.warning("Invalid multipart/form-data") + continue + value = part[eoh + 4:-2] + if not disp_params.get("name"): + gen_log.warning("multipart/form-data value missing name") + continue + name = disp_params["name"] + if disp_params.get("filename"): + ctype = headers.get("Content-Type", "application/unknown") + files.setdefault(name, []).append(HTTPFile( + filename=disp_params["filename"], body=value, + content_type=ctype)) + else: + arguments.setdefault(name, []).append(value) + + +def format_timestamp(ts): + """Formats a timestamp in the format used by HTTP. + + The argument may be a numeric timestamp as returned by `time.time`, + a time tuple as returned by `time.gmtime`, or a `datetime.datetime` + object. + + >>> format_timestamp(1359312200) + 'Sun, 27 Jan 2013 18:43:20 GMT' + """ + if isinstance(ts, numbers.Real): + pass + elif isinstance(ts, (tuple, time.struct_time)): + ts = calendar.timegm(ts) + elif isinstance(ts, datetime.datetime): + ts = calendar.timegm(ts.utctimetuple()) + else: + raise TypeError("unknown timestamp type: %r" % ts) + return email.utils.formatdate(ts, usegmt=True) + +# _parseparam and _parse_header are copied and modified from python2.7's cgi.py +# The original 2.7 version of this code did not correctly support some +# combinations of semicolons and double quotes. + + +def _parseparam(s): + while s[:1] == ';': + s = s[1:] + end = s.find(';') + while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: + end = s.find(';', end + 1) + if end < 0: + end = len(s) + f = s[:end] + yield f.strip() + s = s[end:] + + +def _parse_header(line): + """Parse a Content-type like header. + + Return the main content-type and a dictionary of options. + + """ + parts = _parseparam(';' + line) + key = next(parts) + pdict = {} + for p in parts: + i = p.find('=') + if i >= 0: + name = p[:i].strip().lower() + value = p[i + 1:].strip() + if len(value) >= 2 and value[0] == value[-1] == '"': + value = value[1:-1] + value = value.replace('\\\\', '\\').replace('\\"', '"') + pdict[name] = value + return key, pdict + + +def doctests(): + import doctest + return doctest.DocTestSuite() diff --git a/lib/tornado-3.1.1/tornado/ioloop.py b/lib/tornado-3.1.1/tornado/ioloop.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/ioloop.py @@ -0,0 +1,824 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""An I/O event loop for non-blocking sockets. + +Typical applications will use a single `IOLoop` object, in the +`IOLoop.instance` singleton. The `IOLoop.start` method should usually +be called at the end of the ``main()`` function. Atypical applications may +use more than one `IOLoop`, such as one `IOLoop` per thread, or per `unittest` +case. + +In addition to I/O events, the `IOLoop` can also schedule time-based events. +`IOLoop.add_timeout` is a non-blocking alternative to `time.sleep`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import datetime +import errno +import functools +import heapq +import logging +import numbers +import os +import select +import sys +import threading +import time +import traceback + +from tornado.concurrent import Future, TracebackFuture +from tornado.log import app_log, gen_log +from tornado import stack_context +from tornado.util import Configurable + +try: + import signal +except ImportError: + signal = None + +try: + import thread # py2 +except ImportError: + import _thread as thread # py3 + +from tornado.platform.auto import set_close_exec, Waker + + +class TimeoutError(Exception): + pass + + +class IOLoop(Configurable): + """A level-triggered I/O loop. + + We use ``epoll`` (Linux) or ``kqueue`` (BSD and Mac OS X) if they + are available, or else we fall back on select(). If you are + implementing a system that needs to handle thousands of + simultaneous connections, you should use a system that supports + either ``epoll`` or ``kqueue``. + + Example usage for a simple TCP server:: + + import errno + import functools + import ioloop + import socket + + def connection_ready(sock, fd, events): + while True: + try: + connection, address = sock.accept() + except socket.error, e: + if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN): + raise + return + connection.setblocking(0) + handle_connection(connection, address) + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(0) + sock.bind(("", port)) + sock.listen(128) + + io_loop = ioloop.IOLoop.instance() + callback = functools.partial(connection_ready, sock) + io_loop.add_handler(sock.fileno(), callback, io_loop.READ) + io_loop.start() + + """ + # Constants from the epoll module + _EPOLLIN = 0x001 + _EPOLLPRI = 0x002 + _EPOLLOUT = 0x004 + _EPOLLERR = 0x008 + _EPOLLHUP = 0x010 + _EPOLLRDHUP = 0x2000 + _EPOLLONESHOT = (1 << 30) + _EPOLLET = (1 << 31) + + # Our events map exactly to the epoll events + NONE = 0 + READ = _EPOLLIN + WRITE = _EPOLLOUT + ERROR = _EPOLLERR | _EPOLLHUP + + # Global lock for creating global IOLoop instance + _instance_lock = threading.Lock() + + _current = threading.local() + + @staticmethod + def instance(): + """Returns a global `IOLoop` instance. + + Most applications have a single, global `IOLoop` running on the + main thread. Use this method to get this instance from + another thread. To get the current thread's `IOLoop`, use `current()`. + """ + if not hasattr(IOLoop, "_instance"): + with IOLoop._instance_lock: + if not hasattr(IOLoop, "_instance"): + # New instance after double check + IOLoop._instance = IOLoop() + return IOLoop._instance + + @staticmethod + def initialized(): + """Returns true if the singleton instance has been created.""" + return hasattr(IOLoop, "_instance") + + def install(self): + """Installs this `IOLoop` object as the singleton instance. + + This is normally not necessary as `instance()` will create + an `IOLoop` on demand, but you may want to call `install` to use + a custom subclass of `IOLoop`. + """ + assert not IOLoop.initialized() + IOLoop._instance = self + + @staticmethod + def current(): + """Returns the current thread's `IOLoop`. + + If an `IOLoop` is currently running or has been marked as current + by `make_current`, returns that instance. Otherwise returns + `IOLoop.instance()`, i.e. the main thread's `IOLoop`. + + A common pattern for classes that depend on ``IOLoops`` is to use + a default argument to enable programs with multiple ``IOLoops`` + but not require the argument for simpler applications:: + + class MyClass(object): + def __init__(self, io_loop=None): + self.io_loop = io_loop or IOLoop.current() + + In general you should use `IOLoop.current` as the default when + constructing an asynchronous object, and use `IOLoop.instance` + when you mean to communicate to the main thread from a different + one. + """ + current = getattr(IOLoop._current, "instance", None) + if current is None: + return IOLoop.instance() + return current + + def make_current(self): + """Makes this the `IOLoop` for the current thread. + + An `IOLoop` automatically becomes current for its thread + when it is started, but it is sometimes useful to call + `make_current` explictly before starting the `IOLoop`, + so that code run at startup time can find the right + instance. + """ + IOLoop._current.instance = self + + @staticmethod + def clear_current(): + IOLoop._current.instance = None + + @classmethod + def configurable_base(cls): + return IOLoop + + @classmethod + def configurable_default(cls): + if hasattr(select, "epoll"): + from tornado.platform.epoll import EPollIOLoop + return EPollIOLoop + if hasattr(select, "kqueue"): + # Python 2.6+ on BSD or Mac + from tornado.platform.kqueue import KQueueIOLoop + return KQueueIOLoop + from tornado.platform.select import SelectIOLoop + return SelectIOLoop + + def initialize(self): + pass + + def close(self, all_fds=False): + """Closes the `IOLoop`, freeing any resources used. + + If ``all_fds`` is true, all file descriptors registered on the + IOLoop will be closed (not just the ones created by the + `IOLoop` itself). + + Many applications will only use a single `IOLoop` that runs for the + entire lifetime of the process. In that case closing the `IOLoop` + is not necessary since everything will be cleaned up when the + process exits. `IOLoop.close` is provided mainly for scenarios + such as unit tests, which create and destroy a large number of + ``IOLoops``. + + An `IOLoop` must be completely stopped before it can be closed. This + means that `IOLoop.stop()` must be called *and* `IOLoop.start()` must + be allowed to return before attempting to call `IOLoop.close()`. + Therefore the call to `close` will usually appear just after + the call to `start` rather than near the call to `stop`. + + .. versionchanged:: 3.1 + If the `IOLoop` implementation supports non-integer objects + for "file descriptors", those objects will have their + ``close`` method when ``all_fds`` is true. + """ + raise NotImplementedError() + + def add_handler(self, fd, handler, events): + """Registers the given handler to receive the given events for fd. + + The ``events`` argument is a bitwise or of the constants + ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``. + + When an event occurs, ``handler(fd, events)`` will be run. + """ + raise NotImplementedError() + + def update_handler(self, fd, events): + """Changes the events we listen for fd.""" + raise NotImplementedError() + + def remove_handler(self, fd): + """Stop listening for events on fd.""" + raise NotImplementedError() + + def set_blocking_signal_threshold(self, seconds, action): + """Sends a signal if the `IOLoop` is blocked for more than + ``s`` seconds. + + Pass ``seconds=None`` to disable. Requires Python 2.6 on a unixy + platform. + + The action parameter is a Python signal handler. Read the + documentation for the `signal` module for more information. + If ``action`` is None, the process will be killed if it is + blocked for too long. + """ + raise NotImplementedError() + + def set_blocking_log_threshold(self, seconds): + """Logs a stack trace if the `IOLoop` is blocked for more than + ``s`` seconds. + + Equivalent to ``set_blocking_signal_threshold(seconds, + self.log_stack)`` + """ + self.set_blocking_signal_threshold(seconds, self.log_stack) + + def log_stack(self, signal, frame): + """Signal handler to log the stack trace of the current thread. + + For use with `set_blocking_signal_threshold`. + """ + gen_log.warning('IOLoop blocked for %f seconds in\n%s', + self._blocking_signal_threshold, + ''.join(traceback.format_stack(frame))) + + def start(self): + """Starts the I/O loop. + + The loop will run until one of the callbacks calls `stop()`, which + will make the loop stop after the current event iteration completes. + """ + raise NotImplementedError() + + def stop(self): + """Stop the I/O loop. + + If the event loop is not currently running, the next call to `start()` + will return immediately. + + To use asynchronous methods from otherwise-synchronous code (such as + unit tests), you can start and stop the event loop like this:: + + ioloop = IOLoop() + async_method(ioloop=ioloop, callback=ioloop.stop) + ioloop.start() + + ``ioloop.start()`` will return after ``async_method`` has run + its callback, whether that callback was invoked before or + after ``ioloop.start``. + + Note that even after `stop` has been called, the `IOLoop` is not + completely stopped until `IOLoop.start` has also returned. + Some work that was scheduled before the call to `stop` may still + be run before the `IOLoop` shuts down. + """ + raise NotImplementedError() + + def run_sync(self, func, timeout=None): + """Starts the `IOLoop`, runs the given function, and stops the loop. + + If the function returns a `.Future`, the `IOLoop` will run + until the future is resolved. If it raises an exception, the + `IOLoop` will stop and the exception will be re-raised to the + caller. + + The keyword-only argument ``timeout`` may be used to set + a maximum duration for the function. If the timeout expires, + a `TimeoutError` is raised. + + This method is useful in conjunction with `tornado.gen.coroutine` + to allow asynchronous calls in a ``main()`` function:: + + @gen.coroutine + def main(): + # do stuff... + + if __name__ == '__main__': + IOLoop.instance().run_sync(main) + """ + future_cell = [None] + + def run(): + try: + result = func() + except Exception: + future_cell[0] = TracebackFuture() + future_cell[0].set_exc_info(sys.exc_info()) + else: + if isinstance(result, Future): + future_cell[0] = result + else: + future_cell[0] = Future() + future_cell[0].set_result(result) + self.add_future(future_cell[0], lambda future: self.stop()) + self.add_callback(run) + if timeout is not None: + timeout_handle = self.add_timeout(self.time() + timeout, self.stop) + self.start() + if timeout is not None: + self.remove_timeout(timeout_handle) + if not future_cell[0].done(): + raise TimeoutError('Operation timed out after %s seconds' % timeout) + return future_cell[0].result() + + def time(self): + """Returns the current time according to the `IOLoop`'s clock. + + The return value is a floating-point number relative to an + unspecified time in the past. + + By default, the `IOLoop`'s time function is `time.time`. However, + it may be configured to use e.g. `time.monotonic` instead. + Calls to `add_timeout` that pass a number instead of a + `datetime.timedelta` should use this function to compute the + appropriate time, so they can work no matter what time function + is chosen. + """ + return time.time() + + def add_timeout(self, deadline, callback): + """Runs the ``callback`` at the time ``deadline`` from the I/O loop. + + Returns an opaque handle that may be passed to + `remove_timeout` to cancel. + + ``deadline`` may be a number denoting a time (on the same + scale as `IOLoop.time`, normally `time.time`), or a + `datetime.timedelta` object for a deadline relative to the + current time. + + Note that it is not safe to call `add_timeout` from other threads. + Instead, you must use `add_callback` to transfer control to the + `IOLoop`'s thread, and then call `add_timeout` from there. + """ + raise NotImplementedError() + + def remove_timeout(self, timeout): + """Cancels a pending timeout. + + The argument is a handle as returned by `add_timeout`. It is + safe to call `remove_timeout` even if the callback has already + been run. + """ + raise NotImplementedError() + + def add_callback(self, callback, *args, **kwargs): + """Calls the given callback on the next I/O loop iteration. + + It is safe to call this method from any thread at any time, + except from a signal handler. Note that this is the **only** + method in `IOLoop` that makes this thread-safety guarantee; all + other interaction with the `IOLoop` must be done from that + `IOLoop`'s thread. `add_callback()` may be used to transfer + control from other threads to the `IOLoop`'s thread. + + To add a callback from a signal handler, see + `add_callback_from_signal`. + """ + raise NotImplementedError() + + def add_callback_from_signal(self, callback, *args, **kwargs): + """Calls the given callback on the next I/O loop iteration. + + Safe for use from a Python signal handler; should not be used + otherwise. + + Callbacks added with this method will be run without any + `.stack_context`, to avoid picking up the context of the function + that was interrupted by the signal. + """ + raise NotImplementedError() + + def add_future(self, future, callback): + """Schedules a callback on the ``IOLoop`` when the given + `.Future` is finished. + + The callback is invoked with one argument, the + `.Future`. + """ + assert isinstance(future, Future) + callback = stack_context.wrap(callback) + future.add_done_callback( + lambda future: self.add_callback(callback, future)) + + def _run_callback(self, callback): + """Runs a callback with error handling. + + For use in subclasses. + """ + try: + callback() + except Exception: + self.handle_callback_exception(callback) + + def handle_callback_exception(self, callback): + """This method is called whenever a callback run by the `IOLoop` + throws an exception. + + By default simply logs the exception as an error. Subclasses + may override this method to customize reporting of exceptions. + + The exception itself is not passed explicitly, but is available + in `sys.exc_info`. + """ + app_log.error("Exception in callback %r", callback, exc_info=True) + + +class PollIOLoop(IOLoop): + """Base class for IOLoops built around a select-like function. + + For concrete implementations, see `tornado.platform.epoll.EPollIOLoop` + (Linux), `tornado.platform.kqueue.KQueueIOLoop` (BSD and Mac), or + `tornado.platform.select.SelectIOLoop` (all platforms). + """ + def initialize(self, impl, time_func=None): + super(PollIOLoop, self).initialize() + self._impl = impl + if hasattr(self._impl, 'fileno'): + set_close_exec(self._impl.fileno()) + self.time_func = time_func or time.time + self._handlers = {} + self._events = {} + self._callbacks = [] + self._callback_lock = threading.Lock() + self._timeouts = [] + self._cancellations = 0 + self._running = False + self._stopped = False + self._closing = False + self._thread_ident = None + self._blocking_signal_threshold = None + + # Create a pipe that we send bogus data to when we want to wake + # the I/O loop when it is idle + self._waker = Waker() + self.add_handler(self._waker.fileno(), + lambda fd, events: self._waker.consume(), + self.READ) + + def close(self, all_fds=False): + with self._callback_lock: + self._closing = True + self.remove_handler(self._waker.fileno()) + if all_fds: + for fd in self._handlers.keys(): + try: + close_method = getattr(fd, 'close', None) + if close_method is not None: + close_method() + else: + os.close(fd) + except Exception: + gen_log.debug("error closing fd %s", fd, exc_info=True) + self._waker.close() + self._impl.close() + + def add_handler(self, fd, handler, events): + self._handlers[fd] = stack_context.wrap(handler) + self._impl.register(fd, events | self.ERROR) + + def update_handler(self, fd, events): + self._impl.modify(fd, events | self.ERROR) + + def remove_handler(self, fd): + self._handlers.pop(fd, None) + self._events.pop(fd, None) + try: + self._impl.unregister(fd) + except Exception: + gen_log.debug("Error deleting fd from IOLoop", exc_info=True) + + def set_blocking_signal_threshold(self, seconds, action): + if not hasattr(signal, "setitimer"): + gen_log.error("set_blocking_signal_threshold requires a signal module " + "with the setitimer method") + return + self._blocking_signal_threshold = seconds + if seconds is not None: + signal.signal(signal.SIGALRM, + action if action is not None else signal.SIG_DFL) + + def start(self): + if not logging.getLogger().handlers: + # The IOLoop catches and logs exceptions, so it's + # important that log output be visible. However, python's + # default behavior for non-root loggers (prior to python + # 3.2) is to print an unhelpful "no handlers could be + # found" message rather than the actual log entry, so we + # must explicitly configure logging if we've made it this + # far without anything. + logging.basicConfig() + if self._stopped: + self._stopped = False + return + old_current = getattr(IOLoop._current, "instance", None) + IOLoop._current.instance = self + self._thread_ident = thread.get_ident() + self._running = True + + # signal.set_wakeup_fd closes a race condition in event loops: + # a signal may arrive at the beginning of select/poll/etc + # before it goes into its interruptible sleep, so the signal + # will be consumed without waking the select. The solution is + # for the (C, synchronous) signal handler to write to a pipe, + # which will then be seen by select. + # + # In python's signal handling semantics, this only matters on the + # main thread (fortunately, set_wakeup_fd only works on the main + # thread and will raise a ValueError otherwise). + # + # If someone has already set a wakeup fd, we don't want to + # disturb it. This is an issue for twisted, which does its + # SIGCHILD processing in response to its own wakeup fd being + # written to. As long as the wakeup fd is registered on the IOLoop, + # the loop will still wake up and everything should work. + old_wakeup_fd = None + if hasattr(signal, 'set_wakeup_fd') and os.name == 'posix': + # requires python 2.6+, unix. set_wakeup_fd exists but crashes + # the python process on windows. + try: + old_wakeup_fd = signal.set_wakeup_fd(self._waker.write_fileno()) + if old_wakeup_fd != -1: + # Already set, restore previous value. This is a little racy, + # but there's no clean get_wakeup_fd and in real use the + # IOLoop is just started once at the beginning. + signal.set_wakeup_fd(old_wakeup_fd) + old_wakeup_fd = None + except ValueError: # non-main thread + pass + + while True: + poll_timeout = 3600.0 + + # Prevent IO event starvation by delaying new callbacks + # to the next iteration of the event loop. + with self._callback_lock: + callbacks = self._callbacks + self._callbacks = [] + for callback in callbacks: + self._run_callback(callback) + + if self._timeouts: + now = self.time() + while self._timeouts: + if self._timeouts[0].callback is None: + # the timeout was cancelled + heapq.heappop(self._timeouts) + self._cancellations -= 1 + elif self._timeouts[0].deadline <= now: + timeout = heapq.heappop(self._timeouts) + self._run_callback(timeout.callback) + else: + seconds = self._timeouts[0].deadline - now + poll_timeout = min(seconds, poll_timeout) + break + if (self._cancellations > 512 + and self._cancellations > (len(self._timeouts) >> 1)): + # Clean up the timeout queue when it gets large and it's + # more than half cancellations. + self._cancellations = 0 + self._timeouts = [x for x in self._timeouts + if x.callback is not None] + heapq.heapify(self._timeouts) + + if self._callbacks: + # If any callbacks or timeouts called add_callback, + # we don't want to wait in poll() before we run them. + poll_timeout = 0.0 + + if not self._running: + break + + if self._blocking_signal_threshold is not None: + # clear alarm so it doesn't fire while poll is waiting for + # events. + signal.setitimer(signal.ITIMER_REAL, 0, 0) + + try: + event_pairs = self._impl.poll(poll_timeout) + except Exception as e: + # Depending on python version and IOLoop implementation, + # different exception types may be thrown and there are + # two ways EINTR might be signaled: + # * e.errno == errno.EINTR + # * e.args is like (errno.EINTR, 'Interrupted system call') + if (getattr(e, 'errno', None) == errno.EINTR or + (isinstance(getattr(e, 'args', None), tuple) and + len(e.args) == 2 and e.args[0] == errno.EINTR)): + continue + else: + raise + + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, + self._blocking_signal_threshold, 0) + + # Pop one fd at a time from the set of pending fds and run + # its handler. Since that handler may perform actions on + # other file descriptors, there may be reentrant calls to + # this IOLoop that update self._events + self._events.update(event_pairs) + while self._events: + fd, events = self._events.popitem() + try: + self._handlers[fd](fd, events) + except (OSError, IOError) as e: + if e.args[0] == errno.EPIPE: + # Happens when the client closes the connection + pass + else: + app_log.error("Exception in I/O handler for fd %s", + fd, exc_info=True) + except Exception: + app_log.error("Exception in I/O handler for fd %s", + fd, exc_info=True) + # reset the stopped flag so another start/stop pair can be issued + self._stopped = False + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, 0, 0) + IOLoop._current.instance = old_current + if old_wakeup_fd is not None: + signal.set_wakeup_fd(old_wakeup_fd) + + def stop(self): + self._running = False + self._stopped = True + self._waker.wake() + + def time(self): + return self.time_func() + + def add_timeout(self, deadline, callback): + timeout = _Timeout(deadline, stack_context.wrap(callback), self) + heapq.heappush(self._timeouts, timeout) + return timeout + + def remove_timeout(self, timeout): + # Removing from a heap is complicated, so just leave the defunct + # timeout object in the queue (see discussion in + # http://docs.python.org/library/heapq.html). + # If this turns out to be a problem, we could add a garbage + # collection pass whenever there are too many dead timeouts. + timeout.callback = None + self._cancellations += 1 + + def add_callback(self, callback, *args, **kwargs): + with self._callback_lock: + if self._closing: + raise RuntimeError("IOLoop is closing") + list_empty = not self._callbacks + self._callbacks.append(functools.partial( + stack_context.wrap(callback), *args, **kwargs)) + if list_empty and thread.get_ident() != self._thread_ident: + # If we're in the IOLoop's thread, we know it's not currently + # polling. If we're not, and we added the first callback to an + # empty list, we may need to wake it up (it may wake up on its + # own, but an occasional extra wake is harmless). Waking + # up a polling IOLoop is relatively expensive, so we try to + # avoid it when we can. + self._waker.wake() + + def add_callback_from_signal(self, callback, *args, **kwargs): + with stack_context.NullContext(): + if thread.get_ident() != self._thread_ident: + # if the signal is handled on another thread, we can add + # it normally (modulo the NullContext) + self.add_callback(callback, *args, **kwargs) + else: + # If we're on the IOLoop's thread, we cannot use + # the regular add_callback because it may deadlock on + # _callback_lock. Blindly insert into self._callbacks. + # This is safe because the GIL makes list.append atomic. + # One subtlety is that if the signal interrupted the + # _callback_lock block in IOLoop.start, we may modify + # either the old or new version of self._callbacks, + # but either way will work. + self._callbacks.append(functools.partial( + stack_context.wrap(callback), *args, **kwargs)) + + +class _Timeout(object): + """An IOLoop timeout, a UNIX timestamp and a callback""" + + # Reduce memory overhead when there are lots of pending callbacks + __slots__ = ['deadline', 'callback'] + + def __init__(self, deadline, callback, io_loop): + if isinstance(deadline, numbers.Real): + self.deadline = deadline + elif isinstance(deadline, datetime.timedelta): + self.deadline = io_loop.time() + _Timeout.timedelta_to_seconds(deadline) + else: + raise TypeError("Unsupported deadline %r" % deadline) + self.callback = callback + + @staticmethod + def timedelta_to_seconds(td): + """Equivalent to td.total_seconds() (introduced in python 2.7).""" + return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6) / float(10 ** 6) + + # Comparison methods to sort by deadline, with object id as a tiebreaker + # to guarantee a consistent ordering. The heapq module uses __le__ + # in python2.5, and __lt__ in 2.6+ (sort() and most other comparisons + # use __lt__). + def __lt__(self, other): + return ((self.deadline, id(self)) < + (other.deadline, id(other))) + + def __le__(self, other): + return ((self.deadline, id(self)) <= + (other.deadline, id(other))) + + +class PeriodicCallback(object): + """Schedules the given callback to be called periodically. + + The callback is called every ``callback_time`` milliseconds. + + `start` must be called after the `PeriodicCallback` is created. + """ + def __init__(self, callback, callback_time, io_loop=None): + self.callback = callback + if callback_time <= 0: + raise ValueError("Periodic callback must have a positive callback_time") + self.callback_time = callback_time + self.io_loop = io_loop or IOLoop.current() + self._running = False + self._timeout = None + + def start(self): + """Starts the timer.""" + self._running = True + self._next_timeout = self.io_loop.time() + self._schedule_next() + + def stop(self): + """Stops the timer.""" + self._running = False + if self._timeout is not None: + self.io_loop.remove_timeout(self._timeout) + self._timeout = None + + def _run(self): + if not self._running: + return + try: + self.callback() + except Exception: + app_log.error("Error in periodic callback", exc_info=True) + self._schedule_next() + + def _schedule_next(self): + if self._running: + current_time = self.io_loop.time() + while self._next_timeout <= current_time: + self._next_timeout += self.callback_time / 1000.0 + self._timeout = self.io_loop.add_timeout(self._next_timeout, self._run) diff --git a/lib/tornado-3.1.1/tornado/iostream.py b/lib/tornado-3.1.1/tornado/iostream.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/iostream.py @@ -0,0 +1,1020 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Utility classes to write to and read from non-blocking files and sockets. + +Contents: + +* `BaseIOStream`: Generic interface for reading and writing. +* `IOStream`: Implementation of BaseIOStream using non-blocking sockets. +* `SSLIOStream`: SSL-aware version of IOStream. +* `PipeIOStream`: Pipe-based IOStream implementation. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import collections +import errno +import numbers +import os +import socket +import ssl +import sys +import re + +from tornado import ioloop +from tornado.log import gen_log, app_log +from tornado.netutil import ssl_wrap_socket, ssl_match_hostname, SSLCertificateError +from tornado import stack_context +from tornado.util import bytes_type + +try: + from tornado.platform.posix import _set_nonblocking +except ImportError: + _set_nonblocking = None + + +class StreamClosedError(IOError): + """Exception raised by `IOStream` methods when the stream is closed. + + Note that the close callback is scheduled to run *after* other + callbacks on the stream (to allow for buffered data to be processed), + so you may see this error before you see the close callback. + """ + pass + + +class BaseIOStream(object): + """A utility class to write to and read from a non-blocking file or socket. + + We support a non-blocking ``write()`` and a family of ``read_*()`` methods. + All of the methods take callbacks (since writing and reading are + non-blocking and asynchronous). + + When a stream is closed due to an error, the IOStream's ``error`` + attribute contains the exception object. + + Subclasses must implement `fileno`, `close_fd`, `write_to_fd`, + `read_from_fd`, and optionally `get_fd_error`. + """ + def __init__(self, io_loop=None, max_buffer_size=None, + read_chunk_size=4096): + self.io_loop = io_loop or ioloop.IOLoop.current() + self.max_buffer_size = max_buffer_size or 104857600 + self.read_chunk_size = read_chunk_size + self.error = None + self._read_buffer = collections.deque() + self._write_buffer = collections.deque() + self._read_buffer_size = 0 + self._write_buffer_frozen = False + self._read_delimiter = None + self._read_regex = None + self._read_bytes = None + self._read_until_close = False + self._read_callback = None + self._streaming_callback = None + self._write_callback = None + self._close_callback = None + self._connect_callback = None + self._connecting = False + self._state = None + self._pending_callbacks = 0 + self._closed = False + + def fileno(self): + """Returns the file descriptor for this stream.""" + raise NotImplementedError() + + def close_fd(self): + """Closes the file underlying this stream. + + ``close_fd`` is called by `BaseIOStream` and should not be called + elsewhere; other users should call `close` instead. + """ + raise NotImplementedError() + + def write_to_fd(self, data): + """Attempts to write ``data`` to the underlying file. + + Returns the number of bytes written. + """ + raise NotImplementedError() + + def read_from_fd(self): + """Attempts to read from the underlying file. + + Returns ``None`` if there was nothing to read (the socket + returned `~errno.EWOULDBLOCK` or equivalent), otherwise + returns the data. When possible, should return no more than + ``self.read_chunk_size`` bytes at a time. + """ + raise NotImplementedError() + + def get_fd_error(self): + """Returns information about any error on the underlying file. + + This method is called after the `.IOLoop` has signaled an error on the + file descriptor, and should return an Exception (such as `socket.error` + with additional information, or None if no such information is + available. + """ + return None + + def read_until_regex(self, regex, callback): + """Run ``callback`` when we read the given regex pattern. + + The callback will get the data read (including the data that + matched the regex and anything that came before it) as an argument. + """ + self._set_read_callback(callback) + self._read_regex = re.compile(regex) + self._try_inline_read() + + def read_until(self, delimiter, callback): + """Run ``callback`` when we read the given delimiter. + + The callback will get the data read (including the delimiter) + as an argument. + """ + self._set_read_callback(callback) + self._read_delimiter = delimiter + self._try_inline_read() + + def read_bytes(self, num_bytes, callback, streaming_callback=None): + """Run callback when we read the given number of bytes. + + If a ``streaming_callback`` is given, it will be called with chunks + of data as they become available, and the argument to the final + ``callback`` will be empty. Otherwise, the ``callback`` gets + the data as an argument. + """ + self._set_read_callback(callback) + assert isinstance(num_bytes, numbers.Integral) + self._read_bytes = num_bytes + self._streaming_callback = stack_context.wrap(streaming_callback) + self._try_inline_read() + + def read_until_close(self, callback, streaming_callback=None): + """Reads all data from the socket until it is closed. + + If a ``streaming_callback`` is given, it will be called with chunks + of data as they become available, and the argument to the final + ``callback`` will be empty. Otherwise, the ``callback`` gets the + data as an argument. + + Subject to ``max_buffer_size`` limit from `IOStream` constructor if + a ``streaming_callback`` is not used. + """ + self._set_read_callback(callback) + self._streaming_callback = stack_context.wrap(streaming_callback) + if self.closed(): + if self._streaming_callback is not None: + self._run_callback(self._streaming_callback, + self._consume(self._read_buffer_size)) + self._run_callback(self._read_callback, + self._consume(self._read_buffer_size)) + self._streaming_callback = None + self._read_callback = None + return + self._read_until_close = True + self._streaming_callback = stack_context.wrap(streaming_callback) + self._try_inline_read() + + def write(self, data, callback=None): + """Write the given data to this stream. + + If ``callback`` is given, we call it when all of the buffered write + data has been successfully written to the stream. If there was + previously buffered write data and an old write callback, that + callback is simply overwritten with this new callback. + """ + assert isinstance(data, bytes_type) + self._check_closed() + # We use bool(_write_buffer) as a proxy for write_buffer_size>0, + # so never put empty strings in the buffer. + if data: + # Break up large contiguous strings before inserting them in the + # write buffer, so we don't have to recopy the entire thing + # as we slice off pieces to send to the socket. + WRITE_BUFFER_CHUNK_SIZE = 128 * 1024 + if len(data) > WRITE_BUFFER_CHUNK_SIZE: + for i in range(0, len(data), WRITE_BUFFER_CHUNK_SIZE): + self._write_buffer.append(data[i:i + WRITE_BUFFER_CHUNK_SIZE]) + else: + self._write_buffer.append(data) + self._write_callback = stack_context.wrap(callback) + if not self._connecting: + self._handle_write() + if self._write_buffer: + self._add_io_state(self.io_loop.WRITE) + self._maybe_add_error_listener() + + def set_close_callback(self, callback): + """Call the given callback when the stream is closed.""" + self._close_callback = stack_context.wrap(callback) + + def close(self, exc_info=False): + """Close this stream. + + If ``exc_info`` is true, set the ``error`` attribute to the current + exception from `sys.exc_info` (or if ``exc_info`` is a tuple, + use that instead of `sys.exc_info`). + """ + if not self.closed(): + if exc_info: + if not isinstance(exc_info, tuple): + exc_info = sys.exc_info() + if any(exc_info): + self.error = exc_info[1] + if self._read_until_close: + if (self._streaming_callback is not None and + self._read_buffer_size): + self._run_callback(self._streaming_callback, + self._consume(self._read_buffer_size)) + callback = self._read_callback + self._read_callback = None + self._read_until_close = False + self._run_callback(callback, + self._consume(self._read_buffer_size)) + if self._state is not None: + self.io_loop.remove_handler(self.fileno()) + self._state = None + self.close_fd() + self._closed = True + self._maybe_run_close_callback() + + def _maybe_run_close_callback(self): + if (self.closed() and self._close_callback and + self._pending_callbacks == 0): + # if there are pending callbacks, don't run the close callback + # until they're done (see _maybe_add_error_handler) + cb = self._close_callback + self._close_callback = None + self._run_callback(cb) + # Delete any unfinished callbacks to break up reference cycles. + self._read_callback = self._write_callback = None + + def reading(self): + """Returns true if we are currently reading from the stream.""" + return self._read_callback is not None + + def writing(self): + """Returns true if we are currently writing to the stream.""" + return bool(self._write_buffer) + + def closed(self): + """Returns true if the stream has been closed.""" + return self._closed + + def set_nodelay(self, value): + """Sets the no-delay flag for this stream. + + By default, data written to TCP streams may be held for a time + to make the most efficient use of bandwidth (according to + Nagle's algorithm). The no-delay flag requests that data be + written as soon as possible, even if doing so would consume + additional bandwidth. + + This flag is currently defined only for TCP-based ``IOStreams``. + + .. versionadded:: 3.1 + """ + pass + + def _handle_events(self, fd, events): + if self.closed(): + gen_log.warning("Got events for closed stream %d", fd) + return + try: + if events & self.io_loop.READ: + self._handle_read() + if self.closed(): + return + if events & self.io_loop.WRITE: + if self._connecting: + self._handle_connect() + self._handle_write() + if self.closed(): + return + if events & self.io_loop.ERROR: + self.error = self.get_fd_error() + # We may have queued up a user callback in _handle_read or + # _handle_write, so don't close the IOStream until those + # callbacks have had a chance to run. + self.io_loop.add_callback(self.close) + return + state = self.io_loop.ERROR + if self.reading(): + state |= self.io_loop.READ + if self.writing(): + state |= self.io_loop.WRITE + if state == self.io_loop.ERROR: + state |= self.io_loop.READ + if state != self._state: + assert self._state is not None, \ + "shouldn't happen: _handle_events without self._state" + self._state = state + self.io_loop.update_handler(self.fileno(), self._state) + except Exception: + gen_log.error("Uncaught exception, closing connection.", + exc_info=True) + self.close(exc_info=True) + raise + + def _run_callback(self, callback, *args): + def wrapper(): + self._pending_callbacks -= 1 + try: + callback(*args) + except Exception: + app_log.error("Uncaught exception, closing connection.", + exc_info=True) + # Close the socket on an uncaught exception from a user callback + # (It would eventually get closed when the socket object is + # gc'd, but we don't want to rely on gc happening before we + # run out of file descriptors) + self.close(exc_info=True) + # Re-raise the exception so that IOLoop.handle_callback_exception + # can see it and log the error + raise + self._maybe_add_error_listener() + # We schedule callbacks to be run on the next IOLoop iteration + # rather than running them directly for several reasons: + # * Prevents unbounded stack growth when a callback calls an + # IOLoop operation that immediately runs another callback + # * Provides a predictable execution context for e.g. + # non-reentrant mutexes + # * Ensures that the try/except in wrapper() is run outside + # of the application's StackContexts + with stack_context.NullContext(): + # stack_context was already captured in callback, we don't need to + # capture it again for IOStream's wrapper. This is especially + # important if the callback was pre-wrapped before entry to + # IOStream (as in HTTPConnection._header_callback), as we could + # capture and leak the wrong context here. + self._pending_callbacks += 1 + self.io_loop.add_callback(wrapper) + + def _handle_read(self): + try: + try: + # Pretend to have a pending callback so that an EOF in + # _read_to_buffer doesn't trigger an immediate close + # callback. At the end of this method we'll either + # estabilsh a real pending callback via + # _read_from_buffer or run the close callback. + # + # We need two try statements here so that + # pending_callbacks is decremented before the `except` + # clause below (which calls `close` and does need to + # trigger the callback) + self._pending_callbacks += 1 + while not self.closed(): + # Read from the socket until we get EWOULDBLOCK or equivalent. + # SSL sockets do some internal buffering, and if the data is + # sitting in the SSL object's buffer select() and friends + # can't see it; the only way to find out if it's there is to + # try to read it. + if self._read_to_buffer() == 0: + break + finally: + self._pending_callbacks -= 1 + except Exception: + gen_log.warning("error on read", exc_info=True) + self.close(exc_info=True) + return + if self._read_from_buffer(): + return + else: + self._maybe_run_close_callback() + + def _set_read_callback(self, callback): + assert not self._read_callback, "Already reading" + self._read_callback = stack_context.wrap(callback) + + def _try_inline_read(self): + """Attempt to complete the current read operation from buffered data. + + If the read can be completed without blocking, schedules the + read callback on the next IOLoop iteration; otherwise starts + listening for reads on the socket. + """ + # See if we've already got the data from a previous read + if self._read_from_buffer(): + return + self._check_closed() + try: + try: + # See comments in _handle_read about incrementing _pending_callbacks + self._pending_callbacks += 1 + while not self.closed(): + if self._read_to_buffer() == 0: + break + finally: + self._pending_callbacks -= 1 + except Exception: + # If there was an in _read_to_buffer, we called close() already, + # but couldn't run the close callback because of _pending_callbacks. + # Before we escape from this function, run the close callback if + # applicable. + self._maybe_run_close_callback() + raise + if self._read_from_buffer(): + return + self._maybe_add_error_listener() + + def _read_to_buffer(self): + """Reads from the socket and appends the result to the read buffer. + + Returns the number of bytes read. Returns 0 if there is nothing + to read (i.e. the read returns EWOULDBLOCK or equivalent). On + error closes the socket and raises an exception. + """ + try: + chunk = self.read_from_fd() + except (socket.error, IOError, OSError) as e: + # ssl.SSLError is a subclass of socket.error + if e.args[0] == errno.ECONNRESET: + # Treat ECONNRESET as a connection close rather than + # an error to minimize log spam (the exception will + # be available on self.error for apps that care). + self.close(exc_info=True) + return + self.close(exc_info=True) + raise + if chunk is None: + return 0 + self._read_buffer.append(chunk) + self._read_buffer_size += len(chunk) + if self._read_buffer_size >= self.max_buffer_size: + gen_log.error("Reached maximum read buffer size") + self.close() + raise IOError("Reached maximum read buffer size") + return len(chunk) + + def _read_from_buffer(self): + """Attempts to complete the currently-pending read from the buffer. + + Returns True if the read was completed. + """ + if self._streaming_callback is not None and self._read_buffer_size: + bytes_to_consume = self._read_buffer_size + if self._read_bytes is not None: + bytes_to_consume = min(self._read_bytes, bytes_to_consume) + self._read_bytes -= bytes_to_consume + self._run_callback(self._streaming_callback, + self._consume(bytes_to_consume)) + if self._read_bytes is not None and self._read_buffer_size >= self._read_bytes: + num_bytes = self._read_bytes + callback = self._read_callback + self._read_callback = None + self._streaming_callback = None + self._read_bytes = None + self._run_callback(callback, self._consume(num_bytes)) + return True + elif self._read_delimiter is not None: + # Multi-byte delimiters (e.g. '\r\n') may straddle two + # chunks in the read buffer, so we can't easily find them + # without collapsing the buffer. However, since protocols + # using delimited reads (as opposed to reads of a known + # length) tend to be "line" oriented, the delimiter is likely + # to be in the first few chunks. Merge the buffer gradually + # since large merges are relatively expensive and get undone in + # consume(). + if self._read_buffer: + while True: + loc = self._read_buffer[0].find(self._read_delimiter) + if loc != -1: + callback = self._read_callback + delimiter_len = len(self._read_delimiter) + self._read_callback = None + self._streaming_callback = None + self._read_delimiter = None + self._run_callback(callback, + self._consume(loc + delimiter_len)) + return True + if len(self._read_buffer) == 1: + break + _double_prefix(self._read_buffer) + elif self._read_regex is not None: + if self._read_buffer: + while True: + m = self._read_regex.search(self._read_buffer[0]) + if m is not None: + callback = self._read_callback + self._read_callback = None + self._streaming_callback = None + self._read_regex = None + self._run_callback(callback, self._consume(m.end())) + return True + if len(self._read_buffer) == 1: + break + _double_prefix(self._read_buffer) + return False + + def _handle_write(self): + while self._write_buffer: + try: + if not self._write_buffer_frozen: + # On windows, socket.send blows up if given a + # write buffer that's too large, instead of just + # returning the number of bytes it was able to + # process. Therefore we must not call socket.send + # with more than 128KB at a time. + _merge_prefix(self._write_buffer, 128 * 1024) + num_bytes = self.write_to_fd(self._write_buffer[0]) + if num_bytes == 0: + # With OpenSSL, if we couldn't write the entire buffer, + # the very same string object must be used on the + # next call to send. Therefore we suppress + # merging the write buffer after an incomplete send. + # A cleaner solution would be to set + # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER, but this is + # not yet accessible from python + # (http://bugs.python.org/issue8240) + self._write_buffer_frozen = True + break + self._write_buffer_frozen = False + _merge_prefix(self._write_buffer, num_bytes) + self._write_buffer.popleft() + except socket.error as e: + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + self._write_buffer_frozen = True + break + else: + if e.args[0] not in (errno.EPIPE, errno.ECONNRESET): + # Broken pipe errors are usually caused by connection + # reset, and its better to not log EPIPE errors to + # minimize log spam + gen_log.warning("Write error on %d: %s", + self.fileno(), e) + self.close(exc_info=True) + return + if not self._write_buffer and self._write_callback: + callback = self._write_callback + self._write_callback = None + self._run_callback(callback) + + def _consume(self, loc): + if loc == 0: + return b"" + _merge_prefix(self._read_buffer, loc) + self._read_buffer_size -= loc + return self._read_buffer.popleft() + + def _check_closed(self): + if self.closed(): + raise StreamClosedError("Stream is closed") + + def _maybe_add_error_listener(self): + if self._state is None and self._pending_callbacks == 0: + if self.closed(): + self._maybe_run_close_callback() + else: + self._add_io_state(ioloop.IOLoop.READ) + + def _add_io_state(self, state): + """Adds `state` (IOLoop.{READ,WRITE} flags) to our event handler. + + Implementation notes: Reads and writes have a fast path and a + slow path. The fast path reads synchronously from socket + buffers, while the slow path uses `_add_io_state` to schedule + an IOLoop callback. Note that in both cases, the callback is + run asynchronously with `_run_callback`. + + To detect closed connections, we must have called + `_add_io_state` at some point, but we want to delay this as + much as possible so we don't have to set an `IOLoop.ERROR` + listener that will be overwritten by the next slow-path + operation. As long as there are callbacks scheduled for + fast-path ops, those callbacks may do more reads. + If a sequence of fast-path ops do not end in a slow-path op, + (e.g. for an @asynchronous long-poll request), we must add + the error handler. This is done in `_run_callback` and `write` + (since the write callback is optional so we can have a + fast-path write with no `_run_callback`) + """ + if self.closed(): + # connection has been closed, so there can be no future events + return + if self._state is None: + self._state = ioloop.IOLoop.ERROR | state + with stack_context.NullContext(): + self.io_loop.add_handler( + self.fileno(), self._handle_events, self._state) + elif not self._state & state: + self._state = self._state | state + self.io_loop.update_handler(self.fileno(), self._state) + + +class IOStream(BaseIOStream): + r"""Socket-based `IOStream` implementation. + + This class supports the read and write methods from `BaseIOStream` + plus a `connect` method. + + The ``socket`` parameter may either be connected or unconnected. + For server operations the socket is the result of calling + `socket.accept `. For client operations the + socket is created with `socket.socket`, and may either be + connected before passing it to the `IOStream` or connected with + `IOStream.connect`. + + A very simple (and broken) HTTP client using this class:: + + import tornado.ioloop + import tornado.iostream + import socket + + def send_request(): + stream.write(b"GET / HTTP/1.0\r\nHost: friendfeed.com\r\n\r\n") + stream.read_until(b"\r\n\r\n", on_headers) + + def on_headers(data): + headers = {} + for line in data.split(b"\r\n"): + parts = line.split(b":") + if len(parts) == 2: + headers[parts[0].strip()] = parts[1].strip() + stream.read_bytes(int(headers[b"Content-Length"]), on_body) + + def on_body(data): + print data + stream.close() + tornado.ioloop.IOLoop.instance().stop() + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + stream = tornado.iostream.IOStream(s) + stream.connect(("friendfeed.com", 80), send_request) + tornado.ioloop.IOLoop.instance().start() + """ + def __init__(self, socket, *args, **kwargs): + self.socket = socket + self.socket.setblocking(False) + super(IOStream, self).__init__(*args, **kwargs) + + def fileno(self): + return self.socket.fileno() + + def close_fd(self): + self.socket.close() + self.socket = None + + def get_fd_error(self): + errno = self.socket.getsockopt(socket.SOL_SOCKET, + socket.SO_ERROR) + return socket.error(errno, os.strerror(errno)) + + def read_from_fd(self): + try: + chunk = self.socket.recv(self.read_chunk_size) + except socket.error as e: + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + return None + else: + raise + if not chunk: + self.close() + return None + return chunk + + def write_to_fd(self, data): + return self.socket.send(data) + + def connect(self, address, callback=None, server_hostname=None): + """Connects the socket to a remote address without blocking. + + May only be called if the socket passed to the constructor was + not previously connected. The address parameter is in the + same format as for `socket.connect `, + i.e. a ``(host, port)`` tuple. If ``callback`` is specified, + it will be called when the connection is completed. + + If specified, the ``server_hostname`` parameter will be used + in SSL connections for certificate validation (if requested in + the ``ssl_options``) and SNI (if supported; requires + Python 3.2+). + + Note that it is safe to call `IOStream.write + ` while the connection is pending, in + which case the data will be written as soon as the connection + is ready. Calling `IOStream` read methods before the socket is + connected works on some platforms but is non-portable. + """ + self._connecting = True + try: + self.socket.connect(address) + except socket.error as e: + # In non-blocking mode we expect connect() to raise an + # exception with EINPROGRESS or EWOULDBLOCK. + # + # On freebsd, other errors such as ECONNREFUSED may be + # returned immediately when attempting to connect to + # localhost, so handle them the same way as an error + # reported later in _handle_connect. + if e.args[0] not in (errno.EINPROGRESS, errno.EWOULDBLOCK): + gen_log.warning("Connect error on fd %d: %s", + self.socket.fileno(), e) + self.close(exc_info=True) + return + self._connect_callback = stack_context.wrap(callback) + self._add_io_state(self.io_loop.WRITE) + + def _handle_connect(self): + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + self.error = socket.error(err, os.strerror(err)) + # IOLoop implementations may vary: some of them return + # an error state before the socket becomes writable, so + # in that case a connection failure would be handled by the + # error path in _handle_events instead of here. + gen_log.warning("Connect error on fd %d: %s", + self.socket.fileno(), errno.errorcode[err]) + self.close() + return + if self._connect_callback is not None: + callback = self._connect_callback + self._connect_callback = None + self._run_callback(callback) + self._connecting = False + + def set_nodelay(self, value): + if (self.socket is not None and + self.socket.family in (socket.AF_INET, socket.AF_INET6)): + try: + self.socket.setsockopt(socket.IPPROTO_TCP, + socket.TCP_NODELAY, 1 if value else 0) + except socket.error as e: + # Sometimes setsockopt will fail if the socket is closed + # at the wrong time. This can happen with HTTPServer + # resetting the value to false between requests. + if e.errno != errno.EINVAL: + raise + + +class SSLIOStream(IOStream): + """A utility class to write to and read from a non-blocking SSL socket. + + If the socket passed to the constructor is already connected, + it should be wrapped with:: + + ssl.wrap_socket(sock, do_handshake_on_connect=False, **kwargs) + + before constructing the `SSLIOStream`. Unconnected sockets will be + wrapped when `IOStream.connect` is finished. + """ + def __init__(self, *args, **kwargs): + """The ``ssl_options`` keyword argument may either be a dictionary + of keywords arguments for `ssl.wrap_socket`, or an `ssl.SSLContext` + object. + """ + self._ssl_options = kwargs.pop('ssl_options', {}) + super(SSLIOStream, self).__init__(*args, **kwargs) + self._ssl_accepting = True + self._handshake_reading = False + self._handshake_writing = False + self._ssl_connect_callback = None + self._server_hostname = None + + def reading(self): + return self._handshake_reading or super(SSLIOStream, self).reading() + + def writing(self): + return self._handshake_writing or super(SSLIOStream, self).writing() + + def _do_ssl_handshake(self): + # Based on code from test_ssl.py in the python stdlib + try: + self._handshake_reading = False + self._handshake_writing = False + self.socket.do_handshake() + except ssl.SSLError as err: + if err.args[0] == ssl.SSL_ERROR_WANT_READ: + self._handshake_reading = True + return + elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE: + self._handshake_writing = True + return + elif err.args[0] in (ssl.SSL_ERROR_EOF, + ssl.SSL_ERROR_ZERO_RETURN): + return self.close(exc_info=True) + elif err.args[0] == ssl.SSL_ERROR_SSL: + try: + peer = self.socket.getpeername() + except Exception: + peer = '(not connected)' + gen_log.warning("SSL Error on %d %s: %s", + self.socket.fileno(), peer, err) + return self.close(exc_info=True) + raise + except socket.error as err: + if err.args[0] in (errno.ECONNABORTED, errno.ECONNRESET): + return self.close(exc_info=True) + except AttributeError: + # On Linux, if the connection was reset before the call to + # wrap_socket, do_handshake will fail with an + # AttributeError. + return self.close(exc_info=True) + else: + self._ssl_accepting = False + if not self._verify_cert(self.socket.getpeercert()): + self.close() + return + if self._ssl_connect_callback is not None: + callback = self._ssl_connect_callback + self._ssl_connect_callback = None + self._run_callback(callback) + + def _verify_cert(self, peercert): + """Returns True if peercert is valid according to the configured + validation mode and hostname. + + The ssl handshake already tested the certificate for a valid + CA signature; the only thing that remains is to check + the hostname. + """ + if isinstance(self._ssl_options, dict): + verify_mode = self._ssl_options.get('cert_reqs', ssl.CERT_NONE) + elif isinstance(self._ssl_options, ssl.SSLContext): + verify_mode = self._ssl_options.verify_mode + assert verify_mode in (ssl.CERT_NONE, ssl.CERT_REQUIRED, ssl.CERT_OPTIONAL) + if verify_mode == ssl.CERT_NONE or self._server_hostname is None: + return True + cert = self.socket.getpeercert() + if cert is None and verify_mode == ssl.CERT_REQUIRED: + gen_log.warning("No SSL certificate given") + return False + try: + ssl_match_hostname(peercert, self._server_hostname) + except SSLCertificateError: + gen_log.warning("Invalid SSL certificate", exc_info=True) + return False + else: + return True + + def _handle_read(self): + if self._ssl_accepting: + self._do_ssl_handshake() + return + super(SSLIOStream, self)._handle_read() + + def _handle_write(self): + if self._ssl_accepting: + self._do_ssl_handshake() + return + super(SSLIOStream, self)._handle_write() + + def connect(self, address, callback=None, server_hostname=None): + # Save the user's callback and run it after the ssl handshake + # has completed. + self._ssl_connect_callback = stack_context.wrap(callback) + self._server_hostname = server_hostname + super(SSLIOStream, self).connect(address, callback=None) + + def _handle_connect(self): + # When the connection is complete, wrap the socket for SSL + # traffic. Note that we do this by overriding _handle_connect + # instead of by passing a callback to super().connect because + # user callbacks are enqueued asynchronously on the IOLoop, + # but since _handle_events calls _handle_connect immediately + # followed by _handle_write we need this to be synchronous. + self.socket = ssl_wrap_socket(self.socket, self._ssl_options, + server_hostname=self._server_hostname, + do_handshake_on_connect=False) + super(SSLIOStream, self)._handle_connect() + + def read_from_fd(self): + if self._ssl_accepting: + # If the handshake hasn't finished yet, there can't be anything + # to read (attempting to read may or may not raise an exception + # depending on the SSL version) + return None + try: + # SSLSocket objects have both a read() and recv() method, + # while regular sockets only have recv(). + # The recv() method blocks (at least in python 2.6) if it is + # called when there is nothing to read, so we have to use + # read() instead. + chunk = self.socket.read(self.read_chunk_size) + except ssl.SSLError as e: + # SSLError is a subclass of socket.error, so this except + # block must come first. + if e.args[0] == ssl.SSL_ERROR_WANT_READ: + return None + else: + raise + except socket.error as e: + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + return None + else: + raise + if not chunk: + self.close() + return None + return chunk + + +class PipeIOStream(BaseIOStream): + """Pipe-based `IOStream` implementation. + + The constructor takes an integer file descriptor (such as one returned + by `os.pipe`) rather than an open file object. Pipes are generally + one-way, so a `PipeIOStream` can be used for reading or writing but not + both. + """ + def __init__(self, fd, *args, **kwargs): + self.fd = fd + _set_nonblocking(fd) + super(PipeIOStream, self).__init__(*args, **kwargs) + + def fileno(self): + return self.fd + + def close_fd(self): + os.close(self.fd) + + def write_to_fd(self, data): + return os.write(self.fd, data) + + def read_from_fd(self): + try: + chunk = os.read(self.fd, self.read_chunk_size) + except (IOError, OSError) as e: + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + return None + elif e.args[0] == errno.EBADF: + # If the writing half of a pipe is closed, select will + # report it as readable but reads will fail with EBADF. + self.close(exc_info=True) + return None + else: + raise + if not chunk: + self.close() + return None + return chunk + + +def _double_prefix(deque): + """Grow by doubling, but don't split the second chunk just because the + first one is small. + """ + new_len = max(len(deque[0]) * 2, + (len(deque[0]) + len(deque[1]))) + _merge_prefix(deque, new_len) + + +def _merge_prefix(deque, size): + """Replace the first entries in a deque of strings with a single + string of up to size bytes. + + >>> d = collections.deque(['abc', 'de', 'fghi', 'j']) + >>> _merge_prefix(d, 5); print(d) + deque(['abcde', 'fghi', 'j']) + + Strings will be split as necessary to reach the desired size. + >>> _merge_prefix(d, 7); print(d) + deque(['abcdefg', 'hi', 'j']) + + >>> _merge_prefix(d, 3); print(d) + deque(['abc', 'defg', 'hi', 'j']) + + >>> _merge_prefix(d, 100); print(d) + deque(['abcdefghij']) + """ + if len(deque) == 1 and len(deque[0]) <= size: + return + prefix = [] + remaining = size + while deque and remaining > 0: + chunk = deque.popleft() + if len(chunk) > remaining: + deque.appendleft(chunk[remaining:]) + chunk = chunk[:remaining] + prefix.append(chunk) + remaining -= len(chunk) + # This data structure normally just contains byte strings, but + # the unittest gets messy if it doesn't use the default str() type, + # so do the merge based on the type of data that's actually present. + if prefix: + deque.appendleft(type(prefix[0])().join(prefix)) + if not deque: + deque.appendleft(b"") + + +def doctests(): + import doctest + return doctest.DocTestSuite() diff --git a/lib/tornado-3.1.1/tornado/locale.py b/lib/tornado-3.1.1/tornado/locale.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/locale.py @@ -0,0 +1,513 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Translation methods for generating localized strings. + +To load a locale and generate a translated string:: + + user_locale = tornado.locale.get("es_LA") + print user_locale.translate("Sign out") + +`tornado.locale.get()` returns the closest matching locale, not necessarily the +specific locale you requested. You can support pluralization with +additional arguments to `~Locale.translate()`, e.g.:: + + people = [...] + message = user_locale.translate( + "%(list)s is online", "%(list)s are online", len(people)) + print message % {"list": user_locale.list(people)} + +The first string is chosen if ``len(people) == 1``, otherwise the second +string is chosen. + +Applications should call one of `load_translations` (which uses a simple +CSV format) or `load_gettext_translations` (which uses the ``.mo`` format +supported by `gettext` and related tools). If neither method is called, +the `Locale.translate` method will simply return the original string. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import csv +import datetime +import numbers +import os +import re + +from tornado import escape +from tornado.log import gen_log +from tornado.util import u + +_default_locale = "en_US" +_translations = {} +_supported_locales = frozenset([_default_locale]) +_use_gettext = False + + +def get(*locale_codes): + """Returns the closest match for the given locale codes. + + We iterate over all given locale codes in order. If we have a tight + or a loose match for the code (e.g., "en" for "en_US"), we return + the locale. Otherwise we move to the next code in the list. + + By default we return ``en_US`` if no translations are found for any of + the specified locales. You can change the default locale with + `set_default_locale()`. + """ + return Locale.get_closest(*locale_codes) + + +def set_default_locale(code): + """Sets the default locale. + + The default locale is assumed to be the language used for all strings + in the system. The translations loaded from disk are mappings from + the default locale to the destination locale. Consequently, you don't + need to create a translation file for the default locale. + """ + global _default_locale + global _supported_locales + _default_locale = code + _supported_locales = frozenset(list(_translations.keys()) + [_default_locale]) + + +def load_translations(directory): + """Loads translations from CSV files in a directory. + + Translations are strings with optional Python-style named placeholders + (e.g., ``My name is %(name)s``) and their associated translations. + + The directory should have translation files of the form ``LOCALE.csv``, + e.g. ``es_GT.csv``. The CSV files should have two or three columns: string, + translation, and an optional plural indicator. Plural indicators should + be one of "plural" or "singular". A given string can have both singular + and plural forms. For example ``%(name)s liked this`` may have a + different verb conjugation depending on whether %(name)s is one + name or a list of names. There should be two rows in the CSV file for + that string, one with plural indicator "singular", and one "plural". + For strings with no verbs that would change on translation, simply + use "unknown" or the empty string (or don't include the column at all). + + The file is read using the `csv` module in the default "excel" dialect. + In this format there should not be spaces after the commas. + + Example translation ``es_LA.csv``:: + + "I love you","Te amo" + "%(name)s liked this","A %(name)s les gust? esto","plural" + "%(name)s liked this","A %(name)s le gust? esto","singular" + + """ + global _translations + global _supported_locales + _translations = {} + for path in os.listdir(directory): + if not path.endswith(".csv"): + continue + locale, extension = path.split(".") + if not re.match("[a-z]+(_[A-Z]+)?$", locale): + gen_log.error("Unrecognized locale %r (path: %s)", locale, + os.path.join(directory, path)) + continue + full_path = os.path.join(directory, path) + try: + # python 3: csv.reader requires a file open in text mode. + # Force utf8 to avoid dependence on $LANG environment variable. + f = open(full_path, "r", encoding="utf-8") + except TypeError: + # python 2: files return byte strings, which are decoded below. + f = open(full_path, "r") + _translations[locale] = {} + for i, row in enumerate(csv.reader(f)): + if not row or len(row) < 2: + continue + row = [escape.to_unicode(c).strip() for c in row] + english, translation = row[:2] + if len(row) > 2: + plural = row[2] or "unknown" + else: + plural = "unknown" + if plural not in ("plural", "singular", "unknown"): + gen_log.error("Unrecognized plural indicator %r in %s line %d", + plural, path, i + 1) + continue + _translations[locale].setdefault(plural, {})[english] = translation + f.close() + _supported_locales = frozenset(list(_translations.keys()) + [_default_locale]) + gen_log.debug("Supported locales: %s", sorted(_supported_locales)) + + +def load_gettext_translations(directory, domain): + """Loads translations from `gettext`'s locale tree + + Locale tree is similar to system's ``/usr/share/locale``, like:: + + {directory}/{lang}/LC_MESSAGES/{domain}.mo + + Three steps are required to have you app translated: + + 1. Generate POT translation file:: + + xgettext --language=Python --keyword=_:1,2 -d mydomain file1.py file2.html etc + + 2. Merge against existing POT file:: + + msgmerge old.po mydomain.po > new.po + + 3. Compile:: + + msgfmt mydomain.po -o {directory}/pt_BR/LC_MESSAGES/mydomain.mo + """ + import gettext + global _translations + global _supported_locales + global _use_gettext + _translations = {} + for lang in os.listdir(directory): + if lang.startswith('.'): + continue # skip .svn, etc + if os.path.isfile(os.path.join(directory, lang)): + continue + try: + os.stat(os.path.join(directory, lang, "LC_MESSAGES", domain + ".mo")) + _translations[lang] = gettext.translation(domain, directory, + languages=[lang]) + except Exception as e: + gen_log.error("Cannot load translation for '%s': %s", lang, str(e)) + continue + _supported_locales = frozenset(list(_translations.keys()) + [_default_locale]) + _use_gettext = True + gen_log.debug("Supported locales: %s", sorted(_supported_locales)) + + +def get_supported_locales(): + """Returns a list of all the supported locale codes.""" + return _supported_locales + + +class Locale(object): + """Object representing a locale. + + After calling one of `load_translations` or `load_gettext_translations`, + call `get` or `get_closest` to get a Locale object. + """ + @classmethod + def get_closest(cls, *locale_codes): + """Returns the closest match for the given locale code.""" + for code in locale_codes: + if not code: + continue + code = code.replace("-", "_") + parts = code.split("_") + if len(parts) > 2: + continue + elif len(parts) == 2: + code = parts[0].lower() + "_" + parts[1].upper() + if code in _supported_locales: + return cls.get(code) + if parts[0].lower() in _supported_locales: + return cls.get(parts[0].lower()) + return cls.get(_default_locale) + + @classmethod + def get(cls, code): + """Returns the Locale for the given locale code. + + If it is not supported, we raise an exception. + """ + if not hasattr(cls, "_cache"): + cls._cache = {} + if code not in cls._cache: + assert code in _supported_locales + translations = _translations.get(code, None) + if translations is None: + locale = CSVLocale(code, {}) + elif _use_gettext: + locale = GettextLocale(code, translations) + else: + locale = CSVLocale(code, translations) + cls._cache[code] = locale + return cls._cache[code] + + def __init__(self, code, translations): + self.code = code + self.name = LOCALE_NAMES.get(code, {}).get("name", u("Unknown")) + self.rtl = False + for prefix in ["fa", "ar", "he"]: + if self.code.startswith(prefix): + self.rtl = True + break + self.translations = translations + + # Initialize strings for date formatting + _ = self.translate + self._months = [ + _("January"), _("February"), _("March"), _("April"), + _("May"), _("June"), _("July"), _("August"), + _("September"), _("October"), _("November"), _("December")] + self._weekdays = [ + _("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), + _("Friday"), _("Saturday"), _("Sunday")] + + def translate(self, message, plural_message=None, count=None): + """Returns the translation for the given message for this locale. + + If ``plural_message`` is given, you must also provide + ``count``. We return ``plural_message`` when ``count != 1``, + and we return the singular form for the given message when + ``count == 1``. + """ + raise NotImplementedError() + + def format_date(self, date, gmt_offset=0, relative=True, shorter=False, + full_format=False): + """Formats the given date (which should be GMT). + + By default, we return a relative time (e.g., "2 minutes ago"). You + can return an absolute date string with ``relative=False``. + + You can force a full format date ("July 10, 1980") with + ``full_format=True``. + + This method is primarily intended for dates in the past. + For dates in the future, we fall back to full format. + """ + if self.code.startswith("ru"): + relative = False + if isinstance(date, numbers.Real): + date = datetime.datetime.utcfromtimestamp(date) + now = datetime.datetime.utcnow() + if date > now: + if relative and (date - now).seconds < 60: + # Due to click skew, things are some things slightly + # in the future. Round timestamps in the immediate + # future down to now in relative mode. + date = now + else: + # Otherwise, future dates always use the full format. + full_format = True + local_date = date - datetime.timedelta(minutes=gmt_offset) + local_now = now - datetime.timedelta(minutes=gmt_offset) + local_yesterday = local_now - datetime.timedelta(hours=24) + difference = now - date + seconds = difference.seconds + days = difference.days + + _ = self.translate + format = None + if not full_format: + if relative and days == 0: + if seconds < 50: + return _("1 second ago", "%(seconds)d seconds ago", + seconds) % {"seconds": seconds} + + if seconds < 50 * 60: + minutes = round(seconds / 60.0) + return _("1 minute ago", "%(minutes)d minutes ago", + minutes) % {"minutes": minutes} + + hours = round(seconds / (60.0 * 60)) + return _("1 hour ago", "%(hours)d hours ago", + hours) % {"hours": hours} + + if days == 0: + format = _("%(time)s") + elif days == 1 and local_date.day == local_yesterday.day and \ + relative: + format = _("yesterday") if shorter else \ + _("yesterday at %(time)s") + elif days < 5: + format = _("%(weekday)s") if shorter else \ + _("%(weekday)s at %(time)s") + elif days < 334: # 11mo, since confusing for same month last year + format = _("%(month_name)s %(day)s") if shorter else \ + _("%(month_name)s %(day)s at %(time)s") + + if format is None: + format = _("%(month_name)s %(day)s, %(year)s") if shorter else \ + _("%(month_name)s %(day)s, %(year)s at %(time)s") + + tfhour_clock = self.code not in ("en", "en_US", "zh_CN") + if tfhour_clock: + str_time = "%d:%02d" % (local_date.hour, local_date.minute) + elif self.code == "zh_CN": + str_time = "%s%d:%02d" % ( + (u('\u4e0a\u5348'), u('\u4e0b\u5348'))[local_date.hour >= 12], + local_date.hour % 12 or 12, local_date.minute) + else: + str_time = "%d:%02d %s" % ( + local_date.hour % 12 or 12, local_date.minute, + ("am", "pm")[local_date.hour >= 12]) + + return format % { + "month_name": self._months[local_date.month - 1], + "weekday": self._weekdays[local_date.weekday()], + "day": str(local_date.day), + "year": str(local_date.year), + "time": str_time + } + + def format_day(self, date, gmt_offset=0, dow=True): + """Formats the given date as a day of week. + + Example: "Monday, January 22". You can remove the day of week with + ``dow=False``. + """ + local_date = date - datetime.timedelta(minutes=gmt_offset) + _ = self.translate + if dow: + return _("%(weekday)s, %(month_name)s %(day)s") % { + "month_name": self._months[local_date.month - 1], + "weekday": self._weekdays[local_date.weekday()], + "day": str(local_date.day), + } + else: + return _("%(month_name)s %(day)s") % { + "month_name": self._months[local_date.month - 1], + "day": str(local_date.day), + } + + def list(self, parts): + """Returns a comma-separated list for the given list of parts. + + The format is, e.g., "A, B and C", "A and B" or just "A" for lists + of size 1. + """ + _ = self.translate + if len(parts) == 0: + return "" + if len(parts) == 1: + return parts[0] + comma = u(' \u0648 ') if self.code.startswith("fa") else u(", ") + return _("%(commas)s and %(last)s") % { + "commas": comma.join(parts[:-1]), + "last": parts[len(parts) - 1], + } + + def friendly_number(self, value): + """Returns a comma-separated number for the given integer.""" + if self.code not in ("en", "en_US"): + return str(value) + value = str(value) + parts = [] + while value: + parts.append(value[-3:]) + value = value[:-3] + return ",".join(reversed(parts)) + + +class CSVLocale(Locale): + """Locale implementation using tornado's CSV translation format.""" + def translate(self, message, plural_message=None, count=None): + if plural_message is not None: + assert count is not None + if count != 1: + message = plural_message + message_dict = self.translations.get("plural", {}) + else: + message_dict = self.translations.get("singular", {}) + else: + message_dict = self.translations.get("unknown", {}) + return message_dict.get(message, message) + + +class GettextLocale(Locale): + """Locale implementation using the `gettext` module.""" + def __init__(self, code, translations): + try: + # python 2 + self.ngettext = translations.ungettext + self.gettext = translations.ugettext + except AttributeError: + # python 3 + self.ngettext = translations.ngettext + self.gettext = translations.gettext + # self.gettext must exist before __init__ is called, since it + # calls into self.translate + super(GettextLocale, self).__init__(code, translations) + + def translate(self, message, plural_message=None, count=None): + if plural_message is not None: + assert count is not None + return self.ngettext(message, plural_message, count) + else: + return self.gettext(message) + +LOCALE_NAMES = { + "af_ZA": {"name_en": u("Afrikaans"), "name": u("Afrikaans")}, + "am_ET": {"name_en": u("Amharic"), "name": u('\u12a0\u121b\u122d\u129b')}, + "ar_AR": {"name_en": u("Arabic"), "name": u("\u0627\u0644\u0639\u0631\u0628\u064a\u0629")}, + "bg_BG": {"name_en": u("Bulgarian"), "name": u("\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438")}, + "bn_IN": {"name_en": u("Bengali"), "name": u("\u09ac\u09be\u0982\u09b2\u09be")}, + "bs_BA": {"name_en": u("Bosnian"), "name": u("Bosanski")}, + "ca_ES": {"name_en": u("Catalan"), "name": u("Catal\xe0")}, + "cs_CZ": {"name_en": u("Czech"), "name": u("\u010ce\u0161tina")}, + "cy_GB": {"name_en": u("Welsh"), "name": u("Cymraeg")}, + "da_DK": {"name_en": u("Danish"), "name": u("Dansk")}, + "de_DE": {"name_en": u("German"), "name": u("Deutsch")}, + "el_GR": {"name_en": u("Greek"), "name": u("\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac")}, + "en_GB": {"name_en": u("English (UK)"), "name": u("English (UK)")}, + "en_US": {"name_en": u("English (US)"), "name": u("English (US)")}, + "es_ES": {"name_en": u("Spanish (Spain)"), "name": u("Espa\xf1ol (Espa\xf1a)")}, + "es_LA": {"name_en": u("Spanish"), "name": u("Espa\xf1ol")}, + "et_EE": {"name_en": u("Estonian"), "name": u("Eesti")}, + "eu_ES": {"name_en": u("Basque"), "name": u("Euskara")}, + "fa_IR": {"name_en": u("Persian"), "name": u("\u0641\u0627\u0631\u0633\u06cc")}, + "fi_FI": {"name_en": u("Finnish"), "name": u("Suomi")}, + "fr_CA": {"name_en": u("French (Canada)"), "name": u("Fran\xe7ais (Canada)")}, + "fr_FR": {"name_en": u("French"), "name": u("Fran\xe7ais")}, + "ga_IE": {"name_en": u("Irish"), "name": u("Gaeilge")}, + "gl_ES": {"name_en": u("Galician"), "name": u("Galego")}, + "he_IL": {"name_en": u("Hebrew"), "name": u("\u05e2\u05d1\u05e8\u05d9\u05ea")}, + "hi_IN": {"name_en": u("Hindi"), "name": u("\u0939\u093f\u0928\u094d\u0926\u0940")}, + "hr_HR": {"name_en": u("Croatian"), "name": u("Hrvatski")}, + "hu_HU": {"name_en": u("Hungarian"), "name": u("Magyar")}, + "id_ID": {"name_en": u("Indonesian"), "name": u("Bahasa Indonesia")}, + "is_IS": {"name_en": u("Icelandic"), "name": u("\xcdslenska")}, + "it_IT": {"name_en": u("Italian"), "name": u("Italiano")}, + "ja_JP": {"name_en": u("Japanese"), "name": u("\u65e5\u672c\u8a9e")}, + "ko_KR": {"name_en": u("Korean"), "name": u("\ud55c\uad6d\uc5b4")}, + "lt_LT": {"name_en": u("Lithuanian"), "name": u("Lietuvi\u0173")}, + "lv_LV": {"name_en": u("Latvian"), "name": u("Latvie\u0161u")}, + "mk_MK": {"name_en": u("Macedonian"), "name": u("\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438")}, + "ml_IN": {"name_en": u("Malayalam"), "name": u("\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02")}, + "ms_MY": {"name_en": u("Malay"), "name": u("Bahasa Melayu")}, + "nb_NO": {"name_en": u("Norwegian (bokmal)"), "name": u("Norsk (bokm\xe5l)")}, + "nl_NL": {"name_en": u("Dutch"), "name": u("Nederlands")}, + "nn_NO": {"name_en": u("Norwegian (nynorsk)"), "name": u("Norsk (nynorsk)")}, + "pa_IN": {"name_en": u("Punjabi"), "name": u("\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40")}, + "pl_PL": {"name_en": u("Polish"), "name": u("Polski")}, + "pt_BR": {"name_en": u("Portuguese (Brazil)"), "name": u("Portugu\xeas (Brasil)")}, + "pt_PT": {"name_en": u("Portuguese (Portugal)"), "name": u("Portugu\xeas (Portugal)")}, + "ro_RO": {"name_en": u("Romanian"), "name": u("Rom\xe2n\u0103")}, + "ru_RU": {"name_en": u("Russian"), "name": u("\u0420\u0443\u0441\u0441\u043a\u0438\u0439")}, + "sk_SK": {"name_en": u("Slovak"), "name": u("Sloven\u010dina")}, + "sl_SI": {"name_en": u("Slovenian"), "name": u("Sloven\u0161\u010dina")}, + "sq_AL": {"name_en": u("Albanian"), "name": u("Shqip")}, + "sr_RS": {"name_en": u("Serbian"), "name": u("\u0421\u0440\u043f\u0441\u043a\u0438")}, + "sv_SE": {"name_en": u("Swedish"), "name": u("Svenska")}, + "sw_KE": {"name_en": u("Swahili"), "name": u("Kiswahili")}, + "ta_IN": {"name_en": u("Tamil"), "name": u("\u0ba4\u0bae\u0bbf\u0bb4\u0bcd")}, + "te_IN": {"name_en": u("Telugu"), "name": u("\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41")}, + "th_TH": {"name_en": u("Thai"), "name": u("\u0e20\u0e32\u0e29\u0e32\u0e44\u0e17\u0e22")}, + "tl_PH": {"name_en": u("Filipino"), "name": u("Filipino")}, + "tr_TR": {"name_en": u("Turkish"), "name": u("T\xfcrk\xe7e")}, + "uk_UA": {"name_en": u("Ukraini "), "name": u("\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430")}, + "vi_VN": {"name_en": u("Vietnamese"), "name": u("Ti\u1ebfng Vi\u1ec7t")}, + "zh_CN": {"name_en": u("Chinese (Simplified)"), "name": u("\u4e2d\u6587(\u7b80\u4f53)")}, + "zh_TW": {"name_en": u("Chinese (Traditional)"), "name": u("\u4e2d\u6587(\u7e41\u9ad4)")}, +} diff --git a/lib/tornado-3.1.1/tornado/log.py b/lib/tornado-3.1.1/tornado/log.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/log.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Logging support for Tornado. + +Tornado uses three logger streams: + +* ``tornado.access``: Per-request logging for Tornado's HTTP servers (and + potentially other servers in the future) +* ``tornado.application``: Logging of errors from application code (i.e. + uncaught exceptions from callbacks) +* ``tornado.general``: General-purpose logging, including any errors + or warnings from Tornado itself. + +These streams may be configured independently using the standard library's +`logging` module. For example, you may wish to send ``tornado.access`` logs +to a separate file for analysis. +""" +from __future__ import absolute_import, division, print_function, with_statement + +import logging +import logging.handlers +import sys +import time + +from tornado.escape import _unicode +from tornado.util import unicode_type, basestring_type + +try: + import curses +except ImportError: + curses = None + +# Logger objects for internal tornado use +access_log = logging.getLogger("tornado.access") +app_log = logging.getLogger("tornado.application") +gen_log = logging.getLogger("tornado.general") + + +def _stderr_supports_color(): + color = False + if curses and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +class LogFormatter(logging.Formatter): + """Log formatter used in Tornado. + + Key features of this formatter are: + + * Color support when logging to a terminal that supports it. + * Timestamps on every log line. + * Robust against str/bytes encoding problems. + + This formatter is enabled automatically by + `tornado.options.parse_command_line` (unless ``--logging=none`` is + used). + """ + def __init__(self, color=True, *args, **kwargs): + logging.Formatter.__init__(self, *args, **kwargs) + self._color = color and _stderr_supports_color() + if self._color: + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = unicode_type(fg_color, "ascii") + self._colors = { + logging.DEBUG: unicode_type(curses.tparm(fg_color, 4), # Blue + "ascii"), + logging.INFO: unicode_type(curses.tparm(fg_color, 2), # Green + "ascii"), + logging.WARNING: unicode_type(curses.tparm(fg_color, 3), # Yellow + "ascii"), + logging.ERROR: unicode_type(curses.tparm(fg_color, 1), # Red + "ascii"), + } + self._normal = unicode_type(curses.tigetstr("sgr0"), "ascii") + + def format(self, record): + try: + record.message = record.getMessage() + except Exception as e: + record.message = "Bad message (%r): %r" % (e, record.__dict__) + assert isinstance(record.message, basestring_type) # guaranteed by logging + record.asctime = time.strftime( + "%y%m%d %H:%M:%S", self.converter(record.created)) + prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \ + record.__dict__ + if self._color: + prefix = (self._colors.get(record.levelno, self._normal) + + prefix + self._normal) + + # Encoding notes: The logging module prefers to work with character + # strings, but only enforces that log messages are instances of + # basestring. In python 2, non-ascii bytestrings will make + # their way through the logging framework until they blow up with + # an unhelpful decoding error (with this formatter it happens + # when we attach the prefix, but there are other opportunities for + # exceptions further along in the framework). + # + # If a byte string makes it this far, convert it to unicode to + # ensure it will make it out to the logs. Use repr() as a fallback + # to ensure that all byte strings can be converted successfully, + # but don't do it by default so we don't add extra quotes to ascii + # bytestrings. This is a bit of a hacky place to do this, but + # it's worth it since the encoding errors that would otherwise + # result are so useless (and tornado is fond of using utf8-encoded + # byte strings whereever possible). + def safe_unicode(s): + try: + return _unicode(s) + except UnicodeDecodeError: + return repr(s) + + formatted = prefix + " " + safe_unicode(record.message) + if record.exc_info: + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + if record.exc_text: + # exc_text contains multiple lines. We need to safe_unicode + # each line separately so that non-utf8 bytes don't cause + # all the newlines to turn into '\n'. + lines = [formatted.rstrip()] + lines.extend(safe_unicode(ln) for ln in record.exc_text.split('\n')) + formatted = '\n'.join(lines) + return formatted.replace("\n", "\n ") + + +def enable_pretty_logging(options=None, logger=None): + """Turns on formatted logging output as configured. + + This is called automaticaly by `tornado.options.parse_command_line` + and `tornado.options.parse_config_file`. + """ + if options is None: + from tornado.options import options + if options.logging == 'none': + return + if logger is None: + logger = logging.getLogger() + logger.setLevel(getattr(logging, options.logging.upper())) + if options.log_file_prefix: + channel = logging.handlers.RotatingFileHandler( + filename=options.log_file_prefix, + maxBytes=options.log_file_max_size, + backupCount=options.log_file_num_backups) + channel.setFormatter(LogFormatter(color=False)) + logger.addHandler(channel) + + if (options.log_to_stderr or + (options.log_to_stderr is None and not logger.handlers)): + # Set up color if we are in a tty and curses is installed + channel = logging.StreamHandler() + channel.setFormatter(LogFormatter()) + logger.addHandler(channel) + + +def define_logging_options(options=None): + if options is None: + # late import to prevent cycle + from tornado.options import options + options.define("logging", default="info", + help=("Set the Python log level. If 'none', tornado won't touch the " + "logging configuration."), + metavar="debug|info|warning|error|none") + options.define("log_to_stderr", type=bool, default=None, + help=("Send log output to stderr (colorized if possible). " + "By default use stderr if --log_file_prefix is not set and " + "no other logging is configured.")) + options.define("log_file_prefix", type=str, default=None, metavar="PATH", + help=("Path prefix for log files. " + "Note that if you are running multiple tornado processes, " + "log_file_prefix must be different for each of them (e.g. " + "include the port number)")) + options.define("log_file_max_size", type=int, default=100 * 1000 * 1000, + help="max size of log files before rollover") + options.define("log_file_num_backups", type=int, default=10, + help="number of log files to keep") + + options.add_parse_callback(enable_pretty_logging) diff --git a/lib/tornado-3.1.1/tornado/netutil.py b/lib/tornado-3.1.1/tornado/netutil.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/netutil.py @@ -0,0 +1,459 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Miscellaneous network utility code.""" + +from __future__ import absolute_import, division, print_function, with_statement + +import errno +import os +import re +import socket +import ssl +import stat + +from tornado.concurrent import dummy_executor, run_on_executor +from tornado.ioloop import IOLoop +from tornado.platform.auto import set_close_exec +from tornado.util import Configurable + + +def bind_sockets(port, address=None, family=socket.AF_UNSPEC, backlog=128, flags=None): + """Creates listening sockets bound to the given port and address. + + Returns a list of socket objects (multiple sockets are returned if + the given address maps to multiple IP addresses, which is most common + for mixed IPv4 and IPv6 use). + + Address may be either an IP address or hostname. If it's a hostname, + the server will listen on all IP addresses associated with the + name. Address may be an empty string or None to listen on all + available interfaces. Family may be set to either `socket.AF_INET` + or `socket.AF_INET6` to restrict to IPv4 or IPv6 addresses, otherwise + both will be used if available. + + The ``backlog`` argument has the same meaning as for + `socket.listen() `. + + ``flags`` is a bitmask of AI_* flags to `~socket.getaddrinfo`, like + ``socket.AI_PASSIVE | socket.AI_NUMERICHOST``. + """ + sockets = [] + if address == "": + address = None + if not socket.has_ipv6 and family == socket.AF_UNSPEC: + # Python can be compiled with --disable-ipv6, which causes + # operations on AF_INET6 sockets to fail, but does not + # automatically exclude those results from getaddrinfo + # results. + # http://bugs.python.org/issue16208 + family = socket.AF_INET + if flags is None: + flags = socket.AI_PASSIVE + for res in set(socket.getaddrinfo(address, port, family, socket.SOCK_STREAM, + 0, flags)): + af, socktype, proto, canonname, sockaddr = res + try: + sock = socket.socket(af, socktype, proto) + except socket.error as e: + if e.args[0] == errno.EAFNOSUPPORT: + continue + raise + set_close_exec(sock.fileno()) + if os.name != 'nt': + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + if af == socket.AF_INET6: + # On linux, ipv6 sockets accept ipv4 too by default, + # but this makes it impossible to bind to both + # 0.0.0.0 in ipv4 and :: in ipv6. On other systems, + # separate sockets *must* be used to listen for both ipv4 + # and ipv6. For consistency, always disable ipv4 on our + # ipv6 sockets and use a separate ipv4 socket when needed. + # + # Python 2.x on windows doesn't have IPPROTO_IPV6. + if hasattr(socket, "IPPROTO_IPV6"): + sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) + sock.setblocking(0) + sock.bind(sockaddr) + sock.listen(backlog) + sockets.append(sock) + return sockets + +if hasattr(socket, 'AF_UNIX'): + def bind_unix_socket(file, mode=0o600, backlog=128): + """Creates a listening unix socket. + + If a socket with the given name already exists, it will be deleted. + If any other file with that name exists, an exception will be + raised. + + Returns a socket object (not a list of socket objects like + `bind_sockets`) + """ + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + set_close_exec(sock.fileno()) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(0) + try: + st = os.stat(file) + except OSError as err: + if err.errno != errno.ENOENT: + raise + else: + if stat.S_ISSOCK(st.st_mode): + os.remove(file) + else: + raise ValueError("File %s exists and is not a socket", file) + sock.bind(file) + os.chmod(file, mode) + sock.listen(backlog) + return sock + + +def add_accept_handler(sock, callback, io_loop=None): + """Adds an `.IOLoop` event handler to accept new connections on ``sock``. + + When a connection is accepted, ``callback(connection, address)`` will + be run (``connection`` is a socket object, and ``address`` is the + address of the other end of the connection). Note that this signature + is different from the ``callback(fd, events)`` signature used for + `.IOLoop` handlers. + """ + if io_loop is None: + io_loop = IOLoop.current() + + def accept_handler(fd, events): + while True: + try: + connection, address = sock.accept() + except socket.error as e: + # EWOULDBLOCK and EAGAIN indicate we have accepted every + # connection that is available. + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + return + # ECONNABORTED indicates that there was a connection + # but it was closed while still in the accept queue. + # (observed on FreeBSD). + if e.args[0] == errno.ECONNABORTED: + continue + raise + callback(connection, address) + io_loop.add_handler(sock.fileno(), accept_handler, IOLoop.READ) + + +def is_valid_ip(ip): + """Returns true if the given string is a well-formed IP address. + + Supports IPv4 and IPv6. + """ + try: + res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC, + socket.SOCK_STREAM, + 0, socket.AI_NUMERICHOST) + return bool(res) + except socket.gaierror as e: + if e.args[0] == socket.EAI_NONAME: + return False + raise + return True + + +class Resolver(Configurable): + """Configurable asynchronous DNS resolver interface. + + By default, a blocking implementation is used (which simply calls + `socket.getaddrinfo`). An alternative implementation can be + chosen with the `Resolver.configure <.Configurable.configure>` + class method:: + + Resolver.configure('tornado.netutil.ThreadedResolver') + + The implementations of this interface included with Tornado are + + * `tornado.netutil.BlockingResolver` + * `tornado.netutil.ThreadedResolver` + * `tornado.netutil.OverrideResolver` + * `tornado.platform.twisted.TwistedResolver` + * `tornado.platform.caresresolver.CaresResolver` + """ + @classmethod + def configurable_base(cls): + return Resolver + + @classmethod + def configurable_default(cls): + return BlockingResolver + + def resolve(self, host, port, family=socket.AF_UNSPEC, callback=None): + """Resolves an address. + + The ``host`` argument is a string which may be a hostname or a + literal IP address. + + Returns a `.Future` whose result is a list of (family, + address) pairs, where address is a tuple suitable to pass to + `socket.connect ` (i.e. a ``(host, + port)`` pair for IPv4; additional fields may be present for + IPv6). If a ``callback`` is passed, it will be run with the + result as an argument when it is complete. + """ + raise NotImplementedError() + + def close(self): + """Closes the `Resolver`, freeing any resources used. + + .. versionadded:: 3.1 + + """ + pass + + +class ExecutorResolver(Resolver): + """Resolver implementation using a `concurrent.futures.Executor`. + + Use this instead of `ThreadedResolver` when you require additional + control over the executor being used. + + The executor will be shut down when the resolver is closed unless + ``close_resolver=False``; use this if you want to reuse the same + executor elsewhere. + """ + def initialize(self, io_loop=None, executor=None, close_executor=True): + self.io_loop = io_loop or IOLoop.current() + if executor is not None: + self.executor = executor + self.close_executor = close_executor + else: + self.executor = dummy_executor + self.close_executor = False + + def close(self): + if self.close_executor: + self.executor.shutdown() + self.executor = None + + @run_on_executor + def resolve(self, host, port, family=socket.AF_UNSPEC): + # On Solaris, getaddrinfo fails if the given port is not found + # in /etc/services and no socket type is given, so we must pass + # one here. The socket type used here doesn't seem to actually + # matter (we discard the one we get back in the results), + # so the addresses we return should still be usable with SOCK_DGRAM. + addrinfo = socket.getaddrinfo(host, port, family, socket.SOCK_STREAM) + results = [] + for family, socktype, proto, canonname, address in addrinfo: + results.append((family, address)) + return results + + +class BlockingResolver(ExecutorResolver): + """Default `Resolver` implementation, using `socket.getaddrinfo`. + + The `.IOLoop` will be blocked during the resolution, although the + callback will not be run until the next `.IOLoop` iteration. + """ + def initialize(self, io_loop=None): + super(BlockingResolver, self).initialize(io_loop=io_loop) + + +class ThreadedResolver(ExecutorResolver): + """Multithreaded non-blocking `Resolver` implementation. + + Requires the `concurrent.futures` package to be installed + (available in the standard library since Python 3.2, + installable with ``pip install futures`` in older versions). + + The thread pool size can be configured with:: + + Resolver.configure('tornado.netutil.ThreadedResolver', + num_threads=10) + + .. versionchanged:: 3.1 + All ``ThreadedResolvers`` share a single thread pool, whose + size is set by the first one to be created. + """ + _threadpool = None + _threadpool_pid = None + + def initialize(self, io_loop=None, num_threads=10): + threadpool = ThreadedResolver._create_threadpool(num_threads) + super(ThreadedResolver, self).initialize( + io_loop=io_loop, executor=threadpool, close_executor=False) + + @classmethod + def _create_threadpool(cls, num_threads): + pid = os.getpid() + if cls._threadpool_pid != pid: + # Threads cannot survive after a fork, so if our pid isn't what it + # was when we created the pool then delete it. + cls._threadpool = None + if cls._threadpool is None: + from concurrent.futures import ThreadPoolExecutor + cls._threadpool = ThreadPoolExecutor(num_threads) + cls._threadpool_pid = pid + return cls._threadpool + + +class OverrideResolver(Resolver): + """Wraps a resolver with a mapping of overrides. + + This can be used to make local DNS changes (e.g. for testing) + without modifying system-wide settings. + + The mapping can contain either host strings or host-port pairs. + """ + def initialize(self, resolver, mapping): + self.resolver = resolver + self.mapping = mapping + + def close(self): + self.resolver.close() + + def resolve(self, host, port, *args, **kwargs): + if (host, port) in self.mapping: + host, port = self.mapping[(host, port)] + elif host in self.mapping: + host = self.mapping[host] + return self.resolver.resolve(host, port, *args, **kwargs) + + +# These are the keyword arguments to ssl.wrap_socket that must be translated +# to their SSLContext equivalents (the other arguments are still passed +# to SSLContext.wrap_socket). +_SSL_CONTEXT_KEYWORDS = frozenset(['ssl_version', 'certfile', 'keyfile', + 'cert_reqs', 'ca_certs', 'ciphers']) + + +def ssl_options_to_context(ssl_options): + """Try to convert an ``ssl_options`` dictionary to an + `~ssl.SSLContext` object. + + The ``ssl_options`` dictionary contains keywords to be passed to + `ssl.wrap_socket`. In Python 3.2+, `ssl.SSLContext` objects can + be used instead. This function converts the dict form to its + `~ssl.SSLContext` equivalent, and may be used when a component which + accepts both forms needs to upgrade to the `~ssl.SSLContext` version + to use features like SNI or NPN. + """ + if isinstance(ssl_options, dict): + assert all(k in _SSL_CONTEXT_KEYWORDS for k in ssl_options), ssl_options + if (not hasattr(ssl, 'SSLContext') or + isinstance(ssl_options, ssl.SSLContext)): + return ssl_options + context = ssl.SSLContext( + ssl_options.get('ssl_version', ssl.PROTOCOL_SSLv23)) + if 'certfile' in ssl_options: + context.load_cert_chain(ssl_options['certfile'], ssl_options.get('keyfile', None)) + if 'cert_reqs' in ssl_options: + context.verify_mode = ssl_options['cert_reqs'] + if 'ca_certs' in ssl_options: + context.load_verify_locations(ssl_options['ca_certs']) + if 'ciphers' in ssl_options: + context.set_ciphers(ssl_options['ciphers']) + return context + + +def ssl_wrap_socket(socket, ssl_options, server_hostname=None, **kwargs): + """Returns an ``ssl.SSLSocket`` wrapping the given socket. + + ``ssl_options`` may be either a dictionary (as accepted by + `ssl_options_to_context`) or an `ssl.SSLContext` object. + Additional keyword arguments are passed to ``wrap_socket`` + (either the `~ssl.SSLContext` method or the `ssl` module function + as appropriate). + """ + context = ssl_options_to_context(ssl_options) + if hasattr(ssl, 'SSLContext') and isinstance(context, ssl.SSLContext): + if server_hostname is not None and getattr(ssl, 'HAS_SNI'): + # Python doesn't have server-side SNI support so we can't + # really unittest this, but it can be manually tested with + # python3.2 -m tornado.httpclient https://sni.velox.ch + return context.wrap_socket(socket, server_hostname=server_hostname, + **kwargs) + else: + return context.wrap_socket(socket, **kwargs) + else: + return ssl.wrap_socket(socket, **dict(context, **kwargs)) + +if hasattr(ssl, 'match_hostname') and hasattr(ssl, 'CertificateError'): # python 3.2+ + ssl_match_hostname = ssl.match_hostname + SSLCertificateError = ssl.CertificateError +else: + # match_hostname was added to the standard library ssl module in python 3.2. + # The following code was backported for older releases and copied from + # https://bitbucket.org/brandon/backports.ssl_match_hostname + class SSLCertificateError(ValueError): + pass + + def _dnsname_to_pat(dn, max_wildcards=1): + pats = [] + for frag in dn.split(r'.'): + if frag.count('*') > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survery of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise SSLCertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + + def ssl_match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise SSLCertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise SSLCertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise SSLCertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/lib/tornado-3.1.1/tornado/options.py b/lib/tornado-3.1.1/tornado/options.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/options.py @@ -0,0 +1,539 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""A command line parsing module that lets modules define their own options. + +Each module defines its own options which are added to the global +option namespace, e.g.:: + + from tornado.options import define, options + + define("mysql_host", default="127.0.0.1:3306", help="Main user DB") + define("memcache_hosts", default="127.0.0.1:11011", multiple=True, + help="Main user memcache servers") + + def connect(): + db = database.Connection(options.mysql_host) + ... + +The ``main()`` method of your application does not need to be aware of all of +the options used throughout your program; they are all automatically loaded +when the modules are loaded. However, all modules that define options +must have been imported before the command line is parsed. + +Your ``main()`` method can parse the command line or parse a config file with +either:: + + tornado.options.parse_command_line() + # or + tornado.options.parse_config_file("/etc/server.conf") + +Command line formats are what you would expect (``--myoption=myvalue``). +Config files are just Python files. Global names become options, e.g.:: + + myoption = "myvalue" + myotheroption = "myothervalue" + +We support `datetimes `, `timedeltas +`, ints, and floats (just pass a ``type`` kwarg to +`define`). We also accept multi-value options. See the documentation for +`define()` below. + +`tornado.options.options` is a singleton instance of `OptionParser`, and +the top-level functions in this module (`define`, `parse_command_line`, etc) +simply call methods on it. You may create additional `OptionParser` +instances to define isolated sets of options, such as for subcommands. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import datetime +import numbers +import re +import sys +import os +import textwrap + +from tornado.escape import _unicode +from tornado.log import define_logging_options +from tornado import stack_context +from tornado.util import basestring_type, exec_in + + +class Error(Exception): + """Exception raised by errors in the options module.""" + pass + + +class OptionParser(object): + """A collection of options, a dictionary with object-like access. + + Normally accessed via static functions in the `tornado.options` module, + which reference a global instance. + """ + def __init__(self): + # we have to use self.__dict__ because we override setattr. + self.__dict__['_options'] = {} + self.__dict__['_parse_callbacks'] = [] + self.define("help", type=bool, help="show this help information", + callback=self._help_callback) + + def __getattr__(self, name): + if isinstance(self._options.get(name), _Option): + return self._options[name].value() + raise AttributeError("Unrecognized option %r" % name) + + def __setattr__(self, name, value): + if isinstance(self._options.get(name), _Option): + return self._options[name].set(value) + raise AttributeError("Unrecognized option %r" % name) + + def __iter__(self): + return iter(self._options) + + def __getitem__(self, item): + return self._options[item].value() + + def items(self): + """A sequence of (name, value) pairs. + + .. versionadded:: 3.1 + """ + return [(name, opt.value()) for name, opt in self._options.items()] + + def groups(self): + """The set of option-groups created by ``define``. + + .. versionadded:: 3.1 + """ + return set(opt.group_name for opt in self._options.values()) + + def group_dict(self, group): + """The names and values of options in a group. + + Useful for copying options into Application settings:: + + from tornado.options import define, parse_command_line, options + + define('template_path', group='application') + define('static_path', group='application') + + parse_command_line() + + application = Application( + handlers, **options.group_dict('application')) + + .. versionadded:: 3.1 + """ + return dict( + (name, opt.value()) for name, opt in self._options.items() + if not group or group == opt.group_name) + + def as_dict(self): + """The names and values of all options. + + .. versionadded:: 3.1 + """ + return dict( + (name, opt.value()) for name, opt in self._options.items()) + + def define(self, name, default=None, type=None, help=None, metavar=None, + multiple=False, group=None, callback=None): + """Defines a new command line option. + + If ``type`` is given (one of str, float, int, datetime, or timedelta) + or can be inferred from the ``default``, we parse the command line + arguments based on the given type. If ``multiple`` is True, we accept + comma-separated values, and the option value is always a list. + + For multi-value integers, we also accept the syntax ``x:y``, which + turns into ``range(x, y)`` - very useful for long integer ranges. + + ``help`` and ``metavar`` are used to construct the + automatically generated command line help string. The help + message is formatted like:: + + --name=METAVAR help string + + ``group`` is used to group the defined options in logical + groups. By default, command line options are grouped by the + file in which they are defined. + + Command line option names must be unique globally. They can be parsed + from the command line with `parse_command_line` or parsed from a + config file with `parse_config_file`. + + If a ``callback`` is given, it will be run with the new value whenever + the option is changed. This can be used to combine command-line + and file-based options:: + + define("config", type=str, help="path to config file", + callback=lambda path: parse_config_file(path, final=False)) + + With this definition, options in the file specified by ``--config`` will + override options set earlier on the command line, but can be overridden + by later flags. + """ + if name in self._options: + raise Error("Option %r already defined in %s" % + (name, self._options[name].file_name)) + frame = sys._getframe(0) + options_file = frame.f_code.co_filename + file_name = frame.f_back.f_code.co_filename + if file_name == options_file: + file_name = "" + if type is None: + if not multiple and default is not None: + type = default.__class__ + else: + type = str + if group: + group_name = group + else: + group_name = file_name + self._options[name] = _Option(name, file_name=file_name, + default=default, type=type, help=help, + metavar=metavar, multiple=multiple, + group_name=group_name, + callback=callback) + + def parse_command_line(self, args=None, final=True): + """Parses all options given on the command line (defaults to + `sys.argv`). + + Note that ``args[0]`` is ignored since it is the program name + in `sys.argv`. + + We return a list of all arguments that are not parsed as options. + + If ``final`` is ``False``, parse callbacks will not be run. + This is useful for applications that wish to combine configurations + from multiple sources. + """ + if args is None: + args = sys.argv + remaining = [] + for i in range(1, len(args)): + # All things after the last option are command line arguments + if not args[i].startswith("-"): + remaining = args[i:] + break + if args[i] == "--": + remaining = args[i + 1:] + break + arg = args[i].lstrip("-") + name, equals, value = arg.partition("=") + name = name.replace('-', '_') + if not name in self._options: + self.print_help() + raise Error('Unrecognized command line option: %r' % name) + option = self._options[name] + if not equals: + if option.type == bool: + value = "true" + else: + raise Error('Option %r requires a value' % name) + option.parse(value) + + if final: + self.run_parse_callbacks() + + return remaining + + def parse_config_file(self, path, final=True): + """Parses and loads the Python config file at the given path. + + If ``final`` is ``False``, parse callbacks will not be run. + This is useful for applications that wish to combine configurations + from multiple sources. + """ + config = {} + with open(path) as f: + exec_in(f.read(), config, config) + for name in config: + if name in self._options: + self._options[name].set(config[name]) + + if final: + self.run_parse_callbacks() + + def print_help(self, file=None): + """Prints all the command line options to stderr (or another file).""" + if file is None: + file = sys.stderr + print("Usage: %s [OPTIONS]" % sys.argv[0], file=file) + print("\nOptions:\n", file=file) + by_group = {} + for option in self._options.values(): + by_group.setdefault(option.group_name, []).append(option) + + for filename, o in sorted(by_group.items()): + if filename: + print("\n%s options:\n" % os.path.normpath(filename), file=file) + o.sort(key=lambda option: option.name) + for option in o: + prefix = option.name + if option.metavar: + prefix += "=" + option.metavar + description = option.help or "" + if option.default is not None and option.default != '': + description += " (default %s)" % option.default + lines = textwrap.wrap(description, 79 - 35) + if len(prefix) > 30 or len(lines) == 0: + lines.insert(0, '') + print(" --%-30s %s" % (prefix, lines[0]), file=file) + for line in lines[1:]: + print("%-34s %s" % (' ', line), file=file) + print(file=file) + + def _help_callback(self, value): + if value: + self.print_help() + sys.exit(0) + + def add_parse_callback(self, callback): + """Adds a parse callback, to be invoked when option parsing is done.""" + self._parse_callbacks.append(stack_context.wrap(callback)) + + def run_parse_callbacks(self): + for callback in self._parse_callbacks: + callback() + + def mockable(self): + """Returns a wrapper around self that is compatible with + `mock.patch `. + + The `mock.patch ` function (included in + the standard library `unittest.mock` package since Python 3.3, + or in the third-party ``mock`` package for older versions of + Python) is incompatible with objects like ``options`` that + override ``__getattr__`` and ``__setattr__``. This function + returns an object that can be used with `mock.patch.object + ` to modify option values:: + + with mock.patch.object(options.mockable(), 'name', value): + assert options.name == value + """ + return _Mockable(self) + + +class _Mockable(object): + """`mock.patch` compatible wrapper for `OptionParser`. + + As of ``mock`` version 1.0.1, when an object uses ``__getattr__`` + hooks instead of ``__dict__``, ``patch.__exit__`` tries to delete + the attribute it set instead of setting a new one (assuming that + the object does not catpure ``__setattr__``, so the patch + created a new attribute in ``__dict__``). + + _Mockable's getattr and setattr pass through to the underlying + OptionParser, and delattr undoes the effect of a previous setattr. + """ + def __init__(self, options): + # Modify __dict__ directly to bypass __setattr__ + self.__dict__['_options'] = options + self.__dict__['_originals'] = {} + + def __getattr__(self, name): + return getattr(self._options, name) + + def __setattr__(self, name, value): + assert name not in self._originals, "don't reuse mockable objects" + self._originals[name] = getattr(self._options, name) + setattr(self._options, name, value) + + def __delattr__(self, name): + setattr(self._options, name, self._originals.pop(name)) + + +class _Option(object): + def __init__(self, name, default=None, type=basestring_type, help=None, + metavar=None, multiple=False, file_name=None, group_name=None, + callback=None): + if default is None and multiple: + default = [] + self.name = name + self.type = type + self.help = help + self.metavar = metavar + self.multiple = multiple + self.file_name = file_name + self.group_name = group_name + self.callback = callback + self.default = default + self._value = None + + def value(self): + return self.default if self._value is None else self._value + + def parse(self, value): + _parse = { + datetime.datetime: self._parse_datetime, + datetime.timedelta: self._parse_timedelta, + bool: self._parse_bool, + basestring_type: self._parse_string, + }.get(self.type, self.type) + if self.multiple: + self._value = [] + for part in value.split(","): + if issubclass(self.type, numbers.Integral): + # allow ranges of the form X:Y (inclusive at both ends) + lo, _, hi = part.partition(":") + lo = _parse(lo) + hi = _parse(hi) if hi else lo + self._value.extend(range(lo, hi + 1)) + else: + self._value.append(_parse(part)) + else: + self._value = _parse(value) + if self.callback is not None: + self.callback(self._value) + return self.value() + + def set(self, value): + if self.multiple: + if not isinstance(value, list): + raise Error("Option %r is required to be a list of %s" % + (self.name, self.type.__name__)) + for item in value: + if item is not None and not isinstance(item, self.type): + raise Error("Option %r is required to be a list of %s" % + (self.name, self.type.__name__)) + else: + if value is not None and not isinstance(value, self.type): + raise Error("Option %r is required to be a %s (%s given)" % + (self.name, self.type.__name__, type(value))) + self._value = value + if self.callback is not None: + self.callback(self._value) + + # Supported date/time formats in our options + _DATETIME_FORMATS = [ + "%a %b %d %H:%M:%S %Y", + "%Y-%m-%d %H:%M:%S", + "%Y-%m-%d %H:%M", + "%Y-%m-%dT%H:%M", + "%Y%m%d %H:%M:%S", + "%Y%m%d %H:%M", + "%Y-%m-%d", + "%Y%m%d", + "%H:%M:%S", + "%H:%M", + ] + + def _parse_datetime(self, value): + for format in self._DATETIME_FORMATS: + try: + return datetime.datetime.strptime(value, format) + except ValueError: + pass + raise Error('Unrecognized date/time format: %r' % value) + + _TIMEDELTA_ABBREVS = [ + ('hours', ['h']), + ('minutes', ['m', 'min']), + ('seconds', ['s', 'sec']), + ('milliseconds', ['ms']), + ('microseconds', ['us']), + ('days', ['d']), + ('weeks', ['w']), + ] + + _TIMEDELTA_ABBREV_DICT = dict( + (abbrev, full) for full, abbrevs in _TIMEDELTA_ABBREVS + for abbrev in abbrevs) + + _FLOAT_PATTERN = r'[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?' + + _TIMEDELTA_PATTERN = re.compile( + r'\s*(%s)\s*(\w*)\s*' % _FLOAT_PATTERN, re.IGNORECASE) + + def _parse_timedelta(self, value): + try: + sum = datetime.timedelta() + start = 0 + while start < len(value): + m = self._TIMEDELTA_PATTERN.match(value, start) + if not m: + raise Exception() + num = float(m.group(1)) + units = m.group(2) or 'seconds' + units = self._TIMEDELTA_ABBREV_DICT.get(units, units) + sum += datetime.timedelta(**{units: num}) + start = m.end() + return sum + except Exception: + raise + + def _parse_bool(self, value): + return value.lower() not in ("false", "0", "f") + + def _parse_string(self, value): + return _unicode(value) + + +options = OptionParser() +"""Global options object. + +All defined options are available as attributes on this object. +""" + + +def define(name, default=None, type=None, help=None, metavar=None, + multiple=False, group=None, callback=None): + """Defines an option in the global namespace. + + See `OptionParser.define`. + """ + return options.define(name, default=default, type=type, help=help, + metavar=metavar, multiple=multiple, group=group, + callback=callback) + + +def parse_command_line(args=None, final=True): + """Parses global options from the command line. + + See `OptionParser.parse_command_line`. + """ + return options.parse_command_line(args, final=final) + + +def parse_config_file(path, final=True): + """Parses global options from a config file. + + See `OptionParser.parse_config_file`. + """ + return options.parse_config_file(path, final=final) + + +def print_help(file=None): + """Prints all the command line options to stderr (or another file). + + See `OptionParser.print_help`. + """ + return options.print_help(file) + + +def add_parse_callback(callback): + """Adds a parse callback, to be invoked when option parsing is done. + + See `OptionParser.add_parse_callback` + """ + options.add_parse_callback(callback) + + +# Default options +define_logging_options(options) diff --git a/lib/tornado-3.1.1/tornado/platform/__init__.py b/lib/tornado-3.1.1/tornado/platform/__init__.py new file mode 100644 diff --git a/lib/tornado-3.1.1/tornado/platform/auto.py b/lib/tornado-3.1.1/tornado/platform/auto.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/auto.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Implementation of platform-specific functionality. + +For each function or class described in `tornado.platform.interface`, +the appropriate platform-specific implementation exists in this module. +Most code that needs access to this functionality should do e.g.:: + + from tornado.platform.auto import set_close_exec +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import os + +if os.name == 'nt': + from tornado.platform.common import Waker + from tornado.platform.windows import set_close_exec +else: + from tornado.platform.posix import set_close_exec, Waker + +try: + # monotime monkey-patches the time module to have a monotonic function + # in versions of python before 3.3. + import monotime +except ImportError: + pass +try: + from time import monotonic as monotonic_time +except ImportError: + monotonic_time = None diff --git a/lib/tornado-3.1.1/tornado/platform/caresresolver.py b/lib/tornado-3.1.1/tornado/platform/caresresolver.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/caresresolver.py @@ -0,0 +1,75 @@ +import pycares +import socket + +from tornado import gen +from tornado.ioloop import IOLoop +from tornado.netutil import Resolver, is_valid_ip + + +class CaresResolver(Resolver): + """Name resolver based on the c-ares library. + + This is a non-blocking and non-threaded resolver. It may not produce + the same results as the system resolver, but can be used for non-blocking + resolution when threads cannot be used. + + c-ares fails to resolve some names when ``family`` is ``AF_UNSPEC``, + so it is only recommended for use in ``AF_INET`` (i.e. IPv4). This is + the default for ``tornado.simple_httpclient``, but other libraries + may default to ``AF_UNSPEC``. + """ + def initialize(self, io_loop=None): + self.io_loop = io_loop or IOLoop.current() + self.channel = pycares.Channel(sock_state_cb=self._sock_state_cb) + self.fds = {} + + def _sock_state_cb(self, fd, readable, writable): + state = ((IOLoop.READ if readable else 0) | + (IOLoop.WRITE if writable else 0)) + if not state: + self.io_loop.remove_handler(fd) + del self.fds[fd] + elif fd in self.fds: + self.io_loop.update_handler(fd, state) + self.fds[fd] = state + else: + self.io_loop.add_handler(fd, self._handle_events, state) + self.fds[fd] = state + + def _handle_events(self, fd, events): + read_fd = pycares.ARES_SOCKET_BAD + write_fd = pycares.ARES_SOCKET_BAD + if events & IOLoop.READ: + read_fd = fd + if events & IOLoop.WRITE: + write_fd = fd + self.channel.process_fd(read_fd, write_fd) + + @gen.coroutine + def resolve(self, host, port, family=0): + if is_valid_ip(host): + addresses = [host] + else: + # gethostbyname doesn't take callback as a kwarg + self.channel.gethostbyname(host, family, (yield gen.Callback(1))) + callback_args = yield gen.Wait(1) + assert isinstance(callback_args, gen.Arguments) + assert not callback_args.kwargs + result, error = callback_args.args + if error: + raise Exception('C-Ares returned error %s: %s while resolving %s' % + (error, pycares.errno.strerror(error), host)) + addresses = result.addresses + addrinfo = [] + for address in addresses: + if '.' in address: + address_family = socket.AF_INET + elif ':' in address: + address_family = socket.AF_INET6 + else: + address_family = socket.AF_UNSPEC + if family != socket.AF_UNSPEC and family != address_family: + raise Exception('Requested socket family %d but got %d' % + (family, address_family)) + addrinfo.append((address_family, (address, port))) + raise gen.Return(addrinfo) diff --git a/lib/tornado-3.1.1/tornado/platform/common.py b/lib/tornado-3.1.1/tornado/platform/common.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/common.py @@ -0,0 +1,91 @@ +"""Lowest-common-denominator implementations of platform functionality.""" +from __future__ import absolute_import, division, print_function, with_statement + +import errno +import socket + +from tornado.platform import interface + + +class Waker(interface.Waker): + """Create an OS independent asynchronous pipe. + + For use on platforms that don't have os.pipe() (or where pipes cannot + be passed to select()), but do have sockets. This includes Windows + and Jython. + """ + def __init__(self): + # Based on Zope async.py: http://svn.zope.org/zc.ngi/trunk/src/zc/ngi/async.py + + self.writer = socket.socket() + # Disable buffering -- pulling the trigger sends 1 byte, + # and we want that sent immediately, to wake up ASAP. + self.writer.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + count = 0 + while 1: + count += 1 + # Bind to a local port; for efficiency, let the OS pick + # a free port for us. + # Unfortunately, stress tests showed that we may not + # be able to connect to that port ("Address already in + # use") despite that the OS picked it. This appears + # to be a race bug in the Windows socket implementation. + # So we loop until a connect() succeeds (almost always + # on the first try). See the long thread at + # http://mail.zope.org/pipermail/zope/2005-July/160433.html + # for hideous details. + a = socket.socket() + a.bind(("127.0.0.1", 0)) + a.listen(1) + connect_address = a.getsockname() # assigned (host, port) pair + try: + self.writer.connect(connect_address) + break # success + except socket.error as detail: + if (not hasattr(errno, 'WSAEADDRINUSE') or + detail[0] != errno.WSAEADDRINUSE): + # "Address already in use" is the only error + # I've seen on two WinXP Pro SP2 boxes, under + # Pythons 2.3.5 and 2.4.1. + raise + # (10048, 'Address already in use') + # assert count <= 2 # never triggered in Tim's tests + if count >= 10: # I've never seen it go above 2 + a.close() + self.writer.close() + raise socket.error("Cannot bind trigger!") + # Close `a` and try again. Note: I originally put a short + # sleep() here, but it didn't appear to help or hurt. + a.close() + + self.reader, addr = a.accept() + self.reader.setblocking(0) + self.writer.setblocking(0) + a.close() + self.reader_fd = self.reader.fileno() + + def fileno(self): + return self.reader.fileno() + + def write_fileno(self): + return self.writer.fileno() + + def wake(self): + try: + self.writer.send(b"x") + except (IOError, socket.error): + pass + + def consume(self): + try: + while True: + result = self.reader.recv(1024) + if not result: + break + except (IOError, socket.error): + pass + + def close(self): + self.reader.close() + self.writer.close() diff --git a/lib/tornado-3.1.1/tornado/platform/epoll.py b/lib/tornado-3.1.1/tornado/platform/epoll.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/epoll.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""EPoll-based IOLoop implementation for Linux systems.""" +from __future__ import absolute_import, division, print_function, with_statement + +import select + +from tornado.ioloop import PollIOLoop + + +class EPollIOLoop(PollIOLoop): + def initialize(self, **kwargs): + super(EPollIOLoop, self).initialize(impl=select.epoll(), **kwargs) diff --git a/lib/tornado-3.1.1/tornado/platform/interface.py b/lib/tornado-3.1.1/tornado/platform/interface.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/interface.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Interfaces for platform-specific functionality. + +This module exists primarily for documentation purposes and as base classes +for other tornado.platform modules. Most code should import the appropriate +implementation from `tornado.platform.auto`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + + +def set_close_exec(fd): + """Sets the close-on-exec bit (``FD_CLOEXEC``)for a file descriptor.""" + raise NotImplementedError() + + +class Waker(object): + """A socket-like object that can wake another thread from ``select()``. + + The `~tornado.ioloop.IOLoop` will add the Waker's `fileno()` to + its ``select`` (or ``epoll`` or ``kqueue``) calls. When another + thread wants to wake up the loop, it calls `wake`. Once it has woken + up, it will call `consume` to do any necessary per-wake cleanup. When + the ``IOLoop`` is closed, it closes its waker too. + """ + def fileno(self): + """Returns the read file descriptor for this waker. + + Must be suitable for use with ``select()`` or equivalent on the + local platform. + """ + raise NotImplementedError() + + def write_fileno(self): + """Returns the write file descriptor for this waker.""" + raise NotImplementedError() + + def wake(self): + """Triggers activity on the waker's file descriptor.""" + raise NotImplementedError() + + def consume(self): + """Called after the listen has woken up to do any necessary cleanup.""" + raise NotImplementedError() + + def close(self): + """Closes the waker's file descriptor(s).""" + raise NotImplementedError() diff --git a/lib/tornado-3.1.1/tornado/platform/kqueue.py b/lib/tornado-3.1.1/tornado/platform/kqueue.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/kqueue.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""KQueue-based IOLoop implementation for BSD/Mac systems.""" +from __future__ import absolute_import, division, print_function, with_statement + +import select + +from tornado.ioloop import IOLoop, PollIOLoop + +assert hasattr(select, 'kqueue'), 'kqueue not supported' + + +class _KQueue(object): + """A kqueue-based event loop for BSD/Mac systems.""" + def __init__(self): + self._kqueue = select.kqueue() + self._active = {} + + def fileno(self): + return self._kqueue.fileno() + + def close(self): + self._kqueue.close() + + def register(self, fd, events): + if fd in self._active: + raise IOError("fd %d already registered" % fd) + self._control(fd, events, select.KQ_EV_ADD) + self._active[fd] = events + + def modify(self, fd, events): + self.unregister(fd) + self.register(fd, events) + + def unregister(self, fd): + events = self._active.pop(fd) + self._control(fd, events, select.KQ_EV_DELETE) + + def _control(self, fd, events, flags): + kevents = [] + if events & IOLoop.WRITE: + kevents.append(select.kevent( + fd, filter=select.KQ_FILTER_WRITE, flags=flags)) + if events & IOLoop.READ or not kevents: + # Always read when there is not a write + kevents.append(select.kevent( + fd, filter=select.KQ_FILTER_READ, flags=flags)) + # Even though control() takes a list, it seems to return EINVAL + # on Mac OS X (10.6) when there is more than one event in the list. + for kevent in kevents: + self._kqueue.control([kevent], 0) + + def poll(self, timeout): + kevents = self._kqueue.control(None, 1000, timeout) + events = {} + for kevent in kevents: + fd = kevent.ident + if kevent.filter == select.KQ_FILTER_READ: + events[fd] = events.get(fd, 0) | IOLoop.READ + if kevent.filter == select.KQ_FILTER_WRITE: + if kevent.flags & select.KQ_EV_EOF: + # If an asynchronous connection is refused, kqueue + # returns a write event with the EOF flag set. + # Turn this into an error for consistency with the + # other IOLoop implementations. + # Note that for read events, EOF may be returned before + # all data has been consumed from the socket buffer, + # so we only check for EOF on write events. + events[fd] = IOLoop.ERROR + else: + events[fd] = events.get(fd, 0) | IOLoop.WRITE + if kevent.flags & select.KQ_EV_ERROR: + events[fd] = events.get(fd, 0) | IOLoop.ERROR + return events.items() + + +class KQueueIOLoop(PollIOLoop): + def initialize(self, **kwargs): + super(KQueueIOLoop, self).initialize(impl=_KQueue(), **kwargs) diff --git a/lib/tornado-3.1.1/tornado/platform/posix.py b/lib/tornado-3.1.1/tornado/platform/posix.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/posix.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Posix implementations of platform-specific functionality.""" + +from __future__ import absolute_import, division, print_function, with_statement + +import fcntl +import os + +from tornado.platform import interface + + +def set_close_exec(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFD) + fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC) + + +def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) + + +class Waker(interface.Waker): + def __init__(self): + r, w = os.pipe() + _set_nonblocking(r) + _set_nonblocking(w) + set_close_exec(r) + set_close_exec(w) + self.reader = os.fdopen(r, "rb", 0) + self.writer = os.fdopen(w, "wb", 0) + + def fileno(self): + return self.reader.fileno() + + def write_fileno(self): + return self.writer.fileno() + + def wake(self): + try: + self.writer.write(b"x") + except IOError: + pass + + def consume(self): + try: + while True: + result = self.reader.read() + if not result: + break + except IOError: + pass + + def close(self): + self.reader.close() + self.writer.close() diff --git a/lib/tornado-3.1.1/tornado/platform/select.py b/lib/tornado-3.1.1/tornado/platform/select.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/select.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Select-based IOLoop implementation. + +Used as a fallback for systems that don't support epoll or kqueue. +""" +from __future__ import absolute_import, division, print_function, with_statement + +import select + +from tornado.ioloop import IOLoop, PollIOLoop + + +class _Select(object): + """A simple, select()-based IOLoop implementation for non-Linux systems""" + def __init__(self): + self.read_fds = set() + self.write_fds = set() + self.error_fds = set() + self.fd_sets = (self.read_fds, self.write_fds, self.error_fds) + + def close(self): + pass + + def register(self, fd, events): + if fd in self.read_fds or fd in self.write_fds or fd in self.error_fds: + raise IOError("fd %d already registered" % fd) + if events & IOLoop.READ: + self.read_fds.add(fd) + if events & IOLoop.WRITE: + self.write_fds.add(fd) + if events & IOLoop.ERROR: + self.error_fds.add(fd) + # Closed connections are reported as errors by epoll and kqueue, + # but as zero-byte reads by select, so when errors are requested + # we need to listen for both read and error. + self.read_fds.add(fd) + + def modify(self, fd, events): + self.unregister(fd) + self.register(fd, events) + + def unregister(self, fd): + self.read_fds.discard(fd) + self.write_fds.discard(fd) + self.error_fds.discard(fd) + + def poll(self, timeout): + readable, writeable, errors = select.select( + self.read_fds, self.write_fds, self.error_fds, timeout) + events = {} + for fd in readable: + events[fd] = events.get(fd, 0) | IOLoop.READ + for fd in writeable: + events[fd] = events.get(fd, 0) | IOLoop.WRITE + for fd in errors: + events[fd] = events.get(fd, 0) | IOLoop.ERROR + return events.items() + + +class SelectIOLoop(PollIOLoop): + def initialize(self, **kwargs): + super(SelectIOLoop, self).initialize(impl=_Select(), **kwargs) diff --git a/lib/tornado-3.1.1/tornado/platform/twisted.py b/lib/tornado-3.1.1/tornado/platform/twisted.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/twisted.py @@ -0,0 +1,543 @@ +# Author: Ovidiu Predescu +# Date: July 2011 +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Note: This module's docs are not currently extracted automatically, +# so changes must be made manually to twisted.rst +# TODO: refactor doc build process to use an appropriate virtualenv +"""Bridges between the Twisted reactor and Tornado IOLoop. + +This module lets you run applications and libraries written for +Twisted in a Tornado application. It can be used in two modes, +depending on which library's underlying event loop you want to use. + +This module has been tested with Twisted versions 11.0.0 and newer. + +Twisted on Tornado +------------------ + +`TornadoReactor` implements the Twisted reactor interface on top of +the Tornado IOLoop. To use it, simply call `install` at the beginning +of the application:: + + import tornado.platform.twisted + tornado.platform.twisted.install() + from twisted.internet import reactor + +When the app is ready to start, call `IOLoop.instance().start()` +instead of `reactor.run()`. + +It is also possible to create a non-global reactor by calling +`tornado.platform.twisted.TornadoReactor(io_loop)`. However, if +the `IOLoop` and reactor are to be short-lived (such as those used in +unit tests), additional cleanup may be required. Specifically, it is +recommended to call:: + + reactor.fireSystemEvent('shutdown') + reactor.disconnectAll() + +before closing the `IOLoop`. + +Tornado on Twisted +------------------ + +`TwistedIOLoop` implements the Tornado IOLoop interface on top of the Twisted +reactor. Recommended usage:: + + from tornado.platform.twisted import TwistedIOLoop + from twisted.internet import reactor + TwistedIOLoop().install() + # Set up your tornado application as usual using `IOLoop.instance` + reactor.run() + +`TwistedIOLoop` always uses the global Twisted reactor. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import datetime +import functools +import socket + +import twisted.internet.abstract +from twisted.internet.posixbase import PosixReactorBase +from twisted.internet.interfaces import \ + IReactorFDSet, IDelayedCall, IReactorTime, IReadDescriptor, IWriteDescriptor +from twisted.python import failure, log +from twisted.internet import error +import twisted.names.cache +import twisted.names.client +import twisted.names.hosts +import twisted.names.resolve + +from zope.interface import implementer + +from tornado.escape import utf8 +from tornado import gen +import tornado.ioloop +from tornado.log import app_log +from tornado.netutil import Resolver +from tornado.stack_context import NullContext, wrap +from tornado.ioloop import IOLoop + + + at implementer(IDelayedCall) +class TornadoDelayedCall(object): + """DelayedCall object for Tornado.""" + def __init__(self, reactor, seconds, f, *args, **kw): + self._reactor = reactor + self._func = functools.partial(f, *args, **kw) + self._time = self._reactor.seconds() + seconds + self._timeout = self._reactor._io_loop.add_timeout(self._time, + self._called) + self._active = True + + def _called(self): + self._active = False + self._reactor._removeDelayedCall(self) + try: + self._func() + except: + app_log.error("_called caught exception", exc_info=True) + + def getTime(self): + return self._time + + def cancel(self): + self._active = False + self._reactor._io_loop.remove_timeout(self._timeout) + self._reactor._removeDelayedCall(self) + + def delay(self, seconds): + self._reactor._io_loop.remove_timeout(self._timeout) + self._time += seconds + self._timeout = self._reactor._io_loop.add_timeout(self._time, + self._called) + + def reset(self, seconds): + self._reactor._io_loop.remove_timeout(self._timeout) + self._time = self._reactor.seconds() + seconds + self._timeout = self._reactor._io_loop.add_timeout(self._time, + self._called) + + def active(self): + return self._active + + + at implementer(IReactorTime, IReactorFDSet) +class TornadoReactor(PosixReactorBase): + """Twisted reactor built on the Tornado IOLoop. + + Since it is intented to be used in applications where the top-level + event loop is ``io_loop.start()`` rather than ``reactor.run()``, + it is implemented a little differently than other Twisted reactors. + We override `mainLoop` instead of `doIteration` and must implement + timed call functionality on top of `IOLoop.add_timeout` rather than + using the implementation in `PosixReactorBase`. + """ + def __init__(self, io_loop=None): + if not io_loop: + io_loop = tornado.ioloop.IOLoop.current() + self._io_loop = io_loop + self._readers = {} # map of reader objects to fd + self._writers = {} # map of writer objects to fd + self._fds = {} # a map of fd to a (reader, writer) tuple + self._delayedCalls = {} + PosixReactorBase.__init__(self) + self.addSystemEventTrigger('during', 'shutdown', self.crash) + + # IOLoop.start() bypasses some of the reactor initialization. + # Fire off the necessary events if they weren't already triggered + # by reactor.run(). + def start_if_necessary(): + if not self._started: + self.fireSystemEvent('startup') + self._io_loop.add_callback(start_if_necessary) + + # IReactorTime + def seconds(self): + return self._io_loop.time() + + def callLater(self, seconds, f, *args, **kw): + dc = TornadoDelayedCall(self, seconds, f, *args, **kw) + self._delayedCalls[dc] = True + return dc + + def getDelayedCalls(self): + return [x for x in self._delayedCalls if x._active] + + def _removeDelayedCall(self, dc): + if dc in self._delayedCalls: + del self._delayedCalls[dc] + + # IReactorThreads + def callFromThread(self, f, *args, **kw): + """See `twisted.internet.interfaces.IReactorThreads.callFromThread`""" + assert callable(f), "%s is not callable" % f + with NullContext(): + # This NullContext is mainly for an edge case when running + # TwistedIOLoop on top of a TornadoReactor. + # TwistedIOLoop.add_callback uses reactor.callFromThread and + # should not pick up additional StackContexts along the way. + self._io_loop.add_callback(f, *args, **kw) + + # We don't need the waker code from the super class, Tornado uses + # its own waker. + def installWaker(self): + pass + + def wakeUp(self): + pass + + # IReactorFDSet + def _invoke_callback(self, fd, events): + if fd not in self._fds: + return + (reader, writer) = self._fds[fd] + if reader: + err = None + if reader.fileno() == -1: + err = error.ConnectionLost() + elif events & IOLoop.READ: + err = log.callWithLogger(reader, reader.doRead) + if err is None and events & IOLoop.ERROR: + err = error.ConnectionLost() + if err is not None: + self.removeReader(reader) + reader.readConnectionLost(failure.Failure(err)) + if writer: + err = None + if writer.fileno() == -1: + err = error.ConnectionLost() + elif events & IOLoop.WRITE: + err = log.callWithLogger(writer, writer.doWrite) + if err is None and events & IOLoop.ERROR: + err = error.ConnectionLost() + if err is not None: + self.removeWriter(writer) + writer.writeConnectionLost(failure.Failure(err)) + + def addReader(self, reader): + """Add a FileDescriptor for notification of data available to read.""" + if reader in self._readers: + # Don't add the reader if it's already there + return + fd = reader.fileno() + self._readers[reader] = fd + if fd in self._fds: + (_, writer) = self._fds[fd] + self._fds[fd] = (reader, writer) + if writer: + # We already registered this fd for write events, + # update it for read events as well. + self._io_loop.update_handler(fd, IOLoop.READ | IOLoop.WRITE) + else: + with NullContext(): + self._fds[fd] = (reader, None) + self._io_loop.add_handler(fd, self._invoke_callback, + IOLoop.READ) + + def addWriter(self, writer): + """Add a FileDescriptor for notification of data available to write.""" + if writer in self._writers: + return + fd = writer.fileno() + self._writers[writer] = fd + if fd in self._fds: + (reader, _) = self._fds[fd] + self._fds[fd] = (reader, writer) + if reader: + # We already registered this fd for read events, + # update it for write events as well. + self._io_loop.update_handler(fd, IOLoop.READ | IOLoop.WRITE) + else: + with NullContext(): + self._fds[fd] = (None, writer) + self._io_loop.add_handler(fd, self._invoke_callback, + IOLoop.WRITE) + + def removeReader(self, reader): + """Remove a Selectable for notification of data available to read.""" + if reader in self._readers: + fd = self._readers.pop(reader) + (_, writer) = self._fds[fd] + if writer: + # We have a writer so we need to update the IOLoop for + # write events only. + self._fds[fd] = (None, writer) + self._io_loop.update_handler(fd, IOLoop.WRITE) + else: + # Since we have no writer registered, we remove the + # entry from _fds and unregister the handler from the + # IOLoop + del self._fds[fd] + self._io_loop.remove_handler(fd) + + def removeWriter(self, writer): + """Remove a Selectable for notification of data available to write.""" + if writer in self._writers: + fd = self._writers.pop(writer) + (reader, _) = self._fds[fd] + if reader: + # We have a reader so we need to update the IOLoop for + # read events only. + self._fds[fd] = (reader, None) + self._io_loop.update_handler(fd, IOLoop.READ) + else: + # Since we have no reader registered, we remove the + # entry from the _fds and unregister the handler from + # the IOLoop. + del self._fds[fd] + self._io_loop.remove_handler(fd) + + def removeAll(self): + return self._removeAll(self._readers, self._writers) + + def getReaders(self): + return self._readers.keys() + + def getWriters(self): + return self._writers.keys() + + # The following functions are mainly used in twisted-style test cases; + # it is expected that most users of the TornadoReactor will call + # IOLoop.start() instead of Reactor.run(). + def stop(self): + PosixReactorBase.stop(self) + fire_shutdown = functools.partial(self.fireSystemEvent, "shutdown") + self._io_loop.add_callback(fire_shutdown) + + def crash(self): + PosixReactorBase.crash(self) + self._io_loop.stop() + + def doIteration(self, delay): + raise NotImplementedError("doIteration") + + def mainLoop(self): + self._io_loop.start() + + +class _TestReactor(TornadoReactor): + """Subclass of TornadoReactor for use in unittests. + + This can't go in the test.py file because of import-order dependencies + with the Twisted reactor test builder. + """ + def __init__(self): + # always use a new ioloop + super(_TestReactor, self).__init__(IOLoop()) + + def listenTCP(self, port, factory, backlog=50, interface=''): + # default to localhost to avoid firewall prompts on the mac + if not interface: + interface = '127.0.0.1' + return super(_TestReactor, self).listenTCP( + port, factory, backlog=backlog, interface=interface) + + def listenUDP(self, port, protocol, interface='', maxPacketSize=8192): + if not interface: + interface = '127.0.0.1' + return super(_TestReactor, self).listenUDP( + port, protocol, interface=interface, maxPacketSize=maxPacketSize) + + +def install(io_loop=None): + """Install this package as the default Twisted reactor.""" + if not io_loop: + io_loop = tornado.ioloop.IOLoop.current() + reactor = TornadoReactor(io_loop) + from twisted.internet.main import installReactor + installReactor(reactor) + return reactor + + + at implementer(IReadDescriptor, IWriteDescriptor) +class _FD(object): + def __init__(self, fd, handler): + self.fd = fd + self.handler = handler + self.reading = False + self.writing = False + self.lost = False + + def fileno(self): + return self.fd + + def doRead(self): + if not self.lost: + self.handler(self.fd, tornado.ioloop.IOLoop.READ) + + def doWrite(self): + if not self.lost: + self.handler(self.fd, tornado.ioloop.IOLoop.WRITE) + + def connectionLost(self, reason): + if not self.lost: + self.handler(self.fd, tornado.ioloop.IOLoop.ERROR) + self.lost = True + + def logPrefix(self): + return '' + + +class TwistedIOLoop(tornado.ioloop.IOLoop): + """IOLoop implementation that runs on Twisted. + + Uses the global Twisted reactor by default. To create multiple + `TwistedIOLoops` in the same process, you must pass a unique reactor + when constructing each one. + + Not compatible with `tornado.process.Subprocess.set_exit_callback` + because the ``SIGCHLD`` handlers used by Tornado and Twisted conflict + with each other. + """ + def initialize(self, reactor=None): + if reactor is None: + import twisted.internet.reactor + reactor = twisted.internet.reactor + self.reactor = reactor + self.fds = {} + self.reactor.callWhenRunning(self.make_current) + + def close(self, all_fds=False): + self.reactor.removeAll() + for c in self.reactor.getDelayedCalls(): + c.cancel() + + def add_handler(self, fd, handler, events): + if fd in self.fds: + raise ValueError('fd %d added twice' % fd) + self.fds[fd] = _FD(fd, wrap(handler)) + if events & tornado.ioloop.IOLoop.READ: + self.fds[fd].reading = True + self.reactor.addReader(self.fds[fd]) + if events & tornado.ioloop.IOLoop.WRITE: + self.fds[fd].writing = True + self.reactor.addWriter(self.fds[fd]) + + def update_handler(self, fd, events): + if events & tornado.ioloop.IOLoop.READ: + if not self.fds[fd].reading: + self.fds[fd].reading = True + self.reactor.addReader(self.fds[fd]) + else: + if self.fds[fd].reading: + self.fds[fd].reading = False + self.reactor.removeReader(self.fds[fd]) + if events & tornado.ioloop.IOLoop.WRITE: + if not self.fds[fd].writing: + self.fds[fd].writing = True + self.reactor.addWriter(self.fds[fd]) + else: + if self.fds[fd].writing: + self.fds[fd].writing = False + self.reactor.removeWriter(self.fds[fd]) + + def remove_handler(self, fd): + if fd not in self.fds: + return + self.fds[fd].lost = True + if self.fds[fd].reading: + self.reactor.removeReader(self.fds[fd]) + if self.fds[fd].writing: + self.reactor.removeWriter(self.fds[fd]) + del self.fds[fd] + + def start(self): + self.reactor.run() + + def stop(self): + self.reactor.crash() + + def _run_callback(self, callback, *args, **kwargs): + try: + callback(*args, **kwargs) + except Exception: + self.handle_callback_exception(callback) + + def add_timeout(self, deadline, callback): + if isinstance(deadline, (int, long, float)): + delay = max(deadline - self.time(), 0) + elif isinstance(deadline, datetime.timedelta): + delay = tornado.ioloop._Timeout.timedelta_to_seconds(deadline) + else: + raise TypeError("Unsupported deadline %r") + return self.reactor.callLater(delay, self._run_callback, wrap(callback)) + + def remove_timeout(self, timeout): + if timeout.active(): + timeout.cancel() + + def add_callback(self, callback, *args, **kwargs): + self.reactor.callFromThread(self._run_callback, + wrap(callback), *args, **kwargs) + + def add_callback_from_signal(self, callback, *args, **kwargs): + self.add_callback(callback, *args, **kwargs) + + +class TwistedResolver(Resolver): + """Twisted-based asynchronous resolver. + + This is a non-blocking and non-threaded resolver. It is + recommended only when threads cannot be used, since it has + limitations compared to the standard ``getaddrinfo``-based + `~tornado.netutil.Resolver` and + `~tornado.netutil.ThreadedResolver`. Specifically, it returns at + most one result, and arguments other than ``host`` and ``family`` + are ignored. It may fail to resolve when ``family`` is not + ``socket.AF_UNSPEC``. + + Requires Twisted 12.1 or newer. + """ + def initialize(self, io_loop=None): + self.io_loop = io_loop or IOLoop.current() + # partial copy of twisted.names.client.createResolver, which doesn't + # allow for a reactor to be passed in. + self.reactor = tornado.platform.twisted.TornadoReactor(io_loop) + + host_resolver = twisted.names.hosts.Resolver('/etc/hosts') + cache_resolver = twisted.names.cache.CacheResolver(reactor=self.reactor) + real_resolver = twisted.names.client.Resolver('/etc/resolv.conf', + reactor=self.reactor) + self.resolver = twisted.names.resolve.ResolverChain( + [host_resolver, cache_resolver, real_resolver]) + + @gen.coroutine + def resolve(self, host, port, family=0): + # getHostByName doesn't accept IP addresses, so if the input + # looks like an IP address just return it immediately. + if twisted.internet.abstract.isIPAddress(host): + resolved = host + resolved_family = socket.AF_INET + elif twisted.internet.abstract.isIPv6Address(host): + resolved = host + resolved_family = socket.AF_INET6 + else: + deferred = self.resolver.getHostByName(utf8(host)) + resolved = yield gen.Task(deferred.addCallback) + if twisted.internet.abstract.isIPAddress(resolved): + resolved_family = socket.AF_INET + elif twisted.internet.abstract.isIPv6Address(resolved): + resolved_family = socket.AF_INET6 + else: + resolved_family = socket.AF_UNSPEC + if family != socket.AF_UNSPEC and family != resolved_family: + raise Exception('Requested socket family %d but got %d' % + (family, resolved_family)) + result = [ + (resolved_family, (resolved, port)), + ] + raise gen.Return(result) diff --git a/lib/tornado-3.1.1/tornado/platform/windows.py b/lib/tornado-3.1.1/tornado/platform/windows.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/platform/windows.py @@ -0,0 +1,20 @@ +# NOTE: win32 support is currently experimental, and not recommended +# for production use. + + +from __future__ import absolute_import, division, print_function, with_statement +import ctypes +import ctypes.wintypes + +# See: http://msdn.microsoft.com/en-us/library/ms724935(VS.85).aspx +SetHandleInformation = ctypes.windll.kernel32.SetHandleInformation +SetHandleInformation.argtypes = (ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD, ctypes.wintypes.DWORD) +SetHandleInformation.restype = ctypes.wintypes.BOOL + +HANDLE_FLAG_INHERIT = 0x00000001 + + +def set_close_exec(fd): + success = SetHandleInformation(fd, HANDLE_FLAG_INHERIT, 0) + if not success: + raise ctypes.GetLastError() diff --git a/lib/tornado-3.1.1/tornado/process.py b/lib/tornado-3.1.1/tornado/process.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/process.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Utilities for working with multiple processes, including both forking +the server into multiple processes and managing subprocesses. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import errno +import multiprocessing +import os +import signal +import subprocess +import sys +import time + +from binascii import hexlify + +from tornado import ioloop +from tornado.iostream import PipeIOStream +from tornado.log import gen_log +from tornado.platform.auto import set_close_exec +from tornado import stack_context + +try: + long # py2 +except NameError: + long = int # py3 + + +def cpu_count(): + """Returns the number of processors on this machine.""" + try: + return multiprocessing.cpu_count() + except NotImplementedError: + pass + try: + return os.sysconf("SC_NPROCESSORS_CONF") + except ValueError: + pass + gen_log.error("Could not detect number of processors; assuming 1") + return 1 + + +def _reseed_random(): + if 'random' not in sys.modules: + return + import random + # If os.urandom is available, this method does the same thing as + # random.seed (at least as of python 2.6). If os.urandom is not + # available, we mix in the pid in addition to a timestamp. + try: + seed = long(hexlify(os.urandom(16)), 16) + except NotImplementedError: + seed = int(time.time() * 1000) ^ os.getpid() + random.seed(seed) + + +def _pipe_cloexec(): + r, w = os.pipe() + set_close_exec(r) + set_close_exec(w) + return r, w + + +_task_id = None + + +def fork_processes(num_processes, max_restarts=100): + """Starts multiple worker processes. + + If ``num_processes`` is None or <= 0, we detect the number of cores + available on this machine and fork that number of child + processes. If ``num_processes`` is given and > 0, we fork that + specific number of sub-processes. + + Since we use processes and not threads, there is no shared memory + between any server code. + + Note that multiple processes are not compatible with the autoreload + module (or the debug=True option to `tornado.web.Application`). + When using multiple processes, no IOLoops can be created or + referenced until after the call to ``fork_processes``. + + In each child process, ``fork_processes`` returns its *task id*, a + number between 0 and ``num_processes``. Processes that exit + abnormally (due to a signal or non-zero exit status) are restarted + with the same id (up to ``max_restarts`` times). In the parent + process, ``fork_processes`` returns None if all child processes + have exited normally, but will otherwise only exit by throwing an + exception. + """ + global _task_id + assert _task_id is None + if num_processes is None or num_processes <= 0: + num_processes = cpu_count() + if ioloop.IOLoop.initialized(): + raise RuntimeError("Cannot run in multiple processes: IOLoop instance " + "has already been initialized. You cannot call " + "IOLoop.instance() before calling start_processes()") + gen_log.info("Starting %d processes", num_processes) + children = {} + + def start_child(i): + pid = os.fork() + if pid == 0: + # child process + _reseed_random() + global _task_id + _task_id = i + return i + else: + children[pid] = i + return None + for i in range(num_processes): + id = start_child(i) + if id is not None: + return id + num_restarts = 0 + while children: + try: + pid, status = os.wait() + except OSError as e: + if e.errno == errno.EINTR: + continue + raise + if pid not in children: + continue + id = children.pop(pid) + if os.WIFSIGNALED(status): + gen_log.warning("child %d (pid %d) killed by signal %d, restarting", + id, pid, os.WTERMSIG(status)) + elif os.WEXITSTATUS(status) != 0: + gen_log.warning("child %d (pid %d) exited with status %d, restarting", + id, pid, os.WEXITSTATUS(status)) + else: + gen_log.info("child %d (pid %d) exited normally", id, pid) + continue + num_restarts += 1 + if num_restarts > max_restarts: + raise RuntimeError("Too many child restarts, giving up") + new_id = start_child(id) + if new_id is not None: + return new_id + # All child processes exited cleanly, so exit the master process + # instead of just returning to right after the call to + # fork_processes (which will probably just start up another IOLoop + # unless the caller checks the return value). + sys.exit(0) + + +def task_id(): + """Returns the current task id, if any. + + Returns None if this process was not created by `fork_processes`. + """ + global _task_id + return _task_id + + +class Subprocess(object): + """Wraps ``subprocess.Popen`` with IOStream support. + + The constructor is the same as ``subprocess.Popen`` with the following + additions: + + * ``stdin``, ``stdout``, and ``stderr`` may have the value + ``tornado.process.Subprocess.STREAM``, which will make the corresponding + attribute of the resulting Subprocess a `.PipeIOStream`. + * A new keyword argument ``io_loop`` may be used to pass in an IOLoop. + """ + STREAM = object() + + _initialized = False + _waiting = {} + + def __init__(self, *args, **kwargs): + self.io_loop = kwargs.pop('io_loop', None) or ioloop.IOLoop.current() + to_close = [] + if kwargs.get('stdin') is Subprocess.STREAM: + in_r, in_w = _pipe_cloexec() + kwargs['stdin'] = in_r + to_close.append(in_r) + self.stdin = PipeIOStream(in_w, io_loop=self.io_loop) + if kwargs.get('stdout') is Subprocess.STREAM: + out_r, out_w = _pipe_cloexec() + kwargs['stdout'] = out_w + to_close.append(out_w) + self.stdout = PipeIOStream(out_r, io_loop=self.io_loop) + if kwargs.get('stderr') is Subprocess.STREAM: + err_r, err_w = _pipe_cloexec() + kwargs['stderr'] = err_w + to_close.append(err_w) + self.stderr = PipeIOStream(err_r, io_loop=self.io_loop) + self.proc = subprocess.Popen(*args, **kwargs) + for fd in to_close: + os.close(fd) + for attr in ['stdin', 'stdout', 'stderr', 'pid']: + if not hasattr(self, attr): # don't clobber streams set above + setattr(self, attr, getattr(self.proc, attr)) + self._exit_callback = None + self.returncode = None + + def set_exit_callback(self, callback): + """Runs ``callback`` when this process exits. + + The callback takes one argument, the return code of the process. + + This method uses a ``SIGCHILD`` handler, which is a global setting + and may conflict if you have other libraries trying to handle the + same signal. If you are using more than one ``IOLoop`` it may + be necessary to call `Subprocess.initialize` first to designate + one ``IOLoop`` to run the signal handlers. + + In many cases a close callback on the stdout or stderr streams + can be used as an alternative to an exit callback if the + signal handler is causing a problem. + """ + self._exit_callback = stack_context.wrap(callback) + Subprocess.initialize(self.io_loop) + Subprocess._waiting[self.pid] = self + Subprocess._try_cleanup_process(self.pid) + + @classmethod + def initialize(cls, io_loop=None): + """Initializes the ``SIGCHILD`` handler. + + The signal handler is run on an `.IOLoop` to avoid locking issues. + Note that the `.IOLoop` used for signal handling need not be the + same one used by individual Subprocess objects (as long as the + ``IOLoops`` are each running in separate threads). + """ + if cls._initialized: + return + if io_loop is None: + io_loop = ioloop.IOLoop.current() + cls._old_sigchld = signal.signal( + signal.SIGCHLD, + lambda sig, frame: io_loop.add_callback_from_signal(cls._cleanup)) + cls._initialized = True + + @classmethod + def uninitialize(cls): + """Removes the ``SIGCHILD`` handler.""" + if not cls._initialized: + return + signal.signal(signal.SIGCHLD, cls._old_sigchld) + cls._initialized = False + + @classmethod + def _cleanup(cls): + for pid in list(cls._waiting.keys()): # make a copy + cls._try_cleanup_process(pid) + + @classmethod + def _try_cleanup_process(cls, pid): + try: + ret_pid, status = os.waitpid(pid, os.WNOHANG) + except OSError as e: + if e.args[0] == errno.ECHILD: + return + if ret_pid == 0: + return + assert ret_pid == pid + subproc = cls._waiting.pop(pid) + subproc.io_loop.add_callback_from_signal( + subproc._set_returncode, status) + + def _set_returncode(self, status): + if os.WIFSIGNALED(status): + self.returncode = -os.WTERMSIG(status) + else: + assert os.WIFEXITED(status) + self.returncode = os.WEXITSTATUS(status) + if self._exit_callback: + callback = self._exit_callback + self._exit_callback = None + callback(self.returncode) diff --git a/lib/tornado-3.1.1/tornado/simple_httpclient.py b/lib/tornado-3.1.1/tornado/simple_httpclient.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/simple_httpclient.py @@ -0,0 +1,497 @@ +#!/usr/bin/env python +from __future__ import absolute_import, division, print_function, with_statement + +from tornado.escape import utf8, _unicode, native_str +from tornado.httpclient import HTTPResponse, HTTPError, AsyncHTTPClient, main, _RequestProxy +from tornado.httputil import HTTPHeaders +from tornado.iostream import IOStream, SSLIOStream +from tornado.netutil import Resolver, OverrideResolver +from tornado.log import gen_log +from tornado import stack_context +from tornado.util import GzipDecompressor + +import base64 +import collections +import copy +import functools +import os.path +import re +import socket +import ssl +import sys + +try: + from io import BytesIO # python 3 +except ImportError: + from cStringIO import StringIO as BytesIO # python 2 + +try: + import urlparse # py2 +except ImportError: + import urllib.parse as urlparse # py3 + +_DEFAULT_CA_CERTS = os.path.dirname(__file__) + '/ca-certificates.crt' + + +class SimpleAsyncHTTPClient(AsyncHTTPClient): + """Non-blocking HTTP client with no external dependencies. + + This class implements an HTTP 1.1 client on top of Tornado's IOStreams. + It does not currently implement all applicable parts of the HTTP + specification, but it does enough to work with major web service APIs. + + Some features found in the curl-based AsyncHTTPClient are not yet + supported. In particular, proxies are not supported, connections + are not reused, and callers cannot select the network interface to be + used. + """ + def initialize(self, io_loop, max_clients=10, + hostname_mapping=None, max_buffer_size=104857600, + resolver=None, defaults=None): + """Creates a AsyncHTTPClient. + + Only a single AsyncHTTPClient instance exists per IOLoop + in order to provide limitations on the number of pending connections. + force_instance=True may be used to suppress this behavior. + + max_clients is the number of concurrent requests that can be + in progress. Note that this arguments are only used when the + client is first created, and will be ignored when an existing + client is reused. + + hostname_mapping is a dictionary mapping hostnames to IP addresses. + It can be used to make local DNS changes when modifying system-wide + settings like /etc/hosts is not possible or desirable (e.g. in + unittests). + + max_buffer_size is the number of bytes that can be read by IOStream. It + defaults to 100mb. + """ + super(SimpleAsyncHTTPClient, self).initialize(io_loop, + defaults=defaults) + self.max_clients = max_clients + self.queue = collections.deque() + self.active = {} + self.max_buffer_size = max_buffer_size + if resolver: + self.resolver = resolver + self.own_resolver = False + else: + self.resolver = Resolver(io_loop=io_loop) + self.own_resolver = True + if hostname_mapping is not None: + self.resolver = OverrideResolver(resolver=self.resolver, + mapping=hostname_mapping) + + def close(self): + super(SimpleAsyncHTTPClient, self).close() + if self.own_resolver: + self.resolver.close() + + def fetch_impl(self, request, callback): + self.queue.append((request, callback)) + self._process_queue() + if self.queue: + gen_log.debug("max_clients limit reached, request queued. " + "%d active, %d queued requests." % ( + len(self.active), len(self.queue))) + + def _process_queue(self): + with stack_context.NullContext(): + while self.queue and len(self.active) < self.max_clients: + request, callback = self.queue.popleft() + key = object() + self.active[key] = (request, callback) + release_callback = functools.partial(self._release_fetch, key) + self._handle_request(request, release_callback, callback) + + def _handle_request(self, request, release_callback, final_callback): + _HTTPConnection(self.io_loop, self, request, release_callback, + final_callback, self.max_buffer_size, self.resolver) + + def _release_fetch(self, key): + del self.active[key] + self._process_queue() + + +class _HTTPConnection(object): + _SUPPORTED_METHODS = set(["GET", "HEAD", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"]) + + def __init__(self, io_loop, client, request, release_callback, + final_callback, max_buffer_size, resolver): + self.start_time = io_loop.time() + self.io_loop = io_loop + self.client = client + self.request = request + self.release_callback = release_callback + self.final_callback = final_callback + self.max_buffer_size = max_buffer_size + self.resolver = resolver + self.code = None + self.headers = None + self.chunks = None + self._decompressor = None + # Timeout handle returned by IOLoop.add_timeout + self._timeout = None + with stack_context.ExceptionStackContext(self._handle_exception): + self.parsed = urlparse.urlsplit(_unicode(self.request.url)) + if self.parsed.scheme not in ("http", "https"): + raise ValueError("Unsupported url scheme: %s" % + self.request.url) + # urlsplit results have hostname and port results, but they + # didn't support ipv6 literals until python 2.7. + netloc = self.parsed.netloc + if "@" in netloc: + userpass, _, netloc = netloc.rpartition("@") + match = re.match(r'^(.+):(\d+)$', netloc) + if match: + host = match.group(1) + port = int(match.group(2)) + else: + host = netloc + port = 443 if self.parsed.scheme == "https" else 80 + if re.match(r'^\[.*\]$', host): + # raw ipv6 addresses in urls are enclosed in brackets + host = host[1:-1] + self.parsed_hostname = host # save final host for _on_connect + + if request.allow_ipv6: + af = socket.AF_UNSPEC + else: + # We only try the first IP we get from getaddrinfo, + # so restrict to ipv4 by default. + af = socket.AF_INET + + self.resolver.resolve(host, port, af, callback=self._on_resolve) + + def _on_resolve(self, addrinfo): + self.stream = self._create_stream(addrinfo) + timeout = min(self.request.connect_timeout, self.request.request_timeout) + if timeout: + self._timeout = self.io_loop.add_timeout( + self.start_time + timeout, + stack_context.wrap(self._on_timeout)) + self.stream.set_close_callback(self._on_close) + # ipv6 addresses are broken (in self.parsed.hostname) until + # 2.7, here is correctly parsed value calculated in __init__ + sockaddr = addrinfo[0][1] + self.stream.connect(sockaddr, self._on_connect, + server_hostname=self.parsed_hostname) + + def _create_stream(self, addrinfo): + af = addrinfo[0][0] + if self.parsed.scheme == "https": + ssl_options = {} + if self.request.validate_cert: + ssl_options["cert_reqs"] = ssl.CERT_REQUIRED + if self.request.ca_certs is not None: + ssl_options["ca_certs"] = self.request.ca_certs + else: + ssl_options["ca_certs"] = _DEFAULT_CA_CERTS + if self.request.client_key is not None: + ssl_options["keyfile"] = self.request.client_key + if self.request.client_cert is not None: + ssl_options["certfile"] = self.request.client_cert + + # SSL interoperability is tricky. We want to disable + # SSLv2 for security reasons; it wasn't disabled by default + # until openssl 1.0. The best way to do this is to use + # the SSL_OP_NO_SSLv2, but that wasn't exposed to python + # until 3.2. Python 2.7 adds the ciphers argument, which + # can also be used to disable SSLv2. As a last resort + # on python 2.6, we set ssl_version to SSLv3. This is + # more narrow than we'd like since it also breaks + # compatibility with servers configured for TLSv1 only, + # but nearly all servers support SSLv3: + # http://blog.ivanristic.com/2011/09/ssl-survey-protocol-support.html + if sys.version_info >= (2, 7): + ssl_options["ciphers"] = "DEFAULT:!SSLv2" + else: + # This is really only necessary for pre-1.0 versions + # of openssl, but python 2.6 doesn't expose version + # information. + ssl_options["ssl_version"] = ssl.PROTOCOL_SSLv3 + + return SSLIOStream(socket.socket(af), + io_loop=self.io_loop, + ssl_options=ssl_options, + max_buffer_size=self.max_buffer_size) + else: + return IOStream(socket.socket(af), + io_loop=self.io_loop, + max_buffer_size=self.max_buffer_size) + + def _on_timeout(self): + self._timeout = None + if self.final_callback is not None: + raise HTTPError(599, "Timeout") + + def _remove_timeout(self): + if self._timeout is not None: + self.io_loop.remove_timeout(self._timeout) + self._timeout = None + + def _on_connect(self): + self._remove_timeout() + if self.request.request_timeout: + self._timeout = self.io_loop.add_timeout( + self.start_time + self.request.request_timeout, + stack_context.wrap(self._on_timeout)) + if (self.request.method not in self._SUPPORTED_METHODS and + not self.request.allow_nonstandard_methods): + raise KeyError("unknown method %s" % self.request.method) + for key in ('network_interface', + 'proxy_host', 'proxy_port', + 'proxy_username', 'proxy_password'): + if getattr(self.request, key, None): + raise NotImplementedError('%s not supported' % key) + if "Connection" not in self.request.headers: + self.request.headers["Connection"] = "close" + if "Host" not in self.request.headers: + if '@' in self.parsed.netloc: + self.request.headers["Host"] = self.parsed.netloc.rpartition('@')[-1] + else: + self.request.headers["Host"] = self.parsed.netloc + username, password = None, None + if self.parsed.username is not None: + username, password = self.parsed.username, self.parsed.password + elif self.request.auth_username is not None: + username = self.request.auth_username + password = self.request.auth_password or '' + if username is not None: + if self.request.auth_mode not in (None, "basic"): + raise ValueError("unsupported auth_mode %s", + self.request.auth_mode) + auth = utf8(username) + b":" + utf8(password) + self.request.headers["Authorization"] = (b"Basic " + + base64.b64encode(auth)) + if self.request.user_agent: + self.request.headers["User-Agent"] = self.request.user_agent + if not self.request.allow_nonstandard_methods: + if self.request.method in ("POST", "PATCH", "PUT"): + assert self.request.body is not None + else: + assert self.request.body is None + if self.request.body is not None: + self.request.headers["Content-Length"] = str(len( + self.request.body)) + if (self.request.method == "POST" and + "Content-Type" not in self.request.headers): + self.request.headers["Content-Type"] = "application/x-www-form-urlencoded" + if self.request.use_gzip: + self.request.headers["Accept-Encoding"] = "gzip" + req_path = ((self.parsed.path or '/') + + (('?' + self.parsed.query) if self.parsed.query else '')) + request_lines = [utf8("%s %s HTTP/1.1" % (self.request.method, + req_path))] + for k, v in self.request.headers.get_all(): + line = utf8(k) + b": " + utf8(v) + if b'\n' in line: + raise ValueError('Newline in header: ' + repr(line)) + request_lines.append(line) + request_str = b"\r\n".join(request_lines) + b"\r\n\r\n" + if self.request.body is not None: + request_str += self.request.body + self.stream.set_nodelay(True) + self.stream.write(request_str) + self.stream.read_until_regex(b"\r?\n\r?\n", self._on_headers) + + def _release(self): + if self.release_callback is not None: + release_callback = self.release_callback + self.release_callback = None + release_callback() + + def _run_callback(self, response): + self._release() + if self.final_callback is not None: + final_callback = self.final_callback + self.final_callback = None + self.io_loop.add_callback(final_callback, response) + + def _handle_exception(self, typ, value, tb): + if self.final_callback: + self._remove_timeout() + self._run_callback(HTTPResponse(self.request, 599, error=value, + request_time=self.io_loop.time() - self.start_time, + )) + + if hasattr(self, "stream"): + self.stream.close() + return True + else: + # If our callback has already been called, we are probably + # catching an exception that is not caused by us but rather + # some child of our callback. Rather than drop it on the floor, + # pass it along. + return False + + def _on_close(self): + if self.final_callback is not None: + message = "Connection closed" + if self.stream.error: + message = str(self.stream.error) + raise HTTPError(599, message) + + def _handle_1xx(self, code): + self.stream.read_until_regex(b"\r?\n\r?\n", self._on_headers) + + def _on_headers(self, data): + data = native_str(data.decode("latin1")) + first_line, _, header_data = data.partition("\n") + match = re.match("HTTP/1.[01] ([0-9]+) ([^\r]*)", first_line) + assert match + code = int(match.group(1)) + self.headers = HTTPHeaders.parse(header_data) + if 100 <= code < 200: + self._handle_1xx(code) + return + else: + self.code = code + self.reason = match.group(2) + + if "Content-Length" in self.headers: + if "," in self.headers["Content-Length"]: + # Proxies sometimes cause Content-Length headers to get + # duplicated. If all the values are identical then we can + # use them but if they differ it's an error. + pieces = re.split(r',\s*', self.headers["Content-Length"]) + if any(i != pieces[0] for i in pieces): + raise ValueError("Multiple unequal Content-Lengths: %r" % + self.headers["Content-Length"]) + self.headers["Content-Length"] = pieces[0] + content_length = int(self.headers["Content-Length"]) + else: + content_length = None + + if self.request.header_callback is not None: + # re-attach the newline we split on earlier + self.request.header_callback(first_line + _) + for k, v in self.headers.get_all(): + self.request.header_callback("%s: %s\r\n" % (k, v)) + self.request.header_callback('\r\n') + + if self.request.method == "HEAD" or self.code == 304: + # HEAD requests and 304 responses never have content, even + # though they may have content-length headers + self._on_body(b"") + return + if 100 <= self.code < 200 or self.code == 204: + # These response codes never have bodies + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 + if ("Transfer-Encoding" in self.headers or + content_length not in (None, 0)): + raise ValueError("Response with code %d should not have body" % + self.code) + self._on_body(b"") + return + + if (self.request.use_gzip and + self.headers.get("Content-Encoding") == "gzip"): + self._decompressor = GzipDecompressor() + if self.headers.get("Transfer-Encoding") == "chunked": + self.chunks = [] + self.stream.read_until(b"\r\n", self._on_chunk_length) + elif content_length is not None: + self.stream.read_bytes(content_length, self._on_body) + else: + self.stream.read_until_close(self._on_body) + + def _on_body(self, data): + self._remove_timeout() + original_request = getattr(self.request, "original_request", + self.request) + if (self.request.follow_redirects and + self.request.max_redirects > 0 and + self.code in (301, 302, 303, 307)): + assert isinstance(self.request, _RequestProxy) + new_request = copy.copy(self.request.request) + new_request.url = urlparse.urljoin(self.request.url, + self.headers["Location"]) + new_request.max_redirects = self.request.max_redirects - 1 + del new_request.headers["Host"] + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 + # Client SHOULD make a GET request after a 303. + # According to the spec, 302 should be followed by the same + # method as the original request, but in practice browsers + # treat 302 the same as 303, and many servers use 302 for + # compatibility with pre-HTTP/1.1 user agents which don't + # understand the 303 status. + if self.code in (302, 303): + new_request.method = "GET" + new_request.body = None + for h in ["Content-Length", "Content-Type", + "Content-Encoding", "Transfer-Encoding"]: + try: + del self.request.headers[h] + except KeyError: + pass + new_request.original_request = original_request + final_callback = self.final_callback + self.final_callback = None + self._release() + self.client.fetch(new_request, final_callback) + self._on_end_request() + return + if self._decompressor: + data = (self._decompressor.decompress(data) + + self._decompressor.flush()) + if self.request.streaming_callback: + if self.chunks is None: + # if chunks is not None, we already called streaming_callback + # in _on_chunk_data + self.request.streaming_callback(data) + buffer = BytesIO() + else: + buffer = BytesIO(data) # TODO: don't require one big string? + response = HTTPResponse(original_request, + self.code, reason=self.reason, + headers=self.headers, + request_time=self.io_loop.time() - self.start_time, + buffer=buffer, + effective_url=self.request.url) + self._run_callback(response) + self._on_end_request() + + def _on_end_request(self): + self.stream.close() + + def _on_chunk_length(self, data): + # TODO: "chunk extensions" http://tools.ietf.org/html/rfc2616#section-3.6.1 + length = int(data.strip(), 16) + if length == 0: + if self._decompressor is not None: + tail = self._decompressor.flush() + if tail: + # I believe the tail will always be empty (i.e. + # decompress will return all it can). The purpose + # of the flush call is to detect errors such + # as truncated input. But in case it ever returns + # anything, treat it as an extra chunk + if self.request.streaming_callback is not None: + self.request.streaming_callback(tail) + else: + self.chunks.append(tail) + # all the data has been decompressed, so we don't need to + # decompress again in _on_body + self._decompressor = None + self._on_body(b''.join(self.chunks)) + else: + self.stream.read_bytes(length + 2, # chunk ends with \r\n + self._on_chunk_data) + + def _on_chunk_data(self, data): + assert data[-2:] == b"\r\n" + chunk = data[:-2] + if self._decompressor: + chunk = self._decompressor.decompress(chunk) + if self.request.streaming_callback is not None: + self.request.streaming_callback(chunk) + else: + self.chunks.append(chunk) + self.stream.read_until(b"\r\n", self._on_chunk_length) + + +if __name__ == "__main__": + AsyncHTTPClient.configure(SimpleAsyncHTTPClient) + main() diff --git a/lib/tornado-3.1.1/tornado/stack_context.py b/lib/tornado-3.1.1/tornado/stack_context.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/stack_context.py @@ -0,0 +1,376 @@ +#!/usr/bin/env python +# +# Copyright 2010 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""`StackContext` allows applications to maintain threadlocal-like state +that follows execution as it moves to other execution contexts. + +The motivating examples are to eliminate the need for explicit +``async_callback`` wrappers (as in `tornado.web.RequestHandler`), and to +allow some additional context to be kept for logging. + +This is slightly magic, but it's an extension of the idea that an +exception handler is a kind of stack-local state and when that stack +is suspended and resumed in a new context that state needs to be +preserved. `StackContext` shifts the burden of restoring that state +from each call site (e.g. wrapping each `.AsyncHTTPClient` callback +in ``async_callback``) to the mechanisms that transfer control from +one context to another (e.g. `.AsyncHTTPClient` itself, `.IOLoop`, +thread pools, etc). + +Example usage:: + + @contextlib.contextmanager + def die_on_error(): + try: + yield + except Exception: + logging.error("exception in asynchronous operation",exc_info=True) + sys.exit(1) + + with StackContext(die_on_error): + # Any exception thrown here *or in callback and its desendents* + # will cause the process to exit instead of spinning endlessly + # in the ioloop. + http_client.fetch(url, callback) + ioloop.start() + +Most applications shouln't have to work with `StackContext` directly. +Here are a few rules of thumb for when it's necessary: + +* If you're writing an asynchronous library that doesn't rely on a + stack_context-aware library like `tornado.ioloop` or `tornado.iostream` + (for example, if you're writing a thread pool), use + `.stack_context.wrap()` before any asynchronous operations to capture the + stack context from where the operation was started. + +* If you're writing an asynchronous library that has some shared + resources (such as a connection pool), create those shared resources + within a ``with stack_context.NullContext():`` block. This will prevent + ``StackContexts`` from leaking from one request to another. + +* If you want to write something like an exception handler that will + persist across asynchronous calls, create a new `StackContext` (or + `ExceptionStackContext`), and make your asynchronous calls in a ``with`` + block that references your `StackContext`. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import sys +import threading + +from tornado.util import raise_exc_info + + +class StackContextInconsistentError(Exception): + pass + + +class _State(threading.local): + def __init__(self): + self.contexts = (tuple(), None) +_state = _State() + + +class StackContext(object): + """Establishes the given context as a StackContext that will be transferred. + + Note that the parameter is a callable that returns a context + manager, not the context itself. That is, where for a + non-transferable context manager you would say:: + + with my_context(): + + StackContext takes the function itself rather than its result:: + + with StackContext(my_context): + + The result of ``with StackContext() as cb:`` is a deactivation + callback. Run this callback when the StackContext is no longer + needed to ensure that it is not propagated any further (note that + deactivating a context does not affect any instances of that + context that are currently pending). This is an advanced feature + and not necessary in most applications. + """ + def __init__(self, context_factory): + self.context_factory = context_factory + self.contexts = [] + self.active = True + + def _deactivate(self): + self.active = False + + # StackContext protocol + def enter(self): + context = self.context_factory() + self.contexts.append(context) + context.__enter__() + + def exit(self, type, value, traceback): + context = self.contexts.pop() + context.__exit__(type, value, traceback) + + # Note that some of this code is duplicated in ExceptionStackContext + # below. ExceptionStackContext is more common and doesn't need + # the full generality of this class. + def __enter__(self): + self.old_contexts = _state.contexts + self.new_contexts = (self.old_contexts[0] + (self,), self) + _state.contexts = self.new_contexts + + try: + self.enter() + except: + _state.contexts = self.old_contexts + raise + + return self._deactivate + + def __exit__(self, type, value, traceback): + try: + self.exit(type, value, traceback) + finally: + final_contexts = _state.contexts + _state.contexts = self.old_contexts + + # Generator coroutines and with-statements with non-local + # effects interact badly. Check here for signs of + # the stack getting out of sync. + # Note that this check comes after restoring _state.context + # so that if it fails things are left in a (relatively) + # consistent state. + if final_contexts is not self.new_contexts: + raise StackContextInconsistentError( + 'stack_context inconsistency (may be caused by yield ' + 'within a "with StackContext" block)') + + # Break up a reference to itself to allow for faster GC on CPython. + self.new_contexts = None + + +class ExceptionStackContext(object): + """Specialization of StackContext for exception handling. + + The supplied ``exception_handler`` function will be called in the + event of an uncaught exception in this context. The semantics are + similar to a try/finally clause, and intended use cases are to log + an error, close a socket, or similar cleanup actions. The + ``exc_info`` triple ``(type, value, traceback)`` will be passed to the + exception_handler function. + + If the exception handler returns true, the exception will be + consumed and will not be propagated to other exception handlers. + """ + def __init__(self, exception_handler): + self.exception_handler = exception_handler + self.active = True + + def _deactivate(self): + self.active = False + + def exit(self, type, value, traceback): + if type is not None: + return self.exception_handler(type, value, traceback) + + def __enter__(self): + self.old_contexts = _state.contexts + self.new_contexts = (self.old_contexts[0], self) + _state.contexts = self.new_contexts + + return self._deactivate + + def __exit__(self, type, value, traceback): + try: + if type is not None: + return self.exception_handler(type, value, traceback) + finally: + final_contexts = _state.contexts + _state.contexts = self.old_contexts + + if final_contexts is not self.new_contexts: + raise StackContextInconsistentError( + 'stack_context inconsistency (may be caused by yield ' + 'within a "with StackContext" block)') + + # Break up a reference to itself to allow for faster GC on CPython. + self.new_contexts = None + + +class NullContext(object): + """Resets the `StackContext`. + + Useful when creating a shared resource on demand (e.g. an + `.AsyncHTTPClient`) where the stack that caused the creating is + not relevant to future operations. + """ + def __enter__(self): + self.old_contexts = _state.contexts + _state.contexts = (tuple(), None) + + def __exit__(self, type, value, traceback): + _state.contexts = self.old_contexts + + +def _remove_deactivated(contexts): + """Remove deactivated handlers from the chain""" + # Clean ctx handlers + stack_contexts = tuple([h for h in contexts[0] if h.active]) + + # Find new head + head = contexts[1] + while head is not None and not head.active: + head = head.old_contexts[1] + + # Process chain + ctx = head + while ctx is not None: + parent = ctx.old_contexts[1] + + while parent is not None: + if parent.active: + break + ctx.old_contexts = parent.old_contexts + parent = parent.old_contexts[1] + + ctx = parent + + return (stack_contexts, head) + + +def wrap(fn): + """Returns a callable object that will restore the current `StackContext` + when executed. + + Use this whenever saving a callback to be executed later in a + different execution context (either in a different thread or + asynchronously in the same thread). + """ + # Check if function is already wrapped + if fn is None or hasattr(fn, '_wrapped'): + return fn + + # Capture current stack head + # TODO: Any other better way to store contexts and update them in wrapped function? + cap_contexts = [_state.contexts] + + def wrapped(*args, **kwargs): + ret = None + try: + # Capture old state + current_state = _state.contexts + + # Remove deactivated items + cap_contexts[0] = contexts = _remove_deactivated(cap_contexts[0]) + + # Force new state + _state.contexts = contexts + + # Current exception + exc = (None, None, None) + top = None + + # Apply stack contexts + last_ctx = 0 + stack = contexts[0] + + # Apply state + for n in stack: + try: + n.enter() + last_ctx += 1 + except: + # Exception happened. Record exception info and store top-most handler + exc = sys.exc_info() + top = n.old_contexts[1] + + # Execute callback if no exception happened while restoring state + if top is None: + try: + ret = fn(*args, **kwargs) + except: + exc = sys.exc_info() + top = contexts[1] + + # If there was exception, try to handle it by going through the exception chain + if top is not None: + exc = _handle_exception(top, exc) + else: + # Otherwise take shorter path and run stack contexts in reverse order + while last_ctx > 0: + last_ctx -= 1 + c = stack[last_ctx] + + try: + c.exit(*exc) + except: + exc = sys.exc_info() + top = c.old_contexts[1] + break + else: + top = None + + # If if exception happened while unrolling, take longer exception handler path + if top is not None: + exc = _handle_exception(top, exc) + + # If exception was not handled, raise it + if exc != (None, None, None): + raise_exc_info(exc) + finally: + _state.contexts = current_state + return ret + + wrapped._wrapped = True + return wrapped + + +def _handle_exception(tail, exc): + while tail is not None: + try: + if tail.exit(*exc): + exc = (None, None, None) + except: + exc = sys.exc_info() + + tail = tail.old_contexts[1] + + return exc + + +def run_with_stack_context(context, func): + """Run a coroutine ``func`` in the given `StackContext`. + + It is not safe to have a ``yield`` statement within a ``with StackContext`` + block, so it is difficult to use stack context with `.gen.coroutine`. + This helper function runs the function in the correct context while + keeping the ``yield`` and ``with`` statements syntactically separate. + + Example:: + + @gen.coroutine + def incorrect(): + with StackContext(ctx): + # ERROR: this will raise StackContextInconsistentError + yield other_coroutine() + + @gen.coroutine + def correct(): + yield run_with_stack_context(StackContext(ctx), other_coroutine) + + .. versionadded:: 3.1 + """ + with context: + return func() diff --git a/lib/tornado-3.1.1/tornado/tcpserver.py b/lib/tornado-3.1.1/tornado/tcpserver.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/tcpserver.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python +# +# Copyright 2011 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""A non-blocking, single-threaded TCP server.""" +from __future__ import absolute_import, division, print_function, with_statement + +import errno +import os +import socket +import ssl + +from tornado.log import app_log +from tornado.ioloop import IOLoop +from tornado.iostream import IOStream, SSLIOStream +from tornado.netutil import bind_sockets, add_accept_handler, ssl_wrap_socket +from tornado import process + + +class TCPServer(object): + r"""A non-blocking, single-threaded TCP server. + + To use `TCPServer`, define a subclass which overrides the `handle_stream` + method. + + To make this server serve SSL traffic, send the ssl_options dictionary + argument with the arguments required for the `ssl.wrap_socket` method, + including "certfile" and "keyfile":: + + TCPServer(ssl_options={ + "certfile": os.path.join(data_dir, "mydomain.crt"), + "keyfile": os.path.join(data_dir, "mydomain.key"), + }) + + `TCPServer` initialization follows one of three patterns: + + 1. `listen`: simple single-process:: + + server = TCPServer() + server.listen(8888) + IOLoop.instance().start() + + 2. `bind`/`start`: simple multi-process:: + + server = TCPServer() + server.bind(8888) + server.start(0) # Forks multiple sub-processes + IOLoop.instance().start() + + When using this interface, an `.IOLoop` must *not* be passed + to the `TCPServer` constructor. `start` will always start + the server on the default singleton `.IOLoop`. + + 3. `add_sockets`: advanced multi-process:: + + sockets = bind_sockets(8888) + tornado.process.fork_processes(0) + server = TCPServer() + server.add_sockets(sockets) + IOLoop.instance().start() + + The `add_sockets` interface is more complicated, but it can be + used with `tornado.process.fork_processes` to give you more + flexibility in when the fork happens. `add_sockets` can + also be used in single-process servers if you want to create + your listening sockets in some way other than + `~tornado.netutil.bind_sockets`. + + .. versionadded:: 3.1 + The ``max_buffer_size`` argument. + """ + def __init__(self, io_loop=None, ssl_options=None, max_buffer_size=None): + self.io_loop = io_loop + self.ssl_options = ssl_options + self._sockets = {} # fd -> socket object + self._pending_sockets = [] + self._started = False + self.max_buffer_size = max_buffer_size + + # Verify the SSL options. Otherwise we don't get errors until clients + # connect. This doesn't verify that the keys are legitimate, but + # the SSL module doesn't do that until there is a connected socket + # which seems like too much work + if self.ssl_options is not None and isinstance(self.ssl_options, dict): + # Only certfile is required: it can contain both keys + if 'certfile' not in self.ssl_options: + raise KeyError('missing key "certfile" in ssl_options') + + if not os.path.exists(self.ssl_options['certfile']): + raise ValueError('certfile "%s" does not exist' % + self.ssl_options['certfile']) + if ('keyfile' in self.ssl_options and + not os.path.exists(self.ssl_options['keyfile'])): + raise ValueError('keyfile "%s" does not exist' % + self.ssl_options['keyfile']) + + def listen(self, port, address=""): + """Starts accepting connections on the given port. + + This method may be called more than once to listen on multiple ports. + `listen` takes effect immediately; it is not necessary to call + `TCPServer.start` afterwards. It is, however, necessary to start + the `.IOLoop`. + """ + sockets = bind_sockets(port, address=address) + self.add_sockets(sockets) + + def add_sockets(self, sockets): + """Makes this server start accepting connections on the given sockets. + + The ``sockets`` parameter is a list of socket objects such as + those returned by `~tornado.netutil.bind_sockets`. + `add_sockets` is typically used in combination with that + method and `tornado.process.fork_processes` to provide greater + control over the initialization of a multi-process server. + """ + if self.io_loop is None: + self.io_loop = IOLoop.current() + + for sock in sockets: + self._sockets[sock.fileno()] = sock + add_accept_handler(sock, self._handle_connection, + io_loop=self.io_loop) + + def add_socket(self, socket): + """Singular version of `add_sockets`. Takes a single socket object.""" + self.add_sockets([socket]) + + def bind(self, port, address=None, family=socket.AF_UNSPEC, backlog=128): + """Binds this server to the given port on the given address. + + To start the server, call `start`. If you want to run this server + in a single process, you can call `listen` as a shortcut to the + sequence of `bind` and `start` calls. + + Address may be either an IP address or hostname. If it's a hostname, + the server will listen on all IP addresses associated with the + name. Address may be an empty string or None to listen on all + available interfaces. Family may be set to either `socket.AF_INET` + or `socket.AF_INET6` to restrict to IPv4 or IPv6 addresses, otherwise + both will be used if available. + + The ``backlog`` argument has the same meaning as for + `socket.listen `. + + This method may be called multiple times prior to `start` to listen + on multiple ports or interfaces. + """ + sockets = bind_sockets(port, address=address, family=family, + backlog=backlog) + if self._started: + self.add_sockets(sockets) + else: + self._pending_sockets.extend(sockets) + + def start(self, num_processes=1): + """Starts this server in the `.IOLoop`. + + By default, we run the server in this process and do not fork any + additional child process. + + If num_processes is ``None`` or <= 0, we detect the number of cores + available on this machine and fork that number of child + processes. If num_processes is given and > 1, we fork that + specific number of sub-processes. + + Since we use processes and not threads, there is no shared memory + between any server code. + + Note that multiple processes are not compatible with the autoreload + module (or the ``debug=True`` option to `tornado.web.Application`). + When using multiple processes, no IOLoops can be created or + referenced until after the call to ``TCPServer.start(n)``. + """ + assert not self._started + self._started = True + if num_processes != 1: + process.fork_processes(num_processes) + sockets = self._pending_sockets + self._pending_sockets = [] + self.add_sockets(sockets) + + def stop(self): + """Stops listening for new connections. + + Requests currently in progress may still continue after the + server is stopped. + """ + for fd, sock in self._sockets.items(): + self.io_loop.remove_handler(fd) + sock.close() + + def handle_stream(self, stream, address): + """Override to handle a new `.IOStream` from an incoming connection.""" + raise NotImplementedError() + + def _handle_connection(self, connection, address): + if self.ssl_options is not None: + assert ssl, "Python 2.6+ and OpenSSL required for SSL" + try: + connection = ssl_wrap_socket(connection, + self.ssl_options, + server_side=True, + do_handshake_on_connect=False) + except ssl.SSLError as err: + if err.args[0] == ssl.SSL_ERROR_EOF: + return connection.close() + else: + raise + except socket.error as err: + # If the connection is closed immediately after it is created + # (as in a port scan), we can get one of several errors. + # wrap_socket makes an internal call to getpeername, + # which may return either EINVAL (Mac OS X) or ENOTCONN + # (Linux). If it returns ENOTCONN, this error is + # silently swallowed by the ssl module, so we need to + # catch another error later on (AttributeError in + # SSLIOStream._do_ssl_handshake). + # To test this behavior, try nmap with the -sT flag. + # https://github.com/facebook/tornado/pull/750 + if err.args[0] in (errno.ECONNABORTED, errno.EINVAL): + return connection.close() + else: + raise + try: + if self.ssl_options is not None: + stream = SSLIOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size) + else: + stream = IOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size) + self.handle_stream(stream, address) + except Exception: + app_log.error("Error in connection callback", exc_info=True) diff --git a/lib/tornado-3.1.1/tornado/template.py b/lib/tornado-3.1.1/tornado/template.py new file mode 100644 --- /dev/null +++ b/lib/tornado-3.1.1/tornado/template.py @@ -0,0 +1,861 @@ +#!/usr/bin/env python +# +# Copyright 2009 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""A simple template system that compiles templates to Python code. + +Basic usage looks like:: + + t = template.Template("{{ myvalue }}") + print t.generate(myvalue="XXX") + +Loader is a class that loads templates from a root directory and caches +the compiled templates:: + + loader = template.Loader("/home/btaylor") + print loader.load("test.html").generate(myvalue="XXX") + +We compile all templates to raw Python. Error-reporting is currently... uh, +interesting. Syntax for the templates:: + + ### base.html + + + {% block title %}Default title{% end %} + + +
    + {% for student in students %} + {% block student %} +
  • {{ escape(student.name) }}
  • + {% end %} + {% end %} +
+ + + + ### bold.html + {% extends "base.html" %} + + {% block title %}A bolder title{% end %} + + {% block student %} +
  • {{ escape(student.name) }}
  • + {% end %} + +Unlike most other template systems, we do not put any restrictions on the +expressions you can include in your statements. if and for blocks get +translated exactly into Python, you can do complex expressions like:: + + {% for student in [p for p in people if p.student and p.age > 23] %} +
  • {{ escape(student.name) }}
  • + {% end %} + +Translating directly to Python means you can apply functions to expressions +easily, like the escape() function in the examples above. You can pass +functions in to your template just like any other variable:: + + ### Python code + def add(x, y): + return x + y + template.execute(add=add) + + ### The template + {{ add(1, 2) }} + +We provide the functions escape(), url_escape(), json_encode(), and squeeze() +to all templates by default. + +Typical applications do not create `Template` or `Loader` instances by +hand, but instead use the `~.RequestHandler.render` and +`~.RequestHandler.render_string` methods of +`tornado.web.RequestHandler`, which load templates automatically based +on the ``template_path`` `.Application` setting. + +Variable names beginning with ``_tt_`` are reserved by the template +system and should not be used by application code. + +Syntax Reference +---------------- + +Template expressions are surrounded by double curly braces: ``{{ ... }}``. +The contents may be any python expression, which will be escaped according +to the current autoescape setting and inserted into the output. Other +template directives use ``{% %}``. These tags may be escaped as ``{{!`` +and ``{%!`` if you need to include a literal ``{{`` or ``{%`` in the output. + +To comment out a section so that it is omitted from the output, surround it +with ``{# ... #}``. + +``{% apply *function* %}...{% end %}`` + Applies a function to the output of all template code between ``apply`` + and ``end``:: + + {% apply linkify %}{{name}} said: {{message}}{% end %} + + Note that as an implementation detail apply blocks are implemented + as nested functions and thus may interact strangely with variables + set via ``{% set %}``, or the use of ``{% break %}`` or ``{% continue %}`` + within loops. + +``{% autoescape *function* %}`` + Sets the autoescape mode for the current file. This does not affect + other files, even those referenced by ``{% include %}``. Note that + autoescaping can also be configured globally, at the `.Application` + or `Loader`.:: + + {% autoescape xhtml_escape %} + {% autoescape None %} + +``{% block *name* %}...{% end %}`` + Indicates a named, replaceable block for use with ``{% extends %}``. + Blocks in the parent template will be replaced with the contents of + the same-named block in a child template.:: + + + {% block title %}Default title{% end %} + + + {% extends "base.html" %} + {% block title %}My page title{% end %} + +``{% comment ... %}`` + A comment which will be removed from the template output. Note that + there is no ``{% end %}`` tag; the comment goes from the word ``comment`` + to the closing ``%}`` tag. + +``{% extends *filename* %}`` + Inherit from another template. Templates that use ``extends`` should + contain one or more ``block`` tags to replace content from the parent + template. Anything in the child template not contained in a ``block`` + tag will be ignored. For an example, see the ``{% block %}`` tag. + +``{% for *var* in *expr* %}...{% end %}`` + Same as the python ``for`` statement. ``{% break %}`` and + ``{% continue %}`` may be used inside the loop. + +``{% from *x* import *y* %}`` + Same as the python ``import`` statement. + +``{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}`` + Conditional statement - outputs the first section whose condition is + true. (The ``elif`` and ``else`` sections are optional) + +``{% import *module* %}`` + Same as the python ``import`` statement. + +``{% include *filename* %}`` + Includes another template file. The included file can see all the local + variables as if it were copied directly to the point of the ``include`` + directive (the ``{% autoescape %}`` directive is an exception). + Alternately, ``{% module Template(filename, **kwargs) %}`` may be used + to include another template with an isolated namespace. + +``{% module *expr* %}`` + Renders a `~tornado.web.UIModule`. The output of the ``UIModule`` is + not escaped:: + + {% module Template("foo.html", arg=42) %} + +``{% raw *expr* %}`` + Outputs the result of the given expression without autoescaping. + +``{% set *x* = *y* %}`` + Sets a local variable. + +``{% try %}...{% except %}...{% finally %}...{% else %}...{% end %}`` + Same as the python ``try`` statement. + +``{% while *condition* %}... {% end %}`` + Same as the python ``while`` statement. ``{% break %}`` and + ``{% continue %}`` may be used inside the loop. +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import datetime +import linecache +import os.path +import posixpath +import re +import threading + +from tornado import escape +from tornado.log import app_log +from tornado.util import bytes_type, ObjectDict, exec_in, unicode_type + +try: + from cStringIO import StringIO # py2 +except ImportError: + from io import StringIO # py3 + +_DEFAULT_AUTOESCAPE = "xhtml_escape" +_UNSET = object() + + +class Template(object): + """A compiled template. + + We compile into Python from the given template_string. You can generate + the template from variables with generate(). + """ + # note that the constructor's signature is not extracted with + # autodoc because _UNSET looks like garbage. When changing + # this signature update website/sphinx/template.rst too. + def __init__(self, template_string, name="", loader=None, + compress_whitespace=None, autoescape=_UNSET): + self.name = name + if compress_whitespace is None: + compress_whitespace = name.endswith(".html") or \ + name.endswith(".js") + if autoescape is not _UNSET: + self.autoescape = autoescape + elif loader: + self.autoescape = loader.autoescape + else: + self.autoescape = _DEFAULT_AUTOESCAPE + self.namespace = loader.namespace if loader else {} + reader = _TemplateReader(name, escape.native_str(template_string)) + self.file = _File(self, _parse(reader, self)) + self.code = self._generate_python(loader, compress_whitespace) + self.loader = loader + try: + # Under python2.5, the fake filename used here must match + # the module name used in __name__ below. + # The dont_inherit flag prevents template.py's future imports + # from being applied to the generated code. + self.compiled = compile( + escape.to_unicode(self.code), + "%s.generated.py" % self.name.replace('.', '_'), + "exec", dont_inherit=True) + except Exception: + formatted_code = _format_code(self.code).rstrip() + app_log.error("%s code:\n%s", self.name, formatted_code) + raise + + def generate(self, **kwargs): + """Generate this template with the given arguments.""" + namespace = { + "escape": escape.xhtml_escape, + "xhtml_escape": escape.xhtml_escape, + "url_escape": escape.url_escape, + "json_encode": escape.json_encode, + "squeeze": escape.squeeze, + "linkify": escape.linkify, + "datetime": datetime, + "_tt_utf8": escape.utf8, # for internal use + "_tt_string_types": (unicode_type, bytes_type), + # __name__ and __loader__ allow the traceback mechanism to find + # the generated source code. + "__name__": self.name.replace('.', '_'), + "__loader__": ObjectDict(get_source=lambda name: self.code), + } + namespace.update(self.namespace) + namespace.update(kwargs) + exec_in(self.compiled, namespace) + execute = namespace["_tt_execute"] + # Clear the traceback module's cache of source data now that + # we've generated a new template (mainly for this module's + # unittests, where different tests reuse the same name). + linecache.clearcache() + return execute() + + def _generate_python(self, loader, compress_whitespace): + buffer = StringIO() + try: + # named_blocks maps from names to _NamedBlock objects + named_blocks = {} + ancestors = self._get_ancestors(loader) + ancestors.reverse() + for ancestor in ancestors: + ancestor.find_named_blocks(loader, named_blocks) + writer = _CodeWriter(buffer, named_blocks, loader, ancestors[0].template, + compress_whitespace) + ancestors[0].generate(writer) + return buffer.getvalue() + finally: + buffer.close() + + def _get_ancestors(self, loader): + ancestors = [self.file] + for chunk in self.file.body.chunks: + if isinstance(chunk, _ExtendsBlock): + if not loader: + raise ParseError("{% extends %} block found, but no " + "template loader") + template = loader.load(chunk.name, self.name) + ancestors.extend(template._get_ancestors(loader)) + return ancestors + + +class BaseLoader(object): + """Base class for template loaders. + + You must use a template loader to use template constructs like + ``{% extends %}`` and ``{% include %}``. The loader caches all + templates after they are loaded the first time. + """ + def __init__(self, autoescape=_DEFAULT_AUTOESCAPE, namespace=None): + """``autoescape`` must be either None or a string naming a function + in the template namespace, such as "xhtml_escape". + """ + self.autoescape = autoescape + self.namespace = namespace or {} + self.templates = {} + # self.lock protects self.templates. It's a reentrant lock + # because templates may load other templates via `include` or + # `extends`. Note that thanks to the GIL this code would be safe + # even without the lock, but could lead to wasted work as multiple + # threads tried to compile the same template simultaneously. + self.lock = threading.RLock() + + def reset(self): + """Resets the cache of compiled templates.""" + with self.lock: + self.templates = {} + + def resolve_path(self, name, parent_path=None): + """Converts a possibly-relative path to absolute (used internally).""" + raise NotImplementedError() + + def load(self, name, parent_path=None): + """Loads a template.""" + name = self.resolve_path(name, parent_path=parent_path) + with self.lock: + if name not in self.templates: + self.templates[name] = self._create_template(name) + return self.templates[name] + + def _create_template(self, name): + raise NotImplementedError() + + +class Loader(BaseLoader): + """A template loader that loads from a single root directory. + """ + def __init__(self, root_directory, **kwargs): + super(Loader, self).__init__(**kwargs) + self.root = os.path.abspath(root_directory) + + def resolve_path(self, name, parent_path=None): + if parent_path and not parent_path.startswith("<") and \ + not parent_path.startswith("/") and \ + not name.startswith("/"): + current_path = os.path.join(self.root, parent_path) + file_dir = os.path.dirname(os.path.abspath(current_path)) + relative_path = os.path.abspath(os.path.join(file_dir, name)) + if relative_path.startswith(self.root): + name = relative_path[len(self.root) + 1:] + return name + + def _create_template(self, name): + path = os.path.join(self.root, name) + f = open(path, "rb") + template = Template(f.read(), name=name, loader=self) + f.close() + return template + + +class DictLoader(BaseLoader): + """A template loader that loads from a dictionary.""" + def __init__(self, dict, **kwargs): + super(DictLoader, self).__init__(**kwargs) + self.dict = dict + + def resolve_path(self, name, parent_path=None): + if parent_path and not parent_path.startswith("<") and \ + not parent_path.startswith("/") and \ + not name.startswith("/"): + file_dir = posixpath.dirname(parent_path) + name = posixpath.normpath(posixpath.join(file_dir, name)) + return name + + def _create_template(self, name): + return Template(self.dict[name], name=name, loader=self) + + +class _Node(object): + def each_child(self): + return () + + def generate(self, writer): + raise NotImplementedError() + + def find_named_blocks(self, loader, named_blocks): + for child in self.each_child(): + child.find_named_blocks(loader, named_blocks) + + +class _File(_Node): + def __init__(self, template, body): + self.template = template + self.body = body + self.line = 0 + + def generate(self, writer): + writer.write_line("def _tt_execute():", self.line) + with writer.indent(): + writer.write_line("_tt_buffer = []", self.line) + writer.write_line("_tt_append = _tt_buffer.append", self.line) + self.body.generate(writer) + writer.write_line("return _tt_utf8('').join(_tt_buffer)", self.line) + + def each_child(self): + return (self.body,) + + +class _ChunkList(_Node): + def __init__(self, chunks): + self.chunks = chunks + + def generate(self, writer): + for chunk in self.chunks: + chunk.generate(writer) + + def each_child(self): + return self.chunks + + +class _NamedBlock(_Node): + def __init__(self, name, body, template, line): + self.name = name + self.body = body + self.template = template + self.line = line + + def each_child(self): + return (self.body,) + + def generate(self, writer): + block = writer.named_blocks[self.name] + with writer.include(block.template, self.line): + block.body.generate(writer) + + def find_named_blocks(self, loader, named_blocks): + named_blocks[self.name] = self + _Node.find_named_blocks(self, loader, named_blocks) + + +class _ExtendsBlock(_Node): + def __init__(self, name): + self.name = name + + +class _IncludeBlock(_Node): + def __init__(self, name, reader, line): + self.name = name + self.template_name = reader.name + self.line = line + + def find_named_blocks(self, loader, named_blocks): + included = loader.load(self.name, self.template_name) + included.file.find_named_blocks(loader, named_blocks) + + def generate(self, writer): + included = writer.loader.load(self.name, self.template_name) + with writer.include(included, self.line): + included.file.body.generate(writer) + + +class _ApplyBlock(_Node): + def __init__(self, method, line, body=None): + self.method = method + self.line = line + self.body = body + + def each_child(self): + return (self.body,) + + def generate(self, writer): + method_name = "_tt_apply%d" % writer.apply_counter + writer.apply_counter += 1 + writer.write_line("def %s():" % method_name, self.line) + with writer.indent(): + writer.write_line("_tt_buffer = []", self.line) + writer.write_line("_tt_append = _tt_buffer.append", self.line) + self.body.generate(writer) + writer.write_line("return _tt_utf8('').join(_tt_buffer)", self.line) + writer.write_line("_tt_append(_tt_utf8(%s(%s())))" % ( + self.method, method_name), self.line) + + +class _ControlBlock(_Node): + def __init__(self, statement, line, body=None): + self.statement = statement + self.line = line + self.body = body + + def each_child(self): + return (self.body,) + + def generate(self, writer): + writer.write_line("%s:" % self.statement, self.line) + with writer.indent(): + self.body.generate(writer) + # Just in case the body was empty + writer.write_line("pass", self.line) + + +class _IntermediateControlBlock(_Node): + def __init__(self, statement, line): + self.statement = statement + self.line = line + + def generate(self, writer): + # In case the previous block was empty + writer.write_line("pass", self.line) + writer.write_line("%s:" % self.statement, self.line, writer.indent_size() - 1) + + +class _Statement(_Node): + def __init__(self, statement, line): + self.statement = statement + self.line = line + + def generate(self, writer): + writer.write_line(self.statement, self.line) + + +class _Expression(_Node): + def __init__(self, expression, line, raw=False): + self.expression = expression + self.line = line + self.raw = raw + + def generate(self, writer): + writer.write_line("_tt_tmp = %s" % self.expression, self.line) + writer.write_line("if isinstance(_tt_tmp, _tt_string_types):" + " _tt_tmp = _tt_utf8(_tt_tmp)", self.line) + writer.write_line("else: _tt_tmp = _tt_utf8(str(_tt_tmp))", self.line) + if not self.raw and writer.current_template.autoescape is not None: + # In python3 functions like xhtml_escape return unicode, + # so we have to convert to utf8 again. + writer.write_line("_tt_tmp = _tt_utf8(%s(_tt_tmp))" % + writer.current_template.autoescape, self.line) + writer.write_line("_tt_append(_tt_tmp)", self.line) + + +class _Module(_Expression): + def __init__(self, expression, line): + super(_Module, self).__init__("_tt_modules." + expression, line, + raw=True) + + +class _Text(_Node): + def __init__(self, value, line): + self.value = value + self.line = line + + def generate(self, writer): + value = self.value + + # Compress lots of white space to a single character. If the whitespace + # breaks a line, have it continue to break a line, but just with a + # single \n character + if writer.compress_whitespace and "
    " not in value:
    +            value = re.sub(r"([\t ]+)", " ", value)
    +            value = re.sub(r"(\s*\n\s*)", "\n", value)
    +
    +        if value:
    +            writer.write_line('_tt_append(%r)' % escape.utf8(value), self.line)
    +
    +
    +class ParseError(Exception):
    +    """Raised for template syntax errors."""
    +    pass
    +
    +
    +class _CodeWriter(object):
    +    def __init__(self, file, named_blocks, loader, current_template,
    +                 compress_whitespace):
    +        self.file = file
    +        self.named_blocks = named_blocks
    +        self.loader = loader
    +        self.current_template = current_template
    +        self.compress_whitespace = compress_whitespace
    +        self.apply_counter = 0
    +        self.include_stack = []
    +        self._indent = 0
    +
    +    def indent_size(self):
    +        return self._indent
    +
    +    def indent(self):
    +        class Indenter(object):
    +            def __enter__(_):
    +                self._indent += 1
    +                return self
    +
    +            def __exit__(_, *args):
    +                assert self._indent > 0
    +                self._indent -= 1
    +
    +        return Indenter()
    +
    +    def include(self, template, line):
    +        self.include_stack.append((self.current_template, line))
    +        self.current_template = template
    +
    +        class IncludeTemplate(object):
    +            def __enter__(_):
    +                return self
    +
    +            def __exit__(_, *args):
    +                self.current_template = self.include_stack.pop()[0]
    +
    +        return IncludeTemplate()
    +
    +    def write_line(self, line, line_number, indent=None):
    +        if indent is None:
    +            indent = self._indent
    +        line_comment = '  # %s:%d' % (self.current_template.name, line_number)
    +        if self.include_stack:
    +            ancestors = ["%s:%d" % (tmpl.name, lineno)
    +                         for (tmpl, lineno) in self.include_stack]
    +            line_comment += ' (via %s)' % ', '.join(reversed(ancestors))
    +        print("    " * indent + line + line_comment, file=self.file)
    +
    +
    +class _TemplateReader(object):
    +    def __init__(self, name, text):
    +        self.name = name
    +        self.text = text
    +        self.line = 1
    +        self.pos = 0
    +
    +    def find(self, needle, start=0, end=None):
    +        assert start >= 0, start
    +        pos = self.pos
    +        start += pos
    +        if end is None:
    +            index = self.text.find(needle, start)
    +        else:
    +            end += pos
    +            assert end >= start
    +            index = self.text.find(needle, start, end)
    +        if index != -1:
    +            index -= pos
    +        return index
    +
    +    def consume(self, count=None):
    +        if count is None:
    +            count = len(self.text) - self.pos
    +        newpos = self.pos + count
    +        self.line += self.text.count("\n", self.pos, newpos)
    +        s = self.text[self.pos:newpos]
    +        self.pos = newpos
    +        return s
    +
    +    def remaining(self):
    +        return len(self.text) - self.pos
    +
    +    def __len__(self):
    +        return self.remaining()
    +
    +    def __getitem__(self, key):
    +        if type(key) is slice:
    +            size = len(self)
    +            start, stop, step = key.indices(size)
    +            if start is None:
    +                start = self.pos
    +            else:
    +                start += self.pos
    +            if stop is not None:
    +                stop += self.pos
    +            return self.text[slice(start, stop, step)]
    +        elif key < 0:
    +            return self.text[key]
    +        else:
    +            return self.text[self.pos + key]
    +
    +    def __str__(self):
    +        return self.text[self.pos:]
    +
    +
    +def _format_code(code):
    +    lines = code.splitlines()
    +    format = "%%%dd  %%s\n" % len(repr(len(lines) + 1))
    +    return "".join([format % (i + 1, line) for (i, line) in enumerate(lines)])
    +
    +
    +def _parse(reader, template, in_block=None, in_loop=None):
    +    body = _ChunkList([])
    +    while True:
    +        # Find next template directive
    +        curly = 0
    +        while True:
    +            curly = reader.find("{", curly)
    +            if curly == -1 or curly + 1 == reader.remaining():
    +                # EOF
    +                if in_block:
    +                    raise ParseError("Missing {%% end %%} block for %s" %
    +                                     in_block)
    +                body.chunks.append(_Text(reader.consume(), reader.line))
    +                return body
    +            # If the first curly brace is not the start of a special token,
    +            # start searching from the character after it
    +            if reader[curly + 1] not in ("{", "%", "#"):
    +                curly += 1
    +                continue
    +            # When there are more than 2 curlies in a row, use the
    +            # innermost ones.  This is useful when generating languages
    +            # like latex where curlies are also meaningful
    +            if (curly + 2 < reader.remaining() and
    +                    reader[curly + 1] == '{' and reader[curly + 2] == '{'):
    +                curly += 1
    +                continue
    +            break
    +
    +        # Append any text before the special token
    +        if curly > 0:
    +            cons = reader.consume(curly)
    +            body.chunks.append(_Text(cons, reader.line))
    +
    +        start_brace = reader.consume(2)
    +        line = reader.line
    +
    +        # Template directives may be escaped as "{{!" or "{%!".
    +        # In this case output the braces and consume the "!".
    +        # This is especially useful in conjunction with jquery templates,
    +        # which also use double braces.
    +        if reader.remaining() and reader[0] == "!":
    +            reader.consume(1)
    +            body.chunks.append(_Text(start_brace, line))
    +            continue
    +
    +        # Comment
    +        if start_brace == "{#":
    +            end = reader.find("#}")
    +            if end == -1:
    +                raise ParseError("Missing end expression #} on line %d" % line)
    +            contents = reader.consume(end).strip()
    +            reader.consume(2)
    +            continue
    +
    +        # Expression
    +        if start_brace == "{{":
    +            end = reader.find("}}")
    +            if end == -1:
    +                raise ParseError("Missing end expression }} on line %d" % line)
    +            contents = reader.consume(end).strip()
    +            reader.consume(2)
    +            if not contents:
    +                raise ParseError("Empty expression on line %d" % line)
    +            body.chunks.append(_Expression(contents, line))
    +            continue
    +
    +        # Block
    +        assert start_brace == "{%", start_brace
    +        end = reader.find("%}")
    +        if end == -1:
    +            raise ParseError("Missing end block %%} on line %d" % line)
    +        contents = reader.consume(end).strip()
    +        reader.consume(2)
    +        if not contents:
    +            raise ParseError("Empty block tag ({%% %%}) on line %d" % line)
    +
    +        operator, space, suffix = contents.partition(" ")
    +        suffix = suffix.strip()
    +
    +        # Intermediate ("else", "elif", etc) blocks
    +        intermediate_blocks = {
    +            "else": set(["if", "for", "while", "try"]),
    +            "elif": set(["if"]),
    +            "except": set(["try"]),
    +            "finally": set(["try"]),
    +        }
    +        allowed_parents = intermediate_blocks.get(operator)
    +        if allowed_parents is not None:
    +            if not in_block:
    +                raise ParseError("%s outside %s block" %
    +                                (operator, allowed_parents))
    +            if in_block not in allowed_parents:
    +                raise ParseError("%s block cannot be attached to %s block" % (operator, in_block))
    +            body.chunks.append(_IntermediateControlBlock(contents, line))
    +            continue
    +
    +        # End tag
    +        elif operator == "end":
    +            if not in_block:
    +                raise ParseError("Extra {%% end %%} block on line %d" % line)
    +            return body
    +
    +        elif operator in ("extends", "include", "set", "import", "from",
    +                          "comment", "autoescape", "raw", "module"):
    +            if operator == "comment":
    +                continue
    +            if operator == "extends":
    +                suffix = suffix.strip('"').strip("'")
    +                if not suffix:
    +                    raise ParseError("extends missing file path on line %d" % line)
    +                block = _ExtendsBlock(suffix)
    +            elif operator in ("import", "from"):
    +                if not suffix:
    +                    raise ParseError("import missing statement on line %d" % line)
    +                block = _Statement(contents, line)
    +            elif operator == "include":
    +                suffix = suffix.strip('"').strip("'")
    +                if not suffix:
    +                    raise ParseError("include missing file path on line %d" % line)
    +                block = _IncludeBlock(suffix, reader, line)
    +            elif operator == "set":
    +                if not suffix:
    +                    raise ParseError("set missing statement on line %d" % line)
    +                block = _Statement(suffix, line)
    +            elif operator == "autoescape":
    +                fn = suffix.strip()
    +                if fn == "None":
    +                    fn = None
    +                template.autoescape = fn
    +                continue
    +            elif operator == "raw":
    +                block = _Expression(suffix, line, raw=True)
    +            elif operator == "module":
    +                block = _Module(suffix, line)
    +            body.chunks.append(block)
    +            continue
    +
    +        elif operator in ("apply", "block", "try", "if", "for", "while"):
    +            # parse inner body recursively
    +            if operator in ("for", "while"):
    +                block_body = _parse(reader, template, operator, operator)
    +            elif operator == "apply":
    +                # apply creates a nested function so syntactically it's not
    +                # in the loop.
    +                block_body = _parse(reader, template, operator, None)
    +            else:
    +                block_body = _parse(reader, template, operator, in_loop)
    +
    +            if operator == "apply":
    +                if not suffix:
    +                    raise ParseError("apply missing method name on line %d" % line)
    +                block = _ApplyBlock(suffix, line, block_body)
    +            elif operator == "block":
    +                if not suffix:
    +                    raise ParseError("block missing name on line %d" % line)
    +                block = _NamedBlock(suffix, block_body, template, line)
    +            else:
    +                block = _ControlBlock(contents, line, block_body)
    +            body.chunks.append(block)
    +            continue
    +
    +        elif operator in ("break", "continue"):
    +            if not in_loop:
    +                raise ParseError("%s outside %s block" % (operator, set(["for", "while"])))
    +            body.chunks.append(_Statement(contents, line))
    +            continue
    +
    +        else:
    +            raise ParseError("unknown operator: %r" % operator)
    diff --git a/lib/tornado-3.1.1/tornado/test/README b/lib/tornado-3.1.1/tornado/test/README
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/README
    @@ -0,0 +1,4 @@
    +Test coverage is almost non-existent, but it's a start.  Be sure to
    +set PYTHONPATH apprioriately (generally to the root directory of your
    +tornado checkout) when running tests to make sure you're getting the
    +version of the tornado package that you expect.
    \ No newline at end of file
    diff --git a/lib/tornado-3.1.1/tornado/test/__init__.py b/lib/tornado-3.1.1/tornado/test/__init__.py
    new file mode 100644
    diff --git a/lib/tornado-3.1.1/tornado/test/auth_test.py b/lib/tornado-3.1.1/tornado/test/auth_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/auth_test.py
    @@ -0,0 +1,424 @@
    +# These tests do not currently do much to verify the correct implementation
    +# of the openid/oauth protocols, they just exercise the major code paths
    +# and ensure that it doesn't blow up (e.g. with unicode/bytes issues in
    +# python 3)
    +
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +from tornado.auth import OpenIdMixin, OAuthMixin, OAuth2Mixin, TwitterMixin, GoogleMixin, AuthError
    +from tornado.concurrent import Future
    +from tornado.escape import json_decode
    +from tornado import gen
    +from tornado.log import gen_log
    +from tornado.testing import AsyncHTTPTestCase, ExpectLog
    +from tornado.util import u
    +from tornado.web import RequestHandler, Application, asynchronous, HTTPError
    +
    +
    +class OpenIdClientLoginHandler(RequestHandler, OpenIdMixin):
    +    def initialize(self, test):
    +        self._OPENID_ENDPOINT = test.get_url('/openid/server/authenticate')
    +
    +    @asynchronous
    +    def get(self):
    +        if self.get_argument('openid.mode', None):
    +            self.get_authenticated_user(
    +                self.on_user, http_client=self.settings['http_client'])
    +            return
    +        res = self.authenticate_redirect()
    +        assert isinstance(res, Future)
    +        assert res.done()
    +
    +    def on_user(self, user):
    +        if user is None:
    +            raise Exception("user is None")
    +        self.finish(user)
    +
    +
    +class OpenIdServerAuthenticateHandler(RequestHandler):
    +    def post(self):
    +        if self.get_argument('openid.mode') != 'check_authentication':
    +            raise Exception("incorrect openid.mode %r")
    +        self.write('is_valid:true')
    +
    +
    +class OAuth1ClientLoginHandler(RequestHandler, OAuthMixin):
    +    def initialize(self, test, version):
    +        self._OAUTH_VERSION = version
    +        self._OAUTH_REQUEST_TOKEN_URL = test.get_url('/oauth1/server/request_token')
    +        self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth1/server/authorize')
    +        self._OAUTH_ACCESS_TOKEN_URL = test.get_url('/oauth1/server/access_token')
    +
    +    def _oauth_consumer_token(self):
    +        return dict(key='asdf', secret='qwer')
    +
    +    @asynchronous
    +    def get(self):
    +        if self.get_argument('oauth_token', None):
    +            self.get_authenticated_user(
    +                self.on_user, http_client=self.settings['http_client'])
    +            return
    +        res = self.authorize_redirect(http_client=self.settings['http_client'])
    +        assert isinstance(res, Future)
    +
    +    def on_user(self, user):
    +        if user is None:
    +            raise Exception("user is None")
    +        self.finish(user)
    +
    +    def _oauth_get_user(self, access_token, callback):
    +        if access_token != dict(key='uiop', secret='5678'):
    +            raise Exception("incorrect access token %r" % access_token)
    +        callback(dict(email='foo at example.com'))
    +
    +
    +class OAuth1ClientRequestParametersHandler(RequestHandler, OAuthMixin):
    +    def initialize(self, version):
    +        self._OAUTH_VERSION = version
    +
    +    def _oauth_consumer_token(self):
    +        return dict(key='asdf', secret='qwer')
    +
    +    def get(self):
    +        params = self._oauth_request_parameters(
    +            'http://www.example.com/api/asdf',
    +            dict(key='uiop', secret='5678'),
    +            parameters=dict(foo='bar'))
    +        self.write(params)
    +
    +
    +class OAuth1ServerRequestTokenHandler(RequestHandler):
    +    def get(self):
    +        self.write('oauth_token=zxcv&oauth_token_secret=1234')
    +
    +
    +class OAuth1ServerAccessTokenHandler(RequestHandler):
    +    def get(self):
    +        self.write('oauth_token=uiop&oauth_token_secret=5678')
    +
    +
    +class OAuth2ClientLoginHandler(RequestHandler, OAuth2Mixin):
    +    def initialize(self, test):
    +        self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth2/server/authorize')
    +
    +    def get(self):
    +        res = self.authorize_redirect()
    +        assert isinstance(res, Future)
    +        assert res.done()
    +
    +
    +class TwitterClientHandler(RequestHandler, TwitterMixin):
    +    def initialize(self, test):
    +        self._OAUTH_REQUEST_TOKEN_URL = test.get_url('/oauth1/server/request_token')
    +        self._OAUTH_ACCESS_TOKEN_URL = test.get_url('/twitter/server/access_token')
    +        self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth1/server/authorize')
    +        self._TWITTER_BASE_URL = test.get_url('/twitter/api')
    +
    +    def get_auth_http_client(self):
    +        return self.settings['http_client']
    +
    +
    +class TwitterClientLoginHandler(TwitterClientHandler):
    +    @asynchronous
    +    def get(self):
    +        if self.get_argument("oauth_token", None):
    +            self.get_authenticated_user(self.on_user)
    +            return
    +        self.authorize_redirect()
    +
    +    def on_user(self, user):
    +        if user is None:
    +            raise Exception("user is None")
    +        self.finish(user)
    +
    +
    +class TwitterClientLoginGenEngineHandler(TwitterClientHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        if self.get_argument("oauth_token", None):
    +            user = yield self.get_authenticated_user()
    +            self.finish(user)
    +        else:
    +            # Old style: with @gen.engine we can ignore the Future from
    +            # authorize_redirect.
    +            self.authorize_redirect()
    +
    +
    +class TwitterClientLoginGenCoroutineHandler(TwitterClientHandler):
    +    @gen.coroutine
    +    def get(self):
    +        if self.get_argument("oauth_token", None):
    +            user = yield self.get_authenticated_user()
    +            self.finish(user)
    +        else:
    +            # New style: with @gen.coroutine the result must be yielded
    +            # or else the request will be auto-finished too soon.
    +            yield self.authorize_redirect()
    +
    +
    +class TwitterClientShowUserHandler(TwitterClientHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        # TODO: would be nice to go through the login flow instead of
    +        # cheating with a hard-coded access token.
    +        response = yield gen.Task(self.twitter_request,
    +                                  '/users/show/%s' % self.get_argument('name'),
    +                                  access_token=dict(key='hjkl', secret='vbnm'))
    +        if response is None:
    +            self.set_status(500)
    +            self.finish('error from twitter request')
    +        else:
    +            self.finish(response)
    +
    +
    +class TwitterClientShowUserFutureHandler(TwitterClientHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        try:
    +            response = yield self.twitter_request(
    +                '/users/show/%s' % self.get_argument('name'),
    +                access_token=dict(key='hjkl', secret='vbnm'))
    +        except AuthError as e:
    +            self.set_status(500)
    +            self.finish(str(e))
    +            return
    +        assert response is not None
    +        self.finish(response)
    +
    +
    +class TwitterServerAccessTokenHandler(RequestHandler):
    +    def get(self):
    +        self.write('oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foo')
    +
    +
    +class TwitterServerShowUserHandler(RequestHandler):
    +    def get(self, screen_name):
    +        if screen_name == 'error':
    +            raise HTTPError(500)
    +        assert 'oauth_nonce' in self.request.arguments
    +        assert 'oauth_timestamp' in self.request.arguments
    +        assert 'oauth_signature' in self.request.arguments
    +        assert self.get_argument('oauth_consumer_key') == 'test_twitter_consumer_key'
    +        assert self.get_argument('oauth_signature_method') == 'HMAC-SHA1'
    +        assert self.get_argument('oauth_version') == '1.0'
    +        assert self.get_argument('oauth_token') == 'hjkl'
    +        self.write(dict(screen_name=screen_name, name=screen_name.capitalize()))
    +
    +
    +class TwitterServerVerifyCredentialsHandler(RequestHandler):
    +    def get(self):
    +        assert 'oauth_nonce' in self.request.arguments
    +        assert 'oauth_timestamp' in self.request.arguments
    +        assert 'oauth_signature' in self.request.arguments
    +        assert self.get_argument('oauth_consumer_key') == 'test_twitter_consumer_key'
    +        assert self.get_argument('oauth_signature_method') == 'HMAC-SHA1'
    +        assert self.get_argument('oauth_version') == '1.0'
    +        assert self.get_argument('oauth_token') == 'hjkl'
    +        self.write(dict(screen_name='foo', name='Foo'))
    +
    +
    +class GoogleOpenIdClientLoginHandler(RequestHandler, GoogleMixin):
    +    def initialize(self, test):
    +        self._OPENID_ENDPOINT = test.get_url('/openid/server/authenticate')
    +
    +    @asynchronous
    +    def get(self):
    +        if self.get_argument("openid.mode", None):
    +            self.get_authenticated_user(self.on_user)
    +            return
    +        res = self.authenticate_redirect()
    +        assert isinstance(res, Future)
    +        assert res.done()
    +
    +    def on_user(self, user):
    +        if user is None:
    +            raise Exception("user is None")
    +        self.finish(user)
    +
    +    def get_auth_http_client(self):
    +        return self.settings['http_client']
    +
    +
    +class AuthTest(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application(
    +            [
    +                # test endpoints
    +                ('/openid/client/login', OpenIdClientLoginHandler, dict(test=self)),
    +                ('/oauth10/client/login', OAuth1ClientLoginHandler,
    +                 dict(test=self, version='1.0')),
    +                ('/oauth10/client/request_params',
    +                 OAuth1ClientRequestParametersHandler,
    +                 dict(version='1.0')),
    +                ('/oauth10a/client/login', OAuth1ClientLoginHandler,
    +                 dict(test=self, version='1.0a')),
    +                ('/oauth10a/client/request_params',
    +                 OAuth1ClientRequestParametersHandler,
    +                 dict(version='1.0a')),
    +                ('/oauth2/client/login', OAuth2ClientLoginHandler, dict(test=self)),
    +
    +                ('/twitter/client/login', TwitterClientLoginHandler, dict(test=self)),
    +                ('/twitter/client/login_gen_engine', TwitterClientLoginGenEngineHandler, dict(test=self)),
    +                ('/twitter/client/login_gen_coroutine', TwitterClientLoginGenCoroutineHandler, dict(test=self)),
    +                ('/twitter/client/show_user', TwitterClientShowUserHandler, dict(test=self)),
    +                ('/twitter/client/show_user_future', TwitterClientShowUserFutureHandler, dict(test=self)),
    +                ('/google/client/openid_login', GoogleOpenIdClientLoginHandler, dict(test=self)),
    +
    +                # simulated servers
    +                ('/openid/server/authenticate', OpenIdServerAuthenticateHandler),
    +                ('/oauth1/server/request_token', OAuth1ServerRequestTokenHandler),
    +                ('/oauth1/server/access_token', OAuth1ServerAccessTokenHandler),
    +
    +                ('/twitter/server/access_token', TwitterServerAccessTokenHandler),
    +                (r'/twitter/api/users/show/(.*)\.json', TwitterServerShowUserHandler),
    +                (r'/twitter/api/account/verify_credentials\.json', TwitterServerVerifyCredentialsHandler),
    +            ],
    +            http_client=self.http_client,
    +            twitter_consumer_key='test_twitter_consumer_key',
    +            twitter_consumer_secret='test_twitter_consumer_secret')
    +
    +    def test_openid_redirect(self):
    +        response = self.fetch('/openid/client/login', follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue(
    +            '/openid/server/authenticate?' in response.headers['Location'])
    +
    +    def test_openid_get_user(self):
    +        response = self.fetch('/openid/client/login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo at example.com')
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed["email"], "foo at example.com")
    +
    +    def test_oauth10_redirect(self):
    +        response = self.fetch('/oauth10/client/login', follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue(response.headers['Location'].endswith(
    +            '/oauth1/server/authorize?oauth_token=zxcv'))
    +        # the cookie is base64('zxcv')|base64('1234')
    +        self.assertTrue(
    +            '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'],
    +            response.headers['Set-Cookie'])
    +
    +    def test_oauth10_get_user(self):
    +        response = self.fetch(
    +            '/oauth10/client/login?oauth_token=zxcv',
    +            headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='})
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed['email'], 'foo at example.com')
    +        self.assertEqual(parsed['access_token'], dict(key='uiop', secret='5678'))
    +
    +    def test_oauth10_request_parameters(self):
    +        response = self.fetch('/oauth10/client/request_params')
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed['oauth_consumer_key'], 'asdf')
    +        self.assertEqual(parsed['oauth_token'], 'uiop')
    +        self.assertTrue('oauth_nonce' in parsed)
    +        self.assertTrue('oauth_signature' in parsed)
    +
    +    def test_oauth10a_redirect(self):
    +        response = self.fetch('/oauth10a/client/login', follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue(response.headers['Location'].endswith(
    +            '/oauth1/server/authorize?oauth_token=zxcv'))
    +        # the cookie is base64('zxcv')|base64('1234')
    +        self.assertTrue(
    +            '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'],
    +            response.headers['Set-Cookie'])
    +
    +    def test_oauth10a_get_user(self):
    +        response = self.fetch(
    +            '/oauth10a/client/login?oauth_token=zxcv',
    +            headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='})
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed['email'], 'foo at example.com')
    +        self.assertEqual(parsed['access_token'], dict(key='uiop', secret='5678'))
    +
    +    def test_oauth10a_request_parameters(self):
    +        response = self.fetch('/oauth10a/client/request_params')
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed['oauth_consumer_key'], 'asdf')
    +        self.assertEqual(parsed['oauth_token'], 'uiop')
    +        self.assertTrue('oauth_nonce' in parsed)
    +        self.assertTrue('oauth_signature' in parsed)
    +
    +    def test_oauth2_redirect(self):
    +        response = self.fetch('/oauth2/client/login', follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue('/oauth2/server/authorize?' in response.headers['Location'])
    +
    +    def base_twitter_redirect(self, url):
    +        # Same as test_oauth10a_redirect
    +        response = self.fetch(url, follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue(response.headers['Location'].endswith(
    +            '/oauth1/server/authorize?oauth_token=zxcv'))
    +        # the cookie is base64('zxcv')|base64('1234')
    +        self.assertTrue(
    +            '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'],
    +            response.headers['Set-Cookie'])
    +
    +    def test_twitter_redirect(self):
    +        self.base_twitter_redirect('/twitter/client/login')
    +
    +    def test_twitter_redirect_gen_engine(self):
    +        self.base_twitter_redirect('/twitter/client/login_gen_engine')
    +
    +    def test_twitter_redirect_gen_coroutine(self):
    +        self.base_twitter_redirect('/twitter/client/login_gen_coroutine')
    +
    +    def test_twitter_get_user(self):
    +        response = self.fetch(
    +            '/twitter/client/login?oauth_token=zxcv',
    +            headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='})
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed,
    +                         {u('access_token'): {u('key'): u('hjkl'),
    +                                              u('screen_name'): u('foo'),
    +                                              u('secret'): u('vbnm')},
    +                          u('name'): u('Foo'),
    +                          u('screen_name'): u('foo'),
    +                          u('username'): u('foo')})
    +
    +    def test_twitter_show_user(self):
    +        response = self.fetch('/twitter/client/show_user?name=somebody')
    +        response.rethrow()
    +        self.assertEqual(json_decode(response.body),
    +                         {'name': 'Somebody', 'screen_name': 'somebody'})
    +
    +    def test_twitter_show_user_error(self):
    +        with ExpectLog(gen_log, 'Error response HTTP 500'):
    +            response = self.fetch('/twitter/client/show_user?name=error')
    +        self.assertEqual(response.code, 500)
    +        self.assertEqual(response.body, b'error from twitter request')
    +
    +    def test_twitter_show_user_future(self):
    +        response = self.fetch('/twitter/client/show_user_future?name=somebody')
    +        response.rethrow()
    +        self.assertEqual(json_decode(response.body),
    +                         {'name': 'Somebody', 'screen_name': 'somebody'})
    +
    +    def test_twitter_show_user_future_error(self):
    +        response = self.fetch('/twitter/client/show_user_future?name=error')
    +        self.assertEqual(response.code, 500)
    +        self.assertIn(b'Error response HTTP 500', response.body)
    +
    +    def test_google_redirect(self):
    +        # same as test_openid_redirect
    +        response = self.fetch('/google/client/openid_login', follow_redirects=False)
    +        self.assertEqual(response.code, 302)
    +        self.assertTrue(
    +            '/openid/server/authenticate?' in response.headers['Location'])
    +
    +    def test_google_get_user(self):
    +        response = self.fetch('/google/client/openid_login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo at example.com', follow_redirects=False)
    +        response.rethrow()
    +        parsed = json_decode(response.body)
    +        self.assertEqual(parsed["email"], "foo at example.com")
    diff --git a/lib/tornado-3.1.1/tornado/test/concurrent_test.py b/lib/tornado-3.1.1/tornado/test/concurrent_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/concurrent_test.py
    @@ -0,0 +1,330 @@
    +#!/usr/bin/env python
    +#
    +# Copyright 2012 Facebook
    +#
    +# Licensed under the Apache License, Version 2.0 (the "License"); you may
    +# not use this file except in compliance with the License. You may obtain
    +# a copy of the License at
    +#
    +#     http://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing, software
    +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    +# License for the specific language governing permissions and limitations
    +# under the License.
    +from __future__ import absolute_import, division, print_function, with_statement
    +
    +import logging
    +import re
    +import socket
    +import sys
    +import traceback
    +
    +from tornado.concurrent import Future, return_future, ReturnValueIgnoredError
    +from tornado.escape import utf8, to_unicode
    +from tornado import gen
    +from tornado.iostream import IOStream
    +from tornado import stack_context
    +from tornado.tcpserver import TCPServer
    +from tornado.testing import AsyncTestCase, LogTrapTestCase, bind_unused_port, gen_test
    +
    +
    +class ReturnFutureTest(AsyncTestCase):
    +    @return_future
    +    def sync_future(self, callback):
    +        callback(42)
    +
    +    @return_future
    +    def async_future(self, callback):
    +        self.io_loop.add_callback(callback, 42)
    +
    +    @return_future
    +    def immediate_failure(self, callback):
    +        1 / 0
    +
    +    @return_future
    +    def delayed_failure(self, callback):
    +        self.io_loop.add_callback(lambda: 1 / 0)
    +
    +    @return_future
    +    def return_value(self, callback):
    +        # Note that the result of both running the callback and returning
    +        # a value (or raising an exception) is unspecified; with current
    +        # implementations the last event prior to callback resolution wins.
    +        return 42
    +
    +    @return_future
    +    def no_result_future(self, callback):
    +        callback()
    +
    +    def test_immediate_failure(self):
    +        with self.assertRaises(ZeroDivisionError):
    +            # The caller sees the error just like a normal function.
    +            self.immediate_failure(callback=self.stop)
    +        # The callback is not run because the function failed synchronously.
    +        self.io_loop.add_timeout(self.io_loop.time() + 0.05, self.stop)
    +        result = self.wait()
    +        self.assertIs(result, None)
    +
    +    def test_return_value(self):
    +        with self.assertRaises(ReturnValueIgnoredError):
    +            self.return_value(callback=self.stop)
    +
    +    def test_callback_kw(self):
    +        future = self.sync_future(callback=self.stop)
    +        result = self.wait()
    +        self.assertEqual(result, 42)
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_callback_positional(self):
    +        # When the callback is passed in positionally, future_wrap shouldn't
    +        # add another callback in the kwargs.
    +        future = self.sync_future(self.stop)
    +        result = self.wait()
    +        self.assertEqual(result, 42)
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_no_callback(self):
    +        future = self.sync_future()
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_none_callback_kw(self):
    +        # explicitly pass None as callback
    +        future = self.sync_future(callback=None)
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_none_callback_pos(self):
    +        future = self.sync_future(None)
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_async_future(self):
    +        future = self.async_future()
    +        self.assertFalse(future.done())
    +        self.io_loop.add_future(future, self.stop)
    +        future2 = self.wait()
    +        self.assertIs(future, future2)
    +        self.assertEqual(future.result(), 42)
    +
    +    @gen_test
    +    def test_async_future_gen(self):
    +        result = yield self.async_future()
    +        self.assertEqual(result, 42)
    +
    +    def test_delayed_failure(self):
    +        future = self.delayed_failure()
    +        self.io_loop.add_future(future, self.stop)
    +        future2 = self.wait()
    +        self.assertIs(future, future2)
    +        with self.assertRaises(ZeroDivisionError):
    +            future.result()
    +
    +    def test_kw_only_callback(self):
    +        @return_future
    +        def f(**kwargs):
    +            kwargs['callback'](42)
    +        future = f()
    +        self.assertEqual(future.result(), 42)
    +
    +    def test_error_in_callback(self):
    +        self.sync_future(callback=lambda future: 1 / 0)
    +        # The exception gets caught by our StackContext and will be re-raised
    +        # when we wait.
    +        self.assertRaises(ZeroDivisionError, self.wait)
    +
    +    def test_no_result_future(self):
    +        future = self.no_result_future(self.stop)
    +        result = self.wait()
    +        self.assertIs(result, None)
    +        # result of this future is undefined, but not an error
    +        future.result()
    +
    +    def test_no_result_future_callback(self):
    +        future = self.no_result_future(callback=lambda: self.stop())
    +        result = self.wait()
    +        self.assertIs(result, None)
    +        future.result()
    +
    +    @gen_test
    +    def test_future_traceback(self):
    +        @return_future
    +        @gen.engine
    +        def f(callback):
    +            yield gen.Task(self.io_loop.add_callback)
    +            try:
    +                1 / 0
    +            except ZeroDivisionError:
    +                self.expected_frame = traceback.extract_tb(
    +                    sys.exc_info()[2], limit=1)[0]
    +                raise
    +        try:
    +            yield f()
    +            self.fail("didn't get expected exception")
    +        except ZeroDivisionError:
    +            tb = traceback.extract_tb(sys.exc_info()[2])
    +            self.assertIn(self.expected_frame, tb)
    +
    +# The following series of classes demonstrate and test various styles
    +# of use, with and without generators and futures.
    +
    +
    +class CapServer(TCPServer):
    +    def handle_stream(self, stream, address):
    +        logging.info("handle_stream")
    +        self.stream = stream
    +        self.stream.read_until(b"\n", self.handle_read)
    +
    +    def handle_read(self, data):
    +        logging.info("handle_read")
    +        data = to_unicode(data)
    +        if data == data.upper():
    +            self.stream.write(b"error\talready capitalized\n")
    +        else:
    +            # data already has \n
    +            self.stream.write(utf8("ok\t%s" % data.upper()))
    +        self.stream.close()
    +
    +
    +class CapError(Exception):
    +    pass
    +
    +
    +class BaseCapClient(object):
    +    def __init__(self, port, io_loop):
    +        self.port = port
    +        self.io_loop = io_loop
    +
    +    def process_response(self, data):
    +        status, message = re.match('(.*)\t(.*)\n', to_unicode(data)).groups()
    +        if status == 'ok':
    +            return message
    +        else:
    +            raise CapError(message)
    +
    +
    +class ManualCapClient(BaseCapClient):
    +    def capitalize(self, request_data, callback=None):
    +        logging.info("capitalize")
    +        self.request_data = request_data
    +        self.stream = IOStream(socket.socket(), io_loop=self.io_loop)
    +        self.stream.connect(('127.0.0.1', self.port),
    +                            callback=self.handle_connect)
    +        self.future = Future()
    +        if callback is not None:
    +            self.future.add_done_callback(
    +                stack_context.wrap(lambda future: callback(future.result())))
    +        return self.future
    +
    +    def handle_connect(self):
    +        logging.info("handle_connect")
    +        self.stream.write(utf8(self.request_data + "\n"))
    +        self.stream.read_until(b'\n', callback=self.handle_read)
    +
    +    def handle_read(self, data):
    +        logging.info("handle_read")
    +        self.stream.close()
    +        try:
    +            self.future.set_result(self.process_response(data))
    +        except CapError as e:
    +            self.future.set_exception(e)
    +
    +
    +class DecoratorCapClient(BaseCapClient):
    +    @return_future
    +    def capitalize(self, request_data, callback):
    +        logging.info("capitalize")
    +        self.request_data = request_data
    +        self.stream = IOStream(socket.socket(), io_loop=self.io_loop)
    +        self.stream.connect(('127.0.0.1', self.port),
    +                            callback=self.handle_connect)
    +        self.callback = callback
    +
    +    def handle_connect(self):
    +        logging.info("handle_connect")
    +        self.stream.write(utf8(self.request_data + "\n"))
    +        self.stream.read_until(b'\n', callback=self.handle_read)
    +
    +    def handle_read(self, data):
    +        logging.info("handle_read")
    +        self.stream.close()
    +        self.callback(self.process_response(data))
    +
    +
    +class GeneratorCapClient(BaseCapClient):
    +    @return_future
    +    @gen.engine
    +    def capitalize(self, request_data, callback):
    +        logging.info('capitalize')
    +        stream = IOStream(socket.socket(), io_loop=self.io_loop)
    +        logging.info('connecting')
    +        yield gen.Task(stream.connect, ('127.0.0.1', self.port))
    +        stream.write(utf8(request_data + '\n'))
    +        logging.info('reading')
    +        data = yield gen.Task(stream.read_until, b'\n')
    +        logging.info('returning')
    +        stream.close()
    +        callback(self.process_response(data))
    +
    +
    +class ClientTestMixin(object):
    +    def setUp(self):
    +        super(ClientTestMixin, self).setUp()
    +        self.server = CapServer(io_loop=self.io_loop)
    +        sock, port = bind_unused_port()
    +        self.server.add_sockets([sock])
    +        self.client = self.client_class(io_loop=self.io_loop, port=port)
    +
    +    def tearDown(self):
    +        self.server.stop()
    +        super(ClientTestMixin, self).tearDown()
    +
    +    def test_callback(self):
    +        self.client.capitalize("hello", callback=self.stop)
    +        result = self.wait()
    +        self.assertEqual(result, "HELLO")
    +
    +    def test_callback_error(self):
    +        self.client.capitalize("HELLO", callback=self.stop)
    +        self.assertRaisesRegexp(CapError, "already capitalized", self.wait)
    +
    +    def test_future(self):
    +        future = self.client.capitalize("hello")
    +        self.io_loop.add_future(future, self.stop)
    +        self.wait()
    +        self.assertEqual(future.result(), "HELLO")
    +
    +    def test_future_error(self):
    +        future = self.client.capitalize("HELLO")
    +        self.io_loop.add_future(future, self.stop)
    +        self.wait()
    +        self.assertRaisesRegexp(CapError, "already capitalized", future.result)
    +
    +    def test_generator(self):
    +        @gen.engine
    +        def f():
    +            result = yield self.client.capitalize("hello")
    +            self.assertEqual(result, "HELLO")
    +            self.stop()
    +        f()
    +        self.wait()
    +
    +    def test_generator_error(self):
    +        @gen.engine
    +        def f():
    +            with self.assertRaisesRegexp(CapError, "already capitalized"):
    +                yield self.client.capitalize("HELLO")
    +            self.stop()
    +        f()
    +        self.wait()
    +
    +
    +class ManualClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase):
    +    client_class = ManualCapClient
    +
    +
    +class DecoratorClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase):
    +    client_class = DecoratorCapClient
    +
    +
    +class GeneratorClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase):
    +    client_class = GeneratorCapClient
    diff --git a/lib/tornado-3.1.1/tornado/test/csv_translations/fr_FR.csv b/lib/tornado-3.1.1/tornado/test/csv_translations/fr_FR.csv
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/csv_translations/fr_FR.csv
    @@ -0,0 +1,1 @@
    +"school","?cole"
    diff --git a/lib/tornado-3.1.1/tornado/test/curl_httpclient_test.py b/lib/tornado-3.1.1/tornado/test/curl_httpclient_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/curl_httpclient_test.py
    @@ -0,0 +1,99 @@
    +from __future__ import absolute_import, division, print_function, with_statement
    +
    +from hashlib import md5
    +
    +from tornado.httpclient import HTTPRequest
    +from tornado.stack_context import ExceptionStackContext
    +from tornado.testing import AsyncHTTPTestCase
    +from tornado.test import httpclient_test
    +from tornado.test.util import unittest
    +from tornado.web import Application, RequestHandler
    +
    +try:
    +    import pycurl
    +except ImportError:
    +    pycurl = None
    +
    +if pycurl is not None:
    +    from tornado.curl_httpclient import CurlAsyncHTTPClient
    +
    +
    + at unittest.skipIf(pycurl is None, "pycurl module not present")
    +class CurlHTTPClientCommonTestCase(httpclient_test.HTTPClientCommonTestCase):
    +    def get_http_client(self):
    +        client = CurlAsyncHTTPClient(io_loop=self.io_loop)
    +        # make sure AsyncHTTPClient magic doesn't give us the wrong class
    +        self.assertTrue(isinstance(client, CurlAsyncHTTPClient))
    +        return client
    +
    +
    +class DigestAuthHandler(RequestHandler):
    +    def get(self):
    +        realm = 'test'
    +        opaque = 'asdf'
    +        # Real implementations would use a random nonce.
    +        nonce = "1234"
    +        username = 'foo'
    +        password = 'bar'
    +
    +        auth_header = self.request.headers.get('Authorization', None)
    +        if auth_header is not None:
    +            auth_mode, params = auth_header.split(' ', 1)
    +            assert auth_mode == 'Digest'
    +            param_dict = {}
    +            for pair in params.split(','):
    +                k, v = pair.strip().split('=', 1)
    +                if v[0] == '"' and v[-1] == '"':
    +                    v = v[1:-1]
    +                param_dict[k] = v
    +            assert param_dict['realm'] == realm
    +            assert param_dict['opaque'] == opaque
    +            assert param_dict['nonce'] == nonce
    +            assert param_dict['username'] == username
    +            assert param_dict['uri'] == self.request.path
    +            h1 = md5('%s:%s:%s' % (username, realm, password)).hexdigest()
    +            h2 = md5('%s:%s' % (self.request.method,
    +                                self.request.path)).hexdigest()
    +            digest = md5('%s:%s:%s' % (h1, nonce, h2)).hexdigest()
    +            if digest == param_dict['response']:
    +                self.write('ok')
    +            else:
    +                self.write('fail')
    +        else:
    +            self.set_status(401)
    +            self.set_header('WWW-Authenticate',
    +                            'Digest realm="%s", nonce="%s", opaque="%s"' %
    +                            (realm, nonce, opaque))
    +
    +
    + at unittest.skipIf(pycurl is None, "pycurl module not present")
    +class CurlHTTPClientTestCase(AsyncHTTPTestCase):
    +    def setUp(self):
    +        super(CurlHTTPClientTestCase, self).setUp()
    +        self.http_client = CurlAsyncHTTPClient(self.io_loop)
    +
    +    def get_app(self):
    +        return Application([
    +            ('/digest', DigestAuthHandler),
    +        ])
    +
    +    def test_prepare_curl_callback_stack_context(self):
    +        exc_info = []
    +
    +        def error_handler(typ, value, tb):
    +            exc_info.append((typ, value, tb))
    +            self.stop()
    +            return True
    +
    +        with ExceptionStackContext(error_handler):
    +            request = HTTPRequest(self.get_url('/'),
    +                                  prepare_curl_callback=lambda curl: 1 / 0)
    +        self.http_client.fetch(request, callback=self.stop)
    +        self.wait()
    +        self.assertEqual(1, len(exc_info))
    +        self.assertIs(exc_info[0][0], ZeroDivisionError)
    +
    +    def test_digest_auth(self):
    +        response = self.fetch('/digest', auth_mode='digest',
    +                              auth_username='foo', auth_password='bar')
    +        self.assertEqual(response.body, b'ok')
    diff --git a/lib/tornado-3.1.1/tornado/test/escape_test.py b/lib/tornado-3.1.1/tornado/test/escape_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/escape_test.py
    @@ -0,0 +1,217 @@
    +#!/usr/bin/env python
    +
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +import tornado.escape
    +
    +from tornado.escape import utf8, xhtml_escape, xhtml_unescape, url_escape, url_unescape, to_unicode, json_decode, json_encode
    +from tornado.util import u, unicode_type, bytes_type
    +from tornado.test.util import unittest
    +
    +linkify_tests = [
    +    # (input, linkify_kwargs, expected_output)
    +
    +    ("hello http://world.com/!", {},
    +     u('hello http://world.com/!')),
    +
    +    ("hello http://world.com/with?param=true&stuff=yes", {},
    +     u('hello http://world.com/with?param=true&stuff=yes')),
    +
    +    # an opened paren followed by many chars killed Gruber's regex
    +    ("http://url.com/w(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", {},
    +     u('http://url.com/w(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')),
    +
    +    # as did too many dots at the end
    +    ("http://url.com/withmany.......................................", {},
    +     u('http://url.com/withmany.......................................')),
    +
    +    ("http://url.com/withmany((((((((((((((((((((((((((((((((((a)", {},
    +     u('http://url.com/withmany((((((((((((((((((((((((((((((((((a)')),
    +
    +    # some examples from http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
    +    # plus a fex extras (such as multiple parentheses).
    +    ("http://foo.com/blah_blah", {},
    +     u('http://foo.com/blah_blah')),
    +
    +    ("http://foo.com/blah_blah/", {},
    +     u('http://foo.com/blah_blah/')),
    +
    +    ("(Something like http://foo.com/blah_blah)", {},
    +     u('(Something like http://foo.com/blah_blah)')),
    +
    +    ("http://foo.com/blah_blah_(wikipedia)", {},
    +     u('http://foo.com/blah_blah_(wikipedia)')),
    +
    +    ("http://foo.com/blah_(blah)_(wikipedia)_blah", {},
    +     u('http://foo.com/blah_(blah)_(wikipedia)_blah')),
    +
    +    ("(Something like http://foo.com/blah_blah_(wikipedia))", {},
    +     u('(Something like http://foo.com/blah_blah_(wikipedia))')),
    +
    +    ("http://foo.com/blah_blah.", {},
    +     u('http://foo.com/blah_blah.')),
    +
    +    ("http://foo.com/blah_blah/.", {},
    +     u('http://foo.com/blah_blah/.')),
    +
    +    ("", {},
    +     u('<http://foo.com/blah_blah>')),
    +
    +    ("", {},
    +     u('<http://foo.com/blah_blah/>')),
    +
    +    ("http://foo.com/blah_blah,", {},
    +     u('http://foo.com/blah_blah,')),
    +
    +    ("http://www.example.com/wpstyle/?p=364.", {},
    +     u('http://www.example.com/wpstyle/?p=364.')),
    +
    +    ("rdar://1234",
    +     {"permitted_protocols": ["http", "rdar"]},
    +     u('rdar://1234')),
    +
    +    ("rdar:/1234",
    +     {"permitted_protocols": ["rdar"]},
    +     u('rdar:/1234')),
    +
    +    ("http://userid:password at example.com:8080", {},
    +     u('http://userid:password at example.com:8080')),
    +
    +    ("http://userid at example.com", {},
    +     u('http://userid at example.com')),
    +
    +    ("http://userid at example.com:8080", {},
    +     u('http://userid at example.com:8080')),
    +
    +    ("http://userid:password at example.com", {},
    +     u('http://userid:password at example.com')),
    +
    +    ("message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff at mail.gmail.com%3e",
    +     {"permitted_protocols": ["http", "message"]},
    +     u('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff at mail.gmail.com%3e')),
    +
    +    (u("http://\u27a1.ws/\u4a39"), {},
    +     u('http://\u27a1.ws/\u4a39')),
    +
    +    ("http://example.com", {},
    +     u('<tag>http://example.com</tag>')),
    +
    +    ("Just a www.example.com link.", {},
    +     u('Just a www.example.com link.')),
    +
    +    ("Just a www.example.com link.",
    +     {"require_protocol": True},
    +     u('Just a www.example.com link.')),
    +
    +    ("A http://reallylong.com/link/that/exceedsthelenglimit.html",
    +     {"require_protocol": True, "shorten": True},
    +     u('A http://reallylong.com/link...')),
    +
    +    ("A http://reallylongdomainnamethatwillbetoolong.com/hi!",
    +     {"shorten": True},
    +     u('A http://reallylongdomainnametha...!')),
    +
    +    ("A file:///passwords.txt and http://web.com link", {},
    +     u('A file:///passwords.txt and http://web.com link')),
    +
    +    ("A file:///passwords.txt and http://web.com link",
    +     {"permitted_protocols": ["file"]},
    +     u('A file:///passwords.txt and http://web.com link')),
    +
    +    ("www.external-link.com",
    +     {"extra_params": 'rel="nofollow" class="external"'},
    +     u('www.external-link.com')),
    +
    +    ("www.external-link.com and www.internal-link.com/blogs extra",
    +     {"extra_params": lambda href: 'class="internal"' if href.startswith("http://www.internal-link.com") else 'rel="nofollow" class="external"'},
    +     u('www.external-link.com and www.internal-link.com/blogs extra')),
    +
    +    ("www.external-link.com",
    +     {"extra_params": lambda href: '    rel="nofollow" class="external"  '},
    +     u('www.external-link.com')),
    +]
    +
    +
    +class EscapeTestCase(unittest.TestCase):
    +    def test_linkify(self):
    +        for text, kwargs, html in linkify_tests:
    +            linked = tornado.escape.linkify(text, **kwargs)
    +            self.assertEqual(linked, html)
    +
    +    def test_xhtml_escape(self):
    +        tests = [
    +            ("", "<foo>"),
    +            (u(""), u("<foo>")),
    +            (b"", b"<foo>"),
    +
    +            ("<>&\"", "<>&""),
    +            ("&", "&amp;"),
    +
    +            (u("<\u00e9>"), u("<\u00e9>")),
    +            (b"<\xc3\xa9>", b"<\xc3\xa9>"),
    +        ]
    +        for unescaped, escaped in tests:
    +            self.assertEqual(utf8(xhtml_escape(unescaped)), utf8(escaped))
    +            self.assertEqual(utf8(unescaped), utf8(xhtml_unescape(escaped)))
    +
    +    def test_url_escape_unicode(self):
    +        tests = [
    +            # byte strings are passed through as-is
    +            (u('\u00e9').encode('utf8'), '%C3%A9'),
    +            (u('\u00e9').encode('latin1'), '%E9'),
    +
    +            # unicode strings become utf8
    +            (u('\u00e9'), '%C3%A9'),
    +        ]
    +        for unescaped, escaped in tests:
    +            self.assertEqual(url_escape(unescaped), escaped)
    +
    +    def test_url_unescape_unicode(self):
    +        tests = [
    +            ('%C3%A9', u('\u00e9'), 'utf8'),
    +            ('%C3%A9', u('\u00c3\u00a9'), 'latin1'),
    +            ('%C3%A9', utf8(u('\u00e9')), None),
    +        ]
    +        for escaped, unescaped, encoding in tests:
    +            # input strings to url_unescape should only contain ascii
    +            # characters, but make sure the function accepts both byte
    +            # and unicode strings.
    +            self.assertEqual(url_unescape(to_unicode(escaped), encoding), unescaped)
    +            self.assertEqual(url_unescape(utf8(escaped), encoding), unescaped)
    +
    +    def test_url_escape_quote_plus(self):
    +        unescaped = '+ #%'
    +        plus_escaped = '%2B+%23%25'
    +        escaped = '%2B%20%23%25'
    +        self.assertEqual(url_escape(unescaped), plus_escaped)
    +        self.assertEqual(url_escape(unescaped, plus=False), escaped)
    +        self.assertEqual(url_unescape(plus_escaped), unescaped)
    +        self.assertEqual(url_unescape(escaped, plus=False), unescaped)
    +        self.assertEqual(url_unescape(plus_escaped, encoding=None),
    +                         utf8(unescaped))
    +        self.assertEqual(url_unescape(escaped, encoding=None, plus=False),
    +                         utf8(unescaped))
    +
    +    def test_escape_return_types(self):
    +        # On python2 the escape methods should generally return the same
    +        # type as their argument
    +        self.assertEqual(type(xhtml_escape("foo")), str)
    +        self.assertEqual(type(xhtml_escape(u("foo"))), unicode_type)
    +
    +    def test_json_decode(self):
    +        # json_decode accepts both bytes and unicode, but strings it returns
    +        # are always unicode.
    +        self.assertEqual(json_decode(b'"foo"'), u("foo"))
    +        self.assertEqual(json_decode(u('"foo"')), u("foo"))
    +
    +        # Non-ascii bytes are interpreted as utf8
    +        self.assertEqual(json_decode(utf8(u('"\u00e9"'))), u("\u00e9"))
    +
    +    def test_json_encode(self):
    +        # json deals with strings, not bytes.  On python 2 byte strings will
    +        # convert automatically if they are utf8; on python 3 byte strings
    +        # are not allowed.
    +        self.assertEqual(json_decode(json_encode(u("\u00e9"))), u("\u00e9"))
    +        if bytes_type is str:
    +            self.assertEqual(json_decode(json_encode(utf8(u("\u00e9")))), u("\u00e9"))
    +            self.assertRaises(UnicodeDecodeError, json_encode, b"\xe9")
    diff --git a/lib/tornado-3.1.1/tornado/test/gen_test.py b/lib/tornado-3.1.1/tornado/test/gen_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/gen_test.py
    @@ -0,0 +1,913 @@
    +from __future__ import absolute_import, division, print_function, with_statement
    +
    +import contextlib
    +import functools
    +import sys
    +import textwrap
    +import time
    +import platform
    +import weakref
    +
    +from tornado.concurrent import return_future
    +from tornado.escape import url_escape
    +from tornado.httpclient import AsyncHTTPClient
    +from tornado.ioloop import IOLoop
    +from tornado.log import app_log
    +from tornado import stack_context
    +from tornado.testing import AsyncHTTPTestCase, AsyncTestCase, ExpectLog, gen_test
    +from tornado.test.util import unittest, skipOnTravis
    +from tornado.web import Application, RequestHandler, asynchronous, HTTPError
    +
    +from tornado import gen
    +
    +
    +skipBefore33 = unittest.skipIf(sys.version_info < (3, 3), 'PEP 380 not available')
    +skipNotCPython = unittest.skipIf(platform.python_implementation() != 'CPython',
    +                                 'Not CPython implementation')
    +
    +
    +class GenEngineTest(AsyncTestCase):
    +    def setUp(self):
    +        super(GenEngineTest, self).setUp()
    +        self.named_contexts = []
    +
    +    def named_context(self, name):
    +        @contextlib.contextmanager
    +        def context():
    +            self.named_contexts.append(name)
    +            try:
    +                yield
    +            finally:
    +                self.assertEqual(self.named_contexts.pop(), name)
    +        return context
    +
    +    def run_gen(self, f):
    +        f()
    +        return self.wait()
    +
    +    def delay_callback(self, iterations, callback, arg):
    +        """Runs callback(arg) after a number of IOLoop iterations."""
    +        if iterations == 0:
    +            callback(arg)
    +        else:
    +            self.io_loop.add_callback(functools.partial(
    +                self.delay_callback, iterations - 1, callback, arg))
    +
    +    @return_future
    +    def async_future(self, result, callback):
    +        self.io_loop.add_callback(callback, result)
    +
    +    def test_no_yield(self):
    +        @gen.engine
    +        def f():
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_inline_cb(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback("k1"))()
    +            res = yield gen.Wait("k1")
    +            self.assertTrue(res is None)
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_ioloop_cb(self):
    +        @gen.engine
    +        def f():
    +            self.io_loop.add_callback((yield gen.Callback("k1")))
    +            yield gen.Wait("k1")
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_exception_phase1(self):
    +        @gen.engine
    +        def f():
    +            1 / 0
    +        self.assertRaises(ZeroDivisionError, self.run_gen, f)
    +
    +    def test_exception_phase2(self):
    +        @gen.engine
    +        def f():
    +            self.io_loop.add_callback((yield gen.Callback("k1")))
    +            yield gen.Wait("k1")
    +            1 / 0
    +        self.assertRaises(ZeroDivisionError, self.run_gen, f)
    +
    +    def test_exception_in_task_phase1(self):
    +        def fail_task(callback):
    +            1 / 0
    +
    +        @gen.engine
    +        def f():
    +            try:
    +                yield gen.Task(fail_task)
    +                raise Exception("did not get expected exception")
    +            except ZeroDivisionError:
    +                self.stop()
    +        self.run_gen(f)
    +
    +    def test_exception_in_task_phase2(self):
    +        # This is the case that requires the use of stack_context in gen.engine
    +        def fail_task(callback):
    +            self.io_loop.add_callback(lambda: 1 / 0)
    +
    +        @gen.engine
    +        def f():
    +            try:
    +                yield gen.Task(fail_task)
    +                raise Exception("did not get expected exception")
    +            except ZeroDivisionError:
    +                self.stop()
    +        self.run_gen(f)
    +
    +    def test_with_arg(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback("k1"))(42)
    +            res = yield gen.Wait("k1")
    +            self.assertEqual(42, res)
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_with_arg_tuple(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback((1, 2)))((3, 4))
    +            res = yield gen.Wait((1, 2))
    +            self.assertEqual((3, 4), res)
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_key_reuse(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback("k1")
    +            yield gen.Callback("k1")
    +            self.stop()
    +        self.assertRaises(gen.KeyReuseError, self.run_gen, f)
    +
    +    def test_key_reuse_tuple(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback((1, 2))
    +            yield gen.Callback((1, 2))
    +            self.stop()
    +        self.assertRaises(gen.KeyReuseError, self.run_gen, f)
    +
    +    def test_key_mismatch(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback("k1")
    +            yield gen.Wait("k2")
    +            self.stop()
    +        self.assertRaises(gen.UnknownKeyError, self.run_gen, f)
    +
    +    def test_key_mismatch_tuple(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback((1, 2))
    +            yield gen.Wait((2, 3))
    +            self.stop()
    +        self.assertRaises(gen.UnknownKeyError, self.run_gen, f)
    +
    +    def test_leaked_callback(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback("k1")
    +            self.stop()
    +        self.assertRaises(gen.LeakedCallbackError, self.run_gen, f)
    +
    +    def test_leaked_callback_tuple(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Callback((1, 2))
    +            self.stop()
    +        self.assertRaises(gen.LeakedCallbackError, self.run_gen, f)
    +
    +    def test_parallel_callback(self):
    +        @gen.engine
    +        def f():
    +            for k in range(3):
    +                self.io_loop.add_callback((yield gen.Callback(k)))
    +            yield gen.Wait(1)
    +            self.io_loop.add_callback((yield gen.Callback(3)))
    +            yield gen.Wait(0)
    +            yield gen.Wait(3)
    +            yield gen.Wait(2)
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_bogus_yield(self):
    +        @gen.engine
    +        def f():
    +            yield 42
    +        self.assertRaises(gen.BadYieldError, self.run_gen, f)
    +
    +    def test_bogus_yield_tuple(self):
    +        @gen.engine
    +        def f():
    +            yield (1, 2)
    +        self.assertRaises(gen.BadYieldError, self.run_gen, f)
    +
    +    def test_reuse(self):
    +        @gen.engine
    +        def f():
    +            self.io_loop.add_callback((yield gen.Callback(0)))
    +            yield gen.Wait(0)
    +            self.stop()
    +        self.run_gen(f)
    +        self.run_gen(f)
    +
    +    def test_task(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_wait_all(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback("k1"))("v1")
    +            (yield gen.Callback("k2"))("v2")
    +            results = yield gen.WaitAll(["k1", "k2"])
    +            self.assertEqual(results, ["v1", "v2"])
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_exception_in_yield(self):
    +        @gen.engine
    +        def f():
    +            try:
    +                yield gen.Wait("k1")
    +                raise Exception("did not get expected exception")
    +            except gen.UnknownKeyError:
    +                pass
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_resume_after_exception_in_yield(self):
    +        @gen.engine
    +        def f():
    +            try:
    +                yield gen.Wait("k1")
    +                raise Exception("did not get expected exception")
    +            except gen.UnknownKeyError:
    +                pass
    +            (yield gen.Callback("k2"))("v2")
    +            self.assertEqual((yield gen.Wait("k2")), "v2")
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_orphaned_callback(self):
    +        @gen.engine
    +        def f():
    +            self.orphaned_callback = yield gen.Callback(1)
    +        try:
    +            self.run_gen(f)
    +            raise Exception("did not get expected exception")
    +        except gen.LeakedCallbackError:
    +            pass
    +        self.orphaned_callback()
    +
    +    def test_multi(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback("k1"))("v1")
    +            (yield gen.Callback("k2"))("v2")
    +            results = yield [gen.Wait("k1"), gen.Wait("k2")]
    +            self.assertEqual(results, ["v1", "v2"])
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_multi_delayed(self):
    +        @gen.engine
    +        def f():
    +            # callbacks run at different times
    +            responses = yield [
    +                gen.Task(self.delay_callback, 3, arg="v1"),
    +                gen.Task(self.delay_callback, 1, arg="v2"),
    +            ]
    +            self.assertEqual(responses, ["v1", "v2"])
    +            self.stop()
    +        self.run_gen(f)
    +
    +    @skipOnTravis
    +    @gen_test
    +    def test_multi_performance(self):
    +        # Yielding a list used to have quadratic performance; make
    +        # sure a large list stays reasonable.  On my laptop a list of
    +        # 2000 used to take 1.8s, now it takes 0.12.
    +        start = time.time()
    +        yield [gen.Task(self.io_loop.add_callback) for i in range(2000)]
    +        end = time.time()
    +        self.assertLess(end - start, 1.0)
    +
    +    @gen_test
    +    def test_future(self):
    +        result = yield self.async_future(1)
    +        self.assertEqual(result, 1)
    +
    +    @gen_test
    +    def test_multi_future(self):
    +        results = yield [self.async_future(1), self.async_future(2)]
    +        self.assertEqual(results, [1, 2])
    +
    +    def test_arguments(self):
    +        @gen.engine
    +        def f():
    +            (yield gen.Callback("noargs"))()
    +            self.assertEqual((yield gen.Wait("noargs")), None)
    +            (yield gen.Callback("1arg"))(42)
    +            self.assertEqual((yield gen.Wait("1arg")), 42)
    +
    +            (yield gen.Callback("kwargs"))(value=42)
    +            result = yield gen.Wait("kwargs")
    +            self.assertTrue(isinstance(result, gen.Arguments))
    +            self.assertEqual(((), dict(value=42)), result)
    +            self.assertEqual(dict(value=42), result.kwargs)
    +
    +            (yield gen.Callback("2args"))(42, 43)
    +            result = yield gen.Wait("2args")
    +            self.assertTrue(isinstance(result, gen.Arguments))
    +            self.assertEqual(((42, 43), {}), result)
    +            self.assertEqual((42, 43), result.args)
    +
    +            def task_func(callback):
    +                callback(None, error="foo")
    +            result = yield gen.Task(task_func)
    +            self.assertTrue(isinstance(result, gen.Arguments))
    +            self.assertEqual(((None,), dict(error="foo")), result)
    +
    +            self.stop()
    +        self.run_gen(f)
    +
    +    def test_stack_context_leak(self):
    +        # regression test: repeated invocations of a gen-based
    +        # function should not result in accumulated stack_contexts
    +        def _stack_depth():
    +            head = stack_context._state.contexts[1]
    +            length = 0
    +
    +            while head is not None:
    +                length += 1
    +                head = head.old_contexts[1]
    +
    +            return length
    +
    +        @gen.engine
    +        def inner(callback):
    +            yield gen.Task(self.io_loop.add_callback)
    +            callback()
    +
    +        @gen.engine
    +        def outer():
    +            for i in range(10):
    +                yield gen.Task(inner)
    +
    +            stack_increase = _stack_depth() - initial_stack_depth
    +            self.assertTrue(stack_increase <= 2)
    +            self.stop()
    +        initial_stack_depth = _stack_depth()
    +        self.run_gen(outer)
    +
    +    def test_stack_context_leak_exception(self):
    +        # same as previous, but with a function that exits with an exception
    +        @gen.engine
    +        def inner(callback):
    +            yield gen.Task(self.io_loop.add_callback)
    +            1 / 0
    +
    +        @gen.engine
    +        def outer():
    +            for i in range(10):
    +                try:
    +                    yield gen.Task(inner)
    +                except ZeroDivisionError:
    +                    pass
    +            stack_increase = len(stack_context._state.contexts) - initial_stack_depth
    +            self.assertTrue(stack_increase <= 2)
    +            self.stop()
    +        initial_stack_depth = len(stack_context._state.contexts)
    +        self.run_gen(outer)
    +
    +    def function_with_stack_context(self, callback):
    +        # Technically this function should stack_context.wrap its callback
    +        # upon entry.  However, it is very common for this step to be
    +        # omitted.
    +        def step2():
    +            self.assertEqual(self.named_contexts, ['a'])
    +            self.io_loop.add_callback(callback)
    +
    +        with stack_context.StackContext(self.named_context('a')):
    +            self.io_loop.add_callback(step2)
    +
    +    @gen_test
    +    def test_wait_transfer_stack_context(self):
    +        # Wait should not pick up contexts from where callback was invoked,
    +        # even if that function improperly fails to wrap its callback.
    +        cb = yield gen.Callback('k1')
    +        self.function_with_stack_context(cb)
    +        self.assertEqual(self.named_contexts, [])
    +        yield gen.Wait('k1')
    +        self.assertEqual(self.named_contexts, [])
    +
    +    @gen_test
    +    def test_task_transfer_stack_context(self):
    +        yield gen.Task(self.function_with_stack_context)
    +        self.assertEqual(self.named_contexts, [])
    +
    +    def test_raise_after_stop(self):
    +        # This pattern will be used in the following tests so make sure
    +        # the exception propagates as expected.
    +        @gen.engine
    +        def f():
    +            self.stop()
    +            1 / 0
    +
    +        with self.assertRaises(ZeroDivisionError):
    +            self.run_gen(f)
    +
    +    def test_sync_raise_return(self):
    +        # gen.Return is allowed in @gen.engine, but it may not be used
    +        # to return a value.
    +        @gen.engine
    +        def f():
    +            self.stop(42)
    +            raise gen.Return()
    +
    +        result = self.run_gen(f)
    +        self.assertEqual(result, 42)
    +
    +    def test_async_raise_return(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            self.stop(42)
    +            raise gen.Return()
    +
    +        result = self.run_gen(f)
    +        self.assertEqual(result, 42)
    +
    +    def test_sync_raise_return_value(self):
    +        @gen.engine
    +        def f():
    +            raise gen.Return(42)
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    def test_sync_raise_return_value_tuple(self):
    +        @gen.engine
    +        def f():
    +            raise gen.Return((1, 2))
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    def test_async_raise_return_value(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            raise gen.Return(42)
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    def test_async_raise_return_value_tuple(self):
    +        @gen.engine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            raise gen.Return((1, 2))
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    def test_return_value(self):
    +        # It is an error to apply @gen.engine to a function that returns
    +        # a value.
    +        @gen.engine
    +        def f():
    +            return 42
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    def test_return_value_tuple(self):
    +        # It is an error to apply @gen.engine to a function that returns
    +        # a value.
    +        @gen.engine
    +        def f():
    +            return (1, 2)
    +
    +        with self.assertRaises(gen.ReturnValueIgnoredError):
    +            self.run_gen(f)
    +
    +    @skipNotCPython
    +    def test_task_refcounting(self):
    +        # On CPython, tasks and their arguments should be released immediately
    +        # without waiting for garbage collection.
    +        @gen.engine
    +        def f():
    +            class Foo(object):
    +                pass
    +            arg = Foo()
    +            self.arg_ref = weakref.ref(arg)
    +            task = gen.Task(self.io_loop.add_callback, arg=arg)
    +            self.task_ref = weakref.ref(task)
    +            yield task
    +            self.stop()
    +
    +        self.run_gen(f)
    +        self.assertIs(self.arg_ref(), None)
    +        self.assertIs(self.task_ref(), None)
    +
    +
    +class GenCoroutineTest(AsyncTestCase):
    +    def setUp(self):
    +        # Stray StopIteration exceptions can lead to tests exiting prematurely,
    +        # so we need explicit checks here to make sure the tests run all
    +        # the way through.
    +        self.finished = False
    +        super(GenCoroutineTest, self).setUp()
    +
    +    def tearDown(self):
    +        super(GenCoroutineTest, self).tearDown()
    +        assert self.finished
    +
    +    @gen_test
    +    def test_sync_gen_return(self):
    +        @gen.coroutine
    +        def f():
    +            raise gen.Return(42)
    +        result = yield f()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_async_gen_return(self):
    +        @gen.coroutine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            raise gen.Return(42)
    +        result = yield f()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_sync_return(self):
    +        @gen.coroutine
    +        def f():
    +            return 42
    +        result = yield f()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @skipBefore33
    +    @gen_test
    +    def test_async_return(self):
    +        # It is a compile-time error to return a value in a generator
    +        # before Python 3.3, so we must test this with exec.
    +        # Flatten the real global and local namespace into our fake globals:
    +        # it's all global from the perspective of f().
    +        global_namespace = dict(globals(), **locals())
    +        local_namespace = {}
    +        exec(textwrap.dedent("""
    +        @gen.coroutine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            return 42
    +        """), global_namespace, local_namespace)
    +        result = yield local_namespace['f']()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @skipBefore33
    +    @gen_test
    +    def test_async_early_return(self):
    +        # A yield statement exists but is not executed, which means
    +        # this function "returns" via an exception.  This exception
    +        # doesn't happen before the exception handling is set up.
    +        global_namespace = dict(globals(), **locals())
    +        local_namespace = {}
    +        exec(textwrap.dedent("""
    +        @gen.coroutine
    +        def f():
    +            if True:
    +                return 42
    +            yield gen.Task(self.io_loop.add_callback)
    +        """), global_namespace, local_namespace)
    +        result = yield local_namespace['f']()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_sync_return_no_value(self):
    +        @gen.coroutine
    +        def f():
    +            return
    +        result = yield f()
    +        self.assertEqual(result, None)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_async_return_no_value(self):
    +        # Without a return value we don't need python 3.3.
    +        @gen.coroutine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            return
    +        result = yield f()
    +        self.assertEqual(result, None)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_sync_raise(self):
    +        @gen.coroutine
    +        def f():
    +            1 / 0
    +        # The exception is raised when the future is yielded
    +        # (or equivalently when its result method is called),
    +        # not when the function itself is called).
    +        future = f()
    +        with self.assertRaises(ZeroDivisionError):
    +            yield future
    +        self.finished = True
    +
    +    @gen_test
    +    def test_async_raise(self):
    +        @gen.coroutine
    +        def f():
    +            yield gen.Task(self.io_loop.add_callback)
    +            1 / 0
    +        future = f()
    +        with self.assertRaises(ZeroDivisionError):
    +            yield future
    +        self.finished = True
    +
    +    @gen_test
    +    def test_pass_callback(self):
    +        @gen.coroutine
    +        def f():
    +            raise gen.Return(42)
    +        result = yield gen.Task(f)
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_replace_yieldpoint_exception(self):
    +        # Test exception handling: a coroutine can catch one exception
    +        # raised by a yield point and raise a different one.
    +        @gen.coroutine
    +        def f1():
    +            1 / 0
    +
    +        @gen.coroutine
    +        def f2():
    +            try:
    +                yield f1()
    +            except ZeroDivisionError:
    +                raise KeyError()
    +
    +        future = f2()
    +        with self.assertRaises(KeyError):
    +            yield future
    +        self.finished = True
    +
    +    @gen_test
    +    def test_swallow_yieldpoint_exception(self):
    +        # Test exception handling: a coroutine can catch an exception
    +        # raised by a yield point and not raise a different one.
    +        @gen.coroutine
    +        def f1():
    +            1 / 0
    +
    +        @gen.coroutine
    +        def f2():
    +            try:
    +                yield f1()
    +            except ZeroDivisionError:
    +                raise gen.Return(42)
    +
    +        result = yield f2()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +    @gen_test
    +    def test_replace_context_exception(self):
    +        # Test exception handling: exceptions thrown into the stack context
    +        # can be caught and replaced.
    +        @gen.coroutine
    +        def f2():
    +            self.io_loop.add_callback(lambda: 1 / 0)
    +            try:
    +                yield gen.Task(self.io_loop.add_timeout,
    +                               self.io_loop.time() + 10)
    +            except ZeroDivisionError:
    +                raise KeyError()
    +
    +        future = f2()
    +        with self.assertRaises(KeyError):
    +            yield future
    +        self.finished = True
    +
    +    @gen_test
    +    def test_swallow_context_exception(self):
    +        # Test exception handling: exceptions thrown into the stack context
    +        # can be caught and ignored.
    +        @gen.coroutine
    +        def f2():
    +            self.io_loop.add_callback(lambda: 1 / 0)
    +            try:
    +                yield gen.Task(self.io_loop.add_timeout,
    +                               self.io_loop.time() + 10)
    +            except ZeroDivisionError:
    +                raise gen.Return(42)
    +
    +        result = yield f2()
    +        self.assertEqual(result, 42)
    +        self.finished = True
    +
    +
    +class GenSequenceHandler(RequestHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        self.io_loop = self.request.connection.stream.io_loop
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        self.write("1")
    +        self.io_loop.add_callback((yield gen.Callback("k2")))
    +        yield gen.Wait("k2")
    +        self.write("2")
    +        # reuse an old key
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        self.finish("3")
    +
    +
    +class GenCoroutineSequenceHandler(RequestHandler):
    +    @gen.coroutine
    +    def get(self):
    +        self.io_loop = self.request.connection.stream.io_loop
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        self.write("1")
    +        self.io_loop.add_callback((yield gen.Callback("k2")))
    +        yield gen.Wait("k2")
    +        self.write("2")
    +        # reuse an old key
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        self.finish("3")
    +
    +
    +class GenCoroutineUnfinishedSequenceHandler(RequestHandler):
    +    @asynchronous
    +    @gen.coroutine
    +    def get(self):
    +        self.io_loop = self.request.connection.stream.io_loop
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        self.write("1")
    +        self.io_loop.add_callback((yield gen.Callback("k2")))
    +        yield gen.Wait("k2")
    +        self.write("2")
    +        # reuse an old key
    +        self.io_loop.add_callback((yield gen.Callback("k1")))
    +        yield gen.Wait("k1")
    +        # just write, don't finish
    +        self.write("3")
    +
    +
    +class GenTaskHandler(RequestHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        io_loop = self.request.connection.stream.io_loop
    +        client = AsyncHTTPClient(io_loop=io_loop)
    +        response = yield gen.Task(client.fetch, self.get_argument('url'))
    +        response.rethrow()
    +        self.finish(b"got response: " + response.body)
    +
    +
    +class GenExceptionHandler(RequestHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        # This test depends on the order of the two decorators.
    +        io_loop = self.request.connection.stream.io_loop
    +        yield gen.Task(io_loop.add_callback)
    +        raise Exception("oops")
    +
    +
    +class GenCoroutineExceptionHandler(RequestHandler):
    +    @asynchronous
    +    @gen.coroutine
    +    def get(self):
    +        # This test depends on the order of the two decorators.
    +        io_loop = self.request.connection.stream.io_loop
    +        yield gen.Task(io_loop.add_callback)
    +        raise Exception("oops")
    +
    +
    +class GenYieldExceptionHandler(RequestHandler):
    +    @asynchronous
    +    @gen.engine
    +    def get(self):
    +        io_loop = self.request.connection.stream.io_loop
    +        # Test the interaction of the two stack_contexts.
    +
    +        def fail_task(callback):
    +            io_loop.add_callback(lambda: 1 / 0)
    +        try:
    +            yield gen.Task(fail_task)
    +            raise Exception("did not get expected exception")
    +        except ZeroDivisionError:
    +            self.finish('ok')
    +
    +
    +class UndecoratedCoroutinesHandler(RequestHandler):
    +    @gen.coroutine
    +    def prepare(self):
    +        self.chunks = []
    +        yield gen.Task(IOLoop.current().add_callback)
    +        self.chunks.append('1')
    +
    +    @gen.coroutine
    +    def get(self):
    +        self.chunks.append('2')
    +        yield gen.Task(IOLoop.current().add_callback)
    +        self.chunks.append('3')
    +        yield gen.Task(IOLoop.current().add_callback)
    +        self.write(''.join(self.chunks))
    +
    +
    +class AsyncPrepareErrorHandler(RequestHandler):
    +    @gen.coroutine
    +    def prepare(self):
    +        yield gen.Task(IOLoop.current().add_callback)
    +        raise HTTPError(403)
    +
    +    def get(self):
    +        self.finish('ok')
    +
    +
    +class GenWebTest(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application([
    +            ('/sequence', GenSequenceHandler),
    +            ('/coroutine_sequence', GenCoroutineSequenceHandler),
    +            ('/coroutine_unfinished_sequence',
    +             GenCoroutineUnfinishedSequenceHandler),
    +            ('/task', GenTaskHandler),
    +            ('/exception', GenExceptionHandler),
    +            ('/coroutine_exception', GenCoroutineExceptionHandler),
    +            ('/yield_exception', GenYieldExceptionHandler),
    +            ('/undecorated_coroutine', UndecoratedCoroutinesHandler),
    +            ('/async_prepare_error', AsyncPrepareErrorHandler),
    +        ])
    +
    +    def test_sequence_handler(self):
    +        response = self.fetch('/sequence')
    +        self.assertEqual(response.body, b"123")
    +
    +    def test_coroutine_sequence_handler(self):
    +        response = self.fetch('/coroutine_sequence')
    +        self.assertEqual(response.body, b"123")
    +
    +    def test_coroutine_unfinished_sequence_handler(self):
    +        response = self.fetch('/coroutine_unfinished_sequence')
    +        self.assertEqual(response.body, b"123")
    +
    +    def test_task_handler(self):
    +        response = self.fetch('/task?url=%s' % url_escape(self.get_url('/sequence')))
    +        self.assertEqual(response.body, b"got response: 123")
    +
    +    def test_exception_handler(self):
    +        # Make sure we get an error and not a timeout
    +        with ExpectLog(app_log, "Uncaught exception GET /exception"):
    +            response = self.fetch('/exception')
    +        self.assertEqual(500, response.code)
    +
    +    def test_coroutine_exception_handler(self):
    +        # Make sure we get an error and not a timeout
    +        with ExpectLog(app_log, "Uncaught exception GET /coroutine_exception"):
    +            response = self.fetch('/coroutine_exception')
    +        self.assertEqual(500, response.code)
    +
    +    def test_yield_exception_handler(self):
    +        response = self.fetch('/yield_exception')
    +        self.assertEqual(response.body, b'ok')
    +
    +    def test_undecorated_coroutines(self):
    +        response = self.fetch('/undecorated_coroutine')
    +        self.assertEqual(response.body, b'123')
    +
    +    def test_async_prepare_error_handler(self):
    +        response = self.fetch('/async_prepare_error')
    +        self.assertEqual(response.code, 403)
    +
    +if __name__ == '__main__':
    +    unittest.main()
    diff --git a/lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo b/lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo
    new file mode 100644
    index 0000000000000000000000000000000000000000..089f6c7ab79294f4441121c15ebaa10c3cea02f3
    GIT binary patch
    [stripped]
    diff --git a/lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po b/lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po
    @@ -0,0 +1,22 @@
    +# SOME DESCRIPTIVE TITLE.
    +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    +# This file is distributed under the same license as the PACKAGE package.
    +# FIRST AUTHOR , YEAR.
    +#
    +#, fuzzy
    +msgid ""
    +msgstr ""
    +"Project-Id-Version: PACKAGE VERSION\n"
    +"Report-Msgid-Bugs-To: \n"
    +"POT-Creation-Date: 2012-06-14 01:10-0700\n"
    +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    +"Last-Translator: FULL NAME \n"
    +"Language-Team: LANGUAGE \n"
    +"Language: \n"
    +"MIME-Version: 1.0\n"
    +"Content-Type: text/plain; charset=utf-8\n"
    +"Content-Transfer-Encoding: 8bit\n"
    +
    +#: extract_me.py:1
    +msgid "school"
    +msgstr "?cole"
    diff --git a/lib/tornado-3.1.1/tornado/test/httpclient_test.py b/lib/tornado-3.1.1/tornado/test/httpclient_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/httpclient_test.py
    @@ -0,0 +1,471 @@
    +#!/usr/bin/env python
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +
    +import base64
    +import binascii
    +from contextlib import closing
    +import functools
    +import sys
    +import threading
    +
    +from tornado.escape import utf8
    +from tornado.httpclient import HTTPRequest, HTTPResponse, _RequestProxy, HTTPError, HTTPClient
    +from tornado.httpserver import HTTPServer
    +from tornado.ioloop import IOLoop
    +from tornado.iostream import IOStream
    +from tornado.log import gen_log
    +from tornado import netutil
    +from tornado.stack_context import ExceptionStackContext, NullContext
    +from tornado.testing import AsyncHTTPTestCase, bind_unused_port, gen_test, ExpectLog
    +from tornado.test.util import unittest
    +from tornado.util import u, bytes_type
    +from tornado.web import Application, RequestHandler, url
    +
    +try:
    +    from io import BytesIO  # python 3
    +except ImportError:
    +    from cStringIO import StringIO as BytesIO
    +
    +
    +class HelloWorldHandler(RequestHandler):
    +    def get(self):
    +        name = self.get_argument("name", "world")
    +        self.set_header("Content-Type", "text/plain")
    +        self.finish("Hello %s!" % name)
    +
    +
    +class PostHandler(RequestHandler):
    +    def post(self):
    +        self.finish("Post arg1: %s, arg2: %s" % (
    +            self.get_argument("arg1"), self.get_argument("arg2")))
    +
    +
    +class ChunkHandler(RequestHandler):
    +    def get(self):
    +        self.write("asdf")
    +        self.flush()
    +        self.write("qwer")
    +
    +
    +class AuthHandler(RequestHandler):
    +    def get(self):
    +        self.finish(self.request.headers["Authorization"])
    +
    +
    +class CountdownHandler(RequestHandler):
    +    def get(self, count):
    +        count = int(count)
    +        if count > 0:
    +            self.redirect(self.reverse_url("countdown", count - 1))
    +        else:
    +            self.write("Zero")
    +
    +
    +class EchoPostHandler(RequestHandler):
    +    def post(self):
    +        self.write(self.request.body)
    +
    +
    +class UserAgentHandler(RequestHandler):
    +    def get(self):
    +        self.write(self.request.headers.get('User-Agent', 'User agent not set'))
    +
    +
    +class ContentLength304Handler(RequestHandler):
    +    def get(self):
    +        self.set_status(304)
    +        self.set_header('Content-Length', 42)
    +
    +    def _clear_headers_for_304(self):
    +        # Tornado strips content-length from 304 responses, but here we
    +        # want to simulate servers that include the headers anyway.
    +        pass
    +
    +
    +class AllMethodsHandler(RequestHandler):
    +    SUPPORTED_METHODS = RequestHandler.SUPPORTED_METHODS + ('OTHER',)
    +
    +    def method(self):
    +        self.write(self.request.method)
    +
    +    get = post = put = delete = options = patch = other = method
    +
    +# These tests end up getting run redundantly: once here with the default
    +# HTTPClient implementation, and then again in each implementation's own
    +# test suite.
    +
    +
    +class HTTPClientCommonTestCase(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application([
    +            url("/hello", HelloWorldHandler),
    +            url("/post", PostHandler),
    +            url("/chunk", ChunkHandler),
    +            url("/auth", AuthHandler),
    +            url("/countdown/([0-9]+)", CountdownHandler, name="countdown"),
    +            url("/echopost", EchoPostHandler),
    +            url("/user_agent", UserAgentHandler),
    +            url("/304_with_content_length", ContentLength304Handler),
    +            url("/all_methods", AllMethodsHandler),
    +        ], gzip=True)
    +
    +    def test_hello_world(self):
    +        response = self.fetch("/hello")
    +        self.assertEqual(response.code, 200)
    +        self.assertEqual(response.headers["Content-Type"], "text/plain")
    +        self.assertEqual(response.body, b"Hello world!")
    +        self.assertEqual(int(response.request_time), 0)
    +
    +        response = self.fetch("/hello?name=Ben")
    +        self.assertEqual(response.body, b"Hello Ben!")
    +
    +    def test_streaming_callback(self):
    +        # streaming_callback is also tested in test_chunked
    +        chunks = []
    +        response = self.fetch("/hello",
    +                              streaming_callback=chunks.append)
    +        # with streaming_callback, data goes to the callback and not response.body
    +        self.assertEqual(chunks, [b"Hello world!"])
    +        self.assertFalse(response.body)
    +
    +    def test_post(self):
    +        response = self.fetch("/post", method="POST",
    +                              body="arg1=foo&arg2=bar")
    +        self.assertEqual(response.code, 200)
    +        self.assertEqual(response.body, b"Post arg1: foo, arg2: bar")
    +
    +    def test_chunked(self):
    +        response = self.fetch("/chunk")
    +        self.assertEqual(response.body, b"asdfqwer")
    +
    +        chunks = []
    +        response = self.fetch("/chunk",
    +                              streaming_callback=chunks.append)
    +        self.assertEqual(chunks, [b"asdf", b"qwer"])
    +        self.assertFalse(response.body)
    +
    +    def test_chunked_close(self):
    +        # test case in which chunks spread read-callback processing
    +        # over several ioloop iterations, but the connection is already closed.
    +        sock, port = bind_unused_port()
    +        with closing(sock):
    +            def write_response(stream, request_data):
    +                stream.write(b"""\
    +HTTP/1.1 200 OK
    +Transfer-Encoding: chunked
    +
    +1
    +1
    +1
    +2
    +0
    +
    +""".replace(b"\n", b"\r\n"), callback=stream.close)
    +
    +            def accept_callback(conn, address):
    +                # fake an HTTP server using chunked encoding where the final chunks
    +                # and connection close all happen at once
    +                stream = IOStream(conn, io_loop=self.io_loop)
    +                stream.read_until(b"\r\n\r\n",
    +                                  functools.partial(write_response, stream))
    +            netutil.add_accept_handler(sock, accept_callback, self.io_loop)
    +            self.http_client.fetch("http://127.0.0.1:%d/" % port, self.stop)
    +            resp = self.wait()
    +            resp.rethrow()
    +            self.assertEqual(resp.body, b"12")
    +            self.io_loop.remove_handler(sock.fileno())
    +
    +    def test_streaming_stack_context(self):
    +        chunks = []
    +        exc_info = []
    +
    +        def error_handler(typ, value, tb):
    +            exc_info.append((typ, value, tb))
    +            return True
    +
    +        def streaming_cb(chunk):
    +            chunks.append(chunk)
    +            if chunk == b'qwer':
    +                1 / 0
    +
    +        with ExceptionStackContext(error_handler):
    +            self.fetch('/chunk', streaming_callback=streaming_cb)
    +
    +        self.assertEqual(chunks, [b'asdf', b'qwer'])
    +        self.assertEqual(1, len(exc_info))
    +        self.assertIs(exc_info[0][0], ZeroDivisionError)
    +
    +    def test_basic_auth(self):
    +        self.assertEqual(self.fetch("/auth", auth_username="Aladdin",
    +                                    auth_password="open sesame").body,
    +                         b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==")
    +
    +    def test_basic_auth_explicit_mode(self):
    +        self.assertEqual(self.fetch("/auth", auth_username="Aladdin",
    +                                    auth_password="open sesame",
    +                                    auth_mode="basic").body,
    +                         b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==")
    +
    +    def test_unsupported_auth_mode(self):
    +        # curl and simple clients handle errors a bit differently; the
    +        # important thing is that they don't fall back to basic auth
    +        # on an unknown mode.
    +        with ExpectLog(gen_log, "uncaught exception", required=False):
    +            with self.assertRaises((ValueError, HTTPError)):
    +                response = self.fetch("/auth", auth_username="Aladdin",
    +                                      auth_password="open sesame",
    +                                      auth_mode="asdf")
    +                response.rethrow()
    +
    +    def test_follow_redirect(self):
    +        response = self.fetch("/countdown/2", follow_redirects=False)
    +        self.assertEqual(302, response.code)
    +        self.assertTrue(response.headers["Location"].endswith("/countdown/1"))
    +
    +        response = self.fetch("/countdown/2")
    +        self.assertEqual(200, response.code)
    +        self.assertTrue(response.effective_url.endswith("/countdown/0"))
    +        self.assertEqual(b"Zero", response.body)
    +
    +    def test_credentials_in_url(self):
    +        url = self.get_url("/auth").replace("http://", "http://me:secret@")
    +        self.http_client.fetch(url, self.stop)
    +        response = self.wait()
    +        self.assertEqual(b"Basic " + base64.b64encode(b"me:secret"),
    +                         response.body)
    +
    +    def test_body_encoding(self):
    +        unicode_body = u("\xe9")
    +        byte_body = binascii.a2b_hex(b"e9")
    +
    +        # unicode string in body gets converted to utf8
    +        response = self.fetch("/echopost", method="POST", body=unicode_body,
    +                              headers={"Content-Type": "application/blah"})
    +        self.assertEqual(response.headers["Content-Length"], "2")
    +        self.assertEqual(response.body, utf8(unicode_body))
    +
    +        # byte strings pass through directly
    +        response = self.fetch("/echopost", method="POST",
    +                              body=byte_body,
    +                              headers={"Content-Type": "application/blah"})
    +        self.assertEqual(response.headers["Content-Length"], "1")
    +        self.assertEqual(response.body, byte_body)
    +
    +        # Mixing unicode in headers and byte string bodies shouldn't
    +        # break anything
    +        response = self.fetch("/echopost", method="POST", body=byte_body,
    +                              headers={"Content-Type": "application/blah"},
    +                              user_agent=u("foo"))
    +        self.assertEqual(response.headers["Content-Length"], "1")
    +        self.assertEqual(response.body, byte_body)
    +
    +    def test_types(self):
    +        response = self.fetch("/hello")
    +        self.assertEqual(type(response.body), bytes_type)
    +        self.assertEqual(type(response.headers["Content-Type"]), str)
    +        self.assertEqual(type(response.code), int)
    +        self.assertEqual(type(response.effective_url), str)
    +
    +    def test_header_callback(self):
    +        first_line = []
    +        headers = {}
    +        chunks = []
    +
    +        def header_callback(header_line):
    +            if header_line.startswith('HTTP/'):
    +                first_line.append(header_line)
    +            elif header_line != '\r\n':
    +                k, v = header_line.split(':', 1)
    +                headers[k] = v.strip()
    +
    +        def streaming_callback(chunk):
    +            # All header callbacks are run before any streaming callbacks,
    +            # so the header data is available to process the data as it
    +            # comes in.
    +            self.assertEqual(headers['Content-Type'], 'text/html; charset=UTF-8')
    +            chunks.append(chunk)
    +
    +        self.fetch('/chunk', header_callback=header_callback,
    +                   streaming_callback=streaming_callback)
    +        self.assertEqual(len(first_line), 1)
    +        self.assertRegexpMatches(first_line[0], 'HTTP/1.[01] 200 OK\r\n')
    +        self.assertEqual(chunks, [b'asdf', b'qwer'])
    +
    +    def test_header_callback_stack_context(self):
    +        exc_info = []
    +
    +        def error_handler(typ, value, tb):
    +            exc_info.append((typ, value, tb))
    +            return True
    +
    +        def header_callback(header_line):
    +            if header_line.startswith('Content-Type:'):
    +                1 / 0
    +
    +        with ExceptionStackContext(error_handler):
    +            self.fetch('/chunk', header_callback=header_callback)
    +        self.assertEqual(len(exc_info), 1)
    +        self.assertIs(exc_info[0][0], ZeroDivisionError)
    +
    +    def test_configure_defaults(self):
    +        defaults = dict(user_agent='TestDefaultUserAgent')
    +        # Construct a new instance of the configured client class
    +        client = self.http_client.__class__(self.io_loop, force_instance=True,
    +                                            defaults=defaults)
    +        client.fetch(self.get_url('/user_agent'), callback=self.stop)
    +        response = self.wait()
    +        self.assertEqual(response.body, b'TestDefaultUserAgent')
    +        client.close()
    +
    +    def test_304_with_content_length(self):
    +        # According to the spec 304 responses SHOULD NOT include
    +        # Content-Length or other entity headers, but some servers do it
    +        # anyway.
    +        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
    +        response = self.fetch('/304_with_content_length')
    +        self.assertEqual(response.code, 304)
    +        self.assertEqual(response.headers['Content-Length'], '42')
    +
    +    def test_final_callback_stack_context(self):
    +        # The final callback should be run outside of the httpclient's
    +        # stack_context.  We want to ensure that there is not stack_context
    +        # between the user's callback and the IOLoop, so monkey-patch
    +        # IOLoop.handle_callback_exception and disable the test harness's
    +        # context with a NullContext.
    +        # Note that this does not apply to secondary callbacks (header
    +        # and streaming_callback), as errors there must be seen as errors
    +        # by the http client so it can clean up the connection.
    +        exc_info = []
    +
    +        def handle_callback_exception(callback):
    +            exc_info.append(sys.exc_info())
    +            self.stop()
    +        self.io_loop.handle_callback_exception = handle_callback_exception
    +        with NullContext():
    +            self.http_client.fetch(self.get_url('/hello'),
    +                                   lambda response: 1 / 0)
    +        self.wait()
    +        self.assertEqual(exc_info[0][0], ZeroDivisionError)
    +
    +    @gen_test
    +    def test_future_interface(self):
    +        response = yield self.http_client.fetch(self.get_url('/hello'))
    +        self.assertEqual(response.body, b'Hello world!')
    +
    +    @gen_test
    +    def test_future_http_error(self):
    +        try:
    +            yield self.http_client.fetch(self.get_url('/notfound'))
    +        except HTTPError as e:
    +            self.assertEqual(e.code, 404)
    +            self.assertEqual(e.response.code, 404)
    +
    +    @gen_test
    +    def test_reuse_request_from_response(self):
    +        # The response.request attribute should be an HTTPRequest, not
    +        # a _RequestProxy.
    +        # This test uses self.http_client.fetch because self.fetch calls
    +        # self.get_url on the input unconditionally.
    +        url = self.get_url('/hello')
    +        response = yield self.http_client.fetch(url)
    +        self.assertEqual(response.request.url, url)
    +        self.assertTrue(isinstance(response.request, HTTPRequest))
    +        response2 = yield self.http_client.fetch(response.request)
    +        self.assertEqual(response2.body, b'Hello world!')
    +
    +    def test_all_methods(self):
    +        for method in ['GET', 'DELETE', 'OPTIONS']:
    +            response = self.fetch('/all_methods', method=method)
    +            self.assertEqual(response.body, utf8(method))
    +        for method in ['POST', 'PUT', 'PATCH']:
    +            response = self.fetch('/all_methods', method=method, body=b'')
    +            self.assertEqual(response.body, utf8(method))
    +        response = self.fetch('/all_methods', method='HEAD')
    +        self.assertEqual(response.body, b'')
    +        response = self.fetch('/all_methods', method='OTHER',
    +                              allow_nonstandard_methods=True)
    +        self.assertEqual(response.body, b'OTHER')
    +
    +
    +class RequestProxyTest(unittest.TestCase):
    +    def test_request_set(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/',
    +                                          user_agent='foo'),
    +                              dict())
    +        self.assertEqual(proxy.user_agent, 'foo')
    +
    +    def test_default_set(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/'),
    +                              dict(network_interface='foo'))
    +        self.assertEqual(proxy.network_interface, 'foo')
    +
    +    def test_both_set(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/',
    +                                          proxy_host='foo'),
    +                              dict(proxy_host='bar'))
    +        self.assertEqual(proxy.proxy_host, 'foo')
    +
    +    def test_neither_set(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/'),
    +                              dict())
    +        self.assertIs(proxy.auth_username, None)
    +
    +    def test_bad_attribute(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/'),
    +                              dict())
    +        with self.assertRaises(AttributeError):
    +            proxy.foo
    +
    +    def test_defaults_none(self):
    +        proxy = _RequestProxy(HTTPRequest('http://example.com/'), None)
    +        self.assertIs(proxy.auth_username, None)
    +
    +
    +class HTTPResponseTestCase(unittest.TestCase):
    +    def test_str(self):
    +        response = HTTPResponse(HTTPRequest('http://example.com'),
    +                                200, headers={}, buffer=BytesIO())
    +        s = str(response)
    +        self.assertTrue(s.startswith('HTTPResponse('))
    +        self.assertIn('code=200', s)
    +
    +
    +class SyncHTTPClientTest(unittest.TestCase):
    +    def setUp(self):
    +        if IOLoop.configured_class().__name__ == 'TwistedIOLoop':
    +            # TwistedIOLoop only supports the global reactor, so we can't have
    +            # separate IOLoops for client and server threads.
    +            raise unittest.SkipTest(
    +                'Sync HTTPClient not compatible with TwistedIOLoop')
    +        self.server_ioloop = IOLoop()
    +
    +        sock, self.port = bind_unused_port()
    +        app = Application([('/', HelloWorldHandler)])
    +        server = HTTPServer(app, io_loop=self.server_ioloop)
    +        server.add_socket(sock)
    +
    +        self.server_thread = threading.Thread(target=self.server_ioloop.start)
    +        self.server_thread.start()
    +
    +        self.http_client = HTTPClient()
    +
    +    def tearDown(self):
    +        self.server_ioloop.add_callback(self.server_ioloop.stop)
    +        self.server_thread.join()
    +        self.http_client.close()
    +        self.server_ioloop.close(all_fds=True)
    +
    +    def get_url(self, path):
    +        return 'http://localhost:%d%s' % (self.port, path)
    +
    +    def test_sync_client(self):
    +        response = self.http_client.fetch(self.get_url('/'))
    +        self.assertEqual(b'Hello world!', response.body)
    +
    +    def test_sync_client_error(self):
    +        # Synchronous HTTPClient raises errors directly; no need for
    +        # response.rethrow()
    +        with self.assertRaises(HTTPError) as assertion:
    +            self.http_client.fetch(self.get_url('/notfound'))
    +        self.assertEqual(assertion.exception.code, 404)
    diff --git a/lib/tornado-3.1.1/tornado/test/httpserver_test.py b/lib/tornado-3.1.1/tornado/test/httpserver_test.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/test/httpserver_test.py
    @@ -0,0 +1,661 @@
    +#!/usr/bin/env python
    +
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +from tornado import httpclient, simple_httpclient, netutil
    +from tornado.escape import json_decode, utf8, _unicode, recursive_unicode, native_str
    +from tornado.httpserver import HTTPServer
    +from tornado.httputil import HTTPHeaders
    +from tornado.iostream import IOStream
    +from tornado.log import gen_log
    +from tornado.netutil import ssl_options_to_context, Resolver
    +from tornado.simple_httpclient import SimpleAsyncHTTPClient
    +from tornado.testing import AsyncHTTPTestCase, AsyncHTTPSTestCase, AsyncTestCase, ExpectLog
    +from tornado.test.util import unittest
    +from tornado.util import u, bytes_type
    +from tornado.web import Application, RequestHandler, asynchronous
    +from contextlib import closing
    +import datetime
    +import os
    +import shutil
    +import socket
    +import ssl
    +import sys
    +import tempfile
    +
    +
    +class HandlerBaseTestCase(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application([('/', self.__class__.Handler)])
    +
    +    def fetch_json(self, *args, **kwargs):
    +        response = self.fetch(*args, **kwargs)
    +        response.rethrow()
    +        return json_decode(response.body)
    +
    +
    +class HelloWorldRequestHandler(RequestHandler):
    +    def initialize(self, protocol="http"):
    +        self.expected_protocol = protocol
    +
    +    def get(self):
    +        if self.request.protocol != self.expected_protocol:
    +            raise Exception("unexpected protocol")
    +        self.finish("Hello world")
    +
    +    def post(self):
    +        self.finish("Got %d bytes in POST" % len(self.request.body))
    +
    +
    +# In pre-1.0 versions of openssl, SSLv23 clients always send SSLv2
    +# ClientHello messages, which are rejected by SSLv3 and TLSv1
    +# servers.  Note that while the OPENSSL_VERSION_INFO was formally
    +# introduced in python3.2, it was present but undocumented in
    +# python 2.7
    +skipIfOldSSL = unittest.skipIf(
    +    getattr(ssl, 'OPENSSL_VERSION_INFO', (0, 0)) < (1, 0),
    +    "old version of ssl module and/or openssl")
    +
    +
    +class BaseSSLTest(AsyncHTTPSTestCase):
    +    def get_app(self):
    +        return Application([('/', HelloWorldRequestHandler,
    +                             dict(protocol="https"))])
    +
    +
    +class SSLTestMixin(object):
    +    def get_ssl_options(self):
    +        return dict(ssl_version=self.get_ssl_version(),
    +                    **AsyncHTTPSTestCase.get_ssl_options())
    +
    +    def get_ssl_version(self):
    +        raise NotImplementedError()
    +
    +    def test_ssl(self):
    +        response = self.fetch('/')
    +        self.assertEqual(response.body, b"Hello world")
    +
    +    def test_large_post(self):
    +        response = self.fetch('/',
    +                              method='POST',
    +                              body='A' * 5000)
    +        self.assertEqual(response.body, b"Got 5000 bytes in POST")
    +
    +    def test_non_ssl_request(self):
    +        # Make sure the server closes the connection when it gets a non-ssl
    +        # connection, rather than waiting for a timeout or otherwise
    +        # misbehaving.
    +        with ExpectLog(gen_log, '(SSL Error|uncaught exception)'):
    +            self.http_client.fetch(self.get_url("/").replace('https:', 'http:'),
    +                                   self.stop,
    +                                   request_timeout=3600,
    +                                   connect_timeout=3600)
    +            response = self.wait()
    +        self.assertEqual(response.code, 599)
    +
    +# Python's SSL implementation differs significantly between versions.
    +# For example, SSLv3 and TLSv1 throw an exception if you try to read
    +# from the socket before the handshake is complete, but the default
    +# of SSLv23 allows it.
    +
    +
    +class SSLv23Test(BaseSSLTest, SSLTestMixin):
    +    def get_ssl_version(self):
    +        return ssl.PROTOCOL_SSLv23
    +
    +
    + at skipIfOldSSL
    +class SSLv3Test(BaseSSLTest, SSLTestMixin):
    +    def get_ssl_version(self):
    +        return ssl.PROTOCOL_SSLv3
    +
    +
    + at skipIfOldSSL
    +class TLSv1Test(BaseSSLTest, SSLTestMixin):
    +    def get_ssl_version(self):
    +        return ssl.PROTOCOL_TLSv1
    +
    +
    + at unittest.skipIf(not hasattr(ssl, 'SSLContext'), 'ssl.SSLContext not present')
    +class SSLContextTest(BaseSSLTest, SSLTestMixin):
    +    def get_ssl_options(self):
    +        context = ssl_options_to_context(
    +            AsyncHTTPSTestCase.get_ssl_options(self))
    +        assert isinstance(context, ssl.SSLContext)
    +        return context
    +
    +
    +class BadSSLOptionsTest(unittest.TestCase):
    +    def test_missing_arguments(self):
    +        application = Application()
    +        self.assertRaises(KeyError, HTTPServer, application, ssl_options={
    +            "keyfile": "/__missing__.crt",
    +        })
    +
    +    def test_missing_key(self):
    +        """A missing SSL key should cause an immediate exception."""
    +
    +        application = Application()
    +        module_dir = os.path.dirname(__file__)
    +        existing_certificate = os.path.join(module_dir, 'test.crt')
    +
    +        self.assertRaises(ValueError, HTTPServer, application, ssl_options={
    +                          "certfile": "/__mising__.crt",
    +                          })
    +        self.assertRaises(ValueError, HTTPServer, application, ssl_options={
    +                          "certfile": existing_certificate,
    +                          "keyfile": "/__missing__.key"
    +                          })
    +
    +        # This actually works because both files exist
    +        HTTPServer(application, ssl_options={
    +                   "certfile": existing_certificate,
    +                   "keyfile": existing_certificate
    +                   })
    +
    +
    +class MultipartTestHandler(RequestHandler):
    +    def post(self):
    +        self.finish({"header": self.request.headers["X-Header-Encoding-Test"],
    +                     "argument": self.get_argument("argument"),
    +                     "filename": self.request.files["files"][0].filename,
    +                     "filebody": _unicode(self.request.files["files"][0]["body"]),
    +                     })
    +
    +
    +class RawRequestHTTPConnection(simple_httpclient._HTTPConnection):
    +    def set_request(self, request):
    +        self.__next_request = request
    +
    +    def _on_connect(self):
    +        self.stream.write(self.__next_request)
    +        self.__next_request = None
    +        self.stream.read_until(b"\r\n\r\n", self._on_headers)
    +
    +# This test is also called from wsgi_test
    +
    +
    +class HTTPConnectionTest(AsyncHTTPTestCase):
    +    def get_handlers(self):
    +        return [("/multipart", MultipartTestHandler),
    +                ("/hello", HelloWorldRequestHandler)]
    +
    +    def get_app(self):
    +        return Application(self.get_handlers())
    +
    +    def raw_fetch(self, headers, body):
    +        with closing(Resolver(io_loop=self.io_loop)) as resolver:
    +            with closing(SimpleAsyncHTTPClient(self.io_loop,
    +                                               resolver=resolver)) as client:
    +                conn = RawRequestHTTPConnection(
    +                    self.io_loop, client,
    +                    httpclient._RequestProxy(
    +                        httpclient.HTTPRequest(self.get_url("/")),
    +                        dict(httpclient.HTTPRequest._DEFAULTS)),
    +                    None, self.stop,
    +                    1024 * 1024, resolver)
    +                conn.set_request(
    +                    b"\r\n".join(headers +
    +                                 [utf8("Content-Length: %d\r\n" % len(body))]) +
    +                    b"\r\n" + body)
    +                response = self.wait()
    +                response.rethrow()
    +                return response
    +
    +    def test_multipart_form(self):
    +        # Encodings here are tricky:  Headers are latin1, bodies can be
    +        # anything (we use utf8 by default).
    +        response = self.raw_fetch([
    +            b"POST /multipart HTTP/1.0",
    +            b"Content-Type: multipart/form-data; boundary=1234567890",
    +            b"X-Header-encoding-test: \xe9",
    +        ],
    +            b"\r\n".join([
    +            b"Content-Disposition: form-data; name=argument",
    +            b"",
    +            u("\u00e1").encode("utf-8"),
    +            b"--1234567890",
    +            u('Content-Disposition: form-data; name="files"; filename="\u00f3"').encode("utf8"),
    +            b"",
    +            u("\u00fa").encode("utf-8"),
    +            b"--1234567890--",
    +            b"",
    +            ]))
    +        data = json_decode(response.body)
    +        self.assertEqual(u("\u00e9"), data["header"])
    +        self.assertEqual(u("\u00e1"), data["argument"])
    +        self.assertEqual(u("\u00f3"), data["filename"])
    +        self.assertEqual(u("\u00fa"), data["filebody"])
    +
    +    def test_100_continue(self):
    +        # Run through a 100-continue interaction by hand:
    +        # When given Expect: 100-continue, we get a 100 response after the
    +        # headers, and then the real response after the body.
    +        stream = IOStream(socket.socket(), io_loop=self.io_loop)
    +        stream.connect(("localhost", self.get_http_port()), callback=self.stop)
    +        self.wait()
    +        stream.write(b"\r\n".join([b"POST /hello HTTP/1.1",
    +                                   b"Content-Length: 1024",
    +                                   b"Expect: 100-continue",
    +                                   b"Connection: close",
    +                                   b"\r\n"]), callback=self.stop)
    +        self.wait()
    +        stream.read_until(b"\r\n\r\n", self.stop)
    +        data = self.wait()
    +        self.assertTrue(data.startswith(b"HTTP/1.1 100 "), data)
    +        stream.write(b"a" * 1024)
    +        stream.read_until(b"\r\n", self.stop)
    +        first_line = self.wait()
    +        self.assertTrue(first_line.startswith(b"HTTP/1.1 200"), first_line)
    +        stream.read_until(b"\r\n\r\n", self.stop)
    +        header_data = self.wait()
    +        headers = HTTPHeaders.parse(native_str(header_data.decode('latin1')))
    +        stream.read_bytes(int(headers["Content-Length"]), self.stop)
    +        body = self.wait()
    +        self.assertEqual(body, b"Got 1024 bytes in POST")
    +        stream.close()
    +
    +
    +class EchoHandler(RequestHandler):
    +    def get(self):
    +        self.write(recursive_unicode(self.request.arguments))
    +
    +    def post(self):
    +        self.write(recursive_unicode(self.request.arguments))
    +
    +
    +class TypeCheckHandler(RequestHandler):
    +    def prepare(self):
    +        self.errors = {}
    +        fields = [
    +            ('method', str),
    +            ('uri', str),
    +            ('version', str),
    +            ('remote_ip', str),
    +            ('protocol', str),
    +            ('host', str),
    +            ('path', str),
    +            ('query', str),
    +        ]
    +        for field, expected_type in fields:
    +            self.check_type(field, getattr(self.request, field), expected_type)
    +
    +        self.check_type('header_key', list(self.request.headers.keys())[0], str)
    +        self.check_type('header_value', list(self.request.headers.values())[0], str)
    +
    +        self.check_type('cookie_key', list(self.request.cookies.keys())[0], str)
    +        self.check_type('cookie_value', list(self.request.cookies.values())[0].value, str)
    +        # secure cookies
    +
    +        self.check_type('arg_key', list(self.request.arguments.keys())[0], str)
    +        self.check_type('arg_value', list(self.request.arguments.values())[0][0], bytes_type)
    +
    +    def post(self):
    +        self.check_type('body', self.request.body, bytes_type)
    +        self.write(self.errors)
    +
    +    def get(self):
    +        self.write(self.errors)
    +
    +    def check_type(self, name, obj, expected_type):
    +        actual_type = type(obj)
    +        if expected_type != actual_type:
    +            self.errors[name] = "expected %s, got %s" % (expected_type,
    +                                                         actual_type)
    +
    +
    +class HTTPServerTest(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application([("/echo", EchoHandler),
    +                            ("/typecheck", TypeCheckHandler),
    +                            ("//doubleslash", EchoHandler),
    +                            ])
    +
    +    def test_query_string_encoding(self):
    +        response = self.fetch("/echo?foo=%C3%A9")
    +        data = json_decode(response.body)
    +        self.assertEqual(data, {u("foo"): [u("\u00e9")]})
    +
    +    def test_empty_query_string(self):
    +        response = self.fetch("/echo?foo=&foo=")
    +        data = json_decode(response.body)
    +        self.assertEqual(data, {u("foo"): [u(""), u("")]})
    +
    +    def test_empty_post_parameters(self):
    +        response = self.fetch("/echo", method="POST", body="foo=&bar=")
    +        data = json_decode(response.body)
    +        self.assertEqual(data, {u("foo"): [u("")], u("bar"): [u("")]})
    +
    +    def test_types(self):
    +        headers = {"Cookie": "foo=bar"}
    +        response = self.fetch("/typecheck?foo=bar", headers=headers)
    +        data = json_decode(response.body)
    +        self.assertEqual(data, {})
    +
    +        response = self.fetch("/typecheck", method="POST", body="foo=bar", headers=headers)
    +        data = json_decode(response.body)
    +        self.assertEqual(data, {})
    +
    +    def test_double_slash(self):
    +        # urlparse.urlsplit (which tornado.httpserver used to use
    +        # incorrectly) would parse paths beginning with "//" as
    +        # protocol-relative urls.
    +        response = self.fetch("//doubleslash")
    +        self.assertEqual(200, response.code)
    +        self.assertEqual(json_decode(response.body), {})
    +
    +
    +class HTTPServerRawTest(AsyncHTTPTestCase):
    +    def get_app(self):
    +        return Application([
    +            ('/echo', EchoHandler),
    +        ])
    +
    +    def setUp(self):
    +        super(HTTPServerRawTest, self).setUp()
    +        self.stream = IOStream(socket.socket())
    +        self.stream.connect(('localhost', self.get_http_port()), self.stop)
    +        self.wait()
    +
    +    def tearDown(self):
    +        self.stream.close()
    +        super(HTTPServerRawTest, self).tearDown()
    +
    +    def test_empty_request(self):
    +        self.stream.close()
    +        self.io_loop.add_timeout(datetime.timedelta(seconds=0.001), self.stop)
    +        self.wait()
    +
    +    def test_malformed_first_line(self):
    +        with ExpectLog(gen_log, '.*Malformed HTTP request line'):
    +            self.stream.write(b'asdf\r\n\r\n')
    +            # TODO: need an async version of ExpectLog so we don't need
    +            # hard-coded timeouts here.
    +            self.io_loop.add_timeout(datetime.timedelta(seconds=0.01),
    +                                     self.stop)
    +            self.wait()
    +
    +    def test_malformed_headers(self):
    +        with ExpectLog(gen_log, '.*Malformed HTTP headers'):
    +            self.stream.write(b'GET / HTTP/1.0\r\nasdf\r\n\r\n')
    +            self.io_loop.add_timeout(datetime.timedelta(seconds=0.01),
    +                                     self.stop)
    +            self.wait()
    +
    +
    +class XHeaderTest(HandlerBaseTestCase):
    +    class Handler(RequestHandler):
    +        def get(self):
    +            self.write(dict(remote_ip=self.request.remote_ip,
    +                            remote_protocol=self.request.protocol))
    +
    +    def get_httpserver_options(self):
    +        return dict(xheaders=True)
    +
    +    def test_ip_headers(self):
    +        self.assertEqual(self.fetch_json("/")["remote_ip"], "127.0.0.1")
    +
    +        valid_ipv4 = {"X-Real-IP": "4.4.4.4"}
    +        self.assertEqual(
    +            self.fetch_json("/", headers=valid_ipv4)["remote_ip"],
    +            "4.4.4.4")
    +
    +        valid_ipv4_list = {"X-Forwarded-For": "127.0.0.1, 4.4.4.4"}
    +        self.assertEqual(
    +            self.fetch_json("/", headers=valid_ipv4_list)["remote_ip"],
    +            "4.4.4.4")
    +
    +        valid_ipv6 = {"X-Real-IP": "2620:0:1cfe:face:b00c::3"}
    +        self.assertEqual(
    +            self.fetch_json("/", headers=valid_ipv6)["remote_ip"],
    +            "2620:0:1cfe:face:b00c::3")
    +
    +        valid_ipv6_list = {"X-Forwarded-For": "::1, 2620:0:1cfe:face:b00c::3"}
    +        self.assertEqual(
    +            self.fetch_json("/", headers=valid_ipv6_list)["remote_ip"],
    +            "2620:0:1cfe:face:b00c::3")
    +
    +        invalid_chars = {"X-Real-IP": "4.4.4.4
    +
    +'
    +                         for p in paths)
    +            sloc = html.rindex(b'')
    +            html = html[:sloc] + utf8(js) + b'\n' + html[sloc:]
    +        if js_embed:
    +            js = b''
    +            sloc = html.rindex(b'')
    +            html = html[:sloc] + js + b'\n' + html[sloc:]
    +        if css_files:
    +            paths = []
    +            unique_paths = set()
    +            for path in css_files:
    +                if not is_absolute(path):
    +                    path = self.static_url(path)
    +                if path not in unique_paths:
    +                    paths.append(path)
    +                    unique_paths.add(path)
    +            css = ''.join(''
    +                          for p in paths)
    +            hloc = html.index(b'')
    +            html = html[:hloc] + utf8(css) + b'\n' + html[hloc:]
    +        if css_embed:
    +            css = b''
    +            hloc = html.index(b'')
    +            html = html[:hloc] + css + b'\n' + html[hloc:]
    +        if html_heads:
    +            hloc = html.index(b'')
    +            html = html[:hloc] + b''.join(html_heads) + b'\n' + html[hloc:]
    +        if html_bodies:
    +            hloc = html.index(b'')
    +            html = html[:hloc] + b''.join(html_bodies) + b'\n' + html[hloc:]
    +        self.finish(html)
    +
    +    def render_string(self, template_name, **kwargs):
    +        """Generate the given template with the given arguments.
    +
    +        We return the generated byte string (in utf8). To generate and
    +        write a template as a response, use render() above.
    +        """
    +        # If no template_path is specified, use the path of the calling file
    +        template_path = self.get_template_path()
    +        if not template_path:
    +            frame = sys._getframe(0)
    +            web_file = frame.f_code.co_filename
    +            while frame.f_code.co_filename == web_file:
    +                frame = frame.f_back
    +            template_path = os.path.dirname(frame.f_code.co_filename)
    +        with RequestHandler._template_loader_lock:
    +            if template_path not in RequestHandler._template_loaders:
    +                loader = self.create_template_loader(template_path)
    +                RequestHandler._template_loaders[template_path] = loader
    +            else:
    +                loader = RequestHandler._template_loaders[template_path]
    +        t = loader.load(template_name)
    +        namespace = self.get_template_namespace()
    +        namespace.update(kwargs)
    +        return t.generate(**namespace)
    +
    +    def get_template_namespace(self):
    +        """Returns a dictionary to be used as the default template namespace.
    +
    +        May be overridden by subclasses to add or modify values.
    +
    +        The results of this method will be combined with additional
    +        defaults in the `tornado.template` module and keyword arguments
    +        to `render` or `render_string`.
    +        """
    +        namespace = dict(
    +            handler=self,
    +            request=self.request,
    +            current_user=self.current_user,
    +            locale=self.locale,
    +            _=self.locale.translate,
    +            static_url=self.static_url,
    +            xsrf_form_html=self.xsrf_form_html,
    +            reverse_url=self.reverse_url
    +        )
    +        namespace.update(self.ui)
    +        return namespace
    +
    +    def create_template_loader(self, template_path):
    +        """Returns a new template loader for the given path.
    +
    +        May be overridden by subclasses.  By default returns a
    +        directory-based loader on the given path, using the
    +        ``autoescape`` application setting.  If a ``template_loader``
    +        application setting is supplied, uses that instead.
    +        """
    +        settings = self.application.settings
    +        if "template_loader" in settings:
    +            return settings["template_loader"]
    +        kwargs = {}
    +        if "autoescape" in settings:
    +            # autoescape=None means "no escaping", so we have to be sure
    +            # to only pass this kwarg if the user asked for it.
    +            kwargs["autoescape"] = settings["autoescape"]
    +        return template.Loader(template_path, **kwargs)
    +
    +    def flush(self, include_footers=False, callback=None):
    +        """Flushes the current output buffer to the network.
    +
    +        The ``callback`` argument, if given, can be used for flow control:
    +        it will be run when all flushed data has been written to the socket.
    +        Note that only one flush callback can be outstanding at a time;
    +        if another flush occurs before the previous flush's callback
    +        has been run, the previous callback will be discarded.
    +        """
    +        if self.application._wsgi:
    +            # WSGI applications cannot usefully support flush, so just make
    +            # it a no-op (and run the callback immediately).
    +            if callback is not None:
    +                callback()
    +            return
    +
    +        chunk = b"".join(self._write_buffer)
    +        self._write_buffer = []
    +        if not self._headers_written:
    +            self._headers_written = True
    +            for transform in self._transforms:
    +                self._status_code, self._headers, chunk = \
    +                    transform.transform_first_chunk(
    +                        self._status_code, self._headers, chunk, include_footers)
    +            headers = self._generate_headers()
    +        else:
    +            for transform in self._transforms:
    +                chunk = transform.transform_chunk(chunk, include_footers)
    +            headers = b""
    +
    +        # Ignore the chunk and only write the headers for HEAD requests
    +        if self.request.method == "HEAD":
    +            if headers:
    +                self.request.write(headers, callback=callback)
    +            return
    +
    +        self.request.write(headers + chunk, callback=callback)
    +
    +    def finish(self, chunk=None):
    +        """Finishes this response, ending the HTTP request."""
    +        if self._finished:
    +            raise RuntimeError("finish() called twice.  May be caused "
    +                               "by using async operations without the "
    +                               "@asynchronous decorator.")
    +
    +        if chunk is not None:
    +            self.write(chunk)
    +
    +        # Automatically support ETags and add the Content-Length header if
    +        # we have not flushed any content yet.
    +        if not self._headers_written:
    +            if (self._status_code == 200 and
    +                self.request.method in ("GET", "HEAD") and
    +                    "Etag" not in self._headers):
    +                self.set_etag_header()
    +                if self.check_etag_header():
    +                    self._write_buffer = []
    +                    self.set_status(304)
    +            if self._status_code == 304:
    +                assert not self._write_buffer, "Cannot send body with 304"
    +                self._clear_headers_for_304()
    +            elif "Content-Length" not in self._headers:
    +                content_length = sum(len(part) for part in self._write_buffer)
    +                self.set_header("Content-Length", content_length)
    +
    +        if hasattr(self.request, "connection"):
    +            # Now that the request is finished, clear the callback we
    +            # set on the HTTPConnection (which would otherwise prevent the
    +            # garbage collection of the RequestHandler when there
    +            # are keepalive connections)
    +            self.request.connection.set_close_callback(None)
    +
    +        if not self.application._wsgi:
    +            self.flush(include_footers=True)
    +            self.request.finish()
    +            self._log()
    +        self._finished = True
    +        self.on_finish()
    +        # Break up a reference cycle between this handler and the
    +        # _ui_module closures to allow for faster GC on CPython.
    +        self.ui = None
    +
    +    def send_error(self, status_code=500, **kwargs):
    +        """Sends the given HTTP error code to the browser.
    +
    +        If `flush()` has already been called, it is not possible to send
    +        an error, so this method will simply terminate the response.
    +        If output has been written but not yet flushed, it will be discarded
    +        and replaced with the error page.
    +
    +        Override `write_error()` to customize the error page that is returned.
    +        Additional keyword arguments are passed through to `write_error`.
    +        """
    +        if self._headers_written:
    +            gen_log.error("Cannot send error response after headers written")
    +            if not self._finished:
    +                self.finish()
    +            return
    +        self.clear()
    +
    +        reason = None
    +        if 'exc_info' in kwargs:
    +            exception = kwargs['exc_info'][1]
    +            if isinstance(exception, HTTPError) and exception.reason:
    +                reason = exception.reason
    +        self.set_status(status_code, reason=reason)
    +        try:
    +            self.write_error(status_code, **kwargs)
    +        except Exception:
    +            app_log.error("Uncaught exception in write_error", exc_info=True)
    +        if not self._finished:
    +            self.finish()
    +
    +    def write_error(self, status_code, **kwargs):
    +        """Override to implement custom error pages.
    +
    +        ``write_error`` may call `write`, `render`, `set_header`, etc
    +        to produce output as usual.
    +
    +        If this error was caused by an uncaught exception (including
    +        HTTPError), an ``exc_info`` triple will be available as
    +        ``kwargs["exc_info"]``.  Note that this exception may not be
    +        the "current" exception for purposes of methods like
    +        ``sys.exc_info()`` or ``traceback.format_exc``.
    +
    +        For historical reasons, if a method ``get_error_html`` exists,
    +        it will be used instead of the default ``write_error`` implementation.
    +        ``get_error_html`` returned a string instead of producing output
    +        normally, and had different semantics for exception handling.
    +        Users of ``get_error_html`` are encouraged to convert their code
    +        to override ``write_error`` instead.
    +        """
    +        if hasattr(self, 'get_error_html'):
    +            if 'exc_info' in kwargs:
    +                exc_info = kwargs.pop('exc_info')
    +                kwargs['exception'] = exc_info[1]
    +                try:
    +                    # Put the traceback into sys.exc_info()
    +                    raise_exc_info(exc_info)
    +                except Exception:
    +                    self.finish(self.get_error_html(status_code, **kwargs))
    +            else:
    +                self.finish(self.get_error_html(status_code, **kwargs))
    +            return
    +        if self.settings.get("debug") and "exc_info" in kwargs:
    +            # in debug mode, try to send a traceback
    +            self.set_header('Content-Type', 'text/plain')
    +            for line in traceback.format_exception(*kwargs["exc_info"]):
    +                self.write(line)
    +            self.finish()
    +        else:
    +            self.finish("%(code)d: %(message)s"
    +                        "%(code)d: %(message)s" % {
    +                            "code": status_code,
    +                            "message": self._reason,
    +                        })
    +
    +    @property
    +    def locale(self):
    +        """The local for the current session.
    +
    +        Determined by either `get_user_locale`, which you can override to
    +        set the locale based on, e.g., a user preference stored in a
    +        database, or `get_browser_locale`, which uses the ``Accept-Language``
    +        header.
    +        """
    +        if not hasattr(self, "_locale"):
    +            self._locale = self.get_user_locale()
    +            if not self._locale:
    +                self._locale = self.get_browser_locale()
    +                assert self._locale
    +        return self._locale
    +
    +    def get_user_locale(self):
    +        """Override to determine the locale from the authenticated user.
    +
    +        If None is returned, we fall back to `get_browser_locale()`.
    +
    +        This method should return a `tornado.locale.Locale` object,
    +        most likely obtained via a call like ``tornado.locale.get("en")``
    +        """
    +        return None
    +
    +    def get_browser_locale(self, default="en_US"):
    +        """Determines the user's locale from ``Accept-Language`` header.
    +
    +        See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
    +        """
    +        if "Accept-Language" in self.request.headers:
    +            languages = self.request.headers["Accept-Language"].split(",")
    +            locales = []
    +            for language in languages:
    +                parts = language.strip().split(";")
    +                if len(parts) > 1 and parts[1].startswith("q="):
    +                    try:
    +                        score = float(parts[1][2:])
    +                    except (ValueError, TypeError):
    +                        score = 0.0
    +                else:
    +                    score = 1.0
    +                locales.append((parts[0], score))
    +            if locales:
    +                locales.sort(key=lambda pair: pair[1], reverse=True)
    +                codes = [l[0] for l in locales]
    +                return locale.get(*codes)
    +        return locale.get(default)
    +
    +    @property
    +    def current_user(self):
    +        """The authenticated user for this request.
    +
    +        This is a cached version of `get_current_user`, which you can
    +        override to set the user based on, e.g., a cookie. If that
    +        method is not overridden, this method always returns None.
    +
    +        We lazy-load the current user the first time this method is called
    +        and cache the result after that.
    +        """
    +        if not hasattr(self, "_current_user"):
    +            self._current_user = self.get_current_user()
    +        return self._current_user
    +
    +    @current_user.setter
    +    def current_user(self, value):
    +        self._current_user = value
    +
    +    def get_current_user(self):
    +        """Override to determine the current user from, e.g., a cookie."""
    +        return None
    +
    +    def get_login_url(self):
    +        """Override to customize the login URL based on the request.
    +
    +        By default, we use the ``login_url`` application setting.
    +        """
    +        self.require_setting("login_url", "@tornado.web.authenticated")
    +        return self.application.settings["login_url"]
    +
    +    def get_template_path(self):
    +        """Override to customize template path for each handler.
    +
    +        By default, we use the ``template_path`` application setting.
    +        Return None to load templates relative to the calling file.
    +        """
    +        return self.application.settings.get("template_path")
    +
    +    @property
    +    def xsrf_token(self):
    +        """The XSRF-prevention token for the current user/session.
    +
    +        To prevent cross-site request forgery, we set an '_xsrf' cookie
    +        and include the same '_xsrf' value as an argument with all POST
    +        requests. If the two do not match, we reject the form submission
    +        as a potential forgery.
    +
    +        See http://en.wikipedia.org/wiki/Cross-site_request_forgery
    +        """
    +        if not hasattr(self, "_xsrf_token"):
    +            token = self.get_cookie("_xsrf")
    +            if not token:
    +                token = binascii.b2a_hex(uuid.uuid4().bytes)
    +                expires_days = 30 if self.current_user else None
    +                self.set_cookie("_xsrf", token, expires_days=expires_days)
    +            self._xsrf_token = token
    +        return self._xsrf_token
    +
    +    def check_xsrf_cookie(self):
    +        """Verifies that the ``_xsrf`` cookie matches the ``_xsrf`` argument.
    +
    +        To prevent cross-site request forgery, we set an ``_xsrf``
    +        cookie and include the same value as a non-cookie
    +        field with all ``POST`` requests. If the two do not match, we
    +        reject the form submission as a potential forgery.
    +
    +        The ``_xsrf`` value may be set as either a form field named ``_xsrf``
    +        or in a custom HTTP header named ``X-XSRFToken`` or ``X-CSRFToken``
    +        (the latter is accepted for compatibility with Django).
    +
    +        See http://en.wikipedia.org/wiki/Cross-site_request_forgery
    +
    +        Prior to release 1.1.1, this check was ignored if the HTTP header
    +        ``X-Requested-With: XMLHTTPRequest`` was present.  This exception
    +        has been shown to be insecure and has been removed.  For more
    +        information please see
    +        http://www.djangoproject.com/weblog/2011/feb/08/security/
    +        http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails
    +        """
    +        token = (self.get_argument("_xsrf", None) or
    +                 self.request.headers.get("X-Xsrftoken") or
    +                 self.request.headers.get("X-Csrftoken"))
    +        if not token:
    +            raise HTTPError(403, "'_xsrf' argument missing from POST")
    +        if self.xsrf_token != token:
    +            raise HTTPError(403, "XSRF cookie does not match POST argument")
    +
    +    def xsrf_form_html(self):
    +        """An HTML ```` element to be included with all POST forms.
    +
    +        It defines the ``_xsrf`` input value, which we check on all POST
    +        requests to prevent cross-site request forgery. If you have set
    +        the ``xsrf_cookies`` application setting, you must include this
    +        HTML within all of your HTML forms.
    +
    +        In a template, this method should be called with ``{% module
    +        xsrf_form_html() %}``
    +
    +        See `check_xsrf_cookie()` above for more information.
    +        """
    +        return ''
    +
    +    def static_url(self, path, include_host=None, **kwargs):
    +        """Returns a static URL for the given relative static file path.
    +
    +        This method requires you set the ``static_path`` setting in your
    +        application (which specifies the root directory of your static
    +        files).
    +
    +        This method returns a versioned url (by default appending
    +        ``?v=``), which allows the static files to be
    +        cached indefinitely.  This can be disabled by passing
    +        ``include_version=False`` (in the default implementation;
    +        other static file implementations are not required to support
    +        this, but they may support other options).
    +
    +        By default this method returns URLs relative to the current
    +        host, but if ``include_host`` is true the URL returned will be
    +        absolute.  If this handler has an ``include_host`` attribute,
    +        that value will be used as the default for all `static_url`
    +        calls that do not pass ``include_host`` as a keyword argument.
    +
    +        """
    +        self.require_setting("static_path", "static_url")
    +        get_url = self.settings.get("static_handler_class",
    +                                    StaticFileHandler).make_static_url
    +
    +        if include_host is None:
    +            include_host = getattr(self, "include_host", False)
    +
    +        if include_host:
    +            base = self.request.protocol + "://" + self.request.host
    +        else:
    +            base = ""
    +
    +        return base + get_url(self.settings, path, **kwargs)
    +
    +    def async_callback(self, callback, *args, **kwargs):
    +        """Obsolete - catches exceptions from the wrapped function.
    +
    +        This function is unnecessary since Tornado 1.1.
    +        """
    +        if callback is None:
    +            return None
    +        if args or kwargs:
    +            callback = functools.partial(callback, *args, **kwargs)
    +
    +        def wrapper(*args, **kwargs):
    +            try:
    +                return callback(*args, **kwargs)
    +            except Exception as e:
    +                if self._headers_written:
    +                    app_log.error("Exception after headers written",
    +                                  exc_info=True)
    +                else:
    +                    self._handle_request_exception(e)
    +        return wrapper
    +
    +    def require_setting(self, name, feature="this feature"):
    +        """Raises an exception if the given app setting is not defined."""
    +        if not self.application.settings.get(name):
    +            raise Exception("You must define the '%s' setting in your "
    +                            "application to use %s" % (name, feature))
    +
    +    def reverse_url(self, name, *args):
    +        """Alias for `Application.reverse_url`."""
    +        return self.application.reverse_url(name, *args)
    +
    +    def compute_etag(self):
    +        """Computes the etag header to be used for this request.
    +
    +        By default uses a hash of the content written so far.
    +
    +        May be overridden to provide custom etag implementations,
    +        or may return None to disable tornado's default etag support.
    +        """
    +        hasher = hashlib.sha1()
    +        for part in self._write_buffer:
    +            hasher.update(part)
    +        return '"%s"' % hasher.hexdigest()
    +
    +    def set_etag_header(self):
    +        """Sets the response's Etag header using ``self.compute_etag()``.
    +
    +        Note: no header will be set if ``compute_etag()`` returns ``None``.
    +
    +        This method is called automatically when the request is finished.
    +        """
    +        etag = self.compute_etag()
    +        if etag is not None:
    +            self.set_header("Etag", etag)
    +
    +    def check_etag_header(self):
    +        """Checks the ``Etag`` header against requests's ``If-None-Match``.
    +
    +        Returns ``True`` if the request's Etag matches and a 304 should be
    +        returned. For example::
    +
    +            self.set_etag_header()
    +            if self.check_etag_header():
    +                self.set_status(304)
    +                return
    +
    +        This method is called automatically when the request is finished,
    +        but may be called earlier for applications that override
    +        `compute_etag` and want to do an early check for ``If-None-Match``
    +        before completing the request.  The ``Etag`` header should be set
    +        (perhaps with `set_etag_header`) before calling this method.
    +        """
    +        etag = self._headers.get("Etag")
    +        inm = utf8(self.request.headers.get("If-None-Match", ""))
    +        return bool(etag and inm and inm.find(etag) >= 0)
    +
    +    def _stack_context_handle_exception(self, type, value, traceback):
    +        try:
    +            # For historical reasons _handle_request_exception only takes
    +            # the exception value instead of the full triple,
    +            # so re-raise the exception to ensure that it's in
    +            # sys.exc_info()
    +            raise_exc_info((type, value, traceback))
    +        except Exception:
    +            self._handle_request_exception(value)
    +        return True
    +
    +    def _execute(self, transforms, *args, **kwargs):
    +        """Executes this request with the given output transforms."""
    +        self._transforms = transforms
    +        try:
    +            if self.request.method not in self.SUPPORTED_METHODS:
    +                raise HTTPError(405)
    +            self.path_args = [self.decode_argument(arg) for arg in args]
    +            self.path_kwargs = dict((k, self.decode_argument(v, name=k))
    +                                    for (k, v) in kwargs.items())
    +            # If XSRF cookies are turned on, reject form submissions without
    +            # the proper cookie
    +            if self.request.method not in ("GET", "HEAD", "OPTIONS") and \
    +                    self.application.settings.get("xsrf_cookies"):
    +                self.check_xsrf_cookie()
    +            self._when_complete(self.prepare(), self._execute_method)
    +        except Exception as e:
    +            self._handle_request_exception(e)
    +
    +    def _when_complete(self, result, callback):
    +        try:
    +            if result is None:
    +                callback()
    +            elif isinstance(result, Future):
    +                if result.done():
    +                    if result.result() is not None:
    +                        raise ValueError('Expected None, got %r' % result)
    +                    callback()
    +                else:
    +                    # Delayed import of IOLoop because it's not available
    +                    # on app engine
    +                    from tornado.ioloop import IOLoop
    +                    IOLoop.current().add_future(
    +                        result, functools.partial(self._when_complete,
    +                                                  callback=callback))
    +            else:
    +                raise ValueError("Expected Future or None, got %r" % result)
    +        except Exception as e:
    +            self._handle_request_exception(e)
    +
    +    def _execute_method(self):
    +        if not self._finished:
    +            method = getattr(self, self.request.method.lower())
    +            self._when_complete(method(*self.path_args, **self.path_kwargs),
    +                                self._execute_finish)
    +
    +    def _execute_finish(self):
    +        if self._auto_finish and not self._finished:
    +            self.finish()
    +
    +    def _generate_headers(self):
    +        reason = self._reason
    +        lines = [utf8(self.request.version + " " +
    +                      str(self._status_code) +
    +                      " " + reason)]
    +        lines.extend([utf8(n) + b": " + utf8(v) for n, v in self._headers.get_all()])
    +
    +        if hasattr(self, "_new_cookie"):
    +            for cookie in self._new_cookie.values():
    +                lines.append(utf8("Set-Cookie: " + cookie.OutputString(None)))
    +        return b"\r\n".join(lines) + b"\r\n\r\n"
    +
    +    def _log(self):
    +        """Logs the current request.
    +
    +        Sort of deprecated since this functionality was moved to the
    +        Application, but left in place for the benefit of existing apps
    +        that have overridden this method.
    +        """
    +        self.application.log_request(self)
    +
    +    def _request_summary(self):
    +        return self.request.method + " " + self.request.uri + \
    +            " (" + self.request.remote_ip + ")"
    +
    +    def _handle_request_exception(self, e):
    +        self.log_exception(*sys.exc_info())
    +        if self._finished:
    +            # Extra errors after the request has been finished should
    +            # be logged, but there is no reason to continue to try and
    +            # send a response.
    +            return
    +        if isinstance(e, HTTPError):
    +            if e.status_code not in httputil.responses and not e.reason:
    +                gen_log.error("Bad HTTP status code: %d", e.status_code)
    +                self.send_error(500, exc_info=sys.exc_info())
    +            else:
    +                self.send_error(e.status_code, exc_info=sys.exc_info())
    +        else:
    +            self.send_error(500, exc_info=sys.exc_info())
    +
    +    def log_exception(self, typ, value, tb):
    +        """Override to customize logging of uncaught exceptions.
    +
    +        By default logs instances of `HTTPError` as warnings without
    +        stack traces (on the ``tornado.general`` logger), and all
    +        other exceptions as errors with stack traces (on the
    +        ``tornado.application`` logger).
    +
    +        .. versionadded:: 3.1
    +        """
    +        if isinstance(value, HTTPError):
    +            if value.log_message:
    +                format = "%d %s: " + value.log_message
    +                args = ([value.status_code, self._request_summary()] +
    +                        list(value.args))
    +                gen_log.warning(format, *args)
    +        else:
    +            app_log.error("Uncaught exception %s\n%r", self._request_summary(),
    +                          self.request, exc_info=(typ, value, tb))
    +
    +    def _ui_module(self, name, module):
    +        def render(*args, **kwargs):
    +            if not hasattr(self, "_active_modules"):
    +                self._active_modules = {}
    +            if name not in self._active_modules:
    +                self._active_modules[name] = module(self)
    +            rendered = self._active_modules[name].render(*args, **kwargs)
    +            return rendered
    +        return render
    +
    +    def _ui_method(self, method):
    +        return lambda *args, **kwargs: method(self, *args, **kwargs)
    +
    +    def _clear_headers_for_304(self):
    +        # 304 responses should not contain entity headers (defined in
    +        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.1)
    +        # not explicitly allowed by
    +        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
    +        headers = ["Allow", "Content-Encoding", "Content-Language",
    +                   "Content-Length", "Content-MD5", "Content-Range",
    +                   "Content-Type", "Last-Modified"]
    +        for h in headers:
    +            self.clear_header(h)
    +
    +
    +def asynchronous(method):
    +    """Wrap request handler methods with this if they are asynchronous.
    +
    +    This decorator is unnecessary if the method is also decorated with
    +    ``@gen.coroutine`` (it is legal but unnecessary to use the two
    +    decorators together, in which case ``@asynchronous`` must be
    +    first).
    +
    +    This decorator should only be applied to the :ref:`HTTP verb
    +    methods `; its behavior is undefined for any other method.
    +    This decorator does not *make* a method asynchronous; it tells
    +    the framework that the method *is* asynchronous.  For this decorator
    +    to be useful the method must (at least sometimes) do something
    +    asynchronous.
    +
    +    If this decorator is given, the response is not finished when the
    +    method returns. It is up to the request handler to call
    +    `self.finish() ` to finish the HTTP
    +    request. Without this decorator, the request is automatically
    +    finished when the ``get()`` or ``post()`` method returns. Example::
    +
    +       class MyRequestHandler(web.RequestHandler):
    +           @web.asynchronous
    +           def get(self):
    +              http = httpclient.AsyncHTTPClient()
    +              http.fetch("http://friendfeed.com/", self._on_download)
    +
    +           def _on_download(self, response):
    +              self.write("Downloaded!")
    +              self.finish()
    +
    +    .. versionadded:: 3.1
    +       The ability to use ``@gen.coroutine`` without ``@asynchronous``.
    +    """
    +    # Delay the IOLoop import because it's not available on app engine.
    +    from tornado.ioloop import IOLoop
    +    @functools.wraps(method)
    +    def wrapper(self, *args, **kwargs):
    +        if self.application._wsgi:
    +            raise Exception("@asynchronous is not supported for WSGI apps")
    +        self._auto_finish = False
    +        with stack_context.ExceptionStackContext(
    +                self._stack_context_handle_exception):
    +            result = method(self, *args, **kwargs)
    +            if isinstance(result, Future):
    +                # If @asynchronous is used with @gen.coroutine, (but
    +                # not @gen.engine), we can automatically finish the
    +                # request when the future resolves.  Additionally,
    +                # the Future will swallow any exceptions so we need
    +                # to throw them back out to the stack context to finish
    +                # the request.
    +                def future_complete(f):
    +                    f.result()
    +                    if not self._finished:
    +                        self.finish()
    +                IOLoop.current().add_future(result, future_complete)
    +            return result
    +    return wrapper
    +
    +
    +def removeslash(method):
    +    """Use this decorator to remove trailing slashes from the request path.
    +
    +    For example, a request to ``/foo/`` would redirect to ``/foo`` with this
    +    decorator. Your request handler mapping should use a regular expression
    +    like ``r'/foo/*'`` in conjunction with using the decorator.
    +    """
    +    @functools.wraps(method)
    +    def wrapper(self, *args, **kwargs):
    +        if self.request.path.endswith("/"):
    +            if self.request.method in ("GET", "HEAD"):
    +                uri = self.request.path.rstrip("/")
    +                if uri:  # don't try to redirect '/' to ''
    +                    if self.request.query:
    +                        uri += "?" + self.request.query
    +                    self.redirect(uri, permanent=True)
    +                    return
    +            else:
    +                raise HTTPError(404)
    +        return method(self, *args, **kwargs)
    +    return wrapper
    +
    +
    +def addslash(method):
    +    """Use this decorator to add a missing trailing slash to the request path.
    +
    +    For example, a request to ``/foo`` would redirect to ``/foo/`` with this
    +    decorator. Your request handler mapping should use a regular expression
    +    like ``r'/foo/?'`` in conjunction with using the decorator.
    +    """
    +    @functools.wraps(method)
    +    def wrapper(self, *args, **kwargs):
    +        if not self.request.path.endswith("/"):
    +            if self.request.method in ("GET", "HEAD"):
    +                uri = self.request.path + "/"
    +                if self.request.query:
    +                    uri += "?" + self.request.query
    +                self.redirect(uri, permanent=True)
    +                return
    +            raise HTTPError(404)
    +        return method(self, *args, **kwargs)
    +    return wrapper
    +
    +
    +class Application(object):
    +    """A collection of request handlers that make up a web application.
    +
    +    Instances of this class are callable and can be passed directly to
    +    HTTPServer to serve the application::
    +
    +        application = web.Application([
    +            (r"/", MainPageHandler),
    +        ])
    +        http_server = httpserver.HTTPServer(application)
    +        http_server.listen(8080)
    +        ioloop.IOLoop.instance().start()
    +
    +    The constructor for this class takes in a list of `URLSpec` objects
    +    or (regexp, request_class) tuples. When we receive requests, we
    +    iterate over the list in order and instantiate an instance of the
    +    first request class whose regexp matches the request path.
    +
    +    Each tuple can contain an optional third element, which should be
    +    a dictionary if it is present. That dictionary is passed as
    +    keyword arguments to the contructor of the handler. This pattern
    +    is used for the `StaticFileHandler` in this example (note that a
    +    `StaticFileHandler` can be installed automatically with the
    +    static_path setting described below)::
    +
    +        application = web.Application([
    +            (r"/static/(.*)", web.StaticFileHandler, {"path": "/var/www"}),
    +        ])
    +
    +    We support virtual hosts with the `add_handlers` method, which takes in
    +    a host regular expression as the first argument::
    +
    +        application.add_handlers(r"www\.myhost\.com", [
    +            (r"/article/([0-9]+)", ArticleHandler),
    +        ])
    +
    +    You can serve static files by sending the ``static_path`` setting
    +    as a keyword argument. We will serve those files from the
    +    ``/static/`` URI (this is configurable with the
    +    ``static_url_prefix`` setting), and we will serve ``/favicon.ico``
    +    and ``/robots.txt`` from the same directory.  A custom subclass of
    +    `StaticFileHandler` can be specified with the
    +    ``static_handler_class`` setting.
    +    """
    +    def __init__(self, handlers=None, default_host="", transforms=None,
    +                 wsgi=False, **settings):
    +        if transforms is None:
    +            self.transforms = []
    +            if settings.get("gzip"):
    +                self.transforms.append(GZipContentEncoding)
    +            self.transforms.append(ChunkedTransferEncoding)
    +        else:
    +            self.transforms = transforms
    +        self.handlers = []
    +        self.named_handlers = {}
    +        self.default_host = default_host
    +        self.settings = settings
    +        self.ui_modules = {'linkify': _linkify,
    +                           'xsrf_form_html': _xsrf_form_html,
    +                           'Template': TemplateModule,
    +                           }
    +        self.ui_methods = {}
    +        self._wsgi = wsgi
    +        self._load_ui_modules(settings.get("ui_modules", {}))
    +        self._load_ui_methods(settings.get("ui_methods", {}))
    +        if self.settings.get("static_path"):
    +            path = self.settings["static_path"]
    +            handlers = list(handlers or [])
    +            static_url_prefix = settings.get("static_url_prefix",
    +                                             "/static/")
    +            static_handler_class = settings.get("static_handler_class",
    +                                                StaticFileHandler)
    +            static_handler_args = settings.get("static_handler_args", {})
    +            static_handler_args['path'] = path
    +            for pattern in [re.escape(static_url_prefix) + r"(.*)",
    +                            r"/(favicon\.ico)", r"/(robots\.txt)"]:
    +                handlers.insert(0, (pattern, static_handler_class,
    +                                    static_handler_args))
    +        if handlers:
    +            self.add_handlers(".*$", handlers)
    +
    +        # Automatically reload modified modules
    +        if self.settings.get("debug") and not wsgi:
    +            from tornado import autoreload
    +            autoreload.start()
    +
    +    def listen(self, port, address="", **kwargs):
    +        """Starts an HTTP server for this application on the given port.
    +
    +        This is a convenience alias for creating an `.HTTPServer`
    +        object and calling its listen method.  Keyword arguments not
    +        supported by `HTTPServer.listen <.TCPServer.listen>` are passed to the
    +        `.HTTPServer` constructor.  For advanced uses
    +        (e.g. multi-process mode), do not use this method; create an
    +        `.HTTPServer` and call its
    +        `.TCPServer.bind`/`.TCPServer.start` methods directly.
    +
    +        Note that after calling this method you still need to call
    +        ``IOLoop.instance().start()`` to start the server.
    +        """
    +        # import is here rather than top level because HTTPServer
    +        # is not importable on appengine
    +        from tornado.httpserver import HTTPServer
    +        server = HTTPServer(self, **kwargs)
    +        server.listen(port, address)
    +
    +    def add_handlers(self, host_pattern, host_handlers):
    +        """Appends the given handlers to our handler list.
    +
    +        Host patterns are processed sequentially in the order they were
    +        added. All matching patterns will be considered.
    +        """
    +        if not host_pattern.endswith("$"):
    +            host_pattern += "$"
    +        handlers = []
    +        # The handlers with the wildcard host_pattern are a special
    +        # case - they're added in the constructor but should have lower
    +        # precedence than the more-precise handlers added later.
    +        # If a wildcard handler group exists, it should always be last
    +        # in the list, so insert new groups just before it.
    +        if self.handlers and self.handlers[-1][0].pattern == '.*$':
    +            self.handlers.insert(-1, (re.compile(host_pattern), handlers))
    +        else:
    +            self.handlers.append((re.compile(host_pattern), handlers))
    +
    +        for spec in host_handlers:
    +            if isinstance(spec, (tuple, list)):
    +                assert len(spec) in (2, 3)
    +                pattern = spec[0]
    +                handler = spec[1]
    +
    +                if isinstance(handler, str):
    +                    # import the Module and instantiate the class
    +                    # Must be a fully qualified name (module.ClassName)
    +                    handler = import_object(handler)
    +
    +                if len(spec) == 3:
    +                    kwargs = spec[2]
    +                else:
    +                    kwargs = {}
    +                spec = URLSpec(pattern, handler, kwargs)
    +            handlers.append(spec)
    +            if spec.name:
    +                if spec.name in self.named_handlers:
    +                    app_log.warning(
    +                        "Multiple handlers named %s; replacing previous value",
    +                        spec.name)
    +                self.named_handlers[spec.name] = spec
    +
    +    def add_transform(self, transform_class):
    +        self.transforms.append(transform_class)
    +
    +    def _get_host_handlers(self, request):
    +        host = request.host.lower().split(':')[0]
    +        matches = []
    +        for pattern, handlers in self.handlers:
    +            if pattern.match(host):
    +                matches.extend(handlers)
    +        # Look for default host if not behind load balancer (for debugging)
    +        if not matches and "X-Real-Ip" not in request.headers:
    +            for pattern, handlers in self.handlers:
    +                if pattern.match(self.default_host):
    +                    matches.extend(handlers)
    +        return matches or None
    +
    +    def _load_ui_methods(self, methods):
    +        if isinstance(methods, types.ModuleType):
    +            self._load_ui_methods(dict((n, getattr(methods, n))
    +                                       for n in dir(methods)))
    +        elif isinstance(methods, list):
    +            for m in methods:
    +                self._load_ui_methods(m)
    +        else:
    +            for name, fn in methods.items():
    +                if not name.startswith("_") and hasattr(fn, "__call__") \
    +                        and name[0].lower() == name[0]:
    +                    self.ui_methods[name] = fn
    +
    +    def _load_ui_modules(self, modules):
    +        if isinstance(modules, types.ModuleType):
    +            self._load_ui_modules(dict((n, getattr(modules, n))
    +                                       for n in dir(modules)))
    +        elif isinstance(modules, list):
    +            for m in modules:
    +                self._load_ui_modules(m)
    +        else:
    +            assert isinstance(modules, dict)
    +            for name, cls in modules.items():
    +                try:
    +                    if issubclass(cls, UIModule):
    +                        self.ui_modules[name] = cls
    +                except TypeError:
    +                    pass
    +
    +    def __call__(self, request):
    +        """Called by HTTPServer to execute the request."""
    +        transforms = [t(request) for t in self.transforms]
    +        handler = None
    +        args = []
    +        kwargs = {}
    +        handlers = self._get_host_handlers(request)
    +        if not handlers:
    +            handler = RedirectHandler(
    +                self, request, url="http://" + self.default_host + "/")
    +        else:
    +            for spec in handlers:
    +                match = spec.regex.match(request.path)
    +                if match:
    +                    handler = spec.handler_class(self, request, **spec.kwargs)
    +                    if spec.regex.groups:
    +                        # None-safe wrapper around url_unescape to handle
    +                        # unmatched optional groups correctly
    +                        def unquote(s):
    +                            if s is None:
    +                                return s
    +                            return escape.url_unescape(s, encoding=None,
    +                                                       plus=False)
    +                        # Pass matched groups to the handler.  Since
    +                        # match.groups() includes both named and unnamed groups,
    +                        # we want to use either groups or groupdict but not both.
    +                        # Note that args are passed as bytes so the handler can
    +                        # decide what encoding to use.
    +
    +                        if spec.regex.groupindex:
    +                            kwargs = dict(
    +                                (str(k), unquote(v))
    +                                for (k, v) in match.groupdict().items())
    +                        else:
    +                            args = [unquote(s) for s in match.groups()]
    +                    break
    +            if not handler:
    +                handler = ErrorHandler(self, request, status_code=404)
    +
    +        # In debug mode, re-compile templates and reload static files on every
    +        # request so you don't need to restart to see changes
    +        if self.settings.get("debug"):
    +            with RequestHandler._template_loader_lock:
    +                for loader in RequestHandler._template_loaders.values():
    +                    loader.reset()
    +            StaticFileHandler.reset()
    +
    +        handler._execute(transforms, *args, **kwargs)
    +        return handler
    +
    +    def reverse_url(self, name, *args):
    +        """Returns a URL path for handler named ``name``
    +
    +        The handler must be added to the application as a named `URLSpec`.
    +
    +        Args will be substituted for capturing groups in the `URLSpec` regex.
    +        They will be converted to strings if necessary, encoded as utf8,
    +        and url-escaped.
    +        """
    +        if name in self.named_handlers:
    +            return self.named_handlers[name].reverse(*args)
    +        raise KeyError("%s not found in named urls" % name)
    +
    +    def log_request(self, handler):
    +        """Writes a completed HTTP request to the logs.
    +
    +        By default writes to the python root logger.  To change
    +        this behavior either subclass Application and override this method,
    +        or pass a function in the application settings dictionary as
    +        ``log_function``.
    +        """
    +        if "log_function" in self.settings:
    +            self.settings["log_function"](handler)
    +            return
    +        if handler.get_status() < 400:
    +            log_method = access_log.info
    +        elif handler.get_status() < 500:
    +            log_method = access_log.warning
    +        else:
    +            log_method = access_log.error
    +        request_time = 1000.0 * handler.request.request_time()
    +        log_method("%d %s %.2fms", handler.get_status(),
    +                   handler._request_summary(), request_time)
    +
    +
    +class HTTPError(Exception):
    +    """An exception that will turn into an HTTP error response.
    +
    +    Raising an `HTTPError` is a convenient alternative to calling
    +    `RequestHandler.send_error` since it automatically ends the
    +    current function.
    +
    +    :arg int status_code: HTTP status code.  Must be listed in
    +        `httplib.responses ` unless the ``reason``
    +        keyword argument is given.
    +    :arg string log_message: Message to be written to the log for this error
    +        (will not be shown to the user unless the `Application` is in debug
    +        mode).  May contain ``%s``-style placeholders, which will be filled
    +        in with remaining positional parameters.
    +    :arg string reason: Keyword-only argument.  The HTTP "reason" phrase
    +        to pass in the status line along with ``status_code``.  Normally
    +        determined automatically from ``status_code``, but can be used
    +        to use a non-standard numeric code.
    +    """
    +    def __init__(self, status_code, log_message=None, *args, **kwargs):
    +        self.status_code = status_code
    +        self.log_message = log_message
    +        self.args = args
    +        self.reason = kwargs.get('reason', None)
    +
    +    def __str__(self):
    +        message = "HTTP %d: %s" % (
    +            self.status_code,
    +            self.reason or httputil.responses.get(self.status_code, 'Unknown'))
    +        if self.log_message:
    +            return message + " (" + (self.log_message % self.args) + ")"
    +        else:
    +            return message
    +
    +
    +class MissingArgumentError(HTTPError):
    +    """Exception raised by `RequestHandler.get_argument`.
    +
    +    This is a subclass of `HTTPError`, so if it is uncaught a 400 response
    +    code will be used instead of 500 (and a stack trace will not be logged).
    +
    +    .. versionadded:: 3.1
    +    """
    +    def __init__(self, arg_name):
    +        super(MissingArgumentError, self).__init__(
    +            400, 'Missing argument %s' % arg_name)
    +        self.arg_name = arg_name
    +
    +
    +class ErrorHandler(RequestHandler):
    +    """Generates an error response with ``status_code`` for all requests."""
    +    def initialize(self, status_code):
    +        self.set_status(status_code)
    +
    +    def prepare(self):
    +        raise HTTPError(self._status_code)
    +
    +    def check_xsrf_cookie(self):
    +        # POSTs to an ErrorHandler don't actually have side effects,
    +        # so we don't need to check the xsrf token.  This allows POSTs
    +        # to the wrong url to return a 404 instead of 403.
    +        pass
    +
    +
    +class RedirectHandler(RequestHandler):
    +    """Redirects the client to the given URL for all GET requests.
    +
    +    You should provide the keyword argument ``url`` to the handler, e.g.::
    +
    +        application = web.Application([
    +            (r"/oldpath", web.RedirectHandler, {"url": "/newpath"}),
    +        ])
    +    """
    +    def initialize(self, url, permanent=True):
    +        self._url = url
    +        self._permanent = permanent
    +
    +    def get(self):
    +        self.redirect(self._url, permanent=self._permanent)
    +
    +
    +class StaticFileHandler(RequestHandler):
    +    """A simple handler that can serve static content from a directory.
    +
    +    A `StaticFileHandler` is configured automatically if you pass the
    +    ``static_path`` keyword argument to `Application`.  This handler
    +    can be customized with the ``static_url_prefix``, ``static_handler_class``,
    +    and ``static_handler_args`` settings.
    +
    +    To map an additional path to this handler for a static data directory
    +    you would add a line to your application like::
    +
    +        application = web.Application([
    +            (r"/content/(.*)", web.StaticFileHandler, {"path": "/var/www"}),
    +        ])
    +
    +    The handler constructor requires a ``path`` argument, which specifies the
    +    local root directory of the content to be served.
    +
    +    Note that a capture group in the regex is required to parse the value for
    +    the ``path`` argument to the get() method (different than the constructor
    +    argument above); see `URLSpec` for details.
    +
    +    To maximize the effectiveness of browser caching, this class supports
    +    versioned urls (by default using the argument ``?v=``).  If a version
    +    is given, we instruct the browser to cache this file indefinitely.
    +    `make_static_url` (also available as `RequestHandler.static_url`) can
    +    be used to construct a versioned url.
    +
    +    This handler is intended primarily for use in development and light-duty
    +    file serving; for heavy traffic it will be more efficient to use
    +    a dedicated static file server (such as nginx or Apache).  We support
    +    the HTTP ``Accept-Ranges`` mechanism to return partial content (because
    +    some browsers require this functionality to be present to seek in
    +    HTML5 audio or video), but this handler should not be used with
    +    files that are too large to fit comfortably in memory.
    +
    +    **Subclassing notes**
    +
    +    This class is designed to be extensible by subclassing, but because
    +    of the way static urls are generated with class methods rather than
    +    instance methods, the inheritance patterns are somewhat unusual.
    +    Be sure to use the ``@classmethod`` decorator when overriding a
    +    class method.  Instance methods may use the attributes ``self.path``
    +    ``self.absolute_path``, and ``self.modified``.
    +
    +    To change the way static urls are generated (e.g. to match the behavior
    +    of another server or CDN), override `make_static_url`, `parse_url_path`,
    +    `get_cache_time`, and/or `get_version`.
    +
    +    To replace all interaction with the filesystem (e.g. to serve
    +    static content from a database), override `get_content`,
    +    `get_content_size`, `get_modified_time`, `get_absolute_path`, and
    +    `validate_absolute_path`.
    +
    +    .. versionchanged:: 3.1
    +       Many of the methods for subclasses were added in Tornado 3.1.
    +    """
    +    CACHE_MAX_AGE = 86400 * 365 * 10  # 10 years
    +
    +    _static_hashes = {}
    +    _lock = threading.Lock()  # protects _static_hashes
    +
    +    def initialize(self, path, default_filename=None):
    +        self.root = path
    +        self.default_filename = default_filename
    +
    +    @classmethod
    +    def reset(cls):
    +        with cls._lock:
    +            cls._static_hashes = {}
    +
    +    def head(self, path):
    +        self.get(path, include_body=False)
    +
    +    def get(self, path, include_body=True):
    +        # Set up our path instance variables.
    +        self.path = self.parse_url_path(path)
    +        del path  # make sure we don't refer to path instead of self.path again
    +        absolute_path = self.get_absolute_path(self.root, self.path)
    +        self.absolute_path = self.validate_absolute_path(
    +            self.root, absolute_path)
    +        if self.absolute_path is None:
    +            return
    +
    +        self.modified = self.get_modified_time()
    +        self.set_headers()
    +
    +        if self.should_return_304():
    +            self.set_status(304)
    +            return
    +
    +        request_range = None
    +        range_header = self.request.headers.get("Range")
    +        if range_header:
    +            # As per RFC 2616 14.16, if an invalid Range header is specified,
    +            # the request will be treated as if the header didn't exist.
    +            request_range = httputil._parse_request_range(range_header)
    +
    +        if request_range:
    +            start, end = request_range
    +            size = self.get_content_size()
    +            if (start is not None and start >= size) or end == 0:
    +                # As per RFC 2616 14.35.1, a range is not satisfiable only: if
    +                # the first requested byte is equal to or greater than the
    +                # content, or when a suffix with length 0 is specified
    +                self.set_status(416)  # Range Not Satisfiable
    +                self.set_header("Content-Type", "text/plain")
    +                self.set_header("Content-Range", "bytes */%s" %(size, ))
    +                return
    +            if start is not None and start < 0:
    +                start += size
    +            if end is not None and end > size:
    +                # Clients sometimes blindly use a large range to limit their
    +                # download size; cap the endpoint at the actual file size.
    +                end = size
    +            # Note: only return HTTP 206 if less than the entire range has been
    +            # requested. Not only is this semantically correct, but Chrome
    +            # refuses to play audio if it gets an HTTP 206 in response to
    +            # ``Range: bytes=0-``.
    +            if size != (end or size) - (start or 0):
    +                self.set_status(206)  # Partial Content
    +                self.set_header("Content-Range",
    +                                httputil._get_content_range(start, end, size))
    +        else:
    +            start = end = None
    +        content = self.get_content(self.absolute_path, start, end)
    +        if isinstance(content, bytes_type):
    +            content = [content]
    +        content_length = 0
    +        for chunk in content:
    +            if include_body:
    +                self.write(chunk)
    +            else:
    +                content_length += len(chunk)
    +        if not include_body:
    +            assert self.request.method == "HEAD"
    +            self.set_header("Content-Length", content_length)
    +
    +    def compute_etag(self):
    +        """Sets the ``Etag`` header based on static url version.
    +
    +        This allows efficient ``If-None-Match`` checks against cached
    +        versions, and sends the correct ``Etag`` for a partial response
    +        (i.e. the same ``Etag`` as the full file).
    +
    +        .. versionadded:: 3.1
    +        """
    +        version_hash = self._get_cached_version(self.absolute_path)
    +        if not version_hash:
    +            return None
    +        return '"%s"' % (version_hash, )
    +
    +    def set_headers(self):
    +        """Sets the content and caching headers on the response.
    +
    +        .. versionadded:: 3.1
    +        """
    +        self.set_header("Accept-Ranges", "bytes")
    +        self.set_etag_header()
    +
    +        if self.modified is not None:
    +            self.set_header("Last-Modified", self.modified)
    +
    +        content_type = self.get_content_type()
    +        if content_type:
    +            self.set_header("Content-Type", content_type)
    +
    +        cache_time = self.get_cache_time(self.path, self.modified, content_type)
    +        if cache_time > 0:
    +            self.set_header("Expires", datetime.datetime.utcnow() +
    +                            datetime.timedelta(seconds=cache_time))
    +            self.set_header("Cache-Control", "max-age=" + str(cache_time))
    +
    +        self.set_extra_headers(self.path)
    +
    +    def should_return_304(self):
    +        """Returns True if the headers indicate that we should return 304.
    +
    +        .. versionadded:: 3.1
    +        """
    +        if self.check_etag_header():
    +            return True
    +
    +        # Check the If-Modified-Since, and don't send the result if the
    +        # content has not been modified
    +        ims_value = self.request.headers.get("If-Modified-Since")
    +        if ims_value is not None:
    +            date_tuple = email.utils.parsedate(ims_value)
    +            if date_tuple is not None:
    +                if_since = datetime.datetime(*date_tuple[:6])
    +                if if_since >= self.modified:
    +                    return True
    +
    +        return False
    +
    +    @classmethod
    +    def get_absolute_path(cls, root, path):
    +        """Returns the absolute location of ``path`` relative to ``root``.
    +
    +        ``root`` is the path configured for this `StaticFileHandler`
    +        (in most cases the ``static_path`` `Application` setting).
    +
    +        This class method may be overridden in subclasses.  By default
    +        it returns a filesystem path, but other strings may be used
    +        as long as they are unique and understood by the subclass's
    +        overridden `get_content`.
    +
    +        .. versionadded:: 3.1
    +        """
    +        abspath = os.path.abspath(os.path.join(root, path))
    +        return abspath
    +
    +    def validate_absolute_path(self, root, absolute_path):
    +        """Validate and return the absolute path.
    +
    +        ``root`` is the configured path for the `StaticFileHandler`,
    +        and ``path`` is the result of `get_absolute_path`
    +
    +        This is an instance method called during request processing,
    +        so it may raise `HTTPError` or use methods like
    +        `RequestHandler.redirect` (return None after redirecting to
    +        halt further processing).  This is where 404 errors for missing files
    +        are generated.
    +
    +        This method may modify the path before returning it, but note that
    +        any such modifications will not be understood by `make_static_url`.
    +
    +        In instance methods, this method's result is available as
    +        ``self.absolute_path``.
    +
    +        .. versionadded:: 3.1
    +        """
    +        root = os.path.abspath(root)
    +        # os.path.abspath strips a trailing /
    +        # it needs to be temporarily added back for requests to root/
    +        if not (absolute_path + os.path.sep).startswith(root):
    +            raise HTTPError(403, "%s is not in root static directory",
    +                            self.path)
    +        if (os.path.isdir(absolute_path) and
    +                self.default_filename is not None):
    +            # need to look at the request.path here for when path is empty
    +            # but there is some prefix to the path that was already
    +            # trimmed by the routing
    +            if not self.request.path.endswith("/"):
    +                self.redirect(self.request.path + "/", permanent=True)
    +                return
    +            absolute_path = os.path.join(absolute_path, self.default_filename)
    +        if not os.path.exists(absolute_path):
    +            raise HTTPError(404)
    +        if not os.path.isfile(absolute_path):
    +            raise HTTPError(403, "%s is not a file", self.path)
    +        return absolute_path
    +
    +    @classmethod
    +    def get_content(cls, abspath, start=None, end=None):
    +        """Retrieve the content of the requested resource which is located
    +        at the given absolute path.
    +
    +        This class method may be overridden by subclasses.  Note that its
    +        signature is different from other overridable class methods
    +        (no ``settings`` argument); this is deliberate to ensure that
    +        ``abspath`` is able to stand on its own as a cache key.
    +
    +        This method should either return a byte string or an iterator
    +        of byte strings.  The latter is preferred for large files
    +        as it helps reduce memory fragmentation.
    +
    +        .. versionadded:: 3.1
    +        """
    +        with open(abspath, "rb") as file:
    +            if start is not None:
    +                file.seek(start)
    +            if end is not None:
    +                remaining = end - (start or 0)
    +            else:
    +                remaining = None
    +            while True:
    +                chunk_size = 64 * 1024
    +                if remaining is not None and remaining < chunk_size:
    +                    chunk_size = remaining
    +                chunk = file.read(chunk_size)
    +                if chunk:
    +                    if remaining is not None:
    +                        remaining -= len(chunk)
    +                    yield chunk
    +                else:
    +                    if remaining is not None:
    +                        assert remaining == 0
    +                    return
    +
    +    @classmethod
    +    def get_content_version(cls, abspath):
    +        """Returns a version string for the resource at the given path.
    +
    +        This class method may be overridden by subclasses.  The
    +        default implementation is a hash of the file's contents.
    +
    +        .. versionadded:: 3.1
    +        """
    +        data = cls.get_content(abspath)
    +        hasher = hashlib.md5()
    +        if isinstance(data, bytes_type):
    +            hasher.update(data)
    +        else:
    +            for chunk in data:
    +                hasher.update(chunk)
    +        return hasher.hexdigest()
    +
    +    def _stat(self):
    +        if not hasattr(self, '_stat_result'):
    +            self._stat_result = os.stat(self.absolute_path)
    +        return self._stat_result
    +
    +    def get_content_size(self):
    +        """Retrieve the total size of the resource at the given path.
    +
    +        This method may be overridden by subclasses. It will only
    +        be called if a partial result is requested from `get_content`
    +
    +        .. versionadded:: 3.1
    +        """
    +        stat_result = self._stat()
    +        return stat_result[stat.ST_SIZE]
    +
    +    def get_modified_time(self):
    +        """Returns the time that ``self.absolute_path`` was last modified.
    +
    +        May be overridden in subclasses.  Should return a `~datetime.datetime`
    +        object or None.
    +
    +        .. versionadded:: 3.1
    +        """
    +        stat_result = self._stat()
    +        modified = datetime.datetime.utcfromtimestamp(stat_result[stat.ST_MTIME])
    +        return modified
    +
    +    def get_content_type(self):
    +        """Returns the ``Content-Type`` header to be used for this request.
    +
    +        .. versionadded:: 3.1
    +        """
    +        mime_type, encoding = mimetypes.guess_type(self.absolute_path)
    +        return mime_type
    +
    +    def set_extra_headers(self, path):
    +        """For subclass to add extra headers to the response"""
    +        pass
    +
    +    def get_cache_time(self, path, modified, mime_type):
    +        """Override to customize cache control behavior.
    +
    +        Return a positive number of seconds to make the result
    +        cacheable for that amount of time or 0 to mark resource as
    +        cacheable for an unspecified amount of time (subject to
    +        browser heuristics).
    +
    +        By default returns cache expiry of 10 years for resources requested
    +        with ``v`` argument.
    +        """
    +        return self.CACHE_MAX_AGE if "v" in self.request.arguments else 0
    +
    +    @classmethod
    +    def make_static_url(cls, settings, path, include_version=True):
    +        """Constructs a versioned url for the given path.
    +
    +        This method may be overridden in subclasses (but note that it
    +        is a class method rather than an instance method).  Subclasses
    +        are only required to implement the signature
    +        ``make_static_url(cls, settings, path)``; other keyword
    +        arguments may be passed through `~RequestHandler.static_url`
    +        but are not standard.
    +
    +        ``settings`` is the `Application.settings` dictionary.  ``path``
    +        is the static path being requested.  The url returned should be
    +        relative to the current host.
    +
    +        ``include_version`` determines whether the generated URL should
    +        include the query string containing the version hash of the
    +        file corresponding to the given ``path``.
    +
    +        """
    +        url = settings.get('static_url_prefix', '/static/') + path
    +        if not include_version:
    +            return url
    +
    +        version_hash = cls.get_version(settings, path)
    +        if not version_hash:
    +            return url
    +
    +        return '%s?v=%s' % (url, version_hash)
    +
    +    def parse_url_path(self, url_path):
    +        """Converts a static URL path into a filesystem path.
    +
    +        ``url_path`` is the path component of the URL with
    +        ``static_url_prefix`` removed.  The return value should be
    +        filesystem path relative to ``static_path``.
    +
    +        This is the inverse of `make_static_url`.
    +        """
    +        if os.path.sep != "/":
    +            url_path = url_path.replace("/", os.path.sep)
    +        return url_path
    +
    +    @classmethod
    +    def get_version(cls, settings, path):
    +        """Generate the version string to be used in static URLs.
    +
    +        ``settings`` is the `Application.settings` dictionary and ``path``
    +        is the relative location of the requested asset on the filesystem.
    +        The returned value should be a string, or ``None`` if no version
    +        could be determined.
    +
    +        .. versionchanged:: 3.1
    +           This method was previously recommended for subclasses to override;
    +           `get_content_version` is now preferred as it allows the base
    +           class to handle caching of the result.
    +        """
    +        abs_path = cls.get_absolute_path(settings['static_path'], path)
    +        return cls._get_cached_version(abs_path)
    +
    +    @classmethod
    +    def _get_cached_version(cls, abs_path):
    +        with cls._lock:
    +            hashes = cls._static_hashes
    +            if abs_path not in hashes:
    +                try:
    +                    hashes[abs_path] = cls.get_content_version(abs_path)
    +                except Exception:
    +                    gen_log.error("Could not open static file %r", abs_path)
    +                    hashes[abs_path] = None
    +            hsh = hashes.get(abs_path)
    +            if hsh:
    +                return hsh
    +        return None
    +
    +
    +class FallbackHandler(RequestHandler):
    +    """A `RequestHandler` that wraps another HTTP server callback.
    +
    +    The fallback is a callable object that accepts an
    +    `~.httpserver.HTTPRequest`, such as an `Application` or
    +    `tornado.wsgi.WSGIContainer`.  This is most useful to use both
    +    Tornado ``RequestHandlers`` and WSGI in the same server.  Typical
    +    usage::
    +
    +        wsgi_app = tornado.wsgi.WSGIContainer(
    +            django.core.handlers.wsgi.WSGIHandler())
    +        application = tornado.web.Application([
    +            (r"/foo", FooHandler),
    +            (r".*", FallbackHandler, dict(fallback=wsgi_app),
    +        ])
    +    """
    +    def initialize(self, fallback):
    +        self.fallback = fallback
    +
    +    def prepare(self):
    +        self.fallback(self.request)
    +        self._finished = True
    +
    +
    +class OutputTransform(object):
    +    """A transform modifies the result of an HTTP request (e.g., GZip encoding)
    +
    +    A new transform instance is created for every request. See the
    +    ChunkedTransferEncoding example below if you want to implement a
    +    new Transform.
    +    """
    +    def __init__(self, request):
    +        pass
    +
    +    def transform_first_chunk(self, status_code, headers, chunk, finishing):
    +        return status_code, headers, chunk
    +
    +    def transform_chunk(self, chunk, finishing):
    +        return chunk
    +
    +
    +class GZipContentEncoding(OutputTransform):
    +    """Applies the gzip content encoding to the response.
    +
    +    See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11
    +    """
    +    CONTENT_TYPES = set([
    +        "text/plain", "text/html", "text/css", "text/xml", "application/javascript",
    +        "application/x-javascript", "application/xml", "application/atom+xml",
    +        "text/javascript", "application/json", "application/xhtml+xml"])
    +    MIN_LENGTH = 5
    +
    +    def __init__(self, request):
    +        self._gzipping = request.supports_http_1_1() and \
    +            "gzip" in request.headers.get("Accept-Encoding", "")
    +
    +    def transform_first_chunk(self, status_code, headers, chunk, finishing):
    +        if 'Vary' in headers:
    +            headers['Vary'] += b', Accept-Encoding'
    +        else:
    +            headers['Vary'] = b'Accept-Encoding'
    +        if self._gzipping:
    +            ctype = _unicode(headers.get("Content-Type", "")).split(";")[0]
    +            self._gzipping = (ctype in self.CONTENT_TYPES) and \
    +                (not finishing or len(chunk) >= self.MIN_LENGTH) and \
    +                (finishing or "Content-Length" not in headers) and \
    +                ("Content-Encoding" not in headers)
    +        if self._gzipping:
    +            headers["Content-Encoding"] = "gzip"
    +            self._gzip_value = BytesIO()
    +            self._gzip_file = gzip.GzipFile(mode="w", fileobj=self._gzip_value)
    +            chunk = self.transform_chunk(chunk, finishing)
    +            if "Content-Length" in headers:
    +                headers["Content-Length"] = str(len(chunk))
    +        return status_code, headers, chunk
    +
    +    def transform_chunk(self, chunk, finishing):
    +        if self._gzipping:
    +            self._gzip_file.write(chunk)
    +            if finishing:
    +                self._gzip_file.close()
    +            else:
    +                self._gzip_file.flush()
    +            chunk = self._gzip_value.getvalue()
    +            self._gzip_value.truncate(0)
    +            self._gzip_value.seek(0)
    +        return chunk
    +
    +
    +class ChunkedTransferEncoding(OutputTransform):
    +    """Applies the chunked transfer encoding to the response.
    +
    +    See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1
    +    """
    +    def __init__(self, request):
    +        self._chunking = request.supports_http_1_1()
    +
    +    def transform_first_chunk(self, status_code, headers, chunk, finishing):
    +        # 304 responses have no body (not even a zero-length body), and so
    +        # should not have either Content-Length or Transfer-Encoding headers.
    +        if self._chunking and status_code != 304:
    +            # No need to chunk the output if a Content-Length is specified
    +            if "Content-Length" in headers or "Transfer-Encoding" in headers:
    +                self._chunking = False
    +            else:
    +                headers["Transfer-Encoding"] = "chunked"
    +                chunk = self.transform_chunk(chunk, finishing)
    +        return status_code, headers, chunk
    +
    +    def transform_chunk(self, block, finishing):
    +        if self._chunking:
    +            # Don't write out empty chunks because that means END-OF-STREAM
    +            # with chunked encoding
    +            if block:
    +                block = utf8("%x" % len(block)) + b"\r\n" + block + b"\r\n"
    +            if finishing:
    +                block += b"0\r\n\r\n"
    +        return block
    +
    +
    +def authenticated(method):
    +    """Decorate methods with this to require that the user be logged in.
    +
    +    If the user is not logged in, they will be redirected to the configured
    +    `login url `.
    +    """
    +    @functools.wraps(method)
    +    def wrapper(self, *args, **kwargs):
    +        if not self.current_user:
    +            if self.request.method in ("GET", "HEAD"):
    +                url = self.get_login_url()
    +                if "?" not in url:
    +                    if urlparse.urlsplit(url).scheme:
    +                        # if login url is absolute, make next absolute too
    +                        next_url = self.request.full_url()
    +                    else:
    +                        next_url = self.request.uri
    +                    url += "?" + urlencode(dict(next=next_url))
    +                self.redirect(url)
    +                return
    +            raise HTTPError(403)
    +        return method(self, *args, **kwargs)
    +    return wrapper
    +
    +
    +class UIModule(object):
    +    """A re-usable, modular UI unit on a page.
    +
    +    UI modules often execute additional queries, and they can include
    +    additional CSS and JavaScript that will be included in the output
    +    page, which is automatically inserted on page render.
    +    """
    +    def __init__(self, handler):
    +        self.handler = handler
    +        self.request = handler.request
    +        self.ui = handler.ui
    +        self.current_user = handler.current_user
    +        self.locale = handler.locale
    +
    +    def render(self, *args, **kwargs):
    +        """Overridden in subclasses to return this module's output."""
    +        raise NotImplementedError()
    +
    +    def embedded_javascript(self):
    +        """Returns a JavaScript string that will be embedded in the page."""
    +        return None
    +
    +    def javascript_files(self):
    +        """Returns a list of JavaScript files required by this module."""
    +        return None
    +
    +    def embedded_css(self):
    +        """Returns a CSS string that will be embedded in the page."""
    +        return None
    +
    +    def css_files(self):
    +        """Returns a list of CSS files required by this module."""
    +        return None
    +
    +    def html_head(self):
    +        """Returns a CSS string that will be put in the  element"""
    +        return None
    +
    +    def html_body(self):
    +        """Returns an HTML string that will be put in the  element"""
    +        return None
    +
    +    def render_string(self, path, **kwargs):
    +        """Renders a template and returns it as a string."""
    +        return self.handler.render_string(path, **kwargs)
    +
    +
    +class _linkify(UIModule):
    +    def render(self, text, **kwargs):
    +        return escape.linkify(text, **kwargs)
    +
    +
    +class _xsrf_form_html(UIModule):
    +    def render(self):
    +        return self.handler.xsrf_form_html()
    +
    +
    +class TemplateModule(UIModule):
    +    """UIModule that simply renders the given template.
    +
    +    {% module Template("foo.html") %} is similar to {% include "foo.html" %},
    +    but the module version gets its own namespace (with kwargs passed to
    +    Template()) instead of inheriting the outer template's namespace.
    +
    +    Templates rendered through this module also get access to UIModule's
    +    automatic javascript/css features.  Simply call set_resources
    +    inside the template and give it keyword arguments corresponding to
    +    the methods on UIModule: {{ set_resources(js_files=static_url("my.js")) }}
    +    Note that these resources are output once per template file, not once
    +    per instantiation of the template, so they must not depend on
    +    any arguments to the template.
    +    """
    +    def __init__(self, handler):
    +        super(TemplateModule, self).__init__(handler)
    +        # keep resources in both a list and a dict to preserve order
    +        self._resource_list = []
    +        self._resource_dict = {}
    +
    +    def render(self, path, **kwargs):
    +        def set_resources(**kwargs):
    +            if path not in self._resource_dict:
    +                self._resource_list.append(kwargs)
    +                self._resource_dict[path] = kwargs
    +            else:
    +                if self._resource_dict[path] != kwargs:
    +                    raise ValueError("set_resources called with different "
    +                                     "resources for the same template")
    +            return ""
    +        return self.render_string(path, set_resources=set_resources,
    +                                  **kwargs)
    +
    +    def _get_resources(self, key):
    +        return (r[key] for r in self._resource_list if key in r)
    +
    +    def embedded_javascript(self):
    +        return "\n".join(self._get_resources("embedded_javascript"))
    +
    +    def javascript_files(self):
    +        result = []
    +        for f in self._get_resources("javascript_files"):
    +            if isinstance(f, (unicode_type, bytes_type)):
    +                result.append(f)
    +            else:
    +                result.extend(f)
    +        return result
    +
    +    def embedded_css(self):
    +        return "\n".join(self._get_resources("embedded_css"))
    +
    +    def css_files(self):
    +        result = []
    +        for f in self._get_resources("css_files"):
    +            if isinstance(f, (unicode_type, bytes_type)):
    +                result.append(f)
    +            else:
    +                result.extend(f)
    +        return result
    +
    +    def html_head(self):
    +        return "".join(self._get_resources("html_head"))
    +
    +    def html_body(self):
    +        return "".join(self._get_resources("html_body"))
    +
    +
    +class _UIModuleNamespace(object):
    +    """Lazy namespace which creates UIModule proxies bound to a handler."""
    +    def __init__(self, handler, ui_modules):
    +        self.handler = handler
    +        self.ui_modules = ui_modules
    +
    +    def __getitem__(self, key):
    +        return self.handler._ui_module(key, self.ui_modules[key])
    +
    +    def __getattr__(self, key):
    +        try:
    +            return self[key]
    +        except KeyError as e:
    +            raise AttributeError(str(e))
    +
    +
    +class URLSpec(object):
    +    """Specifies mappings between URLs and handlers."""
    +    def __init__(self, pattern, handler_class, kwargs=None, name=None):
    +        """Parameters:
    +
    +        * ``pattern``: Regular expression to be matched.  Any groups
    +          in the regex will be passed in to the handler's get/post/etc
    +          methods as arguments.
    +
    +        * ``handler_class``: `RequestHandler` subclass to be invoked.
    +
    +        * ``kwargs`` (optional): A dictionary of additional arguments
    +          to be passed to the handler's constructor.
    +
    +        * ``name`` (optional): A name for this handler.  Used by
    +          `Application.reverse_url`.
    +        """
    +        if not pattern.endswith('$'):
    +            pattern += '$'
    +        self.regex = re.compile(pattern)
    +        assert len(self.regex.groupindex) in (0, self.regex.groups), \
    +            ("groups in url regexes must either be all named or all "
    +             "positional: %r" % self.regex.pattern)
    +        self.handler_class = handler_class
    +        self.kwargs = kwargs or {}
    +        self.name = name
    +        self._path, self._group_count = self._find_groups()
    +
    +    def __repr__(self):
    +        return '%s(%r, %s, kwargs=%r, name=%r)' % \
    +            (self.__class__.__name__, self.regex.pattern,
    +             self.handler_class, self.kwargs, self.name)
    +
    +    def _find_groups(self):
    +        """Returns a tuple (reverse string, group count) for a url.
    +
    +        For example: Given the url pattern /([0-9]{4})/([a-z-]+)/, this method
    +        would return ('/%s/%s/', 2).
    +        """
    +        pattern = self.regex.pattern
    +        if pattern.startswith('^'):
    +            pattern = pattern[1:]
    +        if pattern.endswith('$'):
    +            pattern = pattern[:-1]
    +
    +        if self.regex.groups != pattern.count('('):
    +            # The pattern is too complicated for our simplistic matching,
    +            # so we can't support reversing it.
    +            return (None, None)
    +
    +        pieces = []
    +        for fragment in pattern.split('('):
    +            if ')' in fragment:
    +                paren_loc = fragment.index(')')
    +                if paren_loc >= 0:
    +                    pieces.append('%s' + fragment[paren_loc + 1:])
    +            else:
    +                pieces.append(fragment)
    +
    +        return (''.join(pieces), self.regex.groups)
    +
    +    def reverse(self, *args):
    +        assert self._path is not None, \
    +            "Cannot reverse url regex " + self.regex.pattern
    +        assert len(args) == self._group_count, "required number of arguments "\
    +            "not found"
    +        if not len(args):
    +            return self._path
    +        converted_args = []
    +        for a in args:
    +            if not isinstance(a, (unicode_type, bytes_type)):
    +                a = str(a)
    +            converted_args.append(escape.url_escape(utf8(a), plus=False))
    +        return self._path % tuple(converted_args)
    +
    +url = URLSpec
    +
    +
    +if hasattr(hmac, 'compare_digest'):  # python 3.3
    +    _time_independent_equals = hmac.compare_digest
    +else:
    +    def _time_independent_equals(a, b):
    +        if len(a) != len(b):
    +            return False
    +        result = 0
    +        if isinstance(a[0], int):  # python3 byte strings
    +            for x, y in zip(a, b):
    +                result |= x ^ y
    +        else:  # python2
    +            for x, y in zip(a, b):
    +                result |= ord(x) ^ ord(y)
    +        return result == 0
    +
    +
    +def create_signed_value(secret, name, value):
    +    timestamp = utf8(str(int(time.time())))
    +    value = base64.b64encode(utf8(value))
    +    signature = _create_signature(secret, name, value, timestamp)
    +    value = b"|".join([value, timestamp, signature])
    +    return value
    +
    +
    +def decode_signed_value(secret, name, value, max_age_days=31):
    +    if not value:
    +        return None
    +    parts = utf8(value).split(b"|")
    +    if len(parts) != 3:
    +        return None
    +    signature = _create_signature(secret, name, parts[0], parts[1])
    +    if not _time_independent_equals(parts[2], signature):
    +        gen_log.warning("Invalid cookie signature %r", value)
    +        return None
    +    timestamp = int(parts[1])
    +    if timestamp < time.time() - max_age_days * 86400:
    +        gen_log.warning("Expired cookie %r", value)
    +        return None
    +    if timestamp > time.time() + 31 * 86400:
    +        # _cookie_signature does not hash a delimiter between the
    +        # parts of the cookie, so an attacker could transfer trailing
    +        # digits from the payload to the timestamp without altering the
    +        # signature.  For backwards compatibility, sanity-check timestamp
    +        # here instead of modifying _cookie_signature.
    +        gen_log.warning("Cookie timestamp in future; possible tampering %r", value)
    +        return None
    +    if parts[1].startswith(b"0"):
    +        gen_log.warning("Tampered cookie %r", value)
    +        return None
    +    try:
    +        return base64.b64decode(parts[0])
    +    except Exception:
    +        return None
    +
    +
    +def _create_signature(secret, *parts):
    +    hash = hmac.new(utf8(secret), digestmod=hashlib.sha1)
    +    for part in parts:
    +        hash.update(utf8(part))
    +    return utf8(hash.hexdigest())
    diff --git a/lib/tornado-3.1.1/tornado/websocket.py b/lib/tornado-3.1.1/tornado/websocket.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/websocket.py
    @@ -0,0 +1,862 @@
    +"""Implementation of the WebSocket protocol.
    +
    +`WebSockets `_ allow for bidirectional
    +communication between the browser and server.
    +
    +.. warning::
    +
    +   The WebSocket protocol was recently finalized as `RFC 6455
    +   `_ and is not yet supported in
    +   all browsers.  Refer to http://caniuse.com/websockets for details
    +   on compatibility.  In addition, during development the protocol
    +   went through several incompatible versions, and some browsers only
    +   support older versions.  By default this module only supports the
    +   latest version of the protocol, but optional support for an older
    +   version (known as "draft 76" or "hixie-76") can be enabled by
    +   overriding `WebSocketHandler.allow_draft76` (see that method's
    +   documentation for caveats).
    +"""
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +# Author: Jacob Kristhammar, 2010
    +
    +import array
    +import base64
    +import collections
    +import functools
    +import hashlib
    +import os
    +import struct
    +import time
    +import tornado.escape
    +import tornado.web
    +
    +from tornado.concurrent import Future
    +from tornado.escape import utf8, native_str
    +from tornado import httpclient
    +from tornado.ioloop import IOLoop
    +from tornado.iostream import StreamClosedError
    +from tornado.log import gen_log, app_log
    +from tornado.netutil import Resolver
    +from tornado import simple_httpclient
    +from tornado.util import bytes_type, unicode_type
    +
    +try:
    +    xrange  # py2
    +except NameError:
    +    xrange = range  # py3
    +
    +
    +class WebSocketError(Exception):
    +    pass
    +
    +
    +class WebSocketHandler(tornado.web.RequestHandler):
    +    """Subclass this class to create a basic WebSocket handler.
    +
    +    Override `on_message` to handle incoming messages, and use
    +    `write_message` to send messages to the client. You can also
    +    override `open` and `on_close` to handle opened and closed
    +    connections.
    +
    +    See http://dev.w3.org/html5/websockets/ for details on the
    +    JavaScript interface.  The protocol is specified at
    +    http://tools.ietf.org/html/rfc6455.
    +
    +    Here is an example WebSocket handler that echos back all received messages
    +    back to the client::
    +
    +      class EchoWebSocket(websocket.WebSocketHandler):
    +          def open(self):
    +              print "WebSocket opened"
    +
    +          def on_message(self, message):
    +              self.write_message(u"You said: " + message)
    +
    +          def on_close(self):
    +              print "WebSocket closed"
    +
    +    WebSockets are not standard HTTP connections. The "handshake" is
    +    HTTP, but after the handshake, the protocol is
    +    message-based. Consequently, most of the Tornado HTTP facilities
    +    are not available in handlers of this type. The only communication
    +    methods available to you are `write_message()`, `ping()`, and
    +    `close()`. Likewise, your request handler class should implement
    +    `open()` method rather than ``get()`` or ``post()``.
    +
    +    If you map the handler above to ``/websocket`` in your application, you can
    +    invoke it in JavaScript with::
    +
    +      var ws = new WebSocket("ws://localhost:8888/websocket");
    +      ws.onopen = function() {
    +         ws.send("Hello, world");
    +      };
    +      ws.onmessage = function (evt) {
    +         alert(evt.data);
    +      };
    +
    +    This script pops up an alert box that says "You said: Hello, world".
    +    """
    +    def __init__(self, application, request, **kwargs):
    +        tornado.web.RequestHandler.__init__(self, application, request,
    +                                            **kwargs)
    +        self.stream = request.connection.stream
    +        self.ws_connection = None
    +
    +    def _execute(self, transforms, *args, **kwargs):
    +        self.open_args = args
    +        self.open_kwargs = kwargs
    +
    +        # Websocket only supports GET method
    +        if self.request.method != 'GET':
    +            self.stream.write(tornado.escape.utf8(
    +                "HTTP/1.1 405 Method Not Allowed\r\n\r\n"
    +            ))
    +            self.stream.close()
    +            return
    +
    +        # Upgrade header should be present and should be equal to WebSocket
    +        if self.request.headers.get("Upgrade", "").lower() != 'websocket':
    +            self.stream.write(tornado.escape.utf8(
    +                "HTTP/1.1 400 Bad Request\r\n\r\n"
    +                "Can \"Upgrade\" only to \"WebSocket\"."
    +            ))
    +            self.stream.close()
    +            return
    +
    +        # Connection header should be upgrade. Some proxy servers/load balancers
    +        # might mess with it.
    +        headers = self.request.headers
    +        connection = map(lambda s: s.strip().lower(), headers.get("Connection", "").split(","))
    +        if 'upgrade' not in connection:
    +            self.stream.write(tornado.escape.utf8(
    +                "HTTP/1.1 400 Bad Request\r\n\r\n"
    +                "\"Connection\" must be \"Upgrade\"."
    +            ))
    +            self.stream.close()
    +            return
    +
    +        # The difference between version 8 and 13 is that in 8 the
    +        # client sends a "Sec-Websocket-Origin" header and in 13 it's
    +        # simply "Origin".
    +        if self.request.headers.get("Sec-WebSocket-Version") in ("7", "8", "13"):
    +            self.ws_connection = WebSocketProtocol13(self)
    +            self.ws_connection.accept_connection()
    +        elif (self.allow_draft76() and
    +              "Sec-WebSocket-Version" not in self.request.headers):
    +            self.ws_connection = WebSocketProtocol76(self)
    +            self.ws_connection.accept_connection()
    +        else:
    +            self.stream.write(tornado.escape.utf8(
    +                "HTTP/1.1 426 Upgrade Required\r\n"
    +                "Sec-WebSocket-Version: 8\r\n\r\n"))
    +            self.stream.close()
    +
    +    def write_message(self, message, binary=False):
    +        """Sends the given message to the client of this Web Socket.
    +
    +        The message may be either a string or a dict (which will be
    +        encoded as json).  If the ``binary`` argument is false, the
    +        message will be sent as utf8; in binary mode any byte string
    +        is allowed.
    +        """
    +        if isinstance(message, dict):
    +            message = tornado.escape.json_encode(message)
    +        self.ws_connection.write_message(message, binary=binary)
    +
    +    def select_subprotocol(self, subprotocols):
    +        """Invoked when a new WebSocket requests specific subprotocols.
    +
    +        ``subprotocols`` is a list of strings identifying the
    +        subprotocols proposed by the client.  This method may be
    +        overridden to return one of those strings to select it, or
    +        ``None`` to not select a subprotocol.  Failure to select a
    +        subprotocol does not automatically abort the connection,
    +        although clients may close the connection if none of their
    +        proposed subprotocols was selected.
    +        """
    +        return None
    +
    +    def open(self):
    +        """Invoked when a new WebSocket is opened.
    +
    +        The arguments to `open` are extracted from the `tornado.web.URLSpec`
    +        regular expression, just like the arguments to
    +        `tornado.web.RequestHandler.get`.
    +        """
    +        pass
    +
    +    def on_message(self, message):
    +        """Handle incoming messages on the WebSocket
    +
    +        This method must be overridden.
    +        """
    +        raise NotImplementedError
    +
    +    def ping(self, data):
    +        """Send ping frame to the remote end."""
    +        self.ws_connection.write_ping(data)
    +
    +    def on_pong(self, data):
    +        """Invoked when the response to a ping frame is received."""
    +        pass
    +
    +    def on_close(self):
    +        """Invoked when the WebSocket is closed."""
    +        pass
    +
    +    def close(self):
    +        """Closes this Web Socket.
    +
    +        Once the close handshake is successful the socket will be closed.
    +        """
    +        self.ws_connection.close()
    +        self.ws_connection = None
    +
    +    def allow_draft76(self):
    +        """Override to enable support for the older "draft76" protocol.
    +
    +        The draft76 version of the websocket protocol is disabled by
    +        default due to security concerns, but it can be enabled by
    +        overriding this method to return True.
    +
    +        Connections using the draft76 protocol do not support the
    +        ``binary=True`` flag to `write_message`.
    +
    +        Support for the draft76 protocol is deprecated and will be
    +        removed in a future version of Tornado.
    +        """
    +        return False
    +
    +    def set_nodelay(self, value):
    +        """Set the no-delay flag for this stream.
    +
    +        By default, small messages may be delayed and/or combined to minimize
    +        the number of packets sent.  This can sometimes cause 200-500ms delays
    +        due to the interaction between Nagle's algorithm and TCP delayed
    +        ACKs.  To reduce this delay (at the expense of possibly increasing
    +        bandwidth usage), call ``self.set_nodelay(True)`` once the websocket
    +        connection is established.
    +
    +        See `.BaseIOStream.set_nodelay` for additional details.
    +
    +        .. versionadded:: 3.1
    +        """
    +        self.stream.set_nodelay(value)
    +
    +    def get_websocket_scheme(self):
    +        """Return the url scheme used for this request, either "ws" or "wss".
    +
    +        This is normally decided by HTTPServer, but applications
    +        may wish to override this if they are using an SSL proxy
    +        that does not provide the X-Scheme header as understood
    +        by HTTPServer.
    +
    +        Note that this is only used by the draft76 protocol.
    +        """
    +        return "wss" if self.request.protocol == "https" else "ws"
    +
    +    def async_callback(self, callback, *args, **kwargs):
    +        """Obsolete - catches exceptions from the wrapped function.
    +
    +        This function is normally unncecessary thanks to
    +        `tornado.stack_context`.
    +        """
    +        return self.ws_connection.async_callback(callback, *args, **kwargs)
    +
    +    def _not_supported(self, *args, **kwargs):
    +        raise Exception("Method not supported for Web Sockets")
    +
    +    def on_connection_close(self):
    +        if self.ws_connection:
    +            self.ws_connection.on_connection_close()
    +            self.ws_connection = None
    +            self.on_close()
    +
    +
    +for method in ["write", "redirect", "set_header", "send_error", "set_cookie",
    +               "set_status", "flush", "finish"]:
    +    setattr(WebSocketHandler, method, WebSocketHandler._not_supported)
    +
    +
    +class WebSocketProtocol(object):
    +    """Base class for WebSocket protocol versions.
    +    """
    +    def __init__(self, handler):
    +        self.handler = handler
    +        self.request = handler.request
    +        self.stream = handler.stream
    +        self.client_terminated = False
    +        self.server_terminated = False
    +
    +    def async_callback(self, callback, *args, **kwargs):
    +        """Wrap callbacks with this if they are used on asynchronous requests.
    +
    +        Catches exceptions properly and closes this WebSocket if an exception
    +        is uncaught.
    +        """
    +        if args or kwargs:
    +            callback = functools.partial(callback, *args, **kwargs)
    +
    +        def wrapper(*args, **kwargs):
    +            try:
    +                return callback(*args, **kwargs)
    +            except Exception:
    +                app_log.error("Uncaught exception in %s",
    +                              self.request.path, exc_info=True)
    +                self._abort()
    +        return wrapper
    +
    +    def on_connection_close(self):
    +        self._abort()
    +
    +    def _abort(self):
    +        """Instantly aborts the WebSocket connection by closing the socket"""
    +        self.client_terminated = True
    +        self.server_terminated = True
    +        self.stream.close()  # forcibly tear down the connection
    +        self.close()  # let the subclass cleanup
    +
    +
    +class WebSocketProtocol76(WebSocketProtocol):
    +    """Implementation of the WebSockets protocol, version hixie-76.
    +
    +    This class provides basic functionality to process WebSockets requests as
    +    specified in
    +    http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76
    +    """
    +    def __init__(self, handler):
    +        WebSocketProtocol.__init__(self, handler)
    +        self.challenge = None
    +        self._waiting = None
    +
    +    def accept_connection(self):
    +        try:
    +            self._handle_websocket_headers()
    +        except ValueError:
    +            gen_log.debug("Malformed WebSocket request received")
    +            self._abort()
    +            return
    +
    +        scheme = self.handler.get_websocket_scheme()
    +
    +        # draft76 only allows a single subprotocol
    +        subprotocol_header = ''
    +        subprotocol = self.request.headers.get("Sec-WebSocket-Protocol", None)
    +        if subprotocol:
    +            selected = self.handler.select_subprotocol([subprotocol])
    +            if selected:
    +                assert selected == subprotocol
    +                subprotocol_header = "Sec-WebSocket-Protocol: %s\r\n" % selected
    +
    +        # Write the initial headers before attempting to read the challenge.
    +        # This is necessary when using proxies (such as HAProxy), which
    +        # need to see the Upgrade headers before passing through the
    +        # non-HTTP traffic that follows.
    +        self.stream.write(tornado.escape.utf8(
    +            "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
    +            "Upgrade: WebSocket\r\n"
    +            "Connection: Upgrade\r\n"
    +            "Server: TornadoServer/%(version)s\r\n"
    +            "Sec-WebSocket-Origin: %(origin)s\r\n"
    +            "Sec-WebSocket-Location: %(scheme)s://%(host)s%(uri)s\r\n"
    +            "%(subprotocol)s"
    +            "\r\n" % (dict(
    +            version=tornado.version,
    +            origin=self.request.headers["Origin"],
    +            scheme=scheme,
    +            host=self.request.host,
    +            uri=self.request.uri,
    +            subprotocol=subprotocol_header))))
    +        self.stream.read_bytes(8, self._handle_challenge)
    +
    +    def challenge_response(self, challenge):
    +        """Generates the challenge response that's needed in the handshake
    +
    +        The challenge parameter should be the raw bytes as sent from the
    +        client.
    +        """
    +        key_1 = self.request.headers.get("Sec-Websocket-Key1")
    +        key_2 = self.request.headers.get("Sec-Websocket-Key2")
    +        try:
    +            part_1 = self._calculate_part(key_1)
    +            part_2 = self._calculate_part(key_2)
    +        except ValueError:
    +            raise ValueError("Invalid Keys/Challenge")
    +        return self._generate_challenge_response(part_1, part_2, challenge)
    +
    +    def _handle_challenge(self, challenge):
    +        try:
    +            challenge_response = self.challenge_response(challenge)
    +        except ValueError:
    +            gen_log.debug("Malformed key data in WebSocket request")
    +            self._abort()
    +            return
    +        self._write_response(challenge_response)
    +
    +    def _write_response(self, challenge):
    +        self.stream.write(challenge)
    +        self.async_callback(self.handler.open)(*self.handler.open_args, **self.handler.open_kwargs)
    +        self._receive_message()
    +
    +    def _handle_websocket_headers(self):
    +        """Verifies all invariant- and required headers
    +
    +        If a header is missing or have an incorrect value ValueError will be
    +        raised
    +        """
    +        fields = ("Origin", "Host", "Sec-Websocket-Key1",
    +                  "Sec-Websocket-Key2")
    +        if not all(map(lambda f: self.request.headers.get(f), fields)):
    +            raise ValueError("Missing/Invalid WebSocket headers")
    +
    +    def _calculate_part(self, key):
    +        """Processes the key headers and calculates their key value.
    +
    +        Raises ValueError when feed invalid key."""
    +        # pyflakes complains about variable reuse if both of these lines use 'c'
    +        number = int(''.join(c for c in key if c.isdigit()))
    +        spaces = len([c2 for c2 in key if c2.isspace()])
    +        try:
    +            key_number = number // spaces
    +        except (ValueError, ZeroDivisionError):
    +            raise ValueError
    +        return struct.pack(">I", key_number)
    +
    +    def _generate_challenge_response(self, part_1, part_2, part_3):
    +        m = hashlib.md5()
    +        m.update(part_1)
    +        m.update(part_2)
    +        m.update(part_3)
    +        return m.digest()
    +
    +    def _receive_message(self):
    +        self.stream.read_bytes(1, self._on_frame_type)
    +
    +    def _on_frame_type(self, byte):
    +        frame_type = ord(byte)
    +        if frame_type == 0x00:
    +            self.stream.read_until(b"\xff", self._on_end_delimiter)
    +        elif frame_type == 0xff:
    +            self.stream.read_bytes(1, self._on_length_indicator)
    +        else:
    +            self._abort()
    +
    +    def _on_end_delimiter(self, frame):
    +        if not self.client_terminated:
    +            self.async_callback(self.handler.on_message)(
    +                frame[:-1].decode("utf-8", "replace"))
    +        if not self.client_terminated:
    +            self._receive_message()
    +
    +    def _on_length_indicator(self, byte):
    +        if ord(byte) != 0x00:
    +            self._abort()
    +            return
    +        self.client_terminated = True
    +        self.close()
    +
    +    def write_message(self, message, binary=False):
    +        """Sends the given message to the client of this Web Socket."""
    +        if binary:
    +            raise ValueError(
    +                "Binary messages not supported by this version of websockets")
    +        if isinstance(message, unicode_type):
    +            message = message.encode("utf-8")
    +        assert isinstance(message, bytes_type)
    +        self.stream.write(b"\x00" + message + b"\xff")
    +
    +    def write_ping(self, data):
    +        """Send ping frame."""
    +        raise ValueError("Ping messages not supported by this version of websockets")
    +
    +    def close(self):
    +        """Closes the WebSocket connection."""
    +        if not self.server_terminated:
    +            if not self.stream.closed():
    +                self.stream.write("\xff\x00")
    +            self.server_terminated = True
    +        if self.client_terminated:
    +            if self._waiting is not None:
    +                self.stream.io_loop.remove_timeout(self._waiting)
    +            self._waiting = None
    +            self.stream.close()
    +        elif self._waiting is None:
    +            self._waiting = self.stream.io_loop.add_timeout(
    +                time.time() + 5, self._abort)
    +
    +
    +class WebSocketProtocol13(WebSocketProtocol):
    +    """Implementation of the WebSocket protocol from RFC 6455.
    +
    +    This class supports versions 7 and 8 of the protocol in addition to the
    +    final version 13.
    +    """
    +    def __init__(self, handler, mask_outgoing=False):
    +        WebSocketProtocol.__init__(self, handler)
    +        self.mask_outgoing = mask_outgoing
    +        self._final_frame = False
    +        self._frame_opcode = None
    +        self._masked_frame = None
    +        self._frame_mask = None
    +        self._frame_length = None
    +        self._fragmented_message_buffer = None
    +        self._fragmented_message_opcode = None
    +        self._waiting = None
    +
    +    def accept_connection(self):
    +        try:
    +            self._handle_websocket_headers()
    +            self._accept_connection()
    +        except ValueError:
    +            gen_log.debug("Malformed WebSocket request received", exc_info=True)
    +            self._abort()
    +            return
    +
    +    def _handle_websocket_headers(self):
    +        """Verifies all invariant- and required headers
    +
    +        If a header is missing or have an incorrect value ValueError will be
    +        raised
    +        """
    +        fields = ("Host", "Sec-Websocket-Key", "Sec-Websocket-Version")
    +        if not all(map(lambda f: self.request.headers.get(f), fields)):
    +            raise ValueError("Missing/Invalid WebSocket headers")
    +
    +    @staticmethod
    +    def compute_accept_value(key):
    +        """Computes the value for the Sec-WebSocket-Accept header,
    +        given the value for Sec-WebSocket-Key.
    +        """
    +        sha1 = hashlib.sha1()
    +        sha1.update(utf8(key))
    +        sha1.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")  # Magic value
    +        return native_str(base64.b64encode(sha1.digest()))
    +
    +    def _challenge_response(self):
    +        return WebSocketProtocol13.compute_accept_value(
    +            self.request.headers.get("Sec-Websocket-Key"))
    +
    +    def _accept_connection(self):
    +        subprotocol_header = ''
    +        subprotocols = self.request.headers.get("Sec-WebSocket-Protocol", '')
    +        subprotocols = [s.strip() for s in subprotocols.split(',')]
    +        if subprotocols:
    +            selected = self.handler.select_subprotocol(subprotocols)
    +            if selected:
    +                assert selected in subprotocols
    +                subprotocol_header = "Sec-WebSocket-Protocol: %s\r\n" % selected
    +
    +        self.stream.write(tornado.escape.utf8(
    +            "HTTP/1.1 101 Switching Protocols\r\n"
    +            "Upgrade: websocket\r\n"
    +            "Connection: Upgrade\r\n"
    +            "Sec-WebSocket-Accept: %s\r\n"
    +            "%s"
    +            "\r\n" % (self._challenge_response(), subprotocol_header)))
    +
    +        self.async_callback(self.handler.open)(*self.handler.open_args, **self.handler.open_kwargs)
    +        self._receive_frame()
    +
    +    def _write_frame(self, fin, opcode, data):
    +        if fin:
    +            finbit = 0x80
    +        else:
    +            finbit = 0
    +        frame = struct.pack("B", finbit | opcode)
    +        l = len(data)
    +        if self.mask_outgoing:
    +            mask_bit = 0x80
    +        else:
    +            mask_bit = 0
    +        if l < 126:
    +            frame += struct.pack("B", l | mask_bit)
    +        elif l <= 0xFFFF:
    +            frame += struct.pack("!BH", 126 | mask_bit, l)
    +        else:
    +            frame += struct.pack("!BQ", 127 | mask_bit, l)
    +        if self.mask_outgoing:
    +            mask = os.urandom(4)
    +            data = mask + self._apply_mask(mask, data)
    +        frame += data
    +        self.stream.write(frame)
    +
    +    def write_message(self, message, binary=False):
    +        """Sends the given message to the client of this Web Socket."""
    +        if binary:
    +            opcode = 0x2
    +        else:
    +            opcode = 0x1
    +        message = tornado.escape.utf8(message)
    +        assert isinstance(message, bytes_type)
    +        try:
    +            self._write_frame(True, opcode, message)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def write_ping(self, data):
    +        """Send ping frame."""
    +        assert isinstance(data, bytes_type)
    +        self._write_frame(True, 0x9, data)
    +
    +    def _receive_frame(self):
    +        try:
    +            self.stream.read_bytes(2, self._on_frame_start)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def _on_frame_start(self, data):
    +        header, payloadlen = struct.unpack("BB", data)
    +        self._final_frame = header & 0x80
    +        reserved_bits = header & 0x70
    +        self._frame_opcode = header & 0xf
    +        self._frame_opcode_is_control = self._frame_opcode & 0x8
    +        if reserved_bits:
    +            # client is using as-yet-undefined extensions; abort
    +            self._abort()
    +            return
    +        self._masked_frame = bool(payloadlen & 0x80)
    +        payloadlen = payloadlen & 0x7f
    +        if self._frame_opcode_is_control and payloadlen >= 126:
    +            # control frames must have payload < 126
    +            self._abort()
    +            return
    +        try:
    +            if payloadlen < 126:
    +                self._frame_length = payloadlen
    +                if self._masked_frame:
    +                    self.stream.read_bytes(4, self._on_masking_key)
    +                else:
    +                    self.stream.read_bytes(self._frame_length, self._on_frame_data)
    +            elif payloadlen == 126:
    +                self.stream.read_bytes(2, self._on_frame_length_16)
    +            elif payloadlen == 127:
    +                self.stream.read_bytes(8, self._on_frame_length_64)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def _on_frame_length_16(self, data):
    +        self._frame_length = struct.unpack("!H", data)[0]
    +        try:
    +            if self._masked_frame:
    +                self.stream.read_bytes(4, self._on_masking_key)
    +            else:
    +                self.stream.read_bytes(self._frame_length, self._on_frame_data)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def _on_frame_length_64(self, data):
    +        self._frame_length = struct.unpack("!Q", data)[0]
    +        try:
    +            if self._masked_frame:
    +                self.stream.read_bytes(4, self._on_masking_key)
    +            else:
    +                self.stream.read_bytes(self._frame_length, self._on_frame_data)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def _on_masking_key(self, data):
    +        self._frame_mask = data
    +        try:
    +            self.stream.read_bytes(self._frame_length, self._on_masked_frame_data)
    +        except StreamClosedError:
    +            self._abort()
    +
    +    def _apply_mask(self, mask, data):
    +        mask = array.array("B", mask)
    +        unmasked = array.array("B", data)
    +        for i in xrange(len(data)):
    +            unmasked[i] = unmasked[i] ^ mask[i % 4]
    +        if hasattr(unmasked, 'tobytes'):
    +            # tostring was deprecated in py32.  It hasn't been removed,
    +            # but since we turn on deprecation warnings in our tests
    +            # we need to use the right one.
    +            return unmasked.tobytes()
    +        else:
    +            return unmasked.tostring()
    +
    +    def _on_masked_frame_data(self, data):
    +        self._on_frame_data(self._apply_mask(self._frame_mask, data))
    +
    +    def _on_frame_data(self, data):
    +        if self._frame_opcode_is_control:
    +            # control frames may be interleaved with a series of fragmented
    +            # data frames, so control frames must not interact with
    +            # self._fragmented_*
    +            if not self._final_frame:
    +                # control frames must not be fragmented
    +                self._abort()
    +                return
    +            opcode = self._frame_opcode
    +        elif self._frame_opcode == 0:  # continuation frame
    +            if self._fragmented_message_buffer is None:
    +                # nothing to continue
    +                self._abort()
    +                return
    +            self._fragmented_message_buffer += data
    +            if self._final_frame:
    +                opcode = self._fragmented_message_opcode
    +                data = self._fragmented_message_buffer
    +                self._fragmented_message_buffer = None
    +        else:  # start of new data message
    +            if self._fragmented_message_buffer is not None:
    +                # can't start new message until the old one is finished
    +                self._abort()
    +                return
    +            if self._final_frame:
    +                opcode = self._frame_opcode
    +            else:
    +                self._fragmented_message_opcode = self._frame_opcode
    +                self._fragmented_message_buffer = data
    +
    +        if self._final_frame:
    +            self._handle_message(opcode, data)
    +
    +        if not self.client_terminated:
    +            self._receive_frame()
    +
    +    def _handle_message(self, opcode, data):
    +        if self.client_terminated:
    +            return
    +
    +        if opcode == 0x1:
    +            # UTF-8 data
    +            try:
    +                decoded = data.decode("utf-8")
    +            except UnicodeDecodeError:
    +                self._abort()
    +                return
    +            self.async_callback(self.handler.on_message)(decoded)
    +        elif opcode == 0x2:
    +            # Binary data
    +            self.async_callback(self.handler.on_message)(data)
    +        elif opcode == 0x8:
    +            # Close
    +            self.client_terminated = True
    +            self.close()
    +        elif opcode == 0x9:
    +            # Ping
    +            self._write_frame(True, 0xA, data)
    +        elif opcode == 0xA:
    +            # Pong
    +            self.async_callback(self.handler.on_pong)(data)
    +        else:
    +            self._abort()
    +
    +    def close(self):
    +        """Closes the WebSocket connection."""
    +        if not self.server_terminated:
    +            if not self.stream.closed():
    +                self._write_frame(True, 0x8, b"")
    +            self.server_terminated = True
    +        if self.client_terminated:
    +            if self._waiting is not None:
    +                self.stream.io_loop.remove_timeout(self._waiting)
    +                self._waiting = None
    +            self.stream.close()
    +        elif self._waiting is None:
    +            # Give the client a few seconds to complete a clean shutdown,
    +            # otherwise just close the connection.
    +            self._waiting = self.stream.io_loop.add_timeout(
    +                self.stream.io_loop.time() + 5, self._abort)
    +
    +
    +class WebSocketClientConnection(simple_httpclient._HTTPConnection):
    +    """WebSocket client connection."""
    +    def __init__(self, io_loop, request):
    +        self.connect_future = Future()
    +        self.read_future = None
    +        self.read_queue = collections.deque()
    +        self.key = base64.b64encode(os.urandom(16))
    +
    +        scheme, sep, rest = request.url.partition(':')
    +        scheme = {'ws': 'http', 'wss': 'https'}[scheme]
    +        request.url = scheme + sep + rest
    +        request.headers.update({
    +            'Upgrade': 'websocket',
    +            'Connection': 'Upgrade',
    +            'Sec-WebSocket-Key': self.key,
    +            'Sec-WebSocket-Version': '13',
    +        })
    +
    +        self.resolver = Resolver(io_loop=io_loop)
    +        super(WebSocketClientConnection, self).__init__(
    +            io_loop, None, request, lambda: None, self._on_http_response,
    +            104857600, self.resolver)
    +
    +    def _on_close(self):
    +        self.on_message(None)
    +        self.resolver.close()
    +
    +    def _on_http_response(self, response):
    +        if not self.connect_future.done():
    +            if response.error:
    +                self.connect_future.set_exception(response.error)
    +            else:
    +                self.connect_future.set_exception(WebSocketError(
    +                    "Non-websocket response"))
    +
    +    def _handle_1xx(self, code):
    +        assert code == 101
    +        assert self.headers['Upgrade'].lower() == 'websocket'
    +        assert self.headers['Connection'].lower() == 'upgrade'
    +        accept = WebSocketProtocol13.compute_accept_value(self.key)
    +        assert self.headers['Sec-Websocket-Accept'] == accept
    +
    +        self.protocol = WebSocketProtocol13(self, mask_outgoing=True)
    +        self.protocol._receive_frame()
    +
    +        if self._timeout is not None:
    +            self.io_loop.remove_timeout(self._timeout)
    +            self._timeout = None
    +
    +        self.connect_future.set_result(self)
    +
    +    def write_message(self, message, binary=False):
    +        """Sends a message to the WebSocket server."""
    +        self.protocol.write_message(message, binary)
    +
    +    def read_message(self, callback=None):
    +        """Reads a message from the WebSocket server.
    +
    +        Returns a future whose result is the message, or None
    +        if the connection is closed.  If a callback argument
    +        is given it will be called with the future when it is
    +        ready.
    +        """
    +        assert self.read_future is None
    +        future = Future()
    +        if self.read_queue:
    +            future.set_result(self.read_queue.popleft())
    +        else:
    +            self.read_future = future
    +        if callback is not None:
    +            self.io_loop.add_future(future, callback)
    +        return future
    +
    +    def on_message(self, message):
    +        if self.read_future is not None:
    +            self.read_future.set_result(message)
    +            self.read_future = None
    +        else:
    +            self.read_queue.append(message)
    +
    +    def on_pong(self, data):
    +        pass
    +
    +
    +def websocket_connect(url, io_loop=None, callback=None, connect_timeout=None):
    +    """Client-side websocket support.
    +
    +    Takes a url and returns a Future whose result is a
    +    `WebSocketClientConnection`.
    +    """
    +    if io_loop is None:
    +        io_loop = IOLoop.current()
    +    request = httpclient.HTTPRequest(url, connect_timeout=connect_timeout)
    +    request = httpclient._RequestProxy(
    +        request, httpclient.HTTPRequest._DEFAULTS)
    +    conn = WebSocketClientConnection(io_loop, request)
    +    if callback is not None:
    +        io_loop.add_future(conn.connect_future, callback)
    +    return conn.connect_future
    diff --git a/lib/tornado-3.1.1/tornado/wsgi.py b/lib/tornado-3.1.1/tornado/wsgi.py
    new file mode 100644
    --- /dev/null
    +++ b/lib/tornado-3.1.1/tornado/wsgi.py
    @@ -0,0 +1,320 @@
    +#!/usr/bin/env python
    +#
    +# Copyright 2009 Facebook
    +#
    +# Licensed under the Apache License, Version 2.0 (the "License"); you may
    +# not use this file except in compliance with the License. You may obtain
    +# a copy of the License at
    +#
    +#     http://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing, software
    +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    +# License for the specific language governing permissions and limitations
    +# under the License.
    +
    +"""WSGI support for the Tornado web framework.
    +
    +WSGI is the Python standard for web servers, and allows for interoperability
    +between Tornado and other Python web frameworks and servers.  This module
    +provides WSGI support in two ways:
    +
    +* `WSGIApplication` is a version of `tornado.web.Application` that can run
    +  inside a WSGI server.  This is useful for running a Tornado app on another
    +  HTTP server, such as Google App Engine.  See the `WSGIApplication` class
    +  documentation for limitations that apply.
    +* `WSGIContainer` lets you run other WSGI applications and frameworks on the
    +  Tornado HTTP server.  For example, with this class you can mix Django
    +  and Tornado handlers in a single server.
    +"""
    +
    +from __future__ import absolute_import, division, print_function, with_statement
    +
    +import sys
    +import time
    +import tornado
    +
    +from tornado import escape
    +from tornado import httputil
    +from tornado.log import access_log
    +from tornado import web
    +from tornado.escape import native_str, parse_qs_bytes
    +from tornado.util import bytes_type, unicode_type
    +
    +try:
    +    from io import BytesIO  # python 3
    +except ImportError:
    +    from cStringIO import StringIO as BytesIO  # python 2
    +
    +try:
    +    import Cookie  # py2
    +except ImportError:
    +    import http.cookies as Cookie  # py3
    +
    +try:
    +    import urllib.parse as urllib_parse  # py3
    +except ImportError:
    +    import urllib as urllib_parse
    +
    +# PEP 3333 specifies that WSGI on python 3 generally deals with byte strings
    +# that are smuggled inside objects of type unicode (via the latin1 encoding).
    +# These functions are like those in the tornado.escape module, but defined
    +# here to minimize the temptation to use them in non-wsgi contexts.
    +if str is unicode_type:
    +    def to_wsgi_str(s):
    +        assert isinstance(s, bytes_type)
    +        return s.decode('latin1')
    +
    +    def from_wsgi_str(s):
    +        assert isinstance(s, str)
    +        return s.encode('latin1')
    +else:
    +    def to_wsgi_str(s):
    +        assert isinstance(s, bytes_type)
    +        return s
    +
    +    def from_wsgi_str(s):
    +        assert isinstance(s, str)
    +        return s
    +
    +
    +class WSGIApplication(web.Application):
    +    """A WSGI equivalent of `tornado.web.Application`.
    +
    +    `WSGIApplication` is very similar to `tornado.web.Application`,
    +    except no asynchronous methods are supported (since WSGI does not
    +    support non-blocking requests properly). If you call
    +    ``self.flush()`` or other asynchronous methods in your request
    +    handlers running in a `WSGIApplication`, we throw an exception.
    +
    +    Example usage::
    +
    +        import tornado.web
    +        import tornado.wsgi
    +        import wsgiref.simple_server
    +
    +        class MainHandler(tornado.web.RequestHandler):
    +            def get(self):
    +                self.write("Hello, world")
    +
    +        if __name__ == "__main__":
    +            application = tornado.wsgi.WSGIApplication([
    +                (r"/", MainHandler),
    +            ])
    +            server = wsgiref.simple_server.make_server('', 8888, application)
    +            server.serve_forever()
    +
    +    See the `appengine demo
    +    `_
    +    for an example of using this module to run a Tornado app on Google
    +    App Engine.
    +
    +    WSGI applications use the same `.RequestHandler` class, but not
    +    ``@asynchronous`` methods or ``flush()``.  This means that it is
    +    not possible to use `.AsyncHTTPClient`, or the `tornado.auth` or
    +    `tornado.websocket` modules.
    +    """
    +    def __init__(self, handlers=None, default_host="", **settings):
    +        web.Application.__init__(self, handlers, default_host, transforms=[],
    +                                 wsgi=True, **settings)
    +
    +    def __call__(self, environ, start_response):
    +        handler = web.Application.__call__(self, HTTPRequest(environ))
    +        assert handler._finished
    +        reason = handler._reason
    +        status = str(handler._status_code) + " " + reason
    +        headers = list(handler._headers.get_all())
    +        if hasattr(handler, "_new_cookie"):
    +            for cookie in handler._new_cookie.values():
    +                headers.append(("Set-Cookie", cookie.OutputString(None)))
    +        start_response(status,
    +                       [(native_str(k), native_str(v)) for (k, v) in headers])
    +        return handler._write_buffer
    +
    +
    +class HTTPRequest(object):
    +    """Mimics `tornado.httpserver.HTTPRequest` for WSGI applications."""
    +    def __init__(self, environ):
    +        """Parses the given WSGI environment to construct the request."""
    +        self.method = environ["REQUEST_METHOD"]
    +        self.path = urllib_parse.quote(from_wsgi_str(environ.get("SCRIPT_NAME", "")))
    +        self.path += urllib_parse.quote(from_wsgi_str(environ.get("PATH_INFO", "")))
    +        self.uri = self.path
    +        self.arguments = {}
    +        self.query = environ.get("QUERY_STRING", "")
    +        if self.query:
    +            self.uri += "?" + self.query
    +            self.arguments = parse_qs_bytes(native_str(self.query),
    +                                            keep_blank_values=True)
    +        self.version = "HTTP/1.1"
    +        self.headers = httputil.HTTPHeaders()
    +        if environ.get("CONTENT_TYPE"):
    +            self.headers["Content-Type"] = environ["CONTENT_TYPE"]
    +        if environ.get("CONTENT_LENGTH"):
    +            self.headers["Content-Length"] = environ["CONTENT_LENGTH"]
    +        for key in environ:
    +            if key.startswith("HTTP_"):
    +                self.headers[key[5:].replace("_", "-")] = environ[key]
    +        if self.headers.get("Content-Length"):
    +            self.body = environ["wsgi.input"].read(
    +                int(self.headers["Content-Length"]))
    +        else:
    +            self.body = ""
    +        self.protocol = environ["wsgi.url_scheme"]
    +        self.remote_ip = environ.get("REMOTE_ADDR", "")
    +        if environ.get("HTTP_HOST"):
    +            self.host = environ["HTTP_HOST"]
    +        else:
    +            self.host = environ["SERVER_NAME"]
    +
    +        # Parse request body
    +        self.files = {}
    +        httputil.parse_body_arguments(self.headers.get("Content-Type", ""),
    +                                      self.body, self.arguments, self.files)
    +
    +        self._start_time = time.time()
    +        self._finish_time = None
    +
    +    def supports_http_1_1(self):
    +        """Returns True if this request supports HTTP/1.1 semantics"""
    +        return self.version == "HTTP/1.1"
    +
    +    @property
    +    def cookies(self):
    +        """A dictionary of Cookie.Morsel objects."""
    +        if not hasattr(self, "_cookies"):
    +            self._cookies = Cookie.SimpleCookie()
    +            if "Cookie" in self.headers:
    +                try:
    +                    self._cookies.load(
    +                        native_str(self.headers["Cookie"]))
    +                except Exception:
    +                    self._cookies = None
    +        return self._cookies
    +
    +    def full_url(self):
    +        """Reconstructs the full URL for this request."""
    +        return self.protocol + "://" + self.host + self.uri
    +
    +    def request_time(self):
    +        """Returns the amount of time it took for this request to execute."""
    +        if self._finish_time is None:
    +            return time.time() - self._start_time
    +        else:
    +            return self._finish_time - self._start_time
    +
    +
    +class WSGIContainer(object):
    +    r"""Makes a WSGI-compatible function runnable on Tornado's HTTP server.
    +
    +    Wrap a WSGI function in a `WSGIContainer` and pass it to `.HTTPServer` to
    +    run it. For example::
    +
    +        def simple_app(environ, start_response):
    +            status = "200 OK"
    +            response_headers = [("Content-type", "text/plain")]
    +            start_response(status, response_headers)
    +            return ["Hello world!\n"]
    +
    +        container = tornado.wsgi.WSGIContainer(simple_app)
    +        http_server = tornado.httpserver.HTTPServer(container)
    +        http_server.listen(8888)
    +        tornado.ioloop.IOLoop.instance().start()
    +
    +    This class is intended to let other frameworks (Django, web.py, etc)
    +    run on the Tornado HTTP server and I/O loop.
    +
    +    The `tornado.web.FallbackHandler` class is often useful for mixing
    +    Tornado and WSGI apps in the same server.  See
    +    https://github.com/bdarnell/django-tornado-demo for a complete example.
    +    """
    +    def __init__(self, wsgi_application):
    +        self.wsgi_application = wsgi_application
    +
    +    def __call__(self, request):
    +        data = {}
    +        response = []
    +
    +        def start_response(status, response_headers, exc_info=None):
    +            data["status"] = status
    +            data["headers"] = response_headers
    +            return response.append
    +        app_response = self.wsgi_application(
    +            WSGIContainer.environ(request), start_response)
    +        response.extend(app_response)
    +        body = b"".join(response)
    +        if hasattr(app_response, "close"):
    +            app_response.close()
    +        if not data:
    +            raise Exception("WSGI app did not call start_response")
    +
    +        status_code = int(data["status"].split()[0])
    +        headers = data["headers"]
    +        header_set = set(k.lower() for (k, v) in headers)
    +        body = escape.utf8(body)
    +        if status_code != 304:
    +            if "content-length" not in header_set:
    +                headers.append(("Content-Length", str(len(body))))
    +            if "content-type" not in header_set:
    +                headers.append(("Content-Type", "text/html; charset=UTF-8"))
    +        if "server" not in header_set:
    +            headers.append(("Server", "TornadoServer/%s" % tornado.version))
    +
    +        parts = [escape.utf8("HTTP/1.1 " + data["status"] + "\r\n")]
    +        for key, value in headers:
    +            parts.append(escape.utf8(key) + b": " + escape.utf8(value) + b"\r\n")
    +        parts.append(b"\r\n")
    +        parts.append(body)
    +        request.write(b"".join(parts))
    +        request.finish()
    +        self._log(status_code, request)
    +
    +    @staticmethod
    +    def environ(request):
    +        """Converts a `tornado.httpserver.HTTPRequest` to a WSGI environment.
    +        """
    +        hostport = request.host.split(":")
    +        if len(hostport) == 2:
    +            host = hostport[0]
    +            port = int(hostport[1])
    +        else:
    +            host = request.host
    +            port = 443 if request.protocol == "https" else 80
    +        environ = {
    +            "REQUEST_METHOD": request.method,
    +            "SCRIPT_NAME": "",
    +            "PATH_INFO": to_wsgi_str(escape.url_unescape(
    +            request.path, encoding=None, plus=False)),
    +            "QUERY_STRING": request.query,
    +            "REMOTE_ADDR": request.remote_ip,
    +            "SERVER_NAME": host,
    +            "SERVER_PORT": str(port),
    +            "SERVER_PROTOCOL": request.version,
    +            "wsgi.version": (1, 0),
    +            "wsgi.url_scheme": request.protocol,
    +            "wsgi.input": BytesIO(escape.utf8(request.body)),
    +            "wsgi.errors": sys.stderr,
    +            "wsgi.multithread": False,
    +            "wsgi.multiprocess": True,
    +            "wsgi.run_once": False,
    +        }
    +        if "Content-Type" in request.headers:
    +            environ["CONTENT_TYPE"] = request.headers.pop("Content-Type")
    +        if "Content-Length" in request.headers:
    +            environ["CONTENT_LENGTH"] = request.headers.pop("Content-Length")
    +        for key, value in request.headers.items():
    +            environ["HTTP_" + key.replace("-", "_").upper()] = value
    +        return environ
    +
    +    def _log(self, status_code, request):
    +        if status_code < 400:
    +            log_method = access_log.info
    +        elif status_code < 500:
    +            log_method = access_log.warning
    +        else:
    +            log_method = access_log.error
    +        request_time = 1000.0 * request.request_time()
    +        summary = request.method + " " + request.uri + " (" + \
    +            request.remote_ip + ")"
    +        log_method("%d %s %.2fms", status_code, summary, request_time)
    diff --git a/perf.py b/perf.py
    --- a/perf.py
    +++ b/perf.py
    @@ -1386,6 +1386,20 @@
         return SimpleBenchmark(MeasureChameleon, *args, **kwargs)
     
     
    +TORNADO_DIR = Relative("lib/tornado-3.1.1")
    +
    +
    +def MeasureTornadoHttp(python, options):
    +    bm_path = Relative("performance/bm_tornado_http.py", python, options)
    +    bm_env = {"PYTHONPATH": TORNADO_DIR}
    +    return MeasureGeneric(python, options, bm_path, bm_env, iteration_scaling=2)
    +
    +
    + at VersionRange()
    +def BM_Tornado_Http(*args, **kwargs):
    +    return SimpleBenchmark(MeasureTornadoHttp, *args, **kwargs)
    +
    +
     DJANGO_DIR = Relative("lib/django")
     
     
    diff --git a/performance/bm_tornado_http.py b/performance/bm_tornado_http.py
    new file mode 100644
    --- /dev/null
    +++ b/performance/bm_tornado_http.py
    @@ -0,0 +1,91 @@
    +#!/usr/bin/python
    +
    +"""Test the performance of simple HTTP serving and client using the Tornado
    +framework.
    +
    +A trivial "application" is generated which generates a number of chunks of
    +data as a HTTP response's body.
    +"""
    +
    +import optparse
    +import socket
    +import time
    +
    +from compat import xrange
    +import util
    +
    +from tornado.httpclient import AsyncHTTPClient
    +from tornado.httpserver import HTTPServer
    +from tornado.gen import coroutine, Task
    +from tornado.ioloop import IOLoop
    +from tornado.netutil import bind_sockets
    +from tornado.web import RequestHandler, Application
    +
    +
    +HOST = "127.0.0.1"
    +FAMILY = socket.AF_INET
    +
    +CHUNK = b"Hello world\n" * 1000
    +NCHUNKS = 5
    +
    +CONCURRENCY = 150
    +
    +
    +class MainHandler(RequestHandler):
    +    @coroutine
    +    def get(self):
    +        for i in range(NCHUNKS):
    +            self.write(CHUNK)
    +            yield Task(self.flush)
    +
    +    def compute_etag(self):
    +        # Overriden to avoid stressing hashlib in this benchmark
    +        return None
    +
    +
    +def make_application():
    +    return Application([
    +        (r"/", MainHandler),
    +    ])
    +
    +
    +def make_http_server(loop, request_handler):
    +    server = HTTPServer(request_handler, io_loop=loop)
    +    sockets = bind_sockets(0, HOST, family=FAMILY)
    +    assert len(sockets) == 1
    +    server.add_sockets(sockets)
    +    return sockets[0].getsockname()
    +
    +
    +def test_tornado(count):
    +    loop = IOLoop.instance()
    +    host, port = make_http_server(loop, make_application())
    +    url = "http://%s:%s/" % (host, port)
    +    times = []
    +
    +    @coroutine
    +    def main():
    +        client = AsyncHTTPClient()
    +        for i in xrange(count):
    +            t0 = time.time()
    +            futures = [client.fetch(url) for j in xrange(CONCURRENCY)]
    +            for fut in futures:
    +                resp = yield fut
    +                buf = resp.buffer
    +                buf.seek(0, 2)
    +                assert buf.tell() == len(CHUNK) * NCHUNKS
    +            t1 = time.time()
    +            times.append(t1 - t0)
    +
    +    loop.run_sync(main)
    +    return times
    +
    +
    +if __name__ == "__main__":
    +    parser = optparse.OptionParser(
    +        usage="%prog [options]",
    +        description=("Test the performance of HTTP requests with Tornado."))
    +    util.add_standard_options_to(parser)
    +    options, args = parser.parse_args()
    +
    +    util.run_benchmark(options, options.num_runs, test_tornado)
    
    -- 
    Repository URL: http://hg.python.org/benchmarks
    
    From python-checkins at python.org  Thu Oct 24 22:20:19 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 24 Oct 2013 22:20:19 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319369=3A_Optimize?=
     =?utf-8?b?ZCB0aGUgdXNhZ2Ugb2YgX19sZW5ndGhfaGludF9fKCku?=
    Message-ID: <3d5KZW0ml2z7Lns@mail.python.org>
    
    http://hg.python.org/cpython/rev/bffb49efc383
    changeset:   86602:bffb49efc383
    user:        Serhiy Storchaka 
    date:        Thu Oct 24 23:19:51 2013 +0300
    summary:
      Issue #19369: Optimized the usage of __length_hint__().
    
    files:
      Misc/NEWS          |   2 ++
      Objects/abstract.c |  18 ++++++++++--------
      2 files changed, 12 insertions(+), 8 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,8 @@
     Core and Builtins
     -----------------
     
    +- Issue #19369: Optimized the usage of __length_hint__().
    +
     - Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the
       Python executable and not removed by the linker's optimizer.
     
    diff --git a/Objects/abstract.c b/Objects/abstract.c
    --- a/Objects/abstract.c
    +++ b/Objects/abstract.c
    @@ -82,15 +82,17 @@
         PyObject *hint, *result;
         Py_ssize_t res;
         _Py_IDENTIFIER(__length_hint__);
    -    res = PyObject_Length(o);
    -    if (res < 0 && PyErr_Occurred()) {
    -        if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
    -            return -1;
    +    if (_PyObject_HasLen(o)) {
    +        res = PyObject_Length(o);
    +        if (res < 0 && PyErr_Occurred()) {
    +            if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
    +                return -1;
    +            }
    +            PyErr_Clear();
             }
    -        PyErr_Clear();
    -    }
    -    else {
    -        return res;
    +        else {
    +            return res;
    +        }
         }
         hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
         if (hint == NULL) {
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 24 22:24:50 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Thu, 24 Oct 2013 22:24:50 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319379=3A_Lazily_i?=
     =?utf-8?q?mport_linecache_in_the_warnings_module=2C_to_make_startup?=
    Message-ID: <3d5Kgk0cVGz7LpV@mail.python.org>
    
    http://hg.python.org/cpython/rev/8939c0196990
    changeset:   86603:8939c0196990
    user:        Antoine Pitrou 
    date:        Thu Oct 24 22:23:42 2013 +0200
    summary:
      Close #19379: Lazily import linecache in the warnings module, to make startup with warnings faster until a warning gets printed.
    
    files:
      Lib/warnings.py |  6 ++----
      Misc/NEWS       |  3 +++
      2 files changed, 5 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/warnings.py b/Lib/warnings.py
    --- a/Lib/warnings.py
    +++ b/Lib/warnings.py
    @@ -1,9 +1,5 @@
     """Python part of the warnings subsystem."""
     
    -# Note: function level imports should *not* be used
    -# in this module as it may cause import lock deadlock.
    -# See bug 683658.
    -import linecache
     import sys
     
     __all__ = ["warn", "showwarning", "formatwarning", "filterwarnings",
    @@ -21,6 +17,7 @@
     
     def formatwarning(message, category, filename, lineno, line=None):
         """Function to format a warning the standard way."""
    +    import linecache
         s =  "%s:%s: %s: %s\n" % (filename, lineno, category.__name__, message)
         line = linecache.getline(filename, lineno) if line is None else line
         if line:
    @@ -233,6 +230,7 @@
     
         # Prime the linecache for formatting, in case the
         # "file" is actually in a zipfile or something.
    +    import linecache
         linecache.getlines(filename, module_globals)
     
         if action == "error":
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -21,6 +21,9 @@
     Library
     -------
     
    +- Issue #19379: Lazily import linecache in the warnings module, to make
    +  startup with warnings faster until a warning gets printed.
    +
     - Issue #19327: Fixed the working of regular expressions with too big charset.
     
     - Issue #17400: New 'is_global' attribute for ipaddress to tell if an address
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From brett at python.org  Thu Oct 24 22:40:46 2013
    From: brett at python.org (Brett Cannon)
    Date: Thu, 24 Oct 2013 16:40:46 -0400
    Subject: [Python-checkins] cpython: Close #19379: Lazily import
     linecache in the warnings module, to make startup
    In-Reply-To: <3d5Kgk0cVGz7LpV@mail.python.org>
    References: <3d5Kgk0cVGz7LpV@mail.python.org>
    Message-ID: 
    
    The diff doesn't show an addition to BENCH_GROUPS. Maybe apps?
    
    
    On Thu, Oct 24, 2013 at 4:24 PM, antoine.pitrou
    wrote:
    
    > http://hg.python.org/cpython/rev/8939c0196990
    > changeset:   86603:8939c0196990
    > user:        Antoine Pitrou 
    > date:        Thu Oct 24 22:23:42 2013 +0200
    > summary:
    >   Close #19379: Lazily import linecache in the warnings module, to make
    > startup with warnings faster until a warning gets printed.
    >
    > files:
    >   Lib/warnings.py |  6 ++----
    >   Misc/NEWS       |  3 +++
    >   2 files changed, 5 insertions(+), 4 deletions(-)
    >
    >
    > diff --git a/Lib/warnings.py b/Lib/warnings.py
    > --- a/Lib/warnings.py
    > +++ b/Lib/warnings.py
    > @@ -1,9 +1,5 @@
    >  """Python part of the warnings subsystem."""
    >
    > -# Note: function level imports should *not* be used
    > -# in this module as it may cause import lock deadlock.
    > -# See bug 683658.
    > -import linecache
    >  import sys
    >
    >  __all__ = ["warn", "showwarning", "formatwarning", "filterwarnings",
    > @@ -21,6 +17,7 @@
    >
    >  def formatwarning(message, category, filename, lineno, line=None):
    >      """Function to format a warning the standard way."""
    > +    import linecache
    >      s =  "%s:%s: %s: %s\n" % (filename, lineno, category.__name__,
    > message)
    >      line = linecache.getline(filename, lineno) if line is None else line
    >      if line:
    > @@ -233,6 +230,7 @@
    >
    >      # Prime the linecache for formatting, in case the
    >      # "file" is actually in a zipfile or something.
    > +    import linecache
    >      linecache.getlines(filename, module_globals)
    >
    >      if action == "error":
    > diff --git a/Misc/NEWS b/Misc/NEWS
    > --- a/Misc/NEWS
    > +++ b/Misc/NEWS
    > @@ -21,6 +21,9 @@
    >  Library
    >  -------
    >
    > +- Issue #19379: Lazily import linecache in the warnings module, to make
    > +  startup with warnings faster until a warning gets printed.
    > +
    >  - Issue #19327: Fixed the working of regular expressions with too big
    > charset.
    >
    >  - Issue #17400: New 'is_global' attribute for ipaddress to tell if an
    > address
    >
    > --
    > Repository URL: http://hg.python.org/cpython
    >
    > _______________________________________________
    > Python-checkins mailing list
    > Python-checkins at python.org
    > https://mail.python.org/mailman/listinfo/python-checkins
    >
    >
    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: 
    
    From solipsis at pitrou.net  Thu Oct 24 22:49:55 2013
    From: solipsis at pitrou.net (Antoine Pitrou)
    Date: Thu, 24 Oct 2013 22:49:55 +0200
    Subject: [Python-checkins] cpython: Close #19379: Lazily import
     linecache in the warnings module, to make startup
    References: <3d5Kgk0cVGz7LpV@mail.python.org>
     
    Message-ID: <20131024224955.60eaa3d6@fsol>
    
    On Thu, 24 Oct 2013 16:40:46 -0400
    Brett Cannon  wrote:
    > The diff doesn't show an addition to BENCH_GROUPS. Maybe apps?
    
    I don't know, it seems "apps" is for whole-blown application usage,
    while the Tornado HTTP benchmark is quite synthetic: there are many
    things not in "apps", such as the Django and Mako benchmarks.
    
    (I suppose you meant to reply to the benchmarks checkin :-))
    
    Regards
    
    Antoine.
    
    
    > 
    > 
    > On Thu, Oct 24, 2013 at 4:24 PM, antoine.pitrou
    > wrote:
    > 
    > > http://hg.python.org/cpython/rev/8939c0196990
    > > changeset:   86603:8939c0196990
    > > user:        Antoine Pitrou 
    > > date:        Thu Oct 24 22:23:42 2013 +0200
    > > summary:
    > >   Close #19379: Lazily import linecache in the warnings module, to make
    > > startup with warnings faster until a warning gets printed.
    > >
    > > files:
    > >   Lib/warnings.py |  6 ++----
    > >   Misc/NEWS       |  3 +++
    > >   2 files changed, 5 insertions(+), 4 deletions(-)
    
    
    
    From python-checkins at python.org  Thu Oct 24 23:02:16 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 24 Oct 2013 23:02:16 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mjg3?=
     =?utf-8?q?=3A_Fixed_the_=22in=22_operator_of_dbm=2Endbm_databases_for_str?=
     =?utf-8?q?ing?=
    Message-ID: <3d5LVw0sTnz7LpR@mail.python.org>
    
    http://hg.python.org/cpython/rev/61ab0c6907f9
    changeset:   86604:61ab0c6907f9
    branch:      3.3
    parent:      86600:4431fa917f22
    user:        Serhiy Storchaka 
    date:        Thu Oct 24 23:59:28 2013 +0300
    summary:
      Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
    argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    
    files:
      Lib/test/test_dbm_ndbm.py |  1 +
      Misc/NEWS                 |  3 +++
      Modules/_dbmmodule.c      |  4 ++--
      3 files changed, 6 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/test/test_dbm_ndbm.py b/Lib/test/test_dbm_ndbm.py
    --- a/Lib/test/test_dbm_ndbm.py
    +++ b/Lib/test/test_dbm_ndbm.py
    @@ -24,6 +24,7 @@
             self.d[b'bytes'] = b'data'
             self.d['12345678910'] = '019237410982340912840198242'
             self.d.keys()
    +        self.assertIn('a', self.d)
             self.assertIn(b'a', self.d)
             self.assertEqual(self.d[b'bytes'], b'data')
             self.d.close()
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
    +  argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    +
     - Issue #19327: Fixed the working of regular expressions with too big charset.
     
     - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin
    diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
    --- a/Modules/_dbmmodule.c
    +++ b/Modules/_dbmmodule.c
    @@ -225,9 +225,9 @@
             if (key.dptr == NULL)
                 return -1;
         }
    -    if (!PyBytes_Check(arg)) {
    +    else if (!PyBytes_Check(arg)) {
             PyErr_Format(PyExc_TypeError,
    -                     "dbm key must be string, not %.100s",
    +                     "dbm key must be bytes or string, not %.100s",
                          arg->ob_type->tp_name);
             return -1;
         }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 24 23:02:17 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 24 Oct 2013 23:02:17 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_=2319287=3A_Fixed_the_=22in=22_operator_of_dbm=2En?=
     =?utf-8?q?dbm_databases_for_string?=
    Message-ID: <3d5LVx2l1fz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/cb82b4efa67b
    changeset:   86605:cb82b4efa67b
    parent:      86603:8939c0196990
    parent:      86604:61ab0c6907f9
    user:        Serhiy Storchaka 
    date:        Fri Oct 25 00:01:25 2013 +0300
    summary:
      Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
    argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    
    files:
      Lib/test/test_dbm_ndbm.py |  1 +
      Misc/NEWS                 |  3 +++
      Modules/_dbmmodule.c      |  4 ++--
      3 files changed, 6 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/test/test_dbm_ndbm.py b/Lib/test/test_dbm_ndbm.py
    --- a/Lib/test/test_dbm_ndbm.py
    +++ b/Lib/test/test_dbm_ndbm.py
    @@ -24,6 +24,7 @@
             self.d[b'bytes'] = b'data'
             self.d['12345678910'] = '019237410982340912840198242'
             self.d.keys()
    +        self.assertIn('a', self.d)
             self.assertIn(b'a', self.d)
             self.assertEqual(self.d[b'bytes'], b'data')
             self.d.close()
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,9 @@
     Core and Builtins
     -----------------
     
    +- Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
    +  argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    +
     - Issue #19369: Optimized the usage of __length_hint__().
     
     - Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the
    diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
    --- a/Modules/_dbmmodule.c
    +++ b/Modules/_dbmmodule.c
    @@ -221,9 +221,9 @@
             if (key.dptr == NULL)
                 return -1;
         }
    -    if (!PyBytes_Check(arg)) {
    +    else if (!PyBytes_Check(arg)) {
             PyErr_Format(PyExc_TypeError,
    -                     "dbm key must be string, not %.100s",
    +                     "dbm key must be bytes or string, not %.100s",
                          arg->ob_type->tp_name);
             return -1;
         }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 24 23:08:47 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 24 Oct 2013 23:08:47 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mjg4?=
     =?utf-8?q?=3A_Fixed_the_=22in=22_operator_of_dbm=2Egnu_databases_for_stri?=
     =?utf-8?q?ng?=
    Message-ID: <3d5LfR0wDLz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/09ed1b3b54f3
    changeset:   86606:09ed1b3b54f3
    branch:      3.3
    parent:      86604:61ab0c6907f9
    user:        Serhiy Storchaka 
    date:        Fri Oct 25 00:06:52 2013 +0300
    summary:
      Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
    argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    
    files:
      Lib/test/test_dbm_gnu.py |   1 +
      Misc/NEWS                |   3 +++
      Modules/_gdbmmodule.c    |  17 +++++++++++++----
      3 files changed, 17 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py
    --- a/Lib/test/test_dbm_gnu.py
    +++ b/Lib/test/test_dbm_gnu.py
    @@ -24,6 +24,7 @@
             self.g[b'bytes'] = b'data'
             key_set = set(self.g.keys())
             self.assertEqual(key_set, set([b'a', b'bytes', b'12345678910']))
    +        self.assertIn('a', self.g)
             self.assertIn(b'a', self.g)
             self.assertEqual(self.g[b'bytes'], b'data')
             key = self.g.firstkey()
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
    +  argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    +
     - Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
       argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
     
    diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
    --- a/Modules/_gdbmmodule.c
    +++ b/Modules/_gdbmmodule.c
    @@ -290,20 +290,29 @@
     {
         dbmobject *dp = (dbmobject *)self;
         datum key;
    +    Py_ssize_t size;
     
         if ((dp)->di_dbm == NULL) {
             PyErr_SetString(DbmError,
                             "GDBM object has already been closed");
             return -1;
         }
    -    if (!PyBytes_Check(arg)) {
    +    if (PyUnicode_Check(arg)) {
    +        key.dptr = PyUnicode_AsUTF8AndSize(arg, &size);
    +        key.dsize = size;
    +        if (key.dptr == NULL)
    +            return -1;
    +    }
    +    else if (!PyBytes_Check(arg)) {
             PyErr_Format(PyExc_TypeError,
    -                     "gdbm key must be bytes, not %.100s",
    +                     "gdbm key must be bytes or string, not %.100s",
                          arg->ob_type->tp_name);
             return -1;
         }
    -    key.dptr = PyBytes_AS_STRING(arg);
    -    key.dsize = PyBytes_GET_SIZE(arg);
    +    else {
    +        key.dptr = PyBytes_AS_STRING(arg);
    +        key.dsize = PyBytes_GET_SIZE(arg);
    +    }
         return gdbm_exists(dp->di_dbm, key);
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 24 23:08:48 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 24 Oct 2013 23:08:48 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_=2319288=3A_Fixed_the_=22in=22_operator_of_dbm=2Eg?=
     =?utf-8?q?nu_databases_for_string?=
    Message-ID: <3d5LfS2vgBz7LnH@mail.python.org>
    
    http://hg.python.org/cpython/rev/379372612f6d
    changeset:   86607:379372612f6d
    parent:      86605:cb82b4efa67b
    parent:      86606:09ed1b3b54f3
    user:        Serhiy Storchaka 
    date:        Fri Oct 25 00:08:13 2013 +0300
    summary:
      Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
    argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    
    files:
      Lib/test/test_dbm_gnu.py |   1 +
      Misc/NEWS                |   3 +++
      Modules/_gdbmmodule.c    |  17 +++++++++++++----
      3 files changed, 17 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py
    --- a/Lib/test/test_dbm_gnu.py
    +++ b/Lib/test/test_dbm_gnu.py
    @@ -24,6 +24,7 @@
             self.g[b'bytes'] = b'data'
             key_set = set(self.g.keys())
             self.assertEqual(key_set, set([b'a', b'bytes', b'12345678910']))
    +        self.assertIn('a', self.g)
             self.assertIn(b'a', self.g)
             self.assertEqual(self.g[b'bytes'], b'data')
             key = self.g.firstkey()
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,9 @@
     Core and Builtins
     -----------------
     
    +- Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
    +  argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
    +
     - Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
       argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
     
    diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
    --- a/Modules/_gdbmmodule.c
    +++ b/Modules/_gdbmmodule.c
    @@ -290,20 +290,29 @@
     {
         dbmobject *dp = (dbmobject *)self;
         datum key;
    +    Py_ssize_t size;
     
         if ((dp)->di_dbm == NULL) {
             PyErr_SetString(DbmError,
                             "GDBM object has already been closed");
             return -1;
         }
    -    if (!PyBytes_Check(arg)) {
    +    if (PyUnicode_Check(arg)) {
    +        key.dptr = PyUnicode_AsUTF8AndSize(arg, &size);
    +        key.dsize = size;
    +        if (key.dptr == NULL)
    +            return -1;
    +    }
    +    else if (!PyBytes_Check(arg)) {
             PyErr_Format(PyExc_TypeError,
    -                     "gdbm key must be bytes, not %.100s",
    +                     "gdbm key must be bytes or string, not %.100s",
                          arg->ob_type->tp_name);
             return -1;
         }
    -    key.dptr = PyBytes_AS_STRING(arg);
    -    key.dsize = PyBytes_GET_SIZE(arg);
    +    else {
    +        key.dptr = PyBytes_AS_STRING(arg);
    +        key.dsize = PyBytes_GET_SIZE(arg);
    +    }
         return gdbm_exists(dp->di_dbm, key);
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 02:11:35 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Fri, 25 Oct 2013 02:11:35 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_remove_unused_imports_from?=
    	=?utf-8?q?_statistics_module?=
    Message-ID: <3d5QjM23Gbz7LqS@mail.python.org>
    
    http://hg.python.org/cpython/rev/16357a6786cb
    changeset:   86608:16357a6786cb
    user:        Christian Heimes 
    date:        Fri Oct 25 02:11:17 2013 +0200
    summary:
      remove unused imports from statistics module
    
    files:
      Lib/statistics.py |  2 --
      1 files changed, 0 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/statistics.py b/Lib/statistics.py
    --- a/Lib/statistics.py
    +++ b/Lib/statistics.py
    @@ -101,8 +101,6 @@
     
     import collections
     import math
    -import numbers
    -import operator
     
     from fractions import Fraction
     from decimal import Decimal
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 07:31:19 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Fri, 25 Oct 2013 07:31:19 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_actual_dates_for_2=2E7=2E6?=
    Message-ID: <3d5YpH20BSz7Lk5@mail.python.org>
    
    http://hg.python.org/peps/rev/04c567f21081
    changeset:   5216:04c567f21081
    user:        Benjamin Peterson 
    date:        Fri Oct 25 01:31:14 2013 -0400
    summary:
      actual dates for 2.7.6
    
    files:
      pep-0373.txt |  5 ++++-
      1 files changed, 4 insertions(+), 1 deletions(-)
    
    
    diff --git a/pep-0373.txt b/pep-0373.txt
    --- a/pep-0373.txt
    +++ b/pep-0373.txt
    @@ -56,7 +56,10 @@
     
     Planned future release dates:
     
    -- 2.7.6 November 2013
    +- 2.7.6rc1 October 26 2013
    +- 2.7.6 November 2 2013
    +
    +
     - 2.7.7 May 2014
     - 2.7.8 November 2014
     - 2.7.9 May 2015
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From solipsis at pitrou.net  Fri Oct 25 07:37:30 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Fri, 25 Oct 2013 07:37:30 +0200
    Subject: [Python-checkins] Daily reference leaks (16357a6786cb): sum=4
    Message-ID: 
    
    results for 16357a6786cb on branch "default"
    --------------------------------------------
    
    test_site leaked [2, 0, 0] references, sum=2
    test_site leaked [2, 0, 0] memory blocks, sum=2
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogw0DCKn', '-x']
    
    From python-checkins at python.org  Fri Oct 25 08:31:30 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Fri, 25 Oct 2013 08:31:30 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316595=3A_prlimit?=
     =?utf-8?q?=28=29_needs_Linux_kernel_2=2E6=2E36+?=
    Message-ID: <3d5b7k0NChz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/87d41a5a9077
    changeset:   86609:87d41a5a9077
    user:        Christian Heimes 
    date:        Fri Oct 25 08:31:19 2013 +0200
    summary:
      Issue #16595: prlimit() needs Linux kernel 2.6.36+
    
    files:
      Doc/library/resource.rst  |  2 +-
      Lib/test/test_resource.py |  1 +
      2 files changed, 2 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst
    --- a/Doc/library/resource.rst
    +++ b/Doc/library/resource.rst
    @@ -90,7 +90,7 @@
        :exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for
        the process.
     
    -   Availability: Linux (glibc 2.13+)
    +   Availability: Linux 2.6.36 or later with glibc 2.13 or later
     
        .. versionadded:: 3.4
     
    diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py
    --- a/Lib/test/test_resource.py
    +++ b/Lib/test/test_resource.py
    @@ -141,6 +141,7 @@
     
     
         @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit')
    +    @support.requires_linux_version(2, 6, 36)
         def test_prlimit(self):
             self.assertRaises(TypeError, resource.prlimit)
             if os.geteuid() != 0:
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:22:03 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Fri, 25 Oct 2013 09:22:03 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_19384=3A_Fix_test=5F?=
     =?utf-8?q?py=5Fcompile_for_root_user=2C_patch_by_Claudiu_Popa=2E?=
    Message-ID: <3d5cG31HCrz7LlG@mail.python.org>
    
    http://hg.python.org/cpython/rev/e7b97822110f
    changeset:   86610:e7b97822110f
    user:        Christian Heimes 
    date:        Fri Oct 25 09:21:51 2013 +0200
    summary:
      Issue 19384: Fix test_py_compile for root user, patch by Claudiu Popa.
    
    files:
      Lib/test/test_py_compile.py |  3 +++
      Misc/NEWS                   |  5 +++++
      2 files changed, 8 insertions(+), 0 deletions(-)
    
    
    diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
    --- a/Lib/test/test_py_compile.py
    +++ b/Lib/test/test_py_compile.py
    @@ -3,6 +3,7 @@
     import py_compile
     import shutil
     import stat
    +import sys
     import tempfile
     import unittest
     
    @@ -75,6 +76,8 @@
             self.assertTrue(os.path.exists(self.pyc_path))
             self.assertFalse(os.path.exists(self.cache_path))
     
    +    @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
    +                     'non-root user required')
         @unittest.skipIf(os.name == 'nt',
                          'cannot control directory permissions on Windows')
         def test_exceptions_propagate(self):
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -74,6 +74,11 @@
     
     - Issue #17087: Improved the repr for regular expression match objects.
     
    +Tests
    +-----
    +
    +- Issue 19384: Fix test_py_compile for root user, patch by Claudiu Popa.
    +
     Build
     -----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:46 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:46 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE1ODQ6?=
     =?utf-8?q?_Provide_options_to_override_default_search_paths_for_Tcl_and_T?=
     =?utf-8?q?k?=
    Message-ID: <3d5cyf1QGRz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/e7474d4d85ca
    changeset:   86611:e7474d4d85ca
    branch:      2.7
    parent:      86599:d2bb0da45c93
    user:        Ned Deily 
    date:        Fri Oct 25 00:30:10 2013 -0700
    summary:
      Issue #1584: Provide options to override default search paths for Tcl and Tk
    when building _tkinter.  configure has two new options; if used, both must
    be specified:
    
      ./configure \
          --with-tcltk-includes="-I/opt/local/include" \
          --with-tcltk-libs="-L/opt/local/lib -ltcl8.5 -ltk8.5"
    
    In addition, the options can be overridden with make:
    
       make \
           TCLTK_INCLUDES="-I/opt/local/include" \
           TCLTK_LIBS="-L/opt/local/lib -ltcl8.6 -ltk8.6"
    
    files:
      Makefile.pre.in |   5 +++
      Misc/NEWS       |   3 ++
      configure       |  48 +++++++++++++++++++++++++++++++++++++
      configure.ac    |  28 +++++++++++++++++++++
      setup.py        |  43 ++++++++++++++++++++++++++++++++-
      5 files changed, 126 insertions(+), 1 deletions(-)
    
    
    diff --git a/Makefile.pre.in b/Makefile.pre.in
    --- a/Makefile.pre.in
    +++ b/Makefile.pre.in
    @@ -196,6 +196,10 @@
     _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
     HOST_GNU_TYPE=  @host@
     
    +# Tcl and Tk config info from --with-tcltk-includes and -libs options
    +TCLTK_INCLUDES=	@TCLTK_INCLUDES@
    +TCLTK_LIBS=	@TCLTK_LIBS@
    +
     # The task to run while instrument when building the profile-opt target
     PROFILE_TASK=	$(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
     #PROFILE_TASK=	$(srcdir)/Lib/test/regrtest.py
    @@ -456,6 +460,7 @@
     	    *) quiet="";; \
     	esac; \
     	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
    +		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
     		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
     
     # Build static library
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -280,6 +280,9 @@
       OS X 10.8 systems because the Apple-deprecated QuickDraw headers have
       been removed from Xcode 4.  Skip building it in this case.
     
    +- Issue #1584: Provide options to override default search paths for
    +  Tcl and Tk when building _tkinter.
    +
     IDLE
     ----
     
    diff --git a/configure b/configure
    --- a/configure
    +++ b/configure
    @@ -644,6 +644,8 @@
     USE_THREAD_MODULE
     SIGNAL_OBJS
     USE_SIGNAL_MODULE
    +TCLTK_LIBS
    +TCLTK_INCLUDES
     LIBFFI_INCLUDEDIR
     PKG_CONFIG
     SHLIBS
    @@ -786,6 +788,8 @@
     with_libs
     with_system_expat
     with_system_ffi
    +with_tcltk_includes
    +with_tcltk_libs
     with_dbmliborder
     with_signal_module
     with_dec_threads
    @@ -1459,6 +1463,10 @@
       --with-system-expat     build pyexpat module using an installed expat
                               library
       --with-system-ffi       build _ctypes module using an installed ffi library
    +  --with-tcltk-includes='-I...'
    +                          override search for Tcl and Tk include files
    +  --with-tcltk-libs='-L...'
    +                          override search for Tcl and Tk libs
       --with-dbmliborder=db1:db2:...
                               order to check db backends for dbm. Valid value is a
                               colon separated string with the backend names
    @@ -8954,6 +8962,46 @@
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_system_ffi" >&5
     $as_echo "$with_system_ffi" >&6; }
     
    +# Check for --with-tcltk-includes=path and --with-tcltk-libs=path
    +
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tcltk-includes" >&5
    +$as_echo_n "checking for --with-tcltk-includes... " >&6; }
    +
    +# Check whether --with-tcltk-includes was given.
    +if test "${with_tcltk_includes+set}" = set; then :
    +  withval=$with_tcltk_includes;
    +else
    +  with_tcltk_includes="default"
    +fi
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_tcltk_includes" >&5
    +$as_echo "$with_tcltk_includes" >&6; }
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tcltk-libs" >&5
    +$as_echo_n "checking for --with-tcltk-libs... " >&6; }
    +
    +# Check whether --with-tcltk-libs was given.
    +if test "${with_tcltk_libs+set}" = set; then :
    +  withval=$with_tcltk_libs;
    +else
    +  with_tcltk_libs="default"
    +fi
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_tcltk_libs" >&5
    +$as_echo "$with_tcltk_libs" >&6; }
    +if test "x$with_tcltk_includes" = xdefault || test "x$with_tcltk_libs" = xdefault
    +then
    +  if test "x$with_tcltk_includes" != "x$with_tcltk_libs"
    +  then
    +    as_fn_error $? "use both --with-tcltk-includes='...' and --with-tcltk-libs='...' or neither" "$LINENO" 5
    +  fi
    +  TCLTK_INCLUDES=""
    +  TCLTK_LIBS=""
    +else
    +  TCLTK_INCLUDES="$with_tcltk_includes"
    +  TCLTK_LIBS="$with_tcltk_libs"
    +fi
    +
     # Check for --with-dbmliborder
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dbmliborder" >&5
     $as_echo_n "checking for --with-dbmliborder... " >&6; }
    diff --git a/configure.ac b/configure.ac
    --- a/configure.ac
    +++ b/configure.ac
    @@ -2289,6 +2289,34 @@
     
     AC_MSG_RESULT($with_system_ffi)
     
    +# Check for --with-tcltk-includes=path and --with-tcltk-libs=path
    +AC_SUBST(TCLTK_INCLUDES)
    +AC_SUBST(TCLTK_LIBS)
    +AC_MSG_CHECKING(for --with-tcltk-includes)
    +AC_ARG_WITH(tcltk-includes,
    +            AS_HELP_STRING([--with-tcltk-includes='-I...'], [override search for Tcl and Tk include files]),
    +            [],
    +            [with_tcltk_includes="default"])
    +AC_MSG_RESULT($with_tcltk_includes)
    +AC_MSG_CHECKING(for --with-tcltk-libs)
    +AC_ARG_WITH(tcltk-libs,
    +            AS_HELP_STRING([--with-tcltk-libs='-L...'], [override search for Tcl and Tk libs]),
    +            [],
    +            [with_tcltk_libs="default"])
    +AC_MSG_RESULT($with_tcltk_libs)
    +if test "x$with_tcltk_includes" = xdefault || test "x$with_tcltk_libs" = xdefault
    +then
    +  if test "x$with_tcltk_includes" != "x$with_tcltk_libs"
    +  then
    +    AC_MSG_ERROR([use both --with-tcltk-includes='...' and --with-tcltk-libs='...' or neither])
    +  fi
    +  TCLTK_INCLUDES=""
    +  TCLTK_LIBS=""
    +else
    +  TCLTK_INCLUDES="$with_tcltk_includes"
    +  TCLTK_LIBS="$with_tcltk_libs"
    +fi
    +
     # Check for --with-dbmliborder
     AC_MSG_CHECKING(for --with-dbmliborder)
     AC_ARG_WITH(dbmliborder,
    diff --git a/setup.py b/setup.py
    --- a/setup.py
    +++ b/setup.py
    @@ -1729,6 +1729,41 @@
     
             return missing
     
    +    def detect_tkinter_explicitly(self):
    +        # Build _tkinter using explicit locations for Tcl/Tk.
    +        #
    +        # This is enabled when both arguments are given to ./configure:
    +        #
    +        #     --with-tcltk-includes="-I/path/to/tclincludes \
    +        #                            -I/path/to/tkincludes"
    +        #     --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
    +        #                        -L/path/to/tklibs -ltkm.n"
    +        #
    +        # These values can also be specified or overriden via make:
    +        #    make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
    +        #
    +        # This can be useful for building and testing tkinter with multiple
    +        # versions of Tcl/Tk.  Note that a build of Tk depends on a particular
    +        # build of Tcl so you need to specify both arguments and use care when
    +        # overriding.
    +
    +        # The _TCLTK variables are created in the Makefile sharedmods target.
    +        tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
    +        tcltk_libs = os.environ.get('_TCLTK_LIBS')
    +        if not (tcltk_includes and tcltk_libs):
    +            # Resume default configuration search.
    +            return 0
    +
    +        extra_compile_args = tcltk_includes.split()
    +        extra_link_args = tcltk_libs.split()
    +        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
    +                        define_macros=[('WITH_APPINIT', 1)],
    +                        extra_compile_args = extra_compile_args,
    +                        extra_link_args = extra_link_args,
    +                        )
    +        self.extensions.append(ext)
    +        return 1
    +
         def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
             # The _tkinter module, using frameworks. Since frameworks are quite
             # different the UNIX search logic is not sharable.
    @@ -1811,10 +1846,16 @@
             self.extensions.append(ext)
             return 1
     
    -
         def detect_tkinter(self, inc_dirs, lib_dirs):
             # The _tkinter module.
     
    +        # Check whether --with-tcltk-includes and --with-tcltk-libs were
    +        # configured or passed into the make target.  If so, use these values
    +        # to build tkinter and bypass the searches for Tcl and TK in standard
    +        # locations.
    +        if self.detect_tkinter_explicitly():
    +            return
    +
             # Rather than complicate the code below, detecting and building
             # AquaTk is a separate method. Only one Tkinter will be built on
             # Darwin - either AquaTk, if it is found, or X11 based Tk.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:47 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:47 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE1NjYz?=
     =?utf-8?q?=3A_Tcl/Tk_8=2E5=2E15_is_now_included_with_the_OS_X_10=2E6+?=
    Message-ID: <3d5cyg517Nz7LlG@mail.python.org>
    
    http://hg.python.org/cpython/rev/19b512bfc8d2
    changeset:   86612:19b512bfc8d2
    branch:      2.7
    user:        Ned Deily 
    date:        Fri Oct 25 00:40:07 2013 -0700
    summary:
      Issue #15663: Tcl/Tk 8.5.15 is now included with the OS X 10.6+
    64-bit/32-bit installer for 10.6+.  It is no longer necessary
    to install a third-party version of Tcl/Tk 8.5 to work around the
    problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
    and later releases.
    
    files:
      Mac/BuildScript/README.txt            |  28 +++++-
      Mac/BuildScript/build-installer.py    |  77 ++++++++++++++-
      Mac/BuildScript/resources/ReadMe.txt  |  47 ++++++--
      Mac/BuildScript/resources/Welcome.rtf |  18 +--
      Misc/NEWS                             |   6 +
      5 files changed, 149 insertions(+), 27 deletions(-)
    
    
    diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
    --- a/Mac/BuildScript/README.txt
    +++ b/Mac/BuildScript/README.txt
    @@ -57,13 +57,39 @@
     
             * NCurses 5.9 (http://bugs.python.org/issue15037)
             * SQLite 3.7.13
    +        * Tcl 8.5.15
     
         - uses system-supplied versions of third-party libraries
     
             * readline module links with Apple BSD editline (libedit)
             * builds Oracle Sleepycat DB 4.8 (Python 2.x only)
     
    -    - requires ActiveState Tcl/Tk 8.5.9 (or later) to be installed for building
    +    - requires ActiveState Tcl/Tk 8.5.14 (or later) to be installed for building
    +
    +        * Beginning with Python 2.7.6, this installer now includes its own
    +          private copy of Tcl and Tk 8.5.15 libraries and thus is no longer
    +          dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with
    +          OS X 10.6 or on installing a newer third-party version of Tcl/Tk
    +          in /Library/Frameworks, such as from ActiveState.  If it is
    +          necessary to fallback to using a third-party Tcl/Tk because of
    +          a problem with the private Tcl/Tk, there is a backup version of
    +          the _tkinter extension included which will dynamically link to
    +          Tcl and Tk frameworks in /Library/Frameworks as in previous releases.
    +          To enable (for all users of this Python 2.7)::
    +
    +              sudo bash
    +              cd /Library/Frameworks/Python.framework/Versions/2.7
    +              cd ./lib/python2.7/lib-dynload
    +              cp -p _tkinter.so.framework _tkinter.so
    +              exit
    +
    +          To restore using Python's private versions of Tcl and Tk::
    +
    +              sudo bash
    +              cd /Library/Frameworks/Python.framework/Versions/2.7
    +              cd ./lib/python2.7/lib-dynload
    +              cp -p _tkinter.so.private _tkinter.so
    +              exit
     
         - recommended build environment:
     
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -193,6 +193,44 @@
     
         LT_10_5 = bool(DEPTARGET < '10.5')
     
    +    if DEPTARGET > '10.5':
    +        result.extend([
    +          dict(
    +              name="Tcl 8.5.15",
    +              url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tcl8.5.15-src.tar.gz",
    +              checksum='f3df162f92c69b254079c4d0af7a690f',
    +              buildDir="unix",
    +              configure_pre=[
    +                    '--enable-shared',
    +                    '--enable-threads',
    +                    '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),),
    +              ],
    +              useLDFlags=False,
    +              install='make TCL_LIBRARY=%(TCL_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
    +                  "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
    +                  "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
    +                  },
    +              ),
    +          dict(
    +              name="Tk 8.5.15",
    +              url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
    +              checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              buildDir="unix",
    +              configure_pre=[
    +                    '--enable-aqua',
    +                    '--enable-shared',
    +                    '--enable-threads',
    +                    '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),),
    +              ],
    +              useLDFlags=False,
    +              install='make TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
    +                  "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
    +                  "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
    +                  "TK_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tk8.5'%(getVersion())),
    +                  },
    +                ),
    +        ])
    +
         if getVersionTuple() >= (3, 3):
             result.extend([
               dict(
    @@ -526,6 +564,20 @@
                     % frameworks['Tk'],
                 ]
     
    +    # For 10.6+ builds, we build two versions of _tkinter:
    +    #    - the traditional version (renamed to _tkinter.so.framework) linked
    +    #       with /Library/Frameworks/{Tcl,Tk}.framework
    +    #    - the default version linked with our private copies of Tcl and Tk
    +    if DEPTARGET > '10.5':
    +        EXPECTED_SHARED_LIBS['_tkinter.so.framework'] = \
    +            EXPECTED_SHARED_LIBS['_tkinter.so']
    +        EXPECTED_SHARED_LIBS['_tkinter.so'] = [
    +                "/Library/Frameworks/Python.framework/Versions/%s/lib/libtcl%s.dylib"
    +                    % (getVersion(), frameworks['Tcl']),
    +                "/Library/Frameworks/Python.framework/Versions/%s/lib/libtk%s.dylib"
    +                    % (getVersion(), frameworks['Tk']),
    +                ]
    +
         # Remove inherited environment variables which might influence build
         environ_var_prefixes = ['CPATH', 'C_INCLUDE_', 'DYLD_', 'LANG', 'LC_',
                                 'LD_', 'LIBRARY_', 'PATH', 'PYTHON']
    @@ -634,13 +686,19 @@
     
         XXX: This function assumes that archives contain a toplevel directory
         that is has the same name as the basename of the archive. This is
    -    save enough for anything we use.
    +    safe enough for almost anything we use.  Unfortunately, it does not
    +    work for current Tcl and Tk source releases where the basename of
    +    the archive ends with "-src" but the uncompressed directory does not.
    +    For now, just special case Tcl and Tk tar.gz downloads.
         """
         curdir = os.getcwd()
         try:
             os.chdir(builddir)
             if archiveName.endswith('.tar.gz'):
                 retval = os.path.basename(archiveName[:-7])
    +            if ((retval.startswith('tcl') or retval.startswith('tk'))
    +                    and retval.endswith('-src')):
    +                retval = retval[:-4]
                 if os.path.exists(retval):
                     shutil.rmtree(retval)
                 fp = os.popen("tar zxf %s 2>&1"%(shellQuote(archiveName),), 'r')
    @@ -904,6 +962,23 @@
         print("Running make")
         runCommand("make")
     
    +    # For deployment targets of 10.6 and higher, we build our own version
    +    # of Tcl and Cocoa Aqua Tk libs because the Apple-supplied Tk 8.5 is
    +    # out-of-date and has critical bugs.  Save the _tkinter.so that was
    +    # linked with /Library/Frameworks/{Tck,Tk}.framework and build
    +    # another _tkinter.so linked with our private Tcl and Tk libs.
    +    if DEPTARGET > '10.5':
    +        runCommand("find build -name '_tkinter.so' "
    +                        " -execdir mv '{}' '{}'.framework \;")
    +        print("Running make to rebuild _tkinter")
    +        runCommand("make TCLTK_INCLUDES='-I%s/libraries/usr/local/include' "
    +                "TCLTK_LIBS='-L%s/libraries/usr/local/lib -ltcl8.5 -ltk8.5'"%(
    +            shellQuote(WORKDIR)[1:-1],
    +            shellQuote(WORKDIR)[1:-1]))
    +        # make a backup copy, just in case
    +        runCommand("find build -name '_tkinter.so' "
    +                        " -execdir cp -p '{}' '{}'.private \;")
    +
         print("Running make install")
         runCommand("make install DESTDIR=%s"%(
             shellQuote(rootDir)))
    diff --git a/Mac/BuildScript/resources/ReadMe.txt b/Mac/BuildScript/resources/ReadMe.txt
    --- a/Mac/BuildScript/resources/ReadMe.txt
    +++ b/Mac/BuildScript/resources/ReadMe.txt
    @@ -2,10 +2,12 @@
     $MACOSX_DEPLOYMENT_TARGET for the following architecture(s):
     $ARCHITECTURES.
     
    -Installation requires approximately $INSTALL_SIZE MB of disk space,
    -ignore the message that it will take zero bytes.
    +               **** IMPORTANT ****
     
    -If you are attempting to install on an OS X 10.8 system, you may
    +Installing on OS X 10.8 (Mountain Lion) or later systems
    +========================================================
    +
    +If you are attempting to install on an OS X 10.8+ system, you may
     see a message that Python can't be installed because it is from an
     unidentified developer.  This is because this Python installer
     package is not yet compatible with the Gatekeeper security feature
    @@ -15,22 +17,36 @@
     installer package icon.  Then select "Open using ... Installer" from
     the contextual menu that appears.
     
    +       **** IMPORTANT changes if you use IDLE and Tkinter ****
    +
    +Installing a third-party version of Tcl/Tk is no longer required
    +================================================================
    +
    +As of Python 2.7.6, the 10.6+ 64-bit installer now
    +comes with its own private copy of Tcl and Tk 8.5 libraries.  For
    +this version of Python, it is no longer necessary to install
    +a third-party version of Tcl/Tk 8.5, such as those from ActiveState,
    +to work around the problematic versions of Tcl/Tk 8.5 shipped by
    +Apple in OS X 10.6 and later.  (This does not change the requirements
    +for older versions of Python installed from python.org.)  By default,
    +this version of Python will always use its own private version,
    +regardless of whether a third-party Tcl/Tk is installed.
    +The 10.3+ 32-bit-only installer continues to use Tcl/Tk 8.4,
    +either a third-party or system-supplied version.
    +
    +Visit http://www.python.org/download/mac/tcltk/
    +for current information about supported and recommended versions of
    +Tcl/Tk for this version of Python and of Mac OS X.
    +
    +Using this version of Python on OS X
    +====================================
    +
     Python consists of the Python programming language interpreter, plus
     a set of programs to allow easy access to it for Mac users including
     an integrated development environment, IDLE, plus a set of pre-built
     extension modules that open up specific Macintosh technologies to
     Python programs.
     
    -                    **** IMPORTANT ****
    -                    
    -To use IDLE or other programs that use the tkinter graphical user
    -interface toolkit, you may need to install a third-party version of
    -the Tcl/Tk frameworks.  Visit http://www.python.org/download/mac/tcltk/
    -for current information about supported and recommended versions of
    -Tcl/Tk for this version of Python and of Mac OS X.
    -
    -                    *******************
    -
     The installer puts applications, an "Update Shell Profile" command,
     and a link to the optionally installed Python Documentation into the
     "Python $VERSION" subfolder of the system Applications folder,
    @@ -41,12 +57,15 @@
     "bin" directory inside the framework to your shell's search path.
     
     You must install onto your current boot disk, even though the
    -installer does not enforce this, otherwise things will not work.
    +installer may not enforce this, otherwise things will not work.
     
     You can verify the integrity of the disk image file containing the
     installer package and this ReadMe file by comparing its md5 checksum
     and size with the values published on the release page linked at
     http://www.python.org/download/
     
    +Installation requires approximately $INSTALL_SIZE MB of disk space,
    +ignore the message that it will take zero bytes.
    +
     More information on Python in general can be found at
     http://www.python.org.
    diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf
    --- a/Mac/BuildScript/resources/Welcome.rtf
    +++ b/Mac/BuildScript/resources/Welcome.rtf
    @@ -1,8 +1,8 @@
    -{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
    -{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
    +{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
    +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
     {\colortbl;\red255\green255\blue255;}
    -\paperw11904\paperh16836\margl1440\margr1440\vieww9640\viewh10620\viewkind0
    -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural
    +\paperw11905\paperh16837\margl1440\margr1440\vieww9640\viewh10620\viewkind0
    +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640
     
     \f0\fs24 \cf0 This package will install 
     \b Python $FULL_VERSION
    @@ -19,11 +19,7 @@
     See the ReadMe file and the Python documentation for more information.\
     \
     
    -\b IMPORTANT:
    -\b0  
    -\b IDLE
    -\b0  and other programs using the 
    -\b tkinter
    -\b0  graphical user interface toolkit require specific versions of the 
    +\b IMPORTANT for users of IDLE and tkinter:
    +\b0  As of Python 2.7.6, it is no longer necessary to install third-party versions of the 
     \b Tcl/Tk
    -\b0  platform independent windowing toolkit.  Visit {\field{\*\fldinst{HYPERLINK "http://www.python.org/download/mac/tcltk/"}}{\fldrslt http://www.python.org/download/mac/tcltk/}} for current information on supported and recommended versions of Tcl/Tk for this version of Python and Mac OS X.}
    \ No newline at end of file
    +\b0  platform independent windowing toolkit.  Please read the ReadMe file and visit {\field{\*\fldinst{HYPERLINK "http://www.python.org/download/mac/tcltk/"}}{\fldrslt http://www.python.org/download/mac/tcltk/}} for more information on supported and recommended versions of Tcl/Tk for this version of Python and Mac OS X.}
    \ No newline at end of file
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -283,6 +283,12 @@
     - Issue #1584: Provide options to override default search paths for
       Tcl and Tk when building _tkinter.
     
    +- Issue #15663: Tcl/Tk 8.5.15 is now included with the OS X 10.6+
    +  64-bit/32-bit installer for 10.6+.  It is no longer necessary
    +  to install a third-party version of Tcl/Tk 8.5 to work around the
    +  problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
    +  and later releases.
    +
     IDLE
     ----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:48 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:48 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MDE5?=
     =?utf-8?q?=3A_Change_the_OS_X_installer_build_script_to_use_CFLAGS_instea?=
     =?utf-8?q?d?=
    Message-ID: <3d5cyh6thzz7LmX@mail.python.org>
    
    http://hg.python.org/cpython/rev/323f1dcceb73
    changeset:   86613:323f1dcceb73
    branch:      2.7
    user:        Ned Deily 
    date:        Fri Oct 25 00:44:46 2013 -0700
    summary:
      Issue #19019: Change the OS X installer build script to use CFLAGS instead
    of OPT for special build options.  By setting OPT, some compiler-specific
    options like -fwrapv were overridden and thus not used, which could result
    in broken interpreters when building with clang.
    
    files:
      Mac/BuildScript/build-installer.py |  2 +-
      Misc/NEWS                          |  5 +++++
      2 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -952,7 +952,7 @@
                    "--with-universal-archs=%s "
                    "%s "
                    "LDFLAGS='-g -L%s/libraries/usr/local/lib' "
    -               "OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%(
    +               "CFLAGS='-g -I%s/libraries/usr/local/include' 2>&1"%(
             shellQuote(os.path.join(SRCDIR, 'configure')), shellQuote(SDKPATH),
             UNIVERSALARCHS,
             (' ', '--with-computed-gotos ')[PYTHON_3],
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -289,6 +289,11 @@
       problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
       and later releases.
     
    +- Issue #19019: Change the OS X installer build script to use CFLAGS instead
    +  of OPT for special build options.  By setting OPT, some compiler-specific
    +  options like -fwrapv were overridden and thus not used, which could result
    +  in broken interpreters when building with clang.
    +
     IDLE
     ----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:50 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:50 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogU3luYyAyLjcueCwg?=
     =?utf-8?q?3=2E3=2Ex=2C_and_3=2E4=2Ex_versions_of_OS_X_build-installer=2Ep?=
     =?utf-8?q?y=2E?=
    Message-ID: <3d5cyk1Xz6z7Lmk@mail.python.org>
    
    http://hg.python.org/cpython/rev/8cdcfd73d472
    changeset:   86614:8cdcfd73d472
    branch:      2.7
    user:        Ned Deily 
    date:        Fri Oct 25 00:46:59 2013 -0700
    summary:
      Sync 2.7.x, 3.3.x, and 3.4.x versions of OS X build-installer.py.
    
    files:
      Mac/BuildScript/build-installer.py |  56 +++++++++++++++--
      1 files changed, 48 insertions(+), 8 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -1058,22 +1058,62 @@
         # the end-users system. Also remove the directories from _sysconfigdata.py
         # (added in 3.3) if it exists.
     
    +    include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
    +    lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
    +
         path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
                                     'Python.framework', 'Versions',
                                     version, 'lib', 'python%s'%(version,))
    -    paths = [os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile'),
    -             os.path.join(path_to_lib, '_sysconfigdata.py')]
    -    for path in paths:
    -        if not os.path.exists(path):
    -            continue
    +
    +    # fix Makefile
    +    path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
    +    fp = open(path, 'r')
    +    data = fp.read()
    +    fp.close()
    +
    +    for p in (include_path, lib_path):
    +        data = data.replace(" " + p, '')
    +        data = data.replace(p + " ", '')
    +
    +    fp = open(path, 'w')
    +    fp.write(data)
    +    fp.close()
    +
    +    # fix _sysconfigdata if it exists
    +    #
    +    # TODO: make this more robust!  test_sysconfig_module of
    +    # distutils.tests.test_sysconfig.SysconfigTestCase tests that
    +    # the output from get_config_var in both sysconfig and
    +    # distutils.sysconfig is exactly the same for both CFLAGS and
    +    # LDFLAGS.  The fixing up is now complicated by the pretty
    +    # printing in _sysconfigdata.py.  Also, we are using the
    +    # pprint from the Python running the installer build which
    +    # may not cosmetically format the same as the pprint in the Python
    +    # being built (and which is used to originally generate
    +    # _sysconfigdata.py).
    +
    +    import pprint
    +    path = os.path.join(path_to_lib, '_sysconfigdata.py')
    +    if os.path.exists(path):
             fp = open(path, 'r')
             data = fp.read()
             fp.close()
    +        # create build_time_vars dict
    +        exec(data)
    +        vars = {}
    +        for k, v in build_time_vars.items():
    +            if type(v) == type(''):
    +                for p in (include_path, lib_path):
    +                    v = v.replace(' ' + p, '')
    +                    v = v.replace(p + ' ', '')
    +            vars[k] = v
     
    -        data = data.replace(' -L%s/libraries/usr/local/lib'%(WORKDIR,), '')
    -        data = data.replace(' -I%s/libraries/usr/local/include'%(WORKDIR,), '')
             fp = open(path, 'w')
    -        fp.write(data)
    +        # duplicated from sysconfig._generate_posix_vars()
    +        fp.write('# system configuration generated and used by'
    +                    ' the sysconfig module\n')
    +        fp.write('build_time_vars = ')
    +        pprint.pprint(vars, stream=fp)
             fp.close()
     
         # Add symlinks in /usr/local/bin, using relative links
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:51 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:51 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE1ODQ6?=
     =?utf-8?q?_Provide_options_to_override_default_search_paths_for_Tcl_and_T?=
     =?utf-8?q?k?=
    Message-ID: <3d5cyl4xKcz7LmB@mail.python.org>
    
    http://hg.python.org/cpython/rev/d7662958b27a
    changeset:   86615:d7662958b27a
    branch:      3.3
    parent:      86606:09ed1b3b54f3
    user:        Ned Deily 
    date:        Fri Oct 25 00:34:44 2013 -0700
    summary:
      Issue #1584: Provide options to override default search paths for Tcl and Tk
    when building _tkinter.  configure has two new options; if used, both must
    be specified:
    
      ./configure \
          --with-tcltk-includes="-I/opt/local/include" \
          --with-tcltk-libs="-L/opt/local/lib -ltcl8.5 -ltk8.5"
    
    In addition, the options can be overridden with make:
    
       make \
           TCLTK_INCLUDES="-I/opt/local/include" \
           TCLTK_LIBS="-L/opt/local/lib -ltcl8.6 -ltk8.6"
    
    files:
      Makefile.pre.in |   5 +++
      Misc/NEWS       |   3 ++
      configure       |  48 +++++++++++++++++++++++++++++++++++++
      configure.ac    |  28 +++++++++++++++++++++
      setup.py        |  43 ++++++++++++++++++++++++++++++++-
      5 files changed, 126 insertions(+), 1 deletions(-)
    
    
    diff --git a/Makefile.pre.in b/Makefile.pre.in
    --- a/Makefile.pre.in
    +++ b/Makefile.pre.in
    @@ -208,6 +208,10 @@
     BUILD_GNU_TYPE=	@build@
     HOST_GNU_TYPE=	@host@
     
    +# Tcl and Tk config info from --with-tcltk-includes and -libs options
    +TCLTK_INCLUDES=	@TCLTK_INCLUDES@
    +TCLTK_LIBS=	@TCLTK_LIBS@
    +
     # The task to run while instrument when building the profile-opt target
     PROFILE_TASK=	$(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
     #PROFILE_TASK=	$(srcdir)/Lib/test/regrtest.py
    @@ -493,6 +497,7 @@
     	    *) quiet="";; \
     	esac; \
     	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
    +		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
     		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
     
     # Build static library
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -592,6 +592,9 @@
     - Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1
       on Windows.
     
    +- Issue #1584: Provide options to override default search paths for
    +  Tcl and Tk when building _tkinter.
    +
     
     What's New in Python 3.3.2?
     ===========================
    diff --git a/configure b/configure
    --- a/configure
    +++ b/configure
    @@ -644,6 +644,8 @@
     USE_THREAD_MODULE
     SIGNAL_OBJS
     USE_SIGNAL_MODULE
    +TCLTK_LIBS
    +TCLTK_INCLUDES
     LIBFFI_INCLUDEDIR
     PKG_CONFIG
     SHLIBS
    @@ -793,6 +795,8 @@
     with_system_ffi
     with_system_libmpdec
     enable_loadable_sqlite_extensions
    +with_tcltk_includes
    +with_tcltk_libs
     with_dbmliborder
     with_signal_module
     with_threads
    @@ -1465,6 +1469,10 @@
       --with-system-ffi       build _ctypes module using an installed ffi library
       --with-system-libmpdec  build _decimal module using an installed libmpdec
                               library
    +  --with-tcltk-includes='-I...'
    +                          override search for Tcl and Tk include files
    +  --with-tcltk-libs='-L...'
    +                          override search for Tcl and Tk libs
       --with-dbmliborder=db1:db2:...
                               order to check db backends for dbm. Valid value is a
                               colon separated string with the backend names
    @@ -9222,6 +9230,46 @@
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_loadable_sqlite_extensions" >&5
     $as_echo "$enable_loadable_sqlite_extensions" >&6; }
     
    +# Check for --with-tcltk-includes=path and --with-tcltk-libs=path
    +
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tcltk-includes" >&5
    +$as_echo_n "checking for --with-tcltk-includes... " >&6; }
    +
    +# Check whether --with-tcltk-includes was given.
    +if test "${with_tcltk_includes+set}" = set; then :
    +  withval=$with_tcltk_includes;
    +else
    +  with_tcltk_includes="default"
    +fi
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_tcltk_includes" >&5
    +$as_echo "$with_tcltk_includes" >&6; }
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tcltk-libs" >&5
    +$as_echo_n "checking for --with-tcltk-libs... " >&6; }
    +
    +# Check whether --with-tcltk-libs was given.
    +if test "${with_tcltk_libs+set}" = set; then :
    +  withval=$with_tcltk_libs;
    +else
    +  with_tcltk_libs="default"
    +fi
    +
    +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_tcltk_libs" >&5
    +$as_echo "$with_tcltk_libs" >&6; }
    +if test "x$with_tcltk_includes" = xdefault || test "x$with_tcltk_libs" = xdefault
    +then
    +  if test "x$with_tcltk_includes" != "x$with_tcltk_libs"
    +  then
    +    as_fn_error $? "use both --with-tcltk-includes='...' and --with-tcltk-libs='...' or neither" "$LINENO" 5
    +  fi
    +  TCLTK_INCLUDES=""
    +  TCLTK_LIBS=""
    +else
    +  TCLTK_INCLUDES="$with_tcltk_includes"
    +  TCLTK_LIBS="$with_tcltk_libs"
    +fi
    +
     # Check for --with-dbmliborder
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dbmliborder" >&5
     $as_echo_n "checking for --with-dbmliborder... " >&6; }
    diff --git a/configure.ac b/configure.ac
    --- a/configure.ac
    +++ b/configure.ac
    @@ -2270,6 +2270,34 @@
     
     AC_MSG_RESULT($enable_loadable_sqlite_extensions)
     
    +# Check for --with-tcltk-includes=path and --with-tcltk-libs=path
    +AC_SUBST(TCLTK_INCLUDES)
    +AC_SUBST(TCLTK_LIBS)
    +AC_MSG_CHECKING(for --with-tcltk-includes)
    +AC_ARG_WITH(tcltk-includes,
    +            AS_HELP_STRING([--with-tcltk-includes='-I...'], [override search for Tcl and Tk include files]),
    +            [],
    +            [with_tcltk_includes="default"])
    +AC_MSG_RESULT($with_tcltk_includes)
    +AC_MSG_CHECKING(for --with-tcltk-libs)
    +AC_ARG_WITH(tcltk-libs,
    +            AS_HELP_STRING([--with-tcltk-libs='-L...'], [override search for Tcl and Tk libs]),
    +            [],
    +            [with_tcltk_libs="default"])
    +AC_MSG_RESULT($with_tcltk_libs)
    +if test "x$with_tcltk_includes" = xdefault || test "x$with_tcltk_libs" = xdefault
    +then
    +  if test "x$with_tcltk_includes" != "x$with_tcltk_libs"
    +  then
    +    AC_MSG_ERROR([use both --with-tcltk-includes='...' and --with-tcltk-libs='...' or neither])
    +  fi
    +  TCLTK_INCLUDES=""
    +  TCLTK_LIBS=""
    +else
    +  TCLTK_INCLUDES="$with_tcltk_includes"
    +  TCLTK_LIBS="$with_tcltk_libs"
    +fi
    +
     # Check for --with-dbmliborder
     AC_MSG_CHECKING(for --with-dbmliborder)
     AC_ARG_WITH(dbmliborder,
    diff --git a/setup.py b/setup.py
    --- a/setup.py
    +++ b/setup.py
    @@ -1538,6 +1538,41 @@
     
             return missing
     
    +    def detect_tkinter_explicitly(self):
    +        # Build _tkinter using explicit locations for Tcl/Tk.
    +        #
    +        # This is enabled when both arguments are given to ./configure:
    +        #
    +        #     --with-tcltk-includes="-I/path/to/tclincludes \
    +        #                            -I/path/to/tkincludes"
    +        #     --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
    +        #                        -L/path/to/tklibs -ltkm.n"
    +        #
    +        # These values can also be specified or overriden via make:
    +        #    make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
    +        #
    +        # This can be useful for building and testing tkinter with multiple
    +        # versions of Tcl/Tk.  Note that a build of Tk depends on a particular
    +        # build of Tcl so you need to specify both arguments and use care when
    +        # overriding.
    +
    +        # The _TCLTK variables are created in the Makefile sharedmods target.
    +        tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
    +        tcltk_libs = os.environ.get('_TCLTK_LIBS')
    +        if not (tcltk_includes and tcltk_libs):
    +            # Resume default configuration search.
    +            return 0
    +
    +        extra_compile_args = tcltk_includes.split()
    +        extra_link_args = tcltk_libs.split()
    +        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
    +                        define_macros=[('WITH_APPINIT', 1)],
    +                        extra_compile_args = extra_compile_args,
    +                        extra_link_args = extra_link_args,
    +                        )
    +        self.extensions.append(ext)
    +        return 1
    +
         def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
             # The _tkinter module, using frameworks. Since frameworks are quite
             # different the UNIX search logic is not sharable.
    @@ -1627,10 +1662,16 @@
             self.extensions.append(ext)
             return 1
     
    -
         def detect_tkinter(self, inc_dirs, lib_dirs):
             # The _tkinter module.
     
    +        # Check whether --with-tcltk-includes and --with-tcltk-libs were
    +        # configured or passed into the make target.  If so, use these values
    +        # to build tkinter and bypass the searches for Tcl and TK in standard
    +        # locations.
    +        if self.detect_tkinter_explicitly():
    +            return
    +
             # Rather than complicate the code below, detecting and building
             # AquaTk is a separate method. Only one Tkinter will be built on
             # Darwin - either AquaTk, if it is found, or X11 based Tk.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:53 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:53 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE1NjYz?=
     =?utf-8?q?=3A_Tcl/Tk_8=2E5=2E15_is_now_included_with_the_OS_X_10=2E6+?=
    Message-ID: <3d5cyn1rnCz7Lmk@mail.python.org>
    
    http://hg.python.org/cpython/rev/5ff4f0100a40
    changeset:   86616:5ff4f0100a40
    branch:      3.3
    user:        Ned Deily 
    date:        Fri Oct 25 00:41:46 2013 -0700
    summary:
      Issue #15663: Tcl/Tk 8.5.15 is now included with the OS X 10.6+
    64-bit/32-bit installer for 10.6+.  It is no longer necessary
    to install a third-party version of Tcl/Tk 8.5 to work around the
    problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
    and later releases.
    
    files:
      Mac/BuildScript/README.txt            |  31 +++++-
      Mac/BuildScript/build-installer.py    |  77 ++++++++++++++-
      Mac/BuildScript/resources/ReadMe.txt  |  47 ++++++--
      Mac/BuildScript/resources/Welcome.rtf |  16 +-
      Misc/NEWS                             |   6 +
      5 files changed, 150 insertions(+), 27 deletions(-)
    
    
    diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
    --- a/Mac/BuildScript/README.txt
    +++ b/Mac/BuildScript/README.txt
    @@ -57,13 +57,40 @@
     
             * NCurses 5.9 (http://bugs.python.org/issue15037)
             * SQLite 3.7.13
    +        * Tcl 8.5.15
    +        * Tk 8.5.15
             * XZ 5.0.3
     
         - uses system-supplied versions of third-party libraries
     
             * readline module links with Apple BSD editline (libedit)
     
    -    - requires ActiveState Tcl/Tk 8.5.9 (or later) to be installed for building
    +    - requires ActiveState Tcl/Tk 8.5.14 (or later) to be installed for building
    +
    +        * Beginning with Python 3.3.3, this installer now includes its own
    +          private copy of Tcl and Tk 8.5.15 libraries and thus is no longer
    +          dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with
    +          OS X 10.6 or on installing a newer third-party version of Tcl/Tk
    +          in /Library/Frameworks, such as from ActiveState.  If it is
    +          necessary to fallback to using a third-party Tcl/Tk because of
    +          a problem with the private Tcl/Tk, there is a backup version of
    +          the _tkinter extension included which will dynamically link to
    +          Tcl and Tk frameworks in /Library/Frameworks as in previous releases.
    +          To enable (for all users of this Python 3.3)::
    +
    +              sudo bash
    +              cd /Library/Frameworks/Python.framework/Versions/3.3
    +              cd ./lib/python3.3/lib-dynload
    +              cp -p _tkinter.so.framework _tkinter.so
    +              exit
    +
    +          To restore using Python's private versions of Tcl and Tk::
    +
    +              sudo bash
    +              cd /Library/Frameworks/Python.framework/Versions/3.3
    +              cd ./lib/python3.3/lib-dynload
    +              cp -p _tkinter.so.private _tkinter.so
    +              exit
     
         - recommended build environment:
     
    @@ -82,7 +109,7 @@
               considered a migration aid by Apple and is not likely to be fixed,
               its use should be avoided.  The other compiler, ``clang``, has been
               undergoing rapid development.  While it appears to have become
    -          production-ready in the most recent Xcode 4 releases (Xcode 4.4.1
    +          production-ready in the most recent Xcode 4 releases (Xcode 4.6.3
               as of this writing), there are still some open issues when
               building Python and there has not yet been the level of exposure in
               production environments that the Xcode 3 gcc-4.2 compiler has had.
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -193,6 +193,44 @@
     
         LT_10_5 = bool(DEPTARGET < '10.5')
     
    +    if DEPTARGET > '10.5':
    +        result.extend([
    +          dict(
    +              name="Tcl 8.5.15",
    +              url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tcl8.5.15-src.tar.gz",
    +              checksum='f3df162f92c69b254079c4d0af7a690f',
    +              buildDir="unix",
    +              configure_pre=[
    +                    '--enable-shared',
    +                    '--enable-threads',
    +                    '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),),
    +              ],
    +              useLDFlags=False,
    +              install='make TCL_LIBRARY=%(TCL_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
    +                  "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
    +                  "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
    +                  },
    +              ),
    +          dict(
    +              name="Tk 8.5.15",
    +              url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
    +              checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              buildDir="unix",
    +              configure_pre=[
    +                    '--enable-aqua',
    +                    '--enable-shared',
    +                    '--enable-threads',
    +                    '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),),
    +              ],
    +              useLDFlags=False,
    +              install='make TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
    +                  "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
    +                  "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
    +                  "TK_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tk8.5'%(getVersion())),
    +                  },
    +                ),
    +        ])
    +
         if getVersionTuple() >= (3, 3):
             result.extend([
               dict(
    @@ -526,6 +564,20 @@
                     % frameworks['Tk'],
                 ]
     
    +    # For 10.6+ builds, we build two versions of _tkinter:
    +    #    - the traditional version (renamed to _tkinter.so.framework) linked
    +    #       with /Library/Frameworks/{Tcl,Tk}.framework
    +    #    - the default version linked with our private copies of Tcl and Tk
    +    if DEPTARGET > '10.5':
    +        EXPECTED_SHARED_LIBS['_tkinter.so.framework'] = \
    +            EXPECTED_SHARED_LIBS['_tkinter.so']
    +        EXPECTED_SHARED_LIBS['_tkinter.so'] = [
    +                "/Library/Frameworks/Python.framework/Versions/%s/lib/libtcl%s.dylib"
    +                    % (getVersion(), frameworks['Tcl']),
    +                "/Library/Frameworks/Python.framework/Versions/%s/lib/libtk%s.dylib"
    +                    % (getVersion(), frameworks['Tk']),
    +                ]
    +
         # Remove inherited environment variables which might influence build
         environ_var_prefixes = ['CPATH', 'C_INCLUDE_', 'DYLD_', 'LANG', 'LC_',
                                 'LD_', 'LIBRARY_', 'PATH', 'PYTHON']
    @@ -634,13 +686,19 @@
     
         XXX: This function assumes that archives contain a toplevel directory
         that is has the same name as the basename of the archive. This is
    -    save enough for anything we use.
    +    safe enough for almost anything we use.  Unfortunately, it does not
    +    work for current Tcl and Tk source releases where the basename of
    +    the archive ends with "-src" but the uncompressed directory does not.
    +    For now, just special case Tcl and Tk tar.gz downloads.
         """
         curdir = os.getcwd()
         try:
             os.chdir(builddir)
             if archiveName.endswith('.tar.gz'):
                 retval = os.path.basename(archiveName[:-7])
    +            if ((retval.startswith('tcl') or retval.startswith('tk'))
    +                    and retval.endswith('-src')):
    +                retval = retval[:-4]
                 if os.path.exists(retval):
                     shutil.rmtree(retval)
                 fp = os.popen("tar zxf %s 2>&1"%(shellQuote(archiveName),), 'r')
    @@ -904,6 +962,23 @@
         print("Running make")
         runCommand("make")
     
    +    # For deployment targets of 10.6 and higher, we build our own version
    +    # of Tcl and Cocoa Aqua Tk libs because the Apple-supplied Tk 8.5 is
    +    # out-of-date and has critical bugs.  Save the _tkinter.so that was
    +    # linked with /Library/Frameworks/{Tck,Tk}.framework and build
    +    # another _tkinter.so linked with our private Tcl and Tk libs.
    +    if DEPTARGET > '10.5':
    +        runCommand("find build -name '_tkinter.so' "
    +                        " -execdir mv '{}' '{}'.framework \;")
    +        print("Running make to rebuild _tkinter")
    +        runCommand("make TCLTK_INCLUDES='-I%s/libraries/usr/local/include' "
    +                "TCLTK_LIBS='-L%s/libraries/usr/local/lib -ltcl8.5 -ltk8.5'"%(
    +            shellQuote(WORKDIR)[1:-1],
    +            shellQuote(WORKDIR)[1:-1]))
    +        # make a backup copy, just in case
    +        runCommand("find build -name '_tkinter.so' "
    +                        " -execdir cp -p '{}' '{}'.private \;")
    +
         print("Running make install")
         runCommand("make install DESTDIR=%s"%(
             shellQuote(rootDir)))
    diff --git a/Mac/BuildScript/resources/ReadMe.txt b/Mac/BuildScript/resources/ReadMe.txt
    --- a/Mac/BuildScript/resources/ReadMe.txt
    +++ b/Mac/BuildScript/resources/ReadMe.txt
    @@ -2,10 +2,12 @@
     $MACOSX_DEPLOYMENT_TARGET for the following architecture(s):
     $ARCHITECTURES.
     
    -Installation requires approximately $INSTALL_SIZE MB of disk space,
    -ignore the message that it will take zero bytes.
    +               **** IMPORTANT ****
     
    -If you are attempting to install on an OS X 10.8 system, you may
    +Installing on OS X 10.8 (Mountain Lion) or later systems
    +========================================================
    +
    +If you are attempting to install on an OS X 10.8+ system, you may
     see a message that Python can't be installed because it is from an
     unidentified developer.  This is because this Python installer
     package is not yet compatible with the Gatekeeper security feature
    @@ -15,22 +17,36 @@
     installer package icon.  Then select "Open using ... Installer" from
     the contextual menu that appears.
     
    +       **** IMPORTANT changes if you use IDLE and Tkinter ****
    +
    +Installing a third-party version of Tcl/Tk is no longer required
    +================================================================
    +
    +As of Python 3.3.3, the 10.6+ 64-bit installer now
    +comes with its own private copy of Tcl and Tk 8.5 libraries.  For
    +this version of Python, it is no longer necessary to install
    +a third-party version of Tcl/Tk 8.5, such as those from ActiveState,
    +to work around the problematic versions of Tcl/Tk 8.5 shipped by
    +Apple in OS X 10.6 and later.  (This does not change the requirements
    +for older versions of Python installed from python.org.)  By default,
    +this version of Python will always use its own private version,
    +regardless of whether a third-party Tcl/Tk is installed.
    +The 10.5+ 32-bit-only installer continues to use Tcl/Tk 8.4,
    +either a third-party or system-supplied version.
    +
    +Visit http://www.python.org/download/mac/tcltk/
    +for current information about supported and recommended versions of
    +Tcl/Tk for this version of Python and of Mac OS X.
    +
    +Using this version of Python on OS X
    +====================================
    +
     Python consists of the Python programming language interpreter, plus
     a set of programs to allow easy access to it for Mac users including
     an integrated development environment, IDLE, plus a set of pre-built
     extension modules that open up specific Macintosh technologies to
     Python programs.
     
    -                    **** IMPORTANT ****
    -                    
    -To use IDLE or other programs that use the tkinter graphical user
    -interface toolkit, you may need to install a third-party version of
    -the Tcl/Tk frameworks.  Visit http://www.python.org/download/mac/tcltk/
    -for current information about supported and recommended versions of
    -Tcl/Tk for this version of Python and of Mac OS X.
    -
    -                    *******************
    -
     The installer puts applications, an "Update Shell Profile" command,
     and a link to the optionally installed Python Documentation into the
     "Python $VERSION" subfolder of the system Applications folder,
    @@ -41,12 +57,15 @@
     "bin" directory inside the framework to your shell's search path.
     
     You must install onto your current boot disk, even though the
    -installer does not enforce this, otherwise things will not work.
    +installer may not enforce this, otherwise things will not work.
     
     You can verify the integrity of the disk image file containing the
     installer package and this ReadMe file by comparing its md5 checksum
     and size with the values published on the release page linked at
     http://www.python.org/download/
     
    +Installation requires approximately $INSTALL_SIZE MB of disk space,
    +ignore the message that it will take zero bytes.
    +
     More information on Python in general can be found at
     http://www.python.org.
    diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf
    --- a/Mac/BuildScript/resources/Welcome.rtf
    +++ b/Mac/BuildScript/resources/Welcome.rtf
    @@ -1,7 +1,7 @@
    -{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
    -{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
    +{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
    +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
     {\colortbl;\red255\green255\blue255;}
    -\paperw11904\paperh16836\margl1440\margr1440\vieww9640\viewh10620\viewkind0
    +\paperw11905\paperh16837\margl1440\margr1440\vieww9640\viewh10620\viewkind0
     \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640
     
     \f0\fs24 \cf0 This package will install 
    @@ -25,11 +25,7 @@
     \b0  at any time to make $FULL_VERSION the default Python 3 version.  This version can co-exist with other installed versions of Python 3 and Python 2.\
     \
     
    -\b IMPORTANT:
    -\b0  
    -\b IDLE
    -\b0  and other programs using the 
    -\b tkinter
    -\b0  graphical user interface toolkit require specific versions of the 
    +\b IMPORTANT for users of IDLE and tkinter:
    +\b0  As of Python 3.3.3, it is no longer necessary to install third-party versions of the 
     \b Tcl/Tk
    -\b0  platform independent windowing toolkit.  Visit {\field{\*\fldinst{HYPERLINK "http://www.python.org/download/mac/tcltk/"}}{\fldrslt http://www.python.org/download/mac/tcltk/}} for current information on supported and recommended versions of Tcl/Tk for this version of Python and Mac OS X.}
    \ No newline at end of file
    +\b0  platform independent windowing toolkit.  Please read the ReadMe file and visit {\field{\*\fldinst{HYPERLINK "http://www.python.org/download/mac/tcltk/"}}{\fldrslt http://www.python.org/download/mac/tcltk/}} for more information on supported and recommended versions of Tcl/Tk for this version of Python and Mac OS X.}
    \ No newline at end of file
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -595,6 +595,12 @@
     - Issue #1584: Provide options to override default search paths for
       Tcl and Tk when building _tkinter.
     
    +- Issue #15663: Tcl/Tk 8.5.15 is now included with the OS X 10.6+
    +  64-bit/32-bit installer for 10.6+.  It is no longer necessary
    +  to install a third-party version of Tcl/Tk 8.5 to work around the
    +  problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
    +  and later releases.
    +
     
     What's New in Python 3.3.2?
     ===========================
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:54 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:54 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MDE5?=
     =?utf-8?q?=3A_Change_the_OS_X_installer_build_script_to_use_CFLAGS_instea?=
     =?utf-8?q?d?=
    Message-ID: <3d5cyp3XRKz7LnC@mail.python.org>
    
    http://hg.python.org/cpython/rev/689b5c2d6959
    changeset:   86617:689b5c2d6959
    branch:      3.3
    user:        Ned Deily 
    date:        Fri Oct 25 00:46:02 2013 -0700
    summary:
      Issue #19019: Change the OS X installer build script to use CFLAGS instead
    of OPT for special build options.  By setting OPT, some compiler-specific
    options like -fwrapv were overridden and thus not used, which could result
    in broken interpreters when building with clang.
    
    files:
      Mac/BuildScript/build-installer.py |  2 +-
      Misc/NEWS                          |  5 +++++
      2 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -952,7 +952,7 @@
                    "--with-universal-archs=%s "
                    "%s "
                    "LDFLAGS='-g -L%s/libraries/usr/local/lib' "
    -               "OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%(
    +               "CFLAGS='-g -I%s/libraries/usr/local/include' 2>&1"%(
             shellQuote(os.path.join(SRCDIR, 'configure')), shellQuote(SDKPATH),
             UNIVERSALARCHS,
             (' ', '--with-computed-gotos ')[PYTHON_3],
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -601,6 +601,11 @@
       problems in the Apple-supplied Tcl/Tk 8.5 shipped in OS X 10.6
       and later releases.
     
    +- Issue #19019: Change the OS X installer build script to use CFLAGS instead
    +  of OPT for special build options.  By setting OPT, some compiler-specific
    +  options like -fwrapv were overridden and thus not used, which could result
    +  in broken interpreters when building with clang.
    +
     
     What's New in Python 3.3.2?
     ===========================
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:55 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:55 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogU3luYyAyLjcueCwg?=
     =?utf-8?q?3=2E3=2Ex=2C_and_3=2E4=2Ex_versions_of_OS_X_build-installer=2Ep?=
     =?utf-8?q?y=2E?=
    Message-ID: <3d5cyq59M0z7Lnd@mail.python.org>
    
    http://hg.python.org/cpython/rev/85dcab725a2d
    changeset:   86618:85dcab725a2d
    branch:      3.3
    user:        Ned Deily 
    date:        Fri Oct 25 00:47:38 2013 -0700
    summary:
      Sync 2.7.x, 3.3.x, and 3.4.x versions of OS X build-installer.py.
    
    files:
      Mac/BuildScript/build-installer.py |  56 +++++++++++++++--
      1 files changed, 48 insertions(+), 8 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -1058,22 +1058,62 @@
         # the end-users system. Also remove the directories from _sysconfigdata.py
         # (added in 3.3) if it exists.
     
    +    include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
    +    lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
    +
         path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
                                     'Python.framework', 'Versions',
                                     version, 'lib', 'python%s'%(version,))
    -    paths = [os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile'),
    -             os.path.join(path_to_lib, '_sysconfigdata.py')]
    -    for path in paths:
    -        if not os.path.exists(path):
    -            continue
    +
    +    # fix Makefile
    +    path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
    +    fp = open(path, 'r')
    +    data = fp.read()
    +    fp.close()
    +
    +    for p in (include_path, lib_path):
    +        data = data.replace(" " + p, '')
    +        data = data.replace(p + " ", '')
    +
    +    fp = open(path, 'w')
    +    fp.write(data)
    +    fp.close()
    +
    +    # fix _sysconfigdata if it exists
    +    #
    +    # TODO: make this more robust!  test_sysconfig_module of
    +    # distutils.tests.test_sysconfig.SysconfigTestCase tests that
    +    # the output from get_config_var in both sysconfig and
    +    # distutils.sysconfig is exactly the same for both CFLAGS and
    +    # LDFLAGS.  The fixing up is now complicated by the pretty
    +    # printing in _sysconfigdata.py.  Also, we are using the
    +    # pprint from the Python running the installer build which
    +    # may not cosmetically format the same as the pprint in the Python
    +    # being built (and which is used to originally generate
    +    # _sysconfigdata.py).
    +
    +    import pprint
    +    path = os.path.join(path_to_lib, '_sysconfigdata.py')
    +    if os.path.exists(path):
             fp = open(path, 'r')
             data = fp.read()
             fp.close()
    +        # create build_time_vars dict
    +        exec(data)
    +        vars = {}
    +        for k, v in build_time_vars.items():
    +            if type(v) == type(''):
    +                for p in (include_path, lib_path):
    +                    v = v.replace(' ' + p, '')
    +                    v = v.replace(p + ' ', '')
    +            vars[k] = v
     
    -        data = data.replace(' -L%s/libraries/usr/local/lib'%(WORKDIR,), '')
    -        data = data.replace(' -I%s/libraries/usr/local/include'%(WORKDIR,), '')
             fp = open(path, 'w')
    -        fp.write(data)
    +        # duplicated from sysconfig._generate_posix_vars()
    +        fp.write('# system configuration generated and used by'
    +                    ' the sysconfig module\n')
    +        fp.write('build_time_vars = ')
    +        pprint.pprint(vars, stream=fp)
             fp.close()
     
         # Add symlinks in /usr/local/bin, using relative links
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 09:53:57 2013
    From: python-checkins at python.org (ned.deily)
    Date: Fri, 25 Oct 2013 09:53:57 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_null_merge_with_3=2E3?=
    Message-ID: <3d5cys0Dhwz7LnC@mail.python.org>
    
    http://hg.python.org/cpython/rev/925d04e411aa
    changeset:   86619:925d04e411aa
    parent:      86610:e7b97822110f
    parent:      86618:85dcab725a2d
    user:        Ned Deily 
    date:        Fri Oct 25 00:52:26 2013 -0700
    summary:
      null merge with 3.3
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 10:01:18 2013
    From: python-checkins at python.org (tim.golden)
    Date: Fri, 25 Oct 2013 10:01:18 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Closes_issue_=2319273=3A_c?=
     =?utf-8?q?lean_up_the_pcbuild_readme=2Etxt_=28Patch_by_Zachary_Ware=29?=
    Message-ID: <3d5d7L0TFCz7Ljy@mail.python.org>
    
    http://hg.python.org/cpython/rev/212b4b61fa05
    changeset:   86620:212b4b61fa05
    user:        Tim Golden 
    date:        Fri Oct 25 08:58:16 2013 +0100
    summary:
      Closes issue #19273: clean up the pcbuild readme.txt (Patch by Zachary Ware)
    
    files:
      PCbuild/readme.txt |  507 ++++++++++++++++----------------
      1 files changed, 255 insertions(+), 252 deletions(-)
    
    
    diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt
    --- a/PCbuild/readme.txt
    +++ b/PCbuild/readme.txt
    @@ -1,320 +1,320 @@
    -Building Python using VC++ 10.0
    --------------------------------
    +Building Python using Microsoft Visual C++
    +------------------------------------------
     
    -This directory is used to build Python for Win32 and x64 platforms, e.g. 
    -Windows 2000, XP, Vista and Windows Server 2008.  In order to build 32-bit
    -debug and release executables, Microsoft Visual C++ 2010 Express Edition is
    -required at the very least.  In order to build 64-bit debug and release
    -executables, Visual Studio 2010 Standard Edition is required at the very
    -least.  In order to build all of the above, as well as generate release builds
    -that make use of Profile Guided Optimisation (PG0), Visual Studio 2010
    -Professional Edition is required at the very least.  The official Python
    -releases are built with this version of Visual Studio.
    +This directory is used to build CPython for Microsoft Windows NT version
    +5.1 or higher (Windows XP, Windows Server 2003, or later) on 32 and 64
    +bit platforms.  Using this directory requires an installation of
    +Microsoft Visual C++ 2010 (MSVC 10.0) of any edition.  The specific
    +requirements are as follows:
    +Visual C++ 2010 Express Edition
    +    Required for building 32-bit Debug and Release configuration builds.
    +    This edition does not support "solution folders", which pcbuild.sln
    +    uses; this will not prevent building.
    +Visual Studio 2010 Standard Edition
    +    Required for building 64-bit Debug and Release configuration builds
    +Visual Studio 2010 Professional Edition
    +    Required for building Release configuration builds that make use of
    +    Profile Guided Optimization (PGO), on either platform.  The official
    +    Python releases are built with Professional Edition using PGO.
     
    -For other Windows platforms and compilers, see ../PC/readme.txt.
    +All you need to do to build is open the solution "pcbuild.sln" in Visual
    +Studio, select the desired combination of configuration and platform,
    +then build with "Build Solution" or the F7 keyboard shortcut.  You can
    +also build from the command line using the "build.bat" script in this
    +directory.  The solution is configured to build the projects in the
    +correct order.
     
    -All you need to do is open the workspace "pcbuild.sln" in Visual Studio,
    -select the desired combination of configuration and platform and eventually
    -build the solution. Unless you are going to debug a problem in the core or
    -you are going to create an optimized build you want to select "Release" as
    -configuration.
    +The solution currently supports two platforms.  The Win32 platform is
    +used to build standard x86-compatible 32-bit binaries, output into this
    +directory.  The x64 platform is used for building 64-bit AMD64 (aka
    +x86_64 or EM64T) binaries, output into the amd64 sub-directory which
    +will be created if it doesn't already exist.  The Itanium (IA-64)
    +platform is no longer supported.  See the "Building for AMD64" section
    +below for more information about 64-bit builds.
     
    -The PCbuild directory is compatible with all versions of Visual Studio from
    -VS C++ Express Edition over the standard edition up to the professional
    -edition. However the express edition does not support features like solution
    -folders or profile guided optimization (PGO). The missing bits and pieces
    -won't stop you from building Python.
    +Four configuration options are supported by the solution:
    +Debug
    +    Used to build Python with extra debugging capabilities, equivalent
    +    to using ./configure --with-pydebug on UNIX.  All binaries built
    +    using this configuration have "_d" added to their name:
    +    python34_d.dll, python_d.exe, parser_d.pyd, and so on.  Both the
    +    build and rt (run test) batch files in this directory accept a -d
    +    option for debug builds.  If you are building Python to help with
    +    development of CPython, you will most likely use this configuration.
    +PGInstrument, PGUpdate
    +    Used to build Python in Release configuration using PGO, which
    +    requires Professional Edition of Visual Studio.  See the "Profile
    +    Guided Optimization" section below for more information.  Build
    +    output from each of these configurations lands in its own
    +    sub-directory of this directory.  The official Python releases are
    +    built using these configurations.
    +Release
    +    Used to build Python as it is meant to be used in production
    +    settings, though without PGO.
     
    -The solution is configured to build the projects in the correct order. "Build
    -Solution" or F7 takes care of dependencies except for x64 builds. To make
    -cross compiling x64 builds on a 32bit OS possible the x64 builds require a 
    -32bit version of Python.
    -
    -NOTE:
    -   You probably don't want to build most of the other subprojects, unless
    -   you're building an entire Python distribution from scratch, or
    -   specifically making changes to the subsystems they implement, or are
    -   running a Python core buildbot test slave; see SUBPROJECTS below)
    -
    -When using the Debug setting, the output files have a _d added to
    -their name:  python34_d.dll, python_d.exe, parser_d.pyd, and so on. Both
    -the build and rt batch files accept a -d option for debug builds.
    -
    -The 32bit builds end up in the solution folder PCbuild while the x64 builds
    -land in the amd64 subfolder. The PGI and PGO builds for profile guided
    -optimization end up in their own folders, too.
     
     Legacy support
     --------------
     
    -You can find build directories for older versions of Visual Studio and 
    -Visual C++ in the PC directory. The legacy build directories are no longer
    -actively maintained and may not work out of the box.
    +You can find build directories for older versions of Visual Studio and
    +Visual C++ in the PC directory. The legacy build directories are no
    +longer actively maintained and may not work out of the box.
     
    -PC/VC6/
    -    Visual C++ 6.0
    -PC/VS7.1/
    -    Visual Studio 2003 (7.1)
    -PC/VS8.0/
    -    Visual Studio 2005 (8.0)
    -PC/VS9.0/
    -    Visual Studio 2008 (9.0)
    +Currently, the only legacy build directory is PC\VS9.0, for Visual
    +Studio 2008 (9.0).
     
     
    -C RUNTIME
    +C Runtime
     ---------
     
    -Visual Studio 2010 uses version 10 of the C runtime (MSVCRT9).  The executables
    -no longer use the "Side by Side" assemblies used in previous versions of the
    -compiler.  This simplifies distribution of applications.
    -The run time libraries are avalible under the VC/Redist folder of your visual studio
    -distribution. For more info, see the Readme in the VC/Redist folder.
    +Visual Studio 2010 uses version 10 of the C runtime (MSVCRT10).  The
    +executables no longer use the "Side by Side" assemblies used in previous
    +versions of the compiler.  This simplifies distribution of applications.
     
    -SUBPROJECTS
    ------------
    -These subprojects should build out of the box.  Subprojects other than the
    -main ones (pythoncore, python, pythonw) generally build a DLL (renamed to
    -.pyd) from a specific module so that users don't have to load the code
    -supporting that module unless they import the module.
    +The run time libraries are available under the VC/Redist folder of your
    +Visual Studio distribution. For more info, see the Readme in the
    +VC/Redist folder.
     
    +
    +Sub-Projects
    +------------
    +
    +The CPython project is split up into several smaller sub-projects which
    +are managed by the pcbuild.sln solution file.  Each sub-project is
    +represented by a .vcxproj and a .vcxproj.filters file starting with the
    +name of the sub-project.  These sub-projects fall into a few general
    +categories:
    +
    +The following sub-projects represent the bare minimum required to build
    +a functioning CPython interpreter.  If nothing else builds but these,
    +you'll have a very limited but usable python.exe:
     pythoncore
         .dll and .lib
     python
         .exe
    +kill_python
    +    kill_python.exe, a small program designed to kill any instances of
    +    python(_d).exe that are running and live in the build output
    +    directory; this is meant to avoid build issues due to locked files
    +make_buildinfo, make_versioninfo
    +    helpers to provide necessary information to the build process
    +
    +These sub-projects provide extra executables that are useful for running
    +CPython in different ways:
     pythonw
    -    pythonw.exe, a variant of python.exe that doesn't pop up a DOS box
    +    pythonw.exe, a variant of python.exe that doesn't open a Command
    +    Prompt window
    +pylauncher
    +    py.exe, the Python Launcher for Windows, see
    +        http://docs.python.org/3/using/windows.html#launcher
    +pywlauncher
    +    pyw.exe, a variant of py.exe that doesn't open a Command Prompt
    +    window
    +
    +These are miscellaneous sub-projects that don't really fit the other
    +categories.  By default, these projects do not build in Debug
    +configuration:
    +_freeze_importlib
    +    _freeze_importlib.exe, used to regenerate Python\importlib.h after
    +    changes have been made to Lib\importlib\_bootstrap.py
    +bdist_wininst
    +    ..\Lib\distutils\command\wininst-10.0[-amd64].exe, the base
    +    executable used by the distutils bdist_wininst command
    +python3dll
    +    python3.dll, the PEP 384 Stable ABI dll
    +xxlimited
    +    builds an example module that makes use of the PEP 384 Stable ABI,
    +    see Modules\xxlimited.c
    +
    +The following sub-projects are for individual modules of the standard
    +library which are implemented in C; each one builds a DLL (renamed to
    +.pyd) of the same name as the project:
    +_ctypes
    +_ctypes_test
    +_decimal
    +_elementtree
    +_hashlib
    +_msi
    +_multiprocessing
    +_overlapped
    +_sha3
     _socket
    -    socketmodule.c
     _testcapi
    -    tests of the Python C API, run via Lib/test/test_capi.py, and
    -    implemented by module Modules/_testcapimodule.c
     _testbuffer
    -    buffer protocol tests, run via Lib/test/test_buffer.py, and
    -    implemented by module Modules/_testbuffer.c
    +_testimportmultiple
     pyexpat
    -    Python wrapper for accelerated XML parsing, which incorporates stable
    -    code from the Expat project:  http://sourceforge.net/projects/expat/
     select
    -    selectmodule.c
     unicodedata
    -    large tables of Unicode data
     winsound
    -    play sounds (typically .wav files) under Windows
     
    -Python-controlled subprojects that wrap external projects:
    -_sqlite3
    -    Wraps SQLite 3.7.4, which is currently built by sqlite3.vcproj (see below).
    -_tkinter
    -    Wraps the Tk windowing system.  Unlike _sqlite3, there's no
    -    corresponding tcltk.vcproj-type project that builds Tcl/Tk from vcproj's
    -    within our pcbuild.sln, which means this module expects to find a
    -    pre-built Tcl/Tk in either ..\..\tcltk for 32-bit or ..\..\tcltk64 for
    -    64-bit (relative to this directory).  See below for instructions to build
    -    Tcl/Tk. 
    +The following Python-controlled sub-projects wrap external projects.
    +Note that these external libraries are not necessary for a working
    +interpreter, but they do implement several major features.  See the
    +"Getting External Sources" section below for additional information
    +about getting the source for building these libraries.  The sub-projects
    +are:
     _bz2
    -    Python wrapper for the libbzip2 compression library.  Homepage
    +    Python wrapper for version 1.0.6 of the libbzip2 compression library
    +    Homepage:
             http://www.bzip.org/
    -    Download the source from the python.org copy into the dist
    -    directory:
    +_lzma
    +    Python wrapper for the liblzma compression library, using pre-built
    +    binaries of XZ Utils version 5.0.3
    +    Homepage:
    +        http://tukaani.org/xz/
    +_ssl
    +    Python wrapper for version 1.0.1e of the OpenSSL secure sockets
    +    library, which is built by ssl.vcxproj
    +    Homepage:
    +        http://www.openssl.org/
     
    -    svn export http://svn.python.org/projects/external/bzip2-1.0.6
    +    Building OpenSSL requires nasm.exe (the Netwide Assembler), version
    +    2.10 or newer from
    +        http://www.nasm.us/
    +    to be somewhere on your PATH.  More recent versions of OpenSSL may
    +    need a later version of NASM. If OpenSSL's self tests don't pass,
    +    you should first try to update NASM and do a full rebuild of
    +    OpenSSL.
     
    -    ** NOTE: if you use the Tools\buildbot\external(-amd64).bat approach for
    -    obtaining external sources then you don't need to manually get the source
    -    above via subversion. **
    +    If you like to use the official sources instead of the files from
    +    python.org's subversion repository, Perl is required to build the
    +    necessary makefiles and assembly files.  ActivePerl is available
    +    from
    +        http://www.activestate.com/activeperl/
    +    The svn.python.org version contains pre-built makefiles and assembly
    +    files.
     
    -    A custom pre-link step in the bz2 project settings should manage to
    -    build bzip2-1.0.6\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is
    -    linked in PCbuild\.
    -    However, the bz2 project is not smart enough to remove anything under
    -    bzip2-1.0.6\ when you do a clean, so if you want to rebuild bzip2.lib
    -    you need to clean up bzip2-1.0.6\ by hand.
    +    The build process makes sure that no patented algorithms are
    +    included.  For now RC5, MDC2 and IDEA are excluded from the build.
    +    You may have to manually remove $(OBJ_D)\i_*.obj from ms\nt.mak if
    +    using official sources; the svn.python.org-hosted version is already
    +    fixed.
     
    -    All of this managed to build libbz2.lib in 
    -    bzip2-1.0.6\$platform-$configuration\, which the Python project links in.
    -_lzma
    -    Python wrapper for the liblzma compression library.
    -
    -    Download the pre-built Windows binaries from http://tukaani.org/xz/, and
    -    extract to ..\xz-5.0.3. If you are using a more recent version of liblzma,
    -    it will be necessary to rename the directory from xz- to xz-5.0.3.
    -
    -_ssl
    -    Python wrapper for the secure sockets library.
    -
    -    Get the source code through
    -
    -    svn export http://svn.python.org/projects/external/openssl-1.0.1e
    -
    -    ** NOTE: if you use the Tools\buildbot\external(-amd64).bat approach for
    -    obtaining external sources then you don't need to manually get the source
    -    above via subversion. **
    -
    -    Alternatively, get the latest version from http://www.openssl.org.
    -    You can (theoretically) use any version of OpenSSL you like - the
    -    build process will automatically select the latest version.
    -
    -    You must install the NASM assembler 2.10 or newer from
    -        http://nasm.sf.net
    -    for x86 builds.  Put nasmw.exe anywhere in your PATH. More recent
    -    versions of OpenSSL may need a later version of NASM. If OpenSSL's self
    -    tests don't pass, you should first try to update NASM and do a full
    -    rebuild of OpenSSL.
    -    Note: recent releases of nasm only have nasm.exe. Just rename it to 
    -    nasmw.exe.
    -
    -    You can also install ActivePerl from
    -        http://www.activestate.com/activeperl/
    -    if you like to use the official sources instead of the files from 
    -    python's subversion repository. The svn version contains pre-build
    -    makefiles and assembly files.
    -
    -    The build process makes sure that no patented algorithms are included.
    -    For now RC5, MDC2 and IDEA are excluded from the build. You may have 
    -    to manually remove $(OBJ_D)\i_*.obj from ms\nt.mak if the build process
    -    complains about missing files or forbidden IDEA. Again the files provided
    -    in the subversion repository are already fixed.
    -
    -    The MSVC project simply invokes PCBuild/build_ssl.py to perform
    -    the build.  This Python script locates and builds your OpenSSL
    -    installation, then invokes a simple makefile to build the final .pyd.
    +    The ssl.vcxproj sub-project simply invokes PCbuild/build_ssl.py,
    +    which locates and builds OpenSSL.
     
         build_ssl.py attempts to catch the most common errors (such as not
         being able to find OpenSSL sources, or not being able to find a Perl
    -    that works with OpenSSL) and give a reasonable error message.
    -    If you have a problem that doesn't seem to be handled correctly
    -    (eg, you know you have ActivePerl but we can't find it), please take
    -    a peek at build_ssl.py and suggest patches.  Note that build_ssl.py
    +    that works with OpenSSL) and give a reasonable error message.  If
    +    you have a problem that doesn't seem to be handled correctly (e.g.,
    +    you know you have ActivePerl but we can't find it), please take a
    +    peek at build_ssl.py and suggest patches.  Note that build_ssl.py
         should be able to be run directly from the command-line.
     
    -    build_ssl.py/MSVC isn't clever enough to clean OpenSSL - you must do
    -    this by hand.
    +    The ssl sub-project does not have the ability to clean the OpenSSL
    +    build; if you need to rebuild, you'll have to clean it by hand.
    +_sqlite3
    +    Wraps SQLite 3.7.12, which is itself built by sqlite3.vcxproj
    +    Homepage:
    +        http://www.sqlite.org/
    +_tkinter
    +    Wraps version 8.5.11 of the Tk windowing system.
    +    Homepage:
    +        http://www.tcl.tk/
     
    -The subprojects above wrap external projects Python doesn't control, and as
    -such, a little more work is required in order to download the relevant source 
    -files for each project before they can be built.  The buildbots do this each
    -time they're built, so the easiest approach is to run either external.bat or 
    -external-amd64.bat in the ..\Tools\buildbot directory from ..\, i.e.:
    +    Unlike the other external libraries listed above, Tk must be built
    +    separately before the _tkinter module can be built. This means that
    +    a pre-built Tcl/Tk installation is expected in ..\..\tcltk (tcltk64
    +    for 64-bit) relative to this directory.  See "Getting External
    +    Sources" below for the easiest method to ensure Tcl/Tk is built.
     
    -    C:\..\svn.python.org\projects\python\trunk\PCbuild>cd ..
    -    C:\..\svn.python.org\projects\python\trunk>Tools\buildbot\external.bat
     
    -This extracts all the external subprojects from http://svn.python.org/external
    -via Subversion (so you'll need an svn.exe on your PATH) and places them in 
    -..\.. (relative to this directory).  The external(-amd64).bat scripts will
    -also build a debug build of Tcl/Tk; there aren't any equivalent batch files
    -for building release versions of Tcl/Tk lying around in the Tools\buildbot
    -directory.  If you need to build a release version of Tcl/Tk it isn't hard
    -though, take a look at the relevant external(-amd64).bat file and find the
    -two nmake lines, then call each one without the 'DEBUG=1' parameter, i.e.:
    +Getting External Sources
    +------------------------
    +
    +The last category of sub-projects listed above wrap external projects
    +Python doesn't control, and as such a little more work is required in
    +order to download the relevant source files for each project before they
    +can be built.  The buildbots must ensure that all libraries are present
    +before building, so the easiest approach is to run either external.bat
    +or external-amd64.bat (depending on platform) in the ..\Tools\buildbot
    +directory from ..\, i.e.:
    +
    +    C:\python\cpython\PCbuild>cd ..
    +    C:\python\cpython>Tools\buildbot\external.bat
    +
    +This extracts all the external sub-projects from
    +    http://svn.python.org/projects/external
    +via Subversion (so you'll need an svn.exe on your PATH) and places them
    +in ..\.. (relative to this directory).
    +
    +It is also possible to download sources from each project's homepage,
    +though you may have to change the names of some folders in order to make
    +things work.  For instance, if you were to download a version 5.0.5 of
    +XZ Utils, you would need to extract the archive into ..\..\xz-5.0.3
    +anyway, since that is where the solution is set to look for xz.  The
    +same is true for all other external projects.
    +
    +The external(-amd64).bat scripts will also build a debug build of
    +Tcl/Tk, but there aren't any equivalent batch files for building release
    +versions of Tcl/Tk currently available.  If you need to build a release
    +version of Tcl/Tk, just take a look at the relevant external(-amd64).bat
    +file and find the two nmake lines, then call each one without the
    +'DEBUG=1' parameter, i.e.:
     
     The external-amd64.bat file contains this for tcl:
    -    nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all install
    +    nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all install
     
     So for a release build, you'd call it as:
    -    nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all install
    +    nmake -f makefile.vc MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all install
     
    -    XXX Should we compile with OPTS=threads?
    -    XXX Our installer copies a lot of stuff out of the Tcl/Tk install
    -    XXX directory.  Is all of that really needed for Python use of Tcl/Tk?
    +Note that the above command is called from within ..\..\tcl-8.5.11.0\win
    +(relative to this directory); don't forget to build Tk as well as Tcl!
     
    -This will be cleaned up in the future; ideally Tcl/Tk will be brought into our
    -pcbuild.sln as custom .vcproj files, just as we've recently done with the
    -sqlite3.vcproj file, which will remove the need for Tcl/Tk to be built
    -separately via a batch file.
    +This will be cleaned up in the future; http://bugs.python.org/issue15968
    +tracks adding a new tcltk.vcxproj file that will build Tcl/Tk and Tix
    +the same way the other external projects listed above are built.
     
    -XXX trent.nelson 02-Apr-08:
    -    Having the external subprojects in ..\.. relative to this directory is a
    -    bit of a nuisance when you're working on py3k and trunk in parallel and
    -    your directory layout mimics that of Python's subversion layout, e.g.:
    -
    -        C:\..\svn.python.org\projects\python\trunk
    -        C:\..\svn.python.org\projects\python\branches\py3k
    -        C:\..\svn.python.org\projects\python\branches\release25-maint
    -
    -    I'd like to change things so that external subprojects are fetched from
    -    ..\external instead of ..\.., then provide some helper scripts or batch
    -    files that would set up a new ..\external directory with svn checkouts of
    -    the relevant branches in http://svn.python.org/projects/external/, or
    -    alternatively, use junctions to link ..\external with a pre-existing
    -    externals directory being used by another branch.  i.e. if I'm usually
    -    working on trunk (and have previously created trunk\external via the
    -    provided batch file), and want to do some work on py3k, I'd set up a
    -    junction as follows (using the directory structure above as an example):
    -
    -        C:\..\python\trunk\external <- already exists and has built versions
    -                                       of the external subprojects 
    -
    -        C:\..\python\branches\py3k>linkd.exe external ..\..\trunk\external
    -        Link created at: external
    -
    -    Only a slight tweak would be needed to the buildbots such that bots
    -    building trunk and py3k could make use of the same facility.  (2.5.x
    -    builds need to be kept separate as they're using Visual Studio 7.1.)
    -/XXX trent.nelson 02-Apr-08
    -
    -Building for Itanium
    ---------------------
    -
    -NOTE:
    -Official support for Itanium builds have been dropped from the build. Please
    -contact us and provide patches if you are interested in Itanium builds.
    -
    -The project files support a ReleaseItanium configuration which creates
    -Win64/Itanium binaries. For this to work, you need to install the Platform
    -SDK, in particular the 64-bit support. This includes an Itanium compiler
    -(future releases of the SDK likely include an AMD64 compiler as well).
    -In addition, you need the Visual Studio plugin for external C compilers,
    -from http://sf.net/projects/vsextcomp. The plugin will wrap cl.exe, to
    -locate the proper target compiler, and convert compiler options
    -accordingly. The project files require at least version 0.9.
     
     Building for AMD64
     ------------------
     
    -The build process for AMD64 / x64 is very similar to standard builds. You just
    -have to set x64 as platform. In addition, the HOST_PYTHON environment variable
    -must point to a Python interpreter (at least 2.4), to support cross-compilation.
    +The build process for AMD64 / x64 is very similar to standard builds,
    +you just have to set x64 as platform. In addition, the HOST_PYTHON
    +environment variable must point to a Python interpreter (at least 2.4),
    +to support cross-compilation from Win32.  Note that Visual Studio
    +requires either Standard Edition or better, or Express Edition with the
    +Windows SDK 64-bit compilers to be available in order to build 64-bit
    +binaries.
     
    -Building Python Using the free MS Toolkit Compiler
    ---------------------------------------------------
    -
    -Microsoft has withdrawn the free MS Toolkit Compiler, so this can no longer
    -be considered a supported option. Instead you can use the free VS C++ Express
    -Edition.
     
     Profile Guided Optimization
     ---------------------------
     
     The solution has two configurations for PGO. The PGInstrument
    -configuration must be build first. The PGInstrument binaries are
    -lniked against a profiling library and contain extra debug
    -information. The PGUpdate configuration takes the profiling data and
    -generates optimized binaries.
    +configuration must be built first. The PGInstrument binaries are linked
    +against a profiling library and contain extra debug information. The
    +PGUpdate configuration takes the profiling data and generates optimized
    +binaries.
     
    -The build_pgo.bat script automates the creation of optimized binaries. It
    -creates the PGI files, runs the unit test suite or PyBench with the PGI
    -python and finally creates the optimized files.
    +The build_pgo.bat script automates the creation of optimized binaries.
    +It creates the PGI files, runs the unit test suite or PyBench with the
    +PGI python, and finally creates the optimized files.
     
    -http://msdn2.microsoft.com/en-us/library/e7k32f4k(VS.90).aspx
    +See
    +    http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.100).aspx
    +for more on this topic.
    +
     
     Static library
     --------------
     
    -The solution has no configuration for static libraries. However it is easy
    -it build a static library instead of a DLL. You simply have to set the 
    -"Configuration Type" to "Static Library (.lib)" and alter the preprocessor
    -macro "Py_ENABLE_SHARED" to "Py_NO_ENABLE_SHARED". You may also have to
    -change the "Runtime Library" from "Multi-threaded DLL (/MD)" to 
    -"Multi-threaded (/MT)".
    +The solution has no configuration for static libraries. However it is
    +easy to build a static library instead of a DLL. You simply have to set
    +the "Configuration Type" to "Static Library (.lib)" and alter the
    +preprocessor macro "Py_ENABLE_SHARED" to "Py_NO_ENABLE_SHARED". You may
    +also have to change the "Runtime Library" from "Multi-threaded DLL
    +(/MD)" to "Multi-threaded (/MT)".
    +
     
     Visual Studio properties
     ------------------------
     
    -The PCbuild solution makes heavy use of Visual Studio property files 
    -(*.vsprops). The properties can be viewed and altered in the Property
    +The PCbuild solution makes heavy use of Visual Studio property files
    +(*.props). The properties can be viewed and altered in the Property
     Manager (View -> Other Windows -> Property Manager).
     
    +The property files used are (+-- = "also imports"):
      * debug (debug macro: _DEBUG)
      * pginstrument (PGO)
      * pgupdate (PGO)
    @@ -327,15 +327,18 @@
         +-- pyproject
      * pyproject (base settings for all projects, user macros like PyDllName)
      * release (release macro: NDEBUG)
    + * sqlite3 (used only by sqlite3.vcxproj)
      * x64 (AMD64 / x64 platform specific settings)
     
    -The pyproject propertyfile defines _WIN32 and x64 defines _WIN64 and _M_X64
    -although the macros are set by the compiler, too. The GUI doesn't always know
    -about the macros and confuse the user with false information.
    +The pyproject property file defines _WIN32 and x64 defines _WIN64 and
    +_M_X64 although the macros are set by the compiler, too. The GUI doesn't
    +always know about the macros and confuse the user with false
    +information.
     
    -YOUR OWN EXTENSION DLLs
    +
    +Your Own Extension DLLs
     -----------------------
     
    -If you want to create your own extension module DLL, there's an example
    -with easy-to-follow instructions in ../PC/example/; read the file
    -readme.txt there first.
    +If you want to create your own extension module DLL (.pyd), there's an
    +example with easy-to-follow instructions in ..\PC\example\; read the
    +file readme.txt there first.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 10:09:10 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Fri, 25 Oct 2013 10:09:10 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?devguide=3A_add_new_modules_to_expert?=
    	=?utf-8?q?_index?=
    Message-ID: <3d5dJQ2H5bz7Lk7@mail.python.org>
    
    http://hg.python.org/devguide/rev/55c069a6adc3
    changeset:   649:55c069a6adc3
    user:        Christian Heimes 
    date:        Fri Oct 25 10:08:55 2013 +0200
    summary:
      add new modules to expert index
    
    files:
      experts.rst |  3 +++
      1 files changed, 3 insertions(+), 0 deletions(-)
    
    
    diff --git a/experts.rst b/experts.rst
    --- a/experts.rst
    +++ b/experts.rst
    @@ -56,6 +56,7 @@
     array
     ast                   benjamin.peterson
     asynchat              josiahcarlson, giampaolo.rodola, stutzbach
    +asyncio
     asyncore              josiahcarlson, giampaolo.rodola, stutzbach
     atexit
     audioop
    @@ -190,6 +191,7 @@
     runpy                 ncoghlan
     sched                 giampaolo.rodola
     select
    +selectors
     shelve
     shlex
     shutil                tarek, hynek
    @@ -204,6 +206,7 @@
     sqlite3               ghaering
     ssl                   janssen, pitrou, giampaolo.rodola, christian.heimes
     stat                  christian.heimes
    +statistics
     string                georg.brandl*
     stringprep
     struct                mark.dickinson, meador.inge
    
    -- 
    Repository URL: http://hg.python.org/devguide
    
    From python-checkins at python.org  Fri Oct 25 12:23:37 2013
    From: python-checkins at python.org (tim.golden)
    Date: Fri, 25 Oct 2013 12:23:37 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue4905=3A_use_INVALID?=
     =?utf-8?q?=5FFILE=5FATTRIBUTES_where_appropriate=2E_=28Patch_by_Ulrich?=
    Message-ID: <3d5hHY3MJZz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/66398e1307f4
    changeset:   86621:66398e1307f4
    user:        Tim Golden 
    date:        Fri Oct 25 11:22:37 2013 +0100
    summary:
      Issue4905: use INVALID_FILE_ATTRIBUTES where appropriate. (Patch by Ulrich Eckhardt)
    
    files:
      Misc/ACKS             |   1 +
      Modules/posixmodule.c |  10 +++++-----
      2 files changed, 6 insertions(+), 5 deletions(-)
    
    
    diff --git a/Misc/ACKS b/Misc/ACKS
    --- a/Misc/ACKS
    +++ b/Misc/ACKS
    @@ -342,6 +342,7 @@
     Walter D?rwald
     Hans Eckardt
     Rodolpho Eckhardt
    +Ulrich Eckhardt
     David Edelsohn
     John Edmonds
     Grant Edwards
    diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
    --- a/Modules/posixmodule.c
    +++ b/Modules/posixmodule.c
    @@ -487,7 +487,7 @@
          * but this value would get interpreted as (uid_t)-1  by chown
          * and its siblings.   That's not what the user meant!  So we
          * throw an overflow exception instead.   (We already
    -     * handled a real -1 with PyLong_AsLongAndOverflow() above.) 
    +     * handled a real -1 with PyLong_AsLongAndOverflow() above.)
          */
         if (uid == (uid_t)-1)
             goto overflow;
    @@ -594,7 +594,7 @@
          * but this value would get interpreted as (gid_t)-1  by chown
          * and its siblings.   That's not what the user meant!  So we
          * throw an overflow exception instead.   (We already
    -     * handled a real -1 with PyLong_AsLongAndOverflow() above.) 
    +     * handled a real -1 with PyLong_AsLongAndOverflow() above.)
          */
         if (gid == (gid_t)-1)
             goto overflow;
    @@ -2666,7 +2666,7 @@
          * (Directories cannot be read-only on Windows.)
         */
         return_value = PyBool_FromLong(
    -        (attr != 0xFFFFFFFF) &&
    +        (attr != INVALID_FILE_ATTRIBUTES) &&
                 (!(mode & 2) ||
                 !(attr & FILE_ATTRIBUTE_READONLY) ||
                 (attr & FILE_ATTRIBUTE_DIRECTORY)));
    @@ -2938,7 +2938,7 @@
             attr = GetFileAttributesW(path.wide);
         else
             attr = GetFileAttributesA(path.narrow);
    -    if (attr == 0xFFFFFFFF)
    +    if (attr == INVALID_FILE_ATTRIBUTES)
             result = 0;
         else {
             if (mode & _S_IWRITE)
    @@ -7795,7 +7795,7 @@
     
         if (!PyArg_ParseTuple(args, "i:dup", &fd))
             return NULL;
    -    
    +
         fd = _Py_dup(fd);
         if (fd == -1)
             return NULL;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 17:56:52 2013
    From: python-checkins at python.org (charles-francois.natali)
    Date: Fri, 25 Oct 2013 17:56:52 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_test=5Fselectors=3A_rename?=
     =?utf-8?q?_test=5Finterrupted=5Fretry=28=29_=28since_it_doesn=27t_actuall?=
     =?utf-8?q?y?=
    Message-ID: <3d5qh441KlzR1R@mail.python.org>
    
    http://hg.python.org/cpython/rev/726191fafd81
    changeset:   86622:726191fafd81
    user:        Charles-Fran?ois Natali 
    date:        Fri Oct 25 17:49:47 2013 +0200
    summary:
      test_selectors: rename test_interrupted_retry() (since it doesn't actually
    retry on EINTR).
    
    files:
      Lib/test/test_selectors.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
    --- a/Lib/test/test_selectors.py
    +++ b/Lib/test/test_selectors.py
    @@ -279,7 +279,7 @@
     
         @unittest.skipUnless(hasattr(signal, "alarm"),
                              "signal.alarm() required for this test")
    -    def test_interrupted_retry(self):
    +    def test_select_interrupt(self):
             s = self.SELECTOR()
             self.addCleanup(s.close)
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 17:56:53 2013
    From: python-checkins at python.org (charles-francois.natali)
    Date: Fri, 25 Oct 2013 17:56:53 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_test=5Fselectors=3A_make_t?=
     =?utf-8?q?imeout-related_errors_report_the_actual_elapsed_timeout=2E?=
    Message-ID: <3d5qh55hTlzR1R@mail.python.org>
    
    http://hg.python.org/cpython/rev/eb1edc9e3722
    changeset:   86623:eb1edc9e3722
    user:        Charles-Fran?ois Natali 
    date:        Fri Oct 25 17:56:00 2013 +0200
    summary:
      test_selectors: make timeout-related errors report the actual elapsed timeout.
    
    files:
      Lib/test/test_selectors.py |  9 +++++----
      1 files changed, 5 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
    --- a/Lib/test/test_selectors.py
    +++ b/Lib/test/test_selectors.py
    @@ -264,18 +264,19 @@
             t = time()
             self.assertEqual(1, len(s.select(0)))
             self.assertEqual(1, len(s.select(-1)))
    -        self.assertTrue(time() - t < 0.5)
    +        self.assertLess(time() - t, 0.5)
     
             s.unregister(wr)
             s.register(rd, selectors.EVENT_READ)
             t = time()
             self.assertFalse(s.select(0))
             self.assertFalse(s.select(-1))
    -        self.assertTrue(time() - t < 0.5)
    +        self.assertLess(time() - t, 0.5)
     
    -        t = time()
    +        t0 = time()
             self.assertFalse(s.select(1))
    -        self.assertTrue(0.5 < time() - t < 1.5)
    +        t1 = time()
    +        self.assertTrue(0.5 < t1 - t0 < 1.5, t1 - t0)
     
         @unittest.skipUnless(hasattr(signal, "alarm"),
                              "signal.alarm() required for this test")
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 18:34:09 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 18:34:09 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Stop_hav?=
     =?utf-8?q?ing_test=2Etest=5Fimportlib=2Eabc_ABCs_inherit_from?=
    Message-ID: <3d5rW50dvrz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/becc0a488189
    changeset:   86624:becc0a488189
    user:        Brett Cannon 
    date:        Fri Oct 25 12:33:59 2013 -0400
    summary:
      Issue #16803: Stop having test.test_importlib.abc ABCs inherit from
    unittest.TestCase in prep of running tests under frozen and source
    importlib.
    
    files:
      Lib/test/test_importlib/abc.py                     |  4 ++--
      Lib/test/test_importlib/builtin/test_finder.py     |  9 ++-------
      Lib/test/test_importlib/builtin/test_loader.py     |  2 +-
      Lib/test/test_importlib/extension/test_finder.py   |  2 +-
      Lib/test/test_importlib/extension/test_loader.py   |  2 +-
      Lib/test/test_importlib/frozen/test_finder.py      |  2 +-
      Lib/test/test_importlib/frozen/test_loader.py      |  2 +-
      Lib/test/test_importlib/source/test_file_loader.py |  7 ++++++-
      Lib/test/test_importlib/source/test_finder.py      |  2 +-
      9 files changed, 16 insertions(+), 16 deletions(-)
    
    
    diff --git a/Lib/test/test_importlib/abc.py b/Lib/test/test_importlib/abc.py
    --- a/Lib/test/test_importlib/abc.py
    +++ b/Lib/test/test_importlib/abc.py
    @@ -2,7 +2,7 @@
     import unittest
     
     
    -class FinderTests(unittest.TestCase, metaclass=abc.ABCMeta):
    +class FinderTests(metaclass=abc.ABCMeta):
     
         """Basic tests for a finder to pass."""
     
    @@ -39,7 +39,7 @@
             pass
     
     
    -class LoaderTests(unittest.TestCase, metaclass=abc.ABCMeta):
    +class LoaderTests(metaclass=abc.ABCMeta):
     
         @abc.abstractmethod
         def test_module(self):
    diff --git a/Lib/test/test_importlib/builtin/test_finder.py b/Lib/test/test_importlib/builtin/test_finder.py
    --- a/Lib/test/test_importlib/builtin/test_finder.py
    +++ b/Lib/test/test_importlib/builtin/test_finder.py
    @@ -6,7 +6,7 @@
     import sys
     import unittest
     
    -class FinderTests(abc.FinderTests):
    +class FinderTests(unittest.TestCase, abc.FinderTests):
     
         """Test find_module() for built-in modules."""
     
    @@ -46,10 +46,5 @@
     
     
     
    -def test_main():
    -    from test.support import run_unittest
    -    run_unittest(FinderTests)
    -
    -
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    diff --git a/Lib/test/test_importlib/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py
    --- a/Lib/test/test_importlib/builtin/test_loader.py
    +++ b/Lib/test/test_importlib/builtin/test_loader.py
    @@ -9,7 +9,7 @@
     import unittest
     
     
    -class LoaderTests(abc.LoaderTests):
    +class LoaderTests(unittest.TestCase, abc.LoaderTests):
     
         """Test load_module() for built-in modules."""
     
    diff --git a/Lib/test/test_importlib/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py
    --- a/Lib/test/test_importlib/extension/test_finder.py
    +++ b/Lib/test/test_importlib/extension/test_finder.py
    @@ -4,7 +4,7 @@
     
     import unittest
     
    -class FinderTests(abc.FinderTests):
    +class FinderTests(unittest.TestCase, abc.FinderTests):
     
         """Test the finder for extension modules."""
     
    diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
    --- a/Lib/test/test_importlib/extension/test_loader.py
    +++ b/Lib/test/test_importlib/extension/test_loader.py
    @@ -8,7 +8,7 @@
     import unittest
     
     
    -class LoaderTests(abc.LoaderTests):
    +class LoaderTests(unittest.TestCase, abc.LoaderTests):
     
         """Test load_module() for extension modules."""
     
    diff --git a/Lib/test/test_importlib/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py
    --- a/Lib/test/test_importlib/frozen/test_finder.py
    +++ b/Lib/test/test_importlib/frozen/test_finder.py
    @@ -4,7 +4,7 @@
     import unittest
     
     
    -class FinderTests(abc.FinderTests):
    +class FinderTests(unittest.TestCase, abc.FinderTests):
     
         """Test finding frozen modules."""
     
    diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py
    --- a/Lib/test/test_importlib/frozen/test_loader.py
    +++ b/Lib/test/test_importlib/frozen/test_loader.py
    @@ -7,7 +7,7 @@
     import types
     
     
    -class LoaderTests(abc.LoaderTests):
    +class LoaderTests(unittest.TestCase, abc.LoaderTests):
     
         def test_module(self):
             with util.uncache('__hello__'), captured_stdout() as stdout:
    diff --git a/Lib/test/test_importlib/source/test_file_loader.py b/Lib/test/test_importlib/source/test_file_loader.py
    --- a/Lib/test/test_importlib/source/test_file_loader.py
    +++ b/Lib/test/test_importlib/source/test_file_loader.py
    @@ -19,7 +19,7 @@
     from test.support import make_legacy_pyc, unload
     
     
    -class SimpleTest(unittest.TestCase):
    +class SimpleTest(unittest.TestCase, abc.LoaderTests):
     
         """Should have no issue importing a source module [basic]. And if there is
         a syntax error, it should raise a SyntaxError [syntax error].
    @@ -177,6 +177,11 @@
                 # The pyc file was created.
                 os.stat(compiled)
     
    +    def test_unloadable(self):
    +        loader = machinery.SourceFileLoader('good name', {})
    +        with self.assertRaises(ImportError):
    +            loader.load_module('bad name')
    +
     
     class BadBytecodeTest(unittest.TestCase):
     
    diff --git a/Lib/test/test_importlib/source/test_finder.py b/Lib/test/test_importlib/source/test_finder.py
    --- a/Lib/test/test_importlib/source/test_finder.py
    +++ b/Lib/test/test_importlib/source/test_finder.py
    @@ -13,7 +13,7 @@
     import warnings
     
     
    -class FinderTests(abc.FinderTests):
    +class FinderTests(unittest.TestCase, abc.FinderTests):
     
         """For a top-level module, it should just be found directly in the
         directory being searched. This is true for a directory with source
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 18:44:43 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 18:44:43 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Have_tes?=
     =?utf-8?q?t=2Etest=5Fimportlib=2Ebuiltin_test_both_frozen_and?=
    Message-ID: <3d5rlH6y3GzQvG@mail.python.org>
    
    http://hg.python.org/cpython/rev/e2c3f638c3d0
    changeset:   86625:e2c3f638c3d0
    user:        Brett Cannon 
    date:        Fri Oct 25 12:44:36 2013 -0400
    summary:
      Issue #16803: Have test.test_importlib.builtin test both frozen and
    source importlib.
    
    files:
      Lib/test/test_importlib/builtin/test_finder.py |  14 ++-
      Lib/test/test_importlib/builtin/test_loader.py |  45 +++++----
      2 files changed, 33 insertions(+), 26 deletions(-)
    
    
    diff --git a/Lib/test/test_importlib/builtin/test_finder.py b/Lib/test/test_importlib/builtin/test_finder.py
    --- a/Lib/test/test_importlib/builtin/test_finder.py
    +++ b/Lib/test/test_importlib/builtin/test_finder.py
    @@ -1,19 +1,21 @@
    -from importlib import machinery
     from .. import abc
     from .. import util
     from . import util as builtin_util
     
    +frozen_machinery, source_machinery = util.import_importlib('importlib.machinery')
    +
     import sys
     import unittest
     
    -class FinderTests(unittest.TestCase, abc.FinderTests):
    +
    +class FinderTests(abc.FinderTests):
     
         """Test find_module() for built-in modules."""
     
         def test_module(self):
             # Common case.
             with util.uncache(builtin_util.NAME):
    -            found = machinery.BuiltinImporter.find_module(builtin_util.NAME)
    +            found = self.machinery.BuiltinImporter.find_module(builtin_util.NAME)
                 self.assertTrue(found)
     
         def test_package(self):
    @@ -34,16 +36,18 @@
     
         def test_failure(self):
             assert 'importlib' not in sys.builtin_module_names
    -        loader = machinery.BuiltinImporter.find_module('importlib')
    +        loader = self.machinery.BuiltinImporter.find_module('importlib')
             self.assertIsNone(loader)
     
         def test_ignore_path(self):
             # The value for 'path' should always trigger a failed import.
             with util.uncache(builtin_util.NAME):
    -            loader = machinery.BuiltinImporter.find_module(builtin_util.NAME,
    +            loader = self.machinery.BuiltinImporter.find_module(builtin_util.NAME,
                                                                 ['pkg'])
                 self.assertIsNone(loader)
     
    +Frozen_FinderTests, Source_FinderTests = util.test_both(FinderTests,
    +        machinery=[frozen_machinery, source_machinery])
     
     
     if __name__ == '__main__':
    diff --git a/Lib/test/test_importlib/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py
    --- a/Lib/test/test_importlib/builtin/test_loader.py
    +++ b/Lib/test/test_importlib/builtin/test_loader.py
    @@ -1,20 +1,21 @@
    -import importlib
    -from importlib import machinery
     from .. import abc
     from .. import util
     from . import util as builtin_util
     
    +frozen_machinery, source_machinery = util.import_importlib('importlib.machinery')
    +
     import sys
     import types
     import unittest
     
     
    -class LoaderTests(unittest.TestCase, abc.LoaderTests):
    +class LoaderTests(abc.LoaderTests):
     
         """Test load_module() for built-in modules."""
     
    -    verification = {'__name__': 'errno', '__package__': '',
    -                    '__loader__': machinery.BuiltinImporter}
    +    def setUp(self):
    +        self.verification = {'__name__': 'errno', '__package__': '',
    +                             '__loader__': self.machinery.BuiltinImporter}
     
         def verify(self, module):
             """Verify that the module matches against what it should have."""
    @@ -23,8 +24,8 @@
                 self.assertEqual(getattr(module, attr), value)
             self.assertIn(module.__name__, sys.modules)
     
    -    load_module = staticmethod(lambda name:
    -                                machinery.BuiltinImporter.load_module(name))
    +    def load_module(self, name):
    +        return self.machinery.BuiltinImporter.load_module(name)
     
         def test_module(self):
             # Common case.
    @@ -61,45 +62,47 @@
         def test_already_imported(self):
             # Using the name of a module already imported but not a built-in should
             # still fail.
    -        assert hasattr(importlib, '__file__')  # Not a built-in.
    +        assert hasattr(unittest, '__file__')  # Not a built-in.
             with self.assertRaises(ImportError) as cm:
    -            self.load_module('importlib')
    -        self.assertEqual(cm.exception.name, 'importlib')
    +            self.load_module('unittest')
    +        self.assertEqual(cm.exception.name, 'unittest')
     
     
    -class InspectLoaderTests(unittest.TestCase):
    +Frozen_LoaderTests, Source_LoaderTests = util.test_both(LoaderTests,
    +        machinery=[frozen_machinery, source_machinery])
    +
    +
    +class InspectLoaderTests:
     
         """Tests for InspectLoader methods for BuiltinImporter."""
     
         def test_get_code(self):
             # There is no code object.
    -        result = machinery.BuiltinImporter.get_code(builtin_util.NAME)
    +        result = self.machinery.BuiltinImporter.get_code(builtin_util.NAME)
             self.assertIsNone(result)
     
         def test_get_source(self):
             # There is no source.
    -        result = machinery.BuiltinImporter.get_source(builtin_util.NAME)
    +        result = self.machinery.BuiltinImporter.get_source(builtin_util.NAME)
             self.assertIsNone(result)
     
         def test_is_package(self):
             # Cannot be a package.
    -        result = machinery.BuiltinImporter.is_package(builtin_util.NAME)
    +        result = self.machinery.BuiltinImporter.is_package(builtin_util.NAME)
             self.assertTrue(not result)
     
         def test_not_builtin(self):
             # Modules not built-in should raise ImportError.
             for meth_name in ('get_code', 'get_source', 'is_package'):
    -            method = getattr(machinery.BuiltinImporter, meth_name)
    +            method = getattr(self.machinery.BuiltinImporter, meth_name)
             with self.assertRaises(ImportError) as cm:
                 method(builtin_util.BAD_NAME)
             self.assertRaises(builtin_util.BAD_NAME)
     
    -
    -
    -def test_main():
    -    from test.support import run_unittest
    -    run_unittest(LoaderTests, InspectLoaderTests)
    +Frozen_InspectLoaderTests, Source_InspectLoaderTests = util.test_both(
    +        InspectLoaderTests,
    +        machinery=[frozen_machinery, source_machinery])
     
     
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:49:33 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 19:49:33 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mzky?=
     =?utf-8?q?=3A_Document_that_imp=2Ereload=28=29_now_relies_on_=5F=5Floader?=
     =?utf-8?b?X18=?=
    Message-ID: <3d5tB50F7yz7LkT@mail.python.org>
    
    http://hg.python.org/cpython/rev/f575f6298eb1
    changeset:   86626:f575f6298eb1
    branch:      3.3
    parent:      86618:85dcab725a2d
    user:        Brett Cannon 
    date:        Fri Oct 25 13:46:15 2013 -0400
    summary:
      Issue #19392: Document that imp.reload() now relies on __loader__
    being defined on top of __name__.
    
    files:
      Doc/library/imp.rst |  4 ++++
      Misc/NEWS           |  3 +++
      2 files changed, 7 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst
    --- a/Doc/library/imp.rst
    +++ b/Doc/library/imp.rst
    @@ -172,6 +172,10 @@
        the class does not affect the method definitions of the instances --- they
        continue to use the old class definition.  The same is true for derived classes.
     
    +   .. versionchanged:: 3.3
    +      Relies on both ``__name__`` and ``__loader__`` being defined on the module
    +      being reloaded instead of just ``__name__``.
    +
     
     The following functions are conveniences for handling :pep:`3147` byte-compiled
     file paths.
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -531,6 +531,9 @@
     Documentation
     -------------
     
    +- Issue #19392: Document that `imp.reload()` now also requires `__loader__` to
    +  be set on the module being reloaded.
    +
     - Issue #18758: Fixed and improved cross-references.
     
     - Issue #18743: Fix references to non-existant "StringIO" module.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:49:34 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 19:49:34 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_merge_from_3=2E3?=
    Message-ID: <3d5tB626WZz7LkT@mail.python.org>
    
    http://hg.python.org/cpython/rev/e1b5149adc3b
    changeset:   86627:e1b5149adc3b
    parent:      86625:e2c3f638c3d0
    parent:      86626:f575f6298eb1
    user:        Brett Cannon 
    date:        Fri Oct 25 13:49:20 2013 -0400
    summary:
      merge from 3.3
    
    files:
      Doc/library/imp.rst |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst
    --- a/Doc/library/imp.rst
    +++ b/Doc/library/imp.rst
    @@ -179,6 +179,10 @@
        the class does not affect the method definitions of the instances --- they
        continue to use the old class definition.  The same is true for derived classes.
     
    +   .. versionchanged:: 3.3
    +      Relies on both ``__name__`` and ``__loader__`` being defined on the module
    +      being reloaded instead of just ``__name__``.
    +
        .. deprecated:: 3.4
           Use :func:`importlib.reload` instead.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:51:29 2013
    From: python-checkins at python.org (brian.quinlan)
    Date: Fri, 25 Oct 2013 19:51:29 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2311161=3A_Update_t?=
     =?utf-8?q?he_documentation_for_ProcessPoolExecutor_to_note_that_it?=
    Message-ID: <3d5tDK1DMqz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/44b69e95d276
    changeset:   86628:44b69e95d276
    parent:      86625:e2c3f638c3d0
    user:        bquinlan 
    date:        Sat Oct 26 04:49:55 2013 +1100
    summary:
      Issue #11161: Update the documentation for ProcessPoolExecutor to note that it will not work in the interactive shell.
    
    files:
      Doc/library/concurrent.futures.rst |  3 +++
      1 files changed, 3 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst
    --- a/Doc/library/concurrent.futures.rst
    +++ b/Doc/library/concurrent.futures.rst
    @@ -164,6 +164,9 @@
     allows it to side-step the :term:`Global Interpreter Lock` but also means that
     only picklable objects can be executed and returned.
     
    +The ``__main__`` module must be importable by worker subprocesses. This means
    +that :class:`ProcessPoolExecutor` will not work in the interactive interpreter.
    +
     Calling :class:`Executor` or :class:`Future` methods from a callable submitted
     to a :class:`ProcessPoolExecutor` will result in deadlock.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:51:30 2013
    From: python-checkins at python.org (brian.quinlan)
    Date: Fri, 25 Oct 2013 19:51:30 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?=
    	=?utf-8?b?KTogTWVyZ2Uu?=
    Message-ID: <3d5tDL3ggCz7Ljt@mail.python.org>
    
    http://hg.python.org/cpython/rev/687eba0182d7
    changeset:   86629:687eba0182d7
    parent:      86628:44b69e95d276
    parent:      86627:e1b5149adc3b
    user:        bquinlan 
    date:        Sat Oct 26 04:51:18 2013 +1100
    summary:
      Merge.
    
    files:
      Doc/library/imp.rst |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst
    --- a/Doc/library/imp.rst
    +++ b/Doc/library/imp.rst
    @@ -179,6 +179,10 @@
        the class does not affect the method definitions of the instances --- they
        continue to use the old class definition.  The same is true for derived classes.
     
    +   .. versionchanged:: 3.3
    +      Relies on both ``__name__`` and ``__loader__`` being defined on the module
    +      being reloaded instead of just ``__name__``.
    +
        .. deprecated:: 3.4
           Use :func:`importlib.reload` instead.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:53:12 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 19:53:12 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Tweak_some_doc_wording_for?=
    	=?utf-8?q?_importlib=2Ereload?=
    Message-ID: <3d5tGJ63rHz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/1428659a41b6
    changeset:   86630:1428659a41b6
    parent:      86627:e1b5149adc3b
    user:        Brett Cannon 
    date:        Fri Oct 25 13:52:46 2013 -0400
    summary:
      Tweak some doc wording for importlib.reload
    
    files:
      Doc/library/importlib.rst |  5 +++--
      1 files changed, 3 insertions(+), 2 deletions(-)
    
    
    diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
    --- a/Doc/library/importlib.rst
    +++ b/Doc/library/importlib.rst
    @@ -121,9 +121,10 @@
        so it must have been successfully imported before.  This is useful if you
        have edited the module source file using an external editor and want to try
        out the new version without leaving the Python interpreter.  The return value
    -   is the module object (the same as the *module* argument).
    +   is the module object (which can be different if re-importing causes a
    +   different object to be placed in :data:`sys.modules`).
     
    -   When :func:`.reload` is executed:
    +   When :func:`reload` is executed:
     
        * Python modules' code is recompiled and the module-level code re-executed,
          defining a new set of objects which are bound to names in the module's
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 19:53:14 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 19:53:14 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?=
    	=?utf-8?q?=29=3A_merge?=
    Message-ID: <3d5tGL0jY6z7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/7e3e2cfc27db
    changeset:   86631:7e3e2cfc27db
    parent:      86630:1428659a41b6
    parent:      86629:687eba0182d7
    user:        Brett Cannon 
    date:        Fri Oct 25 13:53:06 2013 -0400
    summary:
      merge
    
    files:
      Doc/library/concurrent.futures.rst |  3 +++
      1 files changed, 3 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst
    --- a/Doc/library/concurrent.futures.rst
    +++ b/Doc/library/concurrent.futures.rst
    @@ -164,6 +164,9 @@
     allows it to side-step the :term:`Global Interpreter Lock` but also means that
     only picklable objects can be executed and returned.
     
    +The ``__main__`` module must be importable by worker subprocesses. This means
    +that :class:`ProcessPoolExecutor` will not work in the interactive interpreter.
    +
     Calling :class:`Executor` or :class:`Future` methods from a callable submitted
     to a :class:`ProcessPoolExecutor` will result in deadlock.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 21:10:03 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:10:03 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Use_a_simpler_example?=
    Message-ID: <3d5vyz1V4Sz7Lk1@mail.python.org>
    
    http://hg.python.org/peps/rev/4cd8c76b2918
    changeset:   5217:4cd8c76b2918
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:03:28 2013 +0200
    summary:
      Use a simpler example
    
    files:
      pep-0428.txt |  4 ++--
      1 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -217,8 +217,8 @@
         '/'
         >>> p.parts
         
    -    >>> list(p.parents())
    -    [PosixPath('/home/antoine/pathlib'), PosixPath('/home/antoine'), PosixPath('/home'), PosixPath('/')]
    +    >>> p.relative('/home/antoine')
    +    PosixPath('pathlib/setup.py')
         >>> p.exists()
         True
         >>> p.st_size
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Fri Oct 25 21:10:04 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:10:04 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Typo?=
    Message-ID: <3d5vz03NgGz7Lkp@mail.python.org>
    
    http://hg.python.org/peps/rev/f3705354f869
    changeset:   5218:f3705354f869
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:03:50 2013 +0200
    summary:
      Typo
    
    files:
      pep-0428.txt |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -248,7 +248,7 @@
       ``\\some\share\myfile.txt``) always has a drive and a root
       (here, ``\\some\share`` and ``\``, respectively).
     
    -* A drive which has either a drive *or* a root is said to be anchored.
    +* A path which has either a drive *or* a root is said to be anchored.
       Its anchor is the concatenation of the drive and root.  Under POSIX,
       "anchored" is the same as "absolute".
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Fri Oct 25 21:10:05 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:10:05 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Simplify_joinpath=28=29_examp?=
    	=?utf-8?q?le?=
    Message-ID: <3d5vz15RGSz7Ll5@mail.python.org>
    
    http://hg.python.org/peps/rev/d8511720bd92
    changeset:   5219:d8511720bd92
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:05:22 2013 +0200
    summary:
      Simplify joinpath() example
    
    files:
      pep-0428.txt |  8 +++-----
      1 files changed, 3 insertions(+), 5 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -406,12 +406,10 @@
         >>> p / 'bar' / 'xyzzy'
         PurePosixPath('foo/bar/xyzzy')
     
    -A joinpath() method is also provided, with the same behaviour.  It can serve
    -as a factory function::
    +A joinpath() method is also provided, with the same behaviour::
     
    -    >>> path_factory = p.joinpath
    -    >>> path_factory('bar')
    -    PurePosixPath('foo/bar')
    +    >>> p.joinpath('Python')
    +    PurePosixPath('foo/Python')
     
     Changing the path's final component
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Fri Oct 25 21:10:07 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:10:07 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_s/alteration/modification/?=
    Message-ID: <3d5vz309kdz7Lk2@mail.python.org>
    
    http://hg.python.org/peps/rev/5af06ad9c586
    changeset:   5220:5af06ad9c586
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:09:57 2013 +0200
    summary:
      s/alteration/modification/
    
    files:
      pep-0428.txt |  4 ++--
      1 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -647,8 +647,8 @@
         b'#!/usr/bin/env '
     
     
    -Filesystem alteration
    ----------------------
    +Filesystem modification
    +-----------------------
     
     Several common filesystem operations are provided as methods: ``touch()``,
     ``mkdir()``, ``rename()``, ``replace()``, ``unlink()``, ``rmdir()``,
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Fri Oct 25 21:28:42 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:28:42 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_a_discussion_section?=
    Message-ID: <3d5wNV6DCdz7Ljm@mail.python.org>
    
    http://hg.python.org/peps/rev/777c82dad4aa
    changeset:   5221:777c82dad4aa
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:28:38 2013 +0200
    summary:
      Add a discussion section
    
    files:
      pep-0428.txt |  36 ++++++++++++++++++++++++++++++++++++
      1 files changed, 36 insertions(+), 0 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -656,6 +656,42 @@
     provided, for example some of the functionality of the shutil module.
     
     
    +Discussion
    +==========
    +
    +Division operator
    +-----------------
    +
    +The division operator came out first in a `poll`_ about the path joining
    +operator.  Initial versions of `pathlib`_ used square brackets
    +(i.e. ``__getitem__``) instead.
    +
    +.. _poll: https://mail.python.org/pipermail/python-ideas/2012-October/016544.html
    +
    +joinpath()
    +----------
    +
    +The joinpath() method was initially called join(), but several people
    +objected that it could be confused with str.join() which has different
    +semantics.  Therefore it was renamed to joinpath().
    +
    +Case-sensitivity
    +----------------
    +
    +Windows users consider filesystem paths to be case-insensitive and expect
    +path objects to observe that characteristic, even though in some rare
    +situations some foreign filesystem mounts may be case-sensitive under
    +Windows.
    +
    +In the words of one commenter,
    +
    +    "If glob("\*.py") failed to find SETUP.PY on Windows, that would be a
    +    usability disaster".
    +
    +    -- Paul Moore in
    +    https://mail.python.org/pipermail/python-dev/2013-April/125254.html
    +
    +
     Copyright
     =========
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Fri Oct 25 21:39:11 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 21:39:11 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316803=3A_Move_tes?=
     =?utf-8?q?t=2Etest=5Fimportlib=2Eextension_to_use_both_frozen_and_source?=
    Message-ID: <3d5wcb2M47z7Lkm@mail.python.org>
    
    http://hg.python.org/cpython/rev/f3d50720dee0
    changeset:   86632:f3d50720dee0
    user:        Brett Cannon 
    date:        Fri Oct 25 15:39:02 2013 -0400
    summary:
      Issue #16803: Move test.test_importlib.extension to use both frozen and source importlib code
    
    files:
      Lib/test/test_importlib/extension/test_case_sensitivity.py |  26 ++++-----
      Lib/test/test_importlib/extension/test_finder.py           |  21 ++++---
      Lib/test/test_importlib/extension/test_loader.py           |  22 ++++----
      Lib/test/test_importlib/extension/test_path_hook.py        |  19 +++---
      4 files changed, 44 insertions(+), 44 deletions(-)
    
    
    diff --git a/Lib/test/test_importlib/extension/test_case_sensitivity.py b/Lib/test/test_importlib/extension/test_case_sensitivity.py
    --- a/Lib/test/test_importlib/extension/test_case_sensitivity.py
    +++ b/Lib/test/test_importlib/extension/test_case_sensitivity.py
    @@ -1,23 +1,25 @@
    +from importlib import _bootstrap
     import sys
     from test import support
     import unittest
     
    -from importlib import _bootstrap
    -from importlib import machinery
     from .. import util
     from . import util as ext_util
     
    +frozen_machinery, source_machinery = util.import_importlib('importlib.machinery')
     
    +
    + at unittest.skipIf(ext_util.FILENAME is None, '_testcapi not available')
     @util.case_insensitive_tests
    -class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
    +class ExtensionModuleCaseSensitivityTest:
     
         def find_module(self):
             good_name = ext_util.NAME
             bad_name = good_name.upper()
             assert good_name != bad_name
    -        finder = machinery.FileFinder(ext_util.PATH,
    -                                        (machinery.ExtensionFileLoader,
    -                                         machinery.EXTENSION_SUFFIXES))
    +        finder = self.machinery.FileFinder(ext_util.PATH,
    +                                          (self.machinery.ExtensionFileLoader,
    +                                           self.machinery.EXTENSION_SUFFIXES))
             return finder.find_module(bad_name)
     
         def test_case_sensitive(self):
    @@ -38,14 +40,10 @@
                 loader = self.find_module()
                 self.assertTrue(hasattr(loader, 'load_module'))
     
    -
    -
    -
    -def test_main():
    -    if ext_util.FILENAME is None:
    -        return
    -    support.run_unittest(ExtensionModuleCaseSensitivityTest)
    +Frozen_ExtensionCaseSensitivity, Source_ExtensionCaseSensitivity = util.test_both(
    +        ExtensionModuleCaseSensitivityTest,
    +        machinery=[frozen_machinery, source_machinery])
     
     
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    diff --git a/Lib/test/test_importlib/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py
    --- a/Lib/test/test_importlib/extension/test_finder.py
    +++ b/Lib/test/test_importlib/extension/test_finder.py
    @@ -1,17 +1,20 @@
    -from importlib import machinery
     from .. import abc
    +from .. import util as test_util
     from . import util
     
    +machinery = test_util.import_importlib('importlib.machinery')
    +
     import unittest
     
    -class FinderTests(unittest.TestCase, abc.FinderTests):
    +
    +class FinderTests(abc.FinderTests):
     
         """Test the finder for extension modules."""
     
         def find_module(self, fullname):
    -        importer = machinery.FileFinder(util.PATH,
    -                                        (machinery.ExtensionFileLoader,
    -                                         machinery.EXTENSION_SUFFIXES))
    +        importer = self.machinery.FileFinder(util.PATH,
    +                                            (self.machinery.ExtensionFileLoader,
    +                                             self.machinery.EXTENSION_SUFFIXES))
             return importer.find_module(fullname)
     
         def test_module(self):
    @@ -36,11 +39,9 @@
         def test_failure(self):
             self.assertIsNone(self.find_module('asdfjkl;'))
     
    -
    -def test_main():
    -    from test.support import run_unittest
    -    run_unittest(FinderTests)
    +Frozen_FinderTests, Source_FinderTests = test_util.test_both(
    +        FinderTests, machinery=machinery)
     
     
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
    --- a/Lib/test/test_importlib/extension/test_loader.py
    +++ b/Lib/test/test_importlib/extension/test_loader.py
    @@ -1,20 +1,21 @@
    -from importlib import machinery
     from . import util as ext_util
     from .. import abc
     from .. import util
     
    +machinery = util.import_importlib('importlib.machinery')
    +
     import os.path
     import sys
     import unittest
     
     
    -class LoaderTests(unittest.TestCase, abc.LoaderTests):
    +class LoaderTests(abc.LoaderTests):
     
         """Test load_module() for extension modules."""
     
         def setUp(self):
    -        self.loader = machinery.ExtensionFileLoader(ext_util.NAME,
    -                                                     ext_util.FILEPATH)
    +        self.loader = self.machinery.ExtensionFileLoader(ext_util.NAME,
    +                                                         ext_util.FILEPATH)
     
         def load_module(self, fullname):
             return self.loader.load_module(fullname)
    @@ -36,7 +37,7 @@
                     self.assertEqual(getattr(module, attr), value)
                 self.assertIn(ext_util.NAME, sys.modules)
                 self.assertIsInstance(module.__loader__,
    -                                  machinery.ExtensionFileLoader)
    +                                  self.machinery.ExtensionFileLoader)
     
         def test_package(self):
             # No extension module as __init__ available for testing.
    @@ -64,16 +65,15 @@
     
         def test_is_package(self):
             self.assertFalse(self.loader.is_package(ext_util.NAME))
    -        for suffix in machinery.EXTENSION_SUFFIXES:
    +        for suffix in self.machinery.EXTENSION_SUFFIXES:
                 path = os.path.join('some', 'path', 'pkg', '__init__' + suffix)
    -            loader = machinery.ExtensionFileLoader('pkg', path)
    +            loader = self.machinery.ExtensionFileLoader('pkg', path)
                 self.assertTrue(loader.is_package('pkg'))
     
    +Frozen_LoaderTests, Source_LoaderTests = util.test_both(
    +        LoaderTests, machinery=machinery)
     
    -def test_main():
    -    from test.support import run_unittest
    -    run_unittest(LoaderTests)
     
     
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    diff --git a/Lib/test/test_importlib/extension/test_path_hook.py b/Lib/test/test_importlib/extension/test_path_hook.py
    --- a/Lib/test/test_importlib/extension/test_path_hook.py
    +++ b/Lib/test/test_importlib/extension/test_path_hook.py
    @@ -1,31 +1,32 @@
    -from importlib import machinery
    +from .. import util as test_util
     from . import util
     
    +machinery = test_util.import_importlib('importlib.machinery')
    +
     import collections
     import sys
     import unittest
     
     
    -class PathHookTests(unittest.TestCase):
    +class PathHookTests:
     
         """Test the path hook for extension modules."""
         # XXX Should it only succeed for pre-existing directories?
         # XXX Should it only work for directories containing an extension module?
     
         def hook(self, entry):
    -        return machinery.FileFinder.path_hook((machinery.ExtensionFileLoader,
    -            machinery.EXTENSION_SUFFIXES))(entry)
    +        return self.machinery.FileFinder.path_hook(
    +                (self.machinery.ExtensionFileLoader,
    +                 self.machinery.EXTENSION_SUFFIXES))(entry)
     
         def test_success(self):
             # Path hook should handle a directory where a known extension module
             # exists.
             self.assertTrue(hasattr(self.hook(util.PATH), 'find_module'))
     
    -
    -def test_main():
    -    from test.support import run_unittest
    -    run_unittest(PathHookTests)
    +Frozen_PathHooksTests, Source_PathHooksTests = test_util.test_both(
    +        PathHookTests, machinery=machinery)
     
     
     if __name__ == '__main__':
    -    test_main()
    +    unittest.main()
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 21:40:02 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:40:02 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319387=3A_explain_?=
     =?utf-8?q?and_test_the_sre_overlap_table?=
    Message-ID: <3d5wdZ0FVyz7Lk2@mail.python.org>
    
    http://hg.python.org/cpython/rev/a2ed12e014ef
    changeset:   86633:a2ed12e014ef
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:36:10 2013 +0200
    summary:
      Issue #19387: explain and test the sre overlap table
    
    files:
      Lib/sre_compile.py  |  28 ++++++++++++++++++++++------
      Lib/test/test_re.py |  22 +++++++++++++++++++---
      2 files changed, 41 insertions(+), 9 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -353,6 +353,27 @@
         lo, hi = av[2].getwidth()
         return lo == hi == 1 and av[2][0][0] != SUBPATTERN
     
    +def _generate_overlap_table(prefix):
    +    """
    +    Generate an overlap table for the following prefix.
    +    An overlap table is a table of the same size as the prefix which
    +    informs about the potential self-overlap for each index in the prefix:
    +    - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...]
    +    - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with
    +      prefix[0:k]
    +    """
    +    table = [0] * len(prefix)
    +    for i in range(1, len(prefix)):
    +        idx = table[i - 1]
    +        while prefix[i] != prefix[idx]:
    +            if idx == 0:
    +                table[i] = 0
    +                break
    +            idx = table[idx - 1]
    +        else:
    +            table[i] = idx + 1
    +    return table
    +
     def _compile_info(code, pattern, flags):
         # internal: compile an info block.  in the current version,
         # this contains min/max pattern width, and an optional literal
    @@ -449,12 +470,7 @@
             emit(prefix_skip) # skip
             code.extend(prefix)
             # generate overlap table
    -        table = [-1] + ([0]*len(prefix))
    -        for i in range(len(prefix)):
    -            table[i+1] = table[i]+1
    -            while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]:
    -                table[i+1] = table[table[i+1]-1]+1
    -        code.extend(table[1:]) # don't store first entry
    +        code.extend(_generate_overlap_table(prefix))
         elif charset:
             _compile_charset(charset, flags, code)
         code[skip] = len(code) - skip
    diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
    --- a/Lib/test/test_re.py
    +++ b/Lib/test/test_re.py
    @@ -3,10 +3,12 @@
     import io
     import re
     from re import Scanner
    +import sre_compile
     import sre_constants
     import sys
     import string
     import traceback
    +import unittest
     from weakref import proxy
     
     # Misc tests from Tim Peters' re.doc
    @@ -15,8 +17,6 @@
     # what you're doing. Some of these tests were carefully modeled to
     # cover most of the code.
     
    -import unittest
    -
     class S(str):
         def __getitem__(self, index):
             return S(super().__getitem__(index))
    @@ -1140,6 +1140,22 @@
                     self.assertEqual(m.group(1), "")
                     self.assertEqual(m.group(2), "y")
     
    +
    +class ImplementationTest(unittest.TestCase):
    +    """
    +    Test implementation details of the re module.
    +    """
    +
    +    def test_overlap_table(self):
    +        f = sre_compile._generate_overlap_table
    +        self.assertEqual(f(""), [])
    +        self.assertEqual(f("a"), [0])
    +        self.assertEqual(f("abcd"), [0, 0, 0, 0])
    +        self.assertEqual(f("aaaa"), [0, 1, 2, 3])
    +        self.assertEqual(f("ababba"), [0, 0, 1, 2, 0, 1])
    +        self.assertEqual(f("abcabdac"), [0, 0, 0, 1, 2, 0, 1, 0])
    +
    +
     def run_re_tests():
         from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
         if verbose:
    @@ -1269,7 +1285,7 @@
     
     
     def test_main():
    -    run_unittest(ReTests)
    +    run_unittest(__name__)
         run_re_tests()
     
     if __name__ == "__main__":
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 21:40:03 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Fri, 25 Oct 2013 21:40:03 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319375=3A_The_site?=
     =?utf-8?q?_module_adding_a_=22site-python=22_directory_to_sys=2Epath=2C_i?=
     =?utf-8?q?f?=
    Message-ID: <3d5wdb3WSCz7Lk2@mail.python.org>
    
    http://hg.python.org/cpython/rev/90c56229efb7
    changeset:   86634:90c56229efb7
    user:        Antoine Pitrou 
    date:        Fri Oct 25 21:39:26 2013 +0200
    summary:
      Issue #19375: The site module adding a "site-python" directory to sys.path, if it exists, is now deprecated.
    
    files:
      Doc/library/site.rst |  3 +++
      Doc/whatsnew/3.4.rst |  3 ++-
      Lib/site.py          |  5 +++++
      Misc/NEWS            |  3 +++
      4 files changed, 13 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/site.rst b/Doc/library/site.rst
    --- a/Doc/library/site.rst
    +++ b/Doc/library/site.rst
    @@ -38,6 +38,9 @@
     if it refers to an existing directory, and if so, adds it to ``sys.path`` and
     also inspects the newly added path for configuration files.
     
    +.. deprecated:: 3.4
    +   Support for the "site-python" directory will be removed in 3.5.
    +
     If a file named "pyvenv.cfg" exists one directory above sys.executable,
     sys.prefix and sys.exec_prefix are set to that directory and
     it is also checked for site-packages and site-python (sys.base_prefix and
    diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
    --- a/Doc/whatsnew/3.4.rst
    +++ b/Doc/whatsnew/3.4.rst
    @@ -685,7 +685,8 @@
     Deprecated features
     -------------------
     
    -* No feature deprecations are planned for Python 3.4.
    +* The site module adding a "site-python" directory to sys.path, if it
    +  exists, is deprecated (:issue:`19375`).
     
     
     Porting to Python 3.4
    diff --git a/Lib/site.py b/Lib/site.py
    --- a/Lib/site.py
    +++ b/Lib/site.py
    @@ -326,6 +326,11 @@
         """Add site-packages (and possibly site-python) to sys.path"""
         for sitedir in getsitepackages(prefixes):
             if os.path.isdir(sitedir):
    +            if "site-python" in sitedir:
    +                import warnings
    +                warnings.warn('"site-python" directories will not be '
    +                              'supported in 3.5 anymore',
    +                              DeprecationWarning)
                 addsitedir(sitedir, known_paths)
     
         return known_paths
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -27,6 +27,9 @@
     Library
     -------
     
    +- Issue #19375: The site module adding a "site-python" directory to sys.path,
    +  if it exists, is now deprecated.
    +
     - Issue #19379: Lazily import linecache in the warnings module, to make
       startup with warnings faster until a warning gets printed.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 21:45:48 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 21:45:48 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_test=5Fresource_should_not?=
     =?utf-8?q?_assume_all_attributes_are_available_when_they?=
    Message-ID: <3d5wmD6jrMz7LkV@mail.python.org>
    
    http://hg.python.org/cpython/rev/513da56d28de
    changeset:   86635:513da56d28de
    parent:      86632:f3d50720dee0
    user:        Brett Cannon 
    date:        Fri Oct 25 15:45:25 2013 -0400
    summary:
      test_resource should not assume all attributes are available when they
    are individually controlled by #ifdef statements in the extension
    code.
    
    files:
      Lib/test/test_resource.py |  10 ++++------
      1 files changed, 4 insertions(+), 6 deletions(-)
    
    
    diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py
    --- a/Lib/test/test_resource.py
    +++ b/Lib/test/test_resource.py
    @@ -1,3 +1,4 @@
    +import contextlib
     import sys
     import os
     import unittest
    @@ -133,12 +134,9 @@
     
         @unittest.skipUnless(sys.platform == 'linux', 'test requires Linux')
         def test_linux_constants(self):
    -        self.assertIsInstance(resource.RLIMIT_MSGQUEUE, int)
    -        self.assertIsInstance(resource.RLIMIT_NICE, int)
    -        self.assertIsInstance(resource.RLIMIT_RTPRIO, int)
    -        self.assertIsInstance(resource.RLIMIT_RTTIME, int)
    -        self.assertIsInstance(resource.RLIMIT_SIGPENDING, int)
    -
    +        for attr in ['MSGQUEUE', 'NICE', 'RTPRIO', 'RTTIME', 'SIGPENDING']:
    +            with contextlib.suppress(AttributeError):
    +                self.assertIsInstance(getattr(resource, 'RLIMIT_' + attr), int)
     
         @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit')
         @support.requires_linux_version(2, 6, 36)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 21:45:50 2013
    From: python-checkins at python.org (brett.cannon)
    Date: Fri, 25 Oct 2013 21:45:50 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?=
    	=?utf-8?q?=29=3A_merge?=
    Message-ID: <3d5wmG3fQkz7Lkx@mail.python.org>
    
    http://hg.python.org/cpython/rev/315bf54f5419
    changeset:   86636:315bf54f5419
    parent:      86635:513da56d28de
    parent:      86634:90c56229efb7
    user:        Brett Cannon 
    date:        Fri Oct 25 15:45:42 2013 -0400
    summary:
      merge
    
    files:
      Doc/library/site.rst |   3 +++
      Doc/whatsnew/3.4.rst |   3 ++-
      Lib/site.py          |   5 +++++
      Lib/sre_compile.py   |  28 ++++++++++++++++++++++------
      Lib/test/test_re.py  |  22 +++++++++++++++++++---
      Misc/NEWS            |   3 +++
      6 files changed, 54 insertions(+), 10 deletions(-)
    
    
    diff --git a/Doc/library/site.rst b/Doc/library/site.rst
    --- a/Doc/library/site.rst
    +++ b/Doc/library/site.rst
    @@ -38,6 +38,9 @@
     if it refers to an existing directory, and if so, adds it to ``sys.path`` and
     also inspects the newly added path for configuration files.
     
    +.. deprecated:: 3.4
    +   Support for the "site-python" directory will be removed in 3.5.
    +
     If a file named "pyvenv.cfg" exists one directory above sys.executable,
     sys.prefix and sys.exec_prefix are set to that directory and
     it is also checked for site-packages and site-python (sys.base_prefix and
    diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
    --- a/Doc/whatsnew/3.4.rst
    +++ b/Doc/whatsnew/3.4.rst
    @@ -685,7 +685,8 @@
     Deprecated features
     -------------------
     
    -* No feature deprecations are planned for Python 3.4.
    +* The site module adding a "site-python" directory to sys.path, if it
    +  exists, is deprecated (:issue:`19375`).
     
     
     Porting to Python 3.4
    diff --git a/Lib/site.py b/Lib/site.py
    --- a/Lib/site.py
    +++ b/Lib/site.py
    @@ -326,6 +326,11 @@
         """Add site-packages (and possibly site-python) to sys.path"""
         for sitedir in getsitepackages(prefixes):
             if os.path.isdir(sitedir):
    +            if "site-python" in sitedir:
    +                import warnings
    +                warnings.warn('"site-python" directories will not be '
    +                              'supported in 3.5 anymore',
    +                              DeprecationWarning)
                 addsitedir(sitedir, known_paths)
     
         return known_paths
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -353,6 +353,27 @@
         lo, hi = av[2].getwidth()
         return lo == hi == 1 and av[2][0][0] != SUBPATTERN
     
    +def _generate_overlap_table(prefix):
    +    """
    +    Generate an overlap table for the following prefix.
    +    An overlap table is a table of the same size as the prefix which
    +    informs about the potential self-overlap for each index in the prefix:
    +    - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...]
    +    - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with
    +      prefix[0:k]
    +    """
    +    table = [0] * len(prefix)
    +    for i in range(1, len(prefix)):
    +        idx = table[i - 1]
    +        while prefix[i] != prefix[idx]:
    +            if idx == 0:
    +                table[i] = 0
    +                break
    +            idx = table[idx - 1]
    +        else:
    +            table[i] = idx + 1
    +    return table
    +
     def _compile_info(code, pattern, flags):
         # internal: compile an info block.  in the current version,
         # this contains min/max pattern width, and an optional literal
    @@ -449,12 +470,7 @@
             emit(prefix_skip) # skip
             code.extend(prefix)
             # generate overlap table
    -        table = [-1] + ([0]*len(prefix))
    -        for i in range(len(prefix)):
    -            table[i+1] = table[i]+1
    -            while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]:
    -                table[i+1] = table[table[i+1]-1]+1
    -        code.extend(table[1:]) # don't store first entry
    +        code.extend(_generate_overlap_table(prefix))
         elif charset:
             _compile_charset(charset, flags, code)
         code[skip] = len(code) - skip
    diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
    --- a/Lib/test/test_re.py
    +++ b/Lib/test/test_re.py
    @@ -3,10 +3,12 @@
     import io
     import re
     from re import Scanner
    +import sre_compile
     import sre_constants
     import sys
     import string
     import traceback
    +import unittest
     from weakref import proxy
     
     # Misc tests from Tim Peters' re.doc
    @@ -15,8 +17,6 @@
     # what you're doing. Some of these tests were carefully modeled to
     # cover most of the code.
     
    -import unittest
    -
     class S(str):
         def __getitem__(self, index):
             return S(super().__getitem__(index))
    @@ -1140,6 +1140,22 @@
                     self.assertEqual(m.group(1), "")
                     self.assertEqual(m.group(2), "y")
     
    +
    +class ImplementationTest(unittest.TestCase):
    +    """
    +    Test implementation details of the re module.
    +    """
    +
    +    def test_overlap_table(self):
    +        f = sre_compile._generate_overlap_table
    +        self.assertEqual(f(""), [])
    +        self.assertEqual(f("a"), [0])
    +        self.assertEqual(f("abcd"), [0, 0, 0, 0])
    +        self.assertEqual(f("aaaa"), [0, 1, 2, 3])
    +        self.assertEqual(f("ababba"), [0, 0, 1, 2, 0, 1])
    +        self.assertEqual(f("abcabdac"), [0, 0, 0, 1, 2, 0, 1, 0])
    +
    +
     def run_re_tests():
         from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
         if verbose:
    @@ -1269,7 +1285,7 @@
     
     
     def test_main():
    -    run_unittest(ReTests)
    +    run_unittest(__name__)
         run_re_tests()
     
     if __name__ == "__main__":
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -27,6 +27,9 @@
     Library
     -------
     
    +- Issue #19375: The site module adding a "site-python" directory to sys.path,
    +  if it exists, is now deprecated.
    +
     - Issue #19379: Lazily import linecache in the warnings module, to make
       startup with warnings faster until a warning gets printed.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 22:26:34 2013
    From: python-checkins at python.org (tim.golden)
    Date: Fri, 25 Oct 2013 22:26:34 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue13234_Allow_listdir_t?=
     =?utf-8?q?o_handle_extended_paths_on_Windows_=28Patch_by_Santoso?=
    Message-ID: <3d5xgG1mgmz7Lk2@mail.python.org>
    
    http://hg.python.org/cpython/rev/12aaa2943791
    changeset:   86637:12aaa2943791
    user:        Tim Golden 
    date:        Fri Oct 25 20:24:06 2013 +0100
    summary:
      Issue13234 Allow listdir to handle extended paths on Windows (Patch by Santoso Wijaya)
    
    files:
      Lib/test/test_os.py   |  47 +++++++++++++++++++++++++++++++
      Modules/posixmodule.c |   8 ++--
      2 files changed, 51 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
    --- a/Lib/test/test_os.py
    +++ b/Lib/test/test_os.py
    @@ -1559,6 +1559,52 @@
     
     
     @unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
    +class Win32ListdirTests(unittest.TestCase):
    +    """Test listdir on Windows."""
    +
    +    def setUp(self):
    +        self.created_paths = []
    +        for i in range(2):
    +            dir_name = 'SUB%d' % i
    +            dir_path = os.path.join(support.TESTFN, dir_name)
    +            file_name = 'FILE%d' % i
    +            file_path = os.path.join(support.TESTFN, file_name)
    +            os.makedirs(dir_path)
    +            with open(file_path, 'w') as f:
    +                f.write("I'm %s and proud of it. Blame test_os.\n" % file_path)
    +            self.created_paths.extend([dir_name, file_name])
    +        self.created_paths.sort()
    +
    +    def tearDown(self):
    +        shutil.rmtree(support.TESTFN)
    +
    +    def test_listdir_no_extended_path(self):
    +        """Test when the path is not an "extended" path."""
    +        # unicode
    +        self.assertEqual(
    +                sorted(os.listdir(support.TESTFN)),
    +                self.created_paths)
    +        # bytes
    +        self.assertEqual(
    +                sorted(os.listdir(os.fsencode(support.TESTFN))),
    +                [os.fsencode(path) for path in self.created_paths])
    +
    +    def test_listdir_extended_path(self):
    +        """Test when the path starts with '\\\\?\\'."""
    +        # See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath 
    +        # unicode
    +        path = '\\\\?\\' + os.path.abspath(support.TESTFN)
    +        self.assertEqual(
    +                sorted(os.listdir(path)),
    +                self.created_paths)
    +        # bytes
    +        path = b'\\\\?\\' + os.fsencode(os.path.abspath(support.TESTFN))
    +        self.assertEqual(
    +                sorted(os.listdir(path)),
    +                [os.fsencode(path) for path in self.created_paths])
    +
    +
    + at unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
     @support.skip_unless_symlink
     class Win32SymlinkTests(unittest.TestCase):
         filelink = 'filelinktest'
    @@ -2427,6 +2473,7 @@
             PosixUidGidTests,
             Pep383Tests,
             Win32KillTests,
    +        Win32ListdirTests,
             Win32SymlinkTests,
             NonLocalSymlinkTests,
             FSEncodingTests,
    diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
    --- a/Modules/posixmodule.c
    +++ b/Modules/posixmodule.c
    @@ -3608,8 +3608,8 @@
             wcscpy(wnamebuf, po_wchars);
             if (len > 0) {
                 wchar_t wch = wnamebuf[len-1];
    -            if (wch != L'/' && wch != L'\\' && wch != L':')
    -                wnamebuf[len++] = L'\\';
    +            if (wch != SEP && wch != ALTSEP && wch != L':')
    +                wnamebuf[len++] = SEP;
                 wcscpy(wnamebuf + len, L"*.*");
             }
             if ((list = PyList_New(0)) == NULL) {
    @@ -3663,8 +3663,8 @@
         len = path->length;
         if (len > 0) {
             char ch = namebuf[len-1];
    -        if (ch != SEP && ch != ALTSEP && ch != ':')
    -            namebuf[len++] = '/';
    +        if (ch != '\\' && ch != '/' && ch != ':')
    +            namebuf[len++] = '\\';
             strcpy(namebuf + len, "*.*");
         }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 22:26:35 2013
    From: python-checkins at python.org (tim.golden)
    Date: Fri, 25 Oct 2013 22:26:35 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue13234_Credit_Santoso_?=
     =?utf-8?q?for_the_patch_and_add_NEWS_item?=
    Message-ID: <3d5xgH3d6nz7Lk2@mail.python.org>
    
    http://hg.python.org/cpython/rev/5c187d6162c5
    changeset:   86638:5c187d6162c5
    user:        Tim Golden 
    date:        Fri Oct 25 21:21:20 2013 +0100
    summary:
      Issue13234 Credit Santoso for the patch and add NEWS item
    
    files:
      Misc/ACKS |  1 +
      Misc/NEWS |  3 +++
      2 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Misc/ACKS b/Misc/ACKS
    --- a/Misc/ACKS
    +++ b/Misc/ACKS
    @@ -1384,6 +1384,7 @@
     Felix Wiemann
     Gerry Wiener
     Frank Wierzbicki
    +Santoso Wijaya
     Bryce "Zooko" Wilcox-O'Hearn
     Timothy Wild
     Jakub Wilk
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -27,6 +27,9 @@
     Library
     -------
     
    +- Issue #13234: Fix os.listdir to work with extended paths on Windows.
    +  Patch by Santoso Wijaya.
    +
     - Issue #19375: The site module adding a "site-python" directory to sys.path,
       if it exists, is now deprecated.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Fri Oct 25 22:26:36 2013
    From: python-checkins at python.org (tim.golden)
    Date: Fri, 25 Oct 2013 22:26:36 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Correct_whitespace_in_test?=
    	=?utf-8?b?X29z?=
    Message-ID: <3d5xgJ5N0Qz7LkT@mail.python.org>
    
    http://hg.python.org/cpython/rev/682b4980ccd7
    changeset:   86639:682b4980ccd7
    user:        Tim Golden 
    date:        Fri Oct 25 21:26:06 2013 +0100
    summary:
      Correct whitespace in test_os
    
    files:
      Lib/test/test_os.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
    --- a/Lib/test/test_os.py
    +++ b/Lib/test/test_os.py
    @@ -1591,7 +1591,7 @@
     
         def test_listdir_extended_path(self):
             """Test when the path starts with '\\\\?\\'."""
    -        # See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath 
    +        # See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath
             # unicode
             path = '\\\\?\\' + os.path.abspath(support.TESTFN)
             self.assertEqual(
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 01:05:40 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 01:05:40 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDAw?=
     =?utf-8?q?=3A_Prevent_extension_module_build_failures_with_Xcode_5_on_OS_?=
     =?utf-8?q?X?=
    Message-ID: <3d61Br6CGGz7Ljh@mail.python.org>
    
    http://hg.python.org/cpython/rev/6cfb0f2815ce
    changeset:   86640:6cfb0f2815ce
    branch:      2.7
    parent:      86614:8cdcfd73d472
    user:        Ned Deily 
    date:        Fri Oct 25 16:01:42 2013 -0700
    summary:
      Issue #19400: Prevent extension module build failures with Xcode 5 on OS X
    10.8+ when using a universal Python that included a PPC architecture,
    such as with a python.org 32-bit-only binary installer.
    
    files:
      Lib/_osx_support.py |  20 +++++++++++++-------
      Misc/NEWS           |   4 ++++
      2 files changed, 17 insertions(+), 7 deletions(-)
    
    
    diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py
    --- a/Lib/_osx_support.py
    +++ b/Lib/_osx_support.py
    @@ -235,13 +235,19 @@
         if re.search('-arch\s+ppc', _config_vars['CFLAGS']) is not None:
             # NOTE: Cannot use subprocess here because of bootstrap
             # issues when building Python itself
    -        status = os.system("'%s' -arch ppc -x c /dev/null 2>/dev/null"%(
    -            _config_vars['CC'].replace("'", "'\"'\"'"),))
    -        # The Apple compiler drivers return status 255 if no PPC
    -        if (status >> 8) == 255:
    -            # Compiler doesn't support PPC, remove the related
    -            # '-arch' flags if not explicitly overridden by an
    -            # environment variable
    +        status = os.system(
    +            """echo 'int main{};' | """
    +            """'%s' -c -arch ppc -x c -o /dev/null /dev/null 2>/dev/null"""
    +            %(_config_vars['CC'].replace("'", "'\"'\"'"),))
    +        if status:
    +            # The compile failed for some reason.  Because of differences
    +            # across Xcode and compiler versions, there is no reliable way
    +            # to be sure why it failed.  Assume here it was due to lack of
    +            # PPC support and remove the related '-arch' flags from each
    +            # config variables not explicitly overriden by an environment
    +            # variable.  If the error was for some other reason, we hope the
    +            # failure will show up again when trying to compile an extension
    +            # module.
                 for cv in _UNIVERSAL_CONFIG_VARS:
                     if cv in _config_vars and cv not in os.environ:
                         flags = _config_vars[cv]
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -253,6 +253,10 @@
       existing directory caused mkstemp and related APIs to fail instead of
       retrying. Report and fix by Vlad Shcherbina.
     
    +- Issue #19400: Prevent extension module build failures with Xcode 5 on OS X
    +  10.8+ when using a universal Python that included a PPC architecture,
    +  such as with a python.org 32-bit-only binary installer.
    +
     Tools/Demos
     -----------
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 01:05:42 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 01:05:42 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5NDAw?=
     =?utf-8?q?=3A_Prevent_extension_module_build_failures_with_Xcode_5_on_OS_?=
     =?utf-8?q?X?=
    Message-ID: <3d61Bt1DWFz7LkY@mail.python.org>
    
    http://hg.python.org/cpython/rev/e62a64507913
    changeset:   86641:e62a64507913
    branch:      3.3
    parent:      86626:f575f6298eb1
    user:        Ned Deily 
    date:        Fri Oct 25 16:03:35 2013 -0700
    summary:
      Issue #19400: Prevent extension module build failures with Xcode 5 on OS X
    10.8+ when using a universal Python that included a PPC architecture,
    such as with a python.org 32-bit-only binary installer.
    
    files:
      Lib/_osx_support.py |  20 +++++++++++++-------
      Misc/NEWS           |   4 ++++
      2 files changed, 17 insertions(+), 7 deletions(-)
    
    
    diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py
    --- a/Lib/_osx_support.py
    +++ b/Lib/_osx_support.py
    @@ -235,13 +235,19 @@
         if re.search('-arch\s+ppc', _config_vars['CFLAGS']) is not None:
             # NOTE: Cannot use subprocess here because of bootstrap
             # issues when building Python itself
    -        status = os.system("'%s' -arch ppc -x c /dev/null 2>/dev/null"%(
    -            _config_vars['CC'].replace("'", "'\"'\"'"),))
    -        # The Apple compiler drivers return status 255 if no PPC
    -        if (status >> 8) == 255:
    -            # Compiler doesn't support PPC, remove the related
    -            # '-arch' flags if not explicitly overridden by an
    -            # environment variable
    +        status = os.system(
    +            """echo 'int main{};' | """
    +            """'%s' -c -arch ppc -x c -o /dev/null /dev/null 2>/dev/null"""
    +            %(_config_vars['CC'].replace("'", "'\"'\"'"),))
    +        if status:
    +            # The compile failed for some reason.  Because of differences
    +            # across Xcode and compiler versions, there is no reliable way
    +            # to be sure why it failed.  Assume here it was due to lack of
    +            # PPC support and remove the related '-arch' flags from each
    +            # config variables not explicitly overriden by an environment
    +            # variable.  If the error was for some other reason, we hope the
    +            # failure will show up again when trying to compile an extension
    +            # module.
                 for cv in _UNIVERSAL_CONFIG_VARS:
                     if cv in _config_vars and cv not in os.environ:
                         flags = _config_vars[cv]
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -411,6 +411,10 @@
       existing directory caused mkstemp and related APIs to fail instead of
       retrying. Report and fix by Vlad Shcherbina.
     
    +- Issue #19400: Prevent extension module build failures with Xcode 5 on OS X
    +  10.8+ when using a universal Python that included a PPC architecture,
    +  such as with a python.org 32-bit-only binary installer.
    +
     C API
     -----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 01:05:43 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 01:05:43 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_null_merge?=
    Message-ID: <3d61Bv3Y4tz7LkZ@mail.python.org>
    
    http://hg.python.org/cpython/rev/866f7a6d1851
    changeset:   86642:866f7a6d1851
    parent:      86639:682b4980ccd7
    parent:      86641:e62a64507913
    user:        Ned Deily 
    date:        Fri Oct 25 16:05:08 2013 -0700
    summary:
      null merge
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 03:47:06 2013
    From: python-checkins at python.org (tim.peters)
    Date: Sat, 26 Oct 2013 03:47:06 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319399=3A_fix_spor?=
     =?utf-8?q?adic_test=5Fsubprocess_failure=2E?=
    Message-ID: <3d64n60SGyz7Ljt@mail.python.org>
    
    http://hg.python.org/cpython/rev/af67cfcd4089
    changeset:   86643:af67cfcd4089
    user:        Tim Peters 
    date:        Fri Oct 25 20:46:51 2013 -0500
    summary:
      Issue #19399: fix sporadic test_subprocess failure.
    
    Change Thread.join() with a negative timeout to just return.  The
    behavior isn't documented then, but this restores previous
    behavior.
    
    files:
      Lib/threading.py |  5 ++++-
      Misc/NEWS        |  2 ++
      2 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/threading.py b/Lib/threading.py
    --- a/Lib/threading.py
    +++ b/Lib/threading.py
    @@ -1056,10 +1056,13 @@
                 raise RuntimeError("cannot join thread before it is started")
             if self is current_thread():
                 raise RuntimeError("cannot join current thread")
    +
             if timeout is None:
                 self._wait_for_tstate_lock()
    -        else:
    +        elif timeout >= 0:
                 self._wait_for_tstate_lock(timeout=timeout)
    +        # else it's a negative timeout - precise behavior isn't documented
    +        # then, but historically .join() returned in this case
     
         def _wait_for_tstate_lock(self, block=True, timeout=-1):
             # Issue #18808: wait for the thread state to be gone.
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -27,6 +27,8 @@
     Library
     -------
     
    +- Issue #19399: fix sporadic test_subprocess failure.
    +
     - Issue #13234: Fix os.listdir to work with extended paths on Windows.
       Patch by Santoso Wijaya.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 05:34:05 2013
    From: python-checkins at python.org (tim.peters)
    Date: Sat, 26 Oct 2013 05:34:05 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fiddled_Thread=2Ejoin=28?=
     =?utf-8?q?=29_to_be_a_little_simpler=2E__Kinda_=3B-=29?=
    Message-ID: <3d678Y6NRJzSs7@mail.python.org>
    
    http://hg.python.org/cpython/rev/506a07ea1173
    changeset:   86644:506a07ea1173
    user:        Tim Peters 
    date:        Fri Oct 25 22:33:52 2013 -0500
    summary:
      Fiddled Thread.join() to be a little simpler.  Kinda ;-)
    
    files:
      Lib/threading.py |  8 ++++----
      1 files changed, 4 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/threading.py b/Lib/threading.py
    --- a/Lib/threading.py
    +++ b/Lib/threading.py
    @@ -1059,10 +1059,10 @@
     
             if timeout is None:
                 self._wait_for_tstate_lock()
    -        elif timeout >= 0:
    -            self._wait_for_tstate_lock(timeout=timeout)
    -        # else it's a negative timeout - precise behavior isn't documented
    -        # then, but historically .join() returned in this case
    +        else:
    +            # the behavior of a negative timeout isn't documented, but
    +            # historically .join() has acted as if timeout=0 then
    +            self._wait_for_tstate_lock(timeout=max(timeout, 0))
     
         def _wait_for_tstate_lock(self, block=True, timeout=-1):
             # Issue #18808: wait for the thread state to be gone.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From solipsis at pitrou.net  Sat Oct 26 07:36:52 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Sat, 26 Oct 2013 07:36:52 +0200
    Subject: [Python-checkins] Daily reference leaks (866f7a6d1851): sum=-4
    Message-ID: 
    
    results for 866f7a6d1851 on branch "default"
    --------------------------------------------
    
    test_site leaked [0, 0, -2] references, sum=-2
    test_site leaked [0, 0, -2] memory blocks, sum=-2
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogBrs8UQ', '-x']
    
    From python-checkins at python.org  Sat Oct 26 07:52:10 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 07:52:10 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_453=3A_alternate_installe?=
    	=?utf-8?q?r_wording_tweak?=
    Message-ID: <3d6BCt26x8z7LjR@mail.python.org>
    
    http://hg.python.org/peps/rev/8d03160c654e
    changeset:   5222:8d03160c654e
    user:        Nick Coghlan 
    date:        Sat Oct 26 15:51:53 2013 +1000
    summary:
      PEP 453: alternate installer wording tweak
    
    Avoid implying that hashdist and conda are part of the same
    project.
    
    files:
      pep-0453.txt |  10 ++++------
      1 files changed, 4 insertions(+), 6 deletions(-)
    
    
    diff --git a/pep-0453.txt b/pep-0453.txt
    --- a/pep-0453.txt
    +++ b/pep-0453.txt
    @@ -133,12 +133,10 @@
     third-party packages as justification for inclusion.
     
     Providing a standard installation system also helps with bootstrapping
    -alternate build and installer systems, such as ``setuptools``,
    -``zc.buildout`` and the ``hashdist``/``conda`` combination that is aimed
    -specifically at the scientific community. So long as
    -``pip install `` works, then a standard Python-specific installer
    -provides a reasonably secure, cross platform mechanism to get access to
    -these utilities.
    +alternate build and installer systems, such as ``zc.buildout``, ``hashdist``
    +and ``conda``. So long as ``pip install `` works, then a standard
    +Python-specific installer provides a reasonably secure, cross platform
    +mechanism to get access to these utilities.
     
     
     Enabling the evolution of the broader Python packaging ecosystem
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sat Oct 26 08:38:00 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 08:38:00 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319396=3A_make_tes?=
    	=?utf-8?q?t=5Fcontextlib_tolerate_-S?=
    Message-ID: <3d6CDm2qtDz7Lk6@mail.python.org>
    
    http://hg.python.org/cpython/rev/2b904290b3b9
    changeset:   86645:2b904290b3b9
    user:        Nick Coghlan 
    date:        Sat Oct 26 16:37:47 2013 +1000
    summary:
      Close #19396: make test_contextlib tolerate -S
    
    files:
      Lib/test/test_contextlib.py |  7 ++++---
      1 files changed, 4 insertions(+), 3 deletions(-)
    
    
    diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
    --- a/Lib/test/test_contextlib.py
    +++ b/Lib/test/test_contextlib.py
    @@ -636,10 +636,11 @@
     
         def test_redirect_to_string_io(self):
             f = io.StringIO()
    +        msg = "Consider an API like help(), which prints directly to stdout"
             with redirect_stdout(f):
    -            help(pow)
    -        s = f.getvalue()
    -        self.assertIn('pow', s)
    +            print(msg)
    +        s = f.getvalue().strip()
    +        self.assertEqual(s, msg)
     
         def test_enter_result_is_target(self):
             f = io.StringIO()
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 09:21:00 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Sat, 26 Oct 2013 09:21:00 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2UgIzE5MzM5?=
     =?utf-8?q?=3A_telnetlib_module_is_now_using_time=2Emonotonic=28=29_when_a?=
     =?utf-8?q?vailable_to?=
    Message-ID: <3d6DBN2xRNz7Ljf@mail.python.org>
    
    http://hg.python.org/cpython/rev/ea3deb022890
    changeset:   86646:ea3deb022890
    branch:      3.3
    parent:      86641:e62a64507913
    user:        Victor Stinner 
    date:        Sat Oct 26 09:16:29 2013 +0200
    summary:
      Close #19339: telnetlib module is now using time.monotonic() when available to
    compute timeout.
    
    files:
      Lib/telnetlib.py |  28 ++++++++++++++--------------
      Misc/NEWS        |   3 +++
      2 files changed, 17 insertions(+), 14 deletions(-)
    
    
    diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
    --- a/Lib/telnetlib.py
    +++ b/Lib/telnetlib.py
    @@ -38,6 +38,10 @@
     import sys
     import socket
     import select
    +try:
    +    from time import monotonic as _time
    +except ImportError:
    +    from time import time as _time
     
     __all__ = ["Telnet"]
     
    @@ -302,8 +306,7 @@
             n = len(match)
             call_timeout = timeout
             if timeout is not None:
    -            from time import time
    -            time_start = time()
    +            time_start = _time()
             self.process_rawq()
             i = self.cookedq.find(match)
             if i < 0:
    @@ -316,7 +319,7 @@
                     except select.error as e:
                         if e.errno == errno.EINTR:
                             if timeout is not None:
    -                            elapsed = time() - time_start
    +                            elapsed = _time() - time_start
                                 call_timeout = timeout-elapsed
                             continue
                         raise
    @@ -327,7 +330,7 @@
                             self.process_rawq()
                             i = self.cookedq.find(match, i)
                     if timeout is not None:
    -                    elapsed = time() - time_start
    +                    elapsed = _time() - time_start
                         if elapsed >= timeout:
                             break
                         call_timeout = timeout-elapsed
    @@ -356,8 +359,7 @@
             s_args = s_reply
             if timeout is not None:
                 s_args = s_args + (timeout,)
    -            from time import time
    -            time_start = time()
    +            time_start = _time()
             while not self.eof and select.select(*s_args) == s_reply:
                 i = max(0, len(self.cookedq)-n)
                 self.fill_rawq()
    @@ -369,7 +371,7 @@
                     self.cookedq = self.cookedq[i:]
                     return buf
                 if timeout is not None:
    -                elapsed = time() - time_start
    +                elapsed = _time() - time_start
                     if elapsed >= timeout:
                         break
                     s_args = s_reply + (timeout-elapsed,)
    @@ -665,8 +667,7 @@
                     expect_list[i] = re.compile(expect_list[i])
             call_timeout = timeout
             if timeout is not None:
    -            from time import time
    -            time_start = time()
    +            time_start = _time()
             self.process_rawq()
             m = None
             for i in indices:
    @@ -686,7 +687,7 @@
                     except select.error as e:
                         if e.errno == errno.EINTR:
                             if timeout is not None:
    -                            elapsed = time() - time_start
    +                            elapsed = _time() - time_start
                                 call_timeout = timeout-elapsed
                             continue
                         raise
    @@ -702,7 +703,7 @@
                                     self.cookedq = self.cookedq[e:]
                                     break
                     if timeout is not None:
    -                    elapsed = time() - time_start
    +                    elapsed = _time() - time_start
                         if elapsed >= timeout:
                             break
                         call_timeout = timeout-elapsed
    @@ -727,8 +728,7 @@
                     if not re: import re
                     list[i] = re.compile(list[i])
             if timeout is not None:
    -            from time import time
    -            time_start = time()
    +            time_start = _time()
             while 1:
                 self.process_rawq()
                 for i in indices:
    @@ -741,7 +741,7 @@
                 if self.eof:
                     break
                 if timeout is not None:
    -                elapsed = time() - time_start
    +                elapsed = _time() - time_start
                     if elapsed >= timeout:
                         break
                     s_args = ([self.fileno()], [], [], timeout-elapsed)
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #19339: telnetlib module is now using time.monotonic() when available
    +  to compute timeout.
    +
     - Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
       argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 09:21:01 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Sat, 26 Oct 2013 09:21:01 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_=28Merge_3=2E3=29_Close_=2319339=3A_telnetlib_module_is_?=
     =?utf-8?q?now_using_time=2Emonotonic=28=29_when?=
    Message-ID: <3d6DBP4sx1z7Ljf@mail.python.org>
    
    http://hg.python.org/cpython/rev/d0f90d3f6203
    changeset:   86647:d0f90d3f6203
    parent:      86645:2b904290b3b9
    parent:      86646:ea3deb022890
    user:        Victor Stinner 
    date:        Sat Oct 26 09:20:38 2013 +0200
    summary:
      (Merge 3.3) Close #19339: telnetlib module is now using time.monotonic() when
    available to compute timeout.
    
    files:
      Lib/telnetlib.py |  14 ++++++++------
      Misc/NEWS        |   3 +++
      2 files changed, 11 insertions(+), 6 deletions(-)
    
    
    diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
    --- a/Lib/telnetlib.py
    +++ b/Lib/telnetlib.py
    @@ -36,6 +36,10 @@
     import sys
     import socket
     import selectors
    +try:
    +    from time import monotonic as _time
    +except ImportError:
    +    from time import time as _time
     
     __all__ = ["Telnet"]
     
    @@ -304,8 +308,7 @@
                 self.cookedq = self.cookedq[i:]
                 return buf
             if timeout is not None:
    -            from time import time
    -            deadline = time() + timeout
    +            deadline = _time() + timeout
             with _TelnetSelector() as selector:
                 selector.register(self, selectors.EVENT_READ)
                 while not self.eof:
    @@ -320,7 +323,7 @@
                             self.cookedq = self.cookedq[i:]
                             return buf
                     if timeout is not None:
    -                    timeout = deadline - time()
    +                    timeout = deadline - _time()
                         if timeout < 0:
                             break
             return self.read_very_lazy()
    @@ -610,8 +613,7 @@
                     if not re: import re
                     list[i] = re.compile(list[i])
             if timeout is not None:
    -            from time import time
    -            deadline = time() + timeout
    +            deadline = _time() + timeout
             with _TelnetSelector() as selector:
                 selector.register(self, selectors.EVENT_READ)
                 while not self.eof:
    @@ -625,7 +627,7 @@
                             return (i, m, text)
                     if timeout is not None:
                         ready = selector.select(timeout)
    -                    timeout = deadline - time()
    +                    timeout = deadline - _time()
                         if not ready:
                             if timeout < 0:
                                 break
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -27,6 +27,9 @@
     Library
     -------
     
    +- Issue #19339: telnetlib module is now using time.monotonic() when available
    +  to compute timeout.
    +
     - Issue #19399: fix sporadic test_subprocess failure.
     
     - Issue #13234: Fix os.listdir to work with extended paths on Windows.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 09:42:44 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sat, 26 Oct 2013 09:42:44 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Move_Misc/NEWS_entries_in_?=
    	=?utf-8?q?correct_secton=2E?=
    Message-ID: <3d6DgS3Fyrz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/6f6e2deeae34
    changeset:   86648:6f6e2deeae34
    user:        Serhiy Storchaka 
    date:        Sat Oct 26 10:42:09 2013 +0300
    summary:
      Move Misc/NEWS entries in correct secton.
    
    files:
      Misc/NEWS |  50 +++++++++++++++++++++---------------------
      1 files changed, 25 insertions(+), 25 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,37 +10,37 @@
     Core and Builtins
     -----------------
     
    +- Issue #19369: Optimized the usage of __length_hint__().
    +
    +- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the
    +  Python executable and not removed by the linker's optimizer.
    +
    +- Issue #19306: Add extra hints to the faulthandler module's stack
    +  dumps that these are "upside down".
    +
    +Library
    +-------
    +
    +- Issue #19339: telnetlib module is now using time.monotonic() when available
    +  to compute timeout.
    +
    +- Issue #19399: fix sporadic test_subprocess failure.
    +
    +- Issue #13234: Fix os.listdir to work with extended paths on Windows.
    +  Patch by Santoso Wijaya.
    +
    +- Issue #19375: The site module adding a "site-python" directory to sys.path,
    +  if it exists, is now deprecated.
    +
    +- Issue #19379: Lazily import linecache in the warnings module, to make
    +  startup with warnings faster until a warning gets printed.
    +
     - Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
       argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
     
     - Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
       argument.  Original patch by Arfrever Frehtes Taifersar Arahesis.
     
    -- Issue #19369: Optimized the usage of __length_hint__().
    -
    -- Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the
    -  Python executable and not removed by the linker's optimizer.
    -
    -- Issue #19306: Add extra hints to the faulthandler module's stack
    -  dumps that these are "upside down".
    -
    -Library
    --------
    -
    -- Issue #19339: telnetlib module is now using time.monotonic() when available
    -  to compute timeout.
    -
    -- Issue #19399: fix sporadic test_subprocess failure.
    -
    -- Issue #13234: Fix os.listdir to work with extended paths on Windows.
    -  Patch by Santoso Wijaya.
    -
    -- Issue #19375: The site module adding a "site-python" directory to sys.path,
    -  if it exists, is now deprecated.
    -
    -- Issue #19379: Lazily import linecache in the warnings module, to make
    -  startup with warnings faster until a warning gets printed.
    -
     - Issue #19327: Fixed the working of regular expressions with too big charset.
     
     - Issue #17400: New 'is_global' attribute for ipaddress to tell if an address
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 09:43:27 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Sat, 26 Oct 2013 09:43:27 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_mention_also_gdb-h?=
    	=?utf-8?q?eap?=
    Message-ID: <3d6DhH34QQz7Ljb@mail.python.org>
    
    http://hg.python.org/peps/rev/0927d706ac25
    changeset:   5223:0927d706ac25
    user:        Victor Stinner 
    date:        Sat Oct 26 09:43:14 2013 +0200
    summary:
      PEP 454: mention also gdb-heap
    
    files:
      pep-0454.txt |  4 +++-
      1 files changed, 3 insertions(+), 1 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -600,9 +600,11 @@
     * `Meliae
       `_:
       Python Memory Usage Analyzer developed by John A Meinel since 2009
    -* `caulk `_: written by Ben Timby in 2012
    +* `gdb-heap `_: gdb script written in
    +  Python by Dave Malcom (2010-2011) to analyze the usage of the heap memory
     * `memory_profiler `_:
       written by Fabian Pedregosa (2011-2013)
    +* `caulk `_: written by Ben Timby in 2012
     
     See also `Pympler Related Work
     `_.
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sat Oct 26 09:46:25 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sat, 26 Oct 2013 09:46:25 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318685=3A_Restore_?=
     =?utf-8?q?re_performance_to_pre-PEP_393_levels=2E?=
    Message-ID: <3d6Dlj0vWvz7Ljl@mail.python.org>
    
    http://hg.python.org/cpython/rev/66e2dfbb1d70
    changeset:   86649:66e2dfbb1d70
    user:        Serhiy Storchaka 
    date:        Sat Oct 26 10:45:48 2013 +0300
    summary:
      Issue #18685: Restore re performance to pre-PEP 393 levels.
    
    files:
      Lib/test/test_re.py |   23 +
      Misc/NEWS           |    2 +
      Modules/_sre.c      |  704 ++++++++++++++-----------------
      Modules/sre.h       |    9 +-
      4 files changed, 352 insertions(+), 386 deletions(-)
    
    
    diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
    --- a/Lib/test/test_re.py
    +++ b/Lib/test/test_re.py
    @@ -77,6 +77,8 @@
             self.assertTypedEqual(re.sub(b'y', B(b'a'), B(b'xyz')), b'xaz')
             self.assertTypedEqual(re.sub(b'y', bytearray(b'a'), bytearray(b'xyz')), b'xaz')
             self.assertTypedEqual(re.sub(b'y', memoryview(b'a'), memoryview(b'xyz')), b'xaz')
    +        for y in ("\xe0", "\u0430", "\U0001d49c"):
    +            self.assertEqual(re.sub(y, 'a', 'x%sz' % y), 'xaz')
     
             self.assertEqual(re.sub("(?i)b+", "x", "bbbb BBBB"), 'x x')
             self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'),
    @@ -250,6 +252,13 @@
                                       [b'', b'a', b'b', b'c'])
                 self.assertTypedEqual(re.split(b"(:*)", string),
                                       [b'', b':', b'a', b':', b'b', b'::', b'c'])
    +        for a, b, c in ("\xe0\xdf\xe7", "\u0430\u0431\u0432",
    +                        "\U0001d49c\U0001d49e\U0001d4b5"):
    +            string = ":%s:%s::%s" % (a, b, c)
    +            self.assertEqual(re.split(":", string), ['', a, b, '', c])
    +            self.assertEqual(re.split(":*", string), ['', a, b, c])
    +            self.assertEqual(re.split("(:*)", string),
    +                             ['', ':', a, ':', b, '::', c])
     
             self.assertEqual(re.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c'])
             self.assertEqual(re.split("(:)*", ":a:b::c"),
    @@ -287,6 +296,14 @@
                                       [b":", b"::", b":::"])
                 self.assertTypedEqual(re.findall(b"(:)(:*)", string),
                                       [(b":", b""), (b":", b":"), (b":", b"::")])
    +        for x in ("\xe0", "\u0430", "\U0001d49c"):
    +            xx = x * 2
    +            xxx = x * 3
    +            string = "a%sb%sc%sd" % (x, xx, xxx)
    +            self.assertEqual(re.findall("%s+" % x, string), [x, xx, xxx])
    +            self.assertEqual(re.findall("(%s+)" % x, string), [x, xx, xxx])
    +            self.assertEqual(re.findall("(%s)(%s*)" % (x, x), string),
    +                             [(x, ""), (x, x), (x, xx)])
     
         def test_bug_117612(self):
             self.assertEqual(re.findall(r"(a|(b))", "aba"),
    @@ -305,6 +322,12 @@
                 self.assertEqual(re.match(b'(a)', string).group(0), b'a')
                 self.assertEqual(re.match(b'(a)', string).group(1), b'a')
                 self.assertEqual(re.match(b'(a)', string).group(1, 1), (b'a', b'a'))
    +        for a in ("\xe0", "\u0430", "\U0001d49c"):
    +            self.assertEqual(re.match(a, a).groups(), ())
    +            self.assertEqual(re.match('(%s)' % a, a).groups(), (a,))
    +            self.assertEqual(re.match('(%s)' % a, a).group(0), a)
    +            self.assertEqual(re.match('(%s)' % a, a).group(1), a)
    +            self.assertEqual(re.match('(%s)' % a, a).group(1, 1), (a, a))
     
             pat = re.compile('((a)|(b))(c)?')
             self.assertEqual(pat.match('a').groups(), ('a', 'a', None, None))
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -21,6 +21,8 @@
     Library
     -------
     
    +- Issue #18685: Restore re performance to pre-PEP 393 levels.
    +
     - Issue #19339: telnetlib module is now using time.monotonic() when available
       to compute timeout.
     
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -46,6 +46,8 @@
     
     #include "sre.h"
     
    +#define SRE_CODE_BITS (8 * sizeof(SRE_CODE))
    +
     #include 
     
     /* name of this module, minus the leading underscore */
    @@ -58,9 +60,6 @@
     /* defining this one enables tracing */
     #undef VERBOSE
     
    -/* defining this enables unicode support (default under 1.6a1 and later) */
    -#define HAVE_UNICODE
    -
     /* -------------------------------------------------------------------- */
     /* optional features */
     
    @@ -146,9 +145,6 @@
     /* locale-specific character predicates */
     /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids
      * warnings when c's type supports only numbers < N+1 */
    -#define SRE_LOC_IS_DIGIT(ch) (!((ch) & ~255) ? isdigit((ch)) : 0)
    -#define SRE_LOC_IS_SPACE(ch) (!((ch) & ~255) ? isspace((ch)) : 0)
    -#define SRE_LOC_IS_LINEBREAK(ch) ((ch) == '\n')
     #define SRE_LOC_IS_ALNUM(ch) (!((ch) & ~255) ? isalnum((ch)) : 0)
     #define SRE_LOC_IS_WORD(ch) (SRE_LOC_IS_ALNUM((ch)) || (ch) == '_')
     
    @@ -252,55 +248,39 @@
     
     /* generate 8-bit version */
     
    -#define SRE_CHAR unsigned char
    -#define SRE_CHARGET(state, buf, index) ((unsigned char*)buf)[index]
    -#define SRE_AT sre_at
    -#define SRE_COUNT sre_count
    -#define SRE_CHARSET sre_charset
    -#define SRE_INFO sre_info
    -#define SRE_MATCH sre_match
    -#define SRE_MATCH_CONTEXT sre_match_context
    -#define SRE_SEARCH sre_search
    -
    +#define SRE_CHAR Py_UCS1
    +#define SIZEOF_SRE_CHAR 1
    +#define SRE(F) sre_ucs1_##F
     #define SRE_RECURSIVE
     #include "_sre.c"
    -#undef SRE_RECURSIVE
    -
    -#undef SRE_SEARCH
    -#undef SRE_MATCH
    -#undef SRE_MATCH_CONTEXT
    -#undef SRE_INFO
    -#undef SRE_CHARSET
    -#undef SRE_COUNT
    -#undef SRE_AT
    -#undef SRE_CHAR
    -#undef SRE_CHARGET
    -
    -/* generate 8/16/32-bit unicode version */
    -
    -#define SRE_CHAR void
    -#define SRE_CHARGET(state, buf, index) \
    -    ((state->charsize==1) ? ((Py_UCS1*)buf)[index] : \
    -     (state->charsize==2) ? ((Py_UCS2*)buf)[index] : \
    -     ((Py_UCS4*)buf)[index])
    -#define SRE_AT sre_uat
    -#define SRE_COUNT sre_ucount
    -#define SRE_CHARSET sre_ucharset
    -#define SRE_INFO sre_uinfo
    -#define SRE_MATCH sre_umatch
    -#define SRE_MATCH_CONTEXT sre_umatch_context
    -#define SRE_SEARCH sre_usearch
    +
    +/* generate 16-bit unicode version */
    +
    +#define SRE_CHAR Py_UCS2
    +#define SIZEOF_SRE_CHAR 2
    +#define SRE(F) sre_ucs2_##F
    +#define SRE_RECURSIVE
    +#include "_sre.c"
    +
    +/* generate 32-bit unicode version */
    +
    +#define SRE_CHAR Py_UCS4
    +#define SIZEOF_SRE_CHAR 4
    +#define SRE(F) sre_ucs4_##F
    +#define SRE_RECURSIVE
    +#include "_sre.c"
     
     #endif /* SRE_RECURSIVE */
     
    +#ifdef SRE_RECURSIVE
     /* -------------------------------------------------------------------- */
     /* String matching engine */
     
    -/* the following section is compiled twice, with different character
    +/* the following section is compiled three times, with different character
        settings */
     
     LOCAL(int)
    -SRE_AT(SRE_STATE* state, char* ptr, SRE_CODE at)
    +SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
     {
         /* check if pointer is at given position */
     
    @@ -314,16 +294,16 @@
     
         case SRE_AT_BEGINNING_LINE:
             return ((void*) ptr == state->beginning ||
    -                SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, -1)));
    +                SRE_IS_LINEBREAK((int) ptr[-1]));
     
         case SRE_AT_END:
    -        return (((void*) (ptr+state->charsize) == state->end &&
    -                 SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, 0))) ||
    +        return (((void*) (ptr+1) == state->end &&
    +                 SRE_IS_LINEBREAK((int) ptr[0])) ||
                     ((void*) ptr == state->end));
     
         case SRE_AT_END_LINE:
             return ((void*) ptr == state->end ||
    -                SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, 0)));
    +                SRE_IS_LINEBREAK((int) ptr[0]));
     
         case SRE_AT_END_STRING:
             return ((void*) ptr == state->end);
    @@ -332,54 +312,54 @@
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_IS_WORD((int) ptr[0]) : 0;
             return thisp != thatp;
     
         case SRE_AT_NON_BOUNDARY:
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_IS_WORD((int) ptr[0]) : 0;
             return thisp == thatp;
     
         case SRE_AT_LOC_BOUNDARY:
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_LOC_IS_WORD((int) ptr[0]) : 0;
             return thisp != thatp;
     
         case SRE_AT_LOC_NON_BOUNDARY:
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_LOC_IS_WORD((int) ptr[0]) : 0;
             return thisp == thatp;
     
         case SRE_AT_UNI_BOUNDARY:
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_UNI_IS_WORD((int) ptr[0]) : 0;
             return thisp != thatp;
     
         case SRE_AT_UNI_NON_BOUNDARY:
             if (state->beginning == state->end)
                 return 0;
             thatp = ((void*) ptr > state->beginning) ?
    -            SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
    +            SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
             thisp = ((void*) ptr < state->end) ?
    -            SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
    +            SRE_UNI_IS_WORD((int) ptr[0]) : 0;
             return thisp == thatp;
     
         }
    @@ -388,7 +368,7 @@
     }
     
     LOCAL(int)
    -SRE_CHARSET(SRE_CODE* set, SRE_CODE ch)
    +SRE(charset)(SRE_CODE* set, SRE_CODE ch)
     {
         /* check if character is a member of the given set */
     
    @@ -411,22 +391,15 @@
                 /*   */
                 if (sre_category(set[0], (int) ch))
                     return ok;
    -            set += 1;
    +            set++;
                 break;
     
             case SRE_OP_CHARSET:
    -            if (sizeof(SRE_CODE) == 2) {
    -                /*   (16 bits per code word) */
    -                if (ch < 256 && (set[ch >> 4] & (1 << (ch & 15))))
    -                    return ok;
    -                set += 16;
    -            }
    -            else {
    -                /*   (32 bits per code word) */
    -                if (ch < 256 && (set[ch >> 5] & (1u << (ch & 31))))
    -                    return ok;
    -                set += 8;
    -            }
    +            /*   */
    +            if (ch < 256 &&
    +                (set[ch/SRE_CODE_BITS] & (1u << (ch & (SRE_CODE_BITS-1)))))
    +                return ok;
    +            set += 256/SRE_CODE_BITS;
                 break;
     
             case SRE_OP_RANGE:
    @@ -446,26 +419,16 @@
                 Py_ssize_t count, block;
                 count = *(set++);
     
    -            if (sizeof(SRE_CODE) == 2) {
    +            if (ch < 0x10000u)
                     block = ((unsigned char*)set)[ch >> 8];
    -                set += 128;
    -                if (set[block*16 + ((ch & 255)>>4)] & (1 << (ch & 15)))
    -                    return ok;
    -                set += count*16;
    -            }
    -            else {
    -                /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids
    -                 * warnings when c's type supports only numbers < N+1 */
    -                if (!(ch & ~65535))
    -                    block = ((unsigned char*)set)[ch >> 8];
    -                else
    -                    block = -1;
    -                set += 64;
    -                if (block >=0 &&
    -                    (set[block*8 + ((ch & 255)>>5)] & (1u << (ch & 31))))
    -                    return ok;
    -                set += count*8;
    -            }
    +            else
    +                block = -1;
    +            set += 256/sizeof(SRE_CODE);
    +            if (block >=0 &&
    +                (set[(block * 256 + (ch & 255))/SRE_CODE_BITS] &
    +                    (1u << (ch & (SRE_CODE_BITS-1)))))
    +                return ok;
    +            set += count * (256/SRE_CODE_BITS);
                 break;
             }
     
    @@ -477,35 +440,35 @@
         }
     }
     
    -LOCAL(Py_ssize_t) SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern);
    +LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern);
     
     LOCAL(Py_ssize_t)
    -SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
    +SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
     {
         SRE_CODE chr;
    -    char* ptr = (char *)state->ptr;
    -    char* end = (char *)state->end;
    +    SRE_CHAR c;
    +    SRE_CHAR* ptr = (SRE_CHAR *)state->ptr;
    +    SRE_CHAR* end = (SRE_CHAR *)state->end;
         Py_ssize_t i;
     
         /* adjust end */
    -    if (maxcount < (end - ptr) / state->charsize && maxcount != SRE_MAXREPEAT)
    -        end = ptr + maxcount*state->charsize;
    +    if (maxcount < end - ptr && maxcount != SRE_MAXREPEAT)
    +        end = ptr + maxcount;
     
         switch (pattern[0]) {
     
         case SRE_OP_IN:
             /* repeated set */
             TRACE(("|%p|%p|COUNT IN\n", pattern, ptr));
    -        while (ptr < end &&
    -               SRE_CHARSET(pattern + 2, SRE_CHARGET(state, ptr, 0)))
    -            ptr += state->charsize;
    +        while (ptr < end && SRE(charset)(pattern + 2, *ptr))
    +            ptr++;
             break;
     
         case SRE_OP_ANY:
             /* repeated dot wildcard. */
             TRACE(("|%p|%p|COUNT ANY\n", pattern, ptr));
    -        while (ptr < end && !SRE_IS_LINEBREAK(SRE_CHARGET(state, ptr, 0)))
    -            ptr += state->charsize;
    +        while (ptr < end && !SRE_IS_LINEBREAK(*ptr))
    +            ptr++;
             break;
     
         case SRE_OP_ANY_ALL:
    @@ -519,75 +482,87 @@
             /* repeated literal */
             chr = pattern[1];
             TRACE(("|%p|%p|COUNT LITERAL %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) == chr)
    -            ptr += state->charsize;
    +        c = (SRE_CHAR) chr;
    +#if SIZEOF_SRE_CHAR < 4
    +        if ((SRE_CODE) c != chr)
    +            ; /* literal can't match: doesn't fit in char width */
    +        else
    +#endif
    +        while (ptr < end && *ptr == c)
    +            ptr++;
             break;
     
         case SRE_OP_LITERAL_IGNORE:
             /* repeated literal */
             chr = pattern[1];
             TRACE(("|%p|%p|COUNT LITERAL_IGNORE %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) state->lower(SRE_CHARGET(state, ptr, 0)) == chr)
    -            ptr += state->charsize;
    +        while (ptr < end && (SRE_CODE) state->lower(*ptr) == chr)
    +            ptr++;
             break;
     
         case SRE_OP_NOT_LITERAL:
             /* repeated non-literal */
             chr = pattern[1];
             TRACE(("|%p|%p|COUNT NOT_LITERAL %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) != chr)
    -            ptr += state->charsize;
    +        c = (SRE_CHAR) chr;
    +#if SIZEOF_SRE_CHAR < 4
    +        if ((SRE_CODE) c != chr)
    +            ptr = end; /* literal can't match: doesn't fit in char width */
    +        else
    +#endif
    +        while (ptr < end && *ptr != c)
    +            ptr++;
             break;
     
         case SRE_OP_NOT_LITERAL_IGNORE:
             /* repeated non-literal */
             chr = pattern[1];
             TRACE(("|%p|%p|COUNT NOT_LITERAL_IGNORE %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) state->lower(SRE_CHARGET(state, ptr, 0)) != chr)
    -            ptr += state->charsize;
    +        while (ptr < end && (SRE_CODE) state->lower(*ptr) != chr)
    +            ptr++;
             break;
     
         default:
             /* repeated single character pattern */
             TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr));
    -        while ((char*) state->ptr < end) {
    -            i = SRE_MATCH(state, pattern);
    +        while ((SRE_CHAR*) state->ptr < end) {
    +            i = SRE(match)(state, pattern);
                 if (i < 0)
                     return i;
                 if (!i)
                     break;
             }
             TRACE(("|%p|%p|COUNT %" PY_FORMAT_SIZE_T "d\n", pattern, ptr,
    -               ((char*)state->ptr - ptr)/state->charsize));
    -        return ((char*)state->ptr - ptr)/state->charsize;
    +               (SRE_CHAR*) state->ptr - ptr));
    +        return (SRE_CHAR*) state->ptr - ptr;
         }
     
         TRACE(("|%p|%p|COUNT %" PY_FORMAT_SIZE_T "d\n", pattern, ptr,
    -           (ptr - (char*) state->ptr)/state->charsize));
    -    return (ptr - (char*) state->ptr)/state->charsize;
    +           ptr - (SRE_CHAR*) state->ptr));
    +    return ptr - (SRE_CHAR*) state->ptr;
     }
     
     #if 0 /* not used in this release */
     LOCAL(int)
    -SRE_INFO(SRE_STATE* state, SRE_CODE* pattern)
    +SRE(info)(SRE_STATE* state, SRE_CODE* pattern)
     {
         /* check if an SRE_OP_INFO block matches at the current position.
            returns the number of SRE_CODE objects to skip if successful, 0
            if no match */
     
    -    char* end = state->end;
    -    char* ptr = state->ptr;
    +    SRE_CHAR* end = (SRE_CHAR*) state->end;
    +    SRE_CHAR* ptr = (SRE_CHAR*) state->ptr;
         Py_ssize_t i;
     
         /* check minimal length */
    -    if (pattern[3] && (end - ptr)/state->charsize < pattern[3])
    +    if (pattern[3] && end - ptr < pattern[3])
             return 0;
     
         /* check known prefix */
         if (pattern[2] & SRE_INFO_PREFIX && pattern[5] > 1) {
             /*     */
             for (i = 0; i < pattern[5]; i++)
    -            if ((SRE_CODE) SRE_CHARGET(state, ptr, i) != pattern[7 + i])
    +            if ((SRE_CODE) ptr[i] != pattern[7 + i])
                     return 0;
             return pattern[0] + 2 * pattern[6];
         }
    @@ -595,30 +570,30 @@
     }
     #endif
     
    -/* The macros below should be used to protect recursive SRE_MATCH()
    +/* The macros below should be used to protect recursive SRE(match)()
      * calls that *failed* and do *not* return immediately (IOW, those
      * that will backtrack). Explaining:
      *
    - * - Recursive SRE_MATCH() returned true: that's usually a success
    + * - Recursive SRE(match)() returned true: that's usually a success
      *   (besides atypical cases like ASSERT_NOT), therefore there's no
      *   reason to restore lastmark;
      *
    - * - Recursive SRE_MATCH() returned false but the current SRE_MATCH()
    - *   is returning to the caller: If the current SRE_MATCH() is the
    + * - Recursive SRE(match)() returned false but the current SRE(match)()
    + *   is returning to the caller: If the current SRE(match)() is the
      *   top function of the recursion, returning false will be a matching
      *   failure, and it doesn't matter where lastmark is pointing to.
    - *   If it's *not* the top function, it will be a recursive SRE_MATCH()
    - *   failure by itself, and the calling SRE_MATCH() will have to deal
    + *   If it's *not* the top function, it will be a recursive SRE(match)()
    + *   failure by itself, and the calling SRE(match)() will have to deal
      *   with the failure by the same rules explained here (it will restore
      *   lastmark by itself if necessary);
      *
    - * - Recursive SRE_MATCH() returned false, and will continue the
    + * - Recursive SRE(match)() returned false, and will continue the
      *   outside 'for' loop: must be protected when breaking, since the next
      *   OP could potentially depend on lastmark;
      *
    - * - Recursive SRE_MATCH() returned false, and will be called again
    + * - Recursive SRE(match)() returned false, and will be called again
      *   inside a local for/while loop: must be protected between each
    - *   loop iteration, since the recursive SRE_MATCH() could do anything,
    + *   loop iteration, since the recursive SRE(match)() could do anything,
      *   and could potentially depend on lastmark.
      *
      * For more information, check the discussion at SF patch #712900.
    @@ -657,7 +632,7 @@
             int j = data_stack_grow(state, sizeof(type)); \
             if (j < 0) return j; \
             if (ctx_pos != -1) \
    -            DATA_STACK_LOOKUP_AT(state, SRE_MATCH_CONTEXT, ctx, ctx_pos); \
    +            DATA_STACK_LOOKUP_AT(state, SRE(match_context), ctx, ctx_pos); \
         } \
         ptr = (type*)(state->data_stack+alloc_pos); \
         state->data_stack_base += sizeof(type); \
    @@ -678,7 +653,7 @@
             int j = data_stack_grow(state, size); \
             if (j < 0) return j; \
             if (ctx_pos != -1) \
    -            DATA_STACK_LOOKUP_AT(state, SRE_MATCH_CONTEXT, ctx, ctx_pos); \
    +            DATA_STACK_LOOKUP_AT(state, SRE(match_context), ctx, ctx_pos); \
         } \
         memcpy(state->data_stack+state->data_stack_base, data, size); \
         state->data_stack_base += size; \
    @@ -747,7 +722,7 @@
     #define JUMP_ASSERT_NOT      13
     
     #define DO_JUMP(jumpvalue, jumplabel, nextpattern) \
    -    DATA_ALLOC(SRE_MATCH_CONTEXT, nextctx); \
    +    DATA_ALLOC(SRE(match_context), nextctx); \
         nextctx->last_ctx_pos = ctx_pos; \
         nextctx->jump = jumpvalue; \
         nextctx->pattern = nextpattern; \
    @@ -760,7 +735,7 @@
     typedef struct {
         Py_ssize_t last_ctx_pos;
         Py_ssize_t jump;
    -    char* ptr;
    +    SRE_CHAR* ptr;
         SRE_CODE* pattern;
         Py_ssize_t count;
         Py_ssize_t lastmark;
    @@ -769,25 +744,25 @@
             SRE_CODE chr;
             SRE_REPEAT* rep;
         } u;
    -} SRE_MATCH_CONTEXT;
    +} SRE(match_context);
     
     /* check if string matches the given pattern.  returns <0 for
        error, 0 for failure, and 1 for success */
     LOCAL(Py_ssize_t)
    -SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
    +SRE(match)(SRE_STATE* state, SRE_CODE* pattern)
     {
    -    char* end = (char*)state->end;
    +    SRE_CHAR* end = (SRE_CHAR *)state->end;
         Py_ssize_t alloc_pos, ctx_pos = -1;
         Py_ssize_t i, ret = 0;
         Py_ssize_t jump;
         unsigned int sigcount=0;
     
    -    SRE_MATCH_CONTEXT* ctx;
    -    SRE_MATCH_CONTEXT* nextctx;
    +    SRE(match_context)* ctx;
    +    SRE(match_context)* nextctx;
     
         TRACE(("|%p|%p|ENTER\n", pattern, state->ptr));
     
    -    DATA_ALLOC(SRE_MATCH_CONTEXT, ctx);
    +    DATA_ALLOC(SRE(match_context), ctx);
         ctx->last_ctx_pos = -1;
         ctx->jump = JUMP_NONE;
         ctx->pattern = pattern;
    @@ -795,16 +770,15 @@
     
     entrance:
     
    -    ctx->ptr = (char *)state->ptr;
    +    ctx->ptr = (SRE_CHAR *)state->ptr;
     
         if (ctx->pattern[0] == SRE_OP_INFO) {
             /* optimization info block */
             /*  <1=skip> <2=flags> <3=min> ... */
    -        if (ctx->pattern[3] && (Py_uintptr_t)(end - ctx->ptr)/state->charsize < ctx->pattern[3]) {
    +        if (ctx->pattern[3] && (Py_uintptr_t)(end - ctx->ptr) < ctx->pattern[3]) {
                 TRACE(("reject (got %" PY_FORMAT_SIZE_T "d chars, "
                        "need %" PY_FORMAT_SIZE_T "d)\n",
    -                   (end - ctx->ptr)/state->charsize,
    -                   (Py_ssize_t) ctx->pattern[3]));
    +                   end - ctx->ptr, (Py_ssize_t) ctx->pattern[3]));
                 RETURN_FAILURE;
             }
             ctx->pattern += ctx->pattern[1] + 1;
    @@ -844,10 +818,10 @@
                 /*   */
                 TRACE(("|%p|%p|LITERAL %d\n", ctx->pattern,
                        ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) != ctx->pattern[0])
    +            if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] != ctx->pattern[0])
                     RETURN_FAILURE;
                 ctx->pattern++;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_NOT_LITERAL:
    @@ -855,10 +829,10 @@
                 /*   */
                 TRACE(("|%p|%p|NOT_LITERAL %d\n", ctx->pattern,
                        ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) == ctx->pattern[0])
    +            if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] == ctx->pattern[0])
                     RETURN_FAILURE;
                 ctx->pattern++;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_SUCCESS:
    @@ -871,7 +845,7 @@
                 /* match at given position */
                 /*   */
                 TRACE(("|%p|%p|AT %d\n", ctx->pattern, ctx->ptr, *ctx->pattern));
    -            if (!SRE_AT(state, ctx->ptr, *ctx->pattern))
    +            if (!SRE(at)(state, ctx->ptr, *ctx->pattern))
                     RETURN_FAILURE;
                 ctx->pattern++;
                 break;
    @@ -881,19 +855,19 @@
                 /*   */
                 TRACE(("|%p|%p|CATEGORY %d\n", ctx->pattern,
                        ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || !sre_category(ctx->pattern[0], SRE_CHARGET(state, ctx->ptr, 0)))
    +            if (ctx->ptr >= end || !sre_category(ctx->pattern[0], ctx->ptr[0]))
                     RETURN_FAILURE;
                 ctx->pattern++;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_ANY:
                 /* match anything (except a newline) */
                 /*  */
                 TRACE(("|%p|%p|ANY\n", ctx->pattern, ctx->ptr));
    -                if (ctx->ptr >= end || SRE_IS_LINEBREAK(SRE_CHARGET(state, ctx->ptr, 0)))
    -                    RETURN_FAILURE;
    -            ctx->ptr += state->charsize;
    +            if (ctx->ptr >= end || SRE_IS_LINEBREAK(ctx->ptr[0]))
    +                RETURN_FAILURE;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_ANY_ALL:
    @@ -902,47 +876,47 @@
                 TRACE(("|%p|%p|ANY_ALL\n", ctx->pattern, ctx->ptr));
                 if (ctx->ptr >= end)
                     RETURN_FAILURE;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_IN:
                 /* match set member (or non_member) */
                 /*    */
                 TRACE(("|%p|%p|IN\n", ctx->pattern, ctx->ptr));
    -                if (ctx->ptr >= end || !SRE_CHARSET(ctx->pattern + 1, SRE_CHARGET(state, ctx->ptr, 0)))
    -                    RETURN_FAILURE;
    +            if (ctx->ptr >= end || !SRE(charset)(ctx->pattern + 1, *ctx->ptr))
    +                RETURN_FAILURE;
                 ctx->pattern += ctx->pattern[0];
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_LITERAL_IGNORE:
                 TRACE(("|%p|%p|LITERAL_IGNORE %d\n",
                        ctx->pattern, ctx->ptr, ctx->pattern[0]));
                 if (ctx->ptr >= end ||
    -                state->lower(SRE_CHARGET(state, ctx->ptr, 0)) != state->lower(*ctx->pattern))
    +                state->lower(*ctx->ptr) != state->lower(*ctx->pattern))
                     RETURN_FAILURE;
                 ctx->pattern++;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_NOT_LITERAL_IGNORE:
                 TRACE(("|%p|%p|NOT_LITERAL_IGNORE %d\n",
                        ctx->pattern, ctx->ptr, *ctx->pattern));
                 if (ctx->ptr >= end ||
    -                state->lower(SRE_CHARGET(state, ctx->ptr, 0)) == state->lower(*ctx->pattern))
    +                state->lower(*ctx->ptr) == state->lower(*ctx->pattern))
                     RETURN_FAILURE;
                 ctx->pattern++;
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_IN_IGNORE:
                 TRACE(("|%p|%p|IN_IGNORE\n", ctx->pattern, ctx->ptr));
                 if (ctx->ptr >= end
    -                || !SRE_CHARSET(ctx->pattern+1,
    -                                (SRE_CODE)state->lower(SRE_CHARGET(state, ctx->ptr, 0))))
    +                || !SRE(charset)(ctx->pattern+1,
    +                                 (SRE_CODE)state->lower(*ctx->ptr)))
                     RETURN_FAILURE;
                 ctx->pattern += ctx->pattern[0];
    -            ctx->ptr += state->charsize;
    +            ctx->ptr++;
                 break;
     
             case SRE_OP_JUMP:
    @@ -965,11 +939,11 @@
                 for (; ctx->pattern[0]; ctx->pattern += ctx->pattern[0]) {
                     if (ctx->pattern[1] == SRE_OP_LITERAL &&
                         (ctx->ptr >= end ||
    -                     (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) != ctx->pattern[2]))
    +                     (SRE_CODE) *ctx->ptr != ctx->pattern[2]))
                         continue;
                     if (ctx->pattern[1] == SRE_OP_IN &&
                         (ctx->ptr >= end ||
    -                     !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0))))
    +                     !SRE(charset)(ctx->pattern + 3, (SRE_CODE) *ctx->ptr)))
                         continue;
                     state->ptr = ctx->ptr;
                     DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1);
    @@ -1000,16 +974,16 @@
                 TRACE(("|%p|%p|REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
                        ctx->pattern[1], ctx->pattern[2]));
     
    -            if ((Py_ssize_t) ctx->pattern[1] > (end - ctx->ptr) / state->charsize)
    +            if ((Py_ssize_t) ctx->pattern[1] > end - ctx->ptr)
                     RETURN_FAILURE; /* cannot match */
     
                 state->ptr = ctx->ptr;
     
    -            ret = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[2]);
    +            ret = SRE(count)(state, ctx->pattern+3, ctx->pattern[2]);
                 RETURN_ON_ERROR(ret);
    -            DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
    +            DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
                 ctx->count = ret;
    -            ctx->ptr += state->charsize * ctx->count;
    +            ctx->ptr += ctx->count;
     
                 /* when we arrive here, count contains the number of
                    matches, and ctx->ptr points to the tail of the target
    @@ -1033,9 +1007,8 @@
                     ctx->u.chr = ctx->pattern[ctx->pattern[0]+1];
                     for (;;) {
                         while (ctx->count >= (Py_ssize_t) ctx->pattern[1] &&
    -                           (ctx->ptr >= end ||
    -                            SRE_CHARGET(state, ctx->ptr, 0) != ctx->u.chr)) {
    -                        ctx->ptr -= state->charsize;
    +                           (ctx->ptr >= end || *ctx->ptr != ctx->u.chr)) {
    +                        ctx->ptr--;
                             ctx->count--;
                         }
                         if (ctx->count < (Py_ssize_t) ctx->pattern[1])
    @@ -1050,7 +1023,7 @@
     
                         LASTMARK_RESTORE();
     
    -                    ctx->ptr -= state->charsize;
    +                    ctx->ptr--;
                         ctx->count--;
                     }
     
    @@ -1064,7 +1037,7 @@
                             RETURN_ON_ERROR(ret);
                             RETURN_SUCCESS;
                         }
    -                    ctx->ptr -= state->charsize;
    +                    ctx->ptr--;
                         ctx->count--;
                         LASTMARK_RESTORE();
                     }
    @@ -1084,7 +1057,7 @@
                 TRACE(("|%p|%p|MIN_REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
                        ctx->pattern[1], ctx->pattern[2]));
     
    -            if ((Py_ssize_t) ctx->pattern[1] > (end - ctx->ptr) / state->charsize)
    +            if ((Py_ssize_t) ctx->pattern[1] > end - ctx->ptr)
                     RETURN_FAILURE; /* cannot match */
     
                 state->ptr = ctx->ptr;
    @@ -1093,15 +1066,15 @@
                     ctx->count = 0;
                 else {
                     /* count using pattern min as the maximum */
    -                ret = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[1]);
    +                ret = SRE(count)(state, ctx->pattern+3, ctx->pattern[1]);
                     RETURN_ON_ERROR(ret);
    -                DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
    +                DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
                     if (ret < (Py_ssize_t) ctx->pattern[1])
                         /* didn't match minimum number of times */
                         RETURN_FAILURE;
                     /* advance past minimum matches of repeat */
                     ctx->count = ret;
    -                ctx->ptr += state->charsize * ctx->count;
    +                ctx->ptr += ctx->count;
                 }
     
                 if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) {
    @@ -1122,13 +1095,13 @@
                             RETURN_SUCCESS;
                         }
                         state->ptr = ctx->ptr;
    -                    ret = SRE_COUNT(state, ctx->pattern+3, 1);
    +                    ret = SRE(count)(state, ctx->pattern+3, 1);
                         RETURN_ON_ERROR(ret);
    -                    DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
    +                    DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
                         if (ret == 0)
                             break;
                         assert(ret == 1);
    -                    ctx->ptr += state->charsize;
    +                    ctx->ptr++;
                         ctx->count++;
                         LASTMARK_RESTORE();
                     }
    @@ -1305,16 +1278,15 @@
                     if (groupref >= state->lastmark) {
                         RETURN_FAILURE;
                     } else {
    -                    char* p = (char*) state->mark[groupref];
    -                    char* e = (char*) state->mark[groupref+1];
    +                    SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
    +                    SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
                         if (!p || !e || e < p)
                             RETURN_FAILURE;
                         while (p < e) {
    -                        if (ctx->ptr >= end ||
    -                            SRE_CHARGET(state, ctx->ptr, 0) != SRE_CHARGET(state, p, 0))
    +                        if (ctx->ptr >= end || *ctx->ptr != *p)
                                 RETURN_FAILURE;
    -                        p += state->charsize;
    -                        ctx->ptr += state->charsize;
    +                        p++;
    +                        ctx->ptr++;
                         }
                     }
                 }
    @@ -1331,17 +1303,16 @@
                     if (groupref >= state->lastmark) {
                         RETURN_FAILURE;
                     } else {
    -                    char* p = (char*) state->mark[groupref];
    -                    char* e = (char*) state->mark[groupref+1];
    +                    SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
    +                    SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
                         if (!p || !e || e < p)
                             RETURN_FAILURE;
                         while (p < e) {
                             if (ctx->ptr >= end ||
    -                            state->lower(SRE_CHARGET(state, ctx->ptr, 0)) !=
    -                            state->lower(SRE_CHARGET(state, p, 0)))
    +                            state->lower(*ctx->ptr) != state->lower(*p))
                                 RETURN_FAILURE;
    -                        p += state->charsize;
    -                        ctx->ptr += state->charsize;
    +                        p++;
    +                        ctx->ptr++;
                         }
                     }
                 }
    @@ -1375,7 +1346,7 @@
                 /*     */
                 TRACE(("|%p|%p|ASSERT %d\n", ctx->pattern,
                        ctx->ptr, ctx->pattern[1]));
    -            state->ptr = ctx->ptr - state->charsize * ctx->pattern[1];
    +            state->ptr = ctx->ptr - ctx->pattern[1];
                 if (state->ptr < state->beginning)
                     RETURN_FAILURE;
                 DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2);
    @@ -1388,7 +1359,7 @@
                 /*     */
                 TRACE(("|%p|%p|ASSERT_NOT %d\n", ctx->pattern,
                        ctx->ptr, ctx->pattern[1]));
    -            state->ptr = ctx->ptr - state->charsize * ctx->pattern[1];
    +            state->ptr = ctx->ptr - ctx->pattern[1];
                 if (state->ptr >= state->beginning) {
                     DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2);
                     if (ret) {
    @@ -1417,7 +1388,7 @@
         DATA_POP_DISCARD(ctx);
         if (ctx_pos == -1)
             return ret;
    -    DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
    +    DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
     
         switch (jump) {
             case JUMP_MAX_UNTIL_2:
    @@ -1469,10 +1440,10 @@
     }
     
     LOCAL(Py_ssize_t)
    -SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
    +SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
     {
    -    char* ptr = (char*)state->start;
    -    char* end = (char*)state->end;
    +    SRE_CHAR* ptr = (SRE_CHAR *)state->start;
    +    SRE_CHAR* end = (SRE_CHAR *)state->end;
         Py_ssize_t status = 0;
         Py_ssize_t prefix_len = 0;
         Py_ssize_t prefix_skip = 0;
    @@ -1490,9 +1461,9 @@
             if (pattern[3] > 1) {
                 /* adjust end point (but make sure we leave at least one
                    character in there, so literal search will work) */
    -            end -= (pattern[3]-1) * state->charsize;
    +            end -= pattern[3] - 1;
                 if (end <= ptr)
    -                end = ptr + state->charsize;
    +                end = ptr;
             }
     
             if (flags & SRE_INFO_PREFIX) {
    @@ -1519,32 +1490,47 @@
             /* pattern starts with a known prefix.  use the overlap
                table to skip forward as fast as we possibly can */
             Py_ssize_t i = 0;
    -        end = (char *)state->end;
    +
    +        end = (SRE_CHAR *)state->end;
    +        if (prefix_len > end - ptr)
    +            return 0;
    +#if SIZEOF_SRE_CHAR < 4
    +        for (i = 0; i < prefix_len; i++)
    +            if ((SRE_CODE)(SRE_CHAR) prefix[i] != prefix[i])
    +                return 0; /* literal can't match: doesn't fit in char width */
    +#endif
             while (ptr < end) {
    -            for (;;) {
    -                if ((SRE_CODE) SRE_CHARGET(state, ptr, 0) != prefix[i]) {
    -                    if (!i)
    -                        break;
    -                    else
    -                        i = overlap[i];
    -                } else {
    -                    if (++i == prefix_len) {
    -                        /* found a potential match */
    -                        TRACE(("|%p|%p|SEARCH SCAN\n", pattern, ptr));
    -                        state->start = ptr - (prefix_len - 1) * state->charsize;
    -                        state->ptr = ptr - (prefix_len - prefix_skip - 1) * state->charsize;
    -                        if (flags & SRE_INFO_LITERAL)
    -                            return 1; /* we got all of it */
    -                        status = SRE_MATCH(state, pattern + 2*prefix_skip);
    -                        if (status != 0)
    -                            return status;
    -                        /* close but no cigar -- try again */
    -                        i = overlap[i];
    +            SRE_CHAR c = (SRE_CHAR) prefix[0];
    +            while (*ptr++ != c) {
    +                if (ptr >= end)
    +                    return 0;
    +            }
    +            if (ptr >= end)
    +                return 0;
    +
    +            i = 1;
    +            do {
    +                if (*ptr == (SRE_CHAR) prefix[i]) {
    +                    if (++i != prefix_len) {
    +                        if (++ptr >= end)
    +                            return 0;
    +                        continue;
                         }
    -                    break;
    +                    /* found a potential match */
    +                    TRACE(("|%p|%p|SEARCH SCAN\n", pattern, ptr));
    +                    state->start = ptr - (prefix_len - 1);
    +                    state->ptr = ptr - (prefix_len - prefix_skip - 1);
    +                    if (flags & SRE_INFO_LITERAL)
    +                        return 1; /* we got all of it */
    +                    status = SRE(match)(state, pattern + 2*prefix_skip);
    +                    if (status != 0)
    +                        return status;
    +                    /* close but no cigar -- try again */
    +                    if (++ptr >= end)
    +                        return 0;
                     }
    -            }
    -            ptr += state->charsize;
    +                i = overlap[i];
    +            } while (i != 0);
             }
             return 0;
         }
    @@ -1553,46 +1539,48 @@
         if (pattern[0] == SRE_OP_LITERAL) {
             /* pattern starts with a literal character.  this is used
                for short prefixes, and if fast search is disabled */
    -        SRE_CODE chr = pattern[1];
    -        end = (char*)state->end;
    -        for (;;) {
    -            while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) != chr)
    -                ptr += state->charsize;
    -            if (ptr >= end)
    -                return 0;
    +        SRE_CHAR c = (SRE_CHAR) pattern[1];
    +#if SIZEOF_SRE_CHAR < 4
    +        if ((SRE_CODE) c != pattern[1])
    +            return 0; /* literal can't match: doesn't fit in char width */
    +#endif
    +        end = (SRE_CHAR *)state->end;
    +        while (ptr < end) {
    +            while (*ptr != c) {
    +                if (++ptr >= end)
    +                    return 0;
    +            }
                 TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr));
                 state->start = ptr;
    -            ptr += state->charsize;
    -            state->ptr = ptr;
    +            state->ptr = ++ptr;
                 if (flags & SRE_INFO_LITERAL)
                     return 1; /* we got all of it */
    -            status = SRE_MATCH(state, pattern + 2);
    +            status = SRE(match)(state, pattern + 2);
                 if (status != 0)
                     break;
             }
         } else if (charset) {
             /* pattern starts with a character from a known set */
    -        end = (char*)state->end;
    +        end = (SRE_CHAR *)state->end;
             for (;;) {
    -            while (ptr < end && !SRE_CHARSET(charset, SRE_CHARGET(state, ptr, 0)))
    -                ptr += state->charsize;
    +            while (ptr < end && !SRE(charset)(charset, *ptr))
    +                ptr++;
                 if (ptr >= end)
                     return 0;
                 TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
                 state->start = ptr;
                 state->ptr = ptr;
    -            status = SRE_MATCH(state, pattern);
    +            status = SRE(match)(state, pattern);
                 if (status != 0)
                     break;
    -            ptr += state->charsize;
    +            ptr++;
             }
         } else
             /* general case */
             while (ptr <= end) {
                 TRACE(("|%p|%p|SEARCH\n", pattern, ptr));
    -            state->start = state->ptr = ptr;
    -            ptr += state->charsize;
    -            status = SRE_MATCH(state, pattern);
    +            state->start = state->ptr = ptr++;
    +            status = SRE(match)(state, pattern);
                 if (status != 0)
                     break;
             }
    @@ -1600,7 +1588,9 @@
         return status;
     }
     
    -#if !defined(SRE_RECURSIVE)
    +#endif /* SRE_RECURSIVE */
    +
    +#ifndef SRE_RECURSIVE
     
     /* -------------------------------------------------------------------- */
     /* factories and destructors */
    @@ -1609,23 +1599,6 @@
     static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, int);
     static PyObject*pattern_scanner(PatternObject*, PyObject*, PyObject* kw);
     
    -static int
    -sre_literal_template(int charsize, char* ptr, Py_ssize_t len)
    -{
    -    /* check if given string is a literal template (i.e. no escapes) */
    -    struct {
    -        int charsize;
    -    } state = {
    -        charsize
    -    };
    -    while (len-- > 0) {
    -        if (SRE_CHARGET((&state), ptr, 0) == '\\')
    -            return 0;
    -        ptr += charsize;
    -    }
    -    return 1;
    -}
    -
     static PyObject *
     sre_codesize(PyObject* self, PyObject *unused)
     {
    @@ -1661,72 +1634,41 @@
     
     static void*
     getstring(PyObject* string, Py_ssize_t* p_length,
    -          int* p_logical_charsize, int* p_charsize,
    +          int* p_isbytes, int* p_charsize,
               Py_buffer *view)
     {
         /* given a python object, return a data pointer, a length (in
            characters), and a character size.  return NULL if the object
            is not a string (or not compatible) */
     
    -    PyBufferProcs *buffer;
    -    Py_ssize_t size, bytes;
    -    int charsize;
    -    void* ptr;
    -
         /* Unicode objects do not support the buffer API. So, get the data
            directly instead. */
         if (PyUnicode_Check(string)) {
             if (PyUnicode_READY(string) == -1)
                 return NULL;
    -        ptr = PyUnicode_DATA(string);
             *p_length = PyUnicode_GET_LENGTH(string);
             *p_charsize = PyUnicode_KIND(string);
    -        *p_logical_charsize = 4;
    -        return ptr;
    +        *p_isbytes = 0;
    +        return PyUnicode_DATA(string);
         }
     
         /* get pointer to byte string buffer */
    -    view->len = -1;
    -    buffer = Py_TYPE(string)->tp_as_buffer;
    -    if (!buffer || !buffer->bf_getbuffer ||
    -        (*buffer->bf_getbuffer)(string, view, PyBUF_SIMPLE) < 0) {
    -            PyErr_SetString(PyExc_TypeError, "expected string or buffer");
    -            return NULL;
    +    if (PyObject_GetBuffer(string, view, PyBUF_SIMPLE) != 0) {
    +        PyErr_SetString(PyExc_TypeError, "expected string or buffer");
    +        return NULL;
         }
     
    -    /* determine buffer size */
    -    bytes = view->len;
    -    ptr = view->buf;
    -
    -    if (bytes < 0) {
    -        PyErr_SetString(PyExc_TypeError, "buffer has negative size");
    -        goto err;
    +    *p_length = view->len;
    +    *p_charsize = 1;
    +    *p_isbytes = 1;
    +
    +    if (view->buf == NULL) {
    +        PyErr_SetString(PyExc_ValueError, "Buffer is NULL");
    +        PyBuffer_Release(view);
    +        view->buf = NULL;
    +        return NULL;
         }
    -
    -    /* determine character size */
    -    size = PyObject_Size(string);
    -
    -    if (PyBytes_Check(string) || bytes == size)
    -        charsize = 1;
    -    else {
    -        PyErr_SetString(PyExc_TypeError, "buffer size mismatch");
    -        goto err;
    -    }
    -
    -    *p_length = size;
    -    *p_charsize = charsize;
    -    *p_logical_charsize = charsize;
    -
    -    if (ptr == NULL) {
    -            PyErr_SetString(PyExc_ValueError,
    -                            "Buffer is NULL");
    -            goto err;
    -    }
    -    return ptr;
    -  err:
    -    PyBuffer_Release(view);
    -    view->buf = NULL;
    -    return NULL;
    +    return view->buf;
     }
     
     LOCAL(PyObject*)
    @@ -1736,7 +1678,7 @@
         /* prepare state object */
     
         Py_ssize_t length;
    -    int logical_charsize, charsize;
    +    int isbytes, charsize;
         void* ptr;
     
         memset(state, 0, sizeof(SRE_STATE));
    @@ -1745,16 +1687,16 @@
         state->lastindex = -1;
     
         state->buffer.buf = NULL;
    -    ptr = getstring(string, &length, &logical_charsize, &charsize, &state->buffer);
    +    ptr = getstring(string, &length, &isbytes, &charsize, &state->buffer);
         if (!ptr)
             goto err;
     
    -    if (logical_charsize == 1 && pattern->logical_charsize > 1) {
    +    if (isbytes && pattern->isbytes == 0) {
             PyErr_SetString(PyExc_TypeError,
                             "can't use a string pattern on a bytes-like object");
             goto err;
         }
    -    if (logical_charsize > 1 && pattern->logical_charsize == 1) {
    +    if (!isbytes && pattern->isbytes > 0) {
             PyErr_SetString(PyExc_TypeError,
                             "can't use a bytes pattern on a string-like object");
             goto err;
    @@ -1771,7 +1713,7 @@
         else if (end > length)
             end = length;
     
    -    state->logical_charsize = logical_charsize;
    +    state->isbytes = isbytes;
         state->charsize = charsize;
     
         state->beginning = ptr;
    @@ -1812,10 +1754,10 @@
         (((char*)(member) - (char*)(state)->beginning) / (state)->charsize)
     
     LOCAL(PyObject*)
    -getslice(int logical_charsize, const void *ptr,
    +getslice(int isbytes, const void *ptr,
              PyObject* string, Py_ssize_t start, Py_ssize_t end)
     {
    -    if (logical_charsize == 1) {
    +    if (isbytes) {
             if (PyBytes_CheckExact(string) &&
                 start == 0 && end == PyBytes_GET_SIZE(string)) {
                 Py_INCREF(string);
    @@ -1849,7 +1791,7 @@
             j = STATE_OFFSET(state, state->mark[index+1]);
         }
     
    -    return getslice(state->logical_charsize, state->beginning, string, i, j);
    +    return getslice(state->isbytes, state->beginning, string, i, j);
     }
     
     static void
    @@ -1882,14 +1824,34 @@
     {
         if (self->weakreflist != NULL)
             PyObject_ClearWeakRefs((PyObject *) self);
    -    if (self->view.buf)
    -        PyBuffer_Release(&self->view);
         Py_XDECREF(self->pattern);
         Py_XDECREF(self->groupindex);
         Py_XDECREF(self->indexgroup);
         PyObject_DEL(self);
     }
     
    +LOCAL(Py_ssize_t)
    +sre_match(SRE_STATE* state, SRE_CODE* pattern)
    +{
    +    if (state->charsize == 1)
    +        return sre_ucs1_match(state, pattern);
    +    if (state->charsize == 2)
    +        return sre_ucs2_match(state, pattern);
    +    assert(state->charsize == 4);
    +    return sre_ucs4_match(state, pattern);
    +}
    +
    +LOCAL(Py_ssize_t)
    +sre_search(SRE_STATE* state, SRE_CODE* pattern)
    +{
    +    if (state->charsize == 1)
    +        return sre_ucs1_search(state, pattern);
    +    if (state->charsize == 2)
    +        return sre_ucs2_search(state, pattern);
    +    assert(state->charsize == 4);
    +    return sre_ucs4_search(state, pattern);
    +}
    +
     static PyObject*
     pattern_match(PatternObject* self, PyObject* args, PyObject* kw)
     {
    @@ -1912,11 +1874,7 @@
     
         TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
     
    -    if (state.logical_charsize == 1) {
    -        status = sre_match(&state, PatternObject_GetCode(self));
    -    } else {
    -        status = sre_umatch(&state, PatternObject_GetCode(self));
    -    }
    +    status = sre_match(&state, PatternObject_GetCode(self));
     
         TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
         if (PyErr_Occurred())
    @@ -1947,11 +1905,7 @@
     
         TRACE(("|%p|%p|SEARCH\n", PatternObject_GetCode(self), state.ptr));
     
    -    if (state.logical_charsize == 1) {
    -        status = sre_search(&state, PatternObject_GetCode(self));
    -    } else {
    -        status = sre_usearch(&state, PatternObject_GetCode(self));
    -    }
    +    status = sre_search(&state, PatternObject_GetCode(self));
     
         TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
     
    @@ -2044,12 +1998,7 @@
     
             state.ptr = state.start;
     
    -        if (state.logical_charsize == 1) {
    -            status = sre_search(&state, PatternObject_GetCode(self));
    -        } else {
    -            status = sre_usearch(&state, PatternObject_GetCode(self));
    -        }
    -
    +        status = sre_search(&state, PatternObject_GetCode(self));
             if (PyErr_Occurred())
                 goto error;
     
    @@ -2065,7 +2014,7 @@
             case 0:
                 b = STATE_OFFSET(&state, state.start);
                 e = STATE_OFFSET(&state, state.ptr);
    -            item = getslice(state.logical_charsize, state.beginning,
    +            item = getslice(state.isbytes, state.beginning,
                                 string, b, e);
                 if (!item)
                     goto error;
    @@ -2171,12 +2120,7 @@
     
             state.ptr = state.start;
     
    -        if (state.logical_charsize == 1) {
    -            status = sre_search(&state, PatternObject_GetCode(self));
    -        } else {
    -            status = sre_usearch(&state, PatternObject_GetCode(self));
    -        }
    -
    +        status = sre_search(&state, PatternObject_GetCode(self));
             if (PyErr_Occurred())
                 goto error;
     
    @@ -2196,7 +2140,7 @@
             }
     
             /* get segment before this match */
    -        item = getslice(state.logical_charsize, state.beginning,
    +        item = getslice(state.isbytes, state.beginning,
                 string, STATE_OFFSET(&state, last),
                 STATE_OFFSET(&state, state.start)
                 );
    @@ -2225,7 +2169,7 @@
         }
     
         /* get segment following last match (even if empty) */
    -    item = getslice(state.logical_charsize, state.beginning,
    +    item = getslice(state.isbytes, state.beginning,
             string, STATE_OFFSET(&state, last), state.endpos
             );
         if (!item)
    @@ -2260,7 +2204,7 @@
         Py_ssize_t status;
         Py_ssize_t n;
         Py_ssize_t i, b, e;
    -    int logical_charsize, charsize;
    +    int isbytes, charsize;
         int filter_is_callable;
         Py_buffer view;
     
    @@ -2273,10 +2217,13 @@
             /* if not callable, check if it's a literal string */
             int literal;
             view.buf = NULL;
    -        ptr = getstring(ptemplate, &n, &logical_charsize, &charsize, &view);
    +        ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view);
             b = charsize;
             if (ptr) {
    -            literal = sre_literal_template(charsize, ptr, n);
    +            if (charsize == 1)
    +                literal = memchr(ptr, '\\', n) == NULL;
    +            else
    +                literal = PyUnicode_FindChar(ptemplate, '\\', 0, n, 1) == -1;
             } else {
                 PyErr_Clear();
                 literal = 0;
    @@ -2320,12 +2267,7 @@
     
             state.ptr = state.start;
     
    -        if (state.logical_charsize == 1) {
    -            status = sre_search(&state, PatternObject_GetCode(self));
    -        } else {
    -            status = sre_usearch(&state, PatternObject_GetCode(self));
    -        }
    -
    +        status = sre_search(&state, PatternObject_GetCode(self));
             if (PyErr_Occurred())
                 goto error;
     
    @@ -2341,7 +2283,7 @@
     
             if (i < b) {
                 /* get segment before this match */
    -            item = getslice(state.logical_charsize, state.beginning,
    +            item = getslice(state.isbytes, state.beginning,
                     string, i, b);
                 if (!item)
                     goto error;
    @@ -2397,7 +2339,7 @@
     
         /* get segment following last match */
         if (i < state.endpos) {
    -        item = getslice(state.logical_charsize, state.beginning,
    +        item = getslice(state.isbytes, state.beginning,
                             string, i, state.endpos);
             if (!item)
                 goto error;
    @@ -2412,7 +2354,7 @@
         Py_DECREF(filter);
     
         /* convert list to single string (also removes list) */
    -    joiner = getslice(state.logical_charsize, state.beginning, string, 0, 0);
    +    joiner = getslice(state.isbytes, state.beginning, string, 0, 0);
         if (!joiner) {
             Py_DECREF(list);
             return NULL;
    @@ -2422,7 +2364,7 @@
             item = joiner;
         }
         else {
    -        if (state.logical_charsize == 1)
    +        if (state.isbytes)
                 item = _PyBytes_Join(joiner, list);
             else
                 item = PyUnicode_Join(joiner, list);
    @@ -2652,7 +2594,6 @@
         self->pattern = NULL;
         self->groupindex = NULL;
         self->indexgroup = NULL;
    -    self->view.buf = NULL;
     
         self->codesize = n;
     
    @@ -2673,16 +2614,20 @@
         }
     
         if (pattern == Py_None) {
    -        self->logical_charsize = -1;
    -        self->charsize = -1;
    +        self->isbytes = -1;
         }
         else {
             Py_ssize_t p_length;
    -        if (!getstring(pattern, &p_length, &self->logical_charsize,
    -                       &self->charsize, &self->view)) {
    +        int charsize;
    +        Py_buffer view;
    +        view.buf = NULL;
    +        if (!getstring(pattern, &p_length, &self->isbytes,
    +                       &charsize, &view)) {
                 Py_DECREF(self);
                 return NULL;
             }
    +        if (view.buf)
    +            PyBuffer_Release(&view);
         }
     
         Py_INCREF(pattern);
    @@ -2801,7 +2746,7 @@
                 break;
     
             case SRE_OP_CHARSET:
    -            offset = 32/sizeof(SRE_CODE); /* 32-byte bitmap */
    +            offset = 256/SRE_CODE_BITS; /* 256-bit bitmap */
                 if (offset > (Py_uintptr_t)(end - code))
                     FAIL;
                 code += offset;
    @@ -2818,7 +2763,7 @@
                         FAIL;
                 }
                 code += offset;
    -            offset = arg * 32/sizeof(SRE_CODE); /* 32-byte bitmap times arg */
    +            offset = arg * (256/SRE_CODE_BITS); /* 256-bit bitmap times arg */
                 if (offset > (Py_uintptr_t)(end - code))
                     FAIL;
                 code += offset;
    @@ -3188,7 +3133,7 @@
     match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
     {
         Py_ssize_t length;
    -    int logical_charsize, charsize;
    +    int isbytes, charsize;
         Py_buffer view;
         PyObject *result;
         void* ptr;
    @@ -3210,12 +3155,12 @@
             return def;
         }
     
    -    ptr = getstring(self->string, &length, &logical_charsize, &charsize, &view);
    +    ptr = getstring(self->string, &length, &isbytes, &charsize, &view);
         if (ptr == NULL)
             return NULL;
    -    result = getslice(logical_charsize, ptr,
    +    result = getslice(isbytes, ptr,
                           self->string, self->mark[index], self->mark[index+1]);
    -    if (logical_charsize == 1 && view.buf != NULL)
    +    if (isbytes && view.buf != NULL)
             PyBuffer_Release(&view);
         return result;
     }
    @@ -3790,11 +3735,7 @@
     
         state->ptr = state->start;
     
    -    if (state->logical_charsize == 1) {
    -        status = sre_match(state, PatternObject_GetCode(self->pattern));
    -    } else {
    -        status = sre_umatch(state, PatternObject_GetCode(self->pattern));
    -    }
    +    status = sre_match(state, PatternObject_GetCode(self->pattern));
         if (PyErr_Occurred())
             return NULL;
     
    @@ -3821,11 +3762,7 @@
     
         state->ptr = state->start;
     
    -    if (state->logical_charsize == 1) {
    -        status = sre_search(state, PatternObject_GetCode(self->pattern));
    -    } else {
    -        status = sre_usearch(state, PatternObject_GetCode(self->pattern));
    -    }
    +    status = sre_search(state, PatternObject_GetCode(self->pattern));
         if (PyErr_Occurred())
             return NULL;
     
    @@ -3980,5 +3917,12 @@
     
     #endif /* !defined(SRE_RECURSIVE) */
     
    +#ifdef SRE_RECURSIVE
    +# undef SRE_RECURSIVE
    +# undef SRE_CHAR
    +# undef SIZEOF_SRE_CHAR
    +# undef SRE
    +#endif /* SRE_RECURSIVE */
    +
     /* vim:ts=4:sw=4:et
     */
    diff --git a/Modules/sre.h b/Modules/sre.h
    --- a/Modules/sre.h
    +++ b/Modules/sre.h
    @@ -31,9 +31,7 @@
         PyObject* pattern; /* pattern source (or None) */
         int flags; /* flags used when compiling pattern source */
         PyObject *weakreflist; /* List of weak references */
    -    int logical_charsize; /* pattern charsize (or -1) */
    -    int charsize;
    -    Py_buffer view;
    +    int isbytes; /* pattern type (1 - bytes, 0 - string, -1 - None) */
         /* pattern code */
         Py_ssize_t codesize;
         SRE_CODE code[1];
    @@ -73,9 +71,8 @@
         /* attributes for the match object */
         PyObject* string;
         Py_ssize_t pos, endpos;
    -    /* character size */
    -    int logical_charsize; /* kind of thing: 1 - bytes, 2/4 - unicode */
    -    int charsize;
    +    int isbytes;
    +    int charsize; /* character size */
         /* registers */
         Py_ssize_t lastindex;
         Py_ssize_t lastmark;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 10:08:30 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 10:08:30 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319330_by_using_pu?=
    	=?utf-8?q?blic_classes_in_contextlib?=
    Message-ID: <3d6FFB4Pqyz7Ljk@mail.python.org>
    
    http://hg.python.org/cpython/rev/09153a9a3bb9
    changeset:   86650:09153a9a3bb9
    user:        Nick Coghlan 
    date:        Sat Oct 26 18:08:15 2013 +1000
    summary:
      Close #19330 by using public classes in contextlib
    
    - added test cases to ensure docstrings are reasonable
    - also updates various comments in contextlib for accuracy
    - identifed #19404 as an issue making it difficult to provide
      good help output on generator based context manager instances
    
    files:
      Lib/contextlib.py           |  86 ++++++++++++------------
      Lib/test/test_contextlib.py |  63 ++++++++++++++++-
      Misc/NEWS                   |   5 +
      3 files changed, 105 insertions(+), 49 deletions(-)
    
    
    diff --git a/Lib/contextlib.py b/Lib/contextlib.py
    --- a/Lib/contextlib.py
    +++ b/Lib/contextlib.py
    @@ -37,6 +37,16 @@
         def __init__(self, func, *args, **kwds):
             self.gen = func(*args, **kwds)
             self.func, self.args, self.kwds = func, args, kwds
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        doc = getattr(func, "__doc__", None)
    +        if doc is None:
    +            doc = type(self).__doc__
    +        self.__doc__ = doc
    +        # Unfortunately, this still doesn't provide good help output when
    +        # inspecting the created context manager instances, since pydoc
    +        # currently bypasses the instance docstring and shows the docstring
    +        # for the class instead.
    +        # See http://bugs.python.org/issue19404 for more details.
     
         def _recreate_cm(self):
             # _GCM instances are one-shot context managers, so the
    @@ -117,9 +127,6 @@
         return helper
     
     
    -# Unfortunately, this was originally published as a class, so
    -# backwards compatibility prevents the use of the wrapper function
    -# approach used for the other classes
     class closing(object):
         """Context to automatically close something at the end of a block.
     
    @@ -144,8 +151,18 @@
         def __exit__(self, *exc_info):
             self.thing.close()
     
    -class _RedirectStdout:
    -    """Helper for redirect_stdout."""
    +class redirect_stdout:
    +    """Context manager for temporarily redirecting stdout to another file
    +
    +        # How to send help() to stderr
    +        with redirect_stdout(sys.stderr):
    +            help(dir)
    +
    +        # How to write help() to a file
    +        with open('help.txt', 'w') as f:
    +            with redirect_stdout(f):
    +                help(pow)
    +    """
     
         def __init__(self, new_target):
             self._new_target = new_target
    @@ -163,46 +180,9 @@
             self._old_target = self._sentinel
             sys.stdout = restore_stdout
     
    -# Use a wrapper function since we don't care about supporting inheritance
    -# and a function gives much cleaner output in help()
    -def redirect_stdout(target):
    -    """Context manager for temporarily redirecting stdout to another file
     
    -        # How to send help() to stderr
    -        with redirect_stdout(sys.stderr):
    -            help(dir)
     
    -        # How to write help() to a file
    -        with open('help.txt', 'w') as f:
    -            with redirect_stdout(f):
    -                help(pow)
    -    """
    -    return _RedirectStdout(target)
    -
    -
    -class _SuppressExceptions:
    -    """Helper for suppress."""
    -    def __init__(self, *exceptions):
    -        self._exceptions = exceptions
    -
    -    def __enter__(self):
    -        pass
    -
    -    def __exit__(self, exctype, excinst, exctb):
    -        # Unlike isinstance and issubclass, exception handling only
    -        # looks at the concrete type heirarchy (ignoring the instance
    -        # and subclass checking hooks). However, all exceptions are
    -        # also required to be concrete subclasses of BaseException, so
    -        # if there's a discrepancy in behaviour, we currently consider it
    -        # the fault of the strange way the exception has been defined rather
    -        # than the fact that issubclass can be customised while the
    -        # exception checks can't.
    -        # See http://bugs.python.org/issue12029 for more details
    -        return exctype is not None and issubclass(exctype, self._exceptions)
    -
    -# Use a wrapper function since we don't care about supporting inheritance
    -# and a function gives much cleaner output in help()
    -def suppress(*exceptions):
    +class suppress:
         """Context manager to suppress specified exceptions
     
         After the exception is suppressed, execution proceeds with the next
    @@ -212,7 +192,25 @@
                  os.remove(somefile)
              # Execution still resumes here if the file was already removed
         """
    -    return _SuppressExceptions(*exceptions)
    +
    +    def __init__(self, *exceptions):
    +        self._exceptions = exceptions
    +
    +    def __enter__(self):
    +        pass
    +
    +    def __exit__(self, exctype, excinst, exctb):
    +        # Unlike isinstance and issubclass, CPython exception handling
    +        # currently only looks at the concrete type hierarchy (ignoring
    +        # the instance and subclass checking hooks). While Guido considers
    +        # that a bug rather than a feature, it's a fairly hard one to fix
    +        # due to various internal implementation details. suppress provides
    +        # the simpler issubclass based semantics, rather than trying to
    +        # exactly reproduce the limitations of the CPython interpreter.
    +        #
    +        # See http://bugs.python.org/issue12029 for more details
    +        return exctype is not None and issubclass(exctype, self._exceptions)
    +
     
     # Inspired by discussions on http://bugs.python.org/issue13585
     class ExitStack(object):
    diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
    --- a/Lib/test/test_contextlib.py
    +++ b/Lib/test/test_contextlib.py
    @@ -14,6 +14,20 @@
     
     class ContextManagerTestCase(unittest.TestCase):
     
    +    def test_instance_docstring_given_function_docstring(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        # See http://bugs.python.org/issue19404 for why this doesn't currently
    +        # affect help() output :(
    +        def gen_with_docstring():
    +            """This has a docstring"""
    +            yield
    +        gen_docstring = gen_with_docstring.__doc__
    +        cm_with_docstring = contextmanager(gen_with_docstring)
    +        self.assertEqual(cm_with_docstring.__doc__, gen_docstring)
    +        obj = cm_with_docstring()
    +        self.assertEqual(obj.__doc__, gen_docstring)
    +        self.assertNotEqual(obj.__doc__, type(obj).__doc__)
    +
         def test_contextmanager_plain(self):
             state = []
             @contextmanager
    @@ -109,7 +123,11 @@
     
     class ClosingTestCase(unittest.TestCase):
     
    -    # XXX This needs more work
    +    def test_instance_docs(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        cm_docstring = closing.__doc__
    +        obj = closing(None)
    +        self.assertEqual(obj.__doc__, cm_docstring)
     
         def test_closing(self):
             state = []
    @@ -205,6 +223,7 @@
     
     
     class mycontext(ContextDecorator):
    +    """Example decoration-compatible context manager for testing"""
         started = False
         exc = None
         catch = False
    @@ -220,6 +239,12 @@
     
     class TestContextDecorator(unittest.TestCase):
     
    +    def test_instance_docs(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        cm_docstring = mycontext.__doc__
    +        obj = mycontext()
    +        self.assertEqual(obj.__doc__, cm_docstring)
    +
         def test_contextdecorator(self):
             context = mycontext()
             with context as result:
    @@ -373,6 +398,12 @@
     
     class TestExitStack(unittest.TestCase):
     
    +    def test_instance_docs(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        cm_docstring = ExitStack.__doc__
    +        obj = ExitStack()
    +        self.assertEqual(obj.__doc__, cm_docstring)
    +
         def test_no_resources(self):
             with ExitStack():
                 pass
    @@ -634,6 +665,12 @@
     
     class TestRedirectStdout(unittest.TestCase):
     
    +    def test_instance_docs(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        cm_docstring = redirect_stdout.__doc__
    +        obj = redirect_stdout(None)
    +        self.assertEqual(obj.__doc__, cm_docstring)
    +
         def test_redirect_to_string_io(self):
             f = io.StringIO()
             msg = "Consider an API like help(), which prints directly to stdout"
    @@ -671,6 +708,12 @@
     
     class TestSuppress(unittest.TestCase):
     
    +    def test_instance_docs(self):
    +        # Issue 19330: ensure context manager instances have good docstrings
    +        cm_docstring = suppress.__doc__
    +        obj = suppress()
    +        self.assertEqual(obj.__doc__, cm_docstring)
    +
         def test_no_result_from_enter(self):
             with suppress(ValueError) as enter_result:
                 self.assertIsNone(enter_result)
    @@ -683,16 +726,26 @@
             with suppress(TypeError):
                 len(5)
     
    +    def test_exception_hierarchy(self):
    +        with suppress(LookupError):
    +            'Hello'[50]
    +
    +    def test_other_exception(self):
    +        with self.assertRaises(ZeroDivisionError):
    +            with suppress(TypeError):
    +                1/0
    +
    +    def test_no_args(self):
    +        with self.assertRaises(ZeroDivisionError):
    +            with suppress():
    +                1/0
    +
         def test_multiple_exception_args(self):
             with suppress(ZeroDivisionError, TypeError):
                 1/0
             with suppress(ZeroDivisionError, TypeError):
                 len(5)
     
    -    def test_exception_hierarchy(self):
    -        with suppress(LookupError):
    -            'Hello'[50]
    -
         def test_cm_is_reentrant(self):
             ignore_exceptions = suppress(Exception)
             with ignore_exceptions:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -21,6 +21,11 @@
     Library
     -------
     
    +- Issue #19330: the unnecessary wrapper functions have been removed from the
    +  implementations of the new contextlib.redirect_stdout and
    +  contextlib.suppress context managers, which also ensures they provide
    +  reasonable help() output on instances
    +
     - Issue #18685: Restore re performance to pre-PEP 393 levels.
     
     - Issue #19339: telnetlib module is now using time.monotonic() when available
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 10:19:31 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sat, 26 Oct 2013 10:19:31 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318685=3A_Extract_?=
     =?utf-8?q?template_part_of_=5Fsre=2Ec_into_separated_sre=5Flib=2Eh_file?=
     =?utf-8?q?=2E?=
    Message-ID: <3d6FTv58qDz7Ljc@mail.python.org>
    
    http://hg.python.org/cpython/rev/00e61cb3b11c
    changeset:   86651:00e61cb3b11c
    user:        Serhiy Storchaka 
    date:        Sat Oct 26 11:18:42 2013 +0300
    summary:
      Issue #18685: Extract template part of _sre.c into separated sre_lib.h file.
    
    files:
      Makefile.pre.in                    |     2 +
      Modules/_sre.c                     |  1342 +--------
      Modules/_sre.c                     |  2609 +---------------
      PC/VS9.0/pythoncore.vcproj         |    12 +
      PCbuild/pythoncore.vcxproj         |     3 +
      PCbuild/pythoncore.vcxproj.filters |     9 +
      6 files changed, 34 insertions(+), 3943 deletions(-)
    
    
    diff --git a/Makefile.pre.in b/Makefile.pre.in
    --- a/Makefile.pre.in
    +++ b/Makefile.pre.in
    @@ -688,6 +688,8 @@
     Modules/_testembed.o: $(srcdir)/Modules/_testembed.c
     	$(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/_testembed.c
     
    +Modules/_sre.o: $(srcdir)/Modules/_sre.c $(srcdir)/Modules/sre.h $(srcdir)/Modules/sre_constants.h $(srcdir)/Modules/sre_lib.h
    +
     Modules/posixmodule.o: $(srcdir)/Modules/posixmodule.c $(srcdir)/Modules/posixmodule.h
     
     Modules/grpmodule.o: $(srcdir)/Modules/grpmodule.c $(srcdir)/Modules/posixmodule.h
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -34,8 +34,6 @@
      * other compatibility work.
      */
     
    -#ifndef SRE_RECURSIVE
    -
     static char copyright[] =
         " SRE 2.2.2 Copyright (c) 1997-2002 by Secret Labs AB ";
     
    @@ -251,1346 +249,21 @@
     #define SRE_CHAR Py_UCS1
     #define SIZEOF_SRE_CHAR 1
     #define SRE(F) sre_ucs1_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    +#include "sre_lib.h"
     
     /* generate 16-bit unicode version */
     
     #define SRE_CHAR Py_UCS2
     #define SIZEOF_SRE_CHAR 2
     #define SRE(F) sre_ucs2_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    +#include "sre_lib.h"
     
     /* generate 32-bit unicode version */
     
     #define SRE_CHAR Py_UCS4
     #define SIZEOF_SRE_CHAR 4
     #define SRE(F) sre_ucs4_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    -
    -#endif /* SRE_RECURSIVE */
    -
    -#ifdef SRE_RECURSIVE
    -/* -------------------------------------------------------------------- */
    -/* String matching engine */
    -
    -/* the following section is compiled three times, with different character
    -   settings */
    -
    -LOCAL(int)
    -SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
    -{
    -    /* check if pointer is at given position */
    -
    -    Py_ssize_t thisp, thatp;
    -
    -    switch (at) {
    -
    -    case SRE_AT_BEGINNING:
    -    case SRE_AT_BEGINNING_STRING:
    -        return ((void*) ptr == state->beginning);
    -
    -    case SRE_AT_BEGINNING_LINE:
    -        return ((void*) ptr == state->beginning ||
    -                SRE_IS_LINEBREAK((int) ptr[-1]));
    -
    -    case SRE_AT_END:
    -        return (((void*) (ptr+1) == state->end &&
    -                 SRE_IS_LINEBREAK((int) ptr[0])) ||
    -                ((void*) ptr == state->end));
    -
    -    case SRE_AT_END_LINE:
    -        return ((void*) ptr == state->end ||
    -                SRE_IS_LINEBREAK((int) ptr[0]));
    -
    -    case SRE_AT_END_STRING:
    -        return ((void*) ptr == state->end);
    -
    -    case SRE_AT_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_IS_WORD((int) ptr[0]) : 0;
    -        return thisp != thatp;
    -
    -    case SRE_AT_NON_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_IS_WORD((int) ptr[0]) : 0;
    -        return thisp == thatp;
    -
    -    case SRE_AT_LOC_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_LOC_IS_WORD((int) ptr[0]) : 0;
    -        return thisp != thatp;
    -
    -    case SRE_AT_LOC_NON_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_LOC_IS_WORD((int) ptr[0]) : 0;
    -        return thisp == thatp;
    -
    -    case SRE_AT_UNI_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_UNI_IS_WORD((int) ptr[0]) : 0;
    -        return thisp != thatp;
    -
    -    case SRE_AT_UNI_NON_BOUNDARY:
    -        if (state->beginning == state->end)
    -            return 0;
    -        thatp = ((void*) ptr > state->beginning) ?
    -            SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
    -        thisp = ((void*) ptr < state->end) ?
    -            SRE_UNI_IS_WORD((int) ptr[0]) : 0;
    -        return thisp == thatp;
    -
    -    }
    -
    -    return 0;
    -}
    -
    -LOCAL(int)
    -SRE(charset)(SRE_CODE* set, SRE_CODE ch)
    -{
    -    /* check if character is a member of the given set */
    -
    -    int ok = 1;
    -
    -    for (;;) {
    -        switch (*set++) {
    -
    -        case SRE_OP_FAILURE:
    -            return !ok;
    -
    -        case SRE_OP_LITERAL:
    -            /*   */
    -            if (ch == set[0])
    -                return ok;
    -            set++;
    -            break;
    -
    -        case SRE_OP_CATEGORY:
    -            /*   */
    -            if (sre_category(set[0], (int) ch))
    -                return ok;
    -            set++;
    -            break;
    -
    -        case SRE_OP_CHARSET:
    -            /*   */
    -            if (ch < 256 &&
    -                (set[ch/SRE_CODE_BITS] & (1u << (ch & (SRE_CODE_BITS-1)))))
    -                return ok;
    -            set += 256/SRE_CODE_BITS;
    -            break;
    -
    -        case SRE_OP_RANGE:
    -            /*    */
    -            if (set[0] <= ch && ch <= set[1])
    -                return ok;
    -            set += 2;
    -            break;
    -
    -        case SRE_OP_NEGATE:
    -            ok = !ok;
    -            break;
    -
    -        case SRE_OP_BIGCHARSET:
    -            /*   <256 blockindices>  */
    -        {
    -            Py_ssize_t count, block;
    -            count = *(set++);
    -
    -            if (ch < 0x10000u)
    -                block = ((unsigned char*)set)[ch >> 8];
    -            else
    -                block = -1;
    -            set += 256/sizeof(SRE_CODE);
    -            if (block >=0 &&
    -                (set[(block * 256 + (ch & 255))/SRE_CODE_BITS] &
    -                    (1u << (ch & (SRE_CODE_BITS-1)))))
    -                return ok;
    -            set += count * (256/SRE_CODE_BITS);
    -            break;
    -        }
    -
    -        default:
    -            /* internal error -- there's not much we can do about it
    -               here, so let's just pretend it didn't match... */
    -            return 0;
    -        }
    -    }
    -}
    -
    -LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern);
    -
    -LOCAL(Py_ssize_t)
    -SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
    -{
    -    SRE_CODE chr;
    -    SRE_CHAR c;
    -    SRE_CHAR* ptr = (SRE_CHAR *)state->ptr;
    -    SRE_CHAR* end = (SRE_CHAR *)state->end;
    -    Py_ssize_t i;
    -
    -    /* adjust end */
    -    if (maxcount < end - ptr && maxcount != SRE_MAXREPEAT)
    -        end = ptr + maxcount;
    -
    -    switch (pattern[0]) {
    -
    -    case SRE_OP_IN:
    -        /* repeated set */
    -        TRACE(("|%p|%p|COUNT IN\n", pattern, ptr));
    -        while (ptr < end && SRE(charset)(pattern + 2, *ptr))
    -            ptr++;
    -        break;
    -
    -    case SRE_OP_ANY:
    -        /* repeated dot wildcard. */
    -        TRACE(("|%p|%p|COUNT ANY\n", pattern, ptr));
    -        while (ptr < end && !SRE_IS_LINEBREAK(*ptr))
    -            ptr++;
    -        break;
    -
    -    case SRE_OP_ANY_ALL:
    -        /* repeated dot wildcard.  skip to the end of the target
    -           string, and backtrack from there */
    -        TRACE(("|%p|%p|COUNT ANY_ALL\n", pattern, ptr));
    -        ptr = end;
    -        break;
    -
    -    case SRE_OP_LITERAL:
    -        /* repeated literal */
    -        chr = pattern[1];
    -        TRACE(("|%p|%p|COUNT LITERAL %d\n", pattern, ptr, chr));
    -        c = (SRE_CHAR) chr;
    -#if SIZEOF_SRE_CHAR < 4
    -        if ((SRE_CODE) c != chr)
    -            ; /* literal can't match: doesn't fit in char width */
    -        else
    -#endif
    -        while (ptr < end && *ptr == c)
    -            ptr++;
    -        break;
    -
    -    case SRE_OP_LITERAL_IGNORE:
    -        /* repeated literal */
    -        chr = pattern[1];
    -        TRACE(("|%p|%p|COUNT LITERAL_IGNORE %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) state->lower(*ptr) == chr)
    -            ptr++;
    -        break;
    -
    -    case SRE_OP_NOT_LITERAL:
    -        /* repeated non-literal */
    -        chr = pattern[1];
    -        TRACE(("|%p|%p|COUNT NOT_LITERAL %d\n", pattern, ptr, chr));
    -        c = (SRE_CHAR) chr;
    -#if SIZEOF_SRE_CHAR < 4
    -        if ((SRE_CODE) c != chr)
    -            ptr = end; /* literal can't match: doesn't fit in char width */
    -        else
    -#endif
    -        while (ptr < end && *ptr != c)
    -            ptr++;
    -        break;
    -
    -    case SRE_OP_NOT_LITERAL_IGNORE:
    -        /* repeated non-literal */
    -        chr = pattern[1];
    -        TRACE(("|%p|%p|COUNT NOT_LITERAL_IGNORE %d\n", pattern, ptr, chr));
    -        while (ptr < end && (SRE_CODE) state->lower(*ptr) != chr)
    -            ptr++;
    -        break;
    -
    -    default:
    -        /* repeated single character pattern */
    -        TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr));
    -        while ((SRE_CHAR*) state->ptr < end) {
    -            i = SRE(match)(state, pattern);
    -            if (i < 0)
    -                return i;
    -            if (!i)
    -                break;
    -        }
    -        TRACE(("|%p|%p|COUNT %" PY_FORMAT_SIZE_T "d\n", pattern, ptr,
    -               (SRE_CHAR*) state->ptr - ptr));
    -        return (SRE_CHAR*) state->ptr - ptr;
    -    }
    -
    -    TRACE(("|%p|%p|COUNT %" PY_FORMAT_SIZE_T "d\n", pattern, ptr,
    -           ptr - (SRE_CHAR*) state->ptr));
    -    return ptr - (SRE_CHAR*) state->ptr;
    -}
    -
    -#if 0 /* not used in this release */
    -LOCAL(int)
    -SRE(info)(SRE_STATE* state, SRE_CODE* pattern)
    -{
    -    /* check if an SRE_OP_INFO block matches at the current position.
    -       returns the number of SRE_CODE objects to skip if successful, 0
    -       if no match */
    -
    -    SRE_CHAR* end = (SRE_CHAR*) state->end;
    -    SRE_CHAR* ptr = (SRE_CHAR*) state->ptr;
    -    Py_ssize_t i;
    -
    -    /* check minimal length */
    -    if (pattern[3] && end - ptr < pattern[3])
    -        return 0;
    -
    -    /* check known prefix */
    -    if (pattern[2] & SRE_INFO_PREFIX && pattern[5] > 1) {
    -        /*     */
    -        for (i = 0; i < pattern[5]; i++)
    -            if ((SRE_CODE) ptr[i] != pattern[7 + i])
    -                return 0;
    -        return pattern[0] + 2 * pattern[6];
    -    }
    -    return pattern[0];
    -}
    -#endif
    -
    -/* The macros below should be used to protect recursive SRE(match)()
    - * calls that *failed* and do *not* return immediately (IOW, those
    - * that will backtrack). Explaining:
    - *
    - * - Recursive SRE(match)() returned true: that's usually a success
    - *   (besides atypical cases like ASSERT_NOT), therefore there's no
    - *   reason to restore lastmark;
    - *
    - * - Recursive SRE(match)() returned false but the current SRE(match)()
    - *   is returning to the caller: If the current SRE(match)() is the
    - *   top function of the recursion, returning false will be a matching
    - *   failure, and it doesn't matter where lastmark is pointing to.
    - *   If it's *not* the top function, it will be a recursive SRE(match)()
    - *   failure by itself, and the calling SRE(match)() will have to deal
    - *   with the failure by the same rules explained here (it will restore
    - *   lastmark by itself if necessary);
    - *
    - * - Recursive SRE(match)() returned false, and will continue the
    - *   outside 'for' loop: must be protected when breaking, since the next
    - *   OP could potentially depend on lastmark;
    - *
    - * - Recursive SRE(match)() returned false, and will be called again
    - *   inside a local for/while loop: must be protected between each
    - *   loop iteration, since the recursive SRE(match)() could do anything,
    - *   and could potentially depend on lastmark.
    - *
    - * For more information, check the discussion at SF patch #712900.
    - */
    -#define LASTMARK_SAVE()     \
    -    do { \
    -        ctx->lastmark = state->lastmark; \
    -        ctx->lastindex = state->lastindex; \
    -    } while (0)
    -#define LASTMARK_RESTORE()  \
    -    do { \
    -        state->lastmark = ctx->lastmark; \
    -        state->lastindex = ctx->lastindex; \
    -    } while (0)
    -
    -#define RETURN_ERROR(i) do { return i; } while(0)
    -#define RETURN_FAILURE do { ret = 0; goto exit; } while(0)
    -#define RETURN_SUCCESS do { ret = 1; goto exit; } while(0)
    -
    -#define RETURN_ON_ERROR(i) \
    -    do { if (i < 0) RETURN_ERROR(i); } while (0)
    -#define RETURN_ON_SUCCESS(i) \
    -    do { RETURN_ON_ERROR(i); if (i > 0) RETURN_SUCCESS; } while (0)
    -#define RETURN_ON_FAILURE(i) \
    -    do { RETURN_ON_ERROR(i); if (i == 0) RETURN_FAILURE; } while (0)
    -
    -#define SFY(x) #x
    -
    -#define DATA_STACK_ALLOC(state, type, ptr) \
    -do { \
    -    alloc_pos = state->data_stack_base; \
    -    TRACE(("allocating %s in %" PY_FORMAT_SIZE_T "d " \
    -           "(%" PY_FORMAT_SIZE_T "d)\n", \
    -           SFY(type), alloc_pos, sizeof(type))); \
    -    if (sizeof(type) > state->data_stack_size - alloc_pos) { \
    -        int j = data_stack_grow(state, sizeof(type)); \
    -        if (j < 0) return j; \
    -        if (ctx_pos != -1) \
    -            DATA_STACK_LOOKUP_AT(state, SRE(match_context), ctx, ctx_pos); \
    -    } \
    -    ptr = (type*)(state->data_stack+alloc_pos); \
    -    state->data_stack_base += sizeof(type); \
    -} while (0)
    -
    -#define DATA_STACK_LOOKUP_AT(state, type, ptr, pos) \
    -do { \
    -    TRACE(("looking up %s at %" PY_FORMAT_SIZE_T "d\n", SFY(type), pos)); \
    -    ptr = (type*)(state->data_stack+pos); \
    -} while (0)
    -
    -#define DATA_STACK_PUSH(state, data, size) \
    -do { \
    -    TRACE(("copy data in %p to %" PY_FORMAT_SIZE_T "d " \
    -           "(%" PY_FORMAT_SIZE_T "d)\n", \
    -           data, state->data_stack_base, size)); \
    -    if (size > state->data_stack_size - state->data_stack_base) { \
    -        int j = data_stack_grow(state, size); \
    -        if (j < 0) return j; \
    -        if (ctx_pos != -1) \
    -            DATA_STACK_LOOKUP_AT(state, SRE(match_context), ctx, ctx_pos); \
    -    } \
    -    memcpy(state->data_stack+state->data_stack_base, data, size); \
    -    state->data_stack_base += size; \
    -} while (0)
    -
    -#define DATA_STACK_POP(state, data, size, discard) \
    -do { \
    -    TRACE(("copy data to %p from %" PY_FORMAT_SIZE_T "d " \
    -           "(%" PY_FORMAT_SIZE_T "d)\n", \
    -           data, state->data_stack_base-size, size)); \
    -    memcpy(data, state->data_stack+state->data_stack_base-size, size); \
    -    if (discard) \
    -        state->data_stack_base -= size; \
    -} while (0)
    -
    -#define DATA_STACK_POP_DISCARD(state, size) \
    -do { \
    -    TRACE(("discard data from %" PY_FORMAT_SIZE_T "d " \
    -           "(%" PY_FORMAT_SIZE_T "d)\n", \
    -           state->data_stack_base-size, size)); \
    -    state->data_stack_base -= size; \
    -} while(0)
    -
    -#define DATA_PUSH(x) \
    -    DATA_STACK_PUSH(state, (x), sizeof(*(x)))
    -#define DATA_POP(x) \
    -    DATA_STACK_POP(state, (x), sizeof(*(x)), 1)
    -#define DATA_POP_DISCARD(x) \
    -    DATA_STACK_POP_DISCARD(state, sizeof(*(x)))
    -#define DATA_ALLOC(t,p) \
    -    DATA_STACK_ALLOC(state, t, p)
    -#define DATA_LOOKUP_AT(t,p,pos) \
    -    DATA_STACK_LOOKUP_AT(state,t,p,pos)
    -
    -#define MARK_PUSH(lastmark) \
    -    do if (lastmark > 0) { \
    -        i = lastmark; /* ctx->lastmark may change if reallocated */ \
    -        DATA_STACK_PUSH(state, state->mark, (i+1)*sizeof(void*)); \
    -    } while (0)
    -#define MARK_POP(lastmark) \
    -    do if (lastmark > 0) { \
    -        DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 1); \
    -    } while (0)
    -#define MARK_POP_KEEP(lastmark) \
    -    do if (lastmark > 0) { \
    -        DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 0); \
    -    } while (0)
    -#define MARK_POP_DISCARD(lastmark) \
    -    do if (lastmark > 0) { \
    -        DATA_STACK_POP_DISCARD(state, (lastmark+1)*sizeof(void*)); \
    -    } while (0)
    -
    -#define JUMP_NONE            0
    -#define JUMP_MAX_UNTIL_1     1
    -#define JUMP_MAX_UNTIL_2     2
    -#define JUMP_MAX_UNTIL_3     3
    -#define JUMP_MIN_UNTIL_1     4
    -#define JUMP_MIN_UNTIL_2     5
    -#define JUMP_MIN_UNTIL_3     6
    -#define JUMP_REPEAT          7
    -#define JUMP_REPEAT_ONE_1    8
    -#define JUMP_REPEAT_ONE_2    9
    -#define JUMP_MIN_REPEAT_ONE  10
    -#define JUMP_BRANCH          11
    -#define JUMP_ASSERT          12
    -#define JUMP_ASSERT_NOT      13
    -
    -#define DO_JUMP(jumpvalue, jumplabel, nextpattern) \
    -    DATA_ALLOC(SRE(match_context), nextctx); \
    -    nextctx->last_ctx_pos = ctx_pos; \
    -    nextctx->jump = jumpvalue; \
    -    nextctx->pattern = nextpattern; \
    -    ctx_pos = alloc_pos; \
    -    ctx = nextctx; \
    -    goto entrance; \
    -    jumplabel: \
    -    while (0) /* gcc doesn't like labels at end of scopes */ \
    -
    -typedef struct {
    -    Py_ssize_t last_ctx_pos;
    -    Py_ssize_t jump;
    -    SRE_CHAR* ptr;
    -    SRE_CODE* pattern;
    -    Py_ssize_t count;
    -    Py_ssize_t lastmark;
    -    Py_ssize_t lastindex;
    -    union {
    -        SRE_CODE chr;
    -        SRE_REPEAT* rep;
    -    } u;
    -} SRE(match_context);
    -
    -/* check if string matches the given pattern.  returns <0 for
    -   error, 0 for failure, and 1 for success */
    -LOCAL(Py_ssize_t)
    -SRE(match)(SRE_STATE* state, SRE_CODE* pattern)
    -{
    -    SRE_CHAR* end = (SRE_CHAR *)state->end;
    -    Py_ssize_t alloc_pos, ctx_pos = -1;
    -    Py_ssize_t i, ret = 0;
    -    Py_ssize_t jump;
    -    unsigned int sigcount=0;
    -
    -    SRE(match_context)* ctx;
    -    SRE(match_context)* nextctx;
    -
    -    TRACE(("|%p|%p|ENTER\n", pattern, state->ptr));
    -
    -    DATA_ALLOC(SRE(match_context), ctx);
    -    ctx->last_ctx_pos = -1;
    -    ctx->jump = JUMP_NONE;
    -    ctx->pattern = pattern;
    -    ctx_pos = alloc_pos;
    -
    -entrance:
    -
    -    ctx->ptr = (SRE_CHAR *)state->ptr;
    -
    -    if (ctx->pattern[0] == SRE_OP_INFO) {
    -        /* optimization info block */
    -        /*  <1=skip> <2=flags> <3=min> ... */
    -        if (ctx->pattern[3] && (Py_uintptr_t)(end - ctx->ptr) < ctx->pattern[3]) {
    -            TRACE(("reject (got %" PY_FORMAT_SIZE_T "d chars, "
    -                   "need %" PY_FORMAT_SIZE_T "d)\n",
    -                   end - ctx->ptr, (Py_ssize_t) ctx->pattern[3]));
    -            RETURN_FAILURE;
    -        }
    -        ctx->pattern += ctx->pattern[1] + 1;
    -    }
    -
    -    for (;;) {
    -        ++sigcount;
    -        if ((0 == (sigcount & 0xfff)) && PyErr_CheckSignals())
    -            RETURN_ERROR(SRE_ERROR_INTERRUPTED);
    -
    -        switch (*ctx->pattern++) {
    -
    -        case SRE_OP_MARK:
    -            /* set mark */
    -            /*   */
    -            TRACE(("|%p|%p|MARK %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[0]));
    -            i = ctx->pattern[0];
    -            if (i & 1)
    -                state->lastindex = i/2 + 1;
    -            if (i > state->lastmark) {
    -                /* state->lastmark is the highest valid index in the
    -                   state->mark array.  If it is increased by more than 1,
    -                   the intervening marks must be set to NULL to signal
    -                   that these marks have not been encountered. */
    -                Py_ssize_t j = state->lastmark + 1;
    -                while (j < i)
    -                    state->mark[j++] = NULL;
    -                state->lastmark = i;
    -            }
    -            state->mark[i] = ctx->ptr;
    -            ctx->pattern++;
    -            break;
    -
    -        case SRE_OP_LITERAL:
    -            /* match literal string */
    -            /*   */
    -            TRACE(("|%p|%p|LITERAL %d\n", ctx->pattern,
    -                   ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] != ctx->pattern[0])
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_NOT_LITERAL:
    -            /* match anything that is not literal character */
    -            /*   */
    -            TRACE(("|%p|%p|NOT_LITERAL %d\n", ctx->pattern,
    -                   ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] == ctx->pattern[0])
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_SUCCESS:
    -            /* end of pattern */
    -            TRACE(("|%p|%p|SUCCESS\n", ctx->pattern, ctx->ptr));
    -            state->ptr = ctx->ptr;
    -            RETURN_SUCCESS;
    -
    -        case SRE_OP_AT:
    -            /* match at given position */
    -            /*   */
    -            TRACE(("|%p|%p|AT %d\n", ctx->pattern, ctx->ptr, *ctx->pattern));
    -            if (!SRE(at)(state, ctx->ptr, *ctx->pattern))
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            break;
    -
    -        case SRE_OP_CATEGORY:
    -            /* match at given category */
    -            /*   */
    -            TRACE(("|%p|%p|CATEGORY %d\n", ctx->pattern,
    -                   ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end || !sre_category(ctx->pattern[0], ctx->ptr[0]))
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_ANY:
    -            /* match anything (except a newline) */
    -            /*  */
    -            TRACE(("|%p|%p|ANY\n", ctx->pattern, ctx->ptr));
    -            if (ctx->ptr >= end || SRE_IS_LINEBREAK(ctx->ptr[0]))
    -                RETURN_FAILURE;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_ANY_ALL:
    -            /* match anything */
    -            /*  */
    -            TRACE(("|%p|%p|ANY_ALL\n", ctx->pattern, ctx->ptr));
    -            if (ctx->ptr >= end)
    -                RETURN_FAILURE;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_IN:
    -            /* match set member (or non_member) */
    -            /*    */
    -            TRACE(("|%p|%p|IN\n", ctx->pattern, ctx->ptr));
    -            if (ctx->ptr >= end || !SRE(charset)(ctx->pattern + 1, *ctx->ptr))
    -                RETURN_FAILURE;
    -            ctx->pattern += ctx->pattern[0];
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_LITERAL_IGNORE:
    -            TRACE(("|%p|%p|LITERAL_IGNORE %d\n",
    -                   ctx->pattern, ctx->ptr, ctx->pattern[0]));
    -            if (ctx->ptr >= end ||
    -                state->lower(*ctx->ptr) != state->lower(*ctx->pattern))
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_NOT_LITERAL_IGNORE:
    -            TRACE(("|%p|%p|NOT_LITERAL_IGNORE %d\n",
    -                   ctx->pattern, ctx->ptr, *ctx->pattern));
    -            if (ctx->ptr >= end ||
    -                state->lower(*ctx->ptr) == state->lower(*ctx->pattern))
    -                RETURN_FAILURE;
    -            ctx->pattern++;
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_IN_IGNORE:
    -            TRACE(("|%p|%p|IN_IGNORE\n", ctx->pattern, ctx->ptr));
    -            if (ctx->ptr >= end
    -                || !SRE(charset)(ctx->pattern+1,
    -                                 (SRE_CODE)state->lower(*ctx->ptr)))
    -                RETURN_FAILURE;
    -            ctx->pattern += ctx->pattern[0];
    -            ctx->ptr++;
    -            break;
    -
    -        case SRE_OP_JUMP:
    -        case SRE_OP_INFO:
    -            /* jump forward */
    -            /*   */
    -            TRACE(("|%p|%p|JUMP %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[0]));
    -            ctx->pattern += ctx->pattern[0];
    -            break;
    -
    -        case SRE_OP_BRANCH:
    -            /* alternation */
    -            /*  <0=skip> code  ...  */
    -            TRACE(("|%p|%p|BRANCH\n", ctx->pattern, ctx->ptr));
    -            LASTMARK_SAVE();
    -            ctx->u.rep = state->repeat;
    -            if (ctx->u.rep)
    -                MARK_PUSH(ctx->lastmark);
    -            for (; ctx->pattern[0]; ctx->pattern += ctx->pattern[0]) {
    -                if (ctx->pattern[1] == SRE_OP_LITERAL &&
    -                    (ctx->ptr >= end ||
    -                     (SRE_CODE) *ctx->ptr != ctx->pattern[2]))
    -                    continue;
    -                if (ctx->pattern[1] == SRE_OP_IN &&
    -                    (ctx->ptr >= end ||
    -                     !SRE(charset)(ctx->pattern + 3, (SRE_CODE) *ctx->ptr)))
    -                    continue;
    -                state->ptr = ctx->ptr;
    -                DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1);
    -                if (ret) {
    -                    if (ctx->u.rep)
    -                        MARK_POP_DISCARD(ctx->lastmark);
    -                    RETURN_ON_ERROR(ret);
    -                    RETURN_SUCCESS;
    -                }
    -                if (ctx->u.rep)
    -                    MARK_POP_KEEP(ctx->lastmark);
    -                LASTMARK_RESTORE();
    -            }
    -            if (ctx->u.rep)
    -                MARK_POP_DISCARD(ctx->lastmark);
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_REPEAT_ONE:
    -            /* match repeated sequence (maximizing regexp) */
    -
    -            /* this operator only works if the repeated item is
    -               exactly one character wide, and we're not already
    -               collecting backtracking points.  for other cases,
    -               use the MAX_REPEAT operator */
    -
    -            /*   <1=min> <2=max> item  tail */
    -
    -            TRACE(("|%p|%p|REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
    -                   ctx->pattern[1], ctx->pattern[2]));
    -
    -            if ((Py_ssize_t) ctx->pattern[1] > end - ctx->ptr)
    -                RETURN_FAILURE; /* cannot match */
    -
    -            state->ptr = ctx->ptr;
    -
    -            ret = SRE(count)(state, ctx->pattern+3, ctx->pattern[2]);
    -            RETURN_ON_ERROR(ret);
    -            DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
    -            ctx->count = ret;
    -            ctx->ptr += ctx->count;
    -
    -            /* when we arrive here, count contains the number of
    -               matches, and ctx->ptr points to the tail of the target
    -               string.  check if the rest of the pattern matches,
    -               and backtrack if not. */
    -
    -            if (ctx->count < (Py_ssize_t) ctx->pattern[1])
    -                RETURN_FAILURE;
    -
    -            if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) {
    -                /* tail is empty.  we're finished */
    -                state->ptr = ctx->ptr;
    -                RETURN_SUCCESS;
    -            }
    -
    -            LASTMARK_SAVE();
    -
    -            if (ctx->pattern[ctx->pattern[0]] == SRE_OP_LITERAL) {
    -                /* tail starts with a literal. skip positions where
    -                   the rest of the pattern cannot possibly match */
    -                ctx->u.chr = ctx->pattern[ctx->pattern[0]+1];
    -                for (;;) {
    -                    while (ctx->count >= (Py_ssize_t) ctx->pattern[1] &&
    -                           (ctx->ptr >= end || *ctx->ptr != ctx->u.chr)) {
    -                        ctx->ptr--;
    -                        ctx->count--;
    -                    }
    -                    if (ctx->count < (Py_ssize_t) ctx->pattern[1])
    -                        break;
    -                    state->ptr = ctx->ptr;
    -                    DO_JUMP(JUMP_REPEAT_ONE_1, jump_repeat_one_1,
    -                            ctx->pattern+ctx->pattern[0]);
    -                    if (ret) {
    -                        RETURN_ON_ERROR(ret);
    -                        RETURN_SUCCESS;
    -                    }
    -
    -                    LASTMARK_RESTORE();
    -
    -                    ctx->ptr--;
    -                    ctx->count--;
    -                }
    -
    -            } else {
    -                /* general case */
    -                while (ctx->count >= (Py_ssize_t) ctx->pattern[1]) {
    -                    state->ptr = ctx->ptr;
    -                    DO_JUMP(JUMP_REPEAT_ONE_2, jump_repeat_one_2,
    -                            ctx->pattern+ctx->pattern[0]);
    -                    if (ret) {
    -                        RETURN_ON_ERROR(ret);
    -                        RETURN_SUCCESS;
    -                    }
    -                    ctx->ptr--;
    -                    ctx->count--;
    -                    LASTMARK_RESTORE();
    -                }
    -            }
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_MIN_REPEAT_ONE:
    -            /* match repeated sequence (minimizing regexp) */
    -
    -            /* this operator only works if the repeated item is
    -               exactly one character wide, and we're not already
    -               collecting backtracking points.  for other cases,
    -               use the MIN_REPEAT operator */
    -
    -            /*   <1=min> <2=max> item  tail */
    -
    -            TRACE(("|%p|%p|MIN_REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
    -                   ctx->pattern[1], ctx->pattern[2]));
    -
    -            if ((Py_ssize_t) ctx->pattern[1] > end - ctx->ptr)
    -                RETURN_FAILURE; /* cannot match */
    -
    -            state->ptr = ctx->ptr;
    -
    -            if (ctx->pattern[1] == 0)
    -                ctx->count = 0;
    -            else {
    -                /* count using pattern min as the maximum */
    -                ret = SRE(count)(state, ctx->pattern+3, ctx->pattern[1]);
    -                RETURN_ON_ERROR(ret);
    -                DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
    -                if (ret < (Py_ssize_t) ctx->pattern[1])
    -                    /* didn't match minimum number of times */
    -                    RETURN_FAILURE;
    -                /* advance past minimum matches of repeat */
    -                ctx->count = ret;
    -                ctx->ptr += ctx->count;
    -            }
    -
    -            if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) {
    -                /* tail is empty.  we're finished */
    -                state->ptr = ctx->ptr;
    -                RETURN_SUCCESS;
    -
    -            } else {
    -                /* general case */
    -                LASTMARK_SAVE();
    -                while ((Py_ssize_t)ctx->pattern[2] == SRE_MAXREPEAT
    -                       || ctx->count <= (Py_ssize_t)ctx->pattern[2]) {
    -                    state->ptr = ctx->ptr;
    -                    DO_JUMP(JUMP_MIN_REPEAT_ONE,jump_min_repeat_one,
    -                            ctx->pattern+ctx->pattern[0]);
    -                    if (ret) {
    -                        RETURN_ON_ERROR(ret);
    -                        RETURN_SUCCESS;
    -                    }
    -                    state->ptr = ctx->ptr;
    -                    ret = SRE(count)(state, ctx->pattern+3, 1);
    -                    RETURN_ON_ERROR(ret);
    -                    DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
    -                    if (ret == 0)
    -                        break;
    -                    assert(ret == 1);
    -                    ctx->ptr++;
    -                    ctx->count++;
    -                    LASTMARK_RESTORE();
    -                }
    -            }
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_REPEAT:
    -            /* create repeat context.  all the hard work is done
    -               by the UNTIL operator (MAX_UNTIL, MIN_UNTIL) */
    -            /*   <1=min> <2=max> item  tail */
    -            TRACE(("|%p|%p|REPEAT %d %d\n", ctx->pattern, ctx->ptr,
    -                   ctx->pattern[1], ctx->pattern[2]));
    -
    -            /* install new repeat context */
    -            ctx->u.rep = (SRE_REPEAT*) PyObject_MALLOC(sizeof(*ctx->u.rep));
    -            if (!ctx->u.rep) {
    -                PyErr_NoMemory();
    -                RETURN_FAILURE;
    -            }
    -            ctx->u.rep->count = -1;
    -            ctx->u.rep->pattern = ctx->pattern;
    -            ctx->u.rep->prev = state->repeat;
    -            ctx->u.rep->last_ptr = NULL;
    -            state->repeat = ctx->u.rep;
    -
    -            state->ptr = ctx->ptr;
    -            DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]);
    -            state->repeat = ctx->u.rep->prev;
    -            PyObject_FREE(ctx->u.rep);
    -
    -            if (ret) {
    -                RETURN_ON_ERROR(ret);
    -                RETURN_SUCCESS;
    -            }
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_MAX_UNTIL:
    -            /* maximizing repeat */
    -            /*   <1=min> <2=max> item  tail */
    -
    -            /* FIXME: we probably need to deal with zero-width
    -               matches in here... */
    -
    -            ctx->u.rep = state->repeat;
    -            if (!ctx->u.rep)
    -                RETURN_ERROR(SRE_ERROR_STATE);
    -
    -            state->ptr = ctx->ptr;
    -
    -            ctx->count = ctx->u.rep->count+1;
    -
    -            TRACE(("|%p|%p|MAX_UNTIL %" PY_FORMAT_SIZE_T "d\n", ctx->pattern,
    -                   ctx->ptr, ctx->count));
    -
    -            if (ctx->count < (Py_ssize_t) ctx->u.rep->pattern[1]) {
    -                /* not enough matches */
    -                ctx->u.rep->count = ctx->count;
    -                DO_JUMP(JUMP_MAX_UNTIL_1, jump_max_until_1,
    -                        ctx->u.rep->pattern+3);
    -                if (ret) {
    -                    RETURN_ON_ERROR(ret);
    -                    RETURN_SUCCESS;
    -                }
    -                ctx->u.rep->count = ctx->count-1;
    -                state->ptr = ctx->ptr;
    -                RETURN_FAILURE;
    -            }
    -
    -            if ((ctx->count < (Py_ssize_t) ctx->u.rep->pattern[2] ||
    -                ctx->u.rep->pattern[2] == SRE_MAXREPEAT) &&
    -                state->ptr != ctx->u.rep->last_ptr) {
    -                /* we may have enough matches, but if we can
    -                   match another item, do so */
    -                ctx->u.rep->count = ctx->count;
    -                LASTMARK_SAVE();
    -                MARK_PUSH(ctx->lastmark);
    -                /* zero-width match protection */
    -                DATA_PUSH(&ctx->u.rep->last_ptr);
    -                ctx->u.rep->last_ptr = state->ptr;
    -                DO_JUMP(JUMP_MAX_UNTIL_2, jump_max_until_2,
    -                        ctx->u.rep->pattern+3);
    -                DATA_POP(&ctx->u.rep->last_ptr);
    -                if (ret) {
    -                    MARK_POP_DISCARD(ctx->lastmark);
    -                    RETURN_ON_ERROR(ret);
    -                    RETURN_SUCCESS;
    -                }
    -                MARK_POP(ctx->lastmark);
    -                LASTMARK_RESTORE();
    -                ctx->u.rep->count = ctx->count-1;
    -                state->ptr = ctx->ptr;
    -            }
    -
    -            /* cannot match more repeated items here.  make sure the
    -               tail matches */
    -            state->repeat = ctx->u.rep->prev;
    -            DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern);
    -            RETURN_ON_SUCCESS(ret);
    -            state->repeat = ctx->u.rep;
    -            state->ptr = ctx->ptr;
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_MIN_UNTIL:
    -            /* minimizing repeat */
    -            /*   <1=min> <2=max> item  tail */
    -
    -            ctx->u.rep = state->repeat;
    -            if (!ctx->u.rep)
    -                RETURN_ERROR(SRE_ERROR_STATE);
    -
    -            state->ptr = ctx->ptr;
    -
    -            ctx->count = ctx->u.rep->count+1;
    -
    -            TRACE(("|%p|%p|MIN_UNTIL %" PY_FORMAT_SIZE_T "d %p\n", ctx->pattern,
    -                   ctx->ptr, ctx->count, ctx->u.rep->pattern));
    -
    -            if (ctx->count < (Py_ssize_t) ctx->u.rep->pattern[1]) {
    -                /* not enough matches */
    -                ctx->u.rep->count = ctx->count;
    -                DO_JUMP(JUMP_MIN_UNTIL_1, jump_min_until_1,
    -                        ctx->u.rep->pattern+3);
    -                if (ret) {
    -                    RETURN_ON_ERROR(ret);
    -                    RETURN_SUCCESS;
    -                }
    -                ctx->u.rep->count = ctx->count-1;
    -                state->ptr = ctx->ptr;
    -                RETURN_FAILURE;
    -            }
    -
    -            LASTMARK_SAVE();
    -
    -            /* see if the tail matches */
    -            state->repeat = ctx->u.rep->prev;
    -            DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern);
    -            if (ret) {
    -                RETURN_ON_ERROR(ret);
    -                RETURN_SUCCESS;
    -            }
    -
    -            state->repeat = ctx->u.rep;
    -            state->ptr = ctx->ptr;
    -
    -            LASTMARK_RESTORE();
    -
    -            if ((ctx->count >= (Py_ssize_t) ctx->u.rep->pattern[2]
    -                && ctx->u.rep->pattern[2] != SRE_MAXREPEAT) ||
    -                state->ptr == ctx->u.rep->last_ptr)
    -                RETURN_FAILURE;
    -
    -            ctx->u.rep->count = ctx->count;
    -            /* zero-width match protection */
    -            DATA_PUSH(&ctx->u.rep->last_ptr);
    -            ctx->u.rep->last_ptr = state->ptr;
    -            DO_JUMP(JUMP_MIN_UNTIL_3,jump_min_until_3,
    -                    ctx->u.rep->pattern+3);
    -            DATA_POP(&ctx->u.rep->last_ptr);
    -            if (ret) {
    -                RETURN_ON_ERROR(ret);
    -                RETURN_SUCCESS;
    -            }
    -            ctx->u.rep->count = ctx->count-1;
    -            state->ptr = ctx->ptr;
    -            RETURN_FAILURE;
    -
    -        case SRE_OP_GROUPREF:
    -            /* match backreference */
    -            TRACE(("|%p|%p|GROUPREF %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[0]));
    -            i = ctx->pattern[0];
    -            {
    -                Py_ssize_t groupref = i+i;
    -                if (groupref >= state->lastmark) {
    -                    RETURN_FAILURE;
    -                } else {
    -                    SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
    -                    SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
    -                    if (!p || !e || e < p)
    -                        RETURN_FAILURE;
    -                    while (p < e) {
    -                        if (ctx->ptr >= end || *ctx->ptr != *p)
    -                            RETURN_FAILURE;
    -                        p++;
    -                        ctx->ptr++;
    -                    }
    -                }
    -            }
    -            ctx->pattern++;
    -            break;
    -
    -        case SRE_OP_GROUPREF_IGNORE:
    -            /* match backreference */
    -            TRACE(("|%p|%p|GROUPREF_IGNORE %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[0]));
    -            i = ctx->pattern[0];
    -            {
    -                Py_ssize_t groupref = i+i;
    -                if (groupref >= state->lastmark) {
    -                    RETURN_FAILURE;
    -                } else {
    -                    SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
    -                    SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
    -                    if (!p || !e || e < p)
    -                        RETURN_FAILURE;
    -                    while (p < e) {
    -                        if (ctx->ptr >= end ||
    -                            state->lower(*ctx->ptr) != state->lower(*p))
    -                            RETURN_FAILURE;
    -                        p++;
    -                        ctx->ptr++;
    -                    }
    -                }
    -            }
    -            ctx->pattern++;
    -            break;
    -
    -        case SRE_OP_GROUPREF_EXISTS:
    -            TRACE(("|%p|%p|GROUPREF_EXISTS %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[0]));
    -            /*    codeyes  codeno ... */
    -            i = ctx->pattern[0];
    -            {
    -                Py_ssize_t groupref = i+i;
    -                if (groupref >= state->lastmark) {
    -                    ctx->pattern += ctx->pattern[1];
    -                    break;
    -                } else {
    -                    SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
    -                    SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
    -                    if (!p || !e || e < p) {
    -                        ctx->pattern += ctx->pattern[1];
    -                        break;
    -                    }
    -                }
    -            }
    -            ctx->pattern += 2;
    -            break;
    -
    -        case SRE_OP_ASSERT:
    -            /* assert subpattern */
    -            /*     */
    -            TRACE(("|%p|%p|ASSERT %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[1]));
    -            state->ptr = ctx->ptr - ctx->pattern[1];
    -            if (state->ptr < state->beginning)
    -                RETURN_FAILURE;
    -            DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2);
    -            RETURN_ON_FAILURE(ret);
    -            ctx->pattern += ctx->pattern[0];
    -            break;
    -
    -        case SRE_OP_ASSERT_NOT:
    -            /* assert not subpattern */
    -            /*     */
    -            TRACE(("|%p|%p|ASSERT_NOT %d\n", ctx->pattern,
    -                   ctx->ptr, ctx->pattern[1]));
    -            state->ptr = ctx->ptr - ctx->pattern[1];
    -            if (state->ptr >= state->beginning) {
    -                DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2);
    -                if (ret) {
    -                    RETURN_ON_ERROR(ret);
    -                    RETURN_FAILURE;
    -                }
    -            }
    -            ctx->pattern += ctx->pattern[0];
    -            break;
    -
    -        case SRE_OP_FAILURE:
    -            /* immediate failure */
    -            TRACE(("|%p|%p|FAILURE\n", ctx->pattern, ctx->ptr));
    -            RETURN_FAILURE;
    -
    -        default:
    -            TRACE(("|%p|%p|UNKNOWN %d\n", ctx->pattern, ctx->ptr,
    -                   ctx->pattern[-1]));
    -            RETURN_ERROR(SRE_ERROR_ILLEGAL);
    -        }
    -    }
    -
    -exit:
    -    ctx_pos = ctx->last_ctx_pos;
    -    jump = ctx->jump;
    -    DATA_POP_DISCARD(ctx);
    -    if (ctx_pos == -1)
    -        return ret;
    -    DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
    -
    -    switch (jump) {
    -        case JUMP_MAX_UNTIL_2:
    -            TRACE(("|%p|%p|JUMP_MAX_UNTIL_2\n", ctx->pattern, ctx->ptr));
    -            goto jump_max_until_2;
    -        case JUMP_MAX_UNTIL_3:
    -            TRACE(("|%p|%p|JUMP_MAX_UNTIL_3\n", ctx->pattern, ctx->ptr));
    -            goto jump_max_until_3;
    -        case JUMP_MIN_UNTIL_2:
    -            TRACE(("|%p|%p|JUMP_MIN_UNTIL_2\n", ctx->pattern, ctx->ptr));
    -            goto jump_min_until_2;
    -        case JUMP_MIN_UNTIL_3:
    -            TRACE(("|%p|%p|JUMP_MIN_UNTIL_3\n", ctx->pattern, ctx->ptr));
    -            goto jump_min_until_3;
    -        case JUMP_BRANCH:
    -            TRACE(("|%p|%p|JUMP_BRANCH\n", ctx->pattern, ctx->ptr));
    -            goto jump_branch;
    -        case JUMP_MAX_UNTIL_1:
    -            TRACE(("|%p|%p|JUMP_MAX_UNTIL_1\n", ctx->pattern, ctx->ptr));
    -            goto jump_max_until_1;
    -        case JUMP_MIN_UNTIL_1:
    -            TRACE(("|%p|%p|JUMP_MIN_UNTIL_1\n", ctx->pattern, ctx->ptr));
    -            goto jump_min_until_1;
    -        case JUMP_REPEAT:
    -            TRACE(("|%p|%p|JUMP_REPEAT\n", ctx->pattern, ctx->ptr));
    -            goto jump_repeat;
    -        case JUMP_REPEAT_ONE_1:
    -            TRACE(("|%p|%p|JUMP_REPEAT_ONE_1\n", ctx->pattern, ctx->ptr));
    -            goto jump_repeat_one_1;
    -        case JUMP_REPEAT_ONE_2:
    -            TRACE(("|%p|%p|JUMP_REPEAT_ONE_2\n", ctx->pattern, ctx->ptr));
    -            goto jump_repeat_one_2;
    -        case JUMP_MIN_REPEAT_ONE:
    -            TRACE(("|%p|%p|JUMP_MIN_REPEAT_ONE\n", ctx->pattern, ctx->ptr));
    -            goto jump_min_repeat_one;
    -        case JUMP_ASSERT:
    -            TRACE(("|%p|%p|JUMP_ASSERT\n", ctx->pattern, ctx->ptr));
    -            goto jump_assert;
    -        case JUMP_ASSERT_NOT:
    -            TRACE(("|%p|%p|JUMP_ASSERT_NOT\n", ctx->pattern, ctx->ptr));
    -            goto jump_assert_not;
    -        case JUMP_NONE:
    -            TRACE(("|%p|%p|RETURN %" PY_FORMAT_SIZE_T "d\n", ctx->pattern,
    -                   ctx->ptr, ret));
    -            break;
    -    }
    -
    -    return ret; /* should never get here */
    -}
    -
    -LOCAL(Py_ssize_t)
    -SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
    -{
    -    SRE_CHAR* ptr = (SRE_CHAR *)state->start;
    -    SRE_CHAR* end = (SRE_CHAR *)state->end;
    -    Py_ssize_t status = 0;
    -    Py_ssize_t prefix_len = 0;
    -    Py_ssize_t prefix_skip = 0;
    -    SRE_CODE* prefix = NULL;
    -    SRE_CODE* charset = NULL;
    -    SRE_CODE* overlap = NULL;
    -    int flags = 0;
    -
    -    if (pattern[0] == SRE_OP_INFO) {
    -        /* optimization info block */
    -        /*  <1=skip> <2=flags> <3=min> <4=max> <5=prefix info>  */
    -
    -        flags = pattern[2];
    -
    -        if (pattern[3] > 1) {
    -            /* adjust end point (but make sure we leave at least one
    -               character in there, so literal search will work) */
    -            end -= pattern[3] - 1;
    -            if (end <= ptr)
    -                end = ptr;
    -        }
    -
    -        if (flags & SRE_INFO_PREFIX) {
    -            /* pattern starts with a known prefix */
    -            /*     */
    -            prefix_len = pattern[5];
    -            prefix_skip = pattern[6];
    -            prefix = pattern + 7;
    -            overlap = prefix + prefix_len - 1;
    -        } else if (flags & SRE_INFO_CHARSET)
    -            /* pattern starts with a character from a known set */
    -            /*  */
    -            charset = pattern + 5;
    -
    -        pattern += 1 + pattern[1];
    -    }
    -
    -    TRACE(("prefix = %p %" PY_FORMAT_SIZE_T "d %" PY_FORMAT_SIZE_T "d\n",
    -           prefix, prefix_len, prefix_skip));
    -    TRACE(("charset = %p\n", charset));
    -
    -#if defined(USE_FAST_SEARCH)
    -    if (prefix_len > 1) {
    -        /* pattern starts with a known prefix.  use the overlap
    -           table to skip forward as fast as we possibly can */
    -        Py_ssize_t i = 0;
    -
    -        end = (SRE_CHAR *)state->end;
    -        if (prefix_len > end - ptr)
    -            return 0;
    -#if SIZEOF_SRE_CHAR < 4
    -        for (i = 0; i < prefix_len; i++)
    -            if ((SRE_CODE)(SRE_CHAR) prefix[i] != prefix[i])
    -                return 0; /* literal can't match: doesn't fit in char width */
    -#endif
    -        while (ptr < end) {
    -            SRE_CHAR c = (SRE_CHAR) prefix[0];
    -            while (*ptr++ != c) {
    -                if (ptr >= end)
    -                    return 0;
    -            }
    -            if (ptr >= end)
    -                return 0;
    -
    -            i = 1;
    -            do {
    -                if (*ptr == (SRE_CHAR) prefix[i]) {
    -                    if (++i != prefix_len) {
    -                        if (++ptr >= end)
    -                            return 0;
    -                        continue;
    -                    }
    -                    /* found a potential match */
    -                    TRACE(("|%p|%p|SEARCH SCAN\n", pattern, ptr));
    -                    state->start = ptr - (prefix_len - 1);
    -                    state->ptr = ptr - (prefix_len - prefix_skip - 1);
    -                    if (flags & SRE_INFO_LITERAL)
    -                        return 1; /* we got all of it */
    -                    status = SRE(match)(state, pattern + 2*prefix_skip);
    -                    if (status != 0)
    -                        return status;
    -                    /* close but no cigar -- try again */
    -                    if (++ptr >= end)
    -                        return 0;
    -                }
    -                i = overlap[i];
    -            } while (i != 0);
    -        }
    -        return 0;
    -    }
    -#endif
    -
    -    if (pattern[0] == SRE_OP_LITERAL) {
    -        /* pattern starts with a literal character.  this is used
    -           for short prefixes, and if fast search is disabled */
    -        SRE_CHAR c = (SRE_CHAR) pattern[1];
    -#if SIZEOF_SRE_CHAR < 4
    -        if ((SRE_CODE) c != pattern[1])
    -            return 0; /* literal can't match: doesn't fit in char width */
    -#endif
    -        end = (SRE_CHAR *)state->end;
    -        while (ptr < end) {
    -            while (*ptr != c) {
    -                if (++ptr >= end)
    -                    return 0;
    -            }
    -            TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr));
    -            state->start = ptr;
    -            state->ptr = ++ptr;
    -            if (flags & SRE_INFO_LITERAL)
    -                return 1; /* we got all of it */
    -            status = SRE(match)(state, pattern + 2);
    -            if (status != 0)
    -                break;
    -        }
    -    } else if (charset) {
    -        /* pattern starts with a character from a known set */
    -        end = (SRE_CHAR *)state->end;
    -        for (;;) {
    -            while (ptr < end && !SRE(charset)(charset, *ptr))
    -                ptr++;
    -            if (ptr >= end)
    -                return 0;
    -            TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
    -            state->start = ptr;
    -            state->ptr = ptr;
    -            status = SRE(match)(state, pattern);
    -            if (status != 0)
    -                break;
    -            ptr++;
    -        }
    -    } else
    -        /* general case */
    -        while (ptr <= end) {
    -            TRACE(("|%p|%p|SEARCH\n", pattern, ptr));
    -            state->start = state->ptr = ptr++;
    -            status = SRE(match)(state, pattern);
    -            if (status != 0)
    -                break;
    -        }
    -
    -    return status;
    -}
    -
    -#endif /* SRE_RECURSIVE */
    -
    -#ifndef SRE_RECURSIVE
    +#include "sre_lib.h"
     
     /* -------------------------------------------------------------------- */
     /* factories and destructors */
    @@ -3915,14 +2588,5 @@
         return m;
     }
     
    -#endif /* !defined(SRE_RECURSIVE) */
    -
    -#ifdef SRE_RECURSIVE
    -# undef SRE_RECURSIVE
    -# undef SRE_CHAR
    -# undef SIZEOF_SRE_CHAR
    -# undef SRE
    -#endif /* SRE_RECURSIVE */
    -
     /* vim:ts=4:sw=4:et
     */
    diff --git a/Modules/_sre.c b/Modules/sre_lib.h
    copy from Modules/_sre.c
    copy to Modules/sre_lib.h
    --- a/Modules/_sre.c
    +++ b/Modules/sre_lib.h
    @@ -3,281 +3,14 @@
      *
      * regular expression matching engine
      *
    - * partial history:
    - * 1999-10-24 fl  created (based on existing template matcher code)
    - * 2000-03-06 fl  first alpha, sort of
    - * 2000-08-01 fl  fixes for 1.6b1
    - * 2000-08-07 fl  use PyOS_CheckStack() if available
    - * 2000-09-20 fl  added expand method
    - * 2001-03-20 fl  lots of fixes for 2.1b2
    - * 2001-04-15 fl  export copyright as Python attribute, not global
    - * 2001-04-28 fl  added __copy__ methods (work in progress)
    - * 2001-05-14 fl  fixes for 1.5.2 compatibility
    - * 2001-07-01 fl  added BIGCHARSET support (from Martin von Loewis)
    - * 2001-10-18 fl  fixed group reset issue (from Matthew Mueller)
    - * 2001-10-20 fl  added split primitive; reenable unicode for 1.6/2.0/2.1
    - * 2001-10-21 fl  added sub/subn primitive
    - * 2001-10-24 fl  added finditer primitive (for 2.2 only)
    - * 2001-12-07 fl  fixed memory leak in sub/subn (Guido van Rossum)
    - * 2002-11-09 fl  fixed empty sub/subn return type
    - * 2003-04-18 mvl fully support 4-byte codes
    - * 2003-10-17 gn  implemented non recursive scheme
    - *
      * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.
      *
    - * This version of the SRE library can be redistributed under CNRI's
    - * Python 1.6 license.  For any other use, please contact Secret Labs
    - * AB (info at pythonware.com).
    - *
    - * Portions of this engine have been developed in cooperation with
    - * CNRI.  Hewlett-Packard provided funding for 1.6 integration and
    - * other compatibility work.
    + * See the _sre.c file for information on usage and redistribution.
      */
     
    -#ifndef SRE_RECURSIVE
    -
    -static char copyright[] =
    -    " SRE 2.2.2 Copyright (c) 1997-2002 by Secret Labs AB ";
    -
    -#define PY_SSIZE_T_CLEAN
    -
    -#include "Python.h"
    -#include "structmember.h" /* offsetof */
    -
    -#include "sre.h"
    -
    -#define SRE_CODE_BITS (8 * sizeof(SRE_CODE))
    -
    -#include 
    -
    -/* name of this module, minus the leading underscore */
    -#if !defined(SRE_MODULE)
    -#define SRE_MODULE "sre"
    -#endif
    -
    -#define SRE_PY_MODULE "re"
    -
    -/* defining this one enables tracing */
    -#undef VERBOSE
    -
    -/* -------------------------------------------------------------------- */
    -/* optional features */
    -
    -/* enables fast searching */
    -#define USE_FAST_SEARCH
    -
    -/* enables copy/deepcopy handling (work in progress) */
    -#undef USE_BUILTIN_COPY
    -
    -/* -------------------------------------------------------------------- */
    -
    -#if defined(_MSC_VER)
    -#pragma optimize("agtw", on) /* doesn't seem to make much difference... */
    -#pragma warning(disable: 4710) /* who cares if functions are not inlined ;-) */
    -/* fastest possible local call under MSVC */
    -#define LOCAL(type) static __inline type __fastcall
    -#elif defined(USE_INLINE)
    -#define LOCAL(type) static inline type
    -#else
    -#define LOCAL(type) static type
    -#endif
    -
    -/* error codes */
    -#define SRE_ERROR_ILLEGAL -1 /* illegal opcode */
    -#define SRE_ERROR_STATE -2 /* illegal state */
    -#define SRE_ERROR_RECURSION_LIMIT -3 /* runaway recursion */
    -#define SRE_ERROR_MEMORY -9 /* out of memory */
    -#define SRE_ERROR_INTERRUPTED -10 /* signal handler raised exception */
    -
    -#if defined(VERBOSE)
    -#define TRACE(v) printf v
    -#else
    -#define TRACE(v)
    -#endif
    -
    -/* -------------------------------------------------------------------- */
    -/* search engine state */
    -
    -/* default character predicates (run sre_chars.py to regenerate tables) */
    -
    -#define SRE_DIGIT_MASK 1
    -#define SRE_SPACE_MASK 2
    -#define SRE_LINEBREAK_MASK 4
    -#define SRE_ALNUM_MASK 8
    -#define SRE_WORD_MASK 16
    -
    -/* FIXME: this assumes ASCII.  create tables in init_sre() instead */
    -
    -static char sre_char_info[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 2,
    -2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
    -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25,
    -25, 25, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
    -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0,
    -0, 0, 16, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
    -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0 };
    -
    -static char sre_char_lower[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    -10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
    -27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
    -44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
    -61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
    -108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
    -122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
    -106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
    -120, 121, 122, 123, 124, 125, 126, 127 };
    -
    -#define SRE_IS_DIGIT(ch)\
    -    ((ch) < 128 ? (sre_char_info[(ch)] & SRE_DIGIT_MASK) : 0)
    -#define SRE_IS_SPACE(ch)\
    -    ((ch) < 128 ? (sre_char_info[(ch)] & SRE_SPACE_MASK) : 0)
    -#define SRE_IS_LINEBREAK(ch)\
    -    ((ch) < 128 ? (sre_char_info[(ch)] & SRE_LINEBREAK_MASK) : 0)
    -#define SRE_IS_ALNUM(ch)\
    -    ((ch) < 128 ? (sre_char_info[(ch)] & SRE_ALNUM_MASK) : 0)
    -#define SRE_IS_WORD(ch)\
    -    ((ch) < 128 ? (sre_char_info[(ch)] & SRE_WORD_MASK) : 0)
    -
    -static unsigned int sre_lower(unsigned int ch)
    -{
    -    return ((ch) < 128 ? (unsigned int)sre_char_lower[ch] : ch);
    -}
    -
    -/* locale-specific character predicates */
    -/* !(c & ~N) == (c < N+1) for any unsigned c, this avoids
    - * warnings when c's type supports only numbers < N+1 */
    -#define SRE_LOC_IS_ALNUM(ch) (!((ch) & ~255) ? isalnum((ch)) : 0)
    -#define SRE_LOC_IS_WORD(ch) (SRE_LOC_IS_ALNUM((ch)) || (ch) == '_')
    -
    -static unsigned int sre_lower_locale(unsigned int ch)
    -{
    -    return ((ch) < 256 ? (unsigned int)tolower((ch)) : ch);
    -}
    -
    -/* unicode-specific character predicates */
    -
    -#define SRE_UNI_IS_DIGIT(ch) Py_UNICODE_ISDECIMAL(ch)
    -#define SRE_UNI_IS_SPACE(ch) Py_UNICODE_ISSPACE(ch)
    -#define SRE_UNI_IS_LINEBREAK(ch) Py_UNICODE_ISLINEBREAK(ch)
    -#define SRE_UNI_IS_ALNUM(ch) Py_UNICODE_ISALNUM(ch)
    -#define SRE_UNI_IS_WORD(ch) (SRE_UNI_IS_ALNUM(ch) || (ch) == '_')
    -
    -static unsigned int sre_lower_unicode(unsigned int ch)
    -{
    -    return (unsigned int) Py_UNICODE_TOLOWER(ch);
    -}
    -
    -LOCAL(int)
    -sre_category(SRE_CODE category, unsigned int ch)
    -{
    -    switch (category) {
    -
    -    case SRE_CATEGORY_DIGIT:
    -        return SRE_IS_DIGIT(ch);
    -    case SRE_CATEGORY_NOT_DIGIT:
    -        return !SRE_IS_DIGIT(ch);
    -    case SRE_CATEGORY_SPACE:
    -        return SRE_IS_SPACE(ch);
    -    case SRE_CATEGORY_NOT_SPACE:
    -        return !SRE_IS_SPACE(ch);
    -    case SRE_CATEGORY_WORD:
    -        return SRE_IS_WORD(ch);
    -    case SRE_CATEGORY_NOT_WORD:
    -        return !SRE_IS_WORD(ch);
    -    case SRE_CATEGORY_LINEBREAK:
    -        return SRE_IS_LINEBREAK(ch);
    -    case SRE_CATEGORY_NOT_LINEBREAK:
    -        return !SRE_IS_LINEBREAK(ch);
    -
    -    case SRE_CATEGORY_LOC_WORD:
    -        return SRE_LOC_IS_WORD(ch);
    -    case SRE_CATEGORY_LOC_NOT_WORD:
    -        return !SRE_LOC_IS_WORD(ch);
    -
    -    case SRE_CATEGORY_UNI_DIGIT:
    -        return SRE_UNI_IS_DIGIT(ch);
    -    case SRE_CATEGORY_UNI_NOT_DIGIT:
    -        return !SRE_UNI_IS_DIGIT(ch);
    -    case SRE_CATEGORY_UNI_SPACE:
    -        return SRE_UNI_IS_SPACE(ch);
    -    case SRE_CATEGORY_UNI_NOT_SPACE:
    -        return !SRE_UNI_IS_SPACE(ch);
    -    case SRE_CATEGORY_UNI_WORD:
    -        return SRE_UNI_IS_WORD(ch);
    -    case SRE_CATEGORY_UNI_NOT_WORD:
    -        return !SRE_UNI_IS_WORD(ch);
    -    case SRE_CATEGORY_UNI_LINEBREAK:
    -        return SRE_UNI_IS_LINEBREAK(ch);
    -    case SRE_CATEGORY_UNI_NOT_LINEBREAK:
    -        return !SRE_UNI_IS_LINEBREAK(ch);
    -    }
    -    return 0;
    -}
    -
    -/* helpers */
    -
    -static void
    -data_stack_dealloc(SRE_STATE* state)
    -{
    -    if (state->data_stack) {
    -        PyMem_FREE(state->data_stack);
    -        state->data_stack = NULL;
    -    }
    -    state->data_stack_size = state->data_stack_base = 0;
    -}
    -
    -static int
    -data_stack_grow(SRE_STATE* state, Py_ssize_t size)
    -{
    -    Py_ssize_t minsize, cursize;
    -    minsize = state->data_stack_base+size;
    -    cursize = state->data_stack_size;
    -    if (cursize < minsize) {
    -        void* stack;
    -        cursize = minsize+minsize/4+1024;
    -        TRACE(("allocate/grow stack %" PY_FORMAT_SIZE_T "d\n", cursize));
    -        stack = PyMem_REALLOC(state->data_stack, cursize);
    -        if (!stack) {
    -            data_stack_dealloc(state);
    -            return SRE_ERROR_MEMORY;
    -        }
    -        state->data_stack = (char *)stack;
    -        state->data_stack_size = cursize;
    -    }
    -    return 0;
    -}
    -
    -/* generate 8-bit version */
    -
    -#define SRE_CHAR Py_UCS1
    -#define SIZEOF_SRE_CHAR 1
    -#define SRE(F) sre_ucs1_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    -
    -/* generate 16-bit unicode version */
    -
    -#define SRE_CHAR Py_UCS2
    -#define SIZEOF_SRE_CHAR 2
    -#define SRE(F) sre_ucs2_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    -
    -/* generate 32-bit unicode version */
    -
    -#define SRE_CHAR Py_UCS4
    -#define SIZEOF_SRE_CHAR 4
    -#define SRE(F) sre_ucs4_##F
    -#define SRE_RECURSIVE
    -#include "_sre.c"
    -
    -#endif /* SRE_RECURSIVE */
    -
    -#ifdef SRE_RECURSIVE
    -/* -------------------------------------------------------------------- */
     /* String matching engine */
     
    -/* the following section is compiled three times, with different character
    -   settings */
    +/* This file is included three times, with different character settings */
     
     LOCAL(int)
     SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
    @@ -1588,2341 +1321,9 @@
         return status;
     }
     
    -#endif /* SRE_RECURSIVE */
    -
    -#ifndef SRE_RECURSIVE
    -
    -/* -------------------------------------------------------------------- */
    -/* factories and destructors */
    -
    -/* see sre.h for object declarations */
    -static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, int);
    -static PyObject*pattern_scanner(PatternObject*, PyObject*, PyObject* kw);
    -
    -static PyObject *
    -sre_codesize(PyObject* self, PyObject *unused)
    -{
    -    return PyLong_FromSize_t(sizeof(SRE_CODE));
    -}
    -
    -static PyObject *
    -sre_getlower(PyObject* self, PyObject* args)
    -{
    -    int character, flags;
    -    if (!PyArg_ParseTuple(args, "ii", &character, &flags))
    -        return NULL;
    -    if (flags & SRE_FLAG_LOCALE)
    -        return Py_BuildValue("i", sre_lower_locale(character));
    -    if (flags & SRE_FLAG_UNICODE)
    -        return Py_BuildValue("i", sre_lower_unicode(character));
    -    return Py_BuildValue("i", sre_lower(character));
    -}
    -
    -LOCAL(void)
    -state_reset(SRE_STATE* state)
    -{
    -    /* FIXME: dynamic! */
    -    /*memset(state->mark, 0, sizeof(*state->mark) * SRE_MARK_SIZE);*/
    -
    -    state->lastmark = -1;
    -    state->lastindex = -1;
    -
    -    state->repeat = NULL;
    -
    -    data_stack_dealloc(state);
    -}
    -
    -static void*
    -getstring(PyObject* string, Py_ssize_t* p_length,
    -          int* p_isbytes, int* p_charsize,
    -          Py_buffer *view)
    -{
    -    /* given a python object, return a data pointer, a length (in
    -       characters), and a character size.  return NULL if the object
    -       is not a string (or not compatible) */
    -
    -    /* Unicode objects do not support the buffer API. So, get the data
    -       directly instead. */
    -    if (PyUnicode_Check(string)) {
    -        if (PyUnicode_READY(string) == -1)
    -            return NULL;
    -        *p_length = PyUnicode_GET_LENGTH(string);
    -        *p_charsize = PyUnicode_KIND(string);
    -        *p_isbytes = 0;
    -        return PyUnicode_DATA(string);
    -    }
    -
    -    /* get pointer to byte string buffer */
    -    if (PyObject_GetBuffer(string, view, PyBUF_SIMPLE) != 0) {
    -        PyErr_SetString(PyExc_TypeError, "expected string or buffer");
    -        return NULL;
    -    }
    -
    -    *p_length = view->len;
    -    *p_charsize = 1;
    -    *p_isbytes = 1;
    -
    -    if (view->buf == NULL) {
    -        PyErr_SetString(PyExc_ValueError, "Buffer is NULL");
    -        PyBuffer_Release(view);
    -        view->buf = NULL;
    -        return NULL;
    -    }
    -    return view->buf;
    -}
    -
    -LOCAL(PyObject*)
    -state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
    -           Py_ssize_t start, Py_ssize_t end)
    -{
    -    /* prepare state object */
    -
    -    Py_ssize_t length;
    -    int isbytes, charsize;
    -    void* ptr;
    -
    -    memset(state, 0, sizeof(SRE_STATE));
    -
    -    state->lastmark = -1;
    -    state->lastindex = -1;
    -
    -    state->buffer.buf = NULL;
    -    ptr = getstring(string, &length, &isbytes, &charsize, &state->buffer);
    -    if (!ptr)
    -        goto err;
    -
    -    if (isbytes && pattern->isbytes == 0) {
    -        PyErr_SetString(PyExc_TypeError,
    -                        "can't use a string pattern on a bytes-like object");
    -        goto err;
    -    }
    -    if (!isbytes && pattern->isbytes > 0) {
    -        PyErr_SetString(PyExc_TypeError,
    -                        "can't use a bytes pattern on a string-like object");
    -        goto err;
    -    }
    -
    -    /* adjust boundaries */
    -    if (start < 0)
    -        start = 0;
    -    else if (start > length)
    -        start = length;
    -
    -    if (end < 0)
    -        end = 0;
    -    else if (end > length)
    -        end = length;
    -
    -    state->isbytes = isbytes;
    -    state->charsize = charsize;
    -
    -    state->beginning = ptr;
    -
    -    state->start = (void*) ((char*) ptr + start * state->charsize);
    -    state->end = (void*) ((char*) ptr + end * state->charsize);
    -
    -    Py_INCREF(string);
    -    state->string = string;
    -    state->pos = start;
    -    state->endpos = end;
    -
    -    if (pattern->flags & SRE_FLAG_LOCALE)
    -        state->lower = sre_lower_locale;
    -    else if (pattern->flags & SRE_FLAG_UNICODE)
    -        state->lower = sre_lower_unicode;
    -    else
    -        state->lower = sre_lower;
    -
    -    return string;
    -  err:
    -    if (state->buffer.buf)
    -        PyBuffer_Release(&state->buffer);
    -    return NULL;
    -}
    -
    -LOCAL(void)
    -state_fini(SRE_STATE* state)
    -{
    -    if (state->buffer.buf)
    -        PyBuffer_Release(&state->buffer);
    -    Py_XDECREF(state->string);
    -    data_stack_dealloc(state);
    -}
    -
    -/* calculate offset from start of string */
    -#define STATE_OFFSET(state, member)\
    -    (((char*)(member) - (char*)(state)->beginning) / (state)->charsize)
    -
    -LOCAL(PyObject*)
    -getslice(int isbytes, const void *ptr,
    -         PyObject* string, Py_ssize_t start, Py_ssize_t end)
    -{
    -    if (isbytes) {
    -        if (PyBytes_CheckExact(string) &&
    -            start == 0 && end == PyBytes_GET_SIZE(string)) {
    -            Py_INCREF(string);
    -            return string;
    -        }
    -        return PyBytes_FromStringAndSize(
    -                (const char *)ptr + start, end - start);
    -    }
    -    else {
    -        return PyUnicode_Substring(string, start, end);
    -    }
    -}
    -
    -LOCAL(PyObject*)
    -state_getslice(SRE_STATE* state, Py_ssize_t index, PyObject* string, int empty)
    -{
    -    Py_ssize_t i, j;
    -
    -    index = (index - 1) * 2;
    -
    -    if (string == Py_None || index >= state->lastmark || !state->mark[index] || !state->mark[index+1]) {
    -        if (empty)
    -            /* want empty string */
    -            i = j = 0;
    -        else {
    -            Py_INCREF(Py_None);
    -            return Py_None;
    -        }
    -    } else {
    -        i = STATE_OFFSET(state, state->mark[index]);
    -        j = STATE_OFFSET(state, state->mark[index+1]);
    -    }
    -
    -    return getslice(state->isbytes, state->beginning, string, i, j);
    -}
    -
    -static void
    -pattern_error(int status)
    -{
    -    switch (status) {
    -    case SRE_ERROR_RECURSION_LIMIT:
    -        PyErr_SetString(
    -            PyExc_RuntimeError,
    -            "maximum recursion limit exceeded"
    -            );
    -        break;
    -    case SRE_ERROR_MEMORY:
    -        PyErr_NoMemory();
    -        break;
    -    case SRE_ERROR_INTERRUPTED:
    -    /* An exception has already been raised, so let it fly */
    -        break;
    -    default:
    -        /* other error codes indicate compiler/engine bugs */
    -        PyErr_SetString(
    -            PyExc_RuntimeError,
    -            "internal error in regular expression engine"
    -            );
    -    }
    -}
    -
    -static void
    -pattern_dealloc(PatternObject* self)
    -{
    -    if (self->weakreflist != NULL)
    -        PyObject_ClearWeakRefs((PyObject *) self);
    -    Py_XDECREF(self->pattern);
    -    Py_XDECREF(self->groupindex);
    -    Py_XDECREF(self->indexgroup);
    -    PyObject_DEL(self);
    -}
    -
    -LOCAL(Py_ssize_t)
    -sre_match(SRE_STATE* state, SRE_CODE* pattern)
    -{
    -    if (state->charsize == 1)
    -        return sre_ucs1_match(state, pattern);
    -    if (state->charsize == 2)
    -        return sre_ucs2_match(state, pattern);
    -    assert(state->charsize == 4);
    -    return sre_ucs4_match(state, pattern);
    -}
    -
    -LOCAL(Py_ssize_t)
    -sre_search(SRE_STATE* state, SRE_CODE* pattern)
    -{
    -    if (state->charsize == 1)
    -        return sre_ucs1_search(state, pattern);
    -    if (state->charsize == 2)
    -        return sre_ucs2_search(state, pattern);
    -    assert(state->charsize == 4);
    -    return sre_ucs4_search(state, pattern);
    -}
    -
    -static PyObject*
    -pattern_match(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    SRE_STATE state;
    -    Py_ssize_t status;
    -
    -    PyObject* string;
    -    Py_ssize_t start = 0;
    -    Py_ssize_t end = PY_SSIZE_T_MAX;
    -    static char* kwlist[] = { "pattern", "pos", "endpos", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:match", kwlist,
    -                                     &string, &start, &end))
    -        return NULL;
    -
    -    string = state_init(&state, self, string, start, end);
    -    if (!string)
    -        return NULL;
    -
    -    state.ptr = state.start;
    -
    -    TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
    -
    -    status = sre_match(&state, PatternObject_GetCode(self));
    -
    -    TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
    -    if (PyErr_Occurred())
    -        return NULL;
    -
    -    state_fini(&state);
    -
    -    return pattern_new_match(self, &state, status);
    -}
    -
    -static PyObject*
    -pattern_search(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    SRE_STATE state;
    -    int status;
    -
    -    PyObject* string;
    -    Py_ssize_t start = 0;
    -    Py_ssize_t end = PY_SSIZE_T_MAX;
    -    static char* kwlist[] = { "pattern", "pos", "endpos", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:search", kwlist,
    -                                     &string, &start, &end))
    -        return NULL;
    -
    -    string = state_init(&state, self, string, start, end);
    -    if (!string)
    -        return NULL;
    -
    -    TRACE(("|%p|%p|SEARCH\n", PatternObject_GetCode(self), state.ptr));
    -
    -    status = sre_search(&state, PatternObject_GetCode(self));
    -
    -    TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
    -
    -    state_fini(&state);
    -
    -    if (PyErr_Occurred())
    -        return NULL;
    -
    -    return pattern_new_match(self, &state, status);
    -}
    -
    -static PyObject*
    -call(char* module, char* function, PyObject* args)
    -{
    -    PyObject* name;
    -    PyObject* mod;
    -    PyObject* func;
    -    PyObject* result;
    -
    -    if (!args)
    -        return NULL;
    -    name = PyUnicode_FromString(module);
    -    if (!name)
    -        return NULL;
    -    mod = PyImport_Import(name);
    -    Py_DECREF(name);
    -    if (!mod)
    -        return NULL;
    -    func = PyObject_GetAttrString(mod, function);
    -    Py_DECREF(mod);
    -    if (!func)
    -        return NULL;
    -    result = PyObject_CallObject(func, args);
    -    Py_DECREF(func);
    -    Py_DECREF(args);
    -    return result;
    -}
    -
    -#ifdef USE_BUILTIN_COPY
    -static int
    -deepcopy(PyObject** object, PyObject* memo)
    -{
    -    PyObject* copy;
    -
    -    copy = call(
    -        "copy", "deepcopy",
    -        PyTuple_Pack(2, *object, memo)
    -        );
    -    if (!copy)
    -        return 0;
    -
    -    Py_DECREF(*object);
    -    *object = copy;
    -
    -    return 1; /* success */
    -}
    -#endif
    -
    -static PyObject*
    -pattern_findall(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    SRE_STATE state;
    -    PyObject* list;
    -    Py_ssize_t status;
    -    Py_ssize_t i, b, e;
    -
    -    PyObject* string;
    -    Py_ssize_t start = 0;
    -    Py_ssize_t end = PY_SSIZE_T_MAX;
    -    static char* kwlist[] = { "source", "pos", "endpos", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:findall", kwlist,
    -                                     &string, &start, &end))
    -        return NULL;
    -
    -    string = state_init(&state, self, string, start, end);
    -    if (!string)
    -        return NULL;
    -
    -    list = PyList_New(0);
    -    if (!list) {
    -        state_fini(&state);
    -        return NULL;
    -    }
    -
    -    while (state.start <= state.end) {
    -
    -        PyObject* item;
    -
    -        state_reset(&state);
    -
    -        state.ptr = state.start;
    -
    -        status = sre_search(&state, PatternObject_GetCode(self));
    -        if (PyErr_Occurred())
    -            goto error;
    -
    -        if (status <= 0) {
    -            if (status == 0)
    -                break;
    -            pattern_error(status);
    -            goto error;
    -        }
    -
    -        /* don't bother to build a match object */
    -        switch (self->groups) {
    -        case 0:
    -            b = STATE_OFFSET(&state, state.start);
    -            e = STATE_OFFSET(&state, state.ptr);
    -            item = getslice(state.isbytes, state.beginning,
    -                            string, b, e);
    -            if (!item)
    -                goto error;
    -            break;
    -        case 1:
    -            item = state_getslice(&state, 1, string, 1);
    -            if (!item)
    -                goto error;
    -            break;
    -        default:
    -            item = PyTuple_New(self->groups);
    -            if (!item)
    -                goto error;
    -            for (i = 0; i < self->groups; i++) {
    -                PyObject* o = state_getslice(&state, i+1, string, 1);
    -                if (!o) {
    -                    Py_DECREF(item);
    -                    goto error;
    -                }
    -                PyTuple_SET_ITEM(item, i, o);
    -            }
    -            break;
    -        }
    -
    -        status = PyList_Append(list, item);
    -        Py_DECREF(item);
    -        if (status < 0)
    -            goto error;
    -
    -        if (state.ptr == state.start)
    -            state.start = (void*) ((char*) state.ptr + state.charsize);
    -        else
    -            state.start = state.ptr;
    -
    -    }
    -
    -    state_fini(&state);
    -    return list;
    -
    -error:
    -    Py_DECREF(list);
    -    state_fini(&state);
    -    return NULL;
    -
    -}
    -
    -static PyObject*
    -pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kw)
    -{
    -    PyObject* scanner;
    -    PyObject* search;
    -    PyObject* iterator;
    -
    -    scanner = pattern_scanner(pattern, args, kw);
    -    if (!scanner)
    -        return NULL;
    -
    -    search = PyObject_GetAttrString(scanner, "search");
    -    Py_DECREF(scanner);
    -    if (!search)
    -        return NULL;
    -
    -    iterator = PyCallIter_New(search, Py_None);
    -    Py_DECREF(search);
    -
    -    return iterator;
    -}
    -
    -static PyObject*
    -pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    SRE_STATE state;
    -    PyObject* list;
    -    PyObject* item;
    -    Py_ssize_t status;
    -    Py_ssize_t n;
    -    Py_ssize_t i;
    -    void* last;
    -
    -    PyObject* string;
    -    Py_ssize_t maxsplit = 0;
    -    static char* kwlist[] = { "source", "maxsplit", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|n:split", kwlist,
    -                                     &string, &maxsplit))
    -        return NULL;
    -
    -    string = state_init(&state, self, string, 0, PY_SSIZE_T_MAX);
    -    if (!string)
    -        return NULL;
    -
    -    list = PyList_New(0);
    -    if (!list) {
    -        state_fini(&state);
    -        return NULL;
    -    }
    -
    -    n = 0;
    -    last = state.start;
    -
    -    while (!maxsplit || n < maxsplit) {
    -
    -        state_reset(&state);
    -
    -        state.ptr = state.start;
    -
    -        status = sre_search(&state, PatternObject_GetCode(self));
    -        if (PyErr_Occurred())
    -            goto error;
    -
    -        if (status <= 0) {
    -            if (status == 0)
    -                break;
    -            pattern_error(status);
    -            goto error;
    -        }
    -
    -        if (state.start == state.ptr) {
    -            if (last == state.end)
    -                break;
    -            /* skip one character */
    -            state.start = (void*) ((char*) state.ptr + state.charsize);
    -            continue;
    -        }
    -
    -        /* get segment before this match */
    -        item = getslice(state.isbytes, state.beginning,
    -            string, STATE_OFFSET(&state, last),
    -            STATE_OFFSET(&state, state.start)
    -            );
    -        if (!item)
    -            goto error;
    -        status = PyList_Append(list, item);
    -        Py_DECREF(item);
    -        if (status < 0)
    -            goto error;
    -
    -        /* add groups (if any) */
    -        for (i = 0; i < self->groups; i++) {
    -            item = state_getslice(&state, i+1, string, 0);
    -            if (!item)
    -                goto error;
    -            status = PyList_Append(list, item);
    -            Py_DECREF(item);
    -            if (status < 0)
    -                goto error;
    -        }
    -
    -        n = n + 1;
    -
    -        last = state.start = state.ptr;
    -
    -    }
    -
    -    /* get segment following last match (even if empty) */
    -    item = getslice(state.isbytes, state.beginning,
    -        string, STATE_OFFSET(&state, last), state.endpos
    -        );
    -    if (!item)
    -        goto error;
    -    status = PyList_Append(list, item);
    -    Py_DECREF(item);
    -    if (status < 0)
    -        goto error;
    -
    -    state_fini(&state);
    -    return list;
    -
    -error:
    -    Py_DECREF(list);
    -    state_fini(&state);
    -    return NULL;
    -
    -}
    -
    -static PyObject*
    -pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
    -             Py_ssize_t count, Py_ssize_t subn)
    -{
    -    SRE_STATE state;
    -    PyObject* list;
    -    PyObject* joiner;
    -    PyObject* item;
    -    PyObject* filter;
    -    PyObject* args;
    -    PyObject* match;
    -    void* ptr;
    -    Py_ssize_t status;
    -    Py_ssize_t n;
    -    Py_ssize_t i, b, e;
    -    int isbytes, charsize;
    -    int filter_is_callable;
    -    Py_buffer view;
    -
    -    if (PyCallable_Check(ptemplate)) {
    -        /* sub/subn takes either a function or a template */
    -        filter = ptemplate;
    -        Py_INCREF(filter);
    -        filter_is_callable = 1;
    -    } else {
    -        /* if not callable, check if it's a literal string */
    -        int literal;
    -        view.buf = NULL;
    -        ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view);
    -        b = charsize;
    -        if (ptr) {
    -            if (charsize == 1)
    -                literal = memchr(ptr, '\\', n) == NULL;
    -            else
    -                literal = PyUnicode_FindChar(ptemplate, '\\', 0, n, 1) == -1;
    -        } else {
    -            PyErr_Clear();
    -            literal = 0;
    -        }
    -        if (view.buf)
    -            PyBuffer_Release(&view);
    -        if (literal) {
    -            filter = ptemplate;
    -            Py_INCREF(filter);
    -            filter_is_callable = 0;
    -        } else {
    -            /* not a literal; hand it over to the template compiler */
    -            filter = call(
    -                SRE_PY_MODULE, "_subx",
    -                PyTuple_Pack(2, self, ptemplate)
    -                );
    -            if (!filter)
    -                return NULL;
    -            filter_is_callable = PyCallable_Check(filter);
    -        }
    -    }
    -
    -    string = state_init(&state, self, string, 0, PY_SSIZE_T_MAX);
    -    if (!string) {
    -        Py_DECREF(filter);
    -        return NULL;
    -    }
    -
    -    list = PyList_New(0);
    -    if (!list) {
    -        Py_DECREF(filter);
    -        state_fini(&state);
    -        return NULL;
    -    }
    -
    -    n = i = 0;
    -
    -    while (!count || n < count) {
    -
    -        state_reset(&state);
    -
    -        state.ptr = state.start;
    -
    -        status = sre_search(&state, PatternObject_GetCode(self));
    -        if (PyErr_Occurred())
    -            goto error;
    -
    -        if (status <= 0) {
    -            if (status == 0)
    -                break;
    -            pattern_error(status);
    -            goto error;
    -        }
    -
    -        b = STATE_OFFSET(&state, state.start);
    -        e = STATE_OFFSET(&state, state.ptr);
    -
    -        if (i < b) {
    -            /* get segment before this match */
    -            item = getslice(state.isbytes, state.beginning,
    -                string, i, b);
    -            if (!item)
    -                goto error;
    -            status = PyList_Append(list, item);
    -            Py_DECREF(item);
    -            if (status < 0)
    -                goto error;
    -
    -        } else if (i == b && i == e && n > 0)
    -            /* ignore empty match on latest position */
    -            goto next;
    -
    -        if (filter_is_callable) {
    -            /* pass match object through filter */
    -            match = pattern_new_match(self, &state, 1);
    -            if (!match)
    -                goto error;
    -            args = PyTuple_Pack(1, match);
    -            if (!args) {
    -                Py_DECREF(match);
    -                goto error;
    -            }
    -            item = PyObject_CallObject(filter, args);
    -            Py_DECREF(args);
    -            Py_DECREF(match);
    -            if (!item)
    -                goto error;
    -        } else {
    -            /* filter is literal string */
    -            item = filter;
    -            Py_INCREF(item);
    -        }
    -
    -        /* add to list */
    -        if (item != Py_None) {
    -            status = PyList_Append(list, item);
    -            Py_DECREF(item);
    -            if (status < 0)
    -                goto error;
    -        }
    -
    -        i = e;
    -        n = n + 1;
    -
    -next:
    -        /* move on */
    -        if (state.ptr == state.start)
    -            state.start = (void*) ((char*) state.ptr + state.charsize);
    -        else
    -            state.start = state.ptr;
    -
    -    }
    -
    -    /* get segment following last match */
    -    if (i < state.endpos) {
    -        item = getslice(state.isbytes, state.beginning,
    -                        string, i, state.endpos);
    -        if (!item)
    -            goto error;
    -        status = PyList_Append(list, item);
    -        Py_DECREF(item);
    -        if (status < 0)
    -            goto error;
    -    }
    -
    -    state_fini(&state);
    -
    -    Py_DECREF(filter);
    -
    -    /* convert list to single string (also removes list) */
    -    joiner = getslice(state.isbytes, state.beginning, string, 0, 0);
    -    if (!joiner) {
    -        Py_DECREF(list);
    -        return NULL;
    -    }
    -    if (PyList_GET_SIZE(list) == 0) {
    -        Py_DECREF(list);
    -        item = joiner;
    -    }
    -    else {
    -        if (state.isbytes)
    -            item = _PyBytes_Join(joiner, list);
    -        else
    -            item = PyUnicode_Join(joiner, list);
    -        Py_DECREF(joiner);
    -        Py_DECREF(list);
    -        if (!item)
    -            return NULL;
    -    }
    -
    -    if (subn)
    -        return Py_BuildValue("Nn", item, n);
    -
    -    return item;
    -
    -error:
    -    Py_DECREF(list);
    -    state_fini(&state);
    -    Py_DECREF(filter);
    -    return NULL;
    -
    -}
    -
    -static PyObject*
    -pattern_sub(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    PyObject* ptemplate;
    -    PyObject* string;
    -    Py_ssize_t count = 0;
    -    static char* kwlist[] = { "repl", "string", "count", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|n:sub", kwlist,
    -                                     &ptemplate, &string, &count))
    -        return NULL;
    -
    -    return pattern_subx(self, ptemplate, string, count, 0);
    -}
    -
    -static PyObject*
    -pattern_subn(PatternObject* self, PyObject* args, PyObject* kw)
    -{
    -    PyObject* ptemplate;
    -    PyObject* string;
    -    Py_ssize_t count = 0;
    -    static char* kwlist[] = { "repl", "string", "count", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|n:subn", kwlist,
    -                                     &ptemplate, &string, &count))
    -        return NULL;
    -
    -    return pattern_subx(self, ptemplate, string, count, 1);
    -}
    -
    -static PyObject*
    -pattern_copy(PatternObject* self, PyObject *unused)
    -{
    -#ifdef USE_BUILTIN_COPY
    -    PatternObject* copy;
    -    int offset;
    -
    -    copy = PyObject_NEW_VAR(PatternObject, &Pattern_Type, self->codesize);
    -    if (!copy)
    -        return NULL;
    -
    -    offset = offsetof(PatternObject, groups);
    -
    -    Py_XINCREF(self->groupindex);
    -    Py_XINCREF(self->indexgroup);
    -    Py_XINCREF(self->pattern);
    -
    -    memcpy((char*) copy + offset, (char*) self + offset,
    -           sizeof(PatternObject) + self->codesize * sizeof(SRE_CODE) - offset);
    -    copy->weakreflist = NULL;
    -
    -    return (PyObject*) copy;
    -#else
    -    PyErr_SetString(PyExc_TypeError, "cannot copy this pattern object");
    -    return NULL;
    -#endif
    -}
    -
    -static PyObject*
    -pattern_deepcopy(PatternObject* self, PyObject* memo)
    -{
    -#ifdef USE_BUILTIN_COPY
    -    PatternObject* copy;
    -
    -    copy = (PatternObject*) pattern_copy(self);
    -    if (!copy)
    -        return NULL;
    -
    -    if (!deepcopy(©->groupindex, memo) ||
    -        !deepcopy(©->indexgroup, memo) ||
    -        !deepcopy(©->pattern, memo)) {
    -        Py_DECREF(copy);
    -        return NULL;
    -    }
    -
    -#else
    -    PyErr_SetString(PyExc_TypeError, "cannot deepcopy this pattern object");
    -    return NULL;
    -#endif
    -}
    -
    -PyDoc_STRVAR(pattern_match_doc,
    -"match(string[, pos[, endpos]]) -> match object or None.\n\
    -    Matches zero or more characters at the beginning of the string");
    -
    -PyDoc_STRVAR(pattern_search_doc,
    -"search(string[, pos[, endpos]]) -> match object or None.\n\
    -    Scan through string looking for a match, and return a corresponding\n\
    -    match object instance. Return None if no position in the string matches.");
    -
    -PyDoc_STRVAR(pattern_split_doc,
    -"split(string[, maxsplit = 0])  -> list.\n\
    -    Split string by the occurrences of pattern.");
    -
    -PyDoc_STRVAR(pattern_findall_doc,
    -"findall(string[, pos[, endpos]]) -> list.\n\
    -   Return a list of all non-overlapping matches of pattern in string.");
    -
    -PyDoc_STRVAR(pattern_finditer_doc,
    -"finditer(string[, pos[, endpos]]) -> iterator.\n\
    -    Return an iterator over all non-overlapping matches for the \n\
    -    RE pattern in string. For each match, the iterator returns a\n\
    -    match object.");
    -
    -PyDoc_STRVAR(pattern_sub_doc,
    -"sub(repl, string[, count = 0]) -> newstring.\n\
    -    Return the string obtained by replacing the leftmost non-overlapping\n\
    -    occurrences of pattern in string by the replacement repl.");
    -
    -PyDoc_STRVAR(pattern_subn_doc,
    -"subn(repl, string[, count = 0]) -> (newstring, number of subs)\n\
    -    Return the tuple (new_string, number_of_subs_made) found by replacing\n\
    -    the leftmost non-overlapping occurrences of pattern with the\n\
    -    replacement repl.");
    -
    -PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects");
    -
    -static PyMethodDef pattern_methods[] = {
    -    {"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS,
    -        pattern_match_doc},
    -    {"search", (PyCFunction) pattern_search, METH_VARARGS|METH_KEYWORDS,
    -        pattern_search_doc},
    -    {"sub", (PyCFunction) pattern_sub, METH_VARARGS|METH_KEYWORDS,
    -        pattern_sub_doc},
    -    {"subn", (PyCFunction) pattern_subn, METH_VARARGS|METH_KEYWORDS,
    -        pattern_subn_doc},
    -    {"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS,
    -        pattern_split_doc},
    -    {"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS,
    -        pattern_findall_doc},
    -    {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS|METH_KEYWORDS,
    -        pattern_finditer_doc},
    -    {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS|METH_KEYWORDS},
    -    {"__copy__", (PyCFunction) pattern_copy, METH_NOARGS},
    -    {"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_O},
    -    {NULL, 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 */
    -    0,                                  /* tp_getattr */
    -    0,                                  /* tp_setattr */
    -    0,                                  /* tp_reserved */
    -    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 */
    -    pattern_doc,                        /* tp_doc */
    -    0,                                  /* tp_traverse */
    -    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 int _validate(PatternObject *self); /* Forward */
    -
    -static PyObject *
    -_compile(PyObject* self_, PyObject* args)
    -{
    -    /* "compile" pattern descriptor to pattern object */
    -
    -    PatternObject* self;
    -    Py_ssize_t i, n;
    -
    -    PyObject* pattern;
    -    int flags = 0;
    -    PyObject* code;
    -    Py_ssize_t groups = 0;
    -    PyObject* groupindex = NULL;
    -    PyObject* indexgroup = NULL;
    -
    -    if (!PyArg_ParseTuple(args, "OiO!|nOO", &pattern, &flags,
    -                          &PyList_Type, &code, &groups,
    -                          &groupindex, &indexgroup))
    -        return NULL;
    -
    -    n = PyList_GET_SIZE(code);
    -    /* coverity[ampersand_in_size] */
    -    self = PyObject_NEW_VAR(PatternObject, &Pattern_Type, n);
    -    if (!self)
    -        return NULL;
    -    self->weakreflist = NULL;
    -    self->pattern = NULL;
    -    self->groupindex = NULL;
    -    self->indexgroup = NULL;
    -
    -    self->codesize = n;
    -
    -    for (i = 0; i < n; i++) {
    -        PyObject *o = PyList_GET_ITEM(code, i);
    -        unsigned long value = PyLong_AsUnsignedLong(o);
    -        self->code[i] = (SRE_CODE) value;
    -        if ((unsigned long) self->code[i] != value) {
    -            PyErr_SetString(PyExc_OverflowError,
    -                            "regular expression code size limit exceeded");
    -            break;
    -        }
    -    }
    -
    -    if (PyErr_Occurred()) {
    -        Py_DECREF(self);
    -        return NULL;
    -    }
    -
    -    if (pattern == Py_None) {
    -        self->isbytes = -1;
    -    }
    -    else {
    -        Py_ssize_t p_length;
    -        int charsize;
    -        Py_buffer view;
    -        view.buf = NULL;
    -        if (!getstring(pattern, &p_length, &self->isbytes,
    -                       &charsize, &view)) {
    -            Py_DECREF(self);
    -            return NULL;
    -        }
    -        if (view.buf)
    -            PyBuffer_Release(&view);
    -    }
    -
    -    Py_INCREF(pattern);
    -    self->pattern = pattern;
    -
    -    self->flags = flags;
    -
    -    self->groups = groups;
    -
    -    Py_XINCREF(groupindex);
    -    self->groupindex = groupindex;
    -
    -    Py_XINCREF(indexgroup);
    -    self->indexgroup = indexgroup;
    -
    -    self->weakreflist = NULL;
    -
    -    if (!_validate(self)) {
    -        Py_DECREF(self);
    -        return NULL;
    -    }
    -
    -    return (PyObject*) self;
    -}
    -
    -/* -------------------------------------------------------------------- */
    -/* Code validation */
    -
    -/* To learn more about this code, have a look at the _compile() function in
    -   Lib/sre_compile.py.  The validation functions below checks the code array
    -   for conformance with the code patterns generated there.
    -
    -   The nice thing about the generated code is that it is position-independent:
    -   all jumps are relative jumps forward.  Also, jumps don't cross each other:
    -   the target of a later jump is always earlier than the target of an earlier
    -   jump.  IOW, this is okay:
    -
    -   J---------J-------T--------T
    -    \         \_____/        /
    -     \______________________/
    -
    -   but this is not:
    -
    -   J---------J-------T--------T
    -    \_________\_____/        /
    -               \____________/
    -
    -   It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4
    -   bytes wide (the latter if Python is compiled for "wide" unicode support).
    -*/
    -
    -/* Defining this one enables tracing of the validator */
    -#undef VVERBOSE
    -
    -/* Trace macro for the validator */
    -#if defined(VVERBOSE)
    -#define VTRACE(v) printf v
    -#else
    -#define VTRACE(v) do {} while(0)  /* do nothing */
    -#endif
    -
    -/* Report failure */
    -#define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return 0; } while (0)
    -
    -/* Extract opcode, argument, or skip count from code array */
    -#define GET_OP                                          \
    -    do {                                                \
    -        VTRACE(("%p: ", code));                         \
    -        if (code >= end) FAIL;                          \
    -        op = *code++;                                   \
    -        VTRACE(("%lu (op)\n", (unsigned long)op));      \
    -    } while (0)
    -#define GET_ARG                                         \
    -    do {                                                \
    -        VTRACE(("%p= ", code));                         \
    -        if (code >= end) FAIL;                          \
    -        arg = *code++;                                  \
    -        VTRACE(("%lu (arg)\n", (unsigned long)arg));    \
    -    } while (0)
    -#define GET_SKIP_ADJ(adj)                               \
    -    do {                                                \
    -        VTRACE(("%p= ", code));                         \
    -        if (code >= end) FAIL;                          \
    -        skip = *code;                                   \
    -        VTRACE(("%lu (skip to %p)\n",                   \
    -               (unsigned long)skip, code+skip));        \
    -        if (skip-adj > (Py_uintptr_t)(end - code))      \
    -            FAIL;                                       \
    -        code++;                                         \
    -    } while (0)
    -#define GET_SKIP GET_SKIP_ADJ(0)
    -
    -static int
    -_validate_charset(SRE_CODE *code, SRE_CODE *end)
    -{
    -    /* Some variables are manipulated by the macros above */
    -    SRE_CODE op;
    -    SRE_CODE arg;
    -    SRE_CODE offset;
    -    int i;
    -
    -    while (code < end) {
    -        GET_OP;
    -        switch (op) {
    -
    -        case SRE_OP_NEGATE:
    -            break;
    -
    -        case SRE_OP_LITERAL:
    -            GET_ARG;
    -            break;
    -
    -        case SRE_OP_RANGE:
    -            GET_ARG;
    -            GET_ARG;
    -            break;
    -
    -        case SRE_OP_CHARSET:
    -            offset = 256/SRE_CODE_BITS; /* 256-bit bitmap */
    -            if (offset > (Py_uintptr_t)(end - code))
    -                FAIL;
    -            code += offset;
    -            break;
    -
    -        case SRE_OP_BIGCHARSET:
    -            GET_ARG; /* Number of blocks */
    -            offset = 256/sizeof(SRE_CODE); /* 256-byte table */
    -            if (offset > (Py_uintptr_t)(end - code))
    -                FAIL;
    -            /* Make sure that each byte points to a valid block */
    -            for (i = 0; i < 256; i++) {
    -                if (((unsigned char *)code)[i] >= arg)
    -                    FAIL;
    -            }
    -            code += offset;
    -            offset = arg * (256/SRE_CODE_BITS); /* 256-bit bitmap times arg */
    -            if (offset > (Py_uintptr_t)(end - code))
    -                FAIL;
    -            code += offset;
    -            break;
    -
    -        case SRE_OP_CATEGORY:
    -            GET_ARG;
    -            switch (arg) {
    -            case SRE_CATEGORY_DIGIT:
    -            case SRE_CATEGORY_NOT_DIGIT:
    -            case SRE_CATEGORY_SPACE:
    -            case SRE_CATEGORY_NOT_SPACE:
    -            case SRE_CATEGORY_WORD:
    -            case SRE_CATEGORY_NOT_WORD:
    -            case SRE_CATEGORY_LINEBREAK:
    -            case SRE_CATEGORY_NOT_LINEBREAK:
    -            case SRE_CATEGORY_LOC_WORD:
    -            case SRE_CATEGORY_LOC_NOT_WORD:
    -            case SRE_CATEGORY_UNI_DIGIT:
    -            case SRE_CATEGORY_UNI_NOT_DIGIT:
    -            case SRE_CATEGORY_UNI_SPACE:
    -            case SRE_CATEGORY_UNI_NOT_SPACE:
    -            case SRE_CATEGORY_UNI_WORD:
    -            case SRE_CATEGORY_UNI_NOT_WORD:
    -            case SRE_CATEGORY_UNI_LINEBREAK:
    -            case SRE_CATEGORY_UNI_NOT_LINEBREAK:
    -                break;
    -            default:
    -                FAIL;
    -            }
    -            break;
    -
    -        default:
    -            FAIL;
    -
    -        }
    -    }
    -
    -    return 1;
    -}
    -
    -static int
    -_validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
    -{
    -    /* Some variables are manipulated by the macros above */
    -    SRE_CODE op;
    -    SRE_CODE arg;
    -    SRE_CODE skip;
    -
    -    VTRACE(("code=%p, end=%p\n", code, end));
    -
    -    if (code > end)
    -        FAIL;
    -
    -    while (code < end) {
    -        GET_OP;
    -        switch (op) {
    -
    -        case SRE_OP_MARK:
    -            /* We don't check whether marks are properly nested; the
    -               sre_match() code is robust even if they don't, and the worst
    -               you can get is nonsensical match results. */
    -            GET_ARG;
    -            if (arg > 2 * (size_t)groups + 1) {
    -                VTRACE(("arg=%d, groups=%d\n", (int)arg, (int)groups));
    -                FAIL;
    -            }
    -            break;
    -
    -        case SRE_OP_LITERAL:
    -        case SRE_OP_NOT_LITERAL:
    -        case SRE_OP_LITERAL_IGNORE:
    -        case SRE_OP_NOT_LITERAL_IGNORE:
    -            GET_ARG;
    -            /* The arg is just a character, nothing to check */
    -            break;
    -
    -        case SRE_OP_SUCCESS:
    -        case SRE_OP_FAILURE:
    -            /* Nothing to check; these normally end the matching process */
    -            break;
    -
    -        case SRE_OP_AT:
    -            GET_ARG;
    -            switch (arg) {
    -            case SRE_AT_BEGINNING:
    -            case SRE_AT_BEGINNING_STRING:
    -            case SRE_AT_BEGINNING_LINE:
    -            case SRE_AT_END:
    -            case SRE_AT_END_LINE:
    -            case SRE_AT_END_STRING:
    -            case SRE_AT_BOUNDARY:
    -            case SRE_AT_NON_BOUNDARY:
    -            case SRE_AT_LOC_BOUNDARY:
    -            case SRE_AT_LOC_NON_BOUNDARY:
    -            case SRE_AT_UNI_BOUNDARY:
    -            case SRE_AT_UNI_NON_BOUNDARY:
    -                break;
    -            default:
    -                FAIL;
    -            }
    -            break;
    -
    -        case SRE_OP_ANY:
    -        case SRE_OP_ANY_ALL:
    -            /* These have no operands */
    -            break;
    -
    -        case SRE_OP_IN:
    -        case SRE_OP_IN_IGNORE:
    -            GET_SKIP;
    -            /* Stop 1 before the end; we check the FAILURE below */
    -            if (!_validate_charset(code, code+skip-2))
    -                FAIL;
    -            if (code[skip-2] != SRE_OP_FAILURE)
    -                FAIL;
    -            code += skip-1;
    -            break;
    -
    -        case SRE_OP_INFO:
    -            {
    -                /* A minimal info field is
    -                    <1=skip> <2=flags> <3=min> <4=max>;
    -                   If SRE_INFO_PREFIX or SRE_INFO_CHARSET is in the flags,
    -                   more follows. */
    -                SRE_CODE flags, i;
    -                SRE_CODE *newcode;
    -                GET_SKIP;
    -                newcode = code+skip-1;
    -                GET_ARG; flags = arg;
    -                GET_ARG;
    -                GET_ARG;
    -                /* Check that only valid flags are present */
    -                if ((flags & ~(SRE_INFO_PREFIX |
    -                               SRE_INFO_LITERAL |
    -                               SRE_INFO_CHARSET)) != 0)
    -                    FAIL;
    -                /* PREFIX and CHARSET are mutually exclusive */
    -                if ((flags & SRE_INFO_PREFIX) &&
    -                    (flags & SRE_INFO_CHARSET))
    -                    FAIL;
    -                /* LITERAL implies PREFIX */
    -                if ((flags & SRE_INFO_LITERAL) &&
    -                    !(flags & SRE_INFO_PREFIX))
    -                    FAIL;
    -                /* Validate the prefix */
    -                if (flags & SRE_INFO_PREFIX) {
    -                    SRE_CODE prefix_len;
    -                    GET_ARG; prefix_len = arg;
    -                    GET_ARG;
    -                    /* Here comes the prefix string */
    -                    if (prefix_len > (Py_uintptr_t)(newcode - code))
    -                        FAIL;
    -                    code += prefix_len;
    -                    /* And here comes the overlap table */
    -                    if (prefix_len > (Py_uintptr_t)(newcode - code))
    -                        FAIL;
    -                    /* Each overlap value should be < prefix_len */
    -                    for (i = 0; i < prefix_len; i++) {
    -                        if (code[i] >= prefix_len)
    -                            FAIL;
    -                    }
    -                    code += prefix_len;
    -                }
    -                /* Validate the charset */
    -                if (flags & SRE_INFO_CHARSET) {
    -                    if (!_validate_charset(code, newcode-1))
    -                        FAIL;
    -                    if (newcode[-1] != SRE_OP_FAILURE)
    -                        FAIL;
    -                    code = newcode;
    -                }
    -                else if (code != newcode) {
    -                  VTRACE(("code=%p, newcode=%p\n", code, newcode));
    -                    FAIL;
    -                }
    -            }
    -            break;
    -
    -        case SRE_OP_BRANCH:
    -            {
    -                SRE_CODE *target = NULL;
    -                for (;;) {
    -                    GET_SKIP;
    -                    if (skip == 0)
    -                        break;
    -                    /* Stop 2 before the end; we check the JUMP below */
    -                    if (!_validate_inner(code, code+skip-3, groups))
    -                        FAIL;
    -                    code += skip-3;
    -                    /* Check that it ends with a JUMP, and that each JUMP
    -                       has the same target */
    -                    GET_OP;
    -                    if (op != SRE_OP_JUMP)
    -                        FAIL;
    -                    GET_SKIP;
    -                    if (target == NULL)
    -                        target = code+skip-1;
    -                    else if (code+skip-1 != target)
    -                        FAIL;
    -                }
    -            }
    -            break;
    -
    -        case SRE_OP_REPEAT_ONE:
    -        case SRE_OP_MIN_REPEAT_ONE:
    -            {
    -                SRE_CODE min, max;
    -                GET_SKIP;
    -                GET_ARG; min = arg;
    -                GET_ARG; max = arg;
    -                if (min > max)
    -                    FAIL;
    -                if (max > SRE_MAXREPEAT)
    -                    FAIL;
    -                if (!_validate_inner(code, code+skip-4, groups))
    -                    FAIL;
    -                code += skip-4;
    -                GET_OP;
    -                if (op != SRE_OP_SUCCESS)
    -                    FAIL;
    -            }
    -            break;
    -
    -        case SRE_OP_REPEAT:
    -            {
    -                SRE_CODE min, max;
    -                GET_SKIP;
    -                GET_ARG; min = arg;
    -                GET_ARG; max = arg;
    -                if (min > max)
    -                    FAIL;
    -                if (max > SRE_MAXREPEAT)
    -                    FAIL;
    -                if (!_validate_inner(code, code+skip-3, groups))
    -                    FAIL;
    -                code += skip-3;
    -                GET_OP;
    -                if (op != SRE_OP_MAX_UNTIL && op != SRE_OP_MIN_UNTIL)
    -                    FAIL;
    -            }
    -            break;
    -
    -        case SRE_OP_GROUPREF:
    -        case SRE_OP_GROUPREF_IGNORE:
    -            GET_ARG;
    -            if (arg >= (size_t)groups)
    -                FAIL;
    -            break;
    -
    -        case SRE_OP_GROUPREF_EXISTS:
    -            /* The regex syntax for this is: '(?(group)then|else)', where
    -               'group' is either an integer group number or a group name,
    -               'then' and 'else' are sub-regexes, and 'else' is optional. */
    -            GET_ARG;
    -            if (arg >= (size_t)groups)
    -                FAIL;
    -            GET_SKIP_ADJ(1);
    -            code--; /* The skip is relative to the first arg! */
    -            /* There are two possibilities here: if there is both a 'then'
    -               part and an 'else' part, the generated code looks like:
    -
    -               GROUPREF_EXISTS
    -               
    -               
    -               ...then part...
    -               JUMP
    -               
    -               ( jumps here)
    -               ...else part...
    -               ( jumps here)
    -
    -               If there is only a 'then' part, it looks like:
    -
    -               GROUPREF_EXISTS
    -               
    -               
    -               ...then part...
    -               ( jumps here)
    -
    -               There is no direct way to decide which it is, and we don't want
    -               to allow arbitrary jumps anywhere in the code; so we just look
    -               for a JUMP opcode preceding our skip target.
    -            */
    -            if (skip >= 3 && skip-3 < (Py_uintptr_t)(end - code) &&
    -                code[skip-3] == SRE_OP_JUMP)
    -            {
    -                VTRACE(("both then and else parts present\n"));
    -                if (!_validate_inner(code+1, code+skip-3, groups))
    -                    FAIL;
    -                code += skip-2; /* Position after JUMP, at  */
    -                GET_SKIP;
    -                if (!_validate_inner(code, code+skip-1, groups))
    -                    FAIL;
    -                code += skip-1;
    -            }
    -            else {
    -                VTRACE(("only a then part present\n"));
    -                if (!_validate_inner(code+1, code+skip-1, groups))
    -                    FAIL;
    -                code += skip-1;
    -            }
    -            break;
    -
    -        case SRE_OP_ASSERT:
    -        case SRE_OP_ASSERT_NOT:
    -            GET_SKIP;
    -            GET_ARG; /* 0 for lookahead, width for lookbehind */
    -            code--; /* Back up over arg to simplify math below */
    -            if (arg & 0x80000000)
    -                FAIL; /* Width too large */
    -            /* Stop 1 before the end; we check the SUCCESS below */
    -            if (!_validate_inner(code+1, code+skip-2, groups))
    -                FAIL;
    -            code += skip-2;
    -            GET_OP;
    -            if (op != SRE_OP_SUCCESS)
    -                FAIL;
    -            break;
    -
    -        default:
    -            FAIL;
    -
    -        }
    -    }
    -
    -    VTRACE(("okay\n"));
    -    return 1;
    -}
    -
    -static int
    -_validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
    -{
    -    if (groups < 0 || groups > 100 || code >= end || end[-1] != SRE_OP_SUCCESS)
    -        FAIL;
    -    if (groups == 0)  /* fix for simplejson */
    -        groups = 100; /* 100 groups should always be safe */
    -    return _validate_inner(code, end-1, groups);
    -}
    -
    -static int
    -_validate(PatternObject *self)
    -{
    -    if (!_validate_outer(self->code, self->code+self->codesize, self->groups))
    -    {
    -        PyErr_SetString(PyExc_RuntimeError, "invalid SRE code");
    -        return 0;
    -    }
    -    else
    -        VTRACE(("Success!\n"));
    -    return 1;
    -}
    -
    -/* -------------------------------------------------------------------- */
    -/* match methods */
    -
    -static void
    -match_dealloc(MatchObject* self)
    -{
    -    Py_XDECREF(self->regs);
    -    Py_XDECREF(self->string);
    -    Py_DECREF(self->pattern);
    -    PyObject_DEL(self);
    -}
    -
    -static PyObject*
    -match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
    -{
    -    Py_ssize_t length;
    -    int isbytes, charsize;
    -    Py_buffer view;
    -    PyObject *result;
    -    void* ptr;
    -
    -    if (index < 0 || index >= self->groups) {
    -        /* raise IndexError if we were given a bad group number */
    -        PyErr_SetString(
    -            PyExc_IndexError,
    -            "no such group"
    -            );
    -        return NULL;
    -    }
    -
    -    index *= 2;
    -
    -    if (self->string == Py_None || self->mark[index] < 0) {
    -        /* return default value if the string or group is undefined */
    -        Py_INCREF(def);
    -        return def;
    -    }
    -
    -    ptr = getstring(self->string, &length, &isbytes, &charsize, &view);
    -    if (ptr == NULL)
    -        return NULL;
    -    result = getslice(isbytes, ptr,
    -                      self->string, self->mark[index], self->mark[index+1]);
    -    if (isbytes && view.buf != NULL)
    -        PyBuffer_Release(&view);
    -    return result;
    -}
    -
    -static Py_ssize_t
    -match_getindex(MatchObject* self, PyObject* index)
    -{
    -    Py_ssize_t i;
    -
    -    if (index == NULL)
    -        /* Default value */
    -        return 0;
    -
    -    if (PyLong_Check(index))
    -        return PyLong_AsSsize_t(index);
    -
    -    i = -1;
    -
    -    if (self->pattern->groupindex) {
    -        index = PyObject_GetItem(self->pattern->groupindex, index);
    -        if (index) {
    -            if (PyLong_Check(index))
    -                i = PyLong_AsSsize_t(index);
    -            Py_DECREF(index);
    -        } else
    -            PyErr_Clear();
    -    }
    -
    -    return i;
    -}
    -
    -static PyObject*
    -match_getslice(MatchObject* self, PyObject* index, PyObject* def)
    -{
    -    return match_getslice_by_index(self, match_getindex(self, index), def);
    -}
    -
    -static PyObject*
    -match_expand(MatchObject* self, PyObject* ptemplate)
    -{
    -    /* delegate to Python code */
    -    return call(
    -        SRE_PY_MODULE, "_expand",
    -        PyTuple_Pack(3, self->pattern, self, ptemplate)
    -        );
    -}
    -
    -static PyObject*
    -match_group(MatchObject* self, PyObject* args)
    -{
    -    PyObject* result;
    -    Py_ssize_t i, size;
    -
    -    size = PyTuple_GET_SIZE(args);
    -
    -    switch (size) {
    -    case 0:
    -        result = match_getslice(self, Py_False, Py_None);
    -        break;
    -    case 1:
    -        result = match_getslice(self, PyTuple_GET_ITEM(args, 0), Py_None);
    -        break;
    -    default:
    -        /* fetch multiple items */
    -        result = PyTuple_New(size);
    -        if (!result)
    -            return NULL;
    -        for (i = 0; i < size; i++) {
    -            PyObject* item = match_getslice(
    -                self, PyTuple_GET_ITEM(args, i), Py_None
    -                );
    -            if (!item) {
    -                Py_DECREF(result);
    -                return NULL;
    -            }
    -            PyTuple_SET_ITEM(result, i, item);
    -        }
    -        break;
    -    }
    -    return result;
    -}
    -
    -static PyObject*
    -match_groups(MatchObject* self, PyObject* args, PyObject* kw)
    -{
    -    PyObject* result;
    -    Py_ssize_t index;
    -
    -    PyObject* def = Py_None;
    -    static char* kwlist[] = { "default", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groups", kwlist, &def))
    -        return NULL;
    -
    -    result = PyTuple_New(self->groups-1);
    -    if (!result)
    -        return NULL;
    -
    -    for (index = 1; index < self->groups; index++) {
    -        PyObject* item;
    -        item = match_getslice_by_index(self, index, def);
    -        if (!item) {
    -            Py_DECREF(result);
    -            return NULL;
    -        }
    -        PyTuple_SET_ITEM(result, index-1, item);
    -    }
    -
    -    return result;
    -}
    -
    -static PyObject*
    -match_groupdict(MatchObject* self, PyObject* args, PyObject* kw)
    -{
    -    PyObject* result;
    -    PyObject* keys;
    -    Py_ssize_t index;
    -
    -    PyObject* def = Py_None;
    -    static char* kwlist[] = { "default", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groupdict", kwlist, &def))
    -        return NULL;
    -
    -    result = PyDict_New();
    -    if (!result || !self->pattern->groupindex)
    -        return result;
    -
    -    keys = PyMapping_Keys(self->pattern->groupindex);
    -    if (!keys)
    -        goto failed;
    -
    -    for (index = 0; index < PyList_GET_SIZE(keys); index++) {
    -        int status;
    -        PyObject* key;
    -        PyObject* value;
    -        key = PyList_GET_ITEM(keys, index);
    -        if (!key)
    -            goto failed;
    -        value = match_getslice(self, key, def);
    -        if (!value) {
    -            Py_DECREF(key);
    -            goto failed;
    -        }
    -        status = PyDict_SetItem(result, key, value);
    -        Py_DECREF(value);
    -        if (status < 0)
    -            goto failed;
    -    }
    -
    -    Py_DECREF(keys);
    -
    -    return result;
    -
    -failed:
    -    Py_XDECREF(keys);
    -    Py_DECREF(result);
    -    return NULL;
    -}
    -
    -static PyObject*
    -match_start(MatchObject* self, PyObject* args)
    -{
    -    Py_ssize_t index;
    -
    -    PyObject* index_ = NULL;
    -    if (!PyArg_UnpackTuple(args, "start", 0, 1, &index_))
    -        return NULL;
    -
    -    index = match_getindex(self, index_);
    -
    -    if (index < 0 || index >= self->groups) {
    -        PyErr_SetString(
    -            PyExc_IndexError,
    -            "no such group"
    -            );
    -        return NULL;
    -    }
    -
    -    /* mark is -1 if group is undefined */
    -    return PyLong_FromSsize_t(self->mark[index*2]);
    -}
    -
    -static PyObject*
    -match_end(MatchObject* self, PyObject* args)
    -{
    -    Py_ssize_t index;
    -
    -    PyObject* index_ = NULL;
    -    if (!PyArg_UnpackTuple(args, "end", 0, 1, &index_))
    -        return NULL;
    -
    -    index = match_getindex(self, index_);
    -
    -    if (index < 0 || index >= self->groups) {
    -        PyErr_SetString(
    -            PyExc_IndexError,
    -            "no such group"
    -            );
    -        return NULL;
    -    }
    -
    -    /* mark is -1 if group is undefined */
    -    return PyLong_FromSsize_t(self->mark[index*2+1]);
    -}
    -
    -LOCAL(PyObject*)
    -_pair(Py_ssize_t i1, Py_ssize_t i2)
    -{
    -    PyObject* pair;
    -    PyObject* item;
    -
    -    pair = PyTuple_New(2);
    -    if (!pair)
    -        return NULL;
    -
    -    item = PyLong_FromSsize_t(i1);
    -    if (!item)
    -        goto error;
    -    PyTuple_SET_ITEM(pair, 0, item);
    -
    -    item = PyLong_FromSsize_t(i2);
    -    if (!item)
    -        goto error;
    -    PyTuple_SET_ITEM(pair, 1, item);
    -
    -    return pair;
    -
    -  error:
    -    Py_DECREF(pair);
    -    return NULL;
    -}
    -
    -static PyObject*
    -match_span(MatchObject* self, PyObject* args)
    -{
    -    Py_ssize_t index;
    -
    -    PyObject* index_ = NULL;
    -    if (!PyArg_UnpackTuple(args, "span", 0, 1, &index_))
    -        return NULL;
    -
    -    index = match_getindex(self, index_);
    -
    -    if (index < 0 || index >= self->groups) {
    -        PyErr_SetString(
    -            PyExc_IndexError,
    -            "no such group"
    -            );
    -        return NULL;
    -    }
    -
    -    /* marks are -1 if group is undefined */
    -    return _pair(self->mark[index*2], self->mark[index*2+1]);
    -}
    -
    -static PyObject*
    -match_regs(MatchObject* self)
    -{
    -    PyObject* regs;
    -    PyObject* item;
    -    Py_ssize_t index;
    -
    -    regs = PyTuple_New(self->groups);
    -    if (!regs)
    -        return NULL;
    -
    -    for (index = 0; index < self->groups; index++) {
    -        item = _pair(self->mark[index*2], self->mark[index*2+1]);
    -        if (!item) {
    -            Py_DECREF(regs);
    -            return NULL;
    -        }
    -        PyTuple_SET_ITEM(regs, index, item);
    -    }
    -
    -    Py_INCREF(regs);
    -    self->regs = regs;
    -
    -    return regs;
    -}
    -
    -static PyObject*
    -match_copy(MatchObject* self, PyObject *unused)
    -{
    -#ifdef USE_BUILTIN_COPY
    -    MatchObject* copy;
    -    Py_ssize_t slots, offset;
    -
    -    slots = 2 * (self->pattern->groups+1);
    -
    -    copy = PyObject_NEW_VAR(MatchObject, &Match_Type, slots);
    -    if (!copy)
    -        return NULL;
    -
    -    /* this value a constant, but any compiler should be able to
    -       figure that out all by itself */
    -    offset = offsetof(MatchObject, string);
    -
    -    Py_XINCREF(self->pattern);
    -    Py_XINCREF(self->string);
    -    Py_XINCREF(self->regs);
    -
    -    memcpy((char*) copy + offset, (char*) self + offset,
    -           sizeof(MatchObject) + slots * sizeof(Py_ssize_t) - offset);
    -
    -    return (PyObject*) copy;
    -#else
    -    PyErr_SetString(PyExc_TypeError, "cannot copy this match object");
    -    return NULL;
    -#endif
    -}
    -
    -static PyObject*
    -match_deepcopy(MatchObject* self, PyObject* memo)
    -{
    -#ifdef USE_BUILTIN_COPY
    -    MatchObject* copy;
    -
    -    copy = (MatchObject*) match_copy(self);
    -    if (!copy)
    -        return NULL;
    -
    -    if (!deepcopy((PyObject**) ©->pattern, memo) ||
    -        !deepcopy(©->string, memo) ||
    -        !deepcopy(©->regs, memo)) {
    -        Py_DECREF(copy);
    -        return NULL;
    -    }
    -
    -#else
    -    PyErr_SetString(PyExc_TypeError, "cannot deepcopy this match object");
    -    return NULL;
    -#endif
    -}
    -
    -PyDoc_STRVAR(match_doc,
    -"The result of re.match() and re.search().\n\
    -Match objects always have a boolean value of True.");
    -
    -PyDoc_STRVAR(match_group_doc,
    -"group([group1, ...]) -> str or tuple.\n\
    -    Return subgroup(s) of the match by indices or names.\n\
    -    For 0 returns the entire match.");
    -
    -PyDoc_STRVAR(match_start_doc,
    -"start([group=0]) -> int.\n\
    -    Return index of the start of the substring matched by group.");
    -
    -PyDoc_STRVAR(match_end_doc,
    -"end([group=0]) -> int.\n\
    -    Return index of the end of the substring matched by group.");
    -
    -PyDoc_STRVAR(match_span_doc,
    -"span([group]) -> tuple.\n\
    -    For MatchObject m, return the 2-tuple (m.start(group), m.end(group)).");
    -
    -PyDoc_STRVAR(match_groups_doc,
    -"groups([default=None]) -> tuple.\n\
    -    Return a tuple containing all the subgroups of the match, from 1.\n\
    -    The default argument is used for groups\n\
    -    that did not participate in the match");
    -
    -PyDoc_STRVAR(match_groupdict_doc,
    -"groupdict([default=None]) -> dict.\n\
    -    Return a dictionary containing all the named subgroups of the match,\n\
    -    keyed by the subgroup name. The default argument is used for groups\n\
    -    that did not participate in the match");
    -
    -PyDoc_STRVAR(match_expand_doc,
    -"expand(template) -> str.\n\
    -    Return the string obtained by doing backslash substitution\n\
    -    on the string template, as done by the sub() method.");
    -
    -static PyMethodDef match_methods[] = {
    -    {"group", (PyCFunction) match_group, METH_VARARGS, match_group_doc},
    -    {"start", (PyCFunction) match_start, METH_VARARGS, match_start_doc},
    -    {"end", (PyCFunction) match_end, METH_VARARGS, match_end_doc},
    -    {"span", (PyCFunction) match_span, METH_VARARGS, match_span_doc},
    -    {"groups", (PyCFunction) match_groups, METH_VARARGS|METH_KEYWORDS,
    -        match_groups_doc},
    -    {"groupdict", (PyCFunction) match_groupdict, METH_VARARGS|METH_KEYWORDS,
    -        match_groupdict_doc},
    -    {"expand", (PyCFunction) match_expand, METH_O, match_expand_doc},
    -    {"__copy__", (PyCFunction) match_copy, METH_NOARGS},
    -    {"__deepcopy__", (PyCFunction) match_deepcopy, METH_O},
    -    {NULL, NULL}
    -};
    -
    -static PyObject *
    -match_lastindex_get(MatchObject *self)
    -{
    -    if (self->lastindex >= 0)
    -        return PyLong_FromSsize_t(self->lastindex);
    -    Py_INCREF(Py_None);
    -    return Py_None;
    -}
    -
    -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;
    -}
    -
    -static PyObject *
    -match_regs_get(MatchObject *self)
    -{
    -    if (self->regs) {
    -        Py_INCREF(self->regs);
    -        return self->regs;
    -    } else
    -        return match_regs(self);
    -}
    -
    -static PyObject *
    -match_repr(MatchObject *self)
    -{
    -    PyObject *result;
    -    PyObject *group0 = match_getslice_by_index(self, 0, Py_None);
    -    if (group0 == NULL)
    -        return NULL;
    -    result = PyUnicode_FromFormat(
    -            "<%s object; span=(%d, %d), match=%.50R>",
    -            Py_TYPE(self)->tp_name,
    -            self->mark[0], self->mark[1], group0);
    -    Py_DECREF(group0);
    -    return result;
    -}
    -
    -
    -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}
    -};
    -
    -#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 */
    -
    -static PyTypeObject Match_Type = {
    -    PyVarObject_HEAD_INIT(NULL,0)
    -    "_" SRE_MODULE ".SRE_Match",
    -    sizeof(MatchObject), sizeof(Py_ssize_t),
    -    (destructor)match_dealloc,  /* tp_dealloc */
    -    0,                          /* tp_print */
    -    0,                          /* tp_getattr */
    -    0,                          /* tp_setattr */
    -    0,                          /* tp_reserved */
    -    (reprfunc)match_repr,       /* 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 */
    -    match_doc,                  /* 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*
    -pattern_new_match(PatternObject* pattern, SRE_STATE* state, int status)
    -{
    -    /* create match object (from state object) */
    -
    -    MatchObject* match;
    -    Py_ssize_t i, j;
    -    char* base;
    -    int n;
    -
    -    if (status > 0) {
    -
    -        /* create match object (with room for extra group marks) */
    -        /* coverity[ampersand_in_size] */
    -        match = PyObject_NEW_VAR(MatchObject, &Match_Type,
    -                                 2*(pattern->groups+1));
    -        if (!match)
    -            return NULL;
    -
    -        Py_INCREF(pattern);
    -        match->pattern = pattern;
    -
    -        Py_INCREF(state->string);
    -        match->string = state->string;
    -
    -        match->regs = NULL;
    -        match->groups = pattern->groups+1;
    -
    -        /* fill in group slices */
    -
    -        base = (char*) state->beginning;
    -        n = state->charsize;
    -
    -        match->mark[0] = ((char*) state->start - base) / n;
    -        match->mark[1] = ((char*) state->ptr - base) / n;
    -
    -        for (i = j = 0; i < pattern->groups; i++, j+=2)
    -            if (j+1 <= state->lastmark && state->mark[j] && state->mark[j+1]) {
    -                match->mark[j+2] = ((char*) state->mark[j] - base) / n;
    -                match->mark[j+3] = ((char*) state->mark[j+1] - base) / n;
    -            } else
    -                match->mark[j+2] = match->mark[j+3] = -1; /* undefined */
    -
    -        match->pos = state->pos;
    -        match->endpos = state->endpos;
    -
    -        match->lastindex = state->lastindex;
    -
    -        return (PyObject*) match;
    -
    -    } else if (status == 0) {
    -
    -        /* no match */
    -        Py_INCREF(Py_None);
    -        return Py_None;
    -
    -    }
    -
    -    /* internal error */
    -    pattern_error(status);
    -    return NULL;
    -}
    -
    -
    -/* -------------------------------------------------------------------- */
    -/* scanner methods (experimental) */
    -
    -static void
    -scanner_dealloc(ScannerObject* self)
    -{
    -    state_fini(&self->state);
    -    Py_XDECREF(self->pattern);
    -    PyObject_DEL(self);
    -}
    -
    -static PyObject*
    -scanner_match(ScannerObject* self, PyObject *unused)
    -{
    -    SRE_STATE* state = &self->state;
    -    PyObject* match;
    -    Py_ssize_t status;
    -
    -    state_reset(state);
    -
    -    state->ptr = state->start;
    -
    -    status = sre_match(state, PatternObject_GetCode(self->pattern));
    -    if (PyErr_Occurred())
    -        return NULL;
    -
    -    match = pattern_new_match((PatternObject*) self->pattern,
    -                               state, status);
    -
    -    if (status == 0 || state->ptr == state->start)
    -        state->start = (void*) ((char*) state->ptr + state->charsize);
    -    else
    -        state->start = state->ptr;
    -
    -    return match;
    -}
    -
    -
    -static PyObject*
    -scanner_search(ScannerObject* self, PyObject *unused)
    -{
    -    SRE_STATE* state = &self->state;
    -    PyObject* match;
    -    Py_ssize_t status;
    -
    -    state_reset(state);
    -
    -    state->ptr = state->start;
    -
    -    status = sre_search(state, PatternObject_GetCode(self->pattern));
    -    if (PyErr_Occurred())
    -        return NULL;
    -
    -    match = pattern_new_match((PatternObject*) self->pattern,
    -                               state, status);
    -
    -    if (status == 0 || state->ptr == state->start)
    -        state->start = (void*) ((char*) state->ptr + state->charsize);
    -    else
    -        state->start = state->ptr;
    -
    -    return match;
    -}
    -
    -static PyMethodDef scanner_methods[] = {
    -    {"match", (PyCFunction) scanner_match, METH_NOARGS},
    -    {"search", (PyCFunction) scanner_search, METH_NOARGS},
    -    {NULL, 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 */
    -    0,                          /* tp_getattr */
    -    0,                          /* tp_setattr */
    -    0,                          /* tp_reserved */
    -    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*
    -pattern_scanner(PatternObject* pattern, PyObject* args, PyObject* kw)
    -{
    -    /* create search state object */
    -
    -    ScannerObject* self;
    -
    -    PyObject* string;
    -    Py_ssize_t start = 0;
    -    Py_ssize_t end = PY_SSIZE_T_MAX;
    -    static char* kwlist[] = { "source", "pos", "endpos", NULL };
    -    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:scanner", kwlist,
    -                                     &string, &start, &end))
    -        return NULL;
    -
    -    /* create scanner object */
    -    self = PyObject_NEW(ScannerObject, &Scanner_Type);
    -    if (!self)
    -        return NULL;
    -    self->pattern = NULL;
    -
    -    string = state_init(&self->state, pattern, string, start, end);
    -    if (!string) {
    -        Py_DECREF(self);
    -        return NULL;
    -    }
    -
    -    Py_INCREF(pattern);
    -    self->pattern = (PyObject*) pattern;
    -
    -    return (PyObject*) self;
    -}
    -
    -static PyMethodDef _functions[] = {
    -    {"compile", _compile, METH_VARARGS},
    -    {"getcodesize", sre_codesize, METH_NOARGS},
    -    {"getlower", sre_getlower, METH_VARARGS},
    -    {NULL, NULL}
    -};
    -
    -static struct PyModuleDef sremodule = {
    -        PyModuleDef_HEAD_INIT,
    -        "_" SRE_MODULE,
    -        NULL,
    -        -1,
    -        _functions,
    -        NULL,
    -        NULL,
    -        NULL,
    -        NULL
    -};
    -
    -PyMODINIT_FUNC PyInit__sre(void)
    -{
    -    PyObject* m;
    -    PyObject* d;
    -    PyObject* x;
    -
    -    /* Patch object types */
    -    if (PyType_Ready(&Pattern_Type) || PyType_Ready(&Match_Type) ||
    -        PyType_Ready(&Scanner_Type))
    -        return NULL;
    -
    -    m = PyModule_Create(&sremodule);
    -    if (m == NULL)
    -        return NULL;
    -    d = PyModule_GetDict(m);
    -
    -    x = PyLong_FromLong(SRE_MAGIC);
    -    if (x) {
    -        PyDict_SetItemString(d, "MAGIC", x);
    -        Py_DECREF(x);
    -    }
    -
    -    x = PyLong_FromLong(sizeof(SRE_CODE));
    -    if (x) {
    -        PyDict_SetItemString(d, "CODESIZE", x);
    -        Py_DECREF(x);
    -    }
    -
    -    x = PyLong_FromUnsignedLong(SRE_MAXREPEAT);
    -    if (x) {
    -        PyDict_SetItemString(d, "MAXREPEAT", x);
    -        Py_DECREF(x);
    -    }
    -
    -    x = PyUnicode_FromString(copyright);
    -    if (x) {
    -        PyDict_SetItemString(d, "copyright", x);
    -        Py_DECREF(x);
    -    }
    -    return m;
    -}
    -
    -#endif /* !defined(SRE_RECURSIVE) */
    -
    -#ifdef SRE_RECURSIVE
    -# undef SRE_RECURSIVE
    -# undef SRE_CHAR
    -# undef SIZEOF_SRE_CHAR
    -# undef SRE
    -#endif /* SRE_RECURSIVE */
    +#undef SRE_CHAR
    +#undef SIZEOF_SRE_CHAR
    +#undef SRE
     
     /* vim:ts=4:sw=4:et
     */
    diff --git a/PC/VS9.0/pythoncore.vcproj b/PC/VS9.0/pythoncore.vcproj
    --- a/PC/VS9.0/pythoncore.vcproj
    +++ b/PC/VS9.0/pythoncore.vcproj
    @@ -1155,6 +1155,18 @@
     				>
     			
     			
    +			
    +			
    +			
    +			
    +			
    +			
     			
    diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
    --- a/PCbuild/pythoncore.vcxproj
    +++ b/PCbuild/pythoncore.vcxproj
    @@ -449,6 +449,9 @@
         
         
         
    +    
    +    
    +    
         
         
         
    diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
    --- a/PCbuild/pythoncore.vcxproj.filters
    +++ b/PCbuild/pythoncore.vcxproj.filters
    @@ -300,6 +300,15 @@
         
           Modules
         
    +    
    +      Modules
    +    
    +    
    +      Modules
    +    
    +    
    +      Modules
    +    
         
           Modules\_io
         
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 12:18:41 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 12:18:41 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE1NjYz?=
     =?utf-8?q?=3A_OS_X_installer_builtin_Tcl/Tk_support?=
    Message-ID: <3d6J7P4H9xz7Ljl@mail.python.org>
    
    http://hg.python.org/cpython/rev/db5a50959dc9
    changeset:   86652:db5a50959dc9
    branch:      2.7
    parent:      86640:6cfb0f2815ce
    user:        Ned Deily 
    date:        Sat Oct 26 03:16:06 2013 -0700
    summary:
      Issue #15663: OS X installer builtin Tcl/Tk support
    
    Make it easier for users to make use of the backup _tkinter linked
    with the third-party Tcl and Tk frameworks in /Library/Frameworks.
    The two tkinter variants are now installed in separate directories
    under a new lib-tkinter.  This allows per-user selection by
    manipulating sys.path, directly or with PYTHONPATH.  If this
    proves useful, we can supply a more convenient user interface
    to supply the paths.  For now, this remains somewhat experimental.
    
    files:
      Mac/BuildScript/README.txt         |  14 ++--
      Mac/BuildScript/build-installer.py |  56 ++++++++++++++---
      2 files changed, 51 insertions(+), 19 deletions(-)
    
    
    diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
    --- a/Mac/BuildScript/README.txt
    +++ b/Mac/BuildScript/README.txt
    @@ -67,28 +67,28 @@
         - requires ActiveState Tcl/Tk 8.5.14 (or later) to be installed for building
     
             * Beginning with Python 2.7.6, this installer now includes its own
    -          private copy of Tcl and Tk 8.5.15 libraries and thus is no longer
    +          builtin copy of Tcl and Tk 8.5.15 libraries and thus is no longer
               dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with
               OS X 10.6 or on installing a newer third-party version of Tcl/Tk
               in /Library/Frameworks, such as from ActiveState.  If it is
               necessary to fallback to using a third-party Tcl/Tk because of
    -          a problem with the private Tcl/Tk, there is a backup version of
    +          a problem with the builtin Tcl/Tk, there is a backup version of
               the _tkinter extension included which will dynamically link to
               Tcl and Tk frameworks in /Library/Frameworks as in previous releases.
               To enable (for all users of this Python 2.7)::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/2.7
    -              cd ./lib/python2.7/lib-dynload
    -              cp -p _tkinter.so.framework _tkinter.so
    +              cd ./lib/python2.7
    +              cp -p ./lib-tkinter/library/_tkinter.so ./lib-dynload
                   exit
     
    -          To restore using Python's private versions of Tcl and Tk::
    +          To restore using Python's builtin versions of Tcl and Tk::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/2.7
    -              cd ./lib/python2.7/lib-dynload
    -              cp -p _tkinter.so.private _tkinter.so
    +              cd ./lib/python2.7
    +              cp -p ./lib-tkinter/builtin/_tkinter.so ./lib-dynload
                   exit
     
         - recommended build environment:
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -565,11 +565,11 @@
                 ]
     
         # For 10.6+ builds, we build two versions of _tkinter:
    -    #    - the traditional version (renamed to _tkinter.so.framework) linked
    +    #    - the traditional version (renamed to _tkinter_library.so) linked
         #       with /Library/Frameworks/{Tcl,Tk}.framework
    -    #    - the default version linked with our private copies of Tcl and Tk
    +    #    - the default version linked with our builtin copies of Tcl and Tk
         if DEPTARGET > '10.5':
    -        EXPECTED_SHARED_LIBS['_tkinter.so.framework'] = \
    +        EXPECTED_SHARED_LIBS['_tkinter_library.so'] = \
                 EXPECTED_SHARED_LIBS['_tkinter.so']
             EXPECTED_SHARED_LIBS['_tkinter.so'] = [
                     "/Library/Frameworks/Python.framework/Versions/%s/lib/libtcl%s.dylib"
    @@ -966,18 +966,18 @@
         # of Tcl and Cocoa Aqua Tk libs because the Apple-supplied Tk 8.5 is
         # out-of-date and has critical bugs.  Save the _tkinter.so that was
         # linked with /Library/Frameworks/{Tck,Tk}.framework and build
    -    # another _tkinter.so linked with our private Tcl and Tk libs.
    +    # another _tkinter.so linked with our builtin Tcl and Tk libs.
         if DEPTARGET > '10.5':
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir mv '{}' '{}'.framework \;")
    -        print("Running make to rebuild _tkinter")
    +                        " -execdir mv '{}' _tkinter_library.so \;")
    +        print("Running make to build builtin _tkinter")
             runCommand("make TCLTK_INCLUDES='-I%s/libraries/usr/local/include' "
                     "TCLTK_LIBS='-L%s/libraries/usr/local/lib -ltcl8.5 -ltk8.5'"%(
                 shellQuote(WORKDIR)[1:-1],
                 shellQuote(WORKDIR)[1:-1]))
    -        # make a backup copy, just in case
    +        # make a copy which will be moved to lib-tkinter later
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir cp -p '{}' '{}'.private \;")
    +                        " -execdir cp -p '{}' _tkinter_builtin.so \;")
     
         print("Running make install")
         runCommand("make install DESTDIR=%s"%(
    @@ -999,11 +999,31 @@
                     'Python.framework', 'Versions', getVersion(),
                     'lib'))))
     
    +    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    +                                'Python.framework', 'Versions',
    +                                version, 'lib', 'python%s'%(version,))
    +
    +    # If we made multiple versions of _tkinter, move them to
    +    # their own directories under python lib.  This allows
    +    # users to select which to import by manipulating sys.path
    +    # directly or with PYTHONPATH.
    +
    +    if DEPTARGET > '10.5':
    +        TKINTERS = ['builtin', 'library']
    +        tkinter_moves = [('_tkinter_' + tkn + '.so',
    +                             os.path.join(path_to_lib, 'lib-tkinter', tkn))
    +                         for tkn in TKINTERS]
    +        # Create the destination directories under lib-tkinter.
    +        # The permissions and uid/gid will be fixed up next.
    +        for tkm in tkinter_moves:
    +            os.makedirs(tkm[1])
    +
         print("Fix file modes")
         frmDir = os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework')
         gid = grp.getgrnam('admin').gr_gid
     
         shared_lib_error = False
    +    moves_list = []
         for dirpath, dirnames, filenames in os.walk(frmDir):
             for dn in dirnames:
                 os.chmod(os.path.join(dirpath, dn), STAT_0o775)
    @@ -1029,9 +1049,25 @@
                                     % (sl, p))
                             shared_lib_error = True
     
    +            # If this is a _tkinter variant, move it to its own directory
    +            # now that we have fixed its permissions and checked that it
    +            # was linked properly.  The directory was created earlier.
    +            # The files are moved after the entire tree has been walked
    +            # since the shared library checking depends on the files
    +            # having unique names.
    +            if DEPTARGET > '10.5':
    +                for tkm in tkinter_moves:
    +                    if fn == tkm[0]:
    +                        moves_list.append(
    +                            (p, os.path.join(tkm[1], '_tkinter.so')))
    +
         if shared_lib_error:
             fatal("Unexpected shared library errors.")
     
    +    # Now do the moves.
    +    for ml in moves_list:
    +        shutil.move(ml[0], ml[1])
    +
         if PYTHON_3:
             LDVERSION=None
             VERSION=None
    @@ -1061,10 +1097,6 @@
         include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
         lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
     
    -    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    -                                'Python.framework', 'Versions',
    -                                version, 'lib', 'python%s'%(version,))
    -
         # fix Makefile
         path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
         fp = open(path, 'r')
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 12:18:42 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 12:18:42 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE1NjYz?=
     =?utf-8?q?=3A_OS_X_installer_builtin_Tcl/Tk_support?=
    Message-ID: <3d6J7Q74Ngz7Ljn@mail.python.org>
    
    http://hg.python.org/cpython/rev/150242784de0
    changeset:   86653:150242784de0
    branch:      3.3
    parent:      86646:ea3deb022890
    user:        Ned Deily 
    date:        Sat Oct 26 03:16:44 2013 -0700
    summary:
      Issue #15663: OS X installer builtin Tcl/Tk support
    
    Make it easier for users to make use of the backup _tkinter linked
    with the third-party Tcl and Tk frameworks in /Library/Frameworks.
    The two tkinter variants are now installed in separate directories
    under a new lib-tkinter.  This allows per-user selection by
    manipulating sys.path, directly or with PYTHONPATH.  If this
    proves useful, we can supply a more convenient user interface
    to supply the paths.  For now, this remains somewhat experimental.
    
    files:
      Mac/BuildScript/README.txt         |  14 ++--
      Mac/BuildScript/build-installer.py |  56 ++++++++++++++---
      2 files changed, 51 insertions(+), 19 deletions(-)
    
    
    diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
    --- a/Mac/BuildScript/README.txt
    +++ b/Mac/BuildScript/README.txt
    @@ -68,28 +68,28 @@
         - requires ActiveState Tcl/Tk 8.5.14 (or later) to be installed for building
     
             * Beginning with Python 3.3.3, this installer now includes its own
    -          private copy of Tcl and Tk 8.5.15 libraries and thus is no longer
    +          builtin copy of Tcl and Tk 8.5.15 libraries and thus is no longer
               dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with
               OS X 10.6 or on installing a newer third-party version of Tcl/Tk
               in /Library/Frameworks, such as from ActiveState.  If it is
               necessary to fallback to using a third-party Tcl/Tk because of
    -          a problem with the private Tcl/Tk, there is a backup version of
    +          a problem with the builtin Tcl/Tk, there is a backup version of
               the _tkinter extension included which will dynamically link to
               Tcl and Tk frameworks in /Library/Frameworks as in previous releases.
               To enable (for all users of this Python 3.3)::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/3.3
    -              cd ./lib/python3.3/lib-dynload
    -              cp -p _tkinter.so.framework _tkinter.so
    +              cd ./lib/python3.3
    +              cp -p ./lib-tkinter/library/_tkinter.so ./lib-dynload
                   exit
     
    -          To restore using Python's private versions of Tcl and Tk::
    +          To restore using Python's builtin versions of Tcl and Tk::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/3.3
    -              cd ./lib/python3.3/lib-dynload
    -              cp -p _tkinter.so.private _tkinter.so
    +              cd ./lib/python3.3
    +              cp -p ./lib-tkinter/builtin/_tkinter.so ./lib-dynload
                   exit
     
         - recommended build environment:
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -565,11 +565,11 @@
                 ]
     
         # For 10.6+ builds, we build two versions of _tkinter:
    -    #    - the traditional version (renamed to _tkinter.so.framework) linked
    +    #    - the traditional version (renamed to _tkinter_library.so) linked
         #       with /Library/Frameworks/{Tcl,Tk}.framework
    -    #    - the default version linked with our private copies of Tcl and Tk
    +    #    - the default version linked with our builtin copies of Tcl and Tk
         if DEPTARGET > '10.5':
    -        EXPECTED_SHARED_LIBS['_tkinter.so.framework'] = \
    +        EXPECTED_SHARED_LIBS['_tkinter_library.so'] = \
                 EXPECTED_SHARED_LIBS['_tkinter.so']
             EXPECTED_SHARED_LIBS['_tkinter.so'] = [
                     "/Library/Frameworks/Python.framework/Versions/%s/lib/libtcl%s.dylib"
    @@ -966,18 +966,18 @@
         # of Tcl and Cocoa Aqua Tk libs because the Apple-supplied Tk 8.5 is
         # out-of-date and has critical bugs.  Save the _tkinter.so that was
         # linked with /Library/Frameworks/{Tck,Tk}.framework and build
    -    # another _tkinter.so linked with our private Tcl and Tk libs.
    +    # another _tkinter.so linked with our builtin Tcl and Tk libs.
         if DEPTARGET > '10.5':
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir mv '{}' '{}'.framework \;")
    -        print("Running make to rebuild _tkinter")
    +                        " -execdir mv '{}' _tkinter_library.so \;")
    +        print("Running make to build builtin _tkinter")
             runCommand("make TCLTK_INCLUDES='-I%s/libraries/usr/local/include' "
                     "TCLTK_LIBS='-L%s/libraries/usr/local/lib -ltcl8.5 -ltk8.5'"%(
                 shellQuote(WORKDIR)[1:-1],
                 shellQuote(WORKDIR)[1:-1]))
    -        # make a backup copy, just in case
    +        # make a copy which will be moved to lib-tkinter later
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir cp -p '{}' '{}'.private \;")
    +                        " -execdir cp -p '{}' _tkinter_builtin.so \;")
     
         print("Running make install")
         runCommand("make install DESTDIR=%s"%(
    @@ -999,11 +999,31 @@
                     'Python.framework', 'Versions', getVersion(),
                     'lib'))))
     
    +    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    +                                'Python.framework', 'Versions',
    +                                version, 'lib', 'python%s'%(version,))
    +
    +    # If we made multiple versions of _tkinter, move them to
    +    # their own directories under python lib.  This allows
    +    # users to select which to import by manipulating sys.path
    +    # directly or with PYTHONPATH.
    +
    +    if DEPTARGET > '10.5':
    +        TKINTERS = ['builtin', 'library']
    +        tkinter_moves = [('_tkinter_' + tkn + '.so',
    +                             os.path.join(path_to_lib, 'lib-tkinter', tkn))
    +                         for tkn in TKINTERS]
    +        # Create the destination directories under lib-tkinter.
    +        # The permissions and uid/gid will be fixed up next.
    +        for tkm in tkinter_moves:
    +            os.makedirs(tkm[1])
    +
         print("Fix file modes")
         frmDir = os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework')
         gid = grp.getgrnam('admin').gr_gid
     
         shared_lib_error = False
    +    moves_list = []
         for dirpath, dirnames, filenames in os.walk(frmDir):
             for dn in dirnames:
                 os.chmod(os.path.join(dirpath, dn), STAT_0o775)
    @@ -1029,9 +1049,25 @@
                                     % (sl, p))
                             shared_lib_error = True
     
    +            # If this is a _tkinter variant, move it to its own directory
    +            # now that we have fixed its permissions and checked that it
    +            # was linked properly.  The directory was created earlier.
    +            # The files are moved after the entire tree has been walked
    +            # since the shared library checking depends on the files
    +            # having unique names.
    +            if DEPTARGET > '10.5':
    +                for tkm in tkinter_moves:
    +                    if fn == tkm[0]:
    +                        moves_list.append(
    +                            (p, os.path.join(tkm[1], '_tkinter.so')))
    +
         if shared_lib_error:
             fatal("Unexpected shared library errors.")
     
    +    # Now do the moves.
    +    for ml in moves_list:
    +        shutil.move(ml[0], ml[1])
    +
         if PYTHON_3:
             LDVERSION=None
             VERSION=None
    @@ -1061,10 +1097,6 @@
         include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
         lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
     
    -    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    -                                'Python.framework', 'Versions',
    -                                version, 'lib', 'python%s'%(version,))
    -
         # fix Makefile
         path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
         fp = open(path, 'r')
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 12:18:44 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 12:18:44 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2315663=3A_OS_X_ins?=
     =?utf-8?q?taller_builtin_Tcl/Tk_support?=
    Message-ID: <3d6J7S2ppvz7Lk8@mail.python.org>
    
    http://hg.python.org/cpython/rev/b599584ff1e3
    changeset:   86654:b599584ff1e3
    parent:      86651:00e61cb3b11c
    user:        Ned Deily 
    date:        Sat Oct 26 03:17:44 2013 -0700
    summary:
      Issue #15663: OS X installer builtin Tcl/Tk support
    
    Make it easier for users to make use of the backup _tkinter linked
    with the third-party Tcl and Tk frameworks in /Library/Frameworks.
    The two tkinter variants are now installed in separate directories
    under a new lib-tkinter.  This allows per-user selection by
    manipulating sys.path, directly or with PYTHONPATH.  If this
    proves useful, we can supply a more convenient user interface
    to supply the paths.  For now, this remains somewhat experimental.
    
    files:
      Mac/BuildScript/README.txt         |  14 ++--
      Mac/BuildScript/build-installer.py |  56 ++++++++++++++---
      2 files changed, 51 insertions(+), 19 deletions(-)
    
    
    diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
    --- a/Mac/BuildScript/README.txt
    +++ b/Mac/BuildScript/README.txt
    @@ -68,30 +68,30 @@
         - requires ActiveState Tcl/Tk 8.5.15 (or later) to be installed for building
     
             * Beginning with Python 3.4 alpha2, this installer now includes its own
    -          private copy of Tcl and Tk 8.5.15 libraries and thus is no longer
    +          builtin copy of Tcl and Tk 8.5.15 libraries and thus is no longer
               dependent on the buggy releases of Aqua Cocoa Tk 8.5 shipped with
               OS X 10.6 or on installing a newer third-party version of Tcl/Tk
               in /Library/Frameworks, such as from ActiveState.  Because this
               is a new feature, it should be considered somewhat experimental and
               subject to change prior to the final release of Python 3.4.  If it
               is necessary to fallback to using a third-party Tcl/Tk because of
    -          a problem with the private Tcl/Tk, there is a backup version of
    +          a problem with the builtin Tcl/Tk, there is a backup version of
               the _tkinter extension included which will dynamically link to
               Tcl and Tk frameworks in /Library/Frameworks as in previous releases.
               To enable (for all users of this Python 3.4)::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/3.4
    -              cd ./lib/python3.4/lib-dynload
    -              cp -p _tkinter.so.framework _tkinter.so
    +              cd ./lib/python3.4
    +              cp -p ./lib-tkinter/library/_tkinter.so ./lib-dynload
                   exit
     
    -          To restore using Python's private versions of Tcl and Tk::
    +          To restore using Python's builtin versions of Tcl and Tk::
     
                   sudo bash
                   cd /Library/Frameworks/Python.framework/Versions/3.4
    -              cd ./lib/python3.4/lib-dynload
    -              cp -p _tkinter.so.private _tkinter.so
    +              cd ./lib/python3.4
    +              cp -p ./lib-tkinter/builtin/_tkinter.so ./lib-dynload
                   exit
     
         - recommended build environment:
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -565,11 +565,11 @@
                 ]
     
         # For 10.6+ builds, we build two versions of _tkinter:
    -    #    - the traditional version (renamed to _tkinter.so.framework) linked
    +    #    - the traditional version (renamed to _tkinter_library.so) linked
         #       with /Library/Frameworks/{Tcl,Tk}.framework
    -    #    - the default version linked with our private copies of Tcl and Tk
    +    #    - the default version linked with our builtin copies of Tcl and Tk
         if DEPTARGET > '10.5':
    -        EXPECTED_SHARED_LIBS['_tkinter.so.framework'] = \
    +        EXPECTED_SHARED_LIBS['_tkinter_library.so'] = \
                 EXPECTED_SHARED_LIBS['_tkinter.so']
             EXPECTED_SHARED_LIBS['_tkinter.so'] = [
                     "/Library/Frameworks/Python.framework/Versions/%s/lib/libtcl%s.dylib"
    @@ -966,18 +966,18 @@
         # of Tcl and Cocoa Aqua Tk libs because the Apple-supplied Tk 8.5 is
         # out-of-date and has critical bugs.  Save the _tkinter.so that was
         # linked with /Library/Frameworks/{Tck,Tk}.framework and build
    -    # another _tkinter.so linked with our private Tcl and Tk libs.
    +    # another _tkinter.so linked with our builtin Tcl and Tk libs.
         if DEPTARGET > '10.5':
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir mv '{}' '{}'.framework \;")
    -        print("Running make to rebuild _tkinter")
    +                        " -execdir mv '{}' _tkinter_library.so \;")
    +        print("Running make to build builtin _tkinter")
             runCommand("make TCLTK_INCLUDES='-I%s/libraries/usr/local/include' "
                     "TCLTK_LIBS='-L%s/libraries/usr/local/lib -ltcl8.5 -ltk8.5'"%(
                 shellQuote(WORKDIR)[1:-1],
                 shellQuote(WORKDIR)[1:-1]))
    -        # make a backup copy, just in case
    +        # make a copy which will be moved to lib-tkinter later
             runCommand("find build -name '_tkinter.so' "
    -                        " -execdir cp -p '{}' '{}'.private \;")
    +                        " -execdir cp -p '{}' _tkinter_builtin.so \;")
     
         print("Running make install")
         runCommand("make install DESTDIR=%s"%(
    @@ -999,11 +999,31 @@
                     'Python.framework', 'Versions', getVersion(),
                     'lib'))))
     
    +    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    +                                'Python.framework', 'Versions',
    +                                version, 'lib', 'python%s'%(version,))
    +
    +    # If we made multiple versions of _tkinter, move them to
    +    # their own directories under python lib.  This allows
    +    # users to select which to import by manipulating sys.path
    +    # directly or with PYTHONPATH.
    +
    +    if DEPTARGET > '10.5':
    +        TKINTERS = ['builtin', 'library']
    +        tkinter_moves = [('_tkinter_' + tkn + '.so',
    +                             os.path.join(path_to_lib, 'lib-tkinter', tkn))
    +                         for tkn in TKINTERS]
    +        # Create the destination directories under lib-tkinter.
    +        # The permissions and uid/gid will be fixed up next.
    +        for tkm in tkinter_moves:
    +            os.makedirs(tkm[1])
    +
         print("Fix file modes")
         frmDir = os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework')
         gid = grp.getgrnam('admin').gr_gid
     
         shared_lib_error = False
    +    moves_list = []
         for dirpath, dirnames, filenames in os.walk(frmDir):
             for dn in dirnames:
                 os.chmod(os.path.join(dirpath, dn), STAT_0o775)
    @@ -1029,9 +1049,25 @@
                                     % (sl, p))
                             shared_lib_error = True
     
    +            # If this is a _tkinter variant, move it to its own directory
    +            # now that we have fixed its permissions and checked that it
    +            # was linked properly.  The directory was created earlier.
    +            # The files are moved after the entire tree has been walked
    +            # since the shared library checking depends on the files
    +            # having unique names.
    +            if DEPTARGET > '10.5':
    +                for tkm in tkinter_moves:
    +                    if fn == tkm[0]:
    +                        moves_list.append(
    +                            (p, os.path.join(tkm[1], '_tkinter.so')))
    +
         if shared_lib_error:
             fatal("Unexpected shared library errors.")
     
    +    # Now do the moves.
    +    for ml in moves_list:
    +        shutil.move(ml[0], ml[1])
    +
         if PYTHON_3:
             LDVERSION=None
             VERSION=None
    @@ -1061,10 +1097,6 @@
         include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
         lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
     
    -    path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
    -                                'Python.framework', 'Versions',
    -                                version, 'lib', 'python%s'%(version,))
    -
         # fix Makefile
         path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
         fp = open(path, 'r')
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 12:27:56 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sat, 26 Oct 2013 12:27:56 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_null_merge?=
    Message-ID: <3d6JL40DsWz7Ljk@mail.python.org>
    
    http://hg.python.org/cpython/rev/64fb6a58ebf4
    changeset:   86655:64fb6a58ebf4
    parent:      86654:b599584ff1e3
    parent:      86653:150242784de0
    user:        Ned Deily 
    date:        Sat Oct 26 03:27:24 2013 -0700
    summary:
      null merge
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 14:21:12 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 14:21:12 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319330=3A_Handle_t?=
     =?utf-8?q?he_no-docstrings_case_in_tests?=
    Message-ID: <3d6Lrm0pQcz7LlK@mail.python.org>
    
    http://hg.python.org/cpython/rev/a9bbc2d0c1dc
    changeset:   86656:a9bbc2d0c1dc
    user:        Nick Coghlan 
    date:        Sat Oct 26 22:20:43 2013 +1000
    summary:
      Issue #19330: Handle the no-docstrings case in tests
    
    files:
      Lib/test/support/__init__.py |  10 ++++++--
      Lib/test/test_contextlib.py  |  28 ++++++++++-------------
      2 files changed, 19 insertions(+), 19 deletions(-)
    
    
    diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
    --- a/Lib/test/support/__init__.py
    +++ b/Lib/test/support/__init__.py
    @@ -1697,9 +1697,13 @@
     #=======================================================================
     # Check for the presence of docstrings.
     
    -HAVE_DOCSTRINGS = (check_impl_detail(cpython=False) or
    -                   sys.platform == 'win32' or
    -                   sysconfig.get_config_var('WITH_DOC_STRINGS'))
    +# Rather than trying to enumerate all the cases where docstrings may be
    +# disabled, we just check for that directly
    +
    +def _check_docstrings():
    +    """Just used to check if docstrings are enabled"""
    +
    +HAVE_DOCSTRINGS = (_check_docstrings.__doc__ is not None)
     
     requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS,
                                               "test requires docstrings")
    diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
    --- a/Lib/test/test_contextlib.py
    +++ b/Lib/test/test_contextlib.py
    @@ -14,20 +14,6 @@
     
     class ContextManagerTestCase(unittest.TestCase):
     
    -    def test_instance_docstring_given_function_docstring(self):
    -        # Issue 19330: ensure context manager instances have good docstrings
    -        # See http://bugs.python.org/issue19404 for why this doesn't currently
    -        # affect help() output :(
    -        def gen_with_docstring():
    -            """This has a docstring"""
    -            yield
    -        gen_docstring = gen_with_docstring.__doc__
    -        cm_with_docstring = contextmanager(gen_with_docstring)
    -        self.assertEqual(cm_with_docstring.__doc__, gen_docstring)
    -        obj = cm_with_docstring()
    -        self.assertEqual(obj.__doc__, gen_docstring)
    -        self.assertNotEqual(obj.__doc__, type(obj).__doc__)
    -
         def test_contextmanager_plain(self):
             state = []
             @contextmanager
    @@ -115,14 +101,20 @@
             self.assertEqual(baz.__name__,'baz')
             self.assertEqual(baz.foo, 'bar')
     
    -    @unittest.skipIf(sys.flags.optimize >= 2,
    -                     "Docstrings are omitted with -O2 and above")
    +    @support.requires_docstrings
         def test_contextmanager_doc_attrib(self):
             baz = self._create_contextmanager_attribs()
             self.assertEqual(baz.__doc__, "Whee!")
     
    +    @support.requires_docstrings
    +    def test_instance_docstring_given_cm_docstring(self):
    +        baz = self._create_contextmanager_attribs()(None)
    +        self.assertEqual(baz.__doc__, "Whee!")
    +
    +
     class ClosingTestCase(unittest.TestCase):
     
    +    @support.requires_docstrings
         def test_instance_docs(self):
             # Issue 19330: ensure context manager instances have good docstrings
             cm_docstring = closing.__doc__
    @@ -239,6 +231,7 @@
     
     class TestContextDecorator(unittest.TestCase):
     
    +    @support.requires_docstrings
         def test_instance_docs(self):
             # Issue 19330: ensure context manager instances have good docstrings
             cm_docstring = mycontext.__doc__
    @@ -398,6 +391,7 @@
     
     class TestExitStack(unittest.TestCase):
     
    +    @support.requires_docstrings
         def test_instance_docs(self):
             # Issue 19330: ensure context manager instances have good docstrings
             cm_docstring = ExitStack.__doc__
    @@ -665,6 +659,7 @@
     
     class TestRedirectStdout(unittest.TestCase):
     
    +    @support.requires_docstrings
         def test_instance_docs(self):
             # Issue 19330: ensure context manager instances have good docstrings
             cm_docstring = redirect_stdout.__doc__
    @@ -708,6 +703,7 @@
     
     class TestSuppress(unittest.TestCase):
     
    +    @support.requires_docstrings
         def test_instance_docs(self):
             # Issue 19330: ensure context manager instances have good docstrings
             cm_docstring = suppress.__doc__
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 16:28:15 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 16:28:15 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_=2319409=3A_add_miss?=
    	=?utf-8?q?ing_import_in_pkgutil?=
    Message-ID: <3d6PgM4V9wz7Ljc@mail.python.org>
    
    http://hg.python.org/cpython/rev/0c0cbba64b7b
    changeset:   86657:0c0cbba64b7b
    user:        Nick Coghlan 
    date:        Sun Oct 27 00:27:39 2013 +1000
    summary:
      Close #19409: add missing import in pkgutil
    
    files:
      Lib/pkgutil.py |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py
    --- a/Lib/pkgutil.py
    +++ b/Lib/pkgutil.py
    @@ -3,6 +3,7 @@
     from functools import singledispatch as simplegeneric
     import importlib
     import importlib.util
    +import importlib.machinery
     import os
     import os.path
     import sys
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 17:57:55 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sat, 26 Oct 2013 17:57:55 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Assorted_3=2E4_What=27s_Ne?=
    	=?utf-8?q?w_updates?=
    Message-ID: <3d6Rfq3KVsz7Ljt@mail.python.org>
    
    http://hg.python.org/cpython/rev/7ed1cb2015fa
    changeset:   86658:7ed1cb2015fa
    user:        Nick Coghlan 
    date:        Sun Oct 27 01:57:34 2013 +1000
    summary:
      Assorted 3.4 What's New updates
    
    - cross-references and attributions for inspect changes
    - note improvements to inspect and pydoc handling of
      metaclasses and dynamic attributes (courtesy of the
      enum PEP)
    - group all CPython implementation specific changes
      into a common section
    - add see also links for most of the PEPs
    - fix the see also link for the release PEP
    - add suitable caveats on Argument Clinic inclusion
    - clarify the change to __wrapped__ handling
    
    files:
      Doc/library/inspect.rst |    2 +
      Doc/whatsnew/3.4.rst    |  173 ++++++++++++++++++---------
      2 files changed, 116 insertions(+), 59 deletions(-)
    
    
    diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
    --- a/Doc/library/inspect.rst
    +++ b/Doc/library/inspect.rst
    @@ -1009,6 +1009,8 @@
        .. versionadded:: 3.3
     
     
    +.. _inspect-module-cli:
    +
     Command Line Interface
     ----------------------
     
    diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
    --- a/Doc/whatsnew/3.4.rst
    +++ b/Doc/whatsnew/3.4.rst
    @@ -75,7 +75,7 @@
     
     .. seealso::
     
    -   .. :pep:`4XX` - Python 3.4 Release Schedule
    +   :pep:`429` - Python 3.4 Release Schedule
     
     
     Summary -- Release highlights
    @@ -96,32 +96,30 @@
       :mod:`select` module primitives.
     * :mod:`statistics`: A basic numerically stable statistics library (:pep:`450`).
     
    -New built-in features:
    +New expected features for Python implementations:
     
    -* :ref:`PEP 442: Safe object finalization `.
    -* :ref:`PEP 445: Configurable memory allocators `.
     * :ref:`PEP 446: Make newly created file descriptors non-inheritable `.
    -
    -Implementation improvements:
    -
    -* A more efficient :mod:`marshal` format (:issue:`16475`).
    -* Improve finalization of Python modules to avoid setting their globals
    -  to None, in most cases (:issue:`18214`).
    -* "Argument Clinic", providing improved introspection support for builtin
    -  and standard library extension types implemented in C (:pep:`436`)
    +* command line option for :ref:`isolated mode `,
    +  (:issue:`16499`).
     
     Significantly Improved Library Modules:
     
    -* Single-dispatch generic functions (:pep:`443`)
    +* Single-dispatch generic functions in :mod:`functoools` (:pep:`443`)
     * SHA-3 (Keccak) support for :mod:`hashlib`.
     * TLSv1.1 and TLSv1.2 support for :mod:`ssl`.
     * :mod:`multiprocessing` now has option to avoid using :func:`os.fork`
       on Unix (:issue:`8713`).
     
    -Security improvements:
    +CPython implementation improvements:
     
    -* command line option for :ref:`isolated mode `,
    -  :issue:`16499`.
    +* :ref:`PEP 442: Safe object finalization `
    +* :ref:`PEP 445: Configurable memory allocators `
    +* Improve finalization of Python modules to avoid setting their globals
    +  to None, in most cases (:issue:`18214`).
    +* A more efficient :mod:`marshal` format (:issue:`16475`).
    +* "Argument Clinic", an initial step towards providing improved introspection
    +  support for builtin and standard library extension types implemented in C
    +  (:pep:`436`)
     
     Please read on for a comprehensive list of user-facing changes.
     
    @@ -130,41 +128,17 @@
     PEP 446: Make newly created file descriptors non-inheritable
     ============================================================
     
    -The :pep:`446` makes newly created file descriptors :ref:`non-inheritable
    +:pep:`446` makes newly created file descriptors :ref:`non-inheritable
     `.  New functions and methods:
     
     * :func:`os.get_inheritable`, :func:`os.set_inheritable`
     * :func:`os.get_handle_inheritable`, :func:`os.set_handle_inheritable`
     * :meth:`socket.socket.get_inheritable`, :meth:`socket.socket.set_inheritable`
     
    -
    -.. _pep-445:
    -
    -PEP 445: Add new APIs to customize Python memory allocators
    -===========================================================
    -
    -The :pep:`445` adds new Application Programming Interfaces (API) to customize
    -Python memory allocators.
    -
    -
    -.. _pep-442:
    -
    -PEP 442: Safe object finalization
    -=================================
    -
    -This PEP removes the current limitations and quirks of object finalization.
    -With it, objects with :meth:`__del__` methods, as well as generators
    -with :keyword:`finally` clauses, can be finalized when they are part of a
    -reference cycle.
    -
    -As part of this change, module globals are no longer forcibly set to
    -:const:`None` during interpreter shutdown, instead relying on the normal
    -operation of the cyclic garbage collector.
    -
     .. seealso::
     
    -   :pep:`442` - Safe object finalization
    -      PEP written and implemented by Antoine Pitrou
    +   :pep:`446` - Make newly created file descriptors non-inheritable
    +      PEP written and implemented by Victor Stinner.
     
     
     Other Language Changes
    @@ -200,13 +174,25 @@
     
     For Python 3.4, this module is considered a :term:`provisional API`.
     
    +.. seealso::
    +
    +   :pep:`3156` - Asynchronous IO Support Rebooted: the "asyncio" Module
    +      PEP written and implementation led by Guido van Rossum.
    +
     enum
     ----
     
    -The new :mod:`enum` module provides a standard implementation of enumeration
    -types, allowing other modules (such as :mod:`socket`) to provide more
    -informative error messages and better debugging support by replacing opaque
    -integer constants with backwards compatible enumeration values.
    +The new :mod:`enum` module (defined in :pep:`435`) provides a standard
    +implementation of enumeration types, allowing other modules (such as
    +:mod:`socket`) to provide more informative error messages and better
    +debugging support by replacing opaque integer constants with backwards
    +compatible enumeration values.
    +
    +.. seealso::
    +
    +   :pep:`435` - Adding an Enum type to the Python standard library
    +      PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman,
    +      implemented by Ethan Furman.
     
     
     selectors
    @@ -225,6 +211,11 @@
     supports calculation of the mean, median, mode, variance and standard
     deviation of a data series.
     
    +.. seealso::
    +
    +   :pep:`450` - Adding A Statistics Module To The Standard Library
    +      PEP written and implemented by Steven D'Aprano
    +
     
     Improved Modules
     ================
    @@ -366,13 +357,22 @@
     -------
     
     
    -The inspect module now offers a basic command line interface to quickly
    -display source code and other information for modules, classes and
    -functions.
    +The inspect module now offers a basic :ref:`command line interface
    +` to quickly display source code and other
    +information for modules, classes and functions. (Contributed by Claudiu Popa
    +and Nick Coghlan in :issue:`18626`)
     
     :func:`~inspect.unwrap` makes it easy to unravel wrapper function chains
     created by :func:`functools.wraps` (and any other API that sets the
    -``__wrapped__`` attribute on a wrapper function).
    +``__wrapped__`` attribute on a wrapper function). (Contributed by
    +Daniel Urban, Aaron Iles and Nick Coghlan in :issue:`13266`)
    +
    +As part of the implementation of the new :mod:`enum` module, the
    +:mod:`inspect` module now has substantially better support for custom
    +``__dir__`` methods and dynamic class attributes provided through
    +metaclasses (Contributed by Ethan Furman in :issue:`18929` and
    +:issue:`19030`)
    +
     
     mmap
     ----
    @@ -438,6 +438,15 @@
     sequences (:issue:`19132`).
     
     
    +pydoc
    +-----
    +
    +While significant changes have not been made to :mod:`pydoc` directly,
    +its handling of custom ``__dir__`` methods and various descriptor
    +behaviours has been improved substantially by the underlying changes in
    +the :mod:`inspect` module.
    +
    +
     resource
     --------
     
    @@ -626,8 +635,46 @@
       :issue:`9548`)
     
     
    -Build and C API Changes
    -=======================
    +CPython Implementation Changes
    +==============================
    +
    +
    +.. _pep-445:
    +
    +PEP 445: Customization of CPython memory allocators
    +---------------------------------------------------
    +
    +:pep:`445` adds new C level interfaces to customize memory allocation in
    +the CPython interpreter.
    +
    +.. seealso::
    +
    +   :pep:`445` - Add new APIs to customize Python memory allocators
    +      PEP written and implemented by Victor Stinner.
    +
    +
    +.. _pep-442:
    +
    +PEP 442: Safe object finalization
    +---------------------------------
    +
    +:pep:`442` removes the current limitations and quirks of object finalization
    +in CPython. With it, objects with :meth:`__del__` methods, as well as
    +generators with :keyword:`finally` clauses, can be finalized when they are
    +part of a reference cycle.
    +
    +As part of this change, module globals are no longer forcibly set to
    +:const:`None` during interpreter shutdown in most cases, instead relying
    +on the normal operation of the cyclic garbage collector.
    +
    +.. seealso::
    +
    +   :pep:`442` - Safe object finalization
    +      PEP written and implemented by Antoine Pitrou.
    +
    +
    +Other build and C API changes
    +-----------------------------
     
     Changes to Python's build process and to the C API include:
     
    @@ -645,6 +692,12 @@
       accurate signatures for builtins and standard library extension modules
       implemented in C.
     
    +  .. note::
    +     The Argument Clinic PEP is not fully up to date with the state of the
    +     implementation. This has been deemed acceptable by the release manager
    +     and core development team in this case, as Argument Clinic will not
    +     be made available as a public API for third party use in Python 3.4.
    +
     
     Deprecated
     ==========
    @@ -737,12 +790,14 @@
       exceptions now.
     
     * :func:`functools.update_wrapper` and :func:`functools.wraps` now correctly
    -  set the ``__wrapped__`` attribute even if the wrapped function had a
    -  wrapped attribute set. This means ``__wrapped__`` attributes now correctly
    -  link a stack of decorated functions rather than every ``__wrapped__``
    -  attribute in the chain referring to the innermost function. Introspection
    -  libraries that assumed the previous behaviour was intentional can use
    -  :func:`inspect.unwrap` to gain equivalent behaviour.
    +  set the ``__wrapped__`` attribute to the function being wrapper, even if
    +  that function also had its ``__wrapped__`` attribute set. This means
    +  ``__wrapped__`` attributes now correctly link a stack of decorated
    +  functions rather than every ``__wrapped__`` attribute in the chain
    +  referring to the innermost function. Introspection libraries that
    +  assumed the previous behaviour was intentional can use
    +  :func:`inspect.unwrap` to access the first function in the chain that has
    +  no ``__wrapped__`` attribute.
     
     * (C API) The result of the :c:data:`PyOS_ReadlineFunctionPointer` callback must
       now be a string allocated by :c:func:`PyMem_RawMalloc` or
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 18:56:29 2013
    From: python-checkins at python.org (tim.peters)
    Date: Sat, 26 Oct 2013 18:56:29 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Changed_a_comment_to_end_g?=
     =?utf-8?q?rammar_bikeshedding_=3B-=29?=
    Message-ID: <3d6SyP38y4z7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/86a855ee0456
    changeset:   86659:86a855ee0456
    user:        Tim Peters 
    date:        Sat Oct 26 11:56:16 2013 -0500
    summary:
      Changed a comment to end grammar bikeshedding ;-)
    
    files:
      Lib/threading.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/threading.py b/Lib/threading.py
    --- a/Lib/threading.py
    +++ b/Lib/threading.py
    @@ -1061,7 +1061,7 @@
                 self._wait_for_tstate_lock()
             else:
                 # the behavior of a negative timeout isn't documented, but
    -            # historically .join() has acted as if timeout=0 then
    +            # historically .join(timeout=x) for x<0 has acted as if timeout=0
                 self._wait_for_tstate_lock(timeout=max(timeout, 0))
     
         def _wait_for_tstate_lock(self, block=True, timeout=-1):
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 19:22:23 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 19:22:23 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_just_return_to?=
     =?utf-8?q?plevel_symbol_table_rather_than_all_blocks_=28closes_=2319393?=
     =?utf-8?q?=29?=
    Message-ID: <3d6TXH0s94z7Lll@mail.python.org>
    
    http://hg.python.org/cpython/rev/bc259b221cb8
    changeset:   86660:bc259b221cb8
    branch:      3.3
    parent:      86653:150242784de0
    user:        Benjamin Peterson 
    date:        Sat Oct 26 13:13:51 2013 -0400
    summary:
      just return toplevel symbol table rather than all blocks (closes #19393)
    
    files:
      Lib/symtable.py          |  5 +----
      Misc/NEWS                |  3 +++
      Modules/symtablemodule.c |  2 +-
      3 files changed, 5 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/symtable.py b/Lib/symtable.py
    --- a/Lib/symtable.py
    +++ b/Lib/symtable.py
    @@ -10,10 +10,7 @@
     __all__ = ["symtable", "SymbolTable", "Class", "Function", "Symbol"]
     
     def symtable(code, filename, compile_type):
    -    raw = _symtable.symtable(code, filename, compile_type)
    -    for top in raw.values():
    -        if top.name == 'top':
    -            break
    +    top = _symtable.symtable(code, filename, compile_type)
         return _newSymbolTable(top, filename)
     
     class SymbolTableFactory:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #19393: Fix symtable.symtable function to not be confused when there are
    +  functions or classes named "top".
    +
     - Issue #19339: telnetlib module is now using time.monotonic() when available
       to compute timeout.
     
    diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
    --- a/Modules/symtablemodule.c
    +++ b/Modules/symtablemodule.c
    @@ -32,7 +32,7 @@
         st = Py_SymtableString(str, filename, start);
         if (st == NULL)
             return NULL;
    -    t = st->st_blocks;
    +    t = (PyObject *)st->st_top;
         Py_INCREF(t);
         PyMem_Free((void *)st->st_future);
         PySymtable_Free(st);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 19:22:24 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 19:22:24 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_just_return_to?=
     =?utf-8?q?plevel_symbol_table_rather_than_all_blocks_=28closes_=2319393?=
     =?utf-8?q?=29?=
    Message-ID: <3d6TXJ2mpLz7LlK@mail.python.org>
    
    http://hg.python.org/cpython/rev/f1b7b5979e96
    changeset:   86661:f1b7b5979e96
    branch:      2.7
    parent:      86652:db5a50959dc9
    user:        Benjamin Peterson 
    date:        Sat Oct 26 13:13:51 2013 -0400
    summary:
      just return toplevel symbol table rather than all blocks (closes #19393)
    
    files:
      Lib/symtable.py          |  5 +----
      Misc/NEWS                |  3 +++
      Modules/symtablemodule.c |  2 +-
      3 files changed, 5 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/symtable.py b/Lib/symtable.py
    --- a/Lib/symtable.py
    +++ b/Lib/symtable.py
    @@ -10,10 +10,7 @@
     __all__ = ["symtable", "SymbolTable", "Class", "Function", "Symbol"]
     
     def symtable(code, filename, compile_type):
    -    raw = _symtable.symtable(code, filename, compile_type)
    -    for top in raw.itervalues():
    -        if top.name == 'top':
    -            break
    +    top = _symtable.symtable(code, filename, compile_type)
         return _newSymbolTable(top, filename)
     
     class SymbolTableFactory:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -40,6 +40,9 @@
     Library
     -------
     
    +- Issue #19393: Fix symtable.symtable function to not be confused when there are
    +  functions or classes named "top".
    +
     - Issue #19327: Fixed the working of regular expressions with too big charset.
     
     - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin
    diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
    --- a/Modules/symtablemodule.c
    +++ b/Modules/symtablemodule.c
    @@ -33,7 +33,7 @@
         st = Py_SymtableString(str, filename, start);
         if (st == NULL)
             return NULL;
    -    t = st->st_symbols;
    +    t = (PyObject *)st->st_top;
         Py_INCREF(t);
         PyMem_Free((void *)st->st_future);
         PySymtable_Free(st);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 19:22:25 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 19:22:25 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?b?KTogbWVyZ2UgMy4zICgjMTkzOTMp?=
    Message-ID: <3d6TXK4fQ3z7LlR@mail.python.org>
    
    http://hg.python.org/cpython/rev/f5c729dbe9fb
    changeset:   86662:f5c729dbe9fb
    parent:      86659:86a855ee0456
    parent:      86660:bc259b221cb8
    user:        Benjamin Peterson 
    date:        Sat Oct 26 13:22:08 2013 -0400
    summary:
      merge 3.3 (#19393)
    
    files:
      Lib/symtable.py          |  5 +----
      Misc/NEWS                |  3 +++
      Modules/symtablemodule.c |  2 +-
      3 files changed, 5 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/symtable.py b/Lib/symtable.py
    --- a/Lib/symtable.py
    +++ b/Lib/symtable.py
    @@ -10,10 +10,7 @@
     __all__ = ["symtable", "SymbolTable", "Class", "Function", "Symbol"]
     
     def symtable(code, filename, compile_type):
    -    raw = _symtable.symtable(code, filename, compile_type)
    -    for top in raw.values():
    -        if top.name == 'top':
    -            break
    +    top = _symtable.symtable(code, filename, compile_type)
         return _newSymbolTable(top, filename)
     
     class SymbolTableFactory:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -26,6 +26,9 @@
       contextlib.suppress context managers, which also ensures they provide
       reasonable help() output on instances
     
    +- Issue #19393: Fix symtable.symtable function to not be confused when there are
    +  functions or classes named "top".
    +
     - Issue #18685: Restore re performance to pre-PEP 393 levels.
     
     - Issue #19339: telnetlib module is now using time.monotonic() when available
    diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
    --- a/Modules/symtablemodule.c
    +++ b/Modules/symtablemodule.c
    @@ -34,7 +34,7 @@
         Py_DECREF(filename);
         if (st == NULL)
             return NULL;
    -    t = st->st_blocks;
    +    t = (PyObject *)st->st_top;
         Py_INCREF(t);
         PyMem_Free((void *)st->st_future);
         PySymtable_Free(st);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 19:45:02 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 19:45:02 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_update_pydoc-t?=
    	=?utf-8?q?opics?=
    Message-ID: <3d6V2Q0q55z7LkJ@mail.python.org>
    
    http://hg.python.org/cpython/rev/44543b0e4855
    changeset:   86663:44543b0e4855
    branch:      2.7
    parent:      86661:f1b7b5979e96
    user:        Benjamin Peterson 
    date:        Sat Oct 26 13:44:54 2013 -0400
    summary:
      update pydoc-topics
    
    files:
      Lib/pydoc_data/topics.py |  18 +++++++++---------
      1 files changed, 9 insertions(+), 9 deletions(-)
    
    
    diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py
    --- a/Lib/pydoc_data/topics.py
    +++ b/Lib/pydoc_data/topics.py
    @@ -1,4 +1,4 @@
    -# Autogenerated by Sphinx on Sat May 11 22:31:13 2013
    +# Autogenerated by Sphinx on Sat Oct 26 13:44:16 2013
     topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n   assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n   if __debug__:\n      if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n   if __debug__:\n      if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names.  In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O).  The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime.  Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal.  The value for the built-in\nvariable is determined when the interpreter starts.\n',
      'assignment': '\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n   assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n   target_list     ::= target ("," target)* [","]\n   target          ::= identifier\n              | "(" target_list ")"\n              | "[" target_list "]"\n              | attributeref\n              | subscription\n              | slicing\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable.  The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list is recursively defined as\nfollows.\n\n* If the target list is a single target: The object is assigned to\n  that target.\n\n* If the target list is a comma-separated list of targets: The object\n  must be an iterable with the same number of items as there are\n  targets in the target list, and the items are assigned, from left to\n  right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n  * If the name does not occur in a ``global`` statement in the\n    current code block: the name is bound to the object in the current\n    local namespace.\n\n  * Otherwise: the name is bound to the object in the current global\n    namespace.\n\n  The name is rebound if it was already bound.  This may cause the\n  reference count for the object previously bound to the name to reach\n  zero, causing the object to be deallocated and its destructor (if it\n  has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n  brackets: The object must be an iterable with the same number of\n  items as there are targets in the target list, and its items are\n  assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n  the reference is evaluated.  It should yield an object with\n  assignable attributes; if this is not the case, ``TypeError`` is\n  raised.  That object is then asked to assign the assigned object to\n  the given attribute; if it cannot perform the assignment, it raises\n  an exception (usually but not necessarily ``AttributeError``).\n\n  Note: If the object is a class instance and the attribute reference\n  occurs on both sides of the assignment operator, the RHS expression,\n  ``a.x`` can access either an instance attribute or (if no instance\n  attribute exists) a class attribute.  The LHS target ``a.x`` is\n  always set as an instance attribute, creating it if necessary.\n  Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n  same attribute: if the RHS expression refers to a class attribute,\n  the LHS creates a new instance attribute as the target of the\n  assignment:\n\n     class Cls:\n         x = 3             # class variable\n     inst = Cls()\n     inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3\n\n  This description does not necessarily apply to descriptor\n  attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n  reference is evaluated.  It should yield either a mutable sequence\n  object (such as a list) or a mapping object (such as a dictionary).\n  Next, the subscript expression is evaluated.\n\n  If the primary is a mutable sequence object (such as a list), the\n  subscript must yield a plain integer.  If it is negative, the\n  sequence\'s length is added to it. The resulting value must be a\n  nonnegative integer less than the sequence\'s length, and the\n  sequence is asked to assign the assigned object to its item with\n  that index.  If the index is out of range, ``IndexError`` is raised\n  (assignment to a subscripted sequence cannot add new items to a\n  list).\n\n  If the primary is a mapping object (such as a dictionary), the\n  subscript must have a type compatible with the mapping\'s key type,\n  and the mapping is then asked to create a key/datum pair which maps\n  the subscript to the assigned object.  This can either replace an\n  existing key/value pair with the same key value, or insert a new\n  key/value pair (if no key with the same value existed).\n\n* If the target is a slicing: The primary expression in the reference\n  is evaluated.  It should yield a mutable sequence object (such as a\n  list).  The assigned object should be a sequence object of the same\n  type.  Next, the lower and upper bound expressions are evaluated,\n  insofar they are present; defaults are zero and the sequence\'s\n  length.  The bounds should evaluate to (small) integers.  If either\n  bound is negative, the sequence\'s length is added to it. The\n  resulting bounds are clipped to lie between zero and the sequence\'s\n  length, inclusive.  Finally, the sequence object is asked to replace\n  the slice with the items of the assigned sequence.  The length of\n  the slice may be different from the length of the assigned sequence,\n  thus changing the length of the target sequence, if the object\n  allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe!  For instance, the\nfollowing program prints ``[0, 2]``:\n\n   x = [0, 1]\n   i = 0\n   i, x[i] = 1, 2\n   print x\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n   augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n   augtarget                 ::= identifier | attributeref | subscription | slicing\n   augop                     ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n             | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
      'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name.  See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them.  The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name.  For example, the identifier\n``__spam`` occurring in a class named ``Ham`` will be transformed to\n``_Ham__spam``.  This transformation is independent of the syntactical\ncontext in which the identifier is used.  If the transformed name is\nextremely long (longer than 255 characters), implementation defined\ntruncation may happen. If the class name consists only of underscores,\nno transformation is done.\n',
    @@ -18,7 +18,7 @@
      'calls': '\nCalls\n*****\n\nA call calls a callable object (e.g., a *function*) with a possibly\nempty series of *arguments*:\n\n   call                 ::= primary "(" [argument_list [","]\n            | expression genexpr_for] ")"\n   argument_list        ::= positional_arguments ["," keyword_arguments]\n                       ["," "*" expression] ["," keyword_arguments]\n                       ["," "**" expression]\n                     | keyword_arguments ["," "*" expression]\n                       ["," "**" expression]\n                     | "*" expression ["," "*" expression] ["," "**" expression]\n                     | "**" expression\n   positional_arguments ::= expression ("," expression)*\n   keyword_arguments    ::= keyword_item ("," keyword_item)*\n   keyword_item         ::= identifier "=" expression\n\nA trailing comma may be present after the positional and keyword\narguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and certain class instances\nthemselves are callable; extensions may define additional callable\nobject types).  All argument expressions are evaluated before the call\nis attempted.  Please refer to section *Function definitions* for the\nsyntax of formal *parameter* lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows.  First, a list of unfilled slots is\ncreated for the formal parameters.  If there are N positional\narguments, they are placed in the first N slots.  Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on).  If the slot is\nalready filled, a ``TypeError`` exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is ``None``, it fills the slot).  When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition.  (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.)  If there are any\nunfilled slots for which no default value is specified, a\n``TypeError`` exception is raised.  Otherwise, the list of filled\nslots is used as the argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword.  In CPython, this is the case\nfor functions implemented in C that use ``PyArg_ParseTuple()`` to\nparse their arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``*identifier`` is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``**identifier`` is present; in this case, that\nformal parameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax ``*expression`` appears in the function call,\n``expression`` must evaluate to an iterable.  Elements from this\niterable are treated as if they were additional positional arguments;\nif there are positional arguments *x1*, ..., *xN*, and ``expression``\nevaluates to a sequence *y1*, ..., *yM*, this is equivalent to a call\nwith M+N positional arguments *x1*, ..., *xN*, *y1*, ..., *yM*.\n\nA consequence of this is that although the ``*expression`` syntax may\nappear *after* some keyword arguments, it is processed *before* the\nkeyword arguments (and the ``**expression`` argument, if any -- see\nbelow).  So:\n\n   >>> def f(a, b):\n   ...  print a, b\n   ...\n   >>> f(b=1, *(2,))\n   2 1\n   >>> f(a=1, *(2,))\n   Traceback (most recent call last):\n     File "", line 1, in ?\n   TypeError: f() got multiple values for keyword argument \'a\'\n   >>> f(1, *(2,))\n   1 2\n\nIt is unusual for both keyword arguments and the ``*expression``\nsyntax to be used in the same call, so in practice this confusion does\nnot arise.\n\nIf the syntax ``**expression`` appears in the function call,\n``expression`` must evaluate to a mapping, the contents of which are\ntreated as additional keyword arguments.  In the case of a keyword\nappearing in both ``expression`` and as an explicit keyword argument,\na ``TypeError`` exception is raised.\n\nFormal parameters using the syntax ``*identifier`` or ``**identifier``\ncannot be used as positional argument slots or as keyword argument\nnames.  Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\n\nA call always returns some value, possibly ``None``, unless it raises\nan exception.  How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n   The code block for the function is executed, passing it the\n   argument list.  The first thing the code block will do is bind the\n   formal parameters to the arguments; this is described in section\n   *Function definitions*.  When the code block executes a ``return``\n   statement, this specifies the return value of the function call.\n\na built-in function or method:\n   The result is up to the interpreter; see *Built-in Functions* for\n   the descriptions of built-in functions and methods.\n\na class object:\n   A new instance of that class is returned.\n\na class instance method:\n   The corresponding user-defined function is called, with an argument\n   list that is one longer than the argument list of the call: the\n   instance becomes the first argument.\n\na class instance:\n   The class must define a ``__call__()`` method; the effect is then\n   the same as if that method was called.\n',
      'class': '\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [expression_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  It first evaluates the\ninheritance list, if present.  Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing.  The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.)  When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary.  The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances.  To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results.  For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions.  The evaluation rules for the decorator\nexpressions are the same as for functions.  The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
      'comparisons': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation.  Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n   comparison    ::= or_expr ( comp_operator or_expr )*\n   comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="\n                     | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted.  The ``<>`` spelling is considered obsolescent.\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects.  The objects need not have the same type.\nIf both are numbers, they are converted to a common type.  Otherwise,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n  (the result of the built-in function ``ord()``) of their characters.\n  Unicode and 8-bit strings are fully interoperable in this behavior.\n  [4]\n\n* Tuples and lists are compared lexicographically using comparison of\n  corresponding elements.  This means that to compare equal, each\n  element must compare equal and the two sequences must be of the same\n  type and have the same length.\n\n  If not equal, the sequences are ordered the same as their first\n  differing elements.  For example, ``cmp([1,2,x], [1,2,y])`` returns\n  the same as ``cmp(x,y)``.  If the corresponding element does not\n  exist, the shorter sequence is ordered first (for example, ``[1,2] <\n  [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if their sorted\n  (key, value) lists compare equal. [5] Outcomes other than equality\n  are resolved consistently, but are not otherwise defined. [6]\n\n* Most other objects of built-in types compare unequal unless they are\n  the same object; the choice whether one object is considered smaller\n  or larger than another one is made arbitrarily but consistently\n  within one execution of a program.\n\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise.  ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object.  However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence.  In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*.  An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``.  If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object.  ``x is\nnot y`` yields the inverse truth value. [7]\n',
    - 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way.  In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs.  ``try`` specifies exception handlers and/or\ncleanup code for a group of statements.  Function and class\ndefinitions are also syntactically compound statements.\n\nCompound statements consist of one or more \'clauses.\'  A clause\nconsists of a header and a \'suite.\'  The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon.  A suite is a group of statements controlled by a\nclause.  A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines.  Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n   if test1: if test2: print x\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print`` statements are executed:\n\n   if x < y < z: print x; print y; print z\n\nSummarizing:\n\n   compound_stmt ::= if_stmt\n                     | while_stmt\n                     | for_stmt\n                     | try_stmt\n                     | with_stmt\n                     | funcdef\n                     | classdef\n                     | decorated\n   suite         ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n   statement     ::= stmt_list NEWLINE | compound_stmt\n   stmt_list     ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n   if_stmt ::= "if" expression ":" suite\n               ( "elif" expression ":" suite )*\n               ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments, and then the suite is executed.  When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop.  Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists). An internal\n  counter is used to keep track of which item is used next, and this\n  is incremented on each iteration.  When this counter has reached the\n  length of the sequence the loop terminates.  This means that if the\n  suite deletes the current (or a previous) item from the sequence,\n  the next item will be skipped (since it gets the index of the\n  current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression [("as" | ",") target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object, or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified in that except clause, if present, and the except\nclause\'s suite is executed.  All except clauses must have an\nexecutable block.  When the end of this block is reached, execution\ncontinues normally after the entire try statement.  (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``.  Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program.  As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception, it is re-raised at the end\nof the ``finally`` clause. If the ``finally`` clause raises another\nexception or executes a ``return`` or ``break`` statement, the saved\nexception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nNew in version 2.5.\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n   with_stmt ::= "with" with_item ("," with_item)* ":" suite\n   with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n   is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n   value from ``__enter__()`` is assigned to it.\n\n   Note: The ``with`` statement guarantees that if the ``__enter__()``\n     method returns without an error, then ``__exit__()`` will always\n     be called. Thus, if an error occurs during the assignment to the\n     target list, it will be treated the same as an error occurring\n     within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n   exception caused the suite to be exited, its type, value, and\n   traceback are passed as arguments to ``__exit__()``. Otherwise,\n   three ``None`` arguments are supplied.\n\n   If the suite was exited due to an exception, and the return value\n   from the ``__exit__()`` method was false, the exception is\n   reraised. If the return value was true, the exception is\n   suppressed, and execution continues with the statement following\n   the ``with`` statement.\n\n   If the suite was exited for any reason other than an exception, the\n   return value from ``__exit__()`` is ignored, and execution proceeds\n   at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n   with A() as a, B() as b:\n       suite\n\nis equivalent to\n\n   with A() as a:\n       with B() as b:\n           suite\n\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n  ``with_statement`` feature has been enabled.  It is always enabled\n  in Python 2.6.\n\nChanged in version 2.7: Support for multiple context expressions.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   decorated      ::= decorators (classdef | funcdef)\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n   funcdef        ::= "def" funcname "(" [parameter_list] ")" ":" suite\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      (  "*" identifier ["," "**" identifier]\n                      | "**" identifier\n                      | defparameter [","] )\n   defparameter   ::= parameter ["=" expression]\n   sublist        ::= parameter ("," parameter)* [","]\n   parameter      ::= identifier | "(" sublist ")"\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code:\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to:\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more top-level *parameters* have the form *parameter*\n``=`` *expression*, the function is said to have "default parameter\nvalues."  For a parameter with a default value, the corresponding\n*argument* may be omitted from a call, in which case the parameter\'s\ndefault value is substituted.  If a parameter has a default value, all\nfollowing parameters must also have a default value --- this is a\nsyntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.**  This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this  is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda forms,\ndescribed in section *Lambdas*.  Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form.  The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [expression_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  It first evaluates the\ninheritance list, if present.  Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing.  The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.)  When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary.  The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances.  To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results.  For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions.  The evaluation rules for the decorator\nexpressions are the same as for functions.  The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
    + 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way.  In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs.  ``try`` specifies exception handlers and/or\ncleanup code for a group of statements.  Function and class\ndefinitions are also syntactically compound statements.\n\nCompound statements consist of one or more \'clauses.\'  A clause\nconsists of a header and a \'suite.\'  The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon.  A suite is a group of statements controlled by a\nclause.  A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines.  Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n   if test1: if test2: print x\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print`` statements are executed:\n\n   if x < y < z: print x; print y; print z\n\nSummarizing:\n\n   compound_stmt ::= if_stmt\n                     | while_stmt\n                     | for_stmt\n                     | try_stmt\n                     | with_stmt\n                     | funcdef\n                     | classdef\n                     | decorated\n   suite         ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n   statement     ::= stmt_list NEWLINE | compound_stmt\n   stmt_list     ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n   if_stmt ::= "if" expression ":" suite\n               ( "elif" expression ":" suite )*\n               ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments, and then the suite is executed.  When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop.  Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists). An internal\n  counter is used to keep track of which item is used next, and this\n  is incremented on each iteration.  When this counter has reached the\n  length of the sequence the loop terminates.  This means that if the\n  suite deletes the current (or a previous) item from the sequence,\n  the next item will be skipped (since it gets the index of the\n  current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression [("as" | ",") target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object, or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified in that except clause, if present, and the except\nclause\'s suite is executed.  All except clauses must have an\nexecutable block.  When the end of this block is reached, execution\ncontinues normally after the entire try statement.  (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``.  Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program.  As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception, it is re-raised at the end\nof the ``finally`` clause. If the ``finally`` clause raises another\nexception or executes a ``return`` or ``break`` statement, the saved\nexception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nNew in version 2.5.\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n   with_stmt ::= "with" with_item ("," with_item)* ":" suite\n   with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n   is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n   value from ``__enter__()`` is assigned to it.\n\n   Note: The ``with`` statement guarantees that if the ``__enter__()``\n     method returns without an error, then ``__exit__()`` will always\n     be called. Thus, if an error occurs during the assignment to the\n     target list, it will be treated the same as an error occurring\n     within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n   exception caused the suite to be exited, its type, value, and\n   traceback are passed as arguments to ``__exit__()``. Otherwise,\n   three ``None`` arguments are supplied.\n\n   If the suite was exited due to an exception, and the return value\n   from the ``__exit__()`` method was false, the exception is\n   reraised. If the return value was true, the exception is\n   suppressed, and execution continues with the statement following\n   the ``with`` statement.\n\n   If the suite was exited for any reason other than an exception, the\n   return value from ``__exit__()`` is ignored, and execution proceeds\n   at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n   with A() as a, B() as b:\n       suite\n\nis equivalent to\n\n   with A() as a:\n       with B() as b:\n           suite\n\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n  ``with_statement`` feature has been enabled.  It is always enabled\n  in Python 2.6.\n\nChanged in version 2.7: Support for multiple context expressions.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   decorated      ::= decorators (classdef | funcdef)\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n   funcdef        ::= "def" funcname "(" [parameter_list] ")" ":" suite\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      (  "*" identifier ["," "**" identifier]\n                      | "**" identifier\n                      | defparameter [","] )\n   defparameter   ::= parameter ["=" expression]\n   sublist        ::= parameter ("," parameter)* [","]\n   parameter      ::= identifier | "(" sublist ")"\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code:\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to:\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more top-level *parameters* have the form *parameter*\n``=`` *expression*, the function is said to have "default parameter\nvalues."  For a parameter with a default value, the corresponding\n*argument* may be omitted from a call, in which case the parameter\'s\ndefault value is substituted.  If a parameter has a default value, all\nfollowing parameters must also have a default value --- this is a\nsyntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.**  This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this  is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda\nexpressions, described in section *Lambdas*.  Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression.  The "``def``" form is actually more powerful since it\nallows the execution of multiple statements.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [expression_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  It first evaluates the\ninheritance list, if present.  Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing.  The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.)  When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary.  The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances.  To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results.  For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions.  The evaluation rules for the decorator\nexpressions are the same as for functions.  The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
      'context-managers': '\nWith Statement Context Managers\n*******************************\n\nNew in version 2.5.\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code.  Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n   Enter the runtime context related to this object. The ``with``\n   statement will bind this method\'s return value to the target(s)\n   specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n   Exit the runtime context related to this object. The parameters\n   describe the exception that caused the context to be exited. If the\n   context was exited without an exception, all three arguments will\n   be ``None``.\n\n   If an exception is supplied, and the method wishes to suppress the\n   exception (i.e., prevent it from being propagated), it should\n   return a true value. Otherwise, the exception will be processed\n   normally upon exit from this method.\n\n   Note that ``__exit__()`` methods should not reraise the passed-in\n   exception; this is the caller\'s responsibility.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n',
      'continue': '\nThe ``continue`` statement\n**************************\n\n   continue_stmt ::= "continue"\n\n``continue`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition or\n``finally`` clause within that loop.  It continues with the next cycle\nof the nearest enclosing loop.\n\nWhen ``continue`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nstarting the next loop cycle.\n',
      'conversions': '\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," the arguments\nare coerced using the coercion rules listed at  *Coercion rules*.  If\nboth arguments are standard numeric types, the following coercions are\napplied:\n\n* If either argument is a complex number, the other is converted to\n  complex;\n\n* otherwise, if either argument is a floating point number, the other\n  is converted to floating point;\n\n* otherwise, if either argument is a long integer, the other is\n  converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n  necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\n',
    @@ -33,8 +33,8 @@
      'exprlists': '\nExpression lists\n****************\n\n   expression_list ::= expression ( "," expression )* [","]\n\nAn expression list containing at least one comma yields a tuple.  The\nlength of the tuple is the number of expressions in the list.  The\nexpressions are evaluated from left to right.\n\nThe trailing comma is required only to create a single tuple (a.k.a. a\n*singleton*); it is optional in all other cases.  A single expression\nwithout a trailing comma doesn\'t create a tuple, but rather yields the\nvalue of that expression. (To create an empty tuple, use an empty pair\nof parentheses: ``()``.)\n',
      'floating': '\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n   floatnumber   ::= pointfloat | exponentfloat\n   pointfloat    ::= [intpart] fraction | intpart "."\n   exponentfloat ::= (intpart | pointfloat) exponent\n   intpart       ::= digit+\n   fraction      ::= "." digit+\n   exponent      ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts of floating point numbers can\nlook like octal integers, but are interpreted using radix 10.  For\nexample, ``077e010`` is legal, and denotes the same number as\n``77e10``. The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n   3.14    10.    .001    1e100    3.14e-10    0e0\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator ``-`` and the\nliteral ``1``.\n',
      'for': '\nThe ``for`` statement\n*********************\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments, and then the suite is executed.  When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop.  Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists). An internal\n  counter is used to keep track of which item is used next, and this\n  is incremented on each iteration.  When this counter has reached the\n  length of the sequence the loop terminates.  This means that if the\n  suite deletes the current (or a previous) item from the sequence,\n  the next item will be skipped (since it gets the index of the\n  current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n',
    - 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output.  If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n      replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n      field_name        ::= arg_name ("." attribute_name | "[" element_index "]")*\n      arg_name          ::= [identifier | integer]\n      attribute_name    ::= identifier\n      element_index     ::= integer | index_string\n      index_string      ::=  +\n      conversion        ::= "r" | "s"\n      format_spec       ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a  *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``.  These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword.  If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument.  If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 2.7: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n   "First, thou shalt count to {0}" # References first positional argument\n   "Bring me a {}"                  # Implicitly references the first positional argument\n   "From {} to {}"                  # Same as "From {0} to {1}"\n   "My quest is {name}"             # References keyword argument \'name\'\n   "Weight in tons {0.weight}"      # \'weight\' attribute of first positional arg\n   "Units destroyed: {players[0]}"  # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself.  However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting.  By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\n\nSome examples:\n\n   "Harold\'s a clever {0!s}"        # Calls str() on the argument first\n   "Bring out the holy {name!r}"    # Calls repr() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on.  Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed.  The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*).  They can also be passed directly to the\nbuilt-in ``format()`` function.  Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n   format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n   fill        ::= \n   align       ::= "<" | ">" | "=" | "^"\n   sign        ::= "+" | "-" | " "\n   width       ::= integer\n   precision   ::= integer\n   type        ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'.  The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options.  If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'<\'``   | Forces the field to be left-aligned within the available   |\n   |           | space (this is the default for most objects).              |\n   +-----------+------------------------------------------------------------+\n   | ``\'>\'``   | Forces the field to be right-aligned within the available  |\n   |           | space (this is the default for numbers).                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'=\'``   | Forces the padding to be placed after the sign (if any)    |\n   |           | but before the digits.  This is used for printing fields   |\n   |           | in the form \'+000000120\'. This alignment option is only    |\n   |           | valid for numeric types.                                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'^\'``   | Forces the field to be centered within the available       |\n   |           | space.                                                     |\n   +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'+\'``   | indicates that a sign should be used for both positive as  |\n   |           | well as negative numbers.                                  |\n   +-----------+------------------------------------------------------------+\n   | ``\'-\'``   | indicates that a sign should be used only for negative     |\n   |           | numbers (this is the default behavior).                    |\n   +-----------+------------------------------------------------------------+\n   | space     | indicates that a leading space should be used on positive  |\n   |           | numbers, and a minus sign on negative numbers.             |\n   +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option is only valid for integers, and only for binary,\noctal, or hexadecimal output.  If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 2.7: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width.  If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types.  This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'s\'``   | String format. This is the default type for strings and    |\n   |           | may be omitted.                                            |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'s\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'b\'``   | Binary format. Outputs the number in base 2.               |\n   +-----------+------------------------------------------------------------+\n   | ``\'c\'``   | Character. Converts the integer to the corresponding       |\n   |           | unicode character before printing.                         |\n   +-----------+------------------------------------------------------------+\n   | ``\'d\'``   | Decimal Integer. Outputs the number in base 10.            |\n   +-----------+------------------------------------------------------------+\n   | ``\'o\'``   | Octal format. Outputs the number in base 8.                |\n   +-----------+------------------------------------------------------------+\n   | ``\'x\'``   | Hex format. Outputs the number in base 16, using lower-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'X\'``   | Hex format. Outputs the number in base 16, using upper-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'d\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'d\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'e\'``   | Exponent notation. Prints the number in scientific         |\n   |           | notation using the letter \'e\' to indicate the exponent.    |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'E\'``   | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n   |           | case \'E\' as the separator character.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'f\'``   | Fixed point. Displays the number as a fixed-point number.  |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'F\'``   | Fixed point. Same as ``\'f\'``.                              |\n   +-----------+------------------------------------------------------------+\n   | ``\'g\'``   | General format.  For a given precision ``p >= 1``, this    |\n   |           | rounds the number to ``p`` significant digits and then     |\n   |           | formats the result in either fixed-point format or in      |\n   |           | scientific notation, depending on its magnitude.  The      |\n   |           | precise rules are as follows: suppose that the result      |\n   |           | formatted with presentation type ``\'e\'`` and precision     |\n   |           | ``p-1`` would have exponent ``exp``.  Then if ``-4 <= exp  |\n   |           | < p``, the number is formatted with presentation type      |\n   |           | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number   |\n   |           | is formatted with presentation type ``\'e\'`` and precision  |\n   |           | ``p-1``. In both cases insignificant trailing zeros are    |\n   |           | removed from the significand, and the decimal point is     |\n   |           | also removed if there are no remaining digits following    |\n   |           | it.  Positive and negative infinity, positive and negative |\n   |           | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n   |           | ``-0`` and ``nan`` respectively, regardless of the         |\n   |           | precision.  A precision of ``0`` is treated as equivalent  |\n   |           | to a precision of ``1``.  The default precision is ``6``.  |\n   +-----------+------------------------------------------------------------+\n   | ``\'G\'``   | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n   |           | if the number gets too large. The representations of       |\n   |           | infinity and NaN are uppercased, too.                      |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'g\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | ``\'%\'``   | Percentage. Multiplies the number by 100 and displays in   |\n   |           | fixed (``\'f\'``) format, followed by a percent sign.        |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'g\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n   >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n   \'a, b, c\'\n   >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\')  # 2.7+ only\n   \'a, b, c\'\n   >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n   \'c, b, a\'\n   >>> \'{2}, {1}, {0}\'.format(*\'abc\')      # unpacking argument sequence\n   \'c, b, a\'\n   >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\')   # arguments\' indices can be repeated\n   \'abracadabra\'\n\nAccessing arguments by name:\n\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n   \'Coordinates: 37.24N, -115.81W\'\n   >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n   \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n   >>> c = 3-5j\n   >>> (\'The complex number {0} is formed from the real part {0.real} \'\n   ...  \'and the imaginary part {0.imag}.\').format(c)\n   \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n   >>> class Point(object):\n   ...     def __init__(self, x, y):\n   ...         self.x, self.y = x, y\n   ...     def __str__(self):\n   ...         return \'Point({self.x}, {self.y})\'.format(self=self)\n   ...\n   >>> str(Point(4, 2))\n   \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n   >>> coord = (3, 5)\n   >>> \'X: {0[0]};  Y: {0[1]}\'.format(coord)\n   \'X: 3;  Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n   >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n   "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n   >>> \'{:<30}\'.format(\'left aligned\')\n   \'left aligned                  \'\n   >>> \'{:>30}\'.format(\'right aligned\')\n   \'                 right aligned\'\n   >>> \'{:^30}\'.format(\'centered\')\n   \'           centered           \'\n   >>> \'{:*^30}\'.format(\'centered\')  # use \'*\' as a fill char\n   \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n   >>> \'{:+f}; {:+f}\'.format(3.14, -3.14)  # show it always\n   \'+3.140000; -3.140000\'\n   >>> \'{: f}; {: f}\'.format(3.14, -3.14)  # show a space for positive numbers\n   \' 3.140000; -3.140000\'\n   >>> \'{:-f}; {:-f}\'.format(3.14, -3.14)  # show only the minus -- same as \'{:f}; {:f}\'\n   \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n   >>> # format also supports binary numbers\n   >>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)\n   \'int: 42;  hex: 2a;  oct: 52;  bin: 101010\'\n   >>> # with 0x, 0o, or 0b as prefix:\n   >>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)\n   \'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n   >>> \'{:,}\'.format(1234567890)\n   \'1,234,567,890\'\n\nExpressing a percentage:\n\n   >>> points = 19.5\n   >>> total = 22\n   >>> \'Correct answers: {:.2%}\'.format(points/total)\n   \'Correct answers: 88.64%\'\n\nUsing type-specific formatting:\n\n   >>> import datetime\n   >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n   >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n   \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n   >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n   ...     \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n   ...\n   \'left<<<<<<<<<<<<\'\n   \'^^^^^center^^^^^\'\n   \'>>>>>>>>>>>right\'\n   >>>\n   >>> octets = [192, 168, 0, 1]\n   >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n   \'C0A80001\'\n   >>> int(_, 16)\n   3232235521\n   >>>\n   >>> width = 5\n   >>> for num in range(5,12):\n   ...     for base in \'dXob\':\n   ...         print \'{0:{width}{base}}\'.format(num, base=base, width=width),\n   ...     print\n   ...\n       5     5     5   101\n       6     6     6   110\n       7     7     7   111\n       8     8    10  1000\n       9     9    11  1001\n      10     A    12  1010\n      11     B    13  1011\n',
    - 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   decorated      ::= decorators (classdef | funcdef)\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n   funcdef        ::= "def" funcname "(" [parameter_list] ")" ":" suite\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      (  "*" identifier ["," "**" identifier]\n                      | "**" identifier\n                      | defparameter [","] )\n   defparameter   ::= parameter ["=" expression]\n   sublist        ::= parameter ("," parameter)* [","]\n   parameter      ::= identifier | "(" sublist ")"\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code:\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to:\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more top-level *parameters* have the form *parameter*\n``=`` *expression*, the function is said to have "default parameter\nvalues."  For a parameter with a default value, the corresponding\n*argument* may be omitted from a call, in which case the parameter\'s\ndefault value is substituted.  If a parameter has a default value, all\nfollowing parameters must also have a default value --- this is a\nsyntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.**  This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this  is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda forms,\ndescribed in section *Lambdas*.  Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form.  The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n',
    + 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output.  If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n      replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n      field_name        ::= arg_name ("." attribute_name | "[" element_index "]")*\n      arg_name          ::= [identifier | integer]\n      attribute_name    ::= identifier\n      element_index     ::= integer | index_string\n      index_string      ::=  +\n      conversion        ::= "r" | "s"\n      format_spec       ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a  *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``.  These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword.  If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument.  If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 2.7: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n   "First, thou shalt count to {0}" # References first positional argument\n   "Bring me a {}"                  # Implicitly references the first positional argument\n   "From {} to {}"                  # Same as "From {0} to {1}"\n   "My quest is {name}"             # References keyword argument \'name\'\n   "Weight in tons {0.weight}"      # \'weight\' attribute of first positional arg\n   "Units destroyed: {players[0]}"  # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself.  However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting.  By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\n\nSome examples:\n\n   "Harold\'s a clever {0!s}"        # Calls str() on the argument first\n   "Bring out the holy {name!r}"    # Calls repr() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on.  Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed.  The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*).  They can also be passed directly to the\nbuilt-in ``format()`` function.  Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n   format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n   fill        ::= \n   align       ::= "<" | ">" | "=" | "^"\n   sign        ::= "+" | "-" | " "\n   width       ::= integer\n   precision   ::= integer\n   type        ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nIf a valid *align* value is specified, it can be preceeded by a *fill*\ncharacter that can be any character and defaults to a space if\nomitted. Note that it is not possible to use ``{`` and ``}`` as *fill*\nchar while using the ``str.format()`` method; this limitation however\ndoesn\'t affect the ``format()`` function.\n\nThe meaning of the various alignment options is as follows:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'<\'``   | Forces the field to be left-aligned within the available   |\n   |           | space (this is the default for most objects).              |\n   +-----------+------------------------------------------------------------+\n   | ``\'>\'``   | Forces the field to be right-aligned within the available  |\n   |           | space (this is the default for numbers).                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'=\'``   | Forces the padding to be placed after the sign (if any)    |\n   |           | but before the digits.  This is used for printing fields   |\n   |           | in the form \'+000000120\'. This alignment option is only    |\n   |           | valid for numeric types.                                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'^\'``   | Forces the field to be centered within the available       |\n   |           | space.                                                     |\n   +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'+\'``   | indicates that a sign should be used for both positive as  |\n   |           | well as negative numbers.                                  |\n   +-----------+------------------------------------------------------------+\n   | ``\'-\'``   | indicates that a sign should be used only for negative     |\n   |           | numbers (this is the default behavior).                    |\n   +-----------+------------------------------------------------------------+\n   | space     | indicates that a leading space should be used on positive  |\n   |           | numbers, and a minus sign on negative numbers.             |\n   +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option is only valid for integers, and only for binary,\noctal, or hexadecimal output.  If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 2.7: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width.  If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types.  This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'s\'``   | String format. This is the default type for strings and    |\n   |           | may be omitted.                                            |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'s\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'b\'``   | Binary format. Outputs the number in base 2.               |\n   +-----------+------------------------------------------------------------+\n   | ``\'c\'``   | Character. Converts the integer to the corresponding       |\n   |           | unicode character before printing.                         |\n   +-----------+------------------------------------------------------------+\n   | ``\'d\'``   | Decimal Integer. Outputs the number in base 10.            |\n   +-----------+------------------------------------------------------------+\n   | ``\'o\'``   | Octal format. Outputs the number in base 8.                |\n   +-----------+------------------------------------------------------------+\n   | ``\'x\'``   | Hex format. Outputs the number in base 16, using lower-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'X\'``   | Hex format. Outputs the number in base 16, using upper-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'d\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'d\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'e\'``   | Exponent notation. Prints the number in scientific         |\n   |           | notation using the letter \'e\' to indicate the exponent.    |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'E\'``   | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n   |           | case \'E\' as the separator character.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'f\'``   | Fixed point. Displays the number as a fixed-point number.  |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'F\'``   | Fixed point. Same as ``\'f\'``.                              |\n   +-----------+------------------------------------------------------------+\n   | ``\'g\'``   | General format.  For a given precision ``p >= 1``, this    |\n   |           | rounds the number to ``p`` significant digits and then     |\n   |           | formats the result in either fixed-point format or in      |\n   |           | scientific notation, depending on its magnitude.  The      |\n   |           | precise rules are as follows: suppose that the result      |\n   |           | formatted with presentation type ``\'e\'`` and precision     |\n   |           | ``p-1`` would have exponent ``exp``.  Then if ``-4 <= exp  |\n   |           | < p``, the number is formatted with presentation type      |\n   |           | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number   |\n   |           | is formatted with presentation type ``\'e\'`` and precision  |\n   |           | ``p-1``. In both cases insignificant trailing zeros are    |\n   |           | removed from the significand, and the decimal point is     |\n   |           | also removed if there are no remaining digits following    |\n   |           | it.  Positive and negative infinity, positive and negative |\n   |           | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n   |           | ``-0`` and ``nan`` respectively, regardless of the         |\n   |           | precision.  A precision of ``0`` is treated as equivalent  |\n   |           | to a precision of ``1``.  The default precision is ``6``.  |\n   +-----------+------------------------------------------------------------+\n   | ``\'G\'``   | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n   |           | if the number gets too large. The representations of       |\n   |           | infinity and NaN are uppercased, too.                      |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'g\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | ``\'%\'``   | Percentage. Multiplies the number by 100 and displays in   |\n   |           | fixed (``\'f\'``) format, followed by a percent sign.        |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'g\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n   >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n   \'a, b, c\'\n   >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\')  # 2.7+ only\n   \'a, b, c\'\n   >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n   \'c, b, a\'\n   >>> \'{2}, {1}, {0}\'.format(*\'abc\')      # unpacking argument sequence\n   \'c, b, a\'\n   >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\')   # arguments\' indices can be repeated\n   \'abracadabra\'\n\nAccessing arguments by name:\n\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n   \'Coordinates: 37.24N, -115.81W\'\n   >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n   \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n   >>> c = 3-5j\n   >>> (\'The complex number {0} is formed from the real part {0.real} \'\n   ...  \'and the imaginary part {0.imag}.\').format(c)\n   \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n   >>> class Point(object):\n   ...     def __init__(self, x, y):\n   ...         self.x, self.y = x, y\n   ...     def __str__(self):\n   ...         return \'Point({self.x}, {self.y})\'.format(self=self)\n   ...\n   >>> str(Point(4, 2))\n   \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n   >>> coord = (3, 5)\n   >>> \'X: {0[0]};  Y: {0[1]}\'.format(coord)\n   \'X: 3;  Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n   >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n   "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n   >>> \'{:<30}\'.format(\'left aligned\')\n   \'left aligned                  \'\n   >>> \'{:>30}\'.format(\'right aligned\')\n   \'                 right aligned\'\n   >>> \'{:^30}\'.format(\'centered\')\n   \'           centered           \'\n   >>> \'{:*^30}\'.format(\'centered\')  # use \'*\' as a fill char\n   \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n   >>> \'{:+f}; {:+f}\'.format(3.14, -3.14)  # show it always\n   \'+3.140000; -3.140000\'\n   >>> \'{: f}; {: f}\'.format(3.14, -3.14)  # show a space for positive numbers\n   \' 3.140000; -3.140000\'\n   >>> \'{:-f}; {:-f}\'.format(3.14, -3.14)  # show only the minus -- same as \'{:f}; {:f}\'\n   \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n   >>> # format also supports binary numbers\n   >>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)\n   \'int: 42;  hex: 2a;  oct: 52;  bin: 101010\'\n   >>> # with 0x, 0o, or 0b as prefix:\n   >>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)\n   \'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n   >>> \'{:,}\'.format(1234567890)\n   \'1,234,567,890\'\n\nExpressing a percentage:\n\n   >>> points = 19.5\n   >>> total = 22\n   >>> \'Correct answers: {:.2%}\'.format(points/total)\n   \'Correct answers: 88.64%\'\n\nUsing type-specific formatting:\n\n   >>> import datetime\n   >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n   >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n   \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n   >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n   ...     \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n   ...\n   \'left<<<<<<<<<<<<\'\n   \'^^^^^center^^^^^\'\n   \'>>>>>>>>>>>right\'\n   >>>\n   >>> octets = [192, 168, 0, 1]\n   >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n   \'C0A80001\'\n   >>> int(_, 16)\n   3232235521\n   >>>\n   >>> width = 5\n   >>> for num in range(5,12):\n   ...     for base in \'dXob\':\n   ...         print \'{0:{width}{base}}\'.format(num, base=base, width=width),\n   ...     print\n   ...\n       5     5     5   101\n       6     6     6   110\n       7     7     7   111\n       8     8    10  1000\n       9     9    11  1001\n      10     A    12  1010\n      11     B    13  1011\n',
    + 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   decorated      ::= decorators (classdef | funcdef)\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n   funcdef        ::= "def" funcname "(" [parameter_list] ")" ":" suite\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      (  "*" identifier ["," "**" identifier]\n                      | "**" identifier\n                      | defparameter [","] )\n   defparameter   ::= parameter ["=" expression]\n   sublist        ::= parameter ("," parameter)* [","]\n   parameter      ::= identifier | "(" sublist ")"\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code:\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to:\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more top-level *parameters* have the form *parameter*\n``=`` *expression*, the function is said to have "default parameter\nvalues."  For a parameter with a default value, the corresponding\n*argument* may be omitted from a call, in which case the parameter\'s\ndefault value is substituted.  If a parameter has a default value, all\nfollowing parameters must also have a default value --- this is a\nsyntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.**  This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this  is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda\nexpressions, described in section *Lambdas*.  Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression.  The "``def``" form is actually more powerful since it\nallows the execution of multiple statements.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n',
      'global': '\nThe ``global`` statement\n************************\n\n   global_stmt ::= "global" identifier ("," identifier)*\n\nThe ``global`` statement is a declaration which holds for the entire\ncurrent code block.  It means that the listed identifiers are to be\ninterpreted as globals.  It would be impossible to assign to a global\nvariable without ``global``, although free variables may refer to\nglobals without being declared global.\n\nNames listed in a ``global`` statement must not be used in the same\ncode block textually preceding that ``global`` statement.\n\nNames listed in a ``global`` statement must not be defined as formal\nparameters or in a ``for`` loop control target, ``class`` definition,\nfunction definition, or ``import`` statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the latter two restrictions, but programs should not abuse\nthis freedom, as future implementations may enforce them or silently\nchange the meaning of the program.\n\n**Programmer\'s note:** the ``global`` is a directive to the parser.\nIt applies only to code parsed at the same time as the ``global``\nstatement. In particular, a ``global`` statement contained in an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement.  The same applies to the ``eval()``,\n``execfile()`` and ``compile()`` functions.\n',
      'id-classes': '\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings.  These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n   Not imported by ``from module import *``.  The special identifier\n   ``_`` is used in the interactive interpreter to store the result of\n   the last evaluation; it is stored in the ``__builtin__`` module.\n   When not in interactive mode, ``_`` has no special meaning and is\n   not defined. See section *The import statement*.\n\n   Note: The name ``_`` is often used in conjunction with\n     internationalization; refer to the documentation for the\n     ``gettext`` module for more information on this convention.\n\n``__*__``\n   System-defined names. These names are defined by the interpreter\n   and its implementation (including the standard library).  Current\n   system names are discussed in the *Special method names* section\n   and elsewhere.  More will likely be defined in future versions of\n   Python.  *Any* use of ``__*__`` names, in any context, that does\n   not follow explicitly documented use, is subject to breakage\n   without warning.\n\n``__*``\n   Class-private names.  Names in this category, when used within the\n   context of a class definition, are re-written to use a mangled form\n   to help avoid name clashes between "private" attributes of base and\n   derived classes. See section *Identifiers (Names)*.\n',
      'identifiers': '\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions:\n\n   identifier ::= (letter|"_") (letter | digit | "_")*\n   letter     ::= lowercase | uppercase\n   lowercase  ::= "a"..."z"\n   uppercase  ::= "A"..."Z"\n   digit      ::= "0"..."9"\n\nIdentifiers are unlimited in length.  Case is significant.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers.  They must\nbe spelled exactly as written here:\n\n   and       del       from      not       while\n   as        elif      global    or        with\n   assert    else      if        pass      yield\n   break     except    import    print\n   class     exec      in        raise\n   continue  finally   is        return\n   def       for       lambda    try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Using ``as`` and ``with`` as identifiers\ntriggers a warning.  To use them as keywords, enable the\n``with_statement`` future feature .\n\nChanged in version 2.6: ``as`` and ``with`` are full keywords.\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings.  These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n   Not imported by ``from module import *``.  The special identifier\n   ``_`` is used in the interactive interpreter to store the result of\n   the last evaluation; it is stored in the ``__builtin__`` module.\n   When not in interactive mode, ``_`` has no special meaning and is\n   not defined. See section *The import statement*.\n\n   Note: The name ``_`` is often used in conjunction with\n     internationalization; refer to the documentation for the\n     ``gettext`` module for more information on this convention.\n\n``__*__``\n   System-defined names. These names are defined by the interpreter\n   and its implementation (including the standard library).  Current\n   system names are discussed in the *Special method names* section\n   and elsewhere.  More will likely be defined in future versions of\n   Python.  *Any* use of ``__*__`` names, in any context, that does\n   not follow explicitly documented use, is subject to breakage\n   without warning.\n\n``__*``\n   Class-private names.  Names in this category, when used within the\n   context of a class definition, are re-written to use a mangled form\n   to help avoid name clashes between "private" attributes of base and\n   derived classes. See section *Identifiers (Names)*.\n',
    @@ -43,8 +43,8 @@
      'import': '\nThe ``import`` statement\n************************\n\n   import_stmt     ::= "import" module ["as" name] ( "," module ["as" name] )*\n                   | "from" relative_module "import" identifier ["as" name]\n                   ( "," identifier ["as" name] )*\n                   | "from" relative_module "import" "(" identifier ["as" name]\n                   ( "," identifier ["as" name] )* [","] ")"\n                   | "from" module "import" "*"\n   module          ::= (identifier ".")* identifier\n   relative_module ::= "."* module | "."+\n   name            ::= identifier\n\nImport statements are executed in two steps: (1) find a module, and\ninitialize it if necessary; (2) define a name or names in the local\nnamespace (of the scope where the ``import`` statement occurs). The\nstatement comes in two forms differing on whether it uses the ``from``\nkeyword. The first form (without ``from``) repeats these steps for\neach identifier in the list. The form with ``from`` performs step (1)\nonce, and then performs step (2) repeatedly.\n\nTo understand how step (1) occurs, one must first understand how\nPython handles hierarchical naming of modules. To help organize\nmodules and provide a hierarchy in naming, Python has a concept of\npackages. A package can contain other packages and modules while\nmodules cannot contain other modules or packages. From a file system\nperspective, packages are directories and modules are files. The\noriginal specification for packages is still available to read,\nalthough minor details have changed since the writing of that\ndocument.\n\nOnce the name of the module is known (unless otherwise specified, the\nterm "module" will refer to both packages and modules), searching for\nthe module or package can begin. The first place checked is\n``sys.modules``, the cache of all modules that have been imported\npreviously. If the module is found there then it is used in step (2)\nof import.\n\nIf the module is not found in the cache, then ``sys.meta_path`` is\nsearched (the specification for ``sys.meta_path`` can be found in\n**PEP 302**). The object is a list of *finder* objects which are\nqueried in order as to whether they know how to load the module by\ncalling their ``find_module()`` method with the name of the module. If\nthe module happens to be contained within a package (as denoted by the\nexistence of a dot in the name), then a second argument to\n``find_module()`` is given as the value of the ``__path__`` attribute\nfrom the parent package (everything up to the last dot in the name of\nthe module being imported). If a finder can find the module it returns\na *loader* (discussed later) or returns ``None``.\n\nIf none of the finders on ``sys.meta_path`` are able to find the\nmodule then some implicitly defined finders are queried.\nImplementations of Python vary in what implicit meta path finders are\ndefined. The one they all do define, though, is one that handles\n``sys.path_hooks``, ``sys.path_importer_cache``, and ``sys.path``.\n\nThe implicit finder searches for the requested module in the "paths"\nspecified in one of two places ("paths" do not have to be file system\npaths). If the module being imported is supposed to be contained\nwithin a package then the second argument passed to ``find_module()``,\n``__path__`` on the parent package, is used as the source of paths. If\nthe module is not contained in a package then ``sys.path`` is used as\nthe source of paths.\n\nOnce the source of paths is chosen it is iterated over to find a\nfinder that can handle that path. The dict at\n``sys.path_importer_cache`` caches finders for paths and is checked\nfor a finder. If the path does not have a finder cached then\n``sys.path_hooks`` is searched by calling each object in the list with\na single argument of the path, returning a finder or raises\n``ImportError``. If a finder is returned then it is cached in\n``sys.path_importer_cache`` and then used for that path entry. If no\nfinder can be found but the path exists then a value of ``None`` is\nstored in ``sys.path_importer_cache`` to signify that an implicit,\nfile-based finder that handles modules stored as individual files\nshould be used for that path. If the path does not exist then a finder\nwhich always returns ``None`` is placed in the cache for the path.\n\nIf no finder can find the module then ``ImportError`` is raised.\nOtherwise some finder returned a loader whose ``load_module()`` method\nis called with the name of the module to load (see **PEP 302** for the\noriginal definition of loaders). A loader has several responsibilities\nto perform on a module it loads. First, if the module already exists\nin ``sys.modules`` (a possibility if the loader is called outside of\nthe import machinery) then it is to use that module for initialization\nand not a new module. But if the module does not exist in\n``sys.modules`` then it is to be added to that dict before\ninitialization begins. If an error occurs during loading of the module\nand it was added to ``sys.modules`` it is to be removed from the dict.\nIf an error occurs but the module was already in ``sys.modules`` it is\nleft in the dict.\n\nThe loader must set several attributes on the module. ``__name__`` is\nto be set to the name of the module. ``__file__`` is to be the "path"\nto the file unless the module is built-in (and thus listed in\n``sys.builtin_module_names``) in which case the attribute is not set.\nIf what is being imported is a package then ``__path__`` is to be set\nto a list of paths to be searched when looking for modules and\npackages contained within the package being imported. ``__package__``\nis optional but should be set to the name of package that contains the\nmodule or package (the empty string is used for module not contained\nin a package). ``__loader__`` is also optional but should be set to\nthe loader object that is loading the module.\n\nIf an error occurs during loading then the loader raises\n``ImportError`` if some other exception is not already being\npropagated. Otherwise the loader returns the module that was loaded\nand initialized.\n\nWhen step (1) finishes without raising an exception, step (2) can\nbegin.\n\nThe first form of ``import`` statement binds the module name in the\nlocal namespace to the module object, and then goes on to import the\nnext identifier, if any.  If the module name is followed by ``as``,\nthe name following ``as`` is used as the local name for the module.\n\nThe ``from`` form does not bind the module name: it goes through the\nlist of identifiers, looks each one of them up in the module found in\nstep (1), and binds the name in the local namespace to the object thus\nfound.  As with the first form of ``import``, an alternate local name\ncan be supplied by specifying "``as`` localname".  If a name is not\nfound, ``ImportError`` is raised.  If the list of identifiers is\nreplaced by a star (``\'*\'``), all public names defined in the module\nare bound in the local namespace of the ``import`` statement..\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module.  The names given in ``__all__`` are all considered public\nand are required to exist.  If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.  If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python.  The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language.  It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n   future_statement ::= "from" "__future__" "import" feature ["as" name]\n                        ("," feature ["as" name])*\n                        | "from" "__future__" "import" "(" feature ["as" name]\n                        ("," feature ["as" name])* [","] ")"\n   feature          ::= identifier\n   name             ::= identifier\n\nA future statement must appear near the top of the module.  The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``.  ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code.  It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently.  Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n   import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement.  This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session.  If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n   **PEP 236** - Back to the __future__\n      The original proposal for the __future__ mechanism.\n',
      'in': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation.  Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n   comparison    ::= or_expr ( comp_operator or_expr )*\n   comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="\n                     | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted.  The ``<>`` spelling is considered obsolescent.\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects.  The objects need not have the same type.\nIf both are numbers, they are converted to a common type.  Otherwise,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n  (the result of the built-in function ``ord()``) of their characters.\n  Unicode and 8-bit strings are fully interoperable in this behavior.\n  [4]\n\n* Tuples and lists are compared lexicographically using comparison of\n  corresponding elements.  This means that to compare equal, each\n  element must compare equal and the two sequences must be of the same\n  type and have the same length.\n\n  If not equal, the sequences are ordered the same as their first\n  differing elements.  For example, ``cmp([1,2,x], [1,2,y])`` returns\n  the same as ``cmp(x,y)``.  If the corresponding element does not\n  exist, the shorter sequence is ordered first (for example, ``[1,2] <\n  [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if their sorted\n  (key, value) lists compare equal. [5] Outcomes other than equality\n  are resolved consistently, but are not otherwise defined. [6]\n\n* Most other objects of built-in types compare unequal unless they are\n  the same object; the choice whether one object is considered smaller\n  or larger than another one is made arbitrarily but consistently\n  within one execution of a program.\n\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise.  ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object.  However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence.  In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*.  An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``.  If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object.  ``x is\nnot y`` yields the inverse truth value. [7]\n',
      'integers': '\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n   longinteger    ::= integer ("l" | "L")\n   integer        ::= decimalinteger | octinteger | hexinteger | bininteger\n   decimalinteger ::= nonzerodigit digit* | "0"\n   octinteger     ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n   hexinteger     ::= "0" ("x" | "X") hexdigit+\n   bininteger     ::= "0" ("b" | "B") bindigit+\n   nonzerodigit   ::= "1"..."9"\n   octdigit       ::= "0"..."7"\n   bindigit       ::= "0" | "1"\n   hexdigit       ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1]  There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n   7     2147483647                        0177\n   3L    79228162514264337593543950336L    0377L   0x100000000L\n         79228162514264337593543950336             0xdeadbeef\n',
    - 'lambda': '\nLambdas\n*******\n\n   lambda_form     ::= "lambda" [parameter_list]: expression\n   old_lambda_form ::= "lambda" [parameter_list]: old_expression\n\nLambda forms (lambda expressions) have the same syntactic position as\nexpressions.  They are a shorthand to create anonymous functions; the\nexpression ``lambda arguments: expression`` yields a function object.\nThe unnamed object behaves like a function object defined with\n\n   def name(arguments):\n       return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda forms cannot contain\nstatements.\n',
    - 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n   list_display        ::= "[" [expression_list | list_comprehension] "]"\n   list_comprehension  ::= expression list_for\n   list_for            ::= "for" target_list "in" old_expression_list [list_iter]\n   old_expression_list ::= old_expression [("," old_expression)+ [","]]\n   old_expression      ::= or_test | old_lambda_form\n   list_iter           ::= list_for | list_if\n   list_if             ::= "if" old_expression [list_iter]\n\nA list display yields a new list object.  Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order.  When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses.  In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n',
    + 'lambda': '\nLambdas\n*******\n\n   lambda_expr     ::= "lambda" [parameter_list]: expression\n   old_lambda_expr ::= "lambda" [parameter_list]: old_expression\n\nLambda expressions (sometimes called lambda forms) have the same\nsyntactic position as expressions.  They are a shorthand to create\nanonymous functions; the expression ``lambda arguments: expression``\nyields a function object.  The unnamed object behaves like a function\nobject defined with\n\n   def name(arguments):\n       return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda expressions cannot contain\nstatements.\n',
    + 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n   list_display        ::= "[" [expression_list | list_comprehension] "]"\n   list_comprehension  ::= expression list_for\n   list_for            ::= "for" target_list "in" old_expression_list [list_iter]\n   old_expression_list ::= old_expression [("," old_expression)+ [","]]\n   old_expression      ::= or_test | old_lambda_expr\n   list_iter           ::= list_for | list_if\n   list_if             ::= "if" old_expression [list_iter]\n\nA list display yields a new list object.  Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order.  When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses.  In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n',
      'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects.  Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block.  A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block.  The file read by the\nbuilt-in function ``execfile()`` is a code block.  The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*.  A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block.  If a local\nvariable is defined in a block, its scope includes that block.  If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name.  The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope.  This means that the\nfollowing will fail:\n\n   class A:\n       a = 42\n       b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope.  The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable.  (The\nvariables of the module code block are local and global.)  If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised.  ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement.  The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore.  This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name).  It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block.  This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle.  Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block.  The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``.  The global namespace is searched\nfirst.  If the name is not found there, the builtins namespace is\nsearched.  The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used).  By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself.  ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail.  Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported.  The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block.  If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class.  Names defined at the class scope are not visible in\nmethods.\n\n\nInteraction with dynamic features\n=================================\n\nThere are several cases where Python statements are illegal when used\nin conjunction with nested scopes that contain free variables.\n\nIf a variable is referenced in an enclosing scope, it is illegal to\ndelete the name.  An error will be reported at compile time.\n\nIf the wild card form of import --- ``import *`` --- is used in a\nfunction and the function contains or is a nested block with free\nvariables, the compiler will raise a ``SyntaxError``.\n\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``.  (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names.  Names may be resolved in the local and global\nnamespaces of the caller.  Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n",
      'numbers': "\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers.  There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary number).\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator '``-``' and\nthe literal ``1``.\n",
      'numeric-types': '\nEmulating numeric types\n***********************\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n   ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``).  For\n   instance, to evaluate the expression ``x + y``, where *x* is an\n   instance of a class that has an ``__add__()`` method,\n   ``x.__add__(y)`` is called.  The ``__divmod__()`` method should be\n   the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n   should not be related to ``__truediv__()`` (described below).  Note\n   that ``__pow__()`` should be defined to accept an optional third\n   argument if the ternary version of the built-in ``pow()`` function\n   is to be supported.\n\n   If one of those methods does not support the operation with the\n   supplied arguments, it should return ``NotImplemented``.\n\nobject.__div__(self, other)\nobject.__truediv__(self, other)\n\n   The division operator (``/``) is implemented by these methods.  The\n   ``__truediv__()`` method is used when ``__future__.division`` is in\n   effect, otherwise ``__div__()`` is used.  If only one of these two\n   methods is defined, the object will not support division in the\n   alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n   ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n   reflected (swapped) operands.  These functions are only called if\n   the left operand does not support the corresponding operation and\n   the operands are of different types. [2] For instance, to evaluate\n   the expression ``x - y``, where *y* is an instance of a class that\n   has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n   ``x.__sub__(y)`` returns *NotImplemented*.\n\n   Note that ternary ``pow()`` will not try calling ``__rpow__()``\n   (the coercion rules would become too complicated).\n\n   Note: If the right operand\'s type is a subclass of the left operand\'s\n     type and that subclass provides the reflected method for the\n     operation, this method will be called before the left operand\'s\n     non-reflected method.  This behavior allows subclasses to\n     override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__idiv__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n   These methods are called to implement the augmented arithmetic\n   assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n   ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``).  These methods\n   should attempt to do the operation in-place (modifying *self*) and\n   return the result (which could be, but does not have to be,\n   *self*).  If a specific method is not defined, the augmented\n   assignment falls back to the normal methods.  For instance, to\n   execute the statement ``x += y``, where *x* is an instance of a\n   class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n   called.  If *x* is an instance of a class that does not define a\n   ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n   considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n   Called to implement the unary arithmetic operations (``-``, ``+``,\n   ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__long__(self)\nobject.__float__(self)\n\n   Called to implement the built-in functions ``complex()``,\n   ``int()``, ``long()``, and ``float()``.  Should return a value of\n   the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n   Called to implement the built-in functions ``oct()`` and ``hex()``.\n   Should return a string value.\n\nobject.__index__(self)\n\n   Called to implement ``operator.index()``.  Also called whenever\n   Python needs an integer object (such as in slicing).  Must return\n   an integer (int or long).\n\n   New in version 2.5.\n\nobject.__coerce__(self, other)\n\n   Called to implement "mixed-mode" numeric arithmetic.  Should either\n   return a 2-tuple containing *self* and *other* converted to a\n   common numeric type, or ``None`` if conversion is impossible.  When\n   the common type would be the type of ``other``, it is sufficient to\n   return ``None``, since the interpreter will also ask the other\n   object to attempt a coercion (but sometimes, if the implementation\n   of the other type cannot be changed, it is useful to do the\n   conversion to the other type here).  A return value of\n   ``NotImplemented`` is equivalent to returning ``None``.\n',
    @@ -60,16 +60,16 @@
      'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant.  Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n   A dictionary or other mapping object used to store an object\'s\n   (writable) attributes.\n\nobject.__methods__\n\n   Deprecated since version 2.2: Use the built-in function ``dir()``\n   to get a list of an object\'s attributes. This attribute is no\n   longer available.\n\nobject.__members__\n\n   Deprecated since version 2.2: Use the built-in function ``dir()``\n   to get a list of an object\'s attributes. This attribute is no\n   longer available.\n\ninstance.__class__\n\n   The class to which a class instance belongs.\n\nclass.__bases__\n\n   The tuple of base classes of a class object.\n\nclass.__name__\n\n   The name of the class or type.\n\nThe following attributes are only supported by *new-style class*es.\n\nclass.__mro__\n\n   This attribute is a tuple of classes that are considered when\n   looking for base classes during method resolution.\n\nclass.mro()\n\n   This method can be overridden by a metaclass to customize the\n   method resolution order for its instances.  It is called at class\n   instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n   Each new-style class keeps a list of weak references to its\n   immediate subclasses.  This method returns a list of all those\n   references still alive. Example:\n\n      >>> int.__subclasses__()\n      []\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n    the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n    ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n    operands.\n\n[4] Cased characters are those with general category property being\n    one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n    (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n    tuple whose only element is the tuple to be formatted.\n\n[6] The advantage of leaving the newline on is that returning an empty\n    string is then an unambiguous EOF indication.  It is also possible\n    (in cases where it might matter, for example, if you want to make\n    an exact copy of a file while scanning its lines) to tell whether\n    the last line of a file ended in a newline or not (yes this\n    happens!).\n',
      'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators.  For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses.  Except where mentioned, attempts to execute an operation\nraise an exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled.  For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense.  (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n   Called to create a new instance of class *cls*.  ``__new__()`` is a\n   static method (special-cased so you need not declare it as such)\n   that takes the class of which an instance was requested as its\n   first argument.  The remaining arguments are those passed to the\n   object constructor expression (the call to the class).  The return\n   value of ``__new__()`` should be the new object instance (usually\n   an instance of *cls*).\n\n   Typical implementations create a new instance of the class by\n   invoking the superclass\'s ``__new__()`` method using\n   ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n   arguments and then modifying the newly-created instance as\n   necessary before returning it.\n\n   If ``__new__()`` returns an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will be invoked like\n   ``__init__(self[, ...])``, where *self* is the new instance and the\n   remaining arguments are the same as were passed to ``__new__()``.\n\n   If ``__new__()`` does not return an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will not be invoked.\n\n   ``__new__()`` is intended mainly to allow subclasses of immutable\n   types (like int, str, or tuple) to customize instance creation.  It\n   is also commonly overridden in custom metaclasses in order to\n   customize class creation.\n\nobject.__init__(self[, ...])\n\n   Called when the instance is created.  The arguments are those\n   passed to the class constructor expression.  If a base class has an\n   ``__init__()`` method, the derived class\'s ``__init__()`` method,\n   if any, must explicitly call it to ensure proper initialization of\n   the base class part of the instance; for example:\n   ``BaseClass.__init__(self, [args...])``.  As a special constraint\n   on constructors, no value may be returned; doing so will cause a\n   ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n   Called when the instance is about to be destroyed.  This is also\n   called a destructor.  If a base class has a ``__del__()`` method,\n   the derived class\'s ``__del__()`` method, if any, must explicitly\n   call it to ensure proper deletion of the base class part of the\n   instance.  Note that it is possible (though not recommended!) for\n   the ``__del__()`` method to postpone destruction of the instance by\n   creating a new reference to it.  It may then be called at a later\n   time when this new reference is deleted.  It is not guaranteed that\n   ``__del__()`` methods are called for objects that still exist when\n   the interpreter exits.\n\n   Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n     decrements the reference count for ``x`` by one, and the latter\n     is only called when ``x``\'s reference count reaches zero.  Some\n     common situations that may prevent the reference count of an\n     object from going to zero include: circular references between\n     objects (e.g., a doubly-linked list or a tree data structure with\n     parent and child pointers); a reference to the object on the\n     stack frame of a function that caught an exception (the traceback\n     stored in ``sys.exc_traceback`` keeps the stack frame alive); or\n     a reference to the object on the stack frame that raised an\n     unhandled exception in interactive mode (the traceback stored in\n     ``sys.last_traceback`` keeps the stack frame alive).  The first\n     situation can only be remedied by explicitly breaking the cycles;\n     the latter two situations can be resolved by storing ``None`` in\n     ``sys.exc_traceback`` or ``sys.last_traceback``.  Circular\n     references which are garbage are detected when the option cycle\n     detector is enabled (it\'s on by default), but can only be cleaned\n     up if there are no Python-level ``__del__()`` methods involved.\n     Refer to the documentation for the ``gc`` module for more\n     information about how ``__del__()`` methods are handled by the\n     cycle detector, particularly the description of the ``garbage``\n     value.\n\n   Warning: Due to the precarious circumstances under which ``__del__()``\n     methods are invoked, exceptions that occur during their execution\n     are ignored, and a warning is printed to ``sys.stderr`` instead.\n     Also, when ``__del__()`` is invoked in response to a module being\n     deleted (e.g., when execution of the program is done), other\n     globals referenced by the ``__del__()`` method may already have\n     been deleted or in the process of being torn down (e.g. the\n     import machinery shutting down).  For this reason, ``__del__()``\n     methods should do the absolute minimum needed to maintain\n     external invariants.  Starting with version 1.5, Python\n     guarantees that globals whose name begins with a single\n     underscore are deleted from their module before other globals are\n     deleted; if no other references to such globals exist, this may\n     help in assuring that imported modules are still available at the\n     time when the ``__del__()`` method is called.\n\n   See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n   Called by the ``repr()`` built-in function and by string\n   conversions (reverse quotes) to compute the "official" string\n   representation of an object.  If at all possible, this should look\n   like a valid Python expression that could be used to recreate an\n   object with the same value (given an appropriate environment).  If\n   this is not possible, a string of the form ``<...some useful\n   description...>`` should be returned.  The return value must be a\n   string object. If a class defines ``__repr__()`` but not\n   ``__str__()``, then ``__repr__()`` is also used when an "informal"\n   string representation of instances of that class is required.\n\n   This is typically used for debugging, so it is important that the\n   representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n   Called by the ``str()`` built-in function and by the ``print``\n   statement to compute the "informal" string representation of an\n   object.  This differs from ``__repr__()`` in that it does not have\n   to be a valid Python expression: a more convenient or concise\n   representation may be used instead. The return value must be a\n   string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n   New in version 2.1.\n\n   These are the so-called "rich comparison" methods, and are called\n   for comparison operators in preference to ``__cmp__()`` below. The\n   correspondence between operator symbols and method names is as\n   follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n   ``x>=y`` calls ``x.__ge__(y)``.\n\n   A rich comparison method may return the singleton\n   ``NotImplemented`` if it does not implement the operation for a\n   given pair of arguments. By convention, ``False`` and ``True`` are\n   returned for a successful comparison. However, these methods can\n   return any value, so if the comparison operator is used in a\n   Boolean context (e.g., in the condition of an ``if`` statement),\n   Python will call ``bool()`` on the value to determine if the result\n   is true or false.\n\n   There are no implied relationships among the comparison operators.\n   The truth of ``x==y`` does not imply that ``x!=y`` is false.\n   Accordingly, when defining ``__eq__()``, one should also define\n   ``__ne__()`` so that the operators will behave as expected.  See\n   the paragraph on ``__hash__()`` for some important notes on\n   creating *hashable* objects which support custom comparison\n   operations and are usable as dictionary keys.\n\n   There are no swapped-argument versions of these methods (to be used\n   when the left argument does not support the operation but the right\n   argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n   other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n   reflection, and ``__eq__()`` and ``__ne__()`` are their own\n   reflection.\n\n   Arguments to rich comparison methods are never coerced.\n\n   To automatically generate ordering operations from a single root\n   operation, see ``functools.total_ordering()``.\n\nobject.__cmp__(self, other)\n\n   Called by comparison operations if rich comparison (see above) is\n   not defined.  Should return a negative integer if ``self < other``,\n   zero if ``self == other``, a positive integer if ``self > other``.\n   If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n   defined, class instances are compared by object identity\n   ("address").  See also the description of ``__hash__()`` for some\n   important notes on creating *hashable* objects which support custom\n   comparison operations and are usable as dictionary keys. (Note: the\n   restriction that exceptions are not propagated by ``__cmp__()`` has\n   been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n   Changed in version 2.1: No longer supported.\n\nobject.__hash__(self)\n\n   Called by built-in function ``hash()`` and for operations on\n   members of hashed collections including ``set``, ``frozenset``, and\n   ``dict``.  ``__hash__()`` should return an integer.  The only\n   required property is that objects which compare equal have the same\n   hash value; it is advised to somehow mix together (e.g. using\n   exclusive or) the hash values for the components of the object that\n   also play a part in comparison of objects.\n\n   If a class does not define a ``__cmp__()`` or ``__eq__()`` method\n   it should not define a ``__hash__()`` operation either; if it\n   defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n   instances will not be usable in hashed collections.  If a class\n   defines mutable objects and implements a ``__cmp__()`` or\n   ``__eq__()`` method, it should not implement ``__hash__()``, since\n   hashable collection implementations require that a object\'s hash\n   value is immutable (if the object\'s hash value changes, it will be\n   in the wrong hash bucket).\n\n   User-defined classes have ``__cmp__()`` and ``__hash__()`` methods\n   by default; with them, all objects compare unequal (except with\n   themselves) and ``x.__hash__()`` returns ``id(x)``.\n\n   Classes which inherit a ``__hash__()`` method from a parent class\n   but change the meaning of ``__cmp__()`` or ``__eq__()`` such that\n   the hash value returned is no longer appropriate (e.g. by switching\n   to a value-based concept of equality instead of the default\n   identity based equality) can explicitly flag themselves as being\n   unhashable by setting ``__hash__ = None`` in the class definition.\n   Doing so means that not only will instances of the class raise an\n   appropriate ``TypeError`` when a program attempts to retrieve their\n   hash value, but they will also be correctly identified as\n   unhashable when checking ``isinstance(obj, collections.Hashable)``\n   (unlike classes which define their own ``__hash__()`` to explicitly\n   raise ``TypeError``).\n\n   Changed in version 2.5: ``__hash__()`` may now also return a long\n   integer object; the 32-bit integer is then derived from the hash of\n   that object.\n\n   Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n   explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n   Called to implement truth value testing and the built-in operation\n   ``bool()``; should return ``False`` or ``True``, or their integer\n   equivalents ``0`` or ``1``.  When this method is not defined,\n   ``__len__()`` is called, if it is defined, and the object is\n   considered true if its result is nonzero. If a class defines\n   neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n   considered true.\n\nobject.__unicode__(self)\n\n   Called to implement ``unicode()`` built-in; should return a Unicode\n   object. When this method is not defined, string conversion is\n   attempted, and the result of string conversion is converted to\n   Unicode using the system default encoding.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n   Called when an attribute lookup has not found the attribute in the\n   usual places (i.e. it is not an instance attribute nor is it found\n   in the class tree for ``self``).  ``name`` is the attribute name.\n   This method should return the (computed) attribute value or raise\n   an ``AttributeError`` exception.\n\n   Note that if the attribute is found through the normal mechanism,\n   ``__getattr__()`` is not called.  (This is an intentional asymmetry\n   between ``__getattr__()`` and ``__setattr__()``.) This is done both\n   for efficiency reasons and because otherwise ``__getattr__()``\n   would have no way to access other attributes of the instance.  Note\n   that at least for instance variables, you can fake total control by\n   not inserting any values in the instance attribute dictionary (but\n   instead inserting them in another object).  See the\n   ``__getattribute__()`` method below for a way to actually get total\n   control in new-style classes.\n\nobject.__setattr__(self, name, value)\n\n   Called when an attribute assignment is attempted.  This is called\n   instead of the normal mechanism (i.e. store the value in the\n   instance dictionary).  *name* is the attribute name, *value* is the\n   value to be assigned to it.\n\n   If ``__setattr__()`` wants to assign to an instance attribute, it\n   should not simply execute ``self.name = value`` --- this would\n   cause a recursive call to itself.  Instead, it should insert the\n   value in the dictionary of instance attributes, e.g.,\n   ``self.__dict__[name] = value``.  For new-style classes, rather\n   than accessing the instance dictionary, it should call the base\n   class method with the same name, for example,\n   ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n   Like ``__setattr__()`` but for attribute deletion instead of\n   assignment.  This should only be implemented if ``del obj.name`` is\n   meaningful for the object.\n\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\n\nobject.__getattribute__(self, name)\n\n   Called unconditionally to implement attribute accesses for\n   instances of the class. If the class also defines\n   ``__getattr__()``, the latter will not be called unless\n   ``__getattribute__()`` either calls it explicitly or raises an\n   ``AttributeError``. This method should return the (computed)\n   attribute value or raise an ``AttributeError`` exception. In order\n   to avoid infinite recursion in this method, its implementation\n   should always call the base class method with the same name to\n   access any attributes it needs, for example,\n   ``object.__getattribute__(self, name)``.\n\n   Note: This method may still be bypassed when looking up special methods\n     as the result of implicit invocation via language syntax or\n     built-in functions. See *Special method lookup for new-style\n     classes*.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents).  In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n   Called to get the attribute of the owner class (class attribute\n   access) or of an instance of that class (instance attribute\n   access). *owner* is always the owner class, while *instance* is the\n   instance that the attribute was accessed through, or ``None`` when\n   the attribute is accessed through the *owner*.  This method should\n   return the (computed) attribute value or raise an\n   ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n   Called to set the attribute on an instance *instance* of the owner\n   class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n   Called to delete the attribute on an instance *instance* of the\n   owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol:  ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead.  Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.  Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n   The simplest and least common call is when user code directly\n   invokes a descriptor method:    ``x.__get__(a)``.\n\nInstance Binding\n   If binding to a new-style object instance, ``a.x`` is transformed\n   into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n   If binding to a new-style class, ``A.x`` is transformed into the\n   call: ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n   If ``a`` is an instance of ``super``, then the binding ``super(B,\n   obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n   ``A`` immediately preceding ``B`` and then invokes the descriptor\n   with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined.  A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary.  If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor.  Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method.  Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary.  In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors.  Accordingly, instances can\nredefine and override methods.  This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of both old and new-style classes have a\ndictionary for attribute storage.  This wastes space for objects\nhaving very few instance variables.  The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition.  The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable.  Space is saved because *__dict__* is\nnot created for each instance.\n\n__slots__\n\n   This class variable can be assigned a string, iterable, or sequence\n   of strings with variable names used by instances.  If defined in a\n   new-style class, *__slots__* reserves space for the declared\n   variables and prevents the automatic creation of *__dict__* and\n   *__weakref__* for each instance.\n\n   New in version 2.2.\n\nNotes on using *__slots__*\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n  attribute of that class will always be accessible, so a *__slots__*\n  definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n  variables not listed in the *__slots__* definition.  Attempts to\n  assign to an unlisted variable name raises ``AttributeError``. If\n  dynamic assignment of new variables is desired, then add\n  ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n  declaration.\n\n  Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n  *__slots__* declaration would not enable the assignment of new\n  attributes not specifically listed in the sequence of instance\n  variable names.\n\n* Without a *__weakref__* variable for each instance, classes defining\n  *__slots__* do not support weak references to its instances. If weak\n  reference support is needed, then add ``\'__weakref__\'`` to the\n  sequence of strings in the *__slots__* declaration.\n\n  Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n  *__slots__* declaration would not enable support for weak\n  references.\n\n* *__slots__* are implemented at the class level by creating\n  descriptors (*Implementing Descriptors*) for each variable name.  As\n  a result, class attributes cannot be used to set default values for\n  instance variables defined by *__slots__*; otherwise, the class\n  attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n  where it is defined.  As a result, subclasses will have a *__dict__*\n  unless they also define *__slots__* (which must only contain names\n  of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n  variable defined by the base class slot is inaccessible (except by\n  retrieving its descriptor directly from the base class). This\n  renders the meaning of the program undefined.  In the future, a\n  check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n  "variable-length" built-in types such as ``long``, ``str`` and\n  ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n  also be used; however, in the future, special meaning may be\n  assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n  *__slots__*.\n\n  Changed in version 2.6: Previously, *__class__* assignment raised an\n  error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. This\nallows classes or functions to be written which monitor or alter the\nclass creation process:\n\n* Modifying the class dictionary prior to the class being created.\n\n* Returning an instance of another class -- essentially performing the\n  role of a factory function.\n\nThese steps will have to be performed in the metaclass\'s ``__new__()``\nmethod -- ``type.__new__()`` can then be called from this method to\ncreate a class with different properties.  This example adds a new\nelement to the class dictionary before creating the class:\n\n   class metacls(type):\n       def __new__(mcs, name, bases, dict):\n           dict[\'foo\'] = \'metacls was here\'\n           return type.__new__(mcs, name, bases, dict)\n\nYou can of course also override other class methods (or add new\nmethods); for example defining a custom ``__call__()`` method in the\nmetaclass allows custom behavior when the class is called, e.g. not\nalways creating a new instance.\n\n__metaclass__\n\n   This variable can be any callable accepting arguments for ``name``,\n   ``bases``, and ``dict``.  Upon class creation, the callable is used\n   instead of the built-in ``type()``.\n\n   New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n  used (this looks for a *__class__* attribute first and if not found,\n  uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n  used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n  used.\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored including logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n   Return true if *instance* should be considered a (direct or\n   indirect) instance of *class*. If defined, called to implement\n   ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n   Return true if *subclass* should be considered a (direct or\n   indirect) subclass of *class*.  If defined, called to implement\n   ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass.  They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n   **PEP 3119** - Introducing Abstract Base Classes\n      Includes the specification for customizing ``isinstance()`` and\n      ``issubclass()`` behavior through ``__instancecheck__()`` and\n      ``__subclasscheck__()``, with motivation for this functionality\n      in the context of adding Abstract Base Classes (see the ``abc``\n      module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n   Called when the instance is "called" as a function; if this method\n   is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n   ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well.  The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects.  The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects.  Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators.  It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, it should search through the values.  It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``iterkeys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n   Called to implement the built-in function ``len()``.  Should return\n   the length of the object, an integer ``>=`` 0.  Also, an object\n   that doesn\'t define a ``__nonzero__()`` method and whose\n   ``__len__()`` method returns zero is considered to be false in a\n   Boolean context.\n\nobject.__getitem__(self, key)\n\n   Called to implement evaluation of ``self[key]``. For sequence\n   types, the accepted keys should be integers and slice objects.\n   Note that the special interpretation of negative indexes (if the\n   class wishes to emulate a sequence type) is up to the\n   ``__getitem__()`` method. If *key* is of an inappropriate type,\n   ``TypeError`` may be raised; if of a value outside the set of\n   indexes for the sequence (after any special interpretation of\n   negative values), ``IndexError`` should be raised. For mapping\n   types, if *key* is missing (not in the container), ``KeyError``\n   should be raised.\n\n   Note: ``for`` loops expect that an ``IndexError`` will be raised for\n     illegal indexes to allow proper detection of the end of the\n     sequence.\n\nobject.__setitem__(self, key, value)\n\n   Called to implement assignment to ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support changes to the values for keys, or if new keys\n   can be added, or for sequences if elements can be replaced.  The\n   same exceptions should be raised for improper *key* values as for\n   the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n   Called to implement deletion of ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support removal of keys, or for sequences if elements\n   can be removed from the sequence.  The same exceptions should be\n   raised for improper *key* values as for the ``__getitem__()``\n   method.\n\nobject.__iter__(self)\n\n   This method is called when an iterator is required for a container.\n   This method should return a new iterator object that can iterate\n   over all the objects in the container.  For mappings, it should\n   iterate over the keys of the container, and should also be made\n   available as the method ``iterkeys()``.\n\n   Iterator objects also need to implement this method; they are\n   required to return themselves.  For more information on iterator\n   objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n   Called (if present) by the ``reversed()`` built-in to implement\n   reverse iteration.  It should return a new iterator object that\n   iterates over all the objects in the container in reverse order.\n\n   If the ``__reversed__()`` method is not provided, the\n   ``reversed()`` built-in will fall back to using the sequence\n   protocol (``__len__()`` and ``__getitem__()``).  Objects that\n   support the sequence protocol should only provide\n   ``__reversed__()`` if they can provide an implementation that is\n   more efficient than the one provided by ``reversed()``.\n\n   New in version 2.6.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence.  However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n   Called to implement membership test operators.  Should return true\n   if *item* is in *self*, false otherwise.  For mapping objects, this\n   should consider the keys of the mapping rather than the values or\n   the key-item pairs.\n\n   For objects that don\'t define ``__contains__()``, the membership\n   test first tries iteration via ``__iter__()``, then the old\n   sequence iteration protocol via ``__getitem__()``, see *this\n   section in the language reference*.\n\n\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects.  Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n   Deprecated since version 2.0: Support slice objects as parameters\n   to the ``__getitem__()`` method. (However, built-in types in\n   CPython currently still implement ``__getslice__()``.  Therefore,\n   you have to override it in derived classes when implementing\n   slicing.)\n\n   Called to implement evaluation of ``self[i:j]``. The returned\n   object should be of the same type as *self*.  Note that missing *i*\n   or *j* in the slice expression are replaced by zero or\n   ``sys.maxint``, respectively.  If negative indexes are used in the\n   slice, the length of the sequence is added to that index. If the\n   instance does not implement the ``__len__()`` method, an\n   ``AttributeError`` is raised. No guarantee is made that indexes\n   adjusted this way are not still negative.  Indexes which are\n   greater than the length of the sequence are not modified. If no\n   ``__getslice__()`` is found, a slice object is created instead, and\n   passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n   Called to implement assignment to ``self[i:j]``. Same notes for *i*\n   and *j* as for ``__getslice__()``.\n\n   This method is deprecated. If no ``__setslice__()`` is found, or\n   for extended slicing of the form ``self[i:j:k]``, a slice object is\n   created, and passed to ``__setitem__()``, instead of\n   ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n   Called to implement deletion of ``self[i:j]``. Same notes for *i*\n   and *j* as for ``__getslice__()``. This method is deprecated. If no\n   ``__delslice__()`` is found, or for extended slicing of the form\n   ``self[i:j:k]``, a slice object is created, and passed to\n   ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available.  For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n   class MyClass:\n       ...\n       def __getitem__(self, index):\n           ...\n       def __setitem__(self, index, value):\n           ...\n       def __delitem__(self, index):\n           ...\n\n       if sys.version_info < (2, 0):\n           # They won\'t be defined if version is at least 2.0 final\n\n           def __getslice__(self, i, j):\n               return self[max(0, i):max(0, j):]\n           def __setslice__(self, i, j, seq):\n               self[max(0, i):max(0, j):] = seq\n           def __delslice__(self, i, j):\n               del self[max(0, i):max(0, j):]\n       ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled.  When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values.  For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well.  However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n   ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``).  For\n   instance, to evaluate the expression ``x + y``, where *x* is an\n   instance of a class that has an ``__add__()`` method,\n   ``x.__add__(y)`` is called.  The ``__divmod__()`` method should be\n   the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n   should not be related to ``__truediv__()`` (described below).  Note\n   that ``__pow__()`` should be defined to accept an optional third\n   argument if the ternary version of the built-in ``pow()`` function\n   is to be supported.\n\n   If one of those methods does not support the operation with the\n   supplied arguments, it should return ``NotImplemented``.\n\nobject.__div__(self, other)\nobject.__truediv__(self, other)\n\n   The division operator (``/``) is implemented by these methods.  The\n   ``__truediv__()`` method is used when ``__future__.division`` is in\n   effect, otherwise ``__div__()`` is used.  If only one of these two\n   methods is defined, the object will not support division in the\n   alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n   ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n   reflected (swapped) operands.  These functions are only called if\n   the left operand does not support the corresponding operation and\n   the operands are of different types. [2] For instance, to evaluate\n   the expression ``x - y``, where *y* is an instance of a class that\n   has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n   ``x.__sub__(y)`` returns *NotImplemented*.\n\n   Note that ternary ``pow()`` will not try calling ``__rpow__()``\n   (the coercion rules would become too complicated).\n\n   Note: If the right operand\'s type is a subclass of the left operand\'s\n     type and that subclass provides the reflected method for the\n     operation, this method will be called before the left operand\'s\n     non-reflected method.  This behavior allows subclasses to\n     override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__idiv__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n   These methods are called to implement the augmented arithmetic\n   assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n   ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``).  These methods\n   should attempt to do the operation in-place (modifying *self*) and\n   return the result (which could be, but does not have to be,\n   *self*).  If a specific method is not defined, the augmented\n   assignment falls back to the normal methods.  For instance, to\n   execute the statement ``x += y``, where *x* is an instance of a\n   class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n   called.  If *x* is an instance of a class that does not define a\n   ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n   considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n   Called to implement the unary arithmetic operations (``-``, ``+``,\n   ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__long__(self)\nobject.__float__(self)\n\n   Called to implement the built-in functions ``complex()``,\n   ``int()``, ``long()``, and ``float()``.  Should return a value of\n   the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n   Called to implement the built-in functions ``oct()`` and ``hex()``.\n   Should return a string value.\n\nobject.__index__(self)\n\n   Called to implement ``operator.index()``.  Also called whenever\n   Python needs an integer object (such as in slicing).  Must return\n   an integer (int or long).\n\n   New in version 2.5.\n\nobject.__coerce__(self, other)\n\n   Called to implement "mixed-mode" numeric arithmetic.  Should either\n   return a 2-tuple containing *self* and *other* converted to a\n   common numeric type, or ``None`` if conversion is impossible.  When\n   the common type would be the type of ``other``, it is sufficient to\n   return ``None``, since the interpreter will also ask the other\n   object to attempt a coercion (but sometimes, if the implementation\n   of the other type cannot be changed, it is useful to do the\n   conversion to the other type here).  A return value of\n   ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion.  As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable.  Instead, here are some informal\nguidelines regarding coercion.  In Python 3, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n  no coercion takes place and the string formatting operation is\n  invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n  mode operations on types that don\'t define coercion pass the\n  original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n  ``__coerce__()`` method in response to a binary operator; the only\n  time ``__coerce__()`` is invoked is when the built-in function\n  ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n  ``NotImplemented`` is treated the same as one that is not\n  implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n  generic method names corresponding to an operator; ``__iop__()`` is\n  used for the corresponding in-place operator.  For example, for the\n  operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n  left and right variant of the binary operator, and ``__iadd__()``\n  for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried.  If this is\n  not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n  tried.  If this is also not implemented or returns\n  ``NotImplemented``, a ``TypeError`` exception is raised.  But see\n  the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n  of a built-in type or a new-style class, and the right operand is an\n  instance of a proper subclass of that type or class and overrides\n  the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n  method is tried *before* the left operand\'s ``__op__()`` method.\n\n  This is done so that a subclass can completely override binary\n  operators. Otherwise, the left operand\'s ``__op__()`` method would\n  always accept the right operand: when an instance of a given class\n  is expected, an instance of a subclass of that class is always\n  acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n  before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n  but no sooner.  If the coercion returns an object of a different\n  type for the operand whose coercion is invoked, part of the process\n  is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n  operand implements ``__iop__()``, it is invoked without any\n  coercion.  When the operation falls back to ``__op__()`` and/or\n  ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n  concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operand is a sequence that implements sequence\n  repetition, and the other is an integer (``int`` or ``long``),\n  sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n  never use coercion.  Three-way comparison (implemented by\n  ``__cmp__()``) does use coercion under the same conditions as other\n  binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n  ``long``, ``float``, and ``complex`` do not use coercion. All these\n  types implement a ``__coerce__()`` method, for use by the built-in\n  ``coerce()`` function.\n\n  Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code.  Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n   Enter the runtime context related to this object. The ``with``\n   statement will bind this method\'s return value to the target(s)\n   specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n   Exit the runtime context related to this object. The parameters\n   describe the exception that caused the context to be exited. If the\n   context was exited without an exception, all three arguments will\n   be ``None``.\n\n   If an exception is supplied, and the method wishes to suppress the\n   exception (i.e., prevent it from being propagated), it should\n   return a true value. Otherwise, the exception will be processed\n   normally upon exit from this method.\n\n   Note that ``__exit__()`` methods should not reraise the passed-in\n   exception; this is the caller\'s responsibility.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nSpecial method lookup for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n   >>> class C:\n   ...     pass\n   ...\n   >>> c1 = C()\n   >>> c2 = C()\n   >>> c1.__len__ = lambda: 5\n   >>> c2.__len__ = lambda: 9\n   >>> len(c1)\n   5\n   >>> len(c2)\n   9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary.  That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n   >>> class C(object):\n   ...     pass\n   ...\n   >>> c = C()\n   >>> c.__len__ = lambda: 5\n   >>> len(c)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n   >>> 1 .__hash__() == hash(1)\n   True\n   >>> int.__hash__() == hash(int)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n   >>> type(1).__hash__(1) == hash(1)\n   True\n   >>> type(int).__hash__(int) == hash(int)\n   True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n   >>> class Meta(type):\n   ...    def __getattribute__(*args):\n   ...       print "Metaclass getattribute invoked"\n   ...       return type.__getattribute__(*args)\n   ...\n   >>> class C(object):\n   ...     __metaclass__ = Meta\n   ...     def __len__(self):\n   ...         return 10\n   ...     def __getattribute__(*args):\n   ...         print "Class getattribute invoked"\n   ...         return object.__getattribute__(*args)\n   ...\n   >>> c = C()\n   >>> c.__len__()                 # Explicit lookup via instance\n   Class getattribute invoked\n   10\n   >>> type(c).__len__(c)          # Explicit lookup via type\n   Metaclass getattribute invoked\n   10\n   >>> len(c)                      # Implicit lookup\n   10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n    certain controlled conditions. It generally isn\'t a good idea\n    though, since it can lead to some very strange behaviour if it is\n    handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n    reflected method (such as ``__add__()``) fails the operation is\n    not supported, which is why the reflected method is not called.\n',
      'string-methods': '\nString Methods\n**************\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support.  Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based on regular expressions.\n\nstr.capitalize()\n\n   Return a copy of the string with its first character capitalized\n   and the rest lowercased.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.center(width[, fillchar])\n\n   Return centered in a string of length *width*. Padding is done\n   using the specified *fillchar* (default is a space).\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.count(sub[, start[, end]])\n\n   Return the number of non-overlapping occurrences of substring *sub*\n   in the range [*start*, *end*].  Optional arguments *start* and\n   *end* are interpreted as in slice notation.\n\nstr.decode([encoding[, errors]])\n\n   Decodes the string using the codec registered for *encoding*.\n   *encoding* defaults to the default string encoding.  *errors* may\n   be given to set a different error handling scheme.  The default is\n   ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n   Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n   name registered via ``codecs.register_error()``, see section *Codec\n   Base Classes*.\n\n   New in version 2.2.\n\n   Changed in version 2.3: Support for other error handling schemes\n   added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n   Return an encoded version of the string.  Default encoding is the\n   current default string encoding.  *errors* may be given to set a\n   different error handling scheme.  The default for *errors* is\n   ``\'strict\'``, meaning that encoding errors raise a\n   ``UnicodeError``.  Other possible values are ``\'ignore\'``,\n   ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n   any other name registered via ``codecs.register_error()``, see\n   section *Codec Base Classes*. For a list of possible encodings, see\n   section *Standard Encodings*.\n\n   New in version 2.0.\n\n   Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n   ``\'backslashreplace\'`` and other error handling schemes added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n   Return ``True`` if the string ends with the specified *suffix*,\n   otherwise return ``False``.  *suffix* can also be a tuple of\n   suffixes to look for.  With optional *start*, test beginning at\n   that position.  With optional *end*, stop comparing at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n   Return a copy of the string where all tab characters are replaced\n   by one or more spaces, depending on the current column and the\n   given tab size.  Tab positions occur every *tabsize* characters\n   (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n   To expand the string, the current column is set to zero and the\n   string is examined character by character.  If the character is a\n   tab (``\\t``), one or more space characters are inserted in the\n   result until the current column is equal to the next tab position.\n   (The tab character itself is not copied.)  If the character is a\n   newline (``\\n``) or return (``\\r``), it is copied and the current\n   column is reset to zero.  Any other character is copied unchanged\n   and the current column is incremented by one regardless of how the\n   character is represented when printed.\n\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n   \'01      012     0123    01234\'\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n   \'01  012 0123    01234\'\n\nstr.find(sub[, start[, end]])\n\n   Return the lowest index in the string where substring *sub* is\n   found, such that *sub* is contained in the slice ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` if *sub* is not found.\n\n   Note: The ``find()`` method should be used only if you need to know the\n     position of *sub*.  To check if *sub* is a substring or not, use\n     the ``in`` operator:\n\n        >>> \'Py\' in \'Python\'\n        True\n\nstr.format(*args, **kwargs)\n\n   Perform a string formatting operation.  The string on which this\n   method is called can contain literal text or replacement fields\n   delimited by braces ``{}``.  Each replacement field contains either\n   the numeric index of a positional argument, or the name of a\n   keyword argument.  Returns a copy of the string where each\n   replacement field is replaced with the string value of the\n   corresponding argument.\n\n   >>> "The sum of 1 + 2 is {0}".format(1+2)\n   \'The sum of 1 + 2 is 3\'\n\n   See *Format String Syntax* for a description of the various\n   formatting options that can be specified in format strings.\n\n   This method of string formatting is the new standard in Python 3,\n   and should be preferred to the ``%`` formatting described in\n   *String Formatting Operations* in new code.\n\n   New in version 2.6.\n\nstr.index(sub[, start[, end]])\n\n   Like ``find()``, but raise ``ValueError`` when the substring is not\n   found.\n\nstr.isalnum()\n\n   Return true if all characters in the string are alphanumeric and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isalpha()\n\n   Return true if all characters in the string are alphabetic and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isdigit()\n\n   Return true if all characters in the string are digits and there is\n   at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n   Return true if all cased characters [4] in the string are lowercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isspace()\n\n   Return true if there are only whitespace characters in the string\n   and there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.istitle()\n\n   Return true if the string is a titlecased string and there is at\n   least one character, for example uppercase characters may only\n   follow uncased characters and lowercase characters only cased ones.\n   Return false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n   Return true if all cased characters [4] in the string are uppercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n   Return a string which is the concatenation of the strings in the\n   *iterable* *iterable*.  The separator between elements is the\n   string providing this method.\n\nstr.ljust(width[, fillchar])\n\n   Return the string left justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space).  The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to lowercase.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.lstrip([chars])\n\n   Return a copy of the string with leading characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a prefix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.lstrip()\n   \'spacious   \'\n   >>> \'www.example.com\'.lstrip(\'cmowz.\')\n   \'example.com\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.partition(sep)\n\n   Split the string at the first occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing the string itself, followed by\n   two empty strings.\n\n   New in version 2.5.\n\nstr.replace(old, new[, count])\n\n   Return a copy of the string with all occurrences of substring *old*\n   replaced by *new*.  If the optional argument *count* is given, only\n   the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n   Return the highest index in the string where substring *sub* is\n   found, such that *sub* is contained within ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n   Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n   is not found.\n\nstr.rjust(width[, fillchar])\n\n   Return the string right justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space). The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.rpartition(sep)\n\n   Split the string at the last occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing two empty strings, followed by\n   the string itself.\n\n   New in version 2.5.\n\nstr.rsplit([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n   are done, the *rightmost* ones.  If *sep* is not specified or\n   ``None``, any whitespace string is a separator.  Except for\n   splitting from the right, ``rsplit()`` behaves like ``split()``\n   which is described in detail below.\n\n   New in version 2.4.\n\nstr.rstrip([chars])\n\n   Return a copy of the string with trailing characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a suffix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.rstrip()\n   \'   spacious\'\n   >>> \'mississippi\'.rstrip(\'ipz\')\n   \'mississ\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.split([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string.  If *maxsplit* is given, at most *maxsplit*\n   splits are done (thus, the list will have at most ``maxsplit+1``\n   elements).  If *maxsplit* is not specified or ``-1``, then there is\n   no limit on the number of splits (all possible splits are made).\n\n   If *sep* is given, consecutive delimiters are not grouped together\n   and are deemed to delimit empty strings (for example,\n   ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``).  The *sep*\n   argument may consist of multiple characters (for example,\n   ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n   an empty string with a specified separator returns ``[\'\']``.\n\n   If *sep* is not specified or is ``None``, a different splitting\n   algorithm is applied: runs of consecutive whitespace are regarded\n   as a single separator, and the result will contain no empty strings\n   at the start or end if the string has leading or trailing\n   whitespace.  Consequently, splitting an empty string or a string\n   consisting of just whitespace with a ``None`` separator returns\n   ``[]``.\n\n   For example, ``\' 1  2   3  \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n   and ``\'  1  2   3  \'.split(None, 1)`` returns ``[\'1\', \'2   3  \']``.\n\nstr.splitlines([keepends])\n\n   Return a list of the lines in the string, breaking at line\n   boundaries. This method uses the *universal newlines* approach to\n   splitting lines. Line breaks are not included in the resulting list\n   unless *keepends* is given and true.\n\n   For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n   ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n   ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n   \'kl\\r\\n\']``.\n\n   Unlike ``split()`` when a delimiter string *sep* is given, this\n   method returns an empty list for the empty string, and a terminal\n   line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n   Return ``True`` if string starts with the *prefix*, otherwise\n   return ``False``. *prefix* can also be a tuple of prefixes to look\n   for.  With optional *start*, test string beginning at that\n   position.  With optional *end*, stop comparing string at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *prefix*.\n\nstr.strip([chars])\n\n   Return a copy of the string with the leading and trailing\n   characters removed. The *chars* argument is a string specifying the\n   set of characters to be removed. If omitted or ``None``, the\n   *chars* argument defaults to removing whitespace. The *chars*\n   argument is not a prefix or suffix; rather, all combinations of its\n   values are stripped:\n\n   >>> \'   spacious   \'.strip()\n   \'spacious\'\n   >>> \'www.example.com\'.strip(\'cmowz.\')\n   \'example\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n   Return a copy of the string with uppercase characters converted to\n   lowercase and vice versa.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.title()\n\n   Return a titlecased version of the string where words start with an\n   uppercase character and the remaining characters are lowercase.\n\n   The algorithm uses a simple language-independent definition of a\n   word as groups of consecutive letters.  The definition works in\n   many contexts but it means that apostrophes in contractions and\n   possessives form word boundaries, which may not be the desired\n   result:\n\n      >>> "they\'re bill\'s friends from the UK".title()\n      "They\'Re Bill\'S Friends From The Uk"\n\n   A workaround for apostrophes can be constructed using regular\n   expressions:\n\n      >>> import re\n      >>> def titlecase(s):\n      ...     return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n      ...                   lambda mo: mo.group(0)[0].upper() +\n      ...                              mo.group(0)[1:].lower(),\n      ...                   s)\n      ...\n      >>> titlecase("they\'re bill\'s friends.")\n      "They\'re Bill\'s Friends."\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n   Return a copy of the string where all characters occurring in the\n   optional argument *deletechars* are removed, and the remaining\n   characters have been mapped through the given translation table,\n   which must be a string of length 256.\n\n   You can use the ``maketrans()`` helper function in the ``string``\n   module to create a translation table. For string objects, set the\n   *table* argument to ``None`` for translations that only delete\n   characters:\n\n   >>> \'read this short text\'.translate(None, \'aeiou\')\n   \'rd ths shrt txt\'\n\n   New in version 2.6: Support for a ``None`` *table* argument.\n\n   For Unicode objects, the ``translate()`` method does not accept the\n   optional *deletechars* argument.  Instead, it returns a copy of the\n   *s* where all characters have been mapped through the given\n   translation table which must be a mapping of Unicode ordinals to\n   Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n   are left untouched. Characters mapped to ``None`` are deleted.\n   Note, a more flexible approach is to create a custom character\n   mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n   for an example).\n\nstr.upper()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to uppercase.  Note that ``str.upper().isupper()`` might\n   be ``False`` if ``s`` contains uncased characters or if the Unicode\n   category of the resulting character(s) is not "Lu" (Letter,\n   uppercase), but e.g. "Lt" (Letter, titlecase).\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.zfill(width)\n\n   Return the numeric string left filled with zeros in a string of\n   length *width*.  A sign prefix is handled correctly.  The original\n   string is returned if *width* is less than or equal to ``len(s)``.\n\n   New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n   Return ``True`` if there are only numeric characters in S,\n   ``False`` otherwise. Numeric characters include digit characters,\n   and all characters that have the Unicode numeric value property,\n   e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n   Return ``True`` if there are only decimal characters in S,\n   ``False`` otherwise. Decimal characters include digit characters,\n   and all characters that can be used to form decimal-radix numbers,\n   e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n',
    - 'strings': '\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n   stringliteral   ::= [stringprefix](shortstring | longstring)\n   stringprefix    ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n                    | "b" | "B" | "br" | "Br" | "bR" | "BR"\n   shortstring     ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n   longstring      ::= "\'\'\'" longstringitem* "\'\'\'"\n                  | \'"""\' longstringitem* \'"""\'\n   shortstringitem ::= shortstringchar | escapeseq\n   longstringitem  ::= longstringchar | escapeseq\n   shortstringchar ::= \n   longstringchar  ::= \n   escapeseq       ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``).  They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*).  The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences.  A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string.  Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646.  Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3).  A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string.  (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C.  The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence   | Meaning                           | Notes   |\n+===================+===================================+=========+\n| ``\\newline``      | Ignored                           |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\\``            | Backslash (``\\``)                 |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\'``            | Single quote (``\'``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\"``            | Double quote (``"``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\a``            | ASCII Bell (BEL)                  |         |\n+-------------------+-----------------------------------+---------+\n| ``\\b``            | ASCII Backspace (BS)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\f``            | ASCII Formfeed (FF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\n``            | ASCII Linefeed (LF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\N{name}``      | Character named *name* in the     |         |\n|                   | Unicode database (Unicode only)   |         |\n+-------------------+-----------------------------------+---------+\n| ``\\r``            | ASCII Carriage Return (CR)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\t``            | ASCII Horizontal Tab (TAB)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx``        | Character with 16-bit hex value   | (1)     |\n|                   | *xxxx* (Unicode only)             |         |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx``    | Character with 32-bit hex value   | (2)     |\n|                   | *xxxxxxxx* (Unicode only)         |         |\n+-------------------+-----------------------------------+---------+\n| ``\\v``            | ASCII Vertical Tab (VT)           |         |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo``          | Character with octal value *ooo*  | (3,5)   |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh``          | Character with hex value *hh*     | (4,5)   |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n   encoded using this escape sequence.\n\n2. Any Unicode character can be encoded this way, but characters\n   outside the Basic Multilingual Plane (BMP) will be encoded using a\n   surrogate pair if Python is compiled to use 16-bit code units (the\n   default).  Individual code units which form parts of a surrogate\n   pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n   with the given value; it is not necessary that the byte encodes a\n   character in the source character set. In a Unicode literal, these\n   escapes denote a Unicode character with the given value.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*.  (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.)  It is also\nimportant to note that the escape sequences marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*.  For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``.  String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes).  Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape the following quote character).  Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while  *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string.  As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n',
    + 'strings': '\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n   stringliteral   ::= [stringprefix](shortstring | longstring)\n   stringprefix    ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n                    | "b" | "B" | "br" | "Br" | "bR" | "BR"\n   shortstring     ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n   longstring      ::= "\'\'\'" longstringitem* "\'\'\'"\n                  | \'"""\' longstringitem* \'"""\'\n   shortstringitem ::= shortstringchar | escapeseq\n   longstringitem  ::= longstringchar | escapeseq\n   shortstringchar ::= \n   longstringchar  ::= \n   escapeseq       ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``).  They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*).  The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences.  A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string.  Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646.  Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3).  A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string.  (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C.  The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence   | Meaning                           | Notes   |\n+===================+===================================+=========+\n| ``\\newline``      | Ignored                           |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\\``            | Backslash (``\\``)                 |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\'``            | Single quote (``\'``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\"``            | Double quote (``"``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\a``            | ASCII Bell (BEL)                  |         |\n+-------------------+-----------------------------------+---------+\n| ``\\b``            | ASCII Backspace (BS)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\f``            | ASCII Formfeed (FF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\n``            | ASCII Linefeed (LF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\N{name}``      | Character named *name* in the     |         |\n|                   | Unicode database (Unicode only)   |         |\n+-------------------+-----------------------------------+---------+\n| ``\\r``            | ASCII Carriage Return (CR)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\t``            | ASCII Horizontal Tab (TAB)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx``        | Character with 16-bit hex value   | (1)     |\n|                   | *xxxx* (Unicode only)             |         |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx``    | Character with 32-bit hex value   | (2)     |\n|                   | *xxxxxxxx* (Unicode only)         |         |\n+-------------------+-----------------------------------+---------+\n| ``\\v``            | ASCII Vertical Tab (VT)           |         |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo``          | Character with octal value *ooo*  | (3,5)   |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh``          | Character with hex value *hh*     | (4,5)   |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n   encoded using this escape sequence.\n\n2. Any Unicode character can be encoded this way, but characters\n   outside the Basic Multilingual Plane (BMP) will be encoded using a\n   surrogate pair if Python is compiled to use 16-bit code units (the\n   default).\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n   with the given value; it is not necessary that the byte encodes a\n   character in the source character set. In a Unicode literal, these\n   escapes denote a Unicode character with the given value.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*.  (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.)  It is also\nimportant to note that the escape sequences marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*.  For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``.  String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes).  Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape the following quote character).  Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while  *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string.  As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n',
      'subscriptions': '\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n   subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object of a sequence or mapping type.\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey.  (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to a\nplain integer.  If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``x[-1]`` selects the last item of\n``x``.)  The resulting value must be a nonnegative integer less than\nthe number of items in the sequence, and the subscription selects the\nitem whose index is that value (counting from zero).\n\nA string\'s items are characters.  A character is not a separate data\ntype but a string of exactly one character.\n',
      'truth': "\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an ``if`` or\n``while`` condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* ``None``\n\n* ``False``\n\n* zero of any numeric type, for example, ``0``, ``0L``, ``0.0``,\n  ``0j``.\n\n* any empty sequence, for example, ``''``, ``()``, ``[]``.\n\n* any empty mapping, for example, ``{}``.\n\n* instances of user-defined classes, if the class defines a\n  ``__nonzero__()`` or ``__len__()`` method, when that method returns\n  the integer zero or ``bool`` value ``False``. [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn ``0`` or ``False`` for false and ``1`` or ``True`` for true,\nunless otherwise stated. (Important exception: the Boolean operations\n``or`` and ``and`` always return one of their operands.)\n",
      'try': '\nThe ``try`` statement\n*********************\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression [("as" | ",") target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object, or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified in that except clause, if present, and the except\nclause\'s suite is executed.  All except clauses must have an\nexecutable block.  When the end of this block is reached, execution\ncontinues normally after the entire try statement.  (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``.  Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program.  As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception, it is re-raised at the end\nof the ``finally`` clause. If the ``finally`` clause raises another\nexception or executes a ``return`` or ``break`` statement, the saved\nexception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n',
    - 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python.  Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types.  Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.).\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\'  These are attributes that provide access to the\nimplementation and are not intended for general use.  Their definition\nmay change in the future.\n\nNone\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name ``None``.\n   It is used to signify the absence of a value in many situations,\n   e.g., it is returned from functions that don\'t explicitly return\n   anything. Its truth value is false.\n\nNotImplemented\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``NotImplemented``. Numeric methods and rich comparison methods may\n   return this value if they do not implement the operation for the\n   operands provided.  (The interpreter will then try the reflected\n   operation, or some other fallback, depending on the operator.)  Its\n   truth value is true.\n\nEllipsis\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``Ellipsis``. It is used to indicate the presence of the ``...``\n   syntax in a slice.  Its truth value is true.\n\n``numbers.Number``\n   These are created by numeric literals and returned as results by\n   arithmetic operators and arithmetic built-in functions.  Numeric\n   objects are immutable; once created their value never changes.\n   Python numbers are of course strongly related to mathematical\n   numbers, but subject to the limitations of numerical representation\n   in computers.\n\n   Python distinguishes between integers, floating point numbers, and\n   complex numbers:\n\n   ``numbers.Integral``\n      These represent elements from the mathematical set of integers\n      (positive and negative).\n\n      There are three types of integers:\n\n      Plain integers\n         These represent numbers in the range -2147483648 through\n         2147483647. (The range may be larger on machines with a\n         larger natural word size, but not smaller.)  When the result\n         of an operation would fall outside this range, the result is\n         normally returned as a long integer (in some cases, the\n         exception ``OverflowError`` is raised instead).  For the\n         purpose of shift and mask operations, integers are assumed to\n         have a binary, 2\'s complement notation using 32 or more bits,\n         and hiding no bits from the user (i.e., all 4294967296\n         different bit patterns correspond to different values).\n\n      Long integers\n         These represent numbers in an unlimited range, subject to\n         available (virtual) memory only.  For the purpose of shift\n         and mask operations, a binary representation is assumed, and\n         negative numbers are represented in a variant of 2\'s\n         complement which gives the illusion of an infinite string of\n         sign bits extending to the left.\n\n      Booleans\n         These represent the truth values False and True.  The two\n         objects representing the values False and True are the only\n         Boolean objects. The Boolean type is a subtype of plain\n         integers, and Boolean values behave like the values 0 and 1,\n         respectively, in almost all contexts, the exception being\n         that when converted to a string, the strings ``"False"`` or\n         ``"True"`` are returned, respectively.\n\n      The rules for integer representation are intended to give the\n      most meaningful interpretation of shift and mask operations\n      involving negative integers and the least surprises when\n      switching between the plain and long integer domains.  Any\n      operation, if it yields a result in the plain integer domain,\n      will yield the same result in the long integer domain or when\n      using mixed operands.  The switch between domains is transparent\n      to the programmer.\n\n   ``numbers.Real`` (``float``)\n      These represent machine-level double precision floating point\n      numbers. You are at the mercy of the underlying machine\n      architecture (and C or Java implementation) for the accepted\n      range and handling of overflow. Python does not support single-\n      precision floating point numbers; the savings in processor and\n      memory usage that are usually the reason for using these is\n      dwarfed by the overhead of using objects in Python, so there is\n      no reason to complicate the language with two kinds of floating\n      point numbers.\n\n   ``numbers.Complex``\n      These represent complex numbers as a pair of machine-level\n      double precision floating point numbers.  The same caveats apply\n      as for floating point numbers. The real and imaginary parts of a\n      complex number ``z`` can be retrieved through the read-only\n      attributes ``z.real`` and ``z.imag``.\n\nSequences\n   These represent finite ordered sets indexed by non-negative\n   numbers. The built-in function ``len()`` returns the number of\n   items of a sequence. When the length of a sequence is *n*, the\n   index set contains the numbers 0, 1, ..., *n*-1.  Item *i* of\n   sequence *a* is selected by ``a[i]``.\n\n   Sequences also support slicing: ``a[i:j]`` selects all items with\n   index *k* such that *i* ``<=`` *k* ``<`` *j*.  When used as an\n   expression, a slice is a sequence of the same type.  This implies\n   that the index set is renumbered so that it starts at 0.\n\n   Some sequences also support "extended slicing" with a third "step"\n   parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n   where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n   *j*.\n\n   Sequences are distinguished according to their mutability:\n\n   Immutable sequences\n      An object of an immutable sequence type cannot change once it is\n      created.  (If the object contains references to other objects,\n      these other objects may be mutable and may be changed; however,\n      the collection of objects directly referenced by an immutable\n      object cannot change.)\n\n      The following types are immutable sequences:\n\n      Strings\n         The items of a string are characters.  There is no separate\n         character type; a character is represented by a string of one\n         item. Characters represent (at least) 8-bit bytes.  The\n         built-in functions ``chr()`` and ``ord()`` convert between\n         characters and nonnegative integers representing the byte\n         values.  Bytes with the values 0-127 usually represent the\n         corresponding ASCII values, but the interpretation of values\n         is up to the program.  The string data type is also used to\n         represent arrays of bytes, e.g., to hold data read from a\n         file.\n\n         (On systems whose native character set is not ASCII, strings\n         may use EBCDIC in their internal representation, provided the\n         functions ``chr()`` and ``ord()`` implement a mapping between\n         ASCII and EBCDIC, and string comparison preserves the ASCII\n         order. Or perhaps someone can propose a better rule?)\n\n      Unicode\n         The items of a Unicode object are Unicode code units.  A\n         Unicode code unit is represented by a Unicode object of one\n         item and can hold either a 16-bit or 32-bit value\n         representing a Unicode ordinal (the maximum value for the\n         ordinal is given in ``sys.maxunicode``, and depends on how\n         Python is configured at compile time).  Surrogate pairs may\n         be present in the Unicode object, and will be reported as two\n         separate items.  The built-in functions ``unichr()`` and\n         ``ord()`` convert between code units and nonnegative integers\n         representing the Unicode ordinals as defined in the Unicode\n         Standard 3.0. Conversion from and to other encodings are\n         possible through the Unicode method ``encode()`` and the\n         built-in function ``unicode()``.\n\n      Tuples\n         The items of a tuple are arbitrary Python objects. Tuples of\n         two or more items are formed by comma-separated lists of\n         expressions.  A tuple of one item (a \'singleton\') can be\n         formed by affixing a comma to an expression (an expression by\n         itself does not create a tuple, since parentheses must be\n         usable for grouping of expressions).  An empty tuple can be\n         formed by an empty pair of parentheses.\n\n   Mutable sequences\n      Mutable sequences can be changed after they are created.  The\n      subscription and slicing notations can be used as the target of\n      assignment and ``del`` (delete) statements.\n\n      There are currently two intrinsic mutable sequence types:\n\n      Lists\n         The items of a list are arbitrary Python objects.  Lists are\n         formed by placing a comma-separated list of expressions in\n         square brackets. (Note that there are no special cases needed\n         to form lists of length 0 or 1.)\n\n      Byte Arrays\n         A bytearray object is a mutable array. They are created by\n         the built-in ``bytearray()`` constructor.  Aside from being\n         mutable (and hence unhashable), byte arrays otherwise provide\n         the same interface and functionality as immutable bytes\n         objects.\n\n      The extension module ``array`` provides an additional example of\n      a mutable sequence type.\n\nSet types\n   These represent unordered, finite sets of unique, immutable\n   objects. As such, they cannot be indexed by any subscript. However,\n   they can be iterated over, and the built-in function ``len()``\n   returns the number of items in a set. Common uses for sets are fast\n   membership testing, removing duplicates from a sequence, and\n   computing mathematical operations such as intersection, union,\n   difference, and symmetric difference.\n\n   For set elements, the same immutability rules apply as for\n   dictionary keys. Note that numeric types obey the normal rules for\n   numeric comparison: if two numbers compare equal (e.g., ``1`` and\n   ``1.0``), only one of them can be contained in a set.\n\n   There are currently two intrinsic set types:\n\n   Sets\n      These represent a mutable set. They are created by the built-in\n      ``set()`` constructor and can be modified afterwards by several\n      methods, such as ``add()``.\n\n   Frozen sets\n      These represent an immutable set.  They are created by the\n      built-in ``frozenset()`` constructor.  As a frozenset is\n      immutable and *hashable*, it can be used again as an element of\n      another set, or as a dictionary key.\n\nMappings\n   These represent finite sets of objects indexed by arbitrary index\n   sets. The subscript notation ``a[k]`` selects the item indexed by\n   ``k`` from the mapping ``a``; this can be used in expressions and\n   as the target of assignments or ``del`` statements. The built-in\n   function ``len()`` returns the number of items in a mapping.\n\n   There is currently a single intrinsic mapping type:\n\n   Dictionaries\n      These represent finite sets of objects indexed by nearly\n      arbitrary values.  The only types of values not acceptable as\n      keys are values containing lists or dictionaries or other\n      mutable types that are compared by value rather than by object\n      identity, the reason being that the efficient implementation of\n      dictionaries requires a key\'s hash value to remain constant.\n      Numeric types used for keys obey the normal rules for numeric\n      comparison: if two numbers compare equal (e.g., ``1`` and\n      ``1.0``) then they can be used interchangeably to index the same\n      dictionary entry.\n\n      Dictionaries are mutable; they can be created by the ``{...}``\n      notation (see section *Dictionary displays*).\n\n      The extension modules ``dbm``, ``gdbm``, and ``bsddb`` provide\n      additional examples of mapping types.\n\nCallable types\n   These are the types to which the function call operation (see\n   section *Calls*) can be applied:\n\n   User-defined functions\n      A user-defined function object is created by a function\n      definition (see section *Function definitions*).  It should be\n      called with an argument list containing the same number of items\n      as the function\'s formal parameter list.\n\n      Special attributes:\n\n      +-------------------------+---------------------------------+-------------+\n      | Attribute               | Meaning                         |             |\n      +=========================+=================================+=============+\n      | ``func_doc``            | The function\'s documentation    | Writable    |\n      |                         | string, or ``None`` if          |             |\n      |                         | unavailable                     |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``__doc__``             | Another way of spelling         | Writable    |\n      |                         | ``func_doc``                    |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_name``           | The function\'s name             | Writable    |\n      +-------------------------+---------------------------------+-------------+\n      | ``__name__``            | Another way of spelling         | Writable    |\n      |                         | ``func_name``                   |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``__module__``          | The name of the module the      | Writable    |\n      |                         | function was defined in, or     |             |\n      |                         | ``None`` if unavailable.        |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_defaults``       | A tuple containing default      | Writable    |\n      |                         | argument values for those       |             |\n      |                         | arguments that have defaults,   |             |\n      |                         | or ``None`` if no arguments     |             |\n      |                         | have a default value            |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_code``           | The code object representing    | Writable    |\n      |                         | the compiled function body.     |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_globals``        | A reference to the dictionary   | Read-only   |\n      |                         | that holds the function\'s       |             |\n      |                         | global variables --- the global |             |\n      |                         | namespace of the module in      |             |\n      |                         | which the function was defined. |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_dict``           | The namespace supporting        | Writable    |\n      |                         | arbitrary function attributes.  |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_closure``        | ``None`` or a tuple of cells    | Read-only   |\n      |                         | that contain bindings for the   |             |\n      |                         | function\'s free variables.      |             |\n      +-------------------------+---------------------------------+-------------+\n\n      Most of the attributes labelled "Writable" check the type of the\n      assigned value.\n\n      Changed in version 2.4: ``func_name`` is now writable.\n\n      Function objects also support getting and setting arbitrary\n      attributes, which can be used, for example, to attach metadata\n      to functions.  Regular attribute dot-notation is used to get and\n      set such attributes. *Note that the current implementation only\n      supports function attributes on user-defined functions. Function\n      attributes on built-in functions may be supported in the\n      future.*\n\n      Additional information about a function\'s definition can be\n      retrieved from its code object; see the description of internal\n      types below.\n\n   User-defined methods\n      A user-defined method object combines a class, a class instance\n      (or ``None``) and any callable object (normally a user-defined\n      function).\n\n      Special read-only attributes: ``im_self`` is the class instance\n      object, ``im_func`` is the function object; ``im_class`` is the\n      class of ``im_self`` for bound methods or the class that asked\n      for the method for unbound methods; ``__doc__`` is the method\'s\n      documentation (same as ``im_func.__doc__``); ``__name__`` is the\n      method name (same as ``im_func.__name__``); ``__module__`` is\n      the name of the module the method was defined in, or ``None`` if\n      unavailable.\n\n      Changed in version 2.2: ``im_self`` used to refer to the class\n      that defined the method.\n\n      Changed in version 2.6: For Python 3 forward-compatibility,\n      ``im_func`` is also available as ``__func__``, and ``im_self``\n      as ``__self__``.\n\n      Methods also support accessing (but not setting) the arbitrary\n      function attributes on the underlying function object.\n\n      User-defined method objects may be created when getting an\n      attribute of a class (perhaps via an instance of that class), if\n      that attribute is a user-defined function object, an unbound\n      user-defined method object, or a class method object. When the\n      attribute is a user-defined method object, a new method object\n      is only created if the class from which it is being retrieved is\n      the same as, or a derived class of, the class stored in the\n      original method object; otherwise, the original method object is\n      used as it is.\n\n      When a user-defined method object is created by retrieving a\n      user-defined function object from a class, its ``im_self``\n      attribute is ``None`` and the method object is said to be\n      unbound. When one is created by retrieving a user-defined\n      function object from a class via one of its instances, its\n      ``im_self`` attribute is the instance, and the method object is\n      said to be bound. In either case, the new method\'s ``im_class``\n      attribute is the class from which the retrieval takes place, and\n      its ``im_func`` attribute is the original function object.\n\n      When a user-defined method object is created by retrieving\n      another method object from a class or instance, the behaviour is\n      the same as for a function object, except that the ``im_func``\n      attribute of the new instance is not the original method object\n      but its ``im_func`` attribute.\n\n      When a user-defined method object is created by retrieving a\n      class method object from a class or instance, its ``im_self``\n      attribute is the class itself, and its ``im_func`` attribute is\n      the function object underlying the class method.\n\n      When an unbound user-defined method object is called, the\n      underlying function (``im_func``) is called, with the\n      restriction that the first argument must be an instance of the\n      proper class (``im_class``) or of a derived class thereof.\n\n      When a bound user-defined method object is called, the\n      underlying function (``im_func``) is called, inserting the class\n      instance (``im_self``) in front of the argument list.  For\n      instance, when ``C`` is a class which contains a definition for\n      a function ``f()``, and ``x`` is an instance of ``C``, calling\n      ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n      When a user-defined method object is derived from a class method\n      object, the "class instance" stored in ``im_self`` will actually\n      be the class itself, so that calling either ``x.f(1)`` or\n      ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n      the underlying function.\n\n      Note that the transformation from function object to (unbound or\n      bound) method object happens each time the attribute is\n      retrieved from the class or instance. In some cases, a fruitful\n      optimization is to assign the attribute to a local variable and\n      call that local variable. Also notice that this transformation\n      only happens for user-defined functions; other callable objects\n      (and all non-callable objects) are retrieved without\n      transformation.  It is also important to note that user-defined\n      functions which are attributes of a class instance are not\n      converted to bound methods; this *only* happens when the\n      function is an attribute of the class.\n\n   Generator functions\n      A function or method which uses the ``yield`` statement (see\n      section *The yield statement*) is called a *generator function*.\n      Such a function, when called, always returns an iterator object\n      which can be used to execute the body of the function:  calling\n      the iterator\'s ``next()`` method will cause the function to\n      execute until it provides a value using the ``yield`` statement.\n      When the function executes a ``return`` statement or falls off\n      the end, a ``StopIteration`` exception is raised and the\n      iterator will have reached the end of the set of values to be\n      returned.\n\n   Built-in functions\n      A built-in function object is a wrapper around a C function.\n      Examples of built-in functions are ``len()`` and ``math.sin()``\n      (``math`` is a standard built-in module). The number and type of\n      the arguments are determined by the C function. Special read-\n      only attributes: ``__doc__`` is the function\'s documentation\n      string, or ``None`` if unavailable; ``__name__`` is the\n      function\'s name; ``__self__`` is set to ``None`` (but see the\n      next item); ``__module__`` is the name of the module the\n      function was defined in or ``None`` if unavailable.\n\n   Built-in methods\n      This is really a different disguise of a built-in function, this\n      time containing an object passed to the C function as an\n      implicit extra argument.  An example of a built-in method is\n      ``alist.append()``, assuming *alist* is a list object. In this\n      case, the special read-only attribute ``__self__`` is set to the\n      object denoted by *alist*.\n\n   Class Types\n      Class types, or "new-style classes," are callable.  These\n      objects normally act as factories for new instances of\n      themselves, but variations are possible for class types that\n      override ``__new__()``.  The arguments of the call are passed to\n      ``__new__()`` and, in the typical case, to ``__init__()`` to\n      initialize the new instance.\n\n   Classic Classes\n      Class objects are described below.  When a class object is\n      called, a new class instance (also described below) is created\n      and returned.  This implies a call to the class\'s ``__init__()``\n      method if it has one.  Any arguments are passed on to the\n      ``__init__()`` method.  If there is no ``__init__()`` method,\n      the class must be called without arguments.\n\n   Class instances\n      Class instances are described below.  Class instances are\n      callable only when the class has a ``__call__()`` method;\n      ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\n\nModules\n   Modules are imported by the ``import`` statement (see section *The\n   import statement*). A module object has a namespace implemented by\n   a dictionary object (this is the dictionary referenced by the\n   func_globals attribute of functions defined in the module).\n   Attribute references are translated to lookups in this dictionary,\n   e.g., ``m.x`` is equivalent to ``m.__dict__["x"]``. A module object\n   does not contain the code object used to initialize the module\n   (since it isn\'t needed once the initialization is done).\n\n   Attribute assignment updates the module\'s namespace dictionary,\n   e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n   Special read-only attribute: ``__dict__`` is the module\'s namespace\n   as a dictionary object.\n\n   **CPython implementation detail:** Because of the way CPython\n   clears module dictionaries, the module dictionary will be cleared\n   when the module falls out of scope even if the dictionary still has\n   live references.  To avoid this, copy the dictionary or keep the\n   module around while using its dictionary directly.\n\n   Predefined (writable) attributes: ``__name__`` is the module\'s\n   name; ``__doc__`` is the module\'s documentation string, or ``None``\n   if unavailable; ``__file__`` is the pathname of the file from which\n   the module was loaded, if it was loaded from a file. The\n   ``__file__`` attribute is not present for C modules that are\n   statically linked into the interpreter; for extension modules\n   loaded dynamically from a shared library, it is the pathname of the\n   shared library file.\n\nClasses\n   Both class types (new-style classes) and class objects (old-\n   style/classic classes) are typically created by class definitions\n   (see section *Class definitions*).  A class has a namespace\n   implemented by a dictionary object. Class attribute references are\n   translated to lookups in this dictionary, e.g., ``C.x`` is\n   translated to ``C.__dict__["x"]`` (although for new-style classes\n   in particular there are a number of hooks which allow for other\n   means of locating attributes). When the attribute name is not found\n   there, the attribute search continues in the base classes.  For\n   old-style classes, the search is depth-first, left-to-right in the\n   order of occurrence in the base class list. New-style classes use\n   the more complex C3 method resolution order which behaves correctly\n   even in the presence of \'diamond\' inheritance structures where\n   there are multiple inheritance paths leading back to a common\n   ancestor. Additional details on the C3 MRO used by new-style\n   classes can be found in the documentation accompanying the 2.3\n   release at http://www.python.org/download/releases/2.3/mro/.\n\n   When a class attribute reference (for class ``C``, say) would yield\n   a user-defined function object or an unbound user-defined method\n   object whose associated class is either ``C`` or one of its base\n   classes, it is transformed into an unbound user-defined method\n   object whose ``im_class`` attribute is ``C``. When it would yield a\n   class method object, it is transformed into a bound user-defined\n   method object whose ``im_self`` attribute is ``C``.  When it would\n   yield a static method object, it is transformed into the object\n   wrapped by the static method object. See section *Implementing\n   Descriptors* for another way in which attributes retrieved from a\n   class may differ from those actually contained in its ``__dict__``\n   (note that only new-style classes support descriptors).\n\n   Class attribute assignments update the class\'s dictionary, never\n   the dictionary of a base class.\n\n   A class object can be called (see above) to yield a class instance\n   (see below).\n\n   Special attributes: ``__name__`` is the class name; ``__module__``\n   is the module name in which the class was defined; ``__dict__`` is\n   the dictionary containing the class\'s namespace; ``__bases__`` is a\n   tuple (possibly empty or a singleton) containing the base classes,\n   in the order of their occurrence in the base class list;\n   ``__doc__`` is the class\'s documentation string, or None if\n   undefined.\n\nClass instances\n   A class instance is created by calling a class object (see above).\n   A class instance has a namespace implemented as a dictionary which\n   is the first place in which attribute references are searched.\n   When an attribute is not found there, and the instance\'s class has\n   an attribute by that name, the search continues with the class\n   attributes.  If a class attribute is found that is a user-defined\n   function object or an unbound user-defined method object whose\n   associated class is the class (call it ``C``) of the instance for\n   which the attribute reference was initiated or one of its bases, it\n   is transformed into a bound user-defined method object whose\n   ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n   the instance. Static method and class method objects are also\n   transformed, as if they had been retrieved from class ``C``; see\n   above under "Classes". See section *Implementing Descriptors* for\n   another way in which attributes of a class retrieved via its\n   instances may differ from the objects actually stored in the\n   class\'s ``__dict__``. If no class attribute is found, and the\n   object\'s class has a ``__getattr__()`` method, that is called to\n   satisfy the lookup.\n\n   Attribute assignments and deletions update the instance\'s\n   dictionary, never a class\'s dictionary.  If the class has a\n   ``__setattr__()`` or ``__delattr__()`` method, this is called\n   instead of updating the instance dictionary directly.\n\n   Class instances can pretend to be numbers, sequences, or mappings\n   if they have methods with certain special names.  See section\n   *Special method names*.\n\n   Special attributes: ``__dict__`` is the attribute dictionary;\n   ``__class__`` is the instance\'s class.\n\nFiles\n   A file object represents an open file.  File objects are created by\n   the ``open()`` built-in function, and also by ``os.popen()``,\n   ``os.fdopen()``, and the ``makefile()`` method of socket objects\n   (and perhaps by other functions or methods provided by extension\n   modules).  The objects ``sys.stdin``, ``sys.stdout`` and\n   ``sys.stderr`` are initialized to file objects corresponding to the\n   interpreter\'s standard input, output and error streams.  See *File\n   Objects* for complete documentation of file objects.\n\nInternal types\n   A few types used internally by the interpreter are exposed to the\n   user. Their definitions may change with future versions of the\n   interpreter, but they are mentioned here for completeness.\n\n   Code objects\n      Code objects represent *byte-compiled* executable Python code,\n      or *bytecode*. The difference between a code object and a\n      function object is that the function object contains an explicit\n      reference to the function\'s globals (the module in which it was\n      defined), while a code object contains no context; also the\n      default argument values are stored in the function object, not\n      in the code object (because they represent values calculated at\n      run-time).  Unlike function objects, code objects are immutable\n      and contain no references (directly or indirectly) to mutable\n      objects.\n\n      Special read-only attributes: ``co_name`` gives the function\n      name; ``co_argcount`` is the number of positional arguments\n      (including arguments with default values); ``co_nlocals`` is the\n      number of local variables used by the function (including\n      arguments); ``co_varnames`` is a tuple containing the names of\n      the local variables (starting with the argument names);\n      ``co_cellvars`` is a tuple containing the names of local\n      variables that are referenced by nested functions;\n      ``co_freevars`` is a tuple containing the names of free\n      variables; ``co_code`` is a string representing the sequence of\n      bytecode instructions; ``co_consts`` is a tuple containing the\n      literals used by the bytecode; ``co_names`` is a tuple\n      containing the names used by the bytecode; ``co_filename`` is\n      the filename from which the code was compiled;\n      ``co_firstlineno`` is the first line number of the function;\n      ``co_lnotab`` is a string encoding the mapping from bytecode\n      offsets to line numbers (for details see the source code of the\n      interpreter); ``co_stacksize`` is the required stack size\n      (including local variables); ``co_flags`` is an integer encoding\n      a number of flags for the interpreter.\n\n      The following flag bits are defined for ``co_flags``: bit\n      ``0x04`` is set if the function uses the ``*arguments`` syntax\n      to accept an arbitrary number of positional arguments; bit\n      ``0x08`` is set if the function uses the ``**keywords`` syntax\n      to accept arbitrary keyword arguments; bit ``0x20`` is set if\n      the function is a generator.\n\n      Future feature declarations (``from __future__ import\n      division``) also use bits in ``co_flags`` to indicate whether a\n      code object was compiled with a particular feature enabled: bit\n      ``0x2000`` is set if the function was compiled with future\n      division enabled; bits ``0x10`` and ``0x1000`` were used in\n      earlier versions of Python.\n\n      Other bits in ``co_flags`` are reserved for internal use.\n\n      If a code object represents a function, the first item in\n      ``co_consts`` is the documentation string of the function, or\n      ``None`` if undefined.\n\n   Frame objects\n      Frame objects represent execution frames.  They may occur in\n      traceback objects (see below).\n\n      Special read-only attributes: ``f_back`` is to the previous\n      stack frame (towards the caller), or ``None`` if this is the\n      bottom stack frame; ``f_code`` is the code object being executed\n      in this frame; ``f_locals`` is the dictionary used to look up\n      local variables; ``f_globals`` is used for global variables;\n      ``f_builtins`` is used for built-in (intrinsic) names;\n      ``f_restricted`` is a flag indicating whether the function is\n      executing in restricted execution mode; ``f_lasti`` gives the\n      precise instruction (this is an index into the bytecode string\n      of the code object).\n\n      Special writable attributes: ``f_trace``, if not ``None``, is a\n      function called at the start of each source code line (this is\n      used by the debugger); ``f_exc_type``, ``f_exc_value``,\n      ``f_exc_traceback`` represent the last exception raised in the\n      parent frame provided another exception was ever raised in the\n      current frame (in all other cases they are None); ``f_lineno``\n      is the current line number of the frame --- writing to this from\n      within a trace function jumps to the given line (only for the\n      bottom-most frame).  A debugger can implement a Jump command\n      (aka Set Next Statement) by writing to f_lineno.\n\n   Traceback objects\n      Traceback objects represent a stack trace of an exception.  A\n      traceback object is created when an exception occurs.  When the\n      search for an exception handler unwinds the execution stack, at\n      each unwound level a traceback object is inserted in front of\n      the current traceback.  When an exception handler is entered,\n      the stack trace is made available to the program. (See section\n      *The try statement*.) It is accessible as ``sys.exc_traceback``,\n      and also as the third item of the tuple returned by\n      ``sys.exc_info()``.  The latter is the preferred interface,\n      since it works correctly when the program is using multiple\n      threads. When the program contains no suitable handler, the\n      stack trace is written (nicely formatted) to the standard error\n      stream; if the interpreter is interactive, it is also made\n      available to the user as ``sys.last_traceback``.\n\n      Special read-only attributes: ``tb_next`` is the next level in\n      the stack trace (towards the frame where the exception\n      occurred), or ``None`` if there is no next level; ``tb_frame``\n      points to the execution frame of the current level;\n      ``tb_lineno`` gives the line number where the exception\n      occurred; ``tb_lasti`` indicates the precise instruction.  The\n      line number and last instruction in the traceback may differ\n      from the line number of its frame object if the exception\n      occurred in a ``try`` statement with no matching except clause\n      or with a finally clause.\n\n   Slice objects\n      Slice objects are used to represent slices when *extended slice\n      syntax* is used. This is a slice using two colons, or multiple\n      slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n      ``a[i:j, k:l]``, or ``a[..., i:j]``.  They are also created by\n      the built-in ``slice()`` function.\n\n      Special read-only attributes: ``start`` is the lower bound;\n      ``stop`` is the upper bound; ``step`` is the step value; each is\n      ``None`` if omitted. These attributes can have any type.\n\n      Slice objects support one method:\n\n      slice.indices(self, length)\n\n         This method takes a single integer argument *length* and\n         computes information about the extended slice that the slice\n         object would describe if applied to a sequence of *length*\n         items.  It returns a tuple of three integers; respectively\n         these are the *start* and *stop* indices and the *step* or\n         stride length of the slice. Missing or out-of-bounds indices\n         are handled in a manner consistent with regular slices.\n\n         New in version 2.3.\n\n   Static method objects\n      Static method objects provide a way of defeating the\n      transformation of function objects to method objects described\n      above. A static method object is a wrapper around any other\n      object, usually a user-defined method object. When a static\n      method object is retrieved from a class or a class instance, the\n      object actually returned is the wrapped object, which is not\n      subject to any further transformation. Static method objects are\n      not themselves callable, although the objects they wrap usually\n      are. Static method objects are created by the built-in\n      ``staticmethod()`` constructor.\n\n   Class method objects\n      A class method object, like a static method object, is a wrapper\n      around another object that alters the way in which that object\n      is retrieved from classes and class instances. The behaviour of\n      class method objects upon such retrieval is described above,\n      under "User-defined methods". Class method objects are created\n      by the built-in ``classmethod()`` constructor.\n',
    + 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python.  Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types.  Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.).\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\'  These are attributes that provide access to the\nimplementation and are not intended for general use.  Their definition\nmay change in the future.\n\nNone\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name ``None``.\n   It is used to signify the absence of a value in many situations,\n   e.g., it is returned from functions that don\'t explicitly return\n   anything. Its truth value is false.\n\nNotImplemented\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``NotImplemented``. Numeric methods and rich comparison methods may\n   return this value if they do not implement the operation for the\n   operands provided.  (The interpreter will then try the reflected\n   operation, or some other fallback, depending on the operator.)  Its\n   truth value is true.\n\nEllipsis\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``Ellipsis``. It is used to indicate the presence of the ``...``\n   syntax in a slice.  Its truth value is true.\n\n``numbers.Number``\n   These are created by numeric literals and returned as results by\n   arithmetic operators and arithmetic built-in functions.  Numeric\n   objects are immutable; once created their value never changes.\n   Python numbers are of course strongly related to mathematical\n   numbers, but subject to the limitations of numerical representation\n   in computers.\n\n   Python distinguishes between integers, floating point numbers, and\n   complex numbers:\n\n   ``numbers.Integral``\n      These represent elements from the mathematical set of integers\n      (positive and negative).\n\n      There are three types of integers:\n\n      Plain integers\n         These represent numbers in the range -2147483648 through\n         2147483647. (The range may be larger on machines with a\n         larger natural word size, but not smaller.)  When the result\n         of an operation would fall outside this range, the result is\n         normally returned as a long integer (in some cases, the\n         exception ``OverflowError`` is raised instead).  For the\n         purpose of shift and mask operations, integers are assumed to\n         have a binary, 2\'s complement notation using 32 or more bits,\n         and hiding no bits from the user (i.e., all 4294967296\n         different bit patterns correspond to different values).\n\n      Long integers\n         These represent numbers in an unlimited range, subject to\n         available (virtual) memory only.  For the purpose of shift\n         and mask operations, a binary representation is assumed, and\n         negative numbers are represented in a variant of 2\'s\n         complement which gives the illusion of an infinite string of\n         sign bits extending to the left.\n\n      Booleans\n         These represent the truth values False and True.  The two\n         objects representing the values False and True are the only\n         Boolean objects. The Boolean type is a subtype of plain\n         integers, and Boolean values behave like the values 0 and 1,\n         respectively, in almost all contexts, the exception being\n         that when converted to a string, the strings ``"False"`` or\n         ``"True"`` are returned, respectively.\n\n      The rules for integer representation are intended to give the\n      most meaningful interpretation of shift and mask operations\n      involving negative integers and the least surprises when\n      switching between the plain and long integer domains.  Any\n      operation, if it yields a result in the plain integer domain,\n      will yield the same result in the long integer domain or when\n      using mixed operands.  The switch between domains is transparent\n      to the programmer.\n\n   ``numbers.Real`` (``float``)\n      These represent machine-level double precision floating point\n      numbers. You are at the mercy of the underlying machine\n      architecture (and C or Java implementation) for the accepted\n      range and handling of overflow. Python does not support single-\n      precision floating point numbers; the savings in processor and\n      memory usage that are usually the reason for using these is\n      dwarfed by the overhead of using objects in Python, so there is\n      no reason to complicate the language with two kinds of floating\n      point numbers.\n\n   ``numbers.Complex``\n      These represent complex numbers as a pair of machine-level\n      double precision floating point numbers.  The same caveats apply\n      as for floating point numbers. The real and imaginary parts of a\n      complex number ``z`` can be retrieved through the read-only\n      attributes ``z.real`` and ``z.imag``.\n\nSequences\n   These represent finite ordered sets indexed by non-negative\n   numbers. The built-in function ``len()`` returns the number of\n   items of a sequence. When the length of a sequence is *n*, the\n   index set contains the numbers 0, 1, ..., *n*-1.  Item *i* of\n   sequence *a* is selected by ``a[i]``.\n\n   Sequences also support slicing: ``a[i:j]`` selects all items with\n   index *k* such that *i* ``<=`` *k* ``<`` *j*.  When used as an\n   expression, a slice is a sequence of the same type.  This implies\n   that the index set is renumbered so that it starts at 0.\n\n   Some sequences also support "extended slicing" with a third "step"\n   parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n   where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n   *j*.\n\n   Sequences are distinguished according to their mutability:\n\n   Immutable sequences\n      An object of an immutable sequence type cannot change once it is\n      created.  (If the object contains references to other objects,\n      these other objects may be mutable and may be changed; however,\n      the collection of objects directly referenced by an immutable\n      object cannot change.)\n\n      The following types are immutable sequences:\n\n      Strings\n         The items of a string are characters.  There is no separate\n         character type; a character is represented by a string of one\n         item. Characters represent (at least) 8-bit bytes.  The\n         built-in functions ``chr()`` and ``ord()`` convert between\n         characters and nonnegative integers representing the byte\n         values.  Bytes with the values 0-127 usually represent the\n         corresponding ASCII values, but the interpretation of values\n         is up to the program.  The string data type is also used to\n         represent arrays of bytes, e.g., to hold data read from a\n         file.\n\n         (On systems whose native character set is not ASCII, strings\n         may use EBCDIC in their internal representation, provided the\n         functions ``chr()`` and ``ord()`` implement a mapping between\n         ASCII and EBCDIC, and string comparison preserves the ASCII\n         order. Or perhaps someone can propose a better rule?)\n\n      Unicode\n         The items of a Unicode object are Unicode code units.  A\n         Unicode code unit is represented by a Unicode object of one\n         item and can hold either a 16-bit or 32-bit value\n         representing a Unicode ordinal (the maximum value for the\n         ordinal is given in ``sys.maxunicode``, and depends on how\n         Python is configured at compile time).  Surrogate pairs may\n         be present in the Unicode object, and will be reported as two\n         separate items.  The built-in functions ``unichr()`` and\n         ``ord()`` convert between code units and nonnegative integers\n         representing the Unicode ordinals as defined in the Unicode\n         Standard 3.0. Conversion from and to other encodings are\n         possible through the Unicode method ``encode()`` and the\n         built-in function ``unicode()``.\n\n      Tuples\n         The items of a tuple are arbitrary Python objects. Tuples of\n         two or more items are formed by comma-separated lists of\n         expressions.  A tuple of one item (a \'singleton\') can be\n         formed by affixing a comma to an expression (an expression by\n         itself does not create a tuple, since parentheses must be\n         usable for grouping of expressions).  An empty tuple can be\n         formed by an empty pair of parentheses.\n\n   Mutable sequences\n      Mutable sequences can be changed after they are created.  The\n      subscription and slicing notations can be used as the target of\n      assignment and ``del`` (delete) statements.\n\n      There are currently two intrinsic mutable sequence types:\n\n      Lists\n         The items of a list are arbitrary Python objects.  Lists are\n         formed by placing a comma-separated list of expressions in\n         square brackets. (Note that there are no special cases needed\n         to form lists of length 0 or 1.)\n\n      Byte Arrays\n         A bytearray object is a mutable array. They are created by\n         the built-in ``bytearray()`` constructor.  Aside from being\n         mutable (and hence unhashable), byte arrays otherwise provide\n         the same interface and functionality as immutable bytes\n         objects.\n\n      The extension module ``array`` provides an additional example of\n      a mutable sequence type.\n\nSet types\n   These represent unordered, finite sets of unique, immutable\n   objects. As such, they cannot be indexed by any subscript. However,\n   they can be iterated over, and the built-in function ``len()``\n   returns the number of items in a set. Common uses for sets are fast\n   membership testing, removing duplicates from a sequence, and\n   computing mathematical operations such as intersection, union,\n   difference, and symmetric difference.\n\n   For set elements, the same immutability rules apply as for\n   dictionary keys. Note that numeric types obey the normal rules for\n   numeric comparison: if two numbers compare equal (e.g., ``1`` and\n   ``1.0``), only one of them can be contained in a set.\n\n   There are currently two intrinsic set types:\n\n   Sets\n      These represent a mutable set. They are created by the built-in\n      ``set()`` constructor and can be modified afterwards by several\n      methods, such as ``add()``.\n\n   Frozen sets\n      These represent an immutable set.  They are created by the\n      built-in ``frozenset()`` constructor.  As a frozenset is\n      immutable and *hashable*, it can be used again as an element of\n      another set, or as a dictionary key.\n\nMappings\n   These represent finite sets of objects indexed by arbitrary index\n   sets. The subscript notation ``a[k]`` selects the item indexed by\n   ``k`` from the mapping ``a``; this can be used in expressions and\n   as the target of assignments or ``del`` statements. The built-in\n   function ``len()`` returns the number of items in a mapping.\n\n   There is currently a single intrinsic mapping type:\n\n   Dictionaries\n      These represent finite sets of objects indexed by nearly\n      arbitrary values.  The only types of values not acceptable as\n      keys are values containing lists or dictionaries or other\n      mutable types that are compared by value rather than by object\n      identity, the reason being that the efficient implementation of\n      dictionaries requires a key\'s hash value to remain constant.\n      Numeric types used for keys obey the normal rules for numeric\n      comparison: if two numbers compare equal (e.g., ``1`` and\n      ``1.0``) then they can be used interchangeably to index the same\n      dictionary entry.\n\n      Dictionaries are mutable; they can be created by the ``{...}``\n      notation (see section *Dictionary displays*).\n\n      The extension modules ``dbm``, ``gdbm``, and ``bsddb`` provide\n      additional examples of mapping types.\n\nCallable types\n   These are the types to which the function call operation (see\n   section *Calls*) can be applied:\n\n   User-defined functions\n      A user-defined function object is created by a function\n      definition (see section *Function definitions*).  It should be\n      called with an argument list containing the same number of items\n      as the function\'s formal parameter list.\n\n      Special attributes:\n\n      +-------------------------+---------------------------------+-------------+\n      | Attribute               | Meaning                         |             |\n      +=========================+=================================+=============+\n      | ``func_doc``            | The function\'s documentation    | Writable    |\n      |                         | string, or ``None`` if          |             |\n      |                         | unavailable                     |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``__doc__``             | Another way of spelling         | Writable    |\n      |                         | ``func_doc``                    |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_name``           | The function\'s name             | Writable    |\n      +-------------------------+---------------------------------+-------------+\n      | ``__name__``            | Another way of spelling         | Writable    |\n      |                         | ``func_name``                   |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``__module__``          | The name of the module the      | Writable    |\n      |                         | function was defined in, or     |             |\n      |                         | ``None`` if unavailable.        |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_defaults``       | A tuple containing default      | Writable    |\n      |                         | argument values for those       |             |\n      |                         | arguments that have defaults,   |             |\n      |                         | or ``None`` if no arguments     |             |\n      |                         | have a default value            |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_code``           | The code object representing    | Writable    |\n      |                         | the compiled function body.     |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_globals``        | A reference to the dictionary   | Read-only   |\n      |                         | that holds the function\'s       |             |\n      |                         | global variables --- the global |             |\n      |                         | namespace of the module in      |             |\n      |                         | which the function was defined. |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_dict``           | The namespace supporting        | Writable    |\n      |                         | arbitrary function attributes.  |             |\n      +-------------------------+---------------------------------+-------------+\n      | ``func_closure``        | ``None`` or a tuple of cells    | Read-only   |\n      |                         | that contain bindings for the   |             |\n      |                         | function\'s free variables.      |             |\n      +-------------------------+---------------------------------+-------------+\n\n      Most of the attributes labelled "Writable" check the type of the\n      assigned value.\n\n      Changed in version 2.4: ``func_name`` is now writable.\n\n      Function objects also support getting and setting arbitrary\n      attributes, which can be used, for example, to attach metadata\n      to functions.  Regular attribute dot-notation is used to get and\n      set such attributes. *Note that the current implementation only\n      supports function attributes on user-defined functions. Function\n      attributes on built-in functions may be supported in the\n      future.*\n\n      Additional information about a function\'s definition can be\n      retrieved from its code object; see the description of internal\n      types below.\n\n   User-defined methods\n      A user-defined method object combines a class, a class instance\n      (or ``None``) and any callable object (normally a user-defined\n      function).\n\n      Special read-only attributes: ``im_self`` is the class instance\n      object, ``im_func`` is the function object; ``im_class`` is the\n      class of ``im_self`` for bound methods or the class that asked\n      for the method for unbound methods; ``__doc__`` is the method\'s\n      documentation (same as ``im_func.__doc__``); ``__name__`` is the\n      method name (same as ``im_func.__name__``); ``__module__`` is\n      the name of the module the method was defined in, or ``None`` if\n      unavailable.\n\n      Changed in version 2.2: ``im_self`` used to refer to the class\n      that defined the method.\n\n      Changed in version 2.6: For Python 3 forward-compatibility,\n      ``im_func`` is also available as ``__func__``, and ``im_self``\n      as ``__self__``.\n\n      Methods also support accessing (but not setting) the arbitrary\n      function attributes on the underlying function object.\n\n      User-defined method objects may be created when getting an\n      attribute of a class (perhaps via an instance of that class), if\n      that attribute is a user-defined function object, an unbound\n      user-defined method object, or a class method object. When the\n      attribute is a user-defined method object, a new method object\n      is only created if the class from which it is being retrieved is\n      the same as, or a derived class of, the class stored in the\n      original method object; otherwise, the original method object is\n      used as it is.\n\n      When a user-defined method object is created by retrieving a\n      user-defined function object from a class, its ``im_self``\n      attribute is ``None`` and the method object is said to be\n      unbound. When one is created by retrieving a user-defined\n      function object from a class via one of its instances, its\n      ``im_self`` attribute is the instance, and the method object is\n      said to be bound. In either case, the new method\'s ``im_class``\n      attribute is the class from which the retrieval takes place, and\n      its ``im_func`` attribute is the original function object.\n\n      When a user-defined method object is created by retrieving\n      another method object from a class or instance, the behaviour is\n      the same as for a function object, except that the ``im_func``\n      attribute of the new instance is not the original method object\n      but its ``im_func`` attribute.\n\n      When a user-defined method object is created by retrieving a\n      class method object from a class or instance, its ``im_self``\n      attribute is the class itself, and its ``im_func`` attribute is\n      the function object underlying the class method.\n\n      When an unbound user-defined method object is called, the\n      underlying function (``im_func``) is called, with the\n      restriction that the first argument must be an instance of the\n      proper class (``im_class``) or of a derived class thereof.\n\n      When a bound user-defined method object is called, the\n      underlying function (``im_func``) is called, inserting the class\n      instance (``im_self``) in front of the argument list.  For\n      instance, when ``C`` is a class which contains a definition for\n      a function ``f()``, and ``x`` is an instance of ``C``, calling\n      ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n      When a user-defined method object is derived from a class method\n      object, the "class instance" stored in ``im_self`` will actually\n      be the class itself, so that calling either ``x.f(1)`` or\n      ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n      the underlying function.\n\n      Note that the transformation from function object to (unbound or\n      bound) method object happens each time the attribute is\n      retrieved from the class or instance. In some cases, a fruitful\n      optimization is to assign the attribute to a local variable and\n      call that local variable. Also notice that this transformation\n      only happens for user-defined functions; other callable objects\n      (and all non-callable objects) are retrieved without\n      transformation.  It is also important to note that user-defined\n      functions which are attributes of a class instance are not\n      converted to bound methods; this *only* happens when the\n      function is an attribute of the class.\n\n   Generator functions\n      A function or method which uses the ``yield`` statement (see\n      section *The yield statement*) is called a *generator function*.\n      Such a function, when called, always returns an iterator object\n      which can be used to execute the body of the function:  calling\n      the iterator\'s ``next()`` method will cause the function to\n      execute until it provides a value using the ``yield`` statement.\n      When the function executes a ``return`` statement or falls off\n      the end, a ``StopIteration`` exception is raised and the\n      iterator will have reached the end of the set of values to be\n      returned.\n\n   Built-in functions\n      A built-in function object is a wrapper around a C function.\n      Examples of built-in functions are ``len()`` and ``math.sin()``\n      (``math`` is a standard built-in module). The number and type of\n      the arguments are determined by the C function. Special read-\n      only attributes: ``__doc__`` is the function\'s documentation\n      string, or ``None`` if unavailable; ``__name__`` is the\n      function\'s name; ``__self__`` is set to ``None`` (but see the\n      next item); ``__module__`` is the name of the module the\n      function was defined in or ``None`` if unavailable.\n\n   Built-in methods\n      This is really a different disguise of a built-in function, this\n      time containing an object passed to the C function as an\n      implicit extra argument.  An example of a built-in method is\n      ``alist.append()``, assuming *alist* is a list object. In this\n      case, the special read-only attribute ``__self__`` is set to the\n      object denoted by *alist*.\n\n   Class Types\n      Class types, or "new-style classes," are callable.  These\n      objects normally act as factories for new instances of\n      themselves, but variations are possible for class types that\n      override ``__new__()``.  The arguments of the call are passed to\n      ``__new__()`` and, in the typical case, to ``__init__()`` to\n      initialize the new instance.\n\n   Classic Classes\n      Class objects are described below.  When a class object is\n      called, a new class instance (also described below) is created\n      and returned.  This implies a call to the class\'s ``__init__()``\n      method if it has one.  Any arguments are passed on to the\n      ``__init__()`` method.  If there is no ``__init__()`` method,\n      the class must be called without arguments.\n\n   Class instances\n      Class instances are described below.  Class instances are\n      callable only when the class has a ``__call__()`` method;\n      ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\n\nModules\n   Modules are imported by the ``import`` statement (see section *The\n   import statement*). A module object has a namespace implemented by\n   a dictionary object (this is the dictionary referenced by the\n   func_globals attribute of functions defined in the module).\n   Attribute references are translated to lookups in this dictionary,\n   e.g., ``m.x`` is equivalent to ``m.__dict__["x"]``. A module object\n   does not contain the code object used to initialize the module\n   (since it isn\'t needed once the initialization is done).\n\n   Attribute assignment updates the module\'s namespace dictionary,\n   e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n   Special read-only attribute: ``__dict__`` is the module\'s namespace\n   as a dictionary object.\n\n   **CPython implementation detail:** Because of the way CPython\n   clears module dictionaries, the module dictionary will be cleared\n   when the module falls out of scope even if the dictionary still has\n   live references.  To avoid this, copy the dictionary or keep the\n   module around while using its dictionary directly.\n\n   Predefined (writable) attributes: ``__name__`` is the module\'s\n   name; ``__doc__`` is the module\'s documentation string, or ``None``\n   if unavailable; ``__file__`` is the pathname of the file from which\n   the module was loaded, if it was loaded from a file. The\n   ``__file__`` attribute is not present for C modules that are\n   statically linked into the interpreter; for extension modules\n   loaded dynamically from a shared library, it is the pathname of the\n   shared library file.\n\nClasses\n   Both class types (new-style classes) and class objects (old-\n   style/classic classes) are typically created by class definitions\n   (see section *Class definitions*).  A class has a namespace\n   implemented by a dictionary object. Class attribute references are\n   translated to lookups in this dictionary, e.g., ``C.x`` is\n   translated to ``C.__dict__["x"]`` (although for new-style classes\n   in particular there are a number of hooks which allow for other\n   means of locating attributes). When the attribute name is not found\n   there, the attribute search continues in the base classes.  For\n   old-style classes, the search is depth-first, left-to-right in the\n   order of occurrence in the base class list. New-style classes use\n   the more complex C3 method resolution order which behaves correctly\n   even in the presence of \'diamond\' inheritance structures where\n   there are multiple inheritance paths leading back to a common\n   ancestor. Additional details on the C3 MRO used by new-style\n   classes can be found in the documentation accompanying the 2.3\n   release at http://www.python.org/download/releases/2.3/mro/.\n\n   When a class attribute reference (for class ``C``, say) would yield\n   a user-defined function object or an unbound user-defined method\n   object whose associated class is either ``C`` or one of its base\n   classes, it is transformed into an unbound user-defined method\n   object whose ``im_class`` attribute is ``C``. When it would yield a\n   class method object, it is transformed into a bound user-defined\n   method object whose ``im_self`` attribute is ``C``.  When it would\n   yield a static method object, it is transformed into the object\n   wrapped by the static method object. See section *Implementing\n   Descriptors* for another way in which attributes retrieved from a\n   class may differ from those actually contained in its ``__dict__``\n   (note that only new-style classes support descriptors).\n\n   Class attribute assignments update the class\'s dictionary, never\n   the dictionary of a base class.\n\n   A class object can be called (see above) to yield a class instance\n   (see below).\n\n   Special attributes: ``__name__`` is the class name; ``__module__``\n   is the module name in which the class was defined; ``__dict__`` is\n   the dictionary containing the class\'s namespace; ``__bases__`` is a\n   tuple (possibly empty or a singleton) containing the base classes,\n   in the order of their occurrence in the base class list;\n   ``__doc__`` is the class\'s documentation string, or None if\n   undefined.\n\nClass instances\n   A class instance is created by calling a class object (see above).\n   A class instance has a namespace implemented as a dictionary which\n   is the first place in which attribute references are searched.\n   When an attribute is not found there, and the instance\'s class has\n   an attribute by that name, the search continues with the class\n   attributes.  If a class attribute is found that is a user-defined\n   function object or an unbound user-defined method object whose\n   associated class is the class (call it ``C``) of the instance for\n   which the attribute reference was initiated or one of its bases, it\n   is transformed into a bound user-defined method object whose\n   ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n   the instance. Static method and class method objects are also\n   transformed, as if they had been retrieved from class ``C``; see\n   above under "Classes". See section *Implementing Descriptors* for\n   another way in which attributes of a class retrieved via its\n   instances may differ from the objects actually stored in the\n   class\'s ``__dict__``. If no class attribute is found, and the\n   object\'s class has a ``__getattr__()`` method, that is called to\n   satisfy the lookup.\n\n   Attribute assignments and deletions update the instance\'s\n   dictionary, never a class\'s dictionary.  If the class has a\n   ``__setattr__()`` or ``__delattr__()`` method, this is called\n   instead of updating the instance dictionary directly.\n\n   Class instances can pretend to be numbers, sequences, or mappings\n   if they have methods with certain special names.  See section\n   *Special method names*.\n\n   Special attributes: ``__dict__`` is the attribute dictionary;\n   ``__class__`` is the instance\'s class.\n\nFiles\n   A file object represents an open file.  File objects are created by\n   the ``open()`` built-in function, and also by ``os.popen()``,\n   ``os.fdopen()``, and the ``makefile()`` method of socket objects\n   (and perhaps by other functions or methods provided by extension\n   modules).  The objects ``sys.stdin``, ``sys.stdout`` and\n   ``sys.stderr`` are initialized to file objects corresponding to the\n   interpreter\'s standard input, output and error streams.  See *File\n   Objects* for complete documentation of file objects.\n\nInternal types\n   A few types used internally by the interpreter are exposed to the\n   user. Their definitions may change with future versions of the\n   interpreter, but they are mentioned here for completeness.\n\n   Code objects\n      Code objects represent *byte-compiled* executable Python code,\n      or *bytecode*. The difference between a code object and a\n      function object is that the function object contains an explicit\n      reference to the function\'s globals (the module in which it was\n      defined), while a code object contains no context; also the\n      default argument values are stored in the function object, not\n      in the code object (because they represent values calculated at\n      run-time).  Unlike function objects, code objects are immutable\n      and contain no references (directly or indirectly) to mutable\n      objects.\n\n      Special read-only attributes: ``co_name`` gives the function\n      name; ``co_argcount`` is the number of positional arguments\n      (including arguments with default values); ``co_nlocals`` is the\n      number of local variables used by the function (including\n      arguments); ``co_varnames`` is a tuple containing the names of\n      the local variables (starting with the argument names);\n      ``co_cellvars`` is a tuple containing the names of local\n      variables that are referenced by nested functions;\n      ``co_freevars`` is a tuple containing the names of free\n      variables; ``co_code`` is a string representing the sequence of\n      bytecode instructions; ``co_consts`` is a tuple containing the\n      literals used by the bytecode; ``co_names`` is a tuple\n      containing the names used by the bytecode; ``co_filename`` is\n      the filename from which the code was compiled;\n      ``co_firstlineno`` is the first line number of the function;\n      ``co_lnotab`` is a string encoding the mapping from bytecode\n      offsets to line numbers (for details see the source code of the\n      interpreter); ``co_stacksize`` is the required stack size\n      (including local variables); ``co_flags`` is an integer encoding\n      a number of flags for the interpreter.\n\n      The following flag bits are defined for ``co_flags``: bit\n      ``0x04`` is set if the function uses the ``*arguments`` syntax\n      to accept an arbitrary number of positional arguments; bit\n      ``0x08`` is set if the function uses the ``**keywords`` syntax\n      to accept arbitrary keyword arguments; bit ``0x20`` is set if\n      the function is a generator.\n\n      Future feature declarations (``from __future__ import\n      division``) also use bits in ``co_flags`` to indicate whether a\n      code object was compiled with a particular feature enabled: bit\n      ``0x2000`` is set if the function was compiled with future\n      division enabled; bits ``0x10`` and ``0x1000`` were used in\n      earlier versions of Python.\n\n      Other bits in ``co_flags`` are reserved for internal use.\n\n      If a code object represents a function, the first item in\n      ``co_consts`` is the documentation string of the function, or\n      ``None`` if undefined.\n\n   Frame objects\n      Frame objects represent execution frames.  They may occur in\n      traceback objects (see below).\n\n      Special read-only attributes: ``f_back`` is to the previous\n      stack frame (towards the caller), or ``None`` if this is the\n      bottom stack frame; ``f_code`` is the code object being executed\n      in this frame; ``f_locals`` is the dictionary used to look up\n      local variables; ``f_globals`` is used for global variables;\n      ``f_builtins`` is used for built-in (intrinsic) names;\n      ``f_restricted`` is a flag indicating whether the function is\n      executing in restricted execution mode; ``f_lasti`` gives the\n      precise instruction (this is an index into the bytecode string\n      of the code object).\n\n      Special writable attributes: ``f_trace``, if not ``None``, is a\n      function called at the start of each source code line (this is\n      used by the debugger); ``f_exc_type``, ``f_exc_value``,\n      ``f_exc_traceback`` represent the last exception raised in the\n      parent frame provided another exception was ever raised in the\n      current frame (in all other cases they are None); ``f_lineno``\n      is the current line number of the frame --- writing to this from\n      within a trace function jumps to the given line (only for the\n      bottom-most frame).  A debugger can implement a Jump command\n      (aka Set Next Statement) by writing to f_lineno.\n\n   Traceback objects\n      Traceback objects represent a stack trace of an exception.  A\n      traceback object is created when an exception occurs.  When the\n      search for an exception handler unwinds the execution stack, at\n      each unwound level a traceback object is inserted in front of\n      the current traceback.  When an exception handler is entered,\n      the stack trace is made available to the program. (See section\n      *The try statement*.) It is accessible as ``sys.exc_traceback``,\n      and also as the third item of the tuple returned by\n      ``sys.exc_info()``.  The latter is the preferred interface,\n      since it works correctly when the program is using multiple\n      threads. When the program contains no suitable handler, the\n      stack trace is written (nicely formatted) to the standard error\n      stream; if the interpreter is interactive, it is also made\n      available to the user as ``sys.last_traceback``.\n\n      Special read-only attributes: ``tb_next`` is the next level in\n      the stack trace (towards the frame where the exception\n      occurred), or ``None`` if there is no next level; ``tb_frame``\n      points to the execution frame of the current level;\n      ``tb_lineno`` gives the line number where the exception\n      occurred; ``tb_lasti`` indicates the precise instruction.  The\n      line number and last instruction in the traceback may differ\n      from the line number of its frame object if the exception\n      occurred in a ``try`` statement with no matching except clause\n      or with a finally clause.\n\n   Slice objects\n      Slice objects are used to represent slices when *extended slice\n      syntax* is used. This is a slice using two colons, or multiple\n      slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n      ``a[i:j, k:l]``, or ``a[..., i:j]``.  They are also created by\n      the built-in ``slice()`` function.\n\n      Special read-only attributes: ``start`` is the lower bound;\n      ``stop`` is the upper bound; ``step`` is the step value; each is\n      ``None`` if omitted.  These attributes can have any type.\n\n      Slice objects support one method:\n\n      slice.indices(self, length)\n\n         This method takes a single integer argument *length* and\n         computes information about the extended slice that the slice\n         object would describe if applied to a sequence of *length*\n         items.  It returns a tuple of three integers; respectively\n         these are the *start* and *stop* indices and the *step* or\n         stride length of the slice. Missing or out-of-bounds indices\n         are handled in a manner consistent with regular slices.\n\n         New in version 2.3.\n\n   Static method objects\n      Static method objects provide a way of defeating the\n      transformation of function objects to method objects described\n      above. A static method object is a wrapper around any other\n      object, usually a user-defined method object. When a static\n      method object is retrieved from a class or a class instance, the\n      object actually returned is the wrapped object, which is not\n      subject to any further transformation. Static method objects are\n      not themselves callable, although the objects they wrap usually\n      are. Static method objects are created by the built-in\n      ``staticmethod()`` constructor.\n\n   Class method objects\n      A class method object, like a static method object, is a wrapper\n      around another object that alters the way in which that object\n      is retrieved from classes and class instances. The behaviour of\n      class method objects upon such retrieval is described above,\n      under "User-defined methods". Class method objects are created\n      by the built-in ``classmethod()`` constructor.\n',
      'typesfunctions': '\nFunctions\n*********\n\nFunction objects are created by function definitions.  The only\noperation on a function object is to call it: ``func(argument-list)``.\n\nThere are really two flavors of function objects: built-in functions\nand user-defined functions.  Both support the same operation (to call\nthe function), but the implementation is different, hence the\ndifferent object types.\n\nSee *Function definitions* for more information.\n',
      'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects.  There is currently only one standard\nmapping type, the *dictionary*.  (For other containers see the built\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values.  Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys.  Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry.  (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict(**kwarg)\nclass class dict(mapping, **kwarg)\nclass class dict(iterable, **kwarg)\n\n   Return a new dictionary initialized from an optional positional\n   argument and a possibly empty set of keyword arguments.\n\n   If no positional argument is given, an empty dictionary is created.\n   If a positional argument is given and it is a mapping object, a\n   dictionary is created with the same key-value pairs as the mapping\n   object.  Otherwise, the positional argument must be an *iterator*\n   object.  Each item in the iterable must itself be an iterator with\n   exactly two objects.  The first object of each item becomes a key\n   in the new dictionary, and the second object the corresponding\n   value.  If a key occurs more than once, the last value for that key\n   becomes the corresponding value in the new dictionary.\n\n   If keyword arguments are given, the keyword arguments and their\n   values are added to the dictionary created from the positional\n   argument.  If a key being added is already present, the value from\n   the keyword argument replaces the value from the positional\n   argument.\n\n   To illustrate, the following examples all return a dictionary equal\n   to ``{"one": 1, "two": 2, "three": 3}``:\n\n      >>> a = dict(one=1, two=2, three=3)\n      >>> b = {\'one\': 1, \'two\': 2, \'three\': 3}\n      >>> c = dict(zip([\'one\', \'two\', \'three\'], [1, 2, 3]))\n      >>> d = dict([(\'two\', 2), (\'one\', 1), (\'three\', 3)])\n      >>> e = dict({\'three\': 3, \'one\': 1, \'two\': 2})\n      >>> a == b == c == d == e\n      True\n\n   Providing keyword arguments as in the first example only works for\n   keys that are valid Python identifiers.  Otherwise, any valid keys\n   can be used.\n\n   New in version 2.2.\n\n   Changed in version 2.3: Support for building a dictionary from\n   keyword arguments added.\n\n   These are the operations that dictionaries support (and therefore,\n   custom mapping types should support too):\n\n   len(d)\n\n      Return the number of items in the dictionary *d*.\n\n   d[key]\n\n      Return the item of *d* with key *key*.  Raises a ``KeyError`` if\n      *key* is not in the map.\n\n      New in version 2.5: If a subclass of dict defines a method\n      ``__missing__()``, if the key *key* is not present, the\n      ``d[key]`` operation calls that method with the key *key* as\n      argument.  The ``d[key]`` operation then returns or raises\n      whatever is returned or raised by the ``__missing__(key)`` call\n      if the key is not present. No other operations or methods invoke\n      ``__missing__()``. If ``__missing__()`` is not defined,\n      ``KeyError`` is raised.  ``__missing__()`` must be a method; it\n      cannot be an instance variable. For an example, see\n      ``collections.defaultdict``.\n\n   d[key] = value\n\n      Set ``d[key]`` to *value*.\n\n   del d[key]\n\n      Remove ``d[key]`` from *d*.  Raises a ``KeyError`` if *key* is\n      not in the map.\n\n   key in d\n\n      Return ``True`` if *d* has a key *key*, else ``False``.\n\n      New in version 2.2.\n\n   key not in d\n\n      Equivalent to ``not key in d``.\n\n      New in version 2.2.\n\n   iter(d)\n\n      Return an iterator over the keys of the dictionary.  This is a\n      shortcut for ``iterkeys()``.\n\n   clear()\n\n      Remove all items from the dictionary.\n\n   copy()\n\n      Return a shallow copy of the dictionary.\n\n   fromkeys(seq[, value])\n\n      Create a new dictionary with keys from *seq* and values set to\n      *value*.\n\n      ``fromkeys()`` is a class method that returns a new dictionary.\n      *value* defaults to ``None``.\n\n      New in version 2.3.\n\n   get(key[, default])\n\n      Return the value for *key* if *key* is in the dictionary, else\n      *default*. If *default* is not given, it defaults to ``None``,\n      so that this method never raises a ``KeyError``.\n\n   has_key(key)\n\n      Test for the presence of *key* in the dictionary.  ``has_key()``\n      is deprecated in favor of ``key in d``.\n\n   items()\n\n      Return a copy of the dictionary\'s list of ``(key, value)``\n      pairs.\n\n      **CPython implementation detail:** Keys and values are listed in\n      an arbitrary order which is non-random, varies across Python\n      implementations, and depends on the dictionary\'s history of\n      insertions and deletions.\n\n      If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n      ``iterkeys()``, and ``itervalues()`` are called with no\n      intervening modifications to the dictionary, the lists will\n      directly correspond.  This allows the creation of ``(value,\n      key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n      d.keys())``.  The same relationship holds for the ``iterkeys()``\n      and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n      d.iterkeys())`` provides the same value for ``pairs``. Another\n      way to create the same list is ``pairs = [(v, k) for (k, v) in\n      d.iteritems()]``.\n\n   iteritems()\n\n      Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n      See the note for ``dict.items()``.\n\n      Using ``iteritems()`` while adding or deleting entries in the\n      dictionary may raise a ``RuntimeError`` or fail to iterate over\n      all entries.\n\n      New in version 2.2.\n\n   iterkeys()\n\n      Return an iterator over the dictionary\'s keys.  See the note for\n      ``dict.items()``.\n\n      Using ``iterkeys()`` while adding or deleting entries in the\n      dictionary may raise a ``RuntimeError`` or fail to iterate over\n      all entries.\n\n      New in version 2.2.\n\n   itervalues()\n\n      Return an iterator over the dictionary\'s values.  See the note\n      for ``dict.items()``.\n\n      Using ``itervalues()`` while adding or deleting entries in the\n      dictionary may raise a ``RuntimeError`` or fail to iterate over\n      all entries.\n\n      New in version 2.2.\n\n   keys()\n\n      Return a copy of the dictionary\'s list of keys.  See the note\n      for ``dict.items()``.\n\n   pop(key[, default])\n\n      If *key* is in the dictionary, remove it and return its value,\n      else return *default*.  If *default* is not given and *key* is\n      not in the dictionary, a ``KeyError`` is raised.\n\n      New in version 2.3.\n\n   popitem()\n\n      Remove and return an arbitrary ``(key, value)`` pair from the\n      dictionary.\n\n      ``popitem()`` is useful to destructively iterate over a\n      dictionary, as often used in set algorithms.  If the dictionary\n      is empty, calling ``popitem()`` raises a ``KeyError``.\n\n   setdefault(key[, default])\n\n      If *key* is in the dictionary, return its value.  If not, insert\n      *key* with a value of *default* and return *default*.  *default*\n      defaults to ``None``.\n\n   update([other])\n\n      Update the dictionary with the key/value pairs from *other*,\n      overwriting existing keys.  Return ``None``.\n\n      ``update()`` accepts either another dictionary object or an\n      iterable of key/value pairs (as tuples or other iterables of\n      length two).  If keyword arguments are specified, the dictionary\n      is then updated with those key/value pairs: ``d.update(red=1,\n      blue=2)``.\n\n      Changed in version 2.4: Allowed the argument to be an iterable\n      of key/value pairs and allowed keyword arguments.\n\n   values()\n\n      Return a copy of the dictionary\'s list of values.  See the note\n      for ``dict.items()``.\n\n   viewitems()\n\n      Return a new view of the dictionary\'s items (``(key, value)``\n      pairs).  See below for documentation of view objects.\n\n      New in version 2.7.\n\n   viewkeys()\n\n      Return a new view of the dictionary\'s keys.  See below for\n      documentation of view objects.\n\n      New in version 2.7.\n\n   viewvalues()\n\n      Return a new view of the dictionary\'s values.  See below for\n      documentation of view objects.\n\n      New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*.  They provide a dynamic view\non the dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n   Return the number of entries in the dictionary.\n\niter(dictview)\n\n   Return an iterator over the keys, values or items (represented as\n   tuples of ``(key, value)``) in the dictionary.\n\n   Keys and values are iterated over in an arbitrary order which is\n   non-random, varies across Python implementations, and depends on\n   the dictionary\'s history of insertions and deletions. If keys,\n   values and items views are iterated over with no intervening\n   modifications to the dictionary, the order of items will directly\n   correspond.  This allows the creation of ``(value, key)`` pairs\n   using ``zip()``: ``pairs = zip(d.values(), d.keys())``.  Another\n   way to create the same list is ``pairs = [(v, k) for (k, v) in\n   d.items()]``.\n\n   Iterating views while adding or deleting entries in the dictionary\n   may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n   Return ``True`` if *x* is in the underlying dictionary\'s keys,\n   values or items (in the latter case, *x* should be a ``(key,\n   value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that (key, value) pairs are unique and\nhashable, then the items view is also set-like.  (Values views are not\ntreated as set-like since the entries are generally not unique.)  Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n   Return the intersection of the dictview and the other object as a\n   new set.\n\ndictview | other\n\n   Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n   Return the difference between the dictview and the other object\n   (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n   Return the symmetric difference (all elements either in *dictview*\n   or *other*, but not in both) of the dictview and the other object\n   as a new set.\n\nAn example of dictionary view usage:\n\n   >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n   >>> keys = dishes.viewkeys()\n   >>> values = dishes.viewvalues()\n\n   >>> # iteration\n   >>> n = 0\n   >>> for val in values:\n   ...     n += val\n   >>> print(n)\n   504\n\n   >>> # keys and values are iterated over in the same order\n   >>> list(keys)\n   [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n   >>> list(values)\n   [2, 1, 1, 500]\n\n   >>> # view objects are dynamic and reflect dict changes\n   >>> del dishes[\'eggs\']\n   >>> del dishes[\'sausage\']\n   >>> list(keys)\n   [\'spam\', \'bacon\']\n\n   >>> # set operations\n   >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n   {\'bacon\'}\n',
      'typesmethods': '\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as ``append()`` on\nlists) and class instance methods.  Built-in methods are described\nwith the types that support them.\n\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively.  When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument.  In this case, ``self`` must be an\ninstance of the unbound method\'s class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set an attribute on a method results in an\n``AttributeError`` being raised.  In order to set a method attribute,\nyou need to explicitly set it on the underlying function object:\n\n   >>> class C:\n   ...     def method(self):\n   ...         pass\n   ...\n   >>> c = C()\n   >>> c.method.whoami = \'my name is method\'  # can\'t set on the method\n   Traceback (most recent call last):\n     File "", line 1, in \n   AttributeError: \'instancemethod\' object has no attribute \'whoami\'\n   >>> c.method.im_func.whoami = \'my name is method\'\n   >>> c.method.whoami\n   \'my name is method\'\n\nSee *The standard type hierarchy* for more information.\n',
      'typesmodules': "\nModules\n*******\n\nThe only special operation on a module is attribute access:\n``m.name``, where *m* is a module and *name* accesses a name defined\nin *m*'s symbol table. Module attributes can be assigned to.  (Note\nthat the ``import`` statement is not, strictly speaking, an operation\non a module object; ``import foo`` does not require a module object\nnamed *foo* to exist, rather it requires an (external) *definition*\nfor a module named *foo* somewhere.)\n\nA special attribute of every module is ``__dict__``. This is the\ndictionary containing the module's symbol table. Modifying this\ndictionary will actually change the module's symbol table, but direct\nassignment to the ``__dict__`` attribute is not possible (you can\nwrite ``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but\nyou can't write ``m.__dict__ = {}``).  Modifying ``__dict__`` directly\nis not recommended.\n\nModules built into the interpreter are written like this: ````.  If loaded from a file, they are written as\n````.\n",
    - 'typesseq': '\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``.  See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``.  A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``.  They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function.  They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem is inefficient.\n\nMost sequence types support the following operations.  The ``in`` and\n``not in`` operations have the same priorities as the comparison\noperations.  The ``+`` and ``*`` operations have the same priority as\nthe corresponding numeric operations. [3] Additional methods are\nprovided for *Mutable Sequence Types*.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority).  In the table,\n*s* and *t* are sequences of the same type; *n*, *i* and *j* are\nintegers:\n\n+--------------------+----------------------------------+------------+\n| Operation          | Result                           | Notes      |\n+====================+==================================+============+\n| ``x in s``         | ``True`` if an item of *s* is    | (1)        |\n|                    | equal to *x*, else ``False``     |            |\n+--------------------+----------------------------------+------------+\n| ``x not in s``     | ``False`` if an item of *s* is   | (1)        |\n|                    | equal to *x*, else ``True``      |            |\n+--------------------+----------------------------------+------------+\n| ``s + t``          | the concatenation of *s* and *t* | (6)        |\n+--------------------+----------------------------------+------------+\n| ``s * n, n * s``   | *n* shallow copies of *s*        | (2)        |\n|                    | concatenated                     |            |\n+--------------------+----------------------------------+------------+\n| ``s[i]``           | *i*th item of *s*, origin 0      | (3)        |\n+--------------------+----------------------------------+------------+\n| ``s[i:j]``         | slice of *s* from *i* to *j*     | (3)(4)     |\n+--------------------+----------------------------------+------------+\n| ``s[i:j:k]``       | slice of *s* from *i* to *j*     | (3)(5)     |\n|                    | with step *k*                    |            |\n+--------------------+----------------------------------+------------+\n| ``len(s)``         | length of *s*                    |            |\n+--------------------+----------------------------------+------------+\n| ``min(s)``         | smallest item of *s*             |            |\n+--------------------+----------------------------------+------------+\n| ``max(s)``         | largest item of *s*              |            |\n+--------------------+----------------------------------+------------+\n| ``s.index(i)``     | index of the first occurence of  |            |\n|                    | *i* in *s*                       |            |\n+--------------------+----------------------------------+------------+\n| ``s.count(i)``     | total number of occurences of    |            |\n|                    | *i* in *s*                       |            |\n+--------------------+----------------------------------+------------+\n\nSequence types also support comparisons. In particular, tuples and\nlists are compared lexicographically by comparing corresponding\nelements. This means that to compare equal, every element must compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n   in`` operations act like a substring test.  In Python versions\n   before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n   beyond, *x* may be a string of any length.\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n   empty sequence of the same type as *s*).  Note also that the copies\n   are shallow; nested structures are not copied.  This often haunts\n   new Python programmers; consider:\n\n   >>> lists = [[]] * 3\n   >>> lists\n   [[], [], []]\n   >>> lists[0].append(3)\n   >>> lists\n   [[3], [3], [3]]\n\n   What has happened is that ``[[]]`` is a one-element list containing\n   an empty list, so all three elements of ``[[]] * 3`` are (pointers\n   to) this single empty list.  Modifying any of the elements of\n   ``lists`` modifies this single list. You can create a list of\n   different lists this way:\n\n   >>> lists = [[] for i in range(3)]\n   >>> lists[0].append(3)\n   >>> lists[1].append(5)\n   >>> lists[2].append(7)\n   >>> lists\n   [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n   string: ``len(s) + i`` or ``len(s) + j`` is substituted.  But note\n   that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n   items with index *k* such that ``i <= k < j``.  If *i* or *j* is\n   greater than ``len(s)``, use ``len(s)``.  If *i* is omitted or\n   ``None``, use ``0``.  If *j* is omitted or ``None``, use\n   ``len(s)``.  If *i* is greater than or equal to *j*, the slice is\n   empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n   sequence of items with index  ``x = i + n*k`` such that ``0 <= n <\n   (j-i)/k``.  In other words, the indices are ``i``, ``i+k``,\n   ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n   never including *j*).  If *i* or *j* is greater than ``len(s)``,\n   use ``len(s)``.  If *i* or *j* are omitted or ``None``, they become\n   "end" values (which end depends on the sign of *k*).  Note, *k*\n   cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. **CPython implementation detail:** If *s* and *t* are both strings,\n   some Python implementations such as CPython can usually perform an\n   in-place optimization for assignments of the form ``s = s + t`` or\n   ``s += t``.  When applicable, this optimization makes quadratic\n   run-time much less likely.  This optimization is both version and\n   implementation dependent.  For performance sensitive code, it is\n   preferable to use the ``str.join()`` method which assures\n   consistent linear concatenation performance across versions and\n   implementations.\n\n   Changed in version 2.4: Formerly, string concatenation never\n   occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support.  Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based on regular expressions.\n\nstr.capitalize()\n\n   Return a copy of the string with its first character capitalized\n   and the rest lowercased.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.center(width[, fillchar])\n\n   Return centered in a string of length *width*. Padding is done\n   using the specified *fillchar* (default is a space).\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.count(sub[, start[, end]])\n\n   Return the number of non-overlapping occurrences of substring *sub*\n   in the range [*start*, *end*].  Optional arguments *start* and\n   *end* are interpreted as in slice notation.\n\nstr.decode([encoding[, errors]])\n\n   Decodes the string using the codec registered for *encoding*.\n   *encoding* defaults to the default string encoding.  *errors* may\n   be given to set a different error handling scheme.  The default is\n   ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n   Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n   name registered via ``codecs.register_error()``, see section *Codec\n   Base Classes*.\n\n   New in version 2.2.\n\n   Changed in version 2.3: Support for other error handling schemes\n   added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n   Return an encoded version of the string.  Default encoding is the\n   current default string encoding.  *errors* may be given to set a\n   different error handling scheme.  The default for *errors* is\n   ``\'strict\'``, meaning that encoding errors raise a\n   ``UnicodeError``.  Other possible values are ``\'ignore\'``,\n   ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n   any other name registered via ``codecs.register_error()``, see\n   section *Codec Base Classes*. For a list of possible encodings, see\n   section *Standard Encodings*.\n\n   New in version 2.0.\n\n   Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n   ``\'backslashreplace\'`` and other error handling schemes added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n   Return ``True`` if the string ends with the specified *suffix*,\n   otherwise return ``False``.  *suffix* can also be a tuple of\n   suffixes to look for.  With optional *start*, test beginning at\n   that position.  With optional *end*, stop comparing at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n   Return a copy of the string where all tab characters are replaced\n   by one or more spaces, depending on the current column and the\n   given tab size.  Tab positions occur every *tabsize* characters\n   (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n   To expand the string, the current column is set to zero and the\n   string is examined character by character.  If the character is a\n   tab (``\\t``), one or more space characters are inserted in the\n   result until the current column is equal to the next tab position.\n   (The tab character itself is not copied.)  If the character is a\n   newline (``\\n``) or return (``\\r``), it is copied and the current\n   column is reset to zero.  Any other character is copied unchanged\n   and the current column is incremented by one regardless of how the\n   character is represented when printed.\n\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n   \'01      012     0123    01234\'\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n   \'01  012 0123    01234\'\n\nstr.find(sub[, start[, end]])\n\n   Return the lowest index in the string where substring *sub* is\n   found, such that *sub* is contained in the slice ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` if *sub* is not found.\n\n   Note: The ``find()`` method should be used only if you need to know the\n     position of *sub*.  To check if *sub* is a substring or not, use\n     the ``in`` operator:\n\n        >>> \'Py\' in \'Python\'\n        True\n\nstr.format(*args, **kwargs)\n\n   Perform a string formatting operation.  The string on which this\n   method is called can contain literal text or replacement fields\n   delimited by braces ``{}``.  Each replacement field contains either\n   the numeric index of a positional argument, or the name of a\n   keyword argument.  Returns a copy of the string where each\n   replacement field is replaced with the string value of the\n   corresponding argument.\n\n   >>> "The sum of 1 + 2 is {0}".format(1+2)\n   \'The sum of 1 + 2 is 3\'\n\n   See *Format String Syntax* for a description of the various\n   formatting options that can be specified in format strings.\n\n   This method of string formatting is the new standard in Python 3,\n   and should be preferred to the ``%`` formatting described in\n   *String Formatting Operations* in new code.\n\n   New in version 2.6.\n\nstr.index(sub[, start[, end]])\n\n   Like ``find()``, but raise ``ValueError`` when the substring is not\n   found.\n\nstr.isalnum()\n\n   Return true if all characters in the string are alphanumeric and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isalpha()\n\n   Return true if all characters in the string are alphabetic and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isdigit()\n\n   Return true if all characters in the string are digits and there is\n   at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n   Return true if all cased characters [4] in the string are lowercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isspace()\n\n   Return true if there are only whitespace characters in the string\n   and there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.istitle()\n\n   Return true if the string is a titlecased string and there is at\n   least one character, for example uppercase characters may only\n   follow uncased characters and lowercase characters only cased ones.\n   Return false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n   Return true if all cased characters [4] in the string are uppercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n   Return a string which is the concatenation of the strings in the\n   *iterable* *iterable*.  The separator between elements is the\n   string providing this method.\n\nstr.ljust(width[, fillchar])\n\n   Return the string left justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space).  The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to lowercase.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.lstrip([chars])\n\n   Return a copy of the string with leading characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a prefix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.lstrip()\n   \'spacious   \'\n   >>> \'www.example.com\'.lstrip(\'cmowz.\')\n   \'example.com\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.partition(sep)\n\n   Split the string at the first occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing the string itself, followed by\n   two empty strings.\n\n   New in version 2.5.\n\nstr.replace(old, new[, count])\n\n   Return a copy of the string with all occurrences of substring *old*\n   replaced by *new*.  If the optional argument *count* is given, only\n   the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n   Return the highest index in the string where substring *sub* is\n   found, such that *sub* is contained within ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n   Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n   is not found.\n\nstr.rjust(width[, fillchar])\n\n   Return the string right justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space). The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.rpartition(sep)\n\n   Split the string at the last occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing two empty strings, followed by\n   the string itself.\n\n   New in version 2.5.\n\nstr.rsplit([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n   are done, the *rightmost* ones.  If *sep* is not specified or\n   ``None``, any whitespace string is a separator.  Except for\n   splitting from the right, ``rsplit()`` behaves like ``split()``\n   which is described in detail below.\n\n   New in version 2.4.\n\nstr.rstrip([chars])\n\n   Return a copy of the string with trailing characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a suffix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.rstrip()\n   \'   spacious\'\n   >>> \'mississippi\'.rstrip(\'ipz\')\n   \'mississ\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.split([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string.  If *maxsplit* is given, at most *maxsplit*\n   splits are done (thus, the list will have at most ``maxsplit+1``\n   elements).  If *maxsplit* is not specified or ``-1``, then there is\n   no limit on the number of splits (all possible splits are made).\n\n   If *sep* is given, consecutive delimiters are not grouped together\n   and are deemed to delimit empty strings (for example,\n   ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``).  The *sep*\n   argument may consist of multiple characters (for example,\n   ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n   an empty string with a specified separator returns ``[\'\']``.\n\n   If *sep* is not specified or is ``None``, a different splitting\n   algorithm is applied: runs of consecutive whitespace are regarded\n   as a single separator, and the result will contain no empty strings\n   at the start or end if the string has leading or trailing\n   whitespace.  Consequently, splitting an empty string or a string\n   consisting of just whitespace with a ``None`` separator returns\n   ``[]``.\n\n   For example, ``\' 1  2   3  \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n   and ``\'  1  2   3  \'.split(None, 1)`` returns ``[\'1\', \'2   3  \']``.\n\nstr.splitlines([keepends])\n\n   Return a list of the lines in the string, breaking at line\n   boundaries. This method uses the *universal newlines* approach to\n   splitting lines. Line breaks are not included in the resulting list\n   unless *keepends* is given and true.\n\n   For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n   ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n   ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n   \'kl\\r\\n\']``.\n\n   Unlike ``split()`` when a delimiter string *sep* is given, this\n   method returns an empty list for the empty string, and a terminal\n   line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n   Return ``True`` if string starts with the *prefix*, otherwise\n   return ``False``. *prefix* can also be a tuple of prefixes to look\n   for.  With optional *start*, test string beginning at that\n   position.  With optional *end*, stop comparing string at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *prefix*.\n\nstr.strip([chars])\n\n   Return a copy of the string with the leading and trailing\n   characters removed. The *chars* argument is a string specifying the\n   set of characters to be removed. If omitted or ``None``, the\n   *chars* argument defaults to removing whitespace. The *chars*\n   argument is not a prefix or suffix; rather, all combinations of its\n   values are stripped:\n\n   >>> \'   spacious   \'.strip()\n   \'spacious\'\n   >>> \'www.example.com\'.strip(\'cmowz.\')\n   \'example\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n   Return a copy of the string with uppercase characters converted to\n   lowercase and vice versa.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.title()\n\n   Return a titlecased version of the string where words start with an\n   uppercase character and the remaining characters are lowercase.\n\n   The algorithm uses a simple language-independent definition of a\n   word as groups of consecutive letters.  The definition works in\n   many contexts but it means that apostrophes in contractions and\n   possessives form word boundaries, which may not be the desired\n   result:\n\n      >>> "they\'re bill\'s friends from the UK".title()\n      "They\'Re Bill\'S Friends From The Uk"\n\n   A workaround for apostrophes can be constructed using regular\n   expressions:\n\n      >>> import re\n      >>> def titlecase(s):\n      ...     return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n      ...                   lambda mo: mo.group(0)[0].upper() +\n      ...                              mo.group(0)[1:].lower(),\n      ...                   s)\n      ...\n      >>> titlecase("they\'re bill\'s friends.")\n      "They\'re Bill\'s Friends."\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n   Return a copy of the string where all characters occurring in the\n   optional argument *deletechars* are removed, and the remaining\n   characters have been mapped through the given translation table,\n   which must be a string of length 256.\n\n   You can use the ``maketrans()`` helper function in the ``string``\n   module to create a translation table. For string objects, set the\n   *table* argument to ``None`` for translations that only delete\n   characters:\n\n   >>> \'read this short text\'.translate(None, \'aeiou\')\n   \'rd ths shrt txt\'\n\n   New in version 2.6: Support for a ``None`` *table* argument.\n\n   For Unicode objects, the ``translate()`` method does not accept the\n   optional *deletechars* argument.  Instead, it returns a copy of the\n   *s* where all characters have been mapped through the given\n   translation table which must be a mapping of Unicode ordinals to\n   Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n   are left untouched. Characters mapped to ``None`` are deleted.\n   Note, a more flexible approach is to create a custom character\n   mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n   for an example).\n\nstr.upper()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to uppercase.  Note that ``str.upper().isupper()`` might\n   be ``False`` if ``s`` contains uncased characters or if the Unicode\n   category of the resulting character(s) is not "Lu" (Letter,\n   uppercase), but e.g. "Lt" (Letter, titlecase).\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.zfill(width)\n\n   Return the numeric string left filled with zeros in a string of\n   length *width*.  A sign prefix is handled correctly.  The original\n   string is returned if *width* is less than or equal to ``len(s)``.\n\n   New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n   Return ``True`` if there are only numeric characters in S,\n   ``False`` otherwise. Numeric characters include digit characters,\n   and all characters that have the Unicode numeric value property,\n   e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n   Return ``True`` if there are only decimal characters in S,\n   ``False`` otherwise. Decimal characters include digit characters,\n   and all characters that can be used to form decimal-radix numbers,\n   e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo).  This is also known as the string\n*formatting* or *interpolation* operator.  Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*.  The effect is similar to the using ``sprintf()`` in the C\nlanguage.  If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [5]  Otherwise, *values* must be a tuple with exactly\nthe number of items specified by the format string, or a single\nmapping object (for example, a dictionary).\n\nA conversion specifier contains two or more characters and has the\nfollowing components, which must occur in this order:\n\n1. The ``\'%\'`` character, which marks the start of the specifier.\n\n2. Mapping key (optional), consisting of a parenthesised sequence of\n   characters (for example, ``(somename)``).\n\n3. Conversion flags (optional), which affect the result of some\n   conversion types.\n\n4. Minimum field width (optional).  If specified as an ``\'*\'``\n   (asterisk), the actual width is read from the next element of the\n   tuple in *values*, and the object to convert comes after the\n   minimum field width and optional precision.\n\n5. Precision (optional), given as a ``\'.\'`` (dot) followed by the\n   precision.  If specified as ``\'*\'`` (an asterisk), the actual width\n   is read from the next element of the tuple in *values*, and the\n   value to convert comes after the precision.\n\n6. Length modifier (optional).\n\n7. Conversion type.\n\nWhen the right argument is a dictionary (or other mapping type), then\nthe formats in the string *must* include a parenthesised mapping key\ninto that dictionary inserted immediately after the ``\'%\'`` character.\nThe mapping key selects the value to be formatted from the mapping.\nFor example:\n\n>>> print \'%(language)s has %(number)03d quote types.\' % \\\n...       {"language": "Python", "number": 2}\nPython has 002 quote types.\n\nIn this case no ``*`` specifiers may occur in a format (since they\nrequire a sequential parameter list).\n\nThe conversion flag characters are:\n\n+-----------+-----------------------------------------------------------------------+\n| Flag      | Meaning                                                               |\n+===========+=======================================================================+\n| ``\'#\'``   | The value conversion will use the "alternate form" (where defined     |\n|           | below).                                                               |\n+-----------+-----------------------------------------------------------------------+\n| ``\'0\'``   | The conversion will be zero padded for numeric values.                |\n+-----------+-----------------------------------------------------------------------+\n| ``\'-\'``   | The converted value is left adjusted (overrides the ``\'0\'``           |\n|           | conversion if both are given).                                        |\n+-----------+-----------------------------------------------------------------------+\n| ``\' \'``   | (a space) A blank should be left before a positive number (or empty   |\n|           | string) produced by a signed conversion.                              |\n+-----------+-----------------------------------------------------------------------+\n| ``\'+\'``   | A sign character (``\'+\'`` or ``\'-\'``) will precede the conversion     |\n|           | (overrides a "space" flag).                                           |\n+-----------+-----------------------------------------------------------------------+\n\nA length modifier (``h``, ``l``, or ``L``) may be present, but is\nignored as it is not necessary for Python -- so e.g. ``%ld`` is\nidentical to ``%d``.\n\nThe conversion types are:\n\n+--------------+-------------------------------------------------------+---------+\n| Conversion   | Meaning                                               | Notes   |\n+==============+=======================================================+=========+\n| ``\'d\'``      | Signed integer decimal.                               |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'i\'``      | Signed integer decimal.                               |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'o\'``      | Signed octal value.                                   | (1)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'u\'``      | Obsolete type -- it is identical to ``\'d\'``.          | (7)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'x\'``      | Signed hexadecimal (lowercase).                       | (2)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'X\'``      | Signed hexadecimal (uppercase).                       | (2)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'e\'``      | Floating point exponential format (lowercase).        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'E\'``      | Floating point exponential format (uppercase).        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'f\'``      | Floating point decimal format.                        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'F\'``      | Floating point decimal format.                        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'g\'``      | Floating point format. Uses lowercase exponential     | (4)     |\n|              | format if exponent is less than -4 or not less than   |         |\n|              | precision, decimal format otherwise.                  |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'G\'``      | Floating point format. Uses uppercase exponential     | (4)     |\n|              | format if exponent is less than -4 or not less than   |         |\n|              | precision, decimal format otherwise.                  |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'c\'``      | Single character (accepts integer or single character |         |\n|              | string).                                              |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'r\'``      | String (converts any Python object using *repr()*).   | (5)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'s\'``      | String (converts any Python object using ``str()``).  | (6)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'%\'``      | No argument is converted, results in a ``\'%\'``        |         |\n|              | character in the result.                              |         |\n+--------------+-------------------------------------------------------+---------+\n\nNotes:\n\n1. The alternate form causes a leading zero (``\'0\'``) to be inserted\n   between left-hand padding and the formatting of the number if the\n   leading character of the result is not already a zero.\n\n2. The alternate form causes a leading ``\'0x\'`` or ``\'0X\'`` (depending\n   on whether the ``\'x\'`` or ``\'X\'`` format was used) to be inserted\n   between left-hand padding and the formatting of the number if the\n   leading character of the result is not already a zero.\n\n3. The alternate form causes the result to always contain a decimal\n   point, even if no digits follow it.\n\n   The precision determines the number of digits after the decimal\n   point and defaults to 6.\n\n4. The alternate form causes the result to always contain a decimal\n   point, and trailing zeroes are not removed as they would otherwise\n   be.\n\n   The precision determines the number of significant digits before\n   and after the decimal point and defaults to 6.\n\n5. The ``%r`` conversion was added in Python 2.0.\n\n   The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n   resulting string will also be ``unicode``.\n\n   The precision determines the maximal number of characters used.\n\n7. See **PEP 237**.\n\nSince Python strings have an explicit length, ``%s`` conversions do\nnot assume that ``\'\\0\'`` is the end of the string.\n\nChanged in version 2.7: ``%f`` conversions for numbers whose absolute\nvalue is over 1e50 are no longer replaced by ``%g`` conversions.\n\nAdditional string operations are defined in standard modules\n``string`` and ``re``.\n\n\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping.  The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents.  There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | same as ``s[len(s):len(s)] =     | (2)                   |\n|                                | [x]``                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)``                | same as ``s[len(s):len(s)] = x`` | (3)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.count(x)``                 | return number of *i*\'s for which |                       |\n|                                | ``s[i] == x``                    |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.index(x[, i[, j]])``       | return smallest *k* such that    | (4)                   |\n|                                | ``s[k] == x`` and ``i <= k < j`` |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | same as ``s[i:i] = [x]``         | (5)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | same as ``x = s[i]; del s[i];    | (6)                   |\n|                                | return x``                       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | same as ``del s[s.index(x)]``    | (4)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (7)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[,          | sort the items of *s* in place   | (7)(8)(9)(10)         |\n| reverse]]])``                  |                                  |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is  replacing.\n\n2. The C implementation of Python has historically accepted multiple\n   parameters and implicitly joined them into a tuple; this no longer\n   works in Python 2.0.  Use of this misfeature has been deprecated\n   since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. Raises ``ValueError`` when *x* is not found in *s*. When a negative\n   index is passed as the second or third parameter to the ``index()``\n   method, the list length is added, as for slice indices.  If it is\n   still negative, it is truncated to zero, as for slice indices.\n\n   Changed in version 2.3: Previously, ``index()`` didn\'t have\n   arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n   ``insert()`` method, the list length is added, as for slice\n   indices.  If it is still negative, it is truncated to zero, as for\n   slice indices.\n\n   Changed in version 2.3: Previously, all negative indices were\n   truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n   The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n   for economy of space when sorting or reversing a large list.  To\n   remind you that they operate by side effect, they don\'t return the\n   sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n   comparisons.\n\n   *cmp* specifies a custom comparison function of two arguments (list\n   items) which should return a negative, zero or positive number\n   depending on whether the first argument is considered smaller than,\n   equal to, or larger than the second argument: ``cmp=lambda x,y:\n   cmp(x.lower(), y.lower())``.  The default value is ``None``.\n\n   *key* specifies a function of one argument that is used to extract\n   a comparison key from each list element: ``key=str.lower``.  The\n   default value is ``None``.\n\n   *reverse* is a boolean value.  If set to ``True``, then the list\n   elements are sorted as if each comparison were reversed.\n\n   In general, the *key* and *reverse* conversion processes are much\n   faster than specifying an equivalent *cmp* function.  This is\n   because *cmp* is called multiple times for each list element while\n   *key* and *reverse* touch each element only once.  Use\n   ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n   to a *key* function.\n\n   Changed in version 2.3: Support for ``None`` as an equivalent to\n   omitting *cmp* was added.\n\n   Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n   stable.  A sort is stable if it guarantees not to change the\n   relative order of elements that compare equal --- this is helpful\n   for sorting in multiple passes (for example, sort by department,\n   then by salary grade).\n\n10. **CPython implementation detail:** While a list is being sorted,\n    the effect of attempting to mutate, or even inspect, the list is\n    undefined.  The C implementation of Python 2.3 and newer makes the\n    list appear empty for the duration, and raises ``ValueError`` if\n    it can detect that the list has been mutated during a sort.\n',
    + 'typesseq': '\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``.  See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``.  A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``.  They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function.  They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem is inefficient.\n\nMost sequence types support the following operations.  The ``in`` and\n``not in`` operations have the same priorities as the comparison\noperations.  The ``+`` and ``*`` operations have the same priority as\nthe corresponding numeric operations. [3] Additional methods are\nprovided for *Mutable Sequence Types*.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority).  In the table,\n*s* and *t* are sequences of the same type; *n*, *i* and *j* are\nintegers:\n\n+--------------------+----------------------------------+------------+\n| Operation          | Result                           | Notes      |\n+====================+==================================+============+\n| ``x in s``         | ``True`` if an item of *s* is    | (1)        |\n|                    | equal to *x*, else ``False``     |            |\n+--------------------+----------------------------------+------------+\n| ``x not in s``     | ``False`` if an item of *s* is   | (1)        |\n|                    | equal to *x*, else ``True``      |            |\n+--------------------+----------------------------------+------------+\n| ``s + t``          | the concatenation of *s* and *t* | (6)        |\n+--------------------+----------------------------------+------------+\n| ``s * n, n * s``   | *n* shallow copies of *s*        | (2)        |\n|                    | concatenated                     |            |\n+--------------------+----------------------------------+------------+\n| ``s[i]``           | *i*th item of *s*, origin 0      | (3)        |\n+--------------------+----------------------------------+------------+\n| ``s[i:j]``         | slice of *s* from *i* to *j*     | (3)(4)     |\n+--------------------+----------------------------------+------------+\n| ``s[i:j:k]``       | slice of *s* from *i* to *j*     | (3)(5)     |\n|                    | with step *k*                    |            |\n+--------------------+----------------------------------+------------+\n| ``len(s)``         | length of *s*                    |            |\n+--------------------+----------------------------------+------------+\n| ``min(s)``         | smallest item of *s*             |            |\n+--------------------+----------------------------------+------------+\n| ``max(s)``         | largest item of *s*              |            |\n+--------------------+----------------------------------+------------+\n| ``s.index(i)``     | index of the first occurrence of |            |\n|                    | *i* in *s*                       |            |\n+--------------------+----------------------------------+------------+\n| ``s.count(i)``     | total number of occurrences of   |            |\n|                    | *i* in *s*                       |            |\n+--------------------+----------------------------------+------------+\n\nSequence types also support comparisons. In particular, tuples and\nlists are compared lexicographically by comparing corresponding\nelements. This means that to compare equal, every element must compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n   in`` operations act like a substring test.  In Python versions\n   before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n   beyond, *x* may be a string of any length.\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n   empty sequence of the same type as *s*).  Note also that the copies\n   are shallow; nested structures are not copied.  This often haunts\n   new Python programmers; consider:\n\n   >>> lists = [[]] * 3\n   >>> lists\n   [[], [], []]\n   >>> lists[0].append(3)\n   >>> lists\n   [[3], [3], [3]]\n\n   What has happened is that ``[[]]`` is a one-element list containing\n   an empty list, so all three elements of ``[[]] * 3`` are (pointers\n   to) this single empty list.  Modifying any of the elements of\n   ``lists`` modifies this single list. You can create a list of\n   different lists this way:\n\n   >>> lists = [[] for i in range(3)]\n   >>> lists[0].append(3)\n   >>> lists[1].append(5)\n   >>> lists[2].append(7)\n   >>> lists\n   [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n   string: ``len(s) + i`` or ``len(s) + j`` is substituted.  But note\n   that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n   items with index *k* such that ``i <= k < j``.  If *i* or *j* is\n   greater than ``len(s)``, use ``len(s)``.  If *i* is omitted or\n   ``None``, use ``0``.  If *j* is omitted or ``None``, use\n   ``len(s)``.  If *i* is greater than or equal to *j*, the slice is\n   empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n   sequence of items with index  ``x = i + n*k`` such that ``0 <= n <\n   (j-i)/k``.  In other words, the indices are ``i``, ``i+k``,\n   ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n   never including *j*).  If *i* or *j* is greater than ``len(s)``,\n   use ``len(s)``.  If *i* or *j* are omitted or ``None``, they become\n   "end" values (which end depends on the sign of *k*).  Note, *k*\n   cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. **CPython implementation detail:** If *s* and *t* are both strings,\n   some Python implementations such as CPython can usually perform an\n   in-place optimization for assignments of the form ``s = s + t`` or\n   ``s += t``.  When applicable, this optimization makes quadratic\n   run-time much less likely.  This optimization is both version and\n   implementation dependent.  For performance sensitive code, it is\n   preferable to use the ``str.join()`` method which assures\n   consistent linear concatenation performance across versions and\n   implementations.\n\n   Changed in version 2.4: Formerly, string concatenation never\n   occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support.  Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based on regular expressions.\n\nstr.capitalize()\n\n   Return a copy of the string with its first character capitalized\n   and the rest lowercased.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.center(width[, fillchar])\n\n   Return centered in a string of length *width*. Padding is done\n   using the specified *fillchar* (default is a space).\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.count(sub[, start[, end]])\n\n   Return the number of non-overlapping occurrences of substring *sub*\n   in the range [*start*, *end*].  Optional arguments *start* and\n   *end* are interpreted as in slice notation.\n\nstr.decode([encoding[, errors]])\n\n   Decodes the string using the codec registered for *encoding*.\n   *encoding* defaults to the default string encoding.  *errors* may\n   be given to set a different error handling scheme.  The default is\n   ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n   Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n   name registered via ``codecs.register_error()``, see section *Codec\n   Base Classes*.\n\n   New in version 2.2.\n\n   Changed in version 2.3: Support for other error handling schemes\n   added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n   Return an encoded version of the string.  Default encoding is the\n   current default string encoding.  *errors* may be given to set a\n   different error handling scheme.  The default for *errors* is\n   ``\'strict\'``, meaning that encoding errors raise a\n   ``UnicodeError``.  Other possible values are ``\'ignore\'``,\n   ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n   any other name registered via ``codecs.register_error()``, see\n   section *Codec Base Classes*. For a list of possible encodings, see\n   section *Standard Encodings*.\n\n   New in version 2.0.\n\n   Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n   ``\'backslashreplace\'`` and other error handling schemes added.\n\n   Changed in version 2.7: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n   Return ``True`` if the string ends with the specified *suffix*,\n   otherwise return ``False``.  *suffix* can also be a tuple of\n   suffixes to look for.  With optional *start*, test beginning at\n   that position.  With optional *end*, stop comparing at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n   Return a copy of the string where all tab characters are replaced\n   by one or more spaces, depending on the current column and the\n   given tab size.  Tab positions occur every *tabsize* characters\n   (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n   To expand the string, the current column is set to zero and the\n   string is examined character by character.  If the character is a\n   tab (``\\t``), one or more space characters are inserted in the\n   result until the current column is equal to the next tab position.\n   (The tab character itself is not copied.)  If the character is a\n   newline (``\\n``) or return (``\\r``), it is copied and the current\n   column is reset to zero.  Any other character is copied unchanged\n   and the current column is incremented by one regardless of how the\n   character is represented when printed.\n\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n   \'01      012     0123    01234\'\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n   \'01  012 0123    01234\'\n\nstr.find(sub[, start[, end]])\n\n   Return the lowest index in the string where substring *sub* is\n   found, such that *sub* is contained in the slice ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` if *sub* is not found.\n\n   Note: The ``find()`` method should be used only if you need to know the\n     position of *sub*.  To check if *sub* is a substring or not, use\n     the ``in`` operator:\n\n        >>> \'Py\' in \'Python\'\n        True\n\nstr.format(*args, **kwargs)\n\n   Perform a string formatting operation.  The string on which this\n   method is called can contain literal text or replacement fields\n   delimited by braces ``{}``.  Each replacement field contains either\n   the numeric index of a positional argument, or the name of a\n   keyword argument.  Returns a copy of the string where each\n   replacement field is replaced with the string value of the\n   corresponding argument.\n\n   >>> "The sum of 1 + 2 is {0}".format(1+2)\n   \'The sum of 1 + 2 is 3\'\n\n   See *Format String Syntax* for a description of the various\n   formatting options that can be specified in format strings.\n\n   This method of string formatting is the new standard in Python 3,\n   and should be preferred to the ``%`` formatting described in\n   *String Formatting Operations* in new code.\n\n   New in version 2.6.\n\nstr.index(sub[, start[, end]])\n\n   Like ``find()``, but raise ``ValueError`` when the substring is not\n   found.\n\nstr.isalnum()\n\n   Return true if all characters in the string are alphanumeric and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isalpha()\n\n   Return true if all characters in the string are alphabetic and\n   there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isdigit()\n\n   Return true if all characters in the string are digits and there is\n   at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n   Return true if all cased characters [4] in the string are lowercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isspace()\n\n   Return true if there are only whitespace characters in the string\n   and there is at least one character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.istitle()\n\n   Return true if the string is a titlecased string and there is at\n   least one character, for example uppercase characters may only\n   follow uncased characters and lowercase characters only cased ones.\n   Return false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n   Return true if all cased characters [4] in the string are uppercase\n   and there is at least one cased character, false otherwise.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n   Return a string which is the concatenation of the strings in the\n   *iterable* *iterable*.  The separator between elements is the\n   string providing this method.\n\nstr.ljust(width[, fillchar])\n\n   Return the string left justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space).  The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to lowercase.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.lstrip([chars])\n\n   Return a copy of the string with leading characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a prefix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.lstrip()\n   \'spacious   \'\n   >>> \'www.example.com\'.lstrip(\'cmowz.\')\n   \'example.com\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.partition(sep)\n\n   Split the string at the first occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing the string itself, followed by\n   two empty strings.\n\n   New in version 2.5.\n\nstr.replace(old, new[, count])\n\n   Return a copy of the string with all occurrences of substring *old*\n   replaced by *new*.  If the optional argument *count* is given, only\n   the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n   Return the highest index in the string where substring *sub* is\n   found, such that *sub* is contained within ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n   Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n   is not found.\n\nstr.rjust(width[, fillchar])\n\n   Return the string right justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space). The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\n   Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.rpartition(sep)\n\n   Split the string at the last occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing two empty strings, followed by\n   the string itself.\n\n   New in version 2.5.\n\nstr.rsplit([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n   are done, the *rightmost* ones.  If *sep* is not specified or\n   ``None``, any whitespace string is a separator.  Except for\n   splitting from the right, ``rsplit()`` behaves like ``split()``\n   which is described in detail below.\n\n   New in version 2.4.\n\nstr.rstrip([chars])\n\n   Return a copy of the string with trailing characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a suffix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.rstrip()\n   \'   spacious\'\n   >>> \'mississippi\'.rstrip(\'ipz\')\n   \'mississ\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.split([sep[, maxsplit]])\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string.  If *maxsplit* is given, at most *maxsplit*\n   splits are done (thus, the list will have at most ``maxsplit+1``\n   elements).  If *maxsplit* is not specified or ``-1``, then there is\n   no limit on the number of splits (all possible splits are made).\n\n   If *sep* is given, consecutive delimiters are not grouped together\n   and are deemed to delimit empty strings (for example,\n   ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``).  The *sep*\n   argument may consist of multiple characters (for example,\n   ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n   an empty string with a specified separator returns ``[\'\']``.\n\n   If *sep* is not specified or is ``None``, a different splitting\n   algorithm is applied: runs of consecutive whitespace are regarded\n   as a single separator, and the result will contain no empty strings\n   at the start or end if the string has leading or trailing\n   whitespace.  Consequently, splitting an empty string or a string\n   consisting of just whitespace with a ``None`` separator returns\n   ``[]``.\n\n   For example, ``\' 1  2   3  \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n   and ``\'  1  2   3  \'.split(None, 1)`` returns ``[\'1\', \'2   3  \']``.\n\nstr.splitlines([keepends])\n\n   Return a list of the lines in the string, breaking at line\n   boundaries. This method uses the *universal newlines* approach to\n   splitting lines. Line breaks are not included in the resulting list\n   unless *keepends* is given and true.\n\n   For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n   ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n   ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n   \'kl\\r\\n\']``.\n\n   Unlike ``split()`` when a delimiter string *sep* is given, this\n   method returns an empty list for the empty string, and a terminal\n   line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n   Return ``True`` if string starts with the *prefix*, otherwise\n   return ``False``. *prefix* can also be a tuple of prefixes to look\n   for.  With optional *start*, test string beginning at that\n   position.  With optional *end*, stop comparing string at that\n   position.\n\n   Changed in version 2.5: Accept tuples as *prefix*.\n\nstr.strip([chars])\n\n   Return a copy of the string with the leading and trailing\n   characters removed. The *chars* argument is a string specifying the\n   set of characters to be removed. If omitted or ``None``, the\n   *chars* argument defaults to removing whitespace. The *chars*\n   argument is not a prefix or suffix; rather, all combinations of its\n   values are stripped:\n\n   >>> \'   spacious   \'.strip()\n   \'spacious\'\n   >>> \'www.example.com\'.strip(\'cmowz.\')\n   \'example\'\n\n   Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n   Return a copy of the string with uppercase characters converted to\n   lowercase and vice versa.\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.title()\n\n   Return a titlecased version of the string where words start with an\n   uppercase character and the remaining characters are lowercase.\n\n   The algorithm uses a simple language-independent definition of a\n   word as groups of consecutive letters.  The definition works in\n   many contexts but it means that apostrophes in contractions and\n   possessives form word boundaries, which may not be the desired\n   result:\n\n      >>> "they\'re bill\'s friends from the UK".title()\n      "They\'Re Bill\'S Friends From The Uk"\n\n   A workaround for apostrophes can be constructed using regular\n   expressions:\n\n      >>> import re\n      >>> def titlecase(s):\n      ...     return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n      ...                   lambda mo: mo.group(0)[0].upper() +\n      ...                              mo.group(0)[1:].lower(),\n      ...                   s)\n      ...\n      >>> titlecase("they\'re bill\'s friends.")\n      "They\'re Bill\'s Friends."\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n   Return a copy of the string where all characters occurring in the\n   optional argument *deletechars* are removed, and the remaining\n   characters have been mapped through the given translation table,\n   which must be a string of length 256.\n\n   You can use the ``maketrans()`` helper function in the ``string``\n   module to create a translation table. For string objects, set the\n   *table* argument to ``None`` for translations that only delete\n   characters:\n\n   >>> \'read this short text\'.translate(None, \'aeiou\')\n   \'rd ths shrt txt\'\n\n   New in version 2.6: Support for a ``None`` *table* argument.\n\n   For Unicode objects, the ``translate()`` method does not accept the\n   optional *deletechars* argument.  Instead, it returns a copy of the\n   *s* where all characters have been mapped through the given\n   translation table which must be a mapping of Unicode ordinals to\n   Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n   are left untouched. Characters mapped to ``None`` are deleted.\n   Note, a more flexible approach is to create a custom character\n   mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n   for an example).\n\nstr.upper()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to uppercase.  Note that ``str.upper().isupper()`` might\n   be ``False`` if ``s`` contains uncased characters or if the Unicode\n   category of the resulting character(s) is not "Lu" (Letter,\n   uppercase), but e.g. "Lt" (Letter, titlecase).\n\n   For 8-bit strings, this method is locale-dependent.\n\nstr.zfill(width)\n\n   Return the numeric string left filled with zeros in a string of\n   length *width*.  A sign prefix is handled correctly.  The original\n   string is returned if *width* is less than or equal to ``len(s)``.\n\n   New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n   Return ``True`` if there are only numeric characters in S,\n   ``False`` otherwise. Numeric characters include digit characters,\n   and all characters that have the Unicode numeric value property,\n   e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n   Return ``True`` if there are only decimal characters in S,\n   ``False`` otherwise. Decimal characters include digit characters,\n   and all characters that can be used to form decimal-radix numbers,\n   e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo).  This is also known as the string\n*formatting* or *interpolation* operator.  Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*.  The effect is similar to the using ``sprintf()`` in the C\nlanguage.  If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [5]  Otherwise, *values* must be a tuple with exactly\nthe number of items specified by the format string, or a single\nmapping object (for example, a dictionary).\n\nA conversion specifier contains two or more characters and has the\nfollowing components, which must occur in this order:\n\n1. The ``\'%\'`` character, which marks the start of the specifier.\n\n2. Mapping key (optional), consisting of a parenthesised sequence of\n   characters (for example, ``(somename)``).\n\n3. Conversion flags (optional), which affect the result of some\n   conversion types.\n\n4. Minimum field width (optional).  If specified as an ``\'*\'``\n   (asterisk), the actual width is read from the next element of the\n   tuple in *values*, and the object to convert comes after the\n   minimum field width and optional precision.\n\n5. Precision (optional), given as a ``\'.\'`` (dot) followed by the\n   precision.  If specified as ``\'*\'`` (an asterisk), the actual width\n   is read from the next element of the tuple in *values*, and the\n   value to convert comes after the precision.\n\n6. Length modifier (optional).\n\n7. Conversion type.\n\nWhen the right argument is a dictionary (or other mapping type), then\nthe formats in the string *must* include a parenthesised mapping key\ninto that dictionary inserted immediately after the ``\'%\'`` character.\nThe mapping key selects the value to be formatted from the mapping.\nFor example:\n\n>>> print \'%(language)s has %(number)03d quote types.\' % \\\n...       {"language": "Python", "number": 2}\nPython has 002 quote types.\n\nIn this case no ``*`` specifiers may occur in a format (since they\nrequire a sequential parameter list).\n\nThe conversion flag characters are:\n\n+-----------+-----------------------------------------------------------------------+\n| Flag      | Meaning                                                               |\n+===========+=======================================================================+\n| ``\'#\'``   | The value conversion will use the "alternate form" (where defined     |\n|           | below).                                                               |\n+-----------+-----------------------------------------------------------------------+\n| ``\'0\'``   | The conversion will be zero padded for numeric values.                |\n+-----------+-----------------------------------------------------------------------+\n| ``\'-\'``   | The converted value is left adjusted (overrides the ``\'0\'``           |\n|           | conversion if both are given).                                        |\n+-----------+-----------------------------------------------------------------------+\n| ``\' \'``   | (a space) A blank should be left before a positive number (or empty   |\n|           | string) produced by a signed conversion.                              |\n+-----------+-----------------------------------------------------------------------+\n| ``\'+\'``   | A sign character (``\'+\'`` or ``\'-\'``) will precede the conversion     |\n|           | (overrides a "space" flag).                                           |\n+-----------+-----------------------------------------------------------------------+\n\nA length modifier (``h``, ``l``, or ``L``) may be present, but is\nignored as it is not necessary for Python -- so e.g. ``%ld`` is\nidentical to ``%d``.\n\nThe conversion types are:\n\n+--------------+-------------------------------------------------------+---------+\n| Conversion   | Meaning                                               | Notes   |\n+==============+=======================================================+=========+\n| ``\'d\'``      | Signed integer decimal.                               |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'i\'``      | Signed integer decimal.                               |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'o\'``      | Signed octal value.                                   | (1)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'u\'``      | Obsolete type -- it is identical to ``\'d\'``.          | (7)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'x\'``      | Signed hexadecimal (lowercase).                       | (2)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'X\'``      | Signed hexadecimal (uppercase).                       | (2)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'e\'``      | Floating point exponential format (lowercase).        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'E\'``      | Floating point exponential format (uppercase).        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'f\'``      | Floating point decimal format.                        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'F\'``      | Floating point decimal format.                        | (3)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'g\'``      | Floating point format. Uses lowercase exponential     | (4)     |\n|              | format if exponent is less than -4 or not less than   |         |\n|              | precision, decimal format otherwise.                  |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'G\'``      | Floating point format. Uses uppercase exponential     | (4)     |\n|              | format if exponent is less than -4 or not less than   |         |\n|              | precision, decimal format otherwise.                  |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'c\'``      | Single character (accepts integer or single character |         |\n|              | string).                                              |         |\n+--------------+-------------------------------------------------------+---------+\n| ``\'r\'``      | String (converts any Python object using *repr()*).   | (5)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'s\'``      | String (converts any Python object using ``str()``).  | (6)     |\n+--------------+-------------------------------------------------------+---------+\n| ``\'%\'``      | No argument is converted, results in a ``\'%\'``        |         |\n|              | character in the result.                              |         |\n+--------------+-------------------------------------------------------+---------+\n\nNotes:\n\n1. The alternate form causes a leading zero (``\'0\'``) to be inserted\n   between left-hand padding and the formatting of the number if the\n   leading character of the result is not already a zero.\n\n2. The alternate form causes a leading ``\'0x\'`` or ``\'0X\'`` (depending\n   on whether the ``\'x\'`` or ``\'X\'`` format was used) to be inserted\n   between left-hand padding and the formatting of the number if the\n   leading character of the result is not already a zero.\n\n3. The alternate form causes the result to always contain a decimal\n   point, even if no digits follow it.\n\n   The precision determines the number of digits after the decimal\n   point and defaults to 6.\n\n4. The alternate form causes the result to always contain a decimal\n   point, and trailing zeroes are not removed as they would otherwise\n   be.\n\n   The precision determines the number of significant digits before\n   and after the decimal point and defaults to 6.\n\n5. The ``%r`` conversion was added in Python 2.0.\n\n   The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n   resulting string will also be ``unicode``.\n\n   The precision determines the maximal number of characters used.\n\n7. See **PEP 237**.\n\nSince Python strings have an explicit length, ``%s`` conversions do\nnot assume that ``\'\\0\'`` is the end of the string.\n\nChanged in version 2.7: ``%f`` conversions for numbers whose absolute\nvalue is over 1e50 are no longer replaced by ``%g`` conversions.\n\nAdditional string operations are defined in standard modules\n``string`` and ``re``.\n\n\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping.  The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents.  There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | same as ``s[len(s):len(s)] =     | (2)                   |\n|                                | [x]``                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)``                | same as ``s[len(s):len(s)] = x`` | (3)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.count(x)``                 | return number of *i*\'s for which |                       |\n|                                | ``s[i] == x``                    |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.index(x[, i[, j]])``       | return smallest *k* such that    | (4)                   |\n|                                | ``s[k] == x`` and ``i <= k < j`` |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | same as ``s[i:i] = [x]``         | (5)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | same as ``x = s[i]; del s[i];    | (6)                   |\n|                                | return x``                       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | same as ``del s[s.index(x)]``    | (4)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (7)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[,          | sort the items of *s* in place   | (7)(8)(9)(10)         |\n| reverse]]])``                  |                                  |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is  replacing.\n\n2. The C implementation of Python has historically accepted multiple\n   parameters and implicitly joined them into a tuple; this no longer\n   works in Python 2.0.  Use of this misfeature has been deprecated\n   since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. Raises ``ValueError`` when *x* is not found in *s*. When a negative\n   index is passed as the second or third parameter to the ``index()``\n   method, the list length is added, as for slice indices.  If it is\n   still negative, it is truncated to zero, as for slice indices.\n\n   Changed in version 2.3: Previously, ``index()`` didn\'t have\n   arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n   ``insert()`` method, the list length is added, as for slice\n   indices.  If it is still negative, it is truncated to zero, as for\n   slice indices.\n\n   Changed in version 2.3: Previously, all negative indices were\n   truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n   The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n   for economy of space when sorting or reversing a large list.  To\n   remind you that they operate by side effect, they don\'t return the\n   sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n   comparisons.\n\n   *cmp* specifies a custom comparison function of two arguments (list\n   items) which should return a negative, zero or positive number\n   depending on whether the first argument is considered smaller than,\n   equal to, or larger than the second argument: ``cmp=lambda x,y:\n   cmp(x.lower(), y.lower())``.  The default value is ``None``.\n\n   *key* specifies a function of one argument that is used to extract\n   a comparison key from each list element: ``key=str.lower``.  The\n   default value is ``None``.\n\n   *reverse* is a boolean value.  If set to ``True``, then the list\n   elements are sorted as if each comparison were reversed.\n\n   In general, the *key* and *reverse* conversion processes are much\n   faster than specifying an equivalent *cmp* function.  This is\n   because *cmp* is called multiple times for each list element while\n   *key* and *reverse* touch each element only once.  Use\n   ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n   to a *key* function.\n\n   Changed in version 2.3: Support for ``None`` as an equivalent to\n   omitting *cmp* was added.\n\n   Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n   stable.  A sort is stable if it guarantees not to change the\n   relative order of elements that compare equal --- this is helpful\n   for sorting in multiple passes (for example, sort by department,\n   then by salary grade).\n\n10. **CPython implementation detail:** While a list is being sorted,\n    the effect of attempting to mutate, or even inspect, the list is\n    undefined.  The C implementation of Python 2.3 and newer makes the\n    list appear empty for the duration, and raises ``ValueError`` if\n    it can detect that the list has been mutated during a sort.\n',
      'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | same as ``s[len(s):len(s)] =     | (2)                   |\n|                                | [x]``                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)``                | same as ``s[len(s):len(s)] = x`` | (3)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.count(x)``                 | return number of *i*'s for which |                       |\n|                                | ``s[i] == x``                    |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.index(x[, i[, j]])``       | return smallest *k* such that    | (4)                   |\n|                                | ``s[k] == x`` and ``i <= k < j`` |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | same as ``s[i:i] = [x]``         | (5)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | same as ``x = s[i]; del s[i];    | (6)                   |\n|                                | return x``                       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | same as ``del s[s.index(x)]``    | (4)                   |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (7)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[,          | sort the items of *s* in place   | (7)(8)(9)(10)         |\n| reverse]]])``                  |                                  |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is  replacing.\n\n2. The C implementation of Python has historically accepted multiple\n   parameters and implicitly joined them into a tuple; this no longer\n   works in Python 2.0.  Use of this misfeature has been deprecated\n   since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. Raises ``ValueError`` when *x* is not found in *s*. When a negative\n   index is passed as the second or third parameter to the ``index()``\n   method, the list length is added, as for slice indices.  If it is\n   still negative, it is truncated to zero, as for slice indices.\n\n   Changed in version 2.3: Previously, ``index()`` didn't have\n   arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n   ``insert()`` method, the list length is added, as for slice\n   indices.  If it is still negative, it is truncated to zero, as for\n   slice indices.\n\n   Changed in version 2.3: Previously, all negative indices were\n   truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n   The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n   for economy of space when sorting or reversing a large list.  To\n   remind you that they operate by side effect, they don't return the\n   sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n   comparisons.\n\n   *cmp* specifies a custom comparison function of two arguments (list\n   items) which should return a negative, zero or positive number\n   depending on whether the first argument is considered smaller than,\n   equal to, or larger than the second argument: ``cmp=lambda x,y:\n   cmp(x.lower(), y.lower())``.  The default value is ``None``.\n\n   *key* specifies a function of one argument that is used to extract\n   a comparison key from each list element: ``key=str.lower``.  The\n   default value is ``None``.\n\n   *reverse* is a boolean value.  If set to ``True``, then the list\n   elements are sorted as if each comparison were reversed.\n\n   In general, the *key* and *reverse* conversion processes are much\n   faster than specifying an equivalent *cmp* function.  This is\n   because *cmp* is called multiple times for each list element while\n   *key* and *reverse* touch each element only once.  Use\n   ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n   to a *key* function.\n\n   Changed in version 2.3: Support for ``None`` as an equivalent to\n   omitting *cmp* was added.\n\n   Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n   stable.  A sort is stable if it guarantees not to change the\n   relative order of elements that compare equal --- this is helpful\n   for sorting in multiple passes (for example, sort by department,\n   then by salary grade).\n\n10. **CPython implementation detail:** While a list is being sorted,\n    the effect of attempting to mutate, or even inspect, the list is\n    undefined.  The C implementation of Python 2.3 and newer makes the\n    list appear empty for the duration, and raises ``ValueError`` if\n    it can detect that the list has been mutated during a sort.\n",
      'unary': '\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n   u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary ``-`` (minus) operator yields the negation of its numeric\nargument.\n\nThe unary ``+`` (plus) operator yields its numeric argument unchanged.\n\nThe unary ``~`` (invert) operator yields the bitwise inversion of its\nplain or long integer argument.  The bitwise inversion of ``x`` is\ndefined as ``-(x+1)``.  It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n``TypeError`` exception is raised.\n',
      'while': '\nThe ``while`` statement\n***********************\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n',
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 19:55:33 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 19:55:33 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_check_for_berk?=
     =?utf-8?q?elydb_versions_besides_4=2E3_=28=2318734=29?=
    Message-ID: <3d6VGY530Xz7LlV@mail.python.org>
    
    http://hg.python.org/cpython/rev/fae0a09f0f60
    changeset:   86664:fae0a09f0f60
    branch:      2.7
    user:        Benjamin Peterson 
    date:        Sat Oct 26 13:55:25 2013 -0400
    summary:
      check for berkelydb versions besides 4.3 (#18734)
    
    files:
      setup.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/setup.py b/setup.py
    --- a/setup.py
    +++ b/setup.py
    @@ -908,7 +908,7 @@
                         if allow_db_ver((5, x)):
                             yield x
                 elif major == 4:
    -                for x in range(max_db_ver[1]+1):
    +                for x in range(9):
                         if allow_db_ver((4, x)):
                             yield x
                 elif major == 3:
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 20:58:49 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 20:58:49 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogMi43LjZyYzE=?=
    Message-ID: <3d6WgY3D2Tz7Ljk@mail.python.org>
    
    http://hg.python.org/cpython/rev/4913d0e9be30
    changeset:   86665:4913d0e9be30
    branch:      2.7
    tag:         v2.7.6rc1
    user:        Benjamin Peterson 
    date:        Sat Oct 26 14:57:21 2013 -0400
    summary:
      2.7.6rc1
    
    files:
      Include/patchlevel.h      |  8 ++++----
      Lib/distutils/__init__.py |  2 +-
      Lib/idlelib/idlever.py    |  2 +-
      Misc/NEWS                 |  8 ++++----
      Misc/RPM/python-2.7.spec  |  2 +-
      README                    |  2 +-
      6 files changed, 12 insertions(+), 12 deletions(-)
    
    
    diff --git a/Include/patchlevel.h b/Include/patchlevel.h
    --- a/Include/patchlevel.h
    +++ b/Include/patchlevel.h
    @@ -22,12 +22,12 @@
     /*--start constants--*/
     #define PY_MAJOR_VERSION	2
     #define PY_MINOR_VERSION	7
    -#define PY_MICRO_VERSION	5
    -#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_FINAL
    -#define PY_RELEASE_SERIAL	0
    +#define PY_MICRO_VERSION	6
    +#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_GAMMA
    +#define PY_RELEASE_SERIAL	1
     
     /* Version as a string */
    -#define PY_VERSION      	"2.7.5+"
    +#define PY_VERSION      	"2.7.6rc1"
     /*--end constants--*/
     
     /* Subversion Revision number of this file (not of the repository). Empty
    diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py
    --- a/Lib/distutils/__init__.py
    +++ b/Lib/distutils/__init__.py
    @@ -15,5 +15,5 @@
     # Updated automatically by the Python release process.
     #
     #--start constants--
    -__version__ = "2.7.5"
    +__version__ = "2.7.6rc1"
     #--end constants--
    diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py
    --- a/Lib/idlelib/idlever.py
    +++ b/Lib/idlelib/idlever.py
    @@ -1,1 +1,1 @@
    -IDLE_VERSION = "2.7.5"
    +IDLE_VERSION = "2.7.6rc1"
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -1,10 +1,10 @@
     Python News
     +++++++++++
     
    -What's New in Python 2.7.6?
    -===========================
    -
    -*Release date: XXXX-XX-XX*
    +What's New in Python 2.7.6 release candidate 1?
    +===============================================
    +
    +*Release date: 2013-10-26*
     
     Core and Builtins
     -----------------
    diff --git a/Misc/RPM/python-2.7.spec b/Misc/RPM/python-2.7.spec
    --- a/Misc/RPM/python-2.7.spec
    +++ b/Misc/RPM/python-2.7.spec
    @@ -39,7 +39,7 @@
     
     %define name python
     #--start constants--
    -%define version 2.7.5
    +%define version 2.7.6rc1
     %define libvers 2.7
     #--end constants--
     %define release 1pydotorg
    diff --git a/README b/README
    --- a/README
    +++ b/README
    @@ -1,4 +1,4 @@
    -This is Python version 2.7.5
    +This is Python version 2.7.6
     ============================
     
     Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 20:58:50 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 20:58:50 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Added_tag_v2?=
     =?utf-8?q?=2E7=2E6rc1_for_changeset_4913d0e9be30?=
    Message-ID: <3d6WgZ4tyxz7Ljt@mail.python.org>
    
    http://hg.python.org/cpython/rev/9750acbf7c40
    changeset:   86666:9750acbf7c40
    branch:      2.7
    user:        Benjamin Peterson 
    date:        Sat Oct 26 14:57:53 2013 -0400
    summary:
      Added tag v2.7.6rc1 for changeset 4913d0e9be30
    
    files:
      .hgtags |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/.hgtags b/.hgtags
    --- a/.hgtags
    +++ b/.hgtags
    @@ -160,3 +160,4 @@
     026ee0057e2d3305f90a9da41daf7c3f9eb1e814 v2.7.4
     ab05e7dd27889b93f20d97bae86170aabfe45ace v2.7.5
     a0025037f11a73df5a7dd03e5a4027adad4cb94e v2.6.9rc1
    +4913d0e9be30666218cc4d713937e81c0e7f346a v2.7.6rc1
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sat Oct 26 21:11:36 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sat, 26 Oct 2013 21:11:36 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogYWRkIDIuNy43IG5l?=
    	=?utf-8?q?ws_header?=
    Message-ID: <3d6WyJ6wjfz7LlS@mail.python.org>
    
    http://hg.python.org/cpython/rev/55cba56a403e
    changeset:   86667:55cba56a403e
    branch:      2.7
    user:        Benjamin Peterson 
    date:        Sat Oct 26 15:11:27 2013 -0400
    summary:
      add 2.7.7 news header
    
    files:
      Misc/NEWS |  12 ++++++++++++
      1 files changed, 12 insertions(+), 0 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -1,6 +1,18 @@
     Python News
     +++++++++++
     
    +What's New in Python 2.7.7?
    +===========================
    +
    +*Release date: XXXX-XX-XX*
    +
    +Core and Builtins
    +-----------------
    +
    +Library
    +-------
    +
    +
     What's New in Python 2.7.6 release candidate 1?
     ===============================================
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From christian at python.org  Sun Oct 27 01:07:57 2013
    From: christian at python.org (Christian Heimes)
    Date: Sun, 27 Oct 2013 01:07:57 +0200
    Subject: [Python-checkins] cpython (2.7): 2.7.6rc1
    In-Reply-To: <3d6WgY3D2Tz7Ljk@mail.python.org>
    References: <3d6WgY3D2Tz7Ljk@mail.python.org>
    Message-ID: <526C4B4D.5040905@python.org>
    
    Am 26.10.2013 20:58, schrieb benjamin.peterson:
    > http://hg.python.org/cpython/rev/4913d0e9be30
    > changeset:   86665:4913d0e9be30
    > branch:      2.7
    > tag:         v2.7.6rc1
    > user:        Benjamin Peterson 
    > date:        Sat Oct 26 14:57:21 2013 -0400
    > summary:
    >   2.7.6rc1
    
    We need to solve http://bugs.python.org/issue19227 before you release
    2.7.6. I have suggested two approaches
    http://bugs.python.org/issue19227#msg201401
    
    
    From python-checkins at python.org  Sun Oct 27 02:35:06 2013
    From: python-checkins at python.org (eric.snow)
    Date: Sun, 27 Oct 2013 02:35:06 +0200 (CEST)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Updates_in_resp?=
     =?utf-8?q?onse_to_the_latest_feedback=2E?=
    Message-ID: <3d6g7Z3XYWz7LkR@mail.python.org>
    
    http://hg.python.org/peps/rev/ead57cb56585
    changeset:   5224:ead57cb56585
    user:        Eric Snow 
    date:        Sat Oct 26 18:30:41 2013 -0600
    summary:
      [PEP 451] Updates in response to the latest feedback.
    
    This includes removing the remaining ModuleSpec methods and de-emphasizing
    that find_spec() returns actual ModuleSpec instances.
    
    files:
      pep-0451.txt |  73 ++++++++++++++++++++-------------------
      1 files changed, 37 insertions(+), 36 deletions(-)
    
    
    diff --git a/pep-0451.txt b/pep-0451.txt
    --- a/pep-0451.txt
    +++ b/pep-0451.txt
    @@ -240,8 +240,8 @@
     importlib.machinery.ModuleSpec (new)
     ------------------------------------
     
    -A specification for a module's import-system-related state.  See the
    -`ModuleSpec`_ section below for a more detailed description.
    +An encapsulation of a module's import-system-related state during import.
    +See the `ModuleSpec`_ section below for a more detailed description.
     
     * ModuleSpec(name, loader, \*, origin=None, loader_state=None, is_package=None)
     
    @@ -263,13 +263,6 @@
     * has_location (RO-property) - a flag indicating whether or not the
       module's "origin" attribute refers to a location.
     
    -Instance Methods:
    -
    -* module_repr() - provide a repr string for the spec'ed module;
    -  non-locatable modules will use their origin (e.g. "built-in").
    -* init_module_attrs(module) - set any of a module's import-related
    -  attributes that aren't already set.
    -
     importlib.util Additions
     ------------------------
     
    @@ -289,6 +282,12 @@
       importlib.find_loader() (which it replaces), but return a spec instead
       of a loader.
     
    +For finders:
    +
    +* importlib.abc.MetaPathFinder.find_spec(name, path) and
    +  importlib.abc.PathEntryFinder.find_spec(name) will return a module
    +  spec to use during import.
    +
     For loaders:
     
     * importlib.abc.Loader.exec_module(module) will execute a module in its
    @@ -443,34 +442,30 @@
     How Loading Will Work
     =====================
     
    -Here is an outline of what ModuleSpec does during loading::
    +Here is an outline of what the import machinery does during loading,
    +adjusted to take advantage of the module's spec and the new loader API::
     
    -   def load(self):
    -       if not hasattr(self.loader, 'exec_module'):
    -           module = self.loader.load_module(self.name)
    -           self.init_module_attrs(module)
    -           return sys.modules[self.name]
    +   module = None
    +   if hasattr(spec.loader, 'create_module'):
    +       module = spec.loader.create_module(spec)
    +   if module is None:
    +       module = ModuleType(spec.name)
    +   # The import-related module attributes get set here:
    +   _init_module_attrs(module)
     
    -       module = None
    -       if hasattr(self.loader, 'create_module'):
    -           module = self.loader.create_module(self)
    -       if module is None:
    -           module = ModuleType(self.name)
    -       self.init_module_attrs(module)
    -
    -       sys.modules[self.name] = module
    +   if not hasattr(spec.loader, 'exec_module'):
    +       module = spec.loader.load_module(spec.name)
    +   else:
    +       sys.modules[spec.name] = module
            try:
    -           self.loader.exec_module(module)
    +           spec.loader.exec_module(module)
            except BaseException:
                try:
    -               del sys.modules[self.name]
    +               del sys.modules[spec.name]
                except KeyError:
                    pass
                raise
    -       return sys.modules[self.name]
    -
    -Note: no "load" method is actually implemented as part of the public
    -ModuleSpec API.
    +   module_to_return = sys.modules[spec.name]
     
     These steps are exactly what Loader.load_module() is already
     expected to do.  Loaders will thus be simplified since they will only
    @@ -494,8 +489,8 @@
     value of None indicates "not set".  This contrasts with module
     objects where the attribute simply doesn't exist.  Most of the
     attributes correspond to the import-related attributes of modules.  Here
    -is the mapping.  The reverse of this mapping is used by
    -ModuleSpec.init_module_attrs().
    +is the mapping.  The reverse of this mapping describes how the import
    +machinery sets the module attributes right before calling exec_module().
     
     ========================== ==============
     On ModuleSpec              On Modules
    @@ -523,7 +518,7 @@
     
     "origin" is a string for the name of the place from which the module
     originates.  See `origin`_ above.  Aside from the informational value,
    -it is also used in module_repr().  In the case of a spec where
    +it is also used in the module's repr.  In the case of a spec where
     "has_location" is true, ``__file__`` is set to the value of "origin".
     For built-in modules "origin" would be set to "built-in".
     
    @@ -655,7 +650,7 @@
     finder or loader will likely be a better fit and should be tried first.
     However, as long as a subclass still fulfills the requirements of the
     import system, objects of that type are completely fine as the return
    -value of Finder.find_spec().
    +value of Finder.find_spec().  The same points apply to duck-typing.
     
     
     Existing Types
    @@ -695,7 +690,7 @@
     
     **PathEntryFinder.find_spec(name)**
     
    -Finders will return ModuleSpec objects when find_spec() is
    +Finders must return ModuleSpec objects when find_spec() is
     called.  This new method replaces find_module() and
     find_loader() (in the PathEntryFinder case).  If a loader does
     not have find_spec(), find_module() and find_loader() are
    @@ -715,8 +710,9 @@
     find_loader() to indicate it found part of a possible namespace
     package.  To achieve the same effect, find_spec() must return a spec
     with "loader" set to None (a.k.a. not set) and with
    -submodule_search_locations set to the same portions as were provided by
    -find_loader().  It's up to PathFinder how to handle such specs.
    +submodule_search_locations set to the same portions as would have been
    +provided by find_loader().  It's up to PathFinder how to handle such
    +specs.
     
     Loaders
     -------
    @@ -777,6 +773,11 @@
     
     * The various finders and loaders provided by importlib will be
       updated to comply with this proposal.
    +* Any other implmentations of or dependencies on the import-related APIs
    +  (particularly finders and loaders) in the stdlib will be likewise
    +  adjusted to this PEP.  While they should continue to work, any such
    +  changes that get missed should be considered bugs for the Python 3.4.x
    +  series.
     * The spec for the ``__main__`` module will reflect how the interpreter
       was started.  For instance, with ``-m`` the spec's name will be that
       of the run module, while ``__main__.__name__`` will still be
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sun Oct 27 05:15:33 2013
    From: python-checkins at python.org (eric.snow)
    Date: Sun, 27 Oct 2013 05:15:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Add_in_missing_?=
     =?utf-8?q?spec_arg_in_loading_code=2E?=
    Message-ID: <3d6m1x3FYdz7Ljx@mail.python.org>
    
    http://hg.python.org/peps/rev/f8ea26c370fa
    changeset:   5225:f8ea26c370fa
    user:        Eric Snow 
    date:        Sat Oct 26 22:11:29 2013 -0600
    summary:
      [PEP 451] Add in missing spec arg in loading code.
    
    files:
      pep-0451.txt |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/pep-0451.txt b/pep-0451.txt
    --- a/pep-0451.txt
    +++ b/pep-0451.txt
    @@ -451,7 +451,7 @@
        if module is None:
            module = ModuleType(spec.name)
        # The import-related module attributes get set here:
    -   _init_module_attrs(module)
    +   _init_module_attrs(spec, module)
     
        if not hasattr(spec.loader, 'exec_module'):
            module = spec.loader.load_module(spec.name)
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sun Oct 27 05:19:36 2013
    From: python-checkins at python.org (nick.coghlan)
    Date: Sun, 27 Oct 2013 05:19:36 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Mitigate_=2319412=3A_resto?=
     =?utf-8?q?re_test_skips_for_--without-doc-strings?=
    Message-ID: <3d6m6c6xdtz7Llg@mail.python.org>
    
    http://hg.python.org/cpython/rev/1927b7c01c78
    changeset:   86668:1927b7c01c78
    parent:      86662:f5c729dbe9fb
    user:        Nick Coghlan 
    date:        Sun Oct 27 14:19:12 2013 +1000
    summary:
      Mitigate #19412: restore test skips for --without-doc-strings
    
    files:
      Lib/test/support/__init__.py |  7 ++++++-
      1 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
    --- a/Lib/test/support/__init__.py
    +++ b/Lib/test/support/__init__.py
    @@ -1703,7 +1703,12 @@
     def _check_docstrings():
         """Just used to check if docstrings are enabled"""
     
    -HAVE_DOCSTRINGS = (_check_docstrings.__doc__ is not None)
    +MISSING_C_DOCSTRINGS = (check_impl_detail() and
    +                        sys.platform != 'win32' and
    +                        not sysconfig.get_config_var('WITH_DOC_STRINGS'))
    +
    +HAVE_DOCSTRINGS = (_check_docstrings.__doc__ is not None and
    +                   not MISSING_C_DOCSTRINGS)
     
     requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS,
                                               "test requires docstrings")
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 06:23:50 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sun, 27 Oct 2013 06:23:50 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE1NjYz?=
     =?utf-8?q?=3A_Force_IDLE=2Eapp_to_run_the_GUI_process_in_32-bit_mode=2E?=
    Message-ID: <3d6nXk5zSTz7Ln4@mail.python.org>
    
    http://hg.python.org/cpython/rev/0bf4cf62f14c
    changeset:   86669:0bf4cf62f14c
    branch:      3.3
    parent:      86660:bc259b221cb8
    user:        Ned Deily 
    date:        Sat Oct 26 22:22:07 2013 -0700
    summary:
      Issue #15663: Force IDLE.app to run the GUI process in 32-bit mode.
    This mitigates the current Aqua Tk refresh problem on OS X 10.9
    by backporting 2.7.x behavior and is transparent to the user.
    
    files:
      Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py |  4 +++-
      Mac/Makefile.in                                  |  4 ++++
      2 files changed, 7 insertions(+), 1 deletions(-)
    
    
    diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    --- a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    +++ b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    @@ -48,7 +48,7 @@
     # the interpreter in the framework, by following the symlink
     # exported in PYTHONEXECUTABLE.
     pyex = os.environ['PYTHONEXECUTABLE']
    -sys.executable = os.path.join(os.path.dirname(pyex), os.readlink(pyex))
    +sys.executable = os.path.join(sys.prefix, 'bin', 'python%d.%d'%(sys.version_info[:2]))
     
     # Remove any sys.path entries for the Resources dir in the IDLE.app bundle.
     p = pyex.partition('.app')
    @@ -68,6 +68,8 @@
             break
     
     # Now it is safe to import idlelib.
    +from idlelib import macosxSupport
    +macosxSupport._appbundle = True
     from idlelib.PyShell import main
     if __name__ == '__main__':
         main()
    diff --git a/Mac/Makefile.in b/Mac/Makefile.in
    --- a/Mac/Makefile.in
    +++ b/Mac/Makefile.in
    @@ -166,6 +166,10 @@
     	-test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -rf "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app"
     	/bin/cp -PR "$(srcdir)/IDLE/IDLE.app" "$(DESTDIR)$(PYTHONAPPSDIR)"
     	ln -sf "$(INSTALLED_PYTHONAPP)" "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python"
    +ifneq ($(LIPO_32BIT_FLAGS),)
    +	rm "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python"
    +	lipo $(LIPO_32BIT_FLAGS) -output "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python" "$(BUILDPYTHON)"
    +endif
     	sed -e "s!%prefix%!$(prefix)!g" -e 's!%exe%!$(PYTHONFRAMEWORK)!g' < "$(srcdir)/IDLE/IDLE.app/Contents/MacOS/IDLE" > "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/IDLE"
     	sed "s!%version%!`$(RUNSHARED) $(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`!g" < "$(srcdir)/IDLE/IDLE.app/Contents/Info.plist" > "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/Info.plist"
     	if [ -f "$(DESTDIR)$(LIBDEST)/idlelib/config-main.def" ]; then \
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 06:23:52 2013
    From: python-checkins at python.org (ned.deily)
    Date: Sun, 27 Oct 2013 06:23:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_Issue_=2315663=3A_merge_from_3=2E3?=
    Message-ID: <3d6nXm0dwRz7Lnv@mail.python.org>
    
    http://hg.python.org/cpython/rev/b6a1a78818fe
    changeset:   86670:b6a1a78818fe
    parent:      86668:1927b7c01c78
    parent:      86669:0bf4cf62f14c
    user:        Ned Deily 
    date:        Sat Oct 26 22:23:20 2013 -0700
    summary:
      Issue Issue #15663: merge from 3.3
    
    files:
      Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py |  4 +++-
      Mac/Makefile.in                                  |  4 ++++
      2 files changed, 7 insertions(+), 1 deletions(-)
    
    
    diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    --- a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    +++ b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
    @@ -48,7 +48,7 @@
     # the interpreter in the framework, by following the symlink
     # exported in PYTHONEXECUTABLE.
     pyex = os.environ['PYTHONEXECUTABLE']
    -sys.executable = os.path.join(os.path.dirname(pyex), os.readlink(pyex))
    +sys.executable = os.path.join(sys.prefix, 'bin', 'python%d.%d'%(sys.version_info[:2]))
     
     # Remove any sys.path entries for the Resources dir in the IDLE.app bundle.
     p = pyex.partition('.app')
    @@ -68,6 +68,8 @@
             break
     
     # Now it is safe to import idlelib.
    +from idlelib import macosxSupport
    +macosxSupport._appbundle = True
     from idlelib.PyShell import main
     if __name__ == '__main__':
         main()
    diff --git a/Mac/Makefile.in b/Mac/Makefile.in
    --- a/Mac/Makefile.in
    +++ b/Mac/Makefile.in
    @@ -166,6 +166,10 @@
     	-test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -rf "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app"
     	/bin/cp -PR "$(srcdir)/IDLE/IDLE.app" "$(DESTDIR)$(PYTHONAPPSDIR)"
     	ln -sf "$(INSTALLED_PYTHONAPP)" "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python"
    +ifneq ($(LIPO_32BIT_FLAGS),)
    +	rm "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python"
    +	lipo $(LIPO_32BIT_FLAGS) -output "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python" "$(BUILDPYTHON)"
    +endif
     	sed -e "s!%prefix%!$(prefix)!g" -e 's!%exe%!$(PYTHONFRAMEWORK)!g' < "$(srcdir)/IDLE/IDLE.app/Contents/MacOS/IDLE" > "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/IDLE"
     	sed "s!%version%!`$(RUNSHARED) $(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`!g" < "$(srcdir)/IDLE/IDLE.app/Contents/Info.plist" > "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/Info.plist"
     	if [ -f "$(DESTDIR)$(LIBDEST)/idlelib/config-main.def" ]; then \
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:09:35 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 07:09:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDA1?=
     =?utf-8?q?=3A_Fixed_outdated_comments_in_the_=5Fsre_module=2E?=
    Message-ID: <3d6pYW421Xz7LnX@mail.python.org>
    
    http://hg.python.org/cpython/rev/b7f71babc622
    changeset:   86671:b7f71babc622
    branch:      2.7
    parent:      86667:55cba56a403e
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 08:00:57 2013 +0200
    summary:
      Issue #19405: Fixed outdated comments in the _sre module.
    
    files:
      Lib/sre_compile.py |  8 ++++----
      Modules/_sre.c     |  3 +--
      2 files changed, 5 insertions(+), 6 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -276,10 +276,10 @@
     # set is constructed. Then, this bitmap is sliced into chunks of 256
     # characters, duplicate chunks are eliminated, and each chunk is
     # given a number. In the compiled expression, the charset is
    -# represented by a 16-bit word sequence, consisting of one word for
    -# the number of different chunks, a sequence of 256 bytes (128 words)
    +# represented by a 32-bit word sequence, consisting of one word for
    +# the number of different chunks, a sequence of 256 bytes (64 words)
     # of chunk numbers indexed by their original chunk position, and a
    -# sequence of chunks (16 words each).
    +# sequence of 256-bit chunks (8 words each).
     
     # Compression is normally good: in a typical charset, large ranges of
     # Unicode will be either completely excluded (e.g. if only cyrillic
    @@ -294,7 +294,7 @@
     
     # In UCS-4 mode, the BIGCHARSET opcode still supports only subsets
     # of the basic multilingual plane; an efficient representation
    -# for all of UTF-16 has not yet been developed. This means,
    +# for all of Unicode has not yet been developed. This means,
     # in particular, that negated charsets cannot be represented as
     # bigcharsets.
     
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -2753,8 +2753,7 @@
         \_________\_____/        /
                    \____________/
     
    -   It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4
    -   bytes wide (the latter if Python is compiled for "wide" unicode support).
    +   It also helps that SRE_CODE is always an unsigned type.
     */
     
     /* Defining this one enables tracing of the validator */
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:09:36 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 07:09:36 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5NDA1?=
     =?utf-8?q?=3A_Fixed_outdated_comments_in_the_=5Fsre_module=2E?=
    Message-ID: <3d6pYX5vgyz7Lnm@mail.python.org>
    
    http://hg.python.org/cpython/rev/220e3e40d176
    changeset:   86672:220e3e40d176
    branch:      3.3
    parent:      86669:0bf4cf62f14c
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 08:04:58 2013 +0200
    summary:
      Issue #19405: Fixed outdated comments in the _sre module.
    
    files:
      Lib/sre_compile.py |  10 +++++-----
      Modules/_sre.c     |   3 +--
      2 files changed, 6 insertions(+), 7 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -276,10 +276,10 @@
     # set is constructed. Then, this bitmap is sliced into chunks of 256
     # characters, duplicate chunks are eliminated, and each chunk is
     # given a number. In the compiled expression, the charset is
    -# represented by a 16-bit word sequence, consisting of one word for
    -# the number of different chunks, a sequence of 256 bytes (128 words)
    +# represented by a 32-bit word sequence, consisting of one word for
    +# the number of different chunks, a sequence of 256 bytes (64 words)
     # of chunk numbers indexed by their original chunk position, and a
    -# sequence of chunks (16 words each).
    +# sequence of 256-bit chunks (8 words each).
     
     # Compression is normally good: in a typical charset, large ranges of
     # Unicode will be either completely excluded (e.g. if only cyrillic
    @@ -292,9 +292,9 @@
     # less significant byte is a bit index in the chunk (just like the
     # CHARSET matching).
     
    -# In UCS-4 mode, the BIGCHARSET opcode still supports only subsets
    +# The BIGCHARSET opcode still supports only subsets
     # of the basic multilingual plane; an efficient representation
    -# for all of UTF-16 has not yet been developed. This means,
    +# for all of Unicode has not yet been developed. This means,
     # in particular, that negated charsets cannot be represented as
     # bigcharsets.
     
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -2749,8 +2749,7 @@
         \_________\_____/        /
                    \____________/
     
    -   It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4
    -   bytes wide (the latter if Python is compiled for "wide" unicode support).
    +   It also helps that SRE_CODE is always an unsigned type.
     */
     
     /* Defining this one enables tracing of the validator */
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:09:38 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 07:09:38 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_=2319405=3A_Fixed_outdated_comments_in_the_=5Fsre_?=
     =?utf-8?q?module=2E?=
    Message-ID: <3d6pYZ0ZJxz7LpF@mail.python.org>
    
    http://hg.python.org/cpython/rev/d6f427f94d85
    changeset:   86673:d6f427f94d85
    parent:      86670:b6a1a78818fe
    parent:      86672:220e3e40d176
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 08:07:46 2013 +0200
    summary:
      Issue #19405: Fixed outdated comments in the _sre module.
    
    files:
      Lib/sre_compile.py |  10 +++++-----
      Modules/_sre.c     |   3 +--
      2 files changed, 6 insertions(+), 7 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -270,10 +270,10 @@
     # set is constructed. Then, this bitmap is sliced into chunks of 256
     # characters, duplicate chunks are eliminated, and each chunk is
     # given a number. In the compiled expression, the charset is
    -# represented by a 16-bit word sequence, consisting of one word for
    -# the number of different chunks, a sequence of 256 bytes (128 words)
    +# represented by a 32-bit word sequence, consisting of one word for
    +# the number of different chunks, a sequence of 256 bytes (64 words)
     # of chunk numbers indexed by their original chunk position, and a
    -# sequence of chunks (16 words each).
    +# sequence of 256-bit chunks (8 words each).
     
     # Compression is normally good: in a typical charset, large ranges of
     # Unicode will be either completely excluded (e.g. if only cyrillic
    @@ -286,9 +286,9 @@
     # less significant byte is a bit index in the chunk (just like the
     # CHARSET matching).
     
    -# In UCS-4 mode, the BIGCHARSET opcode still supports only subsets
    +# The BIGCHARSET opcode still supports only subsets
     # of the basic multilingual plane; an efficient representation
    -# for all of UTF-16 has not yet been developed. This means,
    +# for all of Unicode has not yet been developed. This means,
     # in particular, that negated charsets cannot be represented as
     # bigcharsets.
     
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -1348,8 +1348,7 @@
         \_________\_____/        /
                    \____________/
     
    -   It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4
    -   bytes wide (the latter if Python is compiled for "wide" unicode support).
    +   It also helps that SRE_CODE is always an unsigned type.
     */
     
     /* Defining this one enables tracing of the validator */
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:21:42 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 07:21:42 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319329=3A_Optimize?=
     =?utf-8?q?d_compiling_charsets_in_regular_expressions=2E?=
    Message-ID: <3d6pqV59J2z7Ln2@mail.python.org>
    
    http://hg.python.org/cpython/rev/d5498d9d9bb0
    changeset:   86674:d5498d9d9bb0
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 08:20:29 2013 +0200
    summary:
      Issue #19329: Optimized compiling charsets in regular expressions.
    
    files:
      Lib/sre_compile.py |  228 +++++++++++++-------------------
      Misc/NEWS          |    2 +
      2 files changed, 98 insertions(+), 132 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -201,152 +201,116 @@
     def _optimize_charset(charset, fixup):
         # internal: optimize character set
         out = []
    -    outappend = out.append
    -    charmap = [0]*256
    -    try:
    -        for op, av in charset:
    -            if op is NEGATE:
    -                outappend((op, av))
    -            elif op is LITERAL:
    -                charmap[fixup(av)] = 1
    -            elif op is RANGE:
    -                for i in range(fixup(av[0]), fixup(av[1])+1):
    -                    charmap[i] = 1
    -            elif op is CATEGORY:
    -                # XXX: could append to charmap tail
    -                return charset # cannot compress
    -    except IndexError:
    -        # character set contains unicode characters
    -        return _optimize_unicode(charset, fixup)
    +    tail = []
    +    charmap = bytearray(256)
    +    for op, av in charset:
    +        while True:
    +            try:
    +                if op is LITERAL:
    +                    charmap[fixup(av)] = 1
    +                elif op is RANGE:
    +                    for i in range(fixup(av[0]), fixup(av[1])+1):
    +                        charmap[i] = 1
    +                elif op is NEGATE:
    +                    out.append((op, av))
    +                else:
    +                    tail.append((op, av))
    +            except IndexError:
    +                if len(charmap) == 256:
    +                    # character set contains non-UCS1 character codes
    +                    charmap += b'\0' * 0xff00
    +                    continue
    +                # character set contains non-BMP character codes
    +                tail.append((op, av))
    +            break
    +
         # compress character map
    -    i = p = n = 0
         runs = []
    -    runsappend = runs.append
    -    for c in charmap:
    -        if c:
    -            if n == 0:
    -                p = i
    -            n = n + 1
    -        elif n:
    -            runsappend((p, n))
    -            n = 0
    -        i = i + 1
    -    if n:
    -        runsappend((p, n))
    -    if len(runs) <= 2:
    +    q = 0
    +    while True:
    +        p = charmap.find(1, q)
    +        if p < 0:
    +            break
    +        if len(runs) >= 2:
    +            runs = None
    +            break
    +        q = charmap.find(0, p)
    +        if q < 0:
    +            runs.append((p, len(charmap)))
    +            break
    +        runs.append((p, q))
    +    if runs is not None:
             # use literal/range
    -        for p, n in runs:
    -            if n == 1:
    -                outappend((LITERAL, p))
    +        for p, q in runs:
    +            if q - p == 1:
    +                out.append((LITERAL, p))
                 else:
    -                outappend((RANGE, (p, p+n-1)))
    +                out.append((RANGE, (p, q - 1)))
    +        out += tail
             if len(out) < len(charset):
                 return out
    -    else:
    -        # use bitmap
    +        return charset
    +
    +    # use bitmap
    +    if len(charmap) == 256:
             data = _mk_bitmap(charmap)
    -        outappend((CHARSET, data))
    +        out.append((CHARSET, data))
    +        out += tail
             return out
    -    return charset
     
    -def _mk_bitmap(bits):
    -    data = []
    -    dataappend = data.append
    -    if _sre.CODESIZE == 2:
    -        start = (1, 0)
    -    else:
    -        start = (1, 0)
    -    m, v = start
    -    for c in bits:
    -        if c:
    -            v = v + m
    -        m = m + m
    -        if m > MAXCODE:
    -            dataappend(v)
    -            m, v = start
    -    return data
    +    # To represent a big charset, first a bitmap of all characters in the
    +    # set is constructed. Then, this bitmap is sliced into chunks of 256
    +    # characters, duplicate chunks are eliminated, and each chunk is
    +    # given a number. In the compiled expression, the charset is
    +    # represented by a 32-bit word sequence, consisting of one word for
    +    # the number of different chunks, a sequence of 256 bytes (64 words)
    +    # of chunk numbers indexed by their original chunk position, and a
    +    # sequence of 256-bit chunks (8 words each).
     
    -# To represent a big charset, first a bitmap of all characters in the
    -# set is constructed. Then, this bitmap is sliced into chunks of 256
    -# characters, duplicate chunks are eliminated, and each chunk is
    -# given a number. In the compiled expression, the charset is
    -# represented by a 32-bit word sequence, consisting of one word for
    -# the number of different chunks, a sequence of 256 bytes (64 words)
    -# of chunk numbers indexed by their original chunk position, and a
    -# sequence of 256-bit chunks (8 words each).
    +    # Compression is normally good: in a typical charset, large ranges of
    +    # Unicode will be either completely excluded (e.g. if only cyrillic
    +    # letters are to be matched), or completely included (e.g. if large
    +    # subranges of Kanji match). These ranges will be represented by
    +    # chunks of all one-bits or all zero-bits.
     
    -# Compression is normally good: in a typical charset, large ranges of
    -# Unicode will be either completely excluded (e.g. if only cyrillic
    -# letters are to be matched), or completely included (e.g. if large
    -# subranges of Kanji match). These ranges will be represented by
    -# chunks of all one-bits or all zero-bits.
    +    # Matching can be also done efficiently: the more significant byte of
    +    # the Unicode character is an index into the chunk number, and the
    +    # less significant byte is a bit index in the chunk (just like the
    +    # CHARSET matching).
     
    -# Matching can be also done efficiently: the more significant byte of
    -# the Unicode character is an index into the chunk number, and the
    -# less significant byte is a bit index in the chunk (just like the
    -# CHARSET matching).
    +    charmap = bytes(charmap) # should be hashable
    +    comps = {}
    +    mapping = bytearray(256)
    +    block = 0
    +    data = bytearray()
    +    for i in range(0, 65536, 256):
    +        chunk = charmap[i: i + 256]
    +        if chunk in comps:
    +            mapping[i // 256] = comps[chunk]
    +        else:
    +            mapping[i // 256] = comps[chunk] = block
    +            block += 1
    +            data += chunk
    +    data = _mk_bitmap(data)
    +    data[0:0] = [block] + _bytes_to_codes(mapping)
    +    out.append((BIGCHARSET, data))
    +    out += tail
    +    return out
     
    -# The BIGCHARSET opcode still supports only subsets
    -# of the basic multilingual plane; an efficient representation
    -# for all of Unicode has not yet been developed. This means,
    -# in particular, that negated charsets cannot be represented as
    -# bigcharsets.
    +_CODEBITS = _sre.CODESIZE * 8
    +_BITS_TRANS = b'0' + b'1' * 255
    +def _mk_bitmap(bits, _CODEBITS=_CODEBITS, _int=int):
    +    s = bits.translate(_BITS_TRANS)[::-1]
    +    return [_int(s[i - _CODEBITS: i], 2)
    +            for i in range(len(s), 0, -_CODEBITS)]
     
    -def _optimize_unicode(charset, fixup):
    -    try:
    -        import array
    -    except ImportError:
    -        return charset
    -    charmap = [0]*65536
    -    negate = 0
    -    try:
    -        for op, av in charset:
    -            if op is NEGATE:
    -                negate = 1
    -            elif op is LITERAL:
    -                charmap[fixup(av)] = 1
    -            elif op is RANGE:
    -                for i in range(fixup(av[0]), fixup(av[1])+1):
    -                    charmap[i] = 1
    -            elif op is CATEGORY:
    -                # XXX: could expand category
    -                return charset # cannot compress
    -    except IndexError:
    -        # non-BMP characters; XXX now they should work
    -        return charset
    -    if negate:
    -        if sys.maxunicode != 65535:
    -            # XXX: negation does not work with big charsets
    -            # XXX2: now they should work, but removing this will make the
    -            # charmap 17 times bigger
    -            return charset
    -        for i in range(65536):
    -            charmap[i] = not charmap[i]
    -    comps = {}
    -    mapping = [0]*256
    -    block = 0
    -    data = []
    -    for i in range(256):
    -        chunk = tuple(charmap[i*256:(i+1)*256])
    -        new = comps.setdefault(chunk, block)
    -        mapping[i] = new
    -        if new == block:
    -            block = block + 1
    -            data = data + _mk_bitmap(chunk)
    -    header = [block]
    -    if _sre.CODESIZE == 2:
    -        code = 'H'
    -    else:
    -        code = 'I'
    -    # Convert block indices to byte array of 256 bytes
    -    mapping = array.array('B', mapping).tobytes()
    -    # Convert byte array to word array
    -    mapping = array.array(code, mapping)
    -    assert mapping.itemsize == _sre.CODESIZE
    -    assert len(mapping) * mapping.itemsize == 256
    -    header = header + mapping.tolist()
    -    data[0:0] = header
    -    return [(BIGCHARSET, data)]
    +def _bytes_to_codes(b):
    +    # Convert block indices to word array
    +    import array
    +    a = array.array('I', b)
    +    assert a.itemsize == _sre.CODESIZE
    +    assert len(a) * a.itemsize == len(b)
    +    return a.tolist()
     
     def _simple(av):
         # check if av is a "simple" operator
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -21,6 +21,8 @@
     Library
     -------
     
    +- Issue #19329: Optimized compiling charsets in regular expressions.
    +
     - Issue #19330: the unnecessary wrapper functions have been removed from the
       implementations of the new contextlib.redirect_stdout and
       contextlib.suppress context managers, which also ensures they provide
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From solipsis at pitrou.net  Sun Oct 27 07:35:40 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Sun, 27 Oct 2013 07:35:40 +0100
    Subject: [Python-checkins] Daily reference leaks (f5c729dbe9fb): sum=0
    Message-ID: 
    
    results for f5c729dbe9fb on branch "default"
    --------------------------------------------
    
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog_N4YAo', '-x']
    
    From python-checkins at python.org  Sun Oct 27 07:38:46 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:46 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE2MDM5?=
     =?utf-8?q?=3A_CVE-2013-1752=3A_Change_use_of_readline_in_imaplib_module_t?=
     =?utf-8?q?o_limit?=
    Message-ID: <3d6qCB1XmYz7Lnm@mail.python.org>
    
    http://hg.python.org/cpython/rev/4b0364fc5711
    changeset:   86675:4b0364fc5711
    branch:      3.3
    parent:      86669:0bf4cf62f14c
    user:        Georg Brandl 
    date:        Sun Oct 27 06:52:14 2013 +0100
    summary:
      Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to limit
    line length.  Patch by Emil Lind.
    
    files:
      Lib/imaplib.py           |  14 +++++++++++++-
      Lib/test/test_imaplib.py |  11 +++++++++++
      Misc/NEWS                |  12 ++++++++----
      3 files changed, 32 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/imaplib.py b/Lib/imaplib.py
    --- a/Lib/imaplib.py
    +++ b/Lib/imaplib.py
    @@ -43,6 +43,15 @@
     IMAP4_SSL_PORT = 993
     AllowedVersions = ('IMAP4REV1', 'IMAP4')        # Most recent first
     
    +# Maximal line length when calling readline(). This is to prevent
    +# reading arbitrary length lines. RFC 3501 and 2060 (IMAP 4rev1)
    +# don't specify a line length. RFC 2683 however suggests limiting client
    +# command lines to 1000 octets and server command lines to 8000 octets.
    +# We have selected 10000 for some extra margin and since that is supposedly
    +# also what UW and Panda IMAP does.
    +_MAXLINE = 10000
    +
    +
     #       Commands
     
     Commands = {
    @@ -256,7 +265,10 @@
     
         def readline(self):
             """Read line from remote."""
    -        return self.file.readline()
    +        line = self.file.readline(_MAXLINE + 1)
    +        if len(line) > _MAXLINE:
    +            raise self.error("got more than %d bytes" % _MAXLINE)
    +        return line
     
     
         def send(self, data):
    diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
    --- a/Lib/test/test_imaplib.py
    +++ b/Lib/test/test_imaplib.py
    @@ -325,6 +325,17 @@
                 self.assertEqual(ret, "OK")
     
     
    +    def test_linetoolong(self):
    +        class TooLongHandler(SimpleIMAPHandler):
    +            def handle(self):
    +                # Send a very long response line
    +                self.wfile.write(b'* OK ' + imaplib._MAXLINE*b'x' + b'\r\n')
    +
    +        with self.reaped_server(TooLongHandler) as server:
    +            self.assertRaises(imaplib.IMAP4.error,
    +                              self.imap_class, *server.server_address)
    +
    +
     class ThreadedNetworkedTests(BaseThreadedNetworkedTests):
     
         server_class = socketserver.TCPServer
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -5,9 +5,9 @@
     What's New in Python 3.3.3 release candidate 1?
     ===============================================
     
    -*Not yet released, see sections below for changes released in 3.3.2*
    -
    -.. *Release date: TBD*
    +.. *Not yet released, see sections below for changes released in 3.3.2*
    +
    +*Release date: 27-Oct-2013*
     
     Core and Builtins
     -----------------
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to limit
    +  line length.  Patch by Emil Lind.
    +
     - Issue #19393: Fix symtable.symtable function to not be confused when there are
       functions or classes named "top".
     
    @@ -425,7 +428,8 @@
     -----
     
     - Issue #18351: Fix various issues with a helper function in importlib used
    -  by PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
    +  by PyImport_ExecCodeModuleWithPathnames() (and thus by extension
    +  PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
     
     IDLE
     ----
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:38:47 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:47 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE3OTk3?=
     =?utf-8?b?OiBDaGFuZ2UgYmVoYXZpb3Igb2YgYGBzc2wubWF0Y2hfaG9zdG5hbWUoKWBg?=
     =?utf-8?q?_to_follow_RFC_6125=2C?=
    Message-ID: <3d6qCC4Zbkz7Lnr@mail.python.org>
    
    http://hg.python.org/cpython/rev/10d0edadbcdd
    changeset:   86676:10d0edadbcdd
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 07:16:53 2013 +0100
    summary:
      Issue #17997: Change behavior of ``ssl.match_hostname()`` to follow RFC 6125,
    for security reasons.  It now doesn't match multiple wildcards nor wildcards
    inside IDN fragments.
    
    files:
      Doc/library/ssl.rst  |  15 ++++-
      Lib/ssl.py           |  72 ++++++++++++++++++++++---------
      Lib/test/test_ssl.py |  38 ++++++++++++++--
      Misc/NEWS            |   4 +
      4 files changed, 97 insertions(+), 32 deletions(-)
    
    
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -283,10 +283,10 @@
        Verify that *cert* (in decoded format as returned by
        :meth:`SSLSocket.getpeercert`) matches the given *hostname*.  The rules
        applied are those for checking the identity of HTTPS servers as outlined
    -   in :rfc:`2818`, except that IP addresses are not currently supported.
    -   In addition to HTTPS, this function should be suitable for checking the
    -   identity of servers in various SSL-based protocols such as FTPS, IMAPS,
    -   POPS and others.
    +   in :rfc:`2818` and :rfc:`6125`, except that IP addresses are not currently
    +   supported. In addition to HTTPS, this function should be suitable for
    +   checking the identity of servers in various SSL-based protocols such as
    +   FTPS, IMAPS, POPS and others.
     
        :exc:`CertificateError` is raised on failure. On success, the function
        returns nothing::
    @@ -301,6 +301,13 @@
     
        .. versionadded:: 3.2
     
    +   .. versionchanged:: 3.3.3
    +      The function now follows :rfc:`6125`, section 6.4.3 and does neither
    +      match multiple wildcards (e.g. ``*.*.com`` or ``*a*.example.org``) nor
    +      a wildcard inside an internationalized domain names (IDN) fragment.
    +      IDN A-labels such as ``www*.xn--pthon-kva.org`` are still supported,
    +      but ``x*.python.org`` no longer matches ``xn--tda.python.org``.
    +
     .. function:: cert_time_to_seconds(timestring)
     
        Returns a floating-point value containing a normal seconds-after-the-epoch
    diff --git a/Lib/ssl.py b/Lib/ssl.py
    --- a/Lib/ssl.py
    +++ b/Lib/ssl.py
    @@ -129,31 +129,59 @@
         pass
     
     
    -def _dnsname_to_pat(dn, max_wildcards=1):
    +def _dnsname_match(dn, hostname, max_wildcards=1):
    +    """Matching according to RFC 6125, section 6.4.3
    +
    +    http://tools.ietf.org/html/rfc6125#section-6.4.3
    +    """
         pats = []
    -    for frag in dn.split(r'.'):
    -        if frag.count('*') > max_wildcards:
    -            # Issue #17980: avoid denials of service by refusing more
    -            # than one wildcard per fragment.  A survey of established
    -            # policy among SSL implementations showed it to be a
    -            # reasonable choice.
    -            raise CertificateError(
    -                "too many wildcards in certificate DNS name: " + repr(dn))
    -        if frag == '*':
    -            # When '*' is a fragment by itself, it matches a non-empty dotless
    -            # fragment.
    -            pats.append('[^.]+')
    -        else:
    -            # Otherwise, '*' matches any dotless fragment.
    -            frag = re.escape(frag)
    -            pats.append(frag.replace(r'\*', '[^.]*'))
    -    return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
    +    if not dn:
    +        return False
    +
    +    leftmost, *remainder = dn.split(r'.')
    +
    +    wildcards = leftmost.count('*')
    +    if wildcards > max_wildcards:
    +        # Issue #17980: avoid denials of service by refusing more
    +        # than one wildcard per fragment.  A survery of established
    +        # policy among SSL implementations showed it to be a
    +        # reasonable choice.
    +        raise CertificateError(
    +            "too many wildcards in certificate DNS name: " + repr(dn))
    +
    +    # speed up common case w/o wildcards
    +    if not wildcards:
    +        return dn.lower() == hostname.lower()
    +
    +    # RFC 6125, section 6.4.3, subitem 1.
    +    # The client SHOULD NOT attempt to match a presented identifier in which
    +    # the wildcard character comprises a label other than the left-most label.
    +    if leftmost == '*':
    +        # When '*' is a fragment by itself, it matches a non-empty dotless
    +        # fragment.
    +        pats.append('[^.]+')
    +    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
    +        # RFC 6125, section 6.4.3, subitem 3.
    +        # The client SHOULD NOT attempt to match a presented identifier
    +        # where the wildcard character is embedded within an A-label or
    +        # U-label of an internationalized domain name.
    +        pats.append(re.escape(leftmost))
    +    else:
    +        # Otherwise, '*' matches any dotless string, e.g. www*
    +        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
    +
    +    # add the remaining fragments, ignore any wildcards
    +    for frag in remainder:
    +        pats.append(re.escape(frag))
    +
    +    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
    +    return pat.match(hostname)
     
     
     def match_hostname(cert, hostname):
         """Verify that *cert* (in decoded format as returned by
    -    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules
    -    are mostly followed, but IP addresses are not accepted for *hostname*.
    +    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
    +    rules are followed, but IP addresses are not accepted for *hostname*.
     
         CertificateError is raised on failure. On success, the function
         returns nothing.
    @@ -164,7 +192,7 @@
         san = cert.get('subjectAltName', ())
         for key, value in san:
             if key == 'DNS':
    -            if _dnsname_to_pat(value).match(hostname):
    +            if _dnsname_match(value, hostname):
                     return
                 dnsnames.append(value)
         if not dnsnames:
    @@ -175,7 +203,7 @@
                     # XXX according to RFC 2818, the most specific Common Name
                     # must be used.
                     if key == 'commonName':
    -                    if _dnsname_to_pat(value).match(hostname):
    +                    if _dnsname_match(value, hostname):
                             return
                         dnsnames.append(value)
         if len(dnsnames) > 1:
    diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
    --- a/Lib/test/test_ssl.py
    +++ b/Lib/test/test_ssl.py
    @@ -344,11 +344,7 @@
             fail(cert, 'Xa.com')
             fail(cert, '.a.com')
     
    -        cert = {'subject': ((('commonName', 'a.*.com'),),)}
    -        ok(cert, 'a.foo.com')
    -        fail(cert, 'a..com')
    -        fail(cert, 'a.com')
    -
    +        # only match one left-most wildcard
             cert = {'subject': ((('commonName', 'f*.com'),),)}
             ok(cert, 'foo.com')
             ok(cert, 'f.com')
    @@ -363,6 +359,36 @@
             fail(cert, 'example.org')
             fail(cert, 'null.python.org')
     
    +        # error cases with wildcards
    +        cert = {'subject': ((('commonName', '*.*.a.com'),),)}
    +        fail(cert, 'bar.foo.a.com')
    +        fail(cert, 'a.com')
    +        fail(cert, 'Xa.com')
    +        fail(cert, '.a.com')
    +
    +        cert = {'subject': ((('commonName', 'a.*.com'),),)}
    +        fail(cert, 'a.foo.com')
    +        fail(cert, 'a..com')
    +        fail(cert, 'a.com')
    +
    +        # wildcard doesn't match IDNA prefix 'xn--'
    +        idna = 'p?thon.python.org'.encode("idna").decode("ascii")
    +        cert = {'subject': ((('commonName', idna),),)}
    +        ok(cert, idna)
    +        cert = {'subject': ((('commonName', 'x*.python.org'),),)}
    +        fail(cert, idna)
    +        cert = {'subject': ((('commonName', 'xn--p*.python.org'),),)}
    +        fail(cert, idna)
    +
    +        # wildcard in first fragment and  IDNA A-labels in sequent fragments
    +        # are supported.
    +        idna = 'www*.pyth?n.org'.encode("idna").decode("ascii")
    +        cert = {'subject': ((('commonName', idna),),)}
    +        ok(cert, 'www.pyth?n.org'.encode("idna").decode("ascii"))
    +        ok(cert, 'www1.pyth?n.org'.encode("idna").decode("ascii"))
    +        fail(cert, 'ftp.pyth?n.org'.encode("idna").decode("ascii"))
    +        fail(cert, 'pyth?n.org'.encode("idna").decode("ascii"))
    +
             # Slightly fake real-world example
             cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
                     'subject': ((('commonName', 'linuxfrz.org'),),),
    @@ -423,7 +449,7 @@
             cert = {'subject': ((('commonName', 'a*b.com'),),)}
             ok(cert, 'axxb.com')
             cert = {'subject': ((('commonName', 'a*b.co*'),),)}
    -        ok(cert, 'axxb.com')
    +        fail(cert, 'axxb.com')
             cert = {'subject': ((('commonName', 'a*b*.com'),),)}
             with self.assertRaises(ssl.CertificateError) as cm:
                 ssl.match_hostname(cert, 'axxbxxc.com')
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,10 @@
     Library
     -------
     
    +- Issue #17997: Change behavior of ``ssl.match_hostname()`` to follow RFC 6125,
    +  for security reasons.  It now doesn't match multiple wildcards nor wildcards
    +  inside IDN fragments.
    +
     - Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to limit
       line length.  Patch by Emil Lind.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:38:48 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE2MDQx?=
     =?utf-8?q?=3A_CVE-2013-1752=3A_poplib=3A_Limit_maximum_line_lengths_to_20?=
     =?utf-8?q?48_to?=
    Message-ID: <3d6qCD6Mf1z7Lp8@mail.python.org>
    
    http://hg.python.org/cpython/rev/68029048c9c6
    changeset:   86677:68029048c9c6
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 07:23:53 2013 +0100
    summary:
      Issue #16041: CVE-2013-1752: poplib: Limit maximum line lengths to 2048 to
    prevent readline() calls from consuming too much memory.  Patch by Jyrki
    Pulliainen.
    
    files:
      Lib/poplib.py           |  11 ++++++++++-
      Lib/test/test_poplib.py |   6 +++++-
      Misc/NEWS               |   4 ++++
      3 files changed, 19 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/poplib.py b/Lib/poplib.py
    --- a/Lib/poplib.py
    +++ b/Lib/poplib.py
    @@ -32,6 +32,12 @@
     LF = b'\n'
     CRLF = CR+LF
     
    +# maximal line length when calling readline(). This is to prevent
    +# reading arbitrary lenght lines. RFC 1939 limits POP3 line length to
    +# 512 characters, including CRLF. We have selected 2048 just to be on
    +# the safe side.
    +_MAXLINE = 2048
    +
     
     class POP3:
     
    @@ -107,7 +113,10 @@
         # Raise error_proto('-ERR EOF') if the connection is closed.
     
         def _getline(self):
    -        line = self.file.readline()
    +        line = self.file.readline(_MAXLINE + 1)
    +        if len(line) > _MAXLINE:
    +            raise error_proto('line too long')
    +
             if self._debugging > 1: print('*get*', repr(line))
             if not line: raise error_proto('-ERR EOF')
             octets = len(line)
    diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
    --- a/Lib/test/test_poplib.py
    +++ b/Lib/test/test_poplib.py
    @@ -83,7 +83,7 @@
     
         def cmd_list(self, arg):
             if arg:
    -            self.push('+OK %s %s' %(arg, arg))
    +            self.push('+OK %s %s' % (arg, arg))
             else:
                 self.push('+OK')
                 asynchat.async_chat.push(self, LIST_RESP)
    @@ -208,6 +208,10 @@
             foo = self.client.retr('foo')
             self.assertEqual(foo, expected)
     
    +    def test_too_long_lines(self):
    +        self.assertRaises(poplib.error_proto, self.client._shortcmd,
    +                          'echo +%s' % ((poplib._MAXLINE + 10) * 'a'))
    +
         def test_dele(self):
             self.assertOK(self.client.dele('foo'))
     
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,10 @@
     Library
     -------
     
    +- Issue #16041: CVE-2013-1752: poplib: Limit maximum line lengths to 2048 to
    +  prevent readline() calls from consuming too much memory.  Patch by Jyrki
    +  Pulliainen.
    +
     - Issue #17997: Change behavior of ``ssl.match_hostname()`` to follow RFC 6125,
       for security reasons.  It now doesn't match multiple wildcards nor wildcards
       inside IDN fragments.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:38:50 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:50 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE2MDQw?=
     =?utf-8?q?=3A_CVE-2013-1752=3A_nntplib=3A_Limit_maximum_line_lengths_to_2?=
     =?utf-8?q?048_to?=
    Message-ID: <3d6qCG122bz7LpN@mail.python.org>
    
    http://hg.python.org/cpython/rev/fc88bd80d925
    changeset:   86678:fc88bd80d925
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 07:29:47 2013 +0100
    summary:
      Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
    prevent readline() calls from consuming too much memory.  Patch by Jyrki
    Pulliainen.
    
    files:
      Lib/nntplib.py           |  11 ++++++++++-
      Lib/test/test_nntplib.py |  10 ++++++++++
      Misc/NEWS                |   4 ++++
      3 files changed, 24 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/nntplib.py b/Lib/nntplib.py
    --- a/Lib/nntplib.py
    +++ b/Lib/nntplib.py
    @@ -85,6 +85,13 @@
                "decode_header",
                ]
     
    +# maximal line length when calling readline(). This is to prevent
    +# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to
    +# 512 characters, including CRLF. We have selected 2048 just to be on
    +# the safe side.
    +_MAXLINE = 2048
    +
    +
     # Exceptions raised when an error or invalid response is received
     class NNTPError(Exception):
         """Base class for all nntplib exceptions"""
    @@ -424,7 +431,9 @@
             """Internal: return one line from the server, stripping _CRLF.
             Raise EOFError if the connection is closed.
             Returns a bytes object."""
    -        line = self.file.readline()
    +        line = self.file.readline(_MAXLINE +1)
    +        if len(line) > _MAXLINE:
    +            raise NNTPDataError('line too long')
             if self.debugging > 1:
                 print('*get*', repr(line))
             if not line: raise EOFError
    diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py
    --- a/Lib/test/test_nntplib.py
    +++ b/Lib/test/test_nntplib.py
    @@ -584,6 +584,11 @@
                     
                     
                     .""")
    +        elif (group == 'comp.lang.python' and
    +              date_str in ('20100101', '100101') and
    +              time_str == '090000'):
    +            self.push_lit('too long line' * 3000 +
    +                          '\n.')
             else:
                 self.push_lit("""\
                     230 An empty list of newsarticles follows
    @@ -1179,6 +1184,11 @@
             self.assertEqual(cm.exception.response,
                              "435 Article not wanted")
     
    +    def test_too_long_lines(self):
    +        dt = datetime.datetime(2010, 1, 1, 9, 0, 0)
    +        self.assertRaises(nntplib.NNTPDataError,
    +                          self.server.newnews, "comp.lang.python", dt)
    +
     
     class NNTPv1Tests(NNTPv1v2TestsMixin, MockedNNTPTestsMixin, unittest.TestCase):
         """Tests an NNTP v1 server (no capabilities)."""
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,10 @@
     Library
     -------
     
    +- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
    +  prevent readline() calls from consuming too much memory.  Patch by Jyrki
    +  Pulliainen.
    +
     - Issue #16041: CVE-2013-1752: poplib: Limit maximum line lengths to 2048 to
       prevent readline() calls from consuming too much memory.  Patch by Jyrki
       Pulliainen.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:38:51 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:51 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE2MDM3?=
     =?utf-8?q?=3A_HTTPMessage=2Ereadheaders=28=29_raises_an_HTTPException_whe?=
     =?utf-8?q?n_more_than?=
    Message-ID: <3d6qCH2vyrz7LpQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/e445d02e5306
    changeset:   86679:e445d02e5306
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 07:34:48 2013 +0100
    summary:
      Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more than
    100 headers are read.  Adapted from patch by Jyrki Pulliainen.
    
    files:
      Doc/library/http.client.rst |  2 +-
      Lib/http/client.py          |  4 ++++
      Lib/test/test_httplib.py    |  9 +++++++++
      Misc/NEWS                   |  3 +++
      4 files changed, 17 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
    --- a/Doc/library/http.client.rst
    +++ b/Doc/library/http.client.rst
    @@ -169,9 +169,9 @@
        A subclass of :exc:`HTTPException`.  Raised if a server responds with a HTTP
        status code that we don't understand.
     
    +
     The constants defined in this module are:
     
    -
     .. data:: HTTP_PORT
     
        The default port for the HTTP protocol (always ``80``).
    diff --git a/Lib/http/client.py b/Lib/http/client.py
    --- a/Lib/http/client.py
    +++ b/Lib/http/client.py
    @@ -214,6 +214,8 @@
     
     # maximal line length when calling readline().
     _MAXLINE = 65536
    +_MAXHEADERS = 100
    +
     
     class HTTPMessage(email.message.Message):
         # XXX The only usage of this method is in
    @@ -261,6 +263,8 @@
             if len(line) > _MAXLINE:
                 raise LineTooLong("header line")
             headers.append(line)
    +        if len(headers) > _MAXHEADERS:
    +            raise HTTPException("got more than %d headers" % _MAXHEADERS)
             if line in (b'\r\n', b'\n', b''):
                 break
         hstring = b''.join(headers).decode('iso-8859-1')
    diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
    --- a/Lib/test/test_httplib.py
    +++ b/Lib/test/test_httplib.py
    @@ -345,6 +345,15 @@
                 self.fail("Did not expect response from HEAD request")
             self.assertEqual(bytes(b), b'\x00'*5)
     
    +    def test_too_many_headers(self):
    +        headers = '\r\n'.join('Header%d: foo' % i
    +                              for i in range(client._MAXHEADERS + 1)) + '\r\n'
    +        text = ('HTTP/1.1 200 OK\r\n' + headers)
    +        s = FakeSocket(text)
    +        r = client.HTTPResponse(s)
    +        self.assertRaisesRegex(client.HTTPException,
    +                               r"got more than \d+ headers", r.begin)
    +
         def test_send_file(self):
             expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n'
                         b'Accept-Encoding: identity\r\nContent-Length:')
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more than
    +  100 headers are read.  Adapted from patch by Jyrki Pulliainen.
    +
     - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
       prevent readline() calls from consuming too much memory.  Patch by Jyrki
       Pulliainen.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:38:52 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:38:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuMyk6?=
    	=?utf-8?q?_merge?=
    Message-ID: <3d6qCJ4hPBz7Lnm@mail.python.org>
    
    http://hg.python.org/cpython/rev/49be8a5c9de2
    changeset:   86680:49be8a5c9de2
    branch:      3.3
    parent:      86679:e445d02e5306
    parent:      86672:220e3e40d176
    user:        Georg Brandl 
    date:        Sun Oct 27 07:39:36 2013 +0100
    summary:
      merge
    
    files:
      Lib/sre_compile.py |  10 +++++-----
      Modules/_sre.c     |   3 +--
      2 files changed, 6 insertions(+), 7 deletions(-)
    
    
    diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
    --- a/Lib/sre_compile.py
    +++ b/Lib/sre_compile.py
    @@ -276,10 +276,10 @@
     # set is constructed. Then, this bitmap is sliced into chunks of 256
     # characters, duplicate chunks are eliminated, and each chunk is
     # given a number. In the compiled expression, the charset is
    -# represented by a 16-bit word sequence, consisting of one word for
    -# the number of different chunks, a sequence of 256 bytes (128 words)
    +# represented by a 32-bit word sequence, consisting of one word for
    +# the number of different chunks, a sequence of 256 bytes (64 words)
     # of chunk numbers indexed by their original chunk position, and a
    -# sequence of chunks (16 words each).
    +# sequence of 256-bit chunks (8 words each).
     
     # Compression is normally good: in a typical charset, large ranges of
     # Unicode will be either completely excluded (e.g. if only cyrillic
    @@ -292,9 +292,9 @@
     # less significant byte is a bit index in the chunk (just like the
     # CHARSET matching).
     
    -# In UCS-4 mode, the BIGCHARSET opcode still supports only subsets
    +# The BIGCHARSET opcode still supports only subsets
     # of the basic multilingual plane; an efficient representation
    -# for all of UTF-16 has not yet been developed. This means,
    +# for all of Unicode has not yet been developed. This means,
     # in particular, that negated charsets cannot be represented as
     # bigcharsets.
     
    diff --git a/Modules/_sre.c b/Modules/_sre.c
    --- a/Modules/_sre.c
    +++ b/Modules/_sre.c
    @@ -2749,8 +2749,7 @@
         \_________\_____/        /
                    \____________/
     
    -   It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4
    -   bytes wide (the latter if Python is compiled for "wide" unicode support).
    +   It also helps that SRE_CODE is always an unsigned type.
     */
     
     /* Defining this one enables tracing of the validator */
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:45:12 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:45:12 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_merge_with_3=2E3?=
    Message-ID: <3d6qLc4zl1z7Lpm@mail.python.org>
    
    http://hg.python.org/cpython/rev/ab0c133288f8
    changeset:   86681:ab0c133288f8
    parent:      86674:d5498d9d9bb0
    parent:      86680:49be8a5c9de2
    user:        Georg Brandl 
    date:        Sun Oct 27 07:46:09 2013 +0100
    summary:
      merge with 3.3
    
    files:
      Doc/library/http.client.rst |   2 +-
      Doc/library/ssl.rst         |  15 +++-
      Lib/http/client.py          |   4 +
      Lib/imaplib.py              |  14 ++++-
      Lib/nntplib.py              |  11 +++-
      Lib/poplib.py               |  11 +++-
      Lib/ssl.py                  |  72 +++++++++++++++++-------
      Lib/test/test_httplib.py    |   9 +++
      Lib/test/test_imaplib.py    |  11 +++
      Lib/test/test_nntplib.py    |  10 +++
      Lib/test/test_poplib.py     |  14 ++++-
      Lib/test/test_ssl.py        |  38 +++++++++++--
      Misc/NEWS                   |  18 ++++++
      13 files changed, 191 insertions(+), 38 deletions(-)
    
    
    diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
    --- a/Doc/library/http.client.rst
    +++ b/Doc/library/http.client.rst
    @@ -169,9 +169,9 @@
        A subclass of :exc:`HTTPException`.  Raised if a server responds with a HTTP
        status code that we don't understand.
     
    +
     The constants defined in this module are:
     
    -
     .. data:: HTTP_PORT
     
        The default port for the HTTP protocol (always ``80``).
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -286,10 +286,10 @@
        Verify that *cert* (in decoded format as returned by
        :meth:`SSLSocket.getpeercert`) matches the given *hostname*.  The rules
        applied are those for checking the identity of HTTPS servers as outlined
    -   in :rfc:`2818`, except that IP addresses are not currently supported.
    -   In addition to HTTPS, this function should be suitable for checking the
    -   identity of servers in various SSL-based protocols such as FTPS, IMAPS,
    -   POPS and others.
    +   in :rfc:`2818` and :rfc:`6125`, except that IP addresses are not currently
    +   supported. In addition to HTTPS, this function should be suitable for
    +   checking the identity of servers in various SSL-based protocols such as
    +   FTPS, IMAPS, POPS and others.
     
        :exc:`CertificateError` is raised on failure. On success, the function
        returns nothing::
    @@ -304,6 +304,13 @@
     
        .. versionadded:: 3.2
     
    +   .. versionchanged:: 3.3.3
    +      The function now follows :rfc:`6125`, section 6.4.3 and does neither
    +      match multiple wildcards (e.g. ``*.*.com`` or ``*a*.example.org``) nor
    +      a wildcard inside an internationalized domain names (IDN) fragment.
    +      IDN A-labels such as ``www*.xn--pthon-kva.org`` are still supported,
    +      but ``x*.python.org`` no longer matches ``xn--tda.python.org``.
    +
     .. function:: cert_time_to_seconds(timestring)
     
        Returns a floating-point value containing a normal seconds-after-the-epoch
    diff --git a/Lib/http/client.py b/Lib/http/client.py
    --- a/Lib/http/client.py
    +++ b/Lib/http/client.py
    @@ -214,6 +214,8 @@
     
     # maximal line length when calling readline().
     _MAXLINE = 65536
    +_MAXHEADERS = 100
    +
     
     class HTTPMessage(email.message.Message):
         # XXX The only usage of this method is in
    @@ -261,6 +263,8 @@
             if len(line) > _MAXLINE:
                 raise LineTooLong("header line")
             headers.append(line)
    +        if len(headers) > _MAXHEADERS:
    +            raise HTTPException("got more than %d headers" % _MAXHEADERS)
             if line in (b'\r\n', b'\n', b''):
                 break
         hstring = b''.join(headers).decode('iso-8859-1')
    diff --git a/Lib/imaplib.py b/Lib/imaplib.py
    --- a/Lib/imaplib.py
    +++ b/Lib/imaplib.py
    @@ -43,6 +43,15 @@
     IMAP4_SSL_PORT = 993
     AllowedVersions = ('IMAP4REV1', 'IMAP4')        # Most recent first
     
    +# Maximal line length when calling readline(). This is to prevent
    +# reading arbitrary length lines. RFC 3501 and 2060 (IMAP 4rev1)
    +# don't specify a line length. RFC 2683 however suggests limiting client
    +# command lines to 1000 octets and server command lines to 8000 octets.
    +# We have selected 10000 for some extra margin and since that is supposedly
    +# also what UW and Panda IMAP does.
    +_MAXLINE = 10000
    +
    +
     #       Commands
     
     Commands = {
    @@ -256,7 +265,10 @@
     
         def readline(self):
             """Read line from remote."""
    -        return self.file.readline()
    +        line = self.file.readline(_MAXLINE + 1)
    +        if len(line) > _MAXLINE:
    +            raise self.error("got more than %d bytes" % _MAXLINE)
    +        return line
     
     
         def send(self, data):
    diff --git a/Lib/nntplib.py b/Lib/nntplib.py
    --- a/Lib/nntplib.py
    +++ b/Lib/nntplib.py
    @@ -85,6 +85,13 @@
                "decode_header",
                ]
     
    +# maximal line length when calling readline(). This is to prevent
    +# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to
    +# 512 characters, including CRLF. We have selected 2048 just to be on
    +# the safe side.
    +_MAXLINE = 2048
    +
    +
     # Exceptions raised when an error or invalid response is received
     class NNTPError(Exception):
         """Base class for all nntplib exceptions"""
    @@ -424,7 +431,9 @@
             """Internal: return one line from the server, stripping _CRLF.
             Raise EOFError if the connection is closed.
             Returns a bytes object."""
    -        line = self.file.readline()
    +        line = self.file.readline(_MAXLINE +1)
    +        if len(line) > _MAXLINE:
    +            raise NNTPDataError('line too long')
             if self.debugging > 1:
                 print('*get*', repr(line))
             if not line: raise EOFError
    diff --git a/Lib/poplib.py b/Lib/poplib.py
    --- a/Lib/poplib.py
    +++ b/Lib/poplib.py
    @@ -40,6 +40,12 @@
     LF = b'\n'
     CRLF = CR+LF
     
    +# maximal line length when calling readline(). This is to prevent
    +# reading arbitrary lenght lines. RFC 1939 limits POP3 line length to
    +# 512 characters, including CRLF. We have selected 2048 just to be on
    +# the safe side.
    +_MAXLINE = 2048
    +
     
     class POP3:
     
    @@ -118,7 +124,10 @@
         # Raise error_proto('-ERR EOF') if the connection is closed.
     
         def _getline(self):
    -        line = self.file.readline()
    +        line = self.file.readline(_MAXLINE + 1)
    +        if len(line) > _MAXLINE:
    +            raise error_proto('line too long')
    +
             if self._debugging > 1: print('*get*', repr(line))
             if not line: raise error_proto('-ERR EOF')
             octets = len(line)
    diff --git a/Lib/ssl.py b/Lib/ssl.py
    --- a/Lib/ssl.py
    +++ b/Lib/ssl.py
    @@ -166,31 +166,59 @@
         pass
     
     
    -def _dnsname_to_pat(dn, max_wildcards=1):
    +def _dnsname_match(dn, hostname, max_wildcards=1):
    +    """Matching according to RFC 6125, section 6.4.3
    +
    +    http://tools.ietf.org/html/rfc6125#section-6.4.3
    +    """
         pats = []
    -    for frag in dn.split(r'.'):
    -        if frag.count('*') > max_wildcards:
    -            # Issue #17980: avoid denials of service by refusing more
    -            # than one wildcard per fragment.  A survey of established
    -            # policy among SSL implementations showed it to be a
    -            # reasonable choice.
    -            raise CertificateError(
    -                "too many wildcards in certificate DNS name: " + repr(dn))
    -        if frag == '*':
    -            # When '*' is a fragment by itself, it matches a non-empty dotless
    -            # fragment.
    -            pats.append('[^.]+')
    -        else:
    -            # Otherwise, '*' matches any dotless fragment.
    -            frag = re.escape(frag)
    -            pats.append(frag.replace(r'\*', '[^.]*'))
    -    return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
    +    if not dn:
    +        return False
    +
    +    leftmost, *remainder = dn.split(r'.')
    +
    +    wildcards = leftmost.count('*')
    +    if wildcards > max_wildcards:
    +        # Issue #17980: avoid denials of service by refusing more
    +        # than one wildcard per fragment.  A survery of established
    +        # policy among SSL implementations showed it to be a
    +        # reasonable choice.
    +        raise CertificateError(
    +            "too many wildcards in certificate DNS name: " + repr(dn))
    +
    +    # speed up common case w/o wildcards
    +    if not wildcards:
    +        return dn.lower() == hostname.lower()
    +
    +    # RFC 6125, section 6.4.3, subitem 1.
    +    # The client SHOULD NOT attempt to match a presented identifier in which
    +    # the wildcard character comprises a label other than the left-most label.
    +    if leftmost == '*':
    +        # When '*' is a fragment by itself, it matches a non-empty dotless
    +        # fragment.
    +        pats.append('[^.]+')
    +    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
    +        # RFC 6125, section 6.4.3, subitem 3.
    +        # The client SHOULD NOT attempt to match a presented identifier
    +        # where the wildcard character is embedded within an A-label or
    +        # U-label of an internationalized domain name.
    +        pats.append(re.escape(leftmost))
    +    else:
    +        # Otherwise, '*' matches any dotless string, e.g. www*
    +        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
    +
    +    # add the remaining fragments, ignore any wildcards
    +    for frag in remainder:
    +        pats.append(re.escape(frag))
    +
    +    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
    +    return pat.match(hostname)
     
     
     def match_hostname(cert, hostname):
         """Verify that *cert* (in decoded format as returned by
    -    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules
    -    are mostly followed, but IP addresses are not accepted for *hostname*.
    +    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
    +    rules are followed, but IP addresses are not accepted for *hostname*.
     
         CertificateError is raised on failure. On success, the function
         returns nothing.
    @@ -201,7 +229,7 @@
         san = cert.get('subjectAltName', ())
         for key, value in san:
             if key == 'DNS':
    -            if _dnsname_to_pat(value).match(hostname):
    +            if _dnsname_match(value, hostname):
                     return
                 dnsnames.append(value)
         if not dnsnames:
    @@ -212,7 +240,7 @@
                     # XXX according to RFC 2818, the most specific Common Name
                     # must be used.
                     if key == 'commonName':
    -                    if _dnsname_to_pat(value).match(hostname):
    +                    if _dnsname_match(value, hostname):
                             return
                         dnsnames.append(value)
         if len(dnsnames) > 1:
    diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
    --- a/Lib/test/test_httplib.py
    +++ b/Lib/test/test_httplib.py
    @@ -347,6 +347,15 @@
                 self.fail("Did not expect response from HEAD request")
             self.assertEqual(bytes(b), b'\x00'*5)
     
    +    def test_too_many_headers(self):
    +        headers = '\r\n'.join('Header%d: foo' % i
    +                              for i in range(client._MAXHEADERS + 1)) + '\r\n'
    +        text = ('HTTP/1.1 200 OK\r\n' + headers)
    +        s = FakeSocket(text)
    +        r = client.HTTPResponse(s)
    +        self.assertRaisesRegex(client.HTTPException,
    +                               r"got more than \d+ headers", r.begin)
    +
         def test_send_file(self):
             expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n'
                         b'Accept-Encoding: identity\r\nContent-Length:')
    diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
    --- a/Lib/test/test_imaplib.py
    +++ b/Lib/test/test_imaplib.py
    @@ -325,6 +325,17 @@
                 self.assertEqual(ret, "OK")
     
     
    +    def test_linetoolong(self):
    +        class TooLongHandler(SimpleIMAPHandler):
    +            def handle(self):
    +                # Send a very long response line
    +                self.wfile.write(b'* OK ' + imaplib._MAXLINE*b'x' + b'\r\n')
    +
    +        with self.reaped_server(TooLongHandler) as server:
    +            self.assertRaises(imaplib.IMAP4.error,
    +                              self.imap_class, *server.server_address)
    +
    +
     class ThreadedNetworkedTests(BaseThreadedNetworkedTests):
     
         server_class = socketserver.TCPServer
    diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py
    --- a/Lib/test/test_nntplib.py
    +++ b/Lib/test/test_nntplib.py
    @@ -584,6 +584,11 @@
                     
                     
                     .""")
    +        elif (group == 'comp.lang.python' and
    +              date_str in ('20100101', '100101') and
    +              time_str == '090000'):
    +            self.push_lit('too long line' * 3000 +
    +                          '\n.')
             else:
                 self.push_lit("""\
                     230 An empty list of newsarticles follows
    @@ -1179,6 +1184,11 @@
             self.assertEqual(cm.exception.response,
                              "435 Article not wanted")
     
    +    def test_too_long_lines(self):
    +        dt = datetime.datetime(2010, 1, 1, 9, 0, 0)
    +        self.assertRaises(nntplib.NNTPDataError,
    +                          self.server.newnews, "comp.lang.python", dt)
    +
     
     class NNTPv1Tests(NNTPv1v2TestsMixin, MockedNNTPTestsMixin, unittest.TestCase):
         """Tests an NNTP v1 server (no capabilities)."""
    diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
    --- a/Lib/test/test_poplib.py
    +++ b/Lib/test/test_poplib.py
    @@ -94,7 +94,7 @@
     
         def cmd_list(self, arg):
             if arg:
    -            self.push('+OK %s %s' %(arg, arg))
    +            self.push('+OK %s %s' % (arg, arg))
             else:
                 self.push('+OK')
                 asynchat.async_chat.push(self, LIST_RESP)
    @@ -278,6 +278,10 @@
             foo = self.client.retr('foo')
             self.assertEqual(foo, expected)
     
    +    def test_too_long_lines(self):
    +        self.assertRaises(poplib.error_proto, self.client._shortcmd,
    +                          'echo +%s' % ((poplib._MAXLINE + 10) * 'a'))
    +
         def test_dele(self):
             self.assertOK(self.client.dele('foo'))
     
    @@ -400,7 +404,13 @@
     
             def tearDown(self):
                 if self.client.file is not None and self.client.sock is not None:
    -                self.client.quit()
    +                try:
    +                    self.client.quit()
    +                except poplib.error_proto:
    +                    # happens in the test_too_long_lines case; the overlong
    +                    # response will be treated as response to QUIT and raise
    +                    # this exception
    +                    pass
                 self.server.stop()
     
             def test_stls(self):
    diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
    --- a/Lib/test/test_ssl.py
    +++ b/Lib/test/test_ssl.py
    @@ -358,11 +358,7 @@
             fail(cert, 'Xa.com')
             fail(cert, '.a.com')
     
    -        cert = {'subject': ((('commonName', 'a.*.com'),),)}
    -        ok(cert, 'a.foo.com')
    -        fail(cert, 'a..com')
    -        fail(cert, 'a.com')
    -
    +        # only match one left-most wildcard
             cert = {'subject': ((('commonName', 'f*.com'),),)}
             ok(cert, 'foo.com')
             ok(cert, 'f.com')
    @@ -377,6 +373,36 @@
             fail(cert, 'example.org')
             fail(cert, 'null.python.org')
     
    +        # error cases with wildcards
    +        cert = {'subject': ((('commonName', '*.*.a.com'),),)}
    +        fail(cert, 'bar.foo.a.com')
    +        fail(cert, 'a.com')
    +        fail(cert, 'Xa.com')
    +        fail(cert, '.a.com')
    +
    +        cert = {'subject': ((('commonName', 'a.*.com'),),)}
    +        fail(cert, 'a.foo.com')
    +        fail(cert, 'a..com')
    +        fail(cert, 'a.com')
    +
    +        # wildcard doesn't match IDNA prefix 'xn--'
    +        idna = 'p?thon.python.org'.encode("idna").decode("ascii")
    +        cert = {'subject': ((('commonName', idna),),)}
    +        ok(cert, idna)
    +        cert = {'subject': ((('commonName', 'x*.python.org'),),)}
    +        fail(cert, idna)
    +        cert = {'subject': ((('commonName', 'xn--p*.python.org'),),)}
    +        fail(cert, idna)
    +
    +        # wildcard in first fragment and  IDNA A-labels in sequent fragments
    +        # are supported.
    +        idna = 'www*.pyth?n.org'.encode("idna").decode("ascii")
    +        cert = {'subject': ((('commonName', idna),),)}
    +        ok(cert, 'www.pyth?n.org'.encode("idna").decode("ascii"))
    +        ok(cert, 'www1.pyth?n.org'.encode("idna").decode("ascii"))
    +        fail(cert, 'ftp.pyth?n.org'.encode("idna").decode("ascii"))
    +        fail(cert, 'pyth?n.org'.encode("idna").decode("ascii"))
    +
             # Slightly fake real-world example
             cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
                     'subject': ((('commonName', 'linuxfrz.org'),),),
    @@ -437,7 +463,7 @@
             cert = {'subject': ((('commonName', 'a*b.com'),),)}
             ok(cert, 'axxb.com')
             cert = {'subject': ((('commonName', 'a*b.co*'),),)}
    -        ok(cert, 'axxb.com')
    +        fail(cert, 'axxb.com')
             cert = {'subject': ((('commonName', 'a*b*.com'),),)}
             with self.assertRaises(ssl.CertificateError) as cm:
                 ssl.match_hostname(cert, 'axxbxxc.com')
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -23,6 +23,24 @@
     
     - Issue #19329: Optimized compiling charsets in regular expressions.
     
    +- Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more than
    +  100 headers are read.  Adapted from patch by Jyrki Pulliainen.
    +
    +- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
    +  prevent readline() calls from consuming too much memory.  Patch by Jyrki
    +  Pulliainen.
    +
    +- Issue #16041: CVE-2013-1752: poplib: Limit maximum line lengths to 2048 to
    +  prevent readline() calls from consuming too much memory.  Patch by Jyrki
    +  Pulliainen.
    +
    +- Issue #17997: Change behavior of ``ssl.match_hostname()`` to follow RFC 6125,
    +  for security reasons.  It now doesn't match multiple wildcards nor wildcards
    +  inside IDN fragments.
    +
    +- Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to limit
    +  line length.  Patch by Emil Lind.
    +
     - Issue #19330: the unnecessary wrapper functions have been removed from the
       implementations of the new contextlib.redirect_stdout and
       contextlib.suppress context managers, which also ensures they provide
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:56:47 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:56:47 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MjI3?=
     =?utf-8?q?=3A_Try_to_fix_deadlocks_caused_by_re-seeding_then_OpenSSL?=
    Message-ID: <3d6qbz65SYz7Ln4@mail.python.org>
    
    http://hg.python.org/cpython/rev/021ca321b26e
    changeset:   86682:021ca321b26e
    branch:      3.3
    parent:      86680:49be8a5c9de2
    user:        Georg Brandl 
    date:        Sun Oct 27 07:56:11 2013 +0100
    summary:
      Issue #19227: Try to fix deadlocks caused by re-seeding then OpenSSL
    pseudo-random number generator on fork().
    
    files:
      Misc/NEWS      |   3 +++
      Modules/_ssl.c |  15 ++++++++-------
      2 files changed, 11 insertions(+), 7 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -81,6 +81,9 @@
     Library
     -------
     
    +- Issue #19227: Try to fix deadlocks caused by re-seeding then OpenSSL
    +  pseudo-random number generator on fork().
    +
     - Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more than
       100 headers are read.  Adapted from patch by Jyrki Pulliainen.
     
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -2586,7 +2586,7 @@
     
     /* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
      *
    - * The parent handler seeds the PRNG from pseudo-random data like pid, the
    + * The prepare handler seeds the PRNG from pseudo-random data like pid, the
      * current time (miliseconds or seconds) and an uninitialized array.
      * The array contains stack variables that are impossible to predict
      * on most systems, e.g. function return address (subject to ASLR), the
    @@ -2595,16 +2595,17 @@
      *
      * Note:
      * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A parent handler is used
    + * handlers are not removed from the child process. A prepare handler is used
      * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions.
    + * safe but the handler calls unsafe functions. A parent handler has caused
    + * other problems, see issue #19227.
      */
     
     #if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
     #define PYSSL_RAND_ATFORK 1
     
     static void
    -PySSL_RAND_atfork_parent(void)
    +PySSL_RAND_atfork_prepare(void)
     {
         struct {
             char stack[128];    /* uninitialized (!) stack data, 128 is an
    @@ -2630,9 +2631,9 @@
         if (registered)
             return 0;
     
    -    retval = pthread_atfork(NULL,                     /* prepare */
    -                            PySSL_RAND_atfork_parent, /* parent */
    -                            NULL);                    /* child */
    +    retval = pthread_atfork(PySSL_RAND_atfork_prepare, /* prepare */
    +                            NULL,                      /* parent */
    +                            NULL);                     /* child */
         if (retval != 0) {
             PyErr_SetFromErrno(PyExc_OSError);
             return -1;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 07:56:49 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 07:56:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_=2319227=3A_merge_with_3=2E3?=
    Message-ID: <3d6qc10z56z7LnF@mail.python.org>
    
    http://hg.python.org/cpython/rev/d3a13a7be9e9
    changeset:   86683:d3a13a7be9e9
    parent:      86681:ab0c133288f8
    parent:      86682:021ca321b26e
    user:        Georg Brandl 
    date:        Sun Oct 27 07:57:42 2013 +0100
    summary:
      #19227: merge with 3.3
    
    files:
      Misc/NEWS      |   3 +++
      Modules/_ssl.c |  15 ++++++++-------
      2 files changed, 11 insertions(+), 7 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -23,6 +23,9 @@
     
     - Issue #19329: Optimized compiling charsets in regular expressions.
     
    +- Issue #19227: Try to fix deadlocks caused by re-seeding then OpenSSL
    +  pseudo-random number generator on fork().
    +
     - Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more than
       100 headers are read.  Adapted from patch by Jyrki Pulliainen.
     
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -2952,7 +2952,7 @@
     
     /* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
      *
    - * The parent handler seeds the PRNG from pseudo-random data like pid, the
    + * The prepare handler seeds the PRNG from pseudo-random data like pid, the
      * current time (miliseconds or seconds) and an uninitialized array.
      * The array contains stack variables that are impossible to predict
      * on most systems, e.g. function return address (subject to ASLR), the
    @@ -2961,16 +2961,17 @@
      *
      * Note:
      * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A parent handler is used
    + * handlers are not removed from the child process. A prepare handler is used
      * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions.
    + * safe but the handler calls unsafe functions. A parent handler has caused
    + * other problems, see issue #19227.
      */
     
     #if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
     #define PYSSL_RAND_ATFORK 1
     
     static void
    -PySSL_RAND_atfork_parent(void)
    +PySSL_RAND_atfork_prepare(void)
     {
         struct {
             char stack[128];    /* uninitialized (!) stack data, 128 is an
    @@ -2996,9 +2997,9 @@
         if (registered)
             return 0;
     
    -    retval = pthread_atfork(NULL,                     /* prepare */
    -                            PySSL_RAND_atfork_parent, /* parent */
    -                            NULL);                    /* child */
    +    retval = pthread_atfork(PySSL_RAND_atfork_prepare, /* prepare */
    +                            NULL,                      /* parent */
    +                            NULL);                     /* child */
         if (retval != 0) {
             PyErr_SetFromErrno(PyExc_OSError);
             return -1;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 09:22:17 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 09:22:17 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Update_pydoc_t?=
    	=?utf-8?q?opics=2E?=
    Message-ID: <3d6sVd4NNzz7Ln4@mail.python.org>
    
    http://hg.python.org/cpython/rev/71568a354798
    changeset:   86684:71568a354798
    branch:      3.3
    parent:      86682:021ca321b26e
    user:        Georg Brandl 
    date:        Sun Oct 27 09:08:16 2013 +0100
    summary:
      Update pydoc topics.
    
    files:
      Lib/pydoc_data/topics.py |  30 ++++++++++++++--------------
      1 files changed, 15 insertions(+), 15 deletions(-)
    
    
    diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py
    --- a/Lib/pydoc_data/topics.py
    +++ b/Lib/pydoc_data/topics.py
    @@ -1,13 +1,13 @@
     # -*- coding: utf-8 -*-
    -# Autogenerated by Sphinx on Sat Mar 23 15:42:31 2013
    +# Autogenerated by Sphinx on Sun Oct 27 09:07:55 2013
     topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n   assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n   if __debug__:\n      if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n   if __debug__:\n      if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names.  In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O).  The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime.  Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal.  The value for the built-in\nvariable is determined when the interpreter starts.\n',
      'assignment': '\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n   assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n   target_list     ::= target ("," target)* [","]\n   target          ::= identifier\n              | "(" target_list ")"\n              | "[" target_list "]"\n              | attributeref\n              | subscription\n              | slicing\n              | "*" target\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable.  The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is a single target: The object is assigned to\n  that target.\n\n* If the target list is a comma-separated list of targets: The object\n  must be an iterable with the same number of items as there are\n  targets in the target list, and the items are assigned, from left to\n  right, to the corresponding targets.\n\n  * If the target list contains one target prefixed with an asterisk,\n    called a "starred" target: The object must be a sequence with at\n    least as many items as there are targets in the target list, minus\n    one.  The first items of the sequence are assigned, from left to\n    right, to the targets before the starred target.  The final items\n    of the sequence are assigned to the targets after the starred\n    target.  A list of the remaining items in the sequence is then\n    assigned to the starred target (the list can be empty).\n\n  * Else: The object must be a sequence with the same number of items\n    as there are targets in the target list, and the items are\n    assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n  * If the name does not occur in a ``global`` or ``nonlocal``\n    statement in the current code block: the name is bound to the\n    object in the current local namespace.\n\n  * Otherwise: the name is bound to the object in the global namespace\n    or the outer namespace determined by ``nonlocal``, respectively.\n\n  The name is rebound if it was already bound.  This may cause the\n  reference count for the object previously bound to the name to reach\n  zero, causing the object to be deallocated and its destructor (if it\n  has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n  brackets: The object must be an iterable with the same number of\n  items as there are targets in the target list, and its items are\n  assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n  the reference is evaluated.  It should yield an object with\n  assignable attributes; if this is not the case, ``TypeError`` is\n  raised.  That object is then asked to assign the assigned object to\n  the given attribute; if it cannot perform the assignment, it raises\n  an exception (usually but not necessarily ``AttributeError``).\n\n  Note: If the object is a class instance and the attribute reference\n  occurs on both sides of the assignment operator, the RHS expression,\n  ``a.x`` can access either an instance attribute or (if no instance\n  attribute exists) a class attribute.  The LHS target ``a.x`` is\n  always set as an instance attribute, creating it if necessary.\n  Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n  same attribute: if the RHS expression refers to a class attribute,\n  the LHS creates a new instance attribute as the target of the\n  assignment:\n\n     class Cls:\n         x = 3             # class variable\n     inst = Cls()\n     inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3\n\n  This description does not necessarily apply to descriptor\n  attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n  reference is evaluated.  It should yield either a mutable sequence\n  object (such as a list) or a mapping object (such as a dictionary).\n  Next, the subscript expression is evaluated.\n\n  If the primary is a mutable sequence object (such as a list), the\n  subscript must yield an integer.  If it is negative, the sequence\'s\n  length is added to it.  The resulting value must be a nonnegative\n  integer less than the sequence\'s length, and the sequence is asked\n  to assign the assigned object to its item with that index.  If the\n  index is out of range, ``IndexError`` is raised (assignment to a\n  subscripted sequence cannot add new items to a list).\n\n  If the primary is a mapping object (such as a dictionary), the\n  subscript must have a type compatible with the mapping\'s key type,\n  and the mapping is then asked to create a key/datum pair which maps\n  the subscript to the assigned object.  This can either replace an\n  existing key/value pair with the same key value, or insert a new\n  key/value pair (if no key with the same value existed).\n\n  For user-defined objects, the ``__setitem__()`` method is called\n  with appropriate arguments.\n\n* If the target is a slicing: The primary expression in the reference\n  is evaluated.  It should yield a mutable sequence object (such as a\n  list).  The assigned object should be a sequence object of the same\n  type.  Next, the lower and upper bound expressions are evaluated,\n  insofar they are present; defaults are zero and the sequence\'s\n  length.  The bounds should evaluate to integers. If either bound is\n  negative, the sequence\'s length is added to it.  The resulting\n  bounds are clipped to lie between zero and the sequence\'s length,\n  inclusive.  Finally, the sequence object is asked to replace the\n  slice with the items of the assigned sequence.  The length of the\n  slice may be different from the length of the assigned sequence,\n  thus changing the length of the target sequence, if the object\n  allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe!  For instance, the\nfollowing program prints ``[0, 2]``:\n\n   x = [0, 1]\n   i = 0\n   i, x[i] = 1, 2\n   print(x)\n\nSee also:\n\n   **PEP 3132** - Extended Iterable Unpacking\n      The specification for the ``*target`` feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n   augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n   augtarget                 ::= identifier | attributeref | subscription | slicing\n   augop                     ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n             | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
    - 'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name.  See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them.  The transformation inserts the\nclass name in front of the name, with leading underscores removed, and\na single underscore inserted in front of the class name.  For example,\nthe identifier ``__spam`` occurring in a class named ``Ham`` will be\ntransformed to ``_Ham__spam``.  This transformation is independent of\nthe syntactical context in which the identifier is used.  If the\ntransformed name is extremely long (longer than 255 characters),\nimplementation defined truncation may happen.  If the class name\nconsists only of underscores, no transformation is done.\n',
    + 'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name.  See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them.  The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name.  For example, the identifier\n``__spam`` occurring in a class named ``Ham`` will be transformed to\n``_Ham__spam``.  This transformation is independent of the syntactical\ncontext in which the identifier is used.  If the transformed name is\nextremely long (longer than 255 characters), implementation defined\ntruncation may happen. If the class name consists only of underscores,\nno transformation is done.\n',
      'atom-literals': "\nLiterals\n********\n\nPython supports string and bytes literals and various numeric\nliterals:\n\n   literal ::= stringliteral | bytesliteral\n               | integer | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\nbytes, integer, floating point number, complex number) with the given\nvalue.  The value may be approximated in the case of floating point\nand imaginary (complex) literals.  See section *Literals* for details.\n\nAll literals correspond to immutable data types, and hence the\nobject's identity is less important than its value.  Multiple\nevaluations of literals with the same value (either the same\noccurrence in the program text or a different occurrence) may obtain\nthe same object or a different object with the same value.\n",
      'attribute-access': '\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n   Called when an attribute lookup has not found the attribute in the\n   usual places (i.e. it is not an instance attribute nor is it found\n   in the class tree for ``self``).  ``name`` is the attribute name.\n   This method should return the (computed) attribute value or raise\n   an ``AttributeError`` exception.\n\n   Note that if the attribute is found through the normal mechanism,\n   ``__getattr__()`` is not called.  (This is an intentional asymmetry\n   between ``__getattr__()`` and ``__setattr__()``.) This is done both\n   for efficiency reasons and because otherwise ``__getattr__()``\n   would have no way to access other attributes of the instance.  Note\n   that at least for instance variables, you can fake total control by\n   not inserting any values in the instance attribute dictionary (but\n   instead inserting them in another object).  See the\n   ``__getattribute__()`` method below for a way to actually get total\n   control over attribute access.\n\nobject.__getattribute__(self, name)\n\n   Called unconditionally to implement attribute accesses for\n   instances of the class. If the class also defines\n   ``__getattr__()``, the latter will not be called unless\n   ``__getattribute__()`` either calls it explicitly or raises an\n   ``AttributeError``. This method should return the (computed)\n   attribute value or raise an ``AttributeError`` exception. In order\n   to avoid infinite recursion in this method, its implementation\n   should always call the base class method with the same name to\n   access any attributes it needs, for example,\n   ``object.__getattribute__(self, name)``.\n\n   Note: This method may still be bypassed when looking up special methods\n     as the result of implicit invocation via language syntax or\n     built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n   Called when an attribute assignment is attempted.  This is called\n   instead of the normal mechanism (i.e. store the value in the\n   instance dictionary). *name* is the attribute name, *value* is the\n   value to be assigned to it.\n\n   If ``__setattr__()`` wants to assign to an instance attribute, it\n   should call the base class method with the same name, for example,\n   ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n   Like ``__setattr__()`` but for attribute deletion instead of\n   assignment.  This should only be implemented if ``del obj.name`` is\n   meaningful for the object.\n\nobject.__dir__(self)\n\n   Called when ``dir()`` is called on the object. A sequence must be\n   returned. ``dir()`` converts the returned sequence to a list and\n   sorts it.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents).  In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n   Called to get the attribute of the owner class (class attribute\n   access) or of an instance of that class (instance attribute\n   access). *owner* is always the owner class, while *instance* is the\n   instance that the attribute was accessed through, or ``None`` when\n   the attribute is accessed through the *owner*.  This method should\n   return the (computed) attribute value or raise an\n   ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n   Called to set the attribute on an instance *instance* of the owner\n   class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n   Called to delete the attribute on an instance *instance* of the\n   owner class.\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol:  ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead.  Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n   The simplest and least common call is when user code directly\n   invokes a descriptor method:    ``x.__get__(a)``.\n\nInstance Binding\n   If binding to an object instance, ``a.x`` is transformed into the\n   call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n   If binding to a class, ``A.x`` is transformed into the call:\n   ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n   If ``a`` is an instance of ``super``, then the binding ``super(B,\n   obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n   ``A`` immediately preceding ``B`` and then invokes the descriptor\n   with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined.  A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary.  If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor.  Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method.  Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary.  In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors.  Accordingly, instances can\nredefine and override methods.  This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage.  This wastes space for objects having very few instance\nvariables.  The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable.  Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n   This class variable can be assigned a string, iterable, or sequence\n   of strings with variable names used by instances.  If defined in a\n   class, *__slots__* reserves space for the declared variables and\n   prevents the automatic creation of *__dict__* and *__weakref__* for\n   each instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n  attribute of that class will always be accessible, so a *__slots__*\n  definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n  variables not listed in the *__slots__* definition.  Attempts to\n  assign to an unlisted variable name raises ``AttributeError``. If\n  dynamic assignment of new variables is desired, then add\n  ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n  declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n  *__slots__* do not support weak references to its instances. If weak\n  reference support is needed, then add ``\'__weakref__\'`` to the\n  sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n  descriptors (*Implementing Descriptors*) for each variable name.  As\n  a result, class attributes cannot be used to set default values for\n  instance variables defined by *__slots__*; otherwise, the class\n  attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n  where it is defined.  As a result, subclasses will have a *__dict__*\n  unless they also define *__slots__* (which must only contain names\n  of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n  variable defined by the base class slot is inaccessible (except by\n  retrieving its descriptor directly from the base class). This\n  renders the meaning of the program undefined.  In the future, a\n  check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n  "variable-length" built-in types such as ``int``, ``str`` and\n  ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n  also be used; however, in the future, special meaning may be\n  assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n  *__slots__*.\n',
      'attribute-references': '\nAttribute references\n********************\n\nAn attribute reference is a primary followed by a period and a name:\n\n   attributeref ::= primary "." identifier\n\nThe primary must evaluate to an object of a type that supports\nattribute references, which most objects do.  This object is then\nasked to produce the attribute whose name is the identifier (which can\nbe customized by overriding the ``__getattr__()`` method).  If this\nattribute is not available, the exception ``AttributeError`` is\nraised.  Otherwise, the type and value of the object produced is\ndetermined by the object.  Multiple evaluations of the same attribute\nreference may yield different objects.\n',
      'augassign': '\nAugmented assignment statements\n*******************************\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n   augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n   augtarget                 ::= identifier | attributeref | subscription | slicing\n   augop                     ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n             | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
    - 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels.  Note that some of these operations also apply to certain non-\nnumeric types.  Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n   m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n              | m_expr "%" u_expr\n   a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments.  The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether.  In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments.  The numeric arguments are first\nconverted to a common type. Integer division yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult.  Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second.  The numeric arguments are first\nconverted to a common type.  A zero right argument raises the\n``ZeroDivisionError`` exception.  The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.)  The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``.  Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation).  The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers.  Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments.  The\narguments must either both be numbers or both sequences of the same\ntype.  In the former case, the numbers are converted to a common type\nand then added together.  In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments.  The numeric arguments are first converted to a common\ntype.\n',
    + 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels.  Note that some of these operations also apply to certain non-\nnumeric types.  Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n   m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n              | m_expr "%" u_expr\n   a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments.  The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether.  In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments.  The numeric arguments are first\nconverted to a common type. Division of integers yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult.  Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second.  The numeric arguments are first\nconverted to a common type.  A zero right argument raises the\n``ZeroDivisionError`` exception.  The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.)  The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``.  Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation).  The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers.  Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments.  The\narguments must either both be numbers or both sequences of the same\ntype.  In the former case, the numbers are converted to a common type\nand then added together.  In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments.  The numeric arguments are first converted to a common\ntype.\n',
      'bitwise': '\nBinary bitwise operations\n*************************\n\nEach of the three bitwise operations has a different priority level:\n\n   and_expr ::= shift_expr | and_expr "&" shift_expr\n   xor_expr ::= and_expr | xor_expr "^" and_expr\n   or_expr  ::= xor_expr | or_expr "|" xor_expr\n\nThe ``&`` operator yields the bitwise AND of its arguments, which must\nbe integers.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be integers.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be integers.\n',
      'bltin-code-objects': '\nCode Objects\n************\n\nCode objects are used by the implementation to represent "pseudo-\ncompiled" executable Python code such as a function body. They differ\nfrom function objects because they don\'t contain a reference to their\nglobal execution environment.  Code objects are returned by the built-\nin ``compile()`` function and can be extracted from function objects\nthrough their ``__code__`` attribute. See also the ``code`` module.\n\nA code object can be executed or evaluated by passing it (instead of a\nsource string) to the ``exec()`` or ``eval()``  built-in functions.\n\nSee *The standard type hierarchy* for more information.\n',
      'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is commonly used by slicing (see *Slicings*).  It supports\nno special operations.  There is exactly one ellipsis object, named\n``Ellipsis`` (a built-in name).  ``type(Ellipsis)()`` produces the\n``Ellipsis`` singleton.\n\nIt is written as ``Ellipsis`` or ``...``.\n',
    @@ -19,11 +19,11 @@
      'calls': '\nCalls\n*****\n\nA call calls a callable object (e.g., a *function*) with a possibly\nempty series of *arguments*:\n\n   call                 ::= primary "(" [argument_list [","] | comprehension] ")"\n   argument_list        ::= positional_arguments ["," keyword_arguments]\n                       ["," "*" expression] ["," keyword_arguments]\n                       ["," "**" expression]\n                     | keyword_arguments ["," "*" expression]\n                       ["," keyword_arguments] ["," "**" expression]\n                     | "*" expression ["," keyword_arguments] ["," "**" expression]\n                     | "**" expression\n   positional_arguments ::= expression ("," expression)*\n   keyword_arguments    ::= keyword_item ("," keyword_item)*\n   keyword_item         ::= identifier "=" expression\n\nA trailing comma may be present after the positional and keyword\narguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and all objects having a\n``__call__()`` method are callable).  All argument expressions are\nevaluated before the call is attempted.  Please refer to section\n*Function definitions* for the syntax of formal *parameter* lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows.  First, a list of unfilled slots is\ncreated for the formal parameters.  If there are N positional\narguments, they are placed in the first N slots.  Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on).  If the slot is\nalready filled, a ``TypeError`` exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is ``None``, it fills the slot).  When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition.  (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.)  If there are any\nunfilled slots for which no default value is specified, a\n``TypeError`` exception is raised.  Otherwise, the list of filled\nslots is used as the argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword.  In CPython, this is the case\nfor functions implemented in C that use ``PyArg_ParseTuple()`` to\nparse their arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``*identifier`` is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``**identifier`` is present; in this case, that\nformal parameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax ``*expression`` appears in the function call,\n``expression`` must evaluate to an iterable.  Elements from this\niterable are treated as if they were additional positional arguments;\nif there are positional arguments *x1*, ..., *xN*, and ``expression``\nevaluates to a sequence *y1*, ..., *yM*, this is equivalent to a call\nwith M+N positional arguments *x1*, ..., *xN*, *y1*, ..., *yM*.\n\nA consequence of this is that although the ``*expression`` syntax may\nappear *after* some keyword arguments, it is processed *before* the\nkeyword arguments (and the ``**expression`` argument, if any -- see\nbelow).  So:\n\n   >>> def f(a, b):\n   ...  print(a, b)\n   ...\n   >>> f(b=1, *(2,))\n   2 1\n   >>> f(a=1, *(2,))\n   Traceback (most recent call last):\n     File "", line 1, in ?\n   TypeError: f() got multiple values for keyword argument \'a\'\n   >>> f(1, *(2,))\n   1 2\n\nIt is unusual for both keyword arguments and the ``*expression``\nsyntax to be used in the same call, so in practice this confusion does\nnot arise.\n\nIf the syntax ``**expression`` appears in the function call,\n``expression`` must evaluate to a mapping, the contents of which are\ntreated as additional keyword arguments.  In the case of a keyword\nappearing in both ``expression`` and as an explicit keyword argument,\na ``TypeError`` exception is raised.\n\nFormal parameters using the syntax ``*identifier`` or ``**identifier``\ncannot be used as positional argument slots or as keyword argument\nnames.\n\nA call always returns some value, possibly ``None``, unless it raises\nan exception.  How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n   The code block for the function is executed, passing it the\n   argument list.  The first thing the code block will do is bind the\n   formal parameters to the arguments; this is described in section\n   *Function definitions*.  When the code block executes a ``return``\n   statement, this specifies the return value of the function call.\n\na built-in function or method:\n   The result is up to the interpreter; see *Built-in Functions* for\n   the descriptions of built-in functions and methods.\n\na class object:\n   A new instance of that class is returned.\n\na class instance method:\n   The corresponding user-defined function is called, with an argument\n   list that is one longer than the argument list of the call: the\n   instance becomes the first argument.\n\na class instance:\n   The class must define a ``__call__()`` method; the effect is then\n   the same as if that method was called.\n',
      'class': '\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= [decorators] "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [parameter_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing.  Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n   class Foo:\n       pass\n\nis equivalent to\n\n   class Foo(object):\n       pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.)  When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n   @f1(arg)\n   @f2\n   class Foo: pass\n\nis equivalent to\n\n   class Foo: pass\n   Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators.  The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances.  Instance attributes\ncan be set in a method with ``self.name = value``.  Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way.  Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results.  *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n   **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n   Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
      'comparisons': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation.  Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n   comparison    ::= or_expr ( comp_operator or_expr )*\n   comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n                     | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects.  The objects need not have the same type.\nIf both are numbers, they are converted to a common type.  Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes.  You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n  are identical to themselves, ``x is x`` but are not equal to\n  themselves, ``x != x``.  Additionally, comparing any value to a\n  not-a-number value will return ``False``.  For example, both ``3 <\n  float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n  values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n  (the result of the built-in function ``ord()``) of their characters.\n  [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n  corresponding elements.  This means that to compare equal, each\n  element must compare equal and the two sequences must be of the same\n  type and have the same length.\n\n  If not equal, the sequences are ordered the same as their first\n  differing elements.  For example, ``[1,2,x] <= [1,2,y]`` has the\n  same value as ``x <= y``.  If the corresponding element does not\n  exist, the shorter sequence is ordered first (for example, ``[1,2] <\n  [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n  same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n  \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n  superset tests.  Those relations do not define total orderings (the\n  two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n  another, nor supersets of one another).  Accordingly, sets are not\n  appropriate arguments for functions which depend on total ordering.\n  For example, ``min()``, ``max()``, and ``sorted()`` produce\n  undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n  the same object; the choice whether one object is considered smaller\n  or larger than another one is made arbitrarily but consistently\n  within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison.  Most\nnumeric types can be compared with one another.  When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership.  ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise.  ``x\nnot in s`` returns the negation of ``x in s``.  All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*.  An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``.  If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception.  (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object.  ``x is\nnot y`` yields the inverse truth value. [4]\n',
    - 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way.  In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs.  ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code.  Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\'  A clause\nconsists of a header and a \'suite.\'  The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon.  A suite is a group of statements controlled by a\nclause.  A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines.  Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n   if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n   if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n   compound_stmt ::= if_stmt\n                     | while_stmt\n                     | for_stmt\n                     | try_stmt\n                     | with_stmt\n                     | funcdef\n                     | classdef\n   suite         ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n   statement     ::= stmt_list NEWLINE | compound_stmt\n   stmt_list     ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``.  Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n   if_stmt ::= "if" expression ":" suite\n               ( "elif" expression ":" suite )*\n               ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted.  When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop.  Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists).  An\n  internal counter is used to keep track of which item is used next,\n  and this is incremented on each iteration.  When this counter has\n  reached the length of the sequence the loop terminates.  This means\n  that if the suite deletes the current (or a previous) item from the\n  sequence, the next item will be skipped (since it gets the index of\n  the current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression ["as" target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed.  All except\nclauses must have an executable block.  When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause.  This is as if\n\n   except E as N:\n       foo\n\nwas translated to\n\n   except E as N:\n       try:\n           foo\n       finally:\n           del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause.  Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred.  ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause.  If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n   with_stmt ::= "with" with_item ("," with_item)* ":" suite\n   with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n   is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n   value from ``__enter__()`` is assigned to it.\n\n   Note: The ``with`` statement guarantees that if the ``__enter__()``\n     method returns without an error, then ``__exit__()`` will always\n     be called. Thus, if an error occurs during the assignment to the\n     target list, it will be treated the same as an error occurring\n     within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked.  If an\n   exception caused the suite to be exited, its type, value, and\n   traceback are passed as arguments to ``__exit__()``. Otherwise,\n   three ``None`` arguments are supplied.\n\n   If the suite was exited due to an exception, and the return value\n   from the ``__exit__()`` method was false, the exception is\n   reraised.  If the return value was true, the exception is\n   suppressed, and execution continues with the statement following\n   the ``with`` statement.\n\n   If the suite was exited for any reason other than an exception, the\n   return value from ``__exit__()`` is ignored, and execution proceeds\n   at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n   with A() as a, B() as b:\n       suite\n\nis equivalent to\n\n   with A() as a:\n       with B() as b:\n           suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   funcdef        ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n                      | "**" parameter\n                      | defparameter [","] )\n   parameter      ::= identifier [":" expression]\n   defparameter   ::= parameter ["=" expression]\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted.  If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name.  Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``.  Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list.  These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code.  The presence of annotations does not change the\nsemantics of a function.  The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda forms,\ndescribed in section *Lambdas*.  Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form.  The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\nSee also:\n\n   **PEP 3107** - Function Annotations\n      The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= [decorators] "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [parameter_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing.  Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n   class Foo:\n       pass\n\nis equivalent to\n\n   class Foo(object):\n       pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.)  When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n   @f1(arg)\n   @f2\n   class Foo: pass\n\nis equivalent to\n\n   class Foo: pass\n   Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators.  The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances.  Instance attributes\ncan be set in a method with ``self.name = value``.  Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way.  Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results.  *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n   **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n   Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
    + 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way.  In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs.  ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code.  Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\'  A clause\nconsists of a header and a \'suite.\'  The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon.  A suite is a group of statements controlled by a\nclause.  A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines.  Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n   if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n   if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n   compound_stmt ::= if_stmt\n                     | while_stmt\n                     | for_stmt\n                     | try_stmt\n                     | with_stmt\n                     | funcdef\n                     | classdef\n   suite         ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n   statement     ::= stmt_list NEWLINE | compound_stmt\n   stmt_list     ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``.  Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n   if_stmt ::= "if" expression ":" suite\n               ( "elif" expression ":" suite )*\n               ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted.  When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop.  Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists).  An\n  internal counter is used to keep track of which item is used next,\n  and this is incremented on each iteration.  When this counter has\n  reached the length of the sequence the loop terminates.  This means\n  that if the suite deletes the current (or a previous) item from the\n  sequence, the next item will be skipped (since it gets the index of\n  the current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression ["as" target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed.  All except\nclauses must have an executable block.  When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause.  This is as if\n\n   except E as N:\n       foo\n\nwas translated to\n\n   except E as N:\n       try:\n           foo\n       finally:\n           del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause.  Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred.  ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause.  If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n   with_stmt ::= "with" with_item ("," with_item)* ":" suite\n   with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n   is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n   value from ``__enter__()`` is assigned to it.\n\n   Note: The ``with`` statement guarantees that if the ``__enter__()``\n     method returns without an error, then ``__exit__()`` will always\n     be called. Thus, if an error occurs during the assignment to the\n     target list, it will be treated the same as an error occurring\n     within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked.  If an\n   exception caused the suite to be exited, its type, value, and\n   traceback are passed as arguments to ``__exit__()``. Otherwise,\n   three ``None`` arguments are supplied.\n\n   If the suite was exited due to an exception, and the return value\n   from the ``__exit__()`` method was false, the exception is\n   reraised.  If the return value was true, the exception is\n   suppressed, and execution continues with the statement following\n   the ``with`` statement.\n\n   If the suite was exited for any reason other than an exception, the\n   return value from ``__exit__()`` is ignored, and execution proceeds\n   at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n   with A() as a, B() as b:\n       suite\n\nis equivalent to\n\n   with A() as a:\n       with B() as b:\n           suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   funcdef        ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n                      | "**" parameter\n                      | defparameter [","] )\n   parameter      ::= identifier [":" expression]\n   defparameter   ::= parameter ["=" expression]\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted.  If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name.  Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``.  Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list.  These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code.  The presence of annotations does not change the\nsemantics of a function.  The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda\nexpressions, described in section *Lambdas*.  Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression.  The "``def``" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around.  Free variables used\nin the nested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\nSee also:\n\n   **PEP 3107** - Function Annotations\n      The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n   classdef    ::= [decorators] "class" classname [inheritance] ":" suite\n   inheritance ::= "(" [parameter_list] ")"\n   classname   ::= identifier\n\nA class definition is an executable statement.  The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing.  Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n   class Foo:\n       pass\n\nis equivalent to\n\n   class Foo(object):\n       pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.)  When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n   @f1(arg)\n   @f2\n   class Foo: pass\n\nis equivalent to\n\n   class Foo: pass\n   Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators.  The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances.  Instance attributes\ncan be set in a method with ``self.name = value``.  Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way.  Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results.  *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n   **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n   Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n    is a ``finally`` clause which happens to raise another exception.\n    That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n    exception or the execution of a ``return``, ``continue``, or\n    ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n    body is transformed into the function\'s ``__doc__`` attribute and\n    therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n    body is transformed into the namespace\'s ``__doc__`` item and\n    therefore the class\'s *docstring*.\n',
      'context-managers': '\nWith Statement Context Managers\n*******************************\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code.  Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n   Enter the runtime context related to this object. The ``with``\n   statement will bind this method\'s return value to the target(s)\n   specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n   Exit the runtime context related to this object. The parameters\n   describe the exception that caused the context to be exited. If the\n   context was exited without an exception, all three arguments will\n   be ``None``.\n\n   If an exception is supplied, and the method wishes to suppress the\n   exception (i.e., prevent it from being propagated), it should\n   return a true value. Otherwise, the exception will be processed\n   normally upon exit from this method.\n\n   Note that ``__exit__()`` methods should not reraise the passed-in\n   exception; this is the caller\'s responsibility.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n',
      'continue': '\nThe ``continue`` statement\n**************************\n\n   continue_stmt ::= "continue"\n\n``continue`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition or\n``finally`` clause within that loop.  It continues with the next cycle\nof the nearest enclosing loop.\n\nWhen ``continue`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nstarting the next loop cycle.\n',
      'conversions': '\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," this means\nthat the operator implementation for built-in types works that way:\n\n* If either argument is a complex number, the other is converted to\n  complex;\n\n* otherwise, if either argument is a floating point number, the other\n  is converted to floating point;\n\n* otherwise, both must be integers and no conversion is necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator).  Extensions must define their own\nconversion behavior.\n',
    - 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n   Called to create a new instance of class *cls*.  ``__new__()`` is a\n   static method (special-cased so you need not declare it as such)\n   that takes the class of which an instance was requested as its\n   first argument.  The remaining arguments are those passed to the\n   object constructor expression (the call to the class).  The return\n   value of ``__new__()`` should be the new object instance (usually\n   an instance of *cls*).\n\n   Typical implementations create a new instance of the class by\n   invoking the superclass\'s ``__new__()`` method using\n   ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n   arguments and then modifying the newly-created instance as\n   necessary before returning it.\n\n   If ``__new__()`` returns an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will be invoked like\n   ``__init__(self[, ...])``, where *self* is the new instance and the\n   remaining arguments are the same as were passed to ``__new__()``.\n\n   If ``__new__()`` does not return an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will not be invoked.\n\n   ``__new__()`` is intended mainly to allow subclasses of immutable\n   types (like int, str, or tuple) to customize instance creation.  It\n   is also commonly overridden in custom metaclasses in order to\n   customize class creation.\n\nobject.__init__(self[, ...])\n\n   Called when the instance is created.  The arguments are those\n   passed to the class constructor expression.  If a base class has an\n   ``__init__()`` method, the derived class\'s ``__init__()`` method,\n   if any, must explicitly call it to ensure proper initialization of\n   the base class part of the instance; for example:\n   ``BaseClass.__init__(self, [args...])``.  As a special constraint\n   on constructors, no value may be returned; doing so will cause a\n   ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n   Called when the instance is about to be destroyed.  This is also\n   called a destructor.  If a base class has a ``__del__()`` method,\n   the derived class\'s ``__del__()`` method, if any, must explicitly\n   call it to ensure proper deletion of the base class part of the\n   instance.  Note that it is possible (though not recommended!) for\n   the ``__del__()`` method to postpone destruction of the instance by\n   creating a new reference to it.  It may then be called at a later\n   time when this new reference is deleted.  It is not guaranteed that\n   ``__del__()`` methods are called for objects that still exist when\n   the interpreter exits.\n\n   Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n     decrements the reference count for ``x`` by one, and the latter\n     is only called when ``x``\'s reference count reaches zero.  Some\n     common situations that may prevent the reference count of an\n     object from going to zero include: circular references between\n     objects (e.g., a doubly-linked list or a tree data structure with\n     parent and child pointers); a reference to the object on the\n     stack frame of a function that caught an exception (the traceback\n     stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n     a reference to the object on the stack frame that raised an\n     unhandled exception in interactive mode (the traceback stored in\n     ``sys.last_traceback`` keeps the stack frame alive).  The first\n     situation can only be remedied by explicitly breaking the cycles;\n     the latter two situations can be resolved by storing ``None`` in\n     ``sys.last_traceback``. Circular references which are garbage are\n     detected when the option cycle detector is enabled (it\'s on by\n     default), but can only be cleaned up if there are no Python-\n     level ``__del__()`` methods involved. Refer to the documentation\n     for the ``gc`` module for more information about how\n     ``__del__()`` methods are handled by the cycle detector,\n     particularly the description of the ``garbage`` value.\n\n   Warning: Due to the precarious circumstances under which ``__del__()``\n     methods are invoked, exceptions that occur during their execution\n     are ignored, and a warning is printed to ``sys.stderr`` instead.\n     Also, when ``__del__()`` is invoked in response to a module being\n     deleted (e.g., when execution of the program is done), other\n     globals referenced by the ``__del__()`` method may already have\n     been deleted or in the process of being torn down (e.g. the\n     import machinery shutting down).  For this reason, ``__del__()``\n     methods should do the absolute minimum needed to maintain\n     external invariants.  Starting with version 1.5, Python\n     guarantees that globals whose name begins with a single\n     underscore are deleted from their module before other globals are\n     deleted; if no other references to such globals exist, this may\n     help in assuring that imported modules are still available at the\n     time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n   Called by the ``repr()`` built-in function to compute the\n   "official" string representation of an object.  If at all possible,\n   this should look like a valid Python expression that could be used\n   to recreate an object with the same value (given an appropriate\n   environment).  If this is not possible, a string of the form\n   ``<...some useful description...>`` should be returned. The return\n   value must be a string object. If a class defines ``__repr__()``\n   but not ``__str__()``, then ``__repr__()`` is also used when an\n   "informal" string representation of instances of that class is\n   required.\n\n   This is typically used for debugging, so it is important that the\n   representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n   Called by ``str(object)`` and the built-in functions ``format()``\n   and ``print()`` to compute the "informal" or nicely printable\n   string representation of an object.  The return value must be a\n   *string* object.\n\n   This method differs from ``object.__repr__()`` in that there is no\n   expectation that ``__str__()`` return a valid Python expression: a\n   more convenient or concise representation can be used.\n\n   The default implementation defined by the built-in type ``object``\n   calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n   Called by ``bytes()`` to compute a byte-string representation of an\n   object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n   Called by the ``format()`` built-in function (and by extension, the\n   ``str.format()`` method of class ``str``) to produce a "formatted"\n   string representation of an object. The ``format_spec`` argument is\n   a string that contains a description of the formatting options\n   desired. The interpretation of the ``format_spec`` argument is up\n   to the type implementing ``__format__()``, however most classes\n   will either delegate formatting to one of the built-in types, or\n   use a similar formatting option syntax.\n\n   See *Format Specification Mini-Language* for a description of the\n   standard formatting syntax.\n\n   The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n   These are the so-called "rich comparison" methods. The\n   correspondence between operator symbols and method names is as\n   follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n   ``x.__ge__(y)``.\n\n   A rich comparison method may return the singleton\n   ``NotImplemented`` if it does not implement the operation for a\n   given pair of arguments. By convention, ``False`` and ``True`` are\n   returned for a successful comparison. However, these methods can\n   return any value, so if the comparison operator is used in a\n   Boolean context (e.g., in the condition of an ``if`` statement),\n   Python will call ``bool()`` on the value to determine if the result\n   is true or false.\n\n   There are no implied relationships among the comparison operators.\n   The truth of ``x==y`` does not imply that ``x!=y`` is false.\n   Accordingly, when defining ``__eq__()``, one should also define\n   ``__ne__()`` so that the operators will behave as expected.  See\n   the paragraph on ``__hash__()`` for some important notes on\n   creating *hashable* objects which support custom comparison\n   operations and are usable as dictionary keys.\n\n   There are no swapped-argument versions of these methods (to be used\n   when the left argument does not support the operation but the right\n   argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n   other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n   reflection, and ``__eq__()`` and ``__ne__()`` are their own\n   reflection.\n\n   Arguments to rich comparison methods are never coerced.\n\n   To automatically generate ordering operations from a single root\n   operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n   Called by built-in function ``hash()`` and for operations on\n   members of hashed collections including ``set``, ``frozenset``, and\n   ``dict``.  ``__hash__()`` should return an integer.  The only\n   required property is that objects which compare equal have the same\n   hash value; it is advised to somehow mix together (e.g. using\n   exclusive or) the hash values for the components of the object that\n   also play a part in comparison of objects.\n\n   If a class does not define an ``__eq__()`` method it should not\n   define a ``__hash__()`` operation either; if it defines\n   ``__eq__()`` but not ``__hash__()``, its instances will not be\n   usable as items in hashable collections.  If a class defines\n   mutable objects and implements an ``__eq__()`` method, it should\n   not implement ``__hash__()``, since the implementation of hashable\n   collections requires that a key\'s hash value is immutable (if the\n   object\'s hash value changes, it will be in the wrong hash bucket).\n\n   User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n   by default; with them, all objects compare unequal (except with\n   themselves) and ``x.__hash__()`` returns an appropriate value such\n   that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n   hash(y)``.\n\n   A class that overrides ``__eq__()`` and does not define\n   ``__hash__()`` will have its ``__hash__()`` implicitly set to\n   ``None``.  When the ``__hash__()`` method of a class is ``None``,\n   instances of the class will raise an appropriate ``TypeError`` when\n   a program attempts to retrieve their hash value, and will also be\n   correctly identified as unhashable when checking ``isinstance(obj,\n   collections.Hashable``).\n\n   If a class that overrides ``__eq__()`` needs to retain the\n   implementation of ``__hash__()`` from a parent class, the\n   interpreter must be told this explicitly by setting ``__hash__ =\n   .__hash__``.\n\n   If a class that does not override ``__eq__()`` wishes to suppress\n   hash support, it should include ``__hash__ = None`` in the class\n   definition. A class which defines its own ``__hash__()`` that\n   explicitly raises a ``TypeError`` would be incorrectly identified\n   as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n   Note: By default, the ``__hash__()`` values of str, bytes and datetime\n     objects are "salted" with an unpredictable random value.\n     Although they remain constant within an individual Python\n     process, they are not predictable between repeated invocations of\n     Python.This is intended to provide protection against a denial-\n     of-service caused by carefully-chosen inputs that exploit the\n     worst case performance of a dict insertion, O(n^2) complexity.\n     See http://www.ocert.org/advisories/ocert-2011-003.html for\n     details.Changing hash values affects the iteration order of\n     dicts, sets and other mappings.  Python has never made guarantees\n     about this ordering (and it typically varies between 32-bit and\n     64-bit builds).See also ``PYTHONHASHSEED``.\n\n   Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n   Called to implement truth value testing and the built-in operation\n   ``bool()``; should return ``False`` or ``True``.  When this method\n   is not defined, ``__len__()`` is called, if it is defined, and the\n   object is considered true if its result is nonzero.  If a class\n   defines neither ``__len__()`` nor ``__bool__()``, all its instances\n   are considered true.\n',
    + 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n   Called to create a new instance of class *cls*.  ``__new__()`` is a\n   static method (special-cased so you need not declare it as such)\n   that takes the class of which an instance was requested as its\n   first argument.  The remaining arguments are those passed to the\n   object constructor expression (the call to the class).  The return\n   value of ``__new__()`` should be the new object instance (usually\n   an instance of *cls*).\n\n   Typical implementations create a new instance of the class by\n   invoking the superclass\'s ``__new__()`` method using\n   ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n   arguments and then modifying the newly-created instance as\n   necessary before returning it.\n\n   If ``__new__()`` returns an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will be invoked like\n   ``__init__(self[, ...])``, where *self* is the new instance and the\n   remaining arguments are the same as were passed to ``__new__()``.\n\n   If ``__new__()`` does not return an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will not be invoked.\n\n   ``__new__()`` is intended mainly to allow subclasses of immutable\n   types (like int, str, or tuple) to customize instance creation.  It\n   is also commonly overridden in custom metaclasses in order to\n   customize class creation.\n\nobject.__init__(self[, ...])\n\n   Called when the instance is created.  The arguments are those\n   passed to the class constructor expression.  If a base class has an\n   ``__init__()`` method, the derived class\'s ``__init__()`` method,\n   if any, must explicitly call it to ensure proper initialization of\n   the base class part of the instance; for example:\n   ``BaseClass.__init__(self, [args...])``.  As a special constraint\n   on constructors, no value may be returned; doing so will cause a\n   ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n   Called when the instance is about to be destroyed.  This is also\n   called a destructor.  If a base class has a ``__del__()`` method,\n   the derived class\'s ``__del__()`` method, if any, must explicitly\n   call it to ensure proper deletion of the base class part of the\n   instance.  Note that it is possible (though not recommended!) for\n   the ``__del__()`` method to postpone destruction of the instance by\n   creating a new reference to it.  It may then be called at a later\n   time when this new reference is deleted.  It is not guaranteed that\n   ``__del__()`` methods are called for objects that still exist when\n   the interpreter exits.\n\n   Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n     decrements the reference count for ``x`` by one, and the latter\n     is only called when ``x``\'s reference count reaches zero.  Some\n     common situations that may prevent the reference count of an\n     object from going to zero include: circular references between\n     objects (e.g., a doubly-linked list or a tree data structure with\n     parent and child pointers); a reference to the object on the\n     stack frame of a function that caught an exception (the traceback\n     stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n     a reference to the object on the stack frame that raised an\n     unhandled exception in interactive mode (the traceback stored in\n     ``sys.last_traceback`` keeps the stack frame alive).  The first\n     situation can only be remedied by explicitly breaking the cycles;\n     the latter two situations can be resolved by storing ``None`` in\n     ``sys.last_traceback``. Circular references which are garbage are\n     detected when the option cycle detector is enabled (it\'s on by\n     default), but can only be cleaned up if there are no Python-\n     level ``__del__()`` methods involved. Refer to the documentation\n     for the ``gc`` module for more information about how\n     ``__del__()`` methods are handled by the cycle detector,\n     particularly the description of the ``garbage`` value.\n\n   Warning: Due to the precarious circumstances under which ``__del__()``\n     methods are invoked, exceptions that occur during their execution\n     are ignored, and a warning is printed to ``sys.stderr`` instead.\n     Also, when ``__del__()`` is invoked in response to a module being\n     deleted (e.g., when execution of the program is done), other\n     globals referenced by the ``__del__()`` method may already have\n     been deleted or in the process of being torn down (e.g. the\n     import machinery shutting down).  For this reason, ``__del__()``\n     methods should do the absolute minimum needed to maintain\n     external invariants.  Starting with version 1.5, Python\n     guarantees that globals whose name begins with a single\n     underscore are deleted from their module before other globals are\n     deleted; if no other references to such globals exist, this may\n     help in assuring that imported modules are still available at the\n     time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n   Called by the ``repr()`` built-in function to compute the\n   "official" string representation of an object.  If at all possible,\n   this should look like a valid Python expression that could be used\n   to recreate an object with the same value (given an appropriate\n   environment).  If this is not possible, a string of the form\n   ``<...some useful description...>`` should be returned. The return\n   value must be a string object. If a class defines ``__repr__()``\n   but not ``__str__()``, then ``__repr__()`` is also used when an\n   "informal" string representation of instances of that class is\n   required.\n\n   This is typically used for debugging, so it is important that the\n   representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n   Called by ``str(object)`` and the built-in functions ``format()``\n   and ``print()`` to compute the "informal" or nicely printable\n   string representation of an object.  The return value must be a\n   *string* object.\n\n   This method differs from ``object.__repr__()`` in that there is no\n   expectation that ``__str__()`` return a valid Python expression: a\n   more convenient or concise representation can be used.\n\n   The default implementation defined by the built-in type ``object``\n   calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n   Called by ``bytes()`` to compute a byte-string representation of an\n   object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n   Called by the ``format()`` built-in function (and by extension, the\n   ``str.format()`` method of class ``str``) to produce a "formatted"\n   string representation of an object. The ``format_spec`` argument is\n   a string that contains a description of the formatting options\n   desired. The interpretation of the ``format_spec`` argument is up\n   to the type implementing ``__format__()``, however most classes\n   will either delegate formatting to one of the built-in types, or\n   use a similar formatting option syntax.\n\n   See *Format Specification Mini-Language* for a description of the\n   standard formatting syntax.\n\n   The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n   These are the so-called "rich comparison" methods. The\n   correspondence between operator symbols and method names is as\n   follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n   ``x.__ge__(y)``.\n\n   A rich comparison method may return the singleton\n   ``NotImplemented`` if it does not implement the operation for a\n   given pair of arguments. By convention, ``False`` and ``True`` are\n   returned for a successful comparison. However, these methods can\n   return any value, so if the comparison operator is used in a\n   Boolean context (e.g., in the condition of an ``if`` statement),\n   Python will call ``bool()`` on the value to determine if the result\n   is true or false.\n\n   There are no implied relationships among the comparison operators.\n   The truth of ``x==y`` does not imply that ``x!=y`` is false.\n   Accordingly, when defining ``__eq__()``, one should also define\n   ``__ne__()`` so that the operators will behave as expected.  See\n   the paragraph on ``__hash__()`` for some important notes on\n   creating *hashable* objects which support custom comparison\n   operations and are usable as dictionary keys.\n\n   There are no swapped-argument versions of these methods (to be used\n   when the left argument does not support the operation but the right\n   argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n   other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n   reflection, and ``__eq__()`` and ``__ne__()`` are their own\n   reflection.\n\n   Arguments to rich comparison methods are never coerced.\n\n   To automatically generate ordering operations from a single root\n   operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n   Called by built-in function ``hash()`` and for operations on\n   members of hashed collections including ``set``, ``frozenset``, and\n   ``dict``.  ``__hash__()`` should return an integer.  The only\n   required property is that objects which compare equal have the same\n   hash value; it is advised to somehow mix together (e.g. using\n   exclusive or) the hash values for the components of the object that\n   also play a part in comparison of objects.\n\n   Note: ``hash()`` truncates the value returned from an object\'s custom\n     ``__hash__()`` method to the size of a ``Py_ssize_t``.  This is\n     typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n     If an object\'s   ``__hash__()`` must interoperate on builds of\n     different bit sizes, be sure to check the width on all supported\n     builds.  An easy way to do this is with ``python -c "import sys;\n     print(sys.hash_info.width)"``\n\n   If a class does not define an ``__eq__()`` method it should not\n   define a ``__hash__()`` operation either; if it defines\n   ``__eq__()`` but not ``__hash__()``, its instances will not be\n   usable as items in hashable collections.  If a class defines\n   mutable objects and implements an ``__eq__()`` method, it should\n   not implement ``__hash__()``, since the implementation of hashable\n   collections requires that a key\'s hash value is immutable (if the\n   object\'s hash value changes, it will be in the wrong hash bucket).\n\n   User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n   by default; with them, all objects compare unequal (except with\n   themselves) and ``x.__hash__()`` returns an appropriate value such\n   that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n   hash(y)``.\n\n   A class that overrides ``__eq__()`` and does not define\n   ``__hash__()`` will have its ``__hash__()`` implicitly set to\n   ``None``.  When the ``__hash__()`` method of a class is ``None``,\n   instances of the class will raise an appropriate ``TypeError`` when\n   a program attempts to retrieve their hash value, and will also be\n   correctly identified as unhashable when checking ``isinstance(obj,\n   collections.Hashable``).\n\n   If a class that overrides ``__eq__()`` needs to retain the\n   implementation of ``__hash__()`` from a parent class, the\n   interpreter must be told this explicitly by setting ``__hash__ =\n   .__hash__``.\n\n   If a class that does not override ``__eq__()`` wishes to suppress\n   hash support, it should include ``__hash__ = None`` in the class\n   definition. A class which defines its own ``__hash__()`` that\n   explicitly raises a ``TypeError`` would be incorrectly identified\n   as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n   Note: By default, the ``__hash__()`` values of str, bytes and datetime\n     objects are "salted" with an unpredictable random value.\n     Although they remain constant within an individual Python\n     process, they are not predictable between repeated invocations of\n     Python.This is intended to provide protection against a denial-\n     of-service caused by carefully-chosen inputs that exploit the\n     worst case performance of a dict insertion, O(n^2) complexity.\n     See http://www.ocert.org/advisories/ocert-2011-003.html for\n     details.Changing hash values affects the iteration order of\n     dicts, sets and other mappings.  Python has never made guarantees\n     about this ordering (and it typically varies between 32-bit and\n     64-bit builds).See also ``PYTHONHASHSEED``.\n\n   Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n   Called to implement truth value testing and the built-in operation\n   ``bool()``; should return ``False`` or ``True``.  When this method\n   is not defined, ``__len__()`` is called, if it is defined, and the\n   object is considered true if its result is nonzero.  If a class\n   defines neither ``__len__()`` nor ``__bool__()``, all its instances\n   are considered true.\n',
      'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs.  It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame.  It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source.  The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n   >>> import pdb\n   >>> import mymodule\n   >>> pdb.run(\'mymodule.test()\')\n   > (0)?()\n   (Pdb) continue\n   > (1)?()\n   (Pdb) continue\n   NameError: \'spam\'\n   > (1)?()\n   (Pdb)\n\nChanged in version 3.3: Tab-completion via the ``readline`` module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the ``print`` command.\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n   python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally.  After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program.  Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n   import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger.  You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n   >>> import pdb\n   >>> import mymodule\n   >>> mymodule.test()\n   Traceback (most recent call last):\n     File "", line 1, in ?\n     File "./mymodule.py", line 4, in test\n       test2()\n     File "./mymodule.py", line 3, in test2\n       print(spam)\n   NameError: spam\n   >>> pdb.pm()\n   > ./mymodule.py(3)test2()\n   -> print(spam)\n   (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n   Execute the *statement* (given as a string or a code object) under\n   debugger control.  The debugger prompt appears before any code is\n   executed; you can set breakpoints and type ``continue``, or you can\n   step through the statement using ``step`` or ``next`` (all these\n   commands are explained below).  The optional *globals* and *locals*\n   arguments specify the environment in which the code is executed; by\n   default the dictionary of the module ``__main__`` is used.  (See\n   the explanation of the built-in ``exec()`` or ``eval()``\n   functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n   Evaluate the *expression* (given as a string or a code object)\n   under debugger control.  When ``runeval()`` returns, it returns the\n   value of the expression.  Otherwise this function is similar to\n   ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n   Call the *function* (a function or method object, not a string)\n   with the given arguments.  When ``runcall()`` returns, it returns\n   whatever the function call returned.  The debugger prompt appears\n   as soon as the function is entered.\n\npdb.set_trace()\n\n   Enter the debugger at the calling stack frame.  This is useful to\n   hard-code a breakpoint at a given point in a program, even if the\n   code is not otherwise being debugged (e.g. when an assertion\n   fails).\n\npdb.post_mortem(traceback=None)\n\n   Enter post-mortem debugging of the given *traceback* object.  If no\n   *traceback* is given, it uses the one of the exception that is\n   currently being handled (an exception must be being handled if the\n   default is to be used).\n\npdb.pm()\n\n   Enter post-mortem debugging of the traceback found in\n   ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname.  If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n   ``Pdb`` is the debugger class.\n\n   The *completekey*, *stdin* and *stdout* arguments are passed to the\n   underlying ``cmd.Cmd`` class; see the description there.\n\n   The *skip* argument, if given, must be an iterable of glob-style\n   module name patterns.  The debugger will not step into frames that\n   originate in a module that matches one of these patterns. [1]\n\n   By default, Pdb sets a handler for the SIGINT signal (which is sent\n   when the user presses Ctrl-C on the console) when you give a\n   ``continue`` command. This allows you to break into the debugger\n   again by pressing Ctrl-C.  If you want Pdb not to touch the SIGINT\n   handler, set *nosigint* tot true.\n\n   Example call to enable tracing with *skip*:\n\n      import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n   New in version 3.1: The *skip* argument.\n\n   New in version 3.2: The *nosigint* argument.  Previously, a SIGINT\n   handler was never set by Pdb.\n\n   run(statement, globals=None, locals=None)\n   runeval(expression, globals=None, locals=None)\n   runcall(function, *args, **kwds)\n   set_trace()\n\n      See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below.  Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``).  Arguments to commands must be separated by whitespace\n(spaces or tabs).  Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered.  Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged.  Python statements can also be prefixed with an exclamation\npoint (``!``).  This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*.  Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``.  (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.)  No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt.  This is particularly useful for aliases.  If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``.  Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n   Without argument, print the list of available commands.  With a\n   *command* as argument, print help about that command.  ``help pdb``\n   displays the full documentation (the docstring of the ``pdb``\n   module).  Since the *command* argument must be an identifier,\n   ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n   Print a stack trace, with the most recent frame at the bottom.  An\n   arrow indicates the current frame, which determines the context of\n   most commands.\n\nd(own) [count]\n\n   Move the current frame *count* (default one) levels down in the\n   stack trace (to a newer frame).\n\nu(p) [count]\n\n   Move the current frame *count* (default one) levels up in the stack\n   trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n   With a *lineno* argument, set a break there in the current file.\n   With a *function* argument, set a break at the first executable\n   statement within that function.  The line number may be prefixed\n   with a filename and a colon, to specify a breakpoint in another\n   file (probably one that hasn\'t been loaded yet).  The file is\n   searched on ``sys.path``.  Note that each breakpoint is assigned a\n   number to which all the other breakpoint commands refer.\n\n   If a second argument is present, it is an expression which must\n   evaluate to true before the breakpoint is honored.\n\n   Without argument, list all breaks, including for each breakpoint,\n   the number of times that breakpoint has been hit, the current\n   ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n   Temporary breakpoint, which is removed automatically when it is\n   first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n   With a *filename:lineno* argument, clear all the breakpoints at\n   this line. With a space separated list of breakpoint numbers, clear\n   those breakpoints. Without argument, clear all breaks (but first\n   ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n   Disable the breakpoints given as a space separated list of\n   breakpoint numbers.  Disabling a breakpoint means it cannot cause\n   the program to stop execution, but unlike clearing a breakpoint, it\n   remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n   Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n   Set the ignore count for the given breakpoint number.  If count is\n   omitted, the ignore count is set to 0.  A breakpoint becomes active\n   when the ignore count is zero.  When non-zero, the count is\n   decremented each time the breakpoint is reached and the breakpoint\n   is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n   Set a new *condition* for the breakpoint, an expression which must\n   evaluate to true before the breakpoint is honored.  If *condition*\n   is absent, any existing condition is removed; i.e., the breakpoint\n   is made unconditional.\n\ncommands [bpnumber]\n\n   Specify a list of commands for breakpoint number *bpnumber*.  The\n   commands themselves appear on the following lines.  Type a line\n   containing just ``end`` to terminate the commands. An example:\n\n      (Pdb) commands 1\n      (com) print some_variable\n      (com) end\n      (Pdb)\n\n   To remove all commands from a breakpoint, type commands and follow\n   it immediately with ``end``; that is, give no commands.\n\n   With no *bpnumber* argument, commands refers to the last breakpoint\n   set.\n\n   You can use breakpoint commands to start your program up again.\n   Simply use the continue command, or step, or any other command that\n   resumes execution.\n\n   Specifying any command resuming execution (currently continue,\n   step, next, return, jump, quit and their abbreviations) terminates\n   the command list (as if that command was immediately followed by\n   end). This is because any time you resume execution (even with a\n   simple next or step), you may encounter another breakpoint--which\n   could have its own command list, leading to ambiguities about which\n   list to execute.\n\n   If you use the \'silent\' command in the command list, the usual\n   message about stopping at a breakpoint is not printed.  This may be\n   desirable for breakpoints that are to print a specific message and\n   then continue.  If none of the other commands print anything, you\n   see no sign that the breakpoint was reached.\n\ns(tep)\n\n   Execute the current line, stop at the first possible occasion\n   (either in a function that is called or on the next line in the\n   current function).\n\nn(ext)\n\n   Continue execution until the next line in the current function is\n   reached or it returns.  (The difference between ``next`` and\n   ``step`` is that ``step`` stops inside a called function, while\n   ``next`` executes called functions at (nearly) full speed, only\n   stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n   Without argument, continue execution until the line with a number\n   greater than the current one is reached.\n\n   With a line number, continue execution until a line with a number\n   greater or equal to that is reached.  In both cases, also stop when\n   the current frame returns.\n\n   Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n   Continue execution until the current function returns.\n\nc(ont(inue))\n\n   Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n   Set the next line that will be executed.  Only available in the\n   bottom-most frame.  This lets you jump back and execute code again,\n   or jump forward to skip code that you don\'t want to run.\n\n   It should be noted that not all jumps are allowed -- for instance\n   it is not possible to jump into the middle of a ``for`` loop or out\n   of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n   List source code for the current file.  Without arguments, list 11\n   lines around the current line or continue the previous listing.\n   With ``.`` as argument, list 11 lines around the current line.\n   With one argument, list 11 lines around at that line.  With two\n   arguments, list the given range; if the second argument is less\n   than the first, it is interpreted as a count.\n\n   The current line in the current frame is indicated by ``->``.  If\n   an exception is being debugged, the line where the exception was\n   originally raised or propagated is indicated by ``>>``, if it\n   differs from the current line.\n\n   New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n   List all source code for the current function or frame.\n   Interesting lines are marked as for ``list``.\n\n   New in version 3.2.\n\na(rgs)\n\n   Print the argument list of the current function.\n\np(rint) expression\n\n   Evaluate the *expression* in the current context and print its\n   value.\n\npp expression\n\n   Like the ``print`` command, except the value of the expression is\n   pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n   Print the type of the *expression*.\n\nsource expression\n\n   Try to get source code for the given object and display it.\n\n   New in version 3.2.\n\ndisplay [expression]\n\n   Display the value of the expression if it changed, each time\n   execution stops in the current frame.\n\n   Without expression, list all display expressions for the current\n   frame.\n\n   New in version 3.2.\n\nundisplay [expression]\n\n   Do not display the expression any more in the current frame.\n   Without expression, clear all display expressions for the current\n   frame.\n\n   New in version 3.2.\n\ninteract\n\n   Start an interative interpreter (using the ``code`` module) whose\n   global namespace contains all the (global and local) names found in\n   the current scope.\n\n   New in version 3.2.\n\nalias [name [command]]\n\n   Create an alias called *name* that executes *command*.  The command\n   must *not* be enclosed in quotes.  Replaceable parameters can be\n   indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n   all the parameters. If no command is given, the current alias for\n   *name* is shown. If no arguments are given, all aliases are listed.\n\n   Aliases may be nested and can contain anything that can be legally\n   typed at the pdb prompt.  Note that internal pdb commands *can* be\n   overridden by aliases.  Such a command is then hidden until the\n   alias is removed.  Aliasing is recursively applied to the first\n   word of the command line; all other words in the line are left\n   alone.\n\n   As an example, here are two useful aliases (especially when placed\n   in the ``.pdbrc`` file):\n\n      # Print instance variables (usage "pi classInst")\n      alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n      # Print instance variables in self\n      alias ps pi self\n\nunalias name\n\n   Delete the specified alias.\n\n! statement\n\n   Execute the (one-line) *statement* in the context of the current\n   stack frame. The exclamation point can be omitted unless the first\n   word of the statement resembles a debugger command.  To set a\n   global variable, you can prefix the assignment command with a\n   ``global`` statement on the same line, e.g.:\n\n      (Pdb) global list_options; list_options = [\'-l\']\n      (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n   Restart the debugged Python program.  If an argument is supplied,\n   it is split with ``shlex`` and the result is used as the new\n   ``sys.argv``. History, breakpoints, actions and debugger options\n   are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n   Quit from the debugger.  The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n    determined by the ``__name__`` in the frame globals.\n',
      'del': '\nThe ``del`` statement\n*********************\n\n   del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a ``global``\nstatement in the same code block.  If the name is unbound, a\n``NameError`` exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2: Previously it was illegal to delete a name\nfrom the local namespace if it occurs as a free variable in a nested\nblock.\n',
      'dict': '\nDictionary displays\n*******************\n\nA dictionary display is a possibly empty series of key/datum pairs\nenclosed in curly braces:\n\n   dict_display       ::= "{" [key_datum_list | dict_comprehension] "}"\n   key_datum_list     ::= key_datum ("," key_datum)* [","]\n   key_datum          ::= expression ":" expression\n   dict_comprehension ::= expression ":" expression comp_for\n\nA dictionary display yields a new dictionary object.\n\nIf a comma-separated sequence of key/datum pairs is given, they are\nevaluated from left to right to define the entries of the dictionary:\neach key object is used as a key into the dictionary to store the\ncorresponding datum.  This means that you can specify the same key\nmultiple times in the key/datum list, and the final dictionary\'s value\nfor that key will be the last one given.\n\nA dict comprehension, in contrast to list and set comprehensions,\nneeds two expressions separated with a colon followed by the usual\n"for" and "if" clauses. When the comprehension is run, the resulting\nkey and value elements are inserted in the new dictionary in the order\nthey are produced.\n\nRestrictions on the types of the key values are listed earlier in\nsection *The standard type hierarchy*.  (To summarize, the key type\nshould be *hashable*, which excludes all mutable objects.)  Clashes\nbetween duplicate keys are not detected; the last datum (textually\nrightmost in the display) stored for a given key value prevails.\n',
    @@ -34,44 +34,44 @@
      'exprlists': '\nExpression lists\n****************\n\n   expression_list ::= expression ( "," expression )* [","]\n\nAn expression list containing at least one comma yields a tuple.  The\nlength of the tuple is the number of expressions in the list.  The\nexpressions are evaluated from left to right.\n\nThe trailing comma is required only to create a single tuple (a.k.a. a\n*singleton*); it is optional in all other cases.  A single expression\nwithout a trailing comma doesn\'t create a tuple, but rather yields the\nvalue of that expression. (To create an empty tuple, use an empty pair\nof parentheses: ``()``.)\n',
      'floating': '\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n   floatnumber   ::= pointfloat | exponentfloat\n   pointfloat    ::= [intpart] fraction | intpart "."\n   exponentfloat ::= (intpart | pointfloat) exponent\n   intpart       ::= digit+\n   fraction      ::= "." digit+\n   exponent      ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts are always interpreted using\nradix 10. For example, ``077e010`` is legal, and denotes the same\nnumber as ``77e10``. The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n   3.14    10.    .001    1e100    3.14e-10    0e0\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator ``-`` and the\nliteral ``1``.\n',
      'for': '\nThe ``for`` statement\n*********************\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n   for_stmt ::= "for" target_list "in" expression_list ":" suite\n                ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject.  An iterator is created for the result of the\n``expression_list``.  The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices.  Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted.  When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop.  Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n  (this can only occur for mutable sequences, i.e. lists).  An\n  internal counter is used to keep track of which item is used next,\n  and this is incremented on each iteration.  When this counter has\n  reached the length of the sequence the loop terminates.  This means\n  that if the suite deletes the current (or a previous) item from the\n  sequence, the next item will be skipped (since it gets the index of\n  the current item which has already been treated).  Likewise, if the\n  suite inserts an item in the sequence before the current item, the\n  current item will be treated again the next time through the loop.\n  This can lead to nasty bugs that can be avoided by making a\n  temporary copy using a slice of the whole sequence, e.g.,\n\n     for x in a[:]:\n         if x < 0: a.remove(x)\n',
    - 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output.  If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n      replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n      field_name        ::= arg_name ("." attribute_name | "[" element_index "]")*\n      arg_name          ::= [identifier | integer]\n      attribute_name    ::= identifier\n      element_index     ::= integer | index_string\n      index_string      ::=  +\n      conversion        ::= "r" | "s" | "a"\n      format_spec       ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a  *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``.  These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword.  If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument.  If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n   "First, thou shalt count to {0}" # References first positional argument\n   "Bring me a {}"                  # Implicitly references the first positional argument\n   "From {} to {}"                  # Same as "From {0} to {1}"\n   "My quest is {name}"             # References keyword argument \'name\'\n   "Weight in tons {0.weight}"      # \'weight\' attribute of first positional arg\n   "Units destroyed: {players[0]}"  # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself.  However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting.  By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n   "Harold\'s a clever {0!s}"        # Calls str() on the argument first\n   "Bring out the holy {name!r}"    # Calls repr() on the argument first\n   "More {!a}"                      # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on.  Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed.  The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*).  They can also be passed directly to the\nbuilt-in ``format()`` function.  Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n   format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n   fill        ::= \n   align       ::= "<" | ">" | "=" | "^"\n   sign        ::= "+" | "-" | " "\n   width       ::= integer\n   precision   ::= integer\n   type        ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'.  The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options.  If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'<\'``   | Forces the field to be left-aligned within the available   |\n   |           | space (this is the default for most objects).              |\n   +-----------+------------------------------------------------------------+\n   | ``\'>\'``   | Forces the field to be right-aligned within the available  |\n   |           | space (this is the default for numbers).                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'=\'``   | Forces the padding to be placed after the sign (if any)    |\n   |           | but before the digits.  This is used for printing fields   |\n   |           | in the form \'+000000120\'. This alignment option is only    |\n   |           | valid for numeric types.                                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'^\'``   | Forces the field to be centered within the available       |\n   |           | space.                                                     |\n   +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'+\'``   | indicates that a sign should be used for both positive as  |\n   |           | well as negative numbers.                                  |\n   +-----------+------------------------------------------------------------+\n   | ``\'-\'``   | indicates that a sign should be used only for negative     |\n   |           | numbers (this is the default behavior).                    |\n   +-----------+------------------------------------------------------------+\n   | space     | indicates that a leading space should be used on positive  |\n   |           | numbers, and a minus sign on negative numbers.             |\n   +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion.  The alternate form is defined differently for different\ntypes.  This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width.  If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types.  This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'s\'``   | String format. This is the default type for strings and    |\n   |           | may be omitted.                                            |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'s\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'b\'``   | Binary format. Outputs the number in base 2.               |\n   +-----------+------------------------------------------------------------+\n   | ``\'c\'``   | Character. Converts the integer to the corresponding       |\n   |           | unicode character before printing.                         |\n   +-----------+------------------------------------------------------------+\n   | ``\'d\'``   | Decimal Integer. Outputs the number in base 10.            |\n   +-----------+------------------------------------------------------------+\n   | ``\'o\'``   | Octal format. Outputs the number in base 8.                |\n   +-----------+------------------------------------------------------------+\n   | ``\'x\'``   | Hex format. Outputs the number in base 16, using lower-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'X\'``   | Hex format. Outputs the number in base 16, using upper-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'d\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'d\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'e\'``   | Exponent notation. Prints the number in scientific         |\n   |           | notation using the letter \'e\' to indicate the exponent.    |\n   +-----------+------------------------------------------------------------+\n   | ``\'E\'``   | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n   |           | case \'E\' as the separator character.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'f\'``   | Fixed point. Displays the number as a fixed-point number.  |\n   +-----------+------------------------------------------------------------+\n   | ``\'F\'``   | Fixed point. Same as ``\'f\'``, but converts ``nan`` to      |\n   |           | ``NAN`` and ``inf`` to ``INF``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'g\'``   | General format.  For a given precision ``p >= 1``, this    |\n   |           | rounds the number to ``p`` significant digits and then     |\n   |           | formats the result in either fixed-point format or in      |\n   |           | scientific notation, depending on its magnitude.  The      |\n   |           | precise rules are as follows: suppose that the result      |\n   |           | formatted with presentation type ``\'e\'`` and precision     |\n   |           | ``p-1`` would have exponent ``exp``.  Then if ``-4 <= exp  |\n   |           | < p``, the number is formatted with presentation type      |\n   |           | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number   |\n   |           | is formatted with presentation type ``\'e\'`` and precision  |\n   |           | ``p-1``. In both cases insignificant trailing zeros are    |\n   |           | removed from the significand, and the decimal point is     |\n   |           | also removed if there are no remaining digits following    |\n   |           | it.  Positive and negative infinity, positive and negative |\n   |           | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n   |           | ``-0`` and ``nan`` respectively, regardless of the         |\n   |           | precision.  A precision of ``0`` is treated as equivalent  |\n   |           | to a precision of ``1``.                                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'G\'``   | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n   |           | if the number gets too large. The representations of       |\n   |           | infinity and NaN are uppercased, too.                      |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'g\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | ``\'%\'``   | Percentage. Multiplies the number by 100 and displays in   |\n   |           | fixed (``\'f\'``) format, followed by a percent sign.        |\n   +-----------+------------------------------------------------------------+\n   | None      | Similar to ``\'g\'``, except with at least one digit past    |\n   |           | the decimal point and a default precision of 12. This is   |\n   |           | intended to match ``str()``, except you can add the other  |\n   |           | format modifiers.                                          |\n   +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n   >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n   \'a, b, c\'\n   >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\')  # 3.1+ only\n   \'a, b, c\'\n   >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n   \'c, b, a\'\n   >>> \'{2}, {1}, {0}\'.format(*\'abc\')      # unpacking argument sequence\n   \'c, b, a\'\n   >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\')   # arguments\' indices can be repeated\n   \'abracadabra\'\n\nAccessing arguments by name:\n\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n   \'Coordinates: 37.24N, -115.81W\'\n   >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n   \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n   >>> c = 3-5j\n   >>> (\'The complex number {0} is formed from the real part {0.real} \'\n   ...  \'and the imaginary part {0.imag}.\').format(c)\n   \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n   >>> class Point:\n   ...     def __init__(self, x, y):\n   ...         self.x, self.y = x, y\n   ...     def __str__(self):\n   ...         return \'Point({self.x}, {self.y})\'.format(self=self)\n   ...\n   >>> str(Point(4, 2))\n   \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n   >>> coord = (3, 5)\n   >>> \'X: {0[0]};  Y: {0[1]}\'.format(coord)\n   \'X: 3;  Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n   >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n   "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n   >>> \'{:<30}\'.format(\'left aligned\')\n   \'left aligned                  \'\n   >>> \'{:>30}\'.format(\'right aligned\')\n   \'                 right aligned\'\n   >>> \'{:^30}\'.format(\'centered\')\n   \'           centered           \'\n   >>> \'{:*^30}\'.format(\'centered\')  # use \'*\' as a fill char\n   \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n   >>> \'{:+f}; {:+f}\'.format(3.14, -3.14)  # show it always\n   \'+3.140000; -3.140000\'\n   >>> \'{: f}; {: f}\'.format(3.14, -3.14)  # show a space for positive numbers\n   \' 3.140000; -3.140000\'\n   >>> \'{:-f}; {:-f}\'.format(3.14, -3.14)  # show only the minus -- same as \'{:f}; {:f}\'\n   \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n   >>> # format also supports binary numbers\n   >>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)\n   \'int: 42;  hex: 2a;  oct: 52;  bin: 101010\'\n   >>> # with 0x, 0o, or 0b as prefix:\n   >>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)\n   \'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n   >>> \'{:,}\'.format(1234567890)\n   \'1,234,567,890\'\n\nExpressing a percentage:\n\n   >>> points = 19\n   >>> total = 22\n   >>> \'Correct answers: {:.2%}\'.format(points/total)\n   \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n   >>> import datetime\n   >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n   >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n   \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n   >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n   ...     \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n   ...\n   \'left<<<<<<<<<<<<\'\n   \'^^^^^center^^^^^\'\n   \'>>>>>>>>>>>right\'\n   >>>\n   >>> octets = [192, 168, 0, 1]\n   >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n   \'C0A80001\'\n   >>> int(_, 16)\n   3232235521\n   >>>\n   >>> width = 5\n   >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n   ...     for base in \'dXob\':\n   ...         print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n   ...     print()\n   ...\n       5     5     5   101\n       6     6     6   110\n       7     7     7   111\n       8     8    10  1000\n       9     9    11  1001\n      10     A    12  1010\n      11     B    13  1011\n',
    - 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   funcdef        ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n                      | "**" parameter\n                      | defparameter [","] )\n   parameter      ::= identifier [":" expression]\n   defparameter   ::= parameter ["=" expression]\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted.  If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name.  Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``.  Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list.  These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code.  The presence of annotations does not change the\nsemantics of a function.  The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda forms,\ndescribed in section *Lambdas*.  Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form.  The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around.  Free variables used in the\nnested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\nSee also:\n\n   **PEP 3107** - Function Annotations\n      The original specification for function annotations.\n',
    + 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output.  If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n      replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n      field_name        ::= arg_name ("." attribute_name | "[" element_index "]")*\n      arg_name          ::= [identifier | integer]\n      attribute_name    ::= identifier\n      element_index     ::= integer | index_string\n      index_string      ::=  +\n      conversion        ::= "r" | "s" | "a"\n      format_spec       ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a  *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``.  These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword.  If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument.  If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n   "First, thou shalt count to {0}" # References first positional argument\n   "Bring me a {}"                  # Implicitly references the first positional argument\n   "From {} to {}"                  # Same as "From {0} to {1}"\n   "My quest is {name}"             # References keyword argument \'name\'\n   "Weight in tons {0.weight}"      # \'weight\' attribute of first positional arg\n   "Units destroyed: {players[0]}"  # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself.  However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting.  By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n   "Harold\'s a clever {0!s}"        # Calls str() on the argument first\n   "Bring out the holy {name!r}"    # Calls repr() on the argument first\n   "More {!a}"                      # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on.  Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed.  The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*).  They can also be passed directly to the\nbuilt-in ``format()`` function.  Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n   format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n   fill        ::= \n   align       ::= "<" | ">" | "=" | "^"\n   sign        ::= "+" | "-" | " "\n   width       ::= integer\n   precision   ::= integer\n   type        ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nIf a valid *align* value is specified, it can be preceeded by a *fill*\ncharacter that can be any character and defaults to a space if\nomitted. Note that it is not possible to use ``{`` and ``}`` as *fill*\nchar while using the ``str.format()`` method; this limitation however\ndoesn\'t affect the ``format()`` function.\n\nThe meaning of the various alignment options is as follows:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'<\'``   | Forces the field to be left-aligned within the available   |\n   |           | space (this is the default for most objects).              |\n   +-----------+------------------------------------------------------------+\n   | ``\'>\'``   | Forces the field to be right-aligned within the available  |\n   |           | space (this is the default for numbers).                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'=\'``   | Forces the padding to be placed after the sign (if any)    |\n   |           | but before the digits.  This is used for printing fields   |\n   |           | in the form \'+000000120\'. This alignment option is only    |\n   |           | valid for numeric types.                                   |\n   +-----------+------------------------------------------------------------+\n   | ``\'^\'``   | Forces the field to be centered within the available       |\n   |           | space.                                                     |\n   +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n   +-----------+------------------------------------------------------------+\n   | Option    | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'+\'``   | indicates that a sign should be used for both positive as  |\n   |           | well as negative numbers.                                  |\n   +-----------+------------------------------------------------------------+\n   | ``\'-\'``   | indicates that a sign should be used only for negative     |\n   |           | numbers (this is the default behavior).                    |\n   +-----------+------------------------------------------------------------+\n   | space     | indicates that a leading space should be used on positive  |\n   |           | numbers, and a minus sign on negative numbers.             |\n   +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion.  The alternate form is defined differently for different\ntypes.  This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width.  If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types.  This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'s\'``   | String format. This is the default type for strings and    |\n   |           | may be omitted.                                            |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'s\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'b\'``   | Binary format. Outputs the number in base 2.               |\n   +-----------+------------------------------------------------------------+\n   | ``\'c\'``   | Character. Converts the integer to the corresponding       |\n   |           | unicode character before printing.                         |\n   +-----------+------------------------------------------------------------+\n   | ``\'d\'``   | Decimal Integer. Outputs the number in base 10.            |\n   +-----------+------------------------------------------------------------+\n   | ``\'o\'``   | Octal format. Outputs the number in base 8.                |\n   +-----------+------------------------------------------------------------+\n   | ``\'x\'``   | Hex format. Outputs the number in base 16, using lower-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'X\'``   | Hex format. Outputs the number in base 16, using upper-    |\n   |           | case letters for the digits above 9.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'d\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | None      | The same as ``\'d\'``.                                       |\n   +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n   +-----------+------------------------------------------------------------+\n   | Type      | Meaning                                                    |\n   +===========+============================================================+\n   | ``\'e\'``   | Exponent notation. Prints the number in scientific         |\n   |           | notation using the letter \'e\' to indicate the exponent.    |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'E\'``   | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n   |           | case \'E\' as the separator character.                       |\n   +-----------+------------------------------------------------------------+\n   | ``\'f\'``   | Fixed point. Displays the number as a fixed-point number.  |\n   |           | The default precision is ``6``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'F\'``   | Fixed point. Same as ``\'f\'``, but converts ``nan`` to      |\n   |           | ``NAN`` and ``inf`` to ``INF``.                            |\n   +-----------+------------------------------------------------------------+\n   | ``\'g\'``   | General format.  For a given precision ``p >= 1``, this    |\n   |           | rounds the number to ``p`` significant digits and then     |\n   |           | formats the result in either fixed-point format or in      |\n   |           | scientific notation, depending on its magnitude.  The      |\n   |           | precise rules are as follows: suppose that the result      |\n   |           | formatted with presentation type ``\'e\'`` and precision     |\n   |           | ``p-1`` would have exponent ``exp``.  Then if ``-4 <= exp  |\n   |           | < p``, the number is formatted with presentation type      |\n   |           | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number   |\n   |           | is formatted with presentation type ``\'e\'`` and precision  |\n   |           | ``p-1``. In both cases insignificant trailing zeros are    |\n   |           | removed from the significand, and the decimal point is     |\n   |           | also removed if there are no remaining digits following    |\n   |           | it.  Positive and negative infinity, positive and negative |\n   |           | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n   |           | ``-0`` and ``nan`` respectively, regardless of the         |\n   |           | precision.  A precision of ``0`` is treated as equivalent  |\n   |           | to a precision of ``1``.  The default precision is ``6``.  |\n   +-----------+------------------------------------------------------------+\n   | ``\'G\'``   | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n   |           | if the number gets too large. The representations of       |\n   |           | infinity and NaN are uppercased, too.                      |\n   +-----------+------------------------------------------------------------+\n   | ``\'n\'``   | Number. This is the same as ``\'g\'``, except that it uses   |\n   |           | the current locale setting to insert the appropriate       |\n   |           | number separator characters.                               |\n   +-----------+------------------------------------------------------------+\n   | ``\'%\'``   | Percentage. Multiplies the number by 100 and displays in   |\n   |           | fixed (``\'f\'``) format, followed by a percent sign.        |\n   +-----------+------------------------------------------------------------+\n   | None      | Similar to ``\'g\'``, except with at least one digit past    |\n   |           | the decimal point and a default precision of 12. This is   |\n   |           | intended to match ``str()``, except you can add the other  |\n   |           | format modifiers.                                          |\n   +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n   >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n   \'a, b, c\'\n   >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\')  # 3.1+ only\n   \'a, b, c\'\n   >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n   \'c, b, a\'\n   >>> \'{2}, {1}, {0}\'.format(*\'abc\')      # unpacking argument sequence\n   \'c, b, a\'\n   >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\')   # arguments\' indices can be repeated\n   \'abracadabra\'\n\nAccessing arguments by name:\n\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n   \'Coordinates: 37.24N, -115.81W\'\n   >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n   >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n   \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n   >>> c = 3-5j\n   >>> (\'The complex number {0} is formed from the real part {0.real} \'\n   ...  \'and the imaginary part {0.imag}.\').format(c)\n   \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n   >>> class Point:\n   ...     def __init__(self, x, y):\n   ...         self.x, self.y = x, y\n   ...     def __str__(self):\n   ...         return \'Point({self.x}, {self.y})\'.format(self=self)\n   ...\n   >>> str(Point(4, 2))\n   \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n   >>> coord = (3, 5)\n   >>> \'X: {0[0]};  Y: {0[1]}\'.format(coord)\n   \'X: 3;  Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n   >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n   "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n   >>> \'{:<30}\'.format(\'left aligned\')\n   \'left aligned                  \'\n   >>> \'{:>30}\'.format(\'right aligned\')\n   \'                 right aligned\'\n   >>> \'{:^30}\'.format(\'centered\')\n   \'           centered           \'\n   >>> \'{:*^30}\'.format(\'centered\')  # use \'*\' as a fill char\n   \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n   >>> \'{:+f}; {:+f}\'.format(3.14, -3.14)  # show it always\n   \'+3.140000; -3.140000\'\n   >>> \'{: f}; {: f}\'.format(3.14, -3.14)  # show a space for positive numbers\n   \' 3.140000; -3.140000\'\n   >>> \'{:-f}; {:-f}\'.format(3.14, -3.14)  # show only the minus -- same as \'{:f}; {:f}\'\n   \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n   >>> # format also supports binary numbers\n   >>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)\n   \'int: 42;  hex: 2a;  oct: 52;  bin: 101010\'\n   >>> # with 0x, 0o, or 0b as prefix:\n   >>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)\n   \'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n   >>> \'{:,}\'.format(1234567890)\n   \'1,234,567,890\'\n\nExpressing a percentage:\n\n   >>> points = 19\n   >>> total = 22\n   >>> \'Correct answers: {:.2%}\'.format(points/total)\n   \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n   >>> import datetime\n   >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n   >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n   \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n   >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n   ...     \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n   ...\n   \'left<<<<<<<<<<<<\'\n   \'^^^^^center^^^^^\'\n   \'>>>>>>>>>>>right\'\n   >>>\n   >>> octets = [192, 168, 0, 1]\n   >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n   \'C0A80001\'\n   >>> int(_, 16)\n   3232235521\n   >>>\n   >>> width = 5\n   >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n   ...     for base in \'dXob\':\n   ...         print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n   ...     print()\n   ...\n       5     5     5   101\n       6     6     6   110\n       7     7     7   111\n       8     8    10  1000\n       9     9    11  1001\n      10     A    12  1010\n      11     B    13  1011\n',
    + 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n   funcdef        ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n   decorators     ::= decorator+\n   decorator      ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n   dotted_name    ::= identifier ("." identifier)*\n   parameter_list ::= (defparameter ",")*\n                      ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n                      | "**" parameter\n                      | defparameter [","] )\n   parameter      ::= identifier [":" expression]\n   defparameter   ::= parameter ["=" expression]\n   funcname       ::= identifier\n\nA function definition is an executable statement.  Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function).  This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition.  The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object.  Multiple decorators are applied in\nnested fashion. For example, the following code\n\n   @f1(arg)\n   @f2\n   def func(): pass\n\nis equivalent to\n\n   def func(): pass\n   func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted.  If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call.  This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended.  A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n   def whats_on_the_telly(penguin=None):\n       if penguin is None:\n           penguin = []\n       penguin.append("property of the zoo")\n       return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values.  If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple.  If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name.  Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``.  Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list.  These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code.  The presence of annotations does not change the\nsemantics of a function.  The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions.  This uses lambda\nexpressions, described in section *Lambdas*.  Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a "``def``" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression.  The "``def``" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects.  A "``def``"\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around.  Free variables used\nin the nested function can access the local variables of the function\ncontaining the def.  See section *Naming and binding* for details.\n\nSee also:\n\n   **PEP 3107** - Function Annotations\n      The original specification for function annotations.\n',
      'global': '\nThe ``global`` statement\n************************\n\n   global_stmt ::= "global" identifier ("," identifier)*\n\nThe ``global`` statement is a declaration which holds for the entire\ncurrent code block.  It means that the listed identifiers are to be\ninterpreted as globals.  It would be impossible to assign to a global\nvariable without ``global``, although free variables may refer to\nglobals without being declared global.\n\nNames listed in a ``global`` statement must not be used in the same\ncode block textually preceding that ``global`` statement.\n\nNames listed in a ``global`` statement must not be defined as formal\nparameters or in a ``for`` loop control target, ``class`` definition,\nfunction definition, or ``import`` statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the latter two restrictions, but programs should not abuse\nthis freedom, as future implementations may enforce them or silently\nchange the meaning of the program.\n\n**Programmer\'s note:** the ``global`` is a directive to the parser.\nIt applies only to code parsed at the same time as the ``global``\nstatement. In particular, a ``global`` statement contained in a string\nor code object supplied to the built-in ``exec()`` function does not\naffect the code block *containing* the function call, and code\ncontained in such a string is unaffected by ``global`` statements in\nthe code containing the function call.  The same applies to the\n``eval()`` and ``compile()`` functions.\n',
      'id-classes': '\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings.  These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n   Not imported by ``from module import *``.  The special identifier\n   ``_`` is used in the interactive interpreter to store the result of\n   the last evaluation; it is stored in the ``builtins`` module.  When\n   not in interactive mode, ``_`` has no special meaning and is not\n   defined. See section *The import statement*.\n\n   Note: The name ``_`` is often used in conjunction with\n     internationalization; refer to the documentation for the\n     ``gettext`` module for more information on this convention.\n\n``__*__``\n   System-defined names. These names are defined by the interpreter\n   and its implementation (including the standard library).  Current\n   system names are discussed in the *Special method names* section\n   and elsewhere.  More will likely be defined in future versions of\n   Python.  *Any* use of ``__*__`` names, in any context, that does\n   not follow explicitly documented use, is subject to breakage\n   without warning.\n\n``__*``\n   Class-private names.  Names in this category, when used within the\n   context of a class definition, are re-written to use a mangled form\n   to help avoid name clashes between "private" attributes of base and\n   derived classes. See section *Identifiers (Names)*.\n',
      'identifiers': '\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions.\n\nThe syntax of identifiers in Python is based on the Unicode standard\nannex UAX-31, with elaboration and changes as defined below; see also\n**PEP 3131** for further details.\n\nWithin the ASCII range (U+0001..U+007F), the valid characters for\nidentifiers are the same as in Python 2.x: the uppercase and lowercase\nletters ``A`` through ``Z``, the underscore ``_`` and, except for the\nfirst character, the digits ``0`` through ``9``.\n\nPython 3.0 introduces additional characters from outside the ASCII\nrange (see **PEP 3131**).  For these characters, the classification\nuses the version of the Unicode Character Database as included in the\n``unicodedata`` module.\n\nIdentifiers are unlimited in length.  Case is significant.\n\n   identifier   ::= xid_start xid_continue*\n   id_start     ::= \n   id_continue  ::= \n   xid_start    ::= \n   xid_continue ::= \n\nThe Unicode category codes mentioned above stand for:\n\n* *Lu* - uppercase letters\n\n* *Ll* - lowercase letters\n\n* *Lt* - titlecase letters\n\n* *Lm* - modifier letters\n\n* *Lo* - other letters\n\n* *Nl* - letter numbers\n\n* *Mn* - nonspacing marks\n\n* *Mc* - spacing combining marks\n\n* *Nd* - decimal numbers\n\n* *Pc* - connector punctuations\n\n* *Other_ID_Start* - explicit list of characters in PropList.txt to\n  support backwards compatibility\n\n* *Other_ID_Continue* - likewise\n\nAll identifiers are converted into the normal form NFKC while parsing;\ncomparison of identifiers is based on NFKC.\n\nA non-normative HTML file listing all valid identifier characters for\nUnicode 4.1 can be found at http://www.dcl.hpi.uni-\npotsdam.de/home/loewis/table-3131.html.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers.  They must\nbe spelled exactly as written here:\n\n   False      class      finally    is         return\n   None       continue   for        lambda     try\n   True       def        from       nonlocal   while\n   and        del        global     not        with\n   as         elif       if         or         yield\n   assert     else       import     pass\n   break      except     in         raise\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings.  These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n   Not imported by ``from module import *``.  The special identifier\n   ``_`` is used in the interactive interpreter to store the result of\n   the last evaluation; it is stored in the ``builtins`` module.  When\n   not in interactive mode, ``_`` has no special meaning and is not\n   defined. See section *The import statement*.\n\n   Note: The name ``_`` is often used in conjunction with\n     internationalization; refer to the documentation for the\n     ``gettext`` module for more information on this convention.\n\n``__*__``\n   System-defined names. These names are defined by the interpreter\n   and its implementation (including the standard library).  Current\n   system names are discussed in the *Special method names* section\n   and elsewhere.  More will likely be defined in future versions of\n   Python.  *Any* use of ``__*__`` names, in any context, that does\n   not follow explicitly documented use, is subject to breakage\n   without warning.\n\n``__*``\n   Class-private names.  Names in this category, when used within the\n   context of a class definition, are re-written to use a mangled form\n   to help avoid name clashes between "private" attributes of base and\n   derived classes. See section *Identifiers (Names)*.\n',
      'if': '\nThe ``if`` statement\n********************\n\nThe ``if`` statement is used for conditional execution:\n\n   if_stmt ::= "if" expression ":" suite\n               ( "elif" expression ":" suite )*\n               ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n',
      'imaginary': '\nImaginary literals\n******************\n\nImaginary literals are described by the following lexical definitions:\n\n   imagnumber ::= (floatnumber | intpart) ("j" | "J")\n\nAn imaginary literal yields a complex number with a real part of 0.0.\nComplex numbers are represented as a pair of floating point numbers\nand have the same restrictions on their range.  To create a complex\nnumber with a nonzero real part, add a floating point number to it,\ne.g., ``(3+4j)``.  Some examples of imaginary literals:\n\n   3.14j   10.j    10j     .001j   1e100j  3.14e-10j\n',
    - 'import': '\nThe ``import`` statement\n************************\n\n   import_stmt     ::= "import" module ["as" name] ( "," module ["as" name] )*\n                   | "from" relative_module "import" identifier ["as" name]\n                   ( "," identifier ["as" name] )*\n                   | "from" relative_module "import" "(" identifier ["as" name]\n                   ( "," identifier ["as" name] )* [","] ")"\n                   | "from" module "import" "*"\n   module          ::= (identifier ".")* identifier\n   relative_module ::= "."* module | "."+\n   name            ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n   the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n  ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n  top level module, the module\'s name is bound in the local namespace\n  as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n  name of the top level package that contains the module is bound in\n  the local namespace as a reference to the top level package. The\n  imported module must be accessed using its full qualified name\n  rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n   initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n   1. check if the imported module has an attribute by that name\n\n   2. if not, attempt to import a submodule with that name and then\n      check the imported module again for that attribute\n\n   3. if the attribute is not found, ``ImportError`` is raised.\n\n   4. otherwise, a reference to that value is bound in the local\n      namespace, using the name in the ``as`` clause if it is present,\n      otherwise using the attribute name\n\nExamples:\n\n   import foo                 # foo imported and bound locally\n   import foo.bar.baz         # foo.bar.baz imported, foo bound locally\n   import foo.bar.baz as fbb  # foo.bar.baz imported and bound as fbb\n   from foo.bar import baz    # foo.bar.baz imported and bound as baz\n   from foo import attr       # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module.  The names given in ``__all__`` are all considered public\nand are required to exist.  If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``).  ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.\nAttempting to use it in class or function definitions will raise a\n``SyntaxError``.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module.  The names given in ``__all__`` are all considered public\nand are required to exist.  If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``).  ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.  The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python.  The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language.  It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n   future_statement ::= "from" "__future__" "import" feature ["as" name]\n                        ("," feature ["as" name])*\n                        | "from" "__future__" "import" "(" feature ["as" name]\n                        ("," feature ["as" name])* [","] ")"\n   feature          ::= identifier\n   name             ::= identifier\n\nA future statement must appear near the top of the module.  The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``.  They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code.  It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently.  Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n   import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement.  This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session.  If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n   **PEP 236** - Back to the __future__\n      The original proposal for the __future__ mechanism.\n',
    + 'import': '\nThe ``import`` statement\n************************\n\n   import_stmt     ::= "import" module ["as" name] ( "," module ["as" name] )*\n                   | "from" relative_module "import" identifier ["as" name]\n                   ( "," identifier ["as" name] )*\n                   | "from" relative_module "import" "(" identifier ["as" name]\n                   ( "," identifier ["as" name] )* [","] ")"\n                   | "from" module "import" "*"\n   module          ::= (identifier ".")* identifier\n   relative_module ::= "."* module | "."+\n   name            ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n   the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n  ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n  top level module, the module\'s name is bound in the local namespace\n  as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n  name of the top level package that contains the module is bound in\n  the local namespace as a reference to the top level package. The\n  imported module must be accessed using its full qualified name\n  rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n   initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n   1. check if the imported module has an attribute by that name\n\n   2. if not, attempt to import a submodule with that name and then\n      check the imported module again for that attribute\n\n   3. if the attribute is not found, ``ImportError`` is raised.\n\n   4. otherwise, a reference to that value is bound in the local\n      namespace, using the name in the ``as`` clause if it is present,\n      otherwise using the attribute name\n\nExamples:\n\n   import foo                 # foo imported and bound locally\n   import foo.bar.baz         # foo.bar.baz imported, foo bound locally\n   import foo.bar.baz as fbb  # foo.bar.baz imported and bound as fbb\n   from foo.bar import baz    # foo.bar.baz imported and bound as baz\n   from foo import attr       # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module.  The names given in ``__all__`` are all considered public\nand are required to exist.  If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``).  ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.  The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python.  The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language.  It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n   future_statement ::= "from" "__future__" "import" feature ["as" name]\n                        ("," feature ["as" name])*\n                        | "from" "__future__" "import" "(" feature ["as" name]\n                        ("," feature ["as" name])* [","] ")"\n   feature          ::= identifier\n   name             ::= identifier\n\nA future statement must appear near the top of the module.  The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``.  They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code.  It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently.  Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n   import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement.  This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session.  If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n   **PEP 236** - Back to the __future__\n      The original proposal for the __future__ mechanism.\n',
      'in': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation.  Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n   comparison    ::= or_expr ( comp_operator or_expr )*\n   comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n                     | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects.  The objects need not have the same type.\nIf both are numbers, they are converted to a common type.  Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes.  You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n  are identical to themselves, ``x is x`` but are not equal to\n  themselves, ``x != x``.  Additionally, comparing any value to a\n  not-a-number value will return ``False``.  For example, both ``3 <\n  float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n  values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n  (the result of the built-in function ``ord()``) of their characters.\n  [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n  corresponding elements.  This means that to compare equal, each\n  element must compare equal and the two sequences must be of the same\n  type and have the same length.\n\n  If not equal, the sequences are ordered the same as their first\n  differing elements.  For example, ``[1,2,x] <= [1,2,y]`` has the\n  same value as ``x <= y``.  If the corresponding element does not\n  exist, the shorter sequence is ordered first (for example, ``[1,2] <\n  [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n  same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n  \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n  superset tests.  Those relations do not define total orderings (the\n  two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n  another, nor supersets of one another).  Accordingly, sets are not\n  appropriate arguments for functions which depend on total ordering.\n  For example, ``min()``, ``max()``, and ``sorted()`` produce\n  undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n  the same object; the choice whether one object is considered smaller\n  or larger than another one is made arbitrarily but consistently\n  within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison.  Most\nnumeric types can be compared with one another.  When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership.  ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise.  ``x\nnot in s`` returns the negation of ``x in s``.  All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*.  An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``.  If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception.  (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object.  ``x is\nnot y`` yields the inverse truth value. [4]\n',
      'integers': '\nInteger literals\n****************\n\nInteger literals are described by the following lexical definitions:\n\n   integer        ::= decimalinteger | octinteger | hexinteger | bininteger\n   decimalinteger ::= nonzerodigit digit* | "0"+\n   nonzerodigit   ::= "1"..."9"\n   digit          ::= "0"..."9"\n   octinteger     ::= "0" ("o" | "O") octdigit+\n   hexinteger     ::= "0" ("x" | "X") hexdigit+\n   bininteger     ::= "0" ("b" | "B") bindigit+\n   octdigit       ::= "0"..."7"\n   hexdigit       ::= digit | "a"..."f" | "A"..."F"\n   bindigit       ::= "0" | "1"\n\nThere is no limit for the length of integer literals apart from what\ncan be stored in available memory.\n\nNote that leading zeros in a non-zero decimal number are not allowed.\nThis is for disambiguation with C-style octal literals, which Python\nused before version 3.0.\n\nSome examples of integer literals:\n\n   7     2147483647                        0o177    0b100110111\n   3     79228162514264337593543950336     0o377    0x100000000\n         79228162514264337593543950336              0xdeadbeef\n',
    - 'lambda': '\nLambdas\n*******\n\n   lambda_form        ::= "lambda" [parameter_list]: expression\n   lambda_form_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda forms (lambda expressions) have the same syntactic position as\nexpressions.  They are a shorthand to create anonymous functions; the\nexpression ``lambda arguments: expression`` yields a function object.\nThe unnamed object behaves like a function object defined with\n\n   def (arguments):\n       return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda forms cannot contain\nstatements or annotations.\n',
    + 'lambda': '\nLambdas\n*******\n\n   lambda_expr        ::= "lambda" [parameter_list]: expression\n   lambda_expr_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda expressions (sometimes called lambda forms) have the same\nsyntactic position as expressions.  They are a shorthand to create\nanonymous functions; the expression ``lambda arguments: expression``\nyields a function object.  The unnamed object behaves like a function\nobject defined with\n\n   def (arguments):\n       return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda expressions cannot contain\nstatements or annotations.\n',
      'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n   list_display ::= "[" [expression_list | comprehension] "]"\n\nA list display yields a new list object, the contents being specified\nby either a list of expressions or a comprehension.  When a comma-\nseparated list of expressions is supplied, its elements are evaluated\nfrom left to right and placed into the list object in that order.\nWhen a comprehension is supplied, the list is constructed from the\nelements resulting from the comprehension.\n',
      'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects.  Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block.  A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block.  The string argument passed\nto the built-in functions ``eval()`` and ``exec()`` is a code block.\n\nA code block is executed in an *execution frame*.  A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block.  If a local\nvariable is defined in a block, its scope includes that block.  If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name.  The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes comprehensions and generator\nexpressions since they are implemented using a function scope.  This\nmeans that the following will fail:\n\n   class A:\n       a = 42\n       b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope.  The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block,\nunless declared as ``nonlocal``.  If a name is bound at the module\nlevel, it is a global variable.  (The variables of the module code\nblock are local and global.)  If a variable is used in a code block\nbut not defined there, it is a *free variable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised.  ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, or\nafter ``as`` in a ``with`` statement or ``except`` clause. The\n``import`` statement of the form ``from ... import *`` binds all names\ndefined in the imported module, except those beginning with an\nunderscore.  This form may only be used at the module level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name).\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block.  This can lead to errors when a name is used within a\nblock before it is bound.  This rule is subtle.  Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block.  The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the ``global`` statement occurs within a block, all uses of the\nname specified in the statement refer to the binding of that name in\nthe top-level namespace.  Names are resolved in the top-level\nnamespace by searching the global namespace, i.e. the namespace of the\nmodule containing the code block, and the builtins namespace, the\nnamespace of the module ``builtins``.  The global namespace is\nsearched first.  If the name is not found there, the builtins\nnamespace is searched.  The global statement must precede all uses of\nthe name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used).  By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``builtins``; when in any other module, ``__builtins__`` is an alias\nfor the dictionary of the ``builtins`` module itself.\n``__builtins__`` can be set to a user-created dictionary to create a\nweak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail.  Users\nwanting to override values in the builtins namespace should ``import``\nthe ``builtins`` module and modify its attributes appropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported.  The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block.  If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class.  Names defined at the class scope are not visible in\nmethods.\n\n\nInteraction with dynamic features\n=================================\n\nThere are several cases where Python statements are illegal when used\nin conjunction with nested scopes that contain free variables.\n\nIf a variable is referenced in an enclosing scope, it is illegal to\ndelete the name.  An error will be reported at compile time.\n\nIf the wild card form of import --- ``import *`` --- is used in a\nfunction and the function contains or is a nested block with free\nvariables, the compiler will raise a ``SyntaxError``.\n\nThe ``eval()`` and ``exec()`` functions do not have access to the full\nenvironment for resolving names.  Names may be resolved in the local\nand global namespaces of the caller.  Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace.  [1]\nThe ``exec()`` and ``eval()`` functions have optional arguments to\noverride the global and local namespace.  If only one namespace is\nspecified, it is used for both.\n",
      'nonlocal': '\nThe ``nonlocal`` statement\n**************************\n\n   nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n\nThe ``nonlocal`` statement causes the listed identifiers to refer to\npreviously bound variables in the nearest enclosing scope.  This is\nimportant because the default behavior for binding is to search the\nlocal namespace first.  The statement allows encapsulated code to\nrebind variables outside of the local scope besides the global\n(module) scope.\n\nNames listed in a ``nonlocal`` statement, unlike to those listed in a\n``global`` statement, must refer to pre-existing bindings in an\nenclosing scope (the scope in which a new binding should be created\ncannot be determined unambiguously).\n\nNames listed in a ``nonlocal`` statement must not collide with pre-\nexisting bindings in the local scope.\n\nSee also:\n\n   **PEP 3104** - Access to Names in Outer Scopes\n      The specification for the ``nonlocal`` statement.\n',
      'numbers': "\nNumeric literals\n****************\n\nThere are three types of numeric literals: integers, floating point\nnumbers, and imaginary numbers.  There are no complex literals\n(complex numbers can be formed by adding a real number and an\nimaginary number).\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator '``-``' and\nthe literal ``1``.\n",
      'numeric-types': "\nEmulating numeric types\n***********************\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``).  For instance, to evaluate the expression ``x + y``, where\n   *x* is an instance of a class that has an ``__add__()`` method,\n   ``x.__add__(y)`` is called.  The ``__divmod__()`` method should be\n   the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n   should not be related to ``__truediv__()``.  Note that\n   ``__pow__()`` should be defined to accept an optional third\n   argument if the ternary version of the built-in ``pow()`` function\n   is to be supported.\n\n   If one of those methods does not support the operation with the\n   supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``) with reflected (swapped) operands. These functions are only\n   called if the left operand does not support the corresponding\n   operation and the operands are of different types. [2]  For\n   instance, to evaluate the expression ``x - y``, where *y* is an\n   instance of a class that has an ``__rsub__()`` method,\n   ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n   *NotImplemented*.\n\n   Note that ternary ``pow()`` will not try calling ``__rpow__()``\n   (the coercion rules would become too complicated).\n\n   Note: If the right operand's type is a subclass of the left operand's\n     type and that subclass provides the reflected method for the\n     operation, this method will be called before the left operand's\n     non-reflected method.  This behavior allows subclasses to\n     override their ancestors' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n   These methods are called to implement the augmented arithmetic\n   assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n   ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``).  These methods\n   should attempt to do the operation in-place (modifying *self*) and\n   return the result (which could be, but does not have to be,\n   *self*).  If a specific method is not defined, the augmented\n   assignment falls back to the normal methods.  For instance, to\n   execute the statement ``x += y``, where *x* is an instance of a\n   class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n   called.  If *x* is an instance of a class that does not define a\n   ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n   considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n   Called to implement the unary arithmetic operations (``-``, ``+``,\n   ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n   Called to implement the built-in functions ``complex()``,\n   ``int()``, ``float()`` and ``round()``.  Should return a value of\n   the appropriate type.\n\nobject.__index__(self)\n\n   Called to implement ``operator.index()``.  Also called whenever\n   Python needs an integer object (such as in slicing, or in the\n   built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n   an integer.\n",
      'objects': '\nObjects, values and types\n*************************\n\n*Objects* are Python\'s abstraction for data.  All data in a Python\nprogram is represented by objects or by relations between objects. (In\na sense, and in conformance to Von Neumann\'s model of a "stored\nprogram computer," code is also represented by objects.)\n\nEvery object has an identity, a type and a value.  An object\'s\n*identity* never changes once it has been created; you may think of it\nas the object\'s address in memory.  The \'``is``\' operator compares the\nidentity of two objects; the ``id()`` function returns an integer\nrepresenting its identity.\n\n**CPython implementation detail:** For CPython, ``id(x)`` is the\nmemory address where ``x`` is stored.\n\nAn object\'s type determines the operations that the object supports\n(e.g., "does it have a length?") and also defines the possible values\nfor objects of that type.  The ``type()`` function returns an object\'s\ntype (which is an object itself).  Like its identity, an object\'s\n*type* is also unchangeable. [1]\n\nThe *value* of some objects can change.  Objects whose value can\nchange are said to be *mutable*; objects whose value is unchangeable\nonce they are created are called *immutable*. (The value of an\nimmutable container object that contains a reference to a mutable\nobject can change when the latter\'s value is changed; however the\ncontainer is still considered immutable, because the collection of\nobjects it contains cannot be changed.  So, immutability is not\nstrictly the same as having an unchangeable value, it is more subtle.)\nAn object\'s mutability is determined by its type; for instance,\nnumbers, strings and tuples are immutable, while dictionaries and\nlists are mutable.\n\nObjects are never explicitly destroyed; however, when they become\nunreachable they may be garbage-collected.  An implementation is\nallowed to postpone garbage collection or omit it altogether --- it is\na matter of implementation quality how garbage collection is\nimplemented, as long as no objects are collected that are still\nreachable.\n\n**CPython implementation detail:** CPython currently uses a reference-\ncounting scheme with (optional) delayed detection of cyclically linked\ngarbage, which collects most objects as soon as they become\nunreachable, but is not guaranteed to collect garbage containing\ncircular references.  See the documentation of the ``gc`` module for\ninformation on controlling the collection of cyclic garbage. Other\nimplementations act differently and CPython may change. Do not depend\non immediate finalization of objects when they become unreachable (ex:\nalways close files).\n\nNote that the use of the implementation\'s tracing or debugging\nfacilities may keep objects alive that would normally be collectable.\nAlso note that catching an exception with a \'``try``...``except``\'\nstatement may keep objects alive.\n\nSome objects contain references to "external" resources such as open\nfiles or windows.  It is understood that these resources are freed\nwhen the object is garbage-collected, but since garbage collection is\nnot guaranteed to happen, such objects also provide an explicit way to\nrelease the external resource, usually a ``close()`` method. Programs\nare strongly recommended to explicitly close such objects.  The\n\'``try``...``finally``\' statement and the \'``with``\' statement provide\nconvenient ways to do this.\n\nSome objects contain references to other objects; these are called\n*containers*. Examples of containers are tuples, lists and\ndictionaries.  The references are part of a container\'s value.  In\nmost cases, when we talk about the value of a container, we imply the\nvalues, not the identities of the contained objects; however, when we\ntalk about the mutability of a container, only the identities of the\nimmediately contained objects are implied.  So, if an immutable\ncontainer (like a tuple) contains a reference to a mutable object, its\nvalue changes if that mutable object is changed.\n\nTypes affect almost all aspects of object behavior.  Even the\nimportance of object identity is affected in some sense: for immutable\ntypes, operations that compute new values may actually return a\nreference to any existing object with the same type and value, while\nfor mutable objects this is not allowed.  E.g., after ``a = 1; b =\n1``, ``a`` and ``b`` may or may not refer to the same object with the\nvalue one, depending on the implementation, but after ``c = []; d =\n[]``, ``c`` and ``d`` are guaranteed to refer to two different,\nunique, newly created empty lists. (Note that ``c = d = []`` assigns\nthe same object to both ``c`` and ``d``.)\n',
    - 'operator-summary': '\nOperator precedence\n*******************\n\nThe following table summarizes the operator precedences in Python,\nfrom lowest precedence (least binding) to highest precedence (most\nbinding).  Operators in the same box have the same precedence.  Unless\nthe syntax is explicitly given, operators are binary.  Operators in\nthe same box group left to right (except for comparisons, including\ntests, which all have the same precedence and chain from left to right\n--- see section *Comparisons* --- and exponentiation, which groups\nfrom right to left).\n\n+-------------------------------------------------+---------------------------------------+\n| Operator                                        | Description                           |\n+=================================================+=======================================+\n| ``lambda``                                      | Lambda expression                     |\n+-------------------------------------------------+---------------------------------------+\n| ``if`` -- ``else``                              | Conditional expression                |\n+-------------------------------------------------+---------------------------------------+\n| ``or``                                          | Boolean OR                            |\n+-------------------------------------------------+---------------------------------------+\n| ``and``                                         | Boolean AND                           |\n+-------------------------------------------------+---------------------------------------+\n| ``not`` ``x``                                   | Boolean NOT                           |\n+-------------------------------------------------+---------------------------------------+\n| ``in``, ``not in``, ``is``, ``is not``, ``<``,  | Comparisons, including membership     |\n| ``<=``, ``>``, ``>=``, ``!=``, ``==``           | tests and identity tests,             |\n+-------------------------------------------------+---------------------------------------+\n| ``|``                                           | Bitwise OR                            |\n+-------------------------------------------------+---------------------------------------+\n| ``^``                                           | Bitwise XOR                           |\n+-------------------------------------------------+---------------------------------------+\n| ``&``                                           | Bitwise AND                           |\n+-------------------------------------------------+---------------------------------------+\n| ``<<``, ``>>``                                  | Shifts                                |\n+-------------------------------------------------+---------------------------------------+\n| ``+``, ``-``                                    | Addition and subtraction              |\n+-------------------------------------------------+---------------------------------------+\n| ``*``, ``/``, ``//``, ``%``                     | Multiplication, division, remainder   |\n|                                                 | [5]                                   |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x``                          | Positive, negative, bitwise NOT       |\n+-------------------------------------------------+---------------------------------------+\n| ``**``                                          | Exponentiation [6]                    |\n+-------------------------------------------------+---------------------------------------+\n| ``x[index]``, ``x[index:index]``,               | Subscription, slicing, call,          |\n| ``x(arguments...)``, ``x.attribute``            | attribute reference                   |\n+-------------------------------------------------+---------------------------------------+\n| ``(expressions...)``, ``[expressions...]``,     | Binding or tuple display, list        |\n| ``{key: value...}``, ``{expressions...}``       | display, dictionary display, set      |\n|                                                 | display                               |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While ``abs(x%y) < abs(y)`` is true mathematically, for floats it\n    may not be true numerically due to roundoff.  For example, and\n    assuming a platform on which a Python float is an IEEE 754 double-\n    precision number, in order that ``-1e-100 % 1e100`` have the same\n    sign as ``1e100``, the computed result is ``-1e-100 + 1e100``,\n    which is numerically exactly equal to ``1e100``.  The function\n    ``math.fmod()`` returns a result whose sign matches the sign of\n    the first argument instead, and so returns ``-1e-100`` in this\n    case. Which approach is more appropriate depends on the\n    application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n    possible for ``x//y`` to be one larger than ``(x-x%y)//y`` due to\n    rounding.  In such cases, Python returns the latter result, in\n    order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n    close to ``x``.\n\n[3] While comparisons between strings make sense at the byte level,\n    they may be counter-intuitive to users.  For example, the strings\n    ``"\\u00C7"`` and ``"\\u0327\\u0043"`` compare differently, even\n    though they both represent the same unicode character (LATIN\n    CAPITAL LETTER C WITH CEDILLA).  To compare strings in a human\n    recognizable way, compare using ``unicodedata.normalize()``.\n\n[4] Due to automatic garbage-collection, free lists, and the dynamic\n    nature of descriptors, you may notice seemingly unusual behaviour\n    in certain uses of the ``is`` operator, like those involving\n    comparisons between instance methods, or constants.  Check their\n    documentation for more info.\n\n[5] The ``%`` operator is also used for string formatting; the same\n    precedence applies.\n\n[6] The power operator ``**`` binds less tightly than an arithmetic or\n    bitwise unary operator on its right, that is, ``2**-1`` is\n    ``0.5``.\n',
    + 'operator-summary': '\nOperator precedence\n*******************\n\nThe following table summarizes the operator precedences in Python,\nfrom lowest precedence (least binding) to highest precedence (most\nbinding).  Operators in the same box have the same precedence.  Unless\nthe syntax is explicitly given, operators are binary.  Operators in\nthe same box group left to right (except for comparisons, including\ntests, which all have the same precedence and chain from left to right\n--- see section *Comparisons* --- and exponentiation, which groups\nfrom right to left).\n\n+-------------------------------------------------+---------------------------------------+\n| Operator                                        | Description                           |\n+=================================================+=======================================+\n| ``lambda``                                      | Lambda expression                     |\n+-------------------------------------------------+---------------------------------------+\n| ``if`` -- ``else``                              | Conditional expression                |\n+-------------------------------------------------+---------------------------------------+\n| ``or``                                          | Boolean OR                            |\n+-------------------------------------------------+---------------------------------------+\n| ``and``                                         | Boolean AND                           |\n+-------------------------------------------------+---------------------------------------+\n| ``not`` ``x``                                   | Boolean NOT                           |\n+-------------------------------------------------+---------------------------------------+\n| ``in``, ``not in``, ``is``, ``is not``, ``<``,  | Comparisons, including membership     |\n| ``<=``, ``>``, ``>=``, ``!=``, ``==``           | tests and identity tests              |\n+-------------------------------------------------+---------------------------------------+\n| ``|``                                           | Bitwise OR                            |\n+-------------------------------------------------+---------------------------------------+\n| ``^``                                           | Bitwise XOR                           |\n+-------------------------------------------------+---------------------------------------+\n| ``&``                                           | Bitwise AND                           |\n+-------------------------------------------------+---------------------------------------+\n| ``<<``, ``>>``                                  | Shifts                                |\n+-------------------------------------------------+---------------------------------------+\n| ``+``, ``-``                                    | Addition and subtraction              |\n+-------------------------------------------------+---------------------------------------+\n| ``*``, ``/``, ``//``, ``%``                     | Multiplication, division, remainder   |\n|                                                 | [5]                                   |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x``                          | Positive, negative, bitwise NOT       |\n+-------------------------------------------------+---------------------------------------+\n| ``**``                                          | Exponentiation [6]                    |\n+-------------------------------------------------+---------------------------------------+\n| ``x[index]``, ``x[index:index]``,               | Subscription, slicing, call,          |\n| ``x(arguments...)``, ``x.attribute``            | attribute reference                   |\n+-------------------------------------------------+---------------------------------------+\n| ``(expressions...)``, ``[expressions...]``,     | Binding or tuple display, list        |\n| ``{key: value...}``, ``{expressions...}``       | display, dictionary display, set      |\n|                                                 | display                               |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While ``abs(x%y) < abs(y)`` is true mathematically, for floats it\n    may not be true numerically due to roundoff.  For example, and\n    assuming a platform on which a Python float is an IEEE 754 double-\n    precision number, in order that ``-1e-100 % 1e100`` have the same\n    sign as ``1e100``, the computed result is ``-1e-100 + 1e100``,\n    which is numerically exactly equal to ``1e100``.  The function\n    ``math.fmod()`` returns a result whose sign matches the sign of\n    the first argument instead, and so returns ``-1e-100`` in this\n    case. Which approach is more appropriate depends on the\n    application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n    possible for ``x//y`` to be one larger than ``(x-x%y)//y`` due to\n    rounding.  In such cases, Python returns the latter result, in\n    order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n    close to ``x``.\n\n[3] While comparisons between strings make sense at the byte level,\n    they may be counter-intuitive to users.  For example, the strings\n    ``"\\u00C7"`` and ``"\\u0327\\u0043"`` compare differently, even\n    though they both represent the same unicode character (LATIN\n    CAPITAL LETTER C WITH CEDILLA).  To compare strings in a human\n    recognizable way, compare using ``unicodedata.normalize()``.\n\n[4] Due to automatic garbage-collection, free lists, and the dynamic\n    nature of descriptors, you may notice seemingly unusual behaviour\n    in certain uses of the ``is`` operator, like those involving\n    comparisons between instance methods, or constants.  Check their\n    documentation for more info.\n\n[5] The ``%`` operator is also used for string formatting; the same\n    precedence applies.\n\n[6] The power operator ``**`` binds less tightly than an arithmetic or\n    bitwise unary operator on its right, that is, ``2**-1`` is\n    ``0.5``.\n',
      'pass': '\nThe ``pass`` statement\n**********************\n\n   pass_stmt ::= "pass"\n\n``pass`` is a null operation --- when it is executed, nothing happens.\nIt is useful as a placeholder when a statement is required\nsyntactically, but no code needs to be executed, for example:\n\n   def f(arg): pass    # a function that does nothing (yet)\n\n   class C: pass       # a class with no methods (yet)\n',
      'power': '\nThe power operator\n******************\n\nThe power operator binds more tightly than unary operators on its\nleft; it binds less tightly than unary operators on its right.  The\nsyntax is:\n\n   power ::= primary ["**" u_expr]\n\nThus, in an unparenthesized sequence of power and unary operators, the\noperators are evaluated from right to left (this does not constrain\nthe evaluation order for the operands): ``-1**2`` results in ``-1``.\n\nThe power operator has the same semantics as the built-in ``pow()``\nfunction, when called with two arguments: it yields its left argument\nraised to the power of its right argument.  The numeric arguments are\nfirst converted to a common type, and the result is of that type.\n\nFor int operands, the result has the same type as the operands unless\nthe second argument is negative; in that case, all arguments are\nconverted to float and a float result is delivered. For example,\n``10**2`` returns ``100``, but ``10**-2`` returns ``0.01``.\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``complex`` number. (In earlier versions it raised a\n``ValueError``.)\n',
      'raise': '\nThe ``raise`` statement\n***********************\n\n   raise_stmt ::= "raise" [expression ["from" expression]]\n\nIf no expressions are present, ``raise`` re-raises the last exception\nthat was active in the current scope.  If no exception is active in\nthe current scope, a ``RuntimeError`` exception is raised indicating\nthat this is an error.\n\nOtherwise, ``raise`` evaluates the first expression as the exception\nobject.  It must be either a subclass or an instance of\n``BaseException``. If it is a class, the exception instance will be\nobtained when needed by instantiating the class with no arguments.\n\nThe *type* of the exception is the exception instance\'s class, the\n*value* is the instance itself.\n\nA traceback object is normally created automatically when an exception\nis raised and attached to it as the ``__traceback__`` attribute, which\nis writable. You can create an exception and set your own traceback in\none step using the ``with_traceback()`` exception method (which\nreturns the same exception instance, with its traceback set to its\nargument), like so:\n\n   raise Exception("foo occurred").with_traceback(tracebackobj)\n\nThe ``from`` clause is used for exception chaining: if given, the\nsecond *expression* must be another exception class or instance, which\nwill then be attached to the raised exception as the ``__cause__``\nattribute (which is writable).  If the raised exception is not\nhandled, both exceptions will be printed:\n\n   >>> try:\n   ...     print(1 / 0)\n   ... except Exception as exc:\n   ...     raise RuntimeError("Something bad happened") from exc\n   ...\n   Traceback (most recent call last):\n     File "", line 2, in \n   ZeroDivisionError: int division or modulo by zero\n\n   The above exception was the direct cause of the following exception:\n\n   Traceback (most recent call last):\n     File "", line 4, in \n   RuntimeError: Something bad happened\n\nA similar mechanism works implicitly if an exception is raised inside\nan exception handler: the previous exception is then attached as the\nnew exception\'s ``__context__`` attribute:\n\n   >>> try:\n   ...     print(1 / 0)\n   ... except:\n   ...     raise RuntimeError("Something bad happened")\n   ...\n   Traceback (most recent call last):\n     File "", line 2, in \n   ZeroDivisionError: int division or modulo by zero\n\n   During handling of the above exception, another exception occurred:\n\n   Traceback (most recent call last):\n     File "", line 4, in \n   RuntimeError: Something bad happened\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information about handling exceptions is in section\n*The try statement*.\n',
      'return': '\nThe ``return`` statement\n************************\n\n   return_stmt ::= "return" [expression_list]\n\n``return`` may only occur syntactically nested in a function\ndefinition, not within a nested class definition.\n\nIf an expression list is present, it is evaluated, else ``None`` is\nsubstituted.\n\n``return`` leaves the current function call with the expression list\n(or ``None``) as return value.\n\nWhen ``return`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the function.\n\nIn a generator function, the ``return`` statement indicates that the\ngenerator is done and will cause ``StopIteration`` to be raised. The\nreturned value (if any) is used as an argument to construct\n``StopIteration`` and becomes the ``StopIteration.value`` attribute.\n',
      'sequence-types': "\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well.  The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items.  It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python's standard\ndictionary objects.  The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects.  Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators.  It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping's keys; for\nsequences, it should search through the values.  It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n   Called to implement the built-in function ``len()``.  Should return\n   the length of the object, an integer ``>=`` 0.  Also, an object\n   that doesn't define a ``__bool__()`` method and whose ``__len__()``\n   method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods.  A\n  call like\n\n     a[1:2] = b\n\n  is translated to\n\n     a[slice(1, 2, None)] = b\n\n  and so forth.  Missing slice items are always filled in with\n  ``None``.\n\nobject.__getitem__(self, key)\n\n   Called to implement evaluation of ``self[key]``. For sequence\n   types, the accepted keys should be integers and slice objects.\n   Note that the special interpretation of negative indexes (if the\n   class wishes to emulate a sequence type) is up to the\n   ``__getitem__()`` method. If *key* is of an inappropriate type,\n   ``TypeError`` may be raised; if of a value outside the set of\n   indexes for the sequence (after any special interpretation of\n   negative values), ``IndexError`` should be raised. For mapping\n   types, if *key* is missing (not in the container), ``KeyError``\n   should be raised.\n\n   Note: ``for`` loops expect that an ``IndexError`` will be raised for\n     illegal indexes to allow proper detection of the end of the\n     sequence.\n\nobject.__setitem__(self, key, value)\n\n   Called to implement assignment to ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support changes to the values for keys, or if new keys\n   can be added, or for sequences if elements can be replaced.  The\n   same exceptions should be raised for improper *key* values as for\n   the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n   Called to implement deletion of ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support removal of keys, or for sequences if elements\n   can be removed from the sequence.  The same exceptions should be\n   raised for improper *key* values as for the ``__getitem__()``\n   method.\n\nobject.__iter__(self)\n\n   This method is called when an iterator is required for a container.\n   This method should return a new iterator object that can iterate\n   over all the objects in the container.  For mappings, it should\n   iterate over the keys of the container, and should also be made\n   available as the method ``keys()``.\n\n   Iterator objects also need to implement this method; they are\n   required to return themselves.  For more information on iterator\n   objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n   Called (if present) by the ``reversed()`` built-in to implement\n   reverse iteration.  It should return a new iterator object that\n   iterates over all the objects in the container in reverse order.\n\n   If the ``__reversed__()`` method is not provided, the\n   ``reversed()`` built-in will fall back to using the sequence\n   protocol (``__len__()`` and ``__getitem__()``).  Objects that\n   support the sequence protocol should only provide\n   ``__reversed__()`` if they can provide an implementation that is\n   more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence.  However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n   Called to implement membership test operators.  Should return true\n   if *item* is in *self*, false otherwise.  For mapping objects, this\n   should consider the keys of the mapping rather than the values or\n   the key-item pairs.\n\n   For objects that don't define ``__contains__()``, the membership\n   test first tries iteration via ``__iter__()``, then the old\n   sequence iteration protocol via ``__getitem__()``, see *this\n   section in the language reference*.\n",
    - 'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n   shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments.  They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as division by ``pow(2,n)``.  A\nleft shift by *n* bits is defined as multiplication with ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n  be at most ``sys.maxsize``.  If the right-hand operand is larger\n  than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n',
    + 'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n   shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments.  They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as floor division by\n``pow(2,n)``.  A left shift by *n* bits is defined as multiplication\nwith ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n  be at most ``sys.maxsize``.  If the right-hand operand is larger\n  than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n',
      'slicings': '\nSlicings\n********\n\nA slicing selects a range of items in a sequence object (e.g., a\nstring, tuple or list).  Slicings may be used as expressions or as\ntargets in assignment or ``del`` statements.  The syntax for a\nslicing:\n\n   slicing      ::= primary "[" slice_list "]"\n   slice_list   ::= slice_item ("," slice_item)* [","]\n   slice_item   ::= expression | proper_slice\n   proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]\n   lower_bound  ::= expression\n   upper_bound  ::= expression\n   stride       ::= expression\n\nThere is ambiguity in the formal syntax here: anything that looks like\nan expression list also looks like a slice list, so any subscription\ncan be interpreted as a slicing.  Rather than further complicating the\nsyntax, this is disambiguated by defining that in this case the\ninterpretation as a subscription takes priority over the\ninterpretation as a slicing (this is the case if the slice list\ncontains no proper slice).\n\nThe semantics for a slicing are as follows.  The primary must evaluate\nto a mapping object, and it is indexed (using the same\n``__getitem__()`` method as normal subscription) with a key that is\nconstructed from the slice list, as follows.  If the slice list\ncontains at least one comma, the key is a tuple containing the\nconversion of the slice items; otherwise, the conversion of the lone\nslice item is the key.  The conversion of a slice item that is an\nexpression is that expression.  The conversion of a proper slice is a\nslice object (see section *The standard type hierarchy*) whose\n``start``, ``stop`` and ``step`` attributes are the values of the\nexpressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n',
      'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant.  Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n   A dictionary or other mapping object used to store an object\'s\n   (writable) attributes.\n\ninstance.__class__\n\n   The class to which a class instance belongs.\n\nclass.__bases__\n\n   The tuple of base classes of a class object.\n\nclass.__name__\n\n   The name of the class or type.\n\nclass.__qualname__\n\n   The *qualified name* of the class or type.\n\n   New in version 3.3.\n\nclass.__mro__\n\n   This attribute is a tuple of classes that are considered when\n   looking for base classes during method resolution.\n\nclass.mro()\n\n   This method can be overridden by a metaclass to customize the\n   method resolution order for its instances.  It is called at class\n   instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n   Each class keeps a list of weak references to its immediate\n   subclasses.  This method returns a list of all those references\n   still alive. Example:\n\n      >>> int.__subclasses__()\n      []\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n    the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n    ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n    operands.\n\n[4] Cased characters are those with general category property being\n    one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n    (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n    tuple whose only element is the tuple to be formatted.\n',
    - 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators.  For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``.  Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled.  For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense.  (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n   Called to create a new instance of class *cls*.  ``__new__()`` is a\n   static method (special-cased so you need not declare it as such)\n   that takes the class of which an instance was requested as its\n   first argument.  The remaining arguments are those passed to the\n   object constructor expression (the call to the class).  The return\n   value of ``__new__()`` should be the new object instance (usually\n   an instance of *cls*).\n\n   Typical implementations create a new instance of the class by\n   invoking the superclass\'s ``__new__()`` method using\n   ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n   arguments and then modifying the newly-created instance as\n   necessary before returning it.\n\n   If ``__new__()`` returns an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will be invoked like\n   ``__init__(self[, ...])``, where *self* is the new instance and the\n   remaining arguments are the same as were passed to ``__new__()``.\n\n   If ``__new__()`` does not return an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will not be invoked.\n\n   ``__new__()`` is intended mainly to allow subclasses of immutable\n   types (like int, str, or tuple) to customize instance creation.  It\n   is also commonly overridden in custom metaclasses in order to\n   customize class creation.\n\nobject.__init__(self[, ...])\n\n   Called when the instance is created.  The arguments are those\n   passed to the class constructor expression.  If a base class has an\n   ``__init__()`` method, the derived class\'s ``__init__()`` method,\n   if any, must explicitly call it to ensure proper initialization of\n   the base class part of the instance; for example:\n   ``BaseClass.__init__(self, [args...])``.  As a special constraint\n   on constructors, no value may be returned; doing so will cause a\n   ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n   Called when the instance is about to be destroyed.  This is also\n   called a destructor.  If a base class has a ``__del__()`` method,\n   the derived class\'s ``__del__()`` method, if any, must explicitly\n   call it to ensure proper deletion of the base class part of the\n   instance.  Note that it is possible (though not recommended!) for\n   the ``__del__()`` method to postpone destruction of the instance by\n   creating a new reference to it.  It may then be called at a later\n   time when this new reference is deleted.  It is not guaranteed that\n   ``__del__()`` methods are called for objects that still exist when\n   the interpreter exits.\n\n   Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n     decrements the reference count for ``x`` by one, and the latter\n     is only called when ``x``\'s reference count reaches zero.  Some\n     common situations that may prevent the reference count of an\n     object from going to zero include: circular references between\n     objects (e.g., a doubly-linked list or a tree data structure with\n     parent and child pointers); a reference to the object on the\n     stack frame of a function that caught an exception (the traceback\n     stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n     a reference to the object on the stack frame that raised an\n     unhandled exception in interactive mode (the traceback stored in\n     ``sys.last_traceback`` keeps the stack frame alive).  The first\n     situation can only be remedied by explicitly breaking the cycles;\n     the latter two situations can be resolved by storing ``None`` in\n     ``sys.last_traceback``. Circular references which are garbage are\n     detected when the option cycle detector is enabled (it\'s on by\n     default), but can only be cleaned up if there are no Python-\n     level ``__del__()`` methods involved. Refer to the documentation\n     for the ``gc`` module for more information about how\n     ``__del__()`` methods are handled by the cycle detector,\n     particularly the description of the ``garbage`` value.\n\n   Warning: Due to the precarious circumstances under which ``__del__()``\n     methods are invoked, exceptions that occur during their execution\n     are ignored, and a warning is printed to ``sys.stderr`` instead.\n     Also, when ``__del__()`` is invoked in response to a module being\n     deleted (e.g., when execution of the program is done), other\n     globals referenced by the ``__del__()`` method may already have\n     been deleted or in the process of being torn down (e.g. the\n     import machinery shutting down).  For this reason, ``__del__()``\n     methods should do the absolute minimum needed to maintain\n     external invariants.  Starting with version 1.5, Python\n     guarantees that globals whose name begins with a single\n     underscore are deleted from their module before other globals are\n     deleted; if no other references to such globals exist, this may\n     help in assuring that imported modules are still available at the\n     time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n   Called by the ``repr()`` built-in function to compute the\n   "official" string representation of an object.  If at all possible,\n   this should look like a valid Python expression that could be used\n   to recreate an object with the same value (given an appropriate\n   environment).  If this is not possible, a string of the form\n   ``<...some useful description...>`` should be returned. The return\n   value must be a string object. If a class defines ``__repr__()``\n   but not ``__str__()``, then ``__repr__()`` is also used when an\n   "informal" string representation of instances of that class is\n   required.\n\n   This is typically used for debugging, so it is important that the\n   representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n   Called by ``str(object)`` and the built-in functions ``format()``\n   and ``print()`` to compute the "informal" or nicely printable\n   string representation of an object.  The return value must be a\n   *string* object.\n\n   This method differs from ``object.__repr__()`` in that there is no\n   expectation that ``__str__()`` return a valid Python expression: a\n   more convenient or concise representation can be used.\n\n   The default implementation defined by the built-in type ``object``\n   calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n   Called by ``bytes()`` to compute a byte-string representation of an\n   object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n   Called by the ``format()`` built-in function (and by extension, the\n   ``str.format()`` method of class ``str``) to produce a "formatted"\n   string representation of an object. The ``format_spec`` argument is\n   a string that contains a description of the formatting options\n   desired. The interpretation of the ``format_spec`` argument is up\n   to the type implementing ``__format__()``, however most classes\n   will either delegate formatting to one of the built-in types, or\n   use a similar formatting option syntax.\n\n   See *Format Specification Mini-Language* for a description of the\n   standard formatting syntax.\n\n   The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n   These are the so-called "rich comparison" methods. The\n   correspondence between operator symbols and method names is as\n   follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n   ``x.__ge__(y)``.\n\n   A rich comparison method may return the singleton\n   ``NotImplemented`` if it does not implement the operation for a\n   given pair of arguments. By convention, ``False`` and ``True`` are\n   returned for a successful comparison. However, these methods can\n   return any value, so if the comparison operator is used in a\n   Boolean context (e.g., in the condition of an ``if`` statement),\n   Python will call ``bool()`` on the value to determine if the result\n   is true or false.\n\n   There are no implied relationships among the comparison operators.\n   The truth of ``x==y`` does not imply that ``x!=y`` is false.\n   Accordingly, when defining ``__eq__()``, one should also define\n   ``__ne__()`` so that the operators will behave as expected.  See\n   the paragraph on ``__hash__()`` for some important notes on\n   creating *hashable* objects which support custom comparison\n   operations and are usable as dictionary keys.\n\n   There are no swapped-argument versions of these methods (to be used\n   when the left argument does not support the operation but the right\n   argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n   other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n   reflection, and ``__eq__()`` and ``__ne__()`` are their own\n   reflection.\n\n   Arguments to rich comparison methods are never coerced.\n\n   To automatically generate ordering operations from a single root\n   operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n   Called by built-in function ``hash()`` and for operations on\n   members of hashed collections including ``set``, ``frozenset``, and\n   ``dict``.  ``__hash__()`` should return an integer.  The only\n   required property is that objects which compare equal have the same\n   hash value; it is advised to somehow mix together (e.g. using\n   exclusive or) the hash values for the components of the object that\n   also play a part in comparison of objects.\n\n   If a class does not define an ``__eq__()`` method it should not\n   define a ``__hash__()`` operation either; if it defines\n   ``__eq__()`` but not ``__hash__()``, its instances will not be\n   usable as items in hashable collections.  If a class defines\n   mutable objects and implements an ``__eq__()`` method, it should\n   not implement ``__hash__()``, since the implementation of hashable\n   collections requires that a key\'s hash value is immutable (if the\n   object\'s hash value changes, it will be in the wrong hash bucket).\n\n   User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n   by default; with them, all objects compare unequal (except with\n   themselves) and ``x.__hash__()`` returns an appropriate value such\n   that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n   hash(y)``.\n\n   A class that overrides ``__eq__()`` and does not define\n   ``__hash__()`` will have its ``__hash__()`` implicitly set to\n   ``None``.  When the ``__hash__()`` method of a class is ``None``,\n   instances of the class will raise an appropriate ``TypeError`` when\n   a program attempts to retrieve their hash value, and will also be\n   correctly identified as unhashable when checking ``isinstance(obj,\n   collections.Hashable``).\n\n   If a class that overrides ``__eq__()`` needs to retain the\n   implementation of ``__hash__()`` from a parent class, the\n   interpreter must be told this explicitly by setting ``__hash__ =\n   .__hash__``.\n\n   If a class that does not override ``__eq__()`` wishes to suppress\n   hash support, it should include ``__hash__ = None`` in the class\n   definition. A class which defines its own ``__hash__()`` that\n   explicitly raises a ``TypeError`` would be incorrectly identified\n   as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n   Note: By default, the ``__hash__()`` values of str, bytes and datetime\n     objects are "salted" with an unpredictable random value.\n     Although they remain constant within an individual Python\n     process, they are not predictable between repeated invocations of\n     Python.This is intended to provide protection against a denial-\n     of-service caused by carefully-chosen inputs that exploit the\n     worst case performance of a dict insertion, O(n^2) complexity.\n     See http://www.ocert.org/advisories/ocert-2011-003.html for\n     details.Changing hash values affects the iteration order of\n     dicts, sets and other mappings.  Python has never made guarantees\n     about this ordering (and it typically varies between 32-bit and\n     64-bit builds).See also ``PYTHONHASHSEED``.\n\n   Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n   Called to implement truth value testing and the built-in operation\n   ``bool()``; should return ``False`` or ``True``.  When this method\n   is not defined, ``__len__()`` is called, if it is defined, and the\n   object is considered true if its result is nonzero.  If a class\n   defines neither ``__len__()`` nor ``__bool__()``, all its instances\n   are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n   Called when an attribute lookup has not found the attribute in the\n   usual places (i.e. it is not an instance attribute nor is it found\n   in the class tree for ``self``).  ``name`` is the attribute name.\n   This method should return the (computed) attribute value or raise\n   an ``AttributeError`` exception.\n\n   Note that if the attribute is found through the normal mechanism,\n   ``__getattr__()`` is not called.  (This is an intentional asymmetry\n   between ``__getattr__()`` and ``__setattr__()``.) This is done both\n   for efficiency reasons and because otherwise ``__getattr__()``\n   would have no way to access other attributes of the instance.  Note\n   that at least for instance variables, you can fake total control by\n   not inserting any values in the instance attribute dictionary (but\n   instead inserting them in another object).  See the\n   ``__getattribute__()`` method below for a way to actually get total\n   control over attribute access.\n\nobject.__getattribute__(self, name)\n\n   Called unconditionally to implement attribute accesses for\n   instances of the class. If the class also defines\n   ``__getattr__()``, the latter will not be called unless\n   ``__getattribute__()`` either calls it explicitly or raises an\n   ``AttributeError``. This method should return the (computed)\n   attribute value or raise an ``AttributeError`` exception. In order\n   to avoid infinite recursion in this method, its implementation\n   should always call the base class method with the same name to\n   access any attributes it needs, for example,\n   ``object.__getattribute__(self, name)``.\n\n   Note: This method may still be bypassed when looking up special methods\n     as the result of implicit invocation via language syntax or\n     built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n   Called when an attribute assignment is attempted.  This is called\n   instead of the normal mechanism (i.e. store the value in the\n   instance dictionary). *name* is the attribute name, *value* is the\n   value to be assigned to it.\n\n   If ``__setattr__()`` wants to assign to an instance attribute, it\n   should call the base class method with the same name, for example,\n   ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n   Like ``__setattr__()`` but for attribute deletion instead of\n   assignment.  This should only be implemented if ``del obj.name`` is\n   meaningful for the object.\n\nobject.__dir__(self)\n\n   Called when ``dir()`` is called on the object. A sequence must be\n   returned. ``dir()`` converts the returned sequence to a list and\n   sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents).  In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n   Called to get the attribute of the owner class (class attribute\n   access) or of an instance of that class (instance attribute\n   access). *owner* is always the owner class, while *instance* is the\n   instance that the attribute was accessed through, or ``None`` when\n   the attribute is accessed through the *owner*.  This method should\n   return the (computed) attribute value or raise an\n   ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n   Called to set the attribute on an instance *instance* of the owner\n   class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n   Called to delete the attribute on an instance *instance* of the\n   owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol:  ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead.  Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n   The simplest and least common call is when user code directly\n   invokes a descriptor method:    ``x.__get__(a)``.\n\nInstance Binding\n   If binding to an object instance, ``a.x`` is transformed into the\n   call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n   If binding to a class, ``A.x`` is transformed into the call:\n   ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n   If ``a`` is an instance of ``super``, then the binding ``super(B,\n   obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n   ``A`` immediately preceding ``B`` and then invokes the descriptor\n   with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined.  A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary.  If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor.  Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method.  Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary.  In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors.  Accordingly, instances can\nredefine and override methods.  This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage.  This wastes space for objects having very few instance\nvariables.  The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable.  Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n   This class variable can be assigned a string, iterable, or sequence\n   of strings with variable names used by instances.  If defined in a\n   class, *__slots__* reserves space for the declared variables and\n   prevents the automatic creation of *__dict__* and *__weakref__* for\n   each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n  attribute of that class will always be accessible, so a *__slots__*\n  definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n  variables not listed in the *__slots__* definition.  Attempts to\n  assign to an unlisted variable name raises ``AttributeError``. If\n  dynamic assignment of new variables is desired, then add\n  ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n  declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n  *__slots__* do not support weak references to its instances. If weak\n  reference support is needed, then add ``\'__weakref__\'`` to the\n  sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n  descriptors (*Implementing Descriptors*) for each variable name.  As\n  a result, class attributes cannot be used to set default values for\n  instance variables defined by *__slots__*; otherwise, the class\n  attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n  where it is defined.  As a result, subclasses will have a *__dict__*\n  unless they also define *__slots__* (which must only contain names\n  of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n  variable defined by the base class slot is inaccessible (except by\n  retrieving its descriptor directly from the base class). This\n  renders the meaning of the program undefined.  In the future, a\n  check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n  "variable-length" built-in types such as ``int``, ``str`` and\n  ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n  also be used; however, in the future, special meaning may be\n  assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n  *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n   class Meta(type):\n       pass\n\n   class MyClass(metaclass=Meta):\n       pass\n\n   class MySubclass(MyClass):\n       pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n  used\n\n* if an explicit metaclass is given and it is *not* an instance of\n  ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n  bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n   **PEP 3115** - Metaclasses in Python 3000\n      Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n   **PEP 3135** - New super\n      Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n   class OrderedClass(type):\n\n        @classmethod\n        def __prepare__(metacls, name, bases, **kwds):\n           return collections.OrderedDict()\n\n        def __new__(cls, name, bases, namespace, **kwds):\n           result = type.__new__(cls, name, bases, dict(namespace))\n           result.members = tuple(namespace)\n           return result\n\n   class A(metaclass=OrderedClass):\n       def one(self): pass\n       def two(self): pass\n       def three(self): pass\n       def four(self): pass\n\n   >>> A.members\n   (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``.  That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked.  That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n   Return true if *instance* should be considered a (direct or\n   indirect) instance of *class*. If defined, called to implement\n   ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n   Return true if *subclass* should be considered a (direct or\n   indirect) subclass of *class*.  If defined, called to implement\n   ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass.  They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n   **PEP 3119** - Introducing Abstract Base Classes\n      Includes the specification for customizing ``isinstance()`` and\n      ``issubclass()`` behavior through ``__instancecheck__()`` and\n      ``__subclasscheck__()``, with motivation for this functionality\n      in the context of adding Abstract Base Classes (see the ``abc``\n      module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n   Called when the instance is "called" as a function; if this method\n   is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n   ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well.  The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items.  It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects.  The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects.  Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators.  It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values.  It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n   Called to implement the built-in function ``len()``.  Should return\n   the length of the object, an integer ``>=`` 0.  Also, an object\n   that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n   method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods.  A\n  call like\n\n     a[1:2] = b\n\n  is translated to\n\n     a[slice(1, 2, None)] = b\n\n  and so forth.  Missing slice items are always filled in with\n  ``None``.\n\nobject.__getitem__(self, key)\n\n   Called to implement evaluation of ``self[key]``. For sequence\n   types, the accepted keys should be integers and slice objects.\n   Note that the special interpretation of negative indexes (if the\n   class wishes to emulate a sequence type) is up to the\n   ``__getitem__()`` method. If *key* is of an inappropriate type,\n   ``TypeError`` may be raised; if of a value outside the set of\n   indexes for the sequence (after any special interpretation of\n   negative values), ``IndexError`` should be raised. For mapping\n   types, if *key* is missing (not in the container), ``KeyError``\n   should be raised.\n\n   Note: ``for`` loops expect that an ``IndexError`` will be raised for\n     illegal indexes to allow proper detection of the end of the\n     sequence.\n\nobject.__setitem__(self, key, value)\n\n   Called to implement assignment to ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support changes to the values for keys, or if new keys\n   can be added, or for sequences if elements can be replaced.  The\n   same exceptions should be raised for improper *key* values as for\n   the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n   Called to implement deletion of ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support removal of keys, or for sequences if elements\n   can be removed from the sequence.  The same exceptions should be\n   raised for improper *key* values as for the ``__getitem__()``\n   method.\n\nobject.__iter__(self)\n\n   This method is called when an iterator is required for a container.\n   This method should return a new iterator object that can iterate\n   over all the objects in the container.  For mappings, it should\n   iterate over the keys of the container, and should also be made\n   available as the method ``keys()``.\n\n   Iterator objects also need to implement this method; they are\n   required to return themselves.  For more information on iterator\n   objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n   Called (if present) by the ``reversed()`` built-in to implement\n   reverse iteration.  It should return a new iterator object that\n   iterates over all the objects in the container in reverse order.\n\n   If the ``__reversed__()`` method is not provided, the\n   ``reversed()`` built-in will fall back to using the sequence\n   protocol (``__len__()`` and ``__getitem__()``).  Objects that\n   support the sequence protocol should only provide\n   ``__reversed__()`` if they can provide an implementation that is\n   more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence.  However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n   Called to implement membership test operators.  Should return true\n   if *item* is in *self*, false otherwise.  For mapping objects, this\n   should consider the keys of the mapping rather than the values or\n   the key-item pairs.\n\n   For objects that don\'t define ``__contains__()``, the membership\n   test first tries iteration via ``__iter__()``, then the old\n   sequence iteration protocol via ``__getitem__()``, see *this\n   section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``).  For instance, to evaluate the expression ``x + y``, where\n   *x* is an instance of a class that has an ``__add__()`` method,\n   ``x.__add__(y)`` is called.  The ``__divmod__()`` method should be\n   the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n   should not be related to ``__truediv__()``.  Note that\n   ``__pow__()`` should be defined to accept an optional third\n   argument if the ternary version of the built-in ``pow()`` function\n   is to be supported.\n\n   If one of those methods does not support the operation with the\n   supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``) with reflected (swapped) operands. These functions are only\n   called if the left operand does not support the corresponding\n   operation and the operands are of different types. [2]  For\n   instance, to evaluate the expression ``x - y``, where *y* is an\n   instance of a class that has an ``__rsub__()`` method,\n   ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n   *NotImplemented*.\n\n   Note that ternary ``pow()`` will not try calling ``__rpow__()``\n   (the coercion rules would become too complicated).\n\n   Note: If the right operand\'s type is a subclass of the left operand\'s\n     type and that subclass provides the reflected method for the\n     operation, this method will be called before the left operand\'s\n     non-reflected method.  This behavior allows subclasses to\n     override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n   These methods are called to implement the augmented arithmetic\n   assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n   ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``).  These methods\n   should attempt to do the operation in-place (modifying *self*) and\n   return the result (which could be, but does not have to be,\n   *self*).  If a specific method is not defined, the augmented\n   assignment falls back to the normal methods.  For instance, to\n   execute the statement ``x += y``, where *x* is an instance of a\n   class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n   called.  If *x* is an instance of a class that does not define a\n   ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n   considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n   Called to implement the unary arithmetic operations (``-``, ``+``,\n   ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n   Called to implement the built-in functions ``complex()``,\n   ``int()``, ``float()`` and ``round()``.  Should return a value of\n   the appropriate type.\n\nobject.__index__(self)\n\n   Called to implement ``operator.index()``.  Also called whenever\n   Python needs an integer object (such as in slicing, or in the\n   built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n   an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code.  Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n   Enter the runtime context related to this object. The ``with``\n   statement will bind this method\'s return value to the target(s)\n   specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n   Exit the runtime context related to this object. The parameters\n   describe the exception that caused the context to be exited. If the\n   context was exited without an exception, all three arguments will\n   be ``None``.\n\n   If an exception is supplied, and the method wishes to suppress the\n   exception (i.e., prevent it from being propagated), it should\n   return a true value. Otherwise, the exception will be processed\n   normally upon exit from this method.\n\n   Note that ``__exit__()`` methods should not reraise the passed-in\n   exception; this is the caller\'s responsibility.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary.  That behaviour is the reason why\nthe following code raises an exception:\n\n   >>> class C:\n   ...     pass\n   ...\n   >>> c = C()\n   >>> c.__len__ = lambda: 5\n   >>> len(c)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n   >>> 1 .__hash__() == hash(1)\n   True\n   >>> int.__hash__() == hash(int)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n   >>> type(1).__hash__(1) == hash(1)\n   True\n   >>> type(int).__hash__(int) == hash(int)\n   True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n   >>> class Meta(type):\n   ...    def __getattribute__(*args):\n   ...       print("Metaclass getattribute invoked")\n   ...       return type.__getattribute__(*args)\n   ...\n   >>> class C(object, metaclass=Meta):\n   ...     def __len__(self):\n   ...         return 10\n   ...     def __getattribute__(*args):\n   ...         print("Class getattribute invoked")\n   ...         return object.__getattribute__(*args)\n   ...\n   >>> c = C()\n   >>> c.__len__()                 # Explicit lookup via instance\n   Class getattribute invoked\n   10\n   >>> type(c).__len__(c)          # Explicit lookup via type\n   Metaclass getattribute invoked\n   10\n   >>> len(c)                      # Implicit lookup\n   10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n    certain controlled conditions. It generally isn\'t a good idea\n    though, since it can lead to some very strange behaviour if it is\n    handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n    reflected method (such as ``__add__()``) fails the operation is\n    not supported, which is why the reflected method is not called.\n',
    - 'string-methods': '\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see ``str.format()``,\n*Format String Syntax* and *String Formatting*) and the other based on\nC ``printf`` style formatting that handles a narrower range of types\nand is slightly harder to use correctly, but is often faster for the\ncases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the ``re`` module).\n\nstr.capitalize()\n\n   Return a copy of the string with its first character capitalized\n   and the rest lowercased.\n\nstr.casefold()\n\n   Return a casefolded copy of the string. Casefolded strings may be\n   used for caseless matching.\n\n   Casefolding is similar to lowercasing but more aggressive because\n   it is intended to remove all case distinctions in a string. For\n   example, the German lowercase letter ``\'\xc3\x9f\'`` is equivalent to\n   ``"ss"``. Since it is already lowercase, ``lower()`` would do\n   nothing to ``\'\xc3\x9f\'``; ``casefold()`` converts it to ``"ss"``.\n\n   The casefolding algorithm is described in section 3.13 of the\n   Unicode Standard.\n\n   New in version 3.3.\n\nstr.center(width[, fillchar])\n\n   Return centered in a string of length *width*. Padding is done\n   using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n   Return the number of non-overlapping occurrences of substring *sub*\n   in the range [*start*, *end*].  Optional arguments *start* and\n   *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n   Return an encoded version of the string as a bytes object. Default\n   encoding is ``\'utf-8\'``. *errors* may be given to set a different\n   error handling scheme. The default for *errors* is ``\'strict\'``,\n   meaning that encoding errors raise a ``UnicodeError``. Other\n   possible values are ``\'ignore\'``, ``\'replace\'``,\n   ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n   registered via ``codecs.register_error()``, see section *Codec Base\n   Classes*. For a list of possible encodings, see section *Standard\n   Encodings*.\n\n   Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n   Return ``True`` if the string ends with the specified *suffix*,\n   otherwise return ``False``.  *suffix* can also be a tuple of\n   suffixes to look for.  With optional *start*, test beginning at\n   that position.  With optional *end*, stop comparing at that\n   position.\n\nstr.expandtabs([tabsize])\n\n   Return a copy of the string where all tab characters are replaced\n   by zero or more spaces, depending on the current column and the\n   given tab size.  The column number is reset to zero after each\n   newline occurring in the string. If *tabsize* is not given, a tab\n   size of ``8`` characters is assumed.  This doesn\'t understand other\n   non-printing characters or escape sequences.\n\nstr.find(sub[, start[, end]])\n\n   Return the lowest index in the string where substring *sub* is\n   found, such that *sub* is contained in the slice ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` if *sub* is not found.\n\n   Note: The ``find()`` method should be used only if you need to know the\n     position of *sub*.  To check if *sub* is a substring or not, use\n     the ``in`` operator:\n\n        >>> \'Py\' in \'Python\'\n        True\n\nstr.format(*args, **kwargs)\n\n   Perform a string formatting operation.  The string on which this\n   method is called can contain literal text or replacement fields\n   delimited by braces ``{}``.  Each replacement field contains either\n   the numeric index of a positional argument, or the name of a\n   keyword argument.  Returns a copy of the string where each\n   replacement field is replaced with the string value of the\n   corresponding argument.\n\n   >>> "The sum of 1 + 2 is {0}".format(1+2)\n   \'The sum of 1 + 2 is 3\'\n\n   See *Format String Syntax* for a description of the various\n   formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n   Similar to ``str.format(**mapping)``, except that ``mapping`` is\n   used directly and not copied to a ``dict`` .  This is useful if for\n   example ``mapping`` is a dict subclass:\n\n   >>> class Default(dict):\n   ...     def __missing__(self, key):\n   ...         return key\n   ...\n   >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n   \'Guido was born in country\'\n\n   New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n   Like ``find()``, but raise ``ValueError`` when the substring is not\n   found.\n\nstr.isalnum()\n\n   Return true if all characters in the string are alphanumeric and\n   there is at least one character, false otherwise.  A character\n   ``c`` is alphanumeric if one of the following returns ``True``:\n   ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n   ``c.isnumeric()``.\n\nstr.isalpha()\n\n   Return true if all characters in the string are alphabetic and\n   there is at least one character, false otherwise.  Alphabetic\n   characters are those characters defined in the Unicode character\n   database as "Letter", i.e., those with general category property\n   being one of "Lm", "Lt", "Lu", "Ll", or "Lo".  Note that this is\n   different from the "Alphabetic" property defined in the Unicode\n   Standard.\n\nstr.isdecimal()\n\n   Return true if all characters in the string are decimal characters\n   and there is at least one character, false otherwise. Decimal\n   characters are those from general category "Nd". This category\n   includes digit characters, and all characters that can be used to\n   form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n   Return true if all characters in the string are digits and there is\n   at least one character, false otherwise.  Digits include decimal\n   characters and digits that need special handling, such as the\n   compatibility superscript digits.  Formally, a digit is a character\n   that has the property value Numeric_Type=Digit or\n   Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n   Return true if the string is a valid identifier according to the\n   language definition, section *Identifiers and keywords*.\n\nstr.islower()\n\n   Return true if all cased characters [4] in the string are lowercase\n   and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n   Return true if all characters in the string are numeric characters,\n   and there is at least one character, false otherwise. Numeric\n   characters include digit characters, and all characters that have\n   the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n   ONE FIFTH.  Formally, numeric characters are those with the\n   property value Numeric_Type=Digit, Numeric_Type=Decimal or\n   Numeric_Type=Numeric.\n\nstr.isprintable()\n\n   Return true if all characters in the string are printable or the\n   string is empty, false otherwise.  Nonprintable characters are\n   those characters defined in the Unicode character database as\n   "Other" or "Separator", excepting the ASCII space (0x20) which is\n   considered printable.  (Note that printable characters in this\n   context are those which should not be escaped when ``repr()`` is\n   invoked on a string.  It has no bearing on the handling of strings\n   written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n   Return true if there are only whitespace characters in the string\n   and there is at least one character, false otherwise.  Whitespace\n   characters  are those characters defined in the Unicode character\n   database as "Other" or "Separator" and those with bidirectional\n   property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n   Return true if the string is a titlecased string and there is at\n   least one character, for example uppercase characters may only\n   follow uncased characters and lowercase characters only cased ones.\n   Return false otherwise.\n\nstr.isupper()\n\n   Return true if all cased characters [4] in the string are uppercase\n   and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n   Return a string which is the concatenation of the strings in the\n   *iterable* *iterable*.  A ``TypeError`` will be raised if there are\n   any non-string values in *iterable*, including ``bytes`` objects.\n   The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n   Return the string left justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space).  The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\nstr.lower()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to lowercase.\n\n   The lowercasing algorithm used is described in section 3.13 of the\n   Unicode Standard.\n\nstr.lstrip([chars])\n\n   Return a copy of the string with leading characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a prefix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.lstrip()\n   \'spacious   \'\n   >>> \'www.example.com\'.lstrip(\'cmowz.\')\n   \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n   This static method returns a translation table usable for\n   ``str.translate()``.\n\n   If there is only one argument, it must be a dictionary mapping\n   Unicode ordinals (integers) or characters (strings of length 1) to\n   Unicode ordinals, strings (of arbitrary lengths) or None.\n   Character keys will then be converted to ordinals.\n\n   If there are two arguments, they must be strings of equal length,\n   and in the resulting dictionary, each character in x will be mapped\n   to the character at the same position in y.  If there is a third\n   argument, it must be a string, whose characters will be mapped to\n   None in the result.\n\nstr.partition(sep)\n\n   Split the string at the first occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing the string itself, followed by\n   two empty strings.\n\nstr.replace(old, new[, count])\n\n   Return a copy of the string with all occurrences of substring *old*\n   replaced by *new*.  If the optional argument *count* is given, only\n   the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n   Return the highest index in the string where substring *sub* is\n   found, such that *sub* is contained within ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n   Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n   is not found.\n\nstr.rjust(width[, fillchar])\n\n   Return the string right justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space). The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n   Split the string at the last occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing two empty strings, followed by\n   the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n   are done, the *rightmost* ones.  If *sep* is not specified or\n   ``None``, any whitespace string is a separator.  Except for\n   splitting from the right, ``rsplit()`` behaves like ``split()``\n   which is described in detail below.\n\nstr.rstrip([chars])\n\n   Return a copy of the string with trailing characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a suffix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.rstrip()\n   \'   spacious\'\n   >>> \'mississippi\'.rstrip(\'ipz\')\n   \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string.  If *maxsplit* is given, at most *maxsplit*\n   splits are done (thus, the list will have at most ``maxsplit+1``\n   elements).  If *maxsplit* is not specified or ``-1``, then there is\n   no limit on the number of splits (all possible splits are made).\n\n   If *sep* is given, consecutive delimiters are not grouped together\n   and are deemed to delimit empty strings (for example,\n   ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``).  The *sep*\n   argument may consist of multiple characters (for example,\n   ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n   an empty string with a specified separator returns ``[\'\']``.\n\n   If *sep* is not specified or is ``None``, a different splitting\n   algorithm is applied: runs of consecutive whitespace are regarded\n   as a single separator, and the result will contain no empty strings\n   at the start or end if the string has leading or trailing\n   whitespace.  Consequently, splitting an empty string or a string\n   consisting of just whitespace with a ``None`` separator returns\n   ``[]``.\n\n   For example, ``\' 1  2   3  \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n   and ``\'  1  2   3  \'.split(None, 1)`` returns ``[\'1\', \'2   3  \']``.\n\nstr.splitlines([keepends])\n\n   Return a list of the lines in the string, breaking at line\n   boundaries. This method uses the *universal newlines* approach to\n   splitting lines. Line breaks are not included in the resulting list\n   unless *keepends* is given and true.\n\n   For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n   ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n   ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n   \'kl\\r\\n\']``.\n\n   Unlike ``split()`` when a delimiter string *sep* is given, this\n   method returns an empty list for the empty string, and a terminal\n   line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n   Return ``True`` if string starts with the *prefix*, otherwise\n   return ``False``. *prefix* can also be a tuple of prefixes to look\n   for.  With optional *start*, test string beginning at that\n   position.  With optional *end*, stop comparing string at that\n   position.\n\nstr.strip([chars])\n\n   Return a copy of the string with the leading and trailing\n   characters removed. The *chars* argument is a string specifying the\n   set of characters to be removed. If omitted or ``None``, the\n   *chars* argument defaults to removing whitespace. The *chars*\n   argument is not a prefix or suffix; rather, all combinations of its\n   values are stripped:\n\n   >>> \'   spacious   \'.strip()\n   \'spacious\'\n   >>> \'www.example.com\'.strip(\'cmowz.\')\n   \'example\'\n\nstr.swapcase()\n\n   Return a copy of the string with uppercase characters converted to\n   lowercase and vice versa. Note that it is not necessarily true that\n   ``s.swapcase().swapcase() == s``.\n\nstr.title()\n\n   Return a titlecased version of the string where words start with an\n   uppercase character and the remaining characters are lowercase.\n\n   The algorithm uses a simple language-independent definition of a\n   word as groups of consecutive letters.  The definition works in\n   many contexts but it means that apostrophes in contractions and\n   possessives form word boundaries, which may not be the desired\n   result:\n\n      >>> "they\'re bill\'s friends from the UK".title()\n      "They\'Re Bill\'S Friends From The Uk"\n\n   A workaround for apostrophes can be constructed using regular\n   expressions:\n\n      >>> import re\n      >>> def titlecase(s):\n      ...     return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n      ...                   lambda mo: mo.group(0)[0].upper() +\n      ...                              mo.group(0)[1:].lower(),\n      ...                   s)\n      ...\n      >>> titlecase("they\'re bill\'s friends.")\n      "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n   Return a copy of the *s* where all characters have been mapped\n   through the *map* which must be a dictionary of Unicode ordinals\n   (integers) to Unicode ordinals, strings or ``None``.  Unmapped\n   characters are left untouched. Characters mapped to ``None`` are\n   deleted.\n\n   You can use ``str.maketrans()`` to create a translation map from\n   character-to-character mappings in different formats.\n\n   Note: An even more flexible approach is to create a custom character\n     mapping codec using the ``codecs`` module (see\n     ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to uppercase.  Note that ``str.upper().isupper()`` might\n   be ``False`` if ``s`` contains uncased characters or if the Unicode\n   category of the resulting character(s) is not "Lu" (Letter,\n   uppercase), but e.g. "Lt" (Letter, titlecase).\n\n   The uppercasing algorithm used is described in section 3.13 of the\n   Unicode Standard.\n\nstr.zfill(width)\n\n   Return the numeric string left filled with zeros in a string of\n   length *width*.  A sign prefix is handled correctly.  The original\n   string is returned if *width* is less than or equal to ``len(s)``.\n',
    + 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators.  For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``.  Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled.  For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense.  (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n   Called to create a new instance of class *cls*.  ``__new__()`` is a\n   static method (special-cased so you need not declare it as such)\n   that takes the class of which an instance was requested as its\n   first argument.  The remaining arguments are those passed to the\n   object constructor expression (the call to the class).  The return\n   value of ``__new__()`` should be the new object instance (usually\n   an instance of *cls*).\n\n   Typical implementations create a new instance of the class by\n   invoking the superclass\'s ``__new__()`` method using\n   ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n   arguments and then modifying the newly-created instance as\n   necessary before returning it.\n\n   If ``__new__()`` returns an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will be invoked like\n   ``__init__(self[, ...])``, where *self* is the new instance and the\n   remaining arguments are the same as were passed to ``__new__()``.\n\n   If ``__new__()`` does not return an instance of *cls*, then the new\n   instance\'s ``__init__()`` method will not be invoked.\n\n   ``__new__()`` is intended mainly to allow subclasses of immutable\n   types (like int, str, or tuple) to customize instance creation.  It\n   is also commonly overridden in custom metaclasses in order to\n   customize class creation.\n\nobject.__init__(self[, ...])\n\n   Called when the instance is created.  The arguments are those\n   passed to the class constructor expression.  If a base class has an\n   ``__init__()`` method, the derived class\'s ``__init__()`` method,\n   if any, must explicitly call it to ensure proper initialization of\n   the base class part of the instance; for example:\n   ``BaseClass.__init__(self, [args...])``.  As a special constraint\n   on constructors, no value may be returned; doing so will cause a\n   ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n   Called when the instance is about to be destroyed.  This is also\n   called a destructor.  If a base class has a ``__del__()`` method,\n   the derived class\'s ``__del__()`` method, if any, must explicitly\n   call it to ensure proper deletion of the base class part of the\n   instance.  Note that it is possible (though not recommended!) for\n   the ``__del__()`` method to postpone destruction of the instance by\n   creating a new reference to it.  It may then be called at a later\n   time when this new reference is deleted.  It is not guaranteed that\n   ``__del__()`` methods are called for objects that still exist when\n   the interpreter exits.\n\n   Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n     decrements the reference count for ``x`` by one, and the latter\n     is only called when ``x``\'s reference count reaches zero.  Some\n     common situations that may prevent the reference count of an\n     object from going to zero include: circular references between\n     objects (e.g., a doubly-linked list or a tree data structure with\n     parent and child pointers); a reference to the object on the\n     stack frame of a function that caught an exception (the traceback\n     stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n     a reference to the object on the stack frame that raised an\n     unhandled exception in interactive mode (the traceback stored in\n     ``sys.last_traceback`` keeps the stack frame alive).  The first\n     situation can only be remedied by explicitly breaking the cycles;\n     the latter two situations can be resolved by storing ``None`` in\n     ``sys.last_traceback``. Circular references which are garbage are\n     detected when the option cycle detector is enabled (it\'s on by\n     default), but can only be cleaned up if there are no Python-\n     level ``__del__()`` methods involved. Refer to the documentation\n     for the ``gc`` module for more information about how\n     ``__del__()`` methods are handled by the cycle detector,\n     particularly the description of the ``garbage`` value.\n\n   Warning: Due to the precarious circumstances under which ``__del__()``\n     methods are invoked, exceptions that occur during their execution\n     are ignored, and a warning is printed to ``sys.stderr`` instead.\n     Also, when ``__del__()`` is invoked in response to a module being\n     deleted (e.g., when execution of the program is done), other\n     globals referenced by the ``__del__()`` method may already have\n     been deleted or in the process of being torn down (e.g. the\n     import machinery shutting down).  For this reason, ``__del__()``\n     methods should do the absolute minimum needed to maintain\n     external invariants.  Starting with version 1.5, Python\n     guarantees that globals whose name begins with a single\n     underscore are deleted from their module before other globals are\n     deleted; if no other references to such globals exist, this may\n     help in assuring that imported modules are still available at the\n     time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n   Called by the ``repr()`` built-in function to compute the\n   "official" string representation of an object.  If at all possible,\n   this should look like a valid Python expression that could be used\n   to recreate an object with the same value (given an appropriate\n   environment).  If this is not possible, a string of the form\n   ``<...some useful description...>`` should be returned. The return\n   value must be a string object. If a class defines ``__repr__()``\n   but not ``__str__()``, then ``__repr__()`` is also used when an\n   "informal" string representation of instances of that class is\n   required.\n\n   This is typically used for debugging, so it is important that the\n   representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n   Called by ``str(object)`` and the built-in functions ``format()``\n   and ``print()`` to compute the "informal" or nicely printable\n   string representation of an object.  The return value must be a\n   *string* object.\n\n   This method differs from ``object.__repr__()`` in that there is no\n   expectation that ``__str__()`` return a valid Python expression: a\n   more convenient or concise representation can be used.\n\n   The default implementation defined by the built-in type ``object``\n   calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n   Called by ``bytes()`` to compute a byte-string representation of an\n   object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n   Called by the ``format()`` built-in function (and by extension, the\n   ``str.format()`` method of class ``str``) to produce a "formatted"\n   string representation of an object. The ``format_spec`` argument is\n   a string that contains a description of the formatting options\n   desired. The interpretation of the ``format_spec`` argument is up\n   to the type implementing ``__format__()``, however most classes\n   will either delegate formatting to one of the built-in types, or\n   use a similar formatting option syntax.\n\n   See *Format Specification Mini-Language* for a description of the\n   standard formatting syntax.\n\n   The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n   These are the so-called "rich comparison" methods. The\n   correspondence between operator symbols and method names is as\n   follows: ``xy`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n   ``x.__ge__(y)``.\n\n   A rich comparison method may return the singleton\n   ``NotImplemented`` if it does not implement the operation for a\n   given pair of arguments. By convention, ``False`` and ``True`` are\n   returned for a successful comparison. However, these methods can\n   return any value, so if the comparison operator is used in a\n   Boolean context (e.g., in the condition of an ``if`` statement),\n   Python will call ``bool()`` on the value to determine if the result\n   is true or false.\n\n   There are no implied relationships among the comparison operators.\n   The truth of ``x==y`` does not imply that ``x!=y`` is false.\n   Accordingly, when defining ``__eq__()``, one should also define\n   ``__ne__()`` so that the operators will behave as expected.  See\n   the paragraph on ``__hash__()`` for some important notes on\n   creating *hashable* objects which support custom comparison\n   operations and are usable as dictionary keys.\n\n   There are no swapped-argument versions of these methods (to be used\n   when the left argument does not support the operation but the right\n   argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n   other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n   reflection, and ``__eq__()`` and ``__ne__()`` are their own\n   reflection.\n\n   Arguments to rich comparison methods are never coerced.\n\n   To automatically generate ordering operations from a single root\n   operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n   Called by built-in function ``hash()`` and for operations on\n   members of hashed collections including ``set``, ``frozenset``, and\n   ``dict``.  ``__hash__()`` should return an integer.  The only\n   required property is that objects which compare equal have the same\n   hash value; it is advised to somehow mix together (e.g. using\n   exclusive or) the hash values for the components of the object that\n   also play a part in comparison of objects.\n\n   Note: ``hash()`` truncates the value returned from an object\'s custom\n     ``__hash__()`` method to the size of a ``Py_ssize_t``.  This is\n     typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n     If an object\'s   ``__hash__()`` must interoperate on builds of\n     different bit sizes, be sure to check the width on all supported\n     builds.  An easy way to do this is with ``python -c "import sys;\n     print(sys.hash_info.width)"``\n\n   If a class does not define an ``__eq__()`` method it should not\n   define a ``__hash__()`` operation either; if it defines\n   ``__eq__()`` but not ``__hash__()``, its instances will not be\n   usable as items in hashable collections.  If a class defines\n   mutable objects and implements an ``__eq__()`` method, it should\n   not implement ``__hash__()``, since the implementation of hashable\n   collections requires that a key\'s hash value is immutable (if the\n   object\'s hash value changes, it will be in the wrong hash bucket).\n\n   User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n   by default; with them, all objects compare unequal (except with\n   themselves) and ``x.__hash__()`` returns an appropriate value such\n   that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n   hash(y)``.\n\n   A class that overrides ``__eq__()`` and does not define\n   ``__hash__()`` will have its ``__hash__()`` implicitly set to\n   ``None``.  When the ``__hash__()`` method of a class is ``None``,\n   instances of the class will raise an appropriate ``TypeError`` when\n   a program attempts to retrieve their hash value, and will also be\n   correctly identified as unhashable when checking ``isinstance(obj,\n   collections.Hashable``).\n\n   If a class that overrides ``__eq__()`` needs to retain the\n   implementation of ``__hash__()`` from a parent class, the\n   interpreter must be told this explicitly by setting ``__hash__ =\n   .__hash__``.\n\n   If a class that does not override ``__eq__()`` wishes to suppress\n   hash support, it should include ``__hash__ = None`` in the class\n   definition. A class which defines its own ``__hash__()`` that\n   explicitly raises a ``TypeError`` would be incorrectly identified\n   as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n   Note: By default, the ``__hash__()`` values of str, bytes and datetime\n     objects are "salted" with an unpredictable random value.\n     Although they remain constant within an individual Python\n     process, they are not predictable between repeated invocations of\n     Python.This is intended to provide protection against a denial-\n     of-service caused by carefully-chosen inputs that exploit the\n     worst case performance of a dict insertion, O(n^2) complexity.\n     See http://www.ocert.org/advisories/ocert-2011-003.html for\n     details.Changing hash values affects the iteration order of\n     dicts, sets and other mappings.  Python has never made guarantees\n     about this ordering (and it typically varies between 32-bit and\n     64-bit builds).See also ``PYTHONHASHSEED``.\n\n   Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n   Called to implement truth value testing and the built-in operation\n   ``bool()``; should return ``False`` or ``True``.  When this method\n   is not defined, ``__len__()`` is called, if it is defined, and the\n   object is considered true if its result is nonzero.  If a class\n   defines neither ``__len__()`` nor ``__bool__()``, all its instances\n   are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n   Called when an attribute lookup has not found the attribute in the\n   usual places (i.e. it is not an instance attribute nor is it found\n   in the class tree for ``self``).  ``name`` is the attribute name.\n   This method should return the (computed) attribute value or raise\n   an ``AttributeError`` exception.\n\n   Note that if the attribute is found through the normal mechanism,\n   ``__getattr__()`` is not called.  (This is an intentional asymmetry\n   between ``__getattr__()`` and ``__setattr__()``.) This is done both\n   for efficiency reasons and because otherwise ``__getattr__()``\n   would have no way to access other attributes of the instance.  Note\n   that at least for instance variables, you can fake total control by\n   not inserting any values in the instance attribute dictionary (but\n   instead inserting them in another object).  See the\n   ``__getattribute__()`` method below for a way to actually get total\n   control over attribute access.\n\nobject.__getattribute__(self, name)\n\n   Called unconditionally to implement attribute accesses for\n   instances of the class. If the class also defines\n   ``__getattr__()``, the latter will not be called unless\n   ``__getattribute__()`` either calls it explicitly or raises an\n   ``AttributeError``. This method should return the (computed)\n   attribute value or raise an ``AttributeError`` exception. In order\n   to avoid infinite recursion in this method, its implementation\n   should always call the base class method with the same name to\n   access any attributes it needs, for example,\n   ``object.__getattribute__(self, name)``.\n\n   Note: This method may still be bypassed when looking up special methods\n     as the result of implicit invocation via language syntax or\n     built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n   Called when an attribute assignment is attempted.  This is called\n   instead of the normal mechanism (i.e. store the value in the\n   instance dictionary). *name* is the attribute name, *value* is the\n   value to be assigned to it.\n\n   If ``__setattr__()`` wants to assign to an instance attribute, it\n   should call the base class method with the same name, for example,\n   ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n   Like ``__setattr__()`` but for attribute deletion instead of\n   assignment.  This should only be implemented if ``del obj.name`` is\n   meaningful for the object.\n\nobject.__dir__(self)\n\n   Called when ``dir()`` is called on the object. A sequence must be\n   returned. ``dir()`` converts the returned sequence to a list and\n   sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents).  In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n   Called to get the attribute of the owner class (class attribute\n   access) or of an instance of that class (instance attribute\n   access). *owner* is always the owner class, while *instance* is the\n   instance that the attribute was accessed through, or ``None`` when\n   the attribute is accessed through the *owner*.  This method should\n   return the (computed) attribute value or raise an\n   ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n   Called to set the attribute on an instance *instance* of the owner\n   class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n   Called to delete the attribute on an instance *instance* of the\n   owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol:  ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead.  Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n   The simplest and least common call is when user code directly\n   invokes a descriptor method:    ``x.__get__(a)``.\n\nInstance Binding\n   If binding to an object instance, ``a.x`` is transformed into the\n   call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n   If binding to a class, ``A.x`` is transformed into the call:\n   ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n   If ``a`` is an instance of ``super``, then the binding ``super(B,\n   obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n   ``A`` immediately preceding ``B`` and then invokes the descriptor\n   with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined.  A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary.  If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor.  Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method.  Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary.  In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors.  Accordingly, instances can\nredefine and override methods.  This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage.  This wastes space for objects having very few instance\nvariables.  The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable.  Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n   This class variable can be assigned a string, iterable, or sequence\n   of strings with variable names used by instances.  If defined in a\n   class, *__slots__* reserves space for the declared variables and\n   prevents the automatic creation of *__dict__* and *__weakref__* for\n   each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n  attribute of that class will always be accessible, so a *__slots__*\n  definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n  variables not listed in the *__slots__* definition.  Attempts to\n  assign to an unlisted variable name raises ``AttributeError``. If\n  dynamic assignment of new variables is desired, then add\n  ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n  declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n  *__slots__* do not support weak references to its instances. If weak\n  reference support is needed, then add ``\'__weakref__\'`` to the\n  sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n  descriptors (*Implementing Descriptors*) for each variable name.  As\n  a result, class attributes cannot be used to set default values for\n  instance variables defined by *__slots__*; otherwise, the class\n  attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n  where it is defined.  As a result, subclasses will have a *__dict__*\n  unless they also define *__slots__* (which must only contain names\n  of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n  variable defined by the base class slot is inaccessible (except by\n  retrieving its descriptor directly from the base class). This\n  renders the meaning of the program undefined.  In the future, a\n  check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n  "variable-length" built-in types such as ``int``, ``str`` and\n  ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n  also be used; however, in the future, special meaning may be\n  assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n  *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n   class Meta(type):\n       pass\n\n   class MyClass(metaclass=Meta):\n       pass\n\n   class MySubclass(MyClass):\n       pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n  used\n\n* if an explicit metaclass is given and it is *not* an instance of\n  ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n  bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n   **PEP 3115** - Metaclasses in Python 3000\n      Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n   **PEP 3135** - New super\n      Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n   class OrderedClass(type):\n\n        @classmethod\n        def __prepare__(metacls, name, bases, **kwds):\n           return collections.OrderedDict()\n\n        def __new__(cls, name, bases, namespace, **kwds):\n           result = type.__new__(cls, name, bases, dict(namespace))\n           result.members = tuple(namespace)\n           return result\n\n   class A(metaclass=OrderedClass):\n       def one(self): pass\n       def two(self): pass\n       def three(self): pass\n       def four(self): pass\n\n   >>> A.members\n   (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``.  That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked.  That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n   Return true if *instance* should be considered a (direct or\n   indirect) instance of *class*. If defined, called to implement\n   ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n   Return true if *subclass* should be considered a (direct or\n   indirect) subclass of *class*.  If defined, called to implement\n   ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass.  They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n   **PEP 3119** - Introducing Abstract Base Classes\n      Includes the specification for customizing ``isinstance()`` and\n      ``issubclass()`` behavior through ``__instancecheck__()`` and\n      ``__subclasscheck__()``, with motivation for this functionality\n      in the context of adding Abstract Base Classes (see the ``abc``\n      module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n   Called when the instance is "called" as a function; if this method\n   is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n   ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well.  The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items.  It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects.  The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects.  Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators.  It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values.  It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n   Called to implement the built-in function ``len()``.  Should return\n   the length of the object, an integer ``>=`` 0.  Also, an object\n   that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n   method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods.  A\n  call like\n\n     a[1:2] = b\n\n  is translated to\n\n     a[slice(1, 2, None)] = b\n\n  and so forth.  Missing slice items are always filled in with\n  ``None``.\n\nobject.__getitem__(self, key)\n\n   Called to implement evaluation of ``self[key]``. For sequence\n   types, the accepted keys should be integers and slice objects.\n   Note that the special interpretation of negative indexes (if the\n   class wishes to emulate a sequence type) is up to the\n   ``__getitem__()`` method. If *key* is of an inappropriate type,\n   ``TypeError`` may be raised; if of a value outside the set of\n   indexes for the sequence (after any special interpretation of\n   negative values), ``IndexError`` should be raised. For mapping\n   types, if *key* is missing (not in the container), ``KeyError``\n   should be raised.\n\n   Note: ``for`` loops expect that an ``IndexError`` will be raised for\n     illegal indexes to allow proper detection of the end of the\n     sequence.\n\nobject.__setitem__(self, key, value)\n\n   Called to implement assignment to ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support changes to the values for keys, or if new keys\n   can be added, or for sequences if elements can be replaced.  The\n   same exceptions should be raised for improper *key* values as for\n   the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n   Called to implement deletion of ``self[key]``.  Same note as for\n   ``__getitem__()``.  This should only be implemented for mappings if\n   the objects support removal of keys, or for sequences if elements\n   can be removed from the sequence.  The same exceptions should be\n   raised for improper *key* values as for the ``__getitem__()``\n   method.\n\nobject.__iter__(self)\n\n   This method is called when an iterator is required for a container.\n   This method should return a new iterator object that can iterate\n   over all the objects in the container.  For mappings, it should\n   iterate over the keys of the container, and should also be made\n   available as the method ``keys()``.\n\n   Iterator objects also need to implement this method; they are\n   required to return themselves.  For more information on iterator\n   objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n   Called (if present) by the ``reversed()`` built-in to implement\n   reverse iteration.  It should return a new iterator object that\n   iterates over all the objects in the container in reverse order.\n\n   If the ``__reversed__()`` method is not provided, the\n   ``reversed()`` built-in will fall back to using the sequence\n   protocol (``__len__()`` and ``__getitem__()``).  Objects that\n   support the sequence protocol should only provide\n   ``__reversed__()`` if they can provide an implementation that is\n   more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence.  However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n   Called to implement membership test operators.  Should return true\n   if *item* is in *self*, false otherwise.  For mapping objects, this\n   should consider the keys of the mapping rather than the values or\n   the key-item pairs.\n\n   For objects that don\'t define ``__contains__()``, the membership\n   test first tries iteration via ``__iter__()``, then the old\n   sequence iteration protocol via ``__getitem__()``, see *this\n   section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``).  For instance, to evaluate the expression ``x + y``, where\n   *x* is an instance of a class that has an ``__add__()`` method,\n   ``x.__add__(y)`` is called.  The ``__divmod__()`` method should be\n   the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n   should not be related to ``__truediv__()``.  Note that\n   ``__pow__()`` should be defined to accept an optional third\n   argument if the ternary version of the built-in ``pow()`` function\n   is to be supported.\n\n   If one of those methods does not support the operation with the\n   supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n   These methods are called to implement the binary arithmetic\n   operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n   ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n   ``|``) with reflected (swapped) operands. These functions are only\n   called if the left operand does not support the corresponding\n   operation and the operands are of different types. [2]  For\n   instance, to evaluate the expression ``x - y``, where *y* is an\n   instance of a class that has an ``__rsub__()`` method,\n   ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n   *NotImplemented*.\n\n   Note that ternary ``pow()`` will not try calling ``__rpow__()``\n   (the coercion rules would become too complicated).\n\n   Note: If the right operand\'s type is a subclass of the left operand\'s\n     type and that subclass provides the reflected method for the\n     operation, this method will be called before the left operand\'s\n     non-reflected method.  This behavior allows subclasses to\n     override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n   These methods are called to implement the augmented arithmetic\n   assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n   ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``).  These methods\n   should attempt to do the operation in-place (modifying *self*) and\n   return the result (which could be, but does not have to be,\n   *self*).  If a specific method is not defined, the augmented\n   assignment falls back to the normal methods.  For instance, to\n   execute the statement ``x += y``, where *x* is an instance of a\n   class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n   called.  If *x* is an instance of a class that does not define a\n   ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n   considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n   Called to implement the unary arithmetic operations (``-``, ``+``,\n   ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n   Called to implement the built-in functions ``complex()``,\n   ``int()``, ``float()`` and ``round()``.  Should return a value of\n   the appropriate type.\n\nobject.__index__(self)\n\n   Called to implement ``operator.index()``.  Also called whenever\n   Python needs an integer object (such as in slicing, or in the\n   built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n   an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code.  Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n   Enter the runtime context related to this object. The ``with``\n   statement will bind this method\'s return value to the target(s)\n   specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n   Exit the runtime context related to this object. The parameters\n   describe the exception that caused the context to be exited. If the\n   context was exited without an exception, all three arguments will\n   be ``None``.\n\n   If an exception is supplied, and the method wishes to suppress the\n   exception (i.e., prevent it from being propagated), it should\n   return a true value. Otherwise, the exception will be processed\n   normally upon exit from this method.\n\n   Note that ``__exit__()`` methods should not reraise the passed-in\n   exception; this is the caller\'s responsibility.\n\nSee also:\n\n   **PEP 0343** - The "with" statement\n      The specification, background, and examples for the Python\n      ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary.  That behaviour is the reason why\nthe following code raises an exception:\n\n   >>> class C:\n   ...     pass\n   ...\n   >>> c = C()\n   >>> c.__len__ = lambda: 5\n   >>> len(c)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n   >>> 1 .__hash__() == hash(1)\n   True\n   >>> int.__hash__() == hash(int)\n   Traceback (most recent call last):\n     File "", line 1, in \n   TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n   >>> type(1).__hash__(1) == hash(1)\n   True\n   >>> type(int).__hash__(int) == hash(int)\n   True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n   >>> class Meta(type):\n   ...    def __getattribute__(*args):\n   ...       print("Metaclass getattribute invoked")\n   ...       return type.__getattribute__(*args)\n   ...\n   >>> class C(object, metaclass=Meta):\n   ...     def __len__(self):\n   ...         return 10\n   ...     def __getattribute__(*args):\n   ...         print("Class getattribute invoked")\n   ...         return object.__getattribute__(*args)\n   ...\n   >>> c = C()\n   >>> c.__len__()                 # Explicit lookup via instance\n   Class getattribute invoked\n   10\n   >>> type(c).__len__(c)          # Explicit lookup via type\n   Metaclass getattribute invoked\n   10\n   >>> len(c)                      # Implicit lookup\n   10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n    certain controlled conditions. It generally isn\'t a good idea\n    though, since it can lead to some very strange behaviour if it is\n    handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n    reflected method (such as ``__add__()``) fails the operation is\n    not supported, which is why the reflected method is not called.\n',
    + 'string-methods': '\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see ``str.format()``,\n*Format String Syntax* and *String Formatting*) and the other based on\nC ``printf`` style formatting that handles a narrower range of types\nand is slightly harder to use correctly, but is often faster for the\ncases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the ``re`` module).\n\nstr.capitalize()\n\n   Return a copy of the string with its first character capitalized\n   and the rest lowercased.\n\nstr.casefold()\n\n   Return a casefolded copy of the string. Casefolded strings may be\n   used for caseless matching.\n\n   Casefolding is similar to lowercasing but more aggressive because\n   it is intended to remove all case distinctions in a string. For\n   example, the German lowercase letter ``\'\xc3\x9f\'`` is equivalent to\n   ``"ss"``. Since it is already lowercase, ``lower()`` would do\n   nothing to ``\'\xc3\x9f\'``; ``casefold()`` converts it to ``"ss"``.\n\n   The casefolding algorithm is described in section 3.13 of the\n   Unicode Standard.\n\n   New in version 3.3.\n\nstr.center(width[, fillchar])\n\n   Return centered in a string of length *width*. Padding is done\n   using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n   Return the number of non-overlapping occurrences of substring *sub*\n   in the range [*start*, *end*].  Optional arguments *start* and\n   *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n   Return an encoded version of the string as a bytes object. Default\n   encoding is ``\'utf-8\'``. *errors* may be given to set a different\n   error handling scheme. The default for *errors* is ``\'strict\'``,\n   meaning that encoding errors raise a ``UnicodeError``. Other\n   possible values are ``\'ignore\'``, ``\'replace\'``,\n   ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n   registered via ``codecs.register_error()``, see section *Codec Base\n   Classes*. For a list of possible encodings, see section *Standard\n   Encodings*.\n\n   Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n   Return ``True`` if the string ends with the specified *suffix*,\n   otherwise return ``False``.  *suffix* can also be a tuple of\n   suffixes to look for.  With optional *start*, test beginning at\n   that position.  With optional *end*, stop comparing at that\n   position.\n\nstr.expandtabs([tabsize])\n\n   Return a copy of the string where all tab characters are replaced\n   by one or more spaces, depending on the current column and the\n   given tab size.  Tab positions occur every *tabsize* characters\n   (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n   To expand the string, the current column is set to zero and the\n   string is examined character by character.  If the character is a\n   tab (``\\t``), one or more space characters are inserted in the\n   result until the current column is equal to the next tab position.\n   (The tab character itself is not copied.)  If the character is a\n   newline (``\\n``) or return (``\\r``), it is copied and the current\n   column is reset to zero.  Any other character is copied unchanged\n   and the current column is incremented by one regardless of how the\n   character is represented when printed.\n\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n   \'01      012     0123    01234\'\n   >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n   \'01  012 0123    01234\'\n\nstr.find(sub[, start[, end]])\n\n   Return the lowest index in the string where substring *sub* is\n   found, such that *sub* is contained in the slice ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` if *sub* is not found.\n\n   Note: The ``find()`` method should be used only if you need to know the\n     position of *sub*.  To check if *sub* is a substring or not, use\n     the ``in`` operator:\n\n        >>> \'Py\' in \'Python\'\n        True\n\nstr.format(*args, **kwargs)\n\n   Perform a string formatting operation.  The string on which this\n   method is called can contain literal text or replacement fields\n   delimited by braces ``{}``.  Each replacement field contains either\n   the numeric index of a positional argument, or the name of a\n   keyword argument.  Returns a copy of the string where each\n   replacement field is replaced with the string value of the\n   corresponding argument.\n\n   >>> "The sum of 1 + 2 is {0}".format(1+2)\n   \'The sum of 1 + 2 is 3\'\n\n   See *Format String Syntax* for a description of the various\n   formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n   Similar to ``str.format(**mapping)``, except that ``mapping`` is\n   used directly and not copied to a ``dict`` .  This is useful if for\n   example ``mapping`` is a dict subclass:\n\n   >>> class Default(dict):\n   ...     def __missing__(self, key):\n   ...         return key\n   ...\n   >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n   \'Guido was born in country\'\n\n   New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n   Like ``find()``, but raise ``ValueError`` when the substring is not\n   found.\n\nstr.isalnum()\n\n   Return true if all characters in the string are alphanumeric and\n   there is at least one character, false otherwise.  A character\n   ``c`` is alphanumeric if one of the following returns ``True``:\n   ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n   ``c.isnumeric()``.\n\nstr.isalpha()\n\n   Return true if all characters in the string are alphabetic and\n   there is at least one character, false otherwise.  Alphabetic\n   characters are those characters defined in the Unicode character\n   database as "Letter", i.e., those with general category property\n   being one of "Lm", "Lt", "Lu", "Ll", or "Lo".  Note that this is\n   different from the "Alphabetic" property defined in the Unicode\n   Standard.\n\nstr.isdecimal()\n\n   Return true if all characters in the string are decimal characters\n   and there is at least one character, false otherwise. Decimal\n   characters are those from general category "Nd". This category\n   includes digit characters, and all characters that can be used to\n   form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n   Return true if all characters in the string are digits and there is\n   at least one character, false otherwise.  Digits include decimal\n   characters and digits that need special handling, such as the\n   compatibility superscript digits.  Formally, a digit is a character\n   that has the property value Numeric_Type=Digit or\n   Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n   Return true if the string is a valid identifier according to the\n   language definition, section *Identifiers and keywords*.\n\n   Use ``keyword.iskeyword()`` to test for reserved identifiers such\n   as ``def`` and ``class``.\n\nstr.islower()\n\n   Return true if all cased characters [4] in the string are lowercase\n   and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n   Return true if all characters in the string are numeric characters,\n   and there is at least one character, false otherwise. Numeric\n   characters include digit characters, and all characters that have\n   the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n   ONE FIFTH.  Formally, numeric characters are those with the\n   property value Numeric_Type=Digit, Numeric_Type=Decimal or\n   Numeric_Type=Numeric.\n\nstr.isprintable()\n\n   Return true if all characters in the string are printable or the\n   string is empty, false otherwise.  Nonprintable characters are\n   those characters defined in the Unicode character database as\n   "Other" or "Separator", excepting the ASCII space (0x20) which is\n   considered printable.  (Note that printable characters in this\n   context are those which should not be escaped when ``repr()`` is\n   invoked on a string.  It has no bearing on the handling of strings\n   written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n   Return true if there are only whitespace characters in the string\n   and there is at least one character, false otherwise.  Whitespace\n   characters  are those characters defined in the Unicode character\n   database as "Other" or "Separator" and those with bidirectional\n   property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n   Return true if the string is a titlecased string and there is at\n   least one character, for example uppercase characters may only\n   follow uncased characters and lowercase characters only cased ones.\n   Return false otherwise.\n\nstr.isupper()\n\n   Return true if all cased characters [4] in the string are uppercase\n   and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n   Return a string which is the concatenation of the strings in the\n   *iterable* *iterable*.  A ``TypeError`` will be raised if there are\n   any non-string values in *iterable*, including ``bytes`` objects.\n   The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n   Return the string left justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space).  The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\nstr.lower()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to lowercase.\n\n   The lowercasing algorithm used is described in section 3.13 of the\n   Unicode Standard.\n\nstr.lstrip([chars])\n\n   Return a copy of the string with leading characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a prefix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.lstrip()\n   \'spacious   \'\n   >>> \'www.example.com\'.lstrip(\'cmowz.\')\n   \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n   This static method returns a translation table usable for\n   ``str.translate()``.\n\n   If there is only one argument, it must be a dictionary mapping\n   Unicode ordinals (integers) or characters (strings of length 1) to\n   Unicode ordinals, strings (of arbitrary lengths) or None.\n   Character keys will then be converted to ordinals.\n\n   If there are two arguments, they must be strings of equal length,\n   and in the resulting dictionary, each character in x will be mapped\n   to the character at the same position in y.  If there is a third\n   argument, it must be a string, whose characters will be mapped to\n   None in the result.\n\nstr.partition(sep)\n\n   Split the string at the first occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing the string itself, followed by\n   two empty strings.\n\nstr.replace(old, new[, count])\n\n   Return a copy of the string with all occurrences of substring *old*\n   replaced by *new*.  If the optional argument *count* is given, only\n   the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n   Return the highest index in the string where substring *sub* is\n   found, such that *sub* is contained within ``s[start:end]``.\n   Optional arguments *start* and *end* are interpreted as in slice\n   notation.  Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n   Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n   is not found.\n\nstr.rjust(width[, fillchar])\n\n   Return the string right justified in a string of length *width*.\n   Padding is done using the specified *fillchar* (default is a\n   space). The original string is returned if *width* is less than or\n   equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n   Split the string at the last occurrence of *sep*, and return a\n   3-tuple containing the part before the separator, the separator\n   itself, and the part after the separator.  If the separator is not\n   found, return a 3-tuple containing two empty strings, followed by\n   the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n   are done, the *rightmost* ones.  If *sep* is not specified or\n   ``None``, any whitespace string is a separator.  Except for\n   splitting from the right, ``rsplit()`` behaves like ``split()``\n   which is described in detail below.\n\nstr.rstrip([chars])\n\n   Return a copy of the string with trailing characters removed.  The\n   *chars* argument is a string specifying the set of characters to be\n   removed.  If omitted or ``None``, the *chars* argument defaults to\n   removing whitespace.  The *chars* argument is not a suffix; rather,\n   all combinations of its values are stripped:\n\n   >>> \'   spacious   \'.rstrip()\n   \'   spacious\'\n   >>> \'mississippi\'.rstrip(\'ipz\')\n   \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n   Return a list of the words in the string, using *sep* as the\n   delimiter string.  If *maxsplit* is given, at most *maxsplit*\n   splits are done (thus, the list will have at most ``maxsplit+1``\n   elements).  If *maxsplit* is not specified or ``-1``, then there is\n   no limit on the number of splits (all possible splits are made).\n\n   If *sep* is given, consecutive delimiters are not grouped together\n   and are deemed to delimit empty strings (for example,\n   ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``).  The *sep*\n   argument may consist of multiple characters (for example,\n   ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n   an empty string with a specified separator returns ``[\'\']``.\n\n   If *sep* is not specified or is ``None``, a different splitting\n   algorithm is applied: runs of consecutive whitespace are regarded\n   as a single separator, and the result will contain no empty strings\n   at the start or end if the string has leading or trailing\n   whitespace.  Consequently, splitting an empty string or a string\n   consisting of just whitespace with a ``None`` separator returns\n   ``[]``.\n\n   For example, ``\' 1  2   3  \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n   and ``\'  1  2   3  \'.split(None, 1)`` returns ``[\'1\', \'2   3  \']``.\n\nstr.splitlines([keepends])\n\n   Return a list of the lines in the string, breaking at line\n   boundaries. This method uses the *universal newlines* approach to\n   splitting lines. Line breaks are not included in the resulting list\n   unless *keepends* is given and true.\n\n   For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n   ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n   ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n   \'kl\\r\\n\']``.\n\n   Unlike ``split()`` when a delimiter string *sep* is given, this\n   method returns an empty list for the empty string, and a terminal\n   line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n   Return ``True`` if string starts with the *prefix*, otherwise\n   return ``False``. *prefix* can also be a tuple of prefixes to look\n   for.  With optional *start*, test string beginning at that\n   position.  With optional *end*, stop comparing string at that\n   position.\n\nstr.strip([chars])\n\n   Return a copy of the string with the leading and trailing\n   characters removed. The *chars* argument is a string specifying the\n   set of characters to be removed. If omitted or ``None``, the\n   *chars* argument defaults to removing whitespace. The *chars*\n   argument is not a prefix or suffix; rather, all combinations of its\n   values are stripped:\n\n   >>> \'   spacious   \'.strip()\n   \'spacious\'\n   >>> \'www.example.com\'.strip(\'cmowz.\')\n   \'example\'\n\nstr.swapcase()\n\n   Return a copy of the string with uppercase characters converted to\n   lowercase and vice versa. Note that it is not necessarily true that\n   ``s.swapcase().swapcase() == s``.\n\nstr.title()\n\n   Return a titlecased version of the string where words start with an\n   uppercase character and the remaining characters are lowercase.\n\n   The algorithm uses a simple language-independent definition of a\n   word as groups of consecutive letters.  The definition works in\n   many contexts but it means that apostrophes in contractions and\n   possessives form word boundaries, which may not be the desired\n   result:\n\n      >>> "they\'re bill\'s friends from the UK".title()\n      "They\'Re Bill\'S Friends From The Uk"\n\n   A workaround for apostrophes can be constructed using regular\n   expressions:\n\n      >>> import re\n      >>> def titlecase(s):\n      ...     return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n      ...                   lambda mo: mo.group(0)[0].upper() +\n      ...                              mo.group(0)[1:].lower(),\n      ...                   s)\n      ...\n      >>> titlecase("they\'re bill\'s friends.")\n      "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n   Return a copy of the *s* where all characters have been mapped\n   through the *map* which must be a dictionary of Unicode ordinals\n   (integers) to Unicode ordinals, strings or ``None``.  Unmapped\n   characters are left untouched. Characters mapped to ``None`` are\n   deleted.\n\n   You can use ``str.maketrans()`` to create a translation map from\n   character-to-character mappings in different formats.\n\n   Note: An even more flexible approach is to create a custom character\n     mapping codec using the ``codecs`` module (see\n     ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n   Return a copy of the string with all the cased characters [4]\n   converted to uppercase.  Note that ``str.upper().isupper()`` might\n   be ``False`` if ``s`` contains uncased characters or if the Unicode\n   category of the resulting character(s) is not "Lu" (Letter,\n   uppercase), but e.g. "Lt" (Letter, titlecase).\n\n   The uppercasing algorithm used is described in section 3.13 of the\n   Unicode Standard.\n\nstr.zfill(width)\n\n   Return the numeric string left filled with zeros in a string of\n   length *width*.  A sign prefix is handled correctly.  The original\n   string is returned if *width* is less than or equal to ``len(s)``.\n',
      'strings': '\nString and Bytes literals\n*************************\n\nString literals are described by the following lexical definitions:\n\n   stringliteral   ::= [stringprefix](shortstring | longstring)\n   stringprefix    ::= "r" | "u" | "R" | "U"\n   shortstring     ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n   longstring      ::= "\'\'\'" longstringitem* "\'\'\'" | \'"""\' longstringitem* \'"""\'\n   shortstringitem ::= shortstringchar | stringescapeseq\n   longstringitem  ::= longstringchar | stringescapeseq\n   shortstringchar ::= \n   longstringchar  ::= \n   stringescapeseq ::= "\\" \n\n   bytesliteral   ::= bytesprefix(shortbytes | longbytes)\n   bytesprefix    ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"\n   shortbytes     ::= "\'" shortbytesitem* "\'" | \'"\' shortbytesitem* \'"\'\n   longbytes      ::= "\'\'\'" longbytesitem* "\'\'\'" | \'"""\' longbytesitem* \'"""\'\n   shortbytesitem ::= shortbyteschar | bytesescapeseq\n   longbytesitem  ::= longbyteschar | bytesescapeseq\n   shortbyteschar ::= \n   longbyteschar  ::= \n   bytesescapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` or\n``bytesprefix`` and the rest of the literal. The source character set\nis defined by the encoding declaration; it is UTF-8 if no encoding\ndeclaration is given in the source file; see section *Encoding\ndeclarations*.\n\nIn plain English: Both types of literals can be enclosed in matching\nsingle quotes (``\'``) or double quotes (``"``).  They can also be\nenclosed in matching groups of three single or double quotes (these\nare generally referred to as *triple-quoted strings*).  The backslash\n(``\\``) character is used to escape characters that otherwise have a\nspecial meaning, such as newline, backslash itself, or the quote\ncharacter.\n\nBytes literals are always prefixed with ``\'b\'`` or ``\'B\'``; they\nproduce an instance of the ``bytes`` type instead of the ``str`` type.\nThey may only contain ASCII characters; bytes with a numeric value of\n128 or greater must be expressed with escapes.\n\nAs of Python 3.3 it is possible again to prefix unicode strings with a\n``u`` prefix to simplify maintenance of dual 2.x and 3.x codebases.\n\nBoth string and bytes literals may optionally be prefixed with a\nletter ``\'r\'`` or ``\'R\'``; such strings are called *raw strings* and\ntreat backslashes as literal characters.  As a result, in string\nliterals, ``\'\\U\'`` and ``\'\\u\'`` escapes in raw strings are not treated\nspecially. Given that Python 2.x\'s raw unicode literals behave\ndifferently than Python 3.x\'s the ``\'ur\'`` syntax is not supported.\n\n   New in version 3.3: The ``\'rb\'`` prefix of raw bytes literals has\n   been added as a synonym of ``\'br\'``.\n\n   New in version 3.3: Support for the unicode legacy literal\n   (``u\'value\'``) was reintroduced to simplify the maintenance of dual\n   Python 2.x and 3.x codebases. See **PEP 414** for more information.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string.  (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C.  The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence   | Meaning                           | Notes   |\n+===================+===================================+=========+\n| ``\\newline``      | Backslash and newline ignored     |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\\``            | Backslash (``\\``)                 |         |\n+-------------------+-----------------------------------+---------+\n| ``\\\'``            | Single quote (``\'``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\"``            | Double quote (``"``)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\a``            | ASCII Bell (BEL)                  |         |\n+-------------------+-----------------------------------+---------+\n| ``\\b``            | ASCII Backspace (BS)              |         |\n+-------------------+-----------------------------------+---------+\n| ``\\f``            | ASCII Formfeed (FF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\n``            | ASCII Linefeed (LF)               |         |\n+-------------------+-----------------------------------+---------+\n| ``\\r``            | ASCII Carriage Return (CR)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\t``            | ASCII Horizontal Tab (TAB)        |         |\n+-------------------+-----------------------------------+---------+\n| ``\\v``            | ASCII Vertical Tab (VT)           |         |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo``          | Character with octal value *ooo*  | (1,3)   |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh``          | Character with hex value *hh*     | (2,3)   |\n+-------------------+-----------------------------------+---------+\n\nEscape sequences only recognized in string literals are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence   | Meaning                           | Notes   |\n+===================+===================================+=========+\n| ``\\N{name}``      | Character named *name* in the     | (4)     |\n|                   | Unicode database                  |         |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx``        | Character with 16-bit hex value   | (5)     |\n|                   | *xxxx*                            |         |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx``    | Character with 32-bit hex value   | (6)     |\n|                   | *xxxxxxxx*                        |         |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. As in Standard C, up to three octal digits are accepted.\n\n2. Unlike in Standard C, exactly two hex digits are required.\n\n3. In a bytes literal, hexadecimal and octal escapes denote the byte\n   with the given value. In a string literal, these escapes denote a\n   Unicode character with the given value.\n\n4. Changed in version 3.3: Support for name aliases [1] has been\n   added.\n\n5. Individual code units which form parts of a surrogate pair can be\n   encoded using this escape sequence.  Exactly four hex digits are\n   required.\n\n6. Any Unicode character can be encoded this way.  Exactly eight hex\n   digits are required.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*.  (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.)  It is also\nimportant to note that the escape sequences only recognized in string\nliterals fall into the category of unrecognized escapes for bytes\nliterals.\n\nEven in a raw string, string quotes can be escaped with a backslash,\nbut the backslash remains in the string; for example, ``r"\\""`` is a\nvalid string literal consisting of two characters: a backslash and a\ndouble quote; ``r"\\"`` is not a valid string literal (even a raw\nstring cannot end in an odd number of backslashes).  Specifically, *a\nraw string cannot end in a single backslash* (since the backslash\nwould escape the following quote character).  Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n',
      'subscriptions': '\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n   subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object that supports subscription,\ne.g. a list or dictionary.  User-defined objects can support\nsubscription by defining a ``__getitem__()`` method.\n\nFor built-in objects, there are two types of objects that support\nsubscription:\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey.  (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to\nan integer or a slice (as discussed in the following section).\n\nThe formal syntax makes no special provision for negative indices in\nsequences; however, built-in sequences all provide a ``__getitem__()``\nmethod that interprets negative indices by adding the length of the\nsequence to the index (so that ``x[-1]`` selects the last item of\n``x``).  The resulting value must be a nonnegative integer less than\nthe number of items in the sequence, and the subscription selects the\nitem whose index is that value (counting from zero). Since the support\nfor negative indices and slicing occurs in the object\'s\n``__getitem__()`` method, subclasses overriding this method will need\nto explicitly add that support.\n\nA string\'s items are characters.  A character is not a separate data\ntype but a string of exactly one character.\n',
      'truth': "\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an ``if`` or\n``while`` condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* ``None``\n\n* ``False``\n\n* zero of any numeric type, for example, ``0``, ``0.0``, ``0j``.\n\n* any empty sequence, for example, ``''``, ``()``, ``[]``.\n\n* any empty mapping, for example, ``{}``.\n\n* instances of user-defined classes, if the class defines a\n  ``__bool__()`` or ``__len__()`` method, when that method returns the\n  integer zero or ``bool`` value ``False``. [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn ``0`` or ``False`` for false and ``1`` or ``True`` for true,\nunless otherwise stated. (Important exception: the Boolean operations\n``or`` and ``and`` always return one of their operands.)\n",
      'try': '\nThe ``try`` statement\n*********************\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n   try_stmt  ::= try1_stmt | try2_stmt\n   try1_stmt ::= "try" ":" suite\n                 ("except" [expression ["as" target]] ":" suite)+\n                 ["else" ":" suite]\n                 ["finally" ":" suite]\n   try2_stmt ::= "try" ":" suite\n                 "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started.  This search inspects the except\nclauses in turn until one is found that matches the exception.  An\nexpression-less except clause, if present, must be last; it matches\nany exception.  For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception.  An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed.  All except\nclauses must have an executable block.  When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause.  This is as if\n\n   except E as N:\n       foo\n\nwas translated to\n\n   except E as N:\n       try:\n           foo\n       finally:\n           del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause.  Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred.  ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler.  The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses.  If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted.  If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause.  If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n   def f():\n       try:\n           1/0\n       finally:\n           return 42\n\n   >>> f()\n   42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n',
    - 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python.  Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types.  Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\'  These are attributes that provide access to the\nimplementation and are not intended for general use.  Their definition\nmay change in the future.\n\nNone\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name ``None``.\n   It is used to signify the absence of a value in many situations,\n   e.g., it is returned from functions that don\'t explicitly return\n   anything. Its truth value is false.\n\nNotImplemented\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``NotImplemented``. Numeric methods and rich comparison methods may\n   return this value if they do not implement the operation for the\n   operands provided.  (The interpreter will then try the reflected\n   operation, or some other fallback, depending on the operator.)  Its\n   truth value is true.\n\nEllipsis\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the literal ``...`` or the\n   built-in name ``Ellipsis``.  Its truth value is true.\n\n``numbers.Number``\n   These are created by numeric literals and returned as results by\n   arithmetic operators and arithmetic built-in functions.  Numeric\n   objects are immutable; once created their value never changes.\n   Python numbers are of course strongly related to mathematical\n   numbers, but subject to the limitations of numerical representation\n   in computers.\n\n   Python distinguishes between integers, floating point numbers, and\n   complex numbers:\n\n   ``numbers.Integral``\n      These represent elements from the mathematical set of integers\n      (positive and negative).\n\n      There are two types of integers:\n\n      Integers (``int``)\n\n         These represent numbers in an unlimited range, subject to\n         available (virtual) memory only.  For the purpose of shift\n         and mask operations, a binary representation is assumed, and\n         negative numbers are represented in a variant of 2\'s\n         complement which gives the illusion of an infinite string of\n         sign bits extending to the left.\n\n      Booleans (``bool``)\n         These represent the truth values False and True.  The two\n         objects representing the values False and True are the only\n         Boolean objects. The Boolean type is a subtype of the integer\n         type, and Boolean values behave like the values 0 and 1,\n         respectively, in almost all contexts, the exception being\n         that when converted to a string, the strings ``"False"`` or\n         ``"True"`` are returned, respectively.\n\n      The rules for integer representation are intended to give the\n      most meaningful interpretation of shift and mask operations\n      involving negative integers.\n\n   ``numbers.Real`` (``float``)\n      These represent machine-level double precision floating point\n      numbers. You are at the mercy of the underlying machine\n      architecture (and C or Java implementation) for the accepted\n      range and handling of overflow. Python does not support single-\n      precision floating point numbers; the savings in processor and\n      memory usage that are usually the reason for using these is\n      dwarfed by the overhead of using objects in Python, so there is\n      no reason to complicate the language with two kinds of floating\n      point numbers.\n\n   ``numbers.Complex`` (``complex``)\n      These represent complex numbers as a pair of machine-level\n      double precision floating point numbers.  The same caveats apply\n      as for floating point numbers. The real and imaginary parts of a\n      complex number ``z`` can be retrieved through the read-only\n      attributes ``z.real`` and ``z.imag``.\n\nSequences\n   These represent finite ordered sets indexed by non-negative\n   numbers. The built-in function ``len()`` returns the number of\n   items of a sequence. When the length of a sequence is *n*, the\n   index set contains the numbers 0, 1, ..., *n*-1.  Item *i* of\n   sequence *a* is selected by ``a[i]``.\n\n   Sequences also support slicing: ``a[i:j]`` selects all items with\n   index *k* such that *i* ``<=`` *k* ``<`` *j*.  When used as an\n   expression, a slice is a sequence of the same type.  This implies\n   that the index set is renumbered so that it starts at 0.\n\n   Some sequences also support "extended slicing" with a third "step"\n   parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n   where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n   *j*.\n\n   Sequences are distinguished according to their mutability:\n\n   Immutable sequences\n      An object of an immutable sequence type cannot change once it is\n      created.  (If the object contains references to other objects,\n      these other objects may be mutable and may be changed; however,\n      the collection of objects directly referenced by an immutable\n      object cannot change.)\n\n      The following types are immutable sequences:\n\n      Strings\n         A string is a sequence of values that represent Unicode\n         codepoints. All the codepoints in range ``U+0000 - U+10FFFF``\n         can be represented in a string.  Python doesn\'t have a\n         ``chr`` type, and every character in the string is\n         represented as a string object with length ``1``.  The built-\n         in function ``ord()`` converts a character to its codepoint\n         (as an integer); ``chr()`` converts an integer in range ``0 -\n         10FFFF`` to the corresponding character. ``str.encode()`` can\n         be used to convert a ``str`` to ``bytes`` using the given\n         encoding, and ``bytes.decode()`` can be used to achieve the\n         opposite.\n\n      Tuples\n         The items of a tuple are arbitrary Python objects. Tuples of\n         two or more items are formed by comma-separated lists of\n         expressions.  A tuple of one item (a \'singleton\') can be\n         formed by affixing a comma to an expression (an expression by\n         itself does not create a tuple, since parentheses must be\n         usable for grouping of expressions).  An empty tuple can be\n         formed by an empty pair of parentheses.\n\n      Bytes\n         A bytes object is an immutable array.  The items are 8-bit\n         bytes, represented by integers in the range 0 <= x < 256.\n         Bytes literals (like ``b\'abc\'``) and the built-in function\n         ``bytes()`` can be used to construct bytes objects.  Also,\n         bytes objects can be decoded to strings via the ``decode()``\n         method.\n\n   Mutable sequences\n      Mutable sequences can be changed after they are created.  The\n      subscription and slicing notations can be used as the target of\n      assignment and ``del`` (delete) statements.\n\n      There are currently two intrinsic mutable sequence types:\n\n      Lists\n         The items of a list are arbitrary Python objects.  Lists are\n         formed by placing a comma-separated list of expressions in\n         square brackets. (Note that there are no special cases needed\n         to form lists of length 0 or 1.)\n\n      Byte Arrays\n         A bytearray object is a mutable array. They are created by\n         the built-in ``bytearray()`` constructor.  Aside from being\n         mutable (and hence unhashable), byte arrays otherwise provide\n         the same interface and functionality as immutable bytes\n         objects.\n\n      The extension module ``array`` provides an additional example of\n      a mutable sequence type, as does the ``collections`` module.\n\nSet types\n   These represent unordered, finite sets of unique, immutable\n   objects. As such, they cannot be indexed by any subscript. However,\n   they can be iterated over, and the built-in function ``len()``\n   returns the number of items in a set. Common uses for sets are fast\n   membership testing, removing duplicates from a sequence, and\n   computing mathematical operations such as intersection, union,\n   difference, and symmetric difference.\n\n   For set elements, the same immutability rules apply as for\n   dictionary keys. Note that numeric types obey the normal rules for\n   numeric comparison: if two numbers compare equal (e.g., ``1`` and\n   ``1.0``), only one of them can be contained in a set.\n\n   There are currently two intrinsic set types:\n\n   Sets\n      These represent a mutable set. They are created by the built-in\n      ``set()`` constructor and can be modified afterwards by several\n      methods, such as ``add()``.\n\n   Frozen sets\n      These represent an immutable set.  They are created by the\n      built-in ``frozenset()`` constructor.  As a frozenset is\n      immutable and *hashable*, it can be used again as an element of\n      another set, or as a dictionary key.\n\nMappings\n   These represent finite sets of objects indexed by arbitrary index\n   sets. The subscript notation ``a[k]`` selects the item indexed by\n   ``k`` from the mapping ``a``; this can be used in expressions and\n   as the target of assignments or ``del`` statements. The built-in\n   function ``len()`` returns the number of items in a mapping.\n\n   There is currently a single intrinsic mapping type:\n\n   Dictionaries\n      These represent finite sets of objects indexed by nearly\n      arbitrary values.  The only types of values not acceptable as\n      keys are values containing lists or dictionaries or other\n      mutable types that are compared by value rather than by object\n      identity, the reason being that the efficient implementation of\n      dictionaries requires a key\'s hash value to remain constant.\n      Numeric types used for keys obey the normal rules for numeric\n      comparison: if two numbers compare equal (e.g., ``1`` and\n      ``1.0``) then they can be used interchangeably to index the same\n      dictionary entry.\n\n      Dictionaries are mutable; they can be created by the ``{...}``\n      notation (see section *Dictionary displays*).\n\n      The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n      additional examples of mapping types, as does the\n      ``collections`` module.\n\nCallable types\n   These are the types to which the function call operation (see\n   section *Calls*) can be applied:\n\n   User-defined functions\n      A user-defined function object is created by a function\n      definition (see section *Function definitions*).  It should be\n      called with an argument list containing the same number of items\n      as the function\'s formal parameter list.\n\n      Special attributes:\n\n      +---------------------------+---------------------------------+-------------+\n      | Attribute                 | Meaning                         |             |\n      +===========================+=================================+=============+\n      | ``__doc__``               | The function\'s documentation    | Writable    |\n      |                           | string, or ``None`` if          |             |\n      |                           | unavailable                     |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__name__``              | The function\'s name             | Writable    |\n      +---------------------------+---------------------------------+-------------+\n      | ``__qualname__``          | The function\'s *qualified name* | Writable    |\n      |                           | New in version 3.3.             |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__module__``            | The name of the module the      | Writable    |\n      |                           | function was defined in, or     |             |\n      |                           | ``None`` if unavailable.        |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__defaults__``          | A tuple containing default      | Writable    |\n      |                           | argument values for those       |             |\n      |                           | arguments that have defaults,   |             |\n      |                           | or ``None`` if no arguments     |             |\n      |                           | have a default value            |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__code__``              | The code object representing    | Writable    |\n      |                           | the compiled function body.     |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__globals__``           | A reference to the dictionary   | Read-only   |\n      |                           | that holds the function\'s       |             |\n      |                           | global variables --- the global |             |\n      |                           | namespace of the module in      |             |\n      |                           | which the function was defined. |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__dict__``              | The namespace supporting        | Writable    |\n      |                           | arbitrary function attributes.  |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__closure__``           | ``None`` or a tuple of cells    | Read-only   |\n      |                           | that contain bindings for the   |             |\n      |                           | function\'s free variables.      |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__annotations__``       | A dict containing annotations   | Writable    |\n      |                           | of parameters.  The keys of the |             |\n      |                           | dict are the parameter names,   |             |\n      |                           | or ``\'return\'`` for the return  |             |\n      |                           | annotation, if provided.        |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__kwdefaults__``        | A dict containing defaults for  | Writable    |\n      |                           | keyword-only parameters.        |             |\n      +---------------------------+---------------------------------+-------------+\n\n      Most of the attributes labelled "Writable" check the type of the\n      assigned value.\n\n      Function objects also support getting and setting arbitrary\n      attributes, which can be used, for example, to attach metadata\n      to functions.  Regular attribute dot-notation is used to get and\n      set such attributes. *Note that the current implementation only\n      supports function attributes on user-defined functions. Function\n      attributes on built-in functions may be supported in the\n      future.*\n\n      Additional information about a function\'s definition can be\n      retrieved from its code object; see the description of internal\n      types below.\n\n   Instance methods\n      An instance method object combines a class, a class instance and\n      any callable object (normally a user-defined function).\n\n      Special read-only attributes: ``__self__`` is the class instance\n      object, ``__func__`` is the function object; ``__doc__`` is the\n      method\'s documentation (same as ``__func__.__doc__``);\n      ``__name__`` is the method name (same as ``__func__.__name__``);\n      ``__module__`` is the name of the module the method was defined\n      in, or ``None`` if unavailable.\n\n      Methods also support accessing (but not setting) the arbitrary\n      function attributes on the underlying function object.\n\n      User-defined method objects may be created when getting an\n      attribute of a class (perhaps via an instance of that class), if\n      that attribute is a user-defined function object or a class\n      method object.\n\n      When an instance method object is created by retrieving a user-\n      defined function object from a class via one of its instances,\n      its ``__self__`` attribute is the instance, and the method\n      object is said to be bound.  The new method\'s ``__func__``\n      attribute is the original function object.\n\n      When a user-defined method object is created by retrieving\n      another method object from a class or instance, the behaviour is\n      the same as for a function object, except that the ``__func__``\n      attribute of the new instance is not the original method object\n      but its ``__func__`` attribute.\n\n      When an instance method object is created by retrieving a class\n      method object from a class or instance, its ``__self__``\n      attribute is the class itself, and its ``__func__`` attribute is\n      the function object underlying the class method.\n\n      When an instance method object is called, the underlying\n      function (``__func__``) is called, inserting the class instance\n      (``__self__``) in front of the argument list.  For instance,\n      when ``C`` is a class which contains a definition for a function\n      ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n      is equivalent to calling ``C.f(x, 1)``.\n\n      When an instance method object is derived from a class method\n      object, the "class instance" stored in ``__self__`` will\n      actually be the class itself, so that calling either ``x.f(1)``\n      or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n      the underlying function.\n\n      Note that the transformation from function object to instance\n      method object happens each time the attribute is retrieved from\n      the instance.  In some cases, a fruitful optimization is to\n      assign the attribute to a local variable and call that local\n      variable. Also notice that this transformation only happens for\n      user-defined functions; other callable objects (and all non-\n      callable objects) are retrieved without transformation.  It is\n      also important to note that user-defined functions which are\n      attributes of a class instance are not converted to bound\n      methods; this *only* happens when the function is an attribute\n      of the class.\n\n   Generator functions\n      A function or method which uses the ``yield`` statement (see\n      section *The yield statement*) is called a *generator function*.\n      Such a function, when called, always returns an iterator object\n      which can be used to execute the body of the function:  calling\n      the iterator\'s ``iterator__next__()`` method will cause the\n      function to execute until it provides a value using the\n      ``yield`` statement.  When the function executes a ``return``\n      statement or falls off the end, a ``StopIteration`` exception is\n      raised and the iterator will have reached the end of the set of\n      values to be returned.\n\n   Built-in functions\n      A built-in function object is a wrapper around a C function.\n      Examples of built-in functions are ``len()`` and ``math.sin()``\n      (``math`` is a standard built-in module). The number and type of\n      the arguments are determined by the C function. Special read-\n      only attributes: ``__doc__`` is the function\'s documentation\n      string, or ``None`` if unavailable; ``__name__`` is the\n      function\'s name; ``__self__`` is set to ``None`` (but see the\n      next item); ``__module__`` is the name of the module the\n      function was defined in or ``None`` if unavailable.\n\n   Built-in methods\n      This is really a different disguise of a built-in function, this\n      time containing an object passed to the C function as an\n      implicit extra argument.  An example of a built-in method is\n      ``alist.append()``, assuming *alist* is a list object. In this\n      case, the special read-only attribute ``__self__`` is set to the\n      object denoted by *alist*.\n\n   Classes\n      Classes are callable.  These objects normally act as factories\n      for new instances of themselves, but variations are possible for\n      class types that override ``__new__()``.  The arguments of the\n      call are passed to ``__new__()`` and, in the typical case, to\n      ``__init__()`` to initialize the new instance.\n\n   Class Instances\n      Instances of arbitrary classes can be made callable by defining\n      a ``__call__()`` method in their class.\n\nModules\n   Modules are a basic organizational unit of Python code, and are\n   created by the *import system* as invoked either by the ``import``\n   statement (see ``import``), or by calling functions such as\n   ``importlib.import_module()`` and built-in ``__import__()``.  A\n   module object has a namespace implemented by a dictionary object\n   (this is the dictionary referenced by the ``__globals__`` attribute\n   of functions defined in the module).  Attribute references are\n   translated to lookups in this dictionary, e.g., ``m.x`` is\n   equivalent to ``m.__dict__["x"]``. A module object does not contain\n   the code object used to initialize the module (since it isn\'t\n   needed once the initialization is done).\n\n   Attribute assignment updates the module\'s namespace dictionary,\n   e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n   Special read-only attribute: ``__dict__`` is the module\'s namespace\n   as a dictionary object.\n\n   **CPython implementation detail:** Because of the way CPython\n   clears module dictionaries, the module dictionary will be cleared\n   when the module falls out of scope even if the dictionary still has\n   live references.  To avoid this, copy the dictionary or keep the\n   module around while using its dictionary directly.\n\n   Predefined (writable) attributes: ``__name__`` is the module\'s\n   name; ``__doc__`` is the module\'s documentation string, or ``None``\n   if unavailable; ``__file__`` is the pathname of the file from which\n   the module was loaded, if it was loaded from a file. The\n   ``__file__`` attribute may be missing for certain types of modules,\n   such as C modules that are statically linked into the interpreter;\n   for extension modules loaded dynamically from a shared library, it\n   is the pathname of the shared library file.\n\nCustom classes\n   Custom class types are typically created by class definitions (see\n   section *Class definitions*).  A class has a namespace implemented\n   by a dictionary object. Class attribute references are translated\n   to lookups in this dictionary, e.g., ``C.x`` is translated to\n   ``C.__dict__["x"]`` (although there are a number of hooks which\n   allow for other means of locating attributes). When the attribute\n   name is not found there, the attribute search continues in the base\n   classes. This search of the base classes uses the C3 method\n   resolution order which behaves correctly even in the presence of\n   \'diamond\' inheritance structures where there are multiple\n   inheritance paths leading back to a common ancestor. Additional\n   details on the C3 MRO used by Python can be found in the\n   documentation accompanying the 2.3 release at\n   http://www.python.org/download/releases/2.3/mro/.\n\n   When a class attribute reference (for class ``C``, say) would yield\n   a class method object, it is transformed into an instance method\n   object whose ``__self__`` attributes is ``C``.  When it would yield\n   a static method object, it is transformed into the object wrapped\n   by the static method object. See section *Implementing Descriptors*\n   for another way in which attributes retrieved from a class may\n   differ from those actually contained in its ``__dict__``.\n\n   Class attribute assignments update the class\'s dictionary, never\n   the dictionary of a base class.\n\n   A class object can be called (see above) to yield a class instance\n   (see below).\n\n   Special attributes: ``__name__`` is the class name; ``__module__``\n   is the module name in which the class was defined; ``__dict__`` is\n   the dictionary containing the class\'s namespace; ``__bases__`` is a\n   tuple (possibly empty or a singleton) containing the base classes,\n   in the order of their occurrence in the base class list;\n   ``__doc__`` is the class\'s documentation string, or None if\n   undefined.\n\nClass instances\n   A class instance is created by calling a class object (see above).\n   A class instance has a namespace implemented as a dictionary which\n   is the first place in which attribute references are searched.\n   When an attribute is not found there, and the instance\'s class has\n   an attribute by that name, the search continues with the class\n   attributes.  If a class attribute is found that is a user-defined\n   function object, it is transformed into an instance method object\n   whose ``__self__`` attribute is the instance.  Static method and\n   class method objects are also transformed; see above under\n   "Classes".  See section *Implementing Descriptors* for another way\n   in which attributes of a class retrieved via its instances may\n   differ from the objects actually stored in the class\'s\n   ``__dict__``.  If no class attribute is found, and the object\'s\n   class has a ``__getattr__()`` method, that is called to satisfy the\n   lookup.\n\n   Attribute assignments and deletions update the instance\'s\n   dictionary, never a class\'s dictionary.  If the class has a\n   ``__setattr__()`` or ``__delattr__()`` method, this is called\n   instead of updating the instance dictionary directly.\n\n   Class instances can pretend to be numbers, sequences, or mappings\n   if they have methods with certain special names.  See section\n   *Special method names*.\n\n   Special attributes: ``__dict__`` is the attribute dictionary;\n   ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n   A *file object* represents an open file.  Various shortcuts are\n   available to create file objects: the ``open()`` built-in function,\n   and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n   method of socket objects (and perhaps by other functions or methods\n   provided by extension modules).\n\n   The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n   initialized to file objects corresponding to the interpreter\'s\n   standard input, output and error streams; they are all open in text\n   mode and therefore follow the interface defined by the\n   ``io.TextIOBase`` abstract class.\n\nInternal types\n   A few types used internally by the interpreter are exposed to the\n   user. Their definitions may change with future versions of the\n   interpreter, but they are mentioned here for completeness.\n\n   Code objects\n      Code objects represent *byte-compiled* executable Python code,\n      or *bytecode*. The difference between a code object and a\n      function object is that the function object contains an explicit\n      reference to the function\'s globals (the module in which it was\n      defined), while a code object contains no context; also the\n      default argument values are stored in the function object, not\n      in the code object (because they represent values calculated at\n      run-time).  Unlike function objects, code objects are immutable\n      and contain no references (directly or indirectly) to mutable\n      objects.\n\n      Special read-only attributes: ``co_name`` gives the function\n      name; ``co_argcount`` is the number of positional arguments\n      (including arguments with default values); ``co_nlocals`` is the\n      number of local variables used by the function (including\n      arguments); ``co_varnames`` is a tuple containing the names of\n      the local variables (starting with the argument names);\n      ``co_cellvars`` is a tuple containing the names of local\n      variables that are referenced by nested functions;\n      ``co_freevars`` is a tuple containing the names of free\n      variables; ``co_code`` is a string representing the sequence of\n      bytecode instructions; ``co_consts`` is a tuple containing the\n      literals used by the bytecode; ``co_names`` is a tuple\n      containing the names used by the bytecode; ``co_filename`` is\n      the filename from which the code was compiled;\n      ``co_firstlineno`` is the first line number of the function;\n      ``co_lnotab`` is a string encoding the mapping from bytecode\n      offsets to line numbers (for details see the source code of the\n      interpreter); ``co_stacksize`` is the required stack size\n      (including local variables); ``co_flags`` is an integer encoding\n      a number of flags for the interpreter.\n\n      The following flag bits are defined for ``co_flags``: bit\n      ``0x04`` is set if the function uses the ``*arguments`` syntax\n      to accept an arbitrary number of positional arguments; bit\n      ``0x08`` is set if the function uses the ``**keywords`` syntax\n      to accept arbitrary keyword arguments; bit ``0x20`` is set if\n      the function is a generator.\n\n      Future feature declarations (``from __future__ import\n      division``) also use bits in ``co_flags`` to indicate whether a\n      code object was compiled with a particular feature enabled: bit\n      ``0x2000`` is set if the function was compiled with future\n      division enabled; bits ``0x10`` and ``0x1000`` were used in\n      earlier versions of Python.\n\n      Other bits in ``co_flags`` are reserved for internal use.\n\n      If a code object represents a function, the first item in\n      ``co_consts`` is the documentation string of the function, or\n      ``None`` if undefined.\n\n   Frame objects\n      Frame objects represent execution frames.  They may occur in\n      traceback objects (see below).\n\n      Special read-only attributes: ``f_back`` is to the previous\n      stack frame (towards the caller), or ``None`` if this is the\n      bottom stack frame; ``f_code`` is the code object being executed\n      in this frame; ``f_locals`` is the dictionary used to look up\n      local variables; ``f_globals`` is used for global variables;\n      ``f_builtins`` is used for built-in (intrinsic) names;\n      ``f_lasti`` gives the precise instruction (this is an index into\n      the bytecode string of the code object).\n\n      Special writable attributes: ``f_trace``, if not ``None``, is a\n      function called at the start of each source code line (this is\n      used by the debugger); ``f_lineno`` is the current line number\n      of the frame --- writing to this from within a trace function\n      jumps to the given line (only for the bottom-most frame).  A\n      debugger can implement a Jump command (aka Set Next Statement)\n      by writing to f_lineno.\n\n   Traceback objects\n      Traceback objects represent a stack trace of an exception.  A\n      traceback object is created when an exception occurs.  When the\n      search for an exception handler unwinds the execution stack, at\n      each unwound level a traceback object is inserted in front of\n      the current traceback.  When an exception handler is entered,\n      the stack trace is made available to the program. (See section\n      *The try statement*.) It is accessible as the third item of the\n      tuple returned by ``sys.exc_info()``. When the program contains\n      no suitable handler, the stack trace is written (nicely\n      formatted) to the standard error stream; if the interpreter is\n      interactive, it is also made available to the user as\n      ``sys.last_traceback``.\n\n      Special read-only attributes: ``tb_next`` is the next level in\n      the stack trace (towards the frame where the exception\n      occurred), or ``None`` if there is no next level; ``tb_frame``\n      points to the execution frame of the current level;\n      ``tb_lineno`` gives the line number where the exception\n      occurred; ``tb_lasti`` indicates the precise instruction.  The\n      line number and last instruction in the traceback may differ\n      from the line number of its frame object if the exception\n      occurred in a ``try`` statement with no matching except clause\n      or with a finally clause.\n\n   Slice objects\n      Slice objects are used to represent slices for ``__getitem__()``\n      methods.  They are also created by the built-in ``slice()``\n      function.\n\n      Special read-only attributes: ``start`` is the lower bound;\n      ``stop`` is the upper bound; ``step`` is the step value; each is\n      ``None`` if omitted. These attributes can have any type.\n\n      Slice objects support one method:\n\n      slice.indices(self, length)\n\n         This method takes a single integer argument *length* and\n         computes information about the slice that the slice object\n         would describe if applied to a sequence of *length* items.\n         It returns a tuple of three integers; respectively these are\n         the *start* and *stop* indices and the *step* or stride\n         length of the slice. Missing or out-of-bounds indices are\n         handled in a manner consistent with regular slices.\n\n   Static method objects\n      Static method objects provide a way of defeating the\n      transformation of function objects to method objects described\n      above. A static method object is a wrapper around any other\n      object, usually a user-defined method object. When a static\n      method object is retrieved from a class or a class instance, the\n      object actually returned is the wrapped object, which is not\n      subject to any further transformation. Static method objects are\n      not themselves callable, although the objects they wrap usually\n      are. Static method objects are created by the built-in\n      ``staticmethod()`` constructor.\n\n   Class method objects\n      A class method object, like a static method object, is a wrapper\n      around another object that alters the way in which that object\n      is retrieved from classes and class instances. The behaviour of\n      class method objects upon such retrieval is described above,\n      under "User-defined methods". Class method objects are created\n      by the built-in ``classmethod()`` constructor.\n',
    + 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python.  Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types.  Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\'  These are attributes that provide access to the\nimplementation and are not intended for general use.  Their definition\nmay change in the future.\n\nNone\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name ``None``.\n   It is used to signify the absence of a value in many situations,\n   e.g., it is returned from functions that don\'t explicitly return\n   anything. Its truth value is false.\n\nNotImplemented\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the built-in name\n   ``NotImplemented``. Numeric methods and rich comparison methods may\n   return this value if they do not implement the operation for the\n   operands provided.  (The interpreter will then try the reflected\n   operation, or some other fallback, depending on the operator.)  Its\n   truth value is true.\n\nEllipsis\n   This type has a single value.  There is a single object with this\n   value. This object is accessed through the literal ``...`` or the\n   built-in name ``Ellipsis``.  Its truth value is true.\n\n``numbers.Number``\n   These are created by numeric literals and returned as results by\n   arithmetic operators and arithmetic built-in functions.  Numeric\n   objects are immutable; once created their value never changes.\n   Python numbers are of course strongly related to mathematical\n   numbers, but subject to the limitations of numerical representation\n   in computers.\n\n   Python distinguishes between integers, floating point numbers, and\n   complex numbers:\n\n   ``numbers.Integral``\n      These represent elements from the mathematical set of integers\n      (positive and negative).\n\n      There are two types of integers:\n\n      Integers (``int``)\n\n         These represent numbers in an unlimited range, subject to\n         available (virtual) memory only.  For the purpose of shift\n         and mask operations, a binary representation is assumed, and\n         negative numbers are represented in a variant of 2\'s\n         complement which gives the illusion of an infinite string of\n         sign bits extending to the left.\n\n      Booleans (``bool``)\n         These represent the truth values False and True.  The two\n         objects representing the values False and True are the only\n         Boolean objects. The Boolean type is a subtype of the integer\n         type, and Boolean values behave like the values 0 and 1,\n         respectively, in almost all contexts, the exception being\n         that when converted to a string, the strings ``"False"`` or\n         ``"True"`` are returned, respectively.\n\n      The rules for integer representation are intended to give the\n      most meaningful interpretation of shift and mask operations\n      involving negative integers.\n\n   ``numbers.Real`` (``float``)\n      These represent machine-level double precision floating point\n      numbers. You are at the mercy of the underlying machine\n      architecture (and C or Java implementation) for the accepted\n      range and handling of overflow. Python does not support single-\n      precision floating point numbers; the savings in processor and\n      memory usage that are usually the reason for using these is\n      dwarfed by the overhead of using objects in Python, so there is\n      no reason to complicate the language with two kinds of floating\n      point numbers.\n\n   ``numbers.Complex`` (``complex``)\n      These represent complex numbers as a pair of machine-level\n      double precision floating point numbers.  The same caveats apply\n      as for floating point numbers. The real and imaginary parts of a\n      complex number ``z`` can be retrieved through the read-only\n      attributes ``z.real`` and ``z.imag``.\n\nSequences\n   These represent finite ordered sets indexed by non-negative\n   numbers. The built-in function ``len()`` returns the number of\n   items of a sequence. When the length of a sequence is *n*, the\n   index set contains the numbers 0, 1, ..., *n*-1.  Item *i* of\n   sequence *a* is selected by ``a[i]``.\n\n   Sequences also support slicing: ``a[i:j]`` selects all items with\n   index *k* such that *i* ``<=`` *k* ``<`` *j*.  When used as an\n   expression, a slice is a sequence of the same type.  This implies\n   that the index set is renumbered so that it starts at 0.\n\n   Some sequences also support "extended slicing" with a third "step"\n   parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n   where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n   *j*.\n\n   Sequences are distinguished according to their mutability:\n\n   Immutable sequences\n      An object of an immutable sequence type cannot change once it is\n      created.  (If the object contains references to other objects,\n      these other objects may be mutable and may be changed; however,\n      the collection of objects directly referenced by an immutable\n      object cannot change.)\n\n      The following types are immutable sequences:\n\n      Strings\n         A string is a sequence of values that represent Unicode\n         codepoints. All the codepoints in range ``U+0000 - U+10FFFF``\n         can be represented in a string.  Python doesn\'t have a\n         ``chr`` type, and every character in the string is\n         represented as a string object with length ``1``.  The built-\n         in function ``ord()`` converts a character to its codepoint\n         (as an integer); ``chr()`` converts an integer in range ``0 -\n         10FFFF`` to the corresponding character. ``str.encode()`` can\n         be used to convert a ``str`` to ``bytes`` using the given\n         encoding, and ``bytes.decode()`` can be used to achieve the\n         opposite.\n\n      Tuples\n         The items of a tuple are arbitrary Python objects. Tuples of\n         two or more items are formed by comma-separated lists of\n         expressions.  A tuple of one item (a \'singleton\') can be\n         formed by affixing a comma to an expression (an expression by\n         itself does not create a tuple, since parentheses must be\n         usable for grouping of expressions).  An empty tuple can be\n         formed by an empty pair of parentheses.\n\n      Bytes\n         A bytes object is an immutable array.  The items are 8-bit\n         bytes, represented by integers in the range 0 <= x < 256.\n         Bytes literals (like ``b\'abc\'``) and the built-in function\n         ``bytes()`` can be used to construct bytes objects.  Also,\n         bytes objects can be decoded to strings via the ``decode()``\n         method.\n\n   Mutable sequences\n      Mutable sequences can be changed after they are created.  The\n      subscription and slicing notations can be used as the target of\n      assignment and ``del`` (delete) statements.\n\n      There are currently two intrinsic mutable sequence types:\n\n      Lists\n         The items of a list are arbitrary Python objects.  Lists are\n         formed by placing a comma-separated list of expressions in\n         square brackets. (Note that there are no special cases needed\n         to form lists of length 0 or 1.)\n\n      Byte Arrays\n         A bytearray object is a mutable array. They are created by\n         the built-in ``bytearray()`` constructor.  Aside from being\n         mutable (and hence unhashable), byte arrays otherwise provide\n         the same interface and functionality as immutable bytes\n         objects.\n\n      The extension module ``array`` provides an additional example of\n      a mutable sequence type, as does the ``collections`` module.\n\nSet types\n   These represent unordered, finite sets of unique, immutable\n   objects. As such, they cannot be indexed by any subscript. However,\n   they can be iterated over, and the built-in function ``len()``\n   returns the number of items in a set. Common uses for sets are fast\n   membership testing, removing duplicates from a sequence, and\n   computing mathematical operations such as intersection, union,\n   difference, and symmetric difference.\n\n   For set elements, the same immutability rules apply as for\n   dictionary keys. Note that numeric types obey the normal rules for\n   numeric comparison: if two numbers compare equal (e.g., ``1`` and\n   ``1.0``), only one of them can be contained in a set.\n\n   There are currently two intrinsic set types:\n\n   Sets\n      These represent a mutable set. They are created by the built-in\n      ``set()`` constructor and can be modified afterwards by several\n      methods, such as ``add()``.\n\n   Frozen sets\n      These represent an immutable set.  They are created by the\n      built-in ``frozenset()`` constructor.  As a frozenset is\n      immutable and *hashable*, it can be used again as an element of\n      another set, or as a dictionary key.\n\nMappings\n   These represent finite sets of objects indexed by arbitrary index\n   sets. The subscript notation ``a[k]`` selects the item indexed by\n   ``k`` from the mapping ``a``; this can be used in expressions and\n   as the target of assignments or ``del`` statements. The built-in\n   function ``len()`` returns the number of items in a mapping.\n\n   There is currently a single intrinsic mapping type:\n\n   Dictionaries\n      These represent finite sets of objects indexed by nearly\n      arbitrary values.  The only types of values not acceptable as\n      keys are values containing lists or dictionaries or other\n      mutable types that are compared by value rather than by object\n      identity, the reason being that the efficient implementation of\n      dictionaries requires a key\'s hash value to remain constant.\n      Numeric types used for keys obey the normal rules for numeric\n      comparison: if two numbers compare equal (e.g., ``1`` and\n      ``1.0``) then they can be used interchangeably to index the same\n      dictionary entry.\n\n      Dictionaries are mutable; they can be created by the ``{...}``\n      notation (see section *Dictionary displays*).\n\n      The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n      additional examples of mapping types, as does the\n      ``collections`` module.\n\nCallable types\n   These are the types to which the function call operation (see\n   section *Calls*) can be applied:\n\n   User-defined functions\n      A user-defined function object is created by a function\n      definition (see section *Function definitions*).  It should be\n      called with an argument list containing the same number of items\n      as the function\'s formal parameter list.\n\n      Special attributes:\n\n      +---------------------------+---------------------------------+-------------+\n      | Attribute                 | Meaning                         |             |\n      +===========================+=================================+=============+\n      | ``__doc__``               | The function\'s documentation    | Writable    |\n      |                           | string, or ``None`` if          |             |\n      |                           | unavailable                     |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__name__``              | The function\'s name             | Writable    |\n      +---------------------------+---------------------------------+-------------+\n      | ``__qualname__``          | The function\'s *qualified name* | Writable    |\n      |                           | New in version 3.3.             |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__module__``            | The name of the module the      | Writable    |\n      |                           | function was defined in, or     |             |\n      |                           | ``None`` if unavailable.        |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__defaults__``          | A tuple containing default      | Writable    |\n      |                           | argument values for those       |             |\n      |                           | arguments that have defaults,   |             |\n      |                           | or ``None`` if no arguments     |             |\n      |                           | have a default value            |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__code__``              | The code object representing    | Writable    |\n      |                           | the compiled function body.     |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__globals__``           | A reference to the dictionary   | Read-only   |\n      |                           | that holds the function\'s       |             |\n      |                           | global variables --- the global |             |\n      |                           | namespace of the module in      |             |\n      |                           | which the function was defined. |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__dict__``              | The namespace supporting        | Writable    |\n      |                           | arbitrary function attributes.  |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__closure__``           | ``None`` or a tuple of cells    | Read-only   |\n      |                           | that contain bindings for the   |             |\n      |                           | function\'s free variables.      |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__annotations__``       | A dict containing annotations   | Writable    |\n      |                           | of parameters.  The keys of the |             |\n      |                           | dict are the parameter names,   |             |\n      |                           | or ``\'return\'`` for the return  |             |\n      |                           | annotation, if provided.        |             |\n      +---------------------------+---------------------------------+-------------+\n      | ``__kwdefaults__``        | A dict containing defaults for  | Writable    |\n      |                           | keyword-only parameters.        |             |\n      +---------------------------+---------------------------------+-------------+\n\n      Most of the attributes labelled "Writable" check the type of the\n      assigned value.\n\n      Function objects also support getting and setting arbitrary\n      attributes, which can be used, for example, to attach metadata\n      to functions.  Regular attribute dot-notation is used to get and\n      set such attributes. *Note that the current implementation only\n      supports function attributes on user-defined functions. Function\n      attributes on built-in functions may be supported in the\n      future.*\n\n      Additional information about a function\'s definition can be\n      retrieved from its code object; see the description of internal\n      types below.\n\n   Instance methods\n      An instance method object combines a class, a class instance and\n      any callable object (normally a user-defined function).\n\n      Special read-only attributes: ``__self__`` is the class instance\n      object, ``__func__`` is the function object; ``__doc__`` is the\n      method\'s documentation (same as ``__func__.__doc__``);\n      ``__name__`` is the method name (same as ``__func__.__name__``);\n      ``__module__`` is the name of the module the method was defined\n      in, or ``None`` if unavailable.\n\n      Methods also support accessing (but not setting) the arbitrary\n      function attributes on the underlying function object.\n\n      User-defined method objects may be created when getting an\n      attribute of a class (perhaps via an instance of that class), if\n      that attribute is a user-defined function object or a class\n      method object.\n\n      When an instance method object is created by retrieving a user-\n      defined function object from a class via one of its instances,\n      its ``__self__`` attribute is the instance, and the method\n      object is said to be bound.  The new method\'s ``__func__``\n      attribute is the original function object.\n\n      When a user-defined method object is created by retrieving\n      another method object from a class or instance, the behaviour is\n      the same as for a function object, except that the ``__func__``\n      attribute of the new instance is not the original method object\n      but its ``__func__`` attribute.\n\n      When an instance method object is created by retrieving a class\n      method object from a class or instance, its ``__self__``\n      attribute is the class itself, and its ``__func__`` attribute is\n      the function object underlying the class method.\n\n      When an instance method object is called, the underlying\n      function (``__func__``) is called, inserting the class instance\n      (``__self__``) in front of the argument list.  For instance,\n      when ``C`` is a class which contains a definition for a function\n      ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n      is equivalent to calling ``C.f(x, 1)``.\n\n      When an instance method object is derived from a class method\n      object, the "class instance" stored in ``__self__`` will\n      actually be the class itself, so that calling either ``x.f(1)``\n      or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n      the underlying function.\n\n      Note that the transformation from function object to instance\n      method object happens each time the attribute is retrieved from\n      the instance.  In some cases, a fruitful optimization is to\n      assign the attribute to a local variable and call that local\n      variable. Also notice that this transformation only happens for\n      user-defined functions; other callable objects (and all non-\n      callable objects) are retrieved without transformation.  It is\n      also important to note that user-defined functions which are\n      attributes of a class instance are not converted to bound\n      methods; this *only* happens when the function is an attribute\n      of the class.\n\n   Generator functions\n      A function or method which uses the ``yield`` statement (see\n      section *The yield statement*) is called a *generator function*.\n      Such a function, when called, always returns an iterator object\n      which can be used to execute the body of the function:  calling\n      the iterator\'s ``iterator.__next__()`` method will cause the\n      function to execute until it provides a value using the\n      ``yield`` statement.  When the function executes a ``return``\n      statement or falls off the end, a ``StopIteration`` exception is\n      raised and the iterator will have reached the end of the set of\n      values to be returned.\n\n   Built-in functions\n      A built-in function object is a wrapper around a C function.\n      Examples of built-in functions are ``len()`` and ``math.sin()``\n      (``math`` is a standard built-in module). The number and type of\n      the arguments are determined by the C function. Special read-\n      only attributes: ``__doc__`` is the function\'s documentation\n      string, or ``None`` if unavailable; ``__name__`` is the\n      function\'s name; ``__self__`` is set to ``None`` (but see the\n      next item); ``__module__`` is the name of the module the\n      function was defined in or ``None`` if unavailable.\n\n   Built-in methods\n      This is really a different disguise of a built-in function, this\n      time containing an object passed to the C function as an\n      implicit extra argument.  An example of a built-in method is\n      ``alist.append()``, assuming *alist* is a list object. In this\n      case, the special read-only attribute ``__self__`` is set to the\n      object denoted by *alist*.\n\n   Classes\n      Classes are callable.  These objects normally act as factories\n      for new instances of themselves, but variations are possible for\n      class types that override ``__new__()``.  The arguments of the\n      call are passed to ``__new__()`` and, in the typical case, to\n      ``__init__()`` to initialize the new instance.\n\n   Class Instances\n      Instances of arbitrary classes can be made callable by defining\n      a ``__call__()`` method in their class.\n\nModules\n   Modules are a basic organizational unit of Python code, and are\n   created by the *import system* as invoked either by the ``import``\n   statement (see ``import``), or by calling functions such as\n   ``importlib.import_module()`` and built-in ``__import__()``.  A\n   module object has a namespace implemented by a dictionary object\n   (this is the dictionary referenced by the ``__globals__`` attribute\n   of functions defined in the module).  Attribute references are\n   translated to lookups in this dictionary, e.g., ``m.x`` is\n   equivalent to ``m.__dict__["x"]``. A module object does not contain\n   the code object used to initialize the module (since it isn\'t\n   needed once the initialization is done).\n\n   Attribute assignment updates the module\'s namespace dictionary,\n   e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n   Special read-only attribute: ``__dict__`` is the module\'s namespace\n   as a dictionary object.\n\n   **CPython implementation detail:** Because of the way CPython\n   clears module dictionaries, the module dictionary will be cleared\n   when the module falls out of scope even if the dictionary still has\n   live references.  To avoid this, copy the dictionary or keep the\n   module around while using its dictionary directly.\n\n   Predefined (writable) attributes: ``__name__`` is the module\'s\n   name; ``__doc__`` is the module\'s documentation string, or ``None``\n   if unavailable; ``__file__`` is the pathname of the file from which\n   the module was loaded, if it was loaded from a file. The\n   ``__file__`` attribute may be missing for certain types of modules,\n   such as C modules that are statically linked into the interpreter;\n   for extension modules loaded dynamically from a shared library, it\n   is the pathname of the shared library file.\n\nCustom classes\n   Custom class types are typically created by class definitions (see\n   section *Class definitions*).  A class has a namespace implemented\n   by a dictionary object. Class attribute references are translated\n   to lookups in this dictionary, e.g., ``C.x`` is translated to\n   ``C.__dict__["x"]`` (although there are a number of hooks which\n   allow for other means of locating attributes). When the attribute\n   name is not found there, the attribute search continues in the base\n   classes. This search of the base classes uses the C3 method\n   resolution order which behaves correctly even in the presence of\n   \'diamond\' inheritance structures where there are multiple\n   inheritance paths leading back to a common ancestor. Additional\n   details on the C3 MRO used by Python can be found in the\n   documentation accompanying the 2.3 release at\n   http://www.python.org/download/releases/2.3/mro/.\n\n   When a class attribute reference (for class ``C``, say) would yield\n   a class method object, it is transformed into an instance method\n   object whose ``__self__`` attributes is ``C``.  When it would yield\n   a static method object, it is transformed into the object wrapped\n   by the static method object. See section *Implementing Descriptors*\n   for another way in which attributes retrieved from a class may\n   differ from those actually contained in its ``__dict__``.\n\n   Class attribute assignments update the class\'s dictionary, never\n   the dictionary of a base class.\n\n   A class object can be called (see above) to yield a class instance\n   (see below).\n\n   Special attributes: ``__name__`` is the class name; ``__module__``\n   is the module name in which the class was defined; ``__dict__`` is\n   the dictionary containing the class\'s namespace; ``__bases__`` is a\n   tuple (possibly empty or a singleton) containing the base classes,\n   in the order of their occurrence in the base class list;\n   ``__doc__`` is the class\'s documentation string, or None if\n   undefined.\n\nClass instances\n   A class instance is created by calling a class object (see above).\n   A class instance has a namespace implemented as a dictionary which\n   is the first place in which attribute references are searched.\n   When an attribute is not found there, and the instance\'s class has\n   an attribute by that name, the search continues with the class\n   attributes.  If a class attribute is found that is a user-defined\n   function object, it is transformed into an instance method object\n   whose ``__self__`` attribute is the instance.  Static method and\n   class method objects are also transformed; see above under\n   "Classes".  See section *Implementing Descriptors* for another way\n   in which attributes of a class retrieved via its instances may\n   differ from the objects actually stored in the class\'s\n   ``__dict__``.  If no class attribute is found, and the object\'s\n   class has a ``__getattr__()`` method, that is called to satisfy the\n   lookup.\n\n   Attribute assignments and deletions update the instance\'s\n   dictionary, never a class\'s dictionary.  If the class has a\n   ``__setattr__()`` or ``__delattr__()`` method, this is called\n   instead of updating the instance dictionary directly.\n\n   Class instances can pretend to be numbers, sequences, or mappings\n   if they have methods with certain special names.  See section\n   *Special method names*.\n\n   Special attributes: ``__dict__`` is the attribute dictionary;\n   ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n   A *file object* represents an open file.  Various shortcuts are\n   available to create file objects: the ``open()`` built-in function,\n   and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n   method of socket objects (and perhaps by other functions or methods\n   provided by extension modules).\n\n   The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n   initialized to file objects corresponding to the interpreter\'s\n   standard input, output and error streams; they are all open in text\n   mode and therefore follow the interface defined by the\n   ``io.TextIOBase`` abstract class.\n\nInternal types\n   A few types used internally by the interpreter are exposed to the\n   user. Their definitions may change with future versions of the\n   interpreter, but they are mentioned here for completeness.\n\n   Code objects\n      Code objects represent *byte-compiled* executable Python code,\n      or *bytecode*. The difference between a code object and a\n      function object is that the function object contains an explicit\n      reference to the function\'s globals (the module in which it was\n      defined), while a code object contains no context; also the\n      default argument values are stored in the function object, not\n      in the code object (because they represent values calculated at\n      run-time).  Unlike function objects, code objects are immutable\n      and contain no references (directly or indirectly) to mutable\n      objects.\n\n      Special read-only attributes: ``co_name`` gives the function\n      name; ``co_argcount`` is the number of positional arguments\n      (including arguments with default values); ``co_nlocals`` is the\n      number of local variables used by the function (including\n      arguments); ``co_varnames`` is a tuple containing the names of\n      the local variables (starting with the argument names);\n      ``co_cellvars`` is a tuple containing the names of local\n      variables that are referenced by nested functions;\n      ``co_freevars`` is a tuple containing the names of free\n      variables; ``co_code`` is a string representing the sequence of\n      bytecode instructions; ``co_consts`` is a tuple containing the\n      literals used by the bytecode; ``co_names`` is a tuple\n      containing the names used by the bytecode; ``co_filename`` is\n      the filename from which the code was compiled;\n      ``co_firstlineno`` is the first line number of the function;\n      ``co_lnotab`` is a string encoding the mapping from bytecode\n      offsets to line numbers (for details see the source code of the\n      interpreter); ``co_stacksize`` is the required stack size\n      (including local variables); ``co_flags`` is an integer encoding\n      a number of flags for the interpreter.\n\n      The following flag bits are defined for ``co_flags``: bit\n      ``0x04`` is set if the function uses the ``*arguments`` syntax\n      to accept an arbitrary number of positional arguments; bit\n      ``0x08`` is set if the function uses the ``**keywords`` syntax\n      to accept arbitrary keyword arguments; bit ``0x20`` is set if\n      the function is a generator.\n\n      Future feature declarations (``from __future__ import\n      division``) also use bits in ``co_flags`` to indicate whether a\n      code object was compiled with a particular feature enabled: bit\n      ``0x2000`` is set if the function was compiled with future\n      division enabled; bits ``0x10`` and ``0x1000`` were used in\n      earlier versions of Python.\n\n      Other bits in ``co_flags`` are reserved for internal use.\n\n      If a code object represents a function, the first item in\n      ``co_consts`` is the documentation string of the function, or\n      ``None`` if undefined.\n\n   Frame objects\n      Frame objects represent execution frames.  They may occur in\n      traceback objects (see below).\n\n      Special read-only attributes: ``f_back`` is to the previous\n      stack frame (towards the caller), or ``None`` if this is the\n      bottom stack frame; ``f_code`` is the code object being executed\n      in this frame; ``f_locals`` is the dictionary used to look up\n      local variables; ``f_globals`` is used for global variables;\n      ``f_builtins`` is used for built-in (intrinsic) names;\n      ``f_lasti`` gives the precise instruction (this is an index into\n      the bytecode string of the code object).\n\n      Special writable attributes: ``f_trace``, if not ``None``, is a\n      function called at the start of each source code line (this is\n      used by the debugger); ``f_lineno`` is the current line number\n      of the frame --- writing to this from within a trace function\n      jumps to the given line (only for the bottom-most frame).  A\n      debugger can implement a Jump command (aka Set Next Statement)\n      by writing to f_lineno.\n\n   Traceback objects\n      Traceback objects represent a stack trace of an exception.  A\n      traceback object is created when an exception occurs.  When the\n      search for an exception handler unwinds the execution stack, at\n      each unwound level a traceback object is inserted in front of\n      the current traceback.  When an exception handler is entered,\n      the stack trace is made available to the program. (See section\n      *The try statement*.) It is accessible as the third item of the\n      tuple returned by ``sys.exc_info()``. When the program contains\n      no suitable handler, the stack trace is written (nicely\n      formatted) to the standard error stream; if the interpreter is\n      interactive, it is also made available to the user as\n      ``sys.last_traceback``.\n\n      Special read-only attributes: ``tb_next`` is the next level in\n      the stack trace (towards the frame where the exception\n      occurred), or ``None`` if there is no next level; ``tb_frame``\n      points to the execution frame of the current level;\n      ``tb_lineno`` gives the line number where the exception\n      occurred; ``tb_lasti`` indicates the precise instruction.  The\n      line number and last instruction in the traceback may differ\n      from the line number of its frame object if the exception\n      occurred in a ``try`` statement with no matching except clause\n      or with a finally clause.\n\n   Slice objects\n      Slice objects are used to represent slices for ``__getitem__()``\n      methods.  They are also created by the built-in ``slice()``\n      function.\n\n      Special read-only attributes: ``start`` is the lower bound;\n      ``stop`` is the upper bound; ``step`` is the step value; each is\n      ``None`` if omitted.  These attributes can have any type.\n\n      Slice objects support one method:\n\n      slice.indices(self, length)\n\n         This method takes a single integer argument *length* and\n         computes information about the slice that the slice object\n         would describe if applied to a sequence of *length* items.\n         It returns a tuple of three integers; respectively these are\n         the *start* and *stop* indices and the *step* or stride\n         length of the slice. Missing or out-of-bounds indices are\n         handled in a manner consistent with regular slices.\n\n   Static method objects\n      Static method objects provide a way of defeating the\n      transformation of function objects to method objects described\n      above. A static method object is a wrapper around any other\n      object, usually a user-defined method object. When a static\n      method object is retrieved from a class or a class instance, the\n      object actually returned is the wrapped object, which is not\n      subject to any further transformation. Static method objects are\n      not themselves callable, although the objects they wrap usually\n      are. Static method objects are created by the built-in\n      ``staticmethod()`` constructor.\n\n   Class method objects\n      A class method object, like a static method object, is a wrapper\n      around another object that alters the way in which that object\n      is retrieved from classes and class instances. The behaviour of\n      class method objects upon such retrieval is described above,\n      under "User-defined methods". Class method objects are created\n      by the built-in ``classmethod()`` constructor.\n',
      'typesfunctions': '\nFunctions\n*********\n\nFunction objects are created by function definitions.  The only\noperation on a function object is to call it: ``func(argument-list)``.\n\nThere are really two flavors of function objects: built-in functions\nand user-defined functions.  Both support the same operation (to call\nthe function), but the implementation is different, hence the\ndifferent object types.\n\nSee *Function definitions* for more information.\n',
      'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects.  There is currently only one standard\nmapping type, the *dictionary*.  (For other containers see the built-\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values.  Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys.  Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry.  (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict(**kwarg)\nclass class dict(mapping, **kwarg)\nclass class dict(iterable, **kwarg)\n\n   Return a new dictionary initialized from an optional positional\n   argument and a possibly empty set of keyword arguments.\n\n   If no positional argument is given, an empty dictionary is created.\n   If a positional argument is given and it is a mapping object, a\n   dictionary is created with the same key-value pairs as the mapping\n   object.  Otherwise, the positional argument must be an *iterator*\n   object.  Each item in the iterable must itself be an iterator with\n   exactly two objects.  The first object of each item becomes a key\n   in the new dictionary, and the second object the corresponding\n   value.  If a key occurs more than once, the last value for that key\n   becomes the corresponding value in the new dictionary.\n\n   If keyword arguments are given, the keyword arguments and their\n   values are added to the dictionary created from the positional\n   argument.  If a key being added is already present, the value from\n   the keyword argument replaces the value from the positional\n   argument.\n\n   To illustrate, the following examples all return a dictionary equal\n   to ``{"one": 1, "two": 2, "three": 3}``:\n\n      >>> a = dict(one=1, two=2, three=3)\n      >>> b = {\'one\': 1, \'two\': 2, \'three\': 3}\n      >>> c = dict(zip([\'one\', \'two\', \'three\'], [1, 2, 3]))\n      >>> d = dict([(\'two\', 2), (\'one\', 1), (\'three\', 3)])\n      >>> e = dict({\'three\': 3, \'one\': 1, \'two\': 2})\n      >>> a == b == c == d == e\n      True\n\n   Providing keyword arguments as in the first example only works for\n   keys that are valid Python identifiers.  Otherwise, any valid keys\n   can be used.\n\n   These are the operations that dictionaries support (and therefore,\n   custom mapping types should support too):\n\n   len(d)\n\n      Return the number of items in the dictionary *d*.\n\n   d[key]\n\n      Return the item of *d* with key *key*.  Raises a ``KeyError`` if\n      *key* is not in the map.\n\n      If a subclass of dict defines a method ``__missing__()``, if the\n      key *key* is not present, the ``d[key]`` operation calls that\n      method with the key *key* as argument.  The ``d[key]`` operation\n      then returns or raises whatever is returned or raised by the\n      ``__missing__(key)`` call if the key is not present. No other\n      operations or methods invoke ``__missing__()``. If\n      ``__missing__()`` is not defined, ``KeyError`` is raised.\n      ``__missing__()`` must be a method; it cannot be an instance\n      variable:\n\n         >>> class Counter(dict):\n         ...     def __missing__(self, key):\n         ...         return 0\n         >>> c = Counter()\n         >>> c[\'red\']\n         0\n         >>> c[\'red\'] += 1\n         >>> c[\'red\']\n         1\n\n      See ``collections.Counter`` for a complete implementation\n      including other methods helpful for accumulating and managing\n      tallies.\n\n   d[key] = value\n\n      Set ``d[key]`` to *value*.\n\n   del d[key]\n\n      Remove ``d[key]`` from *d*.  Raises a ``KeyError`` if *key* is\n      not in the map.\n\n   key in d\n\n      Return ``True`` if *d* has a key *key*, else ``False``.\n\n   key not in d\n\n      Equivalent to ``not key in d``.\n\n   iter(d)\n\n      Return an iterator over the keys of the dictionary.  This is a\n      shortcut for ``iter(d.keys())``.\n\n   clear()\n\n      Remove all items from the dictionary.\n\n   copy()\n\n      Return a shallow copy of the dictionary.\n\n   classmethod fromkeys(seq[, value])\n\n      Create a new dictionary with keys from *seq* and values set to\n      *value*.\n\n      ``fromkeys()`` is a class method that returns a new dictionary.\n      *value* defaults to ``None``.\n\n   get(key[, default])\n\n      Return the value for *key* if *key* is in the dictionary, else\n      *default*. If *default* is not given, it defaults to ``None``,\n      so that this method never raises a ``KeyError``.\n\n   items()\n\n      Return a new view of the dictionary\'s items (``(key, value)``\n      pairs). See the *documentation of view objects*.\n\n   keys()\n\n      Return a new view of the dictionary\'s keys.  See the\n      *documentation of view objects*.\n\n   pop(key[, default])\n\n      If *key* is in the dictionary, remove it and return its value,\n      else return *default*.  If *default* is not given and *key* is\n      not in the dictionary, a ``KeyError`` is raised.\n\n   popitem()\n\n      Remove and return an arbitrary ``(key, value)`` pair from the\n      dictionary.\n\n      ``popitem()`` is useful to destructively iterate over a\n      dictionary, as often used in set algorithms.  If the dictionary\n      is empty, calling ``popitem()`` raises a ``KeyError``.\n\n   setdefault(key[, default])\n\n      If *key* is in the dictionary, return its value.  If not, insert\n      *key* with a value of *default* and return *default*.  *default*\n      defaults to ``None``.\n\n   update([other])\n\n      Update the dictionary with the key/value pairs from *other*,\n      overwriting existing keys.  Return ``None``.\n\n      ``update()`` accepts either another dictionary object or an\n      iterable of key/value pairs (as tuples or other iterables of\n      length two).  If keyword arguments are specified, the dictionary\n      is then updated with those key/value pairs: ``d.update(red=1,\n      blue=2)``.\n\n   values()\n\n      Return a new view of the dictionary\'s values.  See the\n      *documentation of view objects*.\n\nSee also:\n\n   ``types.MappingProxyType`` can be used to create a read-only view\n   of a ``dict``.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.keys()``, ``dict.values()`` and\n``dict.items()`` are *view objects*.  They provide a dynamic view on\nthe dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n   Return the number of entries in the dictionary.\n\niter(dictview)\n\n   Return an iterator over the keys, values or items (represented as\n   tuples of ``(key, value)``) in the dictionary.\n\n   Keys and values are iterated over in an arbitrary order which is\n   non-random, varies across Python implementations, and depends on\n   the dictionary\'s history of insertions and deletions. If keys,\n   values and items views are iterated over with no intervening\n   modifications to the dictionary, the order of items will directly\n   correspond.  This allows the creation of ``(value, key)`` pairs\n   using ``zip()``: ``pairs = zip(d.values(), d.keys())``.  Another\n   way to create the same list is ``pairs = [(v, k) for (k, v) in\n   d.items()]``.\n\n   Iterating views while adding or deleting entries in the dictionary\n   may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n   Return ``True`` if *x* is in the underlying dictionary\'s keys,\n   values or items (in the latter case, *x* should be a ``(key,\n   value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that ``(key, value)`` pairs are unique\nand hashable, then the items view is also set-like.  (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class ``collections.abc.Set`` are available (for example, ``==``,\n``<``, or ``^``).\n\nAn example of dictionary view usage:\n\n   >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n   >>> keys = dishes.keys()\n   >>> values = dishes.values()\n\n   >>> # iteration\n   >>> n = 0\n   >>> for val in values:\n   ...     n += val\n   >>> print(n)\n   504\n\n   >>> # keys and values are iterated over in the same order\n   >>> list(keys)\n   [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n   >>> list(values)\n   [2, 1, 1, 500]\n\n   >>> # view objects are dynamic and reflect dict changes\n   >>> del dishes[\'eggs\']\n   >>> del dishes[\'sausage\']\n   >>> list(keys)\n   [\'spam\', \'bacon\']\n\n   >>> # set operations\n   >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n   {\'bacon\'}\n   >>> keys ^ {\'sausage\', \'juice\'}\n   {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n',
      'typesmethods': '\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as ``append()`` on\nlists) and class instance methods.  Built-in methods are described\nwith the types that support them.\n\nIf you access a method (a function defined in a class namespace)\nthrough an instance, you get a special object: a *bound method* (also\ncalled *instance method*) object. When called, it will add the\n``self`` argument to the argument list.  Bound methods have two\nspecial read-only attributes: ``m.__self__`` is the object on which\nthe method operates, and ``m.__func__`` is the function implementing\nthe method.  Calling ``m(arg-1, arg-2, ..., arg-n)`` is completely\nequivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, ...,\narg-n)``.\n\nLike function objects, bound method objects support getting arbitrary\nattributes.  However, since method attributes are actually stored on\nthe underlying function object (``meth.__func__``), setting method\nattributes on bound methods is disallowed.  Attempting to set an\nattribute on a method results in an ``AttributeError`` being raised.\nIn order to set a method attribute, you need to explicitly set it on\nthe underlying function object:\n\n   >>> class C:\n   ...     def method(self):\n   ...         pass\n   ...\n   >>> c = C()\n   >>> c.method.whoami = \'my name is method\'  # can\'t set on the method\n   Traceback (most recent call last):\n     File "", line 1, in \n   AttributeError: \'method\' object has no attribute \'whoami\'\n   >>> c.method.__func__.whoami = \'my name is method\'\n   >>> c.method.whoami\n   \'my name is method\'\n\nSee *The standard type hierarchy* for more information.\n',
      'typesmodules': "\nModules\n*******\n\nThe only special operation on a module is attribute access:\n``m.name``, where *m* is a module and *name* accesses a name defined\nin *m*'s symbol table. Module attributes can be assigned to.  (Note\nthat the ``import`` statement is not, strictly speaking, an operation\non a module object; ``import foo`` does not require a module object\nnamed *foo* to exist, rather it requires an (external) *definition*\nfor a module named *foo* somewhere.)\n\nA special attribute of every module is ``__dict__``. This is the\ndictionary containing the module's symbol table. Modifying this\ndictionary will actually change the module's symbol table, but direct\nassignment to the ``__dict__`` attribute is not possible (you can\nwrite ``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but\nyou can't write ``m.__dict__ = {}``).  Modifying ``__dict__`` directly\nis not recommended.\n\nModules built into the interpreter are written like this: ````.  If loaded from a file, they are written as\n````.\n",
    - 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority).  In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation                  | Result                           | Notes      |\n+============================+==================================+============+\n| ``x in s``                 | ``True`` if an item of *s* is    | (1)        |\n|                            | equal to *x*, else ``False``     |            |\n+----------------------------+----------------------------------+------------+\n| ``x not in s``             | ``False`` if an item of *s* is   | (1)        |\n|                            | equal to *x*, else ``True``      |            |\n+----------------------------+----------------------------------+------------+\n| ``s + t``                  | the concatenation of *s* and *t* | (6)(7)     |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s``     | *n* shallow copies of *s*        | (2)(7)     |\n|                            | concatenated                     |            |\n+----------------------------+----------------------------------+------------+\n| ``s[i]``                   | *i*th item of *s*, origin 0      | (3)        |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]``                 | slice of *s* from *i* to *j*     | (3)(4)     |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]``               | slice of *s* from *i* to *j*     | (3)(5)     |\n|                            | with step *k*                    |            |\n+----------------------------+----------------------------------+------------+\n| ``len(s)``                 | length of *s*                    |            |\n+----------------------------+----------------------------------+------------+\n| ``min(s)``                 | smallest item of *s*             |            |\n+----------------------------+----------------------------------+------------+\n| ``max(s)``                 | largest item of *s*              |            |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])``   | index of the first occurence of  | (8)        |\n|                            | *x* in *s* (at or after index    |            |\n|                            | *i* and before index *j*)        |            |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)``             | total number of occurences of    |            |\n|                            | *x* in *s*                       |            |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons.  In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length.  (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n   containment testing in the general case, some specialised sequences\n   (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n   subsequence testing:\n\n      >>> "gg" in "eggs"\n      True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n   empty sequence of the same type as *s*).  Note also that the copies\n   are shallow; nested structures are not copied.  This often haunts\n   new Python programmers; consider:\n\n      >>> lists = [[]] * 3\n      >>> lists\n      [[], [], []]\n      >>> lists[0].append(3)\n      >>> lists\n      [[3], [3], [3]]\n\n   What has happened is that ``[[]]`` is a one-element list containing\n   an empty list, so all three elements of ``[[]] * 3`` are (pointers\n   to) this single empty list.  Modifying any of the elements of\n   ``lists`` modifies this single list. You can create a list of\n   different lists this way:\n\n      >>> lists = [[] for i in range(3)]\n      >>> lists[0].append(3)\n      >>> lists[1].append(5)\n      >>> lists[2].append(7)\n      >>> lists\n      [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n   string: ``len(s) + i`` or ``len(s) + j`` is substituted.  But note\n   that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n   items with index *k* such that ``i <= k < j``.  If *i* or *j* is\n   greater than ``len(s)``, use ``len(s)``.  If *i* is omitted or\n   ``None``, use ``0``.  If *j* is omitted or ``None``, use\n   ``len(s)``.  If *i* is greater than or equal to *j*, the slice is\n   empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n   sequence of items with index  ``x = i + n*k`` such that ``0 <= n <\n   (j-i)/k``.  In other words, the indices are ``i``, ``i+k``,\n   ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n   never including *j*).  If *i* or *j* is greater than ``len(s)``,\n   use ``len(s)``.  If *i* or *j* are omitted or ``None``, they become\n   "end" values (which end depends on the sign of *k*).  Note, *k*\n   cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n   This means that building up a sequence by repeated concatenation\n   will have a quadratic runtime cost in the total sequence length.\n   To get a linear runtime cost, you must switch to one of the\n   alternatives below:\n\n   * if concatenating ``str`` objects, you can build a list and use\n     ``str.join()`` at the end or else write to a ``io.StringIO``\n     instance and retrieve its value when complete\n\n   * if concatenating ``bytes`` objects, you can similarly use\n     ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n     concatenation with a ``bytearray`` object.  ``bytearray`` objects\n     are mutable and have an efficient overallocation mechanism\n\n   * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n   * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n   that follow specific patterns, and hence don\'t support sequence\n   concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n   supported, the additional arguments to the index method allow\n   efficient searching of subsections of the sequence. Passing the\n   extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n   only without copying any data and with the returned index being\n   relative to the start of the sequence rather than the start of the\n   slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | appends *x* to the end of the    |                       |\n|                                | sequence (same as                |                       |\n|                                | ``s[len(s):len(s)] = [x]``)      |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()``                  | removes all items from ``s``     | (5)                   |\n|                                | (same as ``del s[:]``)           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()``                   | creates a shallow copy of ``s``  | (5)                   |\n|                                | (same as ``s[:]``)               |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)``                | extends *s* with the contents of |                       |\n|                                | *t* (same as ``s[len(s):len(s)]  |                       |\n|                                | = t``)                           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | inserts *x* into *s* at the      |                       |\n|                                | index given by *i* (same as      |                       |\n|                                | ``s[i:i] = [x]``)                |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | retrieves the item at *i* and    | (2)                   |\n|                                | also removes it from *s*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | remove the first item from *s*   | (3)                   |\n|                                | where ``s[i] == x``              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (4)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n   of space when reversing a large sequence.  To remind users that it\n   operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n   interfaces of mutable containers that don\'t support slicing\n   operations (such as ``dict`` and ``set``)\n\n   New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n   Lists may be constructed in several ways:\n\n   * Using a pair of square brackets to denote the empty list: ``[]``\n\n   * Using square brackets, separating items with commas: ``[a]``,\n     ``[a, b, c]``\n\n   * Using a list comprehension: ``[x for x in iterable]``\n\n   * Using the type constructor: ``list()`` or ``list(iterable)``\n\n   The constructor builds a list whose items are the same and in the\n   same order as *iterable*\'s items.  *iterable* may be either a\n   sequence, a container that supports iteration, or an iterator\n   object.  If *iterable* is already a list, a copy is made and\n   returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n   returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n   2, 3]``. If no argument is given, the constructor creates a new\n   empty list, ``[]``.\n\n   Many other operations also produce lists, including the\n   ``sorted()`` built-in.\n\n   Lists implement all of the *common* and *mutable* sequence\n   operations. Lists also provide the following additional method:\n\n   sort(*, key=None, reverse=None)\n\n      This method sorts the list in place, using only ``<``\n      comparisons between items. Exceptions are not suppressed - if\n      any comparison operations fail, the entire sort operation will\n      fail (and the list will likely be left in a partially modified\n      state).\n\n      *key* specifies a function of one argument that is used to\n      extract a comparison key from each list element (for example,\n      ``key=str.lower``). The key corresponding to each item in the\n      list is calculated once and then used for the entire sorting\n      process. The default value of ``None`` means that list items are\n      sorted directly without calculating a separate key value.\n\n      The ``functools.cmp_to_key()`` utility is available to convert a\n      2.x style *cmp* function to a *key* function.\n\n      *reverse* is a boolean value.  If set to ``True``, then the list\n      elements are sorted as if each comparison were reversed.\n\n      This method modifies the sequence in place for economy of space\n      when sorting a large sequence.  To remind users that it operates\n      by side effect, it does not return the sorted sequence (use\n      ``sorted()`` to explicitly request a new sorted list instance).\n\n      The ``sort()`` method is guaranteed to be stable.  A sort is\n      stable if it guarantees not to change the relative order of\n      elements that compare equal --- this is helpful for sorting in\n      multiple passes (for example, sort by department, then by salary\n      grade).\n\n      **CPython implementation detail:** While a list is being sorted,\n      the effect of attempting to mutate, or even inspect, the list is\n      undefined.  The C implementation of Python makes the list appear\n      empty for the duration, and raises ``ValueError`` if it can\n      detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n   Tuples may be constructed in a number of ways:\n\n   * Using a pair of parentheses to denote the empty tuple: ``()``\n\n   * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n   * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n   * Using the ``tuple()`` built-in: ``tuple()`` or\n     ``tuple(iterable)``\n\n   The constructor builds a tuple whose items are the same and in the\n   same order as *iterable*\'s items.  *iterable* may be either a\n   sequence, a container that supports iteration, or an iterator\n   object.  If *iterable* is already a tuple, it is returned\n   unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n   \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n   argument is given, the constructor creates a new empty tuple,\n   ``()``.\n\n   Note that it is actually the comma which makes a tuple, not the\n   parentheses. The parentheses are optional, except in the empty\n   tuple case, or when they are needed to avoid syntactic ambiguity.\n   For example, ``f(a, b, c)`` is a function call with three\n   arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n   as the sole argument.\n\n   Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n   The arguments to the range constructor must be integers (either\n   built-in ``int`` or any object that implements the ``__index__``\n   special method).  If the *step* argument is omitted, it defaults to\n   ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n   *step* is zero, ``ValueError`` is raised.\n\n   For a positive *step*, the contents of a range ``r`` are determined\n   by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n   ``r[i] < stop``.\n\n   For a negative *step*, the contents of the range are still\n   determined by the formula ``r[i] = start + step*i``, but the\n   constraints are ``i >= 0`` and ``r[i] > stop``.\n\n   A range object will be empty if ``r[0]`` does not meet the value\n   constraint. Ranges do support negative indices, but these are\n   interpreted as indexing from the end of the sequence determined by\n   the positive indices.\n\n   Ranges containing absolute values larger than ``sys.maxsize`` are\n   permitted but some features (such as ``len()``) may raise\n   ``OverflowError``.\n\n   Range examples:\n\n      >>> list(range(10))\n      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n      >>> list(range(1, 11))\n      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n      >>> list(range(0, 30, 5))\n      [0, 5, 10, 15, 20, 25]\n      >>> list(range(0, 10, 3))\n      [0, 3, 6, 9]\n      >>> list(range(0, -10, -1))\n      [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n      >>> list(range(0))\n      []\n      >>> list(range(1, 0))\n      []\n\n   Ranges implement all of the *common* sequence operations except\n   concatenation and repetition (due to the fact that range objects\n   can only represent sequences that follow a strict pattern and\n   repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.Sequence`` ABC, and provide\nfeatures such as containment tests, element index lookup, slicing and\nsupport for negative indices (see *Sequence Types --- list, tuple,\nrange*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences.  That is, two range objects are considered equal if\nthey represent the same sequence of values.  (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n',
    + 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority).  In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation                  | Result                           | Notes      |\n+============================+==================================+============+\n| ``x in s``                 | ``True`` if an item of *s* is    | (1)        |\n|                            | equal to *x*, else ``False``     |            |\n+----------------------------+----------------------------------+------------+\n| ``x not in s``             | ``False`` if an item of *s* is   | (1)        |\n|                            | equal to *x*, else ``True``      |            |\n+----------------------------+----------------------------------+------------+\n| ``s + t``                  | the concatenation of *s* and *t* | (6)(7)     |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s``     | *n* shallow copies of *s*        | (2)(7)     |\n|                            | concatenated                     |            |\n+----------------------------+----------------------------------+------------+\n| ``s[i]``                   | *i*th item of *s*, origin 0      | (3)        |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]``                 | slice of *s* from *i* to *j*     | (3)(4)     |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]``               | slice of *s* from *i* to *j*     | (3)(5)     |\n|                            | with step *k*                    |            |\n+----------------------------+----------------------------------+------------+\n| ``len(s)``                 | length of *s*                    |            |\n+----------------------------+----------------------------------+------------+\n| ``min(s)``                 | smallest item of *s*             |            |\n+----------------------------+----------------------------------+------------+\n| ``max(s)``                 | largest item of *s*              |            |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])``   | index of the first occurrence of | (8)        |\n|                            | *x* in *s* (at or after index    |            |\n|                            | *i* and before index *j*)        |            |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)``             | total number of occurrences of   |            |\n|                            | *x* in *s*                       |            |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons.  In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length.  (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n   containment testing in the general case, some specialised sequences\n   (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n   subsequence testing:\n\n      >>> "gg" in "eggs"\n      True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n   empty sequence of the same type as *s*).  Note also that the copies\n   are shallow; nested structures are not copied.  This often haunts\n   new Python programmers; consider:\n\n      >>> lists = [[]] * 3\n      >>> lists\n      [[], [], []]\n      >>> lists[0].append(3)\n      >>> lists\n      [[3], [3], [3]]\n\n   What has happened is that ``[[]]`` is a one-element list containing\n   an empty list, so all three elements of ``[[]] * 3`` are (pointers\n   to) this single empty list.  Modifying any of the elements of\n   ``lists`` modifies this single list. You can create a list of\n   different lists this way:\n\n      >>> lists = [[] for i in range(3)]\n      >>> lists[0].append(3)\n      >>> lists[1].append(5)\n      >>> lists[2].append(7)\n      >>> lists\n      [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n   string: ``len(s) + i`` or ``len(s) + j`` is substituted.  But note\n   that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n   items with index *k* such that ``i <= k < j``.  If *i* or *j* is\n   greater than ``len(s)``, use ``len(s)``.  If *i* is omitted or\n   ``None``, use ``0``.  If *j* is omitted or ``None``, use\n   ``len(s)``.  If *i* is greater than or equal to *j*, the slice is\n   empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n   sequence of items with index  ``x = i + n*k`` such that ``0 <= n <\n   (j-i)/k``.  In other words, the indices are ``i``, ``i+k``,\n   ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n   never including *j*).  If *i* or *j* is greater than ``len(s)``,\n   use ``len(s)``.  If *i* or *j* are omitted or ``None``, they become\n   "end" values (which end depends on the sign of *k*).  Note, *k*\n   cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n   This means that building up a sequence by repeated concatenation\n   will have a quadratic runtime cost in the total sequence length.\n   To get a linear runtime cost, you must switch to one of the\n   alternatives below:\n\n   * if concatenating ``str`` objects, you can build a list and use\n     ``str.join()`` at the end or else write to a ``io.StringIO``\n     instance and retrieve its value when complete\n\n   * if concatenating ``bytes`` objects, you can similarly use\n     ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n     concatenation with a ``bytearray`` object.  ``bytearray`` objects\n     are mutable and have an efficient overallocation mechanism\n\n   * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n   * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n   that follow specific patterns, and hence don\'t support sequence\n   concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n   supported, the additional arguments to the index method allow\n   efficient searching of subsections of the sequence. Passing the\n   extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n   only without copying any data and with the returned index being\n   relative to the start of the sequence rather than the start of the\n   slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | appends *x* to the end of the    |                       |\n|                                | sequence (same as                |                       |\n|                                | ``s[len(s):len(s)] = [x]``)      |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()``                  | removes all items from ``s``     | (5)                   |\n|                                | (same as ``del s[:]``)           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()``                   | creates a shallow copy of ``s``  | (5)                   |\n|                                | (same as ``s[:]``)               |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)``                | extends *s* with the contents of |                       |\n|                                | *t* (same as ``s[len(s):len(s)]  |                       |\n|                                | = t``)                           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | inserts *x* into *s* at the      |                       |\n|                                | index given by *i* (same as      |                       |\n|                                | ``s[i:i] = [x]``)                |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | retrieves the item at *i* and    | (2)                   |\n|                                | also removes it from *s*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | remove the first item from *s*   | (3)                   |\n|                                | where ``s[i] == x``              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (4)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n   of space when reversing a large sequence.  To remind users that it\n   operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n   interfaces of mutable containers that don\'t support slicing\n   operations (such as ``dict`` and ``set``)\n\n   New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n   Lists may be constructed in several ways:\n\n   * Using a pair of square brackets to denote the empty list: ``[]``\n\n   * Using square brackets, separating items with commas: ``[a]``,\n     ``[a, b, c]``\n\n   * Using a list comprehension: ``[x for x in iterable]``\n\n   * Using the type constructor: ``list()`` or ``list(iterable)``\n\n   The constructor builds a list whose items are the same and in the\n   same order as *iterable*\'s items.  *iterable* may be either a\n   sequence, a container that supports iteration, or an iterator\n   object.  If *iterable* is already a list, a copy is made and\n   returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n   returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n   2, 3]``. If no argument is given, the constructor creates a new\n   empty list, ``[]``.\n\n   Many other operations also produce lists, including the\n   ``sorted()`` built-in.\n\n   Lists implement all of the *common* and *mutable* sequence\n   operations. Lists also provide the following additional method:\n\n   sort(*, key=None, reverse=None)\n\n      This method sorts the list in place, using only ``<``\n      comparisons between items. Exceptions are not suppressed - if\n      any comparison operations fail, the entire sort operation will\n      fail (and the list will likely be left in a partially modified\n      state).\n\n      *key* specifies a function of one argument that is used to\n      extract a comparison key from each list element (for example,\n      ``key=str.lower``). The key corresponding to each item in the\n      list is calculated once and then used for the entire sorting\n      process. The default value of ``None`` means that list items are\n      sorted directly without calculating a separate key value.\n\n      The ``functools.cmp_to_key()`` utility is available to convert a\n      2.x style *cmp* function to a *key* function.\n\n      *reverse* is a boolean value.  If set to ``True``, then the list\n      elements are sorted as if each comparison were reversed.\n\n      This method modifies the sequence in place for economy of space\n      when sorting a large sequence.  To remind users that it operates\n      by side effect, it does not return the sorted sequence (use\n      ``sorted()`` to explicitly request a new sorted list instance).\n\n      The ``sort()`` method is guaranteed to be stable.  A sort is\n      stable if it guarantees not to change the relative order of\n      elements that compare equal --- this is helpful for sorting in\n      multiple passes (for example, sort by department, then by salary\n      grade).\n\n      **CPython implementation detail:** While a list is being sorted,\n      the effect of attempting to mutate, or even inspect, the list is\n      undefined.  The C implementation of Python makes the list appear\n      empty for the duration, and raises ``ValueError`` if it can\n      detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n   Tuples may be constructed in a number of ways:\n\n   * Using a pair of parentheses to denote the empty tuple: ``()``\n\n   * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n   * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n   * Using the ``tuple()`` built-in: ``tuple()`` or\n     ``tuple(iterable)``\n\n   The constructor builds a tuple whose items are the same and in the\n   same order as *iterable*\'s items.  *iterable* may be either a\n   sequence, a container that supports iteration, or an iterator\n   object.  If *iterable* is already a tuple, it is returned\n   unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n   \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n   argument is given, the constructor creates a new empty tuple,\n   ``()``.\n\n   Note that it is actually the comma which makes a tuple, not the\n   parentheses. The parentheses are optional, except in the empty\n   tuple case, or when they are needed to avoid syntactic ambiguity.\n   For example, ``f(a, b, c)`` is a function call with three\n   arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n   as the sole argument.\n\n   Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n   The arguments to the range constructor must be integers (either\n   built-in ``int`` or any object that implements the ``__index__``\n   special method).  If the *step* argument is omitted, it defaults to\n   ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n   *step* is zero, ``ValueError`` is raised.\n\n   For a positive *step*, the contents of a range ``r`` are determined\n   by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n   ``r[i] < stop``.\n\n   For a negative *step*, the contents of the range are still\n   determined by the formula ``r[i] = start + step*i``, but the\n   constraints are ``i >= 0`` and ``r[i] > stop``.\n\n   A range object will be empty if ``r[0]`` does not meet the value\n   constraint. Ranges do support negative indices, but these are\n   interpreted as indexing from the end of the sequence determined by\n   the positive indices.\n\n   Ranges containing absolute values larger than ``sys.maxsize`` are\n   permitted but some features (such as ``len()``) may raise\n   ``OverflowError``.\n\n   Range examples:\n\n      >>> list(range(10))\n      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n      >>> list(range(1, 11))\n      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n      >>> list(range(0, 30, 5))\n      [0, 5, 10, 15, 20, 25]\n      >>> list(range(0, 10, 3))\n      [0, 3, 6, 9]\n      >>> list(range(0, -10, -1))\n      [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n      >>> list(range(0))\n      []\n      >>> list(range(1, 0))\n      []\n\n   Ranges implement all of the *common* sequence operations except\n   concatenation and repetition (due to the fact that range objects\n   can only represent sequences that follow a strict pattern and\n   repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.abc.Sequence`` ABC, and\nprovide features such as containment tests, element index lookup,\nslicing and support for negative indices (see *Sequence Types ---\nlist, tuple, range*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences.  That is, two range objects are considered equal if\nthey represent the same sequence of values.  (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n',
      'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation                      | Result                           | Notes                 |\n+================================+==================================+=======================+\n| ``s[i] = x``                   | item *i* of *s* is replaced by   |                       |\n|                                | *x*                              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t``                 | slice of *s* from *i* to *j* is  |                       |\n|                                | replaced by the contents of the  |                       |\n|                                | iterable *t*                     |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]``                 | same as ``s[i:j] = []``          |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t``               | the elements of ``s[i:j:k]`` are | (1)                   |\n|                                | replaced by those of *t*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]``               | removes the elements of          |                       |\n|                                | ``s[i:j:k]`` from the list       |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)``                | appends *x* to the end of the    |                       |\n|                                | sequence (same as                |                       |\n|                                | ``s[len(s):len(s)] = [x]``)      |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()``                  | removes all items from ``s``     | (5)                   |\n|                                | (same as ``del s[:]``)           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()``                   | creates a shallow copy of ``s``  | (5)                   |\n|                                | (same as ``s[:]``)               |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)``                | extends *s* with the contents of |                       |\n|                                | *t* (same as ``s[len(s):len(s)]  |                       |\n|                                | = t``)                           |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)``             | inserts *x* into *s* at the      |                       |\n|                                | index given by *i* (same as      |                       |\n|                                | ``s[i:i] = [x]``)                |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])``                 | retrieves the item at *i* and    | (2)                   |\n|                                | also removes it from *s*         |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)``                | remove the first item from *s*   | (3)                   |\n|                                | where ``s[i] == x``              |                       |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()``                | reverses the items of *s* in     | (4)                   |\n|                                | place                            |                       |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n   the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n   of space when reversing a large sequence.  To remind users that it\n   operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n   interfaces of mutable containers that don't support slicing\n   operations (such as ``dict`` and ``set``)\n\n   New in version 3.3: ``clear()`` and ``copy()`` methods.\n",
      'unary': '\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n   u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary ``-`` (minus) operator yields the negation of its numeric\nargument.\n\nThe unary ``+`` (plus) operator yields its numeric argument unchanged.\n\nThe unary ``~`` (invert) operator yields the bitwise inversion of its\ninteger argument.  The bitwise inversion of ``x`` is defined as\n``-(x+1)``.  It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n``TypeError`` exception is raised.\n',
      'while': '\nThe ``while`` statement\n***********************\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n   while_stmt ::= "while" expression ":" suite\n                  ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite.  A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n',
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 09:22:19 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 09:22:19 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_markup_err?=
     =?utf-8?q?ors_in_the_docs_and_amend_suspicious_ignores=2E?=
    Message-ID: <3d6sVg0GTXz7LnF@mail.python.org>
    
    http://hg.python.org/cpython/rev/5536129fc5f9
    changeset:   86685:5536129fc5f9
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 09:16:01 2013 +0100
    summary:
      Fix markup errors in the docs and amend suspicious ignores.
    
    files:
      Doc/howto/unicode.rst                |   2 +-
      Doc/library/multiprocessing.rst      |   4 +-
      Doc/tools/sphinxext/susp-ignored.csv |  28 +++++++--------
      Doc/tutorial/modules.rst             |   2 +-
      4 files changed, 17 insertions(+), 19 deletions(-)
    
    
    diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst
    --- a/Doc/howto/unicode.rst
    +++ b/Doc/howto/unicode.rst
    @@ -532,7 +532,7 @@
     done for you: the built-in :func:`open` function can return a file-like object
     that assumes the file's contents are in a specified encoding and accepts Unicode
     parameters for methods such as :meth:`~io.TextIOBase.read` and
    -:meth:`~io.TextIOBase.write`.  This works through:func:`open`\'s *encoding* and
    +:meth:`~io.TextIOBase.write`.  This works through :func:`open`\'s *encoding* and
     *errors* parameters which are interpreted just like those in :meth:`str.encode`
     and :meth:`bytes.decode`.
     
    diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
    --- a/Doc/library/multiprocessing.rst
    +++ b/Doc/library/multiprocessing.rst
    @@ -1801,7 +1801,7 @@
        .. versionadded:: 3.3
           Pool objects now support the context manager protocol -- see
           :ref:`typecontextmanager`.  :meth:`~contextmanager.__enter__` returns the
    -      pool object, and :meth:~contextmanager.`__exit__` calls :meth:`terminate`.
    +      pool object, and :meth:`~contextmanager.__exit__` calls :meth:`terminate`.
     
     
     .. class:: AsyncResult
    @@ -1974,7 +1974,7 @@
        .. versionadded:: 3.3
           Listener objects now support the context manager protocol -- see
           :ref:`typecontextmanager`.  :meth:`~contextmanager.__enter__` returns the
    -      listener object, and :meth:~contextmanager.`__exit__` calls :meth:`close`.
    +      listener object, and :meth:`~contextmanager.__exit__` calls :meth:`close`.
     
     .. function:: wait(object_list, timeout=None)
     
    diff --git a/Doc/tools/sphinxext/susp-ignored.csv b/Doc/tools/sphinxext/susp-ignored.csv
    --- a/Doc/tools/sphinxext/susp-ignored.csv
    +++ b/Doc/tools/sphinxext/susp-ignored.csv
    @@ -18,14 +18,14 @@
     faq/windows,,:bd8afb90ebf2,"Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32"
     howto/cporting,,:encode,"if (!PyArg_ParseTuple(args, ""O:encode_object"", &myobj))"
     howto/cporting,,:say,"if (!PyArg_ParseTuple(args, ""U:say_hello"", &name))"
    -howto/curses,,:black,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:blue,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:cyan,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:green,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:magenta,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:red,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    -howto/curses,,:white,"7:white."
    -howto/curses,,:yellow,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
    +howto/curses,,:black,"colors when it activates color mode.  They are: 0:black, 1:red,"
    +howto/curses,,:red,"colors when it activates color mode.  They are: 0:black, 1:red,"
    +howto/curses,,:green,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
    +howto/curses,,:yellow,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
    +howto/curses,,:blue,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
    +howto/curses,,:magenta,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
    +howto/curses,,:cyan,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
    +howto/curses,,:white,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The"
     howto/ipaddress,,:DB8,>>> ipaddress.ip_address('2001:DB8::1')
     howto/ipaddress,,::,>>> ipaddress.ip_address('2001:DB8::1')
     howto/ipaddress,,:db8,IPv6Address('2001:db8::1')
    @@ -88,7 +88,6 @@
     library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)],"
     library/bisect,32,:hi,all(val >= x for val in a[i:hi])
     library/bisect,42,:hi,all(val > x for val in a[i:hi])
    -library/concurrent.futures,,:url,"future_to_url = {executor.submit(load_url, url, 60):url for url in URLS}"
     library/configparser,,:home,my_dir: ${Common:home_dir}/twosheds
     library/configparser,,:option,${section:option}
     library/configparser,,:path,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
    @@ -213,9 +212,9 @@
     library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n\n"
     library/urllib.request,,:password,"""joe:password at python.org"""
     library/uuid,,:uuid,urn:uuid:12345678-1234-5678-1234-567812345678
    -library/venv,,:param,":param nodist: If True, Distribute is not installed into the created"
    +library/venv,,:param,":param nodist: If True, setuptools and pip are not installed into the"
    +library/venv,,:param,":param progress: If setuptools or pip are installed, the progress of the"
     library/venv,,:param,":param nopip: If True, pip is not installed into the created"
    -library/venv,,:param,":param progress: If Distribute or pip are installed, the progress of the"
     library/venv,,:param,:param context: The information for the environment creation request
     library/xmlrpc.client,,:pass,http://user:pass at host:port/path
     library/xmlrpc.client,,:pass,user:pass
    @@ -249,6 +248,7 @@
     using/cmdline,,:line,file:line: category: message
     using/cmdline,,:message,action:message:category:module:line
     using/cmdline,,:module,action:message:category:module:line
    +using/unix,,:Packaging,http://en.opensuse.org/Portal:Packaging
     whatsnew/2.0,418,:len,
     whatsnew/2.3,,::,
     whatsnew/2.3,,:config,
    @@ -283,9 +283,7 @@
     whatsnew/3.2,,:location,zope9-location = ${zope9:location}
     whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf
     whatsnew/changelog,,:platform,:platform:
    -whatsnew/changelog,,:password,: Unquote before b64encoding user:password during Basic
    -whatsnew/changelog,,:close,Connection:close header.
     whatsnew/changelog,,:PythonCmd,"With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused"
    -whatsnew/changelog,,:close,: Connection:close header is sent by requests using URLOpener
     whatsnew/changelog,,::,": Fix FTP tests for IPv6, bind to ""::1"" instead of ""localhost""."
    -whatsnew/changelog,,:test,: test_subprocess:test_leaking_fds_on_error no longer gives a
    +whatsnew/changelog,,::,": Use ""127.0.0.1"" or ""::1"" instead of ""localhost"" as much as"
    +whatsnew/changelog,,:password,user:password
    diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst
    --- a/Doc/tutorial/modules.rst
    +++ b/Doc/tutorial/modules.rst
    @@ -184,7 +184,7 @@
     -----------------------
     
     To speed up loading modules, Python caches the compiled version of each module
    -in the ``__pycache__`` directory under the name :file:`module.{version}.pyc``,
    +in the ``__pycache__`` directory under the name :file:`module.{version}.pyc`,
     where the version encodes the format of the compiled file; it generally contains
     the Python version number.  For example, in CPython release 3.3 the compiled
     version of spam.py would be cached as ``__pycache__/spam.cpython-33.pyc``.  This
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 09:22:20 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 09:22:20 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQnVtcCB0byAzLjMu?=
    	=?utf-8?q?3rc1=2E?=
    Message-ID: <3d6sVh26mjz7LpL@mail.python.org>
    
    http://hg.python.org/cpython/rev/0b5780bdc630
    changeset:   86686:0b5780bdc630
    branch:      3.3
    user:        Georg Brandl 
    date:        Sun Oct 27 09:22:59 2013 +0100
    summary:
      Bump to 3.3.3rc1.
    
    files:
      Include/patchlevel.h      |  8 ++++----
      Lib/distutils/__init__.py |  2 +-
      Lib/idlelib/idlever.py    |  2 +-
      Misc/RPM/python-3.3.spec  |  2 +-
      README                    |  4 ++--
      5 files changed, 9 insertions(+), 9 deletions(-)
    
    
    diff --git a/Include/patchlevel.h b/Include/patchlevel.h
    --- a/Include/patchlevel.h
    +++ b/Include/patchlevel.h
    @@ -18,12 +18,12 @@
     /*--start constants--*/
     #define PY_MAJOR_VERSION	3
     #define PY_MINOR_VERSION	3
    -#define PY_MICRO_VERSION	2
    -#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_FINAL
    -#define PY_RELEASE_SERIAL	0
    +#define PY_MICRO_VERSION	3
    +#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_GAMMA
    +#define PY_RELEASE_SERIAL	1
     
     /* Version as a string */
    -#define PY_VERSION      	"3.3.2+"
    +#define PY_VERSION      	"3.3.3rc1"
     /*--end constants--*/
     
     /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
    diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py
    --- a/Lib/distutils/__init__.py
    +++ b/Lib/distutils/__init__.py
    @@ -13,5 +13,5 @@
     # Updated automatically by the Python release process.
     #
     #--start constants--
    -__version__ = "3.3.2"
    +__version__ = "3.3.3rc1"
     #--end constants--
    diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py
    --- a/Lib/idlelib/idlever.py
    +++ b/Lib/idlelib/idlever.py
    @@ -1,1 +1,1 @@
    -IDLE_VERSION = "3.3.2"
    +IDLE_VERSION = "3.3.3rc1"
    diff --git a/Misc/RPM/python-3.3.spec b/Misc/RPM/python-3.3.spec
    --- a/Misc/RPM/python-3.3.spec
    +++ b/Misc/RPM/python-3.3.spec
    @@ -39,7 +39,7 @@
     
     %define name python
     #--start constants--
    -%define version 3.3.2
    +%define version 3.3.3rc1
     %define libvers 3.3
     #--end constants--
     %define release 1pydotorg
    diff --git a/README b/README
    --- a/README
    +++ b/README
    @@ -1,5 +1,5 @@
    -This is Python version 3.3.2
    -============================
    +This is Python version 3.3.3 release candidate 1
    +================================================
     
     Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
     2012, 2013 Python Software Foundation.  All rights reserved.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From root at python.org  Sun Oct 27 09:40:22 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 09:40:22 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection timed out
    
    From root at python.org  Sun Oct 27 09:45:26 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 09:45:26 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection timed out
    
    From root at python.org  Sun Oct 27 10:02:53 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 10:02:53 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection reset by peer
    
    From root at python.org  Sun Oct 27 10:06:01 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 10:06:01 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection timed out
    
    From root at python.org  Sun Oct 27 10:15:26 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 10:15:26 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection timed out
    
    From root at python.org  Sun Oct 27 10:37:23 2013
    From: root at python.org (Cron Daemon)
    Date: Sun, 27 Oct 2013 10:37:23 +0100
    Subject: [Python-checkins] Cron  /home/docs/build-devguide
    Message-ID: 
    
    abort: error: Connection reset by peer
    
    From python-checkins at python.org  Sun Oct 27 10:39:33 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Sun, 27 Oct 2013 10:39:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Tweak_the_website_section=3A_?=
     =?utf-8?q?download/content=2Eht_also_gets_updated_for?=
    Message-ID: <3d6vCn6PKtz7Lnv@mail.python.org>
    
    http://hg.python.org/peps/rev/dce86c3d5794
    changeset:   5226:dce86c3d5794
    user:        Georg Brandl 
    date:        Sun Oct 27 10:40:11 2013 +0100
    summary:
      Tweak the website section: download/content.ht also gets updated for prereleases.
    
    files:
      pep-0101.txt |  11 ++++++-----
      1 files changed, 6 insertions(+), 5 deletions(-)
    
    
    diff --git a/pep-0101.txt b/pep-0101.txt
    --- a/pep-0101.txt
    +++ b/pep-0101.txt
    @@ -484,20 +484,21 @@
     
       ___ If this is a final release...
     
    -      ___ update the 'Quick Links' section on the front page.  Edit the
    +      ___ Update the 'Quick Links' section on the front page.  Edit the
               top-level `content.ht` file.
     
    -      ___ update the download page, editing `download/content.ht`
    -
    -      ___ for X.Y.Z, edit all the previous X.Y releases' content.ht page to
    +      ___ For X.Y.Z, edit all the previous X.Y releases' content.ht page to
               point to the new release.
     
    -      ___ update `doc/content.ht` to indicate the new current documentation
    +      ___ Update `doc/content.ht` to indicate the new current documentation
               version, and remove the current version from any 'in development'
               section. Update the version in the "What's New" link.
     
           ___ Add the new version to `doc/versions/content.ht`.
     
    +  ___ Update the download page, editing `download/content.ht`.  Pre-releases are
    +      added only to the "Testing versions" list.
    +
       ___ Edit `download/releases/content.ht` to update the version numbers for
           this release.  There are a bunch of places you need to touch:
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sun Oct 27 10:49:54 2013
    From: python-checkins at python.org (larry.hastings)
    Date: Sun, 27 Oct 2013 10:49:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319390=3A_Argument?=
     =?utf-8?q?_Clinic_no_longer_accepts_malformed_Python_and_C_ids=2E?=
    Message-ID: <3d6vRk5gX5z7LnL@mail.python.org>
    
    http://hg.python.org/cpython/rev/b496ed363c2d
    changeset:   86690:b496ed363c2d
    user:        Larry Hastings 
    date:        Sun Oct 27 02:49:39 2013 -0700
    summary:
      Issue #19390: Argument Clinic no longer accepts malformed Python and C ids.
    
    files:
      Misc/NEWS                   |   5 +++++
      Tools/clinic/clinic.py      |  25 +++++++++++++++++++------
      Tools/clinic/clinic_test.py |  14 ++++++++++++++
      3 files changed, 38 insertions(+), 6 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -129,6 +129,11 @@
     - Issue #19356: Avoid using a C variabled named "_self", it's a reserved
       word in some C compilers.
     
    +Tools/Demos
    +-----------
    +
    +- Issue #19390: Argument Clinic no longer accepts malformed Python
    +  and C ids.
     
     What's New in Python 3.4.0 Alpha 4?
     ===================================
    diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
    --- a/Tools/clinic/clinic.py
    +++ b/Tools/clinic/clinic.py
    @@ -122,6 +122,11 @@
             s = s.replace(old, new)
         return s
     
    +is_legal_c_identifier = re.compile('^[A-Za-z_][A-Za-z0-9_]*$').match
    +
    +def is_legal_py_identifier(s):
    +    return all(is_legal_c_identifier(field) for field in s.split('.'))
    +
     # added "self", "cls", and "null" just to be safe
     # (clinic will generate variables with these names)
     c_keywords = set("""
    @@ -131,8 +136,11 @@
     typeof union unsigned void volatile while
     """.strip().split())
     
    -def legal_c_identifier(s):
    -    # if we picked a C keyword, pick something else
    +def ensure_legal_c_identifier(s):
    +    # for now, just complain if what we're given isn't legal
    +    if not is_legal_c_identifier(s):
    +        fail("Illegal C identifier: {}".format(s))
    +    # but if we picked a C keyword, pick something else
         if s in c_keywords:
             return s + "_value"
         return s
    @@ -1311,7 +1319,7 @@
             parameter is a clinic.Parameter instance.
             data is a CRenderData instance.
             """
    -        name = legal_c_identifier(self.name)
    +        name = ensure_legal_c_identifier(self.name)
     
             # declarations
             d = self.declaration()
    @@ -1359,7 +1367,7 @@
             if self.encoding:
                 list.append(self.encoding)
     
    -        s = ("&" if self.parse_by_reference else "") + legal_c_identifier(self.name)
    +        s = ("&" if self.parse_by_reference else "") + ensure_legal_c_identifier(self.name)
             list.append(s)
     
         #
    @@ -1377,7 +1385,7 @@
                 prototype.append(" ")
             if by_reference:
                 prototype.append('*')
    -        prototype.append(legal_c_identifier(self.name))
    +        prototype.append(ensure_legal_c_identifier(self.name))
             return "".join(prototype)
     
         def declaration(self):
    @@ -1575,7 +1583,7 @@
                 self.format_unit = 'z*' if nullable else 's*'
     
         def cleanup(self):
    -        return "PyBuffer_Release(&" + legal_c_identifier(self.name) + ");\n"
    +        return "PyBuffer_Release(&" + ensure_legal_c_identifier(self.name) + ");\n"
     
     
     def add_c_return_converter(f, name=None):
    @@ -1895,6 +1903,11 @@
             full_name = full_name.strip()
             c_basename = c_basename.strip() or None
     
    +        if not is_legal_py_identifier(full_name):
    +            fail("Illegal function name: {}".format(full_name))
    +        if c_basename and not is_legal_c_identifier(c_basename):
    +            fail("Illegal C basename: {}".format(c_basename))
    +
             if not returns:
                 return_converter = CReturnConverter()
             else:
    diff --git a/Tools/clinic/clinic_test.py b/Tools/clinic/clinic_test.py
    --- a/Tools/clinic/clinic_test.py
    +++ b/Tools/clinic/clinic_test.py
    @@ -560,6 +560,20 @@
             self.assertEqual("Docstring\n\nfoo.bar()", function.docstring)
             self.assertEqual(0, len(function.parameters))
     
    +    def test_illegal_module_line(self):
    +        self.parse_function_should_fail("""
    +module foo
    +foo.bar => int
    +    /
    +""")
    +
    +    def test_illegal_c_basename(self):
    +        self.parse_function_should_fail("""
    +module foo
    +foo.bar as 935
    +    /
    +""")
    +
         def test_single_star(self):
             self.parse_function_should_fail("""
     module foo
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 11:39:17 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 11:39:17 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fixed_merge_te?=
     =?utf-8?q?st_for_Tcl/Tk_=3C8=2E5_=28issue_=2318964=29=2E?=
    Message-ID: <3d6wXj5pS1z7LmR@mail.python.org>
    
    http://hg.python.org/cpython/rev/5a8aa1102f82
    changeset:   86691:5a8aa1102f82
    branch:      3.3
    parent:      86688:9d6bbd824361
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 12:38:01 2013 +0200
    summary:
      Fixed merge test for Tcl/Tk <8.5 (issue #18964).
    
    files:
      Lib/test/test_tcl.py |  7 +++++--
      1 files changed, 5 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
    --- a/Lib/test/test_tcl.py
    +++ b/Lib/test/test_tcl.py
    @@ -277,9 +277,12 @@
                     (('a', (2, 3.4)), 'a {2 3.4}'),
                     ((), ''),
                     ((call('list', 1, '2', (3.4,)),), '{1 2 3.4}'),
    -                ((call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),),
    -                    '{12 ? ? 3.4}'),
                 ]
    +            if tcl_version >= (8, 5):
    +                testcases += [
    +                    ((call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),),
    +                     '{12 ? ? 3.4}'),
    +                ]
                 for args, res in testcases:
                     self.assertEqual(merge(*args), res, msg=args)
                 self.assertRaises(UnicodeDecodeError, merge, b'\x80')
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 11:39:19 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Sun, 27 Oct 2013 11:39:19 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_Null_merge?=
    Message-ID: <3d6wXl1JJ3z7LnD@mail.python.org>
    
    http://hg.python.org/cpython/rev/9b084337f13e
    changeset:   86692:9b084337f13e
    parent:      86690:b496ed363c2d
    parent:      86691:5a8aa1102f82
    user:        Serhiy Storchaka 
    date:        Sun Oct 27 12:38:59 2013 +0200
    summary:
      Null merge
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 16:56:16 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Sun, 27 Oct 2013 16:56:16 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_=22basename=22_is_now_=22stem?=
     =?utf-8?q?=22_=28preferred_by_Guido=29?=
    Message-ID: <3d73ZS4Gdbz7LjY@mail.python.org>
    
    http://hg.python.org/peps/rev/f579b30df881
    changeset:   5227:f579b30df881
    user:        Antoine Pitrou 
    date:        Sun Oct 27 16:56:12 2013 +0100
    summary:
      "basename" is now "stem" (preferred by Guido)
    
    files:
      pep-0428.txt |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/pep-0428.txt b/pep-0428.txt
    --- a/pep-0428.txt
    +++ b/pep-0428.txt
    @@ -374,7 +374,7 @@
         'c:\\'
         >>> p.name
         'pathlib.tar.gz'
    -    >>> p.basename
    +    >>> p.stem
         'pathlib.tar'
         >>> p.suffix
         '.gz'
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sun Oct 27 17:15:54 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Sun, 27 Oct 2013 17:15:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318520=3A_fix_refe?=
     =?utf-8?q?rence_leak_in_=5FPySys=5FInit=28=29?=
    Message-ID: <3d74164fgcz7Lp1@mail.python.org>
    
    http://hg.python.org/cpython/rev/5eb00460e6e8
    changeset:   86693:5eb00460e6e8
    user:        Victor Stinner 
    date:        Sun Oct 27 17:15:42 2013 +0100
    summary:
      Issue #18520: fix reference leak in _PySys_Init()
    
    files:
      Python/sysmodule.c |  25 ++++++++++++++++++-------
      1 files changed, 18 insertions(+), 7 deletions(-)
    
    
    diff --git a/Python/sysmodule.c b/Python/sysmodule.c
    --- a/Python/sysmodule.c
    +++ b/Python/sysmodule.c
    @@ -1573,6 +1573,17 @@
         if (m == NULL)
             return NULL;
         sysdict = PyModule_GetDict(m);
    +#define SET_SYS_FROM_STRING_BORROW(key, value)             \
    +    do {                                                   \
    +        int res;                                           \
    +        PyObject *v = (value);                             \
    +        if (v == NULL)                                     \
    +            return NULL;                                   \
    +        res = PyDict_SetItemString(sysdict, key, v);       \
    +        if (res < 0) {                                     \
    +            return NULL;                                   \
    +        }                                                  \
    +    } while (0)
     #define SET_SYS_FROM_STRING(key, value)                    \
         do {                                                   \
             int res;                                           \
    @@ -1580,8 +1591,8 @@
             if (v == NULL)                                     \
                 return NULL;                                   \
             res = PyDict_SetItemString(sysdict, key, v);       \
    +        Py_DECREF(v);                                      \
             if (res < 0) {                                     \
    -            Py_DECREF(v);                                  \
                 return NULL;                                   \
             }                                                  \
         } while (0)
    @@ -1606,10 +1617,10 @@
     
         /* stdin/stdout/stderr are now set by pythonrun.c */
     
    -    SET_SYS_FROM_STRING("__displayhook__",
    -                        PyDict_GetItemString(sysdict, "displayhook"));
    -    SET_SYS_FROM_STRING("__excepthook__",
    -                        PyDict_GetItemString(sysdict, "excepthook"));
    +    SET_SYS_FROM_STRING_BORROW("__displayhook__",
    +                               PyDict_GetItemString(sysdict, "displayhook"));
    +    SET_SYS_FROM_STRING_BORROW("__excepthook__",
    +                               PyDict_GetItemString(sysdict, "excepthook"));
         SET_SYS_FROM_STRING("version",
                              PyUnicode_FromString(Py_GetVersion()));
         SET_SYS_FROM_STRING("hexversion",
    @@ -1679,9 +1690,9 @@
         else {
             Py_INCREF(warnoptions);
         }
    -    SET_SYS_FROM_STRING("warnoptions", warnoptions);
    +    SET_SYS_FROM_STRING_BORROW("warnoptions", warnoptions);
     
    -    SET_SYS_FROM_STRING("_xoptions", get_xoptions());
    +    SET_SYS_FROM_STRING_BORROW("_xoptions", get_xoptions());
     
         /* version_info */
         if (VersionInfoType.tp_name == NULL) {
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 17:23:11 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Sun, 27 Oct 2013 17:23:11 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454?=
    Message-ID: <3d749W48Skz7Lph@mail.python.org>
    
    http://hg.python.org/peps/rev/eec85dece294
    changeset:   5228:eec85dece294
    user:        Victor Stinner 
    date:        Sun Oct 27 17:22:57 2013 +0100
    summary:
      PEP 454
    
    * replace Snapshot.create() class method with take_snapshot() function
    * get_traces() now returns a list instead of a dict (remove addresses)
    * remove get_stats()
    * unknown frames are now stored as ("", 0) instead of (None, None)
    * remove get_object_address()
    * remove get_trace()
    * remove add_inclusive_filter() and add_exclusive_filter() functions
    * remove "address" key type from Snapshot.group_by()
    
    files:
      pep-0454.txt |  206 ++++++++++----------------------------
      1 files changed, 53 insertions(+), 153 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -110,15 +110,15 @@
     
     ``reset()`` function:
     
    -    Clear traces and statistics on Python memory allocations.
    +    Clear traces of memory blocks allocated by Python.
     
         See also ``disable()``.
     
     
     ``disable()`` function:
     
    -    Stop tracing Python memory allocations and clear traces and
    -    statistics.
    +    Stop tracing Python memory allocations and clear traces of memory
    +    blocks allocated by Python.
     
         See also ``enable()`` and ``is_enabled()`` functions.
     
    @@ -130,23 +130,6 @@
         See also ``disable()`` and ``is_enabled()`` functions.
     
     
    -``get_stats()`` function:
    -
    -    Get statistics on traced Python memory blocks as a dictionary
    -    ``{filename (str): {line_number (int): stats}}`` where *stats* in a
    -    ``(size: int, count: int)`` tuple, *filename* and *line_number* can
    -    be ``None``.
    -
    -    *size* is the total size in bytes of all memory blocks allocated on
    -    the line, or *count* is the number of memory blocks allocated on the
    -    line.
    -
    -    Return an empty dictionary if the ``tracemalloc`` module is
    -    disabled.
    -
    -    See also the ``get_traces()`` function.
    -
    -
     ``get_traced_memory()`` function:
     
         Get the current size and maximum size of memory blocks traced by the
    @@ -178,58 +161,25 @@
     traceback)`` tuple. *size* is the size of the memory block in bytes.
     *traceback* is a tuple of frames sorted from the most recent to the oldest
     frame, limited to ``get_traceback_limit()`` frames. A frame is
    -a ``(filename: str, lineno: int)`` tuple where *filename* and *lineno* can be
    -``None``.
    +a ``(filename: str, lineno: int)`` tuple.
    +
    +If ``tracemalloc`` failed to get the whole traceback, the traceback may be
    +empty, truncated or contain ``""`` filename and line number 0.
     
     Example of trace: ``(32, (('x.py', 7), ('x.py', 11)))``.  The memory block has
     a size of 32 bytes and was allocated at ``x.py:7``, line called from line
     ``x.py:11``.
     
     
    -``get_object_address(obj)`` function:
    -
    -    Get the address of the main memory block of the specified Python
    -    object.
    -
    -    A Python object can be composed by multiple memory blocks, the
    -    function only returns the address of the main memory block. For
    -    example, items of ``dict`` and ``set`` containers are stored in a
    -    second memory block.
    -
    -    See also ``get_object_traceback()`` and ``gc.get_referrers()``
    -    functions.
    -
    -    .. note::
    -
    -       The builtin function ``id()`` returns a different address for
    -       objects tracked by the garbage collector, because ``id()``
    -       returns the address after the garbage collector header.
    -
    -
     ``get_object_traceback(obj)`` function:
     
         Get the traceback where the Python object *obj* was allocated.
    -    Return a tuple of ``(filename: str, lineno: int)`` tuples,
    -    *filename* and *lineno* can be ``None``.
    +    Return a tuple of ``(filename: str, lineno: int)`` tuples.
     
    -    Return ``None`` if the ``tracemalloc`` module did not trace the
    -    allocation of the object.
    +    Return ``None`` if the ``tracemalloc`` module is disabled or did not
    +    trace the allocation of the object.
     
    -    See also ``get_object_address()``, ``gc.get_referrers()`` and
    -    ``sys.getsizeof()`` functions.
    -
    -
    -``get_trace(address)`` function:
    -
    -    Get the trace of a memory block allocated by Python. Return a tuple:
    -    ``(size: int, traceback)``, *traceback* is a tuple of ``(filename:
    -    str, lineno: int)`` tuples, *filename* and *lineno* can be ``None``.
    -
    -    Return ``None`` if the ``tracemalloc`` module did not trace the
    -    allocation of the memory block.
    -
    -    See also ``get_object_traceback()``, ``get_stats()`` and
    -    ``get_traces()`` functions.
    +    See also ``gc.get_referrers()`` and ``sys.getsizeof()`` functions.
     
     
     ``get_traceback_limit()`` function:
    @@ -237,24 +187,20 @@
         Get the maximum number of frames stored in the traceback of a trace.
     
         By default, a trace of an allocated memory block only stores the
    -    most recent frame: the limit is ``1``. This limit is enough to get
    -    statistics using ``get_stats()``.
    +    most recent frame: the limit is ``1``.
     
         Use the ``set_traceback_limit()`` function to change the limit.
     
     
     ``get_traces()`` function:
     
    -    Get traces of all memory blocks allocated by Python. Return a
    -    dictionary: ``{address (int): trace}``, *trace* is a ``(size: int,
    -    traceback)`` tuple, *traceback* is a tuple of ``(filename: str,
    -    lineno: int)`` tuples, *filename* and *lineno* can be None.
    +    Get traces of all memory blocks allocated by Python. Return a list
    +    of ``(size: int, traceback: tuple)`` tuples. *traceback* is a tuple
    +    of ``(filename: str, lineno: int)`` tuples.
     
    -    Return an empty dictionary if the ``tracemalloc`` module is
    -    disabled.
    +    Return an empty list if the ``tracemalloc`` module is disabled.
     
    -    See also ``get_object_traceback()``, ``get_stats()`` and
    -    ``get_trace()`` functions.
    +    See also the ``get_object_traceback()`` function.
     
     
     ``set_traceback_limit(nframe: int)`` function:
    @@ -273,6 +219,18 @@
         limit at startup.
     
     
    +``take_snapshot()`` function:
    +
    +    Take a snapshot of traces of memory blocks allocated by Python.
    +
    +    Tracebacks of traces are limited to ``traceback_limit`` frames. Use
    +    ``set_traceback_limit()`` to store more frames.
    +
    +    The ``tracemalloc`` module must be enabled to take a snapshot, see
    +    the the ``enable()`` function.
    +
    +
    +
     Filter Functions
     ----------------
     
    @@ -289,31 +247,6 @@
         The new filter is not applied on already collected traces. Use the
         ``reset()`` function to ensure that all traces match the new filter.
     
    -``add_inclusive_filter(filename_pattern: str, lineno: int=None, traceback: bool=False)`` function:
    -
    -    Add an inclusive filter: helper for the ``add_filter()`` function
    -    creating a ``Filter`` instance with the ``Filter.include`` attribute
    -    set to ``True``.
    -
    -    The ``*`` joker character can be used in *filename_pattern* to match
    -    any substring, including empty string.
    -
    -    Example: ``tracemalloc.add_inclusive_filter(subprocess.__file__)``
    -    only includes memory blocks allocated by the ``subprocess`` module.
    -
    -
    -``add_exclusive_filter(filename_pattern: str, lineno: int=None, traceback: bool=False)`` function:
    -
    -    Add an exclusive filter: helper for the ``add_filter()`` function
    -    creating a ``Filter`` instance with the ``Filter.include`` attribute
    -    set to ``False``.
    -
    -    The ``*`` joker character can be used in *filename_pattern* to match
    -    any substring, including empty string.
    -
    -    Example: ``tracemalloc.add_exclusive_filter(tracemalloc.__file__)``
    -    ignores memory blocks allocated by the ``tracemalloc`` module.
    -
     
     ``clear_filters()`` function:
     
    @@ -348,6 +281,8 @@
         comparison is case insensitive and the alternative separator ``/``
         is replaced with the standard separator ``\``.
     
    +    Use ``Filter(False, "")`` to exclude empty tracebacks.
    +
     ``include`` attribute:
     
         If *include* is ``True``, only trace memory blocks allocated in a
    @@ -359,8 +294,8 @@
     
     ``lineno`` attribute:
     
    -    Line number (``int``) of the filter. If *lineno* is is ``None`` or
    -    less than ``1``, the filter matches any line number.
    +    Line number (``int``) of the filter. If *lineno* is ``None``, the
    +    filter matches any line number.
     
     ``filename_pattern`` attribute:
     
    @@ -378,9 +313,9 @@
     GroupedStats
     ------------
     
    -``GroupedStats(timestamp: datetime.datetime, traceback_limit: int, stats: dict, key_type: str, cumulative: bool)`` class:
    +``GroupedStats(timestamp: datetime.datetime, traceback_limit: int, key_type: str, stats: dict, cumulative: bool)`` class:
     
    -    Top of allocated memory blocks grouped by *key_type* as a
    +    Statistics of allocated memory blocks grouped by *key_type* as a
         dictionary.
     
         The ``Snapshot.group_by()`` method creates a ``GroupedStats``
    @@ -396,10 +331,6 @@
         *key*. Set the *sort* parameter to ``False`` to get the list
         unsorted.
     
    -    ``None`` values in keys are replaced with an empty string for
    -    filenames or zero for line numbers, because ``str`` and ``int``
    -    cannot be compared to ``None``.
    -
         See also the ``statistics()`` method.
     
     ``statistics(sort=True)`` method:
    @@ -413,10 +344,6 @@
         *key*. Set the *sort* parameter to ``False`` to get the list
         unsorted.
     
    -    ``None`` values in keys are replaced with an empty string for
    -    filenames or zero for line numbers, because ``str`` and ``int``
    -    cannot be compared to ``None``.
    -
         See also the ``compare_to()`` method.
     
     ``cumulative`` attribute:
    @@ -450,35 +377,16 @@
     Snapshot
     --------
     
    -``Snapshot(timestamp: datetime.datetime, traceback_limit: int, stats: dict=None, traces: dict=None)`` class:
    +``Snapshot(timestamp: datetime.datetime, traceback_limit: int, traces: dict=None)`` class:
     
    -    Snapshot of statistics and traces of memory blocks allocated by
    -    Python.
    +    Snapshot of traces of memory blocks allocated by Python.
     
     ``apply_filters(filters)`` method:
     
    -    Apply filters on the ``traces`` and ``stats`` dictionaries,
    -    *filters* is a list of ``Filter`` instances.
    +    Apply filters on the ``traces`` dictionary, *filters* is a list of
    +    ``Filter`` instances.
     
     
    -``create(traces=False)`` classmethod:
    -
    -    Take a snapshot of statistics and traces of memory blocks allocated
    -    by Python.
    -
    -    If *traces* is ``True``, ``get_traces()`` is called and its result
    -    is stored in the ``Snapshot.traces`` attribute. This attribute
    -    contains more information than ``Snapshot.stats`` and uses more
    -    memory and more disk space. If *traces* is ``False``,
    -    ``Snapshot.traces`` is set to ``None``.
    -
    -    Tracebacks of traces are limited to ``traceback_limit`` frames. Call
    -    ``set_traceback_limit()`` before calling ``Snapshot.create()`` to
    -    store more frames.
    -
    -    The ``tracemalloc`` module must be enabled to take a snapshot, see
    -    the the ``enable()`` function.
    -
     ``dump(filename)`` method:
     
         Write the snapshot into a file.
    @@ -495,32 +403,23 @@
     
     ``group_by(key_type: str, cumulative: bool=False)`` method:
     
    -    Group statistics by *key_type* as a ``GroupedStats`` instance:
    +    Group statistics by *key_type*. Return a ``GroupedStats`` instance:
     
    -    =====================  ===================================  ================================
    -    key_type               description                          type
    -    =====================  ===================================  ================================
    -    ``'filename'``         filename                             ``str``
    -    ``'line'``             filename and line number             ``(filename: str, lineno: int)``
    -    ``'address'``          memory block address                 ``int``
    -    ``'traceback'``        memory block address with traceback  ``(address: int, traceback)``
    -    =====================  ===================================  ================================
    -
    -    The ``traceback`` type is a tuple of ``(filename: str, lineno:
    -    int)`` tuples, *filename* and *lineno* can be ``None``.
    +      =====================  ========================  ================================================
    +      key_type               description               type
    +      =====================  ========================  ================================================
    +      ``'filename'``         filename                  ``str``
    +      ``'lineno'``           filename and line number  ``(filename: str, lineno: int)``
    +      ``'traceback'``        traceback                 tuple of ``(filename: str, lineno: int)`` tuples
    +      =====================  ========================  ================================================
     
         If *cumulative* is ``True``, cumulate size and count of memory
         blocks of all frames of the traceback of a trace, not only the most
         recent frame. The *cumulative* parameter is set to ``False`` if
    -    *key_type* is ``'address'``, or if the traceback limit is less than
    -    ``2``.
    +    *key_type* is ``'traceback'``, or if the ``traceback_limit``
    +    attribute is less than ``2``.
     
     
    -``stats`` attribute:
    -
    -    Statistics on traced Python memory, result of the ``get_stats()``
    -    function.
    -
     ``traceback_limit`` attribute:
     
         Maximum number of frames stored in the traceback of ``traces``,
    @@ -528,8 +427,10 @@
     
     ``traces`` attribute:
     
    -    Traces of Python memory allocations, result of the ``get_traces()``
    -    function, can be ``None``.
    +    Traces of all memory blocks allocated by Python, result of the
    +    ``get_traces()`` function: list of ``(size: int, traceback: tuple)``
    +    tuples, *traceback* is a tuple of ``(filename: str, lineno: int)``
    +    tuples.
     
     ``timestamp`` attribute:
     
    @@ -552,7 +453,6 @@
         Key identifying the statistic. The key type depends on
         ``GroupedStats.key_type``, see the ``Snapshot.group_by()`` method.
     
    -
     ``count`` attribute:
     
         Number of memory blocks (``int``).
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Sun Oct 27 18:51:01 2013
    From: python-checkins at python.org (tim.golden)
    Date: Sun, 27 Oct 2013 18:51:01 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue14255_Don=27t_flatten?=
    	=?utf-8?q?_case_of_tempdir?=
    Message-ID: <3d766s73jlz7LmR@mail.python.org>
    
    http://hg.python.org/cpython/rev/d5a9a1ba47ee
    changeset:   86694:d5a9a1ba47ee
    user:        Tim Golden 
    date:        Fri Oct 25 18:38:16 2013 +0100
    summary:
      Issue14255 Don't flatten case of tempdir
    
    files:
      Lib/tempfile.py                    |   2 +-
      Lib/test/test_tempfile.py          |  14 ++++++++++++++
      Lib/test/test_zipimport_support.py |   6 ++++--
      3 files changed, 19 insertions(+), 3 deletions(-)
    
    
    diff --git a/Lib/tempfile.py b/Lib/tempfile.py
    --- a/Lib/tempfile.py
    +++ b/Lib/tempfile.py
    @@ -146,7 +146,7 @@
     
         for dir in dirlist:
             if dir != _os.curdir:
    -            dir = _os.path.normcase(_os.path.abspath(dir))
    +            dir = _os.path.abspath(dir)
             # Try only a few names per directory.
             for seq in range(100):
                 name = next(namer)
    diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
    --- a/Lib/test/test_tempfile.py
    +++ b/Lib/test/test_tempfile.py
    @@ -478,6 +478,20 @@
     
             self.assertTrue(a is b)
     
    +    def test_case_sensitive(self):
    +        # gettempdir should not flatten its case
    +        # even on a case-insensitive file system
    +        case_sensitive_tempdir = tempfile.mkdtemp("-Temp")
    +        _tempdir, tempfile.tempdir = tempfile.tempdir, None
    +        try:
    +            with support.EnvironmentVarGuard() as env:
    +                # Fake the first env var which is checked as a candidate
    +                env["TMPDIR"] = case_sensitive_tempdir
    +                self.assertEqual(tempfile.gettempdir(), case_sensitive_tempdir)
    +        finally:
    +            tempfile.tempdir = _tempdir
    +            support.rmdir(case_sensitive_tempdir)
    +
     
     class TestMkstemp(BaseTestCase):
         """Test mkstemp()."""
    diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py
    --- a/Lib/test/test_zipimport_support.py
    +++ b/Lib/test/test_zipimport_support.py
    @@ -227,13 +227,15 @@
                 p = spawn_python(script_name)
                 p.stdin.write(b'l\n')
                 data = kill_python(p)
    -            self.assertIn(script_name.encode('utf-8'), data)
    +            # bdb/pdb applies normcase to its filename before displaying
    +            self.assertIn(os.path.normcase(script_name.encode('utf-8')), data)
                 zip_name, run_name = make_zip_script(d, "test_zip",
                                                     script_name, '__main__.py')
                 p = spawn_python(zip_name)
                 p.stdin.write(b'l\n')
                 data = kill_python(p)
    -            self.assertIn(run_name.encode('utf-8'), data)
    +            # bdb/pdb applies normcase to its filename before displaying
    +            self.assertIn(os.path.normcase(run_name.encode('utf-8')), data)
     
     
     def test_main():
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Sun Oct 27 19:13:35 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Sun, 27 Oct 2013 19:13:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?release=3A_remove_bzip2_tarballs?=
    Message-ID: <3d76cv6Wghz7Ljp@mail.python.org>
    
    http://hg.python.org/release/rev/1f49b5c5f6c9
    changeset:   64:1f49b5c5f6c9
    user:        Benjamin Peterson 
    date:        Sun Oct 27 14:13:30 2013 -0400
    summary:
      remove bzip2 tarballs
    
    files:
      release.py |  11 -----------
      1 files changed, 0 insertions(+), 11 deletions(-)
    
    
    diff --git a/release.py b/release.py
    --- a/release.py
    +++ b/release.py
    @@ -217,33 +217,23 @@
         print('Making .tgz')
         base = os.path.basename(source)
         tgz = base + '.tgz'
    -    bz = base + '.tar.bz2'
         xz = base + '.tar.xz'
         run_cmd(['tar cf - %s | gzip -9 > %s' % (source, tgz)])
    -    print("Making .tar.bz2")
    -    run_cmd(['tar cf - %s | bzip2 -9 > %s' % (source, bz)])
         print("Making .tar.xz")
         run_cmd(['tar cf - %s | xz > %s' % (source, xz)])
         print('Calculating md5 sums')
         checksum_tgz = hashlib.md5()
         with open(tgz, 'rb') as data:
             checksum_tgz.update(data.read())
    -    checksum_bz2 = hashlib.md5()
    -    with open(bz, 'rb') as data:
    -        checksum_bz2.update(data.read())
         checksum_xz = hashlib.md5()
         with open(xz, 'rb') as data:
             checksum_xz.update(data.read())
         print('  %s  %8s  %s' % (
             checksum_tgz.hexdigest(), int(os.path.getsize(tgz)), tgz))
         print('  %s  %8s  %s' % (
    -        checksum_bz2.hexdigest(), int(os.path.getsize(bz)), bz))
    -    print('  %s  %8s  %s' % (
             checksum_xz.hexdigest(), int(os.path.getsize(xz)), xz))
         with open(tgz + '.md5', 'w', encoding="ascii") as fp:
             fp.write(checksum_tgz.hexdigest())
    -    with open(bz + '.md5', 'w', encoding="ascii") as fp:
    -        fp.write(checksum_bz2.hexdigest())
         with open(xz + '.md5', 'w', encoding="ascii") as fp:
             fp.write(checksum_xz.hexdigest())
     
    @@ -252,7 +242,6 @@
         run_cmd(['gpg -K | grep -A 1 "^sec"'])
         uid = input('Please enter key ID to use for signing: ')
         os.system('gpg -bas -u ' + uid + ' ' + tgz)
    -    os.system('gpg -bas -u ' + uid + ' ' + bz)
         os.system('gpg -bas -u ' + uid + ' ' + xz)
     
     
    
    -- 
    Repository URL: http://hg.python.org/release
    
    From python-checkins at python.org  Sun Oct 27 21:04:48 2013
    From: python-checkins at python.org (tim.golden)
    Date: Sun, 27 Oct 2013 21:04:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_15792_Correct_build_?=
     =?utf-8?q?options_on_Win64=2E_Patch_by_Jeremy_Kloth=2E?=
    Message-ID: <3d795D6WWYz7Llg@mail.python.org>
    
    http://hg.python.org/cpython/rev/7c46b1b239fe
    changeset:   86695:7c46b1b239fe
    user:        Tim Golden 
    date:        Sun Oct 27 20:04:12 2013 +0000
    summary:
      Issue 15792 Correct build options on Win64. Patch by Jeremy Kloth.
    
    files:
      Misc/NEWS            |  2 ++
      PC/VS9.0/x64.vsprops |  2 +-
      PCbuild/x64.props    |  2 +-
      3 files changed, 4 insertions(+), 2 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -129,6 +129,8 @@
     - Issue #19356: Avoid using a C variabled named "_self", it's a reserved
       word in some C compilers.
     
    +- Issue #15792: Correct build options on Win64. Patch by Jeremy Kloth.
    +
     Tools/Demos
     -----------
     
    diff --git a/PC/VS9.0/x64.vsprops b/PC/VS9.0/x64.vsprops
    --- a/PC/VS9.0/x64.vsprops
    +++ b/PC/VS9.0/x64.vsprops
    @@ -8,7 +8,7 @@
     	>
     	
     	
       
         
    -      /USECL:MS_OPTERON /GS- %(AdditionalOptions)
    +      false
           _WIN64;_M_X64;%(PreprocessorDefinitions)
         
         
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 00:20:33 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Mon, 28 Oct 2013 00:20:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_cleanup?=
    Message-ID: <3d7FR52X9Xz7Lnl@mail.python.org>
    
    http://hg.python.org/peps/rev/215cf903a90b
    changeset:   5229:215cf903a90b
    user:        Victor Stinner 
    date:        Sun Oct 27 18:26:47 2013 +0100
    summary:
      PEP 454: cleanup
    
    files:
      pep-0454.txt |  4 ++--
      1 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -55,14 +55,14 @@
     get the traceback of the current Python thread when a memory block is
     allocated by Python.
     
    -This PEP proposes to add a new ``tracemalloc`` module, as a debug tool
    +This PEP proposes to add a new ``tracemalloc`` module, a debug tool
     to trace memory blocks allocated by Python. The module provides the
     following information:
     
    +* Traceback where an object was allocated
     * Statistics on allocated memory blocks per filename and per line
       number: total size, number and average size of allocated memory blocks
     * Computed differences between two snapshots to detect memory leaks
    -* Traceback where a memory block was allocated
     
     The API of the tracemalloc module is similar to the API of the
     faulthandler module: ``enable()``, ``disable()`` and ``is_enabled()``
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Mon Oct 28 00:20:34 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Mon, 28 Oct 2013 00:20:34 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_remove_GroupedStat?=
     =?utf-8?q?s=2Etimestamp/=2Etraceback=5Flimit_attributes?=
    Message-ID: <3d7FR65CxLz7Ln4@mail.python.org>
    
    http://hg.python.org/peps/rev/62149b9671ff
    changeset:   5230:62149b9671ff
    user:        Victor Stinner 
    date:        Mon Oct 28 00:20:26 2013 +0100
    summary:
      PEP 454: remove GroupedStats.timestamp/.traceback_limit attributes
    
    various cleanup
    
    files:
      pep-0454.txt |  82 ++++++++++++++++++++-------------------
      1 files changed, 42 insertions(+), 40 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -138,8 +138,8 @@
     
     ``get_tracemalloc_memory()`` function:
     
    -    Get the memory usage in bytes of the ``tracemalloc`` module used
    -    internally to trace memory allocations. Return an ``int``.
    +    Get the memory usage in bytes of the ``tracemalloc`` module used to
    +    store traces of memory blocks. Return an ``int``.
     
     
     ``is_enabled()`` function:
    @@ -166,8 +166,8 @@
     If ``tracemalloc`` failed to get the whole traceback, the traceback may be
     empty, truncated or contain ``""`` filename and line number 0.
     
    -Example of trace: ``(32, (('x.py', 7), ('x.py', 11)))``.  The memory block has
    -a size of 32 bytes and was allocated at ``x.py:7``, line called from line
    +Example of a trace: ``(32, (('x.py', 7), ('x.py', 11)))``.  The memory block
    +has a size of 32 bytes and was allocated at ``x.py:7``, line called from line
     ``x.py:11``.
     
     
    @@ -194,9 +194,13 @@
     
     ``get_traces()`` function:
     
    -    Get traces of all memory blocks allocated by Python. Return a list
    -    of ``(size: int, traceback: tuple)`` tuples. *traceback* is a tuple
    -    of ``(filename: str, lineno: int)`` tuples.
    +    Get traces of memory blocks allocated by Python. Return a list of
    +    ``(size: int, traceback: tuple)`` tuples. *traceback* is a tuple of
    +    ``(filename: str, lineno: int)`` tuples.
    +
    +    The list of traces do not include memory blocks allocated before the
    +    ``tracemalloc`` module was enabled and memory blocks ignored by
    +    filters (see ``get_filters()()``).
     
         Return an empty list if the ``tracemalloc`` module is disabled.
     
    @@ -240,9 +244,8 @@
         ``Filter`` instance.
     
         All inclusive filters are applied at once, a memory allocation is
    -    only ignored if no inclusive filters match its trace. A memory
    -    allocation is ignored if at least one exclusive filter matchs its
    -    trace.
    +    ignored if no inclusive filters match its trace. A memory allocation
    +    is ignored if at least one exclusive filter matchs its trace.
     
         The new filter is not applied on already collected traces. Use the
         ``reset()`` function to ensure that all traces match the new filter.
    @@ -275,13 +278,14 @@
         used to reduce the memory usage of the ``tracemalloc`` module, which
         can be read using the ``get_tracemalloc_memory()`` function.
     
    -    The ``*`` joker character can be used in *filename_pattern* to match
    -    any substring, including empty string. The ``.pyc`` and ``.pyo``
    -    file extensions are replaced with ``.py``. On Windows, the
    -    comparison is case insensitive and the alternative separator ``/``
    -    is replaced with the standard separator ``\``.
    +    The ``'*'`` joker character can be used in *filename_pattern* to
    +    match any substring, including empty string. The ``'.pyc'`` and
    +    ``'.pyo'`` file extensions are replaced with ``'.py'``. On Windows,
    +    the comparison is case insensitive and the alternative separator
    +    ``'/'`` is replaced with the standard separator ``'\'``.
     
    -    Use ``Filter(False, "")`` to exclude empty tracebacks.
    +    For example, use ``Filter(False, "")`` to exclude empty
    +    tracebacks.
     
     ``include`` attribute:
     
    @@ -313,7 +317,7 @@
     GroupedStats
     ------------
     
    -``GroupedStats(timestamp: datetime.datetime, traceback_limit: int, key_type: str, stats: dict, cumulative: bool)`` class:
    +``GroupedStats(key_type: str, stats: dict, cumulative: bool)`` class:
     
         Statistics of allocated memory blocks grouped by *key_type* as a
         dictionary.
    @@ -326,7 +330,7 @@
         Compare statistics to an older ``GroupedStats`` instance. Return a
         list of ``Statistic`` instances.
     
    -    The result is sorted in the biggest to the smallest by
    +    The result is sorted from the biggest to the smallest by
         ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by
         *key*. Set the *sort* parameter to ``False`` to get the list
         unsorted.
    @@ -339,7 +343,7 @@
         ``Statistic.size_diff`` and ``Statistic.count_diff`` attributes are
         set to zero.
     
    -    The result is sorted in the biggest to the smallest by
    +    The result is sorted from the biggest to the smallest by
         ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by
         *key*. Set the *sort* parameter to ``False`` to get the list
         unsorted.
    @@ -354,25 +358,16 @@
     ``key_type`` attribute:
     
         Determine how memory allocations were grouped: see
    -    ``Snapshot.group_by()()`` for the available values.
    +    ``Snapshot.group_by()`` for the available values.
     
     ``stats`` attribute:
     
    -    Dictionary ``{key: (size: int, count: int)}`` where the type of
    -    *key* depends on the ``key_type`` attribute.
    +    Dictionary ``{key: [size: int, count: int]}`` where the type of
    +    *key* depends on the ``key_type`` attribute, *size* is the total
    +    size of memory blocks and *count* is the number of memory blocks.
     
         See the ``Snapshot.group_by()`` method.
     
    -``traceback_limit`` attribute:
    -
    -    Maximum number of frames stored in the traceback of ``traces``,
    -    result of the ``get_traceback_limit()`` function.
    -
    -``timestamp`` attribute:
    -
    -    Creation date and time of the snapshot, ``datetime.datetime``
    -    instance.
    -
     
     Snapshot
     --------
    @@ -381,6 +376,8 @@
     
         Snapshot of traces of memory blocks allocated by Python.
     
    +    The ``take_snapshot()`` function create a snapshot instance.
    +
     ``apply_filters(filters)`` method:
     
         Apply filters on the ``traces`` dictionary, *filters* is a list of
    @@ -403,15 +400,16 @@
     
     ``group_by(key_type: str, cumulative: bool=False)`` method:
     
    -    Group statistics by *key_type*. Return a ``GroupedStats`` instance:
    +    Group statistics by *key_type*. Return a ``GroupedStats`` instance.
    +    Key types:
     
    -      =====================  ========================  ================================================
    -      key_type               description               type
    -      =====================  ========================  ================================================
    -      ``'filename'``         filename                  ``str``
    -      ``'lineno'``           filename and line number  ``(filename: str, lineno: int)``
    -      ``'traceback'``        traceback                 tuple of ``(filename: str, lineno: int)`` tuples
    -      =====================  ========================  ================================================
    +    =====================  ========================  ================================================
    +    key_type               description               type
    +    =====================  ========================  ================================================
    +    ``'filename'``         filename                  ``str``
    +    ``'lineno'``           filename and line number  ``(filename: str, lineno: int)``
    +    ``'traceback'``        traceback                 tuple of ``(filename: str, lineno: int)`` tuples
    +    =====================  ========================  ================================================
     
         If *cumulative* is ``True``, cumulate size and count of memory
         blocks of all frames of the traceback of a trace, not only the most
    @@ -445,6 +443,9 @@
     
         Statistic on memory allocations.
     
    +    ``size_diff`` and ``count_diff`` attributes are the difference
    +    between two ``GroupedStats`` instance.
    +
         ``GroupedStats.compare_to()``  and ``GroupedStats.statistics()``
         return a list of ``Statistic`` instances.
     
    @@ -520,6 +521,7 @@
     * `pytracemalloc on PyPI
       `_
     
    +
     Copyright
     =========
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Mon Oct 28 00:33:31 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Mon, 28 Oct 2013 00:33:31 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Update_PEP_456_to_reflect_the?=
     =?utf-8?q?_changes_in_features/pep-456?=
    Message-ID: <3d7Fk30d5qz7Llp@mail.python.org>
    
    http://hg.python.org/peps/rev/8a787f8c1dd6
    changeset:   5231:8a787f8c1dd6
    user:        Christian Heimes 
    date:        Mon Oct 28 00:33:22 2013 +0100
    summary:
      Update PEP 456 to reflect the changes in features/pep-456
    
    files:
      pep-0456.txt |  139 ++++++++++++++++++++++----------------
      1 files changed, 80 insertions(+), 59 deletions(-)
    
    
    diff --git a/pep-0456.txt b/pep-0456.txt
    --- a/pep-0456.txt
    +++ b/pep-0456.txt
    @@ -75,15 +75,13 @@
     * It MUST support hashing of unaligned memory in order to support
       hash(memoryview).
     
    -* It MUST NOT return ``-1``. The value is reserved for error cases and yet
    -  uncached hash values.  (Note: A special case can be added to map ``-1``
    -  to ``-2``.)
    -
     * It is highly RECOMMENDED that the length of the input influences the
       outcome, so that ``hash(b'\00') != hash(b'\x00\x00')``.
     
    -* It MAY return ``0`` for zero length input in order to disguise the
    -  randomization seed. (Note: This can be handled as special case, too.)
    +The internal interface code between the hash function and the tp_hash slots
    +implements special cases for zero length input and a return value of ``-1``.
    +An input of length ``0`` is mapped to hash value ``0``. The output ``-1``
    +is mapped to ``-2``.
     
     
     Current implementation with modified FNV
    @@ -306,52 +304,63 @@
     ``_Py_HashSecret_t`` is initialized in ``Python/random.c:_PyRandom_Init()``
     exactly once at startup.
     
    -hash function
    --------------
     
    -function prototype::
    +hash function definition
    +------------------------
     
    -    typedef Py_hash_t (*PyHash_Func_t)(const void *, Py_ssize_t);
    +Implementation::
    +
    +    typedef struct {
    +        /* function pointer to hash function, e.g. fnv or siphash24 */
    +        Py_hash_t (*const hash)(const void *, Py_ssize_t);
    +        const char *name;       /* name of the hash algorithm and variant */
    +        const int hash_bits;    /* internal size of hash value */
    +        const int seed_bits;    /* size of seed input */
    +    } PyHash_FuncDef;
    +
    +    PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void);
    +
    +
    +autoconf
    +--------
    +
    +A new test is added to the configure script. The test sets
    +``HAVE_ALIGNED_REQUIRED``, when it detects a platform, that requires aligned
    +memory access for integers. Must current platforms such as X86, X86_64 and
    +modern ARM don't need aligned data.
    +
    +A new option ``--with-hash-algorithm`` enables the user to select a hash
    +algorithm in the configure step.
     
     
     hash function selection
     -----------------------
     
    -type definition::
    +The value of the macro ``PY_HASH_ALGORITHM`` defines which hash algorithm is
    +used internally. It may be set to any of the three values ``PY_HASH_SIPHASH24``,
    +``PY_HASH_FNV`` or ``PY_HASH_EXTERNAL``. If ``PY_HASH_ALGORITHM`` is not
    +defined at all, then the best available algorithm is selected. On platforms
    +wich don't require aligned memory access (``HAVE_ALIGNED_REQUIRED`` not
    +defined) and an unsigned 64bit integer type ``PY_UINT64_T``, SipHash24 is
    +used. On strict C89 platforms without a 64 bit data type, or architectures such
    +as SPARC, FNV is selected as fallback. A hash algorithm can be selected with
    +an autoconf option, for example ``./configure --with-hash-algorithm=fnv``.
     
    -    #define PY_HASH_SIPHASH24 0x53495024
    -    #define PY_HASH_FNV 0x464E56
    +The value ``PY_HASH_EXTERNAL`` allows 3rd parties to provide their own
    +implementation at compile time.
     
    -    #ifndef PY_HASH_ALGORITHM
    -    #if defined(PY_UINT64_T) && defined(PY_UINT32_T)
    -    #define PY_HASH_ALGORITHM PY_HASH_SIPHASH24
    -    #else
    -    #define PY_HASH_ALGORITHM PY_HASH_FNV
    -    #endif /* uint64_t && uint32_t */
    -    #endif /* PY_HASH_ALGORITHM */
    -
    -    typedef struct {
    -        PyHash_Func_t hash;    /* function pointer */
    -        char *name;            /* name of the hash algorithm and variant */
    -        int hash_bits;         /* internal size of hash value */
    -        int seed_bits;         /* size of seed input */
    -    } PyHash_FuncDef;
    -
    -    PyAPI_DATA(PyHash_FuncDef) PyHash_Func;
     
     Implementation::
     
    -    #if PY_HASH_ALGORITHM == PY_HASH_FNV
    -    PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t),
    -                                  16 * sizeof(Py_hash_t)};
    +    #if PY_HASH_ALGORITHM == PY_HASH_EXTERNAL
    +    extern PyHash_FuncDef PyHash_Func;
    +    #elif PY_HASH_ALGORITHM == PY_HASH_SIPHASH24
    +    static PyHash_FuncDef PyHash_Func = {siphash24, "siphash24", 64, 128};
    +    #elif PY_HASH_ALGORITHM == PY_HASH_FNV
    +    static PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t),
    +                                         16 * sizeof(Py_hash_t)};
         #endif
     
    -    #if PY_HASH_ALGORITHM == PY_HASH_SIPHASH24
    -    PyHash_FuncDef PyHash_Func = {siphash24, "siphash24", 64, 128};
    -    #endif
    -
    -TODO: select hash algorithm with autoconf variable
    -
     
     Python API addition
     ===================
    @@ -378,34 +387,37 @@
     Necessary modifications to C code
     =================================
     
    -_Py_HashBytes (Objects/object.c)
    ---------------------------------
    +_Py_HashBytes() (Objects/object.c)
    +----------------------------------
     
     ``_Py_HashBytes`` is an internal helper function that provides the hashing
     code for bytes, memoryview and datetime classes. It currently implements FNV
    -for ``unsigned char*``. The function can either be modified to use the new
    -API or it could be completely removed to avoid an unnecessary level of
    -indirection.
    +for ``unsigned char *``.
     
    +The function is moved to Python/pyhash.c and modified to use the hash function
    +through PyHash_Func.hash(). The function signature is altered to take
    +a ``const void *`` as first argument. ``_Py_HashBytes`` also takes care of
    +special cases. It maps zero length input to ``0`` and return value of ``-1``
    +to ``-2``.
     
    -bytes_hash (Objects/bytesobject.c)
    -----------------------------------
    +bytes_hash() (Objects/bytesobject.c)
    +------------------------------------
     
     ``bytes_hash`` uses ``_Py_HashBytes`` to provide the tp_hash slot function
    -for bytes objects. If ``_Py_HashBytes`` is to be removed then ``bytes_hash``
    -must be reimplemented.
    +for bytes objects. The function will continue to use ``_Py_HashBytes``
    +but withoht a type cast.
     
    -
    -memory_hash (Objects/memoryobject.c)
    -------------------------------------
    +memory_hash() (Objects/memoryobject.c)
    +--------------------------------------
     
     ``memory_hash`` provides the tp_hash slot function for read-only memory
     views if the original object is hashable, too. It's the only function that
    -has to support hashing of unaligned memory segments in the future.
    +has to support hashing of unaligned memory segments in the future. The
    +function will continue to use ``_Py_HashBytes`` but withoht a type cast.
     
     
    -unicode_hash (Objects/unicodeobject.c)
    ---------------------------------------
    +unicode_hash() (Objects/unicodeobject.c)
    +----------------------------------------
     
     ``unicode_hash`` provides the tp_hash slot function for unicode. Right now it
     implements the FNV algorithm three times for ``unsigned char*``, ``Py_UCS2``
    @@ -416,12 +428,12 @@
     
         if (PyUnicode_READY(u) == -1)
             return -1;
    -    x = PyHash_Func.hash(PyUnicode_DATA(u),
    -                         PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u));
    +    x = _Py_HashBytes(PyUnicode_DATA(u),
    +                      PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u));
     
     
    -generic_hash (Modules/_datetimemodule.c)
    -----------------------------------------
    +generic_hash() (Modules/_datetimemodule.c)
    +------------------------------------------
     
     ``generic_hash`` acts as a wrapper around ``_Py_HashBytes`` for the tp_hash
     slots of date, time and datetime types. timedelta objects are hashed by their
    @@ -459,8 +471,17 @@
     strings. For very short strings the setup cost for SipHash dominates its
     speed but it is still in the same order of magnitude as the current FNV code.
     
    -It's yet unknown how the new distribution of hash values affects collisions
    -of common keys in dicts of Python classes.
    +
    +Hash value distribution
    +-----------------------
    +
    +A good distribution of hash values is important for dict and set performance.
    +Both SipHash24 and FNV take the length of the input into account, so that
    +strings made up entirely of NULL bytes don't have the same hash value. The
    +last bytes of the input tend to affect the least significant bits of the hash
    +value, too. That attribute reduces the amount of hash collisions for strings
    +with a common prefix.
    +
     
     Typical length
     --------------
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Mon Oct 28 03:51:33 2013
    From: python-checkins at python.org (ned.deily)
    Date: Mon, 28 Oct 2013 03:51:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5Mzcz?=
     =?utf-8?q?=3A_Apply_upstream_change_to_Tk_8=2E5=2E15_fixing_OS_X_10=2E9?=
    Message-ID: <3d7L6Y1WFwz7Ljj@mail.python.org>
    
    http://hg.python.org/cpython/rev/1712a22aa1a9
    changeset:   86696:1712a22aa1a9
    branch:      2.7
    parent:      86671:b7f71babc622
    user:        Ned Deily 
    date:        Sun Oct 27 19:47:23 2013 -0700
    summary:
      Issue #19373: Apply upstream change to Tk 8.5.15 fixing OS X 10.9
    screen refresh problem.
    
    files:
      Mac/BuildScript/build-installer.py                |   8 ++++-
      Mac/BuildScript/issue19373_tk_8_5_15_source.patch |  13 ++++++++++
      2 files changed, 19 insertions(+), 2 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -215,6 +215,9 @@
                   name="Tk 8.5.15",
                   url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
                   checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              patches=[
    +                  "issue19373_tk_8_5_15_source.patch",
    +                   ],
                   buildDir="unix",
                   configure_pre=[
                         '--enable-aqua',
    @@ -797,8 +800,6 @@
     
         workDir = extractArchive(buildDir, sourceArchive)
         os.chdir(workDir)
    -    if 'buildDir' in recipe:
    -        os.chdir(recipe['buildDir'])
     
         for patch in recipe.get('patches', ()):
             if isinstance(patch, tuple):
    @@ -825,6 +826,9 @@
             runCommand('sh %s' % shellQuote(fn))
             os.unlink(fn)
     
    +    if 'buildDir' in recipe:
    +        os.chdir(recipe['buildDir'])
    +
         if configure is not None:
             configure_args = [
                 "--prefix=/usr/local",
    diff --git a/Mac/BuildScript/issue19373_tk_8_5_15_source.patch b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    new file mode 100644
    --- /dev/null
    +++ b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    @@ -0,0 +1,13 @@
    +Issue #19373: Patch to Tk 8.5.15 to correct refresh problem on OS x 10.9.
    +From upstream checkin https://core.tcl.tk/tk/info/5a5abf71f9
    +
    +--- tk8.5.15/macosx/tkMacOSXDraw.c	2013-09-16 09:41:21.000000000 -0700
    ++++ Tk_Source_Code-5a5abf71f9fdb0da/macosx/tkMacOSXDraw.c	2013-10-27 13:27:00.000000000 -0700
    +@@ -1688,6 +1688,7 @@
    + {
    +     if (dcPtr->context) {
    + 	CGContextSynchronize(dcPtr->context);
    ++	[[dcPtr->view window] setViewsNeedDisplay:YES];
    + 	[[dcPtr->view window] enableFlushWindow];
    + 	if (dcPtr->focusLocked) {
    + 	    [dcPtr->view unlockFocus];
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 03:51:34 2013
    From: python-checkins at python.org (ned.deily)
    Date: Mon, 28 Oct 2013 03:51:34 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5Mzcz?=
     =?utf-8?q?=3A_Apply_upstream_change_to_Tk_8=2E5=2E15_fixing_OS_X_10=2E9?=
    Message-ID: <3d7L6Z3M7yz7LkL@mail.python.org>
    
    http://hg.python.org/cpython/rev/8609f6df9974
    changeset:   86697:8609f6df9974
    branch:      3.3
    parent:      86691:5a8aa1102f82
    user:        Ned Deily 
    date:        Sun Oct 27 19:49:29 2013 -0700
    summary:
      Issue #19373: Apply upstream change to Tk 8.5.15 fixing OS X 10.9
    screen refresh problem.
    
    files:
      Mac/BuildScript/build-installer.py                |   8 ++++-
      Mac/BuildScript/issue19373_tk_8_5_15_source.patch |  13 ++++++++++
      2 files changed, 19 insertions(+), 2 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -215,6 +215,9 @@
                   name="Tk 8.5.15",
                   url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
                   checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              patches=[
    +                  "issue19373_tk_8_5_15_source.patch",
    +                   ],
                   buildDir="unix",
                   configure_pre=[
                         '--enable-aqua',
    @@ -797,8 +800,6 @@
     
         workDir = extractArchive(buildDir, sourceArchive)
         os.chdir(workDir)
    -    if 'buildDir' in recipe:
    -        os.chdir(recipe['buildDir'])
     
         for patch in recipe.get('patches', ()):
             if isinstance(patch, tuple):
    @@ -825,6 +826,9 @@
             runCommand('sh %s' % shellQuote(fn))
             os.unlink(fn)
     
    +    if 'buildDir' in recipe:
    +        os.chdir(recipe['buildDir'])
    +
         if configure is not None:
             configure_args = [
                 "--prefix=/usr/local",
    diff --git a/Mac/BuildScript/issue19373_tk_8_5_15_source.patch b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    new file mode 100644
    --- /dev/null
    +++ b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    @@ -0,0 +1,13 @@
    +Issue #19373: Patch to Tk 8.5.15 to correct refresh problem on OS x 10.9.
    +From upstream checkin https://core.tcl.tk/tk/info/5a5abf71f9
    +
    +--- tk8.5.15/macosx/tkMacOSXDraw.c	2013-09-16 09:41:21.000000000 -0700
    ++++ Tk_Source_Code-5a5abf71f9fdb0da/macosx/tkMacOSXDraw.c	2013-10-27 13:27:00.000000000 -0700
    +@@ -1688,6 +1688,7 @@
    + {
    +     if (dcPtr->context) {
    + 	CGContextSynchronize(dcPtr->context);
    ++	[[dcPtr->view window] setViewsNeedDisplay:YES];
    + 	[[dcPtr->view window] enableFlushWindow];
    + 	if (dcPtr->focusLocked) {
    + 	    [dcPtr->view unlockFocus];
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 03:51:35 2013
    From: python-checkins at python.org (ned.deily)
    Date: Mon, 28 Oct 2013 03:51:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_=2319373=3A_merge_from_3=2E3?=
    Message-ID: <3d7L6b5BGMz7LkY@mail.python.org>
    
    http://hg.python.org/cpython/rev/33b31971ae9d
    changeset:   86698:33b31971ae9d
    parent:      86695:7c46b1b239fe
    parent:      86697:8609f6df9974
    user:        Ned Deily 
    date:        Sun Oct 27 19:50:34 2013 -0700
    summary:
      Issue #19373: merge from 3.3
    
    files:
      Mac/BuildScript/build-installer.py                |   8 ++++-
      Mac/BuildScript/issue19373_tk_8_5_15_source.patch |  13 ++++++++++
      2 files changed, 19 insertions(+), 2 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -215,6 +215,9 @@
                   name="Tk 8.5.15",
                   url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
                   checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              patches=[
    +                  "issue19373_tk_8_5_15_source.patch",
    +                   ],
                   buildDir="unix",
                   configure_pre=[
                         '--enable-aqua',
    @@ -797,8 +800,6 @@
     
         workDir = extractArchive(buildDir, sourceArchive)
         os.chdir(workDir)
    -    if 'buildDir' in recipe:
    -        os.chdir(recipe['buildDir'])
     
         for patch in recipe.get('patches', ()):
             if isinstance(patch, tuple):
    @@ -825,6 +826,9 @@
             runCommand('sh %s' % shellQuote(fn))
             os.unlink(fn)
     
    +    if 'buildDir' in recipe:
    +        os.chdir(recipe['buildDir'])
    +
         if configure is not None:
             configure_args = [
                 "--prefix=/usr/local",
    diff --git a/Mac/BuildScript/issue19373_tk_8_5_15_source.patch b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    new file mode 100644
    --- /dev/null
    +++ b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    @@ -0,0 +1,13 @@
    +Issue #19373: Patch to Tk 8.5.15 to correct refresh problem on OS x 10.9.
    +From upstream checkin https://core.tcl.tk/tk/info/5a5abf71f9
    +
    +--- tk8.5.15/macosx/tkMacOSXDraw.c	2013-09-16 09:41:21.000000000 -0700
    ++++ Tk_Source_Code-5a5abf71f9fdb0da/macosx/tkMacOSXDraw.c	2013-10-27 13:27:00.000000000 -0700
    +@@ -1688,6 +1688,7 @@
    + {
    +     if (dcPtr->context) {
    + 	CGContextSynchronize(dcPtr->context);
    ++	[[dcPtr->view window] setViewsNeedDisplay:YES];
    + 	[[dcPtr->view window] enableFlushWindow];
    + 	if (dcPtr->focusLocked) {
    + 	    [dcPtr->view unlockFocus];
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From solipsis at pitrou.net  Mon Oct 28 07:35:56 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Mon, 28 Oct 2013 07:35:56 +0100
    Subject: [Python-checkins] Daily reference leaks (7c46b1b239fe): sum=4
    Message-ID: 
    
    results for 7c46b1b239fe on branch "default"
    --------------------------------------------
    
    test_asyncio leaked [0, 0, 4] memory blocks, sum=4
    test_site leaked [2, 0, -2] references, sum=0
    test_site leaked [2, 0, -2] memory blocks, sum=0
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogSCTpqm', '-x']
    
    From python-checkins at python.org  Mon Oct 28 08:07:11 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Mon, 28 Oct 2013 08:07:11 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Add_NEWS_heade?=
    	=?utf-8?b?ciBmb3IgMy4zLjQu?=
    Message-ID: <3d7RnW3pb5z7Ljm@mail.python.org>
    
    http://hg.python.org/cpython/rev/543c66410547
    changeset:   86699:543c66410547
    branch:      3.3
    parent:      86697:8609f6df9974
    user:        Georg Brandl 
    date:        Mon Oct 28 08:05:26 2013 +0100
    summary:
      Add NEWS header for 3.3.4.
    
    files:
      Misc/NEWS |  15 +++++++++++++--
      1 files changed, 13 insertions(+), 2 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -2,11 +2,22 @@
     Python News
     +++++++++++
     
    +What's New in Python 3.3.4?
    +===========================
    +
    +*Not yet released, see sections below for changes released in 3.3.2*
    +
    +Core and Builtins
    +-----------------
    +
    +Library
    +-------
    +
    +
    +
     What's New in Python 3.3.3 release candidate 1?
     ===============================================
     
    -.. *Not yet released, see sections below for changes released in 3.3.2*
    -
     *Release date: 27-Oct-2013*
     
     Core and Builtins
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 08:07:12 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Mon, 28 Oct 2013 08:07:12 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_null_merge_with_3=2E3?=
    Message-ID: <3d7RnX5hPhz7Ll4@mail.python.org>
    
    http://hg.python.org/cpython/rev/8962d1c442a6
    changeset:   86700:8962d1c442a6
    parent:      86698:33b31971ae9d
    parent:      86699:543c66410547
    user:        Georg Brandl 
    date:        Mon Oct 28 08:08:09 2013 +0100
    summary:
      null merge with 3.3
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 09:39:13 2013
    From: python-checkins at python.org (raymond.hettinger)
    Date: Mon, 28 Oct 2013 09:39:13 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_unintended?=
     =?utf-8?q?_switch_from_a_constant_to_a_global_in_56a3c0bc4634?=
    Message-ID: <3d7Tqj3XLkz7LjQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/cd95f1276360
    changeset:   86701:cd95f1276360
    branch:      2.7
    parent:      86696:1712a22aa1a9
    user:        Raymond Hettinger 
    date:        Mon Oct 28 02:39:04 2013 -0600
    summary:
      Fix unintended switch from a constant to a global in 56a3c0bc4634
    
    files:
      Lib/heapq.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/heapq.py b/Lib/heapq.py
    --- a/Lib/heapq.py
    +++ b/Lib/heapq.py
    @@ -380,7 +380,7 @@
     
         while _len(h) > 1:
             try:
    -            while True:
    +            while 1:
                     v, itnum, next = s = h[0]
                     yield v
                     s[0] = next()               # raises StopIteration when exhausted
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 18:47:46 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Mon, 28 Oct 2013 18:47:46 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319421=3A_fix_a_ch?=
     =?utf-8?q?eck_in_warnings=2Ewarn=28=29_to_be_able_to_use_it_during_Python?=
    Message-ID: <3d7k0f37qgz7Lnd@mail.python.org>
    
    http://hg.python.org/cpython/rev/1bbedfb20932
    changeset:   86702:1bbedfb20932
    parent:      86700:8962d1c442a6
    user:        Victor Stinner 
    date:        Mon Oct 28 18:47:22 2013 +0100
    summary:
      Issue #19421: fix a check in warnings.warn() to be able to use it during Python
    finalization.
    
    sys.argv is set to None during Python finalization: add PyList_Check() to avoid
    a crash in PyList_Size().
    
    files:
      Python/_warnings.c |  4 +++-
      1 files changed, 3 insertions(+), 1 deletions(-)
    
    
    diff --git a/Python/_warnings.c b/Python/_warnings.c
    --- a/Python/_warnings.c
    +++ b/Python/_warnings.c
    @@ -534,7 +534,9 @@
                     goto handle_error;
             if (strcmp(module_str, "__main__") == 0) {
                 PyObject *argv = PySys_GetObject("argv");
    -            if (argv != NULL && PyList_Size(argv) > 0) {
    +            /* PyList_Check() is needed because sys.argv is set to None during
    +               Python finalization */
    +            if (argv != NULL && PyList_Check(argv) && PyList_Size(argv) > 0) {
                     int is_true;
                     *filename = PyList_GetItem(argv, 0);
                     Py_INCREF(*filename);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 19:21:38 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Mon, 28 Oct 2013 19:21:38 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319421=3A_add_an_u?=
     =?utf-8?q?nit_test_for_warnings=2Ewarn=28=29_during_finalization?=
    Message-ID: <3d7klk6bvnzNjN@mail.python.org>
    
    http://hg.python.org/cpython/rev/2d802765d31f
    changeset:   86703:2d802765d31f
    user:        Victor Stinner 
    date:        Mon Oct 28 19:16:21 2013 +0100
    summary:
      Issue #19421: add an unit test for warnings.warn() during finalization
    
    files:
      Lib/test/test_warnings.py |  19 +++++++++++++++++++
      1 files changed, 19 insertions(+), 0 deletions(-)
    
    
    diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
    --- a/Lib/test/test_warnings.py
    +++ b/Lib/test/test_warnings.py
    @@ -788,6 +788,25 @@
                     env=env)
                 self.assertEqual(retcode, 0)
     
    +class FinalizationTest(unittest.TestCase):
    +    def test_finalization(self):
    +        # Issue #19421: warnings.warn() should not crash
    +        # during Python finalization
    +        code = """
    +import warnings
    +warn = warnings.warn
    +
    +class A:
    +    def __del__(self):
    +        warn("test")
    +
    +a=A()
    +        """
    +        rc, out, err = assert_python_ok("-c", code)
    +        # note: "__main__" filename is not correct, it should be the name
    +        # of the script
    +        self.assertEqual(err, b'__main__:7: UserWarning: test')
    +
     
     def setUpModule():
         py_warnings.onceregistry.clear()
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 21:46:06 2013
    From: python-checkins at python.org (nadeem.vawda)
    Date: Mon, 28 Oct 2013 21:46:06 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogIzE5Mzk1OiBSYWlz?=
     =?utf-8?q?e_exception_when_pickling_a_=28BZ2=7CLZMA=29=28Compressor=7CDec?=
     =?utf-8?q?ompressor=29=2E?=
    Message-ID: <3d7nyQ6yGDzRld@mail.python.org>
    
    http://hg.python.org/cpython/rev/be363c1e94fe
    changeset:   86704:be363c1e94fe
    branch:      3.3
    parent:      86699:543c66410547
    user:        Nadeem Vawda 
    date:        Mon Oct 28 21:35:23 2013 +0100
    summary:
      #19395: Raise exception when pickling a (BZ2|LZMA)(Compressor|Decompressor).
    
    The underlying C libraries provide no mechanism for serializing compressor and
    decompressor objects, so actually pickling these classes is impractical.
    Previously, these objects would be pickled without error, but attempting to use
    a deserialized instance would segfault the interpreter.
    
    files:
      Lib/test/test_bz2.py  |  10 ++++++++++
      Lib/test/test_lzma.py |   9 +++++++++
      Misc/NEWS             |   4 ++++
      Modules/_bz2module.c  |  22 ++++++++++++++++++++--
      Modules/_lzmamodule.c |  18 ++++++++++++++++++
      5 files changed, 61 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py
    --- a/Lib/test/test_bz2.py
    +++ b/Lib/test/test_bz2.py
    @@ -5,6 +5,7 @@
     import unittest
     from io import BytesIO
     import os
    +import pickle
     import random
     import subprocess
     import sys
    @@ -621,6 +622,11 @@
             finally:
                 data = None
     
    +    def testPickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(BZ2Compressor())
    +
    +
     class BZ2DecompressorTest(BaseTest):
         def test_Constructor(self):
             self.assertRaises(TypeError, BZ2Decompressor, 42)
    @@ -672,6 +678,10 @@
                 compressed = None
                 decompressed = None
     
    +    def testPickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(BZ2Decompressor())
    +
     
     class CompressDecompressTest(BaseTest):
         def testCompress(self):
    diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
    --- a/Lib/test/test_lzma.py
    +++ b/Lib/test/test_lzma.py
    @@ -1,5 +1,6 @@
     from io import BytesIO, UnsupportedOperation
     import os
    +import pickle
     import random
     import unittest
     
    @@ -216,6 +217,14 @@
             finally:
                 input = cdata = ddata = None
     
    +    # Pickling raises an exception; there's no way to serialize an lzma_stream.
    +
    +    def test_pickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(LZMACompressor())
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(LZMADecompressor())
    +
     
     class CompressDecompressFunctionTestCase(unittest.TestCase):
     
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -92,6 +92,10 @@
     Library
     -------
     
    +- Issue #19395: Raise an exception when attempting to pickle a bz2 or lzma
    +  compressor/decompressor object, rather than creating a pickle that would
    +  cause a segfault when loaded and used.
    +
     - Issue #19227: Try to fix deadlocks caused by re-seeding then OpenSSL
       pseudo-random number generator on fork().
     
    diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
    --- a/Modules/_bz2module.c
    +++ b/Modules/_bz2module.c
    @@ -250,6 +250,14 @@
         return result;
     }
     
    +static PyObject *
    +BZ2Compressor_getstate(BZ2Compressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     BZ2Compressor_init(BZ2Compressor *self, PyObject *args, PyObject *kwargs)
     {
    @@ -298,10 +306,11 @@
     }
     
     static PyMethodDef BZ2Compressor_methods[] = {
    -    {"compress", (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
    +    {"compress",     (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
          BZ2Compressor_compress__doc__},
    -    {"flush",    (PyCFunction)BZ2Compressor_flush,    METH_NOARGS,
    +    {"flush",        (PyCFunction)BZ2Compressor_flush,    METH_NOARGS,
          BZ2Compressor_flush__doc__},
    +    {"__getstate__", (PyCFunction)BZ2Compressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    @@ -452,6 +461,14 @@
         return result;
     }
     
    +static PyObject *
    +BZ2Decompressor_getstate(BZ2Decompressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     BZ2Decompressor_init(BZ2Decompressor *self, PyObject *args, PyObject *kwargs)
     {
    @@ -502,6 +519,7 @@
     static PyMethodDef BZ2Decompressor_methods[] = {
         {"decompress", (PyCFunction)BZ2Decompressor_decompress, METH_VARARGS,
          BZ2Decompressor_decompress__doc__},
    +    {"__getstate__", (PyCFunction)BZ2Decompressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
    --- a/Modules/_lzmamodule.c
    +++ b/Modules/_lzmamodule.c
    @@ -546,6 +546,14 @@
         return result;
     }
     
    +static PyObject *
    +Compressor_getstate(Compressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset,
                        PyObject *filterspecs)
    @@ -712,6 +720,7 @@
          Compressor_compress_doc},
         {"flush", (PyCFunction)Compressor_flush, METH_NOARGS,
          Compressor_flush_doc},
    +    {"__getstate__", (PyCFunction)Compressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    @@ -869,6 +878,14 @@
         return result;
     }
     
    +static PyObject *
    +Decompressor_getstate(Decompressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
     {
    @@ -991,6 +1008,7 @@
     static PyMethodDef Decompressor_methods[] = {
         {"decompress", (PyCFunction)Decompressor_decompress, METH_VARARGS,
          Decompressor_decompress_doc},
    +    {"__getstate__", (PyCFunction)Decompressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Mon Oct 28 21:46:08 2013
    From: python-checkins at python.org (nadeem.vawda)
    Date: Mon, 28 Oct 2013 21:46:08 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_=2319395=3A_Raise_exception_when_pickling_a_=28BZ2=7CLZM?=
     =?utf-8?q?A=29=28Compressor=7CDecompressor=29=2E?=
    Message-ID: <3d7nyS495qzSBw@mail.python.org>
    
    http://hg.python.org/cpython/rev/b9df25608ad0
    changeset:   86705:b9df25608ad0
    parent:      86703:2d802765d31f
    parent:      86704:be363c1e94fe
    user:        Nadeem Vawda 
    date:        Mon Oct 28 21:41:24 2013 +0100
    summary:
      #19395: Raise exception when pickling a (BZ2|LZMA)(Compressor|Decompressor).
    
    The underlying C libraries provide no mechanism for serializing compressor and
    decompressor objects, so actually pickling these classes is impractical.
    Previously, these objects would be pickled without error, but attempting to use
    a deserialized instance would segfault the interpreter.
    
    files:
      Lib/test/test_bz2.py  |  10 ++++++++++
      Lib/test/test_lzma.py |   9 +++++++++
      Modules/_bz2module.c  |  22 ++++++++++++++++++++--
      Modules/_lzmamodule.c |  18 ++++++++++++++++++
      4 files changed, 57 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py
    --- a/Lib/test/test_bz2.py
    +++ b/Lib/test/test_bz2.py
    @@ -5,6 +5,7 @@
     import unittest
     from io import BytesIO
     import os
    +import pickle
     import random
     import subprocess
     import sys
    @@ -628,6 +629,11 @@
             finally:
                 data = None
     
    +    def testPickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(BZ2Compressor())
    +
    +
     class BZ2DecompressorTest(BaseTest):
         def test_Constructor(self):
             self.assertRaises(TypeError, BZ2Decompressor, 42)
    @@ -679,6 +685,10 @@
                 compressed = None
                 decompressed = None
     
    +    def testPickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(BZ2Decompressor())
    +
     
     class CompressDecompressTest(BaseTest):
         def testCompress(self):
    diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
    --- a/Lib/test/test_lzma.py
    +++ b/Lib/test/test_lzma.py
    @@ -1,5 +1,6 @@
     from io import BytesIO, UnsupportedOperation
     import os
    +import pickle
     import random
     import unittest
     
    @@ -216,6 +217,14 @@
             finally:
                 input = cdata = ddata = None
     
    +    # Pickling raises an exception; there's no way to serialize an lzma_stream.
    +
    +    def test_pickle(self):
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(LZMACompressor())
    +        with self.assertRaises(TypeError):
    +            pickle.dumps(LZMADecompressor())
    +
     
     class CompressDecompressFunctionTestCase(unittest.TestCase):
     
    diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
    --- a/Modules/_bz2module.c
    +++ b/Modules/_bz2module.c
    @@ -248,6 +248,14 @@
         return result;
     }
     
    +static PyObject *
    +BZ2Compressor_getstate(BZ2Compressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static void*
     BZ2_Malloc(void* ctx, int items, int size)
     {
    @@ -317,10 +325,11 @@
     }
     
     static PyMethodDef BZ2Compressor_methods[] = {
    -    {"compress", (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
    +    {"compress",     (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
          BZ2Compressor_compress__doc__},
    -    {"flush",    (PyCFunction)BZ2Compressor_flush,    METH_NOARGS,
    +    {"flush",        (PyCFunction)BZ2Compressor_flush,    METH_NOARGS,
          BZ2Compressor_flush__doc__},
    +    {"__getstate__", (PyCFunction)BZ2Compressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    @@ -471,6 +480,14 @@
         return result;
     }
     
    +static PyObject *
    +BZ2Decompressor_getstate(BZ2Decompressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     BZ2Decompressor_init(BZ2Decompressor *self, PyObject *args, PyObject *kwargs)
     {
    @@ -521,6 +538,7 @@
     static PyMethodDef BZ2Decompressor_methods[] = {
         {"decompress", (PyCFunction)BZ2Decompressor_decompress, METH_VARARGS,
          BZ2Decompressor_decompress__doc__},
    +    {"__getstate__", (PyCFunction)BZ2Decompressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
    --- a/Modules/_lzmamodule.c
    +++ b/Modules/_lzmamodule.c
    @@ -564,6 +564,14 @@
         return result;
     }
     
    +static PyObject *
    +Compressor_getstate(Compressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset,
                        PyObject *filterspecs)
    @@ -735,6 +743,7 @@
          Compressor_compress_doc},
         {"flush", (PyCFunction)Compressor_flush, METH_NOARGS,
          Compressor_flush_doc},
    +    {"__getstate__", (PyCFunction)Compressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    @@ -892,6 +901,14 @@
         return result;
     }
     
    +static PyObject *
    +Decompressor_getstate(Decompressor *self, PyObject *noargs)
    +{
    +    PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
    +                 Py_TYPE(self)->tp_name);
    +    return NULL;
    +}
    +
     static int
     Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
     {
    @@ -1019,6 +1036,7 @@
     static PyMethodDef Decompressor_methods[] = {
         {"decompress", (PyCFunction)Decompressor_decompress, METH_VARARGS,
          Decompressor_decompress_doc},
    +    {"__getstate__", (PyCFunction)Decompressor_getstate, METH_NOARGS},
         {NULL}
     };
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 00:24:23 2013
    From: python-checkins at python.org (richard.oudkerk)
    Date: Tue, 29 Oct 2013 00:24:23 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDI1?=
     =?utf-8?q?_--_a_pickling_error_should_not_cause_pool_to_hang=2E?=
    Message-ID: <3d7sT32bPkzSJf@mail.python.org>
    
    http://hg.python.org/cpython/rev/6aa42fc0c2f6
    changeset:   86706:6aa42fc0c2f6
    branch:      2.7
    parent:      86701:cd95f1276360
    user:        Richard Oudkerk 
    date:        Mon Oct 28 23:02:22 2013 +0000
    summary:
      Issue #19425 -- a pickling error should not cause pool to hang.
    
    files:
      Lib/multiprocessing/pool.py      |  14 +++++++++-----
      Lib/test/test_multiprocessing.py |  10 ++++++++++
      2 files changed, 19 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
    --- a/Lib/multiprocessing/pool.py
    +++ b/Lib/multiprocessing/pool.py
    @@ -169,7 +169,8 @@
     
             self._task_handler = threading.Thread(
                 target=Pool._handle_tasks,
    -            args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)
    +            args=(self._taskqueue, self._quick_put, self._outqueue,
    +                  self._pool, self._cache)
                 )
             self._task_handler.daemon = True
             self._task_handler._state = RUN
    @@ -329,7 +330,7 @@
             debug('worker handler exiting')
     
         @staticmethod
    -    def _handle_tasks(taskqueue, put, outqueue, pool):
    +    def _handle_tasks(taskqueue, put, outqueue, pool, cache):
             thread = threading.current_thread()
     
             for taskseq, set_length in iter(taskqueue.get, None):
    @@ -340,9 +341,12 @@
                         break
                     try:
                         put(task)
    -                except IOError:
    -                    debug('could not put task on queue')
    -                    break
    +                except Exception as e:
    +                    job, ind = task[:2]
    +                    try:
    +                        cache[job]._set(ind, (False, e))
    +                    except KeyError:
    +                        pass
                 else:
                     if set_length:
                         debug('doing set_length()')
    diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
    --- a/Lib/test/test_multiprocessing.py
    +++ b/Lib/test/test_multiprocessing.py
    @@ -1117,6 +1117,16 @@
             self.assertEqual(pmap(sqr, range(100), chunksize=20),
                              map(sqr, range(100)))
     
    +    def test_map_unplicklable(self):
    +        # Issue #19425 -- failure to pickle should not cause a hang
    +        if self.TYPE == 'threads':
    +            return
    +        class A(object):
    +            def __reduce__(self):
    +                raise RuntimeError('cannot pickle')
    +        with self.assertRaises(RuntimeError):
    +            self.pool.map(sqr, [A()]*10)
    +
         def test_map_chunksize(self):
             try:
                 self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 00:24:24 2013
    From: python-checkins at python.org (richard.oudkerk)
    Date: Tue, 29 Oct 2013 00:24:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5NDI1?=
     =?utf-8?q?_--_a_pickling_error_should_not_cause_pool_to_hang=2E?=
    Message-ID: <3d7sT44TbVzSJf@mail.python.org>
    
    http://hg.python.org/cpython/rev/a2230a8420a5
    changeset:   86707:a2230a8420a5
    branch:      3.3
    parent:      86704:be363c1e94fe
    user:        Richard Oudkerk 
    date:        Mon Oct 28 23:11:58 2013 +0000
    summary:
      Issue #19425 -- a pickling error should not cause pool to hang.
    
    files:
      Lib/multiprocessing/pool.py      |  14 +++++++++-----
      Lib/test/test_multiprocessing.py |  10 ++++++++++
      2 files changed, 19 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
    --- a/Lib/multiprocessing/pool.py
    +++ b/Lib/multiprocessing/pool.py
    @@ -147,7 +147,8 @@
     
             self._task_handler = threading.Thread(
                 target=Pool._handle_tasks,
    -            args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)
    +            args=(self._taskqueue, self._quick_put, self._outqueue,
    +                  self._pool, self._cache)
                 )
             self._task_handler.daemon = True
             self._task_handler._state = RUN
    @@ -338,7 +339,7 @@
             debug('worker handler exiting')
     
         @staticmethod
    -    def _handle_tasks(taskqueue, put, outqueue, pool):
    +    def _handle_tasks(taskqueue, put, outqueue, pool, cache):
             thread = threading.current_thread()
     
             for taskseq, set_length in iter(taskqueue.get, None):
    @@ -349,9 +350,12 @@
                         break
                     try:
                         put(task)
    -                except IOError:
    -                    debug('could not put task on queue')
    -                    break
    +                except Exception as e:
    +                    job, ind = task[:2]
    +                    try:
    +                        cache[job]._set(ind, (False, e))
    +                    except KeyError:
    +                        pass
                 else:
                     if set_length:
                         debug('doing set_length()')
    diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
    --- a/Lib/test/test_multiprocessing.py
    +++ b/Lib/test/test_multiprocessing.py
    @@ -1691,6 +1691,16 @@
             self.assertEqual(2, len(call_args))
             self.assertIsInstance(call_args[1], ValueError)
     
    +    def test_map_unplicklable(self):
    +        # Issue #19425 -- failure to pickle should not cause a hang
    +        if self.TYPE == 'threads':
    +            return
    +        class A(object):
    +            def __reduce__(self):
    +                raise RuntimeError('cannot pickle')
    +        with self.assertRaises(RuntimeError):
    +            self.pool.map(sqr, [A()]*10)
    +
         def test_map_chunksize(self):
             try:
                 self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 00:24:25 2013
    From: python-checkins at python.org (richard.oudkerk)
    Date: Tue, 29 Oct 2013 00:24:25 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?b?KTogTWVyZ2Uu?=
    Message-ID: <3d7sT56L6vz7LjQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/8c25b4515b3d
    changeset:   86708:8c25b4515b3d
    parent:      86705:b9df25608ad0
    parent:      86707:a2230a8420a5
    user:        Richard Oudkerk 
    date:        Mon Oct 28 23:23:04 2013 +0000
    summary:
      Merge.
    
    files:
      Lib/multiprocessing/pool.py       |  14 +++++++++-----
      Lib/test/_test_multiprocessing.py |  10 ++++++++++
      2 files changed, 19 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
    --- a/Lib/multiprocessing/pool.py
    +++ b/Lib/multiprocessing/pool.py
    @@ -174,7 +174,8 @@
     
             self._task_handler = threading.Thread(
                 target=Pool._handle_tasks,
    -            args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)
    +            args=(self._taskqueue, self._quick_put, self._outqueue,
    +                  self._pool, self._cache)
                 )
             self._task_handler.daemon = True
             self._task_handler._state = RUN
    @@ -364,7 +365,7 @@
             util.debug('worker handler exiting')
     
         @staticmethod
    -    def _handle_tasks(taskqueue, put, outqueue, pool):
    +    def _handle_tasks(taskqueue, put, outqueue, pool, cache):
             thread = threading.current_thread()
     
             for taskseq, set_length in iter(taskqueue.get, None):
    @@ -375,9 +376,12 @@
                         break
                     try:
                         put(task)
    -                except OSError:
    -                    util.debug('could not put task on queue')
    -                    break
    +                except Exception as e:
    +                    job, ind = task[:2]
    +                    try:
    +                        cache[job]._set(ind, (False, e))
    +                    except KeyError:
    +                        pass
                 else:
                     if set_length:
                         util.debug('doing set_length()')
    diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
    --- a/Lib/test/_test_multiprocessing.py
    +++ b/Lib/test/_test_multiprocessing.py
    @@ -1698,6 +1698,16 @@
             self.assertEqual(2, len(call_args))
             self.assertIsInstance(call_args[1], ValueError)
     
    +    def test_map_unplicklable(self):
    +        # Issue #19425 -- failure to pickle should not cause a hang
    +        if self.TYPE == 'threads':
    +            return
    +        class A(object):
    +            def __reduce__(self):
    +                raise RuntimeError('cannot pickle')
    +        with self.assertRaises(RuntimeError):
    +            self.pool.map(sqr, [A()]*10)
    +
         def test_map_chunksize(self):
             try:
                 self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:22 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:22 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318509=3A_handle_P?=
     =?utf-8?q?yUnicode=5FWriter=28=29_error?=
    Message-ID: <3d7tJt08s2z7Ljv@mail.python.org>
    
    http://hg.python.org/cpython/rev/f63d34cd3714
    changeset:   86709:f63d34cd3714
    user:        Victor Stinner 
    date:        Mon Oct 28 23:18:39 2013 +0100
    summary:
      Issue #18509: handle PyUnicode_Writer() error
    
    files:
      Modules/cjkcodecs/_codecs_cn.c      |  19 +++-
      Modules/cjkcodecs/_codecs_hk.c      |   5 +-
      Modules/cjkcodecs/_codecs_iso2022.c |  32 ++++----
      Modules/cjkcodecs/_codecs_jp.c      |  68 +++++++++-------
      Modules/cjkcodecs/_codecs_kr.c      |  24 ++++-
      Modules/cjkcodecs/_codecs_tw.c      |  14 ++-
      Modules/cjkcodecs/cjkcodecs.h       |  24 +-----
      7 files changed, 102 insertions(+), 84 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
    --- a/Modules/cjkcodecs/_codecs_cn.c
    +++ b/Modules/cjkcodecs/_codecs_cn.c
    @@ -27,8 +27,10 @@
         if ((dc1) == 0xa1 && (dc2) == 0xaa) OUTCHAR(0x2014); \
         else if ((dc1) == 0xa8 && (dc2) == 0x44) OUTCHAR(0x2015); \
         else if ((dc1) == 0xa1 && (dc2) == 0xa4) OUTCHAR(0x00b7); \
    -    else TRYMAP_DEC(gb2312, writer, dc1 ^ 0x80, dc2 ^ 0x80); \
    -    else TRYMAP_DEC(gbkext, writer, dc1, dc2);
    +    else if (TRYMAP_DEC(gb2312, decoded, dc1 ^ 0x80, dc2 ^ 0x80)) \
    +        OUTCHAR(decoded); \
    +    else if (TRYMAP_DEC(gbkext, decoded, dc1, dc2)) \
    +        OUTCHAR(decoded);
     
     #define GBK_ENCODE(code, assi) \
         if ((code) == 0x2014) (assi) = 0xa1aa; \
    @@ -74,6 +76,7 @@
     {
         while (inleft > 0) {
             unsigned char c = **inbuf;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -82,7 +85,8 @@
             }
     
             REQUIRE_INBUF(2)
    -        TRYMAP_DEC(gb2312, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
    +        if (TRYMAP_DEC(gb2312, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
    +            OUTCHAR(decoded);
                 NEXT_IN(2);
             }
             else return 1;
    @@ -131,6 +135,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -236,6 +241,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1, c2;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -284,7 +290,8 @@
             }
     
             GBK_DECODE(c, c2, writer)
    -        else TRYMAP_DEC(gb18030ext, writer, c, c2);
    +        else if (TRYMAP_DEC(gb18030ext, decoded, c, c2))
    +            OUTCHAR(decoded);
             else return 1;
     
             NEXT_IN(2);
    @@ -372,6 +379,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c == '~') {
                 unsigned char c2 = INBYTE2;
    @@ -403,7 +411,8 @@
             }
             else { /* GB mode */
                 REQUIRE_INBUF(2)
    -            TRYMAP_DEC(gb2312, writer, c, INBYTE2) {
    +            if (TRYMAP_DEC(gb2312, decoded, c, INBYTE2)) {
    +                OUTCHAR(decoded);
                     NEXT_IN(2);
                 }
                 else
    diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
    --- a/Modules/cjkcodecs/_codecs_hk.c
    +++ b/Modules/cjkcodecs/_codecs_hk.c
    @@ -118,13 +118,14 @@
             REQUIRE_INBUF(2)
     
             if (0xc6 > c || c > 0xc8 || (c < 0xc7 && INBYTE2 < 0xa1)) {
    -            TRYMAP_DEC(big5, writer, c, INBYTE2) {
    +            if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
    +                OUTCHAR(decoded);
                     NEXT_IN(2);
                     continue;
                 }
             }
     
    -        TRYMAP_DEC_CHAR(big5hkscs, decoded, c, INBYTE2)
    +        if (TRYMAP_DEC(big5hkscs, decoded, c, INBYTE2))
             {
                 int s = BH2S(c, INBYTE2);
                 const unsigned char *hintbase;
    diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
    --- a/Modules/cjkcodecs/_codecs_iso2022.c
    +++ b/Modules/cjkcodecs/_codecs_iso2022.c
    @@ -566,7 +566,7 @@
     ksx1001_decoder(const unsigned char *data)
     {
         Py_UCS4 u;
    -    TRYMAP_DEC_CHAR(ksx1001, u, data[0], data[1])
    +    if (TRYMAP_DEC(ksx1001, u, data[0], data[1]))
             return u;
         else
             return MAP_UNMAPPABLE;
    @@ -604,7 +604,7 @@
         Py_UCS4 u;
         if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
             return 0xff3c;
    -    else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1])
    +    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
             return u;
         else
             return MAP_UNMAPPABLE;
    @@ -643,7 +643,7 @@
     jisx0212_decoder(const unsigned char *data)
     {
         Py_UCS4 u;
    -    TRYMAP_DEC_CHAR(jisx0212, u, data[0], data[1])
    +    if (TRYMAP_DEC(jisx0212, u, data[0], data[1]))
             return u;
         else
             return MAP_UNMAPPABLE;
    @@ -697,11 +697,11 @@
         EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
         else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
             return 0xff3c;
    -    else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
    +    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
             u |= 0x20000;
    -    else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
    +    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
         else
             return MAP_UNMAPPABLE;
         return u;
    @@ -712,8 +712,8 @@
     {
         Py_UCS4 u;
         EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
    -    TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
    +    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
             u |= 0x20000;
         else
             return MAP_UNMAPPABLE;
    @@ -727,11 +727,11 @@
         Py_UCS4 u;
         if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
             return 0xff3c;
    -    else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
    +    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
             u |= 0x20000;
    -    else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
    +    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
         else
             return MAP_UNMAPPABLE;
         return u;
    @@ -741,8 +741,8 @@
     jisx0213_2004_2_decoder(const unsigned char *data)
     {
         Py_UCS4 u;
    -    TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
    -    else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
    +    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
             u |= 0x20000;
         else
             return MAP_UNMAPPABLE;
    @@ -950,7 +950,7 @@
     gb2312_decoder(const unsigned char *data)
     {
         Py_UCS4 u;
    -    TRYMAP_DEC_CHAR(gb2312, u, data[0], data[1])
    +    if (TRYMAP_DEC(gb2312, u, data[0], data[1]))
             return u;
         else
             return MAP_UNMAPPABLE;
    diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
    --- a/Modules/cjkcodecs/_codecs_jp.c
    +++ b/Modules/cjkcodecs/_codecs_jp.c
    @@ -85,6 +85,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1, c2;
    +        Py_UCS4 decoded;
     
             if (c <= 0x80) {
                 OUTCHAR(c);
    @@ -109,7 +110,8 @@
             REQUIRE_INBUF(2)
             c2 = INBYTE2;
     
    -        TRYMAP_DEC(cp932ext, writer, c, c2);
    +        if (TRYMAP_DEC(cp932ext, decoded, c, c2))
    +            OUTCHAR(decoded);
             else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
                 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                     return 1;
    @@ -119,8 +121,10 @@
                 c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
                 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
     
    -            TRYMAP_DEC(jisx0208, writer, c, c2);
    -            else return 1;
    +            if (TRYMAP_DEC(jisx0208, decoded, c, c2))
    +                OUTCHAR(decoded);
    +            else
    +                return 1;
             }
             else if (c >= 0xf0 && c <= 0xf9) {
                 if ((c2 >= 0x40 && c2 <= 0x7e) ||
    @@ -235,7 +239,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    -        Py_UCS4 code;
    +        Py_UCS4 code, decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -265,13 +269,15 @@
     
                 /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
                 EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
    -            else TRYMAP_DEC(jisx0213_2_bmp, writer, c2, c3) ;
    -            else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c2, c3) {
    +            else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
    +                OUTCHAR(decoded);
    +            else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
                     OUTCHAR(EMPBASE | code);
                     NEXT_IN(3);
                     continue;
                 }
    -            else TRYMAP_DEC(jisx0212, writer, c2, c3) ;
    +            else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
    +                OUTCHAR(decoded);
                 else return 1;
                 NEXT_IN(3);
             }
    @@ -286,14 +292,16 @@
                 EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
                 else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
                 else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
    -            else TRYMAP_DEC(jisx0208, writer, c, c2);
    -            else TRYMAP_DEC(jisx0213_1_bmp, writer, c, c2);
    -            else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c, c2) {
    +            else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
    +                OUTCHAR(decoded);
    +            else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
    +                OUTCHAR(decoded);
    +            else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
                     OUTCHAR(EMPBASE | code);
                     NEXT_IN(2);
                     continue;
                 }
    -            else TRYMAP_DEC_CHAR(jisx0213_pair, code, c, c2) {
    +            else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
                     OUTCHAR2(code >> 16, code & 0xffff);
                     NEXT_IN(2);
                     continue;
    @@ -367,6 +375,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -394,7 +403,8 @@
                 c2 = INBYTE2;
                 c3 = INBYTE3;
                 /* JIS X 0212 */
    -            TRYMAP_DEC(jisx0212, writer, c2 ^ 0x80, c3 ^ 0x80) {
    +            if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
    +                OUTCHAR(decoded);
                     NEXT_IN(3);
                 }
                 else
    @@ -412,9 +422,10 @@
                     OUTCHAR(0xff3c);
                 else
     #endif
    -                TRYMAP_DEC(jisx0208, writer,
    -                           c ^ 0x80, c2 ^ 0x80) ;
    -            else return 1;
    +            if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
    +                OUTCHAR(decoded);
    +            else
    +                return 1;
                 NEXT_IN(2);
             }
         }
    @@ -486,6 +497,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
     #ifdef STRICT_BUILD
             JISX0201_R_DECODE(c, writer)
    @@ -514,7 +526,8 @@
                     continue;
                 }
     #endif
    -            TRYMAP_DEC(jisx0208, writer, c1, c2) {
    +            if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
    +                OUTCHAR(decoded);
                     NEXT_IN(2);
                     continue;
                 }
    @@ -636,7 +649,7 @@
             JISX0201_DECODE(c, writer)
             else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
                 unsigned char c1, c2;
    -            Py_UCS4 code;
    +            Py_UCS4 code, decoded;
     
                 REQUIRE_INBUF(2)
                 c2 = INBYTE2;
    @@ -652,17 +665,14 @@
                     c1 += 0x21;
                     EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
                                     c1, c2)
    -                else TRYMAP_DEC(jisx0208, writer, c1, c2) {
    -                }
    -                else TRYMAP_DEC(jisx0213_1_bmp, writer,
    -                                c1, c2) {
    -                }
    -                else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c1, c2) {
    +                else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
    +                    OUTCHAR(decoded);
    +                else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
    +                    OUTCHAR(decoded);
    +                else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
                         OUTCHAR(EMPBASE | code);
    -                }
    -                else TRYMAP_DEC_CHAR(jisx0213_pair, code, c1, c2) {
    +                else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
                         OUTCHAR2(code >> 16, code & 0xffff);
    -                }
                     else
                         return 1;
                     NEXT_IN(2);
    @@ -674,9 +684,9 @@
     
                     EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
                                     c1, c2)
    -                else TRYMAP_DEC(jisx0213_2_bmp, writer,
    -                                c1, c2) {
    -                } else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c1, c2) {
    +                else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
    +                    OUTCHAR(decoded);
    +                else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
                         OUTCHAR(EMPBASE | code);
                         NEXT_IN(2);
                         continue;
    diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
    --- a/Modules/cjkcodecs/_codecs_kr.c
    +++ b/Modules/cjkcodecs/_codecs_kr.c
    @@ -105,6 +105,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -148,7 +149,8 @@
                 OUTCHAR(0xac00 + cho*588 + jung*28 + jong);
                 NEXT_IN(8);
             }
    -        else TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
    +        else if (TRYMAP_DEC(ksx1001, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
    +            OUTCHAR(decoded);
                 NEXT_IN(2);
             }
             else
    @@ -198,6 +200,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -206,8 +209,10 @@
             }
     
             REQUIRE_INBUF(2)
    -        TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80);
    -        else TRYMAP_DEC(cp949ext, writer, c, INBYTE2);
    +        if (TRYMAP_DEC(ksx1001, decoded, c ^ 0x80, INBYTE2 ^ 0x80))
    +            OUTCHAR(decoded);
    +        else if (TRYMAP_DEC(cp949ext, decoded, c, INBYTE2))
    +            OUTCHAR(decoded);
             else return 1;
     
             NEXT_IN(2);
    @@ -350,7 +355,8 @@
     DECODER(johab)
     {
         while (inleft > 0) {
    -        unsigned char    c = INBYTE1, c2;
    +        unsigned char c = INBYTE1, c2;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -424,9 +430,13 @@
                     t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
                     t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;
     
    -                TRYMAP_DEC(ksx1001, writer, t1, t2);
    -                else return 1;
    -                NEXT_IN(2);
    +                if (TRYMAP_DEC(ksx1001, decoded, t1, t2)) {
    +                    OUTCHAR(decoded);
    +                    NEXT_IN(2);
    +                }
    +                else {
    +                    return 1;
    +                }
                 }
             }
         }
    diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
    --- a/Modules/cjkcodecs/_codecs_tw.c
    +++ b/Modules/cjkcodecs/_codecs_tw.c
    @@ -44,6 +44,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -52,7 +53,8 @@
             }
     
             REQUIRE_INBUF(2)
    -        TRYMAP_DEC(big5, writer, c, INBYTE2) {
    +        if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
    +            OUTCHAR(decoded);
                 NEXT_IN(2);
             }
             else return 1;
    @@ -98,6 +100,7 @@
     {
         while (inleft > 0) {
             unsigned char c = INBYTE1;
    +        Py_UCS4 decoded;
     
             if (c < 0x80) {
                 OUTCHAR(c);
    @@ -107,9 +110,12 @@
     
             REQUIRE_INBUF(2)
     
    -        TRYMAP_DEC(cp950ext, writer, c, INBYTE2);
    -        else TRYMAP_DEC(big5, writer, c, INBYTE2);
    -        else return 1;
    +        if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
    +            OUTCHAR(decoded);
    +        else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
    +            OUTCHAR(decoded);
    +        else
    +            return 1;
     
             NEXT_IN(2);
         }
    diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
    --- a/Modules/cjkcodecs/cjkcodecs.h
    +++ b/Modules/cjkcodecs/cjkcodecs.h
    @@ -177,29 +177,13 @@
     #define TRYMAP_ENC(charset, assi, uni)                          \
         if TRYMAP_ENC_COND(charset, assi, uni)
     
    -Py_LOCAL_INLINE(int)
    -_TRYMAP_DEC_WRITE(_PyUnicodeWriter *writer, Py_UCS4 c)
    -{
    -    if (c == UNIINV || _PyUnicodeWriter_WriteChar(writer, c) < 0)
    -        return UNIINV;
    -    else
    -        return c;
    -}
    -
    -#define _TRYMAP_DEC(m, writer, val)                             \
    -    ((m)->map != NULL &&                                        \
    -     (val) >= (m)->bottom &&                                    \
    -     (val)<= (m)->top &&                                        \
    -     _TRYMAP_DEC_WRITE(writer, (m)->map[(val) - (m)->bottom]) != UNIINV)
    -#define _TRYMAP_DEC_CHAR(m, assi, val)                             \
    +#define _TRYMAP_DEC(m, assi, val)                             \
         ((m)->map != NULL &&                                        \
          (val) >= (m)->bottom &&                                    \
          (val)<= (m)->top &&                                        \
          ((assi) = (m)->map[(val) - (m)->bottom]) != UNIINV)
    -#define TRYMAP_DEC(charset, writer, c1, c2)                     \
    -    if _TRYMAP_DEC(&charset##_decmap[c1], writer, c2)
    -#define TRYMAP_DEC_CHAR(charset, assi, c1, c2)                     \
    -    if _TRYMAP_DEC_CHAR(&charset##_decmap[c1], assi, c2)
    +#define TRYMAP_DEC(charset, assi, c1, c2)                     \
    +    _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)
     
     #define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val)        \
         ((m)->map != NULL && (val) >= (m)->bottom &&                  \
    @@ -210,8 +194,6 @@
     #define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \
         if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \
                            assplane, asshi, asslo, (uni) & 0xff)
    -#define TRYMAP_DEC_MPLANE(charset, writer, plane, c1, c2)         \
    -    if _TRYMAP_DEC(&charset##_decmap[plane][c1], writer, c2)
     
     #define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = {
     #define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL},
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:23 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:23 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_CJK_codecs=3A_remove_unuse?=
     =?utf-8?q?d_TRYMAP=5FENC=5FMPLANE_macro?=
    Message-ID: <3d7tJv20xCz7Ljy@mail.python.org>
    
    http://hg.python.org/cpython/rev/071809616a64
    changeset:   86710:071809616a64
    user:        Victor Stinner 
    date:        Mon Oct 28 23:47:26 2013 +0100
    summary:
      CJK codecs: remove unused TRYMAP_ENC_MPLANE macro
    
    files:
      Modules/cjkcodecs/cjkcodecs.h |  10 ----------
      1 files changed, 0 insertions(+), 10 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
    --- a/Modules/cjkcodecs/cjkcodecs.h
    +++ b/Modules/cjkcodecs/cjkcodecs.h
    @@ -185,16 +185,6 @@
     #define TRYMAP_DEC(charset, assi, c1, c2)                     \
         _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)
     
    -#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val)        \
    -    ((m)->map != NULL && (val) >= (m)->bottom &&                  \
    -        (val)<= (m)->top &&                                       \
    -        ((assplane) = (m)->map[((val) - (m)->bottom)*3]) != 0 &&  \
    -        (((asshi) = (m)->map[((val) - (m)->bottom)*3 + 1]), 1) && \
    -        (((asslo) = (m)->map[((val) - (m)->bottom)*3 + 2]), 1))
    -#define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \
    -    if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \
    -                       assplane, asshi, asslo, (uni) & 0xff)
    -
     #define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = {
     #define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL},
     #define MAPPING_DECONLY(enc) {#enc, NULL, (void*)enc##_decmap},
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:24 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_CJK_codecs=3A_use_less_mag?=
     =?utf-8?q?ic_and_more_readable_macros=2C_write_explicit_if?=
    Message-ID: <3d7tJw4v0qzSqp@mail.python.org>
    
    http://hg.python.org/cpython/rev/95d9e7c2af11
    changeset:   86711:95d9e7c2af11
    user:        Victor Stinner 
    date:        Mon Oct 28 23:54:13 2013 +0100
    summary:
      CJK codecs: use less magic and more readable macros, write explicit if
    
    files:
      Modules/cjkcodecs/_codecs_cn.c      |   8 +++---
      Modules/cjkcodecs/_codecs_hk.c      |   6 ++--
      Modules/cjkcodecs/_codecs_iso2022.c |  16 ++++++------
      Modules/cjkcodecs/_codecs_jp.c      |  20 ++++++++--------
      Modules/cjkcodecs/_codecs_kr.c      |   6 ++--
      Modules/cjkcodecs/_codecs_tw.c      |   6 ++--
      Modules/cjkcodecs/cjkcodecs.h       |   4 +--
      7 files changed, 32 insertions(+), 34 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
    --- a/Modules/cjkcodecs/_codecs_cn.c
    +++ b/Modules/cjkcodecs/_codecs_cn.c
    @@ -36,7 +36,7 @@
         if ((code) == 0x2014) (assi) = 0xa1aa; \
         else if ((code) == 0x2015) (assi) = 0xa844; \
         else if ((code) == 0x00b7) (assi) = 0xa1a4; \
    -    else if ((code) != 0x30fb && TRYMAP_ENC_COND(gbcommon, assi, code));
    +    else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code));
     
     /*
      * GB2312 codec
    @@ -58,7 +58,7 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        TRYMAP_ENC(gbcommon, code, c);
    +        if (TRYMAP_ENC(gbcommon, code, c));
             else return 1;
     
             if (code & 0x8000) /* MSB set: GBK */
    @@ -192,7 +192,7 @@
             REQUIRE_OUTBUF(2)
     
             GBK_ENCODE(c, code)
    -        else TRYMAP_ENC(gb18030ext, code, c);
    +        else if (TRYMAP_ENC(gb18030ext, code, c));
             else {
                 const struct _gb18030_to_unibmp_ranges *utrrange;
     
    @@ -343,7 +343,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        TRYMAP_ENC(gbcommon, code, c);
    +        if (TRYMAP_ENC(gbcommon, code, c));
             else return 1;
     
             if (code & 0x8000) /* MSB set: GBK */
    diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
    --- a/Modules/cjkcodecs/_codecs_hk.c
    +++ b/Modules/cjkcodecs/_codecs_hk.c
    @@ -54,7 +54,7 @@
             REQUIRE_OUTBUF(2)
     
             if (c < 0x10000) {
    -            TRYMAP_ENC(big5hkscs_bmp, code, c) {
    +            if (TRYMAP_ENC(big5hkscs_bmp, code, c)) {
                     if (code == MULTIC) {
                         Py_UCS4 c2;
                         if (inlen - *inpos >= 2)
    @@ -81,13 +81,13 @@
                         }
                     }
                 }
    -            else TRYMAP_ENC(big5, code, c);
    +            else if (TRYMAP_ENC(big5, code, c));
                 else return 1;
             }
             else if (c < 0x20000)
                 return insize;
             else if (c < 0x30000) {
    -            TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff);
    +            if (TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff));
                 else return insize;
             }
             else
    diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
    --- a/Modules/cjkcodecs/_codecs_iso2022.c
    +++ b/Modules/cjkcodecs/_codecs_iso2022.c
    @@ -578,9 +578,10 @@
         DBCHAR coded;
         assert(*length == 1);
         if (*data < 0x10000) {
    -        TRYMAP_ENC(cp949, coded, *data)
    +        if (TRYMAP_ENC(cp949, coded, *data)) {
                 if (!(coded & 0x8000))
                     return coded;
    +        }
         }
         return MAP_UNMAPPABLE;
     }
    @@ -618,7 +619,7 @@
         if (*data < 0x10000) {
             if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
                 return 0x2140;
    -        else TRYMAP_ENC(jisxcommon, coded, *data) {
    +        else if (TRYMAP_ENC(jisxcommon, coded, *data)) {
                 if (!(coded & 0x8000))
                     return coded;
             }
    @@ -655,7 +656,7 @@
         DBCHAR coded;
         assert(*length == 1);
         if (*data < 0x10000) {
    -        TRYMAP_ENC(jisxcommon, coded, *data) {
    +        if (TRYMAP_ENC(jisxcommon, coded, *data)) {
                 if (coded & 0x8000)
                     return coded & 0x7fff;
             }
    @@ -759,19 +760,18 @@
             if (*data >= 0x10000) {
                 if ((*data) >> 16 == 0x20000 >> 16) {
                     EMULATE_JISX0213_2000_ENCODE_EMP(coded, *data)
    -                else TRYMAP_ENC(jisx0213_emp, coded,
    -                                (*data) & 0xffff)
    +                else if (TRYMAP_ENC(jisx0213_emp, coded, (*data) & 0xffff))
                         return coded;
                 }
                 return MAP_UNMAPPABLE;
             }
     
             EMULATE_JISX0213_2000_ENCODE_BMP(coded, *data)
    -        else TRYMAP_ENC(jisx0213_bmp, coded, *data) {
    +        else if (TRYMAP_ENC(jisx0213_bmp, coded, *data)) {
                 if (coded == MULTIC)
                     return MAP_MULTIPLE_AVAIL;
             }
    -        else TRYMAP_ENC(jisxcommon, coded, *data) {
    +        else if (TRYMAP_ENC(jisxcommon, coded, *data)) {
                 if (coded & 0x8000)
                     return MAP_UNMAPPABLE;
             }
    @@ -962,7 +962,7 @@
         DBCHAR coded;
         assert(*length == 1);
         if (*data < 0x10000) {
    -        TRYMAP_ENC(gbcommon, coded, *data) {
    +        if (TRYMAP_ENC(gbcommon, coded, *data)) {
                 if (!(coded & 0x8000))
                     return coded;
             }
    diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
    --- a/Modules/cjkcodecs/_codecs_jp.c
    +++ b/Modules/cjkcodecs/_codecs_jp.c
    @@ -49,11 +49,11 @@
                 return 1;
             REQUIRE_OUTBUF(2)
     
    -        TRYMAP_ENC(cp932ext, code, c) {
    +        if (TRYMAP_ENC(cp932ext, code, c)) {
                 OUTBYTE1(code >> 8)
                 OUTBYTE2(code & 0xff)
             }
    -        else TRYMAP_ENC(jisxcommon, code, c) {
    +        else if (TRYMAP_ENC(jisxcommon, code, c)) {
                 if (code & 0x8000) /* MSB set: JIS X 0212 */
                     return 1;
     
    @@ -165,7 +165,7 @@
     
             if (c <= 0xFFFF) {
                 EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
    -            else TRYMAP_ENC(jisx0213_bmp, code, c) {
    +            else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
                     if (code == MULTIC) {
                         if (inlen - *inpos < 2) {
                             if (flags & MBENC_FLUSH) {
    @@ -197,7 +197,7 @@
                         }
                     }
                 }
    -            else TRYMAP_ENC(jisxcommon, code, c);
    +            else if (TRYMAP_ENC(jisxcommon, code, c));
                 else if (c >= 0xff61 && c <= 0xff9f) {
                     /* JIS X 0201 half-width katakana */
                     WRITEBYTE2(0x8e, c - 0xfec0)
    @@ -215,7 +215,7 @@
             }
             else if (c >> 16 == EMPBASE >> 16) {
                 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    -            else TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
    +            else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff));
                 else return insize;
             }
             else
    @@ -334,7 +334,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        TRYMAP_ENC(jisxcommon, code, c);
    +        if (TRYMAP_ENC(jisxcommon, code, c));
             else if (c >= 0xff61 && c <= 0xff9f) {
                 /* JIS X 0201 half-width katakana */
                 WRITEBYTE2(0x8e, c - 0xfec0)
    @@ -469,7 +469,7 @@
             REQUIRE_OUTBUF(2)
     
             if (code == NOCHAR) {
    -            TRYMAP_ENC(jisxcommon, code, c);
    +            if (TRYMAP_ENC(jisxcommon, code, c));
     #ifndef STRICT_BUILD
                 else if (c == 0xff3c)
                     code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
    @@ -570,7 +570,7 @@
             if (code == NOCHAR) {
                 if (c <= 0xffff) {
                     EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
    -                else TRYMAP_ENC(jisx0213_bmp, code, c) {
    +                else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
                         if (code == MULTIC) {
                             if (inlen - *inpos < 2) {
                                 if (flags & MBENC_FLUSH) {
    @@ -603,7 +603,7 @@
                             }
                         }
                     }
    -                else TRYMAP_ENC(jisxcommon, code, c) {
    +                else if (TRYMAP_ENC(jisxcommon, code, c)) {
                         /* abandon JIS X 0212 codes */
                         if (code & 0x8000)
                             return 1;
    @@ -612,7 +612,7 @@
                 }
                 else if (c >> 16 == EMPBASE >> 16) {
                     EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    -                else TRYMAP_ENC(jisx0213_emp, code, c&0xffff);
    +                else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff));
                     else return insize;
                 }
                 else
    diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
    --- a/Modules/cjkcodecs/_codecs_kr.c
    +++ b/Modules/cjkcodecs/_codecs_kr.c
    @@ -47,7 +47,7 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        TRYMAP_ENC(cp949, code, c);
    +        if (TRYMAP_ENC(cp949, code, c));
             else return 1;
     
             if ((code & 0x8000) == 0) {
    @@ -182,7 +182,7 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        TRYMAP_ENC(cp949, code, c);
    +        if (TRYMAP_ENC(cp949, code, c));
             else return 1;
     
             OUTBYTE1((code >> 8) | 0x80)
    @@ -279,7 +279,7 @@
             }
             else if (c >= 0x3131 && c <= 0x3163)
                 code = u2johabjamo[c - 0x3131];
    -        else TRYMAP_ENC(cp949, code, c) {
    +        else if (TRYMAP_ENC(cp949, code, c)) {
                 unsigned char c1, c2, t2;
                 unsigned short t1;
     
    diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
    --- a/Modules/cjkcodecs/_codecs_tw.c
    +++ b/Modules/cjkcodecs/_codecs_tw.c
    @@ -29,7 +29,7 @@
     
             REQUIRE_OUTBUF(2)
     
    -        TRYMAP_ENC(big5, code, c);
    +        if (TRYMAP_ENC(big5, code, c));
             else return 1;
     
             OUTBYTE1(code >> 8)
    @@ -84,8 +84,8 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        TRYMAP_ENC(cp950ext, code, c);
    -        else TRYMAP_ENC(big5, code, c);
    +        if (TRYMAP_ENC(cp950ext, code, c));
    +        else if (TRYMAP_ENC(big5, code, c));
             else return 1;
     
             OUTBYTE1(code >> 8)
    diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
    --- a/Modules/cjkcodecs/cjkcodecs.h
    +++ b/Modules/cjkcodecs/cjkcodecs.h
    @@ -172,10 +172,8 @@
         ((m)->map != NULL && (val) >= (m)->bottom &&                \
             (val)<= (m)->top && ((assi) = (m)->map[(val) -          \
             (m)->bottom]) != NOCHAR)
    -#define TRYMAP_ENC_COND(charset, assi, uni)                     \
    +#define TRYMAP_ENC(charset, assi, uni)                     \
         _TRYMAP_ENC(&charset##_encmap[(uni) >> 8], assi, (uni) & 0xff)
    -#define TRYMAP_ENC(charset, assi, uni)                          \
    -    if TRYMAP_ENC_COND(charset, assi, uni)
     
     #define _TRYMAP_DEC(m, assi, val)                             \
         ((m)->map != NULL &&                                        \
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:26 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:26 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_CJK_codecs=3A_add_newlines?=
    	=?utf-8?q?_for_readability?=
    Message-ID: <3d7tJy1zhFz7LkF@mail.python.org>
    
    http://hg.python.org/cpython/rev/34ecad798dc4
    changeset:   86712:34ecad798dc4
    user:        Victor Stinner 
    date:        Tue Oct 29 00:09:41 2013 +0100
    summary:
      CJK codecs: add newlines for readability
    
    files:
      Modules/cjkcodecs/_codecs_cn.c      |  40 +++++--
      Modules/cjkcodecs/_codecs_hk.c      |  12 +-
      Modules/cjkcodecs/_codecs_iso2022.c |  87 ++++++++++------
      Modules/cjkcodecs/_codecs_jp.c      |  73 +++++++++----
      Modules/cjkcodecs/_codecs_kr.c      |  15 +-
      Modules/cjkcodecs/_codecs_tw.c      |  15 +-
      Modules/cjkcodecs/alg_jisx0201.h    |  37 +++++-
      7 files changed, 188 insertions(+), 91 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
    --- a/Modules/cjkcodecs/_codecs_cn.c
    +++ b/Modules/cjkcodecs/_codecs_cn.c
    @@ -33,10 +33,13 @@
             OUTCHAR(decoded);
     
     #define GBK_ENCODE(code, assi) \
    -    if ((code) == 0x2014) (assi) = 0xa1aa; \
    -    else if ((code) == 0x2015) (assi) = 0xa844; \
    -    else if ((code) == 0x00b7) (assi) = 0xa1a4; \
    -    else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code));
    +    if ((code) == 0x2014) \
    +        (assi) = 0xa1aa; \
    +    else if ((code) == 0x2015) \
    +        (assi) = 0xa844; \
    +    else if ((code) == 0x00b7) \
    +        (assi) = 0xa1a4; \
    +    else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code))
     
     /*
      * GB2312 codec
    @@ -58,8 +61,10 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        if (TRYMAP_ENC(gbcommon, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(gbcommon, code, c))
    +            ;
    +        else
    +            return 1;
     
             if (code & 0x8000) /* MSB set: GBK */
                 return 1;
    @@ -89,7 +94,8 @@
                 OUTCHAR(decoded);
                 NEXT_IN(2);
             }
    -        else return 1;
    +        else
    +            return 1;
         }
     
         return 0;
    @@ -118,7 +124,9 @@
             REQUIRE_OUTBUF(2)
     
             GBK_ENCODE(c, code)
    -        else return 1;
    +            ;
    +        else
    +            return 1;
     
             OUTBYTE1((code >> 8) | 0x80)
             if (code & 0x8000)
    @@ -146,7 +154,8 @@
             REQUIRE_INBUF(2)
     
             GBK_DECODE(c, INBYTE2, writer)
    -        else return 1;
    +        else
    +            return 1;
     
             NEXT_IN(2);
         }
    @@ -192,7 +201,9 @@
             REQUIRE_OUTBUF(2)
     
             GBK_ENCODE(c, code)
    -        else if (TRYMAP_ENC(gb18030ext, code, c));
    +            ;
    +        else if (TRYMAP_ENC(gb18030ext, code, c))
    +            ;
             else {
                 const struct _gb18030_to_unibmp_ranges *utrrange;
     
    @@ -292,7 +303,8 @@
             GBK_DECODE(c, c2, writer)
             else if (TRYMAP_DEC(gb18030ext, decoded, c, c2))
                 OUTCHAR(decoded);
    -        else return 1;
    +        else
    +            return 1;
     
             NEXT_IN(2);
         }
    @@ -343,8 +355,10 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        if (TRYMAP_ENC(gbcommon, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(gbcommon, code, c))
    +            ;
    +        else
    +            return 1;
     
             if (code & 0x8000) /* MSB set: GBK */
                 return 1;
    diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
    --- a/Modules/cjkcodecs/_codecs_hk.c
    +++ b/Modules/cjkcodecs/_codecs_hk.c
    @@ -81,14 +81,18 @@
                         }
                     }
                 }
    -            else if (TRYMAP_ENC(big5, code, c));
    -            else return 1;
    +            else if (TRYMAP_ENC(big5, code, c))
    +                ;
    +            else
    +                return 1;
             }
             else if (c < 0x20000)
                 return insize;
             else if (c < 0x30000) {
    -            if (TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff));
    -            else return insize;
    +            if (TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff))
    +                ;
    +            else
    +                return insize;
             }
             else
                 return insize;
    diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
    --- a/Modules/cjkcodecs/_codecs_iso2022.c
    +++ b/Modules/cjkcodecs/_codecs_iso2022.c
    @@ -318,11 +318,14 @@
             }
             else {
                 charset = INBYTE3;
    -            if (INBYTE2 == '(') designation = 0;
    -            else if (INBYTE2 == ')') designation = 1;
    +            if (INBYTE2 == '(')
    +                designation = 0;
    +            else if (INBYTE2 == ')')
    +                designation = 1;
                 else if (CONFIG_ISSET(USE_G2) && INBYTE2 == '.')
                     designation = 2;
    -            else return 3;
    +            else
    +                return 3;
             }
             break;
         case 4:
    @@ -330,9 +333,12 @@
                 return 4;
     
             charset = INBYTE4 | CHARSET_DBCS;
    -        if (INBYTE3 == '(') designation = 0;
    -        else if (INBYTE3 == ')') designation = 1;
    -        else return 4;
    +        if (INBYTE3 == '(')
    +            designation = 0;
    +        else if (INBYTE3 == ')')
    +            designation = 1;
    +        else
    +            return 4;
             break;
         case 6: /* designation with prefix */
             if (CONFIG_ISSET(USE_JISX0208_EXT) &&
    @@ -365,16 +371,20 @@
         return 0;
     }
     
    -#define ISO8859_7_DECODE(c, writer)                               \
    -    if ((c) < 0xa0) OUTCHAR(c);                                       \
    -    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0))))    \
    -        OUTCHAR(c);                                                   \
    -    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||        \
    -             (0xbffffd77L & (1L << ((c)-0xb4)))))                 \
    -        OUTCHAR(0x02d0 + (c));                                        \
    -    else if ((c) == 0xa1) OUTCHAR(0x2018);                            \
    -    else if ((c) == 0xa2) OUTCHAR(0x2019);                            \
    -    else if ((c) == 0xaf) OUTCHAR(0x2015);
    +#define ISO8859_7_DECODE(c, writer)                            \
    +    if ((c) < 0xa0)                                            \
    +        OUTCHAR(c);                                            \
    +    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) \
    +        OUTCHAR(c);                                            \
    +    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||     \
    +             (0xbffffd77L & (1L << ((c)-0xb4)))))              \
    +        OUTCHAR(0x02d0 + (c));                                 \
    +    else if ((c) == 0xa1)                                      \
    +        OUTCHAR(0x2018);                                       \
    +    else if ((c) == 0xa2)                                      \
    +        OUTCHAR(0x2019);                                       \
    +    else if ((c) == 0xaf)                                      \
    +        OUTCHAR(0x2015);
     
     static Py_ssize_t
     iso2022processg2(const void *config, MultibyteCodec_State *state,
    @@ -391,11 +401,14 @@
         }
         else if (STATE_G2 == CHARSET_ISO8859_7) {
             ISO8859_7_DECODE(INBYTE3 ^ 0x80, writer)
    -        else return 3;
    +        else
    +            return 3;
         }
         else if (STATE_G2 == CHARSET_ASCII) {
    -        if (INBYTE3 & 0x80) return 3;
    -        else OUTCHAR(INBYTE3);
    +        if (INBYTE3 & 0x80)
    +            return 3;
    +        else
    +            OUTCHAR(INBYTE3);
         }
         else
             return MBERR_INTERNAL;
    @@ -698,11 +711,14 @@
         EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
         else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
             return 0xff3c;
    -    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
    -    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
    +        ;
    +    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]))
    +        ;
         else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
             u |= 0x20000;
    -    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]))
    +        ;
         else
             return MAP_UNMAPPABLE;
         return u;
    @@ -713,7 +729,8 @@
     {
         Py_UCS4 u;
         EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
    -    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
    +    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]))
    +        ;
         else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
             u |= 0x20000;
         else
    @@ -728,11 +745,14 @@
         Py_UCS4 u;
         if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
             return 0xff3c;
    -    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
    -    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
    +        ;
    +    else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]))
    +        ;
         else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
             u |= 0x20000;
    -    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
    +    else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]))
    +        ;
         else
             return MAP_UNMAPPABLE;
         return u;
    @@ -742,7 +762,8 @@
     jisx0213_2004_2_decoder(const unsigned char *data)
     {
         Py_UCS4 u;
    -    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
    +    if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]))
    +        ;
         else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
             u |= 0x20000;
         else
    @@ -902,7 +923,8 @@
     {
         Py_UCS4 u;
         JISX0201_R_DECODE_CHAR(*data, u)
    -    else return MAP_UNMAPPABLE;
    +    else
    +        return MAP_UNMAPPABLE;
         return u;
     }
     
    @@ -911,7 +933,8 @@
     {
         DBCHAR coded;
         JISX0201_R_ENCODE(*data, coded)
    -    else return MAP_UNMAPPABLE;
    +    else
    +        return MAP_UNMAPPABLE;
         return coded;
     }
     
    @@ -920,7 +943,8 @@
     {
         Py_UCS4 u;
         JISX0201_K_DECODE_CHAR(*data ^ 0x80, u)
    -    else return MAP_UNMAPPABLE;
    +    else
    +        return MAP_UNMAPPABLE;
         return u;
     }
     
    @@ -929,7 +953,8 @@
     {
         DBCHAR coded;
         JISX0201_K_ENCODE(*data, coded)
    -    else return MAP_UNMAPPABLE;
    +    else
    +        return MAP_UNMAPPABLE;
         return coded - 0x80;
     }
     
    diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
    --- a/Modules/cjkcodecs/_codecs_jp.c
    +++ b/Modules/cjkcodecs/_codecs_jp.c
    @@ -197,7 +197,8 @@
                         }
                     }
                 }
    -            else if (TRYMAP_ENC(jisxcommon, code, c));
    +            else if (TRYMAP_ENC(jisxcommon, code, c))
    +                ;
                 else if (c >= 0xff61 && c <= 0xff9f) {
                     /* JIS X 0201 half-width katakana */
                     WRITEBYTE2(0x8e, c - 0xfec0)
    @@ -215,8 +216,10 @@
             }
             else if (c >> 16 == EMPBASE >> 16) {
                 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    -            else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff));
    -            else return insize;
    +            else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff))
    +                ;
    +            else
    +                return insize;
             }
             else
                 return insize;
    @@ -278,7 +281,8 @@
                 }
                 else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
                     OUTCHAR(decoded);
    -            else return 1;
    +            else
    +                return 1;
                 NEXT_IN(3);
             }
             else {
    @@ -290,8 +294,10 @@
     
                 /* JIS X 0213 Plane 1 */
                 EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
    -            else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
    -            else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
    +            else if (c == 0x21 && c2 == 0x40)
    +                OUTCHAR(0xff3c);
    +            else if (c == 0x22 && c2 == 0x32)
    +                OUTCHAR(0xff5e);
                 else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
                     OUTCHAR(decoded);
                 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
    @@ -306,7 +312,8 @@
                     NEXT_IN(2);
                     continue;
                 }
    -            else return 1;
    +            else
    +                return 1;
                 NEXT_IN(2);
             }
         }
    @@ -334,7 +341,8 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        if (TRYMAP_ENC(jisxcommon, code, c));
    +        if (TRYMAP_ENC(jisxcommon, code, c))
    +            ;
             else if (c >= 0xff61 && c <= 0xff9f) {
                 /* JIS X 0201 half-width katakana */
                 WRITEBYTE2(0x8e, c - 0xfec0)
    @@ -448,9 +456,12 @@
     #ifdef STRICT_BUILD
             JISX0201_R_ENCODE(c, code)
     #else
    -        if (c < 0x80) code = c;
    -        else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */
    -        else if (c == 0x203e) code = 0x7e; /* OVERLINE */
    +        if (c < 0x80)
    +            code = c;
    +        else if (c == 0x00a5)
    +            code = 0x5c; /* YEN SIGN */
    +        else if (c == 0x203e)
    +            code = 0x7e; /* OVERLINE */
     #endif
             else JISX0201_K_ENCODE(c, code)
             else if (c > 0xFFFF)
    @@ -469,7 +480,8 @@
             REQUIRE_OUTBUF(2)
     
             if (code == NOCHAR) {
    -            if (TRYMAP_ENC(jisxcommon, code, c));
    +            if (TRYMAP_ENC(jisxcommon, code, c))
    +                ;
     #ifndef STRICT_BUILD
                 else if (c == 0xff3c)
                     code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
    @@ -502,7 +514,8 @@
     #ifdef STRICT_BUILD
             JISX0201_R_DECODE(c, writer)
     #else
    -        if (c < 0x80) OUTCHAR(c);
    +        if (c < 0x80)
    +            OUTCHAR(c);
     #endif
             else JISX0201_K_DECODE(c, writer)
             else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
    @@ -608,12 +621,15 @@
                         if (code & 0x8000)
                             return 1;
                     }
    -                else return 1;
    +                else
    +                    return 1;
                 }
                 else if (c >> 16 == EMPBASE >> 16) {
                     EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    -                else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff));
    -                else return insize;
    +                else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff))
    +                    ;
    +                else
    +                    return insize;
                 }
                 else
                     return insize;
    @@ -623,14 +639,20 @@
             c2 = (code & 0xff) - 0x21;
     
             if (c1 & 0x80) { /* Plane 2 */
    -            if (c1 >= 0xee) c1 -= 0x87;
    -            else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;
    -            else c1 -= 0x43;
    +            if (c1 >= 0xee)
    +                c1 -= 0x87;
    +            else if (c1 >= 0xac || c1 == 0xa8)
    +                c1 -= 0x49;
    +            else
    +                c1 -= 0x43;
             }
    -        else /* Plane 1 */
    +        else {
    +            /* Plane 1 */
                 c1 -= 0x21;
    +        }
     
    -        if (c1 & 1) c2 += 0x5e;
    +        if (c1 & 1)
    +            c2 += 0x5e;
             c1 >>= 1;
             OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
             OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
    @@ -678,9 +700,12 @@
                     NEXT_IN(2);
                 }
                 else { /* Plane 2 */
    -                if (c1 >= 0x67) c1 += 0x07;
    -                else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
    -                else c1 -= 0x3d;
    +                if (c1 >= 0x67)
    +                    c1 += 0x07;
    +                else if (c1 >= 0x63 || c1 == 0x5f)
    +                    c1 -= 0x37;
    +                else
    +                    c1 -= 0x3d;
     
                     EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
                                     c1, c2)
    diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
    --- a/Modules/cjkcodecs/_codecs_kr.c
    +++ b/Modules/cjkcodecs/_codecs_kr.c
    @@ -47,8 +47,10 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        if (TRYMAP_ENC(cp949, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(cp949, code, c))
    +            ;
    +        else
    +            return 1;
     
             if ((code & 0x8000) == 0) {
                 /* KS X 1001 coded character */
    @@ -182,8 +184,10 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        if (TRYMAP_ENC(cp949, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(cp949, code, c))
    +            ;
    +        else
    +            return 1;
     
             OUTBYTE1((code >> 8) | 0x80)
             if (code & 0x8000)
    @@ -213,7 +217,8 @@
                 OUTCHAR(decoded);
             else if (TRYMAP_DEC(cp949ext, decoded, c, INBYTE2))
                 OUTCHAR(decoded);
    -        else return 1;
    +        else
    +            return 1;
     
             NEXT_IN(2);
         }
    diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
    --- a/Modules/cjkcodecs/_codecs_tw.c
    +++ b/Modules/cjkcodecs/_codecs_tw.c
    @@ -29,8 +29,10 @@
     
             REQUIRE_OUTBUF(2)
     
    -        if (TRYMAP_ENC(big5, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(big5, code, c))
    +            ;
    +        else
    +            return 1;
     
             OUTBYTE1(code >> 8)
             OUTBYTE2(code & 0xFF)
    @@ -84,9 +86,12 @@
                 return 1;
     
             REQUIRE_OUTBUF(2)
    -        if (TRYMAP_ENC(cp950ext, code, c));
    -        else if (TRYMAP_ENC(big5, code, c));
    -        else return 1;
    +        if (TRYMAP_ENC(cp950ext, code, c))
    +            ;
    +        else if (TRYMAP_ENC(big5, code, c))
    +            ;
    +        else
    +            return 1;
     
             OUTBYTE1(code >> 8)
             OUTBYTE2(code & 0xFF)
    diff --git a/Modules/cjkcodecs/alg_jisx0201.h b/Modules/cjkcodecs/alg_jisx0201.h
    --- a/Modules/cjkcodecs/alg_jisx0201.h
    +++ b/Modules/cjkcodecs/alg_jisx0201.h
    @@ -1,27 +1,46 @@
     #define JISX0201_R_ENCODE(c, assi)                      \
    -    if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e)       \
    +    if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e) {     \
             (assi) = (c);                                   \
    -    else if ((c) == 0x00a5) (assi) = 0x5c;              \
    -    else if ((c) == 0x203e) (assi) = 0x7e;
    +    }                                                   \
    +    else if ((c) == 0x00a5) {                           \
    +        (assi) = 0x5c;                                  \
    +    }                                                   \
    +    else if ((c) == 0x203e) {                           \
    +        (assi) = 0x7e;                                  \
    +    }
    +
     #define JISX0201_K_ENCODE(c, assi)                      \
         if ((c) >= 0xff61 && (c) <= 0xff9f)                 \
    -        (assi) = (c) - 0xfec0;
    +    { (assi) = (c) - 0xfec0; }
    +
     #define JISX0201_ENCODE(c, assi)                        \
         JISX0201_R_ENCODE(c, assi)                          \
         else JISX0201_K_ENCODE(c, assi)
     
     #define JISX0201_R_DECODE_CHAR(c, assi)                 \
    -    if ((c) < 0x5c) (assi) = (c);                       \
    -    else if ((c) == 0x5c) (assi) = 0x00a5;              \
    -    else if ((c) < 0x7e) (assi) = (c);                  \
    -    else if ((c) == 0x7e) (assi) = 0x203e;              \
    -    else if ((c) == 0x7f) (assi) = 0x7f;
    +    if ((c) < 0x5c) {                                   \
    +        (assi) = (c);                                   \
    +    }                                                   \
    +    else if ((c) == 0x5c) {                             \
    +        (assi) = 0x00a5;                                \
    +    }                                                   \
    +    else if ((c) < 0x7e) {                              \
    +        (assi) = (c);                                   \
    +    }                                                   \
    +    else if ((c) == 0x7e) {                             \
    +        (assi) = 0x203e;                                \
    +    }                                                   \
    +    else if ((c) == 0x7f) {                             \
    +        (assi) = 0x7f;                                  \
    +    }
    +
     #define JISX0201_R_DECODE(c, writer)                    \
         if ((c) < 0x5c) OUTCHAR(c);                             \
         else if ((c) == 0x5c) OUTCHAR(0x00a5);                  \
         else if ((c) < 0x7e) OUTCHAR(c);                        \
         else if ((c) == 0x7e) OUTCHAR(0x203e);                  \
         else if ((c) == 0x7f) OUTCHAR(0x7f);
    +
     #define JISX0201_K_DECODE(c, writer)                    \
         if ((c) >= 0xa1 && (c) <= 0xdf)                     \
             OUTCHAR(0xfec0 + (c));
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:28 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:28 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_CJK_codecs=3A_less_magic_m?=
     =?utf-8?q?acros=2C_require_explicit_semicolon?=
    Message-ID: <3d7tK00QKsz7Ljd@mail.python.org>
    
    http://hg.python.org/cpython/rev/c0d5b8316045
    changeset:   86713:c0d5b8316045
    user:        Victor Stinner 
    date:        Tue Oct 29 00:19:27 2013 +0100
    summary:
      CJK codecs: less magic macros, require explicit semicolon
    
    files:
      Modules/cjkcodecs/_codecs_cn.c        |  93 ++++++++------
      Modules/cjkcodecs/_codecs_hk.c        |   8 +-
      Modules/cjkcodecs/_codecs_iso2022.c   |  57 ++++----
      Modules/cjkcodecs/_codecs_jp.c        |  58 ++++----
      Modules/cjkcodecs/_codecs_kr.c        |  48 +++---
      Modules/cjkcodecs/_codecs_tw.c        |  16 +-
      Modules/cjkcodecs/alg_jisx0201.h      |  35 +++-
      Modules/cjkcodecs/cjkcodecs.h         |  64 ++++++----
      Modules/cjkcodecs/emu_jisx0213_2000.h |  34 +++--
      Modules/cjkcodecs/multibytecodec.h    |  10 +-
      10 files changed, 233 insertions(+), 190 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
    --- a/Modules/cjkcodecs/_codecs_cn.c
    +++ b/Modules/cjkcodecs/_codecs_cn.c
    @@ -23,23 +23,32 @@
      * A844         undefined                       U+2015 HORIZONTAL BAR
      */
     
    -#define GBK_DECODE(dc1, dc2, writer) \
    -    if ((dc1) == 0xa1 && (dc2) == 0xaa) OUTCHAR(0x2014); \
    -    else if ((dc1) == 0xa8 && (dc2) == 0x44) OUTCHAR(0x2015); \
    -    else if ((dc1) == 0xa1 && (dc2) == 0xa4) OUTCHAR(0x00b7); \
    -    else if (TRYMAP_DEC(gb2312, decoded, dc1 ^ 0x80, dc2 ^ 0x80)) \
    -        OUTCHAR(decoded); \
    -    else if (TRYMAP_DEC(gbkext, decoded, dc1, dc2)) \
    -        OUTCHAR(decoded);
    +#define GBK_DECODE(dc1, dc2, writer)                                \
    +    if ((dc1) == 0xa1 && (dc2) == 0xaa) {                           \
    +        OUTCHAR(0x2014);                                            \
    +    }                                                               \
    +    else if ((dc1) == 0xa8 && (dc2) == 0x44) {                      \
    +        OUTCHAR(0x2015);                                            \
    +    }                                                               \
    +    else if ((dc1) == 0xa1 && (dc2) == 0xa4) {                      \
    +        OUTCHAR(0x00b7);                                            \
    +    }                                                               \
    +    else if (TRYMAP_DEC(gb2312, decoded, dc1 ^ 0x80, dc2 ^ 0x80)) { \
    +        OUTCHAR(decoded);                                           \
    +    }                                                               \
    +    else if (TRYMAP_DEC(gbkext, decoded, dc1, dc2)) {               \
    +        OUTCHAR(decoded);                                           \
    +    }
     
     #define GBK_ENCODE(code, assi) \
    -    if ((code) == 0x2014) \
    +    if ((code) == 0x2014) { \
             (assi) = 0xa1aa; \
    -    else if ((code) == 0x2015) \
    +    } else if ((code) == 0x2015) { \
             (assi) = 0xa844; \
    -    else if ((code) == 0x00b7) \
    +    } else if ((code) == 0x00b7) { \
             (assi) = 0xa1a4; \
    -    else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code))
    +    } else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code)) { \
    +    }
     
     /*
      * GB2312 codec
    @@ -52,7 +61,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -60,7 +69,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
             if (TRYMAP_ENC(gbcommon, code, c))
                 ;
             else
    @@ -69,8 +78,8 @@
             if (code & 0x8000) /* MSB set: GBK */
                 return 1;
     
    -        OUTBYTE1((code >> 8) | 0x80)
    -        OUTBYTE2((code & 0xFF) | 0x80)
    +        OUTBYTE1((code >> 8) | 0x80);
    +        OUTBYTE2((code & 0xFF) | 0x80);
             NEXT(1, 2);
         }
     
    @@ -113,7 +122,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -121,18 +130,17 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             GBK_ENCODE(c, code)
    -            ;
             else
                 return 1;
     
    -        OUTBYTE1((code >> 8) | 0x80)
    +        OUTBYTE1((code >> 8) | 0x80);
             if (code & 0x8000)
    -            OUTBYTE2((code & 0xFF)) /* MSB set: GBK */
    +            OUTBYTE2((code & 0xFF)); /* MSB set: GBK */
             else
    -            OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
    +            OUTBYTE2((code & 0xFF) | 0x80); /* MSB unset: GB2312 */
             NEXT(1, 2);
         }
     
    @@ -175,7 +183,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1(c)
    +            WRITEBYTE1(c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -184,30 +192,29 @@
                 Py_UCS4 tc = c - 0x10000;
                 assert (c <= 0x10FFFF);
     
    -            REQUIRE_OUTBUF(4)
    +            REQUIRE_OUTBUF(4);
     
    -            OUTBYTE4((unsigned char)(tc % 10) + 0x30)
    +            OUTBYTE4((unsigned char)(tc % 10) + 0x30);
                 tc /= 10;
    -            OUTBYTE3((unsigned char)(tc % 126) + 0x81)
    +            OUTBYTE3((unsigned char)(tc % 126) + 0x81);
                 tc /= 126;
    -            OUTBYTE2((unsigned char)(tc % 10) + 0x30)
    +            OUTBYTE2((unsigned char)(tc % 10) + 0x30);
                 tc /= 10;
    -            OUTBYTE1((unsigned char)(tc + 0x90))
    +            OUTBYTE1((unsigned char)(tc + 0x90));
     
                 NEXT(1, 4);
                 continue;
             }
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             GBK_ENCODE(c, code)
    -            ;
             else if (TRYMAP_ENC(gb18030ext, code, c))
                 ;
             else {
                 const struct _gb18030_to_unibmp_ranges *utrrange;
     
    -            REQUIRE_OUTBUF(4)
    +            REQUIRE_OUTBUF(4);
     
                 for (utrrange = gb18030_to_unibmp_ranges;
                      utrrange->first != 0;
    @@ -219,13 +226,13 @@
                         tc = c - utrrange->first +
                              utrrange->base;
     
    -                    OUTBYTE4((unsigned char)(tc % 10) + 0x30)
    +                    OUTBYTE4((unsigned char)(tc % 10) + 0x30);
                         tc /= 10;
    -                    OUTBYTE3((unsigned char)(tc % 126) + 0x81)
    +                    OUTBYTE3((unsigned char)(tc % 126) + 0x81);
                         tc /= 126;
    -                    OUTBYTE2((unsigned char)(tc % 10) + 0x30)
    +                    OUTBYTE2((unsigned char)(tc % 10) + 0x30);
                         tc /= 10;
    -                    OUTBYTE1((unsigned char)tc + 0x81)
    +                    OUTBYTE1((unsigned char)tc + 0x81);
     
                         NEXT(1, 4);
                         break;
    @@ -236,11 +243,11 @@
                 continue;
             }
     
    -        OUTBYTE1((code >> 8) | 0x80)
    +        OUTBYTE1((code >> 8) | 0x80);
             if (code & 0x8000)
    -            OUTBYTE2((code & 0xFF)) /* MSB set: GBK or GB18030ext */
    +            OUTBYTE2((code & 0xFF)); /* MSB set: GBK or GB18030ext */
             else
    -            OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
    +            OUTBYTE2((code & 0xFF) | 0x80); /* MSB unset: GB2312 */
     
             NEXT(1, 2);
         }
    @@ -326,7 +333,7 @@
     ENCODER_RESET(hz)
     {
         if (state->i != 0) {
    -        WRITEBYTE2('~', '}')
    +        WRITEBYTE2('~', '}');
             state->i = 0;
             NEXT_OUT(2);
         }
    @@ -341,11 +348,11 @@
     
             if (c < 0x80) {
                 if (state->i == 0) {
    -                WRITEBYTE1((unsigned char)c)
    +                WRITEBYTE1((unsigned char)c);
                     NEXT(1, 1);
                 }
                 else {
    -                WRITEBYTE3('~', '}', (unsigned char)c)
    +                WRITEBYTE3('~', '}', (unsigned char)c);
                     NEXT(1, 3);
                     state->i = 0;
                 }
    @@ -364,12 +371,12 @@
                 return 1;
     
             if (state->i == 0) {
    -            WRITEBYTE4('~', '{', code >> 8, code & 0xff)
    +            WRITEBYTE4('~', '{', code >> 8, code & 0xff);
                 NEXT(1, 4);
                 state->i = 1;
             }
             else {
    -            WRITEBYTE2(code >> 8, code & 0xff)
    +            WRITEBYTE2(code >> 8, code & 0xff);
                 NEXT(1, 2);
             }
         }
    diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
    --- a/Modules/cjkcodecs/_codecs_hk.c
    +++ b/Modules/cjkcodecs/_codecs_hk.c
    @@ -44,14 +44,14 @@
             Py_ssize_t insize;
     
             if (c < 0x80) {
    -            REQUIRE_OUTBUF(1)
    +            REQUIRE_OUTBUF(1);
                 **outbuf = (unsigned char)c;
                 NEXT(1, 1);
                 continue;
             }
     
             insize = 1;
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             if (c < 0x10000) {
                 if (TRYMAP_ENC(big5hkscs_bmp, code, c)) {
    @@ -97,8 +97,8 @@
             else
                 return insize;
     
    -        OUTBYTE1(code >> 8)
    -        OUTBYTE2(code & 0xFF)
    +        OUTBYTE1(code >> 8);
    +        OUTBYTE2(code & 0xFF);
             NEXT(insize, 2);
         }
     
    diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
    --- a/Modules/cjkcodecs/_codecs_iso2022.c
    +++ b/Modules/cjkcodecs/_codecs_iso2022.c
    @@ -141,12 +141,12 @@
     ENCODER_RESET(iso2022)
     {
         if (STATE_GETFLAG(F_SHIFTED)) {
    -        WRITEBYTE1(SI)
    +        WRITEBYTE1(SI);
             NEXT_OUT(1);
             STATE_CLEARFLAG(F_SHIFTED)
         }
         if (STATE_G0 != CHARSET_ASCII) {
    -        WRITEBYTE3(ESC, '(', 'B')
    +        WRITEBYTE3(ESC, '(', 'B');
             NEXT_OUT(3);
             STATE_SETG0(CHARSET_ASCII)
         }
    @@ -163,16 +163,16 @@
     
             if (c < 0x80) {
                 if (STATE_G0 != CHARSET_ASCII) {
    -                WRITEBYTE3(ESC, '(', 'B')
    +                WRITEBYTE3(ESC, '(', 'B');
                     STATE_SETG0(CHARSET_ASCII)
                     NEXT_OUT(3);
                 }
                 if (STATE_GETFLAG(F_SHIFTED)) {
    -                WRITEBYTE1(SI)
    +                WRITEBYTE1(SI);
                     STATE_CLEARFLAG(F_SHIFTED)
                     NEXT_OUT(1);
                 }
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -210,24 +210,24 @@
             switch (dsg->plane) {
             case 0: /* G0 */
                 if (STATE_GETFLAG(F_SHIFTED)) {
    -                WRITEBYTE1(SI)
    +                WRITEBYTE1(SI);
                     STATE_CLEARFLAG(F_SHIFTED)
                     NEXT_OUT(1);
                 }
                 if (STATE_G0 != dsg->mark) {
                     if (dsg->width == 1) {
    -                    WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark))
    +                    WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark));
                         STATE_SETG0(dsg->mark)
                         NEXT_OUT(3);
                     }
                     else if (dsg->mark == CHARSET_JISX0208) {
    -                    WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark))
    +                    WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark));
                         STATE_SETG0(dsg->mark)
                         NEXT_OUT(3);
                     }
                     else {
                         WRITEBYTE4(ESC, '$', '(',
    -                        ESCMARK(dsg->mark))
    +                        ESCMARK(dsg->mark));
                         STATE_SETG0(dsg->mark)
                         NEXT_OUT(4);
                     }
    @@ -236,19 +236,19 @@
             case 1: /* G1 */
                 if (STATE_G1 != dsg->mark) {
                     if (dsg->width == 1) {
    -                    WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark))
    +                    WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark));
                         STATE_SETG1(dsg->mark)
                         NEXT_OUT(3);
                     }
                     else {
                         WRITEBYTE4(ESC, '$', ')',
    -                        ESCMARK(dsg->mark))
    +                        ESCMARK(dsg->mark));
                         STATE_SETG1(dsg->mark)
                         NEXT_OUT(4);
                     }
                 }
                 if (!STATE_GETFLAG(F_SHIFTED)) {
    -                WRITEBYTE1(SO)
    +                WRITEBYTE1(SO);
                     STATE_SETFLAG(F_SHIFTED)
                     NEXT_OUT(1);
                 }
    @@ -259,11 +259,11 @@
             }
     
             if (dsg->width == 1) {
    -            WRITEBYTE1((unsigned char)encoded)
    +            WRITEBYTE1((unsigned char)encoded);
                 NEXT_OUT(1);
             }
             else {
    -            WRITEBYTE2(encoded >> 8, encoded & 0xff)
    +            WRITEBYTE2(encoded >> 8, encoded & 0xff);
                 NEXT_OUT(2);
             }
             NEXT_INCHAR(insize);
    @@ -371,20 +371,21 @@
         return 0;
     }
     
    -#define ISO8859_7_DECODE(c, writer)                            \
    -    if ((c) < 0xa0)                                            \
    -        OUTCHAR(c);                                            \
    -    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) \
    -        OUTCHAR(c);                                            \
    -    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||     \
    -             (0xbffffd77L & (1L << ((c)-0xb4)))))              \
    -        OUTCHAR(0x02d0 + (c));                                 \
    -    else if ((c) == 0xa1)                                      \
    -        OUTCHAR(0x2018);                                       \
    -    else if ((c) == 0xa2)                                      \
    -        OUTCHAR(0x2019);                                       \
    -    else if ((c) == 0xaf)                                      \
    -        OUTCHAR(0x2015);
    +#define ISO8859_7_DECODE(c, writer)                                \
    +    if ((c) < 0xa0) {                                              \
    +        OUTCHAR(c);                                                \
    +    } else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) { \
    +        OUTCHAR(c);                                                \
    +    } else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||       \
    +             (0xbffffd77L & (1L << ((c)-0xb4))))) {                \
    +        OUTCHAR(0x02d0 + (c));                                     \
    +    } else if ((c) == 0xa1) {                                      \
    +        OUTCHAR(0x2018);                                           \
    +    } else if ((c) == 0xa2) {                                      \
    +        OUTCHAR(0x2019);                                           \
    +    } else if ((c) == 0xaf) {                                      \
    +        OUTCHAR(0x2015);                                           \
    +    }
     
     static Py_ssize_t
     iso2022processg2(const void *config, MultibyteCodec_State *state,
    diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
    --- a/Modules/cjkcodecs/_codecs_jp.c
    +++ b/Modules/cjkcodecs/_codecs_jp.c
    @@ -25,33 +25,33 @@
             unsigned char c1, c2;
     
             if (c <= 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
             else if (c >= 0xff61 && c <= 0xff9f) {
    -            WRITEBYTE1(c - 0xfec0)
    +            WRITEBYTE1(c - 0xfec0);
                 NEXT(1, 1);
                 continue;
             }
             else if (c >= 0xf8f0 && c <= 0xf8f3) {
                 /* Windows compatibility */
    -            REQUIRE_OUTBUF(1)
    +            REQUIRE_OUTBUF(1);
                 if (c == 0xf8f0)
    -                OUTBYTE1(0xa0)
    +                OUTBYTE1(0xa0);
                 else
    -                OUTBYTE1(c - 0xfef1 + 0xfd)
    +                OUTBYTE1(c - 0xfef1 + 0xfd);
                 NEXT(1, 1);
                 continue;
             }
     
             if (c > 0xFFFF)
                 return 1;
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             if (TRYMAP_ENC(cp932ext, code, c)) {
    -            OUTBYTE1(code >> 8)
    -            OUTBYTE2(code & 0xff)
    +            OUTBYTE1(code >> 8);
    +            OUTBYTE2(code & 0xff);
             }
             else if (TRYMAP_ENC(jisxcommon, code, c)) {
                 if (code & 0x8000) /* MSB set: JIS X 0212 */
    @@ -62,15 +62,15 @@
                 c2 = code & 0xff;
                 c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
                 c1 = (c1 - 0x21) >> 1;
    -            OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
    -            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
    +            OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
    +            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
             }
             else if (c >= 0xe000 && c < 0xe758) {
                 /* User-defined area */
                 c1 = (Py_UCS4)(c - 0xe000) / 188;
                 c2 = (Py_UCS4)(c - 0xe000) % 188;
    -            OUTBYTE1(c1 + 0xf0)
    -            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
    +            OUTBYTE1(c1 + 0xf0);
    +            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
             }
             else
                 return 1;
    @@ -156,7 +156,7 @@
             Py_ssize_t insize;
     
             if (c < 0x80) {
    -            WRITEBYTE1(c)
    +            WRITEBYTE1(c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -201,7 +201,7 @@
                     ;
                 else if (c >= 0xff61 && c <= 0xff9f) {
                     /* JIS X 0201 half-width katakana */
    -                WRITEBYTE2(0x8e, c - 0xfec0)
    +                WRITEBYTE2(0x8e, c - 0xfec0);
                     NEXT(1, 2);
                     continue;
                 }
    @@ -226,11 +226,11 @@
     
             if (code & 0x8000) {
                 /* Codeset 2 */
    -            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
    +            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
                 NEXT(insize, 3);
             } else {
                 /* Codeset 1 */
    -            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
    +            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
                 NEXT(insize, 2);
             }
         }
    @@ -333,7 +333,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -345,7 +345,7 @@
                 ;
             else if (c >= 0xff61 && c <= 0xff9f) {
                 /* JIS X 0201 half-width katakana */
    -            WRITEBYTE2(0x8e, c - 0xfec0)
    +            WRITEBYTE2(0x8e, c - 0xfec0);
                 NEXT(1, 2);
                 continue;
             }
    @@ -367,11 +367,11 @@
     
             if (code & 0x8000) {
                 /* JIS X 0212 */
    -            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
    +            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
                 NEXT(1, 3);
             } else {
                 /* JIS X 0208 */
    -            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
    +            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
                 NEXT(1, 2);
             }
         }
    @@ -470,14 +470,14 @@
                 code = NOCHAR;
     
             if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
    -            REQUIRE_OUTBUF(1)
    +            REQUIRE_OUTBUF(1);
     
    -            OUTBYTE1((unsigned char)code)
    +            OUTBYTE1((unsigned char)code);
                 NEXT(1, 1);
                 continue;
             }
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             if (code == NOCHAR) {
                 if (TRYMAP_ENC(jisxcommon, code, c))
    @@ -497,8 +497,8 @@
             c2 = code & 0xff;
             c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
             c1 = (c1 - 0x21) >> 1;
    -        OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
    -        OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
    +        OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
    +        OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
             NEXT(1, 2);
         }
     
    @@ -572,12 +572,12 @@
             JISX0201_ENCODE(c, code)
     
             if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
    -            WRITEBYTE1((unsigned char)code)
    +            WRITEBYTE1((unsigned char)code);
                 NEXT(1, 1);
                 continue;
             }
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
             insize = 1;
     
             if (code == NOCHAR) {
    @@ -654,8 +654,8 @@
             if (c1 & 1)
                 c2 += 0x5e;
             c1 >>= 1;
    -        OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
    -        OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
    +        OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1));
    +        OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41));
     
             NEXT(insize, 2);
         }
    diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
    --- a/Modules/cjkcodecs/_codecs_kr.c
    +++ b/Modules/cjkcodecs/_codecs_kr.c
    @@ -38,7 +38,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -46,7 +46,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
             if (TRYMAP_ENC(cp949, code, c))
                 ;
             else
    @@ -54,33 +54,33 @@
     
             if ((code & 0x8000) == 0) {
                 /* KS X 1001 coded character */
    -            OUTBYTE1((code >> 8) | 0x80)
    -            OUTBYTE2((code & 0xFF) | 0x80)
    +            OUTBYTE1((code >> 8) | 0x80);
    +            OUTBYTE2((code & 0xFF) | 0x80);
                 NEXT(1, 2);
             }
             else {          /* Mapping is found in CP949 extension,
                      * but we encode it in KS X 1001:1998 Annex 3,
                      * make-up sequence for EUC-KR. */
     
    -            REQUIRE_OUTBUF(8)
    +            REQUIRE_OUTBUF(8);
     
                 /* syllable composition precedence */
    -            OUTBYTE1(EUCKR_JAMO_FIRSTBYTE)
    -            OUTBYTE2(EUCKR_JAMO_FILLER)
    +            OUTBYTE1(EUCKR_JAMO_FIRSTBYTE);
    +            OUTBYTE2(EUCKR_JAMO_FILLER);
     
                 /* All codepoints in CP949 extension are in unicode
                  * Hangul Syllable area. */
                 assert(0xac00 <= c && c <= 0xd7a3);
                 c -= 0xac00;
     
    -            OUTBYTE3(EUCKR_JAMO_FIRSTBYTE)
    -            OUTBYTE4(u2cgk_choseong[c / 588])
    +            OUTBYTE3(EUCKR_JAMO_FIRSTBYTE);
    +            OUTBYTE4(u2cgk_choseong[c / 588]);
                 NEXT_OUT(4);
     
    -            OUTBYTE1(EUCKR_JAMO_FIRSTBYTE)
    -            OUTBYTE2(u2cgk_jungseong[(c / 28) % 21])
    -            OUTBYTE3(EUCKR_JAMO_FIRSTBYTE)
    -            OUTBYTE4(u2cgk_jongseong[c % 28])
    +            OUTBYTE1(EUCKR_JAMO_FIRSTBYTE);
    +            OUTBYTE2(u2cgk_jungseong[(c / 28) % 21]);
    +            OUTBYTE3(EUCKR_JAMO_FIRSTBYTE);
    +            OUTBYTE4(u2cgk_jongseong[c % 28]);
                 NEXT(1, 4);
             }
         }
    @@ -175,7 +175,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -183,17 +183,17 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
             if (TRYMAP_ENC(cp949, code, c))
                 ;
             else
                 return 1;
     
    -        OUTBYTE1((code >> 8) | 0x80)
    +        OUTBYTE1((code >> 8) | 0x80);
             if (code & 0x8000)
    -            OUTBYTE2(code & 0xFF) /* MSB set: CP949 */
    +            OUTBYTE2(code & 0xFF); /* MSB set: CP949 */
             else
    -            OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */
    +            OUTBYTE2((code & 0xFF) | 0x80); /* MSB unset: ks x 1001 */
             NEXT(1, 2);
         }
     
    @@ -265,7 +265,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -273,7 +273,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             if (c >= 0xac00 && c <= 0xd7a3) {
                 c -= 0xac00;
    @@ -297,8 +297,8 @@
                     t1 = (c1 < 0x4a ? (c1 - 0x21 + 0x1b2) :
                               (c1 - 0x21 + 0x197));
                     t2 = ((t1 & 1) ? 0x5e : 0) + (c2 - 0x21);
    -                OUTBYTE1(t1 >> 1)
    -                OUTBYTE2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)
    +                OUTBYTE1(t1 >> 1);
    +                OUTBYTE2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43);
                     NEXT(1, 2);
                     continue;
                 }
    @@ -308,8 +308,8 @@
             else
                 return 1;
     
    -        OUTBYTE1(code >> 8)
    -        OUTBYTE2(code & 0xff)
    +        OUTBYTE1(code >> 8);
    +        OUTBYTE2(code & 0xff);
             NEXT(1, 2);
         }
     
    diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
    --- a/Modules/cjkcodecs/_codecs_tw.c
    +++ b/Modules/cjkcodecs/_codecs_tw.c
    @@ -18,7 +18,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            REQUIRE_OUTBUF(1)
    +            REQUIRE_OUTBUF(1);
                 **outbuf = (unsigned char)c;
                 NEXT(1, 1);
                 continue;
    @@ -27,15 +27,15 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
     
             if (TRYMAP_ENC(big5, code, c))
                 ;
             else
                 return 1;
     
    -        OUTBYTE1(code >> 8)
    -        OUTBYTE2(code & 0xFF)
    +        OUTBYTE1(code >> 8);
    +        OUTBYTE2(code & 0xFF);
             NEXT(1, 2);
         }
     
    @@ -77,7 +77,7 @@
             DBCHAR code;
     
             if (c < 0x80) {
    -            WRITEBYTE1((unsigned char)c)
    +            WRITEBYTE1((unsigned char)c);
                 NEXT(1, 1);
                 continue;
             }
    @@ -85,7 +85,7 @@
             if (c > 0xFFFF)
                 return 1;
     
    -        REQUIRE_OUTBUF(2)
    +        REQUIRE_OUTBUF(2);
             if (TRYMAP_ENC(cp950ext, code, c))
                 ;
             else if (TRYMAP_ENC(big5, code, c))
    @@ -93,8 +93,8 @@
             else
                 return 1;
     
    -        OUTBYTE1(code >> 8)
    -        OUTBYTE2(code & 0xFF)
    +        OUTBYTE1(code >> 8);
    +        OUTBYTE2(code & 0xFF);
             NEXT(1, 2);
         }
     
    diff --git a/Modules/cjkcodecs/alg_jisx0201.h b/Modules/cjkcodecs/alg_jisx0201.h
    --- a/Modules/cjkcodecs/alg_jisx0201.h
    +++ b/Modules/cjkcodecs/alg_jisx0201.h
    @@ -10,8 +10,9 @@
         }
     
     #define JISX0201_K_ENCODE(c, assi)                      \
    -    if ((c) >= 0xff61 && (c) <= 0xff9f)                 \
    -    { (assi) = (c) - 0xfec0; }
    +    if ((c) >= 0xff61 && (c) <= 0xff9f) {               \
    +        (assi) = (c) - 0xfec0;                          \
    +    }
     
     #define JISX0201_ENCODE(c, assi)                        \
         JISX0201_R_ENCODE(c, assi)                          \
    @@ -35,18 +36,30 @@
         }
     
     #define JISX0201_R_DECODE(c, writer)                    \
    -    if ((c) < 0x5c) OUTCHAR(c);                             \
    -    else if ((c) == 0x5c) OUTCHAR(0x00a5);                  \
    -    else if ((c) < 0x7e) OUTCHAR(c);                        \
    -    else if ((c) == 0x7e) OUTCHAR(0x203e);                  \
    -    else if ((c) == 0x7f) OUTCHAR(0x7f);
    +    if ((c) < 0x5c) {                                   \
    +        OUTCHAR(c);                                     \
    +    }                                                   \
    +    else if ((c) == 0x5c) {                             \
    +        OUTCHAR(0x00a5);                                \
    +    }                                                   \
    +    else if ((c) < 0x7e) {                              \
    +        OUTCHAR(c);                                     \
    +    }                                                   \
    +    else if ((c) == 0x7e) {                             \
    +        OUTCHAR(0x203e);                                \
    +    }                                                   \
    +    else if ((c) == 0x7f) {                             \
    +        OUTCHAR(0x7f);                                  \
    +    }
     
     #define JISX0201_K_DECODE(c, writer)                    \
    -    if ((c) >= 0xa1 && (c) <= 0xdf)                     \
    -        OUTCHAR(0xfec0 + (c));
    +    if ((c) >= 0xa1 && (c) <= 0xdf) {                   \
    +        OUTCHAR(0xfec0 + (c));                          \
    +    }
     #define JISX0201_K_DECODE_CHAR(c, assi)                 \
    -    if ((c) >= 0xa1 && (c) <= 0xdf)                     \
    -        (assi) = 0xfec0 + (c);
    +    if ((c) >= 0xa1 && (c) <= 0xdf) {                   \
    +        (assi) = 0xfec0 + (c);                          \
    +    }
     #define JISX0201_DECODE(c, writer)                      \
         JISX0201_R_DECODE(c, writer)                        \
         else JISX0201_K_DECODE(c, writer)
    diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
    --- a/Modules/cjkcodecs/cjkcodecs.h
    +++ b/Modules/cjkcodecs/cjkcodecs.h
    @@ -108,24 +108,26 @@
         } while (0)
     #define NEXT(i, o)                              \
         do {                                        \
    -        NEXT_INCHAR(i);                        \
    -        NEXT_OUT(o);                        \
    +        NEXT_INCHAR(i);                         \
    +        NEXT_OUT(o);                            \
         } while (0)
     
     #define REQUIRE_INBUF(n)                        \
         if (inleft < (n))                           \
             return MBERR_TOOFEW;
     #define REQUIRE_OUTBUF(n)                       \
    -    if (outleft < (n))                          \
    -        return MBERR_TOOSMALL;
    +    do {                                        \
    +        if (outleft < (n))                      \
    +            return MBERR_TOOSMALL;              \
    +    } while (0)
     
     #define INBYTE1 ((*inbuf)[0])
     #define INBYTE2 ((*inbuf)[1])
     #define INBYTE3 ((*inbuf)[2])
     #define INBYTE4 ((*inbuf)[3])
     
    -#define INCHAR1 PyUnicode_READ(kind, data, *inpos)
    -#define INCHAR2 PyUnicode_READ(kind, data, *inpos + 1)
    +#define INCHAR1 (PyUnicode_READ(kind, data, *inpos))
    +#define INCHAR2 (PyUnicode_READ(kind, data, *inpos + 1))
     
     #define OUTCHAR(c)                                                         \
         do {                                                                   \
    @@ -138,35 +140,47 @@
             Py_UCS4 _c1 = (c1);                                                \
             Py_UCS4 _c2 = (c2);                                                \
             if (_PyUnicodeWriter_Prepare(writer, 2, Py_MAX(_c1, c2)) < 0)      \
    -            return MBERR_EXCEPTION;                                         \
    +            return MBERR_EXCEPTION;                                        \
             PyUnicode_WRITE(writer->kind, writer->data, writer->pos, _c1);     \
             PyUnicode_WRITE(writer->kind, writer->data, writer->pos + 1, _c2); \
             writer->pos += 2;                                                  \
         } while (0)
     
    -#define OUTBYTE1(c) ((*outbuf)[0]) = (c);
    -#define OUTBYTE2(c) ((*outbuf)[1]) = (c);
    -#define OUTBYTE3(c) ((*outbuf)[2]) = (c);
    -#define OUTBYTE4(c) ((*outbuf)[3]) = (c);
    +#define OUTBYTE1(c) \
    +    do { ((*outbuf)[0]) = (c); } while (0)
    +#define OUTBYTE2(c) \
    +    do { ((*outbuf)[1]) = (c); } while (0)
    +#define OUTBYTE3(c) \
    +    do { ((*outbuf)[2]) = (c); } while (0)
    +#define OUTBYTE4(c) \
    +    do { ((*outbuf)[3]) = (c); } while (0)
     
     #define WRITEBYTE1(c1)              \
    -    REQUIRE_OUTBUF(1)           \
    -    (*outbuf)[0] = (c1);
    +    do {                            \
    +        REQUIRE_OUTBUF(1);          \
    +        (*outbuf)[0] = (c1);        \
    +    } while (0)
     #define WRITEBYTE2(c1, c2)          \
    -    REQUIRE_OUTBUF(2)           \
    -    (*outbuf)[0] = (c1);        \
    -    (*outbuf)[1] = (c2);
    +    do {                            \
    +        REQUIRE_OUTBUF(2);          \
    +        (*outbuf)[0] = (c1);        \
    +        (*outbuf)[1] = (c2);        \
    +    } while (0)
     #define WRITEBYTE3(c1, c2, c3)      \
    -    REQUIRE_OUTBUF(3)           \
    -    (*outbuf)[0] = (c1);        \
    -    (*outbuf)[1] = (c2);        \
    -    (*outbuf)[2] = (c3);
    +    do {                            \
    +        REQUIRE_OUTBUF(3);          \
    +        (*outbuf)[0] = (c1);        \
    +        (*outbuf)[1] = (c2);        \
    +        (*outbuf)[2] = (c3);        \
    +    } while (0)
     #define WRITEBYTE4(c1, c2, c3, c4)  \
    -    REQUIRE_OUTBUF(4)           \
    -    (*outbuf)[0] = (c1);        \
    -    (*outbuf)[1] = (c2);        \
    -    (*outbuf)[2] = (c3);        \
    -    (*outbuf)[3] = (c4);
    +    do {                            \
    +        REQUIRE_OUTBUF(4);          \
    +        (*outbuf)[0] = (c1);        \
    +        (*outbuf)[1] = (c2);        \
    +        (*outbuf)[2] = (c3);        \
    +        (*outbuf)[3] = (c4);        \
    +    } while (0)
     
     #define _TRYMAP_ENC(m, assi, val)                               \
         ((m)->map != NULL && (val) >= (m)->bottom &&                \
    diff --git a/Modules/cjkcodecs/emu_jisx0213_2000.h b/Modules/cjkcodecs/emu_jisx0213_2000.h
    --- a/Modules/cjkcodecs/emu_jisx0213_2000.h
    +++ b/Modules/cjkcodecs/emu_jisx0213_2000.h
    @@ -11,17 +11,20 @@
                         (c) == 0x525D || (c) == 0x541E ||                   \
                         (c) == 0x5653 || (c) == 0x59F8 ||                   \
                         (c) == 0x5C5B || (c) == 0x5E77 ||                   \
    -                    (c) == 0x7626 || (c) == 0x7E6B))                    \
    +                    (c) == 0x7626 || (c) == 0x7E6B)) {                  \
             return EMULATE_JISX0213_2000_ENCODE_INVALID;                    \
    -    else if (config == (void *)2000 && (c) == 0x9B1D)                   \
    +    }                                                                   \
    +    else if (config == (void *)2000 && (c) == 0x9B1D) {                 \
             (assi) = 0x8000 | 0x7d3b;                                       \
    +    }
     
     #define EMULATE_JISX0213_2000_ENCODE_EMP(assi, c)                       \
    -    if (config == (void *)2000 && (c) == 0x20B9F)                       \
    -        return EMULATE_JISX0213_2000_ENCODE_INVALID;
    +    if (config == (void *)2000 && (c) == 0x20B9F) {                     \
    +        return EMULATE_JISX0213_2000_ENCODE_INVALID;                    \
    +    }
     
     #ifndef EMULATE_JISX0213_2000_DECODE_INVALID
    -#define EMULATE_JISX0213_2000_DECODE_INVALID 2
    +#  define EMULATE_JISX0213_2000_DECODE_INVALID 2
     #endif
     
     #define EMULATE_JISX0213_2000_DECODE_PLANE1(assi, c1, c2)               \
    @@ -35,12 +38,17 @@
                          ((c1) == 0x7E && (c2) == 0x7B) ||                  \
                          ((c1) == 0x7E && (c2) == 0x7C) ||                  \
                          ((c1) == 0x7E && (c2) == 0x7D) ||                  \
    -                     ((c1) == 0x7E && (c2) == 0x7E)))                   \
    -        return EMULATE_JISX0213_2000_DECODE_INVALID;
    +                     ((c1) == 0x7E && (c2) == 0x7E))) {                 \
    +        return EMULATE_JISX0213_2000_DECODE_INVALID;                    \
    +    }
     
    -#define EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c1, c2)               \
    -    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B)         \
    -        OUTCHAR(0x9B1D);
    -#define EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(assi, c1, c2)               \
    -    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B)         \
    -        (assi) = 0x9B1D;
    +#define EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c1, c2)             \
    +    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B) {       \
    +        OUTCHAR(0x9B1D);                                                \
    +    }
    +
    +#define EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(assi, c1, c2)          \
    +    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B) {       \
    +        (assi) = 0x9B1D;                                                \
    +    }
    +
    diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h
    --- a/Modules/cjkcodecs/multibytecodec.h
    +++ b/Modules/cjkcodecs/multibytecodec.h
    @@ -118,11 +118,11 @@
     #define ERROR_IGNORE            (PyObject *)(2)
     #define ERROR_REPLACE           (PyObject *)(3)
     #define ERROR_ISCUSTOM(p)       ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
    -#define ERROR_DECREF(p) do {                    \
    -    if (p != NULL && ERROR_ISCUSTOM(p)) {       \
    -        Py_DECREF(p);                           \
    -    }                                           \
    -} while (0);
    +#define ERROR_DECREF(p)                             \
    +    do {                                            \
    +        if (p != NULL && ERROR_ISCUSTOM(p))         \
    +            Py_DECREF(p);                           \
    +    } while (0);
     
     #define MBENC_FLUSH             0x0001 /* encode all characters encodable */
     #define MBENC_MAX               MBENC_FLUSH
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:02:29 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:02:29 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_CJK_codecs=3A_less_magical?=
     =?utf-8?q?_macros=2C_semicolon_is_now_explicit?=
    Message-ID: <3d7tK14x44z7Ljs@mail.python.org>
    
    http://hg.python.org/cpython/rev/6b86eb127030
    changeset:   86714:6b86eb127030
    user:        Victor Stinner 
    date:        Tue Oct 29 00:59:44 2013 +0100
    summary:
      CJK codecs: less magical macros, semicolon is now explicit
    
    files:
      Modules/cjkcodecs/_codecs_cn.c        |   27 +-
      Modules/cjkcodecs/_codecs_hk.c        |    2 +-
      Modules/cjkcodecs/_codecs_iso2022.c   |  138 +++++++------
      Modules/cjkcodecs/_codecs_jp.c        |   21 +-
      Modules/cjkcodecs/_codecs_kr.c        |   15 +-
      Modules/cjkcodecs/_codecs_tw.c        |    4 +-
      Modules/cjkcodecs/cjkcodecs.h         |    7 +-
      Modules/cjkcodecs/emu_jisx0213_2000.h |    2 +-
      8 files changed, 115 insertions(+), 101 deletions(-)
    
    
    diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
    --- a/Modules/cjkcodecs/_codecs_cn.c
    +++ b/Modules/cjkcodecs/_codecs_cn.c
    @@ -40,14 +40,15 @@
             OUTCHAR(decoded);                                           \
         }
     
    -#define GBK_ENCODE(code, assi) \
    -    if ((code) == 0x2014) { \
    -        (assi) = 0xa1aa; \
    -    } else if ((code) == 0x2015) { \
    -        (assi) = 0xa844; \
    -    } else if ((code) == 0x00b7) { \
    -        (assi) = 0xa1a4; \
    +#define GBK_ENCODE(code, assi)                                         \
    +    if ((code) == 0x2014) {                                            \
    +        (assi) = 0xa1aa;                                               \
    +    } else if ((code) == 0x2015) {                                     \
    +        (assi) = 0xa844;                                               \
    +    } else if ((code) == 0x00b7) {                                     \
    +        (assi) = 0xa1a4;                                               \
         } else if ((code) != 0x30fb && TRYMAP_ENC(gbcommon, assi, code)) { \
    +        ;                                                              \
         }
     
     /*
    @@ -98,7 +99,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
             if (TRYMAP_DEC(gb2312, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
                 OUTCHAR(decoded);
                 NEXT_IN(2);
    @@ -159,7 +160,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
     
             GBK_DECODE(c, INBYTE2, writer)
             else
    @@ -267,7 +268,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
     
             c2 = INBYTE2;
             if (c2 >= 0x30 && c2 <= 0x39) { /* 4 bytes seq */
    @@ -275,7 +276,7 @@
                 unsigned char c3, c4;
                 Py_UCS4 lseq;
     
    -            REQUIRE_INBUF(4)
    +            REQUIRE_INBUF(4);
                 c3 = INBYTE3;
                 c4 = INBYTE4;
                 if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)
    @@ -405,7 +406,7 @@
             if (c == '~') {
                 unsigned char c2 = INBYTE2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 if (c2 == '~') {
                     OUTCHAR('~');
                     NEXT_IN(2);
    @@ -431,7 +432,7 @@
                 NEXT_IN(1);
             }
             else { /* GB mode */
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 if (TRYMAP_DEC(gb2312, decoded, c, INBYTE2)) {
                     OUTCHAR(decoded);
                     NEXT_IN(2);
    diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
    --- a/Modules/cjkcodecs/_codecs_hk.c
    +++ b/Modules/cjkcodecs/_codecs_hk.c
    @@ -119,7 +119,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
     
             if (0xc6 > c || c > 0xc8 || (c < 0xc7 && INBYTE2 < 0xa1)) {
                 if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
    diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
    --- a/Modules/cjkcodecs/_codecs_iso2022.c
    +++ b/Modules/cjkcodecs/_codecs_iso2022.c
    @@ -73,7 +73,7 @@
     #define F_SHIFTED               0x01
     #define F_ESCTHROUGHOUT         0x02
     
    -#define STATE_SETG(dn, v)       ((state)->c[dn]) = (v);
    +#define STATE_SETG(dn, v)       do { ((state)->c[dn]) = (v); } while (0)
     #define STATE_GETG(dn)          ((state)->c[dn])
     
     #define STATE_G0                STATE_GETG(0)
    @@ -85,10 +85,10 @@
     #define STATE_SETG2(v)          STATE_SETG(2, v)
     #define STATE_SETG3(v)          STATE_SETG(3, v)
     
    -#define STATE_SETFLAG(f)        ((state)->c[4]) |= (f);
    +#define STATE_SETFLAG(f)        do { ((state)->c[4]) |= (f); } while (0)
     #define STATE_GETFLAG(f)        ((state)->c[4] & (f))
    -#define STATE_CLEARFLAG(f)      ((state)->c[4]) &= ~(f);
    -#define STATE_CLEARFLAGS()      ((state)->c[4]) = 0;
    +#define STATE_CLEARFLAG(f)      do { ((state)->c[4]) &= ~(f); } while (0)
    +#define STATE_CLEARFLAGS()      do { ((state)->c[4]) = 0; } while (0)
     
     #define ISO2022_CONFIG          ((const struct iso2022_config *)config)
     #define CONFIG_ISSET(flag)      (ISO2022_CONFIG->flags & (flag))
    @@ -132,9 +132,9 @@
     
     ENCODER_INIT(iso2022)
     {
    -    STATE_CLEARFLAGS()
    -    STATE_SETG0(CHARSET_ASCII)
    -    STATE_SETG1(CHARSET_ASCII)
    +    STATE_CLEARFLAGS();
    +    STATE_SETG0(CHARSET_ASCII);
    +    STATE_SETG1(CHARSET_ASCII);
         return 0;
     }
     
    @@ -143,12 +143,12 @@
         if (STATE_GETFLAG(F_SHIFTED)) {
             WRITEBYTE1(SI);
             NEXT_OUT(1);
    -        STATE_CLEARFLAG(F_SHIFTED)
    +        STATE_CLEARFLAG(F_SHIFTED);
         }
         if (STATE_G0 != CHARSET_ASCII) {
             WRITEBYTE3(ESC, '(', 'B');
             NEXT_OUT(3);
    -        STATE_SETG0(CHARSET_ASCII)
    +        STATE_SETG0(CHARSET_ASCII);
         }
         return 0;
     }
    @@ -164,12 +164,12 @@
             if (c < 0x80) {
                 if (STATE_G0 != CHARSET_ASCII) {
                     WRITEBYTE3(ESC, '(', 'B');
    -                STATE_SETG0(CHARSET_ASCII)
    +                STATE_SETG0(CHARSET_ASCII);
                     NEXT_OUT(3);
                 }
                 if (STATE_GETFLAG(F_SHIFTED)) {
                     WRITEBYTE1(SI);
    -                STATE_CLEARFLAG(F_SHIFTED)
    +                STATE_CLEARFLAG(F_SHIFTED);
                     NEXT_OUT(1);
                 }
                 WRITEBYTE1((unsigned char)c);
    @@ -211,24 +211,24 @@
             case 0: /* G0 */
                 if (STATE_GETFLAG(F_SHIFTED)) {
                     WRITEBYTE1(SI);
    -                STATE_CLEARFLAG(F_SHIFTED)
    +                STATE_CLEARFLAG(F_SHIFTED);
                     NEXT_OUT(1);
                 }
                 if (STATE_G0 != dsg->mark) {
                     if (dsg->width == 1) {
                         WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark));
    -                    STATE_SETG0(dsg->mark)
    +                    STATE_SETG0(dsg->mark);
                         NEXT_OUT(3);
                     }
                     else if (dsg->mark == CHARSET_JISX0208) {
                         WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark));
    -                    STATE_SETG0(dsg->mark)
    +                    STATE_SETG0(dsg->mark);
                         NEXT_OUT(3);
                     }
                     else {
                         WRITEBYTE4(ESC, '$', '(',
                             ESCMARK(dsg->mark));
    -                    STATE_SETG0(dsg->mark)
    +                    STATE_SETG0(dsg->mark);
                         NEXT_OUT(4);
                     }
                 }
    @@ -237,19 +237,18 @@
                 if (STATE_G1 != dsg->mark) {
                     if (dsg->width == 1) {
                         WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark));
    -                    STATE_SETG1(dsg->mark)
    +                    STATE_SETG1(dsg->mark);
                         NEXT_OUT(3);
                     }
                     else {
    -                    WRITEBYTE4(ESC, '$', ')',
    -                        ESCMARK(dsg->mark));
    -                    STATE_SETG1(dsg->mark)
    +                    WRITEBYTE4(ESC, '$', ')', ESCMARK(dsg->mark));
    +                    STATE_SETG1(dsg->mark);
                         NEXT_OUT(4);
                     }
                 }
                 if (!STATE_GETFLAG(F_SHIFTED)) {
                     WRITEBYTE1(SO);
    -                STATE_SETFLAG(F_SHIFTED)
    +                STATE_SETFLAG(F_SHIFTED);
                     NEXT_OUT(1);
                 }
                 break;
    @@ -274,17 +273,17 @@
     
     DECODER_INIT(iso2022)
     {
    -    STATE_CLEARFLAGS()
    -    STATE_SETG0(CHARSET_ASCII)
    -    STATE_SETG1(CHARSET_ASCII)
    -    STATE_SETG2(CHARSET_ASCII)
    +    STATE_CLEARFLAGS();
    +    STATE_SETG0(CHARSET_ASCII);
    +    STATE_SETG1(CHARSET_ASCII);
    +    STATE_SETG2(CHARSET_ASCII);
         return 0;
     }
     
     DECODER_RESET(iso2022)
     {
    -    STATE_SETG0(CHARSET_ASCII)
    -    STATE_CLEARFLAG(F_SHIFTED)
    +    STATE_SETG0(CHARSET_ASCII);
    +    STATE_CLEARFLAG(F_SHIFTED);
         return 0;
     }
     
    @@ -303,8 +302,9 @@
                 break;
             }
             else if (CONFIG_ISSET(USE_JISX0208_EXT) && i+1 < *inleft &&
    -                 (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@')
    +                 (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@') {
                 i += 2;
    +        }
         }
     
         if (i >= MAX_ESCSEQLEN)
    @@ -358,14 +358,15 @@
         if (charset != CHARSET_ASCII) {
             const struct iso2022_designation *dsg;
     
    -        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++)
    +        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
                 if (dsg->mark == charset)
                     break;
    +        }
             if (!dsg->mark)
                 return esclen;
         }
     
    -    STATE_SETG(designation, charset)
    +    STATE_SETG(designation, charset);
         *inleft -= esclen;
         (*inbuf) += esclen;
         return 0;
    @@ -433,14 +434,14 @@
                 OUTCHAR(c); /* assume as ISO-8859-1 */
                 NEXT_IN(1);
                 if (IS_ESCEND(c)) {
    -                STATE_CLEARFLAG(F_ESCTHROUGHOUT)
    +                STATE_CLEARFLAG(F_ESCTHROUGHOUT);
                 }
                 continue;
             }
     
             switch (c) {
             case ESC:
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 if (IS_ISO2022ESC(INBYTE2)) {
                     err = iso2022processesc(config, state,
                                             inbuf, &inleft);
    @@ -448,7 +449,7 @@
                         return err;
                 }
                 else if (CONFIG_ISSET(USE_G2) && INBYTE2 == 'N') {/* SS2 */
    -                REQUIRE_INBUF(3)
    +                REQUIRE_INBUF(3);
                     err = iso2022processg2(config, state,
                                            inbuf, &inleft, writer);
                     if (err != 0)
    @@ -456,24 +457,24 @@
                 }
                 else {
                     OUTCHAR(ESC);
    -                STATE_SETFLAG(F_ESCTHROUGHOUT)
    +                STATE_SETFLAG(F_ESCTHROUGHOUT);
                     NEXT_IN(1);
                 }
                 break;
             case SI:
                 if (CONFIG_ISSET(NO_SHIFT))
                     goto bypass;
    -            STATE_CLEARFLAG(F_SHIFTED)
    +            STATE_CLEARFLAG(F_SHIFTED);
                 NEXT_IN(1);
                 break;
             case SO:
                 if (CONFIG_ISSET(NO_SHIFT))
                     goto bypass;
    -            STATE_SETFLAG(F_SHIFTED)
    +            STATE_SETFLAG(F_SHIFTED);
                 NEXT_IN(1);
                 break;
             case LF:
    -            STATE_CLEARFLAG(F_SHIFTED)
    +            STATE_CLEARFLAG(F_SHIFTED);
                 OUTCHAR(LF);
                 NEXT_IN(1);
                 break;
    @@ -493,38 +494,41 @@
                         charset = STATE_G0;
     
                     if (charset == CHARSET_ASCII) {
    -bypass:                                 OUTCHAR(c);
    -                                        NEXT_IN(1);
    -                                        break;
    -                                }
    +bypass:
    +                    OUTCHAR(c);
    +                    NEXT_IN(1);
    +                    break;
    +                }
     
    -                                if (dsgcache != NULL &&
    -                                    dsgcache->mark == charset)
    -                                        dsg = dsgcache;
    -                                else {
    -                                        for (dsg = CONFIG_DESIGNATIONS;
    -                                             dsg->mark != charset
    +                if (dsgcache != NULL &&
    +                    dsgcache->mark == charset)
    +                        dsg = dsgcache;
    +                else {
    +                    for (dsg = CONFIG_DESIGNATIONS;
    +                         dsg->mark != charset
     #ifdef Py_DEBUG
    -                                                && dsg->mark != '\0'
    +                            && dsg->mark != '\0'
     #endif
    -                                             ;dsg++)
    -                                                /* noop */;
    -                                        assert(dsg->mark != '\0');
    -                                        dsgcache = dsg;
    -                                }
    +                         ; dsg++)
    +                    {
    +                        /* noop */
    +                    }
    +                    assert(dsg->mark != '\0');
    +                    dsgcache = dsg;
    +                }
     
    -                                REQUIRE_INBUF(dsg->width)
    -                                decoded = dsg->decoder(*inbuf);
    -                                if (decoded == MAP_UNMAPPABLE)
    -                                        return dsg->width;
    +                REQUIRE_INBUF(dsg->width);
    +                decoded = dsg->decoder(*inbuf);
    +                if (decoded == MAP_UNMAPPABLE)
    +                    return dsg->width;
     
    -                                if (decoded < 0x10000) {
    -                                        OUTCHAR(decoded);
    -                                }
    -                                else if (decoded < 0x30000) {
    -                                        OUTCHAR(decoded);
    -                                }
    -                                else { /* JIS X 0213 pairs */
    +                if (decoded < 0x10000) {
    +                    OUTCHAR(decoded);
    +                }
    +                else if (decoded < 0x30000) {
    +                    OUTCHAR(decoded);
    +                }
    +                else { /* JIS X 0213 pairs */
                         OUTCHAR2(decoded >> 16, decoded & 0xffff);
                     }
                     NEXT_IN(dsg->width);
    @@ -800,9 +804,10 @@
             else
                 return MAP_UNMAPPABLE;
             return coded;
    +
         case 2: /* second character of unicode pair */
             coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1],
    -                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);
    +                                jisx0213_pair_encmap, JISX0213_ENCPAIRS);
             if (coded == DBCINV) {
                 *length = 1;
                 coded = find_pairencmap((ucs2_t)data[0], 0,
    @@ -812,14 +817,17 @@
             }
             else
                 return coded;
    +
         case -1: /* flush unterminated */
             *length = 1;
             coded = find_pairencmap((ucs2_t)data[0], 0,
    -                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);
    +                                jisx0213_pair_encmap, JISX0213_ENCPAIRS);
             if (coded == DBCINV)
                 return MAP_UNMAPPABLE;
             else
                 return coded;
    +        break;
    +
         default:
             return MAP_UNMAPPABLE;
         }
    diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
    --- a/Modules/cjkcodecs/_codecs_jp.c
    +++ b/Modules/cjkcodecs/_codecs_jp.c
    @@ -107,7 +107,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
             c2 = INBYTE2;
     
             if (TRYMAP_DEC(cp932ext, decoded, c, c2))
    @@ -254,7 +254,7 @@
                 /* JIS X 0201 half-width katakana */
                 unsigned char c2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c2 = INBYTE2;
                 if (c2 >= 0xa1 && c2 <= 0xdf) {
                     OUTCHAR(0xfec0 + c2);
    @@ -266,7 +266,7 @@
             else if (c == 0x8f) {
                 unsigned char c2, c3;
     
    -            REQUIRE_INBUF(3)
    +            REQUIRE_INBUF(3);
                 c2 = INBYTE2 ^ 0x80;
                 c3 = INBYTE3 ^ 0x80;
     
    @@ -288,7 +288,7 @@
             else {
                 unsigned char c2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c ^= 0x80;
                 c2 = INBYTE2 ^ 0x80;
     
    @@ -395,7 +395,7 @@
                 /* JIS X 0201 half-width katakana */
                 unsigned char c2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c2 = INBYTE2;
                 if (c2 >= 0xa1 && c2 <= 0xdf) {
                     OUTCHAR(0xfec0 + c2);
    @@ -407,7 +407,7 @@
             else if (c == 0x8f) {
                 unsigned char c2, c3;
     
    -            REQUIRE_INBUF(3)
    +            REQUIRE_INBUF(3);
                 c2 = INBYTE2;
                 c3 = INBYTE3;
                 /* JIS X 0212 */
    @@ -421,7 +421,7 @@
             else {
                 unsigned char c2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c2 = INBYTE2;
                 /* JIS X 0208 */
     #ifndef STRICT_BUILD
    @@ -521,7 +521,7 @@
             else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
                 unsigned char c1, c2;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c2 = INBYTE2;
                 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                     return 1;
    @@ -638,7 +638,8 @@
             c1 = code >> 8;
             c2 = (code & 0xff) - 0x21;
     
    -        if (c1 & 0x80) { /* Plane 2 */
    +        if (c1 & 0x80) {
    +            /* Plane 2 */
                 if (c1 >= 0xee)
                     c1 -= 0x87;
                 else if (c1 >= 0xac || c1 == 0xa8)
    @@ -673,7 +674,7 @@
                 unsigned char c1, c2;
                 Py_UCS4 code, decoded;
     
    -            REQUIRE_INBUF(2)
    +            REQUIRE_INBUF(2);
                 c2 = INBYTE2;
                 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
                     return 1;
    diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
    --- a/Modules/cjkcodecs/_codecs_kr.c
    +++ b/Modules/cjkcodecs/_codecs_kr.c
    @@ -58,9 +58,10 @@
                 OUTBYTE2((code & 0xFF) | 0x80);
                 NEXT(1, 2);
             }
    -        else {          /* Mapping is found in CP949 extension,
    -                 * but we encode it in KS X 1001:1998 Annex 3,
    -                 * make-up sequence for EUC-KR. */
    +        else {
    +            /* Mapping is found in CP949 extension,
    +               but we encode it in KS X 1001:1998 Annex 3,
    +               make-up sequence for EUC-KR. */
     
                 REQUIRE_OUTBUF(8);
     
    @@ -115,14 +116,14 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
     
             if (c == EUCKR_JAMO_FIRSTBYTE &&
                 INBYTE2 == EUCKR_JAMO_FILLER) {
                 /* KS X 1001:1998 Annex 3 make-up sequence */
                 DBCHAR cho, jung, jong;
     
    -            REQUIRE_INBUF(8)
    +            REQUIRE_INBUF(8);
                 if ((*inbuf)[2] != EUCKR_JAMO_FIRSTBYTE ||
                     (*inbuf)[4] != EUCKR_JAMO_FIRSTBYTE ||
                     (*inbuf)[6] != EUCKR_JAMO_FIRSTBYTE)
    @@ -212,7 +213,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
             if (TRYMAP_DEC(ksx1001, decoded, c ^ 0x80, INBYTE2 ^ 0x80))
                 OUTCHAR(decoded);
             else if (TRYMAP_DEC(cp949ext, decoded, c, INBYTE2))
    @@ -369,7 +370,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
             c2 = INBYTE2;
     
             if (c < 0xd8) {
    diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
    --- a/Modules/cjkcodecs/_codecs_tw.c
    +++ b/Modules/cjkcodecs/_codecs_tw.c
    @@ -54,7 +54,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
             if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
                 OUTCHAR(decoded);
                 NEXT_IN(2);
    @@ -113,7 +113,7 @@
                 continue;
             }
     
    -        REQUIRE_INBUF(2)
    +        REQUIRE_INBUF(2);
     
             if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
                 OUTCHAR(decoded);
    diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
    --- a/Modules/cjkcodecs/cjkcodecs.h
    +++ b/Modules/cjkcodecs/cjkcodecs.h
    @@ -113,8 +113,11 @@
         } while (0)
     
     #define REQUIRE_INBUF(n)                        \
    -    if (inleft < (n))                           \
    -        return MBERR_TOOFEW;
    +    do {                                        \
    +        if (inleft < (n))                       \
    +            return MBERR_TOOFEW;                \
    +    } while (0)
    +
     #define REQUIRE_OUTBUF(n)                       \
         do {                                        \
             if (outleft < (n))                      \
    diff --git a/Modules/cjkcodecs/emu_jisx0213_2000.h b/Modules/cjkcodecs/emu_jisx0213_2000.h
    --- a/Modules/cjkcodecs/emu_jisx0213_2000.h
    +++ b/Modules/cjkcodecs/emu_jisx0213_2000.h
    @@ -2,7 +2,7 @@
      * standards. */
     
     #ifndef EMULATE_JISX0213_2000_ENCODE_INVALID
    -#define EMULATE_JISX0213_2000_ENCODE_INVALID 1
    +#  define EMULATE_JISX0213_2000_ENCODE_INVALID 1
     #endif
     
     #define EMULATE_JISX0213_2000_ENCODE_BMP(assi, c)                       \
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:19:58 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:19:58 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Add_a_ne?=
     =?utf-8?q?w_PyFrame=5FFastToLocalsWithError=28=29_function_to_handle?=
    Message-ID: <3d7tjB3VP0zM9M@mail.python.org>
    
    http://hg.python.org/cpython/rev/4ef4578db38a
    changeset:   86715:4ef4578db38a
    user:        Victor Stinner 
    date:        Tue Oct 29 01:19:37 2013 +0100
    summary:
      Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
    exceptions when merging fast locals into f_locals of a frame.
    PyEval_GetLocals() now raises an exception and return NULL on failure.
    
    files:
      Include/frameobject.h |   2 +
      Misc/NEWS             |   4 +
      Objects/frameobject.c |  77 ++++++++++++++++++++----------
      Objects/object.c      |   7 +-
      Python/bltinmodule.c  |  17 +++---
      Python/ceval.c        |  19 +++++--
      Python/sysmodule.c    |   7 ++-
      7 files changed, 87 insertions(+), 46 deletions(-)
    
    
    diff --git a/Include/frameobject.h b/Include/frameobject.h
    --- a/Include/frameobject.h
    +++ b/Include/frameobject.h
    @@ -78,6 +78,8 @@
     /* Conversions between "fast locals" and locals in dictionary */
     
     PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int);
    +
    +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f);
     PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
     
     PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,10 @@
     Core and Builtins
     -----------------
     
    +- Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
    +  exceptions when merging fast locals into f_locals of a frame.
    +  PyEval_GetLocals() now raises an exception and return NULL on failure.
    +
     - Issue #19369: Optimized the usage of __length_hint__().
     
     - Issue #18603: Ensure that PyOS_mystricmp and PyOS_mystrnicmp are in the
    diff --git a/Objects/frameobject.c b/Objects/frameobject.c
    --- a/Objects/frameobject.c
    +++ b/Objects/frameobject.c
    @@ -21,7 +21,8 @@
     static PyObject *
     frame_getlocals(PyFrameObject *f, void *closure)
     {
    -    PyFrame_FastToLocals(f);
    +    if (PyFrame_FastToLocalsWithError(f) < 0)
    +        return NULL;
         Py_INCREF(f->f_locals);
         return f->f_locals;
     }
    @@ -772,12 +773,9 @@
        If deref is true, then the values being copied are cell variables
        and the value is extracted from the cell variable before being put
        in dict.
    -
    -   Exceptions raised while modifying the dict are silently ignored,
    -   because there is no good way to report them.
      */
     
    -static void
    +static int
     map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
                 int deref)
     {
    @@ -794,14 +792,19 @@
                 value = PyCell_GET(value);
             }
             if (value == NULL) {
    -            if (PyObject_DelItem(dict, key) != 0)
    -                PyErr_Clear();
    +            if (PyObject_DelItem(dict, key) != 0) {
    +                if (PyErr_ExceptionMatches(PyExc_KeyError))
    +                    PyErr_Clear();
    +                else
    +                    return -1;
    +            }
             }
             else {
                 if (PyObject_SetItem(dict, key, value) != 0)
    -                PyErr_Clear();
    +                return -1;
             }
         }
    +    return 0;
     }
     
     /* Copy values from the "locals" dict into the fast locals.
    @@ -858,42 +861,49 @@
         }
     }
     
    -void
    -PyFrame_FastToLocals(PyFrameObject *f)
    +int
    +PyFrame_FastToLocalsWithError(PyFrameObject *f)
     {
         /* Merge fast locals into f->f_locals */
         PyObject *locals, *map;
         PyObject **fast;
    -    PyObject *error_type, *error_value, *error_traceback;
         PyCodeObject *co;
         Py_ssize_t j;
         Py_ssize_t ncells, nfreevars;
    -    if (f == NULL)
    -        return;
    +
    +    if (f == NULL) {
    +        PyErr_BadInternalCall();
    +        return -1;
    +    }
         locals = f->f_locals;
         if (locals == NULL) {
             locals = f->f_locals = PyDict_New();
    -        if (locals == NULL) {
    -            PyErr_Clear(); /* Can't report it :-( */
    -            return;
    -        }
    +        if (locals == NULL)
    +            return -1;
         }
         co = f->f_code;
         map = co->co_varnames;
    -    if (!PyTuple_Check(map))
    -        return;
    -    PyErr_Fetch(&error_type, &error_value, &error_traceback);
    +    if (!PyTuple_Check(map)) {
    +        PyErr_Format(PyExc_SystemError,
    +                     "co_varnames must be a tuple, not %s",
    +                     Py_TYPE(map)->tp_name);
    +        return -1;
    +    }
         fast = f->f_localsplus;
         j = PyTuple_GET_SIZE(map);
         if (j > co->co_nlocals)
             j = co->co_nlocals;
    -    if (co->co_nlocals)
    -        map_to_dict(map, j, locals, fast, 0);
    +    if (co->co_nlocals) {
    +        if (map_to_dict(map, j, locals, fast, 0) < 0)
    +            return -1;
    +    }
         ncells = PyTuple_GET_SIZE(co->co_cellvars);
         nfreevars = PyTuple_GET_SIZE(co->co_freevars);
         if (ncells || nfreevars) {
    -        map_to_dict(co->co_cellvars, ncells,
    -                    locals, fast + co->co_nlocals, 1);
    +        if (map_to_dict(co->co_cellvars, ncells,
    +                        locals, fast + co->co_nlocals, 1))
    +            return -1;
    +
             /* If the namespace is unoptimized, then one of the
                following cases applies:
                1. It does not contain free variables, because it
    @@ -903,11 +913,24 @@
                into the locals dict used by the class.
             */
             if (co->co_flags & CO_OPTIMIZED) {
    -            map_to_dict(co->co_freevars, nfreevars,
    -                        locals, fast + co->co_nlocals + ncells, 1);
    +            if (map_to_dict(co->co_freevars, nfreevars,
    +                            locals, fast + co->co_nlocals + ncells, 1) < 0)
    +                return -1;
             }
         }
    -    PyErr_Restore(error_type, error_value, error_traceback);
    +    return 0;
    +}
    +
    +void
    +PyFrame_FastToLocals(PyFrameObject *f)
    +{
    +    int res;
    +
    +    assert(!PyErr_Occurred());
    +
    +    res = PyFrame_FastToLocalsWithError(f);
    +    if (res < 0)
    +        PyErr_Clear();
     }
     
     void
    diff --git a/Objects/object.c b/Objects/object.c
    --- a/Objects/object.c
    +++ b/Objects/object.c
    @@ -1407,12 +1407,11 @@
     _dir_locals(void)
     {
         PyObject *names;
    -    PyObject *locals = PyEval_GetLocals();
    +    PyObject *locals;
     
    -    if (locals == NULL) {
    -        PyErr_SetString(PyExc_SystemError, "frame does not exist");
    +    locals = PyEval_GetLocals();
    +    if (locals == NULL)
             return NULL;
    -    }
     
         names = PyMapping_Keys(locals);
         if (!names)
    diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
    --- a/Python/bltinmodule.c
    +++ b/Python/bltinmodule.c
    @@ -755,8 +755,11 @@
         }
         if (globals == Py_None) {
             globals = PyEval_GetGlobals();
    -        if (locals == Py_None)
    +        if (locals == Py_None) {
                 locals = PyEval_GetLocals();
    +            if (locals == NULL)
    +                return NULL;
    +        }
         }
         else if (locals == Py_None)
             locals = globals;
    @@ -820,6 +823,8 @@
             globals = PyEval_GetGlobals();
             if (locals == Py_None) {
                 locals = PyEval_GetLocals();
    +            if (locals == NULL)
    +                return NULL;
             }
             if (!globals || !locals) {
                 PyErr_SetString(PyExc_SystemError,
    @@ -1926,13 +1931,9 @@
             return NULL;
         if (v == NULL) {
             d = PyEval_GetLocals();
    -        if (d == NULL) {
    -            if (!PyErr_Occurred())
    -                PyErr_SetString(PyExc_SystemError,
    -                                "vars(): no locals!?");
    -        }
    -        else
    -            Py_INCREF(d);
    +        if (d == NULL)
    +            return NULL;
    +        Py_INCREF(d);
         }
         else {
             _Py_IDENTIFIER(__dict__);
    diff --git a/Python/ceval.c b/Python/ceval.c
    --- a/Python/ceval.c
    +++ b/Python/ceval.c
    @@ -2472,7 +2472,9 @@
             TARGET(IMPORT_STAR) {
                 PyObject *from = POP(), *locals;
                 int err;
    -            PyFrame_FastToLocals(f);
    +            if (PyFrame_FastToLocalsWithError(f) < 0)
    +                goto error;
    +
                 locals = f->f_locals;
                 if (locals == NULL) {
                     PyErr_SetString(PyExc_SystemError,
    @@ -4005,9 +4007,15 @@
     PyEval_GetLocals(void)
     {
         PyFrameObject *current_frame = PyEval_GetFrame();
    -    if (current_frame == NULL)
    +    if (current_frame == NULL) {
    +        PyErr_SetString(PyExc_SystemError, "frame does not exist");
             return NULL;
    -    PyFrame_FastToLocals(current_frame);
    +    }
    +
    +    if (PyFrame_FastToLocalsWithError(current_frame) < 0)
    +        return NULL;
    +
    +    assert(current_frame->f_locals != NULL);
         return current_frame->f_locals;
     }
     
    @@ -4017,8 +4025,9 @@
         PyFrameObject *current_frame = PyEval_GetFrame();
         if (current_frame == NULL)
             return NULL;
    -    else
    -        return current_frame->f_globals;
    +
    +    assert(current_frame->f_globals != NULL);
    +    return current_frame->f_globals;
     }
     
     PyFrameObject *
    diff --git a/Python/sysmodule.c b/Python/sysmodule.c
    --- a/Python/sysmodule.c
    +++ b/Python/sysmodule.c
    @@ -332,12 +332,16 @@
     call_trampoline(PyThreadState *tstate, PyObject* callback,
                     PyFrameObject *frame, int what, PyObject *arg)
     {
    -    PyObject *args = PyTuple_New(3);
    +    PyObject *args;
         PyObject *whatstr;
         PyObject *result;
     
    +    args = PyTuple_New(3);
         if (args == NULL)
             return NULL;
    +    if (PyFrame_FastToLocalsWithError(frame) < 0)
    +        return NULL;
    +
         Py_INCREF(frame);
         whatstr = whatstrings[what];
         Py_INCREF(whatstr);
    @@ -349,7 +353,6 @@
         PyTuple_SET_ITEM(args, 2, arg);
     
         /* call the Python-level function */
    -    PyFrame_FastToLocals(frame);
         result = PyEval_CallObject(callback, args);
         PyFrame_LocalsToFast(frame, 1);
         if (result == NULL)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:46:43 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:46:43 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_PyUn?=
     =?utf-8?q?icode=5FAsUTF8AndSize=28=29=2C_raise_MemoryError_exception_on?=
    Message-ID: <3d7vJ308CDz7LjM@mail.python.org>
    
    http://hg.python.org/cpython/rev/e1d51c42e5a1
    changeset:   86716:e1d51c42e5a1
    user:        Victor Stinner 
    date:        Tue Oct 29 01:28:23 2013 +0100
    summary:
      Issue #18408: Fix PyUnicode_AsUTF8AndSize(), raise MemoryError exception on
    memory allocation failure
    
    files:
      Objects/unicodeobject.c |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -3766,6 +3766,7 @@
                 return NULL;
             _PyUnicode_UTF8(unicode) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1);
             if (_PyUnicode_UTF8(unicode) == NULL) {
    +            PyErr_NoMemory();
                 Py_DECREF(bytes);
                 return NULL;
             }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:46:44 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:46:44 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319428=3A_zipimpor?=
     =?utf-8?q?t_now_handles_errors_when_reading_truncated_or_invalid?=
    Message-ID: <3d7vJ426wcz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/11958c69a4b2
    changeset:   86717:11958c69a4b2
    user:        Victor Stinner 
    date:        Tue Oct 29 01:43:44 2013 +0100
    summary:
      Issue #19428: zipimport now handles errors when reading truncated or invalid
    ZIP archive.
    
    files:
      Misc/NEWS           |   3 +++
      Modules/zipimport.c |  16 +++++++++++++---
      2 files changed, 16 insertions(+), 3 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,9 @@
     Core and Builtins
     -----------------
     
    +- Issue #19428: zipimport now handles errors when reading truncated or invalid
    +  ZIP archive.
    +
     - Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
       exceptions when merging fast locals into f_locals of a frame.
       PyEval_GetLocals() now raises an exception and return NULL on failure.
    diff --git a/Modules/zipimport.c b/Modules/zipimport.c
    --- a/Modules/zipimport.c
    +++ b/Modules/zipimport.c
    @@ -914,6 +914,8 @@
     
             /* Start of file header */
             l = PyMarshal_ReadLongFromFile(fp);
    +        if (l == -1 && PyErr_Occurred())
    +            goto error;
             if (l != 0x02014B50)
                 break;              /* Bad: Central Dir File Header */
     
    @@ -937,6 +939,9 @@
             if (fread(dummy, 1, 8, fp) != 8) /* Skip unused fields, avoid fseek */
                 goto file_error;
             file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;
    +        if (PyErr_Occurred())
    +            goto error;
    +
             if (name_size > MAXPATHLEN)
                 name_size = MAXPATHLEN;
     
    @@ -1082,9 +1087,10 @@
         l = PyMarshal_ReadLongFromFile(fp);
         if (l != 0x04034B50) {
             /* Bad: Local File Header */
    -        PyErr_Format(ZipImportError,
    -                     "bad local file header in %U",
    -                     archive);
    +        if (!PyErr_Occurred())
    +            PyErr_Format(ZipImportError,
    +                         "bad local file header in %U",
    +                         archive);
             fclose(fp);
             return NULL;
         }
    @@ -1096,6 +1102,10 @@
     
         l = 30 + PyMarshal_ReadShortFromFile(fp) +
             PyMarshal_ReadShortFromFile(fp);        /* local header size */
    +    if (PyErr_Occurred()) {
    +        fclose(fp);
    +        return NULL;
    +    }
         file_offset += l;           /* Start of file data */
     
         bytes_size = compress == 0 ? data_size : data_size + 1;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 01:46:45 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 01:46:45 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_zipi?=
     =?utf-8?q?mport=2C_handle_PyUnicode=5FSubstring=28=29_and_get=5Fsubname?=
     =?utf-8?b?KCk=?=
    Message-ID: <3d7vJ53xG3z7Ljq@mail.python.org>
    
    http://hg.python.org/cpython/rev/7f4a976829f1
    changeset:   86718:7f4a976829f1
    user:        Victor Stinner 
    date:        Tue Oct 29 01:46:24 2013 +0100
    summary:
      Issue #18408: Fix zipimport, handle PyUnicode_Substring() and get_subname() failures
    
    files:
      Modules/zipimport.c |  9 +++++++--
      1 files changed, 7 insertions(+), 2 deletions(-)
    
    
    diff --git a/Modules/zipimport.c b/Modules/zipimport.c
    --- a/Modules/zipimport.c
    +++ b/Modules/zipimport.c
    @@ -117,6 +117,8 @@
             if (flen == -1)
                 break;
             filename = PyUnicode_Substring(path, 0, flen);
    +        if (filename == NULL)
    +            goto error;
         }
         if (filename == NULL) {
             PyErr_SetString(ZipImportError, "not a Zip file");
    @@ -469,10 +471,13 @@
         if (ispackage) {
             /* add __path__ to the module *before* the code gets
                executed */
    -        PyObject *pkgpath, *fullpath;
    -        PyObject *subname = get_subname(fullname);
    +        PyObject *pkgpath, *fullpath, *subname;
             int err;
     
    +        subname = get_subname(fullname);
    +        if (subname == NULL)
    +            goto error;
    +
             fullpath = PyUnicode_FromFormat("%U%c%U%U",
                                     self->archive, SEP,
                                     self->prefix, subname);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 02:44:04 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 02:44:04 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_ioba?=
     =?utf-8?q?se=5Freadline=28=29=2C_handle_PyByteArray=5FResize=28=29_failur?=
     =?utf-8?q?e?=
    Message-ID: <3d7wZD17wbzSF5@mail.python.org>
    
    http://hg.python.org/cpython/rev/4749c3ac0654
    changeset:   86719:4749c3ac0654
    user:        Victor Stinner 
    date:        Tue Oct 29 02:23:46 2013 +0100
    summary:
      Issue #18408: Fix iobase_readline(), handle PyByteArray_Resize() failure
    
    files:
      Modules/_io/iobase.c |  13 ++++++++-----
      1 files changed, 8 insertions(+), 5 deletions(-)
    
    
    diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
    --- a/Modules/_io/iobase.c
    +++ b/Modules/_io/iobase.c
    @@ -1,9 +1,9 @@
     /*
         An implementation of the I/O abstract base classes hierarchy
         as defined by PEP 3116 - "New I/O"
    -    
    +
         Classes defined here: IOBase, RawIOBase.
    -    
    +
         Written by Amaury Forgeot d'Arc and Antoine Pitrou
     */
     
    @@ -19,7 +19,7 @@
     
     typedef struct {
         PyObject_HEAD
    -    
    +
         PyObject *dict;
         PyObject *weakreflist;
     } iobase;
    @@ -530,7 +530,10 @@
             }
     
             old_size = PyByteArray_GET_SIZE(buffer);
    -        PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));
    +        if (PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b)) < 0) {
    +            Py_DECREF(b);
    +            goto fail;
    +        }
             memcpy(PyByteArray_AS_STRING(buffer) + old_size,
                    PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
     
    @@ -835,7 +838,7 @@
         int r;
         PyObject *chunks = PyList_New(0);
         PyObject *result;
    -    
    +
         if (chunks == NULL)
             return NULL;
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 03:51:21 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 03:51:21 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_erro?=
     =?utf-8?q?r_handling_in_PyBytes=5FFromObject=28=29?=
    Message-ID: <3d7y3s2MhSzSBw@mail.python.org>
    
    http://hg.python.org/cpython/rev/549cd815bf8d
    changeset:   86720:549cd815bf8d
    user:        Victor Stinner 
    date:        Tue Oct 29 03:14:22 2013 +0100
    summary:
      Issue #18408: Fix error handling in PyBytes_FromObject()
    
    _PyBytes_Resize(&new) sets new to NULL on error, don't call Py_DECREF() with NULL.
    
    files:
      Objects/bytesobject.c |  3 +--
      1 files changed, 1 insertions(+), 2 deletions(-)
    
    
    diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
    --- a/Objects/bytesobject.c
    +++ b/Objects/bytesobject.c
    @@ -2660,9 +2660,8 @@
         return new;
     
       error:
    -    /* Error handling when new != NULL */
         Py_XDECREF(it);
    -    Py_DECREF(new);
    +    Py_XDECREF(new);
         return NULL;
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 03:51:23 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 03:51:23 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_byte?=
     =?utf-8?q?arrayiter=2Epartition=28=29/rpartition=28=29=2C_handle?=
    Message-ID: <3d7y3v2SLhz7LjW@mail.python.org>
    
    http://hg.python.org/cpython/rev/9d9371d4ff7b
    changeset:   86721:9d9371d4ff7b
    user:        Victor Stinner 
    date:        Tue Oct 29 03:15:37 2013 +0100
    summary:
      Issue #18408: Fix bytearrayiter.partition()/rpartition(), handle
    PyByteArray_FromStringAndSize() failure (ex: on memory allocation failure)
    
    files:
      Objects/stringlib/partition.h |  10 ++++++++++
      1 files changed, 10 insertions(+), 0 deletions(-)
    
    
    diff --git a/Objects/stringlib/partition.h b/Objects/stringlib/partition.h
    --- a/Objects/stringlib/partition.h
    +++ b/Objects/stringlib/partition.h
    @@ -29,6 +29,11 @@
             PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len));
             PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
             PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0));
    +
    +        if (PyErr_Occurred()) {
    +            Py_DECREF(out);
    +            return NULL;
    +        }
     #else
             Py_INCREF(str_obj);
             PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
    @@ -79,6 +84,11 @@
             PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0));
             PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
             PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len));
    +
    +        if (PyErr_Occurred()) {
    +            Py_DECREF(out);
    +            return NULL;
    +        }
     #else
             Py_INCREF(STRINGLIB_EMPTY);
             PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 03:51:24 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 03:51:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_=5Fc?=
     =?utf-8?q?types=5Falloc=5Fformat=5Fstring=28=29=2C_raise_MemoryError_on_m?=
     =?utf-8?q?emory?=
    Message-ID: <3d7y3w5NYfz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/20cd15a28ad3
    changeset:   86722:20cd15a28ad3
    user:        Victor Stinner 
    date:        Tue Oct 29 03:50:21 2013 +0100
    summary:
      Issue #18408: Fix _ctypes_alloc_format_string(), raise MemoryError on memory
    allocation failure
    
    files:
      Modules/_ctypes/_ctypes.c |  4 +++-
      1 files changed, 3 insertions(+), 1 deletions(-)
    
    
    diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
    --- a/Modules/_ctypes/_ctypes.c
    +++ b/Modules/_ctypes/_ctypes.c
    @@ -278,8 +278,10 @@
         if (prefix)
             len += strlen(prefix);
         result = PyMem_Malloc(len + 1);
    -    if (result == NULL)
    +    if (result == NULL) {
    +        PyErr_NoMemory();
             return NULL;
    +    }
         if (prefix)
             strcpy(result, prefix);
         else
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 03:51:26 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 03:51:26 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318408=3A_Fix_PyCS?=
     =?utf-8?q?tructUnionType=5Fupdate=5Fstgdict=28=29=2C_handle?=
    Message-ID: <3d7y3y16xcz7LjX@mail.python.org>
    
    http://hg.python.org/cpython/rev/1386fb31c0ed
    changeset:   86723:1386fb31c0ed
    user:        Victor Stinner 
    date:        Tue Oct 29 03:50:45 2013 +0100
    summary:
      Issue #18408: Fix PyCStructUnionType_update_stgdict(), handle
    _ctypes_alloc_format_string() failure
    
    files:
      Modules/_ctypes/stgdict.c |  4 +++-
      1 files changed, 3 insertions(+), 1 deletions(-)
    
    
    diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
    --- a/Modules/_ctypes/stgdict.c
    +++ b/Modules/_ctypes/stgdict.c
    @@ -417,6 +417,8 @@
                that). Use 'B' for bytes. */
             stgdict->format = _ctypes_alloc_format_string(NULL, "B");
         }
    +    if (stgdict->format == NULL)
    +        return -1;
     
     #define realdict ((PyObject *)&stgdict->dict)
         for (i = 0; i < len; ++i) {
    @@ -483,7 +485,7 @@
                 char *fieldfmt = dict->format ? dict->format : "B";
                 char *fieldname = _PyUnicode_AsString(name);
                 char *ptr;
    -            Py_ssize_t len; 
    +            Py_ssize_t len;
                 char *buf;
     
                 if (fieldname == NULL)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 06:00:43 2013
    From: python-checkins at python.org (eric.snow)
    Date: Tue, 29 Oct 2013 06:00:43 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_=5BPEP_451=5D_Add_namespace_p?=
     =?utf-8?q?ackage_support_to_example_code_and_explain_more_about?=
    Message-ID: <3d80x74Jz1z7LjQ@mail.python.org>
    
    http://hg.python.org/peps/rev/e8e5abad7e5c
    changeset:   5232:e8e5abad7e5c
    user:        Eric Snow 
    date:        Mon Oct 28 22:56:35 2013 -0600
    summary:
      [PEP 451] Add namespace package support to example code and explain more about reloading.
    
    files:
      pep-0451.txt |  89 +++++++++++++++++++++++++++++++--------
      1 files changed, 69 insertions(+), 20 deletions(-)
    
    
    diff --git a/pep-0451.txt b/pep-0451.txt
    --- a/pep-0451.txt
    +++ b/pep-0451.txt
    @@ -295,6 +295,8 @@
       over its module execution functionality.
     * importlib.abc.Loader.create_module(spec) (optional) will return the
       module to use for loading.
    +* importlib.abc.Loader.supports_reload(name) (optional) will return True
    +  (the default) if the loader supports reloading the module.
     
     For modules:
     
    @@ -445,27 +447,31 @@
     Here is an outline of what the import machinery does during loading,
     adjusted to take advantage of the module's spec and the new loader API::
     
    -   module = None
    -   if hasattr(spec.loader, 'create_module'):
    -       module = spec.loader.create_module(spec)
    -   if module is None:
    -       module = ModuleType(spec.name)
    -   # The import-related module attributes get set here:
    -   _init_module_attrs(spec, module)
     
    -   if not hasattr(spec.loader, 'exec_module'):
    -       module = spec.loader.load_module(spec.name)
    -   else:
    -       sys.modules[spec.name] = module
    -       try:
    -           spec.loader.exec_module(module)
    -       except BaseException:
    -           try:
    -               del sys.modules[spec.name]
    -           except KeyError:
    -               pass
    -           raise
    -   module_to_return = sys.modules[spec.name]
    +    module = None
    +    if spec.loader is not None and hasattr(spec.loader, 'create_module'):
    +        module = spec.loader.create_module(spec)
    +    if module is None:
    +        module = ModuleType(spec.name)
    +    # The import-related module attributes get set here:
    +    _init_module_attrs(spec, module)
    +
    +    if spec.loader is None and spec.submodule_search_locations is not None:
    +        # namespace package
    +        sys.modules[spec.name] = module
    +    elif not hasattr(spec.loader, 'exec_module'):
    +        module = spec.loader.load_module(spec.name)
    +    else:
    +        sys.modules[spec.name] = module
    +        try:
    +            spec.loader.exec_module(module)
    +        except BaseException:
    +            try:
    +                del sys.modules[spec.name]
    +            except KeyError:
    +                pass
    +            raise
    +    module_to_return = sys.modules[spec.name]
     
     These steps are exactly what Loader.load_module() is already
     expected to do.  Loaders will thus be simplified since they will only
    @@ -479,6 +485,42 @@
     their own if they are doing this.
     
     
    +How Reloading Will Work
    +=======================
    +
    +Here is the corresponding outline for reload()::
    +
    +    _RELOADING = {}
    +
    +    def reload(module):
    +        try:
    +            name = module.__spec__.name
    +        except AttributeError:
    +            name = module.__name__
    +        spec = find_spec(name)
    +
    +        if sys.modules.get(name) is not module:
    +            raise ImportError
    +        if spec in _RELOADING:
    +            return _RELOADING[name]
    +        _RELOADING[name] = module
    +        try:
    +            if spec.loader is None:
    +                # namespace loader
    +                _init_module_attrs(spec, module)
    +                return module
    +            if not spec.loader.supports_reload(name):
    +                raise ImportError
    +            if spec.parent and spec.parent not in sys.modules:
    +                raise ImportError
    +
    +            _init_module_attrs(spec, module)
    +            spec.loader.exec_module(module)
    +            return sys.modules[name]
    +        finally:
    +            del _RELOADING[name]
    +
    +
     ModuleSpec
     ==========
     
    @@ -749,6 +791,13 @@
        module attributes.  The fact that load_module() does is a design flaw
        that this proposal aims to correct.
     
    +**Loader.supports_reload(name)**
    +
    +In cases where a module should not be reloaded, Loaders should implement
    +supports_reload() and have it return False.  If the method is defined
    +and returns a false value, importlib.reload() will raise an ImportError.
    +Otherwise reloading proceeds as normal.
    +
     Other changes:
     
     PEP 420 introduced the optional module_repr() loader method to limit
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From solipsis at pitrou.net  Tue Oct 29 07:37:06 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Tue, 29 Oct 2013 07:37:06 +0100
    Subject: [Python-checkins] Daily reference leaks (4749c3ac0654): sum=0
    Message-ID: 
    
    results for 4749c3ac0654 on branch "default"
    --------------------------------------------
    
    test_site leaked [0, -2, 2] references, sum=0
    test_site leaked [0, -2, 2] memory blocks, sum=0
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog4APqRj', '-x']
    
    From python-checkins at python.org  Tue Oct 29 08:16:10 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:16:10 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4IHR5cG86IGpz?=
     =?utf-8?q?=5FJP_is_not_a_valid_locale=2E?=
    Message-ID: <3d83xQ5KKCz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/9a0fb2ca062f
    changeset:   86724:9a0fb2ca062f
    branch:      2.7
    parent:      86706:6aa42fc0c2f6
    user:        Georg Brandl 
    date:        Tue Oct 29 08:05:10 2013 +0100
    summary:
      Fix typo: js_JP is not a valid locale.
    
    files:
      Doc/library/datetime.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
    --- a/Doc/library/datetime.rst
    +++ b/Doc/library/datetime.rst
    @@ -1720,7 +1720,7 @@
        making assumptions about the output value. Field orderings will vary (for
        example, "month/day/year" versus "day/month/year"), and the output may
        contain Unicode characters encoded using the locale's default encoding (for
    -   example, if the current locale is ``js_JP``, the default encoding could be
    +   example, if the current locale is ``ja_JP``, the default encoding could be
        any one of ``eucJP``, ``SJIS``, or ``utf-8``; use :meth:`locale.getlocale`
        to determine the current locale's encoding).
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:16:11 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:16:11 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_wrong_sign?=
     =?utf-8?q?ature_for_two-argument_newwin=28=29=2E__Found_by_Jacqueline_Ley?=
     =?utf-8?q?kam_on?=
    Message-ID: <3d83xR720dz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/6410f33090fa
    changeset:   86725:6410f33090fa
    branch:      2.7
    user:        Georg Brandl 
    date:        Tue Oct 29 08:10:36 2013 +0100
    summary:
      Fix wrong signature for two-argument newwin().  Found by Jacqueline Leykam on docs at .
    
    files:
      Doc/library/curses.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst
    --- a/Doc/library/curses.rst
    +++ b/Doc/library/curses.rst
    @@ -380,7 +380,7 @@
        is to be displayed.
     
     
    -.. function:: newwin(begin_y, begin_x)
    +.. function:: newwin(nlines, ncols)
                   newwin(nlines, ncols, begin_y, begin_x)
     
        Return a new window, whose left-upper corner is at  ``(begin_y, begin_x)``, and
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:16:13 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:16:13 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMxOTQx?=
     =?utf-8?q?6=3A_fix_references_in_the_nntplib_docs=2E?=
    Message-ID: <3d83xT210mz7Ljw@mail.python.org>
    
    http://hg.python.org/cpython/rev/6b2352f1d365
    changeset:   86726:6b2352f1d365
    branch:      2.7
    user:        Georg Brandl 
    date:        Tue Oct 29 08:14:51 2013 +0100
    summary:
      Closes #19416: fix references in the nntplib docs.
    
    files:
      Doc/library/nntplib.rst |  14 +++++++-------
      1 files changed, 7 insertions(+), 7 deletions(-)
    
    
    diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst
    --- a/Doc/library/nntplib.rst
    +++ b/Doc/library/nntplib.rst
    @@ -234,25 +234,25 @@
     
     .. method:: NNTP.next()
     
    -   Send a ``NEXT`` command.  Return as for :meth:`stat`.
    +   Send a ``NEXT`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.last()
     
    -   Send a ``LAST`` command.  Return as for :meth:`stat`.
    +   Send a ``LAST`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.head(id)
     
    -   Send a ``HEAD`` command, where *id* has the same meaning as for :meth:`stat`.
    +   Send a ``HEAD`` command, where *id* has the same meaning as for :meth:`.stat`.
        Return a tuple ``(response, number, id, list)`` where the first three are the
    -   same as for :meth:`stat`, and *list* is a list of the article's headers (an
    +   same as for :meth:`.stat`, and *list* is a list of the article's headers (an
        uninterpreted list of lines, without trailing newlines).
     
     
     .. method:: NNTP.body(id,[file])
     
    -   Send a ``BODY`` command, where *id* has the same meaning as for :meth:`stat`.
    +   Send a ``BODY`` command, where *id* has the same meaning as for :meth:`.stat`.
        If the *file* parameter is supplied, then the body is stored in a file.  If
        *file* is a string, then the method will open a file object with that name,
        write to it then close it. If *file* is a file object, then it will start
    @@ -263,7 +263,7 @@
     .. method:: NNTP.article(id)
     
        Send an ``ARTICLE`` command, where *id* has the same meaning as for
    -   :meth:`stat`.  Return as for :meth:`head`.
    +   :meth:`.stat`.  Return as for :meth:`head`.
     
     
     .. method:: NNTP.slave()
    @@ -290,7 +290,7 @@
     .. method:: NNTP.post(file)
     
        Post an article using the ``POST`` command.  The *file* argument is an open file
    -   object which is read until EOF using its :meth:`readline` method.  It should be
    +   object which is read until EOF using its :meth:`~file.readline` method.  It should be
        a well-formed news article, including the required headers.  The :meth:`post`
        method automatically escapes lines beginning with ``.``.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:18:49 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:18:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogRml4IHR5cG86IGpz?=
     =?utf-8?q?=5FJP_is_not_a_valid_locale=2E?=
    Message-ID: <3d840T0xp7z7LjS@mail.python.org>
    
    http://hg.python.org/cpython/rev/393cec48616c
    changeset:   86727:393cec48616c
    branch:      3.3
    parent:      86707:a2230a8420a5
    user:        Georg Brandl 
    date:        Tue Oct 29 08:05:10 2013 +0100
    summary:
      Fix typo: js_JP is not a valid locale.
    
    files:
      Doc/library/datetime.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
    --- a/Doc/library/datetime.rst
    +++ b/Doc/library/datetime.rst
    @@ -1896,7 +1896,7 @@
        making assumptions about the output value. Field orderings will vary (for
        example, "month/day/year" versus "day/month/year"), and the output may
        contain Unicode characters encoded using the locale's default encoding (for
    -   example, if the current locale is ``js_JP``, the default encoding could be
    +   example, if the current locale is ``ja_JP``, the default encoding could be
        any one of ``eucJP``, ``SJIS``, or ``utf-8``; use :meth:`locale.getlocale`
        to determine the current locale's encoding).
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:18:50 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:18:50 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Fix_wrong_sign?=
     =?utf-8?q?ature_for_two-argument_newwin=28=29=2E__Found_by_Jacqueline_Ley?=
     =?utf-8?q?kam_on?=
    Message-ID: <3d840V2qJXz7Ljw@mail.python.org>
    
    http://hg.python.org/cpython/rev/8e580e6a9318
    changeset:   86728:8e580e6a9318
    branch:      3.3
    user:        Georg Brandl 
    date:        Tue Oct 29 08:10:36 2013 +0100
    summary:
      Fix wrong signature for two-argument newwin().  Found by Jacqueline Leykam on docs at .
    
    files:
      Doc/library/curses.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst
    --- a/Doc/library/curses.rst
    +++ b/Doc/library/curses.rst
    @@ -377,7 +377,7 @@
        is to be displayed.
     
     
    -.. function:: newwin(begin_y, begin_x)
    +.. function:: newwin(nlines, ncols)
                   newwin(nlines, ncols, begin_y, begin_x)
     
        Return a new window, whose left-upper corner is at  ``(begin_y, begin_x)``, and
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:18:51 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:18:51 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogQ2xvc2VzICMxOTQx?=
     =?utf-8?q?6=3A_fix_references_in_the_nntplib_docs=2E?=
    Message-ID: <3d840W4hgFz7LkK@mail.python.org>
    
    http://hg.python.org/cpython/rev/03fa1b0af343
    changeset:   86729:03fa1b0af343
    branch:      3.3
    user:        Georg Brandl 
    date:        Tue Oct 29 08:14:51 2013 +0100
    summary:
      Closes #19416: fix references in the nntplib docs.
    
    files:
      Doc/library/nntplib.rst |  6 +++---
      1 files changed, 3 insertions(+), 3 deletions(-)
    
    
    diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst
    --- a/Doc/library/nntplib.rst
    +++ b/Doc/library/nntplib.rst
    @@ -395,18 +395,18 @@
     
     .. method:: NNTP.next()
     
    -   Send a ``NEXT`` command.  Return as for :meth:`stat`.
    +   Send a ``NEXT`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.last()
     
    -   Send a ``LAST`` command.  Return as for :meth:`stat`.
    +   Send a ``LAST`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.article(message_spec=None, *, file=None)
     
        Send an ``ARTICLE`` command, where *message_spec* has the same meaning as
    -   for :meth:`stat`.  Return a tuple ``(response, info)`` where *info*
    +   for :meth:`.stat`.  Return a tuple ``(response, info)`` where *info*
        is a :class:`~collections.namedtuple` with three attributes *number*,
        *message_id* and *lines* (in that order).  *number* is the article number
        in the group (or 0 if the information is not available), *message_id* the
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:18:52 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:18:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Clarify_senten?=
    	=?utf-8?b?Y2Uu?=
    Message-ID: <3d840X6KVvz7Lkd@mail.python.org>
    
    http://hg.python.org/cpython/rev/321b665d8c3c
    changeset:   86730:321b665d8c3c
    branch:      3.3
    user:        Georg Brandl 
    date:        Tue Oct 29 08:16:56 2013 +0100
    summary:
      Clarify sentence.
    
    files:
      Doc/howto/unicode.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst
    --- a/Doc/howto/unicode.rst
    +++ b/Doc/howto/unicode.rst
    @@ -514,7 +514,7 @@
     
     Unicode data is usually converted to a particular encoding before it gets
     written to disk or sent over a socket.  It's possible to do all the work
    -yourself: open a file, read an 8-bit bytes object from it, and convert the string
    +yourself: open a file, read an 8-bit bytes object from it, and convert the bytes
     with ``bytes.decode(encoding)``.  However, the manual approach is not recommended.
     
     One problem is the multi-byte nature of encodings; one Unicode character can be
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 08:18:54 2013
    From: python-checkins at python.org (georg.brandl)
    Date: Tue, 29 Oct 2013 08:18:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_merge_with_3=2E3?=
    Message-ID: <3d840Z11Pcz7Lkl@mail.python.org>
    
    http://hg.python.org/cpython/rev/28690d72b99f
    changeset:   86731:28690d72b99f
    parent:      86723:1386fb31c0ed
    parent:      86730:321b665d8c3c
    user:        Georg Brandl 
    date:        Tue Oct 29 08:17:08 2013 +0100
    summary:
      merge with 3.3
    
    files:
      Doc/howto/unicode.rst    |  2 +-
      Doc/library/curses.rst   |  2 +-
      Doc/library/datetime.rst |  2 +-
      Doc/library/nntplib.rst  |  6 +++---
      4 files changed, 6 insertions(+), 6 deletions(-)
    
    
    diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst
    --- a/Doc/howto/unicode.rst
    +++ b/Doc/howto/unicode.rst
    @@ -514,7 +514,7 @@
     
     Unicode data is usually converted to a particular encoding before it gets
     written to disk or sent over a socket.  It's possible to do all the work
    -yourself: open a file, read an 8-bit bytes object from it, and convert the string
    +yourself: open a file, read an 8-bit bytes object from it, and convert the bytes
     with ``bytes.decode(encoding)``.  However, the manual approach is not recommended.
     
     One problem is the multi-byte nature of encodings; one Unicode character can be
    diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst
    --- a/Doc/library/curses.rst
    +++ b/Doc/library/curses.rst
    @@ -377,7 +377,7 @@
        is to be displayed.
     
     
    -.. function:: newwin(begin_y, begin_x)
    +.. function:: newwin(nlines, ncols)
                   newwin(nlines, ncols, begin_y, begin_x)
     
        Return a new window, whose left-upper corner is at  ``(begin_y, begin_x)``, and
    diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
    --- a/Doc/library/datetime.rst
    +++ b/Doc/library/datetime.rst
    @@ -1898,7 +1898,7 @@
        making assumptions about the output value. Field orderings will vary (for
        example, "month/day/year" versus "day/month/year"), and the output may
        contain Unicode characters encoded using the locale's default encoding (for
    -   example, if the current locale is ``js_JP``, the default encoding could be
    +   example, if the current locale is ``ja_JP``, the default encoding could be
        any one of ``eucJP``, ``SJIS``, or ``utf-8``; use :meth:`locale.getlocale`
        to determine the current locale's encoding).
     
    diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst
    --- a/Doc/library/nntplib.rst
    +++ b/Doc/library/nntplib.rst
    @@ -394,18 +394,18 @@
     
     .. method:: NNTP.next()
     
    -   Send a ``NEXT`` command.  Return as for :meth:`stat`.
    +   Send a ``NEXT`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.last()
     
    -   Send a ``LAST`` command.  Return as for :meth:`stat`.
    +   Send a ``LAST`` command.  Return as for :meth:`.stat`.
     
     
     .. method:: NNTP.article(message_spec=None, *, file=None)
     
        Send an ``ARTICLE`` command, where *message_spec* has the same meaning as
    -   for :meth:`stat`.  Return a tuple ``(response, info)`` where *info*
    +   for :meth:`.stat`.  Return a tuple ``(response, info)`` where *info*
        is a :class:`~collections.namedtuple` with three attributes *number*,
        *message_id* and *lines* (in that order).  *number* is the article number
        in the group (or 0 if the information is not available), *message_id* the
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 09:15:24 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Tue, 29 Oct 2013 09:15:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDI2?=
     =?utf-8?q?=3A_Fixed_the_opening_of_Python_source_file_with_specified_enco?=
     =?utf-8?q?ding=2E?=
    Message-ID: <3d85Fm4PxCz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/7fde94ad5df4
    changeset:   86732:7fde94ad5df4
    branch:      2.7
    parent:      86726:6b2352f1d365
    user:        Serhiy Storchaka 
    date:        Tue Oct 29 10:15:09 2013 +0200
    summary:
      Issue #19426: Fixed the opening of Python source file with specified encoding.
    
    files:
      Lib/idlelib/IOBinding.py |  2 +-
      Misc/NEWS                |  5 +++++
      2 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
    --- a/Lib/idlelib/IOBinding.py
    +++ b/Lib/idlelib/IOBinding.py
    @@ -125,7 +125,7 @@
         Raise LookupError if the encoding is declared but unknown.
         """
         # Only consider the first two lines
    -    str = str.split("\n", 2)[:2]
    +    lst = str.split("\n", 2)[:2]
         for line in lst:
             match = coding_re.match(line)
             if match is not None:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -12,6 +12,11 @@
     Library
     -------
     
    +IDLE
    +----
    +
    +- Issue #19426: Fixed the opening of Python source file with specified encoding.
    +
     
     What's New in Python 2.7.6 release candidate 1?
     ===============================================
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 10:56:55 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 10:56:55 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_fix_indent?=
    Message-ID: <3d87Vv1178zPYM@mail.python.org>
    
    http://hg.python.org/cpython/rev/a7f7f52398b8
    changeset:   86733:a7f7f52398b8
    parent:      86731:28690d72b99f
    user:        Victor Stinner 
    date:        Tue Oct 29 10:56:34 2013 +0100
    summary:
      fix indent
    
    files:
      Objects/typeobject.c |  8 ++++----
      1 files changed, 4 insertions(+), 4 deletions(-)
    
    
    diff --git a/Objects/typeobject.c b/Objects/typeobject.c
    --- a/Objects/typeobject.c
    +++ b/Objects/typeobject.c
    @@ -5324,10 +5324,10 @@
         func = lookup_method(self, &PyId___str__);
         if (func == NULL)
             return NULL;
    -        res = PyEval_CallObject(func, NULL);
    -        Py_DECREF(func);
    -        return res;
    -    }
    +    res = PyEval_CallObject(func, NULL);
    +    Py_DECREF(func);
    +    return res;
    +}
     
     static Py_hash_t
     slot_tp_hash(PyObject *self)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 11:34:21 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 11:34:21 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318609=3A_Add_a_fa?=
     =?utf-8?q?st-path_for_=22iso8859-1=22_encoding?=
    Message-ID: <3d88L521rdzS7j@mail.python.org>
    
    http://hg.python.org/cpython/rev/31f9c1481cfa
    changeset:   86734:31f9c1481cfa
    user:        Victor Stinner 
    date:        Tue Oct 29 11:34:05 2013 +0100
    summary:
      Issue #18609: Add a fast-path for "iso8859-1" encoding
    
    On AIX, the locale encoding may be "iso8859-1", which was not a known syntax of
    the legacy ISO 8859-1 encoding.
    
    Using a C codec instead of a Python codec is faster but also avoids tricky
    issues during Python startup or complex code.
    
    files:
      Objects/unicodeobject.c |  6 ++++--
      1 files changed, 4 insertions(+), 2 deletions(-)
    
    
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -3021,7 +3021,8 @@
                 return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL);
             else if ((strcmp(lower, "latin-1") == 0) ||
                      (strcmp(lower, "latin1") == 0) ||
    -                 (strcmp(lower, "iso-8859-1") == 0))
    +                 (strcmp(lower, "iso-8859-1") == 0) ||
    +                 (strcmp(lower, "iso8859-1") == 0))
                 return PyUnicode_DecodeLatin1(s, size, errors);
     #ifdef HAVE_MBCS
             else if (strcmp(lower, "mbcs") == 0)
    @@ -3392,7 +3393,8 @@
             }
             else if ((strcmp(lower, "latin-1") == 0) ||
                      (strcmp(lower, "latin1") == 0) ||
    -                 (strcmp(lower, "iso-8859-1") == 0))
    +                 (strcmp(lower, "iso-8859-1") == 0) ||
    +                 (strcmp(lower, "iso8859-1") == 0))
                 return _PyUnicode_AsLatin1String(unicode, errors);
     #ifdef HAVE_MBCS
             else if (strcmp(lower, "mbcs") == 0)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 12:15:16 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 12:15:16 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319420=3A_Fix_refe?=
     =?utf-8?q?rence_leak_in_module_initalization_code_of_=5Fhashopenssl=2Ec?=
    Message-ID: <3d89FJ0lqzz7LjS@mail.python.org>
    
    http://hg.python.org/cpython/rev/6fdbb81b4020
    changeset:   86735:6fdbb81b4020
    user:        Christian Heimes 
    date:        Tue Oct 29 12:14:55 2013 +0100
    summary:
      Issue #19420: Fix reference leak in module initalization code of _hashopenssl.c
    
    files:
      Misc/NEWS              |  3 +++
      Modules/_hashopenssl.c |  2 +-
      2 files changed, 4 insertions(+), 1 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -28,6 +28,9 @@
     Library
     -------
     
    +- Issue #19420: Fix reference leak in module initalization code of
    +  _hashopenssl.c
    +
     - Issue #19329: Optimized compiling charsets in regular expressions.
     
     - Issue #19227: Try to fix deadlocks caused by re-seeding then OpenSSL
    diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
    --- a/Modules/_hashopenssl.c
    +++ b/Modules/_hashopenssl.c
    @@ -717,9 +717,9 @@
             state->error = 1;
         } else {
             if (PySet_Add(state->set, py_name) != 0) {
    -            Py_DECREF(py_name);
                 state->error = 1;
             }
    +        Py_DECREF(py_name);
         }
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 18:12:05 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Tue, 29 Oct 2013 18:12:05 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_updating_topic?=
    	=?utf-8?q?s?=
    Message-ID: <3d8K916Mghz7LjQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/a4d8918577ab
    changeset:   86736:a4d8918577ab
    branch:      2.6
    parent:      85914:6d7ae764b4f2
    user:        Barry Warsaw 
    date:        Tue Oct 29 10:10:41 2013 -0400
    summary:
      updating topics
    
    files:
      Lib/pydoc_topics.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/pydoc_topics.py b/Lib/pydoc_topics.py
    --- a/Lib/pydoc_topics.py
    +++ b/Lib/pydoc_topics.py
    @@ -1,4 +1,4 @@
    -# Autogenerated by Sphinx on Mon Sep 30 20:24:25 2013
    +# Autogenerated by Sphinx on Tue Oct 29 10:08:33 2013
     topics = {'assert': u'\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n   assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n   if __debug__:\n      if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n   if __debug__:\n      if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names.  In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O).  The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime.  Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal.  The value for the built-in\nvariable is determined when the interpreter starts.\n',
      'assignment': u'\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n   assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n   target_list     ::= target ("," target)* [","]\n   target          ::= identifier\n              | "(" target_list ")"\n              | "[" target_list "]"\n              | attributeref\n              | subscription\n              | slicing\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable.  The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list is recursively defined as\nfollows.\n\n* If the target list is a single target: The object is assigned to\n  that target.\n\n* If the target list is a comma-separated list of targets: The object\n  must be an iterable with the same number of items as there are\n  targets in the target list, and the items are assigned, from left to\n  right, to the corresponding targets. (This rule is relaxed as of\n  Python 1.5; in earlier versions, the object had to be a tuple.\n  Since strings are sequences, an assignment like ``a, b = "xy"`` is\n  now legal as long as the string has the right length.)\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n  * If the name does not occur in a ``global`` statement in the\n    current code block: the name is bound to the object in the current\n    local namespace.\n\n  * Otherwise: the name is bound to the object in the current global\n    namespace.\n\n  The name is rebound if it was already bound.  This may cause the\n  reference count for the object previously bound to the name to reach\n  zero, causing the object to be deallocated and its destructor (if it\n  has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n  brackets: The object must be an iterable with the same number of\n  items as there are targets in the target list, and its items are\n  assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n  the reference is evaluated.  It should yield an object with\n  assignable attributes; if this is not the case, ``TypeError`` is\n  raised.  That object is then asked to assign the assigned object to\n  the given attribute; if it cannot perform the assignment, it raises\n  an exception (usually but not necessarily ``AttributeError``).\n\n  Note: If the object is a class instance and the attribute reference\n  occurs on both sides of the assignment operator, the RHS expression,\n  ``a.x`` can access either an instance attribute or (if no instance\n  attribute exists) a class attribute.  The LHS target ``a.x`` is\n  always set as an instance attribute, creating it if necessary.\n  Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n  same attribute: if the RHS expression refers to a class attribute,\n  the LHS creates a new instance attribute as the target of the\n  assignment:\n\n     class Cls:\n         x = 3             # class variable\n     inst = Cls()\n     inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3\n\n  This description does not necessarily apply to descriptor\n  attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n  reference is evaluated.  It should yield either a mutable sequence\n  object (such as a list) or a mapping object (such as a dictionary).\n  Next, the subscript expression is evaluated.\n\n  If the primary is a mutable sequence object (such as a list), the\n  subscript must yield a plain integer.  If it is negative, the\n  sequence\'s length is added to it. The resulting value must be a\n  nonnegative integer less than the sequence\'s length, and the\n  sequence is asked to assign the assigned object to its item with\n  that index.  If the index is out of range, ``IndexError`` is raised\n  (assignment to a subscripted sequence cannot add new items to a\n  list).\n\n  If the primary is a mapping object (such as a dictionary), the\n  subscript must have a type compatible with the mapping\'s key type,\n  and the mapping is then asked to create a key/datum pair which maps\n  the subscript to the assigned object.  This can either replace an\n  existing key/value pair with the same key value, or insert a new\n  key/value pair (if no key with the same value existed).\n\n* If the target is a slicing: The primary expression in the reference\n  is evaluated.  It should yield a mutable sequence object (such as a\n  list).  The assigned object should be a sequence object of the same\n  type.  Next, the lower and upper bound expressions are evaluated,\n  insofar they are present; defaults are zero and the sequence\'s\n  length.  The bounds should evaluate to (small) integers.  If either\n  bound is negative, the sequence\'s length is added to it. The\n  resulting bounds are clipped to lie between zero and the sequence\'s\n  length, inclusive.  Finally, the sequence object is asked to replace\n  the slice with the items of the assigned sequence.  The length of\n  the slice may be different from the length of the assigned sequence,\n  thus changing the length of the target sequence, if the object\n  allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe!  For instance, the\nfollowing program prints ``[0, 2]``:\n\n   x = [0, 1]\n   i = 0\n   i, x[i] = 1, 2\n   print x\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n   augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n   augtarget                 ::= identifier | attributeref | subscription | slicing\n   augop                     ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n             | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
      'atom-identifiers': u'\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name.  See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them.  The transformation inserts the\nclass name in front of the name, with leading underscores removed, and\na single underscore inserted in front of the class name.  For example,\nthe identifier ``__spam`` occurring in a class named ``Ham`` will be\ntransformed to ``_Ham__spam``.  This transformation is independent of\nthe syntactical context in which the identifier is used.  If the\ntransformed name is extremely long (longer than 255 characters),\nimplementation defined truncation may happen.  If the class name\nconsists only of underscores, no transformation is done.\n',
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 18:12:07 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Tue, 29 Oct 2013 18:12:07 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_version_bump?=
    Message-ID: <3d8K93158Mz7LkV@mail.python.org>
    
    http://hg.python.org/cpython/rev/fcb3ec2842f9
    changeset:   86737:fcb3ec2842f9
    branch:      2.6
    tag:         v2.6.9
    user:        Barry Warsaw 
    date:        Tue Oct 29 10:14:05 2013 -0400
    summary:
      version bump
    
    files:
      Include/patchlevel.h      |   6 +++---
      Lib/distutils/__init__.py |   2 +-
      Lib/idlelib/idlever.py    |   2 +-
      Misc/NEWS                 |  10 +++-------
      Misc/RPM/python-2.6.spec  |   2 +-
      README                    |   4 ++--
      6 files changed, 11 insertions(+), 15 deletions(-)
    
    
    diff --git a/Include/patchlevel.h b/Include/patchlevel.h
    --- a/Include/patchlevel.h
    +++ b/Include/patchlevel.h
    @@ -23,11 +23,11 @@
     #define PY_MAJOR_VERSION	2
     #define PY_MINOR_VERSION	6
     #define PY_MICRO_VERSION	9
    -#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_GAMMA
    -#define PY_RELEASE_SERIAL	1
    +#define PY_RELEASE_LEVEL	PY_RELEASE_LEVEL_FINAL
    +#define PY_RELEASE_SERIAL	0
     
     /* Version as a string */
    -#define PY_VERSION      	"2.6.9rc1+"
    +#define PY_VERSION      	"2.6.9"
     /*--end constants--*/
     
     /* Subversion Revision number of this file (not of the repository) */
    diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py
    --- a/Lib/distutils/__init__.py
    +++ b/Lib/distutils/__init__.py
    @@ -22,5 +22,5 @@
     #
     
     #--start constants--
    -__version__ = "2.6.9rc1"
    +__version__ = "2.6.9"
     #--end constants--
    diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py
    --- a/Lib/idlelib/idlever.py
    +++ b/Lib/idlelib/idlever.py
    @@ -1,1 +1,1 @@
    -IDLE_VERSION = "2.6.9rc1"
    +IDLE_VERSION = "2.6.9"
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -5,13 +5,9 @@
     What's New in Python 2.6.9?
     ===========================
     
    -*Release date: XXXX-XX-XX*
    -
    -Core and Builtins
    ------------------
    -
    -Library
    --------
    +*Release date: 2013-10-29*
    +
    +No changes since 2.6.9rc1.
     
     
     What's New in Python 2.6.9 rc 1?
    diff --git a/Misc/RPM/python-2.6.spec b/Misc/RPM/python-2.6.spec
    --- a/Misc/RPM/python-2.6.spec
    +++ b/Misc/RPM/python-2.6.spec
    @@ -39,7 +39,7 @@
     
     %define name python
     #--start constants--
    -%define version 2.6.9rc1
    +%define version 2.6.9
     %define libvers 2.6
     #--end constants--
     %define release 1pydotorg
    diff --git a/README b/README
    --- a/README
    +++ b/README
    @@ -1,5 +1,5 @@
    -This is Python version 2.6.9rc1
    -===============================
    +This is Python version 2.6.9
    +============================
     
     Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
                   2011, 2012, 2013
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 18:12:08 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Tue, 29 Oct 2013 18:12:08 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Added_tag_v2?=
     =?utf-8?q?=2E6=2E9_for_changeset_fcb3ec2842f9?=
    Message-ID: <3d8K9431FPz7Llc@mail.python.org>
    
    http://hg.python.org/cpython/rev/d409493e2152
    changeset:   86738:d409493e2152
    branch:      2.6
    user:        Barry Warsaw 
    date:        Tue Oct 29 10:16:34 2013 -0400
    summary:
      Added tag v2.6.9 for changeset fcb3ec2842f9
    
    files:
      .hgtags |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/.hgtags b/.hgtags
    --- a/.hgtags
    +++ b/.hgtags
    @@ -141,3 +141,4 @@
     1d1b7b9fad48bd0dc60dc8a06cca4459ef273127 v2.6.8rc2
     c9910fd022fc842e5578e1bf5a30ba55a37239fc v2.6.8
     a0025037f11a73df5a7dd03e5a4027adad4cb94e v2.6.9rc1
    +fcb3ec2842f99454322492dd0ec2cf01322df093 v2.6.9
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 18:12:09 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Tue, 29 Oct 2013 18:12:09 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?=
    	=?utf-8?q?_2=2E6=2E9_final?=
    Message-ID: <3d8K955pZ9z7Lln@mail.python.org>
    
    http://hg.python.org/cpython/rev/01ddb768b523
    changeset:   86739:01ddb768b523
    branch:      2.7
    parent:      86732:7fde94ad5df4
    parent:      86738:d409493e2152
    user:        Barry Warsaw 
    date:        Tue Oct 29 13:11:49 2013 -0400
    summary:
      2.6.9 final
    
    files:
      .hgtags |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/.hgtags b/.hgtags
    --- a/.hgtags
    +++ b/.hgtags
    @@ -160,4 +160,5 @@
     026ee0057e2d3305f90a9da41daf7c3f9eb1e814 v2.7.4
     ab05e7dd27889b93f20d97bae86170aabfe45ace v2.7.5
     a0025037f11a73df5a7dd03e5a4027adad4cb94e v2.6.9rc1
    +fcb3ec2842f99454322492dd0ec2cf01322df093 v2.6.9
     4913d0e9be30666218cc4d713937e81c0e7f346a v2.7.6rc1
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 18:15:52 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Tue, 29 Oct 2013 18:15:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_2=2E6=2E9_final?=
    Message-ID: <3d8KFN1Thvz7Lly@mail.python.org>
    
    http://hg.python.org/peps/rev/07f84706ef0c
    changeset:   5233:07f84706ef0c
    user:        Barry Warsaw 
    date:        Tue Oct 29 13:15:48 2013 -0400
    summary:
      2.6.9 final
    
    files:
      pep-0361.txt |  14 ++++++--------
      1 files changed, 6 insertions(+), 8 deletions(-)
    
    
    diff --git a/pep-0361.txt b/pep-0361.txt
    --- a/pep-0361.txt
    +++ b/pep-0361.txt
    @@ -48,12 +48,12 @@
     Release Lifespan
     
         Python 3.0 is no longer being maintained for any purpose.
    +
    +    Python 2.6.9 is the final security-only source-only maintenance
    +    release of the Python 2.6 series.  With its release on October 29,
    +    2013, all official support for Python 2.6 has ended.  Python 2.6
    +    is no longer being maintained for any purpose.
         
    -    Python 2.6 is in security fix only maintenance mode until October
    -    1, 2013.  Security fixes are released in source-only formats.
    -    After this date, Python 2.6 will no longer be maintained for any
    -    purpose.
    -
     
     Release Schedule
     
    @@ -81,9 +81,7 @@
             Aug 24 2010: Python 2.6.6 final released
             Jun 03 2011: Python 2.6.7 final released (security-only)
     	Apr 10 2012: Python 2.6.8 final released (security-only)
    -
    -        Python 2.6.9 (security-only) planned for October 2013.  This
    -        will be the last Python 2.6 release.
    +	Oct 29 2013: Python 2.6.9 final released (security-only)
     
             See the public `Google calendar`_
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Tue Oct 29 19:45:49 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:45:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_Arra?=
     =?utf-8?q?y=5Fsubscript=28=29_of_ctypes=2C_handle_Array=5Fitem=28=29_fail?=
     =?utf-8?q?ure?=
    Message-ID: <3d8MF96Cjfz7LjZ@mail.python.org>
    
    http://hg.python.org/cpython/rev/1e5bbaed79ca
    changeset:   86740:1e5bbaed79ca
    parent:      86735:6fdbb81b4020
    user:        Victor Stinner 
    date:        Tue Oct 29 16:05:14 2013 +0100
    summary:
      Issue #19437: Fix Array_subscript() of ctypes, handle Array_item() failure
    
    files:
      Modules/_ctypes/_ctypes.c |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
    --- a/Modules/_ctypes/_ctypes.c
    +++ b/Modules/_ctypes/_ctypes.c
    @@ -4280,6 +4280,10 @@
             for (cur = start, i = 0; i < slicelen;
                  cur += step, i++) {
                 PyObject *v = Array_item(myself, cur);
    +            if (v == NULL) {
    +                Py_DECREF(np);
    +                return NULL;
    +            }
                 PyList_SET_ITEM(np, i, v);
             }
             return np;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:45:51 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:45:51 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_conv?=
     =?utf-8?q?ert=5Fop=5Fcmp=28=29_of_decimal=2EDecimal_rich_comparator=2C_ha?=
     =?utf-8?q?ndle?=
    Message-ID: <3d8MFC2D3Kz7LkK@mail.python.org>
    
    http://hg.python.org/cpython/rev/fc825259ee86
    changeset:   86741:fc825259ee86
    user:        Victor Stinner 
    date:        Tue Oct 29 19:26:11 2013 +0100
    summary:
      Issue #19437: Fix convert_op_cmp() of decimal.Decimal rich comparator, handle
    PyObject_IsInstance() failure
    
    files:
      Modules/_decimal/_decimal.c |  27 +++++++++++++++---------
      1 files changed, 17 insertions(+), 10 deletions(-)
    
    
    diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
    --- a/Modules/_decimal/_decimal.c
    +++ b/Modules/_decimal/_decimal.c
    @@ -3009,18 +3009,25 @@
                 *wcmp = Py_NotImplemented;
             }
         }
    -    else if (PyObject_IsInstance(w, Rational)) {
    -        *wcmp = numerator_as_decimal(w, context);
    -        if (*wcmp && !mpd_isspecial(MPD(v))) {
    -            *vcmp = multiply_by_denominator(v, w, context);
    -            if (*vcmp == NULL) {
    -                Py_CLEAR(*wcmp);
    +    else {
    +        int is_instance = PyObject_IsInstance(w, Rational);
    +        if (is_instance < 0) {
    +            *wcmp = NULL;
    +            return 0;
    +        }
    +        if (is_instance) {
    +            *wcmp = numerator_as_decimal(w, context);
    +            if (*wcmp && !mpd_isspecial(MPD(v))) {
    +                *vcmp = multiply_by_denominator(v, w, context);
    +                if (*vcmp == NULL) {
    +                    Py_CLEAR(*wcmp);
    +                }
                 }
             }
    -    }
    -    else {
    -        Py_INCREF(Py_NotImplemented);
    -        *wcmp = Py_NotImplemented;
    +        else {
    +            Py_INCREF(Py_NotImplemented);
    +            *wcmp = Py_NotImplemented;
    +        }
         }
     
         if (*wcmp == NULL || *wcmp == Py_NotImplemented) {
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:45:52 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:45:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Cleanup_locale=2Elocalecon?=
     =?utf-8?q?v=28=29=3A_move_Py=5FDECREF=28=29_closer_to_the_error?=
    Message-ID: <3d8MFD5Gj7z7Ll7@mail.python.org>
    
    http://hg.python.org/cpython/rev/deae3c6a88f0
    changeset:   86742:deae3c6a88f0
    user:        Victor Stinner 
    date:        Tue Oct 29 19:28:20 2013 +0100
    summary:
      Cleanup locale.localeconv(): move Py_DECREF() closer to the error
    
    files:
      Modules/_localemodule.c |  5 +++--
      1 files changed, 3 insertions(+), 2 deletions(-)
    
    
    diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
    --- a/Modules/_localemodule.c
    +++ b/Modules/_localemodule.c
    @@ -151,8 +151,10 @@
         do { \
             if (obj == NULL) \
                 goto failed; \
    -        if (PyDict_SetItemString(result, key, obj) < 0) \
    +        if (PyDict_SetItemString(result, key, obj) < 0) { \
    +            Py_DECREF(obj); \
                 goto failed; \
    +        } \
             Py_DECREF(obj); \
         } while (0)
     
    @@ -196,7 +198,6 @@
     
       failed:
         Py_XDECREF(result);
    -    Py_XDECREF(x);
         return NULL;
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:45:57 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:45:57 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_PyOb?=
     =?utf-8?q?ject=5FCallFunction=28=29=2C_handle_Py=5FVaBuildValue=28=29_and?=
    Message-ID: <3d8MFK55gwz7LmV@mail.python.org>
    
    http://hg.python.org/cpython/rev/6d57be1f19cf
    changeset:   86743:6d57be1f19cf
    user:        Victor Stinner 
    date:        Tue Oct 29 19:29:52 2013 +0100
    summary:
      Issue #19437: Fix PyObject_CallFunction(), handle Py_VaBuildValue() and
    PyTuple_New() failure
    
    files:
      Objects/abstract.c |  2 ++
      1 files changed, 2 insertions(+), 0 deletions(-)
    
    
    diff --git a/Objects/abstract.c b/Objects/abstract.c
    --- a/Objects/abstract.c
    +++ b/Objects/abstract.c
    @@ -2144,6 +2144,8 @@
         }
         else
             args = PyTuple_New(0);
    +    if (args == NULL)
    +        return NULL;
     
         return call_function_tail(callable, args);
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:45:59 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:45:59 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_=5FP?=
     =?utf-8?q?yUnicode=5FNew=28=29_=28constructor_of_legacy_string=29=2C_set_?=
     =?utf-8?q?all?=
    Message-ID: <3d8MFM0sL9z7LmR@mail.python.org>
    
    http://hg.python.org/cpython/rev/22ce0b7b1eaf
    changeset:   86744:22ce0b7b1eaf
    user:        Victor Stinner 
    date:        Tue Oct 29 19:31:43 2013 +0100
    summary:
      Issue #19437: Fix _PyUnicode_New() (constructor of legacy string), set all
    attributes before checking for error. The destructor expects all attributes to
    be set. It is now safe to call Py_DECREF(unicode) in the constructor.
    
    files:
      Objects/unicodeobject.c |  35 +++++++++++++++-------------
      1 files changed, 19 insertions(+), 16 deletions(-)
    
    
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -896,22 +896,7 @@
         if (unicode == NULL)
             return NULL;
         new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
    -    _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size);
    -    if (!_PyUnicode_WSTR(unicode)) {
    -        Py_DECREF(unicode);
    -        PyErr_NoMemory();
    -        return NULL;
    -    }
    -
    -    /* Initialize the first element to guard against cases where
    -     * the caller fails before initializing str -- unicode_resize()
    -     * reads str[0], and the Keep-Alive optimization can keep memory
    -     * allocated for str alive across a call to unicode_dealloc(unicode).
    -     * We don't want unicode_resize to read uninitialized memory in
    -     * that case.
    -     */
    -    _PyUnicode_WSTR(unicode)[0] = 0;
    -    _PyUnicode_WSTR(unicode)[length] = 0;
    +
         _PyUnicode_WSTR_LENGTH(unicode) = length;
         _PyUnicode_HASH(unicode) = -1;
         _PyUnicode_STATE(unicode).interned = 0;
    @@ -923,6 +908,24 @@
         _PyUnicode_LENGTH(unicode) = 0;
         _PyUnicode_UTF8(unicode) = NULL;
         _PyUnicode_UTF8_LENGTH(unicode) = 0;
    +
    +    _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size);
    +    if (!_PyUnicode_WSTR(unicode)) {
    +        Py_DECREF(unicode);
    +        PyErr_NoMemory();
    +        return NULL;
    +    }
    +
    +    /* Initialize the first element to guard against cases where
    +     * the caller fails before initializing str -- unicode_resize()
    +     * reads str[0], and the Keep-Alive optimization can keep memory
    +     * allocated for str alive across a call to unicode_dealloc(unicode).
    +     * We don't want unicode_resize to read uninitialized memory in
    +     * that case.
    +     */
    +    _PyUnicode_WSTR(unicode)[0] = 0;
    +    _PyUnicode_WSTR(unicode)[length] = 0;
    +
         assert(_PyUnicode_CheckConsistency((PyObject *)unicode, 0));
         return unicode;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:46:00 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:46:00 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319433=3A_test=5Fc?=
     =?utf-8?q?api=3A_add_tests_on_the_size_of_some_C_types?=
    Message-ID: <3d8MFN3mbzz7LmV@mail.python.org>
    
    http://hg.python.org/cpython/rev/daa1ab27b5c2
    changeset:   86745:daa1ab27b5c2
    user:        Victor Stinner 
    date:        Tue Oct 29 19:39:52 2013 +0100
    summary:
      Issue #19433: test_capi: add tests on the size of some C types
    
    files:
      Modules/_testcapimodule.c |  40 +++++++++++++++++++++++++++
      1 files changed, 40 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
    --- a/Modules/_testcapimodule.c
    +++ b/Modules/_testcapimodule.c
    @@ -65,6 +65,45 @@
     }
     
     static PyObject*
    +test_sizeof_c_types(PyObject *self)
    +{
    +#define CHECK_SIZEOF(EXPECTED, TYPE)         \
    +    if (EXPECTED != sizeof(TYPE))  {         \
    +        PyErr_Format(TestError,              \
    +            "sizeof(%s) = %u instead of %u", \
    +            #TYPE, sizeof(TYPE), EXPECTED);  \
    +        return (PyObject*)NULL;              \
    +    }
    +
    +    /* integer types */
    +    CHECK_SIZEOF(1, Py_UCS1);
    +    CHECK_SIZEOF(2, Py_UCS2);
    +    CHECK_SIZEOF(4, Py_UCS4);
    +#ifdef HAVE_INT32_T
    +    CHECK_SIZEOF(4, PY_INT32_T);
    +#endif
    +#ifdef HAVE_UINT32_T
    +    CHECK_SIZEOF(4, PY_UINT32_T);
    +#endif
    +#ifdef HAVE_INT64_T
    +    CHECK_SIZEOF(8, PY_INT64_T);
    +#endif
    +#ifdef HAVE_UINT64_T
    +    CHECK_SIZEOF(8, PY_UINT64_T);
    +#endif
    +
    +    /* pointer/size types */
    +    CHECK_SIZEOF(sizeof(void *), size_t);
    +    CHECK_SIZEOF(sizeof(void *), Py_ssize_t);
    +
    +    Py_INCREF(Py_None);
    +    return Py_None;
    +
    +#undef CHECK_SIZEOF
    +}
    +
    +
    +static PyObject*
     test_list_api(PyObject *self)
     {
         PyObject* list;
    @@ -2783,6 +2822,7 @@
         {"raise_exception",         raise_exception,                 METH_VARARGS},
         {"raise_memoryerror",   (PyCFunction)raise_memoryerror,  METH_NOARGS},
         {"test_config",             (PyCFunction)test_config,        METH_NOARGS},
    +    {"test_sizeof_c_types",     (PyCFunction)test_sizeof_c_types, METH_NOARGS},
         {"test_datetime_capi",  test_datetime_capi,              METH_NOARGS},
         {"test_list_api",           (PyCFunction)test_list_api,      METH_NOARGS},
         {"test_dict_iteration",     (PyCFunction)test_dict_iteration,METH_NOARGS},
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 19:59:41 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 19:59:41 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319433=3A_test=5Fc?=
     =?utf-8?q?api=3A_check_signness_of_some_C_types?=
    Message-ID: <3d8MY966Cmz7Ljj@mail.python.org>
    
    http://hg.python.org/cpython/rev/5bf96a96f31d
    changeset:   86746:5bf96a96f31d
    user:        Victor Stinner 
    date:        Tue Oct 29 19:59:31 2013 +0100
    summary:
      Issue #19433: test_capi: check signness of some C types
    
    files:
      Modules/_testcapimodule.c |  44 ++++++++++++++++++++------
      1 files changed, 34 insertions(+), 10 deletions(-)
    
    
    diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
    --- a/Modules/_testcapimodule.c
    +++ b/Modules/_testcapimodule.c
    @@ -67,38 +67,62 @@
     static PyObject*
     test_sizeof_c_types(PyObject *self)
     {
    -#define CHECK_SIZEOF(EXPECTED, TYPE)         \
    +#define CHECK_SIZEOF(TYPE, EXPECTED)         \
         if (EXPECTED != sizeof(TYPE))  {         \
             PyErr_Format(TestError,              \
                 "sizeof(%s) = %u instead of %u", \
                 #TYPE, sizeof(TYPE), EXPECTED);  \
             return (PyObject*)NULL;              \
         }
    +#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
    +#define CHECK_SIGNNESS(TYPE, SIGNED)         \
    +    if (IS_SIGNED(TYPE) != SIGNED) {         \
    +        PyErr_Format(TestError,              \
    +            "%s signness is, instead of %i",  \
    +            #TYPE, IS_SIGNED(TYPE), SIGNED); \
    +        return (PyObject*)NULL;              \
    +    }
     
         /* integer types */
    -    CHECK_SIZEOF(1, Py_UCS1);
    -    CHECK_SIZEOF(2, Py_UCS2);
    -    CHECK_SIZEOF(4, Py_UCS4);
    +    CHECK_SIZEOF(Py_UCS1, 1);
    +    CHECK_SIZEOF(Py_UCS2, 2);
    +    CHECK_SIZEOF(Py_UCS4, 4);
    +    CHECK_SIGNNESS(Py_UCS1, 0);
    +    CHECK_SIGNNESS(Py_UCS2, 0);
    +    CHECK_SIGNNESS(Py_UCS4, 0);
     #ifdef HAVE_INT32_T
    -    CHECK_SIZEOF(4, PY_INT32_T);
    +    CHECK_SIZEOF(PY_INT32_T, 4);
    +    CHECK_SIGNNESS(PY_INT32_T, 1);
     #endif
     #ifdef HAVE_UINT32_T
    -    CHECK_SIZEOF(4, PY_UINT32_T);
    +    CHECK_SIZEOF(PY_UINT32_T, 4);
    +    CHECK_SIGNNESS(PY_UINT32_T, 0);
     #endif
     #ifdef HAVE_INT64_T
    -    CHECK_SIZEOF(8, PY_INT64_T);
    +    CHECK_SIZEOF(PY_INT64_T, 8);
    +    CHECK_SIGNNESS(PY_INT64_T, 1);
     #endif
     #ifdef HAVE_UINT64_T
    -    CHECK_SIZEOF(8, PY_UINT64_T);
    +    CHECK_SIZEOF(PY_UINT64_T, 8);
    +    CHECK_SIGNNESS(PY_UINT64_T, 0);
     #endif
     
         /* pointer/size types */
    -    CHECK_SIZEOF(sizeof(void *), size_t);
    -    CHECK_SIZEOF(sizeof(void *), Py_ssize_t);
    +    CHECK_SIZEOF(size_t, sizeof(void *));
    +    CHECK_SIGNNESS(size_t, 0);
    +    CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_ssize_t, 1);
    +
    +    CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_uintptr_t, 0);
    +    CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_intptr_t, 1);
     
         Py_INCREF(Py_None);
         return Py_None;
     
    +#undef IS_SIGNED
    +#undef CHECK_SIGNESS
     #undef CHECK_SIZEOF
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 20:31:32 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 20:31:32 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogYmFja3BvcnQgIzE5?=
    	=?utf-8?q?426?=
    Message-ID: <3d8NFw2fntz7Ljj@mail.python.org>
    
    http://hg.python.org/cpython/rev/e0475c44832f
    changeset:   86747:e0475c44832f
    branch:      2.7
    parent:      86666:9750acbf7c40
    user:        Benjamin Peterson 
    date:        Tue Oct 29 15:27:14 2013 -0400
    summary:
      backport #19426
    
    files:
      Lib/idlelib/IOBinding.py |   2 +-
      Misc/NEWS                |  11 +++++++++++
      2 files changed, 12 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
    --- a/Lib/idlelib/IOBinding.py
    +++ b/Lib/idlelib/IOBinding.py
    @@ -125,7 +125,7 @@
         Raise LookupError if the encoding is declared but unknown.
         """
         # Only consider the first two lines
    -    str = str.split("\n", 2)[:2]
    +    lst = str.split("\n", 2)[:2]
         for line in lst:
             match = coding_re.match(line)
             if match is not None:
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -1,6 +1,17 @@
     Python News
     +++++++++++
     
    +Whats' New in Python 2.7.6?
    +===========================
    +
    +*Release date: 2013-11-02*
    +
    +IDLE
    +----
    +
    +- Issue #19426: Fixed the opening of Python source file with specified encoding.
    +
    +
     What's New in Python 2.7.6 release candidate 1?
     ===============================================
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 20:31:33 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 20:31:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?=
     =?utf-8?q?_merge_2=2E7=2E6_release_branch?=
    Message-ID: <3d8NFx5ppxz7Lky@mail.python.org>
    
    http://hg.python.org/cpython/rev/3bbc7a4a79e1
    changeset:   86748:3bbc7a4a79e1
    branch:      2.7
    parent:      86739:01ddb768b523
    parent:      86747:e0475c44832f
    user:        Benjamin Peterson 
    date:        Tue Oct 29 15:28:41 2013 -0400
    summary:
      merge 2.7.6 release branch
    
    files:
      Misc/NEWS |  6 ++++++
      1 files changed, 6 insertions(+), 0 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -12,6 +12,12 @@
     Library
     -------
     
    +
    +Whats' New in Python 2.7.6?
    +===========================
    +
    +*Release date: 2013-11-02*
    +
     IDLE
     ----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 20:36:35 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 20:36:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_dec?=
     =?utf-8?q?=5Fformat=28=29_of_the_=5Fdecimal_module=2C_handle_dec=5Fstrdup?=
     =?utf-8?b?KCk=?=
    Message-ID: <3d8NMl4scTz7LkX@mail.python.org>
    
    http://hg.python.org/cpython/rev/5acbdcfc21c9
    changeset:   86749:5acbdcfc21c9
    parent:      86746:5bf96a96f31d
    user:        Victor Stinner 
    date:        Tue Oct 29 20:33:14 2013 +0100
    summary:
      Issue #19437: Fix dec_format() of the _decimal module, handle dec_strdup()
    failure (memory allocation failure): raise a MemoryError exception
    
    files:
      Modules/_decimal/_decimal.c |  1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
    --- a/Modules/_decimal/_decimal.c
    +++ b/Modules/_decimal/_decimal.c
    @@ -3187,6 +3187,7 @@
                 replace_fillchar = 1;
                 fmt = dec_strdup(fmt, size);
                 if (fmt == NULL) {
    +                PyErr_NoMemory();
                     return NULL;
                 }
                 fmt[0] = '_';
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:27 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:27 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MjI3?=
     =?utf-8?q?_/_Issue_=2318747=3A_Remove_pthread=5Fatfork=28=29_handler_to_r?=
     =?utf-8?q?emove_OpenSSL?=
    Message-ID: <3d8PJ36NSlz7Ljq@mail.python.org>
    
    http://hg.python.org/cpython/rev/5942eea8cf41
    changeset:   86750:5942eea8cf41
    branch:      3.3
    parent:      86730:321b665d8c3c
    user:        Christian Heimes 
    date:        Tue Oct 29 20:50:01 2013 +0100
    summary:
      Issue #19227 / Issue #18747: Remove pthread_atfork() handler to remove OpenSSL re-seeding
    It is causing trouble like e.g. hanging processes.
    
    files:
      Modules/_ssl.c |  67 --------------------------------------
      1 files changed, 0 insertions(+), 67 deletions(-)
    
    
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -19,9 +19,6 @@
     #ifdef WITH_THREAD
     #include "pythread.h"
     
    -#ifdef HAVE_PTHREAD_ATFORK
    -#  include 
    -#endif
     
     #define PySSL_BEGIN_ALLOW_THREADS_S(save) \
         do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
    @@ -2584,65 +2581,6 @@
     Returns number of bytes read.  Raises SSLError if connection to EGD\n\
     fails or if it does not provide enough data to seed PRNG.");
     
    -/* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
    - *
    - * The prepare handler seeds the PRNG from pseudo-random data like pid, the
    - * current time (miliseconds or seconds) and an uninitialized array.
    - * The array contains stack variables that are impossible to predict
    - * on most systems, e.g. function return address (subject to ASLR), the
    - * stack protection canary and automatic variables.
    - * The code is inspired by Apache's ssl_rand_seed() function.
    - *
    - * Note:
    - * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A prepare handler is used
    - * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions. A parent handler has caused
    - * other problems, see issue #19227.
    - */
    -
    -#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
    -#define PYSSL_RAND_ATFORK 1
    -
    -static void
    -PySSL_RAND_atfork_prepare(void)
    -{
    -    struct {
    -        char stack[128];    /* uninitialized (!) stack data, 128 is an
    -                               arbitrary number. */
    -        pid_t pid;          /* current pid */
    -        _PyTime_timeval tp; /* current time */
    -    } seed;
    -
    -#ifdef WITH_VALGRIND
    -    VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
    -#endif
    -    seed.pid = getpid();
    -    _PyTime_gettimeofday(&(seed.tp));
    -    RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
    -}
    -
    -static int
    -PySSL_RAND_atfork(void)
    -{
    -    static int registered = 0;
    -    int retval;
    -
    -    if (registered)
    -        return 0;
    -
    -    retval = pthread_atfork(PySSL_RAND_atfork_prepare, /* prepare */
    -                            NULL,                      /* parent */
    -                            NULL);                     /* child */
    -    if (retval != 0) {
    -        PyErr_SetFromErrno(PyExc_OSError);
    -        return -1;
    -    }
    -    registered = 1;
    -    return 0;
    -}
    -#endif /* HAVE_PTHREAD_ATFORK */
    -
     #endif /* HAVE_OPENSSL_RAND */
     
     
    @@ -3022,10 +2960,5 @@
         if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
             return NULL;
     
    -#ifdef PYSSL_RAND_ATFORK
    -    if (PySSL_RAND_atfork() == -1)
    -        return NULL;
    -#endif
    -
         return m;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:29 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:29 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE4NzQ3?=
     =?utf-8?q?=3A_document_issue_with_OpenSSL=27s_CPRNG_state_and_fork?=
    Message-ID: <3d8PJ5266fz7Lkg@mail.python.org>
    
    http://hg.python.org/cpython/rev/cd4007fb9c7e
    changeset:   86751:cd4007fb9c7e
    branch:      3.3
    user:        Christian Heimes 
    date:        Tue Oct 29 21:08:56 2013 +0100
    summary:
      Issue #18747: document issue with OpenSSL's CPRNG state and fork
    
    files:
      Doc/library/os.rst  |  4 ++++
      Doc/library/ssl.rst |  8 ++++++++
      2 files changed, 12 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/os.rst b/Doc/library/os.rst
    --- a/Doc/library/os.rst
    +++ b/Doc/library/os.rst
    @@ -2582,6 +2582,10 @@
        Note that some platforms including FreeBSD <= 6.3, Cygwin and OS/2 EMX have
        known issues when using fork() from a thread.
     
    +   .. warning::
    +
    +      See :mod:`ssl` for applications that use the SSL module with fork().
    +
        Availability: Unix.
     
     
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -28,6 +28,14 @@
        operating system socket APIs.  The installed version of OpenSSL may also
        cause variations in behavior.
     
    +.. warning::
    +
    +   OpenSSL's internal random number generator does not properly handle fork.
    +   Applications must change the PRNG state of the parent process if they use
    +   any SSL feature with with :func:`os.fork`. Any successful call of
    +   :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
    +   :func:`~ssl.RAND_pseudo_bytes` is sufficient.
    +
     This section documents the objects and functions in the ``ssl`` module; for more
     general information about TLS, SSL, and certificates, the reader is referred to
     the documents in the "See Also" section at the bottom.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:30 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:30 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Issue_=2319227_/_Issue_=2318747=3A_Remove_pthread=5Fatfo?=
     =?utf-8?q?rk=28=29_handler_to_remove_OpenSSL?=
    Message-ID: <3d8PJ65Vthz7Lkg@mail.python.org>
    
    http://hg.python.org/cpython/rev/705f2addd0f0
    changeset:   86752:705f2addd0f0
    parent:      86735:6fdbb81b4020
    parent:      86751:cd4007fb9c7e
    user:        Christian Heimes 
    date:        Tue Oct 29 21:11:55 2013 +0100
    summary:
      Issue #19227 / Issue #18747: Remove pthread_atfork() handler to remove OpenSSL re-seeding
    It is causing trouble like e.g. hanging processes.
    
    files:
      Doc/library/os.rst  |   4 +
      Doc/library/ssl.rst |   8 +++
      Misc/NEWS           |   3 +
      Modules/_ssl.c      |  67 ---------------------------------
      4 files changed, 15 insertions(+), 67 deletions(-)
    
    
    diff --git a/Doc/library/os.rst b/Doc/library/os.rst
    --- a/Doc/library/os.rst
    +++ b/Doc/library/os.rst
    @@ -2637,6 +2637,10 @@
        Note that some platforms including FreeBSD <= 6.3, Cygwin and OS/2 EMX have
        known issues when using fork() from a thread.
     
    +   .. warning::
    +
    +      See :mod:`ssl` for applications that use the SSL module with fork().
    +
        Availability: Unix.
     
     
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -29,6 +29,14 @@
        cause variations in behavior. For example, TLSv1.1 and TLSv1.2 come with
        openssl version 1.0.1.
     
    +.. warning::
    +
    +   OpenSSL's internal random number generator does not properly handle fork.
    +   Applications must change the PRNG state of the parent process if they use
    +   any SSL feature with with :func:`os.fork`. Any successful call of
    +   :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
    +   :func:`~ssl.RAND_pseudo_bytes` is sufficient.
    +
     This section documents the objects and functions in the ``ssl`` module; for more
     general information about TLS, SSL, and certificates, the reader is referred to
     the documents in the "See Also" section at the bottom.
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -28,6 +28,9 @@
     Library
     -------
     
    +- Issue #19227: Remove pthread_atfork() handler. The handler was added to
    +  solve #18747 but has caused issues.
    +
     - Issue #19420: Fix reference leak in module initalization code of
       _hashopenssl.c
     
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -19,9 +19,6 @@
     #ifdef WITH_THREAD
     #include "pythread.h"
     
    -#ifdef HAVE_PTHREAD_ATFORK
    -#  include 
    -#endif
     
     #define PySSL_BEGIN_ALLOW_THREADS_S(save) \
         do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
    @@ -2950,65 +2947,6 @@
     Returns number of bytes read.  Raises SSLError if connection to EGD\n\
     fails or if it does not provide enough data to seed PRNG.");
     
    -/* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
    - *
    - * The prepare handler seeds the PRNG from pseudo-random data like pid, the
    - * current time (miliseconds or seconds) and an uninitialized array.
    - * The array contains stack variables that are impossible to predict
    - * on most systems, e.g. function return address (subject to ASLR), the
    - * stack protection canary and automatic variables.
    - * The code is inspired by Apache's ssl_rand_seed() function.
    - *
    - * Note:
    - * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A prepare handler is used
    - * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions. A parent handler has caused
    - * other problems, see issue #19227.
    - */
    -
    -#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
    -#define PYSSL_RAND_ATFORK 1
    -
    -static void
    -PySSL_RAND_atfork_prepare(void)
    -{
    -    struct {
    -        char stack[128];    /* uninitialized (!) stack data, 128 is an
    -                               arbitrary number. */
    -        pid_t pid;          /* current pid */
    -        _PyTime_timeval tp; /* current time */
    -    } seed;
    -
    -#ifdef WITH_VALGRIND
    -    VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
    -#endif
    -    seed.pid = getpid();
    -    _PyTime_gettimeofday(&(seed.tp));
    -    RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
    -}
    -
    -static int
    -PySSL_RAND_atfork(void)
    -{
    -    static int registered = 0;
    -    int retval;
    -
    -    if (registered)
    -        return 0;
    -
    -    retval = pthread_atfork(PySSL_RAND_atfork_prepare, /* prepare */
    -                            NULL,                      /* parent */
    -                            NULL);                     /* child */
    -    if (retval != 0) {
    -        PyErr_SetFromErrno(PyExc_OSError);
    -        return -1;
    -    }
    -    registered = 1;
    -    return 0;
    -}
    -#endif /* HAVE_PTHREAD_ATFORK */
    -
     #endif /* HAVE_OPENSSL_RAND */
     
     
    @@ -3623,10 +3561,5 @@
         if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
             return NULL;
     
    -#ifdef PYSSL_RAND_ATFORK
    -    if (PySSL_RAND_atfork() == -1)
    -        return NULL;
    -#endif
    -
         return m;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:32 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:32 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MjI3?=
     =?utf-8?q?_/_Issue_=2318747=3A_Remove_pthread=5Fatfork=28=29_handler_to_r?=
     =?utf-8?q?emove_OpenSSL?=
    Message-ID: <3d8PJ809ylz7Lm5@mail.python.org>
    
    http://hg.python.org/cpython/rev/4d761ce0ac74
    changeset:   86753:4d761ce0ac74
    branch:      2.7
    parent:      86748:3bbc7a4a79e1
    user:        Christian Heimes 
    date:        Tue Oct 29 20:50:01 2013 +0100
    summary:
      Issue #19227 / Issue #18747: Remove pthread_atfork() handler to remove OpenSSL re-seeding
    It is causing trouble like e.g. hanging processes.
    
    files:
      Modules/_ssl.c |  65 --------------------------------------
      1 files changed, 0 insertions(+), 65 deletions(-)
    
    
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -19,9 +19,6 @@
     #ifdef WITH_THREAD
     #include "pythread.h"
     
    -#ifdef HAVE_PTHREAD_ATFORK
    -#  include 
    -#endif
     
     #define PySSL_BEGIN_ALLOW_THREADS { \
                 PyThreadState *_save = NULL;  \
    @@ -1627,64 +1624,6 @@
     Returns number of bytes read.  Raises SSLError if connection to EGD\n\
     fails or if it does not provide enough data to seed PRNG.");
     
    -/* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
    - *
    - * The parent handler seeds the PRNG from pseudo-random data like pid, the
    - * current time (miliseconds or seconds) and an uninitialized array.
    - * The array contains stack variables that are impossible to predict
    - * on most systems, e.g. function return address (subject to ASLR), the
    - * stack protection canary and automatic variables.
    - * The code is inspired by Apache's ssl_rand_seed() function.
    - *
    - * Note:
    - * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A parent handler is used
    - * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions.
    - */
    -
    -#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
    -#define PYSSL_RAND_ATFORK 1
    -
    -static void
    -PySSL_RAND_atfork_parent(void)
    -{
    -    struct {
    -        char stack[128];    /* uninitialized (!) stack data, 128 is an
    -                               arbitrary number. */
    -        pid_t pid;          /* current pid */
    -        time_t time;        /* current time */
    -    } seed;
    -
    -#ifdef WITH_VALGRIND
    -    VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
    -#endif
    -    seed.pid = getpid();
    -    seed.time = time(NULL);
    -    RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
    -}
    -
    -static int
    -PySSL_RAND_atfork(void)
    -{
    -    static int registered = 0;
    -    int retval;
    -
    -    if (registered)
    -        return 0;
    -
    -    retval = pthread_atfork(NULL,                     /* prepare */
    -                            PySSL_RAND_atfork_parent, /* parent */
    -                            NULL);                    /* child */
    -    if (retval != 0) {
    -        PyErr_SetFromErrno(PyExc_OSError);
    -        return -1;
    -    }
    -    registered = 1;
    -    return 0;
    -}
    -#endif /* HAVE_PTHREAD_ATFORK */
    -
     #endif /* HAVE_OPENSSL_RAND */
     
     
    @@ -1899,8 +1838,4 @@
         if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
             return;
     
    -#ifdef PYSSL_RAND_ATFORK
    -    if (PySSL_RAND_atfork() == -1)
    -        return;
    -#endif
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:33 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NzQ3?=
     =?utf-8?q?=3A_document_issue_with_OpenSSL=27s_CPRNG_state_and_fork?=
    Message-ID: <3d8PJ91xKjz7LlV@mail.python.org>
    
    http://hg.python.org/cpython/rev/22e166d5c4c7
    changeset:   86754:22e166d5c4c7
    branch:      2.7
    user:        Christian Heimes 
    date:        Tue Oct 29 21:08:56 2013 +0100
    summary:
      Issue #18747: document issue with OpenSSL's CPRNG state and fork
    
    files:
      Doc/library/os.rst  |  4 ++++
      Doc/library/ssl.rst |  8 ++++++++
      2 files changed, 12 insertions(+), 0 deletions(-)
    
    
    diff --git a/Doc/library/os.rst b/Doc/library/os.rst
    --- a/Doc/library/os.rst
    +++ b/Doc/library/os.rst
    @@ -1936,6 +1936,10 @@
        Note that some platforms including FreeBSD <= 6.3, Cygwin and OS/2 EMX have
        known issues when using fork() from a thread.
     
    +   .. warning::
    +
    +      See :mod:`ssl` for applications that use the SSL module with fork().
    +
        Availability: Unix.
     
     
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -30,6 +30,14 @@
        operating system socket APIs.  The installed version of OpenSSL may also
        cause variations in behavior.
     
    +.. warning::
    +
    +   OpenSSL's internal random number generator does not properly handle fork.
    +   Applications must change the PRNG state of the parent process if they use
    +   any SSL feature with with :func:`os.fork`. Any successful call of
    +   :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
    +   :func:`~ssl.RAND_pseudo_bytes` is sufficient.
    +
     This section documents the objects and functions in the ``ssl`` module; for more
     general information about TLS, SSL, and certificates, the reader is referred to
     the documents in the "See Also" section at the bottom.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:18:34 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 21:18:34 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?=
    	=?utf-8?q?=29=3A_merge?=
    Message-ID: <3d8PJB5Gwjz7Lkg@mail.python.org>
    
    http://hg.python.org/cpython/rev/612600c202b0
    changeset:   86755:612600c202b0
    parent:      86752:705f2addd0f0
    parent:      86749:5acbdcfc21c9
    user:        Christian Heimes 
    date:        Tue Oct 29 21:16:58 2013 +0100
    summary:
      merge
    
    files:
      Modules/_ctypes/_ctypes.c   |   4 +
      Modules/_decimal/_decimal.c |  28 +++++++---
      Modules/_localemodule.c     |   5 +-
      Modules/_testcapimodule.c   |  64 +++++++++++++++++++++++++
      Objects/abstract.c          |   2 +
      Objects/unicodeobject.c     |  35 +++++++------
      6 files changed, 110 insertions(+), 28 deletions(-)
    
    
    diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
    --- a/Modules/_ctypes/_ctypes.c
    +++ b/Modules/_ctypes/_ctypes.c
    @@ -4280,6 +4280,10 @@
             for (cur = start, i = 0; i < slicelen;
                  cur += step, i++) {
                 PyObject *v = Array_item(myself, cur);
    +            if (v == NULL) {
    +                Py_DECREF(np);
    +                return NULL;
    +            }
                 PyList_SET_ITEM(np, i, v);
             }
             return np;
    diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
    --- a/Modules/_decimal/_decimal.c
    +++ b/Modules/_decimal/_decimal.c
    @@ -3009,18 +3009,25 @@
                 *wcmp = Py_NotImplemented;
             }
         }
    -    else if (PyObject_IsInstance(w, Rational)) {
    -        *wcmp = numerator_as_decimal(w, context);
    -        if (*wcmp && !mpd_isspecial(MPD(v))) {
    -            *vcmp = multiply_by_denominator(v, w, context);
    -            if (*vcmp == NULL) {
    -                Py_CLEAR(*wcmp);
    +    else {
    +        int is_instance = PyObject_IsInstance(w, Rational);
    +        if (is_instance < 0) {
    +            *wcmp = NULL;
    +            return 0;
    +        }
    +        if (is_instance) {
    +            *wcmp = numerator_as_decimal(w, context);
    +            if (*wcmp && !mpd_isspecial(MPD(v))) {
    +                *vcmp = multiply_by_denominator(v, w, context);
    +                if (*vcmp == NULL) {
    +                    Py_CLEAR(*wcmp);
    +                }
                 }
             }
    -    }
    -    else {
    -        Py_INCREF(Py_NotImplemented);
    -        *wcmp = Py_NotImplemented;
    +        else {
    +            Py_INCREF(Py_NotImplemented);
    +            *wcmp = Py_NotImplemented;
    +        }
         }
     
         if (*wcmp == NULL || *wcmp == Py_NotImplemented) {
    @@ -3180,6 +3187,7 @@
                 replace_fillchar = 1;
                 fmt = dec_strdup(fmt, size);
                 if (fmt == NULL) {
    +                PyErr_NoMemory();
                     return NULL;
                 }
                 fmt[0] = '_';
    diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
    --- a/Modules/_localemodule.c
    +++ b/Modules/_localemodule.c
    @@ -151,8 +151,10 @@
         do { \
             if (obj == NULL) \
                 goto failed; \
    -        if (PyDict_SetItemString(result, key, obj) < 0) \
    +        if (PyDict_SetItemString(result, key, obj) < 0) { \
    +            Py_DECREF(obj); \
                 goto failed; \
    +        } \
             Py_DECREF(obj); \
         } while (0)
     
    @@ -196,7 +198,6 @@
     
       failed:
         Py_XDECREF(result);
    -    Py_XDECREF(x);
         return NULL;
     }
     
    diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
    --- a/Modules/_testcapimodule.c
    +++ b/Modules/_testcapimodule.c
    @@ -65,6 +65,69 @@
     }
     
     static PyObject*
    +test_sizeof_c_types(PyObject *self)
    +{
    +#define CHECK_SIZEOF(TYPE, EXPECTED)         \
    +    if (EXPECTED != sizeof(TYPE))  {         \
    +        PyErr_Format(TestError,              \
    +            "sizeof(%s) = %u instead of %u", \
    +            #TYPE, sizeof(TYPE), EXPECTED);  \
    +        return (PyObject*)NULL;              \
    +    }
    +#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
    +#define CHECK_SIGNNESS(TYPE, SIGNED)         \
    +    if (IS_SIGNED(TYPE) != SIGNED) {         \
    +        PyErr_Format(TestError,              \
    +            "%s signness is, instead of %i",  \
    +            #TYPE, IS_SIGNED(TYPE), SIGNED); \
    +        return (PyObject*)NULL;              \
    +    }
    +
    +    /* integer types */
    +    CHECK_SIZEOF(Py_UCS1, 1);
    +    CHECK_SIZEOF(Py_UCS2, 2);
    +    CHECK_SIZEOF(Py_UCS4, 4);
    +    CHECK_SIGNNESS(Py_UCS1, 0);
    +    CHECK_SIGNNESS(Py_UCS2, 0);
    +    CHECK_SIGNNESS(Py_UCS4, 0);
    +#ifdef HAVE_INT32_T
    +    CHECK_SIZEOF(PY_INT32_T, 4);
    +    CHECK_SIGNNESS(PY_INT32_T, 1);
    +#endif
    +#ifdef HAVE_UINT32_T
    +    CHECK_SIZEOF(PY_UINT32_T, 4);
    +    CHECK_SIGNNESS(PY_UINT32_T, 0);
    +#endif
    +#ifdef HAVE_INT64_T
    +    CHECK_SIZEOF(PY_INT64_T, 8);
    +    CHECK_SIGNNESS(PY_INT64_T, 1);
    +#endif
    +#ifdef HAVE_UINT64_T
    +    CHECK_SIZEOF(PY_UINT64_T, 8);
    +    CHECK_SIGNNESS(PY_UINT64_T, 0);
    +#endif
    +
    +    /* pointer/size types */
    +    CHECK_SIZEOF(size_t, sizeof(void *));
    +    CHECK_SIGNNESS(size_t, 0);
    +    CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_ssize_t, 1);
    +
    +    CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_uintptr_t, 0);
    +    CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
    +    CHECK_SIGNNESS(Py_intptr_t, 1);
    +
    +    Py_INCREF(Py_None);
    +    return Py_None;
    +
    +#undef IS_SIGNED
    +#undef CHECK_SIGNESS
    +#undef CHECK_SIZEOF
    +}
    +
    +
    +static PyObject*
     test_list_api(PyObject *self)
     {
         PyObject* list;
    @@ -2783,6 +2846,7 @@
         {"raise_exception",         raise_exception,                 METH_VARARGS},
         {"raise_memoryerror",   (PyCFunction)raise_memoryerror,  METH_NOARGS},
         {"test_config",             (PyCFunction)test_config,        METH_NOARGS},
    +    {"test_sizeof_c_types",     (PyCFunction)test_sizeof_c_types, METH_NOARGS},
         {"test_datetime_capi",  test_datetime_capi,              METH_NOARGS},
         {"test_list_api",           (PyCFunction)test_list_api,      METH_NOARGS},
         {"test_dict_iteration",     (PyCFunction)test_dict_iteration,METH_NOARGS},
    diff --git a/Objects/abstract.c b/Objects/abstract.c
    --- a/Objects/abstract.c
    +++ b/Objects/abstract.c
    @@ -2144,6 +2144,8 @@
         }
         else
             args = PyTuple_New(0);
    +    if (args == NULL)
    +        return NULL;
     
         return call_function_tail(callable, args);
     }
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -896,22 +896,7 @@
         if (unicode == NULL)
             return NULL;
         new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
    -    _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size);
    -    if (!_PyUnicode_WSTR(unicode)) {
    -        Py_DECREF(unicode);
    -        PyErr_NoMemory();
    -        return NULL;
    -    }
    -
    -    /* Initialize the first element to guard against cases where
    -     * the caller fails before initializing str -- unicode_resize()
    -     * reads str[0], and the Keep-Alive optimization can keep memory
    -     * allocated for str alive across a call to unicode_dealloc(unicode).
    -     * We don't want unicode_resize to read uninitialized memory in
    -     * that case.
    -     */
    -    _PyUnicode_WSTR(unicode)[0] = 0;
    -    _PyUnicode_WSTR(unicode)[length] = 0;
    +
         _PyUnicode_WSTR_LENGTH(unicode) = length;
         _PyUnicode_HASH(unicode) = -1;
         _PyUnicode_STATE(unicode).interned = 0;
    @@ -923,6 +908,24 @@
         _PyUnicode_LENGTH(unicode) = 0;
         _PyUnicode_UTF8(unicode) = NULL;
         _PyUnicode_UTF8_LENGTH(unicode) = 0;
    +
    +    _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size);
    +    if (!_PyUnicode_WSTR(unicode)) {
    +        Py_DECREF(unicode);
    +        PyErr_NoMemory();
    +        return NULL;
    +    }
    +
    +    /* Initialize the first element to guard against cases where
    +     * the caller fails before initializing str -- unicode_resize()
    +     * reads str[0], and the Keep-Alive optimization can keep memory
    +     * allocated for str alive across a call to unicode_dealloc(unicode).
    +     * We don't want unicode_resize to read uninitialized memory in
    +     * that case.
    +     */
    +    _PyUnicode_WSTR(unicode)[0] = 0;
    +    _PyUnicode_WSTR(unicode)[length] = 0;
    +
         assert(_PyUnicode_CheckConsistency((PyObject *)unicode, 0));
         return unicode;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:24:35 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 21:24:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5MjI3?=
     =?utf-8?q?_/_Issue_=2318747=3A_Remove_pthread=5Fatfork=28=29_handler_to_r?=
     =?utf-8?q?emove_OpenSSL?=
    Message-ID: <3d8PR71mY0z7Lk9@mail.python.org>
    
    http://hg.python.org/cpython/rev/ad779da9e351
    changeset:   86756:ad779da9e351
    branch:      2.7
    parent:      86747:e0475c44832f
    user:        Christian Heimes 
    date:        Tue Oct 29 20:50:01 2013 +0100
    summary:
      Issue #19227 / Issue #18747: Remove pthread_atfork() handler to remove OpenSSL re-seeding
    It is causing trouble like e.g. hanging processes.
    
    files:
      Modules/_ssl.c |  65 --------------------------------------
      1 files changed, 0 insertions(+), 65 deletions(-)
    
    
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -19,9 +19,6 @@
     #ifdef WITH_THREAD
     #include "pythread.h"
     
    -#ifdef HAVE_PTHREAD_ATFORK
    -#  include 
    -#endif
     
     #define PySSL_BEGIN_ALLOW_THREADS { \
                 PyThreadState *_save = NULL;  \
    @@ -1627,64 +1624,6 @@
     Returns number of bytes read.  Raises SSLError if connection to EGD\n\
     fails or if it does not provide enough data to seed PRNG.");
     
    -/* Seed OpenSSL's PRNG at fork(), http://bugs.python.org/issue18747
    - *
    - * The parent handler seeds the PRNG from pseudo-random data like pid, the
    - * current time (miliseconds or seconds) and an uninitialized array.
    - * The array contains stack variables that are impossible to predict
    - * on most systems, e.g. function return address (subject to ASLR), the
    - * stack protection canary and automatic variables.
    - * The code is inspired by Apache's ssl_rand_seed() function.
    - *
    - * Note:
    - * The code uses pthread_atfork() until Python has a proper atfork API. The
    - * handlers are not removed from the child process. A parent handler is used
    - * instead of a child handler because fork() is supposed to be async-signal
    - * safe but the handler calls unsafe functions.
    - */
    -
    -#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
    -#define PYSSL_RAND_ATFORK 1
    -
    -static void
    -PySSL_RAND_atfork_parent(void)
    -{
    -    struct {
    -        char stack[128];    /* uninitialized (!) stack data, 128 is an
    -                               arbitrary number. */
    -        pid_t pid;          /* current pid */
    -        time_t time;        /* current time */
    -    } seed;
    -
    -#ifdef WITH_VALGRIND
    -    VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
    -#endif
    -    seed.pid = getpid();
    -    seed.time = time(NULL);
    -    RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
    -}
    -
    -static int
    -PySSL_RAND_atfork(void)
    -{
    -    static int registered = 0;
    -    int retval;
    -
    -    if (registered)
    -        return 0;
    -
    -    retval = pthread_atfork(NULL,                     /* prepare */
    -                            PySSL_RAND_atfork_parent, /* parent */
    -                            NULL);                    /* child */
    -    if (retval != 0) {
    -        PyErr_SetFromErrno(PyExc_OSError);
    -        return -1;
    -    }
    -    registered = 1;
    -    return 0;
    -}
    -#endif /* HAVE_PTHREAD_ATFORK */
    -
     #endif /* HAVE_OPENSSL_RAND */
     
     
    @@ -1899,8 +1838,4 @@
         if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
             return;
     
    -#ifdef PYSSL_RAND_ATFORK
    -    if (PySSL_RAND_atfork() == -1)
    -        return;
    -#endif
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:24:36 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 21:24:36 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?=
     =?utf-8?q?_merge_2=2E7=2E6_release_branch?=
    Message-ID: <3d8PR83Tq8z7Lk9@mail.python.org>
    
    http://hg.python.org/cpython/rev/244caf2ade0e
    changeset:   86757:244caf2ade0e
    branch:      2.7
    parent:      86754:22e166d5c4c7
    parent:      86756:ad779da9e351
    user:        Benjamin Peterson 
    date:        Tue Oct 29 16:24:26 2013 -0400
    summary:
      merge 2.7.6 release branch
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 21:33:56 2013
    From: python-checkins at python.org (antoine.pitrou)
    Date: Tue, 29 Oct 2013 21:33:56 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2317936=3A_Fix_O=28?=
     =?utf-8?q?n**2=29_behaviour_when_adding_or_removing_many_subclasses_of?=
    Message-ID: <3d8Pdw39dNz7Lkg@mail.python.org>
    
    http://hg.python.org/cpython/rev/a7f1ce6fe293
    changeset:   86758:a7f1ce6fe293
    parent:      86755:612600c202b0
    user:        Antoine Pitrou 
    date:        Tue Oct 29 21:31:25 2013 +0100
    summary:
      Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
    
    files:
      Misc/NEWS            |    3 +
      Objects/typeobject.c |  128 +++++++++++++++---------------
      2 files changed, 69 insertions(+), 62 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,9 @@
     Core and Builtins
     -----------------
     
    +- Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses
    +  of a given type.
    +
     - Issue #19428: zipimport now handles errors when reading truncated or invalid
       ZIP archive.
     
    diff --git a/Objects/typeobject.c b/Objects/typeobject.c
    --- a/Objects/typeobject.c
    +++ b/Objects/typeobject.c
    @@ -101,16 +101,17 @@
            needed.
          */
         PyObject *raw, *ref;
    -    Py_ssize_t i, n;
    +    Py_ssize_t i;
     
         if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
             return;
     
         raw = type->tp_subclasses;
         if (raw != NULL) {
    -        n = PyList_GET_SIZE(raw);
    -        for (i = 0; i < n; i++) {
    -            ref = PyList_GET_ITEM(raw, i);
    +        assert(PyDict_CheckExact(raw));
    +        i = 0;
    +        while (PyDict_Next(raw, &i, NULL, &ref)) {
    +            assert(PyWeakref_CheckRef(ref));
                 ref = PyWeakref_GET_OBJECT(ref);
                 if (ref != Py_None) {
                     PyType_Modified((PyTypeObject *)ref);
    @@ -435,6 +436,7 @@
     static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
     static int add_subclass(PyTypeObject*, PyTypeObject*);
     static void remove_subclass(PyTypeObject *, PyTypeObject *);
    +static void remove_all_subclasses(PyTypeObject *type, PyObject *bases);
     static void update_all_slots(PyTypeObject *);
     
     typedef int (*update_callback)(PyTypeObject *, void *);
    @@ -448,15 +450,15 @@
     {
         PyTypeObject *subclass;
         PyObject *ref, *subclasses, *old_mro;
    -    Py_ssize_t i, n;
    +    Py_ssize_t i;
     
         subclasses = type->tp_subclasses;
         if (subclasses == NULL)
             return 0;
    -    assert(PyList_Check(subclasses));
    -    n = PyList_GET_SIZE(subclasses);
    -    for (i = 0; i < n; i++) {
    -        ref = PyList_GET_ITEM(subclasses, i);
    +    assert(PyDict_CheckExact(subclasses));
    +    i = 0;
    +
    +    while (PyDict_Next(subclasses, &i, NULL, &ref)) {
             assert(PyWeakref_CheckRef(ref));
             subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
             assert(subclass != NULL);
    @@ -575,13 +577,7 @@
         /* for now, sod that: just remove from all old_bases,
            add to all new_bases */
     
    -    for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) {
    -        ob = PyTuple_GET_ITEM(old_bases, i);
    -        if (PyType_Check(ob)) {
    -            remove_subclass(
    -                (PyTypeObject*)ob, type);
    -        }
    -    }
    +    remove_all_subclasses(type, old_bases);
     
         for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) {
             ob = PyTuple_GET_ITEM(value, i);
    @@ -2733,10 +2729,14 @@
     type_dealloc(PyTypeObject *type)
     {
         PyHeapTypeObject *et;
    +    PyObject *tp, *val, *tb;
     
         /* Assert this is a heap-allocated type object */
         assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
         _PyObject_GC_UNTRACK(type);
    +    PyErr_Fetch(&tp, &val, &tb);
    +    remove_all_subclasses(type, type->tp_bases);
    +    PyErr_Restore(tp, val, tb);
         PyObject_ClearWeakRefs((PyObject *)type);
         et = (PyHeapTypeObject *)type;
         Py_XDECREF(type->tp_base);
    @@ -2761,7 +2761,7 @@
     type_subclasses(PyTypeObject *type, PyObject *args_ignored)
     {
         PyObject *list, *raw, *ref;
    -    Py_ssize_t i, n;
    +    Py_ssize_t i;
     
         list = PyList_New(0);
         if (list == NULL)
    @@ -2769,10 +2769,9 @@
         raw = type->tp_subclasses;
         if (raw == NULL)
             return list;
    -    assert(PyList_Check(raw));
    -    n = PyList_GET_SIZE(raw);
    -    for (i = 0; i < n; i++) {
    -        ref = PyList_GET_ITEM(raw, i);
    +    assert(PyDict_CheckExact(raw));
    +    i = 0;
    +    while (PyDict_Next(raw, &i, NULL, &ref)) {
             assert(PyWeakref_CheckRef(ref));
             ref = PyWeakref_GET_OBJECT(ref);
             if (ref != Py_None) {
    @@ -2961,8 +2960,8 @@
                class's dict; the cycle will be broken that way.
     
            tp_subclasses:
    -           A list of weak references can't be part of a cycle; and
    -           lists have their own tp_clear.
    +           A dict of weak references can't be part of a cycle; and
    +           dicts have their own tp_clear.
     
            slots (in PyHeapTypeObject):
                A tuple of strings can't be part of a cycle.
    @@ -4353,51 +4352,57 @@
     static int
     add_subclass(PyTypeObject *base, PyTypeObject *type)
     {
    -    Py_ssize_t i;
    -    int result;
    -    PyObject *list, *ref, *newobj;
    -
    -    list = base->tp_subclasses;
    -    if (list == NULL) {
    -        base->tp_subclasses = list = PyList_New(0);
    -        if (list == NULL)
    +    int result = -1;
    +    PyObject *dict, *key, *newobj;
    +
    +    dict = base->tp_subclasses;
    +    if (dict == NULL) {
    +        base->tp_subclasses = dict = PyDict_New();
    +        if (dict == NULL)
                 return -1;
         }
    -    assert(PyList_Check(list));
    +    assert(PyDict_CheckExact(dict));
    +    key = PyLong_FromVoidPtr((void *) type);
    +    if (key == NULL)
    +        return -1;
         newobj = PyWeakref_NewRef((PyObject *)type, NULL);
    -    if (newobj == NULL)
    -        return -1;
    -    i = PyList_GET_SIZE(list);
    -    while (--i >= 0) {
    -        ref = PyList_GET_ITEM(list, i);
    -        assert(PyWeakref_CheckRef(ref));
    -        if (PyWeakref_GET_OBJECT(ref) == Py_None)
    -            return PyList_SetItem(list, i, newobj);
    -    }
    -    result = PyList_Append(list, newobj);
    -    Py_DECREF(newobj);
    +    if (newobj != NULL) {
    +        result = PyDict_SetItem(dict, key, newobj);
    +        Py_DECREF(newobj);
    +    }
    +    Py_DECREF(key);
         return result;
     }
     
     static void
     remove_subclass(PyTypeObject *base, PyTypeObject *type)
     {
    -    Py_ssize_t i;
    -    PyObject *list, *ref;
    -
    -    list = base->tp_subclasses;
    -    if (list == NULL) {
    +    PyObject *dict, *key;
    +
    +    dict = base->tp_subclasses;
    +    if (dict == NULL) {
             return;
         }
    -    assert(PyList_Check(list));
    -    i = PyList_GET_SIZE(list);
    -    while (--i >= 0) {
    -        ref = PyList_GET_ITEM(list, i);
    -        assert(PyWeakref_CheckRef(ref));
    -        if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
    -            /* this can't fail, right? */
    -            PySequence_DelItem(list, i);
    -            return;
    +    assert(PyDict_CheckExact(dict));
    +    key = PyLong_FromVoidPtr((void *) type);
    +    if (key == NULL || PyDict_DelItem(dict, key)) {
    +        /* This can happen if the type initialization errored out before
    +           the base subclasses were updated (e.g. a non-str __qualname__
    +           was passed in the type dict). */
    +        PyErr_Clear();
    +    }
    +    Py_XDECREF(key);
    +}
    +
    +static void
    +remove_all_subclasses(PyTypeObject *type, PyObject *bases)
    +{
    +    if (bases) {
    +        Py_ssize_t i;
    +        for (i = 0; i < PyTuple_GET_SIZE(bases); i++) {
    +            PyObject *base = PyTuple_GET_ITEM(bases, i);
    +            if (PyType_Check(base))
    +                remove_subclass((PyTypeObject*) base, type);
             }
         }
     }
    @@ -6173,15 +6178,14 @@
     {
         PyTypeObject *subclass;
         PyObject *ref, *subclasses, *dict;
    -    Py_ssize_t i, n;
    +    Py_ssize_t i;
     
         subclasses = type->tp_subclasses;
         if (subclasses == NULL)
             return 0;
    -    assert(PyList_Check(subclasses));
    -    n = PyList_GET_SIZE(subclasses);
    -    for (i = 0; i < n; i++) {
    -        ref = PyList_GET_ITEM(subclasses, i);
    +    assert(PyDict_CheckExact(subclasses));
    +    i = 0;
    +    while (PyDict_Next(subclasses, &i, NULL, &ref)) {
             assert(PyWeakref_CheckRef(ref));
             subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
             assert(subclass != NULL);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:10:12 2013
    From: python-checkins at python.org (tim.golden)
    Date: Tue, 29 Oct 2013 22:10:12 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Issue_15792_Co?=
     =?utf-8?q?rrect_build_options_on_Win64=2E_Patch_by_Jeremy_Kloth=2E?=
    Message-ID: <3d8QRm0jfPzN41@mail.python.org>
    
    http://hg.python.org/cpython/rev/c49b8bdcb5cb
    changeset:   86759:c49b8bdcb5cb
    branch:      3.3
    parent:      86751:cd4007fb9c7e
    user:        Tim Golden 
    date:        Tue Oct 29 21:02:25 2013 +0000
    summary:
      Issue 15792 Correct build options on Win64. Patch by Jeremy Kloth.
    
    files:
      PC/VS9.0/x64.vsprops |  2 +-
      PCbuild/x64.props    |  2 +-
      2 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/PC/VS9.0/x64.vsprops b/PC/VS9.0/x64.vsprops
    --- a/PC/VS9.0/x64.vsprops
    +++ b/PC/VS9.0/x64.vsprops
    @@ -8,7 +8,7 @@
     	>
     	
     	
       
         
    -      /USECL:MS_OPTERON /GS- %(AdditionalOptions)
    +      false
           _WIN64;_M_X64;%(PreprocessorDefinitions)
         
         
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:10:13 2013
    From: python-checkins at python.org (tim.golden)
    Date: Tue, 29 Oct 2013 22:10:13 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_Null_merge?=
    Message-ID: <3d8QRn360pzN41@mail.python.org>
    
    http://hg.python.org/cpython/rev/96fe644180d6
    changeset:   86760:96fe644180d6
    parent:      86758:a7f1ce6fe293
    parent:      86759:c49b8bdcb5cb
    user:        Tim Golden 
    date:        Tue Oct 29 21:07:12 2013 +0000
    summary:
      Null merge
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:21:49 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 22:21:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_fix_language?=
    Message-ID: <3d8Qj96bw6z7LjQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/b88304180a2a
    changeset:   86761:b88304180a2a
    branch:      3.3
    parent:      86751:cd4007fb9c7e
    user:        Christian Heimes 
    date:        Tue Oct 29 22:19:39 2013 +0100
    summary:
      fix language
    
    files:
      Doc/library/ssl.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -32,7 +32,7 @@
     
        OpenSSL's internal random number generator does not properly handle fork.
        Applications must change the PRNG state of the parent process if they use
    -   any SSL feature with with :func:`os.fork`. Any successful call of
    +   any SSL feature with :func:`os.fork`. Any successful call of
        :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
        :func:`~ssl.RAND_pseudo_bytes` is sufficient.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:21:51 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 22:21:51 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuMyk6?=
    	=?utf-8?q?_merge?=
    Message-ID: <3d8QjC29VFz7Ljf@mail.python.org>
    
    http://hg.python.org/cpython/rev/62e7e08a0e21
    changeset:   86762:62e7e08a0e21
    branch:      3.3
    parent:      86761:b88304180a2a
    parent:      86759:c49b8bdcb5cb
    user:        Christian Heimes 
    date:        Tue Oct 29 22:20:52 2013 +0100
    summary:
      merge
    
    files:
      PC/VS9.0/x64.vsprops |  2 +-
      PCbuild/x64.props    |  2 +-
      2 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/PC/VS9.0/x64.vsprops b/PC/VS9.0/x64.vsprops
    --- a/PC/VS9.0/x64.vsprops
    +++ b/PC/VS9.0/x64.vsprops
    @@ -8,7 +8,7 @@
     	>
     	
     	
       
         
    -      /USECL:MS_OPTERON /GS- %(AdditionalOptions)
    +      false
           _WIN64;_M_X64;%(PreprocessorDefinitions)
         
         
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:21:52 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 22:21:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_merge?=
    Message-ID: <3d8QjD4vSqz7LjY@mail.python.org>
    
    http://hg.python.org/cpython/rev/287d7397218f
    changeset:   86763:287d7397218f
    parent:      86760:96fe644180d6
    parent:      86762:62e7e08a0e21
    user:        Christian Heimes 
    date:        Tue Oct 29 22:21:16 2013 +0100
    summary:
      merge
    
    files:
      Doc/library/ssl.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -33,7 +33,7 @@
     
        OpenSSL's internal random number generator does not properly handle fork.
        Applications must change the PRNG state of the parent process if they use
    -   any SSL feature with with :func:`os.fork`. Any successful call of
    +   any SSL feature with :func:`os.fork`. Any successful call of
        :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
        :func:`~ssl.RAND_pseudo_bytes` is sufficient.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 22:21:54 2013
    From: python-checkins at python.org (christian.heimes)
    Date: Tue, 29 Oct 2013 22:21:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_fix_language?=
    Message-ID: <3d8QjG0V2Xz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/161e76233449
    changeset:   86764:161e76233449
    branch:      2.7
    parent:      86757:244caf2ade0e
    user:        Christian Heimes 
    date:        Tue Oct 29 22:19:39 2013 +0100
    summary:
      fix language
    
    files:
      Doc/library/ssl.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
    --- a/Doc/library/ssl.rst
    +++ b/Doc/library/ssl.rst
    @@ -34,7 +34,7 @@
     
        OpenSSL's internal random number generator does not properly handle fork.
        Applications must change the PRNG state of the parent process if they use
    -   any SSL feature with with :func:`os.fork`. Any successful call of
    +   any SSL feature with :func:`os.fork`. Any successful call of
        :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
        :func:`~ssl.RAND_pseudo_bytes` is sufficient.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 23:01:24 2013
    From: python-checkins at python.org (ned.deily)
    Date: Tue, 29 Oct 2013 23:01:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319373=3A_Add_Misc?=
    	=?utf-8?q?/NEWS_entry=2E?=
    Message-ID: <3d8RZr6rFFz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/f5e0fd7db675
    changeset:   86765:f5e0fd7db675
    parent:      86763:287d7397218f
    user:        Ned Deily 
    date:        Tue Oct 29 15:00:48 2013 -0700
    summary:
      Issue #19373: Add Misc/NEWS entry.
    
    files:
      Misc/NEWS |  3 +++
      1 files changed, 3 insertions(+), 0 deletions(-)
    
    
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -147,6 +147,9 @@
     
     - Issue #15792: Correct build options on Win64. Patch by Jeremy Kloth.
     
    +- Issue #19373: Apply upstream change to Tk 8.5.15 fixing OS X 10.9
    +  screen refresh problem for OS X installer build.
    +
     Tools/Demos
     -----------
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 23:19:00 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 23:19:00 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5Mzcz?=
     =?utf-8?q?=3A_Apply_upstream_change_to_Tk_8=2E5=2E15_fixing_OS_X_10=2E9?=
    Message-ID: <3d8Rz85B4Tz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/bcbe4099206f
    changeset:   86766:bcbe4099206f
    branch:      2.7
    parent:      86756:ad779da9e351
    user:        Ned Deily 
    date:        Sun Oct 27 19:47:23 2013 -0700
    summary:
      Issue #19373: Apply upstream change to Tk 8.5.15 fixing OS X 10.9
    screen refresh problem.
    
    files:
      Mac/BuildScript/build-installer.py                |   8 ++++-
      Mac/BuildScript/issue19373_tk_8_5_15_source.patch |  13 ++++++++++
      2 files changed, 19 insertions(+), 2 deletions(-)
    
    
    diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
    --- a/Mac/BuildScript/build-installer.py
    +++ b/Mac/BuildScript/build-installer.py
    @@ -215,6 +215,9 @@
                   name="Tk 8.5.15",
                   url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
                   checksum='55b8e33f903210a4e1c8bce0f820657f',
    +              patches=[
    +                  "issue19373_tk_8_5_15_source.patch",
    +                   ],
                   buildDir="unix",
                   configure_pre=[
                         '--enable-aqua',
    @@ -797,8 +800,6 @@
     
         workDir = extractArchive(buildDir, sourceArchive)
         os.chdir(workDir)
    -    if 'buildDir' in recipe:
    -        os.chdir(recipe['buildDir'])
     
         for patch in recipe.get('patches', ()):
             if isinstance(patch, tuple):
    @@ -825,6 +826,9 @@
             runCommand('sh %s' % shellQuote(fn))
             os.unlink(fn)
     
    +    if 'buildDir' in recipe:
    +        os.chdir(recipe['buildDir'])
    +
         if configure is not None:
             configure_args = [
                 "--prefix=/usr/local",
    diff --git a/Mac/BuildScript/issue19373_tk_8_5_15_source.patch b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    new file mode 100644
    --- /dev/null
    +++ b/Mac/BuildScript/issue19373_tk_8_5_15_source.patch
    @@ -0,0 +1,13 @@
    +Issue #19373: Patch to Tk 8.5.15 to correct refresh problem on OS x 10.9.
    +From upstream checkin https://core.tcl.tk/tk/info/5a5abf71f9
    +
    +--- tk8.5.15/macosx/tkMacOSXDraw.c	2013-09-16 09:41:21.000000000 -0700
    ++++ Tk_Source_Code-5a5abf71f9fdb0da/macosx/tkMacOSXDraw.c	2013-10-27 13:27:00.000000000 -0700
    +@@ -1688,6 +1688,7 @@
    + {
    +     if (dcPtr->context) {
    + 	CGContextSynchronize(dcPtr->context);
    ++	[[dcPtr->view window] setViewsNeedDisplay:YES];
    + 	[[dcPtr->view window] enableFlushWindow];
    + 	if (dcPtr->focusLocked) {
    + 	    [dcPtr->view unlockFocus];
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 23:19:01 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Tue, 29 Oct 2013 23:19:01 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?=
    	=?utf-8?q?_merge_2=2E7=2E6_branch?=
    Message-ID: <3d8Rz96tLfz7LjT@mail.python.org>
    
    http://hg.python.org/cpython/rev/543672a458d5
    changeset:   86767:543672a458d5
    branch:      2.7
    parent:      86764:161e76233449
    parent:      86766:bcbe4099206f
    user:        Benjamin Peterson 
    date:        Tue Oct 29 18:18:52 2013 -0400
    summary:
      merge 2.7.6 branch
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 23:32:01 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 23:32:01 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319424=3A_Optimize?=
     =?utf-8?q?_PyUnicode=5FCompareWithASCIIString=28=29?=
    Message-ID: <3d8SG96c3bz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/34e166d60f37
    changeset:   86768:34e166d60f37
    parent:      86765:f5e0fd7db675
    user:        Victor Stinner 
    date:        Tue Oct 29 23:31:50 2013 +0100
    summary:
      Issue #19424: Optimize PyUnicode_CompareWithASCIIString()
    
    Use fast memcmp() instead of a loop using the slow PyUnicode_READ() macro.
    strlen() is still necessary to check Unicode string containing null bytes.
    
    files:
      Objects/unicodeobject.c |  43 ++++++++++++++++++++--------
      1 files changed, 30 insertions(+), 13 deletions(-)
    
    
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -10573,25 +10573,42 @@
     {
         Py_ssize_t i;
         int kind;
    -    void *data;
         Py_UCS4 chr;
     
         assert(_PyUnicode_CHECK(uni));
         if (PyUnicode_READY(uni) == -1)
             return -1;
         kind = PyUnicode_KIND(uni);
    -    data = PyUnicode_DATA(uni);
    -    /* Compare Unicode string and source character set string */
    -    for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++)
    -        if (chr != str[i])
    -            return (chr < (unsigned char)(str[i])) ? -1 : 1;
    -    /* This check keeps Python strings that end in '\0' from comparing equal
    -     to C strings identical up to that point. */
    -    if (PyUnicode_GET_LENGTH(uni) != i || chr)
    -        return 1; /* uni is longer */
    -    if (str[i])
    -        return -1; /* str is longer */
    -    return 0;
    +    if (kind == PyUnicode_1BYTE_KIND) {
    +        char *data = PyUnicode_1BYTE_DATA(uni);
    +        Py_ssize_t len1 = PyUnicode_GET_LENGTH(uni);
    +        size_t len, len2 = strlen(str);
    +        int cmp;
    +
    +        len = Py_MIN(len1, len2);
    +        cmp = memcmp(data, str, len);
    +        if (cmp != 0)
    +            return cmp;
    +        if (len1 > len2)
    +            return 1; /* uni is longer */
    +        if (len2 > len1)
    +            return -1; /* str is longer */
    +        return 0;
    +    }
    +    else {
    +        void *data = PyUnicode_DATA(uni);
    +        /* Compare Unicode string and source character set string */
    +        for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++)
    +            if (chr != str[i])
    +                return (chr < (unsigned char)(str[i])) ? -1 : 1;
    +        /* This check keeps Python strings that end in '\0' from comparing equal
    +         to C strings identical up to that point. */
    +        if (PyUnicode_GET_LENGTH(uni) != i || chr)
    +            return 1; /* uni is longer */
    +        if (str[i])
    +            return -1; /* str is longer */
    +        return 0;
    +    }
     }
     
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Tue Oct 29 23:44:24 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Tue, 29 Oct 2013 23:44:24 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319424=3A_Fix_the_?=
     =?utf-8?q?warnings_module_to_accept_filename_containing_surrogate?=
    Message-ID: <3d8SXS0qMdz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/c7326aa0b69c
    changeset:   86769:c7326aa0b69c
    user:        Victor Stinner 
    date:        Tue Oct 29 23:43:41 2013 +0100
    summary:
      Issue #19424: Fix the warnings module to accept filename containing surrogate
    characters.
    
    files:
      Lib/test/test_warnings.py |   12 +++
      Misc/NEWS                 |    3 +
      Python/_warnings.c        |  100 ++++++++++++++-----------
      3 files changed, 69 insertions(+), 46 deletions(-)
    
    
    diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
    --- a/Lib/test/test_warnings.py
    +++ b/Lib/test/test_warnings.py
    @@ -331,6 +331,18 @@
                 warning_tests.__name__ = module_name
                 sys.argv = argv
     
    +    def test_warn_explicit_non_ascii_filename(self):
    +        with original_warnings.catch_warnings(record=True,
    +                module=self.module) as w:
    +            self.module.resetwarnings()
    +            self.module.filterwarnings("always", category=UserWarning)
    +
    +            self.module.warn_explicit("text", UserWarning, "nonascii\xe9\u20ac", 1)
    +            self.assertEqual(w[-1].filename, "nonascii\xe9\u20ac")
    +
    +            self.module.warn_explicit("text", UserWarning, "surrogate\udc80", 1)
    +            self.assertEqual(w[-1].filename, "surrogate\udc80")
    +
         def test_warn_explicit_type_errors(self):
             # warn_explicit() should error out gracefully if it is given objects
             # of the wrong types.
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -31,6 +31,9 @@
     Library
     -------
     
    +- Issue #19424: Fix the warnings module to accept filename containing surrogate
    +  characters.
    +
     - Issue #19227: Remove pthread_atfork() handler. The handler was added to
       solve #18747 but has caused issues.
     
    diff --git a/Python/_warnings.c b/Python/_warnings.c
    --- a/Python/_warnings.c
    +++ b/Python/_warnings.c
    @@ -99,7 +99,7 @@
     
     
     /* The item is a borrowed reference. */
    -static const char *
    +static PyObject*
     get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno,
                PyObject *module, PyObject **item)
     {
    @@ -152,13 +152,12 @@
                 return NULL;
     
             if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln))
    -            return _PyUnicode_AsString(action);
    +            return action;
         }
     
         action = get_default_action();
    -    if (action != NULL) {
    -        return _PyUnicode_AsString(action);
    -    }
    +    if (action != NULL)
    +        return action;
     
         PyErr_SetString(PyExc_ValueError,
                         MODULE_NAME ".defaultaction not found");
    @@ -192,23 +191,26 @@
     normalize_module(PyObject *filename)
     {
         PyObject *module;
    -    const char *mod_str;
    +    int kind;
    +    void *data;
         Py_ssize_t len;
     
    -    int rc = PyObject_IsTrue(filename);
    -    if (rc == -1)
    -        return NULL;
    -    else if (rc == 0)
    -        return PyUnicode_FromString("");
    -
    -    mod_str = _PyUnicode_AsString(filename);
    -    if (mod_str == NULL)
    -        return NULL;
         len = PyUnicode_GetLength(filename);
         if (len < 0)
             return NULL;
    +
    +    if (len == 0)
    +        return PyUnicode_FromString("");
    +
    +    kind = PyUnicode_KIND(filename);
    +    data = PyUnicode_DATA(filename);
    +
    +    /* if filename.endswith(".py"): */
         if (len >= 3 &&
    -        strncmp(mod_str + (len - 3), ".py", 3) == 0) {
    +        PyUnicode_READ(kind, data, len-3) == '.' &&
    +        PyUnicode_READ(kind, data, len-2) == 'p' &&
    +        PyUnicode_READ(kind, data, len-1) == 'y')
    +    {
             module = PyUnicode_Substring(filename, 0, len-3);
         }
         else {
    @@ -273,19 +275,37 @@
     
         /* Print "  source_line\n" */
         if (sourceline) {
    -        char *source_line_str = _PyUnicode_AsString(sourceline);
    -        if (source_line_str == NULL)
    -                return;
    -        while (*source_line_str == ' ' || *source_line_str == '\t' ||
    -                *source_line_str == '\014')
    -            source_line_str++;
    +        int kind;
    +        void *data;
    +        Py_ssize_t i, len;
    +        Py_UCS4 ch;
    +        PyObject *truncated;
     
    -        PyFile_WriteString(source_line_str, f_stderr);
    +        if (PyUnicode_READY(sourceline) < 1)
    +            goto error;
    +
    +        kind = PyUnicode_KIND(sourceline);
    +        data = PyUnicode_DATA(sourceline);
    +        len = PyUnicode_GET_LENGTH(sourceline);
    +        for (i=0; i
    
    http://hg.python.org/cpython/rev/05e8dde3229c
    changeset:   86770:05e8dde3229c
    user:        Victor Stinner 
    date:        Tue Oct 29 23:58:05 2013 +0100
    summary:
      Issue #19424: Fix test_warnings for locale encoding unable to encode
    "\xe9\u20ac" characters
    
    files:
      Lib/test/test_warnings.py |  13 +++++++------
      1 files changed, 7 insertions(+), 6 deletions(-)
    
    
    diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
    --- a/Lib/test/test_warnings.py
    +++ b/Lib/test/test_warnings.py
    @@ -336,12 +336,13 @@
                     module=self.module) as w:
                 self.module.resetwarnings()
                 self.module.filterwarnings("always", category=UserWarning)
    -
    -            self.module.warn_explicit("text", UserWarning, "nonascii\xe9\u20ac", 1)
    -            self.assertEqual(w[-1].filename, "nonascii\xe9\u20ac")
    -
    -            self.module.warn_explicit("text", UserWarning, "surrogate\udc80", 1)
    -            self.assertEqual(w[-1].filename, "surrogate\udc80")
    +            for filename in ("nonascii\xe9\u20ac", "surrogate\udc80"):
    +                try:
    +                    os.fsencode(filename)
    +                except UnicodeEncodeError:
    +                    continue
    +                self.module.warn_explicit("text", UserWarning, filename, 1)
    +                self.assertEqual(w[-1].filename, filename)
     
         def test_warn_explicit_type_errors(self):
             # warn_explicit() should error out gracefully if it is given objects
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 00:35:26 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 00:35:26 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319442=3A_Fix_warn?=
     =?utf-8?q?ings_emitted_during_Python_shutdown?=
    Message-ID: <3d8TgL6dmRzPYM@mail.python.org>
    
    http://hg.python.org/cpython/rev/1787277915e9
    changeset:   86771:1787277915e9
    user:        Victor Stinner 
    date:        Wed Oct 30 00:04:59 2013 +0100
    summary:
      Issue #19442: Fix warnings emitted during Python shutdown
    
    Warnings may be emitted during Python shutdown, like "unclosed file XXX".
    During shutdown, globals()['__main__'] may be None.
    
    files:
      Python/_warnings.c |  17 ++++++++++++-----
      1 files changed, 12 insertions(+), 5 deletions(-)
    
    
    diff --git a/Python/_warnings.c b/Python/_warnings.c
    --- a/Python/_warnings.c
    +++ b/Python/_warnings.c
    @@ -540,7 +540,7 @@
         }
         else {
             *filename = NULL;
    -        if (PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) {
    +        if (*module != Py_None && PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) {
                 PyObject *argv = PySys_GetObject("argv");
                 /* PyList_Check() is needed because sys.argv is set to None during
                    Python finalization */
    @@ -564,8 +564,8 @@
                 else {
                     /* embedded interpreters don't have sys.argv, see bug #839151 */
                     *filename = PyUnicode_FromString("__main__");
    -                    if (*filename == NULL)
    -                        goto handle_error;
    +                if (*filename == NULL)
    +                    goto handle_error;
                 }
             }
             if (*filename == NULL) {
    @@ -621,8 +621,15 @@
         if (!setup_context(stack_level, &filename, &lineno, &module, ®istry))
             return NULL;
     
    -    res = warn_explicit(category, message, filename, lineno, module, registry,
    -                        NULL);
    +    if (module != Py_None) {
    +        res = warn_explicit(category, message, filename, lineno, module, registry,
    +                            NULL);
    +    }
    +    else {
    +        /* FIXME: emitting warnings at exit does crash Python */
    +        res = Py_None;
    +        Py_INCREF(res);
    +    }
         Py_DECREF(filename);
         Py_DECREF(registry);
         Py_DECREF(module);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 02:10:03 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 02:10:03 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454?=
    Message-ID: <3d8WmW1wzVz7LjP@mail.python.org>
    
    http://hg.python.org/peps/rev/311421ef9d4e
    changeset:   5234:311421ef9d4e
    user:        Victor Stinner 
    date:        Wed Oct 30 02:07:37 2013 +0100
    summary:
      PEP 454
    
    * Remove GroupedStats class: replaced with a new Snapshot.statistics() method
    * Filter: rename include attribute to inclusive
    * Snapshot.group_by() now raises a ValueError when cumulative parameter is
      miused
    
    files:
      pep-0454.txt |  120 ++++++++++++++------------------------
      1 files changed, 45 insertions(+), 75 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -105,7 +105,7 @@
     memory allocations.
     
     
    -Main Functions
    +Main functions
     --------------
     
     ``reset()`` function:
    @@ -150,7 +150,7 @@
         See also ``disable()`` and ``enable()`` functions.
     
     
    -Trace Functions
    +Trace functions
     ---------------
     
     When Python allocates a memory block, ``tracemalloc`` attachs a "trace" to
    @@ -235,7 +235,7 @@
     
     
     
    -Filter Functions
    +Filter functions
     ----------------
     
     ``add_filter(filter)`` function:
    @@ -272,7 +272,7 @@
     Filter
     ------
     
    -``Filter(include: bool, filename_pattern: str, lineno: int=None, traceback: bool=False)`` class:
    +``Filter(inclusive: bool, filename_pattern: str, lineno: int=None, traceback: bool=False)`` class:
     
         Filter to select which memory allocations are traced. Filters can be
         used to reduce the memory usage of the ``tracemalloc`` module, which
    @@ -287,14 +287,15 @@
         For example, use ``Filter(False, "")`` to exclude empty
         tracebacks.
     
    -``include`` attribute:
    +``inclusive`` attribute:
     
    -    If *include* is ``True``, only trace memory blocks allocated in a
    -    file with a name matching ``filename_pattern`` at line number
    -    ``lineno``.
    +    If *inclusive* is ``True`` (include), only trace memory blocks
    +    allocated in a file with a name matching ``filename_pattern`` at
    +    line number ``lineno``.
     
    -    If *include* is ``False``, ignore memory blocks allocated in a file
    -    with a name matching ``filename_pattern`` at line number ``lineno``.
    +    If *inclusive* is ``False`` (exclude), ignore memory blocks
    +    allocated in a file with a name matching ``filename_pattern`` at
    +    line number ``lineno``.
     
     ``lineno`` attribute:
     
    @@ -314,61 +315,6 @@
         See the ``get_traceback_limit()`` function.
     
     
    -GroupedStats
    -------------
    -
    -``GroupedStats(key_type: str, stats: dict, cumulative: bool)`` class:
    -
    -    Statistics of allocated memory blocks grouped by *key_type* as a
    -    dictionary.
    -
    -    The ``Snapshot.group_by()`` method creates a ``GroupedStats``
    -    instance.
    -
    -``compare_to(old_stats: GroupedStats, sort=True)`` method:
    -
    -    Compare statistics to an older ``GroupedStats`` instance. Return a
    -    list of ``Statistic`` instances.
    -
    -    The result is sorted from the biggest to the smallest by
    -    ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by
    -    *key*. Set the *sort* parameter to ``False`` to get the list
    -    unsorted.
    -
    -    See also the ``statistics()`` method.
    -
    -``statistics(sort=True)`` method:
    -
    -    Get statistics as a list of ``Statistic`` instances.
    -    ``Statistic.size_diff`` and ``Statistic.count_diff`` attributes are
    -    set to zero.
    -
    -    The result is sorted from the biggest to the smallest by
    -    ``abs(size_diff)``, *size*, ``abs(count_diff)``, *count* and then by
    -    *key*. Set the *sort* parameter to ``False`` to get the list
    -    unsorted.
    -
    -    See also the ``compare_to()`` method.
    -
    -``cumulative`` attribute:
    -
    -    If ``True``, size and count of memory blocks of all frames of the
    -    traceback of a trace were cumulated, not only the most recent frame.
    -
    -``key_type`` attribute:
    -
    -    Determine how memory allocations were grouped: see
    -    ``Snapshot.group_by()`` for the available values.
    -
    -``stats`` attribute:
    -
    -    Dictionary ``{key: [size: int, count: int]}`` where the type of
    -    *key* depends on the ``key_type`` attribute, *size* is the total
    -    size of memory blocks and *count* is the number of memory blocks.
    -
    -    See the ``Snapshot.group_by()`` method.
    -
    -
     Snapshot
     --------
     
    @@ -400,8 +346,11 @@
     
     ``group_by(key_type: str, cumulative: bool=False)`` method:
     
    -    Group statistics by *key_type*. Return a ``GroupedStats`` instance.
    -    Key types:
    +    Get statistics as a dictionary, grouped by *key_type*. Return a
    +    dictionary ``{key: statistic}`` where the key type depends on
    +    *key_type* and *statistic* is a ``Statistic`` instance.
    +
    +    Available key types:
     
         =====================  ========================  ================================================
         key_type               description               type
    @@ -413,9 +362,30 @@
     
         If *cumulative* is ``True``, cumulate size and count of memory
         blocks of all frames of the traceback of a trace, not only the most
    -    recent frame. The *cumulative* parameter is set to ``False`` if
    -    *key_type* is ``'traceback'``, or if the ``traceback_limit``
    -    attribute is less than ``2``.
    +    recent frame.
    +
    +    The cumulative mode can only be used with key types ``'filename'``
    +    and ``'lineno'`` with tracebacks with at least 2 frames (see
    +    ``traceback_limit``).
    +
    +
    +``statistics(key_type: str, cumulative: bool=False, compare_to=None)`` method:
    +
    +    Get statistics as a sorted list of ``Statistic`` instances, grouped
    +    by *key_type*.
    +
    +    See the ``group_by()`` method for *key_type* and *cumulative*
    +    parameters.
    +
    +    If *compare_to* is set to a previous ``Snapshot`` instance, compute
    +    the differences betwen the two snapshots. Otherwise,
    +    ``Statistic.size_diff`` and ``Statistic.count_diff`` attributes are
    +    set to zero.
    +
    +    The result is sorted from the biggest to the smallest by: absolute
    +    value of ``Statistic.size_diff``, ``Statistic.size``, absolute value
    +    of ``Statistic.count_diff``, ``Statistic.count`` and then by
    +    ``Statistic.key``.
     
     
     ``traceback_limit`` attribute:
    @@ -444,15 +414,15 @@
         Statistic on memory allocations.
     
         ``size_diff`` and ``count_diff`` attributes are the difference
    -    between two ``GroupedStats`` instance.
    +    between two ``Snapshot`` instance.
     
    -    ``GroupedStats.compare_to()``  and ``GroupedStats.statistics()``
    -    return a list of ``Statistic`` instances.
    +    ``Snapshot.statistics()`` returns a list of ``Statistic`` instances.
     
     ``key`` attribute:
     
    -    Key identifying the statistic. The key type depends on
    -    ``GroupedStats.key_type``, see the ``Snapshot.group_by()`` method.
    +    Key identifying the statistic. The key type depends on the
    +    *key_type* parameter of the ``Snapshot.group_by()`` or
    +    ``Snapshot.statistics()`` method.
     
     ``count`` attribute:
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Wed Oct 30 02:15:53 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 02:15:53 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?cGVwczogUEVQIDQ1NDogZ3JvdXBfYnkoKSBp?=
    	=?utf-8?q?s_private_again?=
    Message-ID: <3d8WvF3Kx7zRmJ@mail.python.org>
    
    http://hg.python.org/peps/rev/f7b2f04fb7a6
    changeset:   5235:f7b2f04fb7a6
    user:        Victor Stinner 
    date:        Wed Oct 30 02:15:25 2013 +0100
    summary:
      PEP 454: group_by() is private again
    
    files:
      pep-0454.txt |  29 +++++++----------------------
      1 files changed, 7 insertions(+), 22 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -344,13 +344,10 @@
         See also ``dump()``.
     
     
    -``group_by(key_type: str, cumulative: bool=False)`` method:
    +``statistics(key_type: str, cumulative: bool=False, compare_to=None)`` method:
     
    -    Get statistics as a dictionary, grouped by *key_type*. Return a
    -    dictionary ``{key: statistic}`` where the key type depends on
    -    *key_type* and *statistic* is a ``Statistic`` instance.
    -
    -    Available key types:
    +    Get statistics as a sorted list of ``Statistic`` instances, grouped
    +    by *key_type*:
     
         =====================  ========================  ================================================
         key_type               description               type
    @@ -362,20 +359,9 @@
     
         If *cumulative* is ``True``, cumulate size and count of memory
         blocks of all frames of the traceback of a trace, not only the most
    -    recent frame.
    -
    -    The cumulative mode can only be used with key types ``'filename'``
    -    and ``'lineno'`` with tracebacks with at least 2 frames (see
    -    ``traceback_limit``).
    -
    -
    -``statistics(key_type: str, cumulative: bool=False, compare_to=None)`` method:
    -
    -    Get statistics as a sorted list of ``Statistic`` instances, grouped
    -    by *key_type*.
    -
    -    See the ``group_by()`` method for *key_type* and *cumulative*
    -    parameters.
    +    recent frame. The cumulative mode can only be used with key types
    +    ``'filename'`` and ``'lineno'`` with ``traceback_limit`` greater
    +    than ``1``.
     
         If *compare_to* is set to a previous ``Snapshot`` instance, compute
         the differences betwen the two snapshots. Otherwise,
    @@ -421,8 +407,7 @@
     ``key`` attribute:
     
         Key identifying the statistic. The key type depends on the
    -    *key_type* parameter of the ``Snapshot.group_by()`` or
    -    ``Snapshot.statistics()`` method.
    +    *key_type* parameter of the ``Snapshot.statistics()`` method.
     
     ``count`` attribute:
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Wed Oct 30 03:26:20 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 03:26:20 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_update_comment?=
    Message-ID: <3d8YSX5xtrz7LjQ@mail.python.org>
    
    http://hg.python.org/cpython/rev/7fa3e824a4ee
    changeset:   86772:7fa3e824a4ee
    branch:      3.3
    parent:      86762:62e7e08a0e21
    user:        Benjamin Peterson 
    date:        Tue Oct 29 22:25:06 2013 -0400
    summary:
      update comment
    
    files:
      Python/ceval.c |  6 +++---
      1 files changed, 3 insertions(+), 3 deletions(-)
    
    
    diff --git a/Python/ceval.c b/Python/ceval.c
    --- a/Python/ceval.c
    +++ b/Python/ceval.c
    @@ -2573,7 +2573,7 @@
     
             TARGET(WITH_CLEANUP)
             {
    -            /* At the top of the stack are 1-3 values indicating
    +            /* At the top of the stack are 1-6 values indicating
                    how/why we entered the finally clause:
                    - TOP = None
                    - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
    @@ -2586,9 +2586,9 @@
                    otherwise we must call
                      EXIT(None, None, None)
     
    -               In the first two cases, we remove EXIT from the
    +               In the first three cases, we remove EXIT from the
                    stack, leaving the rest in the same order.  In the
    -               third case, we shift the bottom 3 values of the
    +               fourth case, we shift the bottom 3 values of the
                    stack down, and replace the empty spot with NULL.
     
                    In addition, if the stack represents an exception,
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 03:26:22 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 03:26:22 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?b?KTogbWVyZ2UgMy4z?=
    Message-ID: <3d8YSZ4xqcz7LjR@mail.python.org>
    
    http://hg.python.org/cpython/rev/28c04e954bb6
    changeset:   86773:28c04e954bb6
    parent:      86771:1787277915e9
    parent:      86772:7fa3e824a4ee
    user:        Benjamin Peterson 
    date:        Tue Oct 29 22:25:55 2013 -0400
    summary:
      merge 3.3
    
    files:
      Python/ceval.c |  6 +++---
      1 files changed, 3 insertions(+), 3 deletions(-)
    
    
    diff --git a/Python/ceval.c b/Python/ceval.c
    --- a/Python/ceval.c
    +++ b/Python/ceval.c
    @@ -2716,7 +2716,7 @@
             }
     
             TARGET(WITH_CLEANUP) {
    -            /* At the top of the stack are 1-3 values indicating
    +            /* At the top of the stack are 1-6 values indicating
                    how/why we entered the finally clause:
                    - TOP = None
                    - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
    @@ -2729,9 +2729,9 @@
                    otherwise we must call
                      EXIT(None, None, None)
     
    -               In the first two cases, we remove EXIT from the
    +               In the first three cases, we remove EXIT from the
                    stack, leaving the rest in the same order.  In the
    -               third case, we shift the bottom 3 values of the
    +               fourth case, we shift the bottom 3 values of the
                    stack down, and replace the empty spot with NULL.
     
                    In addition, if the stack represents an exception,
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From solipsis at pitrou.net  Wed Oct 30 07:34:03 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Wed, 30 Oct 2013 07:34:03 +0100
    Subject: [Python-checkins] Daily reference leaks (28c04e954bb6): sum=0
    Message-ID: 
    
    results for 28c04e954bb6 on branch "default"
    --------------------------------------------
    
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogv_sOU8', '-x']
    
    From python-checkins at python.org  Wed Oct 30 11:24:42 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 11:24:42 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_rename_reset=28=29?=
    	=?utf-8?q?_to_clear=5Ftraces=28=29?=
    Message-ID: <3d8m4V5gR7z7Ljs@mail.python.org>
    
    http://hg.python.org/peps/rev/b511af0f336b
    changeset:   5236:b511af0f336b
    user:        Victor Stinner 
    date:        Wed Oct 30 11:24:34 2013 +0100
    summary:
      PEP 454: rename reset() to clear_traces()
    
    Explain also in clear_traces() documentation how to get traces before clearing them.
    
    files:
      pep-0454.txt |  26 +++++++++++++++-----------
      1 files changed, 15 insertions(+), 11 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -24,12 +24,12 @@
     memory block was allocated. Using such tools to analyze Python memory
     allocations does not help because most memory blocks are allocated in
     the same C function, in ``PyMem_Malloc()`` for example. Moreover, Python
    -has an allocator for small object called "pymalloc" which keeps free
    +has an allocator for small objects called "pymalloc" which keeps free
     blocks for efficiency. This is not well handled by these tools.
     
     There are debug tools dedicated to the Python language like ``Heapy``
    -``Pympler`` and ``Meliae`` which lists all live objects using the
    -garbage module (functions like ``gc.get_objects()``,
    +``Pympler`` and ``Meliae`` which lists all alive objects using the
    +garbage collector module (functions like ``gc.get_objects()``,
     ``gc.get_referrers()`` and ``gc.get_referents()``), compute their size
     (ex: using ``sys.getsizeof()``) and group objects by type. These tools
     provide a better estimation of the memory usage of an application.  They
    @@ -108,7 +108,7 @@
     Main functions
     --------------
     
    -``reset()`` function:
    +``clear_traces()`` function:
     
         Clear traces of memory blocks allocated by Python.
     
    @@ -120,6 +120,9 @@
         Stop tracing Python memory allocations and clear traces of memory
         blocks allocated by Python.
     
    +    Call ``get_traces()`` or ``take_snapshot()`` function to get traces
    +    before clearing them.
    +
         See also ``enable()`` and ``is_enabled()`` functions.
     
     
    @@ -154,7 +157,7 @@
     ---------------
     
     When Python allocates a memory block, ``tracemalloc`` attachs a "trace" to
    -it to store information on it: its size in bytes and the traceback where the
    +the memory block to store its size in bytes and the traceback where the
     allocation occured.
     
     The following functions give access to these traces. A trace is a ``(size: int,
    @@ -199,8 +202,8 @@
         ``(filename: str, lineno: int)`` tuples.
     
         The list of traces do not include memory blocks allocated before the
    -    ``tracemalloc`` module was enabled and memory blocks ignored by
    -    filters (see ``get_filters()()``).
    +    ``tracemalloc`` module was enabled nor memory blocks ignored by
    +    filters (see ``get_filters()``).
     
         Return an empty list if the ``tracemalloc`` module is disabled.
     
    @@ -248,7 +251,8 @@
         is ignored if at least one exclusive filter matchs its trace.
     
         The new filter is not applied on already collected traces. Use the
    -    ``reset()`` function to ensure that all traces match the new filter.
    +    ``clear_traces()`` function to ensure that all traces match the new
    +    filter.
     
     
     ``clear_filters()`` function:
    @@ -284,8 +288,7 @@
         the comparison is case insensitive and the alternative separator
         ``'/'`` is replaced with the standard separator ``'\'``.
     
    -    For example, use ``Filter(False, "")`` to exclude empty
    -    tracebacks.
    +    Use ``Filter(False, "")`` to exclude empty tracebacks.
     
     ``inclusive`` attribute:
     
    @@ -384,7 +387,8 @@
         Traces of all memory blocks allocated by Python, result of the
         ``get_traces()`` function: list of ``(size: int, traceback: tuple)``
         tuples, *traceback* is a tuple of ``(filename: str, lineno: int)``
    -    tuples.
    +    tuples. *size* is the size of the memory block in bytes, *traceback*
    +    is the Python stack where the allocation occured.
     
     ``timestamp`` attribute:
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Wed Oct 30 16:32:48 2013
    From: python-checkins at python.org (barry.warsaw)
    Date: Wed, 30 Oct 2013 16:32:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E6=29=3A_Closing_the_2?=
    	=?utf-8?q?=2E6_branch?=
    Message-ID: <3d8tw06QjSz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/3edf679917ba
    changeset:   86774:3edf679917ba
    branch:      2.6
    parent:      86738:d409493e2152
    user:        Barry Warsaw 
    date:        Wed Oct 30 11:24:51 2013 -0400
    summary:
      Closing the 2.6 branch
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:29 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:29 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_use_the_collap?=
     =?utf-8?q?sed_path_in_the_run=5Fcgi_method_=28closes_=2319435=29?=
    Message-ID: <3d8wfn5VMDz7LkM@mail.python.org>
    
    http://hg.python.org/cpython/rev/e4fe8fcaef0d
    changeset:   86775:e4fe8fcaef0d
    branch:      2.7
    parent:      86766:bcbe4099206f
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:43:09 2013 -0400
    summary:
      use the collapsed path in the run_cgi method (closes #19435)
    
    files:
      Lib/CGIHTTPServer.py         |   9 ++++-----
      Lib/test/test_httpservers.py |  10 ++++++++++
      Misc/NEWS                    |   5 +++++
      3 files changed, 19 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/CGIHTTPServer.py b/Lib/CGIHTTPServer.py
    --- a/Lib/CGIHTTPServer.py
    +++ b/Lib/CGIHTTPServer.py
    @@ -105,18 +105,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -396,6 +396,11 @@
             else:
                 self.pythonexe = sys.executable
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -414,6 +419,7 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            os.remove(self.nocgi_path)
                 os.remove(self.file1_path)
                 os.remove(self.file2_path)
                 os.rmdir(self.cgi_dir)
    @@ -468,6 +474,10 @@
             self.assertEqual(('Hello World\n', 'text/html', 200),
                 (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.urlencode({'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
             headers = {'Content-type' : 'application/x-www-form-urlencoded'}
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -6,6 +6,11 @@
     
     *Release date: 2013-11-02*
     
    +Library
    +-------
    +
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
    +
     IDLE
     ----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:31 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:31 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?=
     =?utf-8?q?_merge_2=2E7=2E6_release_branch?=
    Message-ID: <3d8wfq0hc3z7Lk4@mail.python.org>
    
    http://hg.python.org/cpython/rev/dd12639b82bf
    changeset:   86776:dd12639b82bf
    branch:      2.7
    parent:      86767:543672a458d5
    parent:      86775:e4fe8fcaef0d
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:43:44 2013 -0400
    summary:
      merge 2.7.6 release branch
    
    files:
      Lib/CGIHTTPServer.py         |   9 ++++-----
      Lib/test/test_httpservers.py |  10 ++++++++++
      Misc/NEWS                    |   5 +++++
      3 files changed, 19 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/CGIHTTPServer.py b/Lib/CGIHTTPServer.py
    --- a/Lib/CGIHTTPServer.py
    +++ b/Lib/CGIHTTPServer.py
    @@ -105,18 +105,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -396,6 +396,11 @@
             else:
                 self.pythonexe = sys.executable
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -414,6 +419,7 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            os.remove(self.nocgi_path)
                 os.remove(self.file1_path)
                 os.remove(self.file2_path)
                 os.rmdir(self.cgi_dir)
    @@ -468,6 +474,10 @@
             self.assertEqual(('Hello World\n', 'text/html', 200),
                 (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.urlencode({'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
             headers = {'Content-type' : 'application/x-www-form-urlencoded'}
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -18,6 +18,11 @@
     
     *Release date: 2013-11-02*
     
    +Library
    +-------
    +
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
    +
     IDLE
     ----
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:32 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:32 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E1=29=3A_use_the_collap?=
     =?utf-8?q?sed_path_in_the_run=5Fcgi_method_=28closes_=2319435=29?=
    Message-ID: <3d8wfr2sLKz7LkJ@mail.python.org>
    
    http://hg.python.org/cpython/rev/b1ddcb220a7f
    changeset:   86777:b1ddcb220a7f
    branch:      3.1
    parent:      85751:713d71048ab9
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:43:09 2013 -0400
    summary:
      use the collapsed path in the run_cgi method (closes #19435)
    
    files:
      Lib/http/server.py           |   9 ++++-----
      Lib/test/test_httpservers.py |  10 ++++++++++
      Misc/NEWS                    |   2 ++
      3 files changed, 16 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/http/server.py b/Lib/http/server.py
    --- a/Lib/http/server.py
    +++ b/Lib/http/server.py
    @@ -926,18 +926,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -388,6 +388,11 @@
             else:
                 self.pythonexe = sys.executable
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0o777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -406,6 +411,7 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            os.remove(self.nocgi_path)
                 os.remove(self.file1_path)
                 os.remove(self.file2_path)
                 os.rmdir(self.cgi_dir)
    @@ -457,6 +463,10 @@
             self.assertEqual((b'Hello World\n', 'text/html', 200), \
                  (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.parse.urlencode(
                 {'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -13,6 +13,8 @@
     Library
     -------
     
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
    +
     - Issue #14984: On POSIX systems, when netrc is called without a filename
       argument (and therefore is reading the user's $HOME/.netrc file), it now
       enforces the same security rules as typical ftp clients: the .netrc file must
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:33 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?=
     =?utf-8?q?_merge_3=2E1_=28=2319435=29?=
    Message-ID: <3d8wfs5Yysz7LkM@mail.python.org>
    
    http://hg.python.org/cpython/rev/dda1a32748e0
    changeset:   86778:dda1a32748e0
    branch:      3.2
    parent:      85752:ef90c40fe6cf
    parent:      86777:b1ddcb220a7f
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:48:59 2013 -0400
    summary:
      merge 3.1 (#19435)
    
    files:
      Lib/http/server.py           |   9 ++++-----
      Lib/test/test_httpservers.py |  12 ++++++++++++
      Misc/NEWS                    |   2 ++
      3 files changed, 18 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/http/server.py b/Lib/http/server.py
    --- a/Lib/http/server.py
    +++ b/Lib/http/server.py
    @@ -968,18 +968,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -322,6 +322,7 @@
             self.parent_dir = tempfile.mkdtemp()
             self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin')
             os.mkdir(self.cgi_dir)
    +        self.nocgi_path = None
             self.file1_path = None
             self.file2_path = None
     
    @@ -342,6 +343,11 @@
                 self.tearDown()
                 self.skipTest("Python executable path is not encodable to utf-8")
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0o777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w', encoding='utf-8') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -359,6 +365,8 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            if self.nocgi_path:
    +                os.remove(self.nocgi_path)
                 if self.file1_path:
                     os.remove(self.file1_path)
                 if self.file2_path:
    @@ -415,6 +423,10 @@
             self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200),
                 (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.parse.urlencode(
                 {'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -10,6 +10,8 @@
     Library
     -------
     
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
    +
     - Issue #14984: On POSIX systems, when netrc is called without a filename
       argument (and therefore is reading the user's $HOME/.netrc file), it now
       enforces the same security rules as typical ftp clients: the .netrc file must
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:35 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMyk6?=
     =?utf-8?q?_merge_3=2E2_=28=2319435=29?=
    Message-ID: <3d8wfv0wGsz7LkM@mail.python.org>
    
    http://hg.python.org/cpython/rev/544b654d000c
    changeset:   86779:544b654d000c
    branch:      3.3
    parent:      86772:7fa3e824a4ee
    parent:      86778:dda1a32748e0
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:50:18 2013 -0400
    summary:
      merge 3.2 (#19435)
    
    files:
      Lib/http/server.py           |   9 ++++-----
      Lib/test/test_httpservers.py |  12 ++++++++++++
      Misc/NEWS                    |   1 +
      3 files changed, 17 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/http/server.py b/Lib/http/server.py
    --- a/Lib/http/server.py
    +++ b/Lib/http/server.py
    @@ -987,18 +987,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -325,6 +325,7 @@
             self.parent_dir = tempfile.mkdtemp()
             self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin')
             os.mkdir(self.cgi_dir)
    +        self.nocgi_path = None
             self.file1_path = None
             self.file2_path = None
     
    @@ -345,6 +346,11 @@
                 self.tearDown()
                 self.skipTest("Python executable path is not encodable to utf-8")
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0o777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w', encoding='utf-8') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -362,6 +368,8 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            if self.nocgi_path:
    +                os.remove(self.nocgi_path)
                 if self.file1_path:
                     os.remove(self.file1_path)
                 if self.file2_path:
    @@ -418,6 +426,10 @@
             self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200),
                 (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.parse.urlencode(
                 {'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -13,6 +13,7 @@
     Library
     -------
     
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
     
     
     What's New in Python 3.3.3 release candidate 1?
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 17:51:36 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Wed, 30 Oct 2013 17:51:36 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?b?KTogbWVyZ2UgMy4zICgjMTk0MzUp?=
    Message-ID: <3d8wfw3Z43z7LkP@mail.python.org>
    
    http://hg.python.org/cpython/rev/493a99acaf00
    changeset:   86780:493a99acaf00
    parent:      86773:28c04e954bb6
    parent:      86779:544b654d000c
    user:        Benjamin Peterson 
    date:        Wed Oct 30 12:51:16 2013 -0400
    summary:
      merge 3.3 (#19435)
    
    files:
      Lib/http/server.py           |   9 ++++-----
      Lib/test/test_httpservers.py |  12 ++++++++++++
      Misc/NEWS                    |   2 ++
      3 files changed, 18 insertions(+), 5 deletions(-)
    
    
    diff --git a/Lib/http/server.py b/Lib/http/server.py
    --- a/Lib/http/server.py
    +++ b/Lib/http/server.py
    @@ -995,18 +995,17 @@
     
         def run_cgi(self):
             """Execute a CGI script."""
    -        path = self.path
             dir, rest = self.cgi_info
     
    -        i = path.find('/', len(dir) + 1)
    +        i = rest.find('/')
             while i >= 0:
    -            nextdir = path[:i]
    -            nextrest = path[i+1:]
    +            nextdir = rest[:i]
    +            nextrest = rest[i+1:]
     
                 scriptdir = self.translate_path(nextdir)
                 if os.path.isdir(scriptdir):
                     dir, rest = nextdir, nextrest
    -                i = path.find('/', len(dir) + 1)
    +                i = rest.find('/')
                 else:
                     break
     
    diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
    --- a/Lib/test/test_httpservers.py
    +++ b/Lib/test/test_httpservers.py
    @@ -346,6 +346,7 @@
             self.parent_dir = tempfile.mkdtemp()
             self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin')
             os.mkdir(self.cgi_dir)
    +        self.nocgi_path = None
             self.file1_path = None
             self.file2_path = None
     
    @@ -366,6 +367,11 @@
                 self.tearDown()
                 self.skipTest("Python executable path is not encodable to utf-8")
     
    +        self.nocgi_path = os.path.join(self.parent_dir, 'nocgi.py')
    +        with open(self.nocgi_path, 'w') as fp:
    +            fp.write(cgi_file1 % self.pythonexe)
    +        os.chmod(self.nocgi_path, 0o777)
    +
             self.file1_path = os.path.join(self.cgi_dir, 'file1.py')
             with open(self.file1_path, 'w', encoding='utf-8') as file1:
                 file1.write(cgi_file1 % self.pythonexe)
    @@ -383,6 +389,8 @@
                 os.chdir(self.cwd)
                 if self.pythonexe != sys.executable:
                     os.remove(self.pythonexe)
    +            if self.nocgi_path:
    +                os.remove(self.nocgi_path)
                 if self.file1_path:
                     os.remove(self.file1_path)
                 if self.file2_path:
    @@ -439,6 +447,10 @@
             self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200),
                 (res.read(), res.getheader('Content-type'), res.status))
     
    +    def test_issue19435(self):
    +        res = self.request('///////////nocgi.py/../cgi-bin/nothere.sh')
    +        self.assertEqual(res.status, 404)
    +
         def test_post(self):
             params = urllib.parse.urlencode(
                 {'spam' : 1, 'eggs' : 'python', 'bacon' : 123456})
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -34,6 +34,8 @@
     - Issue #19424: Fix the warnings module to accept filename containing surrogate
       characters.
     
    +- Issue #19435: Fix directory traversal attack on CGIHttpRequestHandler.
    +
     - Issue #19227: Remove pthread_atfork() handler. The handler was added to
       solve #18747 but has caused issues.
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 18:27:25 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 18:27:25 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319424=3A_Fix_a_co?=
    	=?utf-8?q?mpiler_warning?=
    Message-ID: <3d8xSF1Z2sz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/52ec6a3eeda5
    changeset:   86781:52ec6a3eeda5
    user:        Victor Stinner 
    date:        Wed Oct 30 18:27:13 2013 +0100
    summary:
      Issue #19424: Fix a compiler warning
    
    memcmp() just takes raw pointers
    
    files:
      Objects/unicodeobject.c |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
    --- a/Objects/unicodeobject.c
    +++ b/Objects/unicodeobject.c
    @@ -10580,7 +10580,7 @@
             return -1;
         kind = PyUnicode_KIND(uni);
         if (kind == PyUnicode_1BYTE_KIND) {
    -        char *data = PyUnicode_1BYTE_DATA(uni);
    +        const void *data = PyUnicode_1BYTE_DATA(uni);
             Py_ssize_t len1 = PyUnicode_GET_LENGTH(uni);
             size_t len, len2 = strlen(str);
             int cmp;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 19:22:00 2013
    From: python-checkins at python.org (ezio.melotti)
    Date: Wed, 30 Oct 2013 19:22:00 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?devguide=3A_Update_devguide_now_that_?=
     =?utf-8?q?the_2=2E6_branch_has_been_closed=2E?=
    Message-ID: <3d8ygD0dxkz7LjN@mail.python.org>
    
    http://hg.python.org/devguide/rev/43665646b92a
    changeset:   650:43665646b92a
    user:        Ezio Melotti 
    date:        Wed Oct 30 20:21:38 2013 +0200
    summary:
      Update devguide now that the 2.6 branch has been closed.
    
    files:
      devcycle.rst |   4 +---
      faq.rst      |  11 +++++------
      2 files changed, 6 insertions(+), 9 deletions(-)
    
    
    diff --git a/devcycle.rst b/devcycle.rst
    --- a/devcycle.rst
    +++ b/devcycle.rst
    @@ -107,7 +107,7 @@
     Summary
     -------
     
    -There are 6 active branches right now in the Mercurial repository:
    +There are 5 open branches right now in the Mercurial repository:
     
     - the ``default`` branch holds the future 3.4 version and descends from ``3.3``
       (future RM: Larry Hastings)
    @@ -119,8 +119,6 @@
       (RM: Benjamin Peterson)
     - the ``2.7`` branch holds bug fixes for future 2.7.x maintenance releases and
       descends from ``2.6`` (RM: Benjamin Peterson)
    -- the ``2.6`` branch holds security fixes for future 2.6.x security releases
    -  (RM: Barry Warsaw)
     
     
     .. _stages:
    diff --git a/faq.rst b/faq.rst
    --- a/faq.rst
    +++ b/faq.rst
    @@ -269,12 +269,11 @@
     Typing ``hg branches`` displays the open branches in your local repository::
     
        $ hg branches
    -   default                    79844:2d53f92ed54c
    -   2.7                        79839:422a0175bbf5
    -   3.3                        79843:25722e983ada (inactive)
    -   3.2                        79840:d459a9576d6c (inactive)
    -   3.1                        76255:5a6fa1b8767f (inactive)
    -   2.6                        76213:f130ce67387d (inactive)
    +   default                    86781:52ec6a3eeda5
    +   2.7                        86776:dd12639b82bf
    +   3.3                        86779:544b654d000c (inactive)
    +   3.2                        86778:dda1a32748e0 (inactive)
    +   3.1                        86777:b1ddcb220a7f (inactive)
     
     Why are some branches marked "inactive"?
     ''''''''''''''''''''''''''''''''''''''''
    
    -- 
    Repository URL: http://hg.python.org/devguide
    
    From python-checkins at python.org  Wed Oct 30 19:58:53 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 19:58:53 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_os?=
     =?utf-8?q?=2Estatvfs=28=29=2C_handle_errors?=
    Message-ID: <3d8zTn4nHfzS6H@mail.python.org>
    
    http://hg.python.org/cpython/rev/7097b5c39db0
    changeset:   86782:7097b5c39db0
    user:        Victor Stinner 
    date:        Wed Oct 30 18:55:24 2013 +0100
    summary:
      Issue #19437: Fix os.statvfs(), handle errors
    
    files:
      Modules/posixmodule.c |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
    --- a/Modules/posixmodule.c
    +++ b/Modules/posixmodule.c
    @@ -9173,6 +9173,10 @@
         PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
         PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
     #endif
    +    if (PyErr_Occurred()) {
    +        Py_DECREF(v);
    +        return NULL;
    +    }
     
         return v;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 19:58:54 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Wed, 30 Oct 2013 19:58:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_sele?=
     =?utf-8?q?ct=2Eepoll=2Epoll=28=29=2C_fix_code_handling_PyMem=5FNew=28=29_?=
     =?utf-8?q?error?=
    Message-ID: <3d8zTp6bwKz7LjT@mail.python.org>
    
    http://hg.python.org/cpython/rev/b49f9aa12dae
    changeset:   86783:b49f9aa12dae
    user:        Victor Stinner 
    date:        Wed Oct 30 19:57:52 2013 +0100
    summary:
      Issue #19437: Fix select.epoll.poll(), fix code handling PyMem_New() error
    
    The bug was introduced with the select.epoll module! So it's 5 years old :-)
    
    files:
      Modules/selectmodule.c |  1 -
      1 files changed, 0 insertions(+), 1 deletions(-)
    
    
    diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
    --- a/Modules/selectmodule.c
    +++ b/Modules/selectmodule.c
    @@ -1459,7 +1459,6 @@
     
         evs = PyMem_New(struct epoll_event, maxevents);
         if (evs == NULL) {
    -        Py_DECREF(self);
             PyErr_NoMemory();
             return NULL;
         }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 20:31:54 2013
    From: python-checkins at python.org (charles-francois.natali)
    Date: Wed, 30 Oct 2013 20:31:54 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319172=3A_Add_a_ge?=
     =?utf-8?q?t=5Fmap=28=29_method_to_selectors=2E?=
    Message-ID: <3d90Ct1SgXz7Lk3@mail.python.org>
    
    http://hg.python.org/cpython/rev/b0ae96700301
    changeset:   86784:b0ae96700301
    user:        Charles-Fran?ois Natali 
    date:        Wed Oct 30 20:31:04 2013 +0100
    summary:
      Issue #19172: Add a get_map() method to selectors.
    
    files:
      Doc/library/selectors.rst  |   8 +++++++
      Lib/selectors.py           |  27 +++++++++++++++++++++++++-
      Lib/test/test_selectors.py |  27 ++++++++++++++++++++++++++
      3 files changed, 61 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst
    --- a/Doc/library/selectors.rst
    +++ b/Doc/library/selectors.rst
    @@ -164,6 +164,14 @@
           This returns the :class:`SelectorKey` instance associated to this file
           object, or raises :exc:`KeyError` if the file object is not registered.
     
    +   .. method:: get_map()
    +
    +      Return a mapping of file objects to selector keys.
    +
    +      This returns a :class:`~collections.abc.Mapping` instance mapping
    +      registered file objects to their associated :class:`SelectorKey`
    +      instance.
    +
     
     .. class:: DefaultSelector()
     
    diff --git a/Lib/selectors.py b/Lib/selectors.py
    --- a/Lib/selectors.py
    +++ b/Lib/selectors.py
    @@ -6,7 +6,7 @@
     
     
     from abc import ABCMeta, abstractmethod
    -from collections import namedtuple
    +from collections import namedtuple, Mapping
     import functools
     import select
     import sys
    @@ -44,6 +44,25 @@
     selected event mask and attached data."""
     
     
    +class _SelectorMapping(Mapping):
    +    """Mapping of file objects to selector keys."""
    +
    +    def __init__(self, selector):
    +        self._selector = selector
    +
    +    def __len__(self):
    +        return len(self._selector._fd_to_key)
    +
    +    def __getitem__(self, fileobj):
    +        try:
    +            return self._selector._fd_to_key[_fileobj_to_fd(fileobj)]
    +        except KeyError:
    +            raise KeyError("{!r} is not registered".format(fileobj)) from None
    +
    +    def __iter__(self):
    +        return iter(self._selector._fd_to_key)
    +
    +
     class BaseSelector(metaclass=ABCMeta):
         """Base selector class.
     
    @@ -62,6 +81,8 @@
         def __init__(self):
             # this maps file descriptors to keys
             self._fd_to_key = {}
    +        # read-only mapping returned by get_map()
    +        self._map = _SelectorMapping(self)
     
         def register(self, fileobj, events, data=None):
             """Register a file object.
    @@ -162,6 +183,10 @@
             except KeyError:
                 raise KeyError("{!r} is not registered".format(fileobj)) from None
     
    +    def get_map(self):
    +        """Return a mapping of file objects to selector keys."""
    +        return self._map
    +
         def __enter__(self):
             return self
     
    diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
    --- a/Lib/test/test_selectors.py
    +++ b/Lib/test/test_selectors.py
    @@ -153,6 +153,33 @@
             # unknown file obj
             self.assertRaises(KeyError, s.get_key, 999999)
     
    +    def test_get_map(self):
    +        s = self.SELECTOR()
    +        self.addCleanup(s.close)
    +
    +        rd, wr = socketpair()
    +        self.addCleanup(rd.close)
    +        self.addCleanup(wr.close)
    +
    +        keys = s.get_map()
    +        self.assertFalse(keys)
    +        self.assertEqual(len(keys), 0)
    +        self.assertEqual(list(keys), [])
    +        key = s.register(rd, selectors.EVENT_READ, "data")
    +        self.assertIn(rd, keys)
    +        self.assertEqual(key, keys[rd])
    +        self.assertEqual(len(keys), 1)
    +        self.assertEqual(list(keys), [rd.fileno()])
    +        self.assertEqual(list(keys.values()), [key])
    +
    +        # unknown file obj
    +        with self.assertRaises(KeyError):
    +            keys[999999]
    +
    +        # Read-only mapping
    +        with self.assertRaises(TypeError):
    +            del keys[rd]
    +
         def test_select(self):
             s = self.SELECTOR()
             self.addCleanup(s.close)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 22:53:01 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Wed, 30 Oct 2013 22:53:01 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_When_not_closin?=
     =?utf-8?q?g_the_connection_after_receiving_EOF=2C_still_remove_the?=
    Message-ID: <3d93Lj0qYjz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/14069b168246
    changeset:   86785:14069b168246
    user:        Guido van Rossum 
    date:        Wed Oct 30 14:36:58 2013 -0700
    summary:
      asyncio: When not closing the connection after receiving EOF, still remove the read handler.
    
    files:
      Lib/asyncio/selector_events.py |  7 ++++++-
      1 files changed, 6 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
    --- a/Lib/asyncio/selector_events.py
    +++ b/Lib/asyncio/selector_events.py
    @@ -468,7 +468,12 @@
                     self._protocol.data_received(data)
                 else:
                     keep_open = self._protocol.eof_received()
    -                if not keep_open:
    +                if keep_open:
    +                    # We're keeping the connection open so the
    +                    # protocol can write more, but we still can't
    +                    # receive more, so remove the reader callback.
    +                    self._loop.remove_reader(self._sock_fd)
    +                else:
                         self.close()
     
         def write(self, data):
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 22:53:02 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Wed, 30 Oct 2013 22:53:02 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_Update_some_com?=
    	=?utf-8?q?ments=2E?=
    Message-ID: <3d93Lk2xKwz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/0e0e8b8840b4
    changeset:   86786:0e0e8b8840b4
    user:        Guido van Rossum 
    date:        Wed Oct 30 14:38:05 2013 -0700
    summary:
      asyncio: Update some comments.
    
    files:
      Lib/asyncio/events.py |  4 +---
      1 files changed, 1 insertions(+), 3 deletions(-)
    
    
    diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py
    --- a/Lib/asyncio/events.py
    +++ b/Lib/asyncio/events.py
    @@ -42,7 +42,7 @@
     
     
     def make_handle(callback, args):
    -    # TODO: Inline this?
    +    # TODO: Inline this?  Or make it a private EventLoop method?
         assert not isinstance(callback, Handle), 'A Handle is not a callback'
         return Handle(callback, args)
     
    @@ -338,7 +338,6 @@
     
         def set_event_loop(self, loop):
             """Set the event loop."""
    -        # TODO: The isinstance() test violates the PEP.
             self._set_called = True
             assert loop is None or isinstance(loop, AbstractEventLoop)
             self._loop = loop
    @@ -375,7 +374,6 @@
     def set_event_loop_policy(policy):
         """XXX"""
         global _event_loop_policy
    -    # TODO: The isinstance() test violates the PEP.
         assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
         _event_loop_policy = policy
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 22:53:04 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Wed, 30 Oct 2013 22:53:04 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_Make_the_IOCP_p?=
     =?utf-8?q?roactor_support_=22waitable=22_handles_=28Richard_Oudkerk=29=2E?=
    Message-ID: <3d93Lm4DVMz7LjZ@mail.python.org>
    
    http://hg.python.org/cpython/rev/c019efc81d4e
    changeset:   86787:c019efc81d4e
    user:        Guido van Rossum 
    date:        Wed Oct 30 14:44:05 2013 -0700
    summary:
      asyncio: Make the IOCP proactor support "waitable" handles (Richard Oudkerk).
    
    files:
      Lib/asyncio/windows_events.py                |   40 ++
      Lib/test/test_asyncio/test_windows_events.py |   40 ++
      Modules/overlapped.c                         |  176 ++++++++++
      3 files changed, 256 insertions(+), 0 deletions(-)
    
    
    diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py
    --- a/Lib/asyncio/windows_events.py
    +++ b/Lib/asyncio/windows_events.py
    @@ -46,6 +46,22 @@
             return super().cancel()
     
     
    +class _WaitHandleFuture(futures.Future):
    +    """Subclass of Future which represents a wait handle."""
    +
    +    def __init__(self, wait_handle, *, loop=None):
    +        super().__init__(loop=loop)
    +        self._wait_handle = wait_handle
    +
    +    def cancel(self):
    +        super().cancel()
    +        try:
    +            _overlapped.UnregisterWait(self._wait_handle)
    +        except OSError as e:
    +            if e.winerror != _overlapped.ERROR_IO_PENDING:
    +                raise
    +
    +
     class PipeServer(object):
         """Class representing a pipe server.
     
    @@ -271,6 +287,30 @@
                     return windows_utils.PipeHandle(handle)
             return self._register(ov, None, finish, wait_for_post=True)
     
    +    def wait_for_handle(self, handle, timeout=None):
    +        if timeout is None:
    +            ms = _winapi.INFINITE
    +        else:
    +            ms = int(timeout * 1000 + 0.5)
    +
    +        # We only create ov so we can use ov.address as a key for the cache.
    +        ov = _overlapped.Overlapped(NULL)
    +        wh = _overlapped.RegisterWaitWithQueue(
    +            handle, self._iocp, ov.address, ms)
    +        f = _WaitHandleFuture(wh, loop=self._loop)
    +
    +        def finish(timed_out, _, ov):
    +            if not f.cancelled():
    +                try:
    +                    _overlapped.UnregisterWait(wh)
    +                except OSError as e:
    +                    if e.winerror != _overlapped.ERROR_IO_PENDING:
    +                        raise
    +            return not timed_out
    +
    +        self._cache[ov.address] = (f, ov, None, finish)
    +        return f
    +
         def _register_with_iocp(self, obj):
             # To get notifications of finished ops on this objects sent to the
             # completion port, were must register the handle.
    diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py
    --- a/Lib/test/test_asyncio/test_windows_events.py
    +++ b/Lib/test/test_asyncio/test_windows_events.py
    @@ -5,13 +5,17 @@
     if sys.platform != 'win32':
         raise unittest.SkipTest('Windows only')
     
    +import _winapi
    +
     import asyncio
     
     from asyncio import windows_events
    +from asyncio import futures
     from asyncio import protocols
     from asyncio import streams
     from asyncio import transports
     from asyncio import test_utils
    +from asyncio import _overlapped
     
     
     class UpperProto(protocols.Protocol):
    @@ -94,6 +98,42 @@
     
             return 'done'
     
    +    def test_wait_for_handle(self):
    +        event = _overlapped.CreateEvent(None, True, False, None)
    +        self.addCleanup(_winapi.CloseHandle, event)
    +
    +        # Wait for unset event with 0.2s timeout;
    +        # result should be False at timeout
    +        f = self.loop._proactor.wait_for_handle(event, 0.2)
    +        start = self.loop.time()
    +        self.loop.run_until_complete(f)
    +        elapsed = self.loop.time() - start
    +        self.assertFalse(f.result())
    +        self.assertTrue(0.18 < elapsed < 0.22, elapsed)
    +
    +        _overlapped.SetEvent(event)
    +
    +        # Wait for for set event;
    +        # result should be True immediately
    +        f = self.loop._proactor.wait_for_handle(event, 10)
    +        start = self.loop.time()
    +        self.loop.run_until_complete(f)
    +        elapsed = self.loop.time() - start
    +        self.assertTrue(f.result())
    +        self.assertTrue(0 <= elapsed < 0.02, elapsed)
    +
    +        _overlapped.ResetEvent(event)
    +
    +        # Wait for unset event with a cancelled future;
    +        # CancelledError should be raised immediately
    +        f = self.loop._proactor.wait_for_handle(event, 10)
    +        f.cancel()
    +        start = self.loop.time()
    +        with self.assertRaises(futures.CancelledError):
    +            self.loop.run_until_complete(f)
    +        elapsed = self.loop.time() - start
    +        self.assertTrue(0 <= elapsed < 0.02, elapsed)
    +
     
     if __name__ == '__main__':
         unittest.main()
    diff --git a/Modules/overlapped.c b/Modules/overlapped.c
    --- a/Modules/overlapped.c
    +++ b/Modules/overlapped.c
    @@ -228,6 +228,172 @@
     }
     
     /*
    + * Wait for a handle
    + */
    +
    +struct PostCallbackData {
    +    HANDLE CompletionPort;
    +    LPOVERLAPPED Overlapped;
    +};
    +
    +static VOID CALLBACK
    +PostToQueueCallback(PVOID lpParameter, BOOL TimerOrWaitFired)
    +{
    +    struct PostCallbackData *p = (struct PostCallbackData*) lpParameter;
    +
    +    PostQueuedCompletionStatus(p->CompletionPort, TimerOrWaitFired,
    +                               0, p->Overlapped);
    +    /* ignore possible error! */
    +    PyMem_Free(p);
    +}
    +
    +PyDoc_STRVAR(
    +    RegisterWaitWithQueue_doc,
    +    "RegisterWaitWithQueue(Object, CompletionPort, Overlapped, Timeout)\n"
    +    "    -> WaitHandle\n\n"
    +    "Register wait for Object; when complete CompletionPort is notified.\n");
    +
    +static PyObject *
    +overlapped_RegisterWaitWithQueue(PyObject *self, PyObject *args)
    +{
    +    HANDLE NewWaitObject;
    +    HANDLE Object;
    +    ULONG Milliseconds;
    +    struct PostCallbackData data, *pdata;
    +
    +    if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE F_POINTER F_DWORD,
    +                          &Object,
    +                          &data.CompletionPort,
    +                          &data.Overlapped,
    +                          &Milliseconds))
    +        return NULL;
    +
    +    pdata = PyMem_Malloc(sizeof(struct PostCallbackData));
    +    if (pdata == NULL)
    +        return SetFromWindowsErr(0);
    +
    +    *pdata = data;
    +
    +    if (!RegisterWaitForSingleObject(
    +            &NewWaitObject, Object, (WAITORTIMERCALLBACK)PostToQueueCallback,
    +            pdata, Milliseconds,
    +            WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE))
    +    {
    +        PyMem_Free(pdata);
    +        return SetFromWindowsErr(0);
    +    }
    +
    +    return Py_BuildValue(F_HANDLE, NewWaitObject);
    +}
    +
    +PyDoc_STRVAR(
    +    UnregisterWait_doc,
    +    "UnregisterWait(WaitHandle) -> None\n\n"
    +    "Unregister wait handle.\n");
    +
    +static PyObject *
    +overlapped_UnregisterWait(PyObject *self, PyObject *args)
    +{
    +    HANDLE WaitHandle;
    +    BOOL ret;
    +
    +    if (!PyArg_ParseTuple(args, F_HANDLE, &WaitHandle))
    +        return NULL;
    +
    +    Py_BEGIN_ALLOW_THREADS
    +    ret = UnregisterWait(WaitHandle);
    +    Py_END_ALLOW_THREADS
    +
    +    if (!ret)
    +        return SetFromWindowsErr(0);
    +    Py_RETURN_NONE;
    +}
    +
    +/*
    + * Event functions -- currently only used by tests
    + */
    +
    +PyDoc_STRVAR(
    +    CreateEvent_doc,
    +    "CreateEvent(EventAttributes, ManualReset, InitialState, Name)"
    +    " -> Handle\n\n"
    +    "Create an event.  EventAttributes must be None.\n");
    +
    +static PyObject *
    +overlapped_CreateEvent(PyObject *self, PyObject *args)
    +{
    +    PyObject *EventAttributes;
    +    BOOL ManualReset;
    +    BOOL InitialState;
    +    Py_UNICODE *Name;
    +    HANDLE Event;
    +
    +    if (!PyArg_ParseTuple(args, "O" F_BOOL F_BOOL "Z",
    +                          &EventAttributes, &ManualReset,
    +                          &InitialState, &Name))
    +        return NULL;
    +
    +    if (EventAttributes != Py_None) {
    +        PyErr_SetString(PyExc_ValueError, "EventAttributes must be None");
    +        return NULL;
    +    }
    +
    +    Py_BEGIN_ALLOW_THREADS
    +    Event = CreateEventW(NULL, ManualReset, InitialState, Name);
    +    Py_END_ALLOW_THREADS
    +
    +    if (Event == NULL)
    +        return SetFromWindowsErr(0);
    +    return Py_BuildValue(F_HANDLE, Event);
    +}
    +
    +PyDoc_STRVAR(
    +    SetEvent_doc,
    +    "SetEvent(Handle) -> None\n\n"
    +    "Set event.\n");
    +
    +static PyObject *
    +overlapped_SetEvent(PyObject *self, PyObject *args)
    +{
    +    HANDLE Handle;
    +    BOOL ret;
    +
    +    if (!PyArg_ParseTuple(args, F_HANDLE, &Handle))
    +        return NULL;
    +
    +    Py_BEGIN_ALLOW_THREADS
    +    ret = SetEvent(Handle);
    +    Py_END_ALLOW_THREADS
    +
    +    if (!ret)
    +        return SetFromWindowsErr(0);
    +    Py_RETURN_NONE;
    +}
    +
    +PyDoc_STRVAR(
    +    ResetEvent_doc,
    +    "ResetEvent(Handle) -> None\n\n"
    +    "Reset event.\n");
    +
    +static PyObject *
    +overlapped_ResetEvent(PyObject *self, PyObject *args)
    +{
    +    HANDLE Handle;
    +    BOOL ret;
    +
    +    if (!PyArg_ParseTuple(args, F_HANDLE, &Handle))
    +        return NULL;
    +
    +    Py_BEGIN_ALLOW_THREADS
    +    ret = ResetEvent(Handle);
    +    Py_END_ALLOW_THREADS
    +
    +    if (!ret)
    +        return SetFromWindowsErr(0);
    +    Py_RETURN_NONE;
    +}
    +
    +/*
      * Bind socket handle to local port without doing slow getaddrinfo()
      */
     
    @@ -1147,6 +1313,16 @@
          METH_VARARGS, FormatMessage_doc},
         {"BindLocal", overlapped_BindLocal,
          METH_VARARGS, BindLocal_doc},
    +    {"RegisterWaitWithQueue", overlapped_RegisterWaitWithQueue,
    +     METH_VARARGS, RegisterWaitWithQueue_doc},
    +    {"UnregisterWait", overlapped_UnregisterWait,
    +     METH_VARARGS, UnregisterWait_doc},
    +    {"CreateEvent", overlapped_CreateEvent,
    +     METH_VARARGS, CreateEvent_doc},
    +    {"SetEvent", overlapped_SetEvent,
    +     METH_VARARGS, SetEvent_doc},
    +    {"ResetEvent", overlapped_ResetEvent,
    +     METH_VARARGS, ResetEvent_doc},
         {NULL}
     };
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 22:53:06 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Wed, 30 Oct 2013 22:53:06 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_Add_support_for?=
     =?utf-8?q?_running_subprocesses_on_Windows_with_the_IOCP_event?=
    Message-ID: <3d93Lp18Bvz7LkH@mail.python.org>
    
    http://hg.python.org/cpython/rev/e008429ae156
    changeset:   86788:e008429ae156
    user:        Guido van Rossum 
    date:        Wed Oct 30 14:52:03 2013 -0700
    summary:
      asyncio: Add support for running subprocesses on Windows with the IOCP event loop (Richard Oudkerk).
    
    files:
      Lib/asyncio/__init__.py                     |   12 +-
      Lib/asyncio/proactor_events.py              |   11 +-
      Lib/asyncio/unix_events.py                  |  145 +---------
      Lib/asyncio/windows_events.py               |   34 ++-
      Lib/asyncio/windows_utils.py                |   19 +-
      Lib/test/test_asyncio/test_events.py        |  105 ++++--
      Lib/test/test_asyncio/test_windows_utils.py |    6 +-
      7 files changed, 137 insertions(+), 195 deletions(-)
    
    
    diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py
    --- a/Lib/asyncio/__init__.py
    +++ b/Lib/asyncio/__init__.py
    @@ -4,10 +4,18 @@
     
     # The selectors module is in the stdlib in Python 3.4 but not in 3.3.
     # Do this first, so the other submodules can use "from . import selectors".
    +# Prefer asyncio/selectors.py over the stdlib one, as ours may be newer.
     try:
    +    from . import selectors
    +except ImportError:
         import selectors  # Will also be exported.
    -except ImportError:
    -    from . import selectors
    +
    +if sys.platform == 'win32':
    +    # Similar thing for _overlapped.
    +    try:
    +        from . import _overlapped
    +    except ImportError:
    +        import _overlapped  # Will also be exported.
     
     # This relies on each of the submodules having an __all__ variable.
     from .futures import *
    diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
    --- a/Lib/asyncio/proactor_events.py
    +++ b/Lib/asyncio/proactor_events.py
    @@ -267,8 +267,15 @@
             return _ProactorReadPipeTransport(self, sock, protocol, waiter, extra)
     
         def _make_write_pipe_transport(self, sock, protocol, waiter=None,
    -                                   extra=None):
    -        return _ProactorWritePipeTransport(self, sock, protocol, waiter, extra)
    +                                   extra=None, check_for_hangup=True):
    +        if check_for_hangup:
    +            # We want connection_lost() to be called when other end closes
    +            return _ProactorDuplexPipeTransport(self,
    +                                                sock, protocol, waiter, extra)
    +        else:
    +            # If other end closes we may not notice for a long time
    +            return _ProactorWritePipeTransport(self, sock, protocol, waiter,
    +                                               extra)
     
         def close(self):
             if self._proactor is not None:
    diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
    --- a/Lib/asyncio/unix_events.py
    +++ b/Lib/asyncio/unix_events.py
    @@ -1,6 +1,5 @@
     """Selector eventloop for Unix with signal handling."""
     
    -import collections
     import errno
     import fcntl
     import os
    @@ -11,6 +10,7 @@
     import sys
     
     
    +from . import base_subprocess
     from . import constants
     from . import events
     from . import protocols
    @@ -406,159 +406,20 @@
                 self._loop = None
     
     
    -class _UnixWriteSubprocessPipeProto(protocols.BaseProtocol):
    -    pipe = None
    +class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport):
     
    -    def __init__(self, proc, fd):
    -        self.proc = proc
    -        self.fd = fd
    -        self.connected = False
    -        self.disconnected = False
    -        proc._pipes[fd] = self
    -
    -    def connection_made(self, transport):
    -        self.connected = True
    -        self.pipe = transport
    -        self.proc._try_connected()
    -
    -    def connection_lost(self, exc):
    -        self.disconnected = True
    -        self.proc._pipe_connection_lost(self.fd, exc)
    -
    -
    -class _UnixReadSubprocessPipeProto(_UnixWriteSubprocessPipeProto,
    -                                   protocols.Protocol):
    -
    -    def data_received(self, data):
    -        self.proc._pipe_data_received(self.fd, data)
    -
    -    def eof_received(self):
    -        pass
    -
    -
    -class _UnixSubprocessTransport(transports.SubprocessTransport):
    -
    -    def __init__(self, loop, protocol, args, shell,
    -                 stdin, stdout, stderr, bufsize,
    -                 extra=None, **kwargs):
    -        super().__init__(extra)
    -        self._protocol = protocol
    -        self._loop = loop
    -
    -        self._pipes = {}
    +    def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
             stdin_w = None
             if stdin == subprocess.PIPE:
    -            self._pipes[STDIN] = None
                 # Use a socket pair for stdin, since not all platforms
                 # support selecting read events on the write end of a
                 # socket (which we use in order to detect closing of the
                 # other end).  Notably this is needed on AIX, and works
                 # just fine on other platforms.
                 stdin, stdin_w = self._loop._socketpair()
    -        if stdout == subprocess.PIPE:
    -            self._pipes[STDOUT] = None
    -        if stderr == subprocess.PIPE:
    -            self._pipes[STDERR] = None
    -        self._pending_calls = collections.deque()
    -        self._finished = False
    -        self._returncode = None
    -
             self._proc = subprocess.Popen(
                 args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr,
                 universal_newlines=False, bufsize=bufsize, **kwargs)
             if stdin_w is not None:
                 stdin.close()
                 self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize)
    -        self._extra['subprocess'] = self._proc
    -
    -    def close(self):
    -        for proto in self._pipes.values():
    -            proto.pipe.close()
    -        if self._returncode is None:
    -            self.terminate()
    -
    -    def get_pid(self):
    -        return self._proc.pid
    -
    -    def get_returncode(self):
    -        return self._returncode
    -
    -    def get_pipe_transport(self, fd):
    -        if fd in self._pipes:
    -            return self._pipes[fd].pipe
    -        else:
    -            return None
    -
    -    def send_signal(self, signal):
    -        self._proc.send_signal(signal)
    -
    -    def terminate(self):
    -        self._proc.terminate()
    -
    -    def kill(self):
    -        self._proc.kill()
    -
    -    @tasks.coroutine
    -    def _post_init(self):
    -        proc = self._proc
    -        loop = self._loop
    -        if proc.stdin is not None:
    -            transp, proto = yield from loop.connect_write_pipe(
    -                lambda: _UnixWriteSubprocessPipeProto(self, STDIN),
    -                proc.stdin)
    -        if proc.stdout is not None:
    -            transp, proto = yield from loop.connect_read_pipe(
    -                lambda: _UnixReadSubprocessPipeProto(self, STDOUT),
    -                proc.stdout)
    -        if proc.stderr is not None:
    -            transp, proto = yield from loop.connect_read_pipe(
    -                lambda: _UnixReadSubprocessPipeProto(self, STDERR),
    -                proc.stderr)
    -        if not self._pipes:
    -            self._try_connected()
    -
    -    def _call(self, cb, *data):
    -        if self._pending_calls is not None:
    -            self._pending_calls.append((cb, data))
    -        else:
    -            self._loop.call_soon(cb, *data)
    -
    -    def _try_connected(self):
    -        assert self._pending_calls is not None
    -        if all(p is not None and p.connected for p in self._pipes.values()):
    -            self._loop.call_soon(self._protocol.connection_made, self)
    -            for callback, data in self._pending_calls:
    -                self._loop.call_soon(callback, *data)
    -            self._pending_calls = None
    -
    -    def _pipe_connection_lost(self, fd, exc):
    -        self._call(self._protocol.pipe_connection_lost, fd, exc)
    -        self._try_finish()
    -
    -    def _pipe_data_received(self, fd, data):
    -        self._call(self._protocol.pipe_data_received, fd, data)
    -
    -    def _process_exited(self, returncode):
    -        assert returncode is not None, returncode
    -        assert self._returncode is None, self._returncode
    -        self._returncode = returncode
    -        self._loop._subprocess_closed(self)
    -        self._call(self._protocol.process_exited)
    -        self._try_finish()
    -
    -    def _try_finish(self):
    -        assert not self._finished
    -        if self._returncode is None:
    -            return
    -        if all(p is not None and p.disconnected
    -               for p in self._pipes.values()):
    -            self._finished = True
    -            self._loop.call_soon(self._call_connection_lost, None)
    -
    -    def _call_connection_lost(self, exc):
    -        try:
    -            self._protocol.connection_lost(exc)
    -        finally:
    -            self._proc = None
    -            self._protocol = None
    -            self._loop = None
    diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py
    --- a/Lib/asyncio/windows_events.py
    +++ b/Lib/asyncio/windows_events.py
    @@ -2,21 +2,19 @@
     
     import errno
     import socket
    +import subprocess
     import weakref
     import struct
     import _winapi
     
    +from . import base_subprocess
     from . import futures
     from . import proactor_events
     from . import selector_events
     from . import tasks
     from . import windows_utils
     from .log import logger
    -
    -try:
    -    import _overlapped
    -except ImportError:
    -    from . import _overlapped
    +from . import _overlapped
     
     
     __all__ = ['SelectorEventLoop', 'ProactorEventLoop', 'IocpProactor']
    @@ -168,6 +166,19 @@
         def _stop_serving(self, server):
             server.close()
     
    +    @tasks.coroutine
    +    def _make_subprocess_transport(self, protocol, args, shell,
    +                                   stdin, stdout, stderr, bufsize,
    +                                   extra=None, **kwargs):
    +        transp = _WindowsSubprocessTransport(self, protocol, args, shell,
    +                                             stdin, stdout, stderr, bufsize,
    +                                             extra=None, **kwargs)
    +        yield from transp._post_init()
    +        return transp
    +
    +    def _subprocess_closed(self, transport):
    +        pass
    +
     
     class IocpProactor:
         """Proactor implementation using IOCP."""
    @@ -413,3 +424,16 @@
             if self._iocp is not None:
                 _winapi.CloseHandle(self._iocp)
                 self._iocp = None
    +
    +
    +class _WindowsSubprocessTransport(base_subprocess.BaseSubprocessTransport):
    +
    +    def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
    +        self._proc = windows_utils.Popen(
    +            args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr,
    +            bufsize=bufsize, **kwargs)
    +        def callback(f):
    +            returncode = self._proc.poll()
    +            self._process_exited(returncode)
    +        f = self._loop._proactor.wait_for_handle(int(self._proc._handle))
    +        f.add_done_callback(callback)
    diff --git a/Lib/asyncio/windows_utils.py b/Lib/asyncio/windows_utils.py
    --- a/Lib/asyncio/windows_utils.py
    +++ b/Lib/asyncio/windows_utils.py
    @@ -24,6 +24,7 @@
     
     BUFSIZE = 8192
     PIPE = subprocess.PIPE
    +STDOUT = subprocess.STDOUT
     _mmap_counter = itertools.count()
     
     #
    @@ -146,24 +147,34 @@
         The stdin, stdout, stderr are None or instances of PipeHandle.
         """
         def __init__(self, args, stdin=None, stdout=None, stderr=None, **kwds):
    +        assert not kwds.get('universal_newlines')
    +        assert kwds.get('bufsize', 0) == 0
             stdin_rfd = stdout_wfd = stderr_wfd = None
             stdin_wh = stdout_rh = stderr_rh = None
             if stdin == PIPE:
    -            stdin_rh, stdin_wh = pipe(overlapped=(False, True))
    +            stdin_rh, stdin_wh = pipe(overlapped=(False, True), duplex=True)
                 stdin_rfd = msvcrt.open_osfhandle(stdin_rh, os.O_RDONLY)
    +        else:
    +            stdin_rfd = stdin
             if stdout == PIPE:
                 stdout_rh, stdout_wh = pipe(overlapped=(True, False))
                 stdout_wfd = msvcrt.open_osfhandle(stdout_wh, 0)
    +        else:
    +            stdout_wfd = stdout
             if stderr == PIPE:
                 stderr_rh, stderr_wh = pipe(overlapped=(True, False))
                 stderr_wfd = msvcrt.open_osfhandle(stderr_wh, 0)
    +        elif stderr == STDOUT:
    +            stderr_wfd = stdout_wfd
    +        else:
    +            stderr_wfd = stderr
             try:
    -            super().__init__(args, bufsize=0, universal_newlines=False,
    -                             stdin=stdin_rfd, stdout=stdout_wfd,
    +            super().__init__(args, stdin=stdin_rfd, stdout=stdout_wfd,
                                  stderr=stderr_wfd, **kwds)
             except:
                 for h in (stdin_wh, stdout_rh, stderr_rh):
    -                _winapi.CloseHandle(h)
    +                if h is not None:
    +                    _winapi.CloseHandle(h)
                 raise
             else:
                 if stdin_wh is not None:
    diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
    --- a/Lib/test/test_asyncio/test_events.py
    +++ b/Lib/test/test_asyncio/test_events.py
    @@ -955,8 +955,23 @@
             r.close()
             w.close()
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
    +
    +class SubprocessTestsMixin:
    +
    +    def check_terminated(self, returncode):
    +        if sys.platform == 'win32':
    +            self.assertIsInstance(returncode, int)
    +            self.assertNotEqual(0, returncode)
    +        else:
    +            self.assertEqual(-signal.SIGTERM, returncode)
    +
    +    def check_killed(self, returncode):
    +        if sys.platform == 'win32':
    +            self.assertIsInstance(returncode, int)
    +            self.assertNotEqual(0, returncode)
    +        else:
    +            self.assertEqual(-signal.SIGKILL, returncode)
    +
         def test_subprocess_exec(self):
             proto = None
             transp = None
    @@ -980,11 +995,9 @@
             self.loop.run_until_complete(proto.got_data[1].wait())
             transp.close()
             self.loop.run_until_complete(proto.completed)
    -        self.assertEqual(-signal.SIGTERM, proto.returncode)
    +        self.check_terminated(proto.returncode)
             self.assertEqual(b'Python The Winner', proto.data[1])
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_interactive(self):
             proto = None
             transp = None
    @@ -1017,10 +1030,8 @@
                 transp.close()
     
             self.loop.run_until_complete(proto.completed)
    -        self.assertEqual(-signal.SIGTERM, proto.returncode)
    +        self.check_terminated(proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_shell(self):
             proto = None
             transp = None
    @@ -1030,7 +1041,7 @@
                 nonlocal proto, transp
                 transp, proto = yield from self.loop.subprocess_shell(
                     functools.partial(MySubprocessProtocol, self.loop),
    -                'echo "Python"')
    +                'echo Python')
                 self.assertIsInstance(proto, MySubprocessProtocol)
     
             self.loop.run_until_complete(connect())
    @@ -1040,10 +1051,9 @@
             self.loop.run_until_complete(proto.completed)
             self.assertEqual(0, proto.returncode)
             self.assertTrue(all(f.done() for f in proto.disconnects.values()))
    -        self.assertEqual({1: b'Python\n', 2: b''}, proto.data)
    +        self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
    +        self.assertEqual(proto.data[2], b'')
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_exitcode(self):
             proto = None
     
    @@ -1059,8 +1069,6 @@
             self.loop.run_until_complete(proto.completed)
             self.assertEqual(7, proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_close_after_finish(self):
             proto = None
             transp = None
    @@ -1081,8 +1089,6 @@
             self.assertEqual(7, proto.returncode)
             self.assertIsNone(transp.close())
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_kill(self):
             proto = None
             transp = None
    @@ -1102,10 +1108,30 @@
     
             transp.kill()
             self.loop.run_until_complete(proto.completed)
    -        self.assertEqual(-signal.SIGKILL, proto.returncode)
    +        self.check_killed(proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
    +    def test_subprocess_terminate(self):
    +        proto = None
    +        transp = None
    +
    +        prog = os.path.join(os.path.dirname(__file__), 'echo.py')
    +
    +        @tasks.coroutine
    +        def connect():
    +            nonlocal proto, transp
    +            transp, proto = yield from self.loop.subprocess_exec(
    +                functools.partial(MySubprocessProtocol, self.loop),
    +                sys.executable, prog)
    +            self.assertIsInstance(proto, MySubprocessProtocol)
    +
    +        self.loop.run_until_complete(connect())
    +        self.loop.run_until_complete(proto.connected)
    +
    +        transp.terminate()
    +        self.loop.run_until_complete(proto.completed)
    +        self.check_terminated(proto.returncode)
    +
    +    @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
         def test_subprocess_send_signal(self):
             proto = None
             transp = None
    @@ -1127,8 +1153,6 @@
             self.loop.run_until_complete(proto.completed)
             self.assertEqual(-signal.SIGHUP, proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_stderr(self):
             proto = None
             transp = None
    @@ -1156,8 +1180,6 @@
             self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
             self.assertEqual(0, proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_stderr_redirect_to_stdout(self):
             proto = None
             transp = None
    @@ -1188,8 +1210,6 @@
             transp.close()
             self.assertEqual(0, proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_close_client_stream(self):
             proto = None
             transp = None
    @@ -1217,14 +1237,18 @@
             self.loop.run_until_complete(proto.disconnects[1])
             stdin.write(b'xxx')
             self.loop.run_until_complete(proto.got_data[2].wait())
    -        self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
    -
    +        if sys.platform != 'win32':
    +            self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
    +        else:
    +            # After closing the read-end of a pipe, writing to the
    +            # write-end using os.write() fails with errno==EINVAL and
    +            # GetLastError()==ERROR_INVALID_NAME on Windows!?!  (Using
    +            # WriteFile() we get ERROR_BROKEN_PIPE as expected.)
    +            self.assertEqual(b'ERR:OSError', proto.data[2])
             transp.close()
             self.loop.run_until_complete(proto.completed)
    -        self.assertEqual(-signal.SIGTERM, proto.returncode)
    +        self.check_terminated(proto.returncode)
     
    -    @unittest.skipIf(sys.platform == 'win32',
    -                     "Don't support subprocess for Windows yet")
         def test_subprocess_wait_no_same_group(self):
             proto = None
             transp = None
    @@ -1252,7 +1276,10 @@
             def create_event_loop(self):
                 return windows_events.SelectorEventLoop()
     
    -    class ProactorEventLoopTests(EventLoopTestsMixin, unittest.TestCase):
    +
    +    class ProactorEventLoopTests(EventLoopTestsMixin,
    +                                 SubprocessTestsMixin,
    +                                 unittest.TestCase):
     
             def create_event_loop(self):
                 return windows_events.ProactorEventLoop()
    @@ -1283,26 +1310,34 @@
         from asyncio import unix_events
     
         if hasattr(selectors, 'KqueueSelector'):
    -        class KqueueEventLoopTests(EventLoopTestsMixin, unittest.TestCase):
    +        class KqueueEventLoopTests(EventLoopTestsMixin,
    +                                   SubprocessTestsMixin,
    +                                   unittest.TestCase):
     
                 def create_event_loop(self):
                     return unix_events.SelectorEventLoop(
                         selectors.KqueueSelector())
     
         if hasattr(selectors, 'EpollSelector'):
    -        class EPollEventLoopTests(EventLoopTestsMixin, unittest.TestCase):
    +        class EPollEventLoopTests(EventLoopTestsMixin,
    +                                  SubprocessTestsMixin,
    +                                  unittest.TestCase):
     
                 def create_event_loop(self):
                     return unix_events.SelectorEventLoop(selectors.EpollSelector())
     
         if hasattr(selectors, 'PollSelector'):
    -        class PollEventLoopTests(EventLoopTestsMixin, unittest.TestCase):
    +        class PollEventLoopTests(EventLoopTestsMixin,
    +                                 SubprocessTestsMixin,
    +                                 unittest.TestCase):
     
                 def create_event_loop(self):
                     return unix_events.SelectorEventLoop(selectors.PollSelector())
     
         # Should always exist.
    -    class SelectEventLoopTests(EventLoopTestsMixin, unittest.TestCase):
    +    class SelectEventLoopTests(EventLoopTestsMixin,
    +                               SubprocessTestsMixin,
    +                               unittest.TestCase):
     
             def create_event_loop(self):
                 return unix_events.SelectorEventLoop(selectors.SelectSelector())
    diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py
    --- a/Lib/test/test_asyncio/test_windows_utils.py
    +++ b/Lib/test/test_asyncio/test_windows_utils.py
    @@ -11,11 +11,7 @@
     import _winapi
     
     from asyncio import windows_utils
    -
    -try:
    -    import _overlapped
    -except ImportError:
    -    from asyncio import _overlapped
    +from asyncio import _overlapped
     
     
     class WinsocketpairTests(unittest.TestCase):
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Wed Oct 30 22:56:55 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Wed, 30 Oct 2013 22:56:55 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_asyncio=3A_Add_new_file_?=
    	=?utf-8?b?KGZvcmdvdHRlbiku?=
    Message-ID: <3d93RC5Q7Mz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/a28f3eebe8ae
    changeset:   86789:a28f3eebe8ae
    user:        Guido van Rossum 
    date:        Wed Oct 30 14:56:49 2013 -0700
    summary:
      asyncio: Add new file (forgotten).
    
    files:
      Lib/asyncio/base_subprocess.py |  166 +++++++++++++++++++++
      1 files changed, 166 insertions(+), 0 deletions(-)
    
    
    diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py
    new file mode 100644
    --- /dev/null
    +++ b/Lib/asyncio/base_subprocess.py
    @@ -0,0 +1,166 @@
    +import collections
    +import subprocess
    +
    +from . import protocols
    +from . import tasks
    +from . import transports
    +
    +
    +STDIN = 0
    +STDOUT = 1
    +STDERR = 2
    +
    +
    +class BaseSubprocessTransport(transports.SubprocessTransport):
    +
    +    def __init__(self, loop, protocol, args, shell,
    +                 stdin, stdout, stderr, bufsize,
    +                 extra=None, **kwargs):
    +        super().__init__(extra)
    +        self._protocol = protocol
    +        self._loop = loop
    +
    +        self._pipes = {}
    +        if stdin == subprocess.PIPE:
    +            self._pipes[STDIN] = None
    +        if stdout == subprocess.PIPE:
    +            self._pipes[STDOUT] = None
    +        if stderr == subprocess.PIPE:
    +            self._pipes[STDERR] = None
    +        self._pending_calls = collections.deque()
    +        self._finished = False
    +        self._returncode = None
    +        self._start(args=args, shell=shell, stdin=stdin, stdout=stdout,
    +                    stderr=stderr, bufsize=bufsize, **kwargs)
    +        self._extra['subprocess'] = self._proc
    +
    +    def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
    +        raise NotImplementedError
    +
    +    def _make_write_subprocess_pipe_proto(self, fd):
    +        raise NotImplementedError
    +
    +    def _make_read_subprocess_pipe_proto(self, fd):
    +        raise NotImplementedError
    +
    +    def close(self):
    +        for proto in self._pipes.values():
    +            proto.pipe.close()
    +        if self._returncode is None:
    +            self.terminate()
    +
    +    def get_pid(self):
    +        return self._proc.pid
    +
    +    def get_returncode(self):
    +        return self._returncode
    +
    +    def get_pipe_transport(self, fd):
    +        if fd in self._pipes:
    +            return self._pipes[fd].pipe
    +        else:
    +            return None
    +
    +    def send_signal(self, signal):
    +        self._proc.send_signal(signal)
    +
    +    def terminate(self):
    +        self._proc.terminate()
    +
    +    def kill(self):
    +        self._proc.kill()
    +
    +    @tasks.coroutine
    +    def _post_init(self):
    +        proc = self._proc
    +        loop = self._loop
    +        if proc.stdin is not None:
    +            transp, proto = yield from loop.connect_write_pipe(
    +                lambda: WriteSubprocessPipeProto(self, STDIN),
    +                proc.stdin)
    +        if proc.stdout is not None:
    +            transp, proto = yield from loop.connect_read_pipe(
    +                lambda: ReadSubprocessPipeProto(self, STDOUT),
    +                proc.stdout)
    +        if proc.stderr is not None:
    +            transp, proto = yield from loop.connect_read_pipe(
    +                lambda: ReadSubprocessPipeProto(self, STDERR),
    +                proc.stderr)
    +        if not self._pipes:
    +            self._try_connected()
    +
    +    def _call(self, cb, *data):
    +        if self._pending_calls is not None:
    +            self._pending_calls.append((cb, data))
    +        else:
    +            self._loop.call_soon(cb, *data)
    +
    +    def _try_connected(self):
    +        assert self._pending_calls is not None
    +        if all(p is not None and p.connected for p in self._pipes.values()):
    +            self._loop.call_soon(self._protocol.connection_made, self)
    +            for callback, data in self._pending_calls:
    +                self._loop.call_soon(callback, *data)
    +            self._pending_calls = None
    +
    +    def _pipe_connection_lost(self, fd, exc):
    +        self._call(self._protocol.pipe_connection_lost, fd, exc)
    +        self._try_finish()
    +
    +    def _pipe_data_received(self, fd, data):
    +        self._call(self._protocol.pipe_data_received, fd, data)
    +
    +    def _process_exited(self, returncode):
    +        assert returncode is not None, returncode
    +        assert self._returncode is None, self._returncode
    +        self._returncode = returncode
    +        self._loop._subprocess_closed(self)
    +        self._call(self._protocol.process_exited)
    +        self._try_finish()
    +
    +    def _try_finish(self):
    +        assert not self._finished
    +        if self._returncode is None:
    +            return
    +        if all(p is not None and p.disconnected
    +               for p in self._pipes.values()):
    +            self._finished = True
    +            self._loop.call_soon(self._call_connection_lost, None)
    +
    +    def _call_connection_lost(self, exc):
    +        try:
    +            self._protocol.connection_lost(exc)
    +        finally:
    +            self._proc = None
    +            self._protocol = None
    +            self._loop = None
    +
    +
    +class WriteSubprocessPipeProto(protocols.BaseProtocol):
    +    pipe = None
    +
    +    def __init__(self, proc, fd):
    +        self.proc = proc
    +        self.fd = fd
    +        self.connected = False
    +        self.disconnected = False
    +        proc._pipes[fd] = self
    +
    +    def connection_made(self, transport):
    +        self.connected = True
    +        self.pipe = transport
    +        self.proc._try_connected()
    +
    +    def connection_lost(self, exc):
    +        self.disconnected = True
    +        self.proc._pipe_connection_lost(self.fd, exc)
    +
    +    def eof_received(self):
    +        pass
    +
    +
    +class ReadSubprocessPipeProto(WriteSubprocessPipeProto,
    +                              protocols.Protocol):
    +
    +    def data_received(self, data):
    +        self.proc._pipe_data_received(self.fd, data)
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 00:14:06 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 00:14:06 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454?=
    Message-ID: <3d958G1jPQz7Ljd@mail.python.org>
    
    http://hg.python.org/peps/rev/457307af721e
    changeset:   5237:457307af721e
    user:        Victor Stinner 
    date:        Thu Oct 31 00:13:57 2013 +0100
    summary:
      PEP 454
    
    * Snapshot.apply_filters() now returns a new Snapshot instance
    * Rename Filter.traceback to Filter.all_frames
    
    files:
      pep-0454.txt |  14 +++++++++-----
      1 files changed, 9 insertions(+), 5 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -276,7 +276,7 @@
     Filter
     ------
     
    -``Filter(inclusive: bool, filename_pattern: str, lineno: int=None, traceback: bool=False)`` class:
    +``Filter(inclusive: bool, filename_pattern: str, lineno: int=None, all_frames: bool=False)`` class:
     
         Filter to select which memory allocations are traced. Filters can be
         used to reduce the memory usage of the ``tracemalloc`` module, which
    @@ -309,10 +309,11 @@
     
         Filename pattern (``str``) of the filter.
     
    -``traceback`` attribute:
    +``all_frames`` attribute:
     
    -    If *traceback* is ``True``, all frames of the traceback are checked.
    -    If *traceback* is ``False``, only the most recent frame is checked.
    +    If *all_frames* is ``True``, all frames of the traceback are
    +    checked. If *all_frames* is ``False``, only the most recent frame is
    +    checked.
     
         This attribute is ignored if the traceback limit is less than ``2``.
         See the ``get_traceback_limit()`` function.
    @@ -330,7 +331,10 @@
     ``apply_filters(filters)`` method:
     
         Apply filters on the ``traces`` dictionary, *filters* is a list of
    -    ``Filter`` instances.
    +    ``Filter`` instances. Return a new ``Snapshot`` instance with the
    +    filtered traces.
    +
    +    If *filters* is an empty list, just copy the traces.
     
     
     ``dump(filename)`` method:
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Thu Oct 31 01:24:07 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 01:24:07 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_cleanup?=
    Message-ID: <3d96j35jscz7LjP@mail.python.org>
    
    http://hg.python.org/peps/rev/8291ecc04b8f
    changeset:   5238:8291ecc04b8f
    user:        Victor Stinner 
    date:        Thu Oct 31 01:23:31 2013 +0100
    summary:
      PEP 454: cleanup
    
    files:
      pep-0454.txt |  47 ++++++++++++++++++++++-----------------
      1 files changed, 26 insertions(+), 21 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -153,6 +153,17 @@
         See also ``disable()`` and ``enable()`` functions.
     
     
    +``take_snapshot()`` function:
    +
    +    Take a snapshot of traces of memory blocks allocated by Python using
    +    the ``get_traces()`` function. Return a new ``Snapshot`` instance.
    +
    +    The ``tracemalloc`` module must be enabled to take a snapshot, see
    +    the the ``enable()`` function.
    +
    +    See also ``get_traces()`` and ``get_object_traceback()`` functions.
    +
    +
     Trace functions
     ---------------
     
    @@ -205,9 +216,17 @@
         ``tracemalloc`` module was enabled nor memory blocks ignored by
         filters (see ``get_filters()``).
     
    +    The list is not sorted. Take a snapshot using ``take_snapshot()``
    +    and use the ``Snapshot.statistics()`` method to get a sorted list of
    +    statistics.
    +
    +    Tracebacks of traces are limited to ``traceback_limit`` frames. Use
    +    ``set_traceback_limit()`` to store more frames.
    +
         Return an empty list if the ``tracemalloc`` module is disabled.
     
    -    See also the ``get_object_traceback()`` function.
    +    See also ``take_snapshot()`` and ``get_object_traceback()``
    +    functions.
     
     
     ``set_traceback_limit(nframe: int)`` function:
    @@ -226,18 +245,6 @@
         limit at startup.
     
     
    -``take_snapshot()`` function:
    -
    -    Take a snapshot of traces of memory blocks allocated by Python.
    -
    -    Tracebacks of traces are limited to ``traceback_limit`` frames. Use
    -    ``set_traceback_limit()`` to store more frames.
    -
    -    The ``tracemalloc`` module must be enabled to take a snapshot, see
    -    the the ``enable()`` function.
    -
    -
    -
     Filter functions
     ----------------
     
    @@ -334,7 +341,8 @@
         ``Filter`` instances. Return a new ``Snapshot`` instance with the
         filtered traces.
     
    -    If *filters* is an empty list, just copy the traces.
    +    If *filters* is an empty list, return a new ``Snapshot`` instance
    +    with a copy of the traces.
     
     
     ``dump(filename)`` method:
    @@ -383,16 +391,13 @@
     
     ``traceback_limit`` attribute:
     
    -    Maximum number of frames stored in the traceback of ``traces``,
    -    result of the ``get_traceback_limit()`` function.
    +    Maximum number of frames stored in the traceback of ``traces``: see
    +    the ``get_traceback_limit()`` function.
     
     ``traces`` attribute:
     
    -    Traces of all memory blocks allocated by Python, result of the
    -    ``get_traces()`` function: list of ``(size: int, traceback: tuple)``
    -    tuples, *traceback* is a tuple of ``(filename: str, lineno: int)``
    -    tuples. *size* is the size of the memory block in bytes, *traceback*
    -    is the Python stack where the allocation occured.
    +    Traces of all memory blocks allocated by Python: see the
    +    ``get_traces()`` function.
     
     ``timestamp`` attribute:
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Thu Oct 31 02:11:32 2013
    From: python-checkins at python.org (vinay.sajip)
    Date: Thu, 31 Oct 2013 02:11:32 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDU1?=
     =?utf-8?q?=3A_Corrected_inaccuracies_in_documentation_and_corrected_some?=
    Message-ID: <3d97lm5GN4zRfm@mail.python.org>
    
    http://hg.python.org/cpython/rev/db40b69f9c0a
    changeset:   86790:db40b69f9c0a
    branch:      2.7
    parent:      86776:dd12639b82bf
    user:        Vinay Sajip 
    date:        Thu Oct 31 01:08:59 2013 +0000
    summary:
      Issue #19455: Corrected inaccuracies in documentation and corrected some incorrect cross-references.
    
    files:
      Doc/library/logging.rst |  15 +++++++--------
      1 files changed, 7 insertions(+), 8 deletions(-)
    
    
    diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
    --- a/Doc/library/logging.rst
    +++ b/Doc/library/logging.rst
    @@ -679,16 +679,15 @@
           (possibly modified) versions of the arguments passed in.
     
     In addition to the above, :class:`LoggerAdapter` supports the following
    -methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
    -:meth:`error`, :meth:`exception`, :meth:`critical`, :meth:`log`,
    -:meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel`,
    -:meth:`hasHandlers`. These methods have the same signatures as their
    -counterparts in :class:`Logger`, so you can use the two types of instances
    -interchangeably.
    +methods of :class:`Logger`: :meth:`~Logger.debug`, :meth:`~Logger.info`,
    +:meth:`~Logger.warning`, :meth:`~Logger.error`, :meth:`~Logger.exception`,
    +:meth:`~Logger.critical`, :meth:`~Logger.log` and :meth:`~Logger.isEnabledFor`.
    +These methods have the same signatures as their counterparts in :class:`Logger`,
    +so you can use the two types of instances interchangeably for these calls.
     
     .. versionchanged:: 2.7
    -   The :meth:`isEnabledFor` method was added to :class:`LoggerAdapter`.  This
    -   method delegates to the underlying logger.
    +   The :meth:`~Logger.isEnabledFor` method was added to :class:`LoggerAdapter`.
    +   This method delegates to the underlying logger.
     
     
     Thread Safety
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 02:11:33 2013
    From: python-checkins at python.org (vinay.sajip)
    Date: Thu, 31 Oct 2013 02:11:33 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_Corrected_some?=
     =?utf-8?q?_incorrect_cross-references=2E?=
    Message-ID: <3d97ln729szRfm@mail.python.org>
    
    http://hg.python.org/cpython/rev/518cb39bb625
    changeset:   86791:518cb39bb625
    branch:      3.3
    parent:      86779:544b654d000c
    user:        Vinay Sajip 
    date:        Thu Oct 31 01:10:30 2013 +0000
    summary:
      Corrected some incorrect cross-references.
    
    files:
      Doc/library/logging.rst |  15 ++++++++-------
      1 files changed, 8 insertions(+), 7 deletions(-)
    
    
    diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
    --- a/Doc/library/logging.rst
    +++ b/Doc/library/logging.rst
    @@ -794,17 +794,18 @@
           (possibly modified) versions of the arguments passed in.
     
     In addition to the above, :class:`LoggerAdapter` supports the following
    -methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
    -:meth:`error`, :meth:`exception`, :meth:`critical`, :meth:`log`,
    -:meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel`,
    -:meth:`hasHandlers`. These methods have the same signatures as their
    +methods of :class:`Logger`: :meth:`~Logger.debug`, :meth:`~Logger.info`,
    +:meth:`~Logger.warning`, :meth:`~Logger.error`, :meth:`~Logger.exception`,
    +:meth:`~Logger.critical`, :meth:`~Logger.log`, :meth:`~Logger.isEnabledFor`,
    +:meth:`~Logger.getEffectiveLevel`, :meth:`~Logger.setLevel` and
    +:meth:`~Logger.hasHandlers`. These methods have the same signatures as their
     counterparts in :class:`Logger`, so you can use the two types of instances
     interchangeably.
     
     .. versionchanged:: 3.2
    -   The :meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel` and
    -   :meth:`hasHandlers` methods were added to :class:`LoggerAdapter`.  These
    -   methods delegate to the underlying logger.
    +   The :meth:`~Logger.isEnabledFor`, :meth:`~Logger.getEffectiveLevel`,
    +   :meth:`~Logger.setLevel` and :meth:`~Logger.hasHandlers` methods were added
    +   to :class:`LoggerAdapter`.  These methods delegate to the underlying logger.
     
     
     Thread Safety
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 02:11:35 2013
    From: python-checkins at python.org (vinay.sajip)
    Date: Thu, 31 Oct 2013 02:11:35 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Merged_documentation_update_from_3=2E3=2E?=
    Message-ID: <3d97lq1p3Cz7LjX@mail.python.org>
    
    http://hg.python.org/cpython/rev/d0bb3460b91b
    changeset:   86792:d0bb3460b91b
    parent:      86789:a28f3eebe8ae
    parent:      86791:518cb39bb625
    user:        Vinay Sajip 
    date:        Thu Oct 31 01:11:17 2013 +0000
    summary:
      Merged documentation update from 3.3.
    
    files:
      Doc/library/logging.rst |  15 ++++++++-------
      1 files changed, 8 insertions(+), 7 deletions(-)
    
    
    diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
    --- a/Doc/library/logging.rst
    +++ b/Doc/library/logging.rst
    @@ -794,17 +794,18 @@
           (possibly modified) versions of the arguments passed in.
     
     In addition to the above, :class:`LoggerAdapter` supports the following
    -methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
    -:meth:`error`, :meth:`exception`, :meth:`critical`, :meth:`log`,
    -:meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel`,
    -:meth:`hasHandlers`. These methods have the same signatures as their
    +methods of :class:`Logger`: :meth:`~Logger.debug`, :meth:`~Logger.info`,
    +:meth:`~Logger.warning`, :meth:`~Logger.error`, :meth:`~Logger.exception`,
    +:meth:`~Logger.critical`, :meth:`~Logger.log`, :meth:`~Logger.isEnabledFor`,
    +:meth:`~Logger.getEffectiveLevel`, :meth:`~Logger.setLevel` and
    +:meth:`~Logger.hasHandlers`. These methods have the same signatures as their
     counterparts in :class:`Logger`, so you can use the two types of instances
     interchangeably.
     
     .. versionchanged:: 3.2
    -   The :meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel` and
    -   :meth:`hasHandlers` methods were added to :class:`LoggerAdapter`.  These
    -   methods delegate to the underlying logger.
    +   The :meth:`~Logger.isEnabledFor`, :meth:`~Logger.getEffectiveLevel`,
    +   :meth:`~Logger.setLevel` and :meth:`~Logger.hasHandlers` methods were added
    +   to :class:`LoggerAdapter`.  These methods delegate to the underlying logger.
     
     
     Thread Safety
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 02:24:49 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 02:24:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_454=3A_add_a_section_=22L?=
     =?utf-8?q?og_calls_to_the_memory_allocator=22?=
    Message-ID: <3d98352lzSz7LjP@mail.python.org>
    
    http://hg.python.org/peps/rev/a28e68fe4690
    changeset:   5239:a28e68fe4690
    user:        Victor Stinner 
    date:        Thu Oct 31 02:24:25 2013 +0100
    summary:
      PEP 454: add a section "Log calls to the memory allocator"
    
    files:
      pep-0454.txt |  30 ++++++++++++++++++++++++++++++
      1 files changed, 30 insertions(+), 0 deletions(-)
    
    
    diff --git a/pep-0454.txt b/pep-0454.txt
    --- a/pep-0454.txt
    +++ b/pep-0454.txt
    @@ -439,6 +439,36 @@
         Difference of total size of memory blocks in bytes (``int``).
     
     
    +Rejected Alternatives
    +=====================
    +
    +Log calls to the memory allocator
    +---------------------------------
    +
    +A different approach is to log calls to ``malloc()``, ``realloc()`` and
    +``free()`` functions. Calls can be logged into a file or send to another
    +computer through the network. Example of a log entry: name of the
    +function, size of the memory block, address of the memory block, Python
    +traceback where the allocation occurred, timestamp.
    +
    +Logs cannot be used directly, getting the current status of the memory
    +requires to parse previous logs. For example, it is not possible to get
    +directly the traceback of a Python object, like
    +``get_object_traceback(obj)`` does with traces.
    +
    +Python uses objects with a very short lifetime and so makes an extensive
    +use of memory allocators. It has an allocator optimized for small
    +objects (less than 512 bytes) with a short lifetime.  For example, the
    +Python test suites calls ``malloc()``, ``realloc()`` or ``free()``
    +270,000 times per second in average. If the size of log entry is 32
    +bytes, logging produces 8.2 MB per second or 29.0 GB per hour.
    +
    +The alternative was rejected because it is less efficient and has less
    +features. Parsing logs in a different process or a different computer is
    +slower than maintaining traces on allocated memory blocks in the same
    +process.
    +
    +
     Prior Work
     ==========
     
    
    -- 
    Repository URL: http://hg.python.org/peps
    
    From python-checkins at python.org  Thu Oct 31 06:21:13 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Thu, 31 Oct 2013 06:21:13 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E3=29=3A_make_string_li?=
    	=?utf-8?q?teral_const?=
    Message-ID: <3d9FHs2NBtzPPy@mail.python.org>
    
    http://hg.python.org/cpython/rev/7c2b521aaaa9
    changeset:   86793:7c2b521aaaa9
    branch:      3.3
    parent:      86791:518cb39bb625
    user:        Benjamin Peterson 
    date:        Thu Oct 31 01:20:58 2013 -0400
    summary:
      make string literal const
    
    files:
      Python/getcopyright.c |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Python/getcopyright.c b/Python/getcopyright.c
    --- a/Python/getcopyright.c
    +++ b/Python/getcopyright.c
    @@ -2,7 +2,7 @@
     
     #include "Python.h"
     
    -static char cprt[] =
    +static const char cprt[] =
     "\
     Copyright (c) 2001-2013 Python Software Foundation.\n\
     All Rights Reserved.\n\
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 06:21:14 2013
    From: python-checkins at python.org (benjamin.peterson)
    Date: Thu, 31 Oct 2013 06:21:14 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?b?KTogbWVyZ2UgMy4z?=
    Message-ID: <3d9FHt45WCz7LjY@mail.python.org>
    
    http://hg.python.org/cpython/rev/ac259f89f890
    changeset:   86794:ac259f89f890
    parent:      86792:d0bb3460b91b
    parent:      86793:7c2b521aaaa9
    user:        Benjamin Peterson 
    date:        Thu Oct 31 01:21:06 2013 -0400
    summary:
      merge 3.3
    
    files:
      Python/getcopyright.c |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Python/getcopyright.c b/Python/getcopyright.c
    --- a/Python/getcopyright.c
    +++ b/Python/getcopyright.c
    @@ -2,7 +2,7 @@
     
     #include "Python.h"
     
    -static char cprt[] =
    +static const char cprt[] =
     "\
     Copyright (c) 2001-2013 Python Software Foundation.\n\
     All Rights Reserved.\n\
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From solipsis at pitrou.net  Thu Oct 31 07:35:04 2013
    From: solipsis at pitrou.net (solipsis at pitrou.net)
    Date: Thu, 31 Oct 2013 07:35:04 +0100
    Subject: [Python-checkins] Daily reference leaks (d0bb3460b91b): sum=-4
    Message-ID: 
    
    results for d0bb3460b91b on branch "default"
    --------------------------------------------
    
    test_site leaked [-2, 0, 0] references, sum=-2
    test_site leaked [-2, 0, 0] memory blocks, sum=-2
    
    
    Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogzpQq8X', '-x']
    
    From python-checkins at python.org  Thu Oct 31 11:51:46 2013
    From: python-checkins at python.org (tim.golden)
    Date: Thu, 31 Oct 2013 11:51:46 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319418_Fix_some_wa?=
    	=?utf-8?q?rnings_on_Win64?=
    Message-ID: <3d9NdG6dJ4z7LjT@mail.python.org>
    
    http://hg.python.org/cpython/rev/0848c90a5dd1
    changeset:   86795:0848c90a5dd1
    user:        Tim Golden 
    date:        Thu Oct 31 10:25:47 2013 +0000
    summary:
      Issue #19418 Fix some warnings on Win64
    
    files:
      Modules/audioop.c |  7 +++++--
      1 files changed, 5 insertions(+), 2 deletions(-)
    
    
    diff --git a/Modules/audioop.c b/Modules/audioop.c
    --- a/Modules/audioop.c
    +++ b/Modules/audioop.c
    @@ -15,7 +15,8 @@
     #endif
     
     static const int maxvals[] = {0, 0x7F, 0x7FFF, 0x7FFFFF, 0x7FFFFFFF};
    -static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x80000000};
    +/* -1 trick is needed on Windows to support -0x80000000 without a warning */
    +static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1};
     static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
     
     static int
    @@ -434,7 +435,9 @@
         signed char *cp;
         Py_ssize_t len, i;
         int size;
    -    int min = 0x7fffffff, max = -0x80000000;
    +    /* -1 trick below is needed on Windows to support -0x80000000 without
    +    a warning */
    +    int min = 0x7fffffff, max = -0x7FFFFFFF-1;
     
         if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
             return NULL;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 13:44:48 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 13:44:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_cleanup_=5FUnpickler=5FSki?=
     =?utf-8?q?pConsumed=28=29=3A_remove_1_level_of_indentation?=
    Message-ID: <3d9R7h10QZzNXr@mail.python.org>
    
    http://hg.python.org/cpython/rev/78b35cf9c024
    changeset:   86796:78b35cf9c024
    user:        Victor Stinner 
    date:        Thu Oct 31 13:38:42 2013 +0100
    summary:
      cleanup _Unpickler_SkipConsumed(): remove 1 level of indentation
    
    files:
      Modules/_pickle.c |  27 +++++++++++++++------------
      1 files changed, 15 insertions(+), 12 deletions(-)
    
    
    diff --git a/Modules/_pickle.c b/Modules/_pickle.c
    --- a/Modules/_pickle.c
    +++ b/Modules/_pickle.c
    @@ -872,18 +872,21 @@
     static int
     _Unpickler_SkipConsumed(UnpicklerObject *self)
     {
    -    Py_ssize_t consumed = self->next_read_idx - self->prefetched_idx;
    -
    -    if (consumed > 0) {
    -        PyObject *r;
    -        assert(self->peek);  /* otherwise we did something wrong */
    -        /* This makes an useless copy... */
    -        r = PyObject_CallFunction(self->read, "n", consumed);
    -        if (r == NULL)
    -            return -1;
    -        Py_DECREF(r);
    -        self->prefetched_idx = self->next_read_idx;
    -    }
    +    Py_ssize_t consumed;
    +    PyObject *r;
    +
    +    consumed = self->next_read_idx - self->prefetched_idx;
    +    if (consumed <= 0)
    +        return 0;
    +
    +    assert(self->peek);  /* otherwise we did something wrong */
    +    /* This makes an useless copy... */
    +    r = PyObject_CallFunction(self->read, "n", consumed);
    +    if (r == NULL)
    +        return -1;
    +    Py_DECREF(r);
    +
    +    self->prefetched_idx = self->next_read_idx;
         return 0;
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 13:44:49 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 13:44:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_=5Fp?=
     =?utf-8?q?ickle=2C_don=27t_call_=5FUnpickler=5FSkipConsumed=28=29_with_an?=
    Message-ID: <3d9R7j2mjRzNXr@mail.python.org>
    
    http://hg.python.org/cpython/rev/d191d22a9d23
    changeset:   86797:d191d22a9d23
    user:        Victor Stinner 
    date:        Thu Oct 31 13:39:23 2013 +0100
    summary:
      Issue #19437: Fix _pickle, don't call _Unpickler_SkipConsumed() with an
    exception set
    
    files:
      Modules/_pickle.c |  6 +++---
      1 files changed, 3 insertions(+), 3 deletions(-)
    
    
    diff --git a/Modules/_pickle.c b/Modules/_pickle.c
    --- a/Modules/_pickle.c
    +++ b/Modules/_pickle.c
    @@ -5430,9 +5430,6 @@
             break;                  /* and we are done! */
         }
     
    -    if (_Unpickler_SkipConsumed(self) < 0)
    -        return NULL;
    -
         /* XXX: It is not clear what this is actually for. */
         if ((err = PyErr_Occurred())) {
             if (err == PyExc_EOFError) {
    @@ -5441,6 +5438,9 @@
             return NULL;
         }
     
    +    if (_Unpickler_SkipConsumed(self) < 0)
    +        return NULL;
    +
         PDATA_POP(self->stack, value);
         return value;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 13:55:47 2013
    From: python-checkins at python.org (eli.bendersky)
    Date: Thu, 31 Oct 2013 13:55:47 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5NDUy?=
     =?utf-8?q?=3A_Clarify_the_documentation_of_iterparse_w=2Er=2Et=2E_events_?=
     =?utf-8?q?argument=2E?=
    Message-ID: <3d9RNM3cgxz7Ljm@mail.python.org>
    
    http://hg.python.org/cpython/rev/e6941225e014
    changeset:   86798:e6941225e014
    branch:      3.3
    parent:      86793:7c2b521aaaa9
    user:        Eli Bendersky 
    date:        Thu Oct 31 05:53:39 2013 -0700
    summary:
      Issue #19452: Clarify the documentation of iterparse w.r.t. events argument.
    
    In 3.3 iterparse accepts a tuple in events (the C accelerator enforces this).
    This limitation was lifted in Python 3.4
    
    files:
      Doc/library/xml.etree.elementtree.rst |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
    --- a/Doc/library/xml.etree.elementtree.rst
    +++ b/Doc/library/xml.etree.elementtree.rst
    @@ -379,7 +379,7 @@
     
        Parses an XML section into an element tree incrementally, and reports what's
        going on to the user.  *source* is a filename or :term:`file object`
    -   containing XML data.  *events* is a list of events to report back.  The
    +   containing XML data.  *events* is a tuple of events to report back.  The
        supported events are the strings ``"start"``, ``"end"``, ``"start-ns"``
        and ``"end-ns"`` (the "ns" events are used to get detailed namespace
        information).  If *events* is omitted, only ``"end"`` events are reported.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 13:55:48 2013
    From: python-checkins at python.org (eli.bendersky)
    Date: Thu, 31 Oct 2013 13:55:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Null_merge_for_issue_=2319452?=
    Message-ID: <3d9RNN5N7Xz7Ljq@mail.python.org>
    
    http://hg.python.org/cpython/rev/2a996cecf762
    changeset:   86799:2a996cecf762
    parent:      86797:d191d22a9d23
    parent:      86798:e6941225e014
    user:        Eli Bendersky 
    date:        Thu Oct 31 05:55:31 2013 -0700
    summary:
      Null merge for issue #19452
    
    It affects docs of 3.3 in a way that was fixed differently in 3.4
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 16:06:49 2013
    From: python-checkins at python.org (serhiy.storchaka)
    Date: Thu, 31 Oct 2013 16:06:49 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDU3?=
     =?utf-8?q?=3A_Fixed_xmlcharrefreplace_tests_on_wide_build_when_tests_are?=
    Message-ID: <3d9VHY4vKFz7Ljb@mail.python.org>
    
    http://hg.python.org/cpython/rev/8d5df9602a72
    changeset:   86800:8d5df9602a72
    branch:      2.7
    parent:      86790:db40b69f9c0a
    user:        Serhiy Storchaka 
    date:        Thu Oct 31 17:06:03 2013 +0200
    summary:
      Issue #19457: Fixed xmlcharrefreplace tests on wide build when tests are
    loaded from .py[co] files.
    
    files:
      Lib/test/test_codeccallbacks.py |  4 ++--
      Lib/test/test_unicode.py        |  4 ++--
      Misc/NEWS                       |  6 ++++++
      3 files changed, 10 insertions(+), 4 deletions(-)
    
    
    diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py
    --- a/Lib/test/test_codeccallbacks.py
    +++ b/Lib/test/test_codeccallbacks.py
    @@ -84,9 +84,9 @@
             tests = [(u'\U0001f49d', '💝'),
                      (u'\ud83d', '�'),
                      (u'\udc9d', '�'),
    -                 (u'\ud83d\udc9d', '💝' if len(u'\U0001f49d') > 1 else
    -                                   '��'),
                     ]
    +        if u'\ud83d\udc9d' != u'\U0001f49d':
    +            tests += [(u'\ud83d\udc9d', '��')]
             for encoding in ['ascii', 'latin1', 'iso-8859-15']:
                 for s, exp in tests:
                     self.assertEqual(s.encode(encoding, 'xmlcharrefreplace'),
    diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
    --- a/Lib/test/test_unicode.py
    +++ b/Lib/test/test_unicode.py
    @@ -1663,9 +1663,9 @@
             tests = [(u'\U0001f49d', '💝'),
                      (u'\ud83d', '�'),
                      (u'\udc9d', '�'),
    -                 (u'\ud83d\udc9d', '💝' if len(u'\U0001f49d') > 1 else
    -                                  '��'),
                     ]
    +        if u'\ud83d\udc9d' != u'\U0001f49d':
    +            tests += [(u'\ud83d\udc9d', '��')]
             for s, exp in tests:
                 self.assertEqual(
                         unicode_encodedecimal(u"123" + s, "xmlcharrefreplace"),
    diff --git a/Misc/NEWS b/Misc/NEWS
    --- a/Misc/NEWS
    +++ b/Misc/NEWS
    @@ -12,6 +12,12 @@
     Library
     -------
     
    +Tests
    +-----
    +
    +- Issue #19457: Fixed xmlcharrefreplace tests on wide build when tests are
    +  loaded from .py[co] files.
    +
     
     Whats' New in Python 2.7.6?
     ===========================
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:52 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_get?=
     =?utf-8?q?=5Ffilter=28=29_from_=5Fwarnings=2C_don=27t_call_PyObject=5FIsS?=
     =?utf-8?b?dWJjbGFzcygp?=
    Message-ID: <3d9X0S3QNyz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/9b37fbda9043
    changeset:   86801:9b37fbda9043
    parent:      86799:2a996cecf762
    user:        Victor Stinner 
    date:        Thu Oct 31 14:46:00 2013 +0100
    summary:
      Issue #19437: Fix get_filter() from _warnings, don't call PyObject_IsSubclass()
    with an exception set
    
    files:
      Python/_warnings.c |  12 ++++++++++--
      1 files changed, 10 insertions(+), 2 deletions(-)
    
    
    diff --git a/Python/_warnings.c b/Python/_warnings.c
    --- a/Python/_warnings.c
    +++ b/Python/_warnings.c
    @@ -144,11 +144,19 @@
             ln_obj = PyTuple_GET_ITEM(tmp_item, 4);
     
             good_msg = check_matched(msg, text);
    +        if (good_msg == -1)
    +            return NULL;
    +
             good_mod = check_matched(mod, module);
    +        if (good_mod == -1)
    +            return NULL;
    +
             is_subclass = PyObject_IsSubclass(category, cat);
    +        if (is_subclass == -1)
    +            return NULL;
    +
             ln = PyLong_AsSsize_t(ln_obj);
    -        if (good_msg == -1 || good_mod == -1 || is_subclass == -1 ||
    -            (ln == -1 && PyErr_Occurred()))
    +        if (ln == -1 && PyErr_Occurred())
                 return NULL;
     
             if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln))
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:53 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:53 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_show?=
     =?utf-8?q?=5Fwarning=28=29_of_=5Fwarnings=2C_stop_at_the_first_error_to_n?=
     =?utf-8?q?ot?=
    Message-ID: <3d9X0T6DVPz7LjX@mail.python.org>
    
    http://hg.python.org/cpython/rev/e035b4656088
    changeset:   86802:e035b4656088
    user:        Victor Stinner 
    date:        Thu Oct 31 14:51:38 2013 +0100
    summary:
      Issue #19437: Fix show_warning() of _warnings, stop at the first error to not
    call a Python function with an exception set
    
    files:
      Python/_warnings.c |  26 ++++++++++++++++----------
      1 files changed, 16 insertions(+), 10 deletions(-)
    
    
    diff --git a/Python/_warnings.c b/Python/_warnings.c
    --- a/Python/_warnings.c
    +++ b/Python/_warnings.c
    @@ -263,23 +263,28 @@
     
         name = _PyObject_GetAttrId(category, &PyId___name__);
         if (name == NULL)  /* XXX Can an object lack a '__name__' attribute? */
    -        return;
    +        goto error;
     
         f_stderr = PySys_GetObject("stderr");
         if (f_stderr == NULL) {
             fprintf(stderr, "lost sys.stderr\n");
    -        Py_DECREF(name);
    -        return;
    +        goto error;
         }
     
         /* Print "filename:lineno: category: text\n" */
    -    PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW);
    -    PyFile_WriteString(lineno_str, f_stderr);
    -    PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW);
    -    PyFile_WriteString(": ", f_stderr);
    -    PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW);
    -    PyFile_WriteString("\n", f_stderr);
    -    Py_XDECREF(name);
    +    if (PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW) < 0)
    +        goto error;
    +    if (PyFile_WriteString(lineno_str, f_stderr) < 0)
    +        goto error;
    +    if (PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW) < 0)
    +        goto error;
    +    if (PyFile_WriteString(": ", f_stderr) < 0)
    +        goto error;
    +    if (PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW) < 0)
    +        goto error;
    +    if (PyFile_WriteString("\n", f_stderr) < 0)
    +        goto error;
    +    Py_CLEAR(name);
     
         /* Print "  source_line\n" */
         if (sourceline) {
    @@ -314,6 +319,7 @@
         }
     
     error:
    +    Py_XDECREF(name);
         PyErr_Clear();
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:55 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:55 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_fill?=
     =?utf-8?q?=5Fand=5Fset=5Fsslerror=28=29_of_=5Fssl=2C_handle_Py=5FBuildVal?=
     =?utf-8?q?ue=28=29?=
    Message-ID: <3d9X0W1xcTz7Lk2@mail.python.org>
    
    http://hg.python.org/cpython/rev/1181fcc02fe7
    changeset:   86803:1181fcc02fe7
    user:        Victor Stinner 
    date:        Thu Oct 31 15:00:24 2013 +0100
    summary:
      Issue #19437: Fix fill_and_set_sslerror() of _ssl, handle Py_BuildValue()
    failure
    
    Don't call PyObject_CallObject() with NULL parameters and an exception set.
    
    files:
      Modules/_ssl.c |  6 +++++-
      1 files changed, 5 insertions(+), 1 deletions(-)
    
    
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -346,14 +346,18 @@
                                        lib_obj, errstr, lineno);
         else
             msg = PyUnicode_FromFormat("%s (_ssl.c:%d)", errstr, lineno);
    -
         if (msg == NULL)
             goto fail;
    +
         init_value = Py_BuildValue("iN", ssl_errno, msg);
    +    if (init_value == NULL)
    +        goto fail;
    +
         err_value = PyObject_CallObject(type, init_value);
         Py_DECREF(init_value);
         if (err_value == NULL)
             goto fail;
    +
         if (reason_obj == NULL)
             reason_obj = Py_None;
         if (_PyObject_SetAttrId(err_value, &PyId_reason, reason_obj))
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:56 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:56 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_PyCA?=
     =?utf-8?q?rrayType_constructor=2C_raise_MemoryError_on_PyMem=5FMalloc=28?=
     =?utf-8?q?=29?=
    Message-ID: <3d9X0X4m7Sz7Ljd@mail.python.org>
    
    http://hg.python.org/cpython/rev/ae4bdd4b7240
    changeset:   86804:ae4bdd4b7240
    user:        Victor Stinner 
    date:        Thu Oct 31 16:33:05 2013 +0100
    summary:
      Issue #19437: Fix PyCArrayType constructor, raise MemoryError on PyMem_Malloc()
    failure
    
    files:
      Modules/_ctypes/_ctypes.c |  4 +++-
      1 files changed, 3 insertions(+), 1 deletions(-)
    
    
    diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
    --- a/Modules/_ctypes/_ctypes.c
    +++ b/Modules/_ctypes/_ctypes.c
    @@ -1309,8 +1309,10 @@
             goto error;
         stgdict->ndim = itemdict->ndim + 1;
         stgdict->shape = PyMem_Malloc(sizeof(Py_ssize_t) * stgdict->ndim);
    -    if (stgdict->shape == NULL)
    +    if (stgdict->shape == NULL) {
    +        PyErr_NoMemory();
             goto error;
    +    }
         stgdict->shape[0] = length;
         memmove(&stgdict->shape[1], itemdict->shape,
             sizeof(Py_ssize_t) * (stgdict->ndim - 1));
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:58 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:58 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_PyCF?=
     =?utf-8?q?uncPtrType_constructor=2C_handle?=
    Message-ID: <3d9X0Z0Q1Bz7Ljd@mail.python.org>
    
    http://hg.python.org/cpython/rev/a0e2c2cb60f6
    changeset:   86805:a0e2c2cb60f6
    user:        Victor Stinner 
    date:        Thu Oct 31 16:34:08 2013 +0100
    summary:
      Issue #19437: Fix PyCFuncPtrType constructor, handle
    _ctypes_alloc_format_string() failure
    
    files:
      Modules/_ctypes/_ctypes.c |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
    --- a/Modules/_ctypes/_ctypes.c
    +++ b/Modules/_ctypes/_ctypes.c
    @@ -2245,6 +2245,10 @@
            argtypes would be a ctypes type).
         */
         stgdict->format = _ctypes_alloc_format_string(NULL, "X{}");
    +    if (stgdict->format == NULL) {
    +        Py_DECREF((PyObject *)stgdict);
    +        return NULL;
    +    }
         stgdict->flags |= TYPEFLAG_ISPOINTER;
     
         /* create the new instance (which is a class,
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:23:59 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:23:59 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_newP?=
     =?utf-8?q?ySSLSocket=28=29=2C_handle_PyWeakref=5FNewRef=28=29_failure?=
    Message-ID: <3d9X0b33Jqz7Ljs@mail.python.org>
    
    http://hg.python.org/cpython/rev/8f58e57e0d59
    changeset:   86806:8f58e57e0d59
    user:        Victor Stinner 
    date:        Thu Oct 31 16:35:38 2013 +0100
    summary:
      Issue #19437: Fix newPySSLSocket(), handle PyWeakref_NewRef() failure
    
    files:
      Modules/_ssl.c |  4 ++++
      1 files changed, 4 insertions(+), 0 deletions(-)
    
    
    diff --git a/Modules/_ssl.c b/Modules/_ssl.c
    --- a/Modules/_ssl.c
    +++ b/Modules/_ssl.c
    @@ -528,6 +528,10 @@
     
         self->socket_type = socket_type;
         self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
    +    if (self->Socket == NULL) {
    +        Py_DECREF(self);
    +        return NULL;
    +    }
         return self;
     }
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:24:00 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:24:00 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_r=5F?=
     =?utf-8?q?PyLong=28=29_of_marshal_module=2C_stop_immediatly_at_first?=
    Message-ID: <3d9X0c5hbYz7LkN@mail.python.org>
    
    http://hg.python.org/cpython/rev/985f8762ee3e
    changeset:   86807:985f8762ee3e
    user:        Victor Stinner 
    date:        Thu Oct 31 16:56:38 2013 +0100
    summary:
      Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
    failure, don't read any more data
    
    files:
      Python/marshal.c |  15 +++++++++++----
      1 files changed, 11 insertions(+), 4 deletions(-)
    
    
    diff --git a/Python/marshal.c b/Python/marshal.c
    --- a/Python/marshal.c
    +++ b/Python/marshal.c
    @@ -612,6 +612,7 @@
             }
             p->buf_size = n;
         }
    +
         if (!p->readable) {
             assert(p->fp != NULL);
             read = fread(p->buf, 1, n, p->fp);
    @@ -731,25 +732,31 @@
         ob = _PyLong_New(size);
         if (ob == NULL)
             return NULL;
    +
         Py_SIZE(ob) = n > 0 ? size : -size;
     
         for (i = 0; i < size-1; i++) {
             d = 0;
             for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
                 md = r_short(p);
    -            if (PyErr_Occurred())
    -                break;
    +            if (PyErr_Occurred()) {
    +                Py_DECREF(ob);
    +                return NULL;
    +            }
                 if (md < 0 || md > PyLong_MARSHAL_BASE)
                     goto bad_digit;
                 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
             }
             ob->ob_digit[i] = d;
         }
    +
         d = 0;
         for (j=0; j < shorts_in_top_digit; j++) {
             md = r_short(p);
    -        if (PyErr_Occurred())
    -            break;
    +        if (PyErr_Occurred()) {
    +            Py_DECREF(ob);
    +            return NULL;
    +        }
             if (md < 0 || md > PyLong_MARSHAL_BASE)
                 goto bad_digit;
             /* topmost marshal digit should be nonzero */
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:24:02 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:24:02 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_r=5F?=
     =?utf-8?q?object=28=29_of_marshal_module=2C_handle_r=5Fbyte=28=29_failure?=
     =?utf-8?q?_for?=
    Message-ID: <3d9X0f0mmrz7Lk4@mail.python.org>
    
    http://hg.python.org/cpython/rev/9e836a945ea9
    changeset:   86808:9e836a945ea9
    user:        Victor Stinner 
    date:        Thu Oct 31 17:07:08 2013 +0100
    summary:
      Issue #19437: Fix r_object() of marshal module, handle r_byte() failure for
    TYPE_SMALL_TUPLE
    
    files:
      Python/marshal.c |  2 ++
      1 files changed, 2 insertions(+), 0 deletions(-)
    
    
    diff --git a/Python/marshal.c b/Python/marshal.c
    --- a/Python/marshal.c
    +++ b/Python/marshal.c
    @@ -1101,6 +1101,8 @@
     
         case TYPE_SMALL_TUPLE:
             n = (unsigned char) r_byte(p);
    +        if (PyErr_Occurred())
    +            break;
             goto _read_tuple;
         case TYPE_TUPLE:
             n = r_long(p);
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:24:03 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:24:03 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Fix_r=5F?=
     =?utf-8?q?object=28=29_of_marshal_module=2C_handle_PyDict=5FSetItem=28=29?=
     =?utf-8?q?_failure?=
    Message-ID: <3d9X0g3Rpbz7Ljk@mail.python.org>
    
    http://hg.python.org/cpython/rev/fc54e2848c98
    changeset:   86809:fc54e2848c98
    user:        Victor Stinner 
    date:        Thu Oct 31 17:14:52 2013 +0100
    summary:
      Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
    for TYPE_DICT and stop immedialty on first r_object() failure
    
    files:
      Python/marshal.c |  15 ++++++++++++---
      1 files changed, 12 insertions(+), 3 deletions(-)
    
    
    diff --git a/Python/marshal.c b/Python/marshal.c
    --- a/Python/marshal.c
    +++ b/Python/marshal.c
    @@ -1117,6 +1117,7 @@
             R_REF(v);
             if (v == NULL)
                 break;
    +
             for (i = 0; i < n; i++) {
                 v2 = r_object(p);
                 if ( v2 == NULL ) {
    @@ -1170,10 +1171,17 @@
                 if (key == NULL)
                     break;
                 val = r_object(p);
    -            if (val != NULL)
    -                PyDict_SetItem(v, key, val);
    +            if (val == NULL) {
    +                Py_DECREF(key);
    +                break;
    +            }
    +            if (PyDict_SetItem(v, key, val) < 0) {
    +                Py_DECREF(key);
    +                Py_DECREF(val);
    +                break;
    +            }
                 Py_DECREF(key);
    -            Py_XDECREF(val);
    +            Py_DECREF(val);
             }
             if (PyErr_Occurred()) {
                 Py_DECREF(v);
    @@ -1204,6 +1212,7 @@
             }
             if (v == NULL)
                 break;
    +
             for (i = 0; i < n; i++) {
                 v2 = r_object(p);
                 if ( v2 == NULL ) {
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 17:24:04 2013
    From: python-checkins at python.org (victor.stinner)
    Date: Thu, 31 Oct 2013 17:24:04 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2319437=3A_Cleanup_?=
     =?utf-8?q?r=5Fref=28=29_of_the_marshal_module?=
    Message-ID: <3d9X0h63wXz7LkX@mail.python.org>
    
    http://hg.python.org/cpython/rev/995173ed248a
    changeset:   86810:995173ed248a
    user:        Victor Stinner 
    date:        Thu Oct 31 17:09:01 2013 +0100
    summary:
      Issue #19437: Cleanup r_ref() of the marshal module
    
    files:
      Python/marshal.c |  11 ++++++-----
      1 files changed, 6 insertions(+), 5 deletions(-)
    
    
    diff --git a/Python/marshal.c b/Python/marshal.c
    --- a/Python/marshal.c
    +++ b/Python/marshal.c
    @@ -827,11 +827,12 @@
     static PyObject *
     r_ref(PyObject *o, int flag, RFILE *p)
     {
    -    if (o != NULL && flag) { /* currently only FLAG_REF is defined */
    -        if (PyList_Append(p->refs, o) < 0) {
    -            Py_DECREF(o); /* release the new object */
    -            return NULL;
    -        }
    +    assert(flag & FLAG_REF);
    +    if (o == NULL)
    +        return NULL;
    +    if (PyList_Append(p->refs, o) < 0) {
    +        Py_DECREF(o); /* release the new object */
    +        return NULL;
         }
         return o;
     }
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 18:40:57 2013
    From: python-checkins at python.org (tim.golden)
    Date: Thu, 31 Oct 2013 18:40:57 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5NDE4?=
     =?utf-8?q?_Fix_some_warnings_on_Win64?=
    Message-ID: <3d9YjP40R0z7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/54bf7b5ec3b6
    changeset:   86811:54bf7b5ec3b6
    branch:      3.3
    parent:      86798:e6941225e014
    user:        Tim Golden 
    date:        Thu Oct 31 17:38:24 2013 +0000
    summary:
      Issue #19418 Fix some warnings on Win64
    
    files:
      Modules/audioop.c |  7 +++++--
      1 files changed, 5 insertions(+), 2 deletions(-)
    
    
    diff --git a/Modules/audioop.c b/Modules/audioop.c
    --- a/Modules/audioop.c
    +++ b/Modules/audioop.c
    @@ -27,7 +27,8 @@
     #endif
     
     static const int maxvals[] = {0, 0x7F, 0x7FFF, 0x7FFFFF, 0x7FFFFFFF};
    -static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x80000000};
    +/* -1 trick is needed on Windows to support -0x80000000 without a warning */
    +static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1};
     static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
     
     static int
    @@ -385,7 +386,9 @@
         signed char *cp;
         Py_ssize_t len, i;
         int size, val = 0;
    -    int min = 0x7fffffff, max = -0x80000000;
    +    /* -1 trick below is needed on Windows to support -0x80000000 without
    +    a warning */
    +    int min = 0x7fffffff, max = -0x7FFFFFFF-1;
     
         if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
             return NULL;
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 18:40:58 2013
    From: python-checkins at python.org (tim.golden)
    Date: Thu, 31 Oct 2013 18:40:58 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
    	=?utf-8?q?=29=3A_Null_merge?=
    Message-ID: <3d9YjQ5fvfz7LjP@mail.python.org>
    
    http://hg.python.org/cpython/rev/6a2d27f5d48c
    changeset:   86812:6a2d27f5d48c
    parent:      86810:995173ed248a
    parent:      86811:54bf7b5ec3b6
    user:        Tim Golden 
    date:        Thu Oct 31 17:40:16 2013 +0000
    summary:
      Null merge
    
    files:
    
    
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 19:01:48 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Thu, 31 Oct 2013 19:01:48 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython=3A_Close_resources_owned_by_s?=
     =?utf-8?q?ubclass_before_calling_super=28=29=2Eclose=28=29=2E?=
    Message-ID: <3d9Z9S2R4Pz7Ljk@mail.python.org>
    
    http://hg.python.org/cpython/rev/a3c68d919cd1
    changeset:   86813:a3c68d919cd1
    user:        Guido van Rossum 
    date:        Thu Oct 31 11:01:40 2013 -0700
    summary:
      Close resources owned by subclass before calling super().close().
    
    files:
      Lib/selectors.py |  4 ++--
      1 files changed, 2 insertions(+), 2 deletions(-)
    
    
    diff --git a/Lib/selectors.py b/Lib/selectors.py
    --- a/Lib/selectors.py
    +++ b/Lib/selectors.py
    @@ -351,8 +351,8 @@
                 return ready
     
             def close(self):
    +            self._epoll.close()
                 super().close()
    -            self._epoll.close()
     
     
     if hasattr(select, 'kqueue'):
    @@ -414,8 +414,8 @@
                 return ready
     
             def close(self):
    +            self._kqueue.close()
                 super().close()
    -            self._kqueue.close()
     
     
     # Choose the best implementation: roughly, epoll|kqueue > poll > select.
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 19:45:00 2013
    From: python-checkins at python.org (vinay.sajip)
    Date: Thu, 31 Oct 2013 19:45:00 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4zKTogSXNzdWUgIzE5MzQ5?=
     =?utf-8?q?=3A_Corrected_error_message=2E?=
    Message-ID: <3d9b7J6Vj0z7LjY@mail.python.org>
    
    http://hg.python.org/cpython/rev/731bdec35fdd
    changeset:   86814:731bdec35fdd
    branch:      3.3
    parent:      86811:54bf7b5ec3b6
    user:        Vinay Sajip 
    date:        Thu Oct 31 18:44:04 2013 +0000
    summary:
      Issue #19349: Corrected error message.
    
    files:
      Lib/venv/__init__.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
    --- a/Lib/venv/__init__.py
    +++ b/Lib/venv/__init__.py
    @@ -336,7 +336,7 @@
         elif not hasattr(sys, 'base_prefix'):
             compatible = False
         if not compatible:
    -        raise ValueError('This script is only for use with Python 3.3')
    +        raise ValueError('This script is only for use with Python >= 3.3')
         else:
             import argparse
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 19:45:02 2013
    From: python-checkins at python.org (vinay.sajip)
    Date: Thu, 31 Oct 2013 19:45:02 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E3_-=3E_default?=
     =?utf-8?q?=29=3A_Closes_=2319349=3A_Merged_fix_from_3=2E3=2E?=
    Message-ID: <3d9b7L1HsVz7Lkl@mail.python.org>
    
    http://hg.python.org/cpython/rev/e97d9926da83
    changeset:   86815:e97d9926da83
    parent:      86813:a3c68d919cd1
    parent:      86814:731bdec35fdd
    user:        Vinay Sajip 
    date:        Thu Oct 31 18:44:48 2013 +0000
    summary:
      Closes #19349: Merged fix from 3.3.
    
    files:
      Lib/venv/__init__.py |  2 +-
      1 files changed, 1 insertions(+), 1 deletions(-)
    
    
    diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
    --- a/Lib/venv/__init__.py
    +++ b/Lib/venv/__init__.py
    @@ -345,7 +345,7 @@
         elif not hasattr(sys, 'base_prefix'):
             compatible = False
         if not compatible:
    -        raise ValueError('This script is only for use with Python 3.3')
    +        raise ValueError('This script is only for use with Python >= 3.3')
         else:
             import argparse
     
    
    -- 
    Repository URL: http://hg.python.org/cpython
    
    From python-checkins at python.org  Thu Oct 31 23:48:52 2013
    From: python-checkins at python.org (guido.van.rossum)
    Date: Thu, 31 Oct 2013 23:48:52 +0100 (CET)
    Subject: [Python-checkins] =?utf-8?q?peps=3A_Huge_update_to_various_parts_?=
     =?utf-8?q?of_the_spec=2E_Still_not_done=2E?=
    Message-ID: <3d9hXh1thtz7LjQ@mail.python.org>
    
    http://hg.python.org/peps/rev/9e960cac9e94
    changeset:   5240:9e960cac9e94
    user:        Guido van Rossum 
    date:        Thu Oct 31 15:48:48 2013 -0700
    summary:
      Huge update to various parts of the spec. Still not done.
    
    files:
      pep-3156.txt |  630 +++++++++++++++++++++++---------------
      1 files changed, 372 insertions(+), 258 deletions(-)
    
    
    diff --git a/pep-3156.txt b/pep-3156.txt
    --- a/pep-3156.txt
    +++ b/pep-3156.txt
    @@ -39,7 +39,7 @@
     force acceptance of the PEP.  The expectation is that the package will
     keep provisional status in Python 3.4 and progress to final status in
     Python 3.5.  Development continues to occur primarily in the Tulip
    -repo.
    +repo, with changes occasionally merged into the CPython repo.
     
     Dependencies
     ------------
    @@ -47,7 +47,7 @@
     Python 3.3 is required for many of the proposed features.  The
     reference implementation (Tulip) requires no new language or standard
     library features beyond Python 3.3, no third-party modules or
    -packages, and no C code, except for the proactor-based event loop on
    +packages, and no C code, except for the (optional) IOCP support on
     Windows.
     
     Module Namespace
    @@ -99,10 +99,10 @@
     implementation.
     
     In order to support both directions of adaptation, two separate APIs
    -are defined:
    +are specified:
     
    -- getting and setting the current event loop object
    -- the interface of a conforming event loop and its minimum guarantees
    +- An interface for managing the current event loop
    +- The interface of a conforming event loop
     
     An event loop implementation may provide additional methods and
     guarantees, as long as these are called out in the documentation as
    @@ -110,17 +110,19 @@
     methods unimplemented if they cannot be implemented in the given
     environment; however, such deviations from the standard API should be
     considered only as a last resort, and only if the platform or
    -environment forces the issue.  (An example could be a platform where
    -there is a system event loop that cannot be started or stopped.)
    +environment forces the issue.  (An example would be a platform where
    +there is a system event loop that cannot be started or stopped; see
    +"Embedded Event Loops" below.)
     
     The event loop API does not depend on ``yield from``.  Rather, it uses
     a combination of callbacks, additional interfaces (transports and
     protocols), and Futures.  The latter are similar to those defined in
     PEP 3148, but have a different implementation and are not tied to
    -threads.  In particular, they have no wait() method; the user is
    -expected to use callbacks.
    +threads.  In particular, the ``result()`` method raises an exception
    +instead of blocking when a result is not yet ready; the user is
    +expected to use callbacks (or ``yield from``) to wait for the result.
     
    -All event loop methods documented as returning a coroutine are allowed
    +All event loop methods specified as returning a coroutine are allowed
     to return either a Future or a coroutine, at the implementation's
     choice (the standard implementation always returns coroutines).  All
     event loop methods documented as accepting coroutine arguments *must*
    @@ -180,10 +182,11 @@
     that can be viewed this way, for example an SSH session or a pair of
     UNIX pipes.  Typically there aren't many different transport
     implementations, and most of them come with the event loop
    -implementation.  (But there is no requirement that all transports must
    -be created by calling an event loop method -- a third party module may
    -well implement a new transport and provide a constructor or factory
    -function for it that simply takes an event loop as an argument.)
    +implementation.  However, there is no requirement that all transports
    +must be created by calling an event loop method: a third party module
    +may well implement a new transport and provide a constructor or
    +factory function for it that simply takes an event loop as an argument
    +or calls ``get_event_loop()``.
     
     Note that transports don't need to use sockets, not even if they use
     TCP -- sockets are a platform-specific implementation detail.
    @@ -233,6 +236,7 @@
     document their policy and at what point during their initialization
     sequence the policy is set, in order to avoid undefined behavior when
     multiple active frameworks want to override the default policy.
    +(See also "Embedded Event Loops" below.)
     
     To get the event loop for current context, use ``get_event_loop()``.
     This returns an event loop object implementing the interface specified
    @@ -280,6 +284,28 @@
     ``DefaultEventLoopPolicy``.  The current event loop policy object can
     be retrieved by calling ``get_event_loop_policy()``.
     
    +Specifying Times
    +----------------
    +
    +As usual in Python, all timeouts, intervals and delays are measured in
    +seconds, and may be ints or floats.  However, absolute times are not
    +specified as POSIX timestamps.  The accuracy, precision and epoch of
    +the clock are up to the implementation.
    +
    +The default implementation uses ``time.monotonic()``.  Books could be
    +written about the implications of this choice.  Better read the docs
    +for the stdandard library ``time`` module.
    +
    +Embedded Event Loops
    +--------------------
    +
    +On some platforms an event loop is provided by the system.  Such a
    +loop may already be running when the user code starts, and there may
    +be no way to stop or close it without exiting from the program.  In
    +this case, the methods for starting, stopping and closing the event
    +loop may not be implementable, and ``is_running()`` may always return
    +``True``.
    +
     Event Loop Classes
     ------------------
     
    @@ -300,89 +326,59 @@
       API for "overlapped I/O").  The constructor takes one optional
       argument, a ``Proactor`` object.  By default an instance of
       ``IocpProactor`` is created and used.  (The ``IocpProactor`` class
    -  is not specified by this PEP.  Its inclusion in the standard library
    -  is not currently under consideration; it is just an implementation
    +  is not specified by this PEP; it is just an implementation
       detail of the ``ProactorEventLoop`` class.)
     
     Event Loop Methods Overview
     ---------------------------
     
     The methods of a conforming event loop are grouped into several
    -categories.  A brief overview of the categories.  The first set of
    -categories must be supported by all conforming event loop
    -implementations.  (However, in some cases a partially-conforming
    -implementation may choose not to implement the internet/socket
    -methods, and still conform to the other methods.  Also, it is possible
    -that a partially-conforming implementation has no way to create,
    -close, start, or stop a loop.)
    +categories.  The first set of categories must be supported by all
    +conforming event loop implementations, with the exception that
    +embedded event loops may not implement the methods for starting,
    +stopping and closing.  (However, a partially-conforming event loop is
    +still better than nothing. :-)
     
    -- Miscellaneous: ``close()``, ``time()``.
    +- Starting, stopping and closing: ``run_forever()``,
    +  ``run_until_complete()``, ``stop()``, ``is_running()``, ``close()``.
     
    -- Starting and stopping: ``run_forever()``, ``run_until_complete()``,
    -  ``stop()``, ``is_running()``.
    -
    -- Basic callbacks: ``call_soon()``, ``call_later()``, ``call_at()``.
    +- Basic and timed callbacks: ``call_soon()``, ``call_later()``,
    +  ``call_at()``, ``time()``.
     
     - Thread interaction: ``call_soon_threadsafe()``,
       ``run_in_executor()``, ``set_default_executor()``.
     
     - Internet name lookups: ``getaddrinfo()``, ``getnameinfo()``.
     
    -- Internet connections: ``create_connection()``, ``start_serving()``,
    -  ``stop_serving()``, ``create_datagram_endpoint()``.
    +- Internet connections: ``create_connection()``, ``create_server()``,
    +  ``create_datagram_endpoint()``.
     
     - Wrapped socket methods: ``sock_recv()``, ``sock_sendall()``,
       ``sock_connect()``, ``sock_accept()``.
     
     The second set of categories *may* be supported by conforming event
     loop implementations.  If not supported, they will raise
    -``NotImplementedError``.  (In the current state of Tulip,
    +``NotImplementedError``.  (In the default implementation,
     ``SelectorEventLoop`` on UNIX systems supports all of these;
     ``SelectorEventLoop`` on Windows supports the I/O event handling
    -category; ``ProactorEventLoop`` on Windows supports None.  The
    -intention is to add support for pipes and subprocesses on Windows as
    -well, using the ``subprocess`` module in the standard library.)
    +category; ``ProactorEventLoop`` on Windows supports the pipes and
    +subprocess category.)
     
     - I/O callbacks: ``add_reader()``, ``remove_reader()``,
       ``add_writer()``, ``remove_writer()``.
     
     - Pipes and subprocesses: ``connect_read_pipe()``,
    -  ``connect_write_pipe()``, ``spawn_subprocess()``.
    +  ``connect_write_pipe()``, ``subprocess_shell()``,
    +  ``subprocess_exec()``.
     
     - Signal callbacks: ``add_signal_handler()``,
       ``remove_signal_handler()``.
     
    -Specifying Times
    -----------------
    +Event Loop Methods
    +------------------
     
    -As usual in Python, all timeouts, intervals and delays are measured in
    -seconds, and may be ints or floats.  The accuracy and precision of the
    -clock are up to the implementation; the default implementation uses
    -``time.monotonic()``.  Books could be written about the implications
    -of this choice.  Better read the docs for the stdandard library
    -``time`` module.
    -
    -Required Event Loop Methods
    ----------------------------
    -
    -Miscellaneous
    -'''''''''''''
    -
    -- ``close()``.  Closes the event loop, releasing any resources it may
    -  hold, such as the file descriptor used by ``epoll()`` or
    -  ``kqueue()``.  This should not be called while the event loop is
    -  running.  After it has been called the event loop may not be used
    -  again.  It may be called multiple times; subsequent calls are
    -  no-ops.
    -
    -- ``time()``.  Returns the current time according to the event loop's
    -  clock.  This may be ``time.time()`` or ``time.monotonic()`` or some
    -  other system-specific clock, but it must return a float expressing
    -  the time in units of approximately one second since some epoch.
    -  (No clock is perfect -- see PEP 418.)
    -
    -Starting and Stopping
    -'''''''''''''''''''''
    +Starting, Stopping and Closing
    +''''''''''''''''''''''''''''''
     
     An (unclosed) event loop can be in one of two states: running or
     stopped.  These methods deal with starting and stopping an event loop:
    @@ -412,9 +408,14 @@
       ``call_soon()``) it processes before stopping.
     
     - ``is_running()``.  Returns ``True`` if the event loop is currently
    -  running, ``False`` if it is stopped.  (TBD: Do we need another
    -  inquiry method to tell whether the loop is in the process of
    -  stopping?)
    +  running, ``False`` if it is stopped.
    +
    +- ``close()``.  Closes the event loop, releasing any resources it may
    +  hold, such as the file descriptor used by ``epoll()`` or
    +  ``kqueue()``, and the default executor.  This should not be called
    +  while the event loop is running.  After it has been called the event
    +  loop should not be used again.  It may be called multiple times;
    +  subsequent calls are no-ops.
     
     Basic Callbacks
     '''''''''''''''
    @@ -426,24 +427,30 @@
     shared state isn't changed by another callback.
     
     - ``call_soon(callback, *args)``.  This schedules a callback to be
    -  called as soon as possible.  Returns a Handle representing the
    -  callback, whose ``cancel()`` method can be used to cancel the
    -  callback.  It guarantees that callbacks are called in the order in
    -  which they were scheduled.
    +  called as soon as possible.  Returns a ``Handle`` (see below)
    +  representing the callback, whose ``cancel()`` method can be used to
    +  cancel the callback.  It guarantees that callbacks are called in the
    +  order in which they were scheduled.
     
     - ``call_later(delay, callback, *args)``.  Arrange for
       ``callback(*args)`` to be called approximately ``delay`` seconds in
    -  the future, once, unless cancelled.  Returns a Handle representing
    +  the future, once, unless cancelled.  Returns a ``Handle`` representing
       the callback, whose ``cancel()`` method can be used to cancel the
       callback.  Callbacks scheduled in the past or at exactly the same
       time will be called in an undefined order.
     
     - ``call_at(when, callback, *args)``.  This is like ``call_later()``,
       but the time is expressed as an absolute time.  Returns a similar
    -  Handle.  There is a simple equivalency: ``loop.call_later(delay,
    +  ``Handle``.  There is a simple equivalency: ``loop.call_later(delay,
       callback, *args)`` is the same as ``loop.call_at(loop.time() +
       delay, callback, *args)``.
     
    +- ``time()``.  Returns the current time according to the event loop's
    +  clock.  This may be ``time.time()`` or ``time.monotonic()`` or some
    +  other system-specific clock, but it must return a float expressing
    +  the time in units of approximately one second since some epoch.
    +  (No clock is perfect -- see PEP 418.)
    +
     Note: A previous version of this PEP defined a method named
     ``call_repeatedly()``, which promised to call a callback at regular
     intervals.  This has been withdrawn because the design of such a
    @@ -464,22 +471,25 @@
     - ``call_soon_threadsafe(callback, *args)``.  Like
       ``call_soon(callback, *args)``, but when called from another thread
       while the event loop is blocked waiting for I/O, unblocks the event
    -  loop.  This is the *only* method that is safe to call from another
    -  thread.  (To schedule a callback for a later time in a threadsafe
    -  manner, you can use ``loop.call_soon_threadsafe(loop.call_later,
    -  when, callback, *args)``.)  Note: this is not safe to call from a
    -  signal handler (since it may use locks).  In fact, no API is
    -  signal-safe; if you want to handle signals, use
    -  ``add_signal_handler()`` described below.
    +  loop.  Returns a ``Handle``.  This is the *only* method that is safe
    +  to call from another thread.  (To schedule a callback for a later
    +  time in a threadsafe manner, you can use
    +  ``loop.call_soon_threadsafe(loop.call_later, when, callback,
    +  *args)``.)  Note: this is not safe to call from a signal handler
    +  (since it may use locks).  In fact, no API is signal-safe; if you
    +  want to handle signals, use ``add_signal_handler()`` described
    +  below.
     
     - ``run_in_executor(executor, callback, *args)``.  Arrange to call
    -  ``callback(*args)`` in an executor (see PEP 3148).  Returns a Future
    -  whose result on success is the return value of that call.  This is
    -  equivalent to ``wrap_future(executor.submit(callback, *args))``.  If
    -  ``executor`` is ``None``, the default executor set by
    -  ``set_default_executor()`` is used.  If no default executor has been
    -  set yet, a ``ThreadPoolExecutor`` with 5 threads is created and set
    -  as the default executor.
    +  ``callback(*args)`` in an executor (see PEP 3148).  Returns an
    +  ``asyncio.Future`` instance whose result on success is the return
    +  value of that call.  This is equivalent to
    +  ``wrap_future(executor.submit(callback, *args))``.  If ``executor``
    +  is ``None``, the default executor set by ``set_default_executor()``
    +  is used.  If no default executor has been set yet, a
    +  ``ThreadPoolExecutor`` with a default number of threads is created
    +  and set as the default executor.  (The default implementation uses
    +  5 threads in this case.)
     
     - ``set_default_executor(executor)``.  Set the default executor used
       by ``run_in_executor()``.  The argument must be a PEP 3148
    @@ -495,7 +505,7 @@
     These methods are useful if you want to connect or bind a socket to an
     address without the risk of blocking for the name lookup.  They are
     usually called implicitly by ``create_connection()``,
    -``start_serving()`` or ``create_datagram_endpoint()``.
    +``create_server()`` or ``create_datagram_endpoint()``.
     
     - ``getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)``.
       Similar to the ``socket.getaddrinfo()`` function but returns a
    @@ -545,8 +555,8 @@
     - ``create_connection(protocol_factory, host, port, )``.
       Creates a stream connection to a given internet host and port.  This
       is a task that is typically called from the client side of the
    -  connection.  It creates an implementation-dependent (bidirectional
    -  stream) Transport to represent the connection, then calls
    +  connection.  It creates an implementation-dependent bidirectional
    +  stream Transport to represent the connection, then calls
       ``protocol_factory()`` to instantiate (or retrieve) the user's
       Protocol implementation, and finally ties the two together.  (See
       below for the definitions of Transport and Protocol.)  The user's
    @@ -560,7 +570,7 @@
     
       (*) There is no requirement that ``protocol_factory`` is a class.
       If your protocol class needs to have specific arguments passed to
    -  its constructor, you can use ``lambda`` or ``functools.partial()``.
    +  its constructor, you can use ``lambda``.
       You can also pass a trivial ``lambda`` that returns a previously
       constructed Protocol instance.
     
    @@ -568,14 +578,13 @@
     
       - ``ssl``: Pass ``True`` to create an SSL/TLS transport (by default
         a plain TCP transport is created).  Or pass an ``ssl.SSLContext``
    -    object (or something else that implements the same interface) to
    -    override the default SSL context object to be used.  If a default
    -    context is created it is up to the implementation to configure
    -    reasonable defaults.  The reference implementation currently uses
    -    ``PROTOCOL_SSLv23`` and sets the ``OP_NO_SSLv2`` option, calls
    -    ``set_default_verify_paths()`` and sets verify_mode to
    -    ``CERT_REQUIRED``.  In addition, whenever the context (default or
    -    otherwise) specifies a verify_mode of ``CERT_REQUIRED`` or
    +    object to override the default SSL context object to be used.  If
    +    a default context is created it is up to the implementation to
    +    configure reasonable defaults.  The reference implementation
    +    currently uses ``PROTOCOL_SSLv23`` and sets the ``OP_NO_SSLv2``
    +    option, calls ``set_default_verify_paths()`` and sets verify_mode
    +    to ``CERT_REQUIRED``.  In addition, whenever the context (default
    +    or otherwise) specifies a verify_mode of ``CERT_REQUIRED`` or
         ``CERT_OPTIONAL``, if a hostname is given, immediately after a
         successful handshake ``ssl.match_hostname(peercert, hostname)`` is
         called, and if this raises an exception the conection is closed.
    @@ -592,9 +601,9 @@
         Protocol concept or the ``protocol_factory`` argument.
     
       - ``sock``: An optional socket to be used instead of using the
    -    ``host``, ``port``, ``family``, ``proto``, and ``flags``
    -    arguments.  If this is given, host and port must be omitted;
    -    otherwise, host and port are required.
    +    ``host``, ``port``, ``family``, ``proto`` and ``flags``
    +    arguments.  If this is given, ``host`` and ``port`` must be
    +    explicitly set to ``None``.
     
       - ``local_addr``: If given, a ``(host, port)`` tuple used to bind
         the socket to locally.  This is rarely needed but on multi-homed
    @@ -602,21 +611,31 @@
         specific address.  This is how you would do that.  The host and
         port are looked up using ``getaddrinfo()``.
     
    +  - ``server_hostname``: This is only relevant when using SSL/TLS; it
    +    should not be used when ``ssl`` is not set.  When ``ssl`` is set,
    +    this sets or overrides the hostname that will be verified.  By
    +    default the value of the ``host`` argument is used.  If ``host``
    +    is empty, there is no default and you must pass a value for
    +    ``server_hostname``.  To disable hostname verification (which is a
    +    serious security risk) you must pass an empty string here and pass
    +    an ``ssl.SSLContext`` object whose ``verify_mode`` is set to
    +    ``ssl.CERT_NONE`` as the ``ssl`` argument.
    +
     - ``create_server(protocol_factory, host, port, )``.
       Enters a serving loop that accepts connections.
       This is a coroutine that completes once the serving loop is set up
       to serve.  The return value is a ``Server`` object which can be used
    -  to stop the serving loop in a controlled fashion by calling its
    -  ``close()`` method.
    +  to stop the serving loop in a controlled fashion (see below).
    +  Multiple sockets may be bound if the specified address allows
    +  both IPv4 and IPv6 connections.
     
    -  Multiple sockets may be bound if the specified address allows
    -  both IPv4 and IPv6 connections.  Each time a connection is accepted,
    -  ``protocol_factory`` is called without arguments(*) to create a
    -  Protocol, a (bidirectional stream) Transport is created to represent
    +  Each time a connection is accepted,
    +  ``protocol_factory`` is called without arguments(**) to create a
    +  Protocol, a bidirectional stream Transport is created to represent
       the network side of the connection, and the two are tied together by
       calling ``protocol.connection_made(transport)``.
     
    -  (*) See footnote above for ``create_connection()``.  However, since
    +  (**) See previous footnote for ``create_connection()``.  However, since
       ``protocol_factory()`` is called once for each new incoming
       connection, it should return a new Protocol object each time it is
       called.
    @@ -625,12 +644,13 @@
     
       - ``ssl``: Pass an ``ssl.SSLContext`` object (or an object with the
         same interface) to override the default SSL context object to be
    -    used.  (Unlike ``create_connection()``, passing ``True`` does not
    -    make sense -- the ``SSLContext`` object is required to specify the
    -    certificate and key.)
    +    used.  (Unlike for ``create_connection()``, passing ``True`` does
    +    not make sense here -- the ``SSLContext`` object is needed to
    +    specify the certificate and key.)
     
       - ``backlog``: Backlog value to be passed to the ``listen()`` call.
    -    Defaults to ``100``.
    +    The default is implementation-dependent; in the default
    +    implementation the default value is ``100``.
     
       - ``reuse_address``: Whether to set the ``SO_REUSEADDR`` option on
         the socket.  The default is ``True`` on UNIX, ``False`` on
    @@ -643,21 +663,11 @@
          ``0``, to let ``getaddrinfo()`` choose.)
     
       - ``sock``: An optional socket to be used instead of using the
    -    ``host``, ``port``, ``family``, and ``flags`` arguments.  If this
    -    is given, host and port must be omitted; otherwise, host and port
    -    are required.  The return value will be the one-element list
    -    ``[sock]``.
    -
    -- ``stop_serving(sock)``.  The argument should be a socket from the
    -  list returned by ``start_serving()``.  The serving loop associated
    -  with that socket will be stopped.  Connections that have already
    -  been accepted will not be affected.  (TBD: What if
    -  ``start_serving()`` doesn't use sockets?  Then it should probably
    -  return a list of opaque objects that can be passed to
    -  ``stop_serving()``.)
    +    ``host``, ``port``, ``family`` and ``flags`` arguments.  If this
    +    is given, ``host`` and ``port`` must be explicitly set to ``None``.
     
     - ``create_datagram_endpoint(protocol_factory, local_addr=None,
    -  remote_addr=None, **kwds)``.  Creates an endpoint for sending and
    +  remote_addr=None, )``.  Creates an endpoint for sending and
       receiving datagrams (typically UDP packets).  Because of the nature
       of datagram traffic, there are no separate calls to set up client
       and server side, since usually a single endpoint acts as both client
    @@ -666,16 +676,19 @@
       the coroutine returns successfully, the transport will call
       callbacks on the protocol whenever a datagram is received or the
       socket is closed; it is up to the protocol to call methods on the
    -  protocol to send datagrams.  Note that the transport and protocol
    -  interfaces used here are different than those for stream
    -  connections.
    +  protocol to send datagrams.  The transport returned is a
    +  ``DatagramTransport``.  The protocol returned is a
    +  ``DatagramProtocol``.  These are described later.
     
    -  Arguments:
    +  Mandatory positional argument:
     
       - ``protocol_factory``: A class or factory function that will be
    -    called, without arguments, to construct the protocol object to be
    -    returned.  The interface between datagram transport and protocol
    -    is described below.
    +    called exactly once, without arguments, to construct the protocol
    +    object to be returned.  The interface between datagram transport
    +    and protocol is described below.
    +
    +  Optional arguments that may be specified positionally or as keyword
    +  arguments:
     
       - ``local_addr``: An optional tuple indicating the address to which
         the socket will be bound.  If given this must be a ``(host,
    @@ -693,7 +706,9 @@
         to be resolved and the result will be passed to ``sock_connect()``
         together with the socket created.  If ``getaddrinfo()`` returns
         more than one address, they will be tried in turn.  If omitted,
    -    no ``sock_connect()`` will be made.
    +    no ``sock_connect()`` call will be made.
    +
    +  The  are all specified using optional keyword arguments:
     
       - ``family``, ``proto``, ``flags``: Address family, protocol and
         flags to be passed through to ``getaddrinfo()``.  These all
    @@ -737,9 +752,6 @@
       where ``conn`` is a connected non-blocking socket and ``peer`` is
       the peer address.
     
    -Optional Event Loop Methods
    ----------------------------
    -
     I/O Callbacks
     '''''''''''''
     
    @@ -756,7 +768,7 @@
     and possibly tty devices are also supported, but disk files are not.
     Exactly which special file types are supported may vary by platform
     and per selector implementation.  (Experimentally, there is at least
    -one kind of pseudo-tty on OSX that is supported by ``select`` and
    +one kind of pseudo-tty on OS X that is supported by ``select`` and
     ``poll`` but not by ``kqueue``: it is used by Emacs shell windows.)
     
     - ``add_reader(fd, callback, *args)``.  Arrange for
    @@ -779,33 +791,90 @@
     Pipes and Subprocesses
     ''''''''''''''''''''''
     
    -TBD: Should these really take stream objects?  The stream objects are
    -not useful for reading or writing because they would cause blocking
    -I/O.  This section of the API is clearly not yet ready for review.
    +These methods are supported by ``SelectorEventLoop`` on UNIX and
    +``ProactorEventLoop`` on Windows.
    +
    +The transports and protocols used with pipes and subprocesses differ
    +from those used with regular stream connections.  These are described
    +later.
    +
    +Each of the methods below has a ``protocol_factory`` argument, similar
    +to ``create_connection()``; this will be called exactly once, without
    +arguments, to construct the protocol object to be returned.
    +
    +Each method is a coroutine that returns a ``(transport, protocol)``
    +pair on success, or raises an exception on failure.
     
     - ``connect_read_pipe(protocol_factory, pipe)``: Create a
       unidrectional stream connection from a file-like object wrapping the
    -  read end of a UNIX pipe.  The protocol/transport interface is the
    -  read half of the bidirectional stream interface.
    +  read end of a UNIX pipe, which must be in non-blocking mode.  The
    +  transport returned is a ``ReadTransport``.
     
     - ``connect_write_pipe(protocol_factory, pipe)``: Create a
       unidrectional stream connection from a file-like object wrapping the
    -  write end of a UNIX pipe.  The protocol/transport interface is the
    -  write half of the bidirectional stream interface.
    +  write end of a UNIX pipe, which must be in non-blocking mode.  The
    +  transport returned is a ``WriteTransport``; it does not have any
    +  read-related methods.  The protocol returned is a ``BaseProtocol``.
     
    -- TBD: A way to run a subprocess with stdin, stdout and stderr
    -  connected to pipe transports.  (This is implemented now but not yet
    -  documented.)  (TBD: Document that the subprocess's
    -  connection_closed() won't be called until the process has exited
    -  *and* all pipes are closed, and why -- it's a race condition.)
    +- ``subprocess_shell(protocol_factory, cmd, )``: Create a
    +  subprocess from ``cmd``, which is a string using the platform's
    +  "shell" syntax.  This is similar to the standard library
    +  ``subprocess.Popen()`` class called with ``shell=True``.  The
    +  remaining arguments and return value are described below.
     
    -TBD: offer the same interface on Windows for e.g. named pipes.  (This
    -should be possible given that the standard library ``subprocess``
    -module is supported on Windows.)
    +- ``subprocess_exec(protocol_factory, *args, )``: Create a
    +  subprocess from one or more string arguments, where the first string
    +  specifies the program to execute, and the remaining strings specify
    +  the program's arguments.  (Thus, together the string arguments form
    +  the ``sys.argv`` value of the program, assuming it is a Python
    +  script.)  This is similar to the standard library
    +  ``subprocess.Popen()`` class called with ``shell=False`` and the
    +  list of strings passed as the first argument; however, where
    +  ``Popen()`` takes a single argument which is list of strings,
    +  ``subprocess_exec()`` takes multiple string arguments.  The
    +  remaining arguments and return value are described below.
    +
    +Apart from the way the program to execute is specified, the two
    +``subprocess_*()`` methods behave the same.  The transport returned is
    +a ``SubprocessTransport`` which has a different interface than the
    +common bidirectional stream transport.  The protocol returned is a
    +``SubprocessProtocol`` which also has a custom interface.
    +
    +The  are all specified using optional keyword arguments:
    +
    +- ``stdin``: Either a file-like object representing the pipe to be
    +  connected to the subprocess's standard input stream using
    +  ``create_write_pipe()``, or the constant ``subprocess.PIPE`` (the
    +  default).  By default a new pipe will be created and connected.
    +
    +- ``stdout``: Either a file-like object representing the pipe to be
    +  connected to the subprocess's standard output stream using
    +  ``create_read_pipe()``, or the constant ``subprocess.PIPE`` (the
    +  default).  By default a new pipe will be created and connected.
    +
    +- ``stderr``: Either a file-like object representing the pipe to be
    +  connected to the subprocess's standard error stream using
    +  ``create_read_pipe()``, or one of the constants ``subprocess.PIPE``
    +  (the default) or ``subprocess.STDOUT``.  By default a new pipe will
    +  be created and connected.  When ``subprocess.STDOUT`` is specified,
    +  the subprocess's standard error stream will be connected to the same
    +  pipe as the stdandard output stream.
    +
    +- ``bufsize``: The buffer size to be used when creating a pipe; this
    +  is passed to ``subprocess.Popen()``.  In the default implementation
    +  this defaults to zero, and on Windows it must be zero; these
    +  defaults deviate from ``subprocess.Popen()``.
    +
    +- ``executable``, ``preexec_fn``, ``close_fds``, ``cwd``, ``env``,
    +  ``startupinfo``, ``creationflags``, ``restore_signals``,
    +  ``start_new_session``, ``pass_fds``: These optional arguments are
    +  passed to ``subprocess.Popen()`` without interpretation.
     
     Signal callbacks
     ''''''''''''''''
     
    +These methods are only supported on UNIX.
    +
     - ``add_signal_handler(sig, callback, *args)``.  Whenever signal
       ``sig`` is received, arrange for ``callback(*args)`` to be called.
       Specifying another callback for the same signal replaces the
    @@ -826,36 +895,17 @@
       handler was set.
     
     Note: If these methods are statically known to be unsupported, they
    -may return ``NotImplementedError`` instead of ``RuntimeError``.
    +may raise ``NotImplementedError`` instead of ``RuntimeError``.
     
    -Callback Sequencing
    --------------------
    +Mutual Exclusion of Callbacks
    +-----------------------------
     
    -When two callbacks are scheduled for the same time, they are run
    -in the order in which they are registered.  For example::
    -
    -  loop.call_soon(foo)
    -  loop.call_soon(bar)
    -
    -guarantees that ``foo()`` is called before ``bar()``.
    -
    -If ``call_soon()`` is used, this guarantee is true even if the system
    -clock were to run backwards.  This is also the case for
    -``call_later(0, callback, *args)``.  However, if ``call_later()`` is
    -used with a nonzero delay, all bets are off if the system
    -clock were to runs backwards.  (A good event loop implementation
    -should use ``time.monotonic()`` to avoid problems when the clock runs
    -backward.  See PEP 418.)
    -
    -Context
    --------
    -
    -All event loops have a notion of context.  For the default event loop
    -implementation, the context is a thread.  An event loop implementation
    -should run all callbacks in the same context.  An event loop
    -implementation should run only one callback at a time, so callbacks
    -can assume automatic mutual exclusion with other callbacks scheduled
    -in the same event loop.
    +An event loop should enforce mutual exclusion of callbacks, i.e. it
    +should never start a callback while a previously callback is still
    +running.  This should apply across all types of callbacks, regardless
    +of whether they are scheduled using ``call_soon()``, ``call_later()``,
    +``call_at()``, ``call_soon_threadsafe()``, ``add_reader()``,
    +``add_writer()``, or ``add_signal_handler()``.
     
     Exceptions
     ----------
    @@ -867,11 +917,11 @@
     be passed through by Futures, and they will be logged and ignored when
     they occur in a callback.
     
    -However, exceptions deriving only from ``BaseException`` are never
    -caught, and will usually cause the program to terminate with a
    -traceback.  (Examples of this category include ``KeyboardInterrupt``
    -and ``SystemExit``; it is usually unwise to treat these the same as
    -most other exceptions.)
    +However, exceptions deriving only from ``BaseException`` are typically
    +not caught, and will usually cause the program to terminate with a
    +traceback.  In some cases they are caught and re-raised.  (Examples of
    +this category include ``KeyboardInterrupt`` and ``SystemExit``; it is
    +usually unwise to treat these the same as most other exceptions.)
     
     Handles
     -------
    @@ -880,19 +930,35 @@
     (``call_soon()``, ``call_later()``, ``call_at()`` and
     ``call_soon_threadsafe()``) all return an object representing the
     registration that can be used to cancel the callback.  This object is
    -called a Handle (although its class name is not necessarily
    -``Handle``).  Handles are opaque and have only one public method:
    +called a ``Handle``.  Handles are opaque and have only one public
    +method:
     
    -- ``cancel()``.  Cancel the callback.
    +- ``cancel()``: Cancel the callback.
     
    +Note that ``add_reader()``, ``add_writer()`` and
    +``add_signal_handler()`` do not return Handles.
    +
    +Servers
    +-------
    +
    +The ``create_server()`` method returns a ``Server`` instance, which
    +wraps the sockets (or other network objects) used to accept requests.
    +This class has two public methods:
    +
    +- ``close()``: Close the service.  This stops accepting new requests
    +  but does not cancel requests that have already been accepted and are
    +  currently being handled.
    +
    +- ``wait_closed()``: A coroutine that blocks until the service is
    +  closed and all accepted requests have been handled.
     
     Futures
     -------
     
    -The ``tulip.Future`` class here is intentionally similar to the
    +The ``asyncio.Future`` class here is intentionally similar to the
     ``concurrent.futures.Future`` class specified by PEP 3148, but there
     are slight differences.  Whenever this PEP talks about Futures or
    -futures this should be understood to refer to ``tulip.Future`` unless
    +futures this should be understood to refer to ``asyncio.Future`` unless
     ``concurrent.futures.Future`` is explicitly mentioned.  The supported
     public API is as follows, indicating the differences with PEP 3148:
     
    @@ -968,12 +1034,12 @@
     A Future is associated with the default event loop when it is created.
     (TBD: Optionally pass in an alternative event loop instance?)
     
    -A ``tulip.Future`` object is not acceptable to the ``wait()`` and
    +A ``asyncio.Future`` object is not acceptable to the ``wait()`` and
     ``as_completed()`` functions in the ``concurrent.futures`` package.
    -However, there are similar APIs ``tulip.wait()`` and
    -``tulip.as_completed()``, described below.
    +However, there are similar APIs ``asyncio.wait()`` and
    +``asyncio.as_completed()``, described below.
     
    -A ``tulip.Future`` object is acceptable to a ``yield from`` expression
    +A ``asyncio.Future`` object is acceptable to a ``yield from`` expression
     when used in a coroutine.  This is implemented through the
     ``__iter__()`` interface on the Future.  See the section "Coroutines
     and the Scheduler" below.
    @@ -981,9 +1047,9 @@
     When a Future is garbage-collected, if it has an associated exception
     but neither ``result()`` nor ``exception()`` nor ``__iter__()`` has
     ever been called (or the latter hasn't raised the exception yet --
    -details TBD), the exception should be logged.  TBD: At what level?
    +details TBD), the exception is logged.
     
    -In the future (pun intended) we may unify ``tulip.Future`` and
    +In the future (pun intended) we may unify ``asyncio.Future`` and
     ``concurrent.futures.Future``, e.g. by adding an ``__iter__()`` method
     to the latter that works with ``yield from``.  To prevent accidentally
     blocking the event loop by calling e.g. ``result()`` on a Future
    @@ -995,16 +1061,16 @@
     
     There are some public functions related to Futures:
     
    -- ``async(arg)``.  This takes an argument that is either a coroutine
    -  object or a Future (i.e., anything you can use with ``yield from``)
    -  and returns a Future.  If the argument is a Future, it is returned
    -  unchanged; if it is a coroutine object, it wraps it in a Task
    -  (remember that ``Task`` is a subclass of ``Future``).
    +- ``asyncio.async(arg)``.  This takes an argument that is either a
    +  coroutine object or a Future (i.e., anything you can use with
    +  ``yield from``) and returns a Future.  If the argument is a Future,
    +  it is returned unchanged; if it is a coroutine object, it wraps it
    +  in a Task (remember that ``Task`` is a subclass of ``Future``).
     
    -- ``wrap_future(future)``.  This takes a PEP 3148 Future (i.e., an
    -  instance of ``concurrent.futures.Future``) and returns a Future
    -  compatible with the event loop (i.e., a ``tulip.Future`` instance).
    -
    +- ``asyncio.wrap_future(future)``.  This takes a PEP 3148 Future
    +  (i.e., an instance of ``concurrent.futures.Future``) and returns a
    +  Future compatible with the event loop (i.e., a ``asyncio.Future``
    +  instance).
     
     Transports
     ----------
    @@ -1172,7 +1238,7 @@
     
     Datagram transports call the following methods on the associated
     protocol object: ``connection_made()``, ``connection_lost()``,
    -``connection_refused()``, and ``datagram_received()``.  ("Connection"
    +``connection_refused()`` and ``datagram_received()``.  ("Connection"
     in these method names is a slight misnomer, but the concepts still
     exist: ``connection_made()`` means the transport representing the
     endpoint has been created, and ``connection_lost()`` means the
    @@ -1182,6 +1248,11 @@
     feature).  (TBD: Do we need the latter?  It seems easy enough to
     implement this in the protocol if it needs to make the distinction.)
     
    +Subprocess Transports
    +'''''''''''''''''''''
    +
    +TBD.
    +
     Protocols
     ---------
     
    @@ -1275,6 +1346,11 @@
       3. ``connection_refused()`` -- at most once
       4. ``connection_lost()`` -- exactly once
     
    +Subprocess Protocol
    +'''''''''''''''''''
    +
    +TBD.
    +
     Callback Style
     --------------
     
    @@ -1290,10 +1366,9 @@
     the callback.  This allows graceful evolution of the API without
     having to worry about whether a keyword might be significant to a
     callee somewhere.  If you have a callback that *must* be called with a
    -keyword argument, you can use a lambda or ``functools.partial``.  For
    -example::
    +keyword argument, you can use a lambda.  For example::
     
    -  loop.call_soon(functools.partial(foo, "abc", repeat=42))
    +  loop.call_soon(lambda: foo('abc', repeat=42))
     
     
     Coroutines and the Scheduler
    @@ -1310,7 +1385,7 @@
     
     A coroutine is a generator that follows certain conventions.  For
     documentation purposes, all coroutines should be decorated with
    -``@tulip.coroutine``, but this cannot be strictly enforced.
    +``@asyncio.coroutine``, but this cannot be strictly enforced.
     
     Coroutines use the ``yield from`` syntax introduced in PEP 380,
     instead of the original ``yield`` syntax.
    @@ -1319,7 +1394,7 @@
     different (though related) concepts:
     
     - The function that defines a coroutine (a function definition
    -  decorated with ``tulip.coroutine``).  If disambiguation is needed
    +  decorated with ``asyncio.coroutine``).  If disambiguation is needed
       we will call this a *coroutine function*.
     
     - The object obtained by calling a coroutine function.  This object
    @@ -1362,7 +1437,7 @@
     ``wait()`` and ``as_completed()`` APIs in the ``concurrent.futures``
     package are provided:
     
    -- ``tulip.wait(fs, timeout=None, return_when=ALL_COMPLETED)``.  This
    +- ``asyncio.wait(fs, timeout=None, return_when=ALL_COMPLETED)``.  This
       is a coroutine that waits for the Futures or coroutines given by
       ``fs`` to complete.  Coroutine arguments will be wrapped in Tasks
       (see below).  This returns a Future whose result on success is a
    @@ -1389,7 +1464,7 @@
         Futures from the condition is surprising, but PEP 3148 does it
         this way.)
     
    -- ``tulip.as_completed(fs, timeout=None)``.  Returns an iterator whose
    +- ``asyncio.as_completed(fs, timeout=None)``.  Returns an iterator whose
       values are Futures or coroutines; waiting for successive values
       waits until the next Future or coroutine from the set ``fs``
       completes, and returns its result (or raises its exception).  The
    @@ -1406,13 +1481,13 @@
       your ``for`` loop may not make progress (since you are not allowing
       other tasks to run).
     
    -- ``tulip.wait_for(f, timeout)``.  This is a convenience to wait for a
    +- ``asyncio.wait_for(f, timeout)``.  This is a convenience to wait for a
       single coroutine or Future with a timeout.  It is a simple wrapper
    -  around ``tulip.wait()`` with a single item in the first argument,
    +  around ``asyncio.wait()`` with a single item in the first argument,
       returning the result or raising the exception if it is completed
       within the timeout, raising ``TimeoutError`` otherwise.
     
    -- ``tulip.gather(f1, f2, ...)``.  Returns a Future which waits until
    +- ``asyncio.gather(f1, f2, ...)``.  Returns a Future which waits until
       all arguments (Futures or coroutines) are done and return a list of
       their corresponding results.  If one or more of the arguments is
       cancelled or raises an exception, the returned Future is cancelled
    @@ -1420,12 +1495,12 @@
       argument), and the remaining arguments are left running in the
       background.  Cancelling the returned Future does not affect the
       arguments.  Note that coroutine arguments are converted to Futures
    -  using ``tulip.async()``.
    +  using ``asyncio.async()``.
     
     Sleeping
     --------
     
    -The coroutine ``sleep(delay)`` returns after a given time delay.
    +The coroutine ``asyncio.sleep(delay)`` returns after a given time delay.
     
     (TBD: Should the optional second argument, ``result``, be part of the
     spec?)
    @@ -1440,22 +1515,22 @@
     becomes the task's result, if it raises an exception, that becomes the
     task's exception.
     
    -Cancelling a task that's not done yet prevents its coroutine from
    -completing.  In this case a ``CancelledError`` exception is thrown
    -into the coroutine, which it may catch to propagate cancellation to
    -other Futures.  If the exception is not caught, the generator will be
    -properly finalized anyway, as described in PEP 342.
    +Cancelling a task that's not done yet throws an
    +``asyncio.CancelledError`` exception into the coroutine.  If the
    +coroutine doesn't catch this (or if it re-raises it) the task will be
    +marked as cancelled; but if the coroutine somehow catches and ignores
    +the exception it may continue to execute.
     
     Tasks are also useful for interoperating between coroutines and
     callback-based frameworks like Twisted.  After converting a coroutine
     into a Task, callbacks can be added to the Task.
     
     To convert a coroutine into a task, call the coroutine function and
    -pass the resulting coroutine object to the ``tulip.Task()``
    -constructor.  You may also use ``tulip.async()`` for this purpose.
    +pass the resulting coroutine object to the ``asyncio.Task()``
    +constructor.  You may also use ``asyncio.async()`` for this purpose.
     
     You may ask, why not automatically convert all coroutines to Tasks?
    -The ``@tulip.coroutine`` decorator could do this.  However, this would
    +The ``@asyncio.coroutine`` decorator could do this.  However, this would
     slow things down considerably in the case where one coroutine calls
     another (and so on), as switching to a "bare" coroutine has much less
     overhead than switching to a Task.
    @@ -1487,23 +1562,49 @@
     off the coroutine when ``connection_made()`` is called.
     
     
    +TO DO
    +=====
    +
    +- Document pause/resume reading/writing.
    +
    +- Document subprocess/pipe protocols/transports.
    +
    +- Document locks and queues.
    +
    +- Describe task cancellation details (and update future cancellation
    +  spec to promise less).
    +
    +- Explain that eof_received() shouldn't return True with SSL/TLS.
    +
    +- Document SIGCHILD handling API (once it lands).
    +
    +- Compare all APIs with the source code to be sure there aren't any
    +  undocumented or unimplemented features.
    +
    +
    +Wish List
    +=========
    +
    +- Support a "start TLS" operation to upgrade a TCP socket to SSL/TLS.
    +
    +- UNIX domain sockets.
    +
    +- A per-loop error handling callback.
    +
    +
     Open Issues
     ===========
     
    -- Make ``loop.stop()`` optional (and hence
    -  ``loop.run_until_complete()`` too).
    +- Why do ``create_connection()`` and ``create_datagram_endpoint()``
    +  have a ``proto`` argument but not ``create_server()``?  And why are
    +  the family, flag, proto arguments for ``getaddrinfo()`` sometimes
    +  zero and sometimes named constants (whose value is also zero)?
    +
    +- Do we need another inquiry method to tell whether the loop is in the
    +  process of stopping?)
     
     - A fuller public API for Handle?  What's the use case?
     
    -- Should we require all event loops to implement ``sock_recv()`` and
    -  friends?  Is the use case strong enough?  (Maybe some transports
    -  usable with both ``SelectorEventLoop`` and ``ProactorEventLoop`` use
    -  them?  That'd be a good enough use case for me.)
    -
    -- Should we require callers of ``create_connection()`` to create and
    -  pass an ``SSLContext`` explicitly, instead of allowing ssl=True?
    -  (For ``start_serving()`` we already require an ``SSLContext``.)
    -
     - A debugging API?  E.g. something that logs a lot of stuff, or logs
       unusual conditions (like queues filling up faster than they drain)
       or even callbacks taking too much time...
    @@ -1511,16 +1612,11 @@
     - Do we need introspection APIs?  E.g. asking for the read callback
       given a file descriptor.  Or when the next scheduled call is.  Or
       the list of file descriptors registered with callbacks.  Right now
    -  these would all require using Tulip internals.
    +  these all require using internals.
     
    -- Locks and queues?  The Tulip implementation contains implementations
    -  of most types of locks and queues modeled after the standard library
    -  ``threading`` and ``queue`` modules.  These should be incorporated
    -  into the PEP.
    -
    -- Probably need more socket I/O methods, e.g. ``sock_sendto()`` and
    -  ``sock_recvfrom()``, and perhaps others like ``pipe_read()``.  Or
    -  users can write their own (it's not rocket science).
    +- Do we need more socket I/O methods, e.g. ``sock_sendto()`` and
    +  ``sock_recvfrom()``, and perhaps others like ``pipe_read()``?
    +  I guess users can write their own (it's not rocket science).
     
     - We may need APIs to control various timeouts.  E.g. we may want to
       limit the time spent in DNS resolution, connecting, ssl/tls handshake,
    @@ -1564,16 +1660,34 @@
     ===============
     
     Apart from PEP 3153, influences include PEP 380 and Greg Ewing's
    -tutorial for ``yield from``, Twisted, Tornado, ZeroMQ, pyftpdlib, tulip
    -(the author's attempts at synthesis of all these), wattle (Steve
    -Dower's counter-proposal), numerous discussions on python-ideas from
    -September through December 2012, a Skype session with Steve Dower and
    -Dino Viehland, email exchanges with Ben Darnell, an audience with
    -Niels Provos (original author of libevent), and two in-person meetings
    -with several Twisted developers, including Glyph, Brian Warner, David
    -Reid, and Duncan McGreggor.  Also, the author's previous work on async
    -support in the NDB library for Google App Engine was an important
    -influence.
    +tutorial for ``yield from``, Twisted, Tornado, ZeroMQ, pyftpdlib, and
    +wattle (Steve Dower's counter-proposal).  My previous work on
    +asynchronous support in the NDB library for Google App Engine provided
    +an important starting point.
    +
    +I am grateful for the numerous discussions on python-ideas from
    +September through December 2012, and many more on python-tulip since
    +then; a Skype session with Steve Dower and Dino Viehland; email
    +exchanges with and a visit by Ben Darnell; an audience with Niels
    +Provos (original author of libevent); and in-person meetings (as well
    +as frequent email exchanges) with several Twisted developers,
    +including Glyph, Brian Warner, David Reid, and Duncan McGreggor.
    +
    +Contributors to the implementation include 
    +Eli Bendersky,
    +Sa?l Ibarra Corretg?,
    +Geert Jansen,
    +A. Jesse Jiryu Davis,
    +Nikolay Kim,
    +Charles-Fran?ois Natali, 
    +Richard Oudkerk,
    +Antoine Pitrou,
    +Giampaolo Rodol?,
    +Andrew Svetlov,
    +and many others who submitted bugs and/or fixes.
    +
    +I thank Antoine Pitrou for his feedback in his role of official PEP
    +BDFL.
     
     
     Copyright
    
    -- 
    Repository URL: http://hg.python.org/peps